;*********************************************************************** ;* IDE2LPT - MS-DOS device driver for IDE2LPT(R) adaptor * ;* v2.04 at 25.12.98 15:46 (c) Leonid Slobodchikov AKA Curvex * ;* Original code by Eugene Kuleshov * ;*********************************************************************** .286c ;====================================================================== HDX equ 1 ; ࠡ⠥ 譨 HD IO_IDEBASE equ 170h IO_IDECMD equ 177h IO_IDECONT equ 3f6h ACRL EQU 00000100B ;஡ ॣ HD0-HD7 ACRH EQU 00000101B ;஡ ॣ HD8-HD15 ACRC EQU 00000110B ;஡ ॣ ࠢ ACRZ equ 00000111b ; ॣ ࠢ 㫥 ﭨ acw0 equ 00000001b ;⥭ 襩 ࠤ 襣 acw1 equ 00000000b ;⥭ 襩 ࠤ 襣 acw2 equ 00000011b ;⥭ 襩 ࠤ 襣 acw3 equ 00000010b ;⥭ 襩 ࠤ 襣 .lall INP macro DATA,ADDR ; HD IF HDX IFIDNI , call InW ELSEIFIDNI , call InB ELSE ERR ENDIF ELSE in DATA,ADDR ENDIF endm OUTP macro ADDR,DATA ; 뢮 HD IF HDX IFIDNI , call OutW ELSEIFIDNI , call OutB ELSE ERR ENDIF ELSE out ADDR,DATA ENDIF endm INPSW macro ; ப ᫮ local m0 IF HDX pushf cli m0: call InW stosw loop m0 popf ELSE rep insw ENDIF endm OUTPSW macro ; 뢮 ப ᫮ local m0 IF HDX pushf cli m0: lodsw call OutW loop m0 popf ELSE rep outsw ENDIF endm ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ _TEXT segment byte public assume cs:_TEXT,ds:_TEXT,ss:_TEXT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ࠩ ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ide2lpt proc far dd -1 attributes dw 2002h pointers dw offset strategy dw offset interrupt block_dev db 0 db 7 dup (0) pRequestHeader dd 00000h ide2lpt endp ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ Read Sector - ᥪ + ;+ 室:bh - + ;+ bl - ᥪ + ;+ cx - 樫 + ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ReadSector proc near mov ah,20h ; Read Sector call RWSector INPSW retn ReadSector endp ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ WriteSector - ᥪ + ;+ 室: bh - + ;+ bl - ᥪ + ;+ cx - 樫 + ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ WriteSector proc near mov ah,30h ; Write Sector call RWSector OUTPSW retn WriteSector endp ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ RWSector - 믮 ᥪ஬ + ;+ 室: ah - 樨 + ;+ bh - + ;+ bl - ᥪ + ;+ cx - 樫 + ;+ 室: + ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RWSector proc near cld call WaitHDDforBusy dec dx mov al,bh or al,cs:[bDHRsnap] OUTP dx,al ; port 1F6h, hdsk0-siz/drv/head sub dx,4 mov al,1 OUTP dx,al ; port 1F2h, hdsk0-sector count inc dx mov al,bl OUTP dx,al ; port 1F3h, hdsk0-sector numbr inc dx mov al,cl OUTP dx,al ; port 1F4h, hdsk0-cylr,lo byte inc dx mov al,ch OUTP dx,al ; port 1F5h, hdsk0-cylr,hi byte inc dx inc dx xchg ah,al OUTP dx,al ; port 1F7h, hdsk0-command reg mov ah,0FFh loc_1: mov cx,0FFFFh ;65535 ⮪ locloop_2: INP al,dx ; port 1F7h, hdsk0-status reg test al,8 ; test DRQ bit jnz loc_3 loop locloop_2 dec ah or ah,ah jnz loc_1 loc_3: mov cx,100h and dl,0F0h retn RWSector endp ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ WaitHDDforBusy - ⮢ HDD + ;+ 室: - + ;+ 室: Z=0 - ⮢ + ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ WaitHDDforBusy proc near push cx mov cx,0FFFFh locloop_4: mov dx,IO_IDECMD INP al,dx ; port 177h, hdsk0-status reg test al,80h jz loc_5 loop locloop_4 loc_5: test al,80h ; ⠭ 䫠 pop cx retn WaitHDDforBusy endp ;========================================================================== bDHRsnap db 0A0h ; ઠ IO_IDECONT pwLPTbase dw 0 ; LPT ;========================================================================== ; ; ; External Entry Point ; ; strategy proc far mov word ptr cs:[pRequestHeader],bx mov word ptr cs:[pRequestHeader+2],es retf strategy endp ; ; Done ; Done proc near mov byte ptr es:[bx+0Eh],1 clc retn Done endp ; ; BuildBPB ; BuildBPB proc near mov cl,es:[bx+1] mov ax,offset EndOfCode+4 loc_6: or cl,cl jz loc_7 dec cl add ax,1Dh ; BPBSize+4 jmp short loc_6 loc_7: mov es:[bx+12h],ax mov es:[bx+14h],cs clc retn BuildBPB endp ; ; ; External Entry Point ; ; interrupt proc far cld push ax push bx push cx push dx push si push di push bp push ds push es mov di,offset cmdRet push di les bx,cs:[pRequestHeader] ; (3708:0012=0) mov al,es:[bx+2] or al,al jnz loc_8 jmp Initialize ; (0992) loc_8: dec al jz Done dec al jz BuildBPB sub al,2 jz Input sub al,4 jz Output dec al jz Output Exit3: mov ax,8003h stc retn interrupt endp cmdRet: jc loc_9 mov ax,100h loc_9: les bx,cs:[pRequestHeader] mov es:[bx+3],ax pop es pop ds pop bp pop di pop si pop dx pop cx pop bx pop ax retf ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ Input - ࠡ 04h + ;+ 室: es:bx - 㪠⥫ ᮬ + ;+ +- -------------------------------------+ + ;+ !Offset!Size! Content ! + ;+ ! +0h ! 1 ! bLen 20h - ! + ;+ ! +1h ! 1 ! bUnitNo ன⢠ ! + ;+ ! +2h ! 1 ! bCmd 04h - - ⥭ ! + ;+ ! +3h ! 2 ! ! + ;+ ! +5h ! 8 ! reserved ! + ;+ ! +0dh ! 1 ! bMediaID ⨯ FAT ! + ;+ ! +0eh ! 4 ! pfBuffer 㪠⥫ ! + ;+ ! +12h ! 2 ! wReadSize - ᥪ஢ ⥭ ! + ;+ ! +16h ! 2 ! wStartSect 砫 ᥪ ⥭ ! + ;+ ! ! ! (=0ffffh - ᯮ lBigSect)! + ;+ ! +18h ! 4 ! ! + ;+ ! +1ch ! 4 ! lBigSect 砫 ᥪ ! + ;+ ! ! ! wStartSect=0ffffh ! + ;+ +------+----+---------------------------------------------+ + ;+ 室: + ;+ +- -------------------------------------+ + ;+ !Offset!Size! Content ! + ;+ ! +0h ! 1 ! bLen 20h - ! + ;+ ! +1h ! 1 ! bUnitNo ன⢠ ! + ;+ ! +2h ! 1 ! bCmd 04h - - ⥭ ! + ;+ ! +3h ! 2 ! rStatusWord ᫮ ﭨ ࠩ ! + ;+ ! +5h ! 8 ! reserved ! + ;+ ! +0dh ! 1 ! bMediaID ⨯ FAT ! + ;+ ! +0eh ! 4 ! pfBuffer 㪠⥫ (DTA) ! + ;+ ! +12h ! 2 ! wReadSize - ⠭ ᥪ஢ ! + ;+ ! +16h ! 2 ! wStartSect 砫 ᥪ ⥭ ! + ;+ ! ! ! (=0ffffh - ᯮ lBigSect)! + ;+ ! +18h ! 4 ! pfVolID ⪨ ⮬ ! + ;+ ! +1ch ! 4 ! lBigSect 砫 ᥪ ! + ;+ ! ! ! wStartSect=0ffffh ! + ;+ +------+----+---------------------------------------------+ + ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Input proc near call DefTransfPars les di,dword ptr es:[bx+0Eh] ; (DTA) add ax,cs:[si] ; 砫 ᥪ adc dx,cs:[si+2] mov bx,si locloop_10: push cx push es push bx push ax push dx call AbsoluteSector call ReadSector pop dx pop ax pop bx pop es pop cx inc ax or ax,ax jnz loc_11 inc dx loc_11: loop locloop_10 clc retn Input endp ; ; Output ; Output proc near call DefTransfPars xchg si,di lds si,dword ptr es:[bx+0Eh] mov bx,di add ax,cs:[bx] adc dx,cs:[bx+2] locloop_12: push cx push es push bx push ax push dx call AbsoluteSector call WriteSector pop dx pop ax pop bx pop es pop cx inc ax or ax,ax jnz loc_13 inc dx loc_13: loop locloop_12 clc retn Output endp ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ DefTransfPars - । ࠬ + ;+ 室: bx - 㪠⥫ + ;+ +- -------------------------------------+ + ;+ !Offset!Size! Content ! + ;+ ! +0h ! 1 ! bLen 20h - ! + ;+ ! +1h ! 1 ! bUnitNo ன⢠ ! + ;+ ! +2h ! 1 ! bCmd 04h/08h - ! + ;+ ! +3h ! 2 ! ! + ;+ ! +5h ! 8 ! reserved ! + ;+ ! +0dh ! 1 ! bMediaID ⨯ FAT ! + ;+ ! +0eh ! 4 ! pfBuffer 㪠⥫ ! + ;+ ! +12h ! 2 ! wReadSize - ᥪ஢ ⥭/! + ;+ ! +16h ! 2 ! wStartSect 砫 ᥪ ⥭/ + ;+ ! ! ! (=0ffffh - ᯮ lBigSect)! + ;+ ! +18h ! 4 ! ! + ;+ ! +1ch ! 4 ! lBigSect 砫 ᥪ ! + ;+ ! ! ! wStartSect=0ffffh ! + ;+ +------+----+---------------------------------------------+ + ;+ 室: cx - - ᥪ஢ ।, + ;+ dx,ax - ᥪ + ;+ si - BPB + ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DefTransfPars proc near mov ax,es:[bx+14h] ; 砫 ᥪ sub dx,dx cmp ax,0FFFFh jne loc_14 mov ax,es:[bx+1Ah] ; ᥪ 65536 mov dx,es:[bx+1Ch] loc_14: mov si,offset EndOfCode mov cl,es:[bx+1] ; ன⢠ loc_15: or cl,cl jz loc_16 add si,1Dh ; ࠧ BPB+4 dec cl jmp short loc_15 loc_16: mov cx,es:[bx+12h] ; - ᥪ஢ । retn DefTransfPars endp ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ AbsoluteSector - ८ࠧ c ᥪ 䨧᪨+ ;+ 室: dx:ax - ᮫ 砫 ᪨ ᥪ + ;+ bx - 㪠⥫ BPB-4 + ;+ 室:bh - + ;+ bl - ᥪ + ;+ cx - 樫 + ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AbsoluteSector proc near test cs:[bDHRsnap],40h jz loc_18 ; LBA-mode loc_17: mov bl,al ; bl=LBA[7..0] mov cl,ah ; cl=LBA[15..8] mov ch,dl ; ch=LBA[23..16] mov bh,dh ; bh=LBA[27..24] retn loc_18: push bx mov cx,cs:[bx+0dh+4] ; Sector per track call DivDXAX_CX inc cl ; cl - ᥪ pop bx push cx mov cx,cs:[bx+0fh+4] ; head qty call DivDXAX_CX pop bx mov bh,cl mov cx,ax retn AbsoluteSector endp ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ dx:ax = dx:ax / cx ; cl = dx:ax % cx + ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DivDXAX_CX proc near push ax sub ah,ah call DivDX_CX pop dx push bx call DivDX_CX mov cl,dl xchg bx,ax pop dx retn DivDXAX_CX endp DivDX_CX proc near push dx mov al,dh sub dx,dx div cx ; ax=(ah*256+dh)/cx; dx=dg%cx mov bh,al ; bh = (ah*256+dh)/cx mov ah,dl ; ah = (ah*256+dh)%cx pop dx mov al,dl ; al = dl sub dx,dx ; dx:ax = [((ah*256+dh)%cx)*256]+dl div cx ; ax={[((ah*256+dh)%cx)*256]+dl}/cx; dx={[((ah*256+dh)%cx)*256]+dl}%cx mov bl,al ; bl = (dh%cx*256 + dl) / cx mov ah,dl ; ah = (dh%cx*256+dl)%cx retn DivDX_CX endp ;------------------------------------------------------- ; 室: al - 뢮 dx ;------------------------------------------------------- OutB proc near pushf cli cmp dx,IO_IDECONT je oub3F6 oub1fx: push dx ;**my** .. si push ax push si mov si,dx and si,7 ; 3 mov dx,word ptr cs:[pwLPTbase] out dx,al add dx,2 mov al,ACRL out dx,al sub dx,2 mov ax,si or al,11010000b ; HA2..HA0 = xxx ; -CS3FX = 1 ; -CS1FX = 0 ; RCW = 0 ; TRW = 1 ; ⠢塞 -HWR out dx,al add dx,2 mov al,ACRC out dx,al mov al,ACRZ out dx,al pop si pop ax pop dx ;**my** ⠪ p쭥 popf ret oub3F6: push ax push dx mov dx,word ptr cs:[pwLPTbase] out dx,al ; ⠢塞 HD7..HD0 add dx,2 mov al,ACRL out dx,al sub dx,2 mov al,11001110b ; HA2..HA0 = 110b ; -CS3FX = 0 ; -CS1FX = 1 ; RCW = 0 ; TRW = 1 out dx,al add dx,2 mov al,ACRC out dx,al mov al,ACRZ out dx,al pop dx pop ax popf ret OutB endp ;------------------------------------------------------- ; 室: dx - ⥭ ; 室: al- ⠭ ;------------------------------------------------------- InB proc pushf cli push dx push bx and dl,7 mov al,dl or al,10110000b ; HA2..HA0 = xxx ; ⠢塞 -HRD ; -CS3FX = 1 ; -CS1FX = 0 ; RCW = 1 ; TRW = 0 mov dx,word ptr cs:[pwLPTbase] out dx,al add dx,2 mov al,ACRC out dx,al mov al,acw0 out dx,al dec dx in al,dx and al,0f0h xor al,80h shr al,4 mov bl,al inc dx mov al,acw1 out dx,al dec dx in al,dx and al,0f0h xor al,80h or al,bl pop bx pop dx popf ret InB endp ;------------------------------------------------------- ; 室: ax - ᫮ 뢮 dx ?????? ; p⮬ dx p㬥 HDD p X=0 17X **my** ; p 襬 ᫮ pp HDD **my** ; p 室 dx= LPT p **my** ;------------------------------------------------------- OutW proc near pushf cli push ax mov dx,word ptr cs:[pwLPTbase] ; ⠢塞 HD7..HD0 out dx,al add dx,2 mov al,ACRL out dx,al sub dx,2 mov al,ah ; ⠢塞 HD15..HD8 call perecod out dx,al add dx,2 mov al,ACRH out dx,al sub dx,2 mov al,11010000b ; HA2..HA0 = 000b ; ⠢塞 -HWR ; -CS3FX = 1 ; -CS1FX = 0 ; RCW = 0 ; TRW = 1 out dx,al add dx,2 mov al,ACRC out dx,al mov al,ACRZ out dx,al pop ax mov dx,IO_IDEBASE popf ret OutW endp ;------------------------------------------------------- ; 室: dx - ⥭ ?????? ; ᥣ ⠥ HDD p X=0 17X **my** ; p ⠥ ᫮ pp HDD **my** ; p 室 dx= LPT p **my** ;------------------------------------------------------- InW proc pushf cli push bx mov al,10110000b ; 롨ࠥ ॣ HDD ; HA2..HA0 = 000b ; ⠢塞 -CS1FX HA2..HA0 ; -CS3FX = 1 ; -CS1FX = 0 ; RCW = 1 ; ⠢塞 -HRD ; TRW = 0 mov dx,word ptr cs:[pwLPTbase] out dx,al mov al,ACRC add dx,2 out dx,al sub dx,2 mov al,acw0 mov dx,37ah out dx,al dec dx in al,dx and al,0f0h xor al,80h shr al,4 mov bl,al mov al,acw1 mov dx,37ah out dx,al dec dx in al,dx and al,0f0h xor al,80h or bl,al mov al,acw2 mov dx,37ah out dx,al dec dx in al,dx and al,0f0h xor al,80h shr al,4 mov bh,al mov al,acw3 mov dx,37ah out dx,al dec dx in al,dx and al,0f0h xor al,80h or al,bh call perecod mov bh,al mov ax,bx pop bx mov dx,IO_IDEBASE popf ret InW endp ; ; perecod ; 室: AL - ४㥬 ; 室: AL - ४஢ ; perecod proc near push bx push dx mov ah,0 mov dl,al lea bx,perecodrb and al,0fh ;४஢ . 㡠 add bx,ax mov dh,byte ptr cs:[bx] shl dh,4 mov al,dl lea bx,perecodrb and al,0f0h ;४஢ . 㡠 shr al,4 add bx,ax add dh,byte ptr cs:[bx] mov al,dh pop dx pop bx ret perecodrb db 0,8,4,0ch,2,0ah,6,0eh,1,9,5,0dh,3,0bh,7,0fh perecod endp EndOfCode equ $ ; ; ८ࠧ ASCII ।⠢ HEX-᫠ ds:[si] ; Hex2Bin proc near lodsb cmp al,':' jne h2bErr sub bx,bx loc_20: call isDelimited jz d2bRet cmp al,'0' jb h2bErr cmp al,'9' jbe loc_21 or al,20h sub al,27h cmp al,39h jbe h2bErr cmp al,3Fh ja h2bErr loc_21: sub al,'0' shl bx,4 or bl,al jmp short loc_20 h2bErr: pop bx stc retn Hex2Bin endp ; ; ८ࠧ ASCII ।⠢ DEC-᫠ ds:[si] ; Dec2Bin proc near lodsb cmp al,':' jne h2bErr sub bx,bx loc_22: call isDelimited jz d2bRet mov cx,0ah cmp al,'0' jb h2bErr cmp al,'9' ja h2bErr sub al,'0' sub ah,ah xchg bx,ax mul cx add bx,ax jmp short loc_22 d2bRet: dec si clc retn Dec2Bin endp ; ; isDelimited ; isDelimited proc near lodsb cmp al,':' je loc_ret_23 cmp al,' ' je loc_ret_23 cmp al,0ah je loc_ret_23 cmp al,0dh je loc_ret_23 or al,al loc_ret_23: retn isDelimited endp ; ; ShowHexDigit - AX HEX-।⠢ ; ShowHexDigit proc near rol ax,4 mov dl,al and dl,0Fh cmp dl,9 jbe loc_24 add dl,7 loc_24: add dl,30h ; '0' jmp PutChar ; (0B1B) ShowHexDigit endp sTitle1 db 0dh,0ah, 'IDE-TO-LPT(R) - External IDE HDD driver$' sTitle2 db 0dh,0ah, 'Instalable in CONFIG.SYS: DEVICE = PATH\IDE4.EXE {opt}' db 0dh,0ah, '{opt}:' db 9,'/L:LPT - LPT port base address (378h/278h/...)' db 0dh,0ah,9,'/G:SEC:HEAD - set HDD geometry (not Get IDE info)' db 0dh,0ah,9,'/L - set LBA mode' db 0dh,0ah,9,'/V - verbose mode' db 0dh,0ah,9,'/T - test adapter' db 0dh,0ah, 'Example: DEVICE=IDE4.EXE /P:378 /G:63:64 /L /V$' sSearchI2L db 0dh,0ah, 'Looking for adapter... $' sLptPort db 0dh,0ah, 'Parallel Port: $' sHDD db 0dh,0ah, 'HDD:$' sCDROM db 0dh,0ah, 'CDROM:$' sAdapterFound db ' - adapter detected$' sNoAdapter db ' - no adapter detected$' sError1 db 0dh,0ah, 'Error. Can`t get IDE-ATA info.$' sError2 db 0dh,0ah, 'Error. Can`t set drive geometry.$' sError3 db 0dh,0ah, 'Error. Not supported device.$' sError5 db 0dh,0ah, 'Error. Invalid Argument.$' sTestI2L db 0dh,0ah, 'Testing adapter... $' sOK db 'OK',0dh,0ah,'$' sTestFail1 db 0dh,0ah, 'Data mismatched, write: $' sTestFail2 db ' read: $ ' sTypeTable db 0dh,0ah, 'Type B Sect Head Cyl Sect Head Cyl Offset Total Size Drv' db 0dh,0ah,'$' bFileSystem1 db 7 sFileSystem1 db 'HPFS $' bFileSystem2 db 1 sFileSystem2 db 'DOS-12$' bFileSystem3 db 4 sFileSystem3 db 'DOS-16$' bFileSystem4 db 6 sFileSystem4 db 'BIGDOS$' bFileSystem5 db 5 sFileSystem5 db 'EXTEND$' bFileSystem6 db 0ah sFileSystem6 db 'BM-OS2$' bFileSystem7 db 0 sFileSystem7 db '------$' fTestI2L db 0 ; 䫠 ࠧ襭 ஢ ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ParseArg - ࠧ 㬥⮢ ப ; 室: si - 㪠⥫ ப ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ParseArg proc near loc_26: lodsb ; 㦠 ᨬ ப or al,al jz praOK cmp al,0dh je praOK cmp al,0ah je praOK cmp al,'/' jne loc_26 lodsb or al,20h cmp al,'g' jne loc_28 ; /G - ⠭ HDD call Dec2Bin ; ।塞 - ᥪ஢ mov cs:[wSectQty],bx call Dec2Bin ; ।塞 - mov cs:[wHeadQty],bx jmp short loc_26 loc_28: cmp al,'l' ; /L - ० LBA jne loc_29 or cs:[bDHRsnap],40h ; ⠭ ० LBA jmp short loc_26 loc_29: cmp al,'p' ; /P - ࠫ쭮 jne loc_31 loc_30: call Hex2Bin mov word ptr cs:[pwLPTbase],bx jmp short loc_26 loc_31: cmp al,'v' ; /V - ⮡ࠦ .ଠ jne pra20 mov byte ptr cs:[fVerbosely],1 jmp loc_26 praOK: clc retn pra20: cmp al,'t' ; /T - ஢ I2L - jne praErr mov byte ptr cs:[fTestI2L],1 jmp loc_26 praErr: mov dx,offset sTitle2 stc ; 室 訡 retn ParseArg endp ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DetectI2L - । 稥 i2l- ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DetectI2L proc near cmp word ptr cs:[pwLPTbase],0 jnz dil50 mov dx,offset sSearchI2L call StrPrint xor ax,ax mov ds,ax mov si,0408h ; ᯨ᮪ ᮢ ࠫ ⮢ DOS dil30: lodsw or ax,ax jz dil40 mov word ptr cs:[pwLPTbase],ax call isAttached jnc dil50 dil40: cmp si,0410h jne dil30 dilErr: mov dx,offset sNoAdapter stc ret dil50: mov dx,offset sLptPort call StrPrint mov ax,[pwLPTbase] call ShowHexDigit call isAttached jc dilErr call StrPrint clc ret DetectI2L endp ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ஢ ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ testI2L proc mov dx,offset sTestI2L call StrPrint mov bx,0 mov si,0 til10: mov dx,word ptr cs:[pwLPTbase] mov al,bl out dx,al add dx,2 mov al,ACRL out dx,al mov al,bh call perecod sub dx,2 out dx,al add dx,2 mov al,ACRH out dx,al sub dx,2 mov al,11100111b ; -CS3FX = 1 -CS1FX = 1 ; RCW = 1 ; TRW = 1 out dx,al add dx,2 mov al,ACRC out dx,al sub dx,2 mov al,acw0 mov dx,37ah out dx,al dec dx in al,dx and al,0f0h xor al,80h shr al,4 mov cl,al mov al,acw1 mov dx,37ah out dx,al dec dx in al,dx and al,0f0h xor al,80h or cl,al mov al,acw2 mov dx,37ah out dx,al dec dx in al,dx and al,0f0h xor al,80h shr al,4 mov ch,al mov al,acw3 mov dx,37ah out dx,al dec dx in al,dx and al,0f0h xor al,80h or al,ch call perecod mov ch,al cmp cx,bx jz til20 mov dx,offset sTestFail1 call StrPrint mov ax,bx call ShowHexDigit mov dx,offset sTestFail2 call StrPrint mov ax,cx call ShowHexDigit call NewLine til20: inc bx cmp bx,0 jz tilOK til30: jmp til10 tilOK: clc or si,si jz tilRet stc tilRet: ret testI2L endp ;------------------------------------------------------- ; ஢ઠ ; 室: ZF=0 - ᫨ 㦥 ;------------------------------------------------------- isAttached proc near mov dx,word ptr cs:[pwLPTbase] mov al,ACRZ add dx,2 out dx,al ;⠭ 砫쭮 ﭨ ᨣ ࠢ sub dx,2 mov al,0aah out dx,al add dx,2 mov al,ACRL out dx,al sub dx,2 mov al,55h call perecod out dx,al add dx,2 mov al,ACRH out dx,al sub dx,2 mov al,01100000b ; -CS1FX = 1 ; -CS3FX = 1 ; RCW = 1 ; TRW = 1 out dx,al add dx,2 mov al,ACRC out dx,al sub dx,2 mov al,acw0 mov dx,37ah out dx,al dec dx in al,dx and al,0f0h xor al,80h shr al,4 mov bl,al mov al,acw1 mov dx,37ah out dx,al dec dx in al,dx and al,0f0h xor al,80h or bl,al mov al,acw2 mov dx,37ah out dx,al dec dx in al,dx and al,0f0h xor al,80h shr al,4 mov bh,al mov al,acw3 mov dx,37ah out dx,al dec dx in al,dx and al,0f0h xor al,80h or al,bh call perecod mov bh,al isa10: cmp bx,55aah jne isaErr mov dx,offset sAdapterFound clc ret isaErr: mov dx,offset sNoAdapter stc ret isAttached endp ; ; DetectHDD ; DetectHDD proc near push cs push cs pop es pop ds mov dx,IO_IDECONT INP al,dx or al,4 OUTP dx,al ; 뢠 ஫ IDE and al,0FBh OUTP dx,al loc_36: cmp [wSectQty],0 je loc_38 cmp [wHeadQty],0 jne dhd60 dhdErr: stc ; 室 訡 retn dhd60: call NewLineIfVerb jmp loc_43 loc_38: call WaitHDDforBusy mov al,0ECh ; ⥭ ଥ஢ HDD mov dx,IO_IDECMD mov cx,0FFFFh OUTP dx,al ; port 1F7h, hdsk0-command reg locloop_39: INP al,dx ; port 1F7h, hdsk0-status reg cmp al,58h je loc_40 loop locloop_39 jnz loc_38 mov dx,offset sError1 stc retn loc_40: and dl,0F0h mov cx,100h mov di,offset rHDDInfo rep INPSW mov dx,offset sHDD test byte ptr [wGenCnfHDD],80h ;।, -HDD CD-ROM jz loc_41 mov dx,offset sCDROM loc_41: call StrPrint mov si,offset sModelNo mov cx,14h locloop_42: lodsw ; mov dl,ah call PutChar mov dl,al call PutChar loop locloop_42 mov dx,offset sError3 test byte ptr [wGenCnfHDD],80h jnz loc_45 sub bx,bx mov ax,[wLogCylQty] mov byte ptr [fArrangeFigure],2 call ShowDec1 mov ax,[wLogHeadQty] mov [wHeadQty],ax mov byte ptr [fArrangeFigure],2 call ShowDec3 mov ax,[wLogSecQty] mov [wSectQty],ax mov byte ptr [fArrangeFigure],2 call ShowDec3 call NewLineIfVerb loc_43: mov dx,IO_IDECMD ;177h mov ax,[wHeadQty] dec ax or al,[bDHRsnap] dec dx OUTP dx,al ; port 1F6h, hdsk0-siz/drv/head call WaitHDDforBusy jz loc_46 loc_44: mov dx,offset sError2 loc_45: stc retn loc_46: sub dl,5 mov al,byte ptr [wSectQty] OUTP dx,al ; port 1F2h, hdsk0-sector count call WaitHDDforBusy jnz loc_44 mov al,91h ; ⠢塞 ࠬ HDD OUTP dx,al ; port 1F2h, hdsk0-sector count call WaitHDDforBusy jnz loc_44 push cs push cs pop ds pop es cmp byte ptr [fVerbosely],1 jne loc_47 mov dx,offset sTypeTable call StrPrint loc_47: mov di,offset EndOfCode push 0 ; Cylinder push 0 ; Head push 1 ; Sector call AnalyzePartition mov al,[block_dev] or al,al mov dx,offset sError4 jz loc_45 mov dx,offset sInstalled clc retn DetectHDD endp ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ AnalyzePartition - ᥪ 樥 ந BPB + ;+ ⮬ + ;+ 室: di - 㪠⥫ BPB + ;+ [sp+4] - ᥪ + ;+ [sp+6] - + ;+ [sp+8] - 樫 + ;+ 室: + ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AnalyzePartition proc near Sector = 4 ; bp+4 Head = 6 ; bp+6 Cylinder = 8 ; bp+8 enter 0,0 mov si,offset rPrtnInfo1 loc_48: mov cx,12Ch locloop_49: push cx push di mov cx,[bp+Cylinder] mov bh,[bp+Head] mov bl,[bp+Sector] mov di,offset rSectBuf call CHS2LBA call ReadSector pop di pop cx cmp [wLastWord1],0AA55h je loc_51 ; partition table is OK loop locloop_49 anpRet: leave retn 6 loc_51: push si mov al,[si+4] ; ।塞 ⨯ 䠩 ⥬ ; partition' or al,al jnz loc_52 jmp short loc_58 loc_52: cmp byte ptr [fVerbosely],1 ; jne loc_56 push ax push si xchg dx,si xchg ah,al mov si,offset bFileSystem1 loc_53: lodsb or al,al jz loc_54 cmp ah,al je loc_54 add si,7 jmp short loc_53 loc_54: xchg si,dx call StrPrint call PrintSpace mov dl,'Y' lodsb ; ਧ 㦠 設 cmp al,80h je loc_55 mov dl,'-' loc_55: call PutChar call PrintPrtnInfo lodsb call PrintPrtnInfo call PrintLongDec call PrintLongDec pop si pop ax loc_56: cmp [block_dev],43 je anpRet ; ᫨誮 ன cmp al,1 ; DOS 12-bit FAT je loc_59 cmp al,4 ; DOS 16-bit FAT je loc_59 cmp al,6 ; DOS 16-bit FAT je loc_59 cmp al,5 ; Extended DOS partiton je loc_63 loc_57: call NewLineIfVerb loc_58: pop si cmp si,offset rPrtnInfo4 jae anpRet add si,10h jmp loc_48 loc_59: cmp byte ptr [fVerbosely],1 jne loc_61 mov byte ptr [fArrangeFigure],2 mov ax,[si+0Ch] ;।塞 뢠 ࠧ 設 mov bx,[si+0Eh] ; axbx - ࠧ 設 ᥪ mov cx,0Bh locloop_60: shr bx,1 ; lTotalSects/4096 rcr ax,1 loop locloop_60 mov byte ptr [fArrangeFigure],2 call ShowDec1 mov dl,'M' call PutChar mov dl,'b' call PutChar loc_61: mov bx,[si+2] ; rBeginSecCyl mov ch,bl mov cl,bh shr ch,6 and bl,3Fh mov bh,[si+1] ; bBeginHead mov [wFirstCylOfPartition],cx mov [bFirstHdOfPartition],bh mov [bFirstSecOfPartition],bl push di mov di,offset rHDDInfo call CHS2LBA call ReadSector ; 뢠 boot-ᥪ ᪨ ; ᪮ pop di cmp [wLastWord2],0AA55h jne loc_62 cmp byte ptr [bExtBootSig],29h ; BootSector+26h - ਧ ७ boot-ᥪ je loc_64 mov dl,7 call PutChar loc_62: jmp short loc_57 loc_63: mov ax,[si+2] ; ७ 設 mov cl,[si+1] xchg ah,al mov bl,ah and bl,3Fh shr ah,6 call NewLineIfVerb push ax ; Cylinder push cx ; Head push bx ; Sector call AnalyzePartition jmp loc_58 loc_64: mov ax,[wFirstCylOfPartition] ;ax=砫 樫 樨 mov bl,byte ptr [wHeadQty] ; bx=- sub bh,bh imul bx ; dx,ax = wFirstCylOfPartition * wHeadQty add al,[bFirstHdOfPartition] adc ah,0 adc dx,0 mov cx,dx ;cx,ax=wFirstCylOfPartition * wHeadQty + bFirstHdOfPartition ;dx,ax = wFirstCylOfPartition * wHeadQty + bFirstHdOfPartition sub bh,bh mov bl,byte ptr [wSectQty] imul bx ;dx,ax=( wFirstCylOfPartition * wHeadQty + bFirstHdOfPartition ;dx,ax = wFirstCylOfPartition * wHeadQty + bFirstHdOfPartition ) * wSectQty push ax push dx mov ax,cx imul bx xchg dx,ax pop ax add dx,ax pop ax sub al,[bFirstSecOfPartition] sbb ah,0 sbb dx,0 add ax,1 adc dx,0 stosw xchg dx,ax stosw mov si,offset rBPB mov cx,19h rep movsb ; ஢ BPB ⮬ cmp byte ptr [fVerbosely],1 jne loc_65 call PrintSpace sub ah,ah mov byte ptr [fArrangeFigure],2 mov dl,[block_dev] add dl,[cFirstLetter] call PutChar mov dl,':' call PutChar loc_65: inc [block_dev] ; 㢥稢 稪 ᮢ jmp loc_57 AnalyzePartition endp ; ; ⠥ , 樫 ᥪ 砫 ; PrintPrtnInfo proc near lodsb ; 砫쭮 sub ah,ah mov byte ptr [fArrangeFigure],2 call ShowDec2 lodsw ; 砫 樫 ᥪ mov bh,al mov bl,ah and al,3Fh mov byte ptr [fArrangeFigure],2 sub ah,ah call ShowDec2 xchg bx,ax shr ah,6 mov byte ptr [fArrangeFigure],2 sub bx,bx call ShowDec1 jmp short PrintSpace PrintPrtnInfo endp ; ; PrintLongDec ; PrintLongDec proc near lodsw xchg dx,ax lodsw xchg dx,ax mov byte ptr [fArrangeFigure],2 call ShowDec0 PrintLongDec endp ; ; PrintSpace ; PrintSpace proc near mov dl,20h ; ' ' call PutChar ; (0B1B) loc_ret_66: retn PrintSpace endp ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ CHS2LBA - ८ࠧ CHS- ᥪ LBA + ;+ 室: cx - 樤 + ;+ bh - + ;+ bl - ᥪ + ;+ 室: bl=LBA[7..0] + ;+ cl=LBA[15..8] + ;+ ch=LBA[23..16] + ;+ bh=LBA[27..24] + ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CHS2LBA proc near test [bDHRsnap],40h jz loc_ret_66 ; not LBA xchg cx,ax sub cx,cx sub dx,dx mul [wHeadQty] ; dx,ax = Cylinder*headQty add al,bh adc ah,cl adc dx,cx ; dx,ax=Cylinder*headQty+Head mul [wSectQty] ; dx,ax=(Cylinder*headQty+Head)*sectPerTrack add al,bl adc ah,cl adc dx,cx dec ax sbb dx,cx ;dx,ax=(Cylinder*headQty+Head)*sectPerTrack+(Sector-1) jmp loc_17 CHS2LBA endp ; ; NewLineIfVerb ; NewLineIfVerb proc near cmp byte ptr [fVerbosely],1 ; (3708:0B40=0) jne loc_ret_67 NewLineIfVerb endp ; ; NewLine ; NewLine proc near mov dx,offset sCRLF ; (3708:0A2E='') call StrPrint ; (0B22) loc_ret_67: retn NewLine endp ; ; ; External Entry Point ; ; start proc far mov dx,offset sTitle1 ; (3708:0262='') call StrPrint ; (0B22) mov ah,62h int 21h ; DOS Services ah=function 62h ; get Program Segment Prefix bx push bx pop ds mov si,81h call ParseArg jc s20 call DetectI2L jc s20 mov al,byte ptr cs:[fTestI2L] or al,al jz s15 call testI2L ; 㥬 jc loc_68 mov dx,offset sOK call StrPrint s15: call DetectHDD ; (0598) jnc loc_68 s20: call StrPrint ; (0B22) loc_68: call NewLine ; (0963) mov ax,4C00h int 21h ;DOS Services ah=function 4Ch ;terminate with al=return code ;now data because: does not return start endp ; ; Initialize ; Initialize proc near mov dx,offset sTitle1 call StrPrint les bx,cs:[pRequestHeader] lds si,dword ptr es:[bx+12h] ; 㦠 㪠⥫ ப mov dx,offset sTitle2 mov al,es:[bx+16h] ; 㦠 㯭 ਢ add al,'A' mov cs:[cFirstLetter],al call ParseArg jc ini20 call DetectI2L jc ini20 call DetectHDD ini20: pushf call StrPrint call NewLine popf jnc loc_69 ini30: les bx,cs:[pRequestHeader] mov byte ptr es:[bx+0dh],0 mov word ptr es:[bx+0Eh],0 mov es:[bx+10h],cs jmp Exit3 loc_69: les bx,[pRequestHeader] mov es:[bx+0dh],al mov es:[bx+12h],di mov es:[bx+14h],cs mov cl,al sub ch,ch mov ax,offset EndOfCode+4 locloop_70: mov [di],ax inc di inc di add ax,1Dh loop locloop_70 mov es:[bx+0Eh],di mov es:[bx+10h],cs clc retn Initialize endp sInstalled db 0dh, 0ah, 'Installed.$' sError4 db 0dh, 0ah, 'Error. Unsupported partition type.$' sCRLF db 0dh, 0ah, '$' ; ; ShowDec0 ; ShowDec0 proc near sub dl,dl jmp short loc_72 ; (0A3E) loc_71: inc dl sub ax,0CA00h sbb bx,3B9Ah loc_72: cmp bx,3B9Ah ja loc_71 jc loc_73 cmp ax,0CA00h jae loc_71 loc_73: call ShowDigit ; (0AFE) sub dl,dl jmp short loc_75 ; (0A5B) loc_74: inc dl sub ax,0E100h sbb bx,5F5h loc_75: cmp bx,5F5h ja loc_74 jc loc_76 cmp ax,0E100h jae loc_74 loc_76: call ShowDigit ; (0AFE) sub dl,dl jmp short loc_78 ; (0A78) loc_77: inc dl sub ax,9680h sbb bx,98h loc_78: cmp bx,98h ja loc_77 jc loc_79 cmp ax,9680h jae loc_77 loc_79: call ShowDigit ; (0AFE) sub dl,dl jmp short loc_81 ; (0A94) loc_80: inc dl sub ax,4240h sbb bx,0Fh loc_81: cmp bx,0Fh ja loc_80 jc loc_82 cmp ax,4240h jae loc_80 loc_82: call ShowDigit ; (0AFE) sub dl,dl jmp short loc_84 ; (0AAF) loc_83: inc dl sub ax,86A0h sbb bx,1 loc_84: cmp bx,1 ja loc_83 jc loc_85 cmp ax,86A0h jae loc_83 loc_85: call ShowDigit ; (0AFE) ShowDec0 endp ; ; ShowDec1 ; ShowDec1 proc near sub dl,dl jmp short loc_87 ; (0ACA) loc_86: inc dl sub ax,2710h sbb bx,0 loc_87: cmp bx,0 ja loc_86 cmp ax,2710h jae loc_86 call ShowDigit ; (0AFE) ShowDec1 endp ; ; ShowDec2 ; ShowDec2 proc near sub dx,dx mov cx,3E8h div cx xchg dx,ax call ShowDigit ; (0AFE) ShowDec2 endp ; ; ShowDec3 ; ShowDec3 proc near mov cl,64h ; 'd' div cl mov dl,al call ShowDigit ; (0AFE) mov al,ah cbw mov cl,0ah div cl mov dl,al call ShowDigit ; (0AFE) mov dl,ah mov byte ptr [fArrangeFigure],1 ; (3708:0D48=0) ShowDec3 endp ; ; ShowDigit ; ShowDigit proc near cmp byte ptr [fArrangeFigure],1 ; (3708:0D48=0) je loc_88 or dl,dl jnz loc_88 cmp byte ptr [fArrangeFigure],2 ; (3708:0D48=0) jne loc_ret_89 jmp PrintSpace ; (0930) loc_88: mov byte ptr [fArrangeFigure],1 ; (3708:0D48=0) add dl,30h ; '0' ShowDigit endp ; ; PutChar ; PutChar proc near push ax mov ah,2 int 21h ; DOS Services ah=function 02h ; display char dl pop ax loc_ret_89: retn PutChar endp ; ; StrPrint ; StrPrint proc near push si push cs pop ds xchg si,dx loc_90: mov dl,[si] nop nop nop cmp dl,'$' je loc_91 call PutChar inc si jmp short loc_90 loc_91: pop si retn StrPrint endp db 0 wSectQty dw 0 wHeadQty dw 0 fVerbosely db 0 cFirstLetter db 30h db 0, 0 wFirstCylOfPartition dw 0 bFirstHdOfPartition db 0 bFirstSecOfPartition db 0 rSectBuf dw 0 db 444 dup (0) rPrtnInfo1 db 16 dup (0) rPrtnInfo2 db 16 dup (0) rPrtnInfo3 db 16 dup (0) rPrtnInfo4 db 16 dup (0) wLastWord1 dw 0 fArrangeFigure db 0 rHDDInfo db 0 wGenCnfHDD db 0 ; ᫮ 䨣樨 wLogCylQty dw 0 ; - ᪨ 樫஢ db 0, 0 wLogHeadQty dw 0 db 0, 0, 0 rBPB db 0 wLogSecQty dw 0 db 24 dup (0) bExtBootSig db 16 dup (0) sModelNo db 456 dup(0) wLastWord2 dw 0 db 7 dup(0) _TEXT ends end start