home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / vic20 / programming / ramdisk.asm < prev    next >
Encoding:
Assembly Source File  |  2002-04-27  |  6.1 KB  |  270 lines

  1. ;; cRUNCHED ram DISK DRIVER BY mARKO m{$e4}KEL{$e4}
  2. ;; bASED ON THE STAND-ALONE PUCRUNCH DECOMPRESSOR BY pASI oJALA
  3.  
  4. ;; tHIS FILE CAN BE ASSEMBLED WITH dasm 2.12.04.
  5.  
  6. ;; tHE GAME "cRUSH cRUMBLE AND cHOMP" IS LINKED AS FOLLOWS:
  7. ;; CCC.DATA:$1201-$1BFF
  8. ;; INIT:$1C01-$37EC (SLIGHTLY MODIFIED)
  9. ;; THIS PART:RIGHT AFTER INIT
  10.  
  11. ;; tHERE ARE THREE ENTRY POINTS IN THIS PROGRAM.
  12. ;; * tHE PUCRUNCH ENTRY IS FOR STARTING THE basic PROGRAM.
  13. ;; * "DECRUNCH" LOADS A MAP FILE TO $1201-$160F.
  14. ;; - tHE FILE NUMBER (1..4) IS IN $F7.
  15. ;; * "LOADCCC1" LOADS THE ACTUAL GAME FILE TO $1C01 AND STARTS IT.
  16.  
  17. PROCESSOR 6502
  18. ORG $37ed
  19.  
  20. LDA #91
  21. STA 1
  22. LDA #23
  23. STA 2; SET THE usr VECTOR
  24. LDA #1
  25. STA 649
  26. LDA #$1C
  27. STA $2C; SET THE START OF basic
  28. LDA #$54
  29. STA $2E; RELOCATE THE AREA FOR VARIABLES
  30. STA $30
  31. STA $32
  32. JSR $C659; CLR
  33. JMP $C7AE; RUN
  34.  
  35. ;; THE CRUNCHED FILES
  36. ;; CREATED WITH
  37. ;; PUCRUNCH -C0 $IN {$7c} \
  38. ;; PERL -E 'UNDEF $/;$_=<>;S/^..PU..(.)..(....)../$1$2/OS;PRINT' > $OUT
  39. BLOCK1INCBIN "NEW YORK CITY.CRUNCHED"
  40. BLOCK2INCBIN "GOLDEN GATE.CRUNCHED"
  41. BLOCK3INCBIN "WASHINGTON DC.CRUNCHED"
  42. BLOCK4INCBIN "TOKYO.CRUNCHED"
  43.  
  44. CCC1INCBIN "CCC1.CRUNCHED"; basic CODE RELOCATED FROM $1201 TO $1C01
  45.  
  46. ;; START ADDRESSES OF CRUNCHED DATA
  47. POSLDC.B <BLOCK1, <BLOCK2, <BLOCK3, <BLOCK4
  48. POSHDC.B >BLOCK1, >BLOCK2, >BLOCK3, >BLOCK4
  49.  
  50. lzposEQU $9E; 2 zEROpAGE TEMPORARIES
  51. TABLEEQU $200; rle TABLE
  52. BITSTREQU $F7
  53. ESCEQU $F8
  54. PRGTYPEEQU $F9
  55. outposEQU $FB
  56.  
  57. DECRUNCH; DECRUNCH A DATA FILE
  58. LDX #BLOCK_STACK_END-BLOCK_STACK_
  59. CPAUX$LDA BLOCK_STACK-1,X
  60. STA.WX BLOCK_STACK_-1,X
  61. DEX
  62. BNE CPAUX$
  63.  
  64. LDY $F7
  65. LDA POSL-1,Y
  66. STA inpos
  67. LDA POSH-1,Y
  68. STA inpos+1
  69.  
  70. DECRUNCHER
  71. JSR GETBYT
  72. STA ESC; STARTING ESCAPE
  73.  
  74. JSR GETBYT; READ # OF ESCAPE BITS
  75. STA ESCb0+1
  76. STA ESCb1+1
  77. LDA #8; c=1 AFTER GETBYT
  78. SEC
  79. SBC ESCb1+1
  80. STA NOESC+1; 8-ESCbITS
  81.  
  82. JSR GETBYT
  83. STA MG+1; MAXgAMMA + 1
  84. LDA #9; c=1 AFTER GETBYT
  85. SEC
  86. SBC MG+1; 8 - MAXgAMMA == (8 + 1) - (MAXgAMMA + 1)
  87. STA LONGRLE+1
  88. JSR GETBYT
  89. STA MG1+1; (1<<MAXgAMMA)
  90. ASL
  91. CLC
  92. SBC #0
  93. STA MG21+1; (2<<MAXgAMMA) - 1
  94. JSR GETBYT
  95. STA ELZPB+1; EXTRAlzpOSbITS
  96.  
  97. JSR GETBYT; RLEuSED
  98. LDX #0
  99. TAY
  100. BEQ DONE$; y == 0 ?
  101. CPRLE$JSR GETBYT
  102. STA TABLE,X; INITIALIZE THE rle TABLE
  103. INX
  104. DEY
  105. BNE CPRLE$
  106. DONE$LDA #$80
  107. STA BITSTR
  108. JMP MAIN
  109.  
  110. LOADCCC1
  111. LDX #BLOCK_STACK_END-BLOCK_STACK_
  112. CPAUX$LDA BLOCK_STACK-1,X
  113. STA.WX BLOCK_STACK_-1,X
  114. DEX
  115. BNE CPAUX$
  116. LDA #<CCC1
  117. STA inpos
  118. LDA #>CCC1
  119. STA inpos+1
  120. LDA #$1C
  121. STA outpos+1
  122. JSR DECRUNCHER
  123. JSR $C68E; STXPT
  124. JMP $C7AE; RUN
  125.  
  126. GETBYTJSR GETNEW
  127. LDA BITSTR
  128. ROR
  129. RTS
  130.  
  131. NEWESCLDY ESC; REMEMBER THE OLD CODE (TOP BITS FOR ESCAPED BYTE)
  132. ESCb0LDX #2; ** parameter0..8
  133. JSR GETCHKF; GET & SAVE THE NEW ESCAPE CODE
  134. STA ESC
  135. TYA; PRE-SET THE BITS
  136. ; fALL THROUGH AND GET THE REST OF THE BITS.
  137. NOESCLDX #6; ** parameter8..0
  138. JSR GETCHKF
  139. JSR PUTCH; OUTPUT THE ESCAPED/NORMAL BYTE
  140. ; fALL THROUGH AND CHECK THE ESCAPE BITS AGAIN
  141. MAINLDY #0; rESET TO A DEFINED STATE
  142. TYA; a = 0
  143. ESCb1LDX #2; ** parameter0..8
  144. JSR GETCHKF; x = 0
  145. CMP ESC
  146. BNE NOESC
  147. ; fALL THROUGH TO PACKED CODE
  148.  
  149. JSR GETVAL; x = 0
  150. STA lzpos; XSTORE - SAVE THE LENGTH FOR A LATER TIME
  151. LSR; CMP #1; len == 2 ? (a IS NEVER 0)
  152. BNE LZ77; len != 2-> lz77
  153. ;TYA; a = 0
  154.  
  155. JSR GETBIT; x = 0
  156. BCC LZ77_2; a=0 -> lzpos+1
  157. ; E..E01
  158. JSR GETBIT; x = 0
  159. BCC NEWESC; E..E010
  160. ; E..E011
  161. INY; y IS 1 BIGGER THAN msb LOOPS
  162. JSR GETVAL; y IS 1, GET LEN, x = 0
  163. STA lzpos; XSTORE - sAVE LENGTH lsb
  164. MG1CMP #64; ** parameter 63-64 -> c CLEAR, 64-64 -> c SET..
  165. BCC CHRCODE; SHORT rle, GET BYTECODE
  166.  
  167. LONGRLELDX #2; ** parameter111111XXXXXX
  168. JSR GETBITS; GET 3/2/1 MORE BITS TO GET A FULL BYTE, x = 0
  169. STA lzpos; XSTORE - sAVE LENGTH lsb
  170.  
  171. JSR GETVAL; LENGTH msb, x = 0
  172. TAY; y IS 1 BIGGER THAN msb LOOPS
  173.  
  174. CHRCODEJSR GETVAL; bYTE cODE, x = 0
  175. TAX; THIS IS EXECUTED MOST OF THE TIME ANYWAY
  176. LDA TABLE-1,X; sAVES ONE JUMP IF DONE HERE (LOSES ONE TXA)
  177.  
  178. CPX #32; 31-32 -> c CLEAR, 32-32 -> c SET..
  179. BCC 1$; 1..31, WE GOT THE RIGHT BYTE FROM THE TABLE
  180.  
  181. ; rANKS 32..64 (11111{CBM-A}XXXXX), GET BYTE..
  182. TXA; GET BACK THE VALUE (5 VALID BITS)
  183. LDX #3
  184. JSR GETBITS; GET 3 MORE BITS TO GET A FULL BYTE, x = 0
  185.  
  186. 1$LDX lzpos; XSTORE - GET LENGTH lsb
  187. INX; ADJUST FOR CPX#$FF;BNE -> BNE
  188. DORLEJSR PUTCH;+DEX
  189. BNE DORLE; XSTORE 0..255 -> 1..256
  190. DEY
  191. BNE DORLE; y WAS 1 BIGGER THAN WANTED ORIGINALLY
  192. MAINBEQBEQ MAIN; REVERSE CONDITION -> JUMP ALWAYS
  193.  
  194. LZ77JSR GETVAL; x = 0
  195. MG21CMP #127; ** parametercLEARS CARRY (IS MAXIMUM VALUE)
  196. BEQ GBEND
  197.  
  198. SBC #0; c IS CLEAR -> SUBTRACT 1  (1..126 -> 0..125)
  199. ELZPBLDX #0; ** parameter (MORE BITS TO GET)
  200. JSR GETCHKF; CLEARS cARRY, x = 0
  201.  
  202. LZ77_2STA lzpos+1; OFFSET msb
  203. LDX #8
  204. JSR GETBITS; CLEARS cARRY, x = 0
  205. ; nOTE: aLREADY EOR:ED IN THE COMPRESSOR..
  206. ;EOR #255; OFFSET lsb 2'S COMPLEMENT -1 (I.E. -x = {$7e}x+1)
  207. ADC outpos; -OFFSET -1 + CURPOS (c IS CLEAR)
  208. LDX lzpos; XSTORE = lzlen (READ BEFORE IT'S OVERWRITTEN)
  209.  
  210. STA lzpos
  211. LDA outpos+1
  212. SBC lzpos+1; TAKES c INTO ACCOUNT
  213. STA lzpos+1; COPY x+1 NUMBER OF CHARS FROM lzpos TO outpos
  214. ;LDY #0; y WAS 0 ORIGINALLY, WE DON'T CHANGE IT
  215.  
  216. INX; ADJUST FOR CPX#$FF;BNE -> BNE
  217. LZLOOPLDA (lzpos),Y; USING ABS,Y IS 3 BYTES LONGER, ONLY 1 CYCLE/BYTE FASTER
  218. INY; y DOES NOT WRAP BECAUSE x=0..255 AND y INITIALLY 0
  219. JSR PUTCH;+DEX
  220. BNE LZLOOP; x LOOPS, (256,1..255)
  221. BEQ MAINBEQ
  222.  
  223. GETBITASL BITSTR
  224. BNE GBEND
  225. GETNEWPHA
  226. inpos = .+1
  227. LDA $AAAA; ** parameter
  228. ;; XXXXXXXX 101YYYYY YYYYYYYY
  229. INC inpos
  230. BNE 0$
  231. INC inpos+1
  232. 0$ROL; sHIFT OUT THE NEXT BIT AND
  233. ; SHIFT IN c=1 (LAST BIT MARKER)
  234. STA BITSTR; BITSTR INITIAL VALUE = $80 == EMPTY
  235. PLA
  236. GBENDRTS
  237.  
  238. ; GETVAL : gETS A 'STATIC HUFFMAN CODED' VALUE
  239. ; ** sCRATCHES x, RETURNS THE VALUE IN a **
  240. GETVALINX; x <- 1
  241. TXA; SET THE TOP BIT (VALUE IS 1..255)
  242. GV0JSR GETBIT
  243. BCC GETCHK; GOT 0-BIT
  244. INX
  245. MGCPX #7; ** parameter UNARY CODE MAXIMUM LENGTH + 1
  246. BNE GV0
  247. BEQ GETCHK; INVERSE CONDITION -> JUMP ALWAYS
  248.  
  249. ; GETBITS: gETS x BITS FROM THE STREAM
  250. ; ** sCRATCHES x, RETURNS THE VALUE IN a **
  251. GETBITSJSR GETBIT
  252. ROL
  253. GETCHKDEX
  254. GETCHKFBNE GETBITS
  255. CLC
  256. RTS
  257.  
  258. BLOCK_STACK
  259. RORG $FA
  260. BLOCK_STACK_
  261.  
  262. PUTCHSTA $1201; ** PARAMETER outpos
  263. INC outpos; zp
  264. BNE 0$
  265. INC outpos+1; zp
  266. 0$DEX
  267. RTS
  268. BLOCK_STACK_END
  269. REND
  270.