SELFTESTDBG=0 doselftest: lda #'0' sta $0400 ;----------------------------------------------------------------------- ; first do a selftest, compare the first 16k in RAM with the first 16k ; bank in the cartridge lda #>$0800 sta ptr1+1 lda #<$0800 sta ptr1+0 ; enable the cartridge lda #GMOD3_CTRL_8KGAME | GMOD3_CTRL_BITBANG_DISABLED sta GMOD3_CTRL ldx #0 ; upper 3 bits of the bank number lda #0 ; lower 8 bits of the bank number sta $de00,x stx bankhi sta banklo lda statusbits eor #STATUSBIT_BANK_CHANGED sta statusbits sta UPDATA ; get the first address of the payload in the ROM lda $8009+1 sta ptr2+1 lda $8009+0 sta ptr2+0 jsr selftestcheck ; carry set on failure !if SELFTESTDBG = 1 { jmp selftestfail } else { bcc + jmp selftestfail + } inc $0400 lda #>$8000 sta ptr2+1 lda #<$8000 sta ptr2+0 ldx #0 ; upper 3 bits of the bank number lda #1 ; lower 8 bits of the bank number sta $de00,x stx bankhi sta banklo lda statusbits eor #STATUSBIT_BANK_CHANGED sta statusbits sta UPDATA jsr selftestcheck ; carry set on failure !if SELFTESTDBG = 2 { jmp selftestfail } else { bcc + jmp selftestfail + } rts ;------------------------------------------------------------------------------- ; ptr1 - addr in C64 RAM ; ptr2 - addr in cartridge ROM selftestcheck: ldy #0 - lda statusbits eor #STATUSBIT_READ_START sta statusbits sta UPDATA lda (ptr2),y sta memblock1,y cmp (ptr1),y bne .fail iny bne - inc ptr1+1 inc ptr2+1 lda ptr2+1 cmp #$a0 bne - clc rts .fail sta gotvalue lda statusbits ora #STATUSBIT_ERROR sta UPDATA sec rts ;------------------------------------------------------------------------------- ; ptr1 - addr in C64 RAM ; ptr2 - addr in cartridge ROM selftestfail: ; add Y to the pointer(s) sty ytmp lda ptr1 clc adc ytmp sta ptr1 bcc + inc ptr1+1 + lda ptr2 clc adc ytmp sta ptr2 bcc + inc ptr2+1 + ldx #(40*2)-1 - lda selftesttxt,x sta $0400 + (23 * 40),x dex bpl - lda #>($0400 + (23 * 40) + 11) sta scrptr+1 lda #<($0400 + (23 * 40) + 11) sta scrptr lda banklo jsr printhex lda #>($0400 + (23 * 40) + 14) sta scrptr+1 lda #<($0400 + (23 * 40) + 14) sta scrptr ; cart ptr lda ptr2+1 jsr printhex lda ptr2 jsr printhex lda #>($0400 + (23 * 40) + 24) sta scrptr+1 lda #<($0400 + (23 * 40) + 24) sta scrptr ; value read from cart ;ldy #0 ;lda (ptr2),y lda gotvalue jsr printhex lda #>($0400 + (24 * 40) + 14) sta scrptr+1 lda #<($0400 + (24 * 40) + 14) sta scrptr ; mem ptr lda ptr1+1 jsr printhex lda ptr1 jsr printhex lda #>($0400 + (24 * 40) + 24) sta scrptr+1 lda #<($0400 + (24 * 40) + 24) sta scrptr ; expected value ldy #0 lda (ptr1),y jsr printhex lda #2 sta $d020 jmp * selftesttxt: ;0123456789012345678901234567890123456789 !scr "read addr: .. .... got: .. selftest " !scr "exp. addr: .... val: .. failed "