You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
emu65el02/docs/65el02_instructions.txt

160 lines
3.2 KiB
Plaintext

New registers:
I - Index, used by some of the new instructions
D - Used by the math extension as the higher 16-bit of the 32-bit value (multiply / divide).
NXT ($02) - NExT word
PC = (I), I = I + 2
8-bit mode example:
lda (regI)
sta ptr
lda (regI+1)
sta ptr+1
inc regI
inc regI
jmp (ptr)
ENT ($22) - Enter word
RHI, I = PC + 2, PC = (PC)
NXA ($42) - NeXt byte/word to Accumlator
A = (I), if M=0 then I = I + 1 else I = I + 2
example:
lda (regI) ; 16-bit word when M flag is set
inc regI
.if flagM=1
inc regI
.fi
TXI ($5c) - Transfer X to I
regI = regX
N,Z flags updated
TIX ($dc) - Transfer I to X
regX = regI
N,Z flags affected
RER ($82) - push effective RElative address to R stack
(R) = ( PC + value ) >> 8
(R - 1) = ( PC + value ) & 0xff
R = R - 2
This function works like the branches but instead of setting PC it push the result in the R stack
REA ($44) - push address to R stack
(R) = value >> 8
(R - 1) = value & 0xff
R = R - 2
This functions simply puts the value to R stack
8-bit mode example:
lda #>value
sta (regR)
dec regR
lda #<value
sta (regR)
dec regR
REI ($54) - push indirect zp address to R stack
(R) = (value) >> 8
(R - 1) = (value+1) & 0xff
R = R - 2
Works like the previous instruction but address came from indirected zero page address
8-bit mode example:
lda (value)
sta (regR)
dec regR
inc value
lda (value)
sta (regR)
dec regR
RHI ($0b) - push I register to R stack
(R) = I >> 8
(R - 1) = I & 0xff
R = R - 2
example:
lda I
sta (regR)
dec regR
lda I+1
sta (regR)
dec regR
RLI ($2b) - pull I register from R stack
the opposite of RHI
RHA ($4b) - push A register to R stack
Depends on flagM, instruction like PHA
RLA ($6b) - pull A register from R stack
Depends on flagM, instruction like PLA
RHX ($1b) - push X register to R stack
Depends on flagX, instruction like PHX
RLX ($3b) - pull X register from R stack
Depends on flagX, instruction like PLX
RHY ($5b) - push y register to R stack
Depends on flagX, instruction like PHY
RLY ($7b) - pull y register from R stack
Depends on flagX, instruction like PLY
TXR ($8b) - Transfer X to R
if flagX = 0 then R = X
SP messed up if flagX = 1, SP = R & 0xff | X & 0xff
TRX ($ab) - Transfer R to X
X = R
N,Z flags affected
TXI ($5c) - Transfer X to I
I = X
N,Z flags affected
TIX ($dc) - Transfer I to X
X = I
N,Z flags affected
ORA, AND, EOR, ADC, STA, LDA, CMP, SBC
Works like the standard 65816 r,S and (r,S),Y instructions just using R instead of S
MUL - signed (c=0) or unsigned (c=1) MULltiply (16-bit * 16-bit)
supports BCD mode
DIV - signed (c=0) or unsigned (c=1) DIVide (32-bit / 16-bit)
supports BCD mode
ZEA - zero extend A / clear D
D = 0
SEA - signed extend A
if the highest bit of A is set then D = 0xffff else D = 0
TAD - Transfer A to D
D = A
N,Z flags affected
TDA - Transfer D to A
A = D
N,Z flags affected
PHD - PusH D to stack
PLD - PulL D from stack
Known bugs:
- Stack pointers wrong (TSX,TXS) comparing it to a real 65xx based cpu
- the default SP is $0200 instead of $01ff