📄 ide.cod
字号:
; 160 : }
; 161 :
; 162 : // Save away P-CHS conversion information for the drive.
; 163 : g_drvparms.phy_cyls = hdr.lcyls;
00114 e59f4084 ldr r4, [pc, #0x84]
00118 e1dd00b6 ldrh r0, [sp, #6]
; 164 : g_drvparms.phy_heads = hdr.lheads;
0011c e1dd10ba ldrh r1, [sp, #0xA]
00120 e1c400b0 strh r0, [r4]
; 165 : g_drvparms.phy_sectspertrk = hdr.lsctptrk;
00124 e1dd01b0 ldrh r0, [sp, #0x10]
00128 e1c410b2 strh r1, [r4, #2]
0012c e1c400b4 strh r0, [r4, #4]
; 166 :
; 167 : DEBUGMSG(ZONE_BOOTPROG, (TEXT("B11\r\n")));
00130 e59f0064 ldr r0, [pc, #0x64]
00134 eb000000 bl EdbgOutputDebugString
; 168 :
; 169 : // In theory, only LBA drives should set the total number of
; 170 : // user-addressable sectors in the IDE ID packet. If we find a non-zero
; 171 : // value, assume we have a drive that wants to talk LBA else use CHS.
; 172 : //
; 173 : //if (hdr.ttladdrscts)
; 174 : if (1) // Assume LBA mode...
; 175 : {
; 176 : g_bLBAMode = TRUE;
00138 e59f3058 ldr r3, [pc, #0x58]
0013c e3a00001 mov r0, #1
; 177 : DEBUGMSG(ZONE_INFO, (TEXT("LBA Mode (C:H:S = %d:%d:%d addressable sectors = %d).\r\n"), g_drvparms.phy_cyls, g_drvparms.phy_heads, g_drvparms.phy_sectspertrk, hdr.ttladdrscts));
00140 e1d410b4 ldrh r1, [r4, #4]
00144 e5830000 str r0, [r3]
00148 e59d0080 ldr r0, [sp, #0x80]
0014c e58d0000 str r0, [sp]
00150 e1a00801 mov r0, r1, lsl #16
00154 e1d410b2 ldrh r1, [r4, #2]
00158 e1a03820 mov r3, r0, lsr #16
0015c e1a00801 mov r0, r1, lsl #16
00160 e1d410b0 ldrh r1, [r4]
00164 e1a02820 mov r2, r0, lsr #16
00168 e1a00801 mov r0, r1, lsl #16
0016c e1a01820 mov r1, r0, lsr #16
00170 e59f001c ldr r0, [pc, #0x1C]
00174 eb000000 bl EdbgOutputDebugString
; 178 : }
; 179 : else
; 180 : {
; 181 : g_bLBAMode = FALSE;
; 182 : DEBUGMSG(ZONE_INFO, (TEXT("CHS Mode (C:H:S = %d:%d:%d).\r\n"), g_drvparms.phy_cyls, g_drvparms.phy_heads, g_drvparms.phy_sectspertrk));
; 183 : }
; 184 :
; 185 : RETAILMSG(1, (TEXT("Loading image from hard drive...\r\n")));
00178 e59f0010 ldr r0, [pc, #0x10]
0017c eb000000 bl EdbgOutputDebugString
00180 |$L37041|
; 119 : return(-1);
00180 e1a00005 mov r0, r5
; 186 :
; 187 : return(0);
; 188 : }
00184 e28dd084 add sp, sp, #0x84
00188 e8bd4070 ldmia sp!, {r4 - r6, lr}
0018c e12fff1e bx lr
00190 |$L37396|
00190 00000000 DCD |??_C@_0CD@HPCF@Loading?5image?5from?5hard?5drive?4?4?4@|
00194 00000000 DCD |??_C@_0DJ@BJBM@LBA?5Mode?5?$CIC?3H?3S?5?$DN?5?$CFd?3?$CFd?3?$CFd?5?5addr@|
00198 00000000 DCD |g_bLBAMode|
0019c 00000000 DCD |??_C@_05FKEE@B11?$AN?6?$AA@|
001a0 00000000 DCD |g_drvparms|
001a4 00000000 DCD |??_C@_05IFC@B10?$AN?6?$AA@|
001a8 00000000 DCD |??_C@_0BK@FHIB@ERROR?3?5Drive?5ID?5failed?4?$AN?6?$AA@|
001ac 00000000 DCD |??_C@_04EHPP@B9?$AN?6?$AA@|
001b0 00000000 DCD |??_C@_04BFOJ@B8?$AN?6?$AA@|
001b4 00000000 DCD |??_C@_04DLDN@B7?$AN?6?$AA@|
001b8 00000000 DCD |??_C@_04GJCL@B6?$AN?6?$AA@|
001bc |$M37393|
ENDP ; |id_drive|
EXPORT |lba_to_pchs|
IMPORT |__rt_udiv|
IMPORT |__rt_sdiv|
00000 AREA |.text| { |lba_to_pchs| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$lba_to_pchs|, PDATA, SELECTION=5, ASSOC=|.text| { |lba_to_pchs| } ; comdat associative
|$T37409| DCD |lba_to_pchs|
DCD 0x40003f01
; Function compile flags: /Ogsy
00000 AREA |.text| { |lba_to_pchs| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |lba_to_pchs| PROC
; 195 : {
00000 e92d43f0 stmdb sp!, {r4 - r9, lr}
00004 |$M37407|
00004 e1a06000 mov r6, r0
00008 e1a04001 mov r4, r1
0000c e1a08002 mov r8, r2
00010 e1a09003 mov r9, r3
; 196 : USHORT temp = 0;
; 197 :
; 198 : // Make sure we know the drive geometry
; 199 : if (g_drvparms.phy_cyls == 0 ||
; 200 : g_drvparms.phy_heads == 0 ||
; 201 : g_drvparms.phy_sectspertrk == 0)
00014 e59f70dc ldr r7, [pc, #0xDC]
00018 e1d700b0 ldrh r0, [r7]
0001c e1a01800 mov r1, r0, lsl #16
00020 e1b02821 movs r2, r1, lsr #16
00024 0a000030 beq |$L37109|
00028 e1d700b2 ldrh r0, [r7, #2]
0002c e1a01800 mov r1, r0, lsl #16
00030 e1b03821 movs r3, r1, lsr #16
00034 0a00002c beq |$L37109|
00038 e1d700b4 ldrh r0, [r7, #4]
0003c e1a01800 mov r1, r0, lsl #16
00040 e1b02821 movs r2, r1, lsr #16
00044 0a000028 beq |$L37109|
; 203 :
; 204 : if (pc == NULL || ph == NULL || ps == NULL)
00048 e3540000 cmp r4, #0
0004c 0a000026 beq |$L37109|
00050 e3580000 cmp r8, #0
00054 0a000024 beq |$L37109|
00058 e3590000 cmp r9, #0
0005c 0a000022 beq |$L37109|
; 205 : return(-1);
; 206 :
; 207 : // Do the math...
; 208 : *pc = (USHORT)(lba / (g_drvparms.phy_heads * g_drvparms.phy_sectspertrk));
00060 e0000392 mul r0, r2, r3
00064 e1a01006 mov r1, r6
00068 eb000000 bl __rt_udiv
0006c e1a03800 mov r3, r0, lsl #16
00070 e1a00823 mov r0, r3, lsr #16
00074 e1c400b0 strh r0, [r4]
; 209 : temp = (USHORT)(lba % (g_drvparms.phy_heads * g_drvparms.phy_sectspertrk));
00078 e1d710b4 ldrh r1, [r7, #4]
0007c e1a00801 mov r0, r1, lsl #16
00080 e1d710b2 ldrh r1, [r7, #2]
00084 e1a05820 mov r5, r0, lsr #16
00088 e1a00801 mov r0, r1, lsl #16
0008c e1a02820 mov r2, r0, lsr #16
00090 e0000592 mul r0, r2, r5
00094 e1a01006 mov r1, r6
00098 eb000000 bl __rt_udiv
0009c e1a00801 mov r0, r1, lsl #16
000a0 e1a02820 mov r2, r0, lsr #16
; 210 : *ph = (UCHAR)(temp / g_drvparms.phy_sectspertrk);
000a4 e1a01802 mov r1, r2, lsl #16
000a8 e1a04821 mov r4, r1, lsr #16
000ac e1a00005 mov r0, r5
000b0 e1a01004 mov r1, r4
000b4 eb000000 bl __rt_sdiv
000b8 e20030ff and r3, r0, #0xFF
000bc e5c80000 strb r0, [r8]
; 211 : *ps = (UCHAR)(temp % g_drvparms.phy_sectspertrk) + 1;
000c0 e1d700b4 ldrh r0, [r7, #4]
000c4 e1a01800 mov r1, r0, lsl #16
000c8 e1a00821 mov r0, r1, lsr #16
000cc e1a01004 mov r1, r4
000d0 eb000000 bl __rt_sdiv
000d4 e2810001 add r0, r1, #1
000d8 e20020ff and r2, r0, #0xFF
000dc e5c90000 strb r0, [r9]
; 212 :
; 213 : return(0);
000e0 e3a00000 mov r0, #0
; 214 : }
000e4 e8bd43f0 ldmia sp!, {r4 - r9, lr}
000e8 e12fff1e bx lr
000ec |$L37109|
; 202 : return(-1);
000ec e3e00000 mvn r0, #0
; 214 : }
000f0 e8bd43f0 ldmia sp!, {r4 - r9, lr}
000f4 e12fff1e bx lr
000f8 |$L37411|
000f8 00000000 DCD |g_drvparms|
000fc |$M37408|
ENDP ; |lba_to_pchs|
EXPORT |read_sector|
EXPORT |??_C@_0CL@PJOM@INFO?3?5Reading?5sector?5?$CIP?9CHS?5?$DN?5?$CFd@| [ DATA ] ; `string'
EXPORT |??_C@_0CF@FANO@INFO?3?5Reading?5sector?5?$CILBA?5?$DN?50x?$CFx@| [ DATA ] ; `string'
EXPORT |??_C@_0BN@HJM@ERROR?3?5Sector?5read?5failed?4?$AN?6?$AA@| [ DATA ] ; `string'
00000 AREA |.text| { |read_sector| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$read_sector|, PDATA, SELECTION=5, ASSOC=|.text| { |read_sector| } ; comdat associative
|$T37444| DCD |read_sector|
DCD 0x40007d02
00000 AREA |.rdata| { |??_C@_0CL@PJOM@INFO?3?5Reading?5sector?5?$CIP?9CHS?5?$DN?5?$CFd@| }, DATA, READONLY, SELECTION=2 ; comdat any
|??_C@_0CL@PJOM@INFO?3?5Reading?5sector?5?$CIP?9CHS?5?$DN?5?$CFd@| DCB "I"
DCB "NFO: Reading sector (P-CHS = %d:%d:%d).", 0xd, 0xa, 0x0 ; `string'
00000 AREA |.rdata| { |??_C@_0CF@FANO@INFO?3?5Reading?5sector?5?$CILBA?5?$DN?50x?$CFx@| }, DATA, READONLY, SELECTION=2 ; comdat any
|??_C@_0CF@FANO@INFO?3?5Reading?5sector?5?$CILBA?5?$DN?50x?$CFx@| DCB "IN"
DCB "FO: Reading sector (LBA = 0x%x).", 0xd, 0xa, 0x0 ; `string'
00000 AREA |.rdata| { |??_C@_0BN@HJM@ERROR?3?5Sector?5read?5failed?4?$AN?6?$AA@| }, DATA, READONLY, SELECTION=2 ; comdat any
|??_C@_0BN@HJM@ERROR?3?5Sector?5read?5failed?4?$AN?6?$AA@| DCB "ERROR: Se"
DCB "ctor read failed.", 0xd, 0xa, 0x0 ; `string'
; Function compile flags: /Ogsy
00000 AREA |.text| { |read_sector| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |read_sector| PROC
; 218 : {
00000 e92d41f0 stmdb sp!, {r4 - r8, lr}
00004 e24dd004 sub sp, sp, #4
00008 |$M37442|
00008 e1a05000 mov r5, r0
0000c e1a06001 mov r6, r1
; 219 : USHORT c = 0;
00010 e3a07000 mov r7, #0
00014 e1cd70b2 strh r7, [sp, #2]
; 220 : UCHAR h = 0;
; 221 : UCHAR s = 0;
; 222 : USHORT i = 0;
; 223 : UCHAR *a = NULL;
; 224 :
; 225 : if (!pbuf)
00018 e3560000 cmp r6, #0
0001c e5cd7000 strb r7, [sp]
00020 e5cd7001 strb r7, [sp, #1]
; 226 : return(-1);
00024 0a000050 beq |$L37441|
; 227 :
; 228 : // Convert LBA address to P-CHS for IDE controller
; 229 : if (!g_bLBAMode)
00028 e59f41c0 ldr r4, [pc, #0x1C0]
0002c e5940000 ldr r0, [r4]
00030 e3500000 cmp r0, #0
00034 1a00000e bne |$L37132|
; 230 : {
; 231 : if (lba_to_pchs(lba, &c, &h, &s))
00038 e28d3001 add r3, sp, #1
0003c e28d2000 add r2, sp, #0
00040 e28d1002 add r1, sp, #2
00044 e1a00005 mov r0, r5
00048 eb000000 bl lba_to_pchs
0004c e3500000 cmp r0, #0
; 232 : return(-1);
00050 1a000045 bne |$L37441|
; 233 :
; 234 : DEBUGMSG(ZONE_INFO, (TEXT("INFO: Reading sector (P-CHS = %d:%d:%d).\r\n"), c, h, s));
00054 e1dd00b2 ldrh r0, [sp, #2]
00058 e5dd3001 ldrb r3, [sp, #1]
0005c e1a01800 mov r1, r0, lsl #16
00060 e5dd2000 ldrb r2, [sp]
00064 e59f0180 ldr r0, [pc, #0x180]
00068 e1a01821 mov r1, r1, lsr #16
0006c eb000000 bl EdbgOutputDebugString
; 235 : }
; 236 : else
00070 ea000002 b |$L37431|
00074 |$L37132|
; 237 : DEBUGMSG(ZONE_INFO, (TEXT("INFO: Reading sector (LBA = 0x%x).\r\n"), lba));
00074 e59f016c ldr r0, [pc, #0x16C]
00078 e1a01005 mov r1, r5
0007c eb000000 bl EdbgOutputDebugString
00080 |$L37431|
00080 e3a0811d mov r8, #0x1D, 2
00084 |$L37139|
; 238 :
; 239 :
; 240 : // Program the IDE controller
; 241 : WAIT_IDE_BUSY;
00084 e5d80000 ldrb r0, [r8]
00088 e3100080 tst r0, #0x80
0008c 1afffffc bne |$L37139|
; 242 : WRITE_IDE_UCHAR(IDE_SECTCNT_REG, 1);
00090 e3a00001 mov r0, #1
00094 e3a01109 mov r1, #9, 2
00098 e5c10000 strb r0, [r1]
; 243 :
; 244 : if (!g_bLBAMode)
; 245 : {
; 246 : // CHS access...
; 247 : //
; 248 : WRITE_IDE_UCHAR(IDE_CYLL_REG, (UCHAR)(c & 0x00ff));
0009c e3a02111 mov r2, #0x11, 2
000a0 e5940000 ldr r0, [r4]
000a4 e3500000 cmp r0, #0
000a8 1a000011 bne |$L37142|
000ac e1dd00b2 ldrh r0, [sp, #2]
; 249 : WRITE_IDE_UCHAR(IDE_CYLH_REG, (UCHAR)((c & 0xff00) >> 8));
; 250 : // TODO - future drive num compensate.
; 251 : WRITE_IDE_UCHAR(IDE_DRVHD_REG, (UCHAR)(h | IDE_HEAD_DRIVE_1));
; 252 : WRITE_IDE_UCHAR(IDE_SECTNUM_REG, (UCHAR)s);
000b0 e3a0310d mov r3, #0xD, 2
000b4 e20010ff and r1, r0, #0xFF
000b8 e5c21000 strb r1, [r2]
000bc e1dd00b2 ldrh r0, [sp, #2]
000c0 e1a01800 mov r1, r0, lsl #16
000c4 e1a02821 mov r2, r1, lsr #16
000c8 e1a00422 mov r0, r2, lsr #8
000cc e20010ff and r1, r0, #0xFF
000d0 e3a02115 mov r2, #0x15, 2
000d4 e5c21000 strb r1, [r2]
000d8 e3a02119 mov r2, #0x19, 2
000dc e5dd0000 ldrb r0, [sp]
000e0 e38010a0 orr r1, r0, #0xA0
000e4 e5c21000 strb r1, [r2]
000e8 e5dd0001 ldrb r0, [sp, #1]
000ec e5c30000 strb r0, [r3]
; 253 : }
; 254 : else
000f0 ea00000d b |$L37151|
000f4 |$L37142|
; 255 : {
; 256 : // LBA access...
; 257 : //
; 258 : WRITE_IDE_UCHAR(IDE_SECTNUM_REG, (UCHAR)(lba & 0xff));
000f4 e20500ff and r0, r5, #0xFF
000f8 e3a0110d mov r1, #0xD, 2
000fc e5c10000 strb r0, [r1]
; 259 : WRITE_IDE_UCHAR(IDE_CYLL_REG, (UCHAR)((lba >> 8) & 0xff));
00100 e1a00425 mov r0, r5, lsr #8
00104 e20010ff and r1, r0, #0xFF
; 260 : WRITE_IDE_UCHAR(IDE_CYLH_REG, (UCHAR)((lba >> 16) & 0xff));
00108 e1a00825 mov r0, r5, lsr #16
0010c e5c21000 strb r1, [r2]
00110 e20010ff and r1, r0, #0xFF
00114 e3a02115 mov r2, #0x15, 2
; 261 : // TODO - future drive num compensate.
; 262 : WRITE_IDE_UCHAR(IDE_DRVHD_REG, (UCHAR)(((lba >> 24) & 0xff) | IDE_HEAD_DRIVE_1 | IDE_HEAD_LBA_MODE));
00118 e1a00c25 mov r0, r5, lsr #24
0011c e5c21000 strb r1, [r2]
00120 e38010e0 orr r1, r0, #0xE0
00124 e3a02119 mov r2, #0x19, 2
00128 e5c21000 strb r1, [r2]
0012c |$L37151|
; 263 : }
; 264 :
; 265 : //
; 266 : // Make sure interrupt enable bit is off (we'll poll)
; 267 : //
; 268 : //_outp(0x3f6, 0x0a);
; 269 : WRITE_IDE_UCHAR(IDE_ALT_CTRL_REG, 0xA0);
0012c e3a01139 mov r1, #0x39, 2
00130 e3a000a0 mov r0, #0xA0
00134 e5c10000 strb r0, [r1]
00138 |$L37163|
; 270 :
; 271 : WAIT_IDE_NOT_DRDY;
00138 e5d80000 ldrb r0, [r8]
0013c e3100040 tst r0, #0x40
00140 0afffffc beq |$L37163|
; 272 :
; 273 : WRITE_IDE_UCHAR(IDE_CMD_REG, IDE_RDSECT_CMD);
00144 e3a00021 mov r0, #0x21
00148 e5c80000 strb r0, [r8]
0014c |$L37168|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -