📄 drive.cod
字号:
00104 e1dd30b2 ldrh r3, [sp, #2]
00108 e1a0e003 mov lr, r3
0010c e59f1088 ldr r1, [pc, #0x88]
00110 e5d1303e ldrb r3, [r1, #0x3E]
00114 e1a03403 mov r3, r3, lsl #8
00118 e1a02803 mov r2, r3, lsl #16
0011c e1a02822 mov r2, r2, lsr #16
00120 e5d1303d ldrb r3, [r1, #0x3D]
00124 e1833002 orr r3, r3, r2
00128 e1a00003 mov r0, r3
0012c e1a0100e mov r1, lr
00130 eb000000 bl __rt_sdiv
00134 e1a03801 mov r3, r1, lsl #16
00138 e1a03823 mov r3, r3, lsr #16
0013c e1cd30b2 strh r3, [sp, #2]
; 151 : *pS = (UCHAR)(Temp % g_FATParms.phy_sectspertrk) + 1;
00140 e1dd30b2 ldrh r3, [sp, #2]
00144 e1a0e003 mov lr, r3
00148 e59f104c ldr r1, [pc, #0x4C]
0014c e5d1303e ldrb r3, [r1, #0x3E]
00150 e1a03403 mov r3, r3, lsl #8
00154 e1a02803 mov r2, r3, lsl #16
00158 e1a02822 mov r2, r2, lsr #16
0015c e5d1303d ldrb r3, [r1, #0x3D]
00160 e1833002 orr r3, r3, r2
00164 e1a00003 mov r0, r3
00168 e1a0100e mov r1, lr
0016c eb000000 bl __rt_sdiv
00170 e20130ff and r3, r1, #0xFF
00174 e2833001 add r3, r3, #1
00178 e20320ff and r2, r3, #0xFF
0017c e59d301c ldr r3, [sp, #0x1C]
00180 e5c32000 strb r2, [r3]
; 152 : #else // ( NDEF_DWF_NEW_LBA_2_CHS )
; 153 : *pC = (USHORT)(LBA / (g_FATParms.NumHeads * g_FATParms.SectsPerTrack));
; 154 : Temp = (USHORT)(LBA % (g_FATParms.NumHeads * g_FATParms.SectsPerTrack));
; 155 : *pH = (UCHAR)(Temp / g_FATParms.SectsPerTrack);
; 156 : *pS = (UCHAR)(Temp % g_FATParms.SectsPerTrack) + 1;
; 157 : #endif // ( NDEF_DWF_NEW_LBA_2_CHS )
; 158 : return(0);
00184 e3a03000 mov r3, #0
00188 e58d3004 str r3, [sp, #4]
0018c |$L38250|
; 142 : return(-1);
0018c e59d0004 ldr r0, [sp, #4]
; 159 : }
00190 e28dd008 add sp, sp, #8
00194 e89d6000 ldmia sp, {sp, lr}
00198 e12fff1e bx lr
0019c |$L38355|
0019c 00000000 DCD |g_FATParms|
001a0 |$M38351|
ENDP ; |LBA2PCHS|
EXPORT |ReadSectors|
EXPORT |??_C@_0DH@GOICPAPP@ERROR?3?5Unable?5to?5reset?5disk?5cont@| [ DATA ] ; `string'
EXPORT |??_C@_0BM@PFGACKNB@ERROR?3?5Status?50x?$CFx?3?5?$CC?$CFs?$CC?4?$AN?6?$AA@| [ DATA ] ; `string'
IMPORT |BIOS_ReadSectors|
IMPORT |ide_reset|
IMPORT |EdbgOutputDebugString|
IMPORT |memset|
00000 AREA |.text| { |ReadSectors| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$ReadSectors|, PDATA, SELECTION=5, ASSOC=|.text| { |ReadSectors| } ; comdat associative
|$T38364| DCD |$L38363|
DCD 0x40007004
00000 AREA |.rdata| { |??_C@_0BM@PFGACKNB@ERROR?3?5Status?50x?$CFx?3?5?$CC?$CFs?$CC?4?$AN?6?$AA@| }, DATA, READONLY, SELECTION=2 ; comdat any
|??_C@_0BM@PFGACKNB@ERROR?3?5Status?50x?$CFx?3?5?$CC?$CFs?$CC?4?$AN?6?$AA@| DCB "E"
DCB "RROR: Status 0x%x: ""%s"".", 0xd, 0xa, 0x0 ; `string'
00000 AREA |.rdata| { |??_C@_0DH@GOICPAPP@ERROR?3?5Unable?5to?5reset?5disk?5cont@| }, DATA, READONLY, SELECTION=2 ; comdat any
|??_C@_0DH@GOICPAPP@ERROR?3?5Unable?5to?5reset?5disk?5cont@| DCB "ERROR: "
DCB "Unable to reset disk controller (Drive=0x%x).", 0xd, 0xa
DCB 0x0 ; `string'
; Function compile flags: /Ods
00000 AREA |.text| { |ReadSectors| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |ReadSectors| PROC
; 166 : {
00000 |$L38363|
00000 e1a0c00d mov r12, sp
00004 e92d000f stmdb sp!, {r0 - r3}
00008 e92d5000 stmdb sp!, {r12, lr}
0000c e24dd01c sub sp, sp, #0x1C
00010 |$M38361|
; 167 : USHORT uMaxSector = 1;
00010 e3a03001 mov r3, #1
00014 e1cd30b0 strh r3, [sp]
; 168 : USHORT uReadSector;
; 169 : UCHAR Status = 0;
00018 e3a03000 mov r3, #0
0001c e5cd3002 strb r3, [sp, #2]
; 170 :
; 171 : // Check arguments.
; 172 : //
; 173 : if (!pBuffer)
00020 e59d3030 ldr r3, [sp, #0x30]
00024 e3530000 cmp r3, #0
00028 1a000002 bne |$L38276|
; 174 : return(FALSE);
0002c e3a03000 mov r3, #0
00030 e5cd3008 strb r3, [sp, #8]
00034 ea00005a b |$L38272|
00038 |$L38276|
; 175 : // SERPRINT("ReadSectors %d %d.\r\n", LBA, nSectors);
; 176 :
; 177 : // Clear memory before read...
; 178 : memset( pBuffer, 0, (nSectors * g_FATParms.BytesPerSect) );
00038 e1dd32bc ldrh r3, [sp, #0x2C]
0003c e1a00003 mov r0, r3
00040 e59f1170 ldr r1, [pc, #0x170]
00044 e5d13020 ldrb r3, [r1, #0x20]
00048 e1a03403 mov r3, r3, lsl #8
0004c e1a02803 mov r2, r3, lsl #16
00050 e1a02822 mov r2, r2, lsr #16
00054 e5d1301f ldrb r3, [r1, #0x1F]
00058 e1833002 orr r3, r3, r2
0005c e0020390 mul r2, r0, r3
00060 e3a01000 mov r1, #0
00064 e59d0030 ldr r0, [sp, #0x30]
00068 eb000000 bl memset
0006c |$L38278|
; 179 :
; 180 : // Call the BIOS to read a sector.
; 181 : //
; 182 : while(nSectors>0)
0006c e1dd32bc ldrh r3, [sp, #0x2C]
00070 e3530000 cmp r3, #0
00074 da00003b ble |$L38279|
; 183 : {
; 184 : uReadSector = MIN(nSectors,uMaxSector);
00078 e1dd32bc ldrh r3, [sp, #0x2C]
0007c e1a02003 mov r2, r3
00080 e1dd30b0 ldrh r3, [sp]
00084 e1520003 cmp r2, r3
00088 aa000002 bge |$L38358|
0008c e1dd32bc ldrh r3, [sp, #0x2C]
00090 e58d300c str r3, [sp, #0xC]
00094 ea000001 b |$L38359|
00098 |$L38358|
00098 e1dd30b0 ldrh r3, [sp]
0009c e58d300c str r3, [sp, #0xC]
000a0 |$L38359|
000a0 e59d300c ldr r3, [sp, #0xC]
000a4 e1a03803 mov r3, r3, lsl #16
000a8 e1a03823 mov r3, r3, lsr #16
000ac e1cd30b4 strh r3, [sp, #4]
; 185 : if ((Status = BIOS_ReadSectors(Drive, LBA, (BYTE)uReadSector, pBuffer)) != 0)
000b0 e59d3030 ldr r3, [sp, #0x30]
000b4 e1dd20b4 ldrh r2, [sp, #4]
000b8 e20220ff and r2, r2, #0xFF
000bc e59d1028 ldr r1, [sp, #0x28]
000c0 e5dd0024 ldrb r0, [sp, #0x24]
000c4 eb000000 bl BIOS_ReadSectors
000c8 e5cd0010 strb r0, [sp, #0x10]
000cc e5dd3010 ldrb r3, [sp, #0x10]
000d0 e5cd3002 strb r3, [sp, #2]
000d4 e5dd3002 ldrb r3, [sp, #2]
000d8 e3530000 cmp r3, #0
000dc 0a000008 beq |$L38281|
; 186 : {
; 187 : // If the read failed, retry the operation and reset the controller each time...
; 188 : //if (BIOS_ResetDisk(Drive))
; 189 : if ( ide_reset() )
000e0 eb000000 bl ide_reset
000e4 e58d0014 str r0, [sp, #0x14]
000e8 e59d3014 ldr r3, [sp, #0x14]
000ec e3530000 cmp r3, #0
000f0 0a000003 beq |$L38282|
; 190 : {
; 191 : SERPRINT("ERROR: Unable to reset disk controller (Drive=0x%x).\r\n", Drive);
000f4 e5dd1024 ldrb r1, [sp, #0x24]
000f8 e59f00bc ldr r0, [pc, #0xBC]
000fc eb000000 bl EdbgOutputDebugString
; 192 : break;
00100 ea000018 b |$L38279|
00104 |$L38282|
00104 |$L38281|
; 193 : }
; 194 : }
; 195 : nSectors -= uReadSector;
00104 e1dd30b4 ldrh r3, [sp, #4]
00108 e1a02003 mov r2, r3
0010c e1dd32bc ldrh r3, [sp, #0x2C]
00110 e0433002 sub r3, r3, r2
00114 e1a03803 mov r3, r3, lsl #16
00118 e1a03823 mov r3, r3, lsr #16
0011c e1cd32bc strh r3, [sp, #0x2C]
; 196 : LBA += uReadSector;
00120 e1dd20b4 ldrh r2, [sp, #4]
00124 e59d3028 ldr r3, [sp, #0x28]
00128 e0833002 add r3, r3, r2
0012c e58d3028 str r3, [sp, #0x28]
; 197 : pBuffer += uReadSector * g_FATParms.BytesPerSect;
00130 e1dd30b4 ldrh r3, [sp, #4]
00134 e1a00003 mov r0, r3
00138 e59f1078 ldr r1, [pc, #0x78]
0013c e5d13020 ldrb r3, [r1, #0x20]
00140 e1a03403 mov r3, r3, lsl #8
00144 e1a02803 mov r2, r3, lsl #16
00148 e1a02822 mov r2, r2, lsr #16
0014c e5d1301f ldrb r3, [r1, #0x1F]
00150 e1833002 orr r3, r3, r2
00154 e0020390 mul r2, r0, r3
00158 e59d3030 ldr r3, [sp, #0x30]
0015c e0833002 add r3, r3, r2
00160 e58d3030 str r3, [sp, #0x30]
; 198 : }
00164 eaffffc0 b |$L38278|
00168 |$L38279|
; 199 :
; 200 : if (Status)
00168 e5dd3002 ldrb r3, [sp, #2]
0016c e3530000 cmp r3, #0
00170 0a000009 beq |$L38284|
; 201 : {
; 202 : // SERPRINT("ERROR: Unable to read %d sector(s) at CHS = 0x%x:0x%x:0x%x (Status=0x%x).\r\n", nSectors, c, h, s, Status);
; 203 : SERPRINT("ERROR: Status 0x%x: \"%s\".\r\n", Status, GetErrorText(Status));
00174 e5dd0002 ldrb r0, [sp, #2]
00178 eb000000 bl GetErrorText
0017c e58d0018 str r0, [sp, #0x18]
00180 e59d2018 ldr r2, [sp, #0x18]
00184 e5dd1002 ldrb r1, [sp, #2]
00188 e59f0024 ldr r0, [pc, #0x24]
0018c eb000000 bl EdbgOutputDebugString
; 204 : return(FALSE);
00190 e3a03000 mov r3, #0
00194 e5cd3008 strb r3, [sp, #8]
00198 ea000001 b |$L38272|
0019c |$L38284|
; 205 : }
; 206 :
; 207 : return(TRUE);
0019c e3a03001 mov r3, #1
001a0 e5cd3008 strb r3, [sp, #8]
001a4 |$L38272|
; 174 : return(FALSE);
001a4 e5dd0008 ldrb r0, [sp, #8]
; 208 : }
001a8 e28dd01c add sp, sp, #0x1C
001ac e89d6000 ldmia sp, {sp, lr}
001b0 e12fff1e bx lr
001b4 |$L38366|
001b4 00000000 DCD |??_C@_0BM@PFGACKNB@ERROR?3?5Status?50x?$CFx?3?5?$CC?$CFs?$CC?4?$AN?6?$AA@|
001b8 00000000 DCD |g_FATParms|
001bc 00000000 DCD |??_C@_0DH@GOICPAPP@ERROR?3?5Unable?5to?5reset?5disk?5cont@|
001c0 |$M38362|
ENDP ; |ReadSectors|
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -