From 3ea71335da53364aa228a2066da31f8a14cfebe5 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Sun, 7 Feb 2016 03:57:59 -0500 Subject: take 2 on checkmem --- checkmem.s | 116 +++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 78 insertions(+), 38 deletions(-) (limited to 'checkmem.s') diff --git a/checkmem.s b/checkmem.s index a87bbd2..a88b462 100644 --- a/checkmem.s +++ b/checkmem.s @@ -1,10 +1,23 @@ -; initial load segment for taipan. intended to be a tiny (1-sector) -; routine that checks for the presence of BASIC or a cartridge, and aborts -; the load if found. Also, it resets RAMTOP to RAMSIZ and does a GRAPHICS -; 0, to avoid problems with funky loaders leaving the graphics screen -; in the wrong place (Atarimax flash cart leaves it at $9cxx) or in the -; wrong graphics mode (Fenders 3-sector loader doesn't set up GR.0). +; Memcheck needs to do this: + +;1. If RAMTOP is >=$C0, go to step 6. +;2. Attempt to disable BASIC. +;3. Write some data to $A000, read it back (do twice with 2 different values) +;4. If we couldn't read back what we wrote, that means there really is a +; cartridge plugged in. Go to step 8. +;5. Set RAMTOP to $C0. +;6. Do a GRAPHICS 0. +;7. Exit via RTS, so the rest of the game will load. +;8. Do a GRAPHICS 0. +;9. Print a "remove cartridge" message +;10. Wait for a keypress +;11. Exit to DOS (without loading the rest of the file) + +;At no point do we look at RAMSIZ, since it can't be trusted under SDX. + +;Note that when we reach step 6, RAMTOP is always $C0 (either it was, +;or we set it to that). ; cl65 -o checkmem.xex -t none checkmem.s @@ -12,6 +25,7 @@ start = $0600 ; use page 6 for now +; homebrew XEX header .word $ffff .word start .word end-1 @@ -27,40 +41,46 @@ msg: msglen = * - msg - 1 S: .byte "S:",0 + init: - lda RAMSIZ +;1. If RAMTOP is >=$C0, go to step 6. + lda RAMTOP cmp #$c0 - php + bcs ramtop_ok + +;2. Attempt to disable BASIC. +; set bit 1 of PORTB. No effect on 400/800/1200XL. Don't +; touch any other bits in PORTB! + lda PORTB + ora #$02 + sta PORTB + +;3. Write some data to $A000, read it back (do twice with 2 different values) +;4. If we couldn't read back what we wrote, that means there really is a +; cartridge plugged in. Go to step 8. + lda #$AA + sta $A000 + cmp $A000 + bne rom_present + lsr + sta $A000 + cmp $A000 + bne rom_present + +;5. Set RAMTOP to $C0. + lda #$c0 sta RAMTOP - ldx #6*$10 ; CLOSE #6 - lda #CLOSE - sta ICCOM,x - jsr CIOV - - ; GRAPHICS 0 - ldx #6*$10 ; IOCB #6 - lda #OPEN - sta ICCOM,x - lda #$1c ; $c = read/write - sta ICAX1,x - lda #0 ; aux2 byte zero - sta ICAX2,x - lda #S - sta ICBAH,x - jsr CIOV - - plp - bcc have_cart +;6. Do a GRAPHICS 0. +;7. Exit via RTS, so the rest of the game will load. +ramtop_ok: + jmp gr_0 - ; if RAM size is $c000 or higher, we're OK, just exit. - rts +;8. Do a GRAPHICS 0. + jsr gr_0 -have_cart: - ; if RAM size is below $c000, we have a cartridge (or XL BASIC). - ; print the "remove cart" message... +;9. Print a "remove cartridge" message +rom_present: lda #msg @@ -73,18 +93,38 @@ msgloop: dey bpl msgloop +;10. Wait for a keypress sty CH ; y == $ff at this point, clear keyboard ; ...wait for a keystroke... wait4key: cpy CH beq wait4key + sty CH ; clear the key so DOS menu won't see it. - ; ...and do a warmstart. - jmp WARMSV +;11. Exit to DOS (without loading the rest of the file) + jmp (DOSVEC) + +gr_0: + ldx #6*$10 ; CLOSE #6 + lda #CLOSE + sta ICCOM,x + jsr CIOV + + ; GRAPHICS 0 + ldx #6*$10 ; IOCB #6 + lda #OPEN + sta ICCOM,x + lda #$1c ; $c = read/write + sta ICAX1,x + lda #0 ; aux2 byte zero + sta ICAX2,x + lda #S + sta ICBAH,x + jmp CIOV end: .word INITAD .word INITAD+1 .word init - - -- cgit v1.2.3