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.