HUFFMAN
;hl=ldbit/ddbit
;bc=nodes
;jr $
ld (nodes),BC
PUSH BC,HL
LD HL,frqs-1
ADD HL,BC
add HL,BC
ld (nodend),HL
LD HL,bitlens
LD BC,255
LD D,H
ld E,L
INC DE
ld (hl),l ;0
LDIR
LD HL,huff
LD IX,0
mkhuf0 PUSH HL
nodend=$+1
LD HL,huff;frqend-1 ;эхўхЄэ√щ рфЁхё
nodes=$+1
LD BC,255;298
XOR A
PUSH AF
LD D,#FE ;last maximum <#FFXX (#FFFF - эхЄ ышЄхЁрыр)
mkhuf1
LD A,D
mkhuf1A CP (HL)
JR NC,mkhufNC
DEC L
CPD
jp PE,mkhuf1A
JR frskipQ
mkhufNC
DEC HL
JR NZ,frless
LD A,(HL)
CP E
JR NC,frskip
frless
POP DE
LD E,(HL)
INC L
PUSH HL
LD D,(HL)
frskipDL
DEC L
frskip CPD
jp PE,mkhuf1
frskipQ DEC B ;-1
POP HL
XOR A
OR H
JR Z,mkhufQ ;ъюэўшышё№ ўрёЄюЄ√>0
;DE=MINfrq-1
INC DE
;HL=adrMINfrq+1(H)
LD (HL),B;-1 ;°юя сюых эх яюярфрырё№
LD BC,-frqs-1
ADD HL,BC
SRL H
RR L ;HL=ышЄхЁры
LD B,D
ld C,E
POP DE
EX DE,HL
LD (HL),B ;frq
INC HL
LD (HL),C
INC HL
LD (HL),D ;тьхёЄю adrA (ышЄхЁры)
INC HL
LD (HL),E
INC HL
INC IX
JR mkhuf0
mkhufQ
POP HL
OR HX
JR NZ,HUFN1L
OR LX
IF skipnotree
jp Z,MHUFCOD ;эхЄ фхЁхтр
ELSE
jr NZ,HUFN0L
INC LX ;сєфхЄ ышёЄ
LD (HL),C;0
INC HL
LD (HL),1
INC HL
LD (HL),C;0
INC HL
LD (HL),C;0
INC HL
INC A
HUFN0L
ENDIF
CP 1
JR NZ,HUFN1L
INC LX ;сєфхЄ 2 ышёЄр
DEC HL
XOR (HL) ;тЄюЁющ ышёЄ ЇшъЄштэ√щ
INC HL
LD (HL),C ;ўЄюс√ эх #FF dem029
INC HL
LD (HL),1 ;dem08
INC HL
LD (HL),C;0
INC HL
LD (HL),A
INC HL
HUFN1L LD (HL),B;-1;end
;эр тё ъшщ ёыєўрщ чряюьэшь юЄёюЁЄ.ўрёЄюЄ√
;├─┼ ╚╤╧╬╦▄╟╙┼╥╤▀?
;LD BC,1-huff
;ADD HL,BC
;LD B,H,C,L
LD HL,huff
LD DE,frqs
LD BC,298*4+1 ;end
LDIR
;jr $ ;ix=#127
;IX=ъюы-тю ═┼╟└═▀╥█╒ ышёЄ№хт
;ЄхяхЁ№ юс·хфшэ хь єчы√
LD DE,huffend-1 ;╟└═▀╥█┼-1
obhuf0
LD A,LX
DEC A
OR HX
JR Z,obhufQ ;юёЄрыё юфшэ єчхы, эхўхую юс·хфшэ Є№
;яхЁт√х 2 ═┼╟└═▀╥█╒ єчыр
;яхЁхьх∙рхь т ╟└═▀╥█┼
LD HL,huff+7
LD BC,8
LDDR
PUSH DE
INC HL
LD B,(HL) ;frq1
INC HL
LD C,(HL)
INC HL,HL,HL
LD D,(HL) ;frq2
INC HL
LD E,(HL)
EX DE,HL
ADD HL,BC
LD B,H
ld C,L
;ш∙хь яхЁтє■ с╬ы№°є■ ўрёЄюЄє
;ш яхЁхъшф√трхь т эрўрыю ьхэ№°шх/Ёртэ√х
LD HL,huff+8
LD DE,huff
IF fastTREE
LD A,B
PUSH BC
obhuf1 CP (HL)
LDI
JR Z,obhCP
obhCPQ LDI
LDI
LDI
jp NC,obhuf1
DEC HL,DE
DEC HL,DE
DEC HL,DE
obhufG DEC HL,DE
POP BC
ELSE
obhuf1
LD A,(HL)
CP B
JR C,obhufi
JR NZ,obhufG
INC HL
LD A,C
CP (HL)
DEC HL
JR C,obhufG ;(HL)>C
obhufi LDI
INC BC
LDI
INC BC
LDI
INC BC
LDI
INC BC
JR obhuf1
obhufG
ENDIF
;HL=рфЁхё яхЁтющ с╬ы№°хщ ўрёЄюЄ√ (шыш end)
;DE=ъєфр тёЄрты Є№
EX (SP),HL ;HL=adrA-1=╟└═▀╥█┼-1
;(SP)=рфЁ.я.с╬ы.ў
EX DE,HL
LD (HL),B ;frq
INC HL
LD (HL),C
INC HL
INC DE
LD (HL),D ;adrA
INC HL
LD (HL),E
DEC DE
INC HL
EX DE,HL
EX (SP),HL ;HL=рфЁ.я.с╬ы.ў
;(SP)=╟└═▀╥█┼-1
LD A,-1
JR obhufcE
IF fastTREE
obhCP POP BC
LD A,C
CP (HL)
LD A,B
PUSH BC
jp NC,obhCPQ
JR obhufG ;(HL)>C
ENDIF
obhufco LDI
LDI
LDI
LDI
obhufcE CP (HL)
JR NZ,obhufco
LD (DE),A
DEC IX;ётюсюфэ√ї ёЄрыю эр 1 ьхэ№°х
POP DE
JR obhuf0 ;юс·хфшэ хь ёыхфє■∙шх...
obhufQ
;ёўшЄрхь bitlens
LD BC,0
PUSH BC ;=0
PUSH BC
LD HL,huff
;ёьюЄЁшь яЁртє■,ыхтє■(PUSH)
CNTbl
INC HL,HL
LD A,(HL) ;adrA
CP 2
JR C,CNTli
LD D,A
INC HL
LD E,(HL)
PUSH DE ;LEFT
INC C
PUSH BC
INC DE,DE,DE,DE ;RIGHT
EX DE,HL
JR CNTbl
CNTli LD L,C
ADD HL,HL
LD H,bitlens/256 ;0,1,...
INC (HL)
JR NZ,$+4
INC L
INC (HL)
XOR A
POP BC
POP HL
OR H
JR NZ,CNTbl
;шёяЁрты хь фышэ√>15
;bad:
;2*(N+1),(N-1) -> 3*(N)
;4*(N+1),(N-2) -> 4*(N),(N-1)
;ш Є.ф.
;fixed:
;X=яхЁт√щ эхэєыхтющ юЄ N-1 ш ьхэхх
;(X)--
;(X+1)+=2
;(N)++
;(N+1)-=2
;jr $
ispr15
LD HL,bitlens ;ЄрсышЎр ёъюы№ъю ышёЄ№хт т Ёєёх
ispr150 DEC L
LD A,(HL)
DEC L
OR (HL)
JR Z,ispr150
LD A,L
CP 32
JR C,MHUFCOD ;тёх уыєсшэ√ <15
;LD BC,1 ;ёъюы№ъю ышёЄ№хт эр юсьхэ
DEC L,L
LD E,L ;чряюьэшь ADR (N)
ispr151;SLA C
;RL B
DEC L
LD A,(HL)
DEC L
OR (HL)
JR Z,ispr151;уыєсшэ (N-1) эхЄє
;эр°ыш X
LD A,(HL)
DEC (HL)
INC L
OR A
jr NZ,$+3
DEC (HL)
;INC L,(HL)
;JR Z,$-2
INC L ;ADR (X+1)
LD A,(HL)
ADD A,2
LD (HL),A
INC L
jr NC,$+3
INC (HL)
LD L,E ;тёяюьэшь ADR (N)
;LD A,(HL)
;ADD A,C
;LD (HL),A
;INC L
;LD A,(HL)
;ADC A,B
;LD (HL),A
INC (HL)
INC HL
jr NZ,$+3
INC (HL)
INC L ;ADR (N+1)
LD A,(HL)
SUB 2;C
LD (HL),A
INC L
;LD A,(HL)
;SBC A,B
;LD (HL),A
jr NC,$+3
DEC (HL)
JR ispr15
;ёюёЄрты хь эютюх фхЁхтю яю фышэрь ш frqs
;ёхщўрё т frqs: (Hfrq,Lfrq,Hlit,Llit)
;end=-1
;ёэрўрыр яЁшётрштрхь ышЄхЁрырь bitlen
MHUFCOD
POP HL,BC
;bc=nodes?
;hl=?
PUSH BC,HL
DEC BC
LD D,H
ld E,L
LD A,E
ld (licoLOW),A
LD HX,D
INC DE
XOR A
LD (HL),A
CP B
LDIR
JR Z,$+4
LD A,20 ;+D
ld (licoI1),A
ld (licoI2),A
ld (lico0+1),HL
LD DE,frqs
LD HL,bitlens+31
LD B,15 ;Єхъє∙р уыєсшэр
LD LX,B
libi0 LD A,(HL)
DEC L
OR (HL)
JR Z,libiZ
libiNZ LD A,(HL)
DEC (HL)
INC L
OR A
JR NZ,$+3
DEC (HL)
;схЁхь эюьхЁ ышЄхЁрыр
INC DE,DE
PUSH HL
LD A,(DE)
INC DE
ADD A,HX
LD H,A
LD A,(DE)
INC DE
LD L,A
LD (HL),B
POP HL
JR libi0
;ъюэўшышё№ ышёЄ№ ¤Єющ уыєсшэ√
libiZ DEC L
DJNZ libi0
libiQ
;тэєЄЁш ърцфюую Ёєёр - эх яю ўрёЄюЄх,
;р яю рыЇртшЄє!
LD H,B
ld L,B;HUFF CODE<<
LD C,2 ;HUFF SUBer
lico0
LD DE,0 ;ldbit+297 CHANGEABLE
lico1 LD A,(DE)
CP LX
JR NZ,lico1N
;ЄхяхЁ№ ъюф ╒рЇЇьрэр<<
PUSH DE
licoI1 INC D
inc D
SBC HL,BC
LD A,H
LD (DE),A
licoI2 INC D
inc D
LD A,L
LD (DE),A
POP DE
lico1N
LD A,E
licoLOW=$+1
CP 0
LD A,D
DEC DE
JR NZ,lico1
CP HX
JR NZ,lico1
SLA C
RL B
DEC LX
JR NZ,lico0
POP HL,BC
RET