!cpu 65816

; 2017-12-13 J.E. Klasek j+816 AT klasek DOT at



videoram = $0400
colorram = $d800

;-------------------------------------------------------------------------------
	*=$07ff
	!word $0801
	!word bend
	!word 10
	!byte $9e
	!text "2061", 0
bend:       !word 0
;-------------------------------------------------------------------------------

	sei
	lda #$17
	sta $d018
	lda #$35
	sta $01
	lda #$7f
	sta $dc0d
	sta $dd0d
	lda $dc0d
	lda $dd0d
	ldx #0
-
	lda #$20
	sta videoram,x
	sta videoram+$0100,x
	sta videoram+$0200,x
	sta videoram+$0300,x
	lda #1
	sta colorram,x
	sta colorram+$0100,x
	sta colorram+$0200,x
	sta colorram+$0300,x
	inx
	bne -

	jmp start
theend:
	sep #$30                        ; 8-bit for X/Y and A/M
	!as
	!rs
	lda $040210
	cmp #$ff
	bne error
	
       	lda #5
	sta $d020
       	ldx #0 ; success
	stx $d7ff
	jmp *
error
	sta $0400
	lda $040211			; failure map (which test failed)
	sta $0401
	lda #10
	sta $d020
	ldx #$ff ; failure
	stx $d7ff
	jmp *

;-------------------------------------------------------------------------------

	* = $1000
start:
; EXPECTED FINAL RESULTS: $0210 = FF
; (any other number will be the 
;  test that failed)

; initialize:
	lda #$00
	sta $040210
	sta $040211
	

test00:

; setup cpu
	clc
	xce                             ; native mode
	rep #$30                        ; 16-bit for X/Y and A/M
	!al
	!rl

; setup registers
	lda #$0404                      ; Data Bank Register register
	pha                             ; akku in 16 bit
	plb                             ; pull DBR twice
	plb
	ldy #$8888                      ; change marker
	tyx
	tya

; setup memory
	lda #$5555                      ; wrap marker
	sta $048887                     ; into bank 4, for LDX/LDY
	lda #$7777                      ; no-wrap marker
	sta $058887			; into bank 5, for LDX/LDY

;---------------------------------------------------------------------

	stz $0000			; init wrap marker
	lda #$7777                      ; no-wrap marker
	sta $050000                     ; to start of bank 5

	sty $ffff                       ; high byte of Y is where?
	lda $0000
	bne +
	lda $ffff			; fetch, does not wrap
	cmp #$8888
	bne +
	lda $050000
	cmp #$7788			; write to bank 5
	beq ++
+	inc $0210			; fail counter
	clc
++	
	rol $0211			; update failure map
;---------------------------------------------------------------------

	stz $0000			; init wrap marker
	lda #$7777                      ; no-wrap marker
	sta $050000                     ; to start of bank 5

	tyx                             ; change marker
	stx $ffff                       ; high byte of Y is where?
	lda $0000
	bne +
	lda $ffff			; fetch, does not wrap
	cmp #$8888
	bne +
	lda $050000
	cmp #$7788			; write to bank 5
	beq ++
+	inc $0210			; fail counter
	clc
++	
	rol $0211			; update failure map
;---------------------------------------------------------------------

	ldy $ffff,x     ; Y=5555  Y=7777  value for Y comes from which bank?
	cpy #$7777
	beq +
	inc $0210			; fail counter
	clc
+
	rol $0211			; update failure map
;---------------------------------------------------------------------

	txy				; reinitialize y
	ldx $ffff,y     ; X=5555  X=7777  value for X comes from which bank?
	cpx #$7777
	beq +
	inc $0210			; fail counter
	clc
+
	rol $0211			; update failure map
;---------------------------------------------------------------------

	stz $0000			; init wrap marker
	lda #$7777                      ; no-wrap marker
	sta $050000                     ; to start of bank 5

	lda #$7788
	inc $0000			; $0000 = 1
	trb $ffff                       ; 88 77 & ^(88 77) -> 00 00
	lda $0000
	cmp #$0001			; $0000 not reset by trb (does not wrap)
	bne +
	lda $050000
	cmp #$7700			; $050001 reset by trb
	beq ++
+	inc $0210			; fail counter
	clc
++
	rol $0211			; update failure map
;---------------------------------------------------------------------

	lda #$7788
	sta $050000			; 00 88 | 88 77 -> 88 ff
	tsb $ffff                       ; set bits (which are already cleared)
	lda $0000
	cmp #$0001			; $0000 not set by tsb (does not wrap!)
	bne +
	lda $050000
	cmp #$77ff			; $050001 all bits set by tsb
	beq ++
+	inc $0210			; fail counter
	clc
++
	rol $0211			; update failure map
;---------------------------------------------------------------------
	

test00pass:
	lda $0210
	eor #%0011111100000000		; invert failure map
	sta $0210
	bne +
	dec $0210			; 0 -> FF
+	

	lda #$0000
	pha
	plb
	plb				; program bank = 0
	sec
	xce				; emulation mode
	sep #$30			; a/m, x/y 8 bit

        jmp theend
