📄 xdma.lst
字号:
163 RDY equ 040h ;IDE disk is "ready".
164 FLT equ 020h ;IDE disk has a "fault".
165 DRQ equ 008h ;IDE data request.
166 ERR equ 001h ;IDE general error flag.
167 DMI equ 004h ;DMA interrupt occured.
168 DME equ 002h ;DMA error occurred.
169 DRCMD equ 0C8h ;DMA read command (write is 0CAh,
170 ; LBA48 commands are 025h/035h).
171 LBABITS equ 0E0h ;Fixed LBA command bits.
172 ;
173 ; LBA "Device Address Packet" Layout.
174 ;
175 struc DAP
176 00000000 <res 00000001> DapPL resb 1 ;Packet length.
177 00000001 <res 00000001> resb 1 ;(Reserved).
178 00000002 <res 00000001> DapSC resb 1 ;I-O sector count.
179 00000003 <res 00000001> resb 1 ;(Reserved).
180 00000004 <res 00000004> DapBuf resd 1 ;I-O buffer address (segment:offset).
181 00000008 <res 00000002> DapLBA resw 1 ;48-bit logical block address (LBA).
182 0000000A <res 00000004> DapLBA1 resd 1
183 endstruc
184 ;
185 ; DOS "Request Packet" Layout.
186 ;
187 struc RP
188 00000000 <res 00000002> resb 2 ;(Unused by us).
189 00000002 <res 00000001> RPOp resb 1 ;Opcode.
190 00000003 <res 00000002> RPStat resw 1 ;Status word.
191 00000005 <res 00000009> resb 9 ;(Unused by us).
192 0000000E <res 00000004> RPSize resd 1 ;Resident driver size.
193 00000012 <res 00000004> RPCL resd 1 ;Command-line data pointer.
194 endstruc
195 RPERR equ 08003h ;Packet "error" flags.
196 RPDON equ 00100h ;Packet "done" flag.
197 ;
198 ; DOS Driver Device Header.
199 ;
200 00000000 FFFFFFFF @ dd 0FFFFFFFFh ;Link to next header block.
201 00000004 0080 dw 08000h ;Driver "device attributes".
202 00000006 [8604] dw Strat ;"Strategy" routine offset.
203 Timer equ $-2 ;(400-msec timeout counter after Init).
204 IDEAd equ $-1 ;(Lower IDE status address after Init).
205 00000008 [9104] dw DevInt ;"Device-Interrupt" routine offset.
206 DMAAd equ $-2 ;(DMA command-reg. address after Init).
207 0000000A 58444D41312400 DvrName db 'XDMA1$',0 ;Driver name ("XDMA$" without overlap).
208 ;NOTE: XDMA1$ confirms location 8 has
209 ; a valid controller address and that
210 ; location 12h has IDE channel "busy"
211 ; flags. XDMA1$ also confirms that
212 ; "OCheck" is useable with a far call
213 ; to XDMA location 0314h. All these
214 ; locations are FIXED, FOREVER!
215 ;
216 ; Resident Driver "Data Page" Variables. The 0BAh/0B0h bytes in the
217 ; init class-code "interface byte" table (SecCt2) are for ALi M5529
218 ; chips. MANY THANKS to David Muller for this VALUABLE upgrade!
219 ;
220 00000011 00 VLF db 0 ;VDS "lock" flag (DvrName byte 8).
221 00000012 00 Flags db 0 ;I-O and IDE channel "busy" flags:
222 ; 080h = I-O request or timer busy.
223 ; 040h = Secondary channel is busy.
224 ; 020h = Secondary channel overlap.
225 ; 010h = Primary channel is busy.
226 ; 008h = Primary channel overlap.
227 ; If overlap disabled, 0FFh = "busy".
228 00000013 00 ReqBF db 0 ;I-O request channel "busy" flag.
229 00000014 [30000000] PRDAd dd IOAdr ;PRD 32-bit command addr. (Init set).
230 00000018 FA SecCt2 db 0FAh ;IDE "upper" sector count.
231 00000019 F08A80 LBA2 db 0F0h,08Ah,080h ;IDE "upper" LBA bits 24-47.
232 0000001C BA SecCt db 0BAh ;IDE "lower" sector count.
233 0000001D B00000 LBA db 0B0h,0,0 ;IDE "lower" LBA bits 0-23.
234 00000020 00 DSCmd db 0 ;IDE disk-select and LBA commands.
235 00000021 00 IOCmd db 0 ;IDE command byte.
236 00000022 0000 XMOfs dw 0 ;XMS 16-bit buffer offset (Init set).
237 00000024 [40050000] VDSLn dd ResEnd ;VDS and XMS buffer length.
238 00000028 00000000 VDSOf dd 0 ;VDS 32-bit offset.
239 0000002C 00000000 VDSSg dd 0 ;VDS 16-bit segment (hi-order zero).
240 00000030 00000000 IOAdr dd 0 ;VDS and DMA 32-bit address.
241 00000034 00000080 IOLen dd 080000000h ;DMA byte count and "end" flag.
242 BiosHD equ $-2 ;(Number of BIOS disks, during Init).
243 HDCount equ $-3 ;(BIOS hard-disk count, during Init).
244 XMSSH equ VDSOf ;(XMS parameters share the VDS block).
245 XMSDH equ VDSSg+2
246 00000038 FFFFFFFF Units dd 0FFFFFFFFh ;IDE "active units" table (Init set).
247 0000003C 00000000 CHSSec dd 0 ;CHS sectors/head table (Init set).
248 00000040 00000000 CHSHd dd 0 ;CHS heads/cylinder table (Init set).
249 00000044 00000000 CStack dd 0 ;Caller's saved stack pointer.
250 ;
251 ; Driver Entry Routine. For CHS requests, the registers contain:
252 ;
253 ; AH Request code. We handle 002h read and 003h write.
254 ; AL I-O sector count.
255 ; CH Lower 8 bits of starting cylinder.
256 ; CL Starting sector and upper 2 bits of cylinder.
257 ; DH Starting head.
258 ; DL BIOS unit number. We handle 080h and up (hard-disks).
259 ; ES:BX I-O buffer address.
260 ;
261 ; For LBA requests, the registers contain:
262 ;
263 ; AH Request code. We handle 042h read and 043h write.
264 ; DL BIOS unit number. We handle 080h and up (hard-disks).
265 ; DS:SI Pointer to Device Address Packet ("DAP"), described above.
266 ;
267 00000048 55 Entry push bp ;Driver entry routine -- save BP-reg.
268 00000049 BD0100 mov bp,1 ;Reset active-units table index.
269 @LastU equ $-2 ;(Last-unit index, set by Init).
270 0000004C 4D NextU dec bp ;Any more active units to check?
271 0000004D 7869 js QuickX ;No, request NOT for us -- exit quick!
272 0000004F 2E3A5638 cmp dl,[cs:bp+Units-@] ;Does request unit match our table?
273 00000053 75F7 jne NextU ;No, see if more table entries remain.
274 00000055 FA cli ;It's for us! Disable CPU interrupts.
275 00000056 50 push ax ;Save AX-register for "busy" check.
276 00000057 89E8 mov ax,bp ;Get driver & request "busy" flags.
277 00000059 0C09 or al,009h
278 0000005B 40 inc ax
279 0000005C C0E004 shl al,4
280 0000005F 2E8406[1200] test [cs:Flags],al ;Is driver or desired channel "busy"?
281 00000064 7407 jz SetRqBF ;No, set request's "busy" flags.
282 00000066 58 pop ax ;BAAAD News! Reload AX-register.
283 00000067 F9 stc ;We're BUSY, you moron! Post "invalid
284 00000068 B401 mov ah,001h ; function" and exit (most drivers do
285 0000006A E94901 jmp GetOut ; NO "re-entry" test and can CRASH!).
286 0000006D 2EA2[1300] SetRqBF mov [cs:ReqBF],al ;Set this request's "busy" flags.
287 00000071 58 pop ax ;Reload AX-reg. (saved again below).
288 00000072 2E8926[4400] mov [cs:CStack],sp ;Save caller's stack pointer.
289 00000077 2E8C16[4600] mov [cs:CStack+2],ss
290 0000007C 0E push cs ;Switch to this driver's stack.
291 0000007D 17 pop ss
292 0000007E BC[4005] mov sp,ResEnd
293 @Stack equ $-2
294 00000081 2EF606[1200]18 test byte [cs:Flags],018h ;Is output overlap running?
295 00000087 7404 jz SaveReg ;No, go save all CPU registers.
296 00000089 0E push cs ;Await end of output overlap.
297 0000008A E88702 call OCheck
298 0000008D 60 SaveReg pusha ;Save all 16-bit CPU registers.
299 0000008E FC cld ;Ensure FORWARD "string" commands.
300 0000008F B2BE mov dl,0BEh ;Mask out LBA and write request bits.
301 00000091 20E2 and dl,ah
302 00000093 80FA02 cmp dl,002h ;Is this a CHS or LBA read or write?
303 00000096 7519 jne Pass ;No, let BIOS handle this request.
304 00000098 D0E4 shl ah,1 ;Is this an LBA read or write request?
305 0000009A 7928 jns ValSC ;No, go validate CHS sector count.
306 0000009C 8A4402 mov al,[si+DapSC] ;Get "DAP" I-O sector count.
307 0000009F C4540A les dx,[si+DapLBA1] ;Get "DAP" LBA bits 16-47.
308 000000A2 8CC7 mov di,es
309 000000A4 C44C04 les cx,[si+DapBuf] ;Get "DAP" I-O buffer address.
310 000000A7 66837C04FF cmp dword [si+DapBuf],byte -1 ;64-bit buffer address?
311 000000AC 8B7408 mov si,[si+DapLBA] ;(Get "DAP" LBA bits 0-15).
312 000000AF 7513 jne ValSC ;No, go validate "DAP" sector count.
313 000000B1 61 Pass popa ;"Pass" request -- reload all CPU regs.
314 000000B2 2E0FB226[4400] lss sp,[cs:CStack] ;Switch back to caller's stack.
315 000000B8 89E5 QuickX mov bp,sp ;Reload CPU flags saved during Int 13h.
316 000000BA FF7606 push word [bp+6]
317 000000BD 9D popf
318 000000BE 5D pop bp ;Reload BP-register.
319 000000BF EA db 0EAh ;Go to next routine in Int 13h chain.
320 000000C0 00000000 @PrvI13 dd 0 ;(Prior INT13 vector, saved by Init).
321 000000C4 FEC8 ValSC dec al ;Is sector count zero or over 128?
322 000000C6 78E9 js Pass ;Yes? Let BIOS handle this "No-No!".
323 000000C8 40 inc ax ;Restore sector count -- LBA request?
324 000000C9 7829 js SaveSeg ;Yes, go save segment registers.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -