.DATA EXTRN _AllocExch FWORD EXTRN _InitDevDr FWORD EXTRN _UnMaskIRQ FWORD EXTRN _MaskIRQ FWORD EXTRN _SetIRQVector FWORD EXTRN _EndOfIRQ FWORD EXTRN _SendMsg FWORD EXTRN _ISendMsg FWORD EXTRN _WaitMsg FWORD EXTRN _CheckMsg FWORD EXTRN _Alarm FWORD EXTRN _KillAlarm FWORD EXTRN _Sleep FWORD EXTRN _MicroDelay FWORD EXTRN _OutByte FWORD EXTRN _OutWord FWORD EXTRN _InByte FWORD EXTRN _InWord FWORD EXTRN _ReadCMOS FWORD EXTRN _CopyData FWORD EXTRN _InWords FWORD EXTRN _OutWords FWORD _hd_Cmd DB 8 DUP(0) _fDataReq DB 0h _statbyte DB 0h _hd_control DB 0h _hd_command DB 0h _hd_drive DB 0h _hd_head DB 0h _hd_nsectors DB 0h _hd_sector DB 0h _hd0_type DB 0h _hd0_heads DB 0h _hd0_secpertrk DB 0h _hd0_cyls DW 0h _hd1_type DB 0h _hd1_heads DB 0h _hd1_secpertrk DB 0h _hd1_cyls DW 0h _hdstatus DB 64 DUP(0) _HDStatTmp DB 64 DUP(0) _hdcb DB 128 DUP(0) _hd_exch DD 0h _hd_msg DD 0h _hd_msg2 DD 0h _HDDInt DD 0h .CODE EXTRN _xprintf: NEAR PUBLIC _hdisk_setup: PUSH EBP MOV EBP,ESP SUB ESP,4 MOV ESI,OFFSET _hdcb MOV EAX,72 MOV BYTE PTR [ESI], AL MOV ESI,OFFSET _hdcb MOV EAX,1 ADD ESI,EAX MOV EAX,68 MOV BYTE PTR [ESI], AL MOV ESI,OFFSET _hdcb MOV EAX,2 ADD ESI,EAX MOV EAX,48 MOV BYTE PTR [ESI], AL MOV ESI,OFFSET _hdcb MOV EAX,3 MOV BYTE PTR [ESI+12], AL MOV ESI,OFFSET _hdcb MOV EAX,1 MOV BYTE PTR [ESI+13], AL MOV ESI,OFFSET _hdcb MOV EAX,512 MOV WORD PTR [ESI+14], AX MOV ESI,OFFSET _hdcb MOV EAX,524288 MOV DWORD PTR [ESI+20], EAX MOV ESI,OFFSET _hdcb MOV EAX,OFFSET _hddev_op MOV DWORD PTR [ESI+24], EAX MOV ESI,OFFSET _hdcb MOV EAX,OFFSET _hddev_init MOV DWORD PTR [ESI+28], EAX MOV ESI,OFFSET _hdcb MOV EAX,OFFSET _hddev_stat MOV DWORD PTR [ESI+32], EAX MOV EAX,64 MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,72 MOV BYTE PTR [ESI], AL MOV EAX,64 MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,1 ADD ESI,EAX MOV EAX,68 MOV BYTE PTR [ESI], AL MOV EAX,64 MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,2 ADD ESI,EAX MOV EAX,49 MOV BYTE PTR [ESI], AL MOV EAX,64 MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,3 MOV BYTE PTR [ESI+12], AL MOV EAX,64 MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,1 MOV BYTE PTR [ESI+13], AL MOV EAX,64 MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,512 MOV WORD PTR [ESI+14], AX MOV EAX,64 MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,524288 MOV DWORD PTR [ESI+20], EAX MOV EAX,64 MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,OFFSET _hddev_op MOV DWORD PTR [ESI+24], EAX MOV EAX,64 MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,OFFSET _hddev_init MOV DWORD PTR [ESI+28], EAX MOV EAX,64 MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,OFFSET _hddev_stat MOV DWORD PTR [ESI+32], EAX PUSH 25 CALL FWORD PTR _ReadCMOS MOV _hd0_type, AL MOV EAX,16 MOV _hd0_heads, AL MOV EAX,17 MOV _hd0_secpertrk, AL MOV EAX,1024 MOV _hd0_cyls, AX PUSH 26 CALL FWORD PTR _ReadCMOS MOV _hd1_type, AL MOV EAX,16 MOV _hd1_heads, AL MOV EAX,17 MOV _hd1_secpertrk, AL MOV EAX,1024 MOV _hd1_cyls, AX PUSH OFFSET _hd_exch CALL FWORD PTR _AllocExch MOV DWORD PTR [EBP-4], EAX PUSH 14 PUSH OFFSET _hdisk_isr CALL FWORD PTR _SetIRQVector PUSH 14 CALL FWORD PTR _UnMaskIRQ CALL _hd_reset XOR EAX,EAX PUSH EAX CALL _hd_recal MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JZ L_1 CALL _hd_reset XOR EAX,EAX PUSH EAX CALL _hd_recal MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JZ L_2 MOV ESI,OFFSET _hdcb MOV EAX,DWORD PTR [EBP-4] MOV DWORD PTR [ESI+16], EAX XOR EAX,EAX MOV _hd0_type, AL MOV EAX,655 JMP L_3 L_2: L_1: XOR EAX,EAX MOV AL,_hd1_type AND EAX,EAX JZ L_4 PUSH 1 CALL _hd_recal MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JZ L_5 MOV EAX,64 MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,DWORD PTR [EBP-4] MOV DWORD PTR [ESI+16], EAX XOR EAX,EAX MOV _hd1_type, AL MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_6 CALL _hd_reset L_6: XOR EAX,EAX PUSH EAX CALL _hd_recal MOV DWORD PTR [EBP-4], EAX MOV ESI,OFFSET _hdcb MOV EAX,DWORD PTR [EBP-4] MOV DWORD PTR [ESI+16], EAX L_5: L_4: PUSH 12 PUSH OFFSET _hdcb PUSH 2 PUSH 1 CALL FWORD PTR _InitDevDr MOV DWORD PTR [EBP-4], EAX L_3: MOV ESP,EBP POP EBP RETN _hd_reset: PUSH EBP MOV EBP,ESP SUB ESP,4 PUSH 14 CALL FWORD PTR _UnMaskIRQ PUSH 4 PUSH 1014 CALL FWORD PTR _OutByte PUSH 4 CALL FWORD PTR _MicroDelay XOR EAX,EAX MOV AL,_hd_control MOV ECX,15 AND EAX,ECX PUSH EAX PUSH 1014 CALL FWORD PTR _OutByte PUSH 20 CALL FWORD PTR _Sleep PUSH _hd_exch PUSH OFFSET _hd_msg CALL FWORD PTR _CheckMsg MOV DWORD PTR [EBP-4], EAX MOV ESI,OFFSET _hdstatus XOR EAX,EAX MOV AL,_statbyte MOV BYTE PTR [ESI+54], AL MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JZ L_7 MOV ESI,OFFSET _hdstatus MOV EAX,1 MOV BYTE PTR [ESI+42], AL JMP L_8 L_7: MOV ESI,OFFSET _hdstatus XOR EAX,EAX MOV BYTE PTR [ESI+42], AL L_8: MOV ESP,EBP POP EBP RETN _hdisk_isr: PUSHAD PUSH 503 CALL FWORD PTR _InByte MOV _statbyte, AL MOV EAX,1 MOV _HDDInt, EAX PUSH _hd_exch PUSH -16 PUSH -16 CALL FWORD PTR _ISendMsg PUSH 14 CALL FWORD PTR _EndOfIRQ POPAD IRETD _check_busy: PUSH EBP MOV EBP,ESP SUB ESP,2 XOR EAX,EAX MOV WORD PTR [EBP-2], AX L_9: MOVSX EAX,WORD PTR [EBP-2] INC WORD PTR [EBP-2] CMP EAX,60 SETL AL AND AL,AL JZ L_10 PUSH 503 CALL FWORD PTR _InByte MOV _statbyte, AL XOR EAX,EAX MOV AL,_statbyte MOV ECX,128 AND EAX,ECX XOR ECX,ECX CMP EAX,ECX SETE AL AND AL,AL JZ L_11 XOR EAX,EAX JMP L_12 L_11: PUSH 5 CALL FWORD PTR _Sleep JMP L_9 L_10: MOV EAX,667 L_12: MOV ESP,EBP POP EBP RETN _hd_init: PUSH EBP MOV EBP,ESP SUB ESP,4 XOR EAX,EAX MOV AL,BYTE PTR [EBP+8] XOR ECX,ECX CMP EAX,ECX SETE AL AND AL,AL JZ L_13 MOV EAX,2 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,_hd0_secpertrk MOV BYTE PTR [ESI], AL MOV EAX,6 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,BYTE PTR [EBP+8] MOV ECX,4 SHL EAX,CL AND EAX,0FFh MOV EBX,EAX XOR EAX,EAX MOV AL,_hd0_heads MOV ECX,1 SUB EAX,ECX MOV ECX,15 AND EAX,ECX MOV ECX,EBX OR EAX,ECX MOV ECX,160 OR EAX,ECX MOV BYTE PTR [ESI], AL JMP L_14 L_13: MOV EAX,2 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,_hd1_secpertrk MOV BYTE PTR [ESI], AL MOV EAX,6 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,BYTE PTR [EBP+8] MOV ECX,4 SHL EAX,CL AND EAX,0FFh MOV EBX,EAX XOR EAX,EAX MOV AL,_hd1_heads MOV ECX,1 SUB EAX,ECX MOV ECX,15 AND EAX,ECX MOV ECX,EBX OR EAX,ECX MOV ECX,160 OR EAX,ECX MOV BYTE PTR [ESI], AL L_14: MOV EAX,1 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV BYTE PTR [ESI], AL MOV EAX,3 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV BYTE PTR [ESI], AL MOV EAX,4 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV BYTE PTR [ESI], AL MOV EAX,5 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV BYTE PTR [ESI], AL PUSH 145 CALL _send_command MOV DWORD PTR [EBP-4], EAX CALL _hd_wait MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_15 PUSH 145 CALL _hd_status MOV DWORD PTR [EBP-4], EAX L_15: MOV EAX,DWORD PTR [EBP-4] MOV ESP,EBP POP EBP RETN 4 _hd_wait: PUSH EBP MOV EBP,ESP SUB ESP,4 XOR EAX,EAX MOV _HDDInt, EAX PUSH _hd_exch CALL FWORD PTR _KillAlarm PUSH _hd_exch PUSH 300 CALL FWORD PTR _Alarm MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JZ L_17 MOV EAX,DWORD PTR [EBP-4] JMP L_18 L_17: PUSH _hd_exch PUSH OFFSET _hd_msg CALL FWORD PTR _WaitMsg MOV DWORD PTR [EBP-4], EAX PUSH _hd_exch CALL FWORD PTR _KillAlarm MOV EAX,_hd_msg CMP EAX,-16 SETNE AL AND AL,AL JZ L_19 MOV EAX,_HDDInt AND EAX,EAX JZ L_20 MOV EAX,675 JMP L_18 L_20: MOV EAX,660 JMP L_18 L_21: JMP L_22 L_19: PUSH _hd_exch CALL FWORD PTR _KillAlarm XOR EAX,EAX L_22: L_18: MOV ESP,EBP POP EBP RETN _hd_recal: PUSH EBP MOV EBP,ESP SUB ESP,4 MOV EAX,6 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,BYTE PTR [EBP+8] MOV ECX,4 SHL EAX,CL AND EAX,0FFh MOV EBX,EAX XOR EAX,EAX MOV AL,_hd_head MOV ECX,15 AND EAX,ECX MOV ECX,EBX OR EAX,ECX MOV ECX,160 OR EAX,ECX MOV BYTE PTR [ESI], AL PUSH 16 CALL _send_command MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_23 CALL _hd_wait MOV DWORD PTR [EBP-4], EAX L_23: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_24 PUSH 16 CALL _hd_status MOV DWORD PTR [EBP-4], EAX L_24: XOR EAX,EAX MOV AL,BYTE PTR [EBP+8] AND EAX,EAX JZ L_25 MOV ESI,OFFSET _hdstatus MOV EAX,DWORD PTR [EBP-4] MOV DWORD PTR [ESI+44], EAX JMP L_26 L_25: MOV ESI,OFFSET _hdstatus MOV EAX,DWORD PTR [EBP-4] MOV DWORD PTR [ESI+32], EAX L_26: MOV EAX,DWORD PTR [EBP-4] MOV ESP,EBP POP EBP RETN 4 _send_command: PUSH EBP MOV EBP,ESP SUB ESP,12 L_28: PUSH _hd_exch LEA EAX,DWORD PTR [EBP-12] PUSH EAX CALL FWORD PTR _CheckMsg CMP EAX,0 SETE AL AND AL,AL JZ L_29 JMP L_28 L_29: XOR EAX,EAX MOV AL,_hd_head CMP EAX,7 SETA AL AND AL,AL JZ L_30 XOR EAX,EAX MOV AL,_hd_control MOV ECX,8 OR EAX,ECX MOV _hd_control, AL XOR EAX,EAX MOV AL,_hd_control PUSH EAX PUSH 1014 CALL FWORD PTR _OutByte XOR EAX,EAX MOV AL,_hd_control MOV ECX,247 AND EAX,ECX MOV _hd_control, AL L_30: CALL _check_busy MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_31 MOV EAX,1 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,BYTE PTR [ESI] PUSH EAX PUSH 497 CALL FWORD PTR _OutByte L_31: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_32 CALL _check_busy MOV DWORD PTR [EBP-4], EAX L_32: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_33 MOV EAX,2 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,BYTE PTR [ESI] PUSH EAX PUSH 498 CALL FWORD PTR _OutByte L_33: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_34 CALL _check_busy MOV DWORD PTR [EBP-4], EAX L_34: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_35 MOV EAX,3 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,BYTE PTR [ESI] PUSH EAX PUSH 499 CALL FWORD PTR _OutByte L_35: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_36 CALL _check_busy MOV DWORD PTR [EBP-4], EAX L_36: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_37 MOV EAX,4 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,BYTE PTR [ESI] PUSH EAX PUSH 500 CALL FWORD PTR _OutByte L_37: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_38 CALL _check_busy MOV DWORD PTR [EBP-4], EAX L_38: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_39 MOV EAX,5 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,BYTE PTR [ESI] PUSH EAX PUSH 501 CALL FWORD PTR _OutByte L_39: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_40 CALL _check_busy MOV DWORD PTR [EBP-4], EAX L_40: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_41 MOV EAX,6 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,BYTE PTR [ESI] PUSH EAX PUSH 502 CALL FWORD PTR _OutByte L_41: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_42 CALL _check_busy MOV DWORD PTR [EBP-4], EAX L_42: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_43 XOR EAX,EAX MOV AL,BYTE PTR [EBP+8] PUSH EAX PUSH 503 CALL FWORD PTR _OutByte L_43: MOV EAX,DWORD PTR [EBP-4] MOV ESP,EBP POP EBP RETN 4 _setupseek: PUSH EBP MOV EBP,ESP SUB ESP,6 MOV EAX,DWORD PTR [EBP+8] CMP EAX,256 SETA AL AND AL,AL JZ L_45 MOV EAX,670 JMP L_46 L_45: MOV EAX,DWORD PTR [EBP+8] CMP EAX,0 SETE AL AND AL,AL JZ L_47 MOV EAX,671 JMP L_46 L_47: MOV EAX,DWORD PTR [EBP+8] MOV _hd_nsectors, AL XOR EAX,EAX MOV AL,_hd_nsectors CMP EAX,256 SETE AL AND AL,AL JZ L_48 XOR EAX,EAX MOV _hd_nsectors, AL L_48: XOR EAX,EAX MOV AL,_hd_drive XOR ECX,ECX CMP EAX,ECX SETE AL AND AL,AL JZ L_49 XOR EAX,EAX MOV AL,_hd0_heads XOR ECX,ECX MOV CL,_hd0_secpertrk MUL ECX MOV ECX,EAX MOV EAX,DWORD PTR [EBP+12] XOR EDX,EDX DIV ECX MOV WORD PTR [EBP-6], AX XOR EAX,EAX MOV AL,_hd0_heads XOR ECX,ECX MOV CL,_hd0_secpertrk MUL ECX MOV ECX,EAX MOV EAX,DWORD PTR [EBP+12] XOR EDX,EDX DIV ECX MOV EAX,EDX MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] XOR ECX,ECX MOV CL,_hd0_secpertrk XOR EDX,EDX DIV ECX MOV _hd_head, AL MOV EAX,DWORD PTR [EBP-4] XOR ECX,ECX MOV CL,_hd0_secpertrk XOR EDX,EDX DIV ECX MOV EAX,EDX ADD EAX,1 MOV _hd_sector, AL JMP L_50 L_49: XOR EAX,EAX MOV AL,_hd1_heads XOR ECX,ECX MOV CL,_hd1_secpertrk MUL ECX MOV ECX,EAX MOV EAX,DWORD PTR [EBP+12] XOR EDX,EDX DIV ECX MOV WORD PTR [EBP-6], AX XOR EAX,EAX MOV AL,_hd1_heads XOR ECX,ECX MOV CL,_hd1_secpertrk MUL ECX MOV ECX,EAX MOV EAX,DWORD PTR [EBP+12] XOR EDX,EDX DIV ECX MOV EAX,EDX MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] XOR ECX,ECX MOV CL,_hd1_secpertrk XOR EDX,EDX DIV ECX MOV _hd_head, AL MOV EAX,DWORD PTR [EBP-4] XOR ECX,ECX MOV CL,_hd1_secpertrk XOR EDX,EDX DIV ECX MOV EAX,EDX ADD EAX,1 MOV _hd_sector, AL L_50: MOV EAX,2 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX MOV EAX,DWORD PTR [EBP+8] MOV BYTE PTR [ESI], AL MOV EAX,3 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,_hd_sector MOV BYTE PTR [ESI], AL MOV EAX,4 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX MOVZX EAX,WORD PTR [EBP-6] MOV ECX,255 AND EAX,ECX MOV BYTE PTR [ESI], AL MOV EAX,5 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX MOVZX EAX,WORD PTR [EBP-6] MOV ECX,8 SHR AX,CL MOV ECX,255 AND EAX,ECX MOV BYTE PTR [ESI], AL MOV EAX,6 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,_hd_drive MOV ECX,4 SHL EAX,CL AND EAX,0FFh MOV EBX,EAX XOR EAX,EAX MOV AL,_hd_head MOV ECX,15 AND EAX,ECX MOV ECX,EBX OR EAX,ECX MOV ECX,160 OR EAX,ECX MOV BYTE PTR [ESI], AL XOR EAX,EAX L_46: MOV ESP,EBP POP EBP RETN 8 _hd_seek: PUSH EBP MOV EBP,ESP SUB ESP,4 PUSH DWORD PTR [EBP+8] PUSH 1 CALL _setupseek MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_51 PUSH 112 CALL _send_command MOV DWORD PTR [EBP-4], EAX L_51: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_52 CALL _hd_wait MOV DWORD PTR [EBP-4], EAX L_52: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_53 PUSH 112 CALL _hd_status MOV DWORD PTR [EBP-4], EAX L_53: MOV ESI,OFFSET _hdstatus MOV EAX,DWORD PTR [EBP-4] MOV DWORD PTR [ESI+36], EAX MOV EAX,DWORD PTR [EBP-4] MOV ESP,EBP POP EBP RETN 4 _hd_status: PUSH EBP MOV EBP,ESP SUB ESP,6 CALL _check_busy MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_55 PUSH 503 CALL FWORD PTR _InByte MOV BYTE PTR [EBP-5], AL JMP L_56 L_55: MOV EAX,DWORD PTR [EBP-4] JMP L_57 L_56: XOR EAX,EAX MOV AL,_hd_drive AND EAX,EAX JZ L_58 MOV ESI,OFFSET _hdstatus XOR EAX,EAX MOV AL,BYTE PTR [EBP-5] MOV BYTE PTR [ESI+52], AL JMP L_59 L_58: MOV ESI,OFFSET _hdstatus XOR EAX,EAX MOV AL,BYTE PTR [EBP-5] MOV BYTE PTR [ESI+40], AL L_59: XOR EAX,EAX MOV AL,BYTE PTR [EBP-5] MOV ECX,1 AND EAX,ECX XOR ECX,ECX CMP EAX,ECX SETE AL AND AL,AL JZ L_60 XOR EAX,EAX MOV DWORD PTR [EBP-4], EAX XOR EAX,EAX MOV AL,BYTE PTR [EBP+8] JMP L_62 L_63: L_64: L_65: L_66: L_67: L_68: XOR EAX,EAX MOV AL,BYTE PTR [EBP-5] MOV ECX,32 AND EAX,ECX JZ L_69 MOV EAX,672 MOV DWORD PTR [EBP-4], EAX JMP L_70 L_69: XOR EAX,EAX MOV AL,BYTE PTR [EBP-5] MOV ECX,16 AND EAX,ECX XOR ECX,ECX CMP EAX,ECX SETE AL AND AL,AL JZ L_71 MOV EAX,659 MOV DWORD PTR [EBP-4], EAX L_71: L_70: JMP L_61 L_72: L_73: L_74: L_75: JMP L_61 L_76: JMP L_61 L_62: CMP EAX,144 JE L_75 CMP EAX,80 JE L_74 CMP EAX,64 JE L_73 CMP EAX,145 JE L_72 CMP EAX,16 JE L_68 CMP EAX,112 JE L_67 CMP EAX,50 JE L_66 CMP EAX,48 JE L_65 CMP EAX,34 JE L_64 CMP EAX,32 JE L_63 JMP L_76 L_61: MOV EAX,DWORD PTR [EBP-4] JMP L_57 L_60: CALL _check_busy MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_78 PUSH 497 CALL FWORD PTR _InByte MOV BYTE PTR [EBP-6], AL JMP L_79 L_78: MOV EAX,DWORD PTR [EBP-4] JMP L_57 L_79: XOR EAX,EAX MOV AL,_hd_drive AND EAX,EAX JZ L_80 MOV ESI,OFFSET _hdstatus XOR EAX,EAX MOV AL,BYTE PTR [EBP-6] MOV BYTE PTR [ESI+53], AL JMP L_81 L_80: MOV ESI,OFFSET _hdstatus XOR EAX,EAX MOV AL,BYTE PTR [EBP-6] MOV BYTE PTR [ESI+41], AL L_81: XOR EAX,EAX MOV AL,BYTE PTR [EBP-6] MOV ECX,1 AND EAX,ECX JZ L_82 MOV EAX,652 MOV DWORD PTR [EBP-4], EAX JMP L_83 L_82: XOR EAX,EAX MOV AL,BYTE PTR [EBP-6] MOV ECX,2 AND EAX,ECX JZ L_84 MOV EAX,659 MOV DWORD PTR [EBP-4], EAX JMP L_85 L_84: XOR EAX,EAX MOV AL,BYTE PTR [EBP-6] MOV ECX,4 AND EAX,ECX JZ L_86 MOV EAX,668 MOV DWORD PTR [EBP-4], EAX JMP L_87 L_86: XOR EAX,EAX MOV AL,BYTE PTR [EBP-6] MOV ECX,16 AND EAX,ECX JZ L_88 MOV EAX,654 MOV DWORD PTR [EBP-4], EAX JMP L_89 L_88: XOR EAX,EAX MOV AL,BYTE PTR [EBP-6] MOV ECX,64 AND EAX,ECX JZ L_90 MOV EAX,653 MOV DWORD PTR [EBP-4], EAX JMP L_91 L_90: XOR EAX,EAX MOV AL,BYTE PTR [EBP-6] MOV ECX,128 AND EAX,ECX JZ L_92 MOV EAX,651 MOV DWORD PTR [EBP-4], EAX JMP L_93 L_92: MOV EAX,658 MOV DWORD PTR [EBP-4], EAX L_93: L_91: L_89: L_87: L_85: L_83: L_77: MOV EAX,DWORD PTR [EBP-4] L_57: MOV ESP,EBP POP EBP RETN 4 _hd_read: PUSH EBP MOV EBP,ESP SUB ESP,12 XOR EAX,EAX MOV AL,_hd_drive MOV ECX,64 MUL ECX MOV ESI,OFFSET _hdcb ADD ESI,EAX MOVSX EAX,WORD PTR [ESI+14] MOV DWORD PTR [EBP-12], EAX MOV EAX,DWORD PTR [EBP+12] MOV DWORD PTR [EBP-8], EAX PUSH DWORD PTR [EBP+16] PUSH DWORD PTR [EBP+12] CALL _setupseek MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_94 PUSH 32 CALL _send_command MOV DWORD PTR [EBP-4], EAX L_94: L_95: MOV EAX,DWORD PTR [EBP-8] AND EAX,EAX JZ L_97 MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX SETZ AL AND AL,AL L_97: JZ L_96 CALL _hd_wait MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_98 PUSH 32 CALL _hd_status MOV DWORD PTR [EBP-4], EAX L_98: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_99 PUSH 496 PUSH DWORD PTR [EBP+8] PUSH DWORD PTR [EBP-12] CALL FWORD PTR _InWords MOV EAX,DWORD PTR [EBP+8] ADD EAX,DWORD PTR [EBP-12] MOV DWORD PTR [EBP+8], EAX DEC DWORD PTR [EBP-8] MOV EAX,DWORD PTR [EBP-8] L_99: JMP L_95 L_96: MOV EAX,DWORD PTR [EBP-4] MOV ESP,EBP POP EBP RETN 12 _hd_write: PUSH EBP MOV EBP,ESP SUB ESP,12 XOR EAX,EAX MOV AL,_hd_drive MOV ECX,64 MUL ECX MOV ESI,OFFSET _hdcb ADD ESI,EAX MOVSX EAX,WORD PTR [ESI+14] MOV DWORD PTR [EBP-12], EAX XOR EAX,EAX MOV DWORD PTR [EBP-8], EAX PUSH DWORD PTR [EBP+16] PUSH DWORD PTR [EBP+12] CALL _setupseek MOV DWORD PTR [EBP-4], EAX PUSH 48 CALL _send_command MOV DWORD PTR [EBP-4], EAX CALL _check_busy MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX SETZ AL AND AL,AL JZ L_101 XOR EAX,EAX MOV AL,_statbyte MOV ECX,8 AND EAX,ECX L_101: JZ L_102 PUSH 496 PUSH DWORD PTR [EBP+8] PUSH DWORD PTR [EBP-12] CALL FWORD PTR _OutWords MOV EAX,DWORD PTR [EBP+8] ADD EAX,DWORD PTR [EBP-12] MOV DWORD PTR [EBP+8], EAX MOV EAX,DWORD PTR [EBP-8] INC DWORD PTR [EBP-8] L_102: L_103: MOV EAX,DWORD PTR [EBP-8] CMP EAX,DWORD PTR [EBP+12] SETB AL AND AL,AL JZ L_105 MOV EAX,DWORD PTR [EBP-4] CMP EAX,0 SETE AL AND AL,AL L_105: JZ L_104 CALL _hd_wait MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] CMP EAX,0 SETE AL AND AL,AL JZ L_106 PUSH 48 CALL _hd_status MOV DWORD PTR [EBP-4], EAX L_106: MOV EAX,DWORD PTR [EBP-4] CMP EAX,0 SETE AL AND AL,AL JZ L_107 XOR EAX,EAX MOV AL,_statbyte MOV ECX,8 AND EAX,ECX L_107: JZ L_108 PUSH 496 PUSH DWORD PTR [EBP+8] PUSH DWORD PTR [EBP-12] CALL FWORD PTR _OutWords MOV EAX,DWORD PTR [EBP+8] ADD EAX,DWORD PTR [EBP-12] MOV DWORD PTR [EBP+8], EAX MOV EAX,DWORD PTR [EBP-8] INC DWORD PTR [EBP-8] L_108: JMP L_103 L_104: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_109 CALL _hd_wait MOV DWORD PTR [EBP-4], EAX L_109: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_110 PUSH 48 CALL _hd_status MOV DWORD PTR [EBP-4], EAX L_110: MOV EAX,DWORD PTR [EBP-4] MOV ESP,EBP POP EBP RETN 12 _hd_format_track: PUSH EBP MOV EBP,ESP SUB ESP,4 PUSH DWORD PTR [EBP+12] PUSH DWORD PTR [EBP+8] CALL _setupseek MOV DWORD PTR [EBP-4], EAX PUSH 80 CALL _send_command MOV DWORD PTR [EBP-4], EAX CALL _hd_wait MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] CMP EAX,0 SETE AL AND AL,AL JZ L_112 PUSH 80 CALL _hd_status MOV DWORD PTR [EBP-4], EAX L_112: MOV EAX,DWORD PTR [EBP-4] MOV ESP,EBP POP EBP RETN 8 _ReadSector: PUSH EBP MOV EBP,ESP SUB ESP,6 MOV EAX,DWORD PTR [EBP+16] MOV WORD PTR [EBP-6], AX MOV EAX,DWORD PTR [EBP+12] AND EAX,65535 MOV _hd_head, AL MOV EAX,DWORD PTR [EBP+12] MOV ECX,16 SHR EAX,CL AND EAX,65535 MOV _hd_sector, AL MOV EAX,2 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX MOV EAX,1 MOV BYTE PTR [ESI], AL MOV EAX,3 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,_hd_sector MOV BYTE PTR [ESI], AL MOV EAX,4 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX MOVZX EAX,WORD PTR [EBP-6] MOV ECX,255 AND EAX,ECX MOV BYTE PTR [ESI], AL MOV EAX,5 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX MOVZX EAX,WORD PTR [EBP-6] MOV ECX,8 SHR AX,CL MOV ECX,255 AND EAX,ECX MOV BYTE PTR [ESI], AL MOV EAX,6 MOV ESI,OFFSET _hd_Cmd ADD ESI,EAX XOR EAX,EAX MOV AL,_hd_drive MOV ECX,4 SHL EAX,CL AND EAX,0FFh MOV EBX,EAX XOR EAX,EAX MOV AL,_hd_head MOV ECX,15 AND EAX,ECX MOV ECX,EBX OR EAX,ECX MOV ECX,160 OR EAX,ECX MOV BYTE PTR [ESI], AL PUSH 32 CALL _send_command MOV DWORD PTR [EBP-4], EAX CALL _hd_wait MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_114 PUSH 32 CALL _hd_status MOV DWORD PTR [EBP-4], EAX L_114: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_115 PUSH 496 PUSH DWORD PTR [EBP+8] PUSH 512 CALL FWORD PTR _InWords L_115: MOV EAX,DWORD PTR [EBP-4] MOV ESP,EBP POP EBP RETN 12 _hddev_op: PUSH EBP MOV EBP,ESP SUB ESP,4 MOV ESI,OFFSET _hdstatus XOR EAX,EAX MOV DWORD PTR [ESI+4], EAX XOR EAX,EAX MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP+24] CMP EAX,12 SETE AL AND AL,AL JZ L_117 XOR EAX,EAX MOV _hd_drive, AL JMP L_118 L_117: MOV EAX,1 MOV _hd_drive, AL L_118: PUSH _hd_exch PUSH OFFSET _hd_msg CALL FWORD PTR _CheckMsg XOR EAX,EAX MOV AL,_hd_drive XOR ECX,ECX CMP EAX,ECX SETE AL AND AL,AL JZ L_119 XOR EAX,EAX MOV AL,_hd0_type XOR ECX,ECX CMP EAX,ECX SETE AL AND AL,AL JZ L_120 MOV EAX,663 MOV DWORD PTR [EBP-4], EAX L_120: JMP L_121 L_119: XOR EAX,EAX MOV AL,_hd1_type XOR ECX,ECX CMP EAX,ECX SETE AL AND AL,AL JZ L_122 MOV EAX,663 MOV DWORD PTR [EBP-4], EAX L_122: L_121: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_123 XOR EAX,EAX MOV AL,_hd_drive MOV ECX,64 MUL ECX MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,DWORD PTR [EBP+16] CMP EAX,DWORD PTR [ESI+20] SETA AL AND AL,AL JZ L_124 MOV EAX,662 MOV DWORD PTR [EBP-4], EAX L_124: L_123: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_125 MOV EAX,DWORD PTR [EBP+20] JMP L_127 L_128: XOR EAX,EAX MOV DWORD PTR [EBP-4], EAX JMP L_126 L_129: PUSH DWORD PTR [EBP+16] PUSH DWORD PTR [EBP+12] PUSH DWORD PTR [EBP+8] CALL _hd_read MOV DWORD PTR [EBP-4], EAX JMP L_126 L_130: PUSH DWORD PTR [EBP+16] PUSH DWORD PTR [EBP+12] PUSH DWORD PTR [EBP+8] CALL _hd_write MOV DWORD PTR [EBP-4], EAX JMP L_126 L_131: MOV EAX,656 MOV DWORD PTR [EBP-4], EAX JMP L_126 L_132: PUSH DWORD PTR [EBP+16] CALL _hd_seek MOV DWORD PTR [EBP-4], EAX JMP L_126 L_133: PUSH DWORD PTR [EBP+16] PUSH DWORD PTR [EBP+12] CALL _hd_format_track MOV DWORD PTR [EBP-4], EAX JMP L_126 L_134: CALL _hd_reset XOR EAX,EAX MOV DWORD PTR [EBP-4], EAX JMP L_126 L_135: PUSH DWORD PTR [EBP+16] PUSH DWORD PTR [EBP+12] PUSH DWORD PTR [EBP+8] CALL _ReadSector MOV DWORD PTR [EBP-4], EAX JMP L_126 L_136: MOV EAX,664 MOV DWORD PTR [EBP-4], EAX JMP L_126 L_127: CMP EAX,256 JE L_135 CMP EAX,8 JE L_134 CMP EAX,5 JE L_133 CMP EAX,6 JE L_132 CMP EAX,3 JE L_131 CMP EAX,2 JE L_130 CMP EAX,1 JE L_129 CMP EAX,0 JE L_128 JMP L_136 L_126: L_125: XOR EAX,EAX MOV AL,_hd_drive MOV ECX,64 MUL ECX MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,DWORD PTR [EBP-4] MOV DWORD PTR [ESI+16], EAX MOV EAX,DWORD PTR [EBP-4] L_137: MOV ESP,EBP POP EBP RETN 20 _hddev_stat: PUSH EBP MOV EBP,ESP SUB ESP,4 MOV EAX,DWORD PTR [EBP+20] CMP EAX,12 SETE AL AND AL,AL JZ L_138 MOV ESI,OFFSET _hdstatus MOV EBX,ESI MOV ESI,OFFSET _hdcb MOV EAX,DWORD PTR [ESI+16] MOV DWORD PTR [EBX], EAX MOV ESI,OFFSET _hdstatus XOR EAX,EAX MOV AL,_hd0_type MOV BYTE PTR [ESI+13], AL MOV ESI,OFFSET _hdstatus MOVZX EAX,_hd0_cyls MOV DWORD PTR [ESI+16], EAX MOV ESI,OFFSET _hdstatus XOR EAX,EAX MOV AL,_hd0_heads MOV DWORD PTR [ESI+20], EAX MOV ESI,OFFSET _hdstatus XOR EAX,EAX MOV AL,_hd0_secpertrk MOV DWORD PTR [ESI+24], EAX MOV ESI,OFFSET _hdstatus MOV EBX,ESI MOV ESI,OFFSET _hdcb MOVSX EAX,WORD PTR [ESI+14] MOV DWORD PTR [EBX+28], EAX JMP L_139 L_138: MOV ESI,OFFSET _hdstatus MOV EAX,64 MOV EBX,ESI MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,DWORD PTR [ESI+16] MOV DWORD PTR [EBX], EAX MOV ESI,OFFSET _hdstatus XOR EAX,EAX MOV AL,_hd1_type MOV BYTE PTR [ESI+13], AL MOV ESI,OFFSET _hdstatus MOVZX EAX,_hd1_cyls MOV DWORD PTR [ESI+16], EAX MOV ESI,OFFSET _hdstatus XOR EAX,EAX MOV AL,_hd1_heads MOV DWORD PTR [ESI+20], EAX MOV ESI,OFFSET _hdstatus XOR EAX,EAX MOV AL,_hd1_secpertrk MOV DWORD PTR [ESI+24], EAX MOV ESI,OFFSET _hdstatus MOV EAX,64 MOV EBX,ESI MOV ESI,OFFSET _hdcb ADD ESI,EAX MOVSX EAX,WORD PTR [ESI+14] MOV DWORD PTR [EBX+28], EAX L_139: MOV EAX,DWORD PTR [EBP+12] CMP EAX,64 SETBE AL AND AL,AL JZ L_140 MOV EAX,DWORD PTR [EBP+12] MOV DWORD PTR [EBP-4], EAX JMP L_141 L_140: MOV EAX,64 MOV DWORD PTR [EBP-4], EAX L_141: PUSH OFFSET _hdstatus PUSH DWORD PTR [EBP+16] PUSH DWORD PTR [EBP-4] CALL FWORD PTR _CopyData MOV ESI,DWORD PTR [EBP+8] MOV EAX,DWORD PTR [EBP-4] MOV DWORD PTR [ESI], EAX XOR EAX,EAX MOV ESP,EBP POP EBP RETN 16 _hddev_init: PUSH EBP MOV EBP,ESP SUB ESP,8 XOR EAX,EAX MOV DWORD PTR [EBP-4], EAX MOV EAX,DWORD PTR [EBP+8] CMP EAX,64 SETA AL AND AL,AL JZ L_143 MOV EAX,64 MOV DWORD PTR [EBP-8], EAX JMP L_144 L_143: MOV EAX,DWORD PTR [EBP+8] MOV DWORD PTR [EBP-8], EAX L_144: PUSH DWORD PTR [EBP+12] PUSH OFFSET _HDStatTmp PUSH DWORD PTR [EBP-8] CALL FWORD PTR _CopyData MOV EAX,DWORD PTR [EBP+16] CMP EAX,12 SETE AL AND AL,AL JZ L_145 XOR EAX,EAX MOV _hd_drive, AL JMP L_146 L_145: MOV EAX,1 MOV _hd_drive, AL L_146: XOR EAX,EAX MOV AL,_hd_drive XOR ECX,ECX CMP EAX,ECX SETE AL AND AL,AL JZ L_147 MOV ESI,OFFSET _HDStatTmp XOR EAX,EAX MOV AL,BYTE PTR [ESI+13] MOV _hd0_type, AL XOR EAX,EAX MOV AL,_hd0_type AND EAX,EAX JZ L_148 MOV ESI,OFFSET _HDStatTmp MOV EAX,DWORD PTR [ESI+16] MOV _hd0_cyls, AX MOV ESI,OFFSET _HDStatTmp MOV EAX,DWORD PTR [ESI+20] MOV _hd0_heads, AL MOV ESI,OFFSET _HDStatTmp MOV EAX,DWORD PTR [ESI+24] MOV _hd0_secpertrk, AL JMP L_149 L_148: MOV EAX,663 MOV DWORD PTR [EBP-4], EAX L_149: JMP L_150 L_147: MOV ESI,OFFSET _HDStatTmp XOR EAX,EAX MOV AL,BYTE PTR [ESI+13] MOV _hd1_type, AL XOR EAX,EAX MOV AL,_hd1_type AND EAX,EAX JZ L_151 MOV ESI,OFFSET _HDStatTmp MOV EAX,DWORD PTR [ESI+16] MOV _hd1_cyls, AX MOV ESI,OFFSET _HDStatTmp MOV EAX,DWORD PTR [ESI+20] MOV _hd1_heads, AL MOV ESI,OFFSET _HDStatTmp MOV EAX,DWORD PTR [ESI+24] MOV _hd1_secpertrk, AL JMP L_152 L_151: MOV EAX,663 MOV DWORD PTR [EBP-4], EAX L_152: L_150: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_153 XOR EAX,EAX MOV AL,_hd_drive PUSH EAX CALL _hd_init MOV DWORD PTR [EBP-4], EAX L_153: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_154 XOR EAX,EAX MOV AL,_hd_drive PUSH EAX CALL _hd_recal MOV DWORD PTR [EBP-4], EAX L_154: MOV EAX,DWORD PTR [EBP-4] AND EAX,EAX JNZ L_155 XOR EAX,EAX MOV AL,_hd_drive MOV ECX,64 MUL ECX MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EBX,ESI MOV ESI,OFFSET _HDStatTmp MOV EAX,DWORD PTR [ESI+28] MOV WORD PTR [EBX+14], AX XOR EAX,EAX MOV AL,_hd_drive MOV ECX,64 MUL ECX MOV ESI,OFFSET _hdcb ADD ESI,EAX XOR EAX,EAX MOV DWORD PTR [ESI+16], EAX XOR EAX,EAX MOV AL,_hd_drive MOV ECX,64 MUL ECX MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EBX,ESI MOV ESI,OFFSET _HDStatTmp PUSH EBX MOV EBX,ESI MOV ESI,OFFSET _HDStatTmp MOV EAX,DWORD PTR [EBX+16] MOV ECX,DWORD PTR [ESI+24] MUL ECX MOV EBX,EAX MOV ESI,OFFSET _HDStatTmp MOV EAX,EBX MOV ECX,DWORD PTR [ESI+20] MUL ECX POP EDX MOV DWORD PTR [EDX+20], EAX L_155: XOR EAX,EAX MOV AL,_hd_drive MOV ECX,64 MUL ECX MOV ESI,OFFSET _hdcb ADD ESI,EAX MOV EAX,DWORD PTR [EBP-4] MOV DWORD PTR [ESI+16], EAX MOV EAX,DWORD PTR [EBP-4] MOV ESP,EBP POP EBP RETN 12