From 1262cde56ffe67f27bc802ecaae14ce2782a5ef1 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Fri, 16 Jul 2021 22:43:14 -0400 Subject: [PATCH] games: riven: not really, just to get some images for my slides --- games/riven/Makefile | 58 +++++ games/riven/decompress_fast_v2.s | 370 +++++++++++++++++++++++++++++++ games/riven/hello.bas | 3 + games/riven/riven.s | 79 +++++++ games/riven/riven1.png | Bin 0 -> 17465 bytes games/riven/riven3.png | Bin 0 -> 13989 bytes games/riven/riven_title.lzsa | Bin 0 -> 6981 bytes games/riven/wait_keypress.s | 5 + 8 files changed, 515 insertions(+) create mode 100644 games/riven/Makefile create mode 100644 games/riven/decompress_fast_v2.s create mode 100644 games/riven/hello.bas create mode 100644 games/riven/riven.s create mode 100644 games/riven/riven1.png create mode 100644 games/riven/riven3.png create mode 100644 games/riven/riven_title.lzsa create mode 100644 games/riven/wait_keypress.s diff --git a/games/riven/Makefile b/games/riven/Makefile new file mode 100644 index 00000000..810525ab --- /dev/null +++ b/games/riven/Makefile @@ -0,0 +1,58 @@ +#include ../Makefile.inc + +#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 + +B2D = ../../utils/bmp2dhr/b2d +PNG2GR = ../../utils/gr-utils/png2gr +LZSA = ~/research/lzsa/lzsa/lzsa + + +### + +all: riven.dsk + +riven.dsk: HELLO RIVEN + cp $(EMPTY_DISK)/empty.dsk riven.dsk + $(DOS33) -y riven.dsk SAVE A HELLO + $(DOS33) -y riven.dsk BSAVE -a 0x6000 RIVEN +### + +HELLO: hello.bas + $(TOKENIZE) < hello.bas > HELLO + +### + +RIVEN: riven.o + ld65 -o RIVEN riven.o -C $(LINKER_SCRIPTS)/apple2_6000.inc + +riven.o: riven.s riven_title.lzsa riven1.lzsa riven3.lzsa + ca65 -o riven.o riven.s -l riven.lst + + + +riven_title.lzsa: RIVEN_TITLEC.BIN + $(LZSA) -r -f2 RIVEN_TITLEC.BIN riven_title.lzsa + +RIVEN_TITLEC.BIN: riven_title.bmp + $(B2D) riven_title.bmp HGR -d + +#### + +%.gr: %.png + $(PNG2GR) $< $@ + +%.lzsa: %.gr + $(LZSA) -r -f2 $< $@ + + +### + +clean: + rm -f *~ *.o *.lst HELLO RIVEN + diff --git a/games/riven/decompress_fast_v2.s b/games/riven/decompress_fast_v2.s new file mode 100644 index 00000000..fb2f24ad --- /dev/null +++ b/games/riven/decompress_fast_v2.s @@ -0,0 +1,370 @@ +; 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/games/riven/hello.bas b/games/riven/hello.bas new file mode 100644 index 00000000..41cf3582 --- /dev/null +++ b/games/riven/hello.bas @@ -0,0 +1,3 @@ +5 HOME +20 PRINT CHR$(4)"CATALOG" + diff --git a/games/riven/riven.s b/games/riven/riven.s new file mode 100644 index 00000000..1ad85f1c --- /dev/null +++ b/games/riven/riven.s @@ -0,0 +1,79 @@ +; Riven fake out + +NIBCOUNT = $09 + +KEYPRESS = $C000 +KEYRESET = $C010 +PAGE0 = $C054 +LORES = $C056 + +HGR2 = $F3D8 + + +hgr_display: + jsr HGR2 ; Hi-res graphics, no text at bottom + ; Y=0, A=0 after this called + + bit PAGE0 + + lda #<(riven_title_lzsa) + sta getsrc_smc+1 + lda #>(riven_title_lzsa) + sta getsrc_smc+2 + + lda #$20 + + jsr decompress_lzsa2_fast + + + jsr wait_until_keypress + + ;=========================== + + bit LORES + + lda #<(riven1_lzsa) + sta getsrc_smc+1 + lda #>(riven1_lzsa) + sta getsrc_smc+2 + + lda #$04 + + jsr decompress_lzsa2_fast + + jsr wait_until_keypress + + ;=========================== + + bit LORES + + lda #<(riven3_lzsa) + sta getsrc_smc+1 + lda #>(riven3_lzsa) + sta getsrc_smc+2 + + lda #$04 + + jsr decompress_lzsa2_fast + + jsr wait_until_keypress + + + +forever: + jmp forever + + + + +.include "wait_keypress.s" +.include "decompress_fast_v2.s" + +riven_title_lzsa: +.incbin "riven_title.lzsa" + +riven1_lzsa: +.incbin "riven1.lzsa" + +riven3_lzsa: +.incbin "riven3.lzsa" diff --git a/games/riven/riven1.png b/games/riven/riven1.png new file mode 100644 index 0000000000000000000000000000000000000000..fce90b41b450ed699103e216279b3f839d81db40 GIT binary patch literal 17465 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 literal 0 HcmV?d00001 diff --git a/games/riven/riven_title.lzsa b/games/riven/riven_title.lzsa new file mode 100644 index 0000000000000000000000000000000000000000..3f9f0bcc6bfd584147ffced7f257813f91535484 GIT binary patch literal 6981 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 XtF~PBO1an$o#M_PC87U9BmMsmaGAx) literal 0 HcmV?d00001 diff --git a/games/riven/wait_keypress.s b/games/riven/wait_keypress.s new file mode 100644 index 00000000..444d2074 --- /dev/null +++ b/games/riven/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