The Dauug House Wright State University logo
Dauug|36 minicomputer documentation

Immediate instructions

Opcode P/U Category Description
IMB user ALU: immediate immediate both
IMH user ALU: immediate immediate high
IMN user ALU: immediate immediate negative
IMP user ALU: immediate immediate positive

Immediate instructions permit loading a numeric constant into a register in a single instruction. Because registers and instructions are both 36 bits, but instructions require 9 bits each for the destination register and opcode, only 18 bits of constant information can be supplied per instruction. This means that most 36-bit constants cannot be transferred by a single immediate instruction, although most commonly-written constants can.

When the assembler encounters a statement like

pi = 3_1415926535

it automatically tries to encode the value as a single immediate instruction by trying IMP, IMN, IMH, and IMB in that order. In the case of pi, which in binary is

011101_010000_100010_001111_111100_000111

none of the immediate instructions can encode the constant as one instruction. Instead, the assembler will generate a three-instruction sequence of IMH, IMP, and OR to provide the constant.

WARNING

As presently implemented, the immediate instructions are semantically broken and cause one of the regression tests to fail. What is documented here is the immediate instructions should work and will work in the near future. But at present, opcodes for the immediate instructions are not stratified by signage, causing flags to sometimes be misset. This notice was written 14 June 2023 and will be removed upon correction.

IMB Immediate both

Syntax examples
u = 64_778_913_095  ; u and s both have binary representation
s = −3_940_563_641  ; 111100_010101_000111_111100_010101_000111
unsigned u
signed s
Register Signedness
Dest. unsigned or signed
(constant) non-negative or negative
4 opcodes total
Flag Set if and only if
N supplied numeric constant is negative
Z supplied numeric constant is zero
T supplied numeric constant does not fit in destination
R T is set or R is already set

IMB (immediate both) sets a register to a 36-bit constant taken from the instruction word. Because only 18 bits of constant storage is available within the instruction word, IMB is only applicable to 36-bit constants where their upper 18 bits are identical to their lower 18 bits.

The N flag is solely determined by whether the constant is negative as supplied, and is not affected by the signage of the destination register or whether the constant is able to fit. The Z flag is solely determined by whether the constant is zero; however, this will not occur when using the cross assembler. The T flag will be set if bit 35 of the destination will be set and there is a conflict in signage between the destination and the constant as supplied. If T is set, R will also be set, otherwise R will not change.

Although the all-zero and all-one constants are supported by the firmware for IMB, the cross assembler will instead encode these constants using IMP and IMN respectively. This decision is to facilitate easier understanding of disassembler listings.

IMH Immediate high

Syntax examples
u =  34_359_738_368  ; u and s both have binary representation
s = −34_359_738_368  ; 100000_000000_000000_000000_000000_000000
unsigned u
signed s
Register Signedness
Dest. unsigned or signed
(constant) non-negative or negative
4 opcodes total
Flag Set if and only if
N supplied numeric constant is negative
Z supplied numeric constant is zero
T supplied numeric constant does not fit in destination
R T is set or R is already set

IMH (immediate high) sets a register to a 36-bit constant taken from the instruction word. Because only 18 bits of constant storage is available within the instruction word, IMH is only applicable to 36-bit constants where their lower 18 bits are all zeros.

The N flag is solely determined by whether the constant is negative as supplied, and is not affected by the signage of the destination register or whether the constant is able to fit. The Z flag is solely determined by whether the constant is zero; however, this will not occur when using the cross assembler. The T flag will be set if bit 35 of the destination will be set and there is a conflict in signage between the destination and the constant as supplied. If T is set, R will also be set, otherwise R will not change.

Although the constant 0 is supported by the firmware for IMH, the cross assembler will instead encode 0 using IMP. This decision is to facilitate easier understanding of disassembler listings.

IMN Immediate negative

Syntax examples
u = 68_719_476_734  ; u and s both have binary representation
s = −2              ; 111111_111111_111111_111111_111111_111110
unsigned u
signed s
Register Signedness
Dest. unsigned or signed
(constant) non-negative or negative
4 opcodes total
Flag Set if and only if
N supplied numeric constant is negative
Z always cleared
T supplied numeric constant does not fit in destination
R T is set or R is already set

IMN (immediate negative) sets a register to a 36-bit constant taken from the instruction word. Because only 18 bits of constant storage is available within the instruction word, IMN is only applicable to 36-bit constants where their upper 18 bits are all ones.

Although IMN’s name implies that it is for negative constants (and is in fact used for most negative constants), it is also used to encode the highest unsigned constants.

The N flag is solely determined by whether the constant is negative as supplied, and is not affected by the signage of the destination register or whether the constant is able to fit. The Z flag is solely determined by whether the constant is zero; however, this will not occur when using the cross assembler. The T flag will be set if bit 35 of the destination will be set and there is a conflict in signage between the destination and the constant as supplied. If T is set, R will also be set, otherwise R will not change.

IMN will be used by the cross assembler to encode the all-one constants −1 and 2**36 − 1, even though IMB could be used instead. This decision is to facilitate easier understanding of disassembler listings.

IMP Immediate positive

Syntax examples
u = 262_143  ; u and s both have binary representation
s = 262_143  ; 000000_000000_000000_111111_111111_111111
unsigned u
signed s
Register Signedness
Dest. ignored
(constant) 18-bit unsigned
1 opcode only
Flag Set if and only if
N always cleared
Z supplied numeric constant is zero
T always cleared
R R is already set

IMP (immediate positive) sets a register to a 36-bit constant taken from the instruction word. Because only 18 bits of constant storage is available within the instruction word, IMP is only applicable to 36-bit constants where their upper 18 bits are all zeros.

IMP always clears the N and T flags. The Z flag is solely determined by whether the constant is zero. The R flag does not change.

IMP will be used by the cross assembler to encode the constant 0, even though IMB could be used instead. This decision is to facilitate easier understanding of disassembler listings.


Marc W. Abel
Computer Science and Engineering
College of Engineering and Computer Science
marc.abel@wright.edu
Without secure hardware, there is no secure software.
937-775-3016