|
| 1 | +; Patch for ASPI7DOS.SYS, Version 1.42 |
| 2 | + |
| 3 | +; Copyright (C) 2021 Michael Karcher (the patch, not the ASPI driver itself) |
| 4 | +; This patch may be used and distributed according to the MIT License. |
| 5 | + |
| 6 | +.386 ; ASPI7DOS already contains 386 stuff, so allow it for the patch, too |
| 7 | + |
| 8 | +BIOSDriveInfo STRUC |
| 9 | +BD_IsMyDrive db ? |
| 10 | +BD_TargetID db ? |
| 11 | +BD_BusID db ? |
| 12 | +BD_GeometryCX dw ? |
| 13 | +BD_MaxLBA dd ? |
| 14 | +BD_drive_type db ? |
| 15 | +BD_GeometryDH db ? |
| 16 | +BIOSDriveInfo ENDS |
| 17 | + |
| 18 | +ASPI_CDBRequest STRUC |
| 19 | +ASPI_FunctionNr db ? |
| 20 | +ASPI_StatusCode db ? |
| 21 | +ASPI_HbaID db ? |
| 22 | +ASPI_ReqFlags db ? |
| 23 | +ASPI_Rsvd dd ? |
| 24 | +ASPI_TargetID db ? |
| 25 | +ASPI_Lun db ? |
| 26 | +ASPI_DataLen dd ? |
| 27 | +ASPI_SenseLen db ? |
| 28 | +ASPI_DataBufferPtr dd ? |
| 29 | +ASPI_NextReq dd ? |
| 30 | +ASPI_cdblen db ? |
| 31 | +ASPI_HaStatus db ? |
| 32 | +ASPI_DevStatus db ? |
| 33 | +ASPI_PostFunction dd ? |
| 34 | +ASPI_PostDS dw ? |
| 35 | +ASPI_SRBPtr dd ? |
| 36 | +ASPI_Rsvd2 dw ? |
| 37 | +ASPI_SRBPhysical dd ? |
| 38 | +ASPI_Rsvd3 db 22 dup (?) |
| 39 | +ASPI_CDBdata db 10 dup (?) |
| 40 | +ASPI_CDBRequest ENDS |
| 41 | + |
| 42 | +EDDData STRUC |
| 43 | +EDDData_rqsize dw ? |
| 44 | +EDDData_count dw ? |
| 45 | +EDDData_ptr dd ? |
| 46 | +EDDData_LBAlow dd ? |
| 47 | +EDDData_LBAhigh dd ? |
| 48 | +EDDData ENDS |
| 49 | + |
| 50 | +CallerES = 2 |
| 51 | +CallerDS = 4 |
| 52 | +CallerDI = 6 |
| 53 | +CallerSI = 8 |
| 54 | +CallerDX = 10 |
| 55 | +CallerCX = 12 |
| 56 | +CallerBX = 14 |
| 57 | + |
| 58 | +DRIVER SEGMENT USE16 |
| 59 | + assume cs:DRIVER |
| 60 | + org 48FAh |
| 61 | +I13R_CurrentDrive LABEL WORD |
| 62 | + org 48FDh |
| 63 | +I13R_Flags LABEL BYTE |
| 64 | + org 4900h |
| 65 | +I13R_ASPICall LABEL ASPI_CDBRequest |
| 66 | + org 4ACAh |
| 67 | +I13_9_OK LABEL NEAR |
| 68 | + org 4BABh |
| 69 | +I13_Unhandled LABEL NEAR |
| 70 | + org 4BB0h |
| 71 | +I13_OutWithAHAndCarry LABEL NEAR |
| 72 | + org 4C10h |
| 73 | +I13R_ExecuteRequest LABEL NEAR |
| 74 | + org 4C81h |
| 75 | +I13R_DoneCallback LABEL NEAR |
| 76 | + org 4CEBh |
| 77 | +I13R_SetStatus LABEL NEAR |
| 78 | + |
| 79 | + ; branch out before clobbering SI and DS |
| 80 | + org 4994h |
| 81 | + cmp ah, 20h |
| 82 | + jbe SHORT I13_Classic |
| 83 | + jmp MaybeI13E |
| 84 | +I13_Classic: |
| 85 | + mov si, cs |
| 86 | + mov ds, si |
| 87 | + |
| 88 | + org 458Ah |
| 89 | + ; Big hole. It seems Adaptec reserved space for 88 BIOSDriveInfo |
| 90 | + ; structures instead of just 8 BIOSDriveInfo structures. So there |
| 91 | + ; are 80 superflous structures, i.e. 880 bytes. |
| 92 | +Int13E_Dispatch LABEL WORD |
| 93 | + dw OFFSET I13E_checkpresence ; 41h |
| 94 | + dw OFFSET I13E_read ; 42h |
| 95 | + dw OFFSET I13E_write ; 43h |
| 96 | + dw OFFSET I13E_verify ; 44h |
| 97 | + dw OFFSET I13_Unhandled ; 45h (lock/unlock) |
| 98 | + dw OFFSET I13_Unhandled ; 46h (eject) |
| 99 | + dw OFFSET I13E_seek ; 47h |
| 100 | + dw OFFSET I13E_params ; 48h |
| 101 | + |
| 102 | +MaybeI13E: |
| 103 | + sub ah, 41h |
| 104 | + cmp ah, 7 |
| 105 | + ja I13_Unhandled |
| 106 | + push ax |
| 107 | + mov al,ah |
| 108 | + mov ah,0 |
| 109 | + add ax,ax |
| 110 | + mov di,ax |
| 111 | + pop ax |
| 112 | + jmp cs:[di + Int13E_Dispatch] |
| 113 | + |
| 114 | +I13E_checkpresence: |
| 115 | + push bp |
| 116 | + mov bp, sp |
| 117 | + mov word ptr [bp+CallerBX], 0AA55h ; extensions present |
| 118 | + mov ah, 01h ; version 1.x |
| 119 | + mov word ptr [bp+CallerCX], 1 ; support LBA disk calls only |
| 120 | + pop bp |
| 121 | + jmp I13_OutWithAHandCarry |
| 122 | + |
| 123 | +I13E_params: |
| 124 | + mov di, si |
| 125 | + push ds |
| 126 | + pop es |
| 127 | + mov ax, 1Ah |
| 128 | + cmp word ptr [di], ax |
| 129 | + jnb go_on |
| 130 | + jmp I13_Unhandled |
| 131 | +go_on: |
| 132 | + stosw |
| 133 | + mov ax, 1 ; No 64K DMA limit, no CHS info |
| 134 | + stosw |
| 135 | + dec ax |
| 136 | + mov cx, 6 |
| 137 | + rep stosw ; clear CHS fields (not reporting them) |
| 138 | + |
| 139 | + push eax |
| 140 | + mov eax,0 |
| 141 | + mov dl,8 |
| 142 | + mov cx,ax |
| 143 | + mov bx,925h |
| 144 | + push es |
| 145 | + push di |
| 146 | + clc |
| 147 | + call MyCDBExecute |
| 148 | + pop di |
| 149 | + pop es |
| 150 | + pop eax |
| 151 | + mov eax, es:[di] |
| 152 | + xchg ah,al |
| 153 | + rol eax,16 |
| 154 | + xchg ah,al |
| 155 | + inc eax |
| 156 | + stosd |
| 157 | + |
| 158 | + xor ax, ax |
| 159 | + stosw ; high 32 bit of max LBA |
| 160 | + stosw |
| 161 | + mov ax, 200h ; sector size |
| 162 | + stosw |
| 163 | + jmp I13_9_OK |
| 164 | + |
| 165 | +I13E_read: |
| 166 | + mov bx, 928h |
| 167 | + jmp SHORT I13E_rwcommon |
| 168 | +I13E_write: |
| 169 | + mov bx, 112Ah |
| 170 | +I13E_rwcommon: |
| 171 | + stc |
| 172 | + push eax |
| 173 | + call I13E_core |
| 174 | + pop eax |
| 175 | + jmp I13_OutWithAHandCarry |
| 176 | + |
| 177 | +I13E_verify: |
| 178 | + mov bx, 12Fh |
| 179 | + stc |
| 180 | + push eax |
| 181 | + call I13E_core |
| 182 | + pop eax |
| 183 | +kill_bad_fn: |
| 184 | + jnc SHORT verify_done |
| 185 | + cmp ah, 1 |
| 186 | + jne SHORT verify_done |
| 187 | + ; no fake verify yet. |
| 188 | + ; verify might very well be above 64KB, so Adaptecs idea to |
| 189 | + ; "read over the F000 segment" will fail |
| 190 | +is_ok: |
| 191 | + mov ah, 0 |
| 192 | + clc |
| 193 | +verify_done: |
| 194 | + jmp I13_OutWithAHandCarry |
| 195 | + |
| 196 | +I13E_seek: |
| 197 | + test [I13R_flags], 1 ; implies CLC |
| 198 | + jnz is_ok ; ignore seek |
| 199 | + mov bx, 12Bh |
| 200 | + push eax |
| 201 | + call I13E_core |
| 202 | + pop eax |
| 203 | + jmp kill_bad_fn ; MUST change this when fake verify gets |
| 204 | + ; implemented |
| 205 | + |
| 206 | +I13E_core PROC NEAR |
| 207 | + mov eax, [si+EDDData_LBAlow] |
| 208 | + mov dl, 0 |
| 209 | + mov cx, word ptr [si+EDDData_Count] |
| 210 | + les di, [si+EDDData_Ptr] |
| 211 | + |
| 212 | +MyCDBExecute LABEL NEAR |
| 213 | + push ds |
| 214 | + push si |
| 215 | + push cs |
| 216 | + pop ds |
| 217 | + ASSUME ds:DRIVER |
| 218 | + mov si, OFFSET I13R_ASPICall |
| 219 | + mov word ptr [si+ASPI_DataBufferPtr], di |
| 220 | + mov word ptr [si+ASPI_DataBufferPtr+2], es |
| 221 | + |
| 222 | + sbb di, di ; CF set on entry: allow length |
| 223 | + and di, cx |
| 224 | + xchg di, cx |
| 225 | + add di, di ; sector count to 256-byte-count |
| 226 | + mov byte ptr [si+ASPI_DataLen], dl |
| 227 | + mov word ptr [si+ASPI_DataLen+1], di |
| 228 | + mov byte ptr [si+ASPI_DataLen+3], 0 |
| 229 | + xchg ah,al |
| 230 | + ror eax,16 |
| 231 | + xchg ah,al |
| 232 | + mov dword ptr [si+ASPI_CDBdata+2], eax |
| 233 | + xchg ch,cl |
| 234 | + mov word ptr [si+ASPI_CDBdata+7], cx |
| 235 | + mov [si+ASPI_FunctionNr], 2 |
| 236 | + mov [si+ASPI_ReqFlags], bh |
| 237 | + mov [si+ASPI_CDBlen], 10 |
| 238 | + mov [si+ASPI_SenseLen], 14 |
| 239 | + mov [si+ASPI_CDBdata], bl |
| 240 | + mov [si+ASPI_CDBdata+1], 0 |
| 241 | + mov [si+ASPI_CDBdata+6], 0 |
| 242 | + mov [si+ASPI_CDBdata+9], 0 |
| 243 | + mov word ptr [si+ASPI_PostFunction], OFFSET I13R_DoneCallback |
| 244 | + mov word ptr [si+ASPI_PostFunction+2], cs |
| 245 | + |
| 246 | + mov bx, [I13R_CurrentDrive] |
| 247 | + mov al, [bx+BD_TargetID] |
| 248 | + mov [si+ASPI_TargetID], al |
| 249 | + mov al, [bx+BD_BusID] |
| 250 | + mov [si+ASPI_HbaID], al |
| 251 | + mov [si+ASPI_LUN], 0 |
| 252 | + |
| 253 | + call I13R_ExecuteRequest |
| 254 | + call I13R_SetStatus |
| 255 | + pop si |
| 256 | + pop ds |
| 257 | + ret |
| 258 | +I13E_core ENDP |
| 259 | + |
| 260 | + org 53h |
| 261 | + ;db "Version 1.42" |
| 262 | + db "V1.42+EDD1.0" |
| 263 | + org 4FB5h |
| 264 | + db "V1.42+EDD1.0" |
| 265 | + |
| 266 | +DRIVER ENDS |
| 267 | +END |
0 commit comments