From 439448f01820445bb42354b7e781c46cfed87f82 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Wed, 16 Nov 2022 04:00:54 -0500 Subject: enhance autorun.sys. --- Makefile | 2 +- autorun.s | 117 +++++++++++++++++++++++++++++++++++++++++++----------------- autorun.sys | Bin 1172 -> 1338 bytes dla.atr | Bin 92176 -> 92176 bytes 4 files changed, 86 insertions(+), 33 deletions(-) diff --git a/Makefile b/Makefile index 427a3b7..a1f5c92 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ dla2csv.xex: dla2csv.c dlaver.h $(CL65) $(CL65FLAGS) -t atari -W -unused-param -m dla2csv.map --start-addr 0x2800 -o $@ dla2csv.c autorun.sys: autorun.s about.dat - $(CL65) $(CL65FLAGS) -l about.list -t none -o autorun.sys autorun.s + $(CL65) $(CL65FLAGS) -l autorun.list -t none -o autorun.sys autorun.s about.dat: text2screen.pl ABOUT.txt perl text2screen.pl < ABOUT.txt > about.dat diff --git a/autorun.s b/autorun.s index c7bbac0..dc0f5dd 100644 --- a/autorun.s +++ b/autorun.s @@ -1,3 +1,13 @@ +; autorun.s - display an intro screen and a menu from which the user +; can launch dla.xex or dla2csv.xex, or exit to DOS. + +; I was *going* to write this in C, using cc65's exec()... but it +; turns out to only be implemented on XDOS, which is a rather uncommon +; DOS. MyDOS has XIO 40 (execute binary file), which is a lot easier +; to deal with in asm. Other DOSes might support XIO 40, and/or this +; might support other DOSes someday... Or I could write my own xex +; file loader (rather not). + .include "atari.inc" .include "xex.inc" @@ -8,19 +18,24 @@ old_sdlstl: .res 1 old_sdlsth: .res 1 old_color2: .res 1 old_color1: .res 1 +keycode: .res 1 .code + ; this doesn't have to be aligned on a 4K boundary, but it should + ; be aligned to 1K. loadaddr = $3000 xex_org loadaddr screendata: - .incbin "about.dat" + .incbin "about.dat" ; generated from ABOUT.txt, by text2screen.pl + ; 960 bytes is exactly one GR.0 screen (40x24) .if ((* - screendata) <> 960) .error .sprintf("%c*** about.dat is %d bytes (should be 960)", 10, * - screendata) .endif + ; bog-standard GRAPHICS 0 display list (except the LMS address) dlist: .byte DL_BLK8, DL_BLK8, DL_BLK8 .byte DL_CHR40x8x1 | DL_LMS @@ -31,14 +46,22 @@ dlist: .byte DL_JVB .word dlist + .if ((* / 1024) <> (screendata / 1024)) + .error .sprintf("%c*** screendata and dlist cross a 1K boundary!", 10) + .endif + + .include "io.s" + .include "printint.s" + main: ; fix things so the Reset key doesn't do a coldstart, see ; BOOT? and COLDST in Mapping. - lda #0 - sta COLDST - lda #1 - sta BOOTQ + ldx #0 + stx COLDST + inx + stx BOOTQ + ; save the OS's colors and display list. lda SDLSTL sta old_sdlstl lda SDLSTH @@ -48,6 +71,7 @@ main: lda COLOR2 sta old_color2 + ; use our own colors and display list (displays our message). lda #$90 sta COLOR2 lda #$0e @@ -57,14 +81,19 @@ main: lda #>dlist sta SDLSTH -loop: - ldx CH - cpx #$ff - beq loop + ; wait for a keypress +keyloop: + lda CH + cmp #KEY_NONE + beq keyloop + + sta keycode ; got a keypress, save it for later + ; clear keypress so the loaded program won't see it lda #$ff sta CH + ; restore OS's colors and display list (back to regular E:) lda old_sdlstl sta SDLSTL lda old_sdlsth @@ -74,48 +103,72 @@ loop: lda old_color2 sta COLOR2 - cpx #KEY_1 - bne not_1 + ; see what key was hit ldy #0 - beq setup_iocb - -not_1: - cpx #KEY_2 - bne not_2 - ldy #1 - bne setup_iocb - -not_2: - ; 3, or actually any other key - rts - -setup_iocb: - ldx #$10 - lda #$28 ; MyDOS XIO 40 +keytabloop: + lda keytab,y ; get table entry + cmp #KEY_NONE ; did we hit the end of the table with no match? + beq exit ; yes, we're done + cmp keycode ; no, see if this table entry matches + beq load_file ; yes, use it + iny ; no, look at next entry + bne keytabloop ; branch always + + ; load and run the file (Y is index into filename table) +load_file: + ldx #$10 ; IOCB #1 + lda #$28 ; MyDOS XIO 40. 39 also works (same thing?), neither works on SDX sta ICCOM,x - lda fntab_l,y + lda fntab_l,y ; filename sta ICBAL,x lda fntab_h,y sta ICBAH,x - lda fnlentab,y + lda fnlentab,y ; filename length sta ICBLL,x lda #0 sta ICBLH,x - jsr CIOV + jsr CIOV ; pull the trigger ; CIOV should never return on success, so if we get here, give up. - lda #0 - sta COLOR2 -hang: jmp hang + tya + pha ; save CIO return status (aka error number) + lda #diskerrmsg + jsr printmsg ; print error message + pla + jsr printdecb ; print error number + lda #presskeymsg + jsr printmsg ; press a key... + + ; wait for a keypress, to give the user a chance to read the + ; error message. +keyloop2: + lda CH + cmp #KEY_NONE + beq keyloop2 + lda #KEY_NONE + sta CH +exit: rts dla_filename: .byte "D:DLA.XEX" dla_fn_len = * - dla_filename + csv_filename: .byte "D:DLA2CSV.XEX" csv_fn_len = * - csv_filename +; these tables only have 2 entries, but could have many more if +; we ever need them (up to 255). fntab_l: .byte dla_filename, >csv_filename + fnlentab: .byte dla_fn_len, csv_fn_len +; KEY_NONE marks the end of this table. +keytab: .byte KEY_1, KEY_2, KEY_NONE + +diskerrmsg: .byte "I/O Error ",0 +presskeymsg: .byte $9b,"Press any key...",0 + xex_run main diff --git a/autorun.sys b/autorun.sys index b3a58f9..ab38cae 100644 Binary files a/autorun.sys and b/autorun.sys differ diff --git a/dla.atr b/dla.atr index 8eddf3a..d1b825b 100644 Binary files a/dla.atr and b/dla.atr differ -- cgit v1.2.3