📄 mmc.lst
字号:
\ 00000000 .... LDR R0,??DataTable8 ;; Stat
\ 00000002 0078 LDRB R0,[R0, #+0]
\ 00000004 7047 BX LR ;; return
383 }
384
385
386
387 /*----------------*/
388 /* Read Sector(s) */
389
\ In segment CODE, align 4, keep-with-next
390 extern DRESULT disk_read (
391 BYTE *buff, /* Data buffer to store read data */
392 DWORD sector, /* Sector number (LBA) */
393 BYTE count /* Sector count (1..255) */
394 )
395 {
\ disk_read:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 041C MOV R4,R0
\ 00000004 151C MOV R5,R2
396 if (Stat & STA_NOINIT) return RES_NOTRDY;
\ 00000006 .... LDR R0,??DataTable8 ;; Stat
\ 00000008 0078 LDRB R0,[R0, #+0]
\ 0000000A C007 LSL R0,R0,#+31
\ 0000000C 01D5 BPL ??disk_read_0
\ 0000000E 0320 MOV R0,#+3
\ 00000010 34E0 B ??disk_read_1
397 if (!count) return RES_PARERR;
\ ??disk_read_0:
\ 00000012 002D CMP R5,#+0
\ 00000014 01D1 BNE ??disk_read_2
\ 00000016 0420 MOV R0,#+4
\ 00000018 30E0 B ??disk_read_1
398
399 sector *= 512; /* LBA --> byte address */
\ ??disk_read_2:
\ 0000001A 4902 LSL R1,R1,#+9
400
401 SELECT(); /* CS = L */
\ 0000001C 8026 MOV R6,#+128
\ 0000001E B601 LSL R6,R6,#+6 ;; #+8192
\ 00000020 .... LDR R0,??DataTable15 ;; 0xfffff434
\ 00000022 0660 STR R6,[R0, #+0]
402
403 if (count == 1) { /* Single block read */
\ 00000024 012D CMP R5,#+1
\ 00000026 0CD1 BNE ??disk_read_3
404 if ((send_cmd(CMD17, sector) == 0) /* READ_SINGLE_BLOCK */
405 && rcvr_datablock(buff, (BYTE)(512/2)))
\ 00000028 5120 MOV R0,#+81
\ 0000002A ........ BL send_cmd
\ 0000002E 0028 CMP R0,#+0
\ 00000030 1CD1 BNE ??disk_read_4
\ 00000032 0021 MOV R1,#+0
\ 00000034 201C MOV R0,R4
\ 00000036 ........ BL rcvr_datablock
\ 0000003A 0028 CMP R0,#+0
\ 0000003C 16D0 BEQ ??disk_read_4
406 count = 0;
\ 0000003E 0025 MOV R5,#+0
\ 00000040 14E0 B ??disk_read_4
407 }
408 else { /* Multiple block read */
409 if (send_cmd(CMD18, sector) == 0) { /* READ_MULTIPLE_BLOCK */
\ ??disk_read_3:
\ 00000042 5220 MOV R0,#+82
\ 00000044 ........ BL send_cmd
\ 00000048 0028 CMP R0,#+0
\ 0000004A 0FD1 BNE ??disk_read_4
410 do {
411 if (!rcvr_datablock(buff, (BYTE)(512/2))) break;
\ ??disk_read_5:
\ 0000004C 0021 MOV R1,#+0
\ 0000004E 201C MOV R0,R4
\ 00000050 ........ BL rcvr_datablock
\ 00000054 0028 CMP R0,#+0
\ 00000056 05D0 BEQ ??disk_read_6
412 buff += 512;
\ 00000058 3009 LSR R0,R6,#+4
\ 0000005A 2418 ADD R4,R4,R0
413 } while (--count);
\ 0000005C 6D1E SUB R5,R5,#+1
\ 0000005E 2D06 LSL R5,R5,#+24
\ 00000060 2D0E LSR R5,R5,#+24
\ 00000062 F3D1 BNE ??disk_read_5
414 send_cmd(CMD12, 0); /* STOP_TRANSMISSION */
\ ??disk_read_6:
\ 00000064 0021 MOV R1,#+0
\ 00000066 4C20 MOV R0,#+76
\ 00000068 ........ BL send_cmd
415 }
416 }
417
418 DESELECT(); /* CS = H */
\ ??disk_read_4:
\ 0000006C .... LDR R0,??DataTable16 ;; 0xfffff430
\ 0000006E 0660 STR R6,[R0, #+0]
419 rcvr_spi(); /* Idle (Release DO) */
\ 00000070 FF20 MOV R0,#+255
\ 00000072 ........ BL AT91_spi
420
421 return count ? RES_ERROR : RES_OK;
\ 00000076 281C MOV R0,R5
\ 00000078 00D0 BEQ ??disk_read_1
\ 0000007A 0120 MOV R0,#+1
\ ??disk_read_1:
\ 0000007C .... B ?Subroutine17
422 }
423
424
425
426 /*-----------------*/
427 /* Write Sector(s) */
428
429 #ifndef _READONLY
\ In segment CODE, align 4, keep-with-next
430 extern DRESULT disk_write (
431 const BYTE *buff, /* Data to be written */
432 DWORD sector, /* Sector number (LBA) */
433 BYTE count /* Sector count (1..255) */
434 )
435 {
\ disk_write:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 041C MOV R4,R0
\ 00000004 151C MOV R5,R2
436 if (Stat & STA_NOINIT) return RES_NOTRDY;
\ 00000006 .... LDR R0,??DataTable17 ;; Stat
\ 00000008 0278 LDRB R2,[R0, #+0]
\ 0000000A D207 LSL R2,R2,#+31
\ 0000000C 01D5 BPL ??disk_write_0
\ 0000000E 0320 MOV R0,#+3
\ 00000010 3CE0 B ??disk_write_1
437 if (Stat & STA_PROTECT) return RES_WRPRT;
\ ??disk_write_0:
\ 00000012 0078 LDRB R0,[R0, #+0]
\ 00000014 4007 LSL R0,R0,#+29
\ 00000016 01D5 BPL ??disk_write_2
\ 00000018 0220 MOV R0,#+2
\ 0000001A 37E0 B ??disk_write_1
438 if (!count) return RES_PARERR;
\ ??disk_write_2:
\ 0000001C 002D CMP R5,#+0
\ 0000001E 01D1 BNE ??disk_write_3
\ 00000020 0420 MOV R0,#+4
\ 00000022 33E0 B ??disk_write_1
439 sector *= 512; /* LBA --> byte address */
\ ??disk_write_3:
\ 00000024 4902 LSL R1,R1,#+9
440
441 SELECT(); /* CS = L */
\ 00000026 8026 MOV R6,#+128
\ 00000028 B601 LSL R6,R6,#+6 ;; #+8192
\ 0000002A .... LDR R0,??DataTable15 ;; 0xfffff434
\ 0000002C 0660 STR R6,[R0, #+0]
442
443 if (count == 1) { /* Single block write */
\ 0000002E 012D CMP R5,#+1
\ 00000030 0CD1 BNE ??disk_write_4
444 if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */
445 && xmit_datablock(buff, 0xFE))
\ 00000032 5820 MOV R0,#+88
\ 00000034 ........ BL send_cmd
\ 00000038 0028 CMP R0,#+0
\ 0000003A 1FD1 BNE ??disk_write_5
\ 0000003C FE21 MOV R1,#+254
\ 0000003E 201C MOV R0,R4
\ 00000040 ........ BL xmit_datablock
\ 00000044 0028 CMP R0,#+0
\ 00000046 19D0 BEQ ??disk_write_5
446 count = 0;
\ 00000048 0025 MOV R5,#+0
\ 0000004A 17E0 B ??disk_write_5
447 }
448 else { /* Multiple block write */
449 if (send_cmd(CMD25, sector) == 0) { /* WRITE_MULTIPLE_BLOCK */
\ ??disk_write_4:
\ 0000004C 5920 MOV R0,#+89
\ 0000004E ........ BL send_cmd
\ 00000052 0028 CMP R0,#+0
\ 00000054 12D1 BNE ??disk_write_5
450 do {
451 if (!xmit_datablock(buff, 0xFC)) break;
\ ??disk_write_6:
\ 00000056 FC21 MOV R1,#+252
\ 00000058 201C MOV R0,R4
\ 0000005A ........ BL xmit_datablock
\ 0000005E 0028 CMP R0,#+0
\ 00000060 05D0 BEQ ??disk_write_7
452 buff += 512;
\ 00000062 3009 LSR R0,R6,#+4
\ 00000064 2418 ADD R4,R4,R0
453 } while (--count);
\ 00000066 6D1E SUB R5,R5,#+1
\ 00000068 2D06 LSL R5,R5,#+24
\ 0000006A 2D0E LSR R5,R5,#+24
\ 0000006C F3D1 BNE ??disk_write_6
454 if (!xmit_datablock(0, 0xFD)) /* STOP_TRAN token */
\ ??disk_write_7:
\ 0000006E FD21 MOV R1,#+253
\ 00000070 0020 MOV R0,#+0
\ 00000072 ........ BL xmit_datablock
\ 00000076 0028 CMP R0,#+0
\ 00000078 00D1 BNE ??disk_write_5
455 count = 1;
\ 0000007A 0125 MOV R5,#+1
456 }
457 }
458
459 DESELECT(); /* CS = H */
\ ??disk_write_5:
\ 0000007C .... LDR R0,??DataTable16 ;; 0xfffff430
\ 0000007E 0660 STR R6,[R0, #+0]
460 rcvr_spi(); /* Idle (Release DO) */
\ 00000080 FF20 MOV R0,#+255
\ 00000082 ........ BL AT91_spi
461
462 return count ? RES_ERROR : RES_OK;
\ 00000086 281C MOV R0,R5
\ 00000088 00D0 BEQ ??disk_write_1
\ 0000008A 0120 MOV R0,#+1
\ ??disk_write_1:
\ 0000008C .... B ?Subroutine17
463 }
464 #endif
465
466
467
468 /*--------------------------*/
469 /* Miscellaneous Functions */
470
\ In segment CODE, align 4, keep-with-next
471 DRESULT disk_ioctl (
472 BYTE ctrl, /* Control code */
473 void *buff /* Buffer to send/receive data block */
474 )
475 {
\ disk_ioctl:
\ 00000000 7FB5 PUSH {R0-R6,LR}
476 DRESULT res;
477 BYTE n, csd[16], *ptr = buff;
\ 00000002 0C1C MOV R4,R1
478 WORD csm, csize;
479
480
481 if (Stat & STA_NOINIT) return RES_NOTRDY;
\ 00000004 .... LDR R1,??DataTable17 ;; Stat
\ 00000006 0978 LDRB R1,[R1, #+0]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -