diff options
author | B. Watson <urchlay@slackware.uk> | 2022-08-29 16:11:13 -0400 |
---|---|---|
committer | B. Watson <urchlay@slackware.uk> | 2022-08-29 16:11:13 -0400 |
commit | e2ba8458a5cfdfacfaf103e7ba97d610afa6c970 (patch) | |
tree | cd665e602e6e2b636578a7d3d7894380605dafcc /loadscreen.dasm | |
download | bw-atari8-tools-e2ba8458a5cfdfacfaf103e7ba97d610afa6c970.tar.gz |
initial commit
Diffstat (limited to 'loadscreen.dasm')
-rw-r--r-- | loadscreen.dasm | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/loadscreen.dasm b/loadscreen.dasm new file mode 100644 index 0000000..e623d09 --- /dev/null +++ b/loadscreen.dasm @@ -0,0 +1,153 @@ + +; 20070524 bkw: DASM source for GR.2 "LOADING..." screen. +; Object code is intended to be prepended to some other object +; file, so it uses INITAD rather than RUNAD. + +; WARNING: if you modify this file such that the object code changes, +; make sure you edit cart2bin.c and correct the offset for the title +; screen text! As long as you don't change anything after the "loading" +; label, this won't be a problem. + + processor 6502 + + include "equates.inc" + + seg.u ZP + org $80 + + if * > $ff + echo "Zero page vars have overrun into the stack! * =", * + err + else + echo *-$80, "bytes of zero page used,", $ff-*, "remain" + endif + + seg CODE + +LOAD_ADDR = $6000 ; load at 24K +origin = LOAD_ADDR-6; + org origin ; make room for 6-byte header + +; 2-byte Atari executable header: + byte $FF, $FF ; let DOS know it's a binary load file + +; start of first segment + +; 4-byte segment header: + word LOAD_ADDR ; Load address + word endbin-1 ; Last byte to load + +; Rest of segment contains code and data +pagesize byte 0 ; cart2bin will fill this in with the size of + ; the cart image code, in pages. +main: + +; set RAMTOP to 28K, call GR.2, store "LOADING..." in screen RAM, +; then set RAMTOP back to original value. + + lda RAMTOP + cmp #$C0 ; do we have 48K? + bcs ram_ok + + ldx #0 ; no! print error message... + lda #9 + sta ICCOM + lda #<ram_msg + sta ICBAL + lda #>ram_msg + sta ICBAH + lda #ram_msg_len + sta ICBLL + stx ICBLH + jsr CIOV +hang bcs hang ; spin forever + +ram_msg byte "Need at least 48K to run this.", $9B +ram_msg_len = *-ram_msg+1 + +ram_ok + ;sec ; carry already set by cmp above! + sbc pagesize ; adjust RAMTOP to make room for the converted cart image + pha ; save old RAMTOP value on stack + + lda #$70 ; set RAMTOP to $7000 (28K). Later on we do GRAPHICS 2, + sta RAMTOP ; which will cause the DL and screen RAM to go here. + + ldx #$60 ; CLOSE #6 first + lda #12 ; Command 12=CLOSE + sta ICCOM,x + jsr CIOV ; call CIO, ignore any error + + ;ldx #$60 ; set up IOCB #6 for CIO GRAPHICS command + lda #3 ; Command 3=OPEN + sta ICCOM,x + lda #12 ; 12=R/W access + sta ICAX1,x + lda #2 ; GR. mode 2 + sta ICAX2,x + lda #<s_dev ; S: device + sta ICBAL,x + lda #>s_dev + sta ICBAH,x + lda #s_dev_len + sta ICBLL,x + lda #0 + sta ICBLH,x + jsr CIOV ; call CIO + + lda #5 ; POSITION 5,5 + sta ROWCRS + sta COLCRS + lda #0 + sta COLCRS+1 + + sta ICBLH,x ; PRINT #6;"LOADING... +; ldx #$60 + lda #9 ; Command 9 = CIO "put record" + sta ICCOM,x + lda #<loading + sta ICBAL,x + lda #>loading + sta ICBAH,x + lda #loading_len + sta ICBLL,x + jsr CIOV ; call CIO + +; ldx #$60 ; CLOSE #6 + lda #12 ; Command 12=CLOSE + sta ICCOM,x + jsr CIOV ; call CIO, ignore any error + + pla ; get adjusted RAMTOP value + sta RAMTOP + + rts ; end of init routine, return control to DOS + +s_dev byte "S:" +s_dev_len equ *-s_dev+1 + +; WARNING: if you change any code/data below this line, you'll probably need +; to change the offset in cart2bin.c as well. +loading byte " LOADING" + ds 6 +title ds 20 ; cart2bin will fill in these 20 bytes with the filename + byte $9B ; (or title, if -t is used) +loading_len equ *-loading+1 + +endbin ; end of first segment + + echo "Code is", *-origin+1, "bytes" + +; start of second segment (which loads at INITAD, to tell DOS +; where to start running the init code loaded in segment 1) + + ; 4-byte segment header: + word INITAD ; load address (loading into INITAD lets our code run) + word INITAD+1 ; Last byte to load + + ; Segment data contains 2 bytes (the actual run address) + word main ; the 2 bytes to stuff into RUNAD + + ; That's all, folks! + echo "Title offset: loadscreen_bin_len - ", *-title + |