;::::::::::::::::::::::::::::::::::::::::::::::::::::
::                  Logo:  Edizioni ByteMan        ::
::               Collana:  Particelle Didattiche   ::
::             Argomento:  Assembly 8086           ::
::      Titolo originale:  XDETAB.ASM              ::
:: Autore e Proprietario:  Salvatore ROSTA         ::
::      Ultima revisione:  07-04-1994              ::
::         Sito Internet:  w3.quipo.it/byteman     ::
::                e-mail:  byteman@quipo.it        ::
::                                                 ::
::     Tutti i diritti riservati (c)1993..2000     ::
;::::::::::::::::::::::::::::::::::::::::::::::::::::

COMMENT * ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::        XDETAB.ASM   -  Revisione 24-agosto-1991, a cura di Salvo Rosta.  ::
::                                                                          ::
:: Function  XDeTab(String,N)        ; Complementare di XTab                ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*
CODE      SEGMENT BYTE PUBLIC
          ASSUME  CS:CODE
          PUBLIC  XDeTab

Function  EQU     DWORD PTR [BP+12]
String    EQU     DWORD PTR [BP+8]
TabSize   EQU     BYTE PTR [BP+6]
CharTab   EQU     9
CharSpa   EQU     32

XDeTab      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                       ;Lettura Lunghezza String
          STOSB                       ;Scrittura Lunghezza Iniziale Function
          XOR     CH,CH
          MOV     CL,AL               ;Inizializza CX
          JCXZ    StopX               ;Smetti se CX=0

          PUSH    DI                  ;Salva (Offset+1) Function
          MOV     AH,CharTab          ;Carattere TAB
          MOV     BL,0                ;Colonna Attuale Impegnata
          MOV     BH,8                ;TabSize

ReadCh:   LODSB                       ;Lettura Carattere
          CMP     AL,AH               ;Carattere = TAB ?
          JNE     Normal              ;  NO: Gestione Normale
          PUSH    CX                  ;Salvataggio Registri
          PUSH    AX
          XOR     AH,AH
          MOV     AL,BL               ;Carica Contatore
          MOV     CL,8
          DIV     CL
          SUB     CL,AH
          MOV     AL,CharSpa          ;Carica Spazio
          ADD     BL,CL
          REP     STOSB               ;Scrivi
          POP     AX                  ;Ripristino Registri
          POP     CX
          JMP     Ciclo

Normal:   STOSB                       ;Scrittura Carattere
          INC     BL                  ;Colonna Attuale Impegnata
Ciclo:    LOOP    ReadCh

Uscita:   MOV     AX,DI
          POP     DI                  ;Ripristino (Offset+1) Funzione
          SUB     AX,DI
          DEC     DI
          STOSB                       ;Lunghezza Definitiva Funzione

StopX:    POP     DS                  ;Ripristino Registri
          POP     BP
          RET     6
XDeTab      ENDP

CODE      ENDS
          END


;::::::::::::::::  FINE FILE  :::::::::::::::::::