Rev 344 | Details | Compare with Previous | Last modification | View Log
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 344 | alone | 1 | |
| 2 | ldirinpages;Z6542 |
||
| 3 | ;hl=откуда (логический адрес в буфере сохранения) |
||
| 4 | ;bc=сколько |
||
| 5 | ;TODO ускорить |
||
| 6 | LD A,C |
||
| 7 | OR B |
||
| 8 | RET Z ;TODO надо ли? |
||
| 9 | ;DI |
||
| 10 | ;CALL 8020 |
||
| 11 | ;JP C,_Z6545 |
||
| 12 | ; LD A,4 |
||
| 13 | ; CALL ON_BANK |
||
| 14 | ; JP START_1 |
||
| 15 | |||
| 16 | Z6546=$+1 ;сколько байт сохранить (это же текущий адрес в буфере, т.е. куда копировать) |
||
| 17 | LD DE,0 |
||
| 18 | |||
| 19 | if depkbuf |
||
| 20 | push bc |
||
| 21 | ld bc,depkbuf |
||
| 22 | add hl,bc |
||
| 23 | ex de,hl |
||
| 24 | add hl,bc |
||
| 25 | ex de,hl |
||
| 26 | pop bc |
||
| 27 | ldirinpages0 |
||
| 28 | ld a,(hl) |
||
| 29 | CALL CRC32_ |
||
| 30 | ldi |
||
| 31 | jp pe,ldirinpages0 |
||
| 32 | ld hl,-depkbuf |
||
| 33 | add hl,de |
||
| 34 | ld (Z6546),hl |
||
| 35 | ret |
||
| 36 | ;bit 7,h |
||
| 37 | ;ret z |
||
| 38 | ;jp saveblock ;save whole buffer |
||
| 39 | |||
| 40 | else |
||
| 41 | |||
| 42 | PUSH HL,DE |
||
| 43 | LD A,D |
||
| 44 | LD (SAVED+1),A |
||
| 45 | LD A,H |
||
| 46 | LD (SAVEH+1),A |
||
| 47 | |||
| 48 | if depkbuf |
||
| 49 | add a,depkbuf/256 |
||
| 50 | LD H,A |
||
| 51 | else |
||
| 52 | RLCA |
||
| 53 | RLCA |
||
| 54 | AND 3 |
||
| 55 | LD (BANKH+1),A |
||
| 56 | CALL ON_BANK |
||
| 57 | LD A,H |
||
| 58 | OR #C0 |
||
| 59 | LD H,A |
||
| 60 | endif |
||
| 61 | |||
| 62 | LD (ADRH+1),HL |
||
| 63 | LD A,(HL) |
||
| 64 | EXA |
||
| 65 | LD A,D |
||
| 66 | |||
| 67 | if depkbuf |
||
| 68 | add a,depkbuf/256 |
||
| 69 | LD D,A |
||
| 70 | else |
||
| 71 | RLCA |
||
| 72 | RLCA |
||
| 73 | AND 3 |
||
| 74 | LD (BANKD+1),A |
||
| 75 | CALL ON_BANK |
||
| 76 | LD A,D |
||
| 77 | OR #C0 |
||
| 78 | LD D,A |
||
| 79 | endif |
||
| 80 | |||
| 81 | LD (ADRD+1),DE |
||
| 82 | EXA |
||
| 83 | LD (DE),A |
||
| 84 | CALL CRC32_ |
||
| 85 | POP DE,HL |
||
| 86 | INC DE |
||
| 87 | LD A,D |
||
| 88 | INC A |
||
| 89 | JR Z,SV1 |
||
| 90 | WOZW1 CPI |
||
| 91 | JP PO,AFN5 |
||
| 92 | ADRH LD HL,0 |
||
| 93 | ADRD LD DE,0 |
||
| 94 | AFN2 INC L |
||
| 95 | JR Z,SAVEH |
||
| 96 | AFN1 INC E |
||
| 97 | JR Z,SAVED |
||
| 98 | AFN3 LD A,B |
||
| 99 | OR C |
||
| 100 | JR Z,AFN4 |
||
| 101 | |||
| 102 | if depkbuf==0 |
||
| 103 | BANKH LD A,0 |
||
| 104 | CALL ON_BANK |
||
| 105 | endif |
||
| 106 | |||
| 107 | LD A,(HL) |
||
| 108 | |||
| 109 | if depkbuf==0 |
||
| 110 | EXA |
||
| 111 | BANKD LD A,0 |
||
| 112 | CALL ON_BANK |
||
| 113 | EXA |
||
| 114 | endif |
||
| 115 | |||
| 116 | LD (DE),A |
||
| 117 | CALL CRC32_ |
||
| 118 | DEC BC |
||
| 119 | JP AFN2 |
||
| 120 | |||
| 121 | SAVEH LD A,0 |
||
| 122 | INC A,A |
||
| 123 | JR Z,$+3 |
||
| 124 | DEC A |
||
| 125 | LD H,A |
||
| 126 | LD (SAVEH+1),A |
||
| 127 | |||
| 128 | if depkbuf==0 |
||
| 129 | RLCA |
||
| 130 | RLCA |
||
| 131 | AND 3 |
||
| 132 | LD (BANKH+1),A |
||
| 133 | LD A,H |
||
| 134 | OR #C0 |
||
| 135 | LD H,A |
||
| 136 | endif |
||
| 137 | JR AFN1 |
||
| 138 | |||
| 139 | SAVED LD A,0 |
||
| 140 | INC A |
||
| 141 | LD D,A |
||
| 142 | if buf64k |
||
| 143 | INC A |
||
| 144 | else |
||
| 145 | cp 0x80 |
||
| 146 | endif |
||
| 147 | JR Z,SV2 ;save whole buffer |
||
| 148 | WOZWR2 LD A,D |
||
| 149 | LD (SAVED+1),A |
||
| 150 | |||
| 151 | if depkbuf==0 |
||
| 152 | RLCA |
||
| 153 | RLCA |
||
| 154 | AND 3 |
||
| 155 | LD (BANKD+1),A |
||
| 156 | LD A,D |
||
| 157 | OR #C0 |
||
| 158 | LD D,A |
||
| 159 | endif |
||
| 160 | LD (ADRD+2),A |
||
| 161 | JR AFN3 |
||
| 162 | |||
| 163 | AFN4 LD A,(SAVED+1) |
||
| 164 | LD D,A |
||
| 165 | AFN5 LD (Z6546),DE ;сколько байт сохранить |
||
| 166 | ret |
||
| 167 | ;LD A,4 |
||
| 168 | ;CALL ON_BANK |
||
| 169 | ;CALL COUNT ;процентомер? |
||
| 170 | ;LD A,5 |
||
| 171 | ;JP ON_BANK |
||
| 172 | |||
| 173 | SV1 CALL SV0 |
||
| 174 | LD A,D |
||
| 175 | DEC A |
||
| 176 | LD (SAVED+1),A |
||
| 177 | |||
| 178 | if depkbuf==0 |
||
| 179 | RLCA |
||
| 180 | RLCA |
||
| 181 | AND 3 |
||
| 182 | LD (BANKD+1),A |
||
| 183 | LD A,D |
||
| 184 | OR #C0 |
||
| 185 | LD D,A |
||
| 186 | endif |
||
| 187 | LD (ADRD+2),A |
||
| 188 | LD E,-1 ;на случай выхода в AFN5 |
||
| 189 | JP WOZW1 |
||
| 190 | |||
| 191 | SV2 CALL SV0 |
||
| 192 | JR WOZWR2 |
||
| 193 | |||
| 194 | SV0 LD (Z6546),DE ;сколько байт сохранить |
||
| 195 | ;LD A,5 |
||
| 196 | ;CALL ON_BANK |
||
| 197 | CALL saveblock ;save whole buffer |
||
| 198 | LD DE,(Z6546) ;сколько байт сохранить (=0?) |
||
| 199 | RET |
||
| 200 | |||
| 201 | endif |
||
| 202 | |||
| 203 | ;запись одного байта в память + обновление CRC32 + при необходимости сохранение |
||
| 204 | SBYTE |
||
| 205 | ;a=byte |
||
| 206 | PUSH HL |
||
| 207 | LD HL,(Z6546) ;сколько байт сохранить (он же текущий адрес, куда писать) |
||
| 208 | PUSH HL |
||
| 209 | |||
| 210 | if depkbuf |
||
| 211 | exa |
||
| 212 | ld a,h |
||
| 213 | add a,depkbuf/256 |
||
| 214 | ld h,a |
||
| 215 | exa |
||
| 216 | else |
||
| 217 | EXA |
||
| 218 | LD A,H |
||
| 219 | RLCA |
||
| 220 | RLCA |
||
| 221 | AND 3 |
||
| 222 | CALL ON_BANK |
||
| 223 | LD A,H |
||
| 224 | OR #C0 |
||
| 225 | LD H,A |
||
| 226 | EXA |
||
| 227 | endif |
||
| 228 | LD (HL),A |
||
| 229 | CALL CRC32_ |
||
| 230 | POP HL |
||
| 231 | INC HL |
||
| 232 | ;LD A,H |
||
| 233 | ;AND A |
||
| 234 | ;JR NZ,CON2 |
||
| 235 | ;LD A,L |
||
| 236 | ;CP #11 |
||
| 237 | ;CALL Z,HOBETA1 |
||
| 238 | ;CON2 |
||
| 239 | LD (Z6546),HL ;сколько байт сохранить |
||
| 240 | ;LD A,5 |
||
| 241 | ;CALL ON_BANK |
||
| 242 | LD A,H |
||
| 243 | if buf64k |
||
| 244 | INC A |
||
| 245 | else |
||
| 246 | cp 0x80 |
||
| 247 | endif |
||
| 248 | POP HL |
||
| 249 | RET NZ |
||
| 250 | |||
| 251 | jp saveblock |
||
| 252 | |||
| 253 | |||
| 254 | |||
| 255 | ;ИНИЦИАЛИЗАЦИЯ ДЕПAKEPA |
||
| 256 | initdepk=initCRC;Z6629 |
||
| 257 | |||
| 258 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
| 259 | |||
| 260 | ;метод store |
||
| 261 | ZD102 |
||
| 262 | LD A,B |
||
| 263 | CP 8 |
||
| 264 | CALL NZ,read_a_bits |
||
| 265 | EX DE,HL ;??? (hl=0x802b) длина блока |
||
| 266 | CALL readbyte_d |
||
| 267 | LD E,D |
||
| 268 | CALL readbyte_d ;??? (de=0x7fd4) |
||
| 269 | LD A,D |
||
| 270 | XOR H |
||
| 271 | LD D,A |
||
| 272 | LD A,E |
||
| 273 | XOR L |
||
| 274 | AND D |
||
| 275 | INC A |
||
| 276 | call NZ,depkqerror ;save whole buffer и выйти |
||
| 277 | ;CALL readbyte_d |
||
| 278 | EX DE,HL |
||
| 279 | |||
| 280 | ;ZD11F=$+1 |
||
| 281 | ;LD HL,0 |
||
| 282 | |||
| 283 | ;DEC HL |
||
| 284 | _ZD122 |
||
| 285 | ;LD A,(HL) |
||
| 286 | ;INC HL |
||
| 287 | ;push hl |
||
| 288 | ;LD HL,(Z6546) |
||
| 289 | ;bit 7,h |
||
| 290 | ;jr nz,$ |
||
| 291 | ;pop hl |
||
| 292 | ziprdbyte |
||
| 293 | CALL SBYTE ;запись одного байта в память + обновление CRC32 + при необходимости сохранение |
||
| 294 | ;PUSH HL |
||
| 295 | ;LD BC,#4001 |
||
| 296 | ;ADD HL,BC |
||
| 297 | ;POP HL |
||
| 298 | ;JR NC,ZD135 |
||
| 299 | ;CALL LBLOKZIP |
||
| 300 | ;LD HL,BUFER |
||
| 301 | ;ZD135 |
||
| 302 | DEC DE |
||
| 303 | LD A,D |
||
| 304 | OR E |
||
| 305 | JR NZ,_ZD122 |
||
| 306 | ;LD (ZD11F),HL |
||
| 307 | POP DE ;снимаем адрес возврата |
||
| 308 | JR _ZD14D ;читаем следующий блок |
||
| 309 | |||
| 310 | ;ZD140 |
||
| 311 | INFLATING |
||
| 312 | ;init read buffer, inflate file |
||
| 313 | XOR A |
||
| 314 | LD (_ZD159),A ;не последний блок |
||
| 315 | ;CALL LBLOKZIP |
||
| 316 | ;LD HL,0 |
||
| 317 | ; LD (U6546),HL ;сколько байт сохранить = текущий адрес в буфере |
||
| 318 | _ZD14D |
||
| 319 | ;LD HL,(ZD11F) |
||
| 320 | ;LD E,(HL) |
||
| 321 | ;INC HL |
||
| 322 | ;LD (ZD11F),HL |
||
| 323 | ziprdbyte |
||
| 324 | ld e,a |
||
| 325 | CALL readbyte_d ;установит b=8 |
||
| 326 | |||
| 327 | _ZD158 ;сюда попадаем по коду 256 (end of block) |
||
| 328 | ;push hl |
||
| 329 | ;ld hl,(Z6546) |
||
| 330 | ;jr $ |
||
| 331 | ;pop hl |
||
| 332 | _ZD159=$+1 |
||
| 333 | LD A,0 ;1 = был последний блок |
||
| 334 | OR A |
||
| 335 | jp NZ,savelastblock ;save (U6546) bytes, выход |
||
| 336 | CALL readbit_de ;1 = last block, 0 = not last block |
||
| 337 | LD HL,_ZD159 ;см. выше |
||
| 338 | RR (HL) |
||
| 339 | CALL readtrees;ZD2E4 |
||
| 340 | _ZD168 |
||
| 341 | ;push de |
||
| 342 | ;push hl |
||
| 343 | ;LD HL,(Z6546) |
||
| 344 | ;bit 7,h |
||
| 345 | ;jr nz,$ ;почему-то не попадаем сюда |
||
| 346 | ;ld hl,(Z6546) |
||
| 347 | ;ld de,0x53c7;0x546f |
||
| 348 | ;or a |
||
| 349 | ;sbc hl,de |
||
| 350 | ;jr nc,$ |
||
| 351 | ;pop hl |
||
| 352 | ;pop de |
||
| 353 | CALL readcodetree1 ;out: hl=code |
||
| 354 | ;jr $ |
||
| 355 | LD A,H |
||
| 356 | OR A |
||
| 357 | JR NZ,_ZD175 ;если код - не байт |
||
| 358 | LD A,L ;байт |
||
| 359 | CALL SBYTE ;запись одного байта в память + обновление CRC32 + при необходимости сохранение |
||
| 360 | JR _ZD168 |
||
| 361 | _ZD175 DEC A |
||
| 362 | OR L |
||
| 363 | ;256: end of block - stop processing if last block, otherwise start processing next block. |
||
| 364 | ;257-285: combined with extra-bits, a match length of 3-258 bytes. |
||
| 365 | ;286, 287: not used, reserved and illegal but still part of the tree. |
||
| 366 | ;jr z,$ ;не доходим сюда на adv 1,2, а в adv3 его нет в первом блоке |
||
| 367 | ;push hl |
||
| 368 | ;LD HL,(Z6546) |
||
| 369 | ;pop hl |
||
| 370 | JR Z,_ZD158 ;если 256 (end of block), то назад на чтение заголовка блока и деревьев |
||
| 371 | ;jr $ |
||
| 372 | |||
| 373 | DEC H |
||
| 374 | INC HL,HL |
||
| 375 | PUSH HL ;2+(код-256) = сколько |
||
| 376 | CALL readcodetree2 ;distance |
||
| 377 | INC HL |
||
| 378 | POP AF |
||
| 379 | PUSH BC,DE,AF |
||
| 380 | POP BC ;2+(код-256) = сколько |
||
| 381 | EX DE,HL ;de=код по tree2 (расстояние?) |
||
| 382 | LD HL,(U6546) ;сколько байт сохранить = текущий адрес в буфере |
||
| 383 | OR A |
||
| 384 | SBC HL,DE |
||
| 385 | JR NC,_ZD1B5 ;расстояние умещается внутри несохранённого блока? |
||
| 386 | EX DE,HL ;de = -сколько байт не хватает? |
||
| 387 | LD HL,0 |
||
| 388 | OR A |
||
| 389 | SBC HL,DE ;сколько байт не хватает? |
||
| 390 | PUSH HL |
||
| 391 | LD HL,#2121 |
||
| 392 | TD198=$-2 ;сколько байт сохраняли в прошлый раз |
||
| 393 | ADD HL,DE ;hl = сколько байт сохраняли - сколько байт не хватает? (получается адрес в прошлом буфере?) |
||
| 394 | POP DE |
||
| 395 | EX DE,HL ;de=адрес в прошлом буфере?, hl=сколько байт не хватает? |
||
| 396 | PUSH HL ;сколько байт не хватает? |
||
| 397 | CP A |
||
| 398 | SBC HL,BC ;NC=блок не пересекает границу старого и нового буферов (сколько байт не хватает >= сколько) |
||
| 399 | POP HL ;сколько байт не хватает? |
||
| 400 | EX DE,HL |
||
| 401 | JR NC,_ZD1B5 ;если блок не пересекает границу старого и нового буферов, то откуда = адрес в прошлом буфере? |
||
| 402 | EX DE,HL |
||
| 403 | PUSH BC |
||
| 404 | EX (SP),HL |
||
| 405 | POP BC ;hl=сколько, bc=сколько байт не хватает? |
||
| 406 | AND A |
||
| 407 | SBC HL,BC |
||
| 408 | PUSH HL ;сколько-сколько байт не хватает |
||
| 409 | EX DE,HL ;hl=адрес в прошлом буфере, bc=сколько байт не хватает? |
||
| 410 | CALL ldirinpages ;скопировали первый кусок в текущий адрес в буфере ;TODO разрезать на 2 части при пересечении 32К |
||
| 411 | LD HL,0 ;продолжение будем копировать из начала нового буфера |
||
| 412 | POP BC ;длина продолжения (сколько-сколько байт не хватает) |
||
| 413 | ;TODO сделать настоящее скользящее окно 32К, т.к. Relative back-references can be made across any number of blocks, as long as the distance appears within the last 32 KiB of uncompressed data decoded (termed the sliding window) |
||
| 414 | _ZD1B5 |
||
| 415 | ;hl = откуда (логический адрес в буфере) |
||
| 416 | ;bc = сколько |
||
| 417 | CALL ldirinpages ;копируем в текущий адрес в буфере ;TODO разрезать на 2 части при пересечении 32К |
||
| 418 | LD A,(Z6546+1) ;(Z6546) = сколько байт сохранить = текущий адрес в буфере |
||
| 419 | if buf64k |
||
| 420 | CP -1 |
||
| 421 | else |
||
| 422 | CP 0x80 |
||
| 423 | endif |
||
| 424 | CALL NC,saveblock ;save whole buffer ;буфер на [64K]32K, надо сохранить и создать новый буфер ;TODO зациклить окно |
||
| 425 | POP DE |
||
| 426 | POP BC |
||
| 427 | JR _ZD168 ;читаем следующий код |
||
| 428 | |||
| 429 | ;? |
||
| 430 | ;DS 10 |
||
| 431 | ;какие-то стандартные длины кодов |
||
| 432 | ;256: end of block - stop processing if last block, otherwise start processing next block. |
||
| 433 | ;257-285: combined with extra-bits, a match length of 3-258 bytes. |
||
| 434 | ;286, 287: not used, reserved and illegal but still part of the tree. |
||
| 435 | ;TODO почему тут всего 19 стандартных длин, а не 28? |
||
| 436 | TD1EE db #10,#11 |
||
| 437 | db #12,0 |
||
| 438 | db 8,7 |
||
| 439 | db 9,6 |
||
| 440 | db #A,5 |
||
| 441 | db #B,4 |
||
| 442 | db #C,3 |
||
| 443 | db #D,2 |
||
| 444 | db #E,1 |
||
| 445 | db #F ;,1 ;#F заходил на следующий сегмент, а 1 был частью TD201 ;читается максимум 19 байт, т.е. до #F включительно (в gunzip нет 1) |
||
| 446 | |||
| 447 | align 256 |
||
| 448 | db 0 ;чтобы на 1 байт позже |
||
| 449 | TD201 DB 1,3,7,#F,#1F,#3F,#7F,-1 ;маски |
||
| 450 | ;? |
||
| 451 | TD209 DS 34;70 ;туда пишется 32 байта (2-байтные счётчики, сколько раз встретилась каждая длина кода 0..15) |
||
| 452 | TD22B ds 70-34 ;с #xx2d лежат 2-байтные начальные коды для каждой длины кода (1..15) |
||
| 453 | |||
| 454 | get_a_bits_tohl;ZD24F |
||
| 455 | CP 9 |
||
| 456 | JR C,_ZD262 |
||
| 457 | SUB 8 |
||
| 458 | LD H,A |
||
| 459 | LD A,8 |
||
| 460 | CALL get_a_bits |
||
| 461 | LD L,A |
||
| 462 | LD A,H |
||
| 463 | CALL get_a_bits |
||
| 464 | LD H,A |
||
| 465 | RET |
||
| 466 | _ZD262 CALL get_a_bits |
||
| 467 | LD H,0 |
||
| 468 | LD L,A |
||
| 469 | RET |
||
| 470 | |||
| 471 | get_a_bits;ZD269 |
||
| 472 | ;a=число бит, b=число бит d в наличии, de=данные в наличии |
||
| 473 | ;out: a=число из e (младшие биты по маске количества бит) |
||
| 474 | LD (_ZD26E),A |
||
| 475 | EXA |
||
| 476 | _ZD26E=$+1 |
||
| 477 | LD A,(TD201) ;a=маска 0x01,0x03,0x07...0xff (для 1,2,3...8) |
||
| 478 | AND E |
||
| 479 | PUSH AF |
||
| 480 | EXA |
||
| 481 | CALL read_a_bits |
||
| 482 | POP AF |
||
| 483 | RET |
||
| 484 | |||
| 485 | readbit_de;ZD278 |
||
| 486 | ;"читать бит" (текущие биты в de, b=число верных битов d) |
||
| 487 | ;out: CY=вылетевший младший бит de |
||
| 488 | SRL D |
||
| 489 | RR E |
||
| 490 | DEC B |
||
| 491 | RET NZ |
||
| 492 | readbyte_d;ZD27E |
||
| 493 | ;читать байт в d, установить b=8 |
||
| 494 | ;TODO макрос и без push af |
||
| 495 | PUSH AF |
||
| 496 | ;push HL |
||
| 497 | ;push BC |
||
| 498 | ;LD HL,(ZD11F) |
||
| 499 | ;LD BC,#4001 |
||
| 500 | ;ADD HL,BC |
||
| 501 | ;POP BC |
||
| 502 | ;CALL C,LBLOKZIP |
||
| 503 | ;LD HL,(ZD11F) |
||
| 504 | ;LD D,(HL) |
||
| 505 | ;INC HL |
||
| 506 | ;LD (ZD11F),HL |
||
| 507 | ziprdbyte |
||
| 508 | ld d,a |
||
| 509 | LD B,8 |
||
| 510 | ;POP HL |
||
| 511 | pop AF |
||
| 512 | RET |
||
| 513 | |||
| 514 | ;a=число бит (бывает 8) |
||
| 515 | ;b=число бит d в наличии |
||
| 516 | ;de=имеющиеся данные (e - самые старые) |
||
| 517 | read_a_bits;ZD299 |
||
| 518 | CP B ;сколько бит в d |
||
| 519 | JR C,_ZD2A6 ;в d достаточно бит |
||
| 520 | _ZD29C SRL D |
||
| 521 | RR E |
||
| 522 | DEC A |
||
| 523 | DJNZ _ZD29C |
||
| 524 | CALL readbyte_d |
||
| 525 | ;теперь в d имеется 8 бит, b=8, a уменьшено на сколько имелось бит |
||
| 526 | _ZD2A6 OR A |
||
| 527 | RET Z ;выходим, когда прочитали нужное количество бит |
||
| 528 | SRL D |
||
| 529 | RR E |
||
| 530 | DEC A |
||
| 531 | DJNZ _ZD2A6 |
||
| 532 | ;сюда можно попасть только при a >= 8+сколько имелось бит |
||
| 533 | ;строим деревья по умолчанию (коды 0..127 по 8 бит, 128..255 по 9 бит и т.д.) |
||
| 534 | ;b=0 |
||
| 535 | ;a=сколько бит не хватило (может быть 0) |
||
| 536 | _ZD2AF PUSH BC,DE |
||
| 537 | LD HL,ziptrees ;длины кодов первого дерева? |
||
| 538 | LD BC,#9008 |
||
| 539 | _ZD2B7 LD (HL),C |
||
| 540 | INC HL |
||
| 541 | DJNZ _ZD2B7 |
||
| 542 | LD BC,#7009 ;...продолжение |
||
| 543 | _ZD2BE LD (HL),C |
||
| 544 | INC HL |
||
| 545 | DJNZ _ZD2BE |
||
| 546 | LD BC,#1807 |
||
| 547 | _ZD2C5 LD (HL),C |
||
| 548 | INC HL |
||
| 549 | DJNZ _ZD2C5 |
||
| 550 | LD BC,#808 |
||
| 551 | _ZD2CC LD (HL),C |
||
| 552 | INC HL |
||
| 553 | DJNZ _ZD2CC |
||
| 554 | LD HL,ziptrees+#140 ;длины кодов второго дерева? |
||
| 555 | LD BC,#2005 |
||
| 556 | LD A,B ;32 |
||
| 557 | _ZD2D7 LD (HL),C |
||
| 558 | INC HL |
||
| 559 | DJNZ _ZD2D7 |
||
| 560 | LD (ZD3C8),A ;число кодов второго дерева? |
||
| 561 | LD (ZD3B8),A ;число кодов первого дерева (-256)? |
||
| 562 | JP gentrees;ZD3B7 ;построить 2 дерева? |
||
| 563 | |||
| 564 | readtrees;ZD2E4 |
||
| 565 | LD A,2 |
||
| 566 | CALL get_a_bits ;читаем метод |
||
| 567 | DEC A |
||
| 568 | JP M,ZD102 ;00 = stored/raw/literal section, between 0 and 65,535 bytes in length |
||
| 569 | JR Z,_ZD2AF ;01 = static Huffman compressed block, using a pre-agreed Huffman tree |
||
| 570 | DEC A |
||
| 571 | call NZ,depkqerror ;11 = ошибка, save whole buffer и выйти |
||
| 572 | ;10 = compressed block complete with the Huffman table supplied |
||
| 573 | LD A,5 |
||
| 574 | CALL get_a_bits |
||
| 575 | INC A |
||
| 576 | LD (ZD3B8),A ;число кодов первого дерева (-256) |
||
| 577 | LD A,5 |
||
| 578 | CALL get_a_bits |
||
| 579 | INC A |
||
| 580 | LD (ZD3C8),A ;число кодов второго дерева |
||
| 581 | LD HL,ziptrees+#560 ;почему сюда кладутся длины кодов??? TODO |
||
| 582 | LD A,#13 |
||
| 583 | _ZD30A LD (HL),0 |
||
| 584 | INC HL |
||
| 585 | DEC A |
||
| 586 | JR NZ,_ZD30A |
||
| 587 | LD A,4 |
||
| 588 | CALL get_a_bits |
||
| 589 | ADD A,4 ;4..19 кодов |
||
| 590 | LD C,A |
||
| 591 | LD HL,TD1EE |
||
| 592 | _ZD31B LD A,3 |
||
| 593 | CALL get_a_bits |
||
| 594 | PUSH DE |
||
| 595 | LD E,(HL) |
||
| 596 | LD D,0 |
||
| 597 | PUSH HL |
||
| 598 | LD HL,ziptrees+#560 ;почему сюда кладутся длины кодов??? TODO |
||
| 599 | ADD HL,DE |
||
| 600 | LD (HL),A |
||
| 601 | POP HL,DE |
||
| 602 | INC HL |
||
| 603 | DEC C |
||
| 604 | JR NZ,_ZD31B |
||
| 605 | PUSH BC |
||
| 606 | push DE |
||
| 607 | LD HL,ziptrees+#160 ;там будет лежать первое дерево |
||
| 608 | LD DE,ziptrees+#560 ;почему отсюда берутся длины кодов??? TODO |
||
| 609 | LD BC,#13 |
||
| 610 | CALL gentree |
||
| 611 | LD HL,(ZD3B8) ;число кодов первого дерева |
||
| 612 | LD DE,(ZD3C8) ;число кодов второго дерева |
||
| 613 | ADD HL,DE |
||
| 614 | DEC HL |
||
| 615 | POP DE |
||
| 616 | pop BC |
||
| 617 | LD IX,ziptrees ;длины кодов первого дерева (реально прочитаем оба (там место с запасом), потом перебросим остаток длин) |
||
| 618 | ZD34D PUSH HL,DE |
||
| 619 | LD D,0 |
||
| 620 | LD HL,ziptrees+#160 ;первое дерево |
||
| 621 | ADD HL,DE |
||
| 622 | ADD HL,DE |
||
| 623 | LD E,(HL) |
||
| 624 | LD HL,ziptrees+#560 ;длины кодов??? |
||
| 625 | ADD HL,DE |
||
| 626 | LD A,(HL) |
||
| 627 | LD C,E |
||
| 628 | POP DE |
||
| 629 | CALL read_a_bits |
||
| 630 | LD A,C |
||
| 631 | POP HL |
||
| 632 | CP #10 |
||
| 633 | JR NC,ZD36C |
||
| 634 | ;< #10: это будет длина кода, пишем её |
||
| 635 | LD C,A ;длина кода? |
||
| 636 | LD A,1 ;число повторов |
||
| 637 | JR _ZD390 |
||
| 638 | |||
| 639 | ZD36C JR NZ,ZD37A |
||
| 640 | ;= #10: пишем 3..6 предыдущих длин |
||
| 641 | LD A,2 |
||
| 642 | CALL get_a_bits |
||
| 643 | ADD A,3 ;число повторов |
||
| 644 | LD C,(IX-1) ;длина кода? |
||
| 645 | JR _ZD390 |
||
| 646 | |||
| 647 | ZD37A CP #11 |
||
| 648 | JR NZ,_ZD387 |
||
| 649 | ;= #11: пишем 3..10 длин 0 |
||
| 650 | LD A,3 |
||
| 651 | CALL get_a_bits |
||
| 652 | ADD A,3 |
||
| 653 | JR _ZD38E |
||
| 654 | |||
| 655 | _ZD387 |
||
| 656 | ;> #11: пишем 11..138 длин 0 |
||
| 657 | LD A,7 |
||
| 658 | CALL get_a_bits |
||
| 659 | ADD A,#B ;число повторов |
||
| 660 | _ZD38E LD C,0 |
||
| 661 | _ZD390 LD (IX),C ;длина кода |
||
| 662 | INC IX |
||
| 663 | DEC A |
||
| 664 | DEC HL |
||
| 665 | JR Z,ZD3A0 |
||
| 666 | BIT 7,H |
||
| 667 | call NZ,depkqerror ;save whole buffer и выйти |
||
| 668 | JR _ZD390 |
||
| 669 | |||
| 670 | ZD3A0 BIT 7,H |
||
| 671 | JR Z,ZD34D |
||
| 672 | PUSH BC |
||
| 673 | push DE |
||
| 674 | LD HL,ziptrees ;длины кодов первого дерева |
||
| 675 | LD DE,(ZD3B8) ;число кодов первого дерева |
||
| 676 | ADD HL,DE |
||
| 677 | LD DE,ziptrees+#140 ;длины кодов второго дерева |
||
| 678 | LD BC,(ZD3C8) ;число кодов второго дерева |
||
| 679 | LDIR ;TODO lddr и убрать запас после ziptrees, или предавать указатель на длины кодов второго дерева в gentrees |
||
| 680 | |||
| 681 | gentrees;ZD3B7 |
||
| 682 | ;на стеке de,bc |
||
| 683 | ZD3B8=$+1 ;пишется 1 байт |
||
| 684 | LD BC,#100 ;число кодов первого дерева |
||
| 685 | LD DE,ziptrees ;длины кодов первого дерева |
||
| 686 | LD HL,ziptrees+#160 ;там будет лежать первое дерево |
||
| 687 | LD IX,ziptrees+#560 |
||
| 688 | CALL gentree |
||
| 689 | ZD3C8=$+1 |
||
| 690 | LD BC,0 ;число кодов второго дерева ;обычно 32 |
||
| 691 | LD DE,ziptrees+#140 ;длины кодов второго дерева |
||
| 692 | LD HL,ziptrees+#360 ;там будет лежать второе дерево |
||
| 693 | LD IX,ziptrees+#9E0 |
||
| 694 | CALL gentree |
||
| 695 | POP DE |
||
| 696 | pop BC |
||
| 697 | RET |
||
| 698 | |||
| 699 | ;построение дерева |
||
| 700 | ;de=длины кодов |
||
| 701 | ;hl=адрес, где будет лежать дерево |
||
| 702 | ;ix=? (записывается в (ZD523) - что-то для кодов длиннее 8) |
||
| 703 | ;bc=число кодов = #100+(ZD3B8) для первого дерева, (ZD3C8) для второго (обычно 32) |
||
| 704 | gentree;ZD3DA |
||
| 705 | LD A,B |
||
| 706 | OR C |
||
| 707 | RET Z |
||
| 708 | LD (ZD443),BC ;число кодов |
||
| 709 | LD (ZD4A9),HL |
||
| 710 | |||
| 711 | ;очищаем, сколько раз встретились коды каждой длины (0..15) |
||
| 712 | LD HL,TD209 |
||
| 713 | PUSH HL |
||
| 714 | push BC |
||
| 715 | LD BC,#2000 |
||
| 716 | _ZD3EC LD (HL),C;0 |
||
| 717 | INC HL |
||
| 718 | DJNZ _ZD3EC |
||
| 719 | POP BC |
||
| 720 | pop HL |
||
| 721 | |||
| 722 | PUSH DE ;длины кодов |
||
| 723 | |||
| 724 | ;считаем, сколько раз встретились коды каждой длины (0..15) |
||
| 725 | _ZD3F3 LD A,(DE) |
||
| 726 | INC DE |
||
| 727 | ADD A,A |
||
| 728 | ADD A,9 ;TD209 |
||
| 729 | LD L,A |
||
| 730 | INC (HL) |
||
| 731 | JR NZ,_ZD3FE |
||
| 732 | INC HL |
||
| 733 | INC (HL) |
||
| 734 | _ZD3FE DEC BC |
||
| 735 | LD A,B |
||
| 736 | OR C |
||
| 737 | JR NZ,_ZD3F3 |
||
| 738 | ;теперь в TD209 лежат 2-байтные значения, сколько раз встретились коды каждой длины (0..15) |
||
| 739 | |||
| 740 | LD L,#2D ;TD22B+2 |
||
| 741 | LD (HL),C;0 |
||
| 742 | INC HL |
||
| 743 | LD (HL),C;0 ;начальный код для длины 1 ;TODO ld (TD22B+2),bc |
||
| 744 | |||
| 745 | PUSH BC;0 ;текущий код? |
||
| 746 | |||
| 747 | LD BC,#F02 ;перебираем длины кодов 1..15 |
||
| 748 | _ZD40C LD A,C ;длина кода*2 |
||
| 749 | ADD A,9 ;TD209 |
||
| 750 | LD L,A |
||
| 751 | LD E,(HL) |
||
| 752 | INC HL |
||
| 753 | LD D,(HL) ;de=сколько раз встретилась эта длина кода |
||
| 754 | EX (SP),HL |
||
| 755 | ADD HL,DE |
||
| 756 | ADD HL,HL |
||
| 757 | LD E,L |
||
| 758 | LD D,H ;какой-то магией формируем текущий код из предыдущего |
||
| 759 | EX (SP),HL |
||
| 760 | INC C |
||
| 761 | INC C |
||
| 762 | LD A,C |
||
| 763 | ADD A,#2B ;TD22B |
||
| 764 | LD L,A |
||
| 765 | LD (HL),E |
||
| 766 | INC HL |
||
| 767 | LD (HL),D ;начальный код для заданной длины кода |
||
| 768 | DJNZ _ZD40C |
||
| 769 | |||
| 770 | POP DE ;текущий код? |
||
| 771 | |||
| 772 | LD A,D |
||
| 773 | OR E |
||
| 774 | JR Z,ZD440 ;последний начальный код должен получиться 0 (т.е. все варианты в бинарном дереве использованы) |
||
| 775 | ;ошибочное дерево? |
||
| 776 | LD D,B |
||
| 777 | LD E,B;de=0 |
||
| 778 | LD A,#F |
||
| 779 | LD L,#B ;TD209+2 |
||
| 780 | _ZD42F LD C,(HL) |
||
| 781 | INC HL |
||
| 782 | LD B,(HL) ;сколько раз встретился код этой длины |
||
| 783 | INC HL |
||
| 784 | EX DE,HL |
||
| 785 | ADD HL,BC |
||
| 786 | EX DE,HL |
||
| 787 | DEC A |
||
| 788 | JR NZ,_ZD42F |
||
| 789 | ;de=количество ненулевых длин кодов -2 |
||
| 790 | LD HL,-2 |
||
| 791 | ADD HL,DE |
||
| 792 | call C,depkqerror ;если кодов более 1, save whole buffer и выйти (ошибочное дерево? в архиве с адвентюрерами - на каждом большом файле) |
||
| 793 | ;всего 1 код используется - считаем, что не ошибка, что не получилось построить дерево из 1 кода? |
||
| 794 | ZD440 |
||
| 795 | POP DE ;длины кодов |
||
| 796 | PUSH DE ;длины кодов |
||
| 797 | |||
| 798 | ZD443=$+1 |
||
| 799 | LD BC,0 ;число кодов |
||
| 800 | |||
| 801 | LD HL,ziptrees+#A60 ;сюда положим все коды по 2 байта на код |
||
| 802 | _ZD448 LD A,(DE) ;длина кода |
||
| 803 | INC DE |
||
| 804 | PUSH DE |
||
| 805 | ADD A,A |
||
| 806 | LD E,A |
||
| 807 | LD D,A |
||
| 808 | JR Z,__ZD45F ;длина кода=de=0 |
||
| 809 | ;берём код номер "длина кода" в de (и инкрементируем его там, где он лежал) |
||
| 810 | PUSH HL |
||
| 811 | LD H,TD209/256;UD2 |
||
| 812 | ADD A,#2B ;TD22B |
||
| 813 | LD L,A |
||
| 814 | LD E,(HL) |
||
| 815 | INC HL |
||
| 816 | LD D,(HL) |
||
| 817 | INC DE |
||
| 818 | LD (HL),D |
||
| 819 | DEC HL |
||
| 820 | LD (HL),E |
||
| 821 | DEC DE |
||
| 822 | POP HL |
||
| 823 | __ZD45F LD (HL),E |
||
| 824 | INC HL |
||
| 825 | LD (HL),D |
||
| 826 | INC HL |
||
| 827 | POP DE |
||
| 828 | DEC BC |
||
| 829 | LD A,C |
||
| 830 | OR B |
||
| 831 | JR NZ,_ZD448 |
||
| 832 | |||
| 833 | POP DE ;длины кодов |
||
| 834 | PUSH DE ;длины кодов |
||
| 835 | |||
| 836 | LD HL,ziptrees+#A60 ;все коды по 2 байта на код |
||
| 837 | LD BC,(ZD443) ;число кодов |
||
| 838 | _ZD472 LD A,(DE) |
||
| 839 | INC DE |
||
| 840 | DEC A |
||
| 841 | JP M,_ZD4A1 ;код длиной 0 (неиспользуемый) - пропускаем |
||
| 842 | JR Z,_ZD4A1 ;код длиной 1 - пропускаем |
||
| 843 | PUSH DE |
||
| 844 | LD E,(HL) |
||
| 845 | INC HL |
||
| 846 | LD D,(HL) ;берём код |
||
| 847 | PUSH HL |
||
| 848 | LD HL,0 |
||
| 849 | ;начинаем переворачивать код, сначала длинакода-1 битиков: |
||
| 850 | _ZD482 SRL D |
||
| 851 | RR E |
||
| 852 | ADC HL,HL |
||
| 853 | EXA |
||
| 854 | LD A,D |
||
| 855 | OR E |
||
| 856 | JR Z,_ZD493 ;код кончился |
||
| 857 | EXA |
||
| 858 | DEC A |
||
| 859 | JR NZ,_ZD482 |
||
| 860 | INC A ;a=1: сдвинем потом ещё на 1 битик |
||
| 861 | EXA |
||
| 862 | _ZD493 EXA |
||
| 863 | ;сдвинем на несколько оставшихся битиков: |
||
| 864 | RR E |
||
| 865 | _ZD496 ADC HL,HL |
||
| 866 | DEC A |
||
| 867 | JR NZ,_ZD496 |
||
| 868 | EX DE,HL |
||
| 869 | POP HL |
||
| 870 | LD (HL),D |
||
| 871 | DEC HL |
||
| 872 | LD (HL),E ;записали перевёрнутый код |
||
| 873 | POP DE |
||
| 874 | _ZD4A1 INC HL |
||
| 875 | INC HL |
||
| 876 | DEC BC |
||
| 877 | LD A,C |
||
| 878 | OR B |
||
| 879 | JR NZ,_ZD472 |
||
| 880 | |||
| 881 | ZD4A9=$+1 |
||
| 882 | LD HL,0 ;адрес дерева |
||
| 883 | LD E,L |
||
| 884 | LD D,H |
||
| 885 | INC DE |
||
| 886 | LD BC,#1FF |
||
| 887 | LD (HL),A;0 |
||
| 888 | LDIR ;очистили 512 байт (TODO почему не больше? литералов может быть больше 256!) |
||
| 889 | |||
| 890 | POP HL ;длины кодов |
||
| 891 | |||
| 892 | LD BC,(ZD443) ;число кодов |
||
| 893 | DEC BC |
||
| 894 | ADD HL,BC |
||
| 895 | EX DE,HL ;de=указатель на длину последнего кода |
||
| 896 | |||
| 897 | LD (ZD523),IX ;какой-то адрес для кодов длиннее 8 |
||
| 898 | |||
| 899 | LD HL,ziptrees+#A60+1 ;все коды по 2 байта на код (уже перевёрнутые) |
||
| 900 | ADD HL,BC |
||
| 901 | ADD HL,BC ;указатель на последний байт последнего кода |
||
| 902 | ;генерируем дерево: |
||
| 903 | _ZD4C5 |
||
| 904 | ;bc=литерал |
||
| 905 | LD A,(DE) |
||
| 906 | DEC DE |
||
| 907 | OR A |
||
| 908 | JR Z,_ZD503 ;код длиной 0 (неиспользуемый) - пропускаем |
||
| 909 | CP 9 |
||
| 910 | PUSH DE |
||
| 911 | LD D,(HL) |
||
| 912 | DEC HL |
||
| 913 | LD E,(HL) ;de=код |
||
| 914 | INC HL |
||
| 915 | PUSH HL ;TODO выше |
||
| 916 | JR NC,_ZD50B ;код не умещается в 1 байт - используем буфер ix+... |
||
| 917 | ;код умещается в 1 байт |
||
| 918 | LD HL,1 |
||
| 919 | INC A ;1..9 |
||
| 920 | _ZD4D8 ADD HL,HL |
||
| 921 | DEC A |
||
| 922 | JR NZ,_ZD4D8 |
||
| 923 | EX DE,HL ;de=1<<(1..9) |
||
| 924 | ADD HL,HL ;код*2 |
||
| 925 | LD A,(ZD4A9) ;адрес дерева |
||
| 926 | ADD A,L |
||
| 927 | LD L,A |
||
| 928 | LD (__ZD4FE),A ;это и... |
||
| 929 | LD A,(ZD4A9+1) |
||
| 930 | ADC A,H |
||
| 931 | LD H,A |
||
| 932 | INC A,A |
||
| 933 | LD (__ZD4F7),A ;...это задаёт адрес выхода (адрес дерева + код*2 + 512) |
||
| 934 | DEC DE |
||
| 935 | ;кладём литерал в дерево |
||
| 936 | _ZD4F1 LD (HL),C |
||
| 937 | INC HL |
||
| 938 | LD (HL),B ;кладём литерал |
||
| 939 | ADD HL,DE ;какой-то магией находим следующий адрес (адрес литерала + код*2) |
||
| 940 | LD A,H |
||
| 941 | __ZD4F7=$+1 |
||
| 942 | CP 0 |
||
| 943 | JR C,_ZD4F1 |
||
| 944 | JR NZ,_ZD501 |
||
| 945 | LD A,L |
||
| 946 | __ZD4FE=$+1 |
||
| 947 | CP 0 |
||
| 948 | JR C,_ZD4F1 ;пока не дошли до адреса выхода, кладём этот литерал (TODO зачем много раз???) |
||
| 949 | _ZD501 |
||
| 950 | POP HL,DE |
||
| 951 | _ZD503 |
||
| 952 | DEC HL |
||
| 953 | DEC HL ;предыдущий код |
||
| 954 | DEC BC ;предыдущий литерал |
||
| 955 | BIT 7,B |
||
| 956 | JR Z,_ZD4C5 |
||
| 957 | RET |
||
| 958 | |||
| 959 | _ZD50B |
||
| 960 | ;код не умещается в 1 байт - используем буфер ix+... |
||
| 961 | ;a=длина кода |
||
| 962 | ;de=код |
||
| 963 | SUB 8 |
||
| 964 | PUSH BC ;литерал |
||
| 965 | LD B,A ;длина кода-8 |
||
| 966 | LD A,D |
||
| 967 | LD D,0 |
||
| 968 | LD HL,(ZD4A9) ;адрес дерева |
||
| 969 | ADD HL,DE |
||
| 970 | ADD HL,DE |
||
| 971 | LD C,1 ;некий бит для проверки старшего байта кода |
||
| 972 | EXA |
||
| 973 | _ZD51A LD E,(HL) |
||
| 974 | INC HL |
||
| 975 | LD D,(HL) ;берём литерал из дерева по смещению 2*(код-256) (или адрес ix+... после прохода - см. ниже) |
||
| 976 | DEC HL |
||
| 977 | LD A,D |
||
| 978 | OR E |
||
| 979 | JR NZ,_ZD535 ;литерал уже заполнен! |
||
| 980 | ;нулевой литерал (ещё не заполненный) |
||
| 981 | ZD523=$+1 |
||
| 982 | LD DE,0 ;сначала туда клали ix |
||
| 983 | LD (HL),E |
||
| 984 | INC HL |
||
| 985 | LD (HL),D ;кладём этот адрес в дерево на место ещё не заполненного литерала |
||
| 986 | LD H,D |
||
| 987 | LD L,E |
||
| 988 | LD (HL),A;0 |
||
| 989 | INC HL |
||
| 990 | LD (HL),A;0 |
||
| 991 | INC HL |
||
| 992 | LD (HL),A;0 |
||
| 993 | INC HL |
||
| 994 | LD (HL),A;0 ;и кладём 4 нуля по этому адресу (на следующем проходе можем использовать первые два или последние два нуля, чтобы положить туда адрес литерала или литерал) |
||
| 995 | INC HL |
||
| 996 | LD (ZD523),HL ;обновляем бывший ix |
||
| 997 | _ZD535 |
||
| 998 | EX DE,HL ;hl=адрес = ix+... (или уже заполненный литерал) |
||
| 999 | EXA |
||
| 1000 | LD E,A ;старший байт кода |
||
| 1001 | AND C ;проверяем некий бит |
||
| 1002 | LD A,E ;старший байт кода |
||
| 1003 | JR Z,_ZD53E |
||
| 1004 | INC HL,HL ;если установлен, то адрес+2 (TODO а если это был литерал???) |
||
| 1005 | _ZD53E EXA |
||
| 1006 | SLA C ;сдвигаем некий бит |
||
| 1007 | DJNZ _ZD51A ;попробуем следующий адрес или ещё раз этот же (TODO а что если это был литерал, а не ix+..., а битик не совпал - повторим с тем же адресом???) |
||
| 1008 | POP BC |
||
| 1009 | LD (HL),C |
||
| 1010 | INC HL |
||
| 1011 | LD (HL),B ;кладём литерал |
||
| 1012 | JR _ZD501 ;конец текущего кода |
||
| 1013 | |||
| 1014 | readcodetree1;ZD549 |
||
| 1015 | ;de=имеющиеся данные |
||
| 1016 | ;out: hl=code |
||
| 1017 | PUSH DE |
||
| 1018 | XOR A |
||
| 1019 | LD D,A |
||
| 1020 | LD HL,ziptrees+#160+1 ;тут лежит первое дерево |
||
| 1021 | ADD HL,DE |
||
| 1022 | ADD HL,DE ;hl=адрес второго байта кода номер e в дереве |
||
| 1023 | OR (HL) |
||
| 1024 | DEC HL |
||
| 1025 | LD L,(HL) |
||
| 1026 | LD H,A |
||
| 1027 | if ziptrees>=0x8000 |
||
| 1028 | else |
||
| 1029 | add a,a |
||
| 1030 | endif |
||
| 1031 | JP M,_ZD58C ;h bit 6 значит дерево, иначе hl=литерал |
||
| 1032 | PUSH HL |
||
| 1033 | LD DE,ziptrees ;длины кодов первого дерева??? |
||
| 1034 | ADD HL,DE |
||
| 1035 | LD A,(HL) ;длина добавки кода для имеющегося hl??? |
||
| 1036 | POP HL |
||
| 1037 | pop DE |
||
| 1038 | _ZD560 |
||
| 1039 | ;256: end of block - stop processing if last block, otherwise start processing next block. |
||
| 1040 | ;257-285: combined with extra-bits, a match length of 3-258 bytes. |
||
| 1041 | ;286, 287: not used, reserved and illegal but still part of the tree. |
||
| 1042 | CALL read_a_bits |
||
| 1043 | LD A,H |
||
| 1044 | OR A |
||
| 1045 | RET Z |
||
| 1046 | LD A,L |
||
| 1047 | CP 9 |
||
| 1048 | RET C |
||
| 1049 | CP #1D |
||
| 1050 | LD HL,#200 |
||
| 1051 | RET Z |
||
| 1052 | DEC A |
||
| 1053 | LD C,A |
||
| 1054 | SRL C |
||
| 1055 | SRL C |
||
| 1056 | DEC C |
||
| 1057 | AND 3 |
||
| 1058 | ADD A,4 |
||
| 1059 | LD H,L |
||
| 1060 | LD L,A |
||
| 1061 | LD A,C |
||
| 1062 | _ZD57E ADD HL,HL |
||
| 1063 | DEC C |
||
| 1064 | JR NZ,_ZD57E |
||
| 1065 | INC H |
||
| 1066 | CALL get_a_bits |
||
| 1067 | INC A |
||
| 1068 | ADD A,L |
||
| 1069 | LD L,A |
||
| 1070 | RET NC |
||
| 1071 | INC H |
||
| 1072 | RET |
||
| 1073 | |||
| 1074 | _ZD58C POP DE |
||
| 1075 | CALL ZD5CB ;читать 8 бит и пройти по ним дерево hl |
||
| 1076 | JR _ZD560 |
||
| 1077 | |||
| 1078 | readcodetree2;ZD592 |
||
| 1079 | ;de=имеющиеся данные |
||
| 1080 | ;out: hl=code |
||
| 1081 | ;The distance tree contains space for 32 symbols: |
||
| 1082 | ;0-3: distances 1-4 |
||
| 1083 | ;4-5: distances 5-8, 1 extra bit |
||
| 1084 | ;6-7: distances 9-16, 2 extra bits |
||
| 1085 | ;8-9: distances 17-32, 3 extra bits |
||
| 1086 | ;... |
||
| 1087 | ;26-27: distances 8,193-16,384, 12 extra bits |
||
| 1088 | ;28-29: distances 16,385-32,768, 13 extra bits |
||
| 1089 | ;30-31: not used, reserved and illegal but still part of the tree. |
||
| 1090 | ;Note that for the match distance symbols 2-29, the number of extra bits can be calculated as [n/2]-1. |
||
| 1091 | PUSH DE |
||
| 1092 | XOR A |
||
| 1093 | LD D,A |
||
| 1094 | LD HL,ziptrees+#360+1 |
||
| 1095 | ADD HL,DE |
||
| 1096 | ADD HL,DE |
||
| 1097 | OR (HL) |
||
| 1098 | DEC HL |
||
| 1099 | LD L,(HL) |
||
| 1100 | LD H,A ;h bit 6 значит дерево, иначе hl=литерал |
||
| 1101 | if ziptrees>=0x8000 |
||
| 1102 | else |
||
| 1103 | add a,a |
||
| 1104 | endif |
||
| 1105 | JP M,_ZD5C5 ;читать 8 бит и пройти по ним дерево hl |
||
| 1106 | PUSH HL |
||
| 1107 | LD DE,ziptrees+#140 ;длины кодов второго дерева??? |
||
| 1108 | ADD HL,DE |
||
| 1109 | LD A,(HL) ;длина добавки кода для имеющегося hl??? |
||
| 1110 | POP HL,DE |
||
| 1111 | _ZD5A9 CALL read_a_bits ;дочитываем столько бит, сколько прошагали? |
||
| 1112 | LD A,L ;литерал |
||
| 1113 | CP 4 |
||
| 1114 | RET C |
||
| 1115 | RRA |
||
| 1116 | DEC A |
||
| 1117 | LD C,A |
||
| 1118 | LD L,H |
||
| 1119 | RL L |
||
| 1120 | INC L,L |
||
| 1121 | ZD5B8 ADD HL,HL |
||
| 1122 | DEC C |
||
| 1123 | JR NZ,ZD5B8 |
||
| 1124 | PUSH HL |
||
| 1125 | CALL get_a_bits_tohl |
||
| 1126 | EX DE,HL |
||
| 1127 | EX (SP),HL |
||
| 1128 | ADD HL,DE |
||
| 1129 | POP DE |
||
| 1130 | RET |
||
| 1131 | |||
| 1132 | _ZD5C5 POP DE |
||
| 1133 | CALL ZD5CB ;читать 8 бит и пройти по ним дерево hl |
||
| 1134 | JR _ZD5A9 |
||
| 1135 | |||
| 1136 | ZD5CB |
||
| 1137 | ;читать 8 бит и пройти по ним дерево hl |
||
| 1138 | ;out: a=сколько бит реально прошагали, l=литерал? |
||
| 1139 | LD A,8 |
||
| 1140 | CALL read_a_bits |
||
| 1141 | LD C,E ;эквивалентно ld a,8:call get_a_bits:ld c,a ? |
||
| 1142 | ;ходим по дереву hl, имея код C (младшие биты сначала) |
||
| 1143 | XOR A |
||
| 1144 | ZD5D2 INC A |
||
| 1145 | RR C |
||
| 1146 | JR NC,ZD5D9 |
||
| 1147 | INC HL |
||
| 1148 | inc HL |
||
| 1149 | ZD5D9 LD (ZD5DD),HL |
||
| 1150 | ZD5DD=$+1 |
||
| 555 | alone | 1151 | LD HL,(0) ;ok |
| 344 | alone | 1152 | if ziptrees>=0x8000 |
| 1153 | BIT 7,H |
||
| 1154 | else |
||
| 1155 | BIT 6,H ;h bit 6 значит дерево, иначе l=литерал |
||
| 1156 | endif |
||
| 1157 | JR NZ,ZD5D2 |
||
| 1158 | RET |
||
| 1159 | |||
| 1160 | ; ENT |
||
| 1161 | |||
| 1162 | ;END_DEP=$ |
||
| 1163 | |||
| 1164 | U6546=Z6546 ;сколько байт сохранить = текущий адрес в буфере |
||
| 1165 | |||
| 1166 |