From ac18cfd83860034558c88ef6e31bdff42c066c01 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Sun, 13 Jan 2019 01:10:44 -0500 Subject: [PATCH] ootw: add another demake why why why --- ootw/Makefile | 39 ++++++++ ootw/README | 9 ++ ootw/another.png | Bin 0 -> 654 bytes ootw/gr_copy.s | 58 ++++++++++++ ootw/gr_fast_clear.s | 192 ++++++++++++++++++++++++++++++++++++++ ootw/gr_pageflip.s | 24 +++++ ootw/gr_unrle.s | 115 +++++++++++++++++++++++ ootw/hardware.inc | 84 +++++++++++++++++ ootw/hello.bas | 5 + ootw/ootw.dsk | Bin 0 -> 143360 bytes ootw/ootw.s | 78 ++++++++++++++++ ootw/ootw_backgrounds.inc | 50 ++++++++++ ootw/wait_keypress.s | 5 + ootw/zp.inc | 168 +++++++++++++++++++++++++++++++++ 14 files changed, 827 insertions(+) create mode 100644 ootw/Makefile create mode 100644 ootw/README create mode 100644 ootw/another.png create mode 100644 ootw/gr_copy.s create mode 100644 ootw/gr_fast_clear.s create mode 100644 ootw/gr_pageflip.s create mode 100644 ootw/gr_unrle.s create mode 100644 ootw/hardware.inc create mode 100644 ootw/hello.bas create mode 100644 ootw/ootw.dsk create mode 100644 ootw/ootw.s create mode 100644 ootw/ootw_backgrounds.inc create mode 100644 ootw/wait_keypress.s create mode 100644 ootw/zp.inc diff --git a/ootw/Makefile b/ootw/Makefile new file mode 100644 index 00000000..89fac6d1 --- /dev/null +++ b/ootw/Makefile @@ -0,0 +1,39 @@ +include ../Makefile.inc + +DOS33 = ../dos33fs-utils/dos33 +PNG2RLE = ../gr-utils/png2rle + + +all: ootw.dsk + +ootw.dsk: HELLO OOTW + $(DOS33) -y ootw.dsk SAVE A HELLO + $(DOS33) -y ootw.dsk BSAVE -a 0x1000 OOTW + +#### + +OOTW: ootw.o + ld65 -o OOTW ootw.o -C ../linker_scripts/apple2_1000.inc + +ootw.o: ootw.s wait_keypress.s \ + gr_copy.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ + ootw_backgrounds.inc + ca65 -o ootw.o ootw.s -l ootw.lst +#### + +HELLO: hello.bas + ../asoft_basic-utils/tokenize_asoft < hello.bas > HELLO + + +##### + +ootw_backgrounds.inc: $(PNG2RLE) another.png + $(PNG2RLE) asm another.png planet_rle > ootw_backgrounds.inc + +##### + +clean: + rm -f *~ *.o *.lst HELLO OOTW + + + diff --git a/ootw/README b/ootw/README new file mode 100644 index 00000000..fa8b569c --- /dev/null +++ b/ootw/README @@ -0,0 +1,9 @@ + +Saw the amazing PICO-8 version of this: + https://liquidream.itch.io/another-world-survival + +and thought the lo-res pallette might be just barely enough to do +it justice. + +Of course you could just play on your IIgs, but what's the fun in that. + diff --git a/ootw/another.png b/ootw/another.png new file mode 100644 index 0000000000000000000000000000000000000000..15006de73c7a534952d29cab43ad027c5084fc31 GIT binary patch literal 654 zcmV;90&)F`P)oSYQT{m{ezU~&WhYCN5to&TWF6!kpN-Hmep(EtDc0001;kA{E% z0004EOGiWihy@);00009a7bBm000zp000$W0hU+mk^lez2XskIMF-;n4Fw$}R;qZ% z0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbOyh%hsR7l6|mCKHU zFbqXqL`V<|{{L^M#xZ{2gbbrfv*_KlCHBenqb*Ett?Lpf=cS|8DYSt3(DG|RDJ_S~ zvhV%m=)wayO{GMEBOZMOpg#+gkeu&4hCL*YQntQxw2KlK0IkOd4oR&^kE1BI3moqt z07Fk879QO>;_>wYVC30DzmHsQdrP%HQWwa=6MWut>VTMnN%$@X@|JQ7u5bsWqZri#>{J_gEt$Vfe+2rH9Z)0bp`=8>q$C5O%(I7# z+h|bP0tr zAn;`ds_i0&dSH=2U>JHWU9@ejO1KHtA>Rtn!?l4HX@Jx83`ocdlt$eF=ec)ETYCa& zAOO-_`~i~_{4~$H`F4aHeGY}XM~mT$;aBU>e*e`E?D(e5^UxlC4tV@k_n`Y*4;<=k oEDvN>1sCUTdF}*Xef1CY16@o)$r*$2C;$Ke07*qoM6N<$f+!{y3jhEB literal 0 HcmV?d00001 diff --git a/ootw/gr_copy.s b/ootw/gr_copy.s new file mode 100644 index 00000000..f03ed362 --- /dev/null +++ b/ootw/gr_copy.s @@ -0,0 +1,58 @@ + ;========================================================= + ; gr_copy_to_current, 40x48 version + ;========================================================= + ; copy 0xc00 to DRAW_PAGE + ; + ; 45 + 2 + 120*(8*9 + 5) -1 + 6 = 9292 +.align $100 +gr_copy_to_current: + + lda DRAW_PAGE ; 3 + clc ; 2 + adc #$4 ; 2 + sta gr_copy_line+5 ; 4 + sta gr_copy_line+11 ; 4 + adc #$1 ; 2 + sta gr_copy_line+17 ; 4 + sta gr_copy_line+23 ; 4 + adc #$1 ; 2 + sta gr_copy_line+29 ; 4 + sta gr_copy_line+35 ; 4 + adc #$1 ; 2 + sta gr_copy_line+41 ; 4 + sta gr_copy_line+47 ; 4 + ;=========== + ; 45 + + ldy #119 ; for early ones, copy 120 bytes ; 2 + +gr_copy_line: + lda $C00,Y ; load a byte (self modified) ; 4 + sta $400,Y ; store a byte (self modified) ; 5 + + lda $C80,Y ; load a byte (self modified) ; 4 + sta $480,Y ; store a byte (self modified) ; 5 + + lda $D00,Y ; load a byte (self modified) ; 4 + sta $500,Y ; store a byte (self modified) ; 5 + + lda $D80,Y ; load a byte (self modified) ; 4 + sta $580,Y ; store a byte (self modified) ; 5 + + lda $E00,Y ; load a byte (self modified) ; 4 + sta $600,Y ; store a byte (self modified) ; 5 + + lda $E80,Y ; load a byte (self modified) ; 4 + sta $680,Y ; store a byte (self modified) ; 5 + + lda $F00,Y ; load a byte (self modified) ; 4 + sta $700,Y ; store a byte (self modified) ; 5 + + lda $F80,Y ; load a byte (self modified) ; 4 + sta $780,Y ; store a byte (self modified) ; 5 + + dey ; decrement pointer ; 2 + bpl gr_copy_line ; ; 2nt/3 + + rts ; 6 + diff --git a/ootw/gr_fast_clear.s b/ootw/gr_fast_clear.s new file mode 100644 index 00000000..796b985a --- /dev/null +++ b/ootw/gr_fast_clear.s @@ -0,0 +1,192 @@ +clear_screens: + ;=================================== + ; Clear top/bottom of page 0 + ;=================================== + + lda #$0 + sta DRAW_PAGE + jsr clear_top + jsr clear_bottom + + ;=================================== + ; Clear top/bottom of page 1 + ;=================================== + + lda #$4 + sta DRAW_PAGE + jsr clear_top + jsr clear_bottom + + rts + +clear_bottoms: + ;=================================== + ; Clear bottom of page 0 + ;=================================== + + lda #$0 + sta DRAW_PAGE + jsr clear_bottom + + ;=================================== + ; Clear bottom of page 1 + ;=================================== + + lda #$4 + sta DRAW_PAGE + jsr clear_bottom + + rts + + + + ;========================================================= + ; clear_top + ;========================================================= + ; clear DRAW_PAGE + ; original = 14,558 cycles(?) 15ms, 70Hz + ; OPTIMIZED MAX (page0,48rows): 45*120+4+6 = 5410 = 5.4ms 185Hz + ; (pageX,40rows): 50*120+4+6 = 6010 = 6.0ms 166Hz + ; 50*120+4+6+37 = 6055 = 6.0ms 166Hz +clear_top: + lda #0 ; 2 +clear_top_a: + sta COLOR ; 3 + clc ; 2 + lda DRAW_PAGE ; 3 + + adc #4 ; 2 + sta __ctf+2 ; 3 + sta __ctf+5 ; 3 + adc #1 ; 2 + sta __ctf+8 ; 3 + sta __ctf+11 ; 3 + adc #1 ; 2 + sta __ctf2+2 ; 3 + sta __ctf2+5 ; 3 + adc #1 ; 2 + sta __ctf2+8 ; 3 + sta __ctf2+11 ; 3 + + + ldy #120 ; 2 + lda COLOR ; 3 +clear_top_fast_loop: +__ctf: + sta $400,Y ; 5 + sta $480,Y ; 5 + sta $500,Y ; 5 + sta $580,Y ; 5 + + cpy #80 ; 2 + bpl no_draw_bottom ; 2nt/3 +__ctf2: + sta $600,Y ; 5 + sta $680,Y ; 5 + sta $700,Y ; 5 + sta $780,Y ; 5 +no_draw_bottom: + + dey ; 2 + bpl clear_top_fast_loop ; 2nt/3 + + rts ; 6 + + + + + ;========================================================= + ; clear_bottom + ;========================================================= + ; clear bottom of draw page + +clear_bottom: + clc ; 2 + lda DRAW_PAGE ; 3 + + adc #6 ; 2 + sta __cbf2+2 ; 3 + sta __cbf2+5 ; 3 + adc #1 ; 2 + sta __cbf2+8 ; 3 + sta __cbf2+11 ; 3 + + + ldy #120 ; 2 + lda #$a0 ; Normal Space ; 2 +clear_bottom_fast_loop: +__cbf2: + sta $600,Y ; 5 + sta $680,Y ; 5 + sta $700,Y ; 5 + sta $780,Y ; 5 + + dey ; 2 + cpy #80 ; 2 + bpl clear_bottom_fast_loop ; 2nt/3 + + rts ; 6 + + +clear_screens_notext: + ;=================================== + ; Clear top/bottom of page 0 + ;=================================== + + lda #$0 + sta DRAW_PAGE + jsr clear_all + + ;=================================== + ; Clear top/bottom of page 1 + ;=================================== + + lda #$4 + sta DRAW_PAGE + jsr clear_all + + rts + + + ;========================================================= + ; clear_all + ;========================================================= + ; clear 48 rows + +clear_all: + clc ; 2 + lda DRAW_PAGE ; 3 + + adc #4 ; 2 + sta __caf+2 ; 3 + sta __caf+5 ; 3 + adc #1 ; 2 + sta __caf+8 ; 3 + sta __caf+11 ; 3 + adc #1 ; 2 + sta __caf2+2 ; 3 + sta __caf2+5 ; 3 + adc #1 ; 2 + sta __caf2+8 ; 3 + sta __caf2+11 ; 3 + + + ldy #120 ; 2 +clear_all_color: + lda #0 ; 2 +clear_all_fast_loop: +__caf: + sta $400,Y ; 5 + sta $480,Y ; 5 + sta $500,Y ; 5 + sta $580,Y ; 5 +__caf2: + sta $600,Y ; 5 + sta $680,Y ; 5 + sta $700,Y ; 5 + sta $780,Y ; 5 + + dey ; 2 + bpl clear_all_fast_loop ; 2nt/3 + + rts ; 6 diff --git a/ootw/gr_pageflip.s b/ootw/gr_pageflip.s new file mode 100644 index 00000000..f199f5be --- /dev/null +++ b/ootw/gr_pageflip.s @@ -0,0 +1,24 @@ + ;========== + ; page_flip + ;========== + +page_flip: + lda DISP_PAGE ; 3 + beq page_flip_show_1 ; 2nt/3 +page_flip_show_0: + bit PAGE0 ; 4 + lda #4 ; 2 + sta DRAW_PAGE ; DRAW_PAGE=1 ; 3 + lda #0 ; 2 + sta DISP_PAGE ; DISP_PAGE=0 ; 3 + rts ; 6 +page_flip_show_1: + bit PAGE1 ; 4 + sta DRAW_PAGE ; DRAW_PAGE=0 ; 3 + lda #1 ; 2 + sta DISP_PAGE ; DISP_PAGE=1 ; 3 + rts ; 6 + ;==================== + ; DISP_PAGE=0 26 + ; DISP_PAGE=1 24 + diff --git a/ootw/gr_unrle.s b/ootw/gr_unrle.s new file mode 100644 index 00000000..51fbf6ce --- /dev/null +++ b/ootw/gr_unrle.s @@ -0,0 +1,115 @@ + ;================= + ; load RLE image + ;================= + ; Output is BASH/BASL + ; Input is in GBASH/GBASL +load_rle_gr: + lda #$0 + tay ; init Y to 0 + sta TEMP ; stores the xcoord + + sta CV ; ycoord=0 + + jsr load_and_increment ; load xsize + sta CH + +rle_loop: + jsr load_and_increment + + cmp #$A1 ; if 0xa1 + beq rle_done ; we are done + + pha + + and #$f0 ; mask + cmp #$a0 ; see if special AX + beq decompress_special + + pla ; note, PLA sets flags! + + ldx #$1 ; only want to print 1 + bne decompress_run + +decompress_special: + pla + + and #$0f ; check if was A0 + + bne decompress_color ; if A0 need to read run, color + +decompress_large: + jsr load_and_increment ; get run length + +decompress_color: + tax ; put runlen into X + jsr load_and_increment ; get color + +decompress_run: +rle_run_loop: + sta (BASL),y ; write out the value + inc BASL ; increment the pointer + bne rle_skip3 ; if wrapped + inc BASH ; then increment the high value + +rle_skip3: + pha ; store colore for later + + inc TEMP ; increment the X value + lda TEMP + cmp CH ; compare against the image width + bcc rle_not_eol ; if less then keep going + + lda BASL ; cheat to avoid a 16-bit add + cmp #$a7 ; we are adding 0x58 to get + bcc rle_add_skip ; to the next line + inc BASH +rle_add_skip: + clc + adc #$58 ; actually do the 0x58 add + sta BASL ; and store it back + + inc CV ; add 2 to ypos + inc CV ; each "line" is two high + + lda CV ; load value + cmp #15 ; if it's greater than 14 it wraps + bcc rle_no_wrap ; Thanks Woz + + lda #$0 ; we wrapped, so set to zero + sta CV + + ; when wrapping have to sub 0x3d8 + sec ; this is a 16-bit subtract routine + lda BASL + sbc #$d8 ; LSB + sta BASL + lda BASH ; MSB + sbc #$3 ; + sta BASH + +rle_no_wrap: + lda #$0 ; set X value back to zero + sta TEMP + +rle_not_eol: + pla ; restore color + dex + bne rle_run_loop ; if not zero, keep looping + beq rle_loop ; and branch always + +rle_done: + lda #$15 ; move the cursor somewhere sane + sta CV + rts + + +load_and_increment: + lda (GBASL),y ; load value ; 5? + inc GBASL ; 5? + bne lskip2 ; 2nt/3 + inc GBASH ; 5? +lskip2: + rts ; 6 + + + diff --git a/ootw/hardware.inc b/ootw/hardware.inc new file mode 100644 index 00000000..69ea5b93 --- /dev/null +++ b/ootw/hardware.inc @@ -0,0 +1,84 @@ +;; HARDWARE LOCATIONS + +KEYPRESS = $C000 +KEYRESET = $C010 + +;; SOFT SWITCHES +CLR80COL = $C000 ; PAGE0/PAGE1 normal +SET80COL = $C001 ; PAGE0/PAGE1 switches PAGE0 in Aux instead +EIGHTYCOLOFF = $C00C +EIGHTYCOLON = $C00D +SPEAKER = $C030 +SET_GR = $C050 +SET_TEXT = $C051 +FULLGR = $C052 +TEXTGR = $C053 +PAGE0 = $C054 +PAGE1 = $C055 +LORES = $C056 ; Enable LORES graphics +HIRES = $C057 ; Enable HIRES graphics +AN3 = $C05E ; Annunciator 3 + +PADDLE_BUTTON0 = $C061 +PADDL0 = $C064 +PTRIG = $C070 + +;; BASIC ROUTINES + +NORMAL = $F273 + +;; MONITOR ROUTINES + +HLINE = $F819 ;; HLINE Y,$2C at A +VLINE = $F828 ;; VLINE A,$2D at Y +CLRSCR = $F832 ;; Clear low-res screen +CLRTOP = $F836 ;; clear only top of low-res screen +SETCOL = $F864 ;; COLOR=A +TEXT = $FB36 +TABV = $FB5B ;; VTAB to A +BASCALC = $FBC1 ;; +VTAB = $FC22 ;; VTAB to CV +HOME = $FC58 ;; Clear the text screen +WAIT = $FCA8 ;; delay 1/2(26+27A+5A^2) us +SETINV = $FE80 ;; INVERSE +SETNORM = $FE84 ;; NORMAL +COUT = $FDED ;; output A to screen +COUT1 = $FDF0 ;; output A to screen + + + + + + +COLOR_BLACK = 0 +COLOR_RED = 1 +COLOR_DARKBLUE = 2 +COLOR_PURPLE = 3 +COLOR_DARKGREEN = 4 +COLOR_GREY = 5 +COLOR_MEDIUMBLUE = 6 +COLOR_LIGHTBLUE = 7 +COLOR_BROWN = 8 +COLOR_ORANGE = 9 +COLOR_GREY2 = 10 +COLOR_PINK = 11 +COLOR_LIGHTGREEN = 12 +COLOR_YELLOW = 13 +COLOR_AQUA = 14 +COLOR_WHITE = 15 + +COLOR_BOTH_BLACK = $00 +COLOR_BOTH_RED = $11 +COLOR_BOTH_DARKBLUE = $22 +COLOR_BOTH_DARKGREEN = $44 +COLOR_BOTH_GREY = $55 +COLOR_BOTH_MEDIUMBLUE = $66 +COLOR_BOTH_LIGHTBLUE = $77 +COLOR_BOTH_BROWN = $88 +COLOR_BOTH_ORANGE = $99 +COLOR_BOTH_PINK = $BB +COLOR_BOTH_LIGHTGREEN = $CC +COLOR_BOTH_YELLOW = $DD +COLOR_BOTH_AQUA = $EE +COLOR_BOTH_WHITE = $FF + diff --git a/ootw/hello.bas b/ootw/hello.bas new file mode 100644 index 00000000..3fb405ba --- /dev/null +++ b/ootw/hello.bas @@ -0,0 +1,5 @@ + 5 HOME + 10 PRINT "OOTW V0.1 BY DEATER" + 20 PRINT:PRINT + 100 PRINT CHR$ (4)"BRUN OOTW" + diff --git a/ootw/ootw.dsk b/ootw/ootw.dsk new file mode 100644 index 0000000000000000000000000000000000000000..a68fe7e79104399f1d0d1510d297d4d8da1ac8ad GIT binary patch literal 143360 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 literal 0 HcmV?d00001 diff --git a/ootw/ootw.s b/ootw/ootw.s new file mode 100644 index 00000000..e3a4b8b8 --- /dev/null +++ b/ootw/ootw.s @@ -0,0 +1,78 @@ + ; Ootw + +.include "zp.inc" +.include "hardware.inc" + + + +title_screen: + ;=========================== + ; Enable graphics + + bit LORES + bit SET_GR + bit FULLGR + + + + ;=========================== + ; Clear both bottoms + + lda #$4 + sta DRAW_PAGE + jsr clear_bottom + + lda #$0 + sta DRAW_PAGE + jsr clear_bottom + + lda #0 + sta DRAW_PAGE + lda #1 + sta DISP_PAGE + + + ;============================= + ; Load title_rle + + lda #$0c + sta BASH + lda #$00 + sta BASL ; load image off-screen 0xc00 + + lda #>(planet_rle) + sta GBASH + lda #<(planet_rle) + sta GBASL + jsr load_rle_gr + + ;================================= + ; copy to both pages + + jsr gr_copy_to_current + jsr page_flip + jsr gr_copy_to_current + + lda #20 + sta YPOS + lda #20 + sta XPOS + + ;================================= + ; wait for keypress + +forever: + jsr wait_until_keypress + +; jsr TEXT + + jsr page_flip + + jmp forever + +.include "wait_keypress.s" +.include "gr_pageflip.s" +.include "gr_unrle.s" +.include "gr_fast_clear.s" +.include "gr_copy.s" +.include "ootw_backgrounds.inc" diff --git a/ootw/ootw_backgrounds.inc b/ootw/ootw_backgrounds.inc new file mode 100644 index 00000000..7bec4119 --- /dev/null +++ b/ootw/ootw_backgrounds.inc @@ -0,0 +1,50 @@ +planet_rle: .byte $28 ; ysize=48 + .byte $22,$22, $99, $A9,$66, $76, $77, $76, $AD,$66 + .byte $67, $AB,$66, $88, $22, $29, $86, $A6,$66 + .byte $76, $A3,$66, $7F, $76, $AE,$66, $67, $66 + .byte $76, $A7,$66, $22, $89, $22, $28, $96 + .byte $A4,$66, $77, $A4,$66, $67, $7F, $A0,$13,$66, $76 + .byte $A4,$66, $22, $28, $22,$22, $99, $A5,$66, $67 + .byte $A3,$66, $76, $77, $A0,$15,$66, $76, $66,$66, $A4,$22 + .byte $89, $26, $A8,$66, $7F, $66, $76, $A0,$11,$66 + .byte $16, $00, $06, $66,$66, $67, $22, $88 + .byte $22,$22, $88, $22, $99, $A5,$66, $67,$67, $66,$66 + .byte $22, $89, $96, $66, $76, $AD,$66, $A4,$00 + .byte $66,$66, $22,$22, $28, $88, $89, $22,$22, $A9,$66 + .byte $22, $88,$88, $A3,$66, $67, $66, $67, $66 + .byte $67, $66,$66, $76, $66, $76, $A3,$66, $00 + .byte $60,$60, $06, $66, $22,$22, $82, $22, $82 + .byte $28, $22, $A9,$66, $82, $88,$88, $66, $87 + .byte $A6,$66, $55, $96, $A4,$66, $67, $28, $A5,$88 + .byte $22,$22, $28, $22, $28, $82, $22, $76 + .byte $66, $76, $66,$66, $96, $A3,$66, $A3,$88, $66 + .byte $88, $A5,$66, $86, $55, $59, $A5,$66, $62 + .byte $A5,$28, $A5,$22, $88, $22, $82,$82, $66,$66, $67 + .byte $55, $66, $67, $26, $88,$88, $29, $66 + .byte $88, $66, $76, $66, $76, $66, $65 + .byte $55, $95, $76, $A5,$66, $88,$88, $82, $22 + .byte $88, $22, $88, $A7,$22, $A3,$66, $55, $66,$66 + .byte $22, $88,$88, $22, $66, $88, $A5,$66, $58 + .byte $55,$55, $66,$66, $67, $66,$66, $22, $A3,$88, $22 + .byte $88, $22,$22, $28, $82, $A3,$22, $88, $82 + .byte $28, $86, $A3,$55, $56, $52, $28, $88 + .byte $22, $56, $88, $96,$96, $56,$56, $A3,$55, $85 + .byte $55,$55, $56, $26, $A3,$82, $88, $22, $88,$88 + .byte $A3,$22, $88, $A3,$22, $28, $22,$22, $28,$28, $55,$55 + .byte $22, $25, $22, $88, $82, $85, $88 + .byte $99, $BB, $A4,$55, $85, $88, $55,$55, $25 + .byte $82, $A4,$88, $82,$82, $88, $A3,$22, $28, $A8,$22 + .byte $25, $A4,$82, $A4,$88, $0B, $A5,$85, $88,$88, $85,$85 + .byte $82, $A8,$88, $A4,$22, $52, $82, $55, $85 + .byte $AA,$25, $28, $25,$25, $BB, $25,$25, $28, $A8,$25 + .byte $85, $55,$55, $A4,$85, $22, $55, $88, $55,$55 + .byte $00, $28, $AE,$22, $BB, $AC,$22, $28, $85 + .byte $55, $A3,$88, $A3,$55, $25, $58, $50, $02 + .byte $A5,$52, $72, $A3,$52, $22, $52,$52, $72, $52 + .byte $44, $A6,$52, $22, $A6,$52, $72, $55, $52 + .byte $55, $58, $A3,$82, $88, $82,$82, $00, $88,$88 + .byte $A7,$82, $88, $A3,$82, $88, $44, $A6,$82, $88 + .byte $A4,$82, $88, $A6,$82, $A5,$88, $08, $00, $88 + .byte $08, $AC,$88, $F4, $F8, $A0,$11,$88, $A6,$28, $00 + .byte $28, $00, $28, $A4,$22, $A0,$1A,$28, $A0,$A0,$00 + .byte $A1 diff --git a/ootw/wait_keypress.s b/ootw/wait_keypress.s new file mode 100644 index 00000000..444d2074 --- /dev/null +++ b/ootw/wait_keypress.s @@ -0,0 +1,5 @@ +wait_until_keypress: + lda KEYPRESS ; 4 + bpl wait_until_keypress ; 3 + bit KEYRESET ; clear the keyboard buffer + rts ; 6 diff --git a/ootw/zp.inc b/ootw/zp.inc new file mode 100644 index 00000000..4c4ad4b4 --- /dev/null +++ b/ootw/zp.inc @@ -0,0 +1,168 @@ +;; Zero Page + +FRAMEBUFFER = $00 ; $00 - $0F + +;; LZ4 addresses + +LZ4_SRC = $00 +LZ4_DST = $02 +LZ4_END = $04 +COUNT = $06 +DELTA = $08 + +;; Zero page monitor routines addresses + +WNDLFT = $20 +WNDWDTH = $21 +WNDTOP = $22 +WNDBTM = $23 +CH = $24 +CV = $25 +GBASL = $26 +GBASH = $27 +BASL = $28 +BASH = $29 +H2 = $2C +V2 = $2D +MASK = $2E +COLOR = $30 + ;INVFLG = $32 + +; dos33 zero page = 26-2f, 35-38, 3e 3f 40-4d +; overlap applesoft 67-6a,6f,70,af,b0,ca-cd,d8 + + +; DOS33: Confirmed kills $68 + +RWTSL = $60 +RWTSH = $61 +DOSBUFL = $62 +DOSBUFH = $63 +FILEML = $64 +FILEMH = $65 + + +FRAME = $60 +FRAMEH = $61 +WAITING = $62 +LETTERL = $63 +LETTERH = $64 +LETTERX = $65 +LETTERY = $66 +LETTERD = $67 +LETTER = $68 +BLARGH = $69 + + ;FACTOR_I = $66 + ;FACTOR_F = $67 + ;DX_I = $68 + ;DX_F = $69 + ;SPACEX_I = $6A + ;SPACEX_F = $6B + ;CX_I = $6C + ;CX_F = $6D + ;DY_I = $6E + ;DY_F = $6F + + +ZPOS = $78 + +REGISTER_DUMP = $70 +A_FINE_TONE = $70 +A_COARSE_TONE = $71 +B_FINE_TONE = $72 +B_COARSE_TONE = $73 +C_FINE_TONE = $74 +C_COARSE_TONE = $75 +NOISE = $76 +ENABLE = $77 +A_VOLUME = $78 +B_VOLUME = $79 +C_VOLUME = $7A +ENVELOPE_FINE = $7B +ENVELOPE_COARSE = $7C +ENVELOPE_SHAPE = $7D + + +COPY_OFFSET = $7E +DECODER_STATE = $7F + + +REGISTER_DUMP2 = $80 +A_FINE_TONE2 = $80 +A_COARSE_TONE2 = $81 +B_FINE_TONE2 = $82 +B_COARSE_TONE2 = $83 +C_FINE_TONE2 = $84 +C_COARSE_TONE2 = $85 +NOISE2 = $86 +ENABLE2 = $87 +A_VOLUME2 = $88 +B_VOLUME2 = $89 +C_VOLUME2 = $8A +ENVELOPE_FINE2 = $8B +ENVELOPE_COARS2 = $8C +ENVELOPE_SHAPE2 = $8D +LYRICSL = $8E +LYRICSH = $8F + +FRAME_COUNT = $90 +MB_VALUE = $91 +MB_ADDRL = $91 +MB_ADDRH = $92 +DONE_PLAYING = $93 +MB_CHUNK_OFFSET = $94 +MB_FRAME = $94 +MB_PATTERN = $95 +CHUNKSIZE = $95 +LZ4_DONE = $96 +DECODE_ERROR = $97 +COPY_TIME = $98 +DECOMPRESS_TIME = $99 +TIME_TAKEN = $9A +LYRICS_ACTIVE = $9B +;FORTYCOL = $9C +CURSOR = $9D + +; More zero-page addresses +; we try not to conflict with anything DOS, MONITOR or BASIC related + + ;COLOR1 = $E0 + ;COLOR2 = $E1 + ;MATCH = $E2 +XX = $E3 +YY = $E4 +HGR_COLOR = $E4 + ;SHIPY = $E4 + ;YADD = $E5 + ;LOOP = $E6 + ;MEMPTRL = $E7 + ;MEMPTRH = $E8 + ;NAMEL = $E9 + ;NAMEH = $EA + ;NAMEX = $EB + ;CHAR = $EC +STATE = $ED +DISP_PAGE = $ED +DRAW_PAGE = $EE +OFFSET = $EF + + ;FIRST = $F0 + +LASTKEY = $F1 +PADDLE_STATUS = $F2 + +SPRITETEMP = $F2 +XPOS = $F3 +YPOS = $F4 +TEMP = $FA +TEMPY = $FB +INL = $FC +INH = $FD +OUTL = $FE +OUTH = $FF + + + + +