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

📄 hpt370.cod

📁 hpt370的驱动程序
💻 COD
📖 第 1 页 / 共 5 页
字号:
	TITLE	hpt370.c
	.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
_DATA	SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA	ENDS
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
_BSS	SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS	ENDS
_TLS	SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS	ENDS
FLAT	GROUP _DATA, CONST, _BSS
	ASSUME	CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC	_bad_disks
PUBLIC	_AtapiDebugLevel
PUBLIC	_PIO_setting
PUBLIC	_UDMA_setting
PUBLIC	_DMA_setting
_DATA	SEGMENT
_AtapiDebugLevel DD 0fH
_PIO_setting DD	0ac1f50bH
	DD	0ac1f4e5H
	DD	0a81f484H
	DD	0a81f463H
	DD	0a81f442H
_UDMA_setting DD 01a19f4eaH
	DD	01a15f454H
	DD	01a0df442H
	DD	01a8df442H
	DD	01aadf442H
	DD	01a85f442H
_DMA_setting DD	02a81f4eaH
	DD	02a81f454H
	DD	02a81f442H
	ORG $+4
_bad_disks DB	0ffH
	DB	0ffH
	DB	04H
	DB	08H
	DD	FLAT:$SG2112
	DB	03H
	DB	02H
	DB	04H
	DB	0aH
	DD	FLAT:$SG2113
	DB	0ffH
	DB	0ffH
	DB	03H
	DB	0aH
	DD	FLAT:$SG2114
	DB	03H
	DB	02H
	DB	04H
	DB	0aH
	DD	FLAT:$SG2115
	DB	0ffH
	DB	02H
	DB	04H
	DB	0aH
	DD	FLAT:$SG2116
	DB	0ffH
	DB	02H
	DB	04H
	DB	0eH
	DD	FLAT:$SG2117
	DB	03H
	DB	02H
	DB	04H
	DB	0eH
	DD	FLAT:$SG2118
	DB	0ffH
	DB	0ffH
	DB	04H
	DB	0aH
	DD	FLAT:$SG2119
	DB	0ffH
	DB	0ffH
	DB	00H
	DB	010H
	DD	FLAT:$SG2120
	DB	0ffH
	DB	0ffH
	DB	04H
	DB	0aH
	DD	FLAT:$SG2121
	DB	0ffH
	DB	0ffH
	DB	00H
	DB	08H
	DD	FLAT:$SG2122
	DB	0ffH
	DB	01H
	DB	04H
	DB	012H
	DD	FLAT:$SG2123
	DB	02H
	DB	02H
	DB	04H
	DB	0eH
	DD	FLAT:$SG2124
	DB	03H
	DB	02H
	DB	04H
	DB	0aH
	DD	FLAT:$SG2125
	DB	03H
	DB	02H
	DB	04H
	DB	0aH
	DD	FLAT:$SG2126
	DB	03H
	DB	02H
	DB	04H
	DB	0aH
	DD	FLAT:$SG2127
	DB	03H
	DB	02H
	DB	04H
	DB	0aH
	DD	FLAT:$SG2128
	DB	03H
	DB	02H
	DB	04H
	DB	0aH
	DD	FLAT:$SG2129
	DB	03H
	DB	02H
	DB	04H
	DB	08H
	DD	FLAT:$SG2130
	DB	05H
	DB	02H
	DB	04H
	DB	00H
	DD	00H
_?pioTiming@?1??Hpt366Initialize@@9@9 DW 03c0H
	DW	01e0H
	DW	0f0H
	DW	0b4H
	DW	078H
	DW	05aH
$SG2112	DB	'TO-I79 5', 00H
	ORG $+3
$SG2113	DB	'DW CCA6204', 00H
	ORG $+1
$SG2114	DB	'nIetrglaP ', 00H
	ORG $+1
$SG2115	DB	'DW CDW0000', 00H
	ORG $+1
$SG2116	DB	'aMtxro9 01', 00H
	ORG $+1
$SG2117	DB	'aMtxro9 80544D', 00H
	ORG $+1
$SG2118	DB	'aMtxro9 02848U', 00H
	ORG $+1
$SG2119	DB	'eHlwte-taP', 00H
	ORG $+1
$SG2120	DB	'iPnoee rVD-DOR M', 00H
	ORG $+3
$SG2121	DB	'DCR- WC XR', 00H
	ORG $+1
$SG2122	DB	'EN C    ', 00H
	ORG $+3
$SG2123	DB	'UFIJST UPM3C60A5 H', 00H
	ORG $+1
$SG2124	DB	'aMtxro9 80284U', 00H
	ORG $+1
$SG2125	DB	'TS132002 A', 00H
	ORG $+1
$SG2126	DB	'TS136302 A', 00H
	ORG $+1
$SG2127	DB	'TS234003 A', 00H
	ORG $+1
$SG2128	DB	'TS232704 A', 00H
	ORG $+1
$SG2129	DB	'TS230804 A', 00H
	ORG $+1
$SG2130	DB	'TS6318A0', 00H
_DATA	ENDS
PUBLIC	_Hpt366SetIdeTiming@4
EXTRN	_g_SupportDMA:QWORD
EXTRN	_g_CurrentDMAStatus:QWORD
EXTRN	_ScsiPortWritePortUlong@8:NEAR
_TEXT	SEGMENT
_IdeChannel$ = 8
_Hpt366SetIdeTiming@4 PROC NEAR

; 75   : {

  00000	55		 push	 ebp
  00001	8b ec		 mov	 ebp, esp

; 76   :     int     i;
; 77   : 	 PDevice pDev;
; 78   :     //
; 79   :     // Set on each drive, including seting each bit in the timing register
; 80   :     //
; 81   :     for (i = 0; i < MAX_DRIVES; i++) {

  00003	8b 45 08	 mov	 eax, DWORD PTR _IdeChannel$[ebp]
  00006	53		 push	 ebx
  00007	56		 push	 esi
  00008	57		 push	 edi
  00009	8d 70 49	 lea	 esi, DWORD PTR [eax+73]

; 82   : 		  pDev = &IdeChannel->Devices[i];
; 83   :         if (pDev->DevicePresent) {
; 84   :             if(pDev->Flag & PF_ULTRA) {
; 85   : 					pDev->IdeSetting = UDMA_setting[pDev->UltraDmaMode];
; 86   :                pDev->Flag |= PF_DMA;
; 87   :                pDev->Flag |= PF_NEED_SET_MODE;
; 88   : 
; 89   : 			      g_SupportDMA[i] = TRUE;      //wsj add 9/27

  0000c	33 ff		 xor	 edi, edi
  0000e	bb 01 00 00 00	 mov	 ebx, 1
$L1916:
  00013	8a 46 fb	 mov	 al, BYTE PTR [esi-5]
  00016	84 c0		 test	 al, al
  00018	0f 84 8f 00 00
	00		 je	 $L1917
  0001e	8b 46 f3	 mov	 eax, DWORD PTR [esi-13]
  00021	a8 10		 test	 al, 16			; 00000010H
  00023	74 21		 je	 SHORT $L1920
  00025	33 c9		 xor	 ecx, ecx
  00027	0c 09		 or	 al, 9
  00029	8a 0e		 mov	 cl, BYTE PTR [esi]
  0002b	8b 14 8d 00 00
	00 00		 mov	 edx, DWORD PTR _UDMA_setting[ecx*4]
  00032	89 46 f3	 mov	 DWORD PTR [esi-13], eax
  00035	89 56 f7	 mov	 DWORD PTR [esi-9], edx
  00038	89 9f 00 00 00
	00		 mov	 DWORD PTR _g_SupportDMA[edi], ebx

; 90   : 			      g_CurrentDMAStatus[i]=TRUE;  //wsj add 10/06

  0003e	89 9f 00 00 00
	00		 mov	 DWORD PTR _g_CurrentDMAStatus[edi], ebx

; 91   : 
; 92   :             } else if(pDev->Flag & PF_DMA) {

  00044	eb 53		 jmp	 SHORT $L1923
$L1920:
  00046	84 c3		 test	 al, bl
  00048	74 22		 je	 SHORT $L1922

; 93   : 					pDev->IdeSetting = DMA_setting[pDev->DmaHpt366Mode];

  0004a	33 c9		 xor	 ecx, ecx

; 94   :                pDev->Flag |= PF_NEED_SET_MODE;

  0004c	0c 08		 or	 al, 8
  0004e	8a 4e fe	 mov	 cl, BYTE PTR [esi-2]
  00051	8b 14 8d 00 00
	00 00		 mov	 edx, DWORD PTR _DMA_setting[ecx*4]
  00058	89 46 f3	 mov	 DWORD PTR [esi-13], eax
  0005b	89 56 f7	 mov	 DWORD PTR [esi-9], edx

; 95   : 
; 96   : 			      g_SupportDMA[i] = TRUE;      //wsj add 9/27

  0005e	89 9f 00 00 00
	00		 mov	 DWORD PTR _g_SupportDMA[edi], ebx

; 97   : 			      g_CurrentDMAStatus[i]=TRUE;  //wsj add 10/06

  00064	89 9f 00 00 00
	00		 mov	 DWORD PTR _g_CurrentDMAStatus[edi], ebx

; 98   : 
; 99   :             } else {

  0006a	eb 2d		 jmp	 SHORT $L1923
$L1922:

; 100  : 					pDev->IdeSetting = PIO_setting[pDev->PioHpt366Mode];

  0006c	8a 4e ff	 mov	 cl, BYTE PTR [esi-1]
  0006f	8b d1		 mov	 edx, ecx
  00071	81 e2 ff 00 00
	00		 and	 edx, 255		; 000000ffH

; 101  :                if(pDev->PioHpt366Mode >= 2)

  00077	80 f9 02	 cmp	 cl, 2
  0007a	8b 14 95 00 00
	00 00		 mov	 edx, DWORD PTR _PIO_setting[edx*4]
  00081	89 56 f7	 mov	 DWORD PTR [esi-9], edx
  00084	72 05		 jb	 SHORT $L1924

; 102  :                    pDev->Flag |= PF_NEED_SET_MODE;

  00086	0c 08		 or	 al, 8
  00088	89 46 f3	 mov	 DWORD PTR [esi-13], eax
$L1924:

; 103  : 
; 104  : 			      g_SupportDMA[i] = FALSE;      //wsj add 9/27

  0008b	33 c0		 xor	 eax, eax
  0008d	89 87 00 00 00
	00		 mov	 DWORD PTR _g_SupportDMA[edi], eax

; 105  : 			      g_CurrentDMAStatus[i]=FALSE;  //wsj add 10/06

  00093	89 87 00 00 00
	00		 mov	 DWORD PTR _g_CurrentDMAStatus[edi], eax
$L1923:

; 106  : 
; 107  :             }
; 108  : 
; 109  :             ScsiPortWritePortUlong((PULONG)(IdeChannel->BMI+0x60+i*4), 
; 110  :             pDev->IdeSetting);

  00099	8b 4d 08	 mov	 ecx, DWORD PTR _IdeChannel$[ebp]
  0009c	8b 46 f7	 mov	 eax, DWORD PTR [esi-9]
  0009f	50		 push	 eax
  000a0	8b 51 18	 mov	 edx, DWORD PTR [ecx+24]
  000a3	8d 44 3a 60	 lea	 eax, DWORD PTR [edx+edi+96]
  000a7	50		 push	 eax
  000a8	e8 00 00 00 00	 call	 _ScsiPortWritePortUlong@8
$L1917:
  000ad	83 c7 04	 add	 edi, 4
  000b0	81 c6 14 02 00
	00		 add	 esi, 532		; 00000214H
  000b6	83 ff 08	 cmp	 edi, 8
  000b9	0f 8c 54 ff ff
	ff		 jl	 $L1916
  000bf	5f		 pop	 edi
  000c0	5e		 pop	 esi
  000c1	5b		 pop	 ebx

; 111  : 
; 112  :         } // Device presents
; 113  : 	 }
; 114  : } //Hpt366SetIdeTiming()

  000c2	5d		 pop	 ebp
  000c3	c2 04 00	 ret	 4
_Hpt366SetIdeTiming@4 ENDP
_TEXT	ENDS
PUBLIC	_Hpt366SetModeOnDevice@8
EXTRN	_ScsiPortReadPortUchar@4:NEAR
EXTRN	_ScsiPortStallExecution@4:NEAR
EXTRN	_ScsiPortWritePortUchar@8:NEAR
EXTRN	_ScsiDebugPrint:NEAR
_DATA	SEGMENT
	ORG $+3
$SG1939	DB	'Hpt366SetModeOnDevice:', 0aH, 00H
$SG1942	DB	'Set transfer mode on device %d', 0aH, 00H
$SG1970	DB	'Status:%x, Error:%x', 0aH, 00H
	ORG $+3
$SG1974	DB	'Port %x, Device %x, Size %x, ReadCmd %x, WriteCmd %x', 0aH
	DB	00H
_DATA	ENDS
_TEXT	SEGMENT
_IdeChannel$ = 8
_deviceNumber$ = 12
_baseIoAddress2$ = -4
_statusByte$ = -8
_errorByte$ = -4
_numberOfBlock$ = 8
_i$1950 = 8
_Hpt366SetModeOnDevice@8 PROC NEAR

; 134  : {

  000d0	55		 push	 ebp
  000d1	8b ec		 mov	 ebp, esp
  000d3	83 ec 08	 sub	 esp, 8

; 135  :     PIDE_REGISTERS_1 baseIoAddress1 = IdeChannel->BaseIoAddress1;

  000d6	8b 45 08	 mov	 eax, DWORD PTR _IdeChannel$[ebp]
  000d9	53		 push	 ebx

; 136  :     PIDE_REGISTERS_2 baseIoAddress2 = IdeChannel->BaseIoAddress2;
; 137  : 	 PDevice pDev = &IdeChannel->Devices[deviceNumber];

  000da	8b 5d 0c	 mov	 ebx, DWORD PTR _deviceNumber$[ebp]
  000dd	56		 push	 esi
  000de	8b 48 14	 mov	 ecx, DWORD PTR [eax+20]
  000e1	8b d3		 mov	 edx, ebx
  000e3	c1 e2 05	 shl	 edx, 5
  000e6	03 d3		 add	 edx, ebx
  000e8	89 4d fc	 mov	 DWORD PTR _baseIoAddress2$[ebp], ecx
  000eb	57		 push	 edi
  000ec	8b 78 10	 mov	 edi, DWORD PTR [eax+16]
  000ef	8d 0c 93	 lea	 ecx, DWORD PTR [ebx+edx*4]
  000f2	8d 74 88 3c	 lea	 esi, DWORD PTR [eax+ecx*4+60]

; 138  :     USHORT  tmp;
; 139  :     UCHAR   statusByte, errorByte, numberOfBlock;
; 140  : 
; 141  :     AtDump(ATTRITON, (DBGSW
; 142  :         "Hpt366SetModeOnDevice:\n") );

  000f6	a0 00 00 00 00	 mov	 al, BYTE PTR _AtapiDebugLevel
  000fb	a8 01		 test	 al, 1
  000fd	74 0f		 je	 SHORT $L1938
  000ff	68 00 00 00 00	 push	 OFFSET FLAT:$SG1939
  00104	6a 00		 push	 0
  00106	e8 00 00 00 00	 call	 _ScsiDebugPrint
  0010b	83 c4 08	 add	 esp, 8
$L1938:

; 143  : 
; 144  :     //
; 145  :     // Use the "Set Feature" command to set transfer modes:
; 146  :     //  . For DMA, we enable the selected DMA transfer mode
; 147  :     //  . For PIO, we enable IORDY by setting the selected PIO mode
; 148  :     // Some disks may ask non-standard methods, we may need to have a
; 149  :     // particular processing for each of these disk.
; 150  :     //
; 151  :     if (pDev->Flag & PF_NEED_SET_MODE) {

  0010e	f6 06 08	 test	 BYTE PTR [esi], 8
  00111	0f 84 b0 00 00
	00		 je	 $L1940

; 152  :         AtDump(ATTRITON, (DBGSW
; 153  :             "Set transfer mode on device %d\n", deviceNumber));

  00117	f6 05 00 00 00
	00 01		 test	 BYTE PTR _AtapiDebugLevel, 1
  0011e	74 10		 je	 SHORT $L1941
  00120	53		 push	 ebx
  00121	68 00 00 00 00	 push	 OFFSET FLAT:$SG1942
  00126	6a 00		 push	 0
  00128	e8 00 00 00 00	 call	 _ScsiDebugPrint
  0012d	83 c4 0c	 add	 esp, 12			; 0000000cH

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -