; 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 .include "atari.inc" start = $0600 ; use page 6 for now ; homebrew XEX header .word $ffff .word start .word end-1 .org start ; message is "Need 48K, remove cartridge" in screen codes. msg: .byte $2e, $65, $65, $64, $00, $14, $18, $2b .byte $0c, $00, $72, $65, $6d, $6f, $76, $65 .byte $00, $63, $61, $72, $74, $72, $69, $64 .byte $67, $65 msglen = * - msg - 1 S: .byte "S:",0 init: ;1. If RAMTOP is >=$C0, go to step 6. lda RAMTOP cmp #$c0 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 ;6. Do a GRAPHICS 0. ;7. Exit via RTS, so the rest of the game will load. ramtop_ok: jmp gr_0 ;8. Do a GRAPHICS 0. rom_present: jsr gr_0 ;9. Print a "remove cartridge" message lda #msg sta FR0+1 ldy #msglen msgloop: lda (FR0),y sta (SAVMSC),y 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. ;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