MODEL SMALL
.STACK 200
.DATA
FTabulka db 'TABULKA.TAB',0 ;nazev prev. tabulky
FVstup db 'VSTUP.TXT',0 ;nazev vstupniho fajlu
FVystup db 'VYSTUP.TXT',0 ;nazev vystupniho fajlu
FH1 dw 0 ;filehandle vstupniho
FH2 dw 0 ;filehandle vystupniho
Buffer db 30000 DUP (0) ;buffer pro nacitana data
MTabulka db 256 DUP (0)
.CODE
START:
mov ax, seg FTabulka ;Nejdrive nastavim DS
mov ds, ax
mov es, ax ;A ES
mov ax, 3D00h ;Otevreni souboru, read only
mov dx, offset FTabulka ;DS:DX ukazuje na nazev fajlu
int 21h
mov bx, ax ;filehandle do bx
push bx ;uschovat na pozdeji
mov ah, 3Fh ;cteni souboru
mov cx, 0FFh ;FF bajtu (256)
mov dx, offset MTabulka ;DS:DX kam nacist
int 21h
pop bx ;vyndat uschovane filehandle
mov ah, 3Eh ;zavreni souboru
int 21h
mov ax, 3D00h ;Otevreni souboru, read only
mov dx, offset FVstup ;DS:DX ukazuje na nazev fajlu
int 21h
mov FH1, ax ;schovat filehandle
mov ah, 3Ch ;Vytvoreni souboru
mov cl, 0 ;Zadny specialni atribut
mov dx, offset FVystup ;DS:DX jmeno vyrabeneho fajlu
int 21h
mov FH2, ax ;Schovat filehandle
Smycka:
mov bx, FH1 ;filehandle do bx
mov ah, 3Fh ;cteni souboru
mov cx, 30000 ;30000 bajtu, cely buffer
mov dx, offset Buffer ;DS:DX kam nacist
int 21h
push ax ;ulozit kolik bajtu bylo nacteno
cld
mov bx, offset MTabulka ;Ukazatel do tabulky
mov si, offset Buffer ;Ukazatel do bufferu (cteni)
mov di, si ;Ukazatel do bufferu (zapis)
mov cx, ax ;Kolik bajtu budu prevadet
xor ah, ah ;Znuluju AH
Kolco:
push bx ;Schovam si zacatek tabulky
lodsb ;AL = [DS:SI]
add bx, ax ;Posunu se v tabulce
mov al, [ds:bx] ;Prevedu
stosb ;Zapisu zpatky do bufferu
pop bx ;Zase ukazuji na zacatek tab.
loop Kolco ;a dalsi bajt bafru
mov ah, 40h ;Zapis fajlu
mov bx, FH2 ;filehandle
pop cx ;kolik bajtu zapsat
push cx ;jeste se to bude hodit
mov dx, offset Buffer ;Kde jsou zapisovana data
int 21h
pop ax ;vytahnu si pocet nactenych bajtu
cmp ax, 30000 ;byl to cely bafr?
jnb Smycka ;a furt dokola, cely soubor
mov ah, 3Eh ;zavreni fajlu
mov bx, FH1 ;filehandle
int 21h
mov ah, 3Eh ;zavreni fajlu
mov bx, FH2 ;filehandle
int 21h
mov ax, 4c00h ;Konec programu, navrat do DOSu
int 21h
END START
výheň