; ; ; File Name : MC6809 Opcode Tests ; Used on : ; Author : Ted Fried, MicroCore Labs ; Creation : 7/1/2024 ; ; Description: ; ============ ; ; MC6809 assembly program to test each opcode, flag, and addressing mode. ; ; If failures are detected, the code will immediately loop on itself. ; ; I used ASM6809.EXE to assemble the code and generate the binary. ; Please set the reset vector to 0x0000. ; ;------------------------------------------------------------------------ ; ; Modification History: ; ===================== ; ; Revision 1 7/1/2024 ; Initial revision ; ; ;------------------------------------------------------------------------ ; ; Copyright (c) 2024 Ted Fried ; ; Permission is hereby granted, free of charge, to any person obtaining a copy ; of this software and associated documentation files (the "Software"), to deal ; in the Software without restriction, including without limitation the rights ; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ; copies of the Software, and to permit persons to whom the Software is ; furnished to do so, subject to the following conditions: ; ; The above copyright notice and this permission notice shall be included in all ; copies or substantial portions of the Software. ; ; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ; SOFTWARE. ; ; Scratch workspace from 0x0000 ; Test code starts at 0x2000 ; System Stack starts at 0xF100 ; User Stack starts at 0xF200 jmp op_LOAD_STORES ORG 0x01B00 lda #$000 ; SWI ldb #$000 ldx #$000 ldy #$000 rti ORG 0x01BA0 lda #$000 ; SWI2 ldb #$000 ldx #$000 ldy #$000 rti ORG 0x01BB0 lda #$000 ; SWI3 ldb #$000 ldx #$000 ldy #$000 rti ORG 0x02000 ; Test - Loads, stores using all addressing modes ; ---------------------------------------------------------------------- op_LOAD_STORES nop nop nop ; Immediate Loads ; ---------------- lda #$0AA ldb #$0BB ldd #$FACE ldu #$01234 lds #$05678 ldx #$0DEAD ldy #$0BEEF nop nop nop ; Populate memory with test values ; 0x1200: 12 34 ; 0x1204: 12 38 ; 0x1212: 88 99 ; 0x1234: 12 34 56 78 DE AD BE EF ; 0x1258: 33 44 55 66 ; 0x1260: 33 44 ; 0x8E12: 66 77 ; 0x8F38: 5A 5B ; 0x8F40: 12 34 ldy #$01200 ldx #$01234 stx ,Y ldy #$01204 ldx #$01238 stx ,Y ldy #$01234 ldx #$01234 stx ,Y ldx #$01236 ldy #$05678 sty ,X ldu #$01238 lds #$0DEAD sts ,U lds #$0123A ldu #$0BEEF stu ,S ldu #$01258 lds #$03344 sts ,U lds #$0125A ldu #$05566 stu ,S lds #$08F38 ldu #$05A5B stu ,S lds #$08F40 ldu #$01234 stu ,S lds #$08E12 ldu #$06677 stu ,S lds #$01212 ldu #$08899 stu ,S ldu #$01260 lds #$03344 sts ,U nop nop nop ; ---------------------------------------- ; Test - Loads ; ---------------------------------------- ; Direct ; ---------- lda #$012 exg a,dp ; Set the Direct Page SETDP 0x012 ; Tell the assembler about it lda <$034 cmpa #0x012 lbne FAIL ldb <$035 cmpb #0x034 lbne FAIL ldd <$036 cmpd #0x05678 lbne FAIL ldu <$038 cmpu #0x0DEAD lbne FAIL lds <$03a cmps #0x0BEEF lbne FAIL ldx <$035 cmpx #0x03456 lbne FAIL ldy <$037 cmpy #0x078DE lbne FAIL nop nop nop ; Extended Direct ; ----------------- lda >$0123B cmpa #0x0EF lbne FAIL ldb >$0123a cmpb #0x0BE lbne FAIL ldd >$01238 cmpd #0x0DEAD lbne FAIL ldu >$01234 cmpu #0x01234 lbne FAIL lds >$01234 cmps #0x01234 lbne FAIL ldx >$01235 cmpx #0x03456 lbne FAIL ldy >$01236 cmpy #0x05678 lbne FAIL nop nop nop ; Indexed - Extended Indirect ; --------------------------- ; Load memory with the indirect pointers - addresses + 0x0030 ; 0x1400: 0x1234 ; 0x1410: 0x1238 ldy #$01400 ldx #$01234 stx ,Y ldx #$01410 ldy #$01238 sty ,X lda [$01400] cmpa #0x012 lbne FAIL ldb [$01400] cmpb #0x012 lbne FAIL ldd [$01400] cmpd #0x01234 lbne FAIL ldu [$01410] cmpu #0x0DEAD lbne FAIL lds [$01410] cmps #0x0DEAD lbne FAIL ldx [$01400] cmpx #0x01234 lbne FAIL ldy [$01400] cmpy #0x01234 lbne FAIL nop nop nop ; Indexed - Non-Indirect Register with opcode offsets from register ; ------------------------------------------------------------------ ldu #$01234 ; Set R index registers lds #$01238 ldx #$01234 ldy #$01238 lda ,U ; Indexed - Non-Indirect Register (no offset) cmpa #0x012 lbne FAIL lda -1,S ; Indexed - Non-Indirect Register (5-bit offset) cmpa #0x078 lbne FAIL lda 32,S ; Indexed - Non-Indirect Register (8-bit offset) cmpa #0x033 lbne FAIL lda 32000,S ; Indexed - Non-Indirect Register (16-bit offset) cmpa #0x05A lbne FAIL ldb ,Y ; Indexed - Non-Indirect Register (no offset) cmpb #0x0DE lbne FAIL lda #2 ; Indexed - Non-Indirect Register (Accumulator-A offset) ldb A,Y cmpb #0x0BE lbne FAIL ldb #3 ; Indexed - Non-Indirect Register (Accumulator-B offset) lda B,Y cmpa #0x0EF lbne FAIL ldd #1 ; Indexed - Non-Indirect Register (Accumulator-B offset) lda D,Y cmpa #0x0AD lbne FAIL ldd ,S ; Indexed - Non-Indirect Register (no offset) cmpd #0x0DEAD lbne FAIL ldd ,S+ ; Indexed - Non-Indirect Register (Post-increment) cmpd #0x0DEAD lbne FAIL ldd ,S+ ; Indexed - Non-Indirect Register (Post-increment +1) cmpd #0x0ADBE lbne FAIL ldd ,S++ ; Indexed - Non-Indirect Register (Post-increment +2) cmpd #0x0BEEF lbne FAIL ldx #$01238 ldu ,-X ; Indexed - Non-Indirect Register (Pre-decrement -1) cmpu #0x078DE lbne FAIL PCR_LABEL ldx #$01238 ldu ,--X ; Indexed - Non-Indirect Register (Pre-decrement -2) cmpu #0x05678 lbne FAIL lda PCR_LABEL,PCR ; Indexed - Non-Indirect PCR - PC Relative - 8-bit offset cmpa #0x08E lbne FAIL lda op_LOAD_STORES,PCR ; Indexed - Non-Indirect PCR - PC Relative - 16-bit offset cmpa #0x012 lbne FAIL lda [PCR_LABEL,PCR] ; Indexed - Indirect PCR - PC Relative - 8-bit offset cmpa #0x066 lbne FAIL lda [op_LOAD_STORES,PCR] ; Indexed - Indirect PCR - PC Relative - 16-bit offset cmpa #0x088 lbne FAIL ldu #$01234 ; Restore R index registers lds #$01238 ldx #$01234 ldy #$01238 ldu ,X lds #$01200 ; Indexed - Indirect Register (8-bit offset) lda [4,S] cmpu #0x01234 lbne FAIL lds ,Y cmps #0x0DEAD lbne FAIL ldx ,Y cmpx #0x0DEAD lbne FAIL ldy ,Y cmpy #0x0DEAD lbne FAIL cmpa #0x0DE lbne FAIL lds #$01300 ; Indexed - Indirect Register (16-bit offset) lda [(-0x00100),S] cmpa #0x012 lbne FAIL ldu #$011FF ; Indexed - Indirect Register (Accumulator-A offset) lda #$00001 lda [A,U] cmpa #0x012 lbne FAIL ldu #$011FF ; Indexed - Indirect Register (Accumulator-B offset) ldb #$00001 lda [B,U] cmpa #0x012 lbne FAIL ldu #$010FF ; Indexed - Indirect Register (Accumulator-D offset) ldd #$00101 lda [D,U] cmpa #0x012 lbne FAIL lds #$01200 ldy [,S++] ; Indexed - ndirect Register (Post-increment +2) cmpy #0x01234 lbne FAIL cmps #0x01202 lbne FAIL lds #$01202 ldy [,--S] ; Indexed - ndirect Register (Pre_decement -2) cmpy #0x01234 lbne FAIL cmps #0x01200 lbne FAIL nop nop nop ; ---------------------------------------- ; Test - Stores ; ---------------------------------------- lda #$018 exg a,dp ; Set the Direct Page SETDP 0x018 ; Tell the assembler about it ldy #$01A00 ; Store same pattern at 0x1800, 0x1900, 0x1A00 using each of the addressing modes lda #0x0AA sta <0x00 sta >0x1900 sta ,Y+ ldb #0x0BB stb <0x01 stb >0x1901 stb ,Y+ ldd #0x0D00D std <0x02 std >0x1902 std ,Y++ lds #0x05005 sts <0x04 sts >0x1904 sts ,Y++ ldu #0x06006 stu <0x06 stu >0x1906 stu ,Y++ ldx #0x01001 stx <0x08 stx >0x1908 stx ,Y++ ldb #0x00 ldd #0x00 lds #0x00 ldu #0x00 ldx #0x00 ldy #0x00 lda <0x00 cmpa #$0AA lbne FAIL lda #0x00 lda >0x1900 cmpa #$0AA lbne FAIL ldb <0x01 cmpb #$0BB lbne FAIL ldb #0x00 ldb >0x1901 cmpb #$0BB lbne FAIL ldd <0x02 cmpd #$0D00D lbne FAIL ldd #0x00 ldd >0x1902 cmpd #$0D00D lbne FAIL lds <0x04 cmps #$05005 lbne FAIL lds #0x00 lds >0x1904 cmps #$05005 lbne FAIL ldu <0x06 cmpu #0x06006 lbne FAIL ldu #0x00 ldu >0x1906 cmpu #0x06006 lbne FAIL ldx <0x08 cmpx #$01001 lbne FAIL ldx #0x00 ldx >0x1908 cmpx #$01001 lbne FAIL ; LEA tests ldy #0x01234 leas ,Y cmps #0x01234 lbne FAIL leau ,Y cmpu #0x01234 lbne FAIL leax ,Y cmpx #0x01234 lbne FAIL ldx #0x01234 leay ,X cmpy #0x01234 lbne FAIL ;----------------------------------------------------------- ;----------------------------------------------------------- ; Test brsnche and jump opcodes ; ---------------------------------------------------------------------- op_BRANCHES_JUMPS nop nop nop bra BRANCHES_JUMPS_START LOCAL_FAIL jmp LOCAL_FAIL SUBROUTINE_TEST nop nop rts BRANCHES_JUMPS_START ; Branches - set CC manually then test branch andcc #0x0F0 ; Clear arithmetic flags lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lbvs FAIL ; branch if V=1 lbcs FAIL ; branch if C=1 bmi LOCAL_FAIL ; branch if N=1 beq LOCAL_FAIL ; branch if Z=1 bvs LOCAL_FAIL ; branch if V=1 bcs LOCAL_FAIL ; branch if C=1 orcc #0x00F ; Set arithmetic flags lbpl FAIL ; branch if N=0 lbne FAIL ; branch if Z=0 lbvc FAIL ; branch if V=0 lbcc FAIL ; branch if C=0 bpl LOCAL_FAIL ; branch if N=0 bne LOCAL_FAIL ; branch if Z=0 bvc LOCAL_FAIL ; branch if V=0 bcc LOCAL_FAIL ; branch if C=0 blt LOCAL_FAIL ; branch if flag_n!=flag_v lblt LOCAL_FAIL bgt LOCAL_FAIL ; branch if (flag_n==flag_v) && (flag_z==0) lbgt LOCAL_FAIL andcc #0x0F7 ; Clear n flag bge LOCAL_FAIL ; branch if flag_n==flag_v lbge LOCAL_FAIL orcc #0x001 ; Set c flag bhi LOCAL_FAIL ; branch if (flag_z==0) && (flag_c==0) lbhi LOCAL_FAIL andcc #0x0F8 ; Clear z,v,c flags ble LOCAL_FAIL ; branch if (flag_n!=flag_v) || (flag_z==1) lble LOCAL_FAIL bls LOCAL_FAIL ; branch if (flag_z!=0) || (flag_c!=0) lbls LOCAL_FAIL lbra BRANCHES_CONTINUE LOCAL_FAIL2 jmp LOCAL_FAIL2 BRANCHES_CONTINUE brn LOCAL_FAIL2 lbrn LOCAL_FAIL2 bsr SUBROUTINE_TEST ; Branch Subroutine jsr SUBROUTINE_TEST ; Jump Subroutine lbsr SUBROUTINE_TEST ; Long Branch Subroutine ;----------------------------------------------------------- ;----------------------------------------------------------- ; Test - Addition and subtraction ; ---------------------------------------------------------------------- op_ADD_SUB nop nop nop lda #$012 exg a,dp ; Set the Direct Page SETDP 0x012 ; Tell the assembler about it ; Addition ; ------------ ldx #0x01234 ldb #0x02 abx cmpx #0x01236 lbne FAIL lda #0x02 ; ADDA Immediate adda #0x02 cmpa #0x004 lbne FAIL lda #0x02 ; ADDA Direct adda <$034 cmpa #0x014 lbne FAIL ldx #0x01200 ; ADDA Indexed lda #0x02 adda ,X cmpa #0x014 lbne FAIL lda #0x02 ; ADDA Extended adda >$01234 cmpa #0x014 lbne FAIL ldb #0x02 ; ADDB Immediate addb #0x02 cmpb #0x004 lbne FAIL ldb #0x02 ; ADDB Direct addb <$034 cmpb #0x014 lbne FAIL ldx #0x01200 ; ADDB Indexed ldb #0x02 addb ,X cmpb #0x014 lbne FAIL ldb #0x02 ; ADDB Extended addb >$01234 cmpb #0x014 lbne FAIL ldd #0x01002 ; ADDD Immediate addd #0x02 cmpd #0x01004 lbne FAIL ldd #0x01002 ; ADDD Direct addd <$034 cmpd #0x02236 lbne FAIL ldx #0x01200 ; ADDD Indexed ldd #0x02 addd ,X cmpd #0x01236 lbne FAIL ldd #0x02 ; ADDD Extended addd >$01234 cmpd #0x01236 lbne FAIL lda #0x02 ; ADCA Immediate orcc #0x001 ; Set Carry flag adca #0x02 cmpa #0x005 lbne FAIL lda #0x02 ; ADCA Direct orcc #0x001 ; Set Carry flag adca <$034 cmpa #0x015 lbne FAIL ldx #0x01200 ; ADCA Indexed lda #0x02 orcc #0x001 ; Set Carry flag adca ,X cmpa #0x015 lbne FAIL lda #0x02 ; ADCA Extended orcc #0x001 ; Set Carry flag adca >$01234 cmpa #0x015 lbne FAIL ldb #0x02 ; ADCB Immediate orcc #0x001 ; Set Carry flag adcb #0x02 cmpb #0x005 lbne FAIL ldb #0x02 ; ADCB Direct orcc #0x001 ; Set Carry flag adcb <$034 cmpb #0x015 lbne FAIL ldx #0x01200 ; ADCB Indexed ldb #0x02 orcc #0x001 ; Set Carry flag adcb ,X cmpb #0x015 lbne FAIL ldb #0x02 ; ADCB Extended orcc #0x001 ; Set Carry flag adcb >$01234 cmpb #0x015 lbne FAIL ; Subtraction ; ------------ lda #0x02 ; SUBA Immediate suba #0x02 cmpa #0x00 lbne FAIL lda #0x12 ; SUBA Direct suba <$034 cmpa #0x000 lbne FAIL ldx #0x01200 ; SUBA Indexed lda #0x012 suba ,X cmpa #0x000 lbne FAIL lda #0x012 ; SUBA Extended suba >$01234 cmpa #0x000 lbne FAIL ldb #0x02 ; SUBB Immediate subb #0x02 cmpb #0x000 lbne FAIL ldb #0x012 ; SUBB Direct subb <$034 cmpb #0x00 lbne FAIL ldx #0x01200 ; SUBB Indexed ldb #0x012 subb ,X cmpb #0x00 lbne FAIL ldb #0x012 ; SUBB Extended subb >$01234 cmpb #0x00 lbne FAIL ldd #0x01234 ; SUBD Immediate subd #0x01234 cmpd #0x00 lbne FAIL ldd #0x01234 ; SUBD Direct subd <$034 cmpd #0x00 lbne FAIL ldx #0x01234 ; SUBD Indexed ldd #0x01234 subd ,X cmpd #0x00 lbne FAIL ldd #0x01234 ; SUBD Extended subd >$01234 cmpd #0x00 lbne FAIL lda #0x03 ; SBCA Immediate orcc #0x001 ; Set Carry flag sbca #0x02 cmpa #0x000 lbne FAIL lda #0x013 ; SBCA Direct orcc #0x001 ; Set Carry flag sbca <$034 cmpa #0x00 lbne FAIL ldx #0x01200 ; SBCA Indexed lda #0x013 orcc #0x001 ; Set Carry flag sbca ,X cmpa #0x000 lbne FAIL lda #0x013 ; SBCA Extended orcc #0x001 ; Set Carry flag sbca >$01234 cmpa #0x00 lbne FAIL ldb #0x03 ; SBCB Immediate orcc #0x001 ; Set Carry flag sbcb #0x02 cmpb #0x000 lbne FAIL ldb #0x013 ; SBCB Direct orcc #0x001 ; Set Carry flag sbcb <$034 cmpb #0x00 lbne FAIL ldx #0x01200 ; SBCB Indexed ldb #0x013 orcc #0x001 ; Set Carry flag sbcb ,X cmpb #0x000 lbne FAIL ldb #0x013 ; SBCB Extended orcc #0x001 ; Set Carry flag sbcb >$01234 cmpb #0x00 lbne FAIL ; ADDA Flags check lda #0x00 adda #0x00 ; Expected: n=0 z=1 v=0 c=0 lbmi FAIL ; branch if N=1 lbne FAIL ; branch if Z=0 lbvs FAIL ; branch if V=1 lbcs FAIL ; branch if C=1 lda #0xFE adda #0x01 ; Expected: n=1 z=0 v=0 c=0 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 lbvs FAIL ; branch if V=1 lbcs FAIL ; branch if C=1 lda #0x7E adda #0x03 ; Expected: v=1 lbvc FAIL ; branch if V=0 lda #0xFE adda #0x03 ; Expected: c=1 lbcc FAIL ; branch if C=0 ; SUBA Flags check lda #0x00 suba #0x00 ; Expected: n=0 z=1 v=0 c=0 lbmi FAIL ; branch if N=1 lbne FAIL ; branch if Z=0 lbvs FAIL ; branch if V=1 lbcs FAIL ; branch if C=1 lda #0xFE suba #0x01 ; Expected: n=1 z=0 v=0 c=0 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 lbvs FAIL ; branch if V=1 lbcs FAIL ; branch if C=1 lda #0x7E suba #0x03 ; Expected: v=0 lbvs FAIL ; branch if V=1 lda #0xFE suba #0x03 ; Expected: c=0 lbcs FAIL ; branch if C=1 ; Comparisons ; -------------- ; Immediate ; --------- lda #0x080 ; Checking opcode support - flags already checked with SUB tests cmpa #0x080 lbne FAIL ldb #0x080 cmpb #0x080 lbne FAIL ldd #0x01111 cmpd #0x01111 lbne FAIL lds #0x02222 cmps #0x02222 lbne FAIL ldu #0x03333 cmpu #0x03333 lbne FAIL ldx #0x04444 cmpx #0x04444 lbne FAIL ldy #0x05555 cmpy #0x05555 lbne FAIL ; Direct ; ---------- lda #$012 exg a,dp ; Set the Direct Page SETDP 0x012 ; Tell the assembler about it lda #$012 cmpa <0x034 lbne FAIL ldb #$012 cmpb <0x034 lbne FAIL ldd #$01234 cmpd <0x034 lbne FAIL ldu #$01234 cmpu <0x034 lbne FAIL lds #$01234 cmps <0x034 lbne FAIL ldx #$01234 cmpx <0x034 lbne FAIL ldy #$01234 cmpy <0x034 lbne FAIL ; Indexed ; -------- ldx #0x01234 lda #0x012 cmpa ,X lbne FAIL ldb #0x012 cmpb ,X lbne FAIL ldd #0x01234 cmpd ,X lbne FAIL lds #0x01234 cmps ,X lbne FAIL ldu #0x01234 cmpu ,X lbne FAIL ldy #0x01234 cmpy ,X lbne FAIL ldy #0x01234 ldx #0x01234 cmpx ,Y lbne FAIL ; Extended Direct ; ----------------- lda #$012 cmpa >0x01234 lbne FAIL ldb #$012 cmpb >0x01234 lbne FAIL ldd #$01234 cmpd >0x01234 lbne FAIL ldu #$01234 cmpu >0x01234 lbne FAIL lds #$01234 cmps >0x01234 lbne FAIL ldx #$01234 cmpx >0x01234 lbne FAIL ldy #$01234 cmpy >0x01234 lbne FAIL ; Increment ; --------- lda #$012 inca cmpa #0x013 lbne FAIL ldb #$022 incb cmpb #0x023 lbne FAIL lda #$012 exg a,dp ; Set the Direct Page SETDP 0x012 ; Tell the assembler about it inc <0x060 ldb <0x060 cmpb #0x034 lbne FAIL ldx #0x01260 lda #0x012 inc ,X ldb <0x060 cmpb #0x035 lbne FAIL inc >0x01260 ldb <0x060 cmpb #0x036 lbne FAIL ; Flags check ; ----------- lda #$07F inca lbvc FAIL ; branch if V=0 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 ; Decrement ; --------- lda #$012 deca cmpa #0x011 lbne FAIL ldb #$022 decb cmpb #0x021 lbne FAIL lda #$012 exg a,dp ; Set the Direct Page SETDP 0x012 ; Tell the assembler about it dec <0x060 ldb <0x060 cmpb #0x035 lbne FAIL ldx #0x01260 lda #0x012 dec ,X ldb <0x060 cmpb #0x034 lbne FAIL dec >0x01260 ldb <0x060 cmpb #0x033 lbne FAIL ; Flags check ; ----------- lda #$080 deca lbvc FAIL ; branch if V=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 ;----------------------------------------------------------- ;----------------------------------------------------------- ; Test - Boolean Bit and Test ;----------------------------------------------------------- ; --- ; AND ; --- lda #0x0088 ; Immediate anda #0x0F0 lbvs FAIL ; branch if V=1 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 cmpa #0x080 lbne FAIL ldb #0x005A andb #0x00F lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x00A lbne FAIL andcc #0x000 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 orcc #0x00F lbvc FAIL ; branch if V=0 lbpl FAIL ; branch if N=0 lbne FAIL ; branch if Z=0 lda #0x00F ; Direct anda <$034 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x002 lbne FAIL lda #0x00F ; Indexed ldx #0x01200 anda ,X lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x002 lbne FAIL lda #0x00F ; Extended ldx #0x01200 anda >$01234 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x002 lbne FAIL ldb #0x00F ; Direct andb <$034 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x002 lbne FAIL ldb #0x00F ; Indexed ldx #0x01200 andb ,X lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x002 lbne FAIL ldb #0x00F ; Extended ldx #0x01200 andb >$01234 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x002 lbne FAIL ; --- ; OR ; --- lda #0x000A ; Immediate ora #0x050 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x5A lbne FAIL ldb #0x00A0 orb #0x005 lbvs FAIL ; branch if V=1 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 cmpb #0x0A5 lbne FAIL orcc #0x00F lbvc FAIL ; branch if V=0 lbpl FAIL ; branch if N=0 lbne FAIL ; branch if Z=0 lda #0x00F ; Direct ora <$034 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x01F lbne FAIL lda #0x00F ; Indexed ldx #0x01200 ora ,X lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x01F lbne FAIL lda #0x00F ; Extended ldx #0x01200 ora >$01234 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x01F lbne FAIL ldb #0x00F ; Direct orb <$034 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x01F lbne FAIL ldb #0x00F ; Indexed ldx #0x01200 orb ,X lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x01F lbne FAIL ldb #0x00F ; Extended ldx #0x01200 orb >$01234 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x01F lbne FAIL ; ---- ; EOR ; ---- lda #0x000A ; Immediate eora #0x050 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x5A lbne FAIL ldb #0x00A0 eorb #0x005 lbvs FAIL ; branch if V=1 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 cmpb #0x0A5 lbne FAIL lda #0x00F ; Direct eora <$034 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x01D lbne FAIL lda #0x00F ; Indexed ldx #0x01200 eora ,X lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x01D lbne FAIL lda #0x00F ; Extended ldx #0x01200 eora >$01234 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x01D lbne FAIL ldb #0x00F ; Direct eorb <$034 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x01D lbne FAIL ldb #0x00F ; Indexed ldx #0x01200 eorb ,X lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x01D lbne FAIL ldb #0x00F ; Extended ldx #0x01200 eorb >$01234 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x01D lbne FAIL ; ---- ; BIT ; ---- lda #0x0088 ; Immediate bita #0x0F0 lbvs FAIL ; branch if V=1 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 ldb #0x005A bitb #0x00F lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda #0x00F ; Direct bita <$034 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda #0x00F ; Indexed ldx #0x01200 bita ,X lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda #0x00F ; Extended ldx #0x01200 bita >$01234 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 ldb #0x00F ; Direct bitb <$034 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 ldb #0x00F ; Indexed ldx #0x01200 bitb ,X lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 ldb #0x00F ; Extended ldx #0x01200 bitb >$01234 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 ; ---- ; Test ; ---- lda #0x0088 ; Inherent tsta lbvs FAIL ; branch if V=1 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 ldb #0x0088 ; Inherent tstb lbvs FAIL ; branch if V=1 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 tst <$034 ; Direct lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 ldx #0x01200 ; Indexed tst ,X lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 ldx #0x01200 ; Extended tst >$01234 lbvs FAIL ; branch if V=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 ; ---- ; COM ; ---- lda #0x0088 ; Inherent coma lbvs FAIL ; branch if V=1 lbcc FAIL ; branch if C=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x077 lbne FAIL ldb #0x0088 ; Inherent comb lbvs FAIL ; branch if V=1 lbcc FAIL ; branch if C=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x077 lbne FAIL com <$034 ; Direct lbvs FAIL ; branch if V=1 lbcc FAIL ; branch if C=0 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 lda <$034 cmpa #0x0ED lbne FAIL com <$034 ; Put back origial value ldx #0x01234 ; Indexed com ,X lbvs FAIL ; branch if V=1 lbcc FAIL ; branch if C=0 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 lda ,X cmpa ,X lbne FAIL com ,X ; Put back origial value com >$01234 ; Extended lbvs FAIL ; branch if V=1 lbcc FAIL ; branch if C=0 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 lda >$01234 cmpa #0x0ED lbne FAIL com >$01234 ; Put back origial value ;----------------------------------------------------------- ;----------------------------------------------------------- ; Test - Shifts ;----------------------------------------------------------- ; ---- ; ASL ; ---- lda #0x0088 ; Inherent asla lbvc FAIL ; branch if V=0 lbcc FAIL ; branch if C=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x010 lbne FAIL ldb #0x0088 ; Inherent aslb lbvc FAIL ; branch if V=0 lbcc FAIL ; branch if C=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x010 lbne FAIL asl <$000 ; Direct lbvs FAIL ; branch if V=1 lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda <$000 cmpa #0x024 lbne FAIL com <$034 ; Put back origial value ldx #0x01200 ; Indexed asl ,X lbvs FAIL ; branch if V=1 lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda ,X cmpa ,X lbne FAIL com ,X ; Put back origial value asl >$01200 ; Extended lbvc FAIL ; branch if V=0 lbcc FAIL ; branch if C=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda >$01234 cmpa #0x0ED lbne FAIL com >$01234 ; Put back origial value ; ---- ; ASR ; ---- lda #0x0088 ; Inherent asra lbcs FAIL ; branch if C=1 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 cmpa #0x0C4 lbne FAIL ldb #0x0088 ; Inherent asrb lbcs FAIL ; branch if C=1 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 cmpb #0x0C4 lbne FAIL asr <$000 ; Direct lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda <$000 cmpa #0x037 lbne FAIL com <$034 ; Put back origial value ldx #0x01200 ; Indexed asr ,X lbcc FAIL ; branch if C=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda ,X cmpa ,X lbne FAIL com ,X ; Put back origial value asr >$01200 ; Extended lbcs FAIL ; branch if C=1 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 lda >$01200 cmpa #0x0F2 lbne FAIL com >$01200 ; Put back origial value ; ---- ; LSR ; ---- lda #0x0088 ; Inherent lsra lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x044 lbne FAIL ldb #0x0088 ; Inherent lsrb lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x044 lbne FAIL lsr <$000 ; Direct lbcc FAIL ; branch if C=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda <$000 cmpa #0x006 lbne FAIL com <$034 ; Put back origial value ldx #0x01200 ; Indexed lsr ,X lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda ,X cmpa #0x003 lbne FAIL com ,X ; Put back origial value lsr >$01200 ; Extended lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda >$01200 cmpa #0x07E lbne FAIL com >$01200 ; Put back origial value ; ---- ; ROL ; ---- lda #0x0088 ; Inherent rola lbvc FAIL ; branch if V=0 lbcc FAIL ; branch if C=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x011 lbne FAIL ldb #0x0088 ; Inherent rolb lbvc FAIL ; branch if V=0 lbcc FAIL ; branch if C=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x010 lbne FAIL rol <$000 ; Direct lbvc FAIL ; branch if V=0 lbcc FAIL ; branch if C=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda <$000 cmpa #0x002 lbne FAIL ldx #0x01200 ; Indexed rol ,X lbvs FAIL ; branch if V=1 lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda ,X cmpa #0x004 lbne FAIL rol >$01200 ; Extended lbvs FAIL ; branch if V=1 lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda >$01200 cmpa #0x008 lbne FAIL ; ---- ; ROR ; ---- lda #0x0088 ; Inherent rora lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x044 lbne FAIL ldb #0x0088 ; Inherent rorb lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x044 lbne FAIL ror <$000 ; Direct lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda <$000 cmpa #0x004 lbne FAIL ldx #0x01200 ; Indexed ror ,X lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda ,X cmpa #0x002 lbne FAIL ror >$01200 ; Extended lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda >$01200 cmpa #0x001 lbne FAIL ; ---- ; LSR ; ---- ldy #0x01234 sty >$01200 lda #0x0088 ; Inherent lsra lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x044 lbne FAIL ldb #0x0088 ; Inherent lsrb lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x044 lbne FAIL lsr <$000 ; Direct lbcs FAIL ; branch if C=1 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda <$000 cmpa #0x009 lbne FAIL com <$044 ; Put back origial value ldx #0x01200 ; Indexed lsr ,X lbcc FAIL ; branch if C=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda ,X cmpa #0x004 lbne FAIL com ,X ; Put back origial value lsr >$01200 ; Extended lbcc FAIL ; branch if C=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 lda >$01200 cmpa #0x07D lbne FAIL com >$01200 ; Put back origial value ;----------------------------------------------------------- ;----------------------------------------------------------- ; Test - Math ;----------------------------------------------------------- ; ---- ; CLR ; ---- lda #0x088 clra lbmi FAIL ; branch if N=1 lbne FAIL ; branch if Z=0 lbvs FAIL ; branch if V=1 lbcs FAIL ; branch if C=1 cmpa #0x000 lbne FAIL ldb #0x05A clrb cmpb #0x000 lbne FAIL com <$000 ; Direct clr <$000 lda >$01200 cmpa #0x000 lbne FAIL ldy #0x01200 ; Indexed com >$01200 clr ,Y lda >$01200 cmpa #0x000 lbne FAIL com >$01200 ; Extended clr >$01200 lda >$01200 cmpa #0x000 lbne FAIL ; ---- ; DAA ; ---- ldd #0x0 ldy #0x0FF00 sty >$01200 DAA_LOOP lda >$01200 daa adda >$01201 sta >$01201 dec >$01200 bne DAA_LOOP lda >$01201 cmpa #0x08A lbne FAIL ; ---- ; EXG ; ---- lda #0x0AA ldb #0x0BB exg a,b cmpa #0x0BB lbne FAIL cmpb #0x0AA lbne FAIL ldx #0x0AAAA ldy #0x0BBBB exg x,y cmpx #0x0BBBB lbne FAIL cmpy #0x0AAAA lbne FAIL ldu #0x01111 lds #0x02222 exg u,s cmpu #0x02222 lbne FAIL cmps #0x01111 lbne FAIL exg u,x cmpu #0x0BBBB lbne FAIL cmpx #0x02222 lbne FAIL exg s,y cmps #0x0AAAA lbne FAIL cmpy #0x01111 lbne FAIL exg x,u cmpx #0x0BBBB lbne FAIL cmpu #0x02222 lbne FAIL exg y,s cmpy #0x0AAAA lbne FAIL cmps #0x01111 lbne FAIL ; ---- ; TFR ; ---- tfr a,b cmpb #0x0BB lbne FAIL tfr x,y cmpy #0x0BBBB lbne FAIL tfr u,s cmps #0x02222 lbne FAIL ; ---- ; NEG ; ---- lda #0x0088 ; Inherent nega lbvs FAIL ; branch if V=1 lbcc FAIL ; branch if C=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpa #0x078 lbne FAIL ldb #0x0088 ; Inherent negb lbvs FAIL ; branch if V=1 lbcc FAIL ; branch if C=0 lbmi FAIL ; branch if N=1 lbeq FAIL ; branch if Z=1 cmpb #0x078 lbne FAIL neg <$034 ; Direct lbvs FAIL ; branch if V=1 lbcc FAIL ; branch if C=0 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 lda <$034 cmpa #0x0EE lbne FAIL com <$034 ; Put back origial value ldx #0x01234 ; Indexed neg ,X lbvs FAIL ; branch if V=1 lbcc FAIL ; branch if C=0 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 lda ,X cmpa #0x0EF lbne FAIL neg ,X ; Put back origial value neg >$01234 ; Extended lbvs FAIL ; branch if V=1 lbcc FAIL ; branch if C=0 lbpl FAIL ; branch if N=0 lbeq FAIL ; branch if Z=1 lda >$01234 cmpa #0x0EF lbne FAIL neg >$01234 ; Put back origial value ; ---- ; MUL ; ---- ldd #0x0 ldy #0x0FF00 sty >$01200 MUL_LOOP ldd >$01200 mul addd >$01202 std >$01202 inc >$01201 dec >$01200 bne MUL_LOOP ldd >$01202 cmpd #0x02B00 lbne FAIL ; ---- ; SEX ; ---- ldb #0x07F sex cmpa #0x00 lbne FAIL ldb #0x080 sex cmpa #0x0FF lbne FAIL ;----------------------------------------------------------- ;----------------------------------------------------------- ; Test - Stack ;----------------------------------------------------------- ; System Stack starts at 0xF100 ; User Stack starts at 0xF200 lda #0x0AA ldb #0x0BB ldx #0x01234 ldy #0x05678 lds #0x0F100 ldu #0x0F200 pshs #0x03E pshu #0x03E lda >$0F1F9 ; register_A cmpa #0x0AA lbne FAIL lda >$0F1FA ; register_B cmpa #0x0BB lbne FAIL lda >$0F1FB ; register_DP cmpa #0x012 lbne FAIL ldx >$0F1FC ; register_X cmpx #0x01234 lbne FAIL ldx >$0F1FE ; register_Y cmpx #0x05678 lbne FAIL lda #0x00 ldb #0x00 ldx #0x00 ldy #0x00 puls #0x03E pulu #0x03E cmpa #0x0AA ; register_A lbne FAIL cmpb #0x0BB ; register_B lbne FAIL cmpx #0x01234 ; register_X lbne FAIL cmpy #0x05678 ; register_Y lbne FAIL nop nop ;----------------------------------------------------------- ;----------------------------------------------------------- ; Test - Traps, Interrupts ;----------------------------------------------------------- lda #0x0AA ldb #0x0BB ldx #0x01234 ldy #0x05678 swi cmpa #0x0AA lbne FAIL cmpb #0x0BB lbne FAIL cmpx #0x01234 lbne FAIL cmpy #0x05678 lbne FAIL nop nop nop swi2 cmpa #0x0AA lbne FAIL cmpb #0x0BB lbne FAIL cmpx #0x01234 lbne FAIL cmpy #0x05678 lbne FAIL nop nop nop swi3 cmpa #0x0AA lbne FAIL cmpb #0x0BB lbne FAIL cmpx #0x01234 lbne FAIL cmpy #0x05678 lbne FAIL nop nop nop ;sync ;cwai #0x66 jmp ALL_DONE ;----------------------------------------------------------- ;----------------------------------------------------------- ; Loop here when all tests pass ; ALL_DONE mul jmp ALL_DONE ; Loop here when any test fails ; FAIL jmp FAIL