📄 hpt370.cod
字号:
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 + -