LEX 'SPACKLEX' * (c) Copyright PPC Paris 1986 TITLE Compression de chaÑnes. *********************************************** * Par: Stefano Tendon [CHHU 635] * Cantone Delle Asse 5 * 29100 Piacenza * Italy * * Tel. (0523) 21180 * * Date: 1985.08.13. *********************************************** ID #5C MSG 0 POLL 0 ENTRY ascmax CHAR #F ENTRY ascmin CHAR #F ENTRY okbits CHAR #F ENTRY dpack CHAR #F ENTRY dunpck CHAR #F KEY 'ASCMAX' TOKEN 01 KEY 'ASCMIN' TOKEN 02 KEY 'GOODBITS' TOKEN 03 KEY 'SPACK$' TOKEN 04 KEY 'SUNPACK$' TOKEN 05 ENDTXT *********************************************** * E Q U A T E T A B L E * A-MULT EQU #1B349 ADHEAD EQU #181B7 AVMEMS EQU #2F594 EXPR EQU #0F23C FUNCD0 EQU #2F8BB HDFLT EQU #1B31B POP1S EQU #0BD38 REVPOP EQU #0BD31 REV$ EQU #1B38E STKCHR EQU #18504 STRHDR EQU #0F09A *********************************************** NIBHEX 411 ascmax A=0 W GOSBVL POP1S lit la chaÑne. ASRB A longueur en octets. GOSUB findrg dÅtermine MIN et MAX. A=0 W A=B B prend le MAX. D1=D1- 16 D1 @ sommet de pile. GOSBVL HDFLT Convertit MAX en dÅcimal DAT1=A W MAX -> pile. GOTO expr *********************************************** NIBHEX 411 ascmin A=0 W GOSBVL POP1S lit la chaÑne. ASRB A longueur en octets. GOSUB findrg dÅtermine MIN et MAX. A=0 W C=D B A=C B prend MIN. D1=D1- 16 D1 ^ sommet de la pile. GOSBVL HDFLT convertit MIN en dÅcimal DAT1=A W MIN -> pile GOTO expr *********************************************** NIBHEX 411 okbits A=0 W GOSBVL POP1S lit la chaÑne. ASRB A longueur en octet. GOSUB findrg dÅtermine MIN et MAX C=0 W C=B B C=C-D B MAX - MIN A=0 W GOSUB okloop nb de bits significatifs D1=D1- 16 D1 ^ sommet de pile. GOSBVL HDFLT Convertit nb de bits * en dÅcimal. DAT1=A W rÅsultat -> pile. GOTO expr *********************************************** * * DÅtermine combien de bits sont significatifs * dans C[B]. * *********************************************** okloop CSRB B A=A+1 B ?C#0 B GOYES okloop RTN *********************************************** * * DÅtermine MIN et MAX (plus petit et plus * grande valeurs ASCII. * *********************************************** findrg B=0 B Initialise maximum. LCHEX FF D=C B Initialise minimum. ?A#0 A SI chaÑne nulle ALORS GOYES findlp D=0 B maximum = minimum = 0 RTN * SINON findlp A=A-1 A TANTQUE caractÉres FAIRE RTNC C=DAT1 B lire le caractÉre. ?C<=B B SI car > MAX ALORS GOYES maxok B=C B max = car. FIN-SI maxok ?C>=D B SI car < min ALORS GOYES minok min = car. FIN-SI D=C B minok D1=D1+ 2 ^ caractÉre suivant. GONC findlp FINTANTQUE * FINSI *********************************************** NIBHEX 411 dpack GOSBVL REVPOP renverse la chaÑne. CD0EX sauve le PC. D0=(5) FUNCD0 DAT0=C A B=0 W B=A A BSRB longueur en octet. A=B W R3=A sauve la longueur. GOSUB findrg calcule MIN et MAX. C=D B R2=C sauve MIN dans R2. CD1EX R1=C Sauve le dÅbut de pile * pour ADHEAD. D1=C D1 @ fin de chaÑne. D0=C D0 @ fin de chaÑne. C=0 W C=B B C=C-D B MAX - MIN A=0 W GOSUB okloop R0=A sauve le nb de bits (G). A=R3 B=A A Init le cpteur de boucle D=0 B Initialise le nombre de * bits disponibles (A) dans * l'octet de destination. packlp B=B-1 A TANTQUE caractÉres FAIRE GOC pckout D0=D0- 2 mise È jour du ptr * source. A=0 W A=DAT0 B lire le car. source. C=R2 A=A-C B soustraire le minimum ASL A octet nul È droite de ASL A l'octet courant. C=D B definit le compteur * de dÅcalage (S): S=A. * DÅcale de S bits: sftlop C=C-1 B GOC sftout ASRB GONC sftlop sftout C=DAT1 B lit le caractÉre * destination. C=C!A B source = source ! dest. DAT1=C B Åcrit l'octet dest. C=R0 ?C A ALORS GOYES nxtone D1=D1- 2 MÈJ du ptr dest. ASR A ASR A init. la destination DAT1=A B octet source LCHEX 08 D=D+C B A = A + 8 C=R0 FINSI. nxtone D=D-C B A = A - G GONC packlp FINTANTQUE. pckout LCHEX 08 ?D#C B SI A = 8 ALORS GOYES adhead D1=D1+ 2 maj du ptr de pile. adhead ST=1 0 pour retour de ADHEAD. D0=(5) AVMEMS C=DAT0 A D=C A C=R2 ajoute la valeur mini È * la chaÑne. GOSBVL STKCHR LCHEX 08 A=R0 C=C-A B calcule nb de mauvais * bits. GOSBVL STKCHR ajoute ce nb È la chaÑne. C=R3 CSR A CSR A GOSBVL STKCHR ajout second octet long. C=R3 GOSBVL STKCHR ajout premier octet long. GOSBVL ADHEAD ajout header. GOSBVL REV$ renverse la chaÑne compr. D0=(5) FUNCD0 Restaure PC. C=DAT0 A D0=C GOTO expr *********************************************** * DÅcale A[A] È gauche de C[B] bits. aslbAC C=C-1 B RTNC A=A+A A GOTO aslbAC *********************************************** * Lp = longueur (octets) de la chaÑne comprimÅe * Lo = longueur (octets) de la chaÑne originale * Of = Overhead * U = nb de bits restant È dÅcomprimer * G = nb octets significatifs * S = nb de bits de dÅcalage * NIBHEX 411 dunpck GOSBVL REVPOP renverse la chaÑne. CD0EX Sauve le PC. D0=(5) FUNCD0 DAT0=C A CD1EX D0=C D0 ^ header C=C+A A C[A] ^ fin de chaÑne D1=C D1 ^ fin de chaÑne D=C A D ^ fin de chaÑne A=0 W A=DAT0 8 lit l'en-tÁte. C=0 W C=A A C=P 4 R3=C longueur originale. ASR W ASR W ASR W ASR W C=0 A LCHEX 8 C=C-A B nb de bits significatifs. R0=C Sauve G. ASR W ASR W R2=A valeur ASCII minimum. D0=D0+ 8 D0 ^ dÅbut chaÑne compr. CD0EX D0=C D=D-C A D[A] = longueur (nibbles) D=D+D A D=D+D A Calcule: Lp * 8. C=R3 longueur chaÑne originale C=C+C A convertit en nibbles. GOSBVL STRHDR D1 ^ dÅbut chaÑne dÅcomp. * R1[A] ^ sommet pile A=R0 C=R3 GOSBVL A-MULT Calcule: Lo * G. C=A A D=D-C A Of = Lp * 8 - Lo * G. LCHEX 08 CDEX B D=D-C B U = 8 - Of A=0 W A=DAT0 B lit premier caractÉre. GOSUB aslbAC cadre È gauche. C=R3 B=C A Initialise la boucle. * unpklp B=B-1 A TANT-QUE caractÉres FAIRE GOC unpkot C=A B A=0 W octet nul devant le A=C B caractÉre courant. C=R0 ?C= U ALORS GOYES outif C=D B S = U. GOSUB aslbAC supprime S bits. C=R0 C=C-D B S = G - U. A=C B LCHEX 08 D=D+C B U = U + 8. C=A B D0=D0+ 2 MÈJ du ptr source. A=DAT0 B lit le car suivant. * FINSI. outif GOSUB aslbAC supprime S bits. C=A A CSR A CSR A AR2EX C=C+A B ajoute la valeur mini. AR2EX DAT1=C B ecrit le car. decomp. C=R0 D=D-C B U = U - G. D1=D1+ 2 maj du ptr destination GONC unpklp * FIN-TANT-QUE. unpkot C=R1 D1=C D1 ^ sommet de pile GOSBVL REV$ Renverse la chaÑne D0=(5) FUNCD0 Restaure le PC. C=DAT0 A D0=C * expr GOVLNG EXPR * END