From 77bd42616f8376b4791313477ad7a3c9bc2fdd9d Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Tue, 19 Jul 2022 21:59:43 -0400 Subject: [PATCH] hgr_viewer: update and put things together --- graphics/hgr/mona/Makefile | 32 - graphics/hgr/mona/decompress_fast_v2.s | 370 ------------ graphics/hgr/mona/graphics/README | 1 - graphics/hgr/mona/hello.bas | 3 - graphics/hgr/mona/mona.s | 27 - graphics/hgr_viewer/Makefile | 152 ++--- graphics/hgr_viewer/hardware.inc | 84 +++ graphics/hgr_viewer/hello.bas | 2 + graphics/hgr_viewer/hires_jiskey.s | 128 ++++ graphics/hgr_viewer/hires_plain.s | 89 +++ graphics/hgr_viewer/hires_special.s | 156 +++++ .../graphics => hgr_viewer/jiskey}/Makefile | 0 graphics/hgr_viewer/jiskey/README | 2 + graphics/hgr_viewer/jiskey/grl.hgr | Bin 0 -> 8192 bytes graphics/hgr_viewer/jiskey/gw.hgr | Bin 0 -> 8192 bytes .../graphics => hgr_viewer/jiskey}/mona.png | Bin graphics/hgr_viewer/jiskey/witch.hgr | Bin 0 -> 8192 bytes graphics/hgr_viewer/plain/Makefile | 25 + graphics/hgr_viewer/plain/README | 3 + graphics/hgr_viewer/plain/gp.png | Bin 0 -> 20384 bytes graphics/hgr_viewer/plain/peddle.hgr | Bin 0 -> 8192 bytes graphics/hgr_viewer/rts.s | 557 ++++++++++++++++++ graphics/hgr_viewer/special/Makefile | 60 ++ graphics/hgr_viewer/wait_keypress.s | 5 + graphics/hgr_viewer/zp.inc | 200 +++++++ graphics/hgr_viewer/zx02_optim.s | 144 +++++ 26 files changed, 1519 insertions(+), 521 deletions(-) delete mode 100644 graphics/hgr/mona/Makefile delete mode 100644 graphics/hgr/mona/decompress_fast_v2.s delete mode 100644 graphics/hgr/mona/graphics/README delete mode 100644 graphics/hgr/mona/hello.bas delete mode 100644 graphics/hgr/mona/mona.s create mode 100644 graphics/hgr_viewer/hardware.inc create mode 100644 graphics/hgr_viewer/hello.bas create mode 100644 graphics/hgr_viewer/hires_jiskey.s create mode 100644 graphics/hgr_viewer/hires_plain.s create mode 100644 graphics/hgr_viewer/hires_special.s rename graphics/{hgr/mona/graphics => hgr_viewer/jiskey}/Makefile (100%) create mode 100644 graphics/hgr_viewer/jiskey/README create mode 100644 graphics/hgr_viewer/jiskey/grl.hgr create mode 100644 graphics/hgr_viewer/jiskey/gw.hgr rename graphics/{hgr/mona/graphics => hgr_viewer/jiskey}/mona.png (100%) create mode 100644 graphics/hgr_viewer/jiskey/witch.hgr create mode 100644 graphics/hgr_viewer/plain/Makefile create mode 100644 graphics/hgr_viewer/plain/README create mode 100644 graphics/hgr_viewer/plain/gp.png create mode 100644 graphics/hgr_viewer/plain/peddle.hgr create mode 100644 graphics/hgr_viewer/rts.s create mode 100644 graphics/hgr_viewer/special/Makefile create mode 100644 graphics/hgr_viewer/wait_keypress.s create mode 100644 graphics/hgr_viewer/zp.inc create mode 100644 graphics/hgr_viewer/zx02_optim.s diff --git a/graphics/hgr/mona/Makefile b/graphics/hgr/mona/Makefile deleted file mode 100644 index 78f01745..00000000 --- a/graphics/hgr/mona/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -include ../../../Makefile.inc - -DOS33 = ../../../utils/dos33fs-utils/dos33 -DOS33_RAW = ../../../utils/dos33fs-utils/dos33_raw -TOKENIZE = ../../../utils/asoft_basic-utils/tokenize_asoft -LINKER_SCRIPTS = ../../../linker_scripts -EMPTY_DISK = ../../../empty_disk - -all: mona.dsk - -mona.dsk: HELLO MONA - cp $(EMPTY_DISK)/empty.dsk mona.dsk - $(DOS33) -y mona.dsk SAVE A HELLO - $(DOS33) -y mona.dsk BSAVE -a 0x6000 MONA -### - -HELLO: hello.bas - $(TOKENIZE) < hello.bas > HELLO - -### - -MONA: mona.o - ld65 -o MONA mona.o -C $(LINKER_SCRIPTS)/apple2_6000.inc - -mona.o: mona.s graphics/graphics.inc - ca65 -o mona.o mona.s -l mona.lst - -### - -clean: - rm -f *~ *.o *.lst HELLO MONA - diff --git a/graphics/hgr/mona/decompress_fast_v2.s b/graphics/hgr/mona/decompress_fast_v2.s deleted file mode 100644 index fb2f24ad..00000000 --- a/graphics/hgr/mona/decompress_fast_v2.s +++ /dev/null @@ -1,370 +0,0 @@ -; note -- modified by Vince Weaver to assemble with ca65 -; in this case, A = page to decompress to -; getsrc_smc+1, getsrc_smc+2 is src location - -; ----------------------------------------------------------------------------- -; Decompress raw LZSA2 block. -; Create one with lzsa -r -f2 -; -; in: -; * LZSA_SRC_LO and LZSA_SRC_HI contain the compressed raw block address -; * LZSA_DST_LO and LZSA_DST_HI contain the destination buffer address -; -; out: -; * LZSA_DST_LO and LZSA_DST_HI contain the last decompressed byte address, +1 -; -; ----------------------------------------------------------------------------- -; Backward decompression is also supported, use lzsa -r -b -f2 -; To use it, also define BACKWARD_DECOMPRESS=1 before including this code! -; -; in: -; * LZSA_SRC_LO/LZSA_SRC_HI must contain the address of the last byte of compressed data -; * LZSA_DST_LO/LZSA_DST_HI must contain the address of the last byte of the destination buffer -; -; out: -; * LZSA_DST_LO/LZSA_DST_HI contain the last decompressed byte address, -1 -; -; ----------------------------------------------------------------------------- -; -; Copyright (C) 2019 Emmanuel Marty, Peter Ferrie -; -; This software is provided 'as-is', without any express or implied -; warranty. In no event will the authors be held liable for any damages -; arising from the use of this software. -; -; Permission is granted to anyone to use this software for any purpose, -; including commercial applications, and to alter it and redistribute it -; freely, subject to the following restrictions: -; -; 1. The origin of this software must not be misrepresented; you must not -; claim that you wrote the original software. If you use this software -; in a product, an acknowledgment in the product documentation would be -; appreciated but is not required. -; 2. Altered source versions must be plainly marked as such, and must not be -; misrepresented as being the original software. -; 3. This notice may not be removed or altered from any source distribution. -; ----------------------------------------------------------------------------- - -;NIBCOUNT = $FC ; zero-page location for temp offset - -decompress_lzsa2_fast: - - sta LZSA_DST_HI - - ldy #$00 - sty LZSA_DST_LO - sty NIBCOUNT - -decode_token: - jsr getsrc ; read token byte: XYZ|LL|MMM - pha ; preserve token on stack - - and #$18 ; isolate literals count (LL) - beq no_literals ; skip if no literals to copy - cmp #$18 ; LITERALS_RUN_LEN_V2? - bcc prepare_copy_literals ; if less, count is directly embedded in token - - jsr getnibble ; get extra literals length nibble - ; add nibble to len from token - adc #$02 ; (LITERALS_RUN_LEN_V2) minus carry - cmp #$12 ; LITERALS_RUN_LEN_V2 + 15 ? - bcc prepare_copy_literals_direct ; if less, literals count is complete - - jsr getsrc ; get extra byte of variable literals count - ; the carry is always set by the CMP above - ; GETSRC doesn't change it - sbc #$EE ; overflow? - jmp prepare_copy_literals_direct - -prepare_copy_literals_large: - ; handle 16 bits literals count - ; literals count = directly these 16 bits - jsr getlargesrc ; grab low 8 bits in X, high 8 bits in A - tay ; put high 8 bits in Y - bcs prepare_copy_literals_high ; (*same as JMP PREPARE_COPY_LITERALS_HIGH but shorter) - -prepare_copy_literals: - lsr ; shift literals count into place - lsr - lsr - -prepare_copy_literals_direct: - tax - bcs prepare_copy_literals_large ; if so, literals count is large - -prepare_copy_literals_high: - txa - beq copy_literals - iny - -copy_literals: - jsr getput ; copy one byte of literals - dex - bne copy_literals - dey - bne copy_literals - -no_literals: - pla ; retrieve token from stack - pha ; preserve token again - asl - bcs repmatch_or_large_offset ; 1YZ: rep-match or 13/16 bit offset - - asl ; 0YZ: 5 or 9 bit offset - bcs offset_9_bit - - ; 00Z: 5 bit offset - - ldx #$FF ; set offset bits 15-8 to 1 - - jsr getcombinedbits ; rotate Z bit into bit 0, read nibble for bits 4-1 - ora #$E0 ; set bits 7-5 to 1 - bne got_offset_lo ; go store low byte of match offset and prepare match - -offset_9_bit: ; 01Z: 9 bit offset - ;;asl ; shift Z (offset bit 8) in place - rol - rol - and #$01 - eor #$FF ; set offset bits 15-9 to 1 - bne got_offset_hi ; go store high byte, read low byte of match offset and prepare match - ; (*same as JMP GOT_OFFSET_HI but shorter) - -repmatch_or_large_offset: - asl ; 13 bit offset? - bcs repmatch_or_16bit ; handle rep-match or 16-bit offset if not - - ; 10Z: 13 bit offset - - jsr getcombinedbits ; rotate Z bit into bit 8, read nibble for bits 12-9 - adc #$DE ; set bits 15-13 to 1 and substract 2 (to substract 512) - bne got_offset_hi ; go store high byte, read low byte of match offset and prepare match - ; (*same as JMP GOT_OFFSET_HI but shorter) - -repmatch_or_16bit: ; rep-match or 16 bit offset - ;;ASL ; XYZ=111? - bmi rep_match ; reuse previous offset if so (rep-match) - - ; 110: handle 16 bit offset - jsr getsrc ; grab high 8 bits -got_offset_hi: - tax - jsr getsrc ; grab low 8 bits -got_offset_lo: - sta OFFSLO ; store low byte of match offset - stx OFFSHI ; store high byte of match offset - -rep_match: -.ifdef BACKWARD_DECOMPRESS - - ; Backward decompression - substract match offset - - sec ; add dest + match offset - lda putdst+1 ; low 8 bits -OFFSLO = *+1 - sbc #$AA - sta copy_match_loop+1 ; store back reference address - lda putdst+2 -OFFSHI = *+1 - sbc #$AA ; high 8 bits - sta copy_match_loop+2 ; store high 8 bits of address - sec - -.else - - ; Forward decompression - add match offset - - clc ; add dest + match offset - lda putdst+1 ; low 8 bits -OFFSLO = *+1 - adc #$AA - sta copy_match_loop+1 ; store back reference address -OFFSHI = *+1 - lda #$AA ; high 8 bits - adc putdst+2 - sta copy_match_loop+2 ; store high 8 bits of address -.endif - - pla ; retrieve token from stack again - and #$07 ; isolate match len (MMM) - adc #$01 ; add MIN_MATCH_SIZE_V2 and carry - cmp #$09 ; MIN_MATCH_SIZE_V2 + MATCH_RUN_LEN_V2? - bcc prepare_copy_match ; if less, length is directly embedded in token - - jsr getnibble ; get extra match length nibble - ; add nibble to len from token - adc #$08 ; (MIN_MATCH_SIZE_V2 + MATCH_RUN_LEN_V2) minus carry - cmp #$18 ; MIN_MATCH_SIZE_V2 + MATCH_RUN_LEN_V2 + 15? - bcc prepare_copy_match ; if less, match length is complete - - jsr getsrc ; get extra byte of variable match length - ; the carry is always set by the CMP above - ; GETSRC doesn't change it - sbc #$E8 ; overflow? - -prepare_copy_match: - tax - bcc prepare_copy_match_y ; if not, the match length is complete - beq decompression_done ; if EOD code, bail - - ; Handle 16 bits match length - jsr getlargesrc ; grab low 8 bits in X, high 8 bits in A - tay ; put high 8 bits in Y - -prepare_copy_match_y: - txa - beq copy_match_loop - iny - -copy_match_loop: - lda $AAAA ; get one byte of backreference - jsr putdst ; copy to destination - -.ifdef BACKWARD_DECOMPRESS - - ; Backward decompression -- put backreference bytes backward - - lda copy_match_loop+1 - beq getmatch_adj_hi -getmatch_done: - dec copy_match_loop+1 - -.else - - ; Forward decompression -- put backreference bytes forward - - inc copy_match_loop+1 - beq getmatch_adj_hi -getmatch_done: - -.endif - - dex - bne copy_match_loop - dey - bne copy_match_loop - jmp decode_token - -.ifdef BACKWARD_DECOMPRESS - -getmatch_adj_hi: - dec copy_match_loop+2 - jmp getmatch_done - -.else - -getmatch_adj_hi: - inc copy_match_loop+2 - jmp getmatch_done -.endif - -getcombinedbits: - eor #$80 - asl - php - - jsr getnibble ; get nibble into bits 0-3 (for offset bits 1-4) - plp ; merge Z bit as the carry bit (for offset bit 0) -combinedbitz: - rol ; nibble -> bits 1-4; carry(!Z bit) -> bit 0 ; carry cleared -decompression_done: - rts - -getnibble: -NIBBLES = *+1 - lda #$AA - lsr NIBCOUNT - bcc need_nibbles - and #$0F ; isolate low 4 bits of nibble - rts - -need_nibbles: - inc NIBCOUNT - jsr getsrc ; get 2 nibbles - sta NIBBLES - lsr - lsr - lsr - lsr - sec - rts - -.ifdef BACKWARD_DECOMPRESS - - ; Backward decompression -- get and put bytes backward - -getput: - jsr getsrc -putdst: -LZSA_DST_LO = *+1 -LZSA_DST_HI = *+2 - sta $AAAA - lda putdst+1 - beq putdst_adj_hi - dec putdst+1 - rts - -putdst_adj_hi: - dec putdst+2 - dec putdst+1 - rts - -getlargesrc: - jsr getsrc ; grab low 8 bits - tax ; move to X - ; fall through grab high 8 bits - -getsrc: -LZSA_SRC_LO = *+1 -LZSA_SRC_HI = *+2 - lda $AAAA - pha - lda getsrc+1 - beq getsrc_adj_hi - dec getsrc+1 - pla - rts - -getsrc_adj_hi: - dec getsrc+2 - dec getsrc+1 - pla - rts - -.else - - ; Forward decompression -- get and put bytes forward - -getput: - jsr getsrc -putdst: -LZSA_DST_LO = *+1 -LZSA_DST_HI = *+2 - sta $AAAA - inc putdst+1 - beq putdst_adj_hi - rts - -putdst_adj_hi: - inc putdst+2 - rts - -getlargesrc: - jsr getsrc ; grab low 8 bits - tax ; move to X - ; fall through grab high 8 bits - -getsrc: -getsrc_smc: -LZSA_SRC_LO = *+1 -LZSA_SRC_HI = *+2 - lda $AAAA - inc getsrc+1 - beq getsrc_adj_hi - rts - -getsrc_adj_hi: - inc getsrc+2 - rts -.endif - diff --git a/graphics/hgr/mona/graphics/README b/graphics/hgr/mona/graphics/README deleted file mode 100644 index ffdb20db..00000000 --- a/graphics/hgr/mona/graphics/README +++ /dev/null @@ -1 +0,0 @@ -mona.png: by JiskeyJasket on twitter diff --git a/graphics/hgr/mona/hello.bas b/graphics/hgr/mona/hello.bas deleted file mode 100644 index 41cf3582..00000000 --- a/graphics/hgr/mona/hello.bas +++ /dev/null @@ -1,3 +0,0 @@ -5 HOME -20 PRINT CHR$(4)"CATALOG" - diff --git a/graphics/hgr/mona/mona.s b/graphics/hgr/mona/mona.s deleted file mode 100644 index 43150667..00000000 --- a/graphics/hgr/mona/mona.s +++ /dev/null @@ -1,27 +0,0 @@ - -NIBCOUNT = $09 - -HGR2 = $F3D8 - - -hgr_display: - jsr HGR2 ; Hi-res graphics, no text at bottom - ; Y=0, A=0 after this called - - lda #<(mona_lzsa) - sta getsrc_smc+1 - lda #>(mona_lzsa) - sta getsrc_smc+2 - - lda #$40 - - jsr decompress_lzsa2_fast - - -forever: - jmp forever - - -.include "decompress_fast_v2.s" - -.include "graphics/graphics.inc" diff --git a/graphics/hgr_viewer/Makefile b/graphics/hgr_viewer/Makefile index 34307a44..9cfcb284 100644 --- a/graphics/hgr_viewer/Makefile +++ b/graphics/hgr_viewer/Makefile @@ -4,109 +4,85 @@ DOS33 = ../../utils/dos33fs-utils/dos33 B2D = ../../utils/bmp2dhr/b2d PNG_TO_40x96 = ../../utils/gr-utils/png_to_40x96 PNG_TO_RLE = ../../utils/gr-utils/png2rle +EMPTY_DISK = ../../empty_disk/empty.dsk +TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft -all: hires.dsk +all: hires_plain.dsk hires_special.dsk hires_jiskey.dsk -hires.dsk: HELLO HIRES bbl.img.lz4t bbl2.img.lz4t \ - girl.hgr.lz4t 1bg.hgr.lz4t fup.hgr.lz4t witch.hgr.lz4t - $(DOS33) -y hires.dsk SAVE A HELLO - $(DOS33) -y hires.dsk BSAVE -a 0x0c00 HIRES - $(DOS33) -y hires.dsk BSAVE -a 0xa000 bbl.img.lz4t BBL.LZ4 - $(DOS33) -y hires.dsk BSAVE -a 0xa000 bbl2.img.lz4t BBL2.LZ4 - $(DOS33) -y hires.dsk BSAVE -a 0xa000 girl.hgr.lz4t GIRL.LZ4 - $(DOS33) -y hires.dsk BSAVE -a 0xa000 1bg.hgr.lz4t OBG.LZ4 - $(DOS33) -y hires.dsk BSAVE -a 0xa000 fup.hgr.lz4t FUP.LZ4 - $(DOS33) -y hires.dsk BSAVE -a 0xa000 witch.hgr.lz4t WITCH.LZ4 +hires_special.dsk: HELLO HIRES_SPECIAL \ + special/bbl.hgr.zx02 special/bbl2.hgr.zx02 \ + special/grl.hgr.zx02 special/1bg.hgr.zx02 \ + special/fup.hgr.zx02 special/witch.hgr.zx02 + cp $(EMPTY_DISK) hires_special.dsk + $(DOS33) -y hires_special.dsk SAVE A HELLO + $(DOS33) -y hires_special.dsk BSAVE -a 0x0c00 HIRES_SPECIAL HIRES + $(DOS33) -y hires_special.dsk BSAVE -a 0xa000 ./special/bbl.hgr.zx02 BBL.ZX02 + $(DOS33) -y hires_special.dsk BSAVE -a 0xa000 ./special/bbl2.hgr.zx02 BBL2.ZX02 + $(DOS33) -y hires_special.dsk BSAVE -a 0xa000 ./special/grl.hgr.zx02 GRL.ZX02 + $(DOS33) -y hires_special.dsk BSAVE -a 0xa000 ./special/1bg.hgr.zx02 OBG.ZX02 + $(DOS33) -y hires_special.dsk BSAVE -a 0xa000 ./special/fup.hgr.zx02 FUP.ZX02 + $(DOS33) -y hires_special.dsk BSAVE -a 0xa000 ./special/witch.hgr.zx02 WITCH.ZX02 #### -HIRES: hires.o - ld65 -o HIRES hires.o -C ../../linker_scripts/apple2_c00.inc +hires_plain.dsk: HELLO HIRES_PLAIN \ + ./plain/gp.hgr.zx02 ./plain/peddle.hgr.zx02 + cp $(EMPTY_DISK) hires_plain.dsk + $(DOS33) -y hires_plain.dsk SAVE A HELLO + $(DOS33) -y hires_plain.dsk BSAVE -a 0x0c00 HIRES_PLAIN HIRES + $(DOS33) -y hires_plain.dsk BSAVE -a 0xa000 ./plain/gp.hgr.zx02 GP.ZX02 + $(DOS33) -y hires_plain.dsk BSAVE -a 0xa000 ./plain/peddle.hgr.zx02 PEDDLE.ZX02 -hires.o: hires.s \ +#### + +hires_jiskey.dsk: HELLO HIRES_JISKEY \ + jiskey/grl.hgr.zx02 jiskey/witch.hgr.zx02 \ + jiskey/mona.hgr.zx02 jiskey/gw.hgr.zx02 + cp $(EMPTY_DISK) hires_jiskey.dsk + $(DOS33) -y hires_jiskey.dsk SAVE A HELLO + $(DOS33) -y hires_jiskey.dsk BSAVE -a 0x0c00 HIRES_JISKEY HIRES + $(DOS33) -y hires_jiskey.dsk BSAVE -a 0xa000 ./jiskey/grl.hgr.zx02 GRL.ZX02 + $(DOS33) -y hires_jiskey.dsk BSAVE -a 0xa000 ./jiskey/witch.hgr.zx02 WITCH.ZX02 + $(DOS33) -y hires_jiskey.dsk BSAVE -a 0xa000 ./jiskey/mona.hgr.zx02 MONA.ZX02 + $(DOS33) -y hires_jiskey.dsk BSAVE -a 0xa000 ./jiskey/gw.hgr.zx02 GW.ZX02 + + +#### + +HIRES_SPECIAL: hires_special.o + ld65 -o HIRES_SPECIAL hires_special.o -C ../../linker_scripts/apple2_c00.inc + +hires_special.o: hires_special.s zx02_optim.s \ zp.inc hardware.inc - ca65 -o hires.o hires.s -l hires.lst + ca65 -o hires_special.o hires_special.s -l hires_special.lst + +#### + +HIRES_PLAIN: hires_plain.o + ld65 -o HIRES_PLAIN hires_plain.o -C ../../linker_scripts/apple2_c00.inc + +hires_plain.o: hires_plain.s \ + zp.inc hardware.inc + ca65 -o hires_plain.o hires_plain.s -l hires_plain.lst + +#### + +HIRES_JISKEY: hires_jiskey.o + ld65 -o HIRES_JISKEY hires_jiskey.o -C ../../linker_scripts/apple2_c00.inc + +hires_jiskey.o: hires_jiskey.s \ + zp.inc hardware.inc + ca65 -o hires_jiskey.o hires_jiskey.s -l hires_jiskey.lst + #### HELLO: hello.bas $(TOKENIZE) < hello.bas > HELLO -#### - -bbl.img.lz4t: bbl.img.lz4 - dd if=bbl.img.lz4 of=bbl.img.lz4t bs=1 skip=11 - truncate bbl.img.lz4t -s -8 - -bbl.img.lz4: bbl.img - lz4 -f -16 bbl.img - -bbl.img: bbl.png - ../hgr-utils/png2hgr bbl.png > bbl.img - -#### - -bbl2.img.lz4t: bbl2.img.lz4 - dd if=bbl2.img.lz4 of=bbl2.img.lz4t bs=1 skip=11 - truncate bbl2.img.lz4t -s -8 - -bbl2.img.lz4: bbl2.img - lz4 -f -16 bbl2.img - -bbl2.img: bbl2.png - ../hgr-utils/png2hgr bbl2.png > bbl2.img - -#### - -1bg.hgr.lz4t: 1bg.hgr.lz4 - dd if=1bg.hgr.lz4 of=1bg.hgr.lz4t bs=1 skip=11 - truncate 1bg.hgr.lz4t -s -8 - -1bg.hgr.lz4: 1bg.hgr - lz4 -f -16 1bg.hgr - -1bg.hgr: 1bg.png - ../hgr-utils/png2hgr 1bg.png > 1bg.hgr - - -#### - -fup.hgr.lz4t: fup.hgr.lz4 - dd if=fup.hgr.lz4 of=fup.hgr.lz4t bs=1 skip=11 - truncate fup.hgr.lz4t -s -8 - -fup.hgr.lz4: fup.hgr - lz4 -f -16 fup.hgr - -fup.hgr: fup.png - ../hgr-utils/png2hgr fup.png > fup.hgr - -#### - -witch.hgr.lz4t: witch.hgr.lz4 - dd if=witch.hgr.lz4 of=witch.hgr.lz4t bs=1 skip=11 - truncate witch.hgr.lz4t -s -8 - -witch.hgr.lz4: witch.hgr - lz4 -f -16 witch.hgr - -witch.hgr: witch.png - ../hgr-utils/png2hgr witch.png > witch.hgr - - - -### - -girl.hgr.lz4t: girl.hgr.lz4 - dd if=girl.hgr.lz4 of=girl.hgr.lz4t bs=1 skip=11 - truncate girl.hgr.lz4t -s -8 - -girl.hgr.lz4: girl.hgr - lz4 -f -16 girl.hgr - ### clean: - rm -f *~ *.o *.lst HIRES + rm -f *~ *.o *.lst HIRES_PLAIN HIRES_SPECIAL HIRES_JISKEY HELLO diff --git a/graphics/hgr_viewer/hardware.inc b/graphics/hgr_viewer/hardware.inc new file mode 100644 index 00000000..69ea5b93 --- /dev/null +++ b/graphics/hgr_viewer/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/graphics/hgr_viewer/hello.bas b/graphics/hgr_viewer/hello.bas new file mode 100644 index 00000000..fcb1f1fc --- /dev/null +++ b/graphics/hgr_viewer/hello.bas @@ -0,0 +1,2 @@ + 5 HOME + 105 PRINT CHR$ (4)"BRUN HIRES" diff --git a/graphics/hgr_viewer/hires_jiskey.s b/graphics/hgr_viewer/hires_jiskey.s new file mode 100644 index 00000000..76332d67 --- /dev/null +++ b/graphics/hgr_viewer/hires_jiskey.s @@ -0,0 +1,128 @@ +; VMW Productions HIRES viewer +; +; by deater (Vince Weaver) + +.include "zp.inc" +.include "hardware.inc" + +hires_start: + + ;=================== + ; Init RTS disk code + ;=================== + + jsr rts_init + + ;=================== + ; set graphics mode + ;=================== + jsr HOME + + bit HIRES + bit FULLGR + bit SET_GR + bit PAGE0 + + ;=================== + ; Load graphics + ;=================== +load_loop: + + ;============================= + + lda #grl_filename + sta OUTH + + jsr load_image + + jsr wait_until_keypress + + + ;============================= + + lda #witch_filename + sta OUTH + + jsr load_image + + jsr wait_until_keypress + + ;============================= + + ;============================= + + lda #mona_filename + sta OUTH + + jsr load_image + + jsr wait_until_keypress + + ;============================= + + ;============================= + + lda #gw_filename + sta OUTH + + jsr load_image + + jsr wait_until_keypress + + ;============================= + + + + + + jmp load_loop + + + ;========================== + ; Load Image + ;=========================== + +load_image: + jsr opendir_filename ; open and read entire file into memory + + ; size in ldsizeh:ldsizel (f1/f0) + + comp_data = $a000 + out_addr = $2000 + + + jsr full_decomp + + rts + +.align $100 + .include "wait_keypress.s" + .include "zx02_optim.s" + .include "rts.s" + + +; filename to open is 30-character Apple text: +grl_filename: ; .byte "GRL.ZX02",0 + .byte 'G'|$80,'R'|$80,'L'|$80,'.'|$80,'Z'|$80,'X'|$80 + .byte '0'|$80,'2'|$80,$00 + +witch_filename: ; .byte "WITCH.ZX02",0 + .byte 'W'|$80,'I'|$80,'T'|$80,'C'|$80,'H'|$80 + .byte '.'|$80,'Z'|$80,'X'|$80,'0'|$80,'2'|$80,$00 + +mona_filename: ; .byte "MONA.ZX02",0 + .byte 'M'|$80,'O'|$80,'N'|$80,'A'|$80 + .byte '.'|$80,'Z'|$80,'X'|$80,'0'|$80,'2'|$80,$00 + +gw_filename: ; .byte "GW.ZX02",0 + .byte 'G'|$80,'W'|$80 + .byte '.'|$80,'Z'|$80,'X'|$80,'0'|$80,'2'|$80,$00 + diff --git a/graphics/hgr_viewer/hires_plain.s b/graphics/hgr_viewer/hires_plain.s new file mode 100644 index 00000000..c9bbff1b --- /dev/null +++ b/graphics/hgr_viewer/hires_plain.s @@ -0,0 +1,89 @@ +; VMW Productions HIRES viewer +; +; by deater (Vince Weaver) + +.include "zp.inc" +.include "hardware.inc" + +hires_start: + + ;=================== + ; Init RTS disk code + ;=================== + + jsr rts_init + + ;=================== + ; set graphics mode + ;=================== + jsr HOME + + bit HIRES + bit FULLGR + bit SET_GR + bit PAGE0 + + ;=================== + ; Load graphics + ;=================== +load_loop: + + ;============================= + + lda #gp_filename + sta OUTH + + jsr load_image + + jsr wait_until_keypress + + ;============================= + + lda #peddle_filename + sta OUTH + + jsr load_image + + jsr wait_until_keypress + + ;============================= + + + jmp load_loop + + + ;========================== + ; Load Image + ;=========================== + +load_image: + jsr opendir_filename ; open and read entire file into memory + + ; size in ldsizeh:ldsizel (f1/f0) + + comp_data = $a000 + out_addr = $2000 + + + jsr full_decomp + + rts + +.align $100 + .include "wait_keypress.s" + .include "zx02_optim.s" + .include "rts.s" + + +; filename to open is 30-character Apple text: +gp_filename: ; .byte "GP.ZX02",0 + .byte 'G'|$80,'P'|$80 + .byte '.'|$80,'Z'|$80,'X'|$80,'0'|$80,'2'|$80,$00 + +peddle_filename: ; .byte "PEDDLE.ZX02",0 + .byte 'P'|$80,'E'|$80,'D'|$80,'D'|$80,'L'|$80,'E'|$80 + .byte '.'|$80,'Z'|$80,'X'|$80,'0'|$80,'2'|$80,$00 diff --git a/graphics/hgr_viewer/hires_special.s b/graphics/hgr_viewer/hires_special.s new file mode 100644 index 00000000..c970fbbb --- /dev/null +++ b/graphics/hgr_viewer/hires_special.s @@ -0,0 +1,156 @@ +; VMW Productions HIRES viewer +; +; by deater (Vince Weaver) + +.include "zp.inc" +.include "hardware.inc" + +hires_start: + + ;=================== + ; Init RTS disk code + ;=================== + + jsr rts_init + + ;=================== + ; set graphics mode + ;=================== + jsr HOME + + bit HIRES + bit FULLGR + bit SET_GR + bit PAGE0 + + ;=================== + ; Load graphics + ;=================== +load_loop: + + ;============================= + + lda #bbl_filename + sta OUTH + + jsr load_image + + jsr wait_until_keypress + + ;============================= + + lda #bbl2_filename + sta OUTH + + jsr load_image + + jsr wait_until_keypress + + ;============================= + + lda #grl_filename + sta OUTH + + jsr load_image + + jsr wait_until_keypress + + ;============================= + + ;============================= + + lda #obg_filename + sta OUTH + + jsr load_image + + jsr wait_until_keypress + + ;============================= + + lda #fup_filename + sta OUTH + + jsr load_image + + jsr wait_until_keypress + + ;============================= + + ;============================= + + lda #witch_filename + sta OUTH + + jsr load_image + + jsr wait_until_keypress + + ;============================= + + + + + jmp load_loop + + + ;========================== + ; Load Image + ;=========================== + +load_image: + jsr opendir_filename ; open and read entire file into memory + + ; size in ldsizeh:ldsizel (f1/f0) + + comp_data = $a000 + out_addr = $2000 + + + jsr full_decomp + + rts + +.align $100 + .include "wait_keypress.s" + .include "zx02_optim.s" + .include "rts.s" + + +; filename to open is 30-character Apple text: +bbl_filename: ; .byte "BBL.ZX02",0 + .byte 'B'|$80,'B'|$80,'L'|$80,'.'|$80,'Z'|$80,'X'|$80,'0'|$80 + .byte '2'|$80,$00 + +bbl2_filename: ; .byte "BBL2.ZX02",0 + .byte 'B'|$80,'B'|$80,'L'|$80,'2'|$80,'.'|$80,'Z'|$80,'X'|$80 + .byte '0'|$80,'2'|$80,$00 + +grl_filename: ; .byte "GRL.ZX02",0 + .byte 'G'|$80,'R'|$80,'L'|$80,'.'|$80,'Z'|$80,'X'|$80 + .byte '0'|$80,'2'|$80,$00 + +obg_filename: ; .byte "OBG.ZX02",0 + .byte 'O'|$80,'B'|$80,'G'|$80,'.'|$80,'Z'|$80,'X'|$80 + .byte '0'|$80,'2'|$80,$00 + +fup_filename: ; .byte "FUP.ZX02",0 + .byte 'F'|$80,'U'|$80,'P'|$80,'.'|$80,'Z'|$80,'X'|$80 + .byte '0'|$80,'2'|$80,$00 + +witch_filename: ; .byte "WITCH.ZX02",0 + .byte 'W'|$80,'I'|$80,'T'|$80,'C'|$80,'H'|$80 + .byte '.'|$80,'Z'|$80,'X'|$80,'0'|$80,'2'|$80,$00 + diff --git a/graphics/hgr/mona/graphics/Makefile b/graphics/hgr_viewer/jiskey/Makefile similarity index 100% rename from graphics/hgr/mona/graphics/Makefile rename to graphics/hgr_viewer/jiskey/Makefile diff --git a/graphics/hgr_viewer/jiskey/README b/graphics/hgr_viewer/jiskey/README new file mode 100644 index 00000000..0815e18c --- /dev/null +++ b/graphics/hgr_viewer/jiskey/README @@ -0,0 +1,2 @@ +All images by JiskeyJasket on twitter + diff --git a/graphics/hgr_viewer/jiskey/grl.hgr b/graphics/hgr_viewer/jiskey/grl.hgr new file mode 100644 index 0000000000000000000000000000000000000000..0bbc8af582fedc7c7c55a0e93d101922b7c94349 GIT binary patch literal 8192 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 gp.hgr + +#### + +peddle.hgr.zx02: peddle.hgr + $(ZX02) peddle.hgr peddle.hgr.zx02 + +#### + +clean: + rm -f *~ *.o *.lst + diff --git a/graphics/hgr_viewer/plain/README b/graphics/hgr_viewer/plain/README new file mode 100644 index 00000000..8c650181 --- /dev/null +++ b/graphics/hgr_viewer/plain/README @@ -0,0 +1,3 @@ +gp.png: Морская свинка by ax34 https://zxart.ee/eng/authors/a/ax34/morskaja-svinka/ +peddle.hgr: based on https://www.flickr.com/photos/textfiles/10333719586 + by Jason Scott, via Wikipedia diff --git a/graphics/hgr_viewer/plain/gp.png b/graphics/hgr_viewer/plain/gp.png new file mode 100644 index 0000000000000000000000000000000000000000..b328a3087f70730bcc65369dd124cdd634ddd851 GIT binary patch literal 20384 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 a=3c c=0 + ; a=1e c=0 + ; a=0f c=0 + ; a=07 c=1 + bne L2 ; if a!=0 goto l2 + tya ; if a==0, a=y + sta nibtbl, x ; write out to table + iny ; increment y +L3: inx ; increment x x=4, a=0f + bpl L1 ; loop while high bit not set + + rts + + +;======================================================= +;======================================================= +;======================================================= + + ; filename in OUTL:OUTH + +opendir_filename: + + ; clear out the filename with $A0 (space) + + lda #filename + sta namhi + + ldy #29 +wipe_filename_loop: + lda #$A0 + sta (namlo),Y + dey + bpl wipe_filename_loop + + ldy #0 +copy_filename_loop: + lda (OUTL),Y + beq copy_filename_done + sta (namlo),Y + iny + bne copy_filename_loop + +copy_filename_done: + + ; fallthrough + +;======================================================= +;======================================================= +;======================================================= + + ;=========================== + ; opendir + ;=========================== + + ; turn on drive and read volume table of contents +opendir: +mlsmc01:lda $c0e9 ; turn slot#6 drive on + ldx #0 + stx adrlo ; zero out adrlo + stx secsize ; zero out secsize + lda #$11 ; a=$11 (VTOC) + jsr readdirsec +firstent: + + lda dirbuf+1 + + ; lock if entry not found +entry_not_found: + beq entry_not_found + + ; read directory sector + + ldx dirbuf+2 + jsr seekread1 + ldy #7 ;number of directory entries in a sector + ldx #$2b ;offset of filename in directory entry +nextent: + tya + pha ; was **phy** + txa + pha ; was **phx** + ldy #$1d + + ; match name backwards (slower but smaller) + +L4: + lda (namlo), y + cmp dirbuf, x + beq foundname + pla + + ; move to next directory in this block, if possible + + clc + adc #$23 + tax + pla + tay ; was **ply** + dey + bne nextent + beq firstent ; was **bra** + +foundname: + dex + dey + bpl L4 + pla + tay ; was **ply** + pla + + ; read track/sector list + + lda dirbuf-32, y + ldx dirbuf-31, y + jsr seekread1 + + ; read load offset and length info only, initially + + lda #filbuf + jsr seekread + + ; reduce load offset by 4, to account for offset and length + + sec + lda filbuf + sbc #4 + sta adrlo + + lda filbuf+1 + sbc #0 + sta adrhi + + ; save on stack bytes that will be overwritten by extra read + + ldy #3 +L5: + lda (adrlo), y + pha + dey + bpl L5 + + lda adrhi + pha + lda adrlo + pha + + ; increase load size by 4, to account for offst and length + + lda filbuf+2 + sta ldsizel ; store out raw size + + adc #3 + sta sizelo + sta secsize + + lda filbuf+3 + sta ldsizeh ; store out raw size + + adc #0 + sta sizehi + sta ldsizeh + beq readfirst + lda #0 ; was **stz secsize** + sta secsize + +readfirst: + ldy #$0c + + ; read a file sector + +readnext: + tya + pha + lda dirbuf, y ; A = track + ldx dirbuf+1, y ; x = sector + jsr seekread1 + pla + tay + + ; if low count is non-zero then we are done + ; (can happen only for partial last block) + + lda secsize + bne readdone + + ; continue if more than $100 bytes left + + dec sizehi + bne L6 + + ; set read size to min(length, $100) + + lda sizelo + beq readdone + sta secsize +L6: + inc adrhi + iny + iny + bne readnext + + ; save current address for after t/s read + + lda adrhi + pha + lda adrlo + pha + lda #0 + sta adrlo ; was **stz adrlo** + + ; read next track/sector sector + + lda dirbuf+1 + ldx dirbuf+2 + jsr readdirsec + clc + + ; restore current address +readdone: + pla +; sta adrhi +; pla + sta adrlo ; code originally had this backwards + pla + sta adrhi + bcc readfirst + +mlsmc02:lda $c0e8 + + ; restore from stack bytes that were overwritten by extra read + + ldx #3 + ldy #0 +L7: + pla + sta (adrlo), y + iny + dex + bpl L7 + rts + + + ;====================== + ; readdirsec + ;====================== + ; a = track? + ; x = sector? +readdirsec: + ldy #>dirbuf +seekread: + sty adrhi +seekread1: + sta phase + lda sectbl, x + sta reqsec + jsr readadr + + ; if track does not match, then seek + + cpx phase + beq checksec + jsr seek + + + ;========================================= + ; re merge in with qkumba's recent changes + ; to fix seek problem? + ;========================================= + + ; [re-]read sector + +re_read_addr: + jsr readadr +checksec: + cmp reqsec + bne re_read_addr + + ;========================= + ; read sector data + ;========================= + +readdata: + jsr readd5aa + eor #$ad ; zero A if match + bne re_read_addr + +L12: +mlsmc03:ldx $c0ec ; read until valid data (high bit set) + bpl L12 + eor nibtbl-$80, x + sta bit2tbl-$aa, y + iny + bne L12 +L13: +mlsmc04:ldx $c0ec ; read until valid data (high bit set) + bpl L13 + eor nibtbl-$80, x + sta (adrlo), y ; the real address + iny + cpy secsize + bne L13 + ldy #0 +L14: + ldx #$a9 +L15: + inx + beq L14 + lda (adrlo), y + lsr bit2tbl-$aa, x + rol + lsr bit2tbl-$aa, x + rol + sta (adrlo), y + iny + cpy secsize + bne L15 + rts + + ; no tricks here, just the regular stuff + + ;======================= + ; readaddr -- read the address field + ;======================= + ; Find address field, put track in cutrk, sector in tmpsec + +readadr: + jsr readd5aa + cmp #$96 + bne readadr + ldy #3 ; three? + ; first read volume/volume + ; then track/track + ; then sector/sector? +adr_read_two_bytes: + tax + jsr readnib + rol + sta tmpsec + jsr readnib + and tmpsec + dey + bne adr_read_two_bytes + rts + + ;======================== + ; make sure we see the $D5 $AA pattern + +readd5aa: +L16: + jsr readnib +L17: + cmp #$d5 + bne L16 + jsr readnib + cmp #$aa + bne L17 + tay ; we need Y=#$AA later + +readnib: +mlsmc05:lda $c0ec ; read until valid (high bit set) + bpl readnib + +seekret: + rts + + ;===================== + ; SEEK + ;===================== + ; current track in X? + ; desired track in phase + +seek: + ldy #0 + sty step + asl phase ; multiply by two + txa ; current track? + asl ; mul by two +copy_cur: + tax + sta tmptrk + sec + sbc phase + beq L22 + bcs L18 + eor #$ff + inx + bcc L19 +L18: + sbc #1 + dex +L19: + cmp step + bcc L20 + lda step +L20: + cmp #8 + bcs L21 + tay + sec +L21: + txa + pha + ldx step1, y +L22: + php + bne L24 +L23: + clc + lda tmptrk + ldx step2, y +L24: + stx tmpsec + and #3 + rol + tax + lsr +mlsmc06:lda $c0e0, x +L25: + ldx #$12 +L26: + dex + bpl L26 + dec tmpsec + bne L25 + bcs L23 + plp + beq seekret + pla + inc step + bne copy_cur + + +step1: .byte $01, $30, $28, $24, $20, $1e, $1d, $1c +step2: .byte $70, $2c, $26, $22, $1f, $1e, $1d, $1c + +sectbl: .byte $00,$0d,$0b,$09,$07,$05,$03,$01,$0e,$0c,$0a,$08,$06,$04,$02,$0f + + +; From $BA96 of DOS33 +nibtbl: .res 128 ; = * +; .byte $00,$01,$98,$99,$02,$03,$9C,$04 ; $BA96 ; 00 +; .byte $05,$06,$A0,$A1,$A2,$A4,$A4,$A5 ; $BA9E ; 08 +; .byte $07,$08,$A8,$A9,$AA,$09,$0A,$0B ; $BAA6 ; 10 +; .byte $0C,$0D,$B0,$B1,$0E,$0F,$10,$11 ; $BAAE ; 18 +; .byte $12,$13,$B8,$14,$15,$16,$17,$18 ; $BAB6 ; 20 +; .byte $19,$1A,$C0,$C1,$C2,$C3,$C4,$C5 ; $BABE ; 28 +; .byte $C6,$C7,$C8,$C9,$CA,$1B,$CC,$1C ; $BAC6 ; 30 +; .byte $1D,$1E,$D0,$D1,$D2,$1E,$D4,$D5 ; $BACE ; 38 +; .byte $20,$21,$D8,$22,$23,$24,$25,$26 ; $BAD6 ; 40 +; .byte $27,$28,$E0,$E1,$E2,$E3,$E4,$29 ; $BADE ; 48 +; .byte $2A,$2B,$E8,$2C,$2D,$2E,$2F,$30 ; $BAE6 ; 50 +; .byte $31,$32,$F0,$F1,$33,$34,$35,$36 ; $BAEE ; 58 +; .byte $37,$38,$F8,$39,$3A,$3B,$3C,$3D ; $BAF6 ; 60 +; .byte $3E,$3F,$13,$00,$01,$02,$01,$00 ; $BAFE ; 68 +; .byte $00,$00,$00,$00,$00,$00,$00,$00 +; .byte $00,$00,$00,$00,$00,$00,$00,$00 + + +bit2tbl: .res 86 ; = nibtbl+128 +filbuf: .res 4 ; = bit2tbl+86 + ;dataend = filbuf+4 + diff --git a/graphics/hgr_viewer/special/Makefile b/graphics/hgr_viewer/special/Makefile new file mode 100644 index 00000000..df0b1c7c --- /dev/null +++ b/graphics/hgr_viewer/special/Makefile @@ -0,0 +1,60 @@ +include ../../../Makefile.inc + +ZX02 = ~/research/6502_compression/zx02.git/build/zx02 +PNG_TO_HGR = ../../../utils/hgr-utils/png2hgr + +all: bbl.hgr.zx02 bbl2.hgr.zx02 \ + grl.hgr.zx02 1bg.hgr.zx02 fup.hgr.zx02 witch.hgr.zx02 + +#### + +bbl.hgr.zx02: bbl.hgr + $(ZX02) bbl.hgr bbl.hgr.zx02 + +bbl.hgr: bbl.png + $(PNG_TO_HGR) bbl.png > bbl.hgr + +#### + +bbl2.hgr.zx02: bbl2.hgr + $(ZX02) bbl2.hgr bbl2.hgr.zx02 + +bbl2.hgr: bbl2.png + $(PNG_TO_HGR) bbl2.png > bbl2.hgr + +#### + +1bg.hgr.zx02: 1bg.hgr + $(ZX02) 1bg.hgr 1bg.hgr.zx02 + +1bg.hgr: 1bg.png + $(PNG_TO_HGR) 1bg.png > 1bg.hgr + + +#### + +fup.hgr.zx02: fup.hgr + $(ZX02) fup.hgr fup.hgr.zx02 + +fup.hgr: fup.png + $(PNG_TO_HGR) fup.png > fup.hgr + +#### + +witch.hgr.zx02: witch.hgr + $(ZX02) witch.hgr witch.hgr.zx02 + +witch.hgr: witch.png + $(PNG_TO_HGR) witch.png > witch.hgr + +### + +grl.hgr.zx02: grl.hgr + $(ZX02) grl.hgr grl.hgr.zx02 + +### + + +clean: + rm -f *~ *.o *.lst + diff --git a/graphics/hgr_viewer/wait_keypress.s b/graphics/hgr_viewer/wait_keypress.s new file mode 100644 index 00000000..444d2074 --- /dev/null +++ b/graphics/hgr_viewer/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/graphics/hgr_viewer/zp.inc b/graphics/hgr_viewer/zp.inc new file mode 100644 index 00000000..311a38ff --- /dev/null +++ b/graphics/hgr_viewer/zp.inc @@ -0,0 +1,200 @@ +;; Zero Page + +FRAMEBUFFER = $00 ; $00 - $0F + +;; LZ4 addresses + +FLAME_STATE = $00 +FLAME1 = $01 +FLAME2 = $02 +FLAME3 = $03 +FLAME4 = $04 +FLAME5 = $05 + + +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 + + + + + + +; read any file slot 6 version +; based on FASTLD6 and RTS copyright (c) Peter Ferrie 2011-2013,2018 + +; modified to assembled with ca64 -- vmw +; added code to patch it to run from current disk slot -- vmw + + + adrlo = $26 ; constant from boot prom + adrhi = $27 ; constant from boot prom + tmpsec = $3c ; constant from boot prom + reqsec = $3d ; constant from boot prom + sizelo = $44 + sizehi = $45 + secsize = $46 + + ldsizel = $f0 + ldsizeh = $f1 + namlo = $fb + namhi = $fc + step = $fd ; state for stepper motor + tmptrk = $fe ; temporary copy of current track + phase = $ff ; current phase for /seek + diff --git a/graphics/hgr_viewer/zx02_optim.s b/graphics/hgr_viewer/zx02_optim.s new file mode 100644 index 00000000..5f6121f2 --- /dev/null +++ b/graphics/hgr_viewer/zx02_optim.s @@ -0,0 +1,144 @@ +; De-compressor for ZX02 files +; ---------------------------- +; +; Decompress ZX02 data (6502 optimized format), optimized for speed and size +; 138 bytes code, 58.0 cycles/byte in test file. +; +; Compress with: +; zx02 input.bin output.zx0 +; +; (c) 2022 DMSC +; Code under MIT license, see LICENSE file. + + +ZP=$80 + +offset = ZP+0 +ZX0_src = ZP+2 +ZX0_dst = ZP+4 +bitr = ZP+6 +pntr = ZP+7 + + ; Initial values for offset, source, destination and bitr +zx0_ini_block: + .byte $00, $00, comp_data, out_addr, $80 + +;-------------------------------------------------- +; Decompress ZX0 data (6502 optimized format) + +full_decomp: + ; Get initialization block + ldy #7 + +copy_init: lda zx0_ini_block-1, y + sta offset-1, y + dey + bne copy_init + +; Decode literal: Ccopy next N bytes from compressed file +; Elias(length) byte[1] byte[2] ... byte[N] +decode_literal: + jsr get_elias + +cop0: lda (ZX0_src), y + inc ZX0_src + bne plus1 + inc ZX0_src+1 +plus1: sta (ZX0_dst),y + inc ZX0_dst + bne plus2 + inc ZX0_dst+1 +plus2: dex + bne cop0 + + asl bitr + bcs dzx0s_new_offset + +; Copy from last offset (repeat N bytes from last offset) +; Elias(length) + jsr get_elias +dzx0s_copy: + lda ZX0_dst + sbc offset ; C=0 from get_elias + sta pntr + lda ZX0_dst+1 + sbc offset+1 + sta pntr+1 + +cop1: + lda (pntr), y + inc pntr + bne plus3 + inc pntr+1 +plus3: sta (ZX0_dst),y + inc ZX0_dst + bne plus4 + inc ZX0_dst+1 +plus4: dex + bne cop1 + + asl bitr + bcc decode_literal + +; Copy from new offset (repeat N bytes from new offset) +; Elias(MSB(offset)) LSB(offset) Elias(length-1) +dzx0s_new_offset: + ; Read elias code for high part of offset + jsr get_elias + beq exit ; Read a 0, signals the end + ; Decrease and divide by 2 + dex + txa + lsr ; @ + sta offset+1 + + ; Get low part of offset, a literal 7 bits + lda (ZX0_src), y + inc ZX0_src + bne plus5 + inc ZX0_src+1 +plus5: + ; Divide by 2 + ror ; @ + sta offset + + ; And get the copy length. + ; Start elias reading with the bit already in carry: + ldx #1 + jsr elias_skip1 + + inx + bcc dzx0s_copy + +; Read an elias-gamma interlaced code. +; ------------------------------------ +get_elias: + ; Initialize return value to #1 + ldx #1 + bne elias_start + +elias_get: ; Read next data bit to result + asl bitr + rol ; @ + tax + +elias_start: + ; Get one bit + asl bitr + bne elias_skip1 + + ; Read new bit from stream + lda (ZX0_src), y + inc ZX0_src + bne plus6 + inc ZX0_src+1 +plus6: ;sec ; not needed, C=1 guaranteed from last bit + rol ;@ + sta bitr + +elias_skip1: + txa + bcs elias_get + ; Got ending bit, stop reading +exit: + rts