        ; 6809 Test program.

testnr  equ 32

        org $100
        jmp entry
error  ldx #errmsg
        bsr outs
        lda testnr
        bsr outa
        ldx #newline
        bsr outs
        sync

errmsg fcb "ERROR ",0
newline fcb 13,10,0
outs    ldb ,x+
        beq done1
        swi2
        bra outs
done1   rts
outdig  addb # 48
        cmpb # 57
        bls  od2
        addb #7
od2     swi2
        rts
outa    tfr a,b
        lsrb
        lsrb
        lsrb
        lsrb
        bsr outdig
        tfr a,b
        andb # 15
        bra outdig
passmsg  fcb "PASSED ",0
good    ldx #passmsg
        jsr outs
        lda testnr
        jsr outa
        ldx #newline
        jsr outs
        inc testnr
        rts

entry   clr testnr
        jsr good          ;test #0, does it print msg?
        andcc #0          ;test #1, conditional (long) branches
        lbvs error        ;         andcc, orcc
        lbcs error
        lbeq error
        lbmi error
        lbls error
        lblt error
        lble error
        lbrn error
        bvs errt1
        bcs errt1
        beq errt1
        bmi errt1
        bls errt1
        blt errt1
        ble errt1
        brn errt1
        lbvc goot1
errt1   jmp error
goot1   lbcc goot2
        jmp error
goot2   lbne goot3
        jmp error
goot3   lbpl goot4
        jmp error
goot4   lbhi goot5
        jmp error
goot5   lbge goot6
        jmp error
goot6   lbgt goot7
        jmp error
goot7   lbra goot8
        jmp error
goot8   bvc goot9
        jmp error
goot9   bcc goot10
        jmp error
goot10  bne goot11
        jmp error
goot11  bpl goot12
        jmp error
goot12  bhi goot13
        jmp error
goot13  bge goot14
        jmp error
goot14  bgt goot15
        jmp error
goot15  bra goot16
        jmp error
goot16  tfr cc,a
        tsta
        lbne error
        andcc #0
        orcc #1
        lbcc error
        lbeq error
        lbvs error
        lbmi error
        orcc #2
        lbvc error
        lbeq error
        lbmi error
        orcc #4
        lbne error
        lbmi error
        orcc #8
        lbpl error
        tfr cc,a
        cmpa #15
        lbne error
        orcc #15
        orcc #240
        tfr cc,a
        inca
        lbne error
        orcc #255
        andcc #$aa
        tfr cc,a
        cmpa #$aa
        lbne error
        jsr good

        lds #0       ; test #2: registers and their values, tfr, exg
        lda #$28
        ldb #$7f
        ldu #3417
        ldx #2221
        ldy #16555
        cmpa #$28
        lbne error
        cmpb #$7f
        lbne error
        cmpd #$287f
        lbne error
        cmpx #2221
        lbne error
        cmpy #13
        lbeq error
        cmpy #16555
        lbne error
        cmpu #3417
        lbne error
        cmps #0
        lbne error
        exg x,y
        cmpx #16555
        lbne error
        cmpy #2221
        lbne error
        exg x,d
        cmpd #16555
        lbne error
        cmpx #$287f
        lbne error
        cmpy #2221
        lbne error
        exg x,d
        exg a,dp
        tsta
        lbne error
        exg a,dp
        exg a,b
        cmpa #$7f
        lbne error
        cmpb #$28
        lbne error
        tfr b,a
        cmpb #$28
        lbne error
        cmpa #$28
        lbne error
        tfr u,x
        cmpu #3417
        lbne error
        cmpx #3417
        lbne error
        tfr pc,x
here    cmpx #here
        lbne error
        tfr u,s
        cmps #3417
        lbne error
        lds #0
        clra
        tfr b,cc
        tfr cc,a
        cmpa #$28
        lbne error
        jsr good

        lda #128       ;Arithmetic and their status.
        adda #255
        lbcc error
        lbvc error
        lbmi error
        cmpa #127
        lbne error
        lda #0
        adda #255
        lbcs error
        lbvs error
        lbpl error
        cmpa #255
        lbne error
        orcc #1
        lda #255
        adca #0
        lbne error
        lbmi error
        lbcc error
        lda #216
        adda #40
        lbne error
        lda #80
        adda #40
        lbcs error
        lbvs error
        cmpa #120
        lbne error
        orcc #1
        lda #80
        adca #40
        lbcs error
        lbvs error
        cmpa #121
        lbne error
        andcc #254
        ldb #80
        adcb #40
        lbcs error
        lbvs error
        cmpb #120
        lbne error
        ldb #80
        subb #120
        lbcc error
        lbvs error
        cmpb #216
        lbne error
        andcc #254
        lda #140
        sbca #20
        lbvc error
        lbcs error
        cmpa #120
        lbne error
        orcc #1
        lda #140
        sbca #20
        lbvc error
        lbcs error
        cmpa #119
        lbne error
        ldd #40000
        subd #20000
        lbvc error
        lbcs error
        cmpd #20000
        lbne error
        ldd #20000
        subd #40000
        lbvc error
        lbcc error
        cmpd #-20000
        lbne error
        ldd #30000
        addd #-20000
        lbcc error
        lbvs error
        cmpd #10000
        lbne error
        jsr good

        lda #$23      ;Test #4 decimal arithmetic.
        adda #$34
        daa
        lbcs error
        cmpa #$57
        lbne error
        orcc #1
        lda #$19
        adca #$29
        daa
        lbcs error
        cmpa #$49
        lbne error
        lda #$92
        adda #$8
        daa
        lbcc error
        cmpa #$00
        jsr good

        lda #128       ;Test#5  MUL and SEX
        ldb #2
        mul
        lbeq error
        lbcs error
        cmpd #256
        lbne error
        lda #0
        ldb #23
        mul
        lbne error
        lbcs error
        cmpd #0
        lbne error
        lda #10
        ldb #20
        mul
        lbcc error
        cmpd #200
        lbne error
        lda #100
        ldb #49
        mul
        cmpd #4900
        lbne error
        clrb
        sex
        cmpd #0
        lbne error
        ldb #128
        sex
        cmpd #-128
        lbne error
        ldb #50
        sex
        cmpd #50
        lbne error
        jsr good

        lda #$55    ; Test #6 Shifts and rotates.
        asla
        lbcs error
        cmpa #$aa
        lbne error
        asla
        lbcc error
        cmpa #$54
        lbne error
        lda #$0
        andcc #254
        rola
        lbne error
        orcc #1
        rola
        deca
        lbne error
        andcc #254
        rora
        lbne error
        orcc #1
        rora
        cmpa #128
        lbne error
        asra
        cmpa #192
        lbne error
        lsra
        cmpa #96
        lbne error
        ldb # 54
        aslb
        cmpb # 108
        lbne error
        jsr good

        orcc #15          ; Test #7 INC, DEC and NEG
        lda # 33
        inca
        lbeq error
        lbvs error
        lbcc error
        lbmi error
        deca
        lbeq error
        lbvs error
        lbcc error
        lbmi error
        clra
        andcc #254
        deca
        lbcs error
        lbpl error
        inca
        lbne error
        ldb #126
        negb
        lbvs error
        lbcc error
        cmpb #130
        lbne error
        decb
        decb
        negb
        lbvc error
        cmpb #128
        lbne error
        clrb
        negb
        lbcs error
        lbne error
        jsr good

	;test #8 Addessing modes.	
	ldx #testdat+4
	lda ,x
	cmpa #5
        lbne error 
	lda ,x+
	cmpa #5
 	lbne error
	cmpx #testdat+5
	lbne error
	ldd ,x++
	cmpd #6*256+7
	lbne error
	cmpx #testdat+7
	lbne error
	ldx #testdat+4
	lda ,-x
	cmpa #4
	lbne error
	cmpx #testdat+3
	lbne error
	ldd ,--x
	cmpd #2*256+3
	lbne error
        cmpx #testdat+1
	lbne error
	ldx #testdat+4
	lda -2,x
	cmpa #3
	lbne error
	lda 2,x
	cmpa #7
	lbne error
	ldx #td1
	ldd [,x]
	cmpd #3*256+4
	lbne error
	cmpx #td1
	lbne error
	jsr good			
	bra next1
testdat	fcb 1,2,3,4,5,6,7,8,9,10
td1	fdb testdat+2
next1   

        sync
        end $100



