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 #> 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