⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xdma.lst

📁 DOS下的dma读写驱动
💻 LST
📖 第 1 页 / 共 5 页
字号:
   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 + -