home *** CD-ROM | disk | FTP | other *** search
- ;; cRUNCHED ram DISK DRIVER BY mARKO m{$e4}KEL{$e4}
- ;; bASED ON THE STAND-ALONE PUCRUNCH DECOMPRESSOR BY pASI oJALA
-
- ;; tHIS FILE CAN BE ASSEMBLED WITH dasm 2.12.04.
-
- ;; tHE GAME "cRUSH cRUMBLE AND cHOMP" IS LINKED AS FOLLOWS:
- ;; CCC.DATA:$1201-$1BFF
- ;; INIT:$1C01-$37EC (SLIGHTLY MODIFIED)
- ;; THIS PART:RIGHT AFTER INIT
-
- ;; tHERE ARE THREE ENTRY POINTS IN THIS PROGRAM.
- ;; * tHE PUCRUNCH ENTRY IS FOR STARTING THE basic PROGRAM.
- ;; * "DECRUNCH" LOADS A MAP FILE TO $1201-$160F.
- ;; - tHE FILE NUMBER (1..4) IS IN $F7.
- ;; * "LOADCCC1" LOADS THE ACTUAL GAME FILE TO $1C01 AND STARTS IT.
-
- PROCESSOR 6502
- ORG $37ed
-
- LDA #91
- STA 1
- LDA #23
- STA 2; SET THE usr VECTOR
- LDA #1
- STA 649
- LDA #$1C
- STA $2C; SET THE START OF basic
- LDA #$54
- STA $2E; RELOCATE THE AREA FOR VARIABLES
- STA $30
- STA $32
- JSR $C659; CLR
- JMP $C7AE; RUN
-
- ;; THE CRUNCHED FILES
- ;; CREATED WITH
- ;; PUCRUNCH -C0 $IN {$7c} \
- ;; PERL -E 'UNDEF $/;$_=<>;S/^..PU..(.)..(....)../$1$2/OS;PRINT' > $OUT
- BLOCK1INCBIN "NEW YORK CITY.CRUNCHED"
- BLOCK2INCBIN "GOLDEN GATE.CRUNCHED"
- BLOCK3INCBIN "WASHINGTON DC.CRUNCHED"
- BLOCK4INCBIN "TOKYO.CRUNCHED"
-
- CCC1INCBIN "CCC1.CRUNCHED"; basic CODE RELOCATED FROM $1201 TO $1C01
-
- ;; START ADDRESSES OF CRUNCHED DATA
- POSLDC.B <BLOCK1, <BLOCK2, <BLOCK3, <BLOCK4
- POSHDC.B >BLOCK1, >BLOCK2, >BLOCK3, >BLOCK4
-
- lzposEQU $9E; 2 zEROpAGE TEMPORARIES
- TABLEEQU $200; rle TABLE
- BITSTREQU $F7
- ESCEQU $F8
- PRGTYPEEQU $F9
- outposEQU $FB
-
- DECRUNCH; DECRUNCH A DATA FILE
- LDX #BLOCK_STACK_END-BLOCK_STACK_
- CPAUX$LDA BLOCK_STACK-1,X
- STA.WX BLOCK_STACK_-1,X
- DEX
- BNE CPAUX$
-
- LDY $F7
- LDA POSL-1,Y
- STA inpos
- LDA POSH-1,Y
- STA inpos+1
-
- DECRUNCHER
- JSR GETBYT
- STA ESC; STARTING ESCAPE
-
- JSR GETBYT; READ # OF ESCAPE BITS
- STA ESCb0+1
- STA ESCb1+1
- LDA #8; c=1 AFTER GETBYT
- SEC
- SBC ESCb1+1
- STA NOESC+1; 8-ESCbITS
-
- JSR GETBYT
- STA MG+1; MAXgAMMA + 1
- LDA #9; c=1 AFTER GETBYT
- SEC
- SBC MG+1; 8 - MAXgAMMA == (8 + 1) - (MAXgAMMA + 1)
- STA LONGRLE+1
- JSR GETBYT
- STA MG1+1; (1<<MAXgAMMA)
- ASL
- CLC
- SBC #0
- STA MG21+1; (2<<MAXgAMMA) - 1
- JSR GETBYT
- STA ELZPB+1; EXTRAlzpOSbITS
-
- JSR GETBYT; RLEuSED
- LDX #0
- TAY
- BEQ DONE$; y == 0 ?
- CPRLE$JSR GETBYT
- STA TABLE,X; INITIALIZE THE rle TABLE
- INX
- DEY
- BNE CPRLE$
- DONE$LDA #$80
- STA BITSTR
- JMP MAIN
-
- LOADCCC1
- LDX #BLOCK_STACK_END-BLOCK_STACK_
- CPAUX$LDA BLOCK_STACK-1,X
- STA.WX BLOCK_STACK_-1,X
- DEX
- BNE CPAUX$
- LDA #<CCC1
- STA inpos
- LDA #>CCC1
- STA inpos+1
- LDA #$1C
- STA outpos+1
- JSR DECRUNCHER
- JSR $C68E; STXPT
- JMP $C7AE; RUN
-
- GETBYTJSR GETNEW
- LDA BITSTR
- ROR
- RTS
-
- NEWESCLDY ESC; REMEMBER THE OLD CODE (TOP BITS FOR ESCAPED BYTE)
- ESCb0LDX #2; ** parameter0..8
- JSR GETCHKF; GET & SAVE THE NEW ESCAPE CODE
- STA ESC
- TYA; PRE-SET THE BITS
- ; fALL THROUGH AND GET THE REST OF THE BITS.
- NOESCLDX #6; ** parameter8..0
- JSR GETCHKF
- JSR PUTCH; OUTPUT THE ESCAPED/NORMAL BYTE
- ; fALL THROUGH AND CHECK THE ESCAPE BITS AGAIN
- MAINLDY #0; rESET TO A DEFINED STATE
- TYA; a = 0
- ESCb1LDX #2; ** parameter0..8
- JSR GETCHKF; x = 0
- CMP ESC
- BNE NOESC
- ; fALL THROUGH TO PACKED CODE
-
- JSR GETVAL; x = 0
- STA lzpos; XSTORE - SAVE THE LENGTH FOR A LATER TIME
- LSR; CMP #1; len == 2 ? (a IS NEVER 0)
- BNE LZ77; len != 2-> lz77
- ;TYA; a = 0
-
- JSR GETBIT; x = 0
- BCC LZ77_2; a=0 -> lzpos+1
- ; E..E01
- JSR GETBIT; x = 0
- BCC NEWESC; E..E010
- ; E..E011
- INY; y IS 1 BIGGER THAN msb LOOPS
- JSR GETVAL; y IS 1, GET LEN, x = 0
- STA lzpos; XSTORE - sAVE LENGTH lsb
- MG1CMP #64; ** parameter 63-64 -> c CLEAR, 64-64 -> c SET..
- BCC CHRCODE; SHORT rle, GET BYTECODE
-
- LONGRLELDX #2; ** parameter111111XXXXXX
- JSR GETBITS; GET 3/2/1 MORE BITS TO GET A FULL BYTE, x = 0
- STA lzpos; XSTORE - sAVE LENGTH lsb
-
- JSR GETVAL; LENGTH msb, x = 0
- TAY; y IS 1 BIGGER THAN msb LOOPS
-
- CHRCODEJSR GETVAL; bYTE cODE, x = 0
- TAX; THIS IS EXECUTED MOST OF THE TIME ANYWAY
- LDA TABLE-1,X; sAVES ONE JUMP IF DONE HERE (LOSES ONE TXA)
-
- CPX #32; 31-32 -> c CLEAR, 32-32 -> c SET..
- BCC 1$; 1..31, WE GOT THE RIGHT BYTE FROM THE TABLE
-
- ; rANKS 32..64 (11111{CBM-A}XXXXX), GET BYTE..
- TXA; GET BACK THE VALUE (5 VALID BITS)
- LDX #3
- JSR GETBITS; GET 3 MORE BITS TO GET A FULL BYTE, x = 0
-
- 1$LDX lzpos; XSTORE - GET LENGTH lsb
- INX; ADJUST FOR CPX#$FF;BNE -> BNE
- DORLEJSR PUTCH;+DEX
- BNE DORLE; XSTORE 0..255 -> 1..256
- DEY
- BNE DORLE; y WAS 1 BIGGER THAN WANTED ORIGINALLY
- MAINBEQBEQ MAIN; REVERSE CONDITION -> JUMP ALWAYS
-
- LZ77JSR GETVAL; x = 0
- MG21CMP #127; ** parametercLEARS CARRY (IS MAXIMUM VALUE)
- BEQ GBEND
-
- SBC #0; c IS CLEAR -> SUBTRACT 1 (1..126 -> 0..125)
- ELZPBLDX #0; ** parameter (MORE BITS TO GET)
- JSR GETCHKF; CLEARS cARRY, x = 0
-
- LZ77_2STA lzpos+1; OFFSET msb
- LDX #8
- JSR GETBITS; CLEARS cARRY, x = 0
- ; nOTE: aLREADY EOR:ED IN THE COMPRESSOR..
- ;EOR #255; OFFSET lsb 2'S COMPLEMENT -1 (I.E. -x = {$7e}x+1)
- ADC outpos; -OFFSET -1 + CURPOS (c IS CLEAR)
- LDX lzpos; XSTORE = lzlen (READ BEFORE IT'S OVERWRITTEN)
-
- STA lzpos
- LDA outpos+1
- SBC lzpos+1; TAKES c INTO ACCOUNT
- STA lzpos+1; COPY x+1 NUMBER OF CHARS FROM lzpos TO outpos
- ;LDY #0; y WAS 0 ORIGINALLY, WE DON'T CHANGE IT
-
- INX; ADJUST FOR CPX#$FF;BNE -> BNE
- LZLOOPLDA (lzpos),Y; USING ABS,Y IS 3 BYTES LONGER, ONLY 1 CYCLE/BYTE FASTER
- INY; y DOES NOT WRAP BECAUSE x=0..255 AND y INITIALLY 0
- JSR PUTCH;+DEX
- BNE LZLOOP; x LOOPS, (256,1..255)
- BEQ MAINBEQ
-
- GETBITASL BITSTR
- BNE GBEND
- GETNEWPHA
- inpos = .+1
- LDA $AAAA; ** parameter
- ;; XXXXXXXX 101YYYYY YYYYYYYY
- INC inpos
- BNE 0$
- INC inpos+1
- 0$ROL; sHIFT OUT THE NEXT BIT AND
- ; SHIFT IN c=1 (LAST BIT MARKER)
- STA BITSTR; BITSTR INITIAL VALUE = $80 == EMPTY
- PLA
- GBENDRTS
-
- ; GETVAL : gETS A 'STATIC HUFFMAN CODED' VALUE
- ; ** sCRATCHES x, RETURNS THE VALUE IN a **
- GETVALINX; x <- 1
- TXA; SET THE TOP BIT (VALUE IS 1..255)
- GV0JSR GETBIT
- BCC GETCHK; GOT 0-BIT
- INX
- MGCPX #7; ** parameter UNARY CODE MAXIMUM LENGTH + 1
- BNE GV0
- BEQ GETCHK; INVERSE CONDITION -> JUMP ALWAYS
-
- ; GETBITS: gETS x BITS FROM THE STREAM
- ; ** sCRATCHES x, RETURNS THE VALUE IN a **
- GETBITSJSR GETBIT
- ROL
- GETCHKDEX
- GETCHKFBNE GETBITS
- CLC
- RTS
-
- BLOCK_STACK
- RORG $FA
- BLOCK_STACK_
-
- PUTCHSTA $1201; ** PARAMETER outpos
- INC outpos; zp
- BNE 0$
- INC outpos+1; zp
- 0$DEX
- RTS
- BLOCK_STACK_END
- REND
-