PAGE 59,132 ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ;ÛÛ ÛÛ ;ÛÛ ROOT ÛÛ ;ÛÛ ÛÛ ;ÛÛ Created: 30-Aug-92 ÛÛ ;ÛÛ Passes: 5 Analysis Options on: none ÛÛ ;ÛÛ ÛÛ ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ data_0001e equ 78h data_0002e equ 7C0Bh ;* data_0003e equ 7C0Dh ;* data_0004e equ 7C0Eh ;* data_0005e equ 7C10h ;* data_0006e equ 7C11h ;* data_0007e equ 7C13h ;* data_0008e equ 7C15h ;* data_0009e equ 7C16h ;* data_0010e equ 7C18h ;* data_0011e equ 7C1Ah ;* data_0012e equ 7C1Ch ;* data_0013e equ 7C1Eh ;* data_0014e equ 7C20h ;* data_0015e equ 7C24h ;* data_0016e equ 7C25h ;* data_0017e equ 7C3Eh ;* data_0018e equ 7C49h ;* data_0019e equ 7C4Bh ;* data_0020e equ 7C4Dh ;* data_0021e equ 7C4Fh ;* data_0022e equ 7C50h ;* data_0023e equ 7C52h ;* data_0024e equ 7D9Eh ;* data_0025e equ 7DE6h ;* seg_a segment byte public assume cs:seg_a, ds:seg_a org 100h root proc far start: jmp short loc_0002 db 90h db 'MSDOS5.0' db 00h, 02h, 04h, 01h, 00h, 02h db 00h, 02h,0FEh,0EFh,0F8h, 3Ch db 00h, 11h, 00h, 0Fh, 00h, 11h db 7 dup (0) db 80h, 00h, 29h, 27h, 45h, 08h db 19h db 'MS-DOS_5 FAT16 ' loc_0002: cli ; Disable interrupts xor ax,ax ; Zero register mov ss,ax mov sp,7C00h push ss pop es mov bx,data_0001e lds si,dword ptr ss:[bx] ; Load 32 bit ptr push ds push si push ss push bx mov di,data_0017e mov cx,0Bh cld ; Clear direction rep movsb ; Rep when cx >0 Mov [si] to es:[di] push es pop ds mov byte ptr [di-2],0Fh mov cx,ds:data_0010e mov [di-7],cl mov [bx+2],ax mov word ptr [bx],7C3Eh sti ; Enable interrupts int 13h ; Disk dl=drive a ah=func 00h ; reset disk, al=return status jc loc_0004 ; Jump if carry Set xor ax,ax ; Zero register cmp ds:data_0007e,ax je loc_0003 ; Jump if equal mov cx,ds:data_0007e mov ds:data_0014e,cx loc_0003: mov al,ds:data_0005e mul word ptr ds:data_0009e ; ax = data * ax add ax,ds:data_0012e adc dx,ds:data_0013e add ax,ds:data_0004e adc dx,0 mov ds:data_0022e,ax mov ds:data_0023e,dx mov ds:data_0018e,ax mov ds:data_0019e,dx mov ax,20h mul word ptr ds:data_0006e ; ax = data * ax mov bx,ds:data_0002e add ax,bx dec ax div bx ; ax,dx rem=dx:ax/reg add ds:data_0018e,ax adc word ptr ds:data_0019e,0 mov bx,500h mov dx,ds:data_0023e mov ax,ds:data_0022e call sub_0002 jc loc_0004 ; Jump if carry Set mov al,1 call sub_0003 jc loc_0004 ; Jump if carry Set mov di,bx mov cx,0Bh mov si,data_0025e repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di] jnz loc_0004 ; Jump if not zero lea di,[bx+20h] ; Load effective addr mov cx,0Bh repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di] jz loc_0006 ; Jump if zero loc_0004: mov si,data_0024e call sub_0001 xor ax,ax ; Zero register int 16h ; Keyboard i/o ah=function 00h ; get keybd char in al, ah=scan pop si pop ds pop word ptr [si] pop word ptr [si+2] int 19h ; Bootstrap loader loc_0005: pop ax pop ax pop ax jmp short loc_0004 loc_0006: mov ax,[bx+1Ah] dec ax dec ax mov bl,ds:data_0003e xor bh,bh ; Zero register mul bx ; dx:ax = reg * ax add ax,ds:data_0018e adc dx,ds:data_0019e mov bx,700h mov cx,3 locloop_0007: push ax push dx push cx call sub_0002 jc loc_0005 ; Jump if carry Set mov al,1 call sub_0003 pop cx pop dx pop ax jc loc_0004 ; Jump if carry Set add ax,1 adc dx,0 add bx,ds:data_0002e loop locloop_0007 ; Loop if cx > 0 mov ch,ds:data_0008e mov dl,ds:data_0015e mov bx,ds:data_0018e mov ax,ds:data_0019e ;* jmp far ptr loc_0001 ;* db 0EAh, 00h, 00h, 70h, 00h root endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_0001 proc near loc_0008: lodsb ; String [si] to al or al,al ; Zero ? jz loc_ret_0010 ; Jump if zero mov ah,0Eh mov bx,7 int 10h ; Video display ah=functn 0Eh ; write char al, teletype mode jmp short loc_0008 ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_0002: cmp dx,ds:data_0010e jae loc_0009 ; Jump if above or = div word ptr ds:data_0010e ; ax,dxrem=dx:ax/data inc dl mov ds:data_0021e,dl xor dx,dx ; Zero register div word ptr ds:data_0011e ; ax,dxrem=dx:ax/data mov ds:data_0016e,dl mov ds:data_0020e,ax clc ; Clear carry flag retn loc_0009: stc ; Set carry flag loc_ret_0010: retn sub_0001 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_0003 proc near mov ah,2 mov dx,ds:data_0020e mov cl,6 shl dh,cl ; Shift w/zeros fill or dh,ds:data_0021e mov cx,dx xchg ch,cl mov dl,ds:data_0015e mov dh,ds:data_0016e int 13h ; Disk dl=drive ? ah=func 02h ; read sectors to memory es:bx ; al=#,ch=cyl,cl=sectr,dh=head retn sub_0003 endp db 0Dh, 0Ah, 'Non-System disk or dis' db 'k error', 0Dh, 0Ah, 'Replace and' db ' press any key when ready', 0Dh, 0Ah db 0 db 'IO SYSMSDOS SYS' db 00h, 00h, 55h,0AAh seg_a ends end start