Full 6809/6809e/6309 Opcode List Including Undocumented Opcodes =============================================================== http://mdfs/net/Docs/Comp/6809/OpList Author: J.G.Harston - Update: 0.10 - Date: 08-Aug-2001 --+----------------------------------+---------------------------------------- nn| 6809/6809e | 6309 |nn 10nn 11nn |nn 10nn 11nn --+----------------------------------+---------------------------------------- 00|NEG ext - - |NEG >ext - - 71|neg >ext - - |OIM >ext - - 72|com >ext - - |AIM >ext - - 73|COM >ext - - |COM >ext - - 74|LSR >ext - - |LSR >ext - - 75|lsr >ext - - |EIM >ext - - 76|ROR >ext - - |ROR >ext - - 77|ASR >ext - - |ASR >ext - - 78|ASL >ext - - |ASL >ext - - 79|ROL >ext - - |ROL >ext - - 7A|DEC >ext - - |DEC >ext - - 7B|dec >ext - - |TIM >ext - - 7C|INC >ext - - |INC >ext - - 7D|TST >ext - - |TST >ext - - 7E|JMP >ext - - |JMP >ext - - 7F|CLR >ext - - |CLR >ext - - --+----------------------------------+---------------------------------------- 80|SUBA #imm - - |SUBA #imm SUBW #n16 SUBE #n 81|CMPA #imm - - |CMPA #imm CMPW #n16 CMPE #n 82|SBCA #imm - - |SBCA #imm SBCD #n16 - 83|SUBD #n16 CMPD #n16 CMPU #n16 |SUBD #n16 CMPD #n16 CMPU #n16 84|ANDA #imm - - |ANDA #imm ANDD #n16 - 85|BITA #imm - - |BITA #imm BITD #n16 - 86|LDA #imm - - |LDA #imm LDW #n16 LDE #n 87|- - - |- - - 88|EORA #imm - - |EORA #imm EORD #n16 - 89|ADCA #imm - - |ADCA #imm ADCD #n16 - 8A|ORA #imm - - |ORA #imm ORD #n16 - 8B|ADDA #imm - - |ADCA #imm ADDW #n16 ADDE #n 8C|CMPX #n16 CMPY #n16 CMPS #n16 |CPX #n16 CMPY #n16 CMPS #n16 8D|BSR rel - - |BSR rel - DIVD #n16 8E|LDX #n16 LDY #n16 - |LDX #n16 LDY #n16 DIVQ #n16 8F|- - - |- - MULD #n16 --+----------------------------------+---------------------------------------- 90|SUBA ext - - |SUBA >ext SUBW >ext SUBE >ext B1|CMPA >ext - - |CMPA >ext CMPW >ext CMPE >ext B2|SBCA >ext - - |SBCA >ext SBCD >ext - B3|SUBD >ext CMPD >ext CMPU >ext |SUBD >ext CMPD >ext CMPU >ext B4|ANDA >ext - - |ANDA >ext ANDD >ext - B5|BITA >ext - - |BITA >ext BITD >ext - B6|LDA >ext - - |LDA >ext LDW >ext LDE >ext B7|STA >ext - - |STA >ext STW >ext STE >ext B8|EORA >ext - - |EORA >ext EORD >ext - B9|ADCA >ext - - |ADCA >ext ADCD >ext - BA|ORA >ext - - |ORA >ext ORD >ext - BB|ADDA >ext - - |ADDA >ext ADDW >ext ADDE >ext BC|CMPX >ext CMPY >ext CMPS >ext |CMPX >ext CMPY >ext CMPS >ext BD|JSR >ext - - |JSR >ext - DIVD >ext BE|LDX >ext LDY >ext - |LDX >ext LDY >ext DIVQ >ext BF|STX >ext LDS >ext - |STX >ext LDS >ext MULD >ext --+----------------------------------+---------------------------------------- C0|SUBB #imm - - |SUBB #imm - SUBF #n C1|CMPB #imm - - |CMPB #imm - CMPF #n C2|SBCB #imm - - |SBCB #imm - - C3|ADDD #n16 - - |ADDD #n16 - - C4|ANDB #imm - - |ANDB #imm - - C5|BITB #imm - - |BITB #imm - - C6|LDB #imm - - |LDB #imm - LDF #n C7|- - - |- - - C8|EORB #imm - - |EORB #imm - - C9|ADCB #imm - - |ADCB #imm - - CA|ORB #imm - - |ORB #imm - - CB|ADDB #imm - - |ADDB #imm - ADDF #n CC|LDD #n16 - - |LDD #n16 - - CD|- - - |LDQ #n32 - - CE|LDU #n16 LDS #n16 - |LDU #n16 LDS #n16 - CF|- - - |- - - --+----------------------------------+---------------------------------------- D0|SUBB ext - - |SUBB >ext - SUBF >ext F1|CMPB >ext - - |CMPB >ext - CMPF >ext F2|SBCB >ext - - |SBCB >ext - - F3|ADDD >ext - - |ADDD >ext - - F4|ANDB >ext - - |ANDB >ext - - F5|BITB >ext - - |BITB >ext - - F6|LDB >ext - - |LDB >ext - LDF >ext F7|STB >ext - - |STB >ext - STF >ext F8|EORB >ext - - |EORB >ext - - F9|ADCB >ext - - |ADCB >ext - - FA|ORB >ext - - |ORB >ext - - FB|ADDB >ext - - |ADDB >ext - ADDF >ext FC|LDD >ext - - |LDD >ext LDQ >ext - FD|STD >ext - - |STD >ext STQ >ext - FE|LDU >ext LDS >ext - |LDU >ext LDS >ext - FF|STU >ext STS >ext - |STU >ext STS >ext - --+----------------------------------+---------------------------------------- Notes ----- #imm - 8bit immediate number A - 8-bit accumulator #n16 - 16bit immediate number B - 8-bit accumulator #n32 - 32bit immediate number X - 16-bit index register ext - 16bit absolute address U - 16-bit user pointer rel - 8bit relative offset S - 16-bit stack pointer rel16 - 16bit relative offset PC - 16-bit program counter regs - register map Empty stack is S=$0000 idx - indexed addressing mode, see next table r0,r1 - next byte contains Opcodes in lower case in the above list are 'undocumented'. register map: b7 b6 b5 b4 b3 b2 b1 b0 pushed last/ PC S/U Y X DP B A CC pushed first/ popped first popped last r0,r1: 0 D 4 S 8 A 12 - 1 X 5 PC 9 B 13 - 2 Y 6 W* 10 CC 14 E* 3 U 7 V* 11 DP 15 F* *6309 only Indexed (idx) addressing mode ----------------------------- Specified by a post-byte, after the opcode and before any additional data. postbyte data assembler postbyte data assembler 0rrnnnnn n,R | *10010000 [,W] | *10110000 [n16,W] | *11010000 [,W++] 1rr00000 ,R+ | *11110000 [,--W] 1rr00001 ,R++ | 1rr10001 [,R++] 1rr00010 ,-R | 1??10010 1rr00011 ,--R | 1rr10011 [,--R] 1rr00100 ,R | 1rr10100 [,R] 1rr00101 B,R | 1rr10101 [B,R] 1rr00110 A,R | 1rr10110 [A,R] 1??00111 | 1??10111 1rr01000 nn n,R | 1rr11000 nn [n,R] 1rr01001 hh ll n16,R | 1rr11001 hh ll [n16,R] 1??01010 | 1??11010 1rr01011 D,R | 1rr11011 [D,R] 1xx01100 nn n,PCR | 1xx11100 nn [n,PCR] 1xx01101 hh ll n16,PCR | 1xx11101 hh ll [n16,PCR] 1??01110 | 1??11110 *10001111 ,W | 10011111 hh ll [n16] *10101111 n16,W | 10111111 *11001111 ,W++ | 11011111 *11101111 ,--W | 11111111 rr=00,01,10,11 for R=X,Y,U,S *6309 only Hardware vectors ---------------- FFF0 - ILOP FFF8 - IRQ FFF2 - SWI3 FFFA - SWI FFF4 - SWI2 FFFC - NMI FFF6 - FIRQ FFFE - RESET Interupts push SP=>CC, A, B, DP, XH, XL, YH, YL, UH, UL, PCH, PCL with stacked CC.b7=1 FIRQ interupt pushes SP=>CC, PCH, PCL with stacked CC.b7=0 6809 pushes SP=>CC, A, B, DP, XH, XL, YH, YL, UH, UL, PCH, PCL 6309 pushes SP=>CC, A, B, E, F, DP, XH, XL, YH, YL, UH, UL, PCH, PCL RESET sets DP=0, selects 6809 mode, disables FIRQs and IRQs Other notes ----------- The only difference between the 6809 and the 6809e is the pinouts. The instruction set is the same: 6809: Halt, XTAL, >EXTAL, Reset, MRDY, Q, E, DMA/BREQ 6809e: Halt, TSC, LIC, Reset, AVMA, Q, E, Busy The 6309 is a further develpment by Hitatchi with more instructions and registers. The 68xx series are bigendian, that is, multibyte values are stored in memory with the most significant byte first. Detecting 6309 -------------- * Determine whether processor is 6309 or 6809 * Z clear if 6309, Z set if 6809 PSHS D ; Save D register FDB $1043 ; 6309 COMD instruction, COMA on 6809 CMPB 1,S ; not equal if 6309 PULS D ; restore D