; Program zamienia wszystkie polskie znaki w podanym pliku na "nie-polskie" ; (pozbawia polskie znaki "ogonkow"). ; ; Skladnia: ; "bez_pol" i program poprosi o nazwe pliku do przetworzenia ; "bez_pol nazwa_pliku" ; ; Autor: Bogdan D. ; kontakt: bogdandr (at) op (dot) pl ; ; nasm -O999 -o bez_pol.com -f bin bez_pol.asm ; ; Copyright (C) 2005-2007 Bogdan 'bogdro' Drozdowski, bogdandr @ op . pl ; ; Ten program jest wolnym oprogramowaniem; mozesz go rozpowszechniac ; i/lub modyfikowac zgodnie z licencja GNU Lesser General Public License ; (GNU LGPL) w wersji wydanej przez Fundacje Wolnego Oprogramowania; ; wedlug wersji 3 Licencji lub (jesli wolisz) jednej z pozniejszych wersji. ; ; Ten program jest udostepniany z nadzieja, ze bedzie uzyteczny, lecz ; BEZ JAKIEJKOLWIEK GWARANCJI; nawet domyslnej gwarancji PRZYDATNOSCI ; HANDLOWEJ albo PRZYDATNOSCI DO OKRESLONYCH ZASTOSOWAN. W celu uzyskania ; blizszych informacji - Licencja GNU Lesser General Public License. ; ; Z pewnoscia wraz z niniejszym programem otrzymales tez egzemplarz ; Licencji GNU Lesser General Public License; jesli nie - napisz do ; Fundacji Wolnego Oprogramowania: ; Free Software Foundation ; 51 Franklin Street, Fifth Floor ; Boston, MA 02110-1301 ; USA org 100h start: mov ax, cs mov ds, ax mov es, ax ; DS = ES = CS mov si, 80h ; SI -> ilosc znakow w linii polecen xor di, di mov bl, [si] ; BL = ilosc znakow inc si ; SI -> pierwszy znak (spacja) mov dx, info mov ah, 9 int 21h ; wyswietlamy informacje o programie or bl, bl ; sprawdzamy dlugosc linii polecen jz bez_arg inc si ; drugi raz, teraz SI -> pierwszy ; znak linii jmp z_arg bez_arg: mov dx, input1 mov ah, 9 int 21h ; wyswietlamy prosbe o wprowadzenie ; danych petla: xor ah, ah int 16h ; pobieramy znak mov ah, 0eh cmp al, 1bh ; sprawdzamy, czy nie Esc jnz znak_dalej jmp zamk_ok znak_dalej: cmp al, 0dh jz input_juz ; jesli Enter, to koniec wczytywania cmp al, 8 jz bksp ; tutaj idziemy, gdy nacisnieto ; BackSpace int 10h ; wyswietlamy pobrany znak cmp di, 7fh ; sprawdzamy, czy nie koniec bufora ; wejsciowego jz input_juz mov [plik+di], al ; zapisujemy znak w buforze inc di jmp short petla ; wczytujemy kolejne znaki bksp: ; tutaj idziemy, gdy nacisnieto ; BackSpace or di, di jz petla ; czy jest co usuwac? dec di ; zmniejszamy ilosc wpisanych znakow int 10h ; usuwamy ostatni znak z ekranu mov al, ' ' int 10h mov al, 8 int 10h jmp short petla input_juz: mov ax, 3d02h ; otworz plik R/W, deny All mov dx, plik int 21h jnc otw_ok call plik_blad ; gdy wystapil jakis blad jmp zamk_ok otw_ok: mov bx, ax ; BX = uchwyt do pliku (file handle) mov bp, 400h ; BP = ilosc bajtow, ktore chcemy ; odczytac czytaj: mov ah, 3fh ; funkcja czytania mov dx, bufor ; dokad mov cx, bp ; ile = kilobajt int 21h ; czytaj jnc czyt_ok call plik_blad czyt_ok: xor di, di ; zaczynamy od pierwszego znaku cmp ax, cx jz zamiana jmp przy_eof ; jesli przeczytalismy mniej, niz ; chcielismy, to koniec pliku. zamiana: mov dl,[bufor+di] ; pobierz znak do sprawdzenia i ; porownuj go z kazdym mozliwym ; znaczkiem polskim. Jesli pasuje, ; zamien na bezogonkowy odpowiednik cmp dl, 0cah ;'E' jnz nie1 mov dl, 'E' jmp juz_zamiana nie1: cmp dl, 0d3h ;'O' jnz nie2 mov dl, 'O' jmp juz_zamiana nie2: cmp dl, 0a5h ;'A' jnz nie3 mov dl, 'A' jmp juz_zamiana nie3: cmp dl, 8ch ;'S' jnz nie4 mov dl, 'S' jmp short juz_zamiana nie4: cmp dl, 0a3h ;'L' jnz nie5 mov dl, 'L' jmp short juz_zamiana nie5: cmp dl, 0afh ;'Z' jnz nie6 mov dl, 'Z' jmp short juz_zamiana nie6: cmp dl, 8fh ;'Z' jnz nie7 mov dl, 'Z' jmp short juz_zamiana nie7: cmp dl, 0c6h ;'C' jnz nie8 mov dl, 'C' jmp short juz_zamiana nie8: cmp dl, 0d1h ;'N' jnz nie9 mov dl, 'N' jmp short juz_zamiana nie9: cmp dl, 0eah ;'e' jnz nie10 mov dl, 'e' jmp short juz_zamiana nie10: cmp dl, 0f3h ;'o' jnz nie11 mov dl, 'o' jmp short juz_zamiana nie11: cmp dl, 0b9h ;'a' jnz nie12 mov dl, 'a' jmp short juz_zamiana nie12: cmp dl, 9ch ;'s' jnz nie13 mov dl, 's' jmp short juz_zamiana nie13: cmp dl, 0b3h ;'l' jnz nie14 mov dl, 'l' jmp short juz_zamiana nie14: cmp dl, 0bfh ;'z' jnz nie15 mov dl, 'z' jmp short juz_zamiana nie15: cmp dl, 9fh ;'z' jnz nie16 mov dl, 'z' jmp short juz_zamiana nie16: cmp dl, 0e6h ;'c' jnz nie17 mov dl, 'c' jmp short juz_zamiana nie17: cmp dl, 0f1h ;'n' jnz juz_zamiana mov dl, 'n' juz_zamiana: ; ewentualnie zmieniony znak ; zapisujemy z powrotem do bufora mov [bufor+di], dl znak_ok: inc di ; przejdz na kolejny znak ;;; loop zamiana dec cx jz znak1 jmp zamiana ; jesli bufor sie jeszcze nie ; skonczyl, idz od nowa ; i sprawdzaj kolejne znaki znak1: ; sprawdzilismy wszystkie znaki. ; Zapisz wynik do pliku. mov dx, ax ; DX = ilosc znakow mov ax, 4201h ; idz do ... od poz. biezacej ;;; mov dx, -400h neg dx ; DX = -ilosc znakow ;;; mov cx, 0ffffh dec cx ; Teraz CX = FFFFh = -1 (bo po wyjsciu ; z petli bylo 0) int 21h ; cofamy sie w pliku o tyle znakow, ; ile przeczytalismy jnc idz_ok call plik_blad idz_ok: mov dx, bufor ; skad zapisywac mov ah, 40h ; funkcja zapisu do pliku mov cx, bp ; CX = ilosc = 1kB int 21h ; zapisz. ;; xor cx, cx ;; mov dx, 400h ;; mov ax, 4201h ;; int 21h ;; jnc czytaj ;; call plik_blad jmp czytaj ; idziemy czytac kolejna porcje przy_eof: ; plik sie skonczyl ;; xor di, di mov bp, ax mov cx,ax ; BP = CX = ilosc ostatnio ; przeczytanych znakow zamiana2: ; petla zamieniajaca znaki na ich ; odpowiedniki mov dl,[bufor+di] cmp dl, 0cah ;'E' jnz nie1_2 mov dl, 'E' jmp juz_zamiana_2 nie1_2: cmp dl, 0d3h ;'O' jnz nie2_2 mov dl, 'O' jmp juz_zamiana_2 nie2_2: cmp dl, 0a5h ;'A' jnz nie3_2 mov dl, 'A' jmp juz_zamiana_2 nie3_2: cmp dl, 8ch ;'S' jnz nie4_2 mov dl, 'S' jmp short juz_zamiana_2 nie4_2: cmp dl, 0a3h ;'L' jnz nie5_2 mov dl, 'L' jmp short juz_zamiana_2 nie5_2: cmp dl, 0afh ;'Z' jnz nie6_2 mov dl, 'Z' jmp short juz_zamiana_2 nie6_2: cmp dl, 8fh ;'Z' jnz nie7_2 mov dl, 'Z' jmp short juz_zamiana_2 nie7_2: cmp dl, 0c6h ;'C' jnz nie8_2 mov dl, 'C' jmp short juz_zamiana_2 nie8_2: cmp dl, 0d1h ;'N' jnz nie9_2 mov dl, 'N' jmp short juz_zamiana_2 nie9_2: cmp dl, 0eah ;'e' jnz nie10_2 mov dl, 'e' jmp short juz_zamiana_2 nie10_2: cmp dl, 0f3h ;'o' jnz nie11_2 mov dl, 'o' jmp short juz_zamiana_2 nie11_2: cmp dl, 0b9h ;'a' jnz nie12_2 mov dl, 'a' jmp short juz_zamiana_2 nie12_2: cmp dl, 9ch ;'s' jnz nie13_2 mov dl, 's' jmp short juz_zamiana_2 nie13_2: cmp dl, 0b3h ;'l' jnz nie14_2 mov dl, 'l' jmp short juz_zamiana_2 nie14_2: cmp dl, 0bfh ;'z' jnz nie15_2 mov dl, 'z' jmp short juz_zamiana_2 nie15_2: cmp dl, 9fh ;'z' jnz nie16_2 mov dl, 'z' jmp short juz_zamiana_2 nie16_2: cmp dl, 0e6h ;'c' jnz nie17_2 mov dl, 'c' jmp short juz_zamiana_2 nie17_2: cmp dl, 0f1h ;'n' jnz juz_zamiana_2 mov dl, 'n' juz_zamiana_2: mov [bufor+di], dl ; zapisanie zmienionego znaku ; z powrotem znak_ok2: inc di ;;; loop zamiana2 dec cx jz znak2 jmp zamiana2 ; jesli zostaly jeszcze znaki, ; to sprawdz je znak2: ; zapisz wynik do pliku mov dx, bp ; DX = ilosc przeczytanych znakow ;;; mov cx, 0ffffh dec cx ; CX = -1 mov ax, 4201h ; funkcja zmiany polozenia w pliku neg dx ; DX = -ilosc przeczytanych znakow int 21h jnc idz_ok2 call plik_blad idz_ok2: mov dx, bufor ; co zapisac mov cx, bp ; ile zapisac mov ah, 40h ; funkcja zapisu int 21h jnc zamk call plik_blad zamk: mov ah, 3eh int 21h ; zamknij plik jnc zamk_ok call plik_blad zamk_ok: mov ax, 4c00h int 21h ; koniec programu ; ====================================== ; gdy podano nam cos na linii polecen z_arg: xor di, di wej: mov al, [si] ; pobierz znak cmp si, 100h jz wej_juz ; sprawdz, czy nie koniec cmp al, 0dh jz wej_juz ; sprawdz, czy juz wszystko ; przepisalismy mov [plik+di], al ; przepisz znak do pliku inc si inc di jmp short wej wej_juz: jmp input_juz ; ======================================= ; obsluga bledow operacji na plikach plik_blad: push ax push bx mov dx,blad_plik mov bx,ax mov ah,9 int 21h ; napisz, ze wystapil blad mov ax,bx call pl ; wyswietl numer bledu pop bx pop ax ret ; ------------------------------------ pl: ; pisze liczbe (4 znaki hex) mov bx, ax shr ax, 12 call pc2 mov al, bh and al, 0fh call pc2 mov al, bl shr al, 4 and al, 0fh call pc2 mov al, bl and al, 0fh call pc2 ret ; ------------------------------------ pc2: ;we: AL - cyfra hex ;wy: pisze cyfre, niszczone ax cmp al, 9 mov ah, 0eh ja hex or al, '0' jmp short PZ hex: add al, 'A'-10 PZ: int 10h ret ; ------------------------------------ info db 'Program zamienia polskie litery w pliku na zwykle.',10,13,'$' input1 db 'Podaj nazwe pliku do przetworzenia: $' plik times 80 db 0 zla_nazwa db 10,13,'Zla nazwa pliku.$' blad_plik db 10,13,'Blad operacji na pliku. Kod: $' bufor times 400h db 0