Im Zuge der Restauration dieses C64-Boards habe ich das 64738te Speichertestprogramm geschrieben. Ich häng das einfach mal hier dran
Code
- !to "memtest.prg",cbm
- zero0=$f7
- zero2=$f9
- zero4=$fb
- zero6=$fd
- chrout=$ffd2
- *=$0801
- !byte $0b,$08,$00,$00,$9e
- !text "2061"
- !byte $00,$00,$00
- *=$080d
- !zone main {
- .altpage=$cf00
- .result=.altpage-$0100
- .tmp=.altpage-$0200
- .run=.altpage-$0300
- ;test zeropage
- lda #<.txttest
- sta zero2
- lda #>.txttest
- sta zero2+1
- jsr strout
- ldx #$00
- ldy #$00
- jsr wordout
- lda #<.tmp
- sta zero2
- lda #>.tmp
- sta zero2+1
- lda #<.result
- sta zero4
- lda #>.result
- sta zero4+1
- jsr testzero
- lda #<.result
- sta zero0
- lda #>.result
- sta zero0+1
- jsr displayresult
- ;copy testcode
- lda #<(testpage)
- sta zero4
- lda #>(testpage)
- sta zero4+1
- lda #$00
- sta zero6
- lda #>.run
- sta zero6+1
- ldy #$00
- .l0 lda (zero4),y
- sta (zero6),y
- iny
- cpy #etestpage-testpage
- bne .l0
- ldy #$01 ;we skip the zeropage
- .l1 jsr chkrunstop
- beq .end
- ;print current page
- lda #<.txttest
- sta zero2
- lda #>.txttest
- sta zero2+1
- jsr strout
- ldx #$00
- jsr wordout
- ;setup testpage
- lda #$00
- sta zero0
- sty zero0+1
- ;setup tmp
- lda #$00
- sta zero2
- lda #>.tmp
- cpy #>.tmp
- bne .l2
- lda #>.altpage
- .l2 sta zero2+1
- ;setup result
- lda #$00
- sta zero4
- lda #>.result
- cpy #>.result
- bne .l3
- lda #>.altpage
- .l3 sta zero4+1
- ;setup run
- cpy #>.run
- bne .l5
- ;our own run-page is about to be tested, copy code to alternative page...
- tya
- pha
- ldy #$00
- .l4 lda .run,y
- sta .altpage,y
- iny
- bne .l4
- pla
- tay
- jsr .altpage ;...and run it there
- jmp .l6
- .l5 jsr .run
- .l6 ;display result
- lda #$00
- sta zero0
- lda #>.result
- cpy #>.result
- bne .l7
- lda #>.altpage
- .l7 sta zero0+1
- jsr displayresult
- iny
- bne .l1
- .end
- rts
- .txttest !text $0d,"TEST PAGE $" ,$00
- }
- chkrunstop
- !zone chkrunstop {
- sei
- lda #%01111111
- sta $dc00
- lda $dc01
- and #%10000000
- cli
- rts
- }
- displayresult
- !zone displayresult {
- .result=zero0
- txa
- pha
- tya
- pha
- ldy #$00
- sty .flag
- .l0 lda (.result),y
- beq .l1
- pha
- lda #<.txterror1
- sta zero2
- lda #>.txterror1
- sta zero2+1
- jsr strout
- tya
- jsr byteout
- lda #<.txterror2
- sta zero2
- lda #>.txterror2
- sta zero2+1
- jsr strout
- lda #$01
- sta .flag
- pla
- jsr binout
- .l1
- iny
- bne .l0
- lda .flag
- bne .l2
- lda #<.txtok
- sta zero2
- lda #>.txtok
- sta zero2+1
- jsr strout
- .l2 pla
- tay
- pla
- tax
- rts
- .flag !byte $00
- .txtok !text " - OK",$00
- .txterror1 !text $0d,"!ERROR ON $",$00
- .txterror2 !text " - ",$00
- }
- binout
- !zone binout {
- sta .tmp
- tya
- pha
- ldy #$08
- lda .tmp
- clc
- .l0 rol
- pha
- bcs .l1
- lda #"0"
- jmp .l2
- .l1 lda #"1"
- .l2 jsr chrout
- pla
- dey
- bne .l0
- pla
- tay
- rts
- .tmp !byte $00
- }
- wordout
- tya
- jsr byteout
- txa
- jsr byteout
- rts
- byteout
- !zone byteout {
- sta .tmp
- tya
- pha
- lda .tmp
- lsr
- lsr
- lsr
- lsr
- tay
- lda .hexmap,y
- jsr chrout
- lda .tmp
- and #$0f
- tay
- lda .hexmap,y
- jsr chrout
- pla
- tay
- rts
- .tmp !byte $00
- .hexmap !text "0123456789ABCDEF"
- }
- strout
- !zone strout {
- .output=zero2
- tya
- pha
- ldy #$00
- beq .l1
- .l0 jsr chrout
- iny
- .l1 lda (.output),y
- bne .l0
- pla
- tay
- rts
- }
- testpage
- !zone testpage {
- ;parameters
- .testpage=zero0
- .savepage=zero2
- .result=zero4
- ;locals
- .pattern=zero6
- txa
- pha
- tya
- pha
- ;disable irq and enable all ram
- sei
- lda #52
- sta $01
- ;save page and clear result
- ldy #$00
- .l0 lda (.testpage),y
- sta (.savepage),y
- lda #$00
- sta (.result),y
- iny
- bne .l0
- ; test page
- ldx #$00
- .l1 lda #%11111111
- cpx #$01
- beq .l2
- lda #%10101010
- cpx #$02
- beq .l2
- lda #%01010101
- cpx #$03
- beq .l2
- lda #%00000000
- .l2 sta .pattern
- ldy #$00
- .l3 sta (.testpage),y
- iny
- bne .l3
- ldy #$00
- .l4 lda .pattern
- eor (.testpage),y
- beq .l5
- ;store error in result
- ora (.result),y
- sta (.result),y
- .l5 iny
- bne .l4
- inx
- cpx #$04 ;patterncount
- bne .l1
- ;restore page
- ;ldy #$00 ;already 0
- .l6 lda (.savepage),y
- sta (.testpage),y
- iny
- bne .l6
- ;enable io, roms and irqs
- lda #55
- sta $01
- cli
- pla
- tay
- pla
- tax
- rts
- }
- etestpage
- testzero
- !zone testzero {
- .savepage=zero2
- .result=zero4
- .zerostart=$02 ;skip memory control bytes $0000 and $0001
- sei
- ;save page and clear result
- ldy #.zerostart
- .l0 lda $00,y
- sta (.savepage),y
- lda #$00
- sta (.result),y
- iny
- bne .l0
- ; modify ourself as we must not use the zeropage during the test
- lda .savepage
- sta .ms1+1
- lda .savepage+1
- sta .ms1+2
- lda .result
- sta .mr1+1
- sta .mr2+1
- lda .result+1
- sta .mr1+2
- sta .mr2+2
- ; test page
- ldx #$00
- .l1 lda #%11111111
- cpx #$01
- beq .l2
- lda #%10101010
- cpx #$02
- beq .l2
- lda #%01010101
- cpx #$03
- beq .l2
- lda #%00000000
- .l2 sta .mp1+1 ;modify ourself
- ldy #.zerostart
- .l3 sta $00,y
- iny
- bne .l3
- ldy #.zerostart
- .l4
- .mp1 lda #$ff ;to be modified
- eor $00,y
- beq .l5
- ;store error in result
- .mr1 ora $adde,y ;to be modified
- .mr2 sta $efbe,y ;to be modified
- .l5 iny
- bne .l4
- inx
- cpx #$04 ;patterncount
- bne .l1
- ;restore page
- ldy #.zerostart
- .l6
- .ms1 lda $adde,y ;to be modified
- sta $00,y
- iny
- bne .l6
- cli
- rts
- }