;:::::::::::::::::::::::::::::::::::::::::
;:      Sito:  www.byteman.it  OpenWeb  ::
;:  Raccolta:  Particelle PAS+ASM       ::
;:    Autore:  Salvo Rosta aka byteman  ::
;:    Titolo:  XCOMPR.ASM               ::
;: Revisione:  07-04-1994               ::
;:::::::::::::::::::::::::::::::::::::::::

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;:        XCOMPR.ASM   -  Versione: 24-agosto-1991, a cura di Salvo Rosta.  ::
;:                                                                          ::
;: Function  XCompress(String)    ; Comprime serie di Ch con FFh+Ch+n       ::
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
CODE      SEGMENT BYTE PUBLIC
          ASSUME  CS:CODE
          PUBLIC  XCompress

Function  EQU     DWORD PTR [BP+10]
String    EQU     DWORD PTR [BP+6]
Ctrl      EQU     0FFh

XCompress PROC    FAR
          PUSH    BP
          MOV     BP,SP
          PUSH    DS
          LDS     SI,String           ;Puntatore String in DS:SI
          LES     DI,Function         ;Puntatore Function in ES:DI
          LODSB
          STOSB
          XOR     CH,CH
          MOV     CL,AL
          JCXZ    StopX

          PUSH    DI
          MOV     AH,Ctrl             ; AH = Carattere Controllo  (FFh)
NewCh:    MOV     DX,1                ; Inizializzazione
          LODSB
          DEC     CX
          CMP     CX,0
          JZ      LastBlk

RepCh:    CMP     [SI],AL             ; Ch Seguente = AL ?
          JNE     Block               ;   NO:  Blocco Completato
          INC     SI                  ;   SI:  Carattere Successivo
          INC     DX
          DEC     CX
          CMP     CX,0
          JNZ     RepCh
          JMP     LastBlk

Block:    CMP     DX,3
          JG      ComprYes
          PUSH    CX                  ; Compressione Sospesa: Serie di Ch
          MOV     CX,DX
          REPZ    STOSB
          POP     CX
          JMP     NewCh

ComprYes: MOV     ES:[DI],AH          ; Compressione Effettuata:  Ctrl+Ch+n
          MOV     ES:[DI+1],AL
          MOV     ES:[DI+2],DL
          ADD     DI,3
          JMP     NewCh

LastBlk:  CMP     DX,3
          JG      LastBlk2
          MOV     CX,DX               ; Compressione Sospesa: Serie di Ch
          REPZ    STOSB
          JMP     ComprEnd
LastBlk2: MOV     ES:[DI],AH          ; Compressione Effettuata:  Ctrl+Ch+n
          MOV     ES:[DI+1],AL
          MOV     ES:[DI+2],DL
          ADD     DI,3

ComprEnd: MOV     AX,DI               ; Alterazione Lunghezza Funzione
          POP     DI
          SUB     AX,DI
          DEC     DI
          STOSB
StopX:    POP     DS                  ;Ripristino Registri
          POP     BP
          RET     4
XCompress ENDP

CODE      ENDS
          END