From c031c4c95aba4e7406763fddee895276de2c35a1 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Thu, 11 Nov 2021 14:32:35 -0500 Subject: [PATCH] logo_demo: more updates --- demos/logo_demo/Makefile | 9 +- demos/logo_demo/decompress_fast_v2.s | 379 +++++++++++++++++++++++++++ demos/logo_demo/demo.logo | 51 +++- demos/logo_demo/map.png | Bin 16695 -> 2140 bytes demos/logo_demo/music.s | 8 +- 5 files changed, 426 insertions(+), 21 deletions(-) create mode 100644 demos/logo_demo/decompress_fast_v2.s diff --git a/demos/logo_demo/Makefile b/demos/logo_demo/Makefile index 81bd994b..8b36902d 100644 --- a/demos/logo_demo/Makefile +++ b/demos/logo_demo/Makefile @@ -11,12 +11,14 @@ LZSA = ~/research/lzsa/lzsa/lzsa all: logo_demo.dsk -logo_demo.dsk: LOGO3 MUSIC DEMO map.lzsa +logo_demo.dsk: LOGO3 MUSIC DEMO MAP cp ../../logo/dsks/apple_logo_ii.dsk ./logo_demo.dsk $(PRODOS) -y logo_demo.dsk -t BIN -a 0x2000 SAVE LOGO3 $(PRODOS) -y logo_demo.dsk DELETE FORMAT $(PRODOS) -y logo_demo.dsk DELETE FORMAT.BIN $(PRODOS) -y logo_demo.dsk DELETE FORMAT.HELP + $(PRODOS) -y logo_demo.dsk DELETE USEFUL.TOOLS +# $(PRODOS) -y logo_demo.dsk DELETE MAIN.HELP # $(PRODOS) -y logo_demo.dsk DELETE SAMPLES/MENU # $(PRODOS) -y logo_demo.dsk DELETE SAMPLES/MENU.DATA # $(PRODOS) -y logo_demo.dsk DELETE SAMPLES/MENU.DOC @@ -26,6 +28,7 @@ logo_demo.dsk: LOGO3 MUSIC DEMO map.lzsa # $(PRODOS) -y logo_demo.dsk DELETE SAMPLES/MEMORY.DOC # $(PRODOS) -y logo_demo.dsk DELETE SAMPLES/LOGO.SINGS $(PRODOS) -y logo_demo.dsk -t BIN -a 0x4C00 SAVE MUSIC + $(PRODOS) -y logo_demo.dsk -t BIN -a 0xE000 SAVE MAP $(PRODOS) -y logo_demo.dsk -t BIN -a 0x2000 SAVE ./music/mA2E_-_Apple_2_for_Demosplash_2021.pt3 MA2E.PT3 $(PRODOS) -y logo_demo.dsk SAVE -t TXT DEMO @@ -41,6 +44,7 @@ MUSIC: music.o ld65 -o MUSIC music.o -C $(LINKER_SCRIPTS)/apple2_4c00.inc music.o: music.s \ + decompress_fast_v2.s \ zp.inc hardware.inc nozp.inc \ interrupt_handler.s pt3_lib_mockingboard_setup.s ca65 -o music.o music.s -l music.lst @@ -52,6 +56,9 @@ DEMO: demo.logo #### +MAP: map.lzsa + cp map.lzsa MAP + map.lzsa: map.hgr $(LZSA) -r -f2 map.hgr map.lzsa diff --git a/demos/logo_demo/decompress_fast_v2.s b/demos/logo_demo/decompress_fast_v2.s new file mode 100644 index 00000000..086f93ba --- /dev/null +++ b/demos/logo_demo/decompress_fast_v2.s @@ -0,0 +1,379 @@ +; 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: .byte $00 ; zero-page location for temp offset + + + +decompress_lzsa2_fast: + + lda #<$800 + sta LZSA_SRC_LO + lda #>$800 + sta LZSA_SRC_HI + lda #$20 ; load to page $2000 + + + 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/demos/logo_demo/demo.logo b/demos/logo_demo/demo.logo index 74ff5557..40c5fac1 100644 --- a/demos/logo_demo/demo.logo +++ b/demos/logo_demo/demo.logo @@ -88,17 +88,33 @@ FISH WAIT 300 END +TO POLYSPI4 :S :A :D :L +IF :S < :L [STOP] +FD :S RT :A +POLYSPI4 (:S - :D) :A :D :L +END + TO WARGAMES +REPEAT 4 [PRINT "] +SS +SETCURSOR [12 21] PRINT [DEMOSCENE GAMBIT] +HT PU +.CALL 22810 +WAIT 60 +SETPOS [-70 10] SETH 0 ST PD +REPEAT 36 [FD 2 RT 4] +SETH 90 +FD 10 RT 90 +POLYSPI4 3 18 0.05 0.5 +HT +WAIT 60 +FS END TO PLASMA END -TO POLYSPI4 :S :A :D :L -IF :SIZE < :L [STOP] -FD :S RT :A -POLYSPI4 (:S - :D) :A :D -END + TO POLY END @@ -107,21 +123,28 @@ TO MYST END TO CREDITS +SS +REPEAT 4 [PRINT "] +SETCURSOR [1 21] PRINT [CODE: DEATER] +SETCURSOR [28 21] PRINT [MUSIC: mA2E] +SETCURSOR [12 23] PRINT [APPLE II FOREVER] +WAIT 600 END TO DEMO CS FS -.BLOAD "MA2E.PT3 4096 +PRINT [.BLOAD "MA2E.PT3 4096] .BLOAD "MUSIC 19456 -.CALL 19456 -DSR -OCEAN +PRINT [.CALL 19456] +.BLOAD "MAP 2048 +PRINT "DSR +PRINT "OCEAN WARGAMES -PLASMA -POLY -MYST -CS -REPEAT 5 [ CTREE ] +PRINT "PLASMA +PRINT "POLY +PRINT "MYST +PRINT "CS +PRINT [REPEAT 5 [ CTREE ]] CREDITS END diff --git a/demos/logo_demo/map.png b/demos/logo_demo/map.png index f5df5dd8c11a0bbdae3a2570a9d21431a13d976b..e4534f992c05bbfcee4058b3e143bfceea5f19e5 100644 GIT binary patch delta 2021 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

VVbK1B~jgzIZ{$@KjnsCn_wF&x}5*c<%H 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 ZY2)kca)?i3_x$|?ke61Gs*^AY`9B3dH&_4w diff --git a/demos/logo_demo/music.s b/demos/logo_demo/music.s index 445a1c17..5e0924b6 100644 --- a/demos/logo_demo/music.s +++ b/demos/logo_demo/music.s @@ -57,11 +57,7 @@ mockingboard_not_found: .include "nozp.inc" +.include "decompress_fast_v2.s" PT3_LOC = $1000 -;PT3_LOC = $2000 -;.align $100 -song: -;.incbin "../../demos/applebot_demo/music/mAZE_-_The_Upbeated_Eaten_Apple.pt3" -;.incbin "../../demos/outline2021/demo/mAZE_-_Apple_snapple_Outline.pt3" -;.incbin "./music/Fret.pt3" +