Instructions Set SummaryThe table below summarizes the Heritage/1 instructions set. The following convention have been adopted to define mnemonics:
The 'i' suffix (as in mvi) indicates immediate addressing
The 'x' suffix (as in ldx) indicates indirect addressing.
The 'r' suffix (as in jnzr) indicates relative addressing (only used in branch instructions).
The 'm' suffix (as in incm) indicates multiple (increment/decrement multiple registers)
The 'd' suffix (as in addd) indicates direct addressing but is not always used.
No suffix indicates register addressing (as in add) except for branch instructions that indicates direct addressing (as in jp).
# REG
------------------------------------------------------------------------------------------------
mnemonic args words cycles flags descript
------------------------------------------------------------------------------------------------
mov r1, r2 1 5 zn-- r1=r2
mvi r, value 2 8 zn-- r=value
ld r, addr 2 9 zn-- r=[addr]
sto r, addr 2 8 ---- [addr]=r
ldx r1, r2 1 6 zn-- r1=[r2]
stox r1, r2 1 5 ---- [r2]=r1
# STACK
------------------------------------------------------------------------------------------------
mnemonic args words cycles flags descript
------------------------------------------------------------------------------------------------
push r 1 5 z--v [sp]=r, sp=sp-1
pop r 1 6 z--v sp=sp+1, r=[sp]
# INC/DEC
------------------------------------------------------------------------------------------------
mnemonic args words cycles flags descript
------------------------------------------------------------------------------------------------
inc r 1 4 zn-v r=r+1
dec r 1 4 zn-v r=r-1
incm r1, r2 1 4 zn-v r1=r1+1, r2=r2+1
decm r1, r2 1 4 zn-v r1=r1-1, r2=r2-1
indec r1, r2 1 4 zn-v r1=r1+1, r2=r2-1
indec implicit 1 4 zn-v C=C-1, D=D+1, E=E+1
# ALU REG
------------------------------------------------------------------------------------------------
mnemonic args words cycles flags descript
------------------------------------------------------------------------------------------------
add a, r 1 5 znc- a=a+r
sub a, r 1 5 znc- a=a-r
cmp a, r 1 5 znc- ?(a-r)
and a, r 1 5 znc- a=a.AND.r
or a, r 1 5 znc- a=a.OR.r
xor a, r 1 5 znc- a=a.XOR.r
shfl a, r 1 5 znc- a=(left-shifted r)
shfr a, r 1 5 znc- a=(right-shifted r)
swp a, r 1 5 znc- a=(swapped r)
# ALU IMMEDIATE
------------------------------------------------------------------------------------------------
mnemonic args words cycles flags descript
------------------------------------------------------------------------------------------------
adi a, value 2 8 znc- a=a+value
subi a, value 2 8 znc- a=a-value
cmpi a, value 2 8 znc- ?(a-value)
andi a, value 2 8 znc- a=a.AND.value
ori a, value 2 8 znc- a=a.OR.value
xori a, value 2 8 znc- a=a.XOR.value
# ALU DIRECT
------------------------------------------------------------------------------------------------
mnemonic args words cycles flags descript
------------------------------------------------------------------------------------------------
addd a, addr 2 9 znc- a=a+[addr]
subd a, addr 2 9 znc- a=a-[addr]
cmpd a, addr 2 9 znc- ?(a-[addr])
andd a, addr 2 9 znc- a=a.AND.[addr]
ord a, addr 2 9 znc- a=a.OR.[addr]
xord a, addr 2 9 znc- a=a.XOR.[addr]
shfld a, addr 2 9 znc- a=(left-shifted [addr])
shfrd a, addr 2 9 znc- a=(right-shifted [addr])
swpd a, addr 2 9 znc- a=(swapped [addr])
# ALU INDIRECT
------------------------------------------------------------------------------------------------
mnemonic args words cycles flags descript
------------------------------------------------------------------------------------------------
addx a, r 1 9 znc- a=a+[r]
subx a, r 1 9 znc- a=a-[r]
cmpx a, r 1 9 znc- ?(a-[r])
andx a, r 1 9 znc- a=a.AND.[r]
orx a, r 1 9 znc- a=a.OR.[r]
xorx a, r 1 9 znc- a=a.XOR.[r]
shflx a, r 1 9 znc- a=(left-shifted [r])
shfrx a, r 1 9 znc- a=(right-shifted [r])
swpx a, r 1 9 znc- a=(swapped [r])
# JUMP DIRECT
------------------------------------------------------------------------------------------------
mnemonic args words cycles flags descript
------------------------------------------------------------------------------------------------
jp addr 2 8 ---- pc=addr unconditional
jz addr 2 8 ---- pc=addr if zero
jnz addr 2 8 ---- pc=addr if non zero
jn addr 2 8 ---- pc=addr if negative
jnn addr 2 8 ---- pc=addr if non negative
jc addr 2 8 ---- pc=addr if carry
jnc addr 2 8 ---- pc=addr if non carry
jv addr 2 8 ---- pc=addr if overflow
jnv addr 2 8 ---- pc=addr if non overflow
# JUMP INDIRECT
------------------------------------------------------------------------------------------------
mnemonic args words cycles flags descript
------------------------------------------------------------------------------------------------
jpx r 1 5 ---- pc=r unconditional
jzx r 1 5 ---- pc=r if zero
jnzx r 1 5 ---- pc=r if non zero
jnx r 1 5 ---- pc=r if negative
jnnx r 1 5 ---- pc=r if non negative
jcx r 1 5 ---- pc=r if carry
jncx r 1 5 ---- pc=r if non carry
jvx r 1 5 ---- pc=r if overflow
jnvx r 1 5 ---- pc=r if non overflow
# JUMP RELATIVE DIRECT
------------------------------------------------------------------------------------------------
mnemonic args words cycles flags descript
------------------------------------------------------------------------------------------------
jpr offset 2 8 ---- pc=pc+offset unconditional
jzr offset 2 8 ---- pc=pc+offset if zero
jnzr offset 2 8 ---- pc=pc+offset if non zero
jnr offset 2 8 ---- pc=pc+offset if negative
jnnr offset 2 8 ---- pc=pc+offset if non negative
jcr offset 2 8 ---- pc=pc+offset if carry
jncr offset 2 8 ---- pc=pc+offset if non carry
jvr offset 2 8 ---- pc=pc+offset if overflow
jnvr offset 2 8 ---- pc=pc+offset if non overflow
JUMP RELATIVE INDIRECT
------------------------------------------------------------------------------------------------
mnemonic args words cycles flags descript
------------------------------------------------------------------------------------------------
jprx r 1 5 ---- pc=pc+r unconditional
jzrx r 1 5 ---- pc=pc+r if zero
jnzrx r 1 5 ---- pc=pc+r if non zero
jnrx r 1 5 ---- pc=pc+r if negative
jnnrx r 1 5 ---- pc=pc+r if non negative
jcrx r 1 5 ---- pc=pc+r if carry
jncrx r 1 5 ---- pc=pc+r if non carry
jvrx r 1 5 ---- pc=pc+r if overflow
jnvrx r 1 5 ---- pc=pc+r if non overflow
# CALL AND RET
------------------------------------------------------------------------------------------------
mnemonic args words cycles flags descript
------------------------------------------------------------------------------------------------
call addr 2 14 ---- [sp]=f, sp=sp-1, [sp]=pc, sp=sp-1, pc=addr
callx r 1 11 ---- [sp]=f, sp=sp-1, [sp]=pc, sp=sp-1, pc=r
callr offset 2 14 ---- [sp]=f, sp=sp-1, [sp]=pc, sp=sp-1, pc=pc+offset
callrx r 1 11 ---- [sp]=f, sp=sp-1, [sp]=pc, sp=sp-1, pc=pc+r
ret 1 11 ---- sp=sp+1, pc=[sp], sp=sp+1, f=[sp]
reti 1 11 ---- sp=sp+1, pc=[sp], sp=sp+1, f=[sp], /SIE=0
# MISC
------------------------------------------------------------------------------------------------
mnemonic args words cycles flags descript
------------------------------------------------------------------------------------------------
hlt 1 4 ---- halt the machine
clrf 1 4 zncv clear flags
int vector 1 11 ---- [sp]=f, sp=sp-1, [sp]=pc, sp=sp-1, pc=[vector]
ei 1 4 ---- enable hardware interrupts
di 1 4 ---- disable hardware interrupts
et 1 4 ---- enable timer
dt 1 4 ---- disable timer
------------------------------------------------------------------------------------------------
|