From 480d2a93056270e95b4802abc0c03520bdbb1f7f Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Thu, 30 May 2013 02:33:09 +0200 Subject: [PATCH] Code & data for "system check" load chunk in the atarixl target. --- libsrc/atari/system_check.s | 159 ++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 libsrc/atari/system_check.s diff --git a/libsrc/atari/system_check.s b/libsrc/atari/system_check.s new file mode 100644 index 000000000..e8d44b29c --- /dev/null +++ b/libsrc/atari/system_check.s @@ -0,0 +1,159 @@ +; +; Atari XL startup system check +; +; This routine gets loaded prior to the main part of the executable +; and checks if the system is compatible to run the program. +; It checks whether the system is an XL type one and that enough +; memory is installed (which isn't the case for a 600XL). +; If the system doesn't qualify, the loading of the main program +; is aborted by jumping to DOSVEC. +; +; Christian Groessler, chris@groessler.org, 2013 +; + +.if .defined(__ATARIXL__) + + .export syschk + .import __SYSCHK_LOAD__ + .import __SAVEAREA_LOAD__ + + .include "zeropage.inc" + .include "atari.inc" + + +.macro print_string text + .local start, cont + jmp cont +start: .byte text, ATEOL +cont: ldx #0 ; channel 0 + lda #start + sta ICBAH,x + lda #<(cont - start) + sta ICBLL,x ; length + lda #>(cont - start) + sta ICBLH,x + lda #PUTCHR + sta ICCOM,x + jsr CIOV +.endmacro +.macro print_string2 addr, len + + ldx #0 ; channel 0 + lda #addr + sta ICBAH,x + lda #len + sta ICBLH,x + lda #PUTCHR + sta ICCOM,x + jsr CIOV + +.endmacro + + +; ------------------------------------------------------------------------ +; Chunk header + +.segment "SYSCHKHDR" + + .word __SYSCHK_LOAD__ + .word trailer - 1 + +; ------------------------------------------------------------------------ +; Actual code + +.segment "SYSCHK" + +syschk: + lda $fcd8 ; from ostype.s + cmp #$a2 + bne is_xl + +; no XL machine + print_string "This program needs an XL machine." + jmp fail + +; we have an XL machine, now check memory +is_xl: lda RAMSIZ + cmp #$80 + bcs sys_ok + +; not enough memory + print_string "Not enough memory." +fail: jsr delay + jmp (DOSVEC) + +lowadr: .res 2 ; lowest address we need in order to move screen memory down, depending on start address of program + + +; system is basically supported, check if there is enough space btw. MEMLO and our start address +; to move screen memory there + +CMPVAL = 64+255+992 ; you may ask, why these values... @@@ document + +sys_ok: lda #<__SAVEAREA_LOAD__ + sec + sbc #__SAVEAREA_LOAD__ + sbc #>CMPVAL + sta lowadr+1 + + sec + lda MEMLO + sbc lowadr + lda MEMLO+1 + sbc lowadr+1 + bcc memlo_ok + +; load address was too low + print_string2 lmemerr_txt, lmemerr_txt_len + jsr delay ; long text takes longer to read, give user additional time + jmp fail + +; all is well(tm), launch the application +memlo_ok: + rts + + +lmemerr_txt: + .byte "Not enough memory to move screen", ATEOL + .byte "memory to low memory. Consider using", ATEOL + .byte "a higher load address.", ATEOL +lmemerr_txt_len = * - lmemerr_txt + + +; short delay +.proc delay + + lda #10 +l: jsr delay1 + clc + sbc #0 + bne l + rts + +delay1: ldx #0 + ldy #0 +loop: dey + bne loop + dex + bne loop + rts + +.endproc + +; ------------------------------------------------------------------------ +; Chunk "trailer" - sets INITAD + +trailer: + .word INITAD + .word INITAD+1 + .word __SYSCHK_LOAD__ + +.endif ; .if .defined(__ATARIXL__)