INI.ASM

TITLE "INI" - Rozebere INI soubor a nastavi parametry
.8086                               ; Linkuje se pro 80 86
PAGE 67, 130                        ; Stránka 67 zn., délka 130 zn./řádek








COMMENT @
 ===========================================================================

  Název souboru  :   INI.ASM
  Link OBJ & LIB :   INI.ZIP
  Datum úprav    :   15.08.99
  Verze programu :   4.01
  (c) Copyright  :   1999 by H9K, Medo Zdeněk junior

 ===========================================================================@


 ; Technicka data INI souboru v programech ... :
 ; ---------------------------------------------
 ;
 ; max.velikost:             4 096 bajtu
 ; max.delka radku:            255 znaku
 ;
 ; INI soubor nacteny do pameti musi byt ukoncen sekvenci 00h, 00h
 ;     veskere datove pole musi byt NULOVANA - slouzi to jako dorazy !!!




Knihovna_NST32  SEGMENT PARA PUBLIC 'CODE' USE16
   ASSUME CS:Knihovna_NST32

    PUBLIC __ini_test_string     ; EXTRN  __ini_test_string     :PROC :NEAR
    PUBLIC __ini_parametr_adr    ; EXTRN  __ini_parametr_adr    :PROC :NEAR
    PUBLIC __ini_parametr_eadr   ; EXTRN  __ini_parametr_eadr   :PROC :NEAR
    PUBLIC __ini_low_buffer      ; EXTRN  __ini_low_buffer      :PROC :NEAR
    PUBLIC __ini_filtr_buffer    ; EXTRN  __ini_filtr_buffer    :PROC :NEAR
    PUBLIC __ini_read_row_buffer ; EXTRN  __ini_read_row_buffer :PROC :NEAR
    PUBLIC __ini_zero_buffer     ; EXTRN  __ini_zero_buffer     :PROC :NEAR
    PUBLIC __ini_detect_row      ; EXTRN  __ini_detect_row      :PROC :NEAR
    PUBLIC __&_ini_buffer        ; EXTRN  __&_ini_buffer        :WORD


    __&_ini_buffer       DB 259 dup(0), '$'              ; Pomocny BUFFER










;---------------------------------------------------------------------------
;
; Popis funkce  :  Zjisti pocet radku v INI souboru
; --------------
;
; Volání(např.) :  mov     si, OFFSET Data_INI     ; DS:SI adr. nacteneho INI souboru
; --------------   call    __ini_detect_row        ; Zjisti pocet radku v INI souboru
;
; Výstup        :  CX    = pocet radku
; --------------
;
; Mění registry :  Flags, CX
; --------------
;
;---------------------------------------------------------------------------

 __ini_detect_row  PROC NEAR

     push    ax
     xor     cx, cx                          ; Nuluj

 Hledej_0A:
     lodsb                                   ; Nacti dalsi znak z retezce
     cmp     al, 00h                         ; Je uz konec ?
     jne     No_EndHl                        ; Ne, skoc ...
     pop     ax
     retn                                    ; Navrat

 No_EndHl:
     cmp     al, 0Ah                         ; Je to konec radku ?
     jne     Hledej_0A                       ; Ne, skoc ...
     inc     cx                              ; OK, radek detekovan
     jmp     Hledej_0A

 __ini_detect_row  ENDP






;---------------------------------------------------------------------------
;
; Popis funkce  :  Nuluj pomocny 256 bajtovy buffer
; --------------
;
; Volání(např.) :  call    __ini_zero_buffer       ; Nuluj BUFFER, nastav jeho reg.
; --------------
;
; Výstup        :  neni
; --------------
;
; Mění registry :  Flags
; --------------
;
;---------------------------------------------------------------------------

 __ini_zero_buffer  PROC NEAR
     push    ax cx di es
     mov     ax, cs                          ; AX < - CS
     mov     es, ax                          ; ES < - CS
     mov     cx, 258                         ; Delka nulovani
     mov     di, OFFSET __&_ini_buffer       ; Adr. bufferu
     xor     ax, ax
     rep stosb                               ; Nuluj ES:[__&_ini_buffer]
     pop     es di cx ax
     retn                                    ; Navrat
 __ini_zero_buffer  ENDP






;---------------------------------------------------------------------------
;
; Popis funkce  :  Nacte do BUFFERU vybrany radek. Konec radku je oznacen
; --------------   dvema nulama.
;
; Volání(např.) :  mov     si, OFFSET Data_INI     ; DS:SI adr. INI dat
; --------------   mov     bx, 1                   ; Vybrany radek
;                  call    __ini_read_row_buffer   ; Nacti vybrany INI radek do BUFFERu
;
; Výstup        :  CS:SI   = adr. zacatku radku
; --------------             ( adr.pomoc.BUFFERU, konec je oznacen 2x  0h,0h )
;                  CX      = delka radku
;
; Mění registry :  Flags, SI, CX
; --------------
;
;---------------------------------------------------------------------------

 __ini_read_row_buffer  PROC NEAR
     push    ax dx di ds es
     xor     dx, dx                          ; Pomocne pocitadlo radku
     mov     ax, cs
     mov     es, ax                          ; ES < - CS

 InitR:
     call    __ini_zero_buffer               ; Nuluj BUFFER, nastav jeho reg.
     mov     cx, 00FFh                       ; Velikost BUFFERU
     mov     di, OFFSET __&_ini_buffer       ; Adr. bufferu

 LpR:lodsb                                   ; Nacti dalsi znak z retezce
     cmp     al, 00h                         ; Je uz konec INI DAT ?
     je      Ok_Rowx                         ; Ano, skoc ...
     cmp     al, 0Ah                         ; Je to konec radku ?
     jne     EndRowx                         ; Ne, skoc ...
     inc     dx                              ; OK, radek detekovan
     cmp     bx, dx                          ; Je to hledany radek ?
     je      Ok_Rowx                         ; Ano, skoc ...
     jmp     InitR

 EndRowx:
     stosb                                   ; Uloz znak do BUFFERU
     loop    LpR
     jmp     InitR

 Ok_Rowx:
     mov     cx, di
     sub     cx, OFFSET __&_ini_buffer       ; Spocitej delku radku
     xor     ax, ax                          ; Konec radku
     stosw                                   ; Oznac konec row
     pop     es ds di dx ax
     mov     si, OFFSET __&_ini_buffer       ; Adr. bufferu
     retn                                    ; Navrat
 __ini_read_row_buffer  ENDP






;---------------------------------------------------------------------------
;
; Popis funkce  :  Filtruje nacteny radek v BUFFERU.
; --------------   Hleda strednik, to co je za nim, vynuluje.
;                  Je-li posunut zacatek prikazu o nekolik mezer,
;                  zarovna jej na zacatek v levo.
;
;
; Volání(např.) :  call    __ini_filtr_buffer          ; Odfiltruj data ze strednikem
; --------------
;
; Výstup        :  neni
; --------------
;
; Mění registry :  Flags
; --------------
;
;---------------------------------------------------------------------------

 __ini_filtr_buffer  PROC NEAR
     push    ax cx si di ds es
     mov     ax, cs
     mov     es, ax                          ; ES < - CS
     mov     ds, ax                          ; DS < - CS
     mov     cx, 00FFh                       ; Velikost BUFFERu
     mov     si, OFFSET __&_ini_buffer       ; Adr. bufferu
     mov     di, si

     push    cx si di                        ; Uloz nastaveni
     push    cx si di

;        --------------- Filtruj data za strednikem -----------------
 Filtruj:
     lodsb                                   ; Nacti dalsi znak z retezce
     cmp     al, ';'                         ; Je to strednik ?
     jne     NoStred                         ; Ne, skoc ...
     xor     ax, ax                          ; AX < - 0000
     rep stosb                               ; Vynuluj cely radek
     jmp     EndFlr

 NoStred:
     stosb                                   ; Uloz znak
     loop    Filtruj                         ; Opakuj smycku

;            --------------- Zarovnej text vlevo -----------------
 EndFlr:
     pop     di si cx                        ; Obnov nastaveni

 Rov:lodsb                                   ; Nacti dalsi znak z retezce
     cmp     al, ' '                         ; Je to mezera ?
     jne     OKMezera                        ; Ne, skoc ...
     loop    Rov
     jmp     EndFlrText

 OKMezera:
     jcxz    EndFlrText                      ; Je CX=0000, skoc ...
     stosb                                   ; Uloz nacteny znak
     rep movsb                               ; Prenes zbytek radku

;           --------------- Nuluj od prava k textu -----------------
 EndFlrText:
     pop     di si cx                        ; Obnov nastaveni
     std                                     ; Zpracovani retezcu
     add     si, cx                          ; Spocitej konec radku
     add     di, cx                          ; Spocitej konec radku

 NPT:lodsb
     cmp     al, ' '
     je      Ok_Norm
     cmp     al, 0
     je      Ok_Norm
     cmp     al, 7
     je      Ok_Norm
     cmp     al, 10
     je      Ok_Norm
     cmp     al, 13
     je      Ok_Norm
     jmp     KonecCllear


 Ok_Norm:
     xor     ax, ax
     stosb
     loop    NPT

KonecCllear:
     cld                                     ; Zpracovani retezcu
     pop     es ds di si cx ax
     retn                                    ; Navrat
 __ini_filtr_buffer  ENDP






;---------------------------------------------------------------------------
;
; Popis funkce  :  Nastavi vsechny velke ASCII znaky na male pismena
; --------------   Ukonci se, jakmile natazi na doraz - 0
;                  Vypocita velikost dat v radku.
;
; Volání(např.) :  call    __ini_low_buffer      ; Nastav male pismena v BUFFERU
; --------------
;
; Výstup        :  CX 0 = velikost dat v radku
; --------------
;
; Mění registry :  Flags, CX
; --------------
;
;---------------------------------------------------------------------------

 __ini_low_buffer  PROC NEAR
     push    ax si di ds es
     mov     ax, cs
     mov     es, ax                          ; ES < - CS
     mov     ds, ax                          ; DS < - CS
     mov     cx, 00FFh                       ; Velikost BUFFERu
     mov     si, OFFSET __&_ini_buffer       ; Adr. bufferu
     mov     di, si

 Low_F:
     lodsb                                   ; Nacti dalsi znak z retezce
     cmp     al, 0                           ; Je uz konec ?
     je      Poc_LF                          ; Ano, skoc ...
     cmp     al, 65                          ; Je to pod 65 'A' ?
     jb      Ok_PrMez                        ; Ne, preskoc
     cmp     al, 90                          ; Je to nad 90 'Z' ?
     ja      Ok_PrMez                        ; Ne, preskoc
     or      al, 00100000b                   ; Nastav znak na male ASCII
 Ok_PrMez:
     stosb                                   ; Uloz znak
     loop    Low_F                           ; Opakuj smycku

 Poc_LF:
     mov     ax, 00FFh
     sub     ax, cx                          ; Spocitej velikost $
     mov     cx, ax
     pop     es ds di si ax
     retn                                    ; Navrat
 __ini_low_buffer  ENDP






;---------------------------------------------------------------------------
;
; Popis funkce  :  Testuje shodu mezi dvema retezci.
; --------------   Retezec musi byt souhlasne ukoncen:
;                                            - mezerou
;                                            - nulou
;                                            - $
;                                            - =
;                                            - ;
;
; Volání(např.) :  mov     si, OFFSET Str1       ; ds:si 1.testovany retezec
; --------------   mov     di, OFFSET Str2       ; ds:di 2.testovany retezec
;                  call    __ini_test_string     ; Jsou oba retezce schodne ?
;
; Výstup        :  CF = 1  - retezce jsou schodne
; --------------   CF = 0  - retezce nejsou schodne
;                  CX      - delka testovaneho retezce
;
; Mění registry :  Flags, CX
; --------------
;
;---------------------------------------------------------------------------

 __ini_test_string  PROC NEAR
    push    ax si di
    xor     cx, cx

 TesS:lodsb                                  ; Nacti znak z 1. retezce DS:SI
     cmp     al, ' '                         ; Je to mezera ?
     je      Konec_TS                        ; Ano, skoc ...
     cmp     al, '$'                         ; Je to $ ?
     je      Konec_TS                        ; Ano, skoc ...
     cmp     al, '='                         ; Je to = ?
     je      Konec_TS                        ; Ano, skoc ...
     cmp     al, ';'                         ; Je to ; ?
     je      Konec_TS                        ; Ano, skoc ...

     cmp     al, 0                           ; Je to NULA ?
     je      Konec_TS                        ; Ano, skoc ...

     cmp     al, byte ptr ds:[di]            ; Je stejny ?
     jne     No_TS                           ; Ne, preskoc

     inc     cx                              ; Pocitadlo delky retezce
     inc     di                              ; Znak v 2.retezci
     jmp     TesS                            ; Opakuj test


 No_TS:
     clc                                     ; CF = 0
     pop     di si ax
     retn                                    ; Navrat

 Konec_TS:
     stc                                     ; CF = 1
     pop     di si ax
     retn                                    ; Navrat
 __ini_test_string  ENDP






;---------------------------------------------------------------------------
;
; Popis funkce  :  Najde parametr za rovnitkem v BUFFERu.
; --------------
;
; Volání(např.) :  call    __ini_parametr_adr     ; Najdi adr.promneny
; --------------
;
; Výstup        :  CS:SI   = adresa (BUFFERu) dat za promnenou
; --------------
;
; Mění registry :  Flags, SI
; --------------
;
;---------------------------------------------------------------------------

 __ini_parametr_adr  PROC NEAR
     push    ax ds
     mov     ax, cs
     mov     ds, ax
     mov     cx, 00FFh                       ; Velikost BUFFERu
     mov     si, OFFSET __&_ini_buffer       ; Adr. bufferu

 Par:lodsb                                   ; Nacti znak z BUFFERu
     cmp     al, '='                         ; Je to = ?
     je      Ok_Rov                          ; Ano, skoc ...
     loop    Par                             ; Opakuj test
     jmp     End_Par

 Ok_Rov:
     cmp     byte ptr cs:[si], ' '           ; Je to mezera
     jne     End_Par                         ; Ne, skoc ...
     inc     si                              ; Dalsi ASCII znak z INI souboru
     loop    Ok_Rov                          ; Hledej znak

 End_Par:
     pop     ds ax
     retn                                    ; Navrat
 __ini_parametr_adr  ENDP






;---------------------------------------------------------------------------
;
; Popis funkce  :  Najde konec parametru za rovnitkem v BUFFERu.
; --------------   Zmeri delku parametru.
;                  Retezec je ukoncen pokud proc.najde:
;                                           - mezerou
;                                           - nulou
;                                           - ;
;
; Volání(např.) :  call    __ini_parametr_eadr    ; Najdi end-adr.promneny
; --------------
;
; Výstup        :  CS:SI   = koncova adresa (BUFFERu) dat za promnenou
; --------------   CX      = velikost dat
;
; Mění registry :  Flags, CX, SI
; --------------
;
;---------------------------------------------------------------------------

 __ini_parametr_eadr  PROC NEAR
     push    ax ds
     mov     ax, cs
     mov     ds, ax
     mov     cx, 00FFh                       ; Velikost BUFFERu
     call    __ini_parametr_adr              ; Najdi adr.promneny

 EPar:lodsb                                  ; Nacti znak z BUFFERu
     cmp     al, ' '                         ; Je to ' ' ?
     je      Ok_Eipe                         ; Ano, skoc ...
     cmp     al, 0                           ; Je to 0 ?
     je      Ok_Eipe                         ; Ano, skoc ...
     cmp     al, ';'                         ; Je to ';' ?
     je      Ok_Eipe                         ; Ano, skoc ...
     loop    EPar                            ; Opakuj test


 Ok_Eipe:
     dec     si                              ; Predchozi ASCII znak z INI souboru
     mov     ax, 00FFh
     sub     ax, cx                          ; Spocitej velikost $
     mov     cx, ax
     pop     ds ax
     retn                                    ; Navrat
 __ini_parametr_eadr  ENDP




Knihovna_NST32  ENDS
END
		



© Copyright 1992-2008 by Zdeněk MEDO jr.