From dbd1fa46d6a7f90cab113e0acab7da9dc57d8fa4 Mon Sep 17 00:00:00 2001 From: pkali Date: Wed, 14 Aug 2024 23:29:03 -0400 Subject: [PATCH] wip --- music/gameover.lzss | Bin 0 -> 492 bytes music/ingame.lzss | Bin 0 -> 2911 bytes music/playlzs16.asm | 171 ++++++++++++++++++++++++++++++++++++++++++++ music/title.lzss | Bin 0 -> 1435 bytes 4 files changed, 171 insertions(+) create mode 100644 music/gameover.lzss create mode 100644 music/ingame.lzss create mode 100644 music/playlzs16.asm create mode 100644 music/title.lzss diff --git a/music/gameover.lzss b/music/gameover.lzss new file mode 100644 index 0000000000000000000000000000000000000000..d432e6f8079cadb00080493272d7952ccea7871a GIT binary patch literal 492 zcmVEnx4Fay${i**4$qBFNsK@>Q0x zy`laFW{Hmj{tf`uS{eq78V#Wv1&Fi%g~f!&gUN!+dj1@78V-Pgp=BWk2nG}(1|kP* z3=aMk{uL+^fR2jp=FT>^ky9C!_Rcy|kScViCniU*1Z ziU)=ppj8LL2Y4#N4~8grmlm&(k!Uu;3Y;S97X=+Xm&IO_dexePv$JyK6 i-%ba^fwjC6sRkqr-V6r-ey|I`(&Xmo>emGV*8~`N<*~Q` literal 0 HcmV?d00001 diff --git a/music/ingame.lzss b/music/ingame.lzss new file mode 100644 index 0000000000000000000000000000000000000000..5ea1276b965a425d6afa99e71ef1ceb02e7eb856 GIT binary patch literal 2911 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 literal 0 HcmV?d00001 diff --git a/music/playlzs16.asm b/music/playlzs16.asm new file mode 100644 index 0000000..81b99f9 --- /dev/null +++ b/music/playlzs16.asm @@ -0,0 +1,171 @@ +; +; LZSS Compressed SAP player for 16 match bits +; -------------------------------------------- +; +; (c) 2020 DMSC +; Code under MIT license, see LICENSE file. +; +; This player uses: +; Match length: 8 bits (1 to 256) +; Match offset: 8 bits (1 to 256) +; Min length: 2 +; Total match bits: 16 bits +; +; Compress using: +; lzss -b 16 -o 8 -m 1 input.rsap test.lz12 +; +; Assemble this file with MADS assembler, the compressed song is expected in +; the `test.lz16` file at assembly time. +; +; The plater needs 256 bytes of buffer for each pokey register stored, for a +; full SAP file this is 2304 bytes. +; + org $80 + +chn_copy .ds 9 +chn_pos .ds 9 +bptr .ds 2 +cur_pos .ds 1 +chn_bits .ds 1 + +bit_data .byte 1 + +.proc get_byte + lda song_data+1 + inc song_ptr + bne skip + inc song_ptr+1 +skip + rts +.endp +song_ptr = get_byte + 1 + + +POKEY = $D200 + + org $2000 +buffers + .ds 256 * 9 + +song_data + ins 'test.lz16' +song_end + + +start + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Song Initialization - this runs in the first tick: +; +.proc init_song + + ; Example: here initializes song pointer: + ; sta song_ptr + ; stx song_ptr + 1 + + ; Init all channels: + ldx #8 + ldy #0 +clear + ; Read just init value and store into buffer and POKEY + jsr get_byte + sta POKEY, x + sty chn_copy, x +cbuf + sta buffers + 255 + inc cbuf + 2 + dex + bpl clear + + ; Initialize buffer pointer: + sty bptr + sty cur_pos +.endp + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Wait for next frame +; +.proc wait_frame + + lda 20 +delay + cmp 20 + beq delay +.endp + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Play one frame of the song +; +.proc play_frame + lda #>buffers + sta bptr+1 + + lda song_data + sta chn_bits + ldx #8 + + ; Loop through all "channels", one for each POKEY register +chn_loop: + lsr chn_bits + bcs skip_chn ; C=1 : skip this channel + + lda chn_copy, x ; Get status of this stream + bne do_copy_byte ; If > 0 we are copying bytes + + ; We are decoding a new match/literal + lsr bit_data ; Get next bit + bne got_bit + jsr get_byte ; Not enough bits, refill! + ror ; Extract a new bit and add a 1 at the high bit (from C set above) + sta bit_data ; +got_bit: + jsr get_byte ; Always read a byte, it could mean "match size/offset" or "literal byte" + bcs store ; Bit = 1 is "literal", bit = 0 is "match" + + sta chn_pos, x ; Store in "copy pos" + + jsr get_byte + sta chn_copy, x ; Store in "copy length" + + ; And start copying first byte +do_copy_byte: + dec chn_copy, x ; Decrease match length, increase match position + inc chn_pos, x + ldy chn_pos, x + + ; Now, read old data, jump to data store + lda (bptr), y + +store: + ldy cur_pos + sta POKEY, x ; Store to output and buffer + sta (bptr), y + +skip_chn: + ; Increment channel buffer pointer + inc bptr+1 + + dex + bpl chn_loop ; Next channel + + inc cur_pos +.endp + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Check for ending of song and jump to the next frame +; +.proc check_end_song + lda song_ptr + 1 + cmp #>song_end + bne wait_frame + lda song_ptr + cmp #Y!fY~1+iL4_5oCdY) zh;FRVt|n$nluUdX>DX@fhivhokf3(>k2y9_qoF}E@If9(gc%}WHg}HaI$pfr<3V~in2=<6;fef2X!W@08Em`NgWy1P3bkI5jLTPzIf7=%=6gn1AH)gwDp2LtX=L4}W- z8eNJ@IV9WNbZ=)}axO?ZY|>%r4IlZ? zU*sd7o{G~r^^v_7eWZs*?NNK&;jC{7{iQ3qa&(*?XlV)chMJrAtI#9HJ%;ahW^l%q z!PVAkYaC9FLmXx=IcBaY*OV)rv$HcZmoHDp0ma2M%i$1?^Z*(MXK@d-MVKbQYMfu< zyegn7s*-2hUL}qJzrQlz|7BI-szUu)I<%e+)|UIU8ZY+ZojW$;%^0bgss&Nl;q`bu z!Lrt>mNx@0Z0f)r_{A+zjG|a2D)EwzOPb<-Q}*>BVN{4;myzytcl zg0^5vqKR^b5_b_p*)c}P(s%gC*{Q|h(d$d|sniWFNrQ7aTa&l4I!eo!Iobj-B-1Do zlJsU#SAk)P1>2v@&x_{P8IGvRQhS@;xjY4$@E$gBhR~VDM`415m#=Rn_7w(lpW&{pG|rvh`gQ( z&uY4UqHNvTb-R?IJ#>(`irr+*>)7pJ#4zN9kfdx)2Q{<^Yvod(ZHrE&5*f~Ey2jxc zr_-dA$Y3e4l)S7}?GE@W{a4n_(KEMc<$x2MaF+_5A?YOBoa6xwLmPDxCqc}59wh{( z;e(u~`B-*1GKX{UhZ(#Bw?-;~0vfD}qxRl{?I&s~~+w zfU@BHJlPz5HD`ioBU{*l|VHrSgD5(au3kL*xWKJ1JzA8^qxwNT1wIvyJk!# zS)1ALBo)?P>GNJ!T^vSYBM$5qGj|~!39tnd~VbDl&{;@$b z`U#WiTCu1gK_^$XHx-H%U2sIWgBPr3(K+&4k>L3tb(S#e??%T&jB06*wB?E}G5SN) zhmS<