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