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ň