1 REM Ins{nd av Kristoffer Eriksson <5357>    1987-12-11 19.48.25 (KERMIT)
; Fil: HFM.ASM
; Av : Kristoffer Eriksson, "SKE" <5357>, 1987.
; F|r: ABC800-serien.
; Assembler: AZZAM.
; N|dv{ndiga k{llkodsfiler: Se INCLUDE-satserna l{ngre ned.
;
;-Ver--/-Datum----/-Sign-/-Kommentar----------------------------------
;      / 87-07-16 / SKE  / HFM
; 1.00 / 87-11-13 / SKE  / Klart.
;
; Huffmann-kodning av filer.
;
; Id`er:
; - Andra tokens {n bytes. (T ex Basic-ord.)
; - Stickprov f|r frekvensber{kningen i st{llet f|r total r{kning. Detta
;   skulle inneb{ra att det kan finnas tokens i filen som inte blivit r{knade,
;   varf|r man antingen inte f}r ta bort noder med frekvensen 0 ur tr{det,
;   eller m}ste ha ett s{tt att }terskapa noll-noderna i tr{det vid dekompr.
; - Intern buffring av filen mellan frekvensr{kningen och komprimeringen,
;   s{rskilt n{r den komprimerade filen inte {r en disk-fil.
; - Bytevis inl{sning n{r infilen ej {r en disk-fil. (Uppt{cks genom att
;   vanliga IO returnerar carry och A=255 vid t ex Iocm.Rdc.)
; - Slippa dubblerade felmeddelanden n{r CLOSE upprepar det fel som avbr|t
;   behandlingen fr}n b|rjan.
; - M|jlighet att interaktivt ange ett annat namn p} utfilen, n{r det uppt{cks
;   att default utfil redan finns.
; - Maximal optimering av RemoveSmallest, nyckelrutinen vid tr{dkonstruktion.
; - Optimering av allt annat ocks}, s{rskilt BitIn och BitOut.
; - N}gon indikation p} att programmet arbetar under frekvensr{kning,
;   komprimering och dekomprimering (annat {n drivens eventuella rasslande).
; - Output redirection f|r frekvensutskriften. (Generell redirect-modul.)
; - Filarkiv med komprimering av mer {n en infil till en enda utfil. (Kan g|ras
;   som ett separat filarkivprogram till att b|rja med.)
; - Utskrift av komprimerad fils storlek i procent av infilen. Kr{ver en
;   divisionsrutin och ev en multiplikationsrutin f|r trebytes-tal.
; - Textfils-mode som l{ser med Iocm.Rda (motsv INPUT). Man slipper vissa
;   styrkoder i sektorsluten, och allt skr{p i sista sektorn och eventuella
;   ytterligare sektorer som inte inneh}ller text (t ex ABC-klubbens monitors
;   ID-block som ligger sist i filen).
;
; Programmet anv{nder sig av en del omst{ndliga filhanteringsmetoder som g}r
; via Basic och enhetssystemet i st{llet f|r att g} direkt p} DOS. Det skulle
; vara effektivare att utnyttja DOS direkt, men d} skulle man bli l}st till
; filer p} disk, och det skulle bli sv}rare att l{gga till s{rskild textfils-
; l{sning i framtiden.

; LU-block. LU-blocken m}ste vara nollst{llda f|r att inte verka redan |ppna.
LU.In:      DEFS   23,0               ; LU-block f|r infilen.
LU.Ut:      DEFS   23,0               ; LU-block f|r utfilen.

TopMem:     DEFW   0                  ; H|gsta lediga adress i RAM - 1.
TopMem2:    DEFW   0                  ; TopMem - marginal, temp anv{ndning.
BinFileSize:DEFS   3,0                ; Antal tokens i opackad fil.
CmpFileSize:DEFS   3,0                ; Antal bytes i packad filen.
FNamA.In:   DEFW   0                  ; Pekare till infilens namn.
FNamL.In:   DEFW   0                  ; Infilens namns l{ngd, max 255.
FNamA.Ut:   DEFW   0                  ; Utfilens namn.
FNamL.Ut:   DEFW   0


            INCLUDE "HFMMAIN"         ; Start
            INCLUDE "HFMTREE"

GIO:        JP     0                  ; R{tt adress l{ggs in h{r fr}n GIOInit.
GIOClose:   JP     0                  ; -"-

            INCLUDE "CONSPACK"        ; ConsInit, ConsRead, ConsWrite
            INCLUDE "GIO"             ; GIOInit
            INCLUDE "BITIO"           ; StartBitIn/Out, BitIn/Out
            INCLUDE "WORDSPLT"        ; WordSplit
            INCLUDE "OPENFILE"        ; OpenFile, OpenUnForm, FNameBuf
            INCLUDE "DEFEXT"          ; DefExt, NewExt, ENamBuf
            INCLUDE "I2ASC"           ; I2ASC, I1ASC
            INCLUDE "TRIBASC"         ; TriBAsc, TriRegAsc
            INCLUDE "IDIV"            ; IDiv, IDivZ
            INCLUDE "CLINEPAR"        ; Clinepar
            INCLUDE "ENDINIT"         ; Chain.Clr, Chain.Load

Nodes:      ; H{r byggs kodtr{det upp i oinitierat minne.

            REL PUSH Start            ; Utf|rs efter k|rning av programmet.
            REL CALL
            ORG GIO                   ; Skriv |ver sm}rutiner, men l}t ev
                                      ; buffert med chainfil i HFMMAIN vara
            INCLUDE "ENDREL"          ; kvar.
