From 999844460a2968a8dcbb77673f5f07b455a88f77 Mon Sep 17 00:00:00 2001 From: giomba Date: Sun, 4 Oct 2020 20:58:08 +0200 Subject: [PATCH] ported lzgmini_6502 for dasm, and embedded in this game's code --- Makefile | 2 +- src/cart.asm | 26 +++--- src/lzgmini.asm | 242 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 258 insertions(+), 12 deletions(-) create mode 100644 src/lzgmini.asm diff --git a/Makefile b/Makefile index 19040d8..de33201 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ RES=res.bin/amour.sid res.bin/levels.bin res.bin/unlzg.bin .PHONY: debug env clean bin/snake.bin: bin/snake.pack.lz - dasm src/cart.asm -DVERBOSE=$(VERBOSE) -f3 -sbuild/cart.symbols.txt -obin/snake.bin + dasm src/cart.asm -Isrc/ -DVERBOSE=$(VERBOSE) -f3 -sbuild/cart.symbols.txt -obin/snake.bin bin/snake.pack: env $(ASM) $(RES) bin/explodefont dasm src/main.asm -Isrc/ -DSYSTEM=64 -DDEBUG=$(DEBUG) -DVERBOSE=$(VERBOSE) -DCARTRIDGE=$(CARTRIDGE) -f3 -sbuild/pack.symbols.txt -obin/snake.pack diff --git a/src/cart.asm b/src/cart.asm index 8e3e92c..a3263b1 100644 --- a/src/cart.asm +++ b/src/cart.asm @@ -1,5 +1,9 @@ processor 6502 + SEG.U zeropageSegment + org $02 + INCLUDE "zeropage.asm" + SEG cartridgeSegment org $8000 @@ -10,12 +14,6 @@ cartridge SUBROUTINE ; CBM80 in PETSCII (cartridge signature for autostart) BYTE #$c3,#$c2,#$cd,#$38,#$30 -.unlzg: - INCBIN "res.bin/unlzg.bin" - -.lzpack: - INCBIN "bin/snake.pack.lz" - .coldstart: sei stx $d016 @@ -28,20 +26,26 @@ cartridge SUBROUTINE .warmstart: ; address of input compressed data lda #<.lzpack - sta 26 + sta srcPointer lda #>.lzpack - sta 27 + sta srcPointer + 1 ; address of output decompressed data lda #$00 - sta 28 + sta dstPointer lda #$10 - sta 29 - jsr .unlzg + sta dstPointer + 1 + jsr inflate ; jump to program entry jmp $2800 + ; compressed pack +.lzpack: + INCBIN "bin/snake.pack.lz" + + ; decompression util + INCLUDE "lzgmini.asm" #if VERBOSE = 1 ECHO "8k CARTRIDGE SIZE:",(. - $8000),"=",[(. - $8000)d] diff --git a/src/lzgmini.asm b/src/lzgmini.asm new file mode 100644 index 0000000..66a7370 --- /dev/null +++ b/src/lzgmini.asm @@ -0,0 +1,242 @@ +inflate SUBROUTINE +.inEnd EQU 2 +.offset EQU 4 +.length EQU 6 +.symbol EQU 25 +.marker1 EQU 30 +.marker2 EQU 31 +.marker3 EQU 32 +.marker4 EQU 33 +.copy EQU 34 + + clc + ldy #10 + lda (srcPointer),y + adc srcPointer + sta .inEnd + dey + lda (srcPointer),y + adc srcPointer + 1 + sta .inEnd + 1 + clc + lda .inEnd + adc #16 + sta .inEnd + lda .inEnd + 1 + adc #0 + sta .inEnd + 1 + + ; Get the marker symbols + ldy #16 + lda (srcPointer),y + sta .marker1 + iny + lda (srcPointer),y + sta .marker2 + iny + lda (srcPointer),y + sta .marker3 + iny + lda (srcPointer),y + sta .marker4 + + ; Skip header + marker symbols (16 + 4 bytes) + clc + lda srcPointer + adc #20 + sta srcPointer + lda srcPointer + 1 + adc #0 + sta srcPointer + 1 + + ; Main decompression loop + ldy #0 ; Make sure that Y is zero +.mainloop: + lda srcPointer ; done? + cmp .inEnd + bne .notdone + lda srcPointer + 1 + cmp .inEnd + 1 + bne .notdone + rts +.notdone: + lda (srcPointer),y ; A = symbol + sta .symbol + sta $d020 + inc srcPointer + bne .noinc1 + inc srcPointer + 1 +.noinc1: + cmp .marker1 ; Marker1? + beq .domarker1 + cmp .marker2 ; Marker2? + beq .domarker2 + cmp .marker3 ; Marker3? + beq .domarker3 + cmp .marker4 ; Marker4? + beq .domarker4 +.literal: + lda .symbol + sta (dstPointer),y ; Plain copy + inc dstPointer + bne .mainloop + inc dstPointer + 1 + bne .mainloop + +.domarker1: + jmp .domarker1b + + ; marker4 - "Near copy (incl. RLE)" +.domarker4: + lda (srcPointer),y + inc srcPointer + bne .noinc3 + inc srcPointer + 1 +.noinc3: + cmp #0 + beq .literal ; Single occurance of the marker symbol (rare) + tax + lsr + lsr + lsr + lsr + lsr + sta .offset + inc .offset + lda #0 + sta .offset + 1 ; offset = (b >> 5) + 1 + txa + and #$1f + tax + lda .LZG_LENGTH_DECODE_LUT,x + sta .length ; length = .LZG_LENGTH_DECODE_LUT[b & 0x1f] + jmp .docopy + + ; marker3 - "Short copy" +.domarker3: + lda (srcPointer),y + inc srcPointer + bne .noinc4 + inc srcPointer + 1 +.noinc4: + cmp #0 + beq .literal ; Single occurance of the marker symbol (rare) + tax + lsr + lsr + lsr + lsr + lsr + lsr + clc + adc #3 + sta .length ; length = (b >> 6) + 3 + txa + and #$3f + adc #8 + sta .offset + lda #0 + sta .offset + 1 ; offset = (b & 0x3f) + 8 + beq .docopy + + ; marker2 - "Medium copy" +.domarker2: + lda (srcPointer),y + inc srcPointer + bne .noinc5 + inc srcPointer + 1 +.noinc5: + cmp #0 + beq .literal ; Single occurance of the marker symbol (rare) + tax + lsr + lsr + lsr + lsr + lsr + sta .offset + 1 + lda (srcPointer),y + inc srcPointer + bne .noinc6 + inc srcPointer + 1 +.noinc6: + clc + adc #8 + sta .offset + bcc .noinc7 + inc .offset + 1 ; offset = (((b & 0xe0) << 3) | b2) + 8 +.noinc7: + txa + and #$1f + tax + lda .LZG_LENGTH_DECODE_LUT,x + sta .length ; length = .LZG_LENGTH_DECODE_LUT[b & 0x1f] + bne .docopy + +.literal2: + jmp .literal + + ; marker1 - "Distant copy" +.domarker1b: + lda (srcPointer),y + inc srcPointer + bne .noinc8 + inc srcPointer + 1 +.noinc8: + cmp #0 + beq .literal2 ; Single occurance of the marker symbol (rare) + and #$1f + tax + lda .LZG_LENGTH_DECODE_LUT,x + sta .length ; length = .LZG_LENGTH_DECODE_LUT[b & 0x1f] + lda (srcPointer),y + inc srcPointer + bne .noinc9 + inc srcPointer + 1 +.noinc9: + sta .offset + 1 + lda (srcPointer),y + inc srcPointer + bne .noinc10 + inc srcPointer + 1 +.noinc10: + clc + adc #$08 + sta .offset + lda .offset + 1 + adc #$08 + sta .offset + 1 ; offset = ((b2 << 8) | (*src++)) + 2056 + + ; Copy corresponding data from history window +.docopy: + sec + lda dstPointer + sbc .offset + sta .copy + lda dstPointer + 1 + sbc .offset + 1 + sta .copy + 1 +.loop1: + lda (.copy),y + sta (dstPointer),y + iny + cpy .length + bne .loop1 + ldy #0 ; Make sure that Y is zero + + clc + lda dstPointer + adc .length + sta dstPointer + bcc .noinc11 + inc dstPointer + 1 +.noinc11: + jmp .mainloop + +; Lookup Table for decoding the copy length parameter +.LZG_LENGTH_DECODE_LUT + BYTE 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,35,48,72,128 + + + +