; 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). ; cl65 -o checkmem.xex -t none checkmem.s .include "atari.inc" start = $0600 ; use page 6 for now .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: lda RAMSIZ cmp #$c0 php 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 ; if RAM size is $c000 or higher, we're OK, just exit. rts have_cart: ; if RAM size is below $c000, we have a cartridge (or XL BASIC). ; print the "remove cart" message... lda #msg sta FR0+1 ldy #msglen msgloop: lda (FR0),y sta (SAVMSC),y dey bpl msgloop sty CH ; y == $ff at this point, clear keyboard ; ...wait for a keystroke... wait4key: cpy CH beq wait4key ; ...and do a warmstart. jmp WARMSV end: .word INITAD .word INITAD+1 .word init