Код:
.MakeHuff:
ld a,5
call .GetBits
ld a,(rncdat)
or a
ret z
ld (temp1),a
ld b,a
ld hl,tmptab
.MakeHuff2:
push bc
push hl
ld a,4
call .GetBits
pop hl
ld a,(rncdat)
ld (hl),a
inc hl
pop bc
djnz .MakeHuff2
xor a
ld (regy),a
inc a
ld (bitlen),a
ld hl,0
ld (hufcde),hl
ld hl,#8000
ld (hufbse),hl
.MakeHuff3:
ld a,(temp1)
ld (temp2),a
xor a
ld (temp3),a
.MakeHuff4:
ld a,(temp3)
ld (regx),a
ld hl,tmptab
call hla
ld a,(bitlen)
cp (hl)
jp nz,.MakeHuff8
ld (regx),a
add a,a
ld hl,.msktab
call hla
ld a,(regy)
ld c,a
add a,2
ld (regy),a
ld de,(hufftab)
ld a,c
call dea
ldi
ldi
ld bc,(rncdat)
ld de,(hufcde)
ld a,(regx)
.MakeHuff5:
sla e
rl d
rr b
rr c
dec a
jr nz,.MakeHuff5
ld hl,rncdat+3
ld (hl),d
dec hl
ld (hl),e
dec hl
ld a,(bitlen)
ld e,a
ld a,16
sub e
jr z,.MakeHuff7
.MakeHuff6:
srl b
rr c
dec a
jr nz,.MakeHuff6
.MakeHuff7:
ld (hl),b
dec hl
ld (hl),c
ld a,(regy)
ld b,a
add 2
ld (regy),a
ld hl,(hufftab)
ld a,b
call hla
ld de,(rncdat)
ld (hl),e
inc hl
ld (hl),d
inc hl
ld de,15*4
add hl,de
ld a,(temp3)
ld (hl),a
inc hl
ld a,(bitlen)
ld (hl),a
ld bc,(hufbse)
ld hl,(hufcde)
add hl,bc
ld (hufcde),hl
.MakeHuff8:
ld hl,temp3
inc (hl)
ld hl,temp2
dec (hl)
jp nz,.MakeHuff4
ld hl,hufbse+1
srl (hl)
dec hl
rr (hl)
ld a,(bitlen)
inc a
ld (bitlen),a
cp 17
jp nz,.MakeHuff3
ret
hla
add a,l
ld l,a
ret nc
inc h
ret
dea
add a,e
ld e,a
ret nc
inc d
ret
и потом оно
Код:
;**********************************
.GetVal:
ld hl,(hufftab)
dec hl
.GetVal2:
inc hl
.GetVal3:
ld bc,(bitbufl)
ld a,c
and (hl)
ld c,a
inc hl
ld a,b
and (hl)
ld b,a
inc hl
ld (rncdat),bc
ld a,c
cp (hl)
inc hl
jr nz,.GetVal2
ld a,b
cp (hl)
inc hl
jr nz,.GetVal3
ld de,15*4
add hl,de
ld a,(hl)
inc hl
push af
ld a,(hl)
call .GetBits
pop af
cp 2
jr nc,.GetVal4
ld hl,rncdat
ld (hl),a
inc hl
xor a
ld (hl),a
ret
.GetVal4:
dec a
push af
call .GetBits
pop af
ld b,a
inc b
ld hl,1
jr .GetVal5a
.GetVal5:
add hl,hl
.GetVal5a:
djnz .GetVal5
ld de,(rncdat)
ld a,e
or l
ld e,a
inc hl
ld a,d
or h
ld d,a
ld (rncdat),de
ret