📄 mmc.lst
字号:
\ 00000004 151C MOV R5,R2
372 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
373 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
374
375 sector *= 512; /* LBA --> byte address */
\ ??disk_read_2:
\ 0000001A 4902 LSL R1,R1,#+9
376
377 SELECT(); /* CS = L */
\ 0000001C 8026 MOV R6,#+128
\ 0000001E B601 LSL R6,R6,#+6 ;; #+8192
\ 00000020 .... LDR R0,??DataTable12 ;; 0xfffff434
\ 00000022 0660 STR R6,[R0, #+0]
378
379 if (count == 1) { /* Single block read */
\ 00000024 012D CMP R5,#+1
\ 00000026 0CD1 BNE ??disk_read_3
380 if ((send_cmd(CMD17, sector) == 0) /* READ_SINGLE_BLOCK */
381 && 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
382 count = 0;
\ 0000003E 0025 MOV R5,#+0
\ 00000040 14E0 B ??disk_read_4
383 }
384 else { /* Multiple block read */
385 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
386 do {
387 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
388 buff += 512;
\ 00000058 3009 LSR R0,R6,#+4
\ 0000005A 2418 ADD R4,R4,R0
389 } 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
390 send_cmd(CMD12, 0); /* STOP_TRANSMISSION */
\ ??disk_read_6:
\ 00000064 0021 MOV R1,#+0
\ 00000066 4C20 MOV R0,#+76
\ 00000068 ........ BL send_cmd
391 }
392 }
393
394 DESELECT(); /* CS = H */
\ ??disk_read_4:
\ 0000006C .... LDR R0,??DataTable13 ;; 0xfffff430
\ 0000006E 0660 STR R6,[R0, #+0]
395 rcvr_spi(); /* Idle (Release DO) */
\ 00000070 FF20 MOV R0,#+255
\ 00000072 ........ BL AT91_spi
396
397 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 ?Subroutine21
398 }
399
\ In segment CODE, align 4, keep-with-next
400 void mmc_read_page(DWORD block,DWORD page, BYTE *buff)
401 /* Read page(s)
402
403 extern DRESULT disk_read (
404 BYTE *buff, // Data buffer to store read data
405 DWORD sector, // Sector number (LBA)
406 BYTE count // Sector count (1..255)
407 )*/
408 {
\ mmc_read_page:
\ 00000000 00B5 PUSH {LR}
\ 00000002 031C MOV R3,R0
\ 00000004 101C MOV R0,R2
409 DWORD sector;
410 sector =((block<<5)+page);
411 disk_read (buff,sector,1);
\ 00000006 0122 MOV R2,#+1
\ 00000008 5B01 LSL R3,R3,#+5
\ 0000000A 5918 ADD R1,R3,R1
\ 0000000C ........ BL disk_read
412 }
\ 00000010 01BC POP {R0}
\ 00000012 0047 BX R0 ;; return
413
414 /*-----------------*/
415 /* Write Sector(s) */
416
417 #ifndef _READONLY
\ In segment CODE, align 4, keep-with-next
418 extern DRESULT disk_write (
419 const BYTE *buff, /* Data to be written */
420 DWORD sector, /* Sector number (LBA) */
421 BYTE count /* Sector count (1..255) */
422 )
423 {
\ disk_write:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 041C MOV R4,R0
\ 00000004 151C MOV R5,R2
424 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
425 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
426 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
427 sector *= 512; /* LBA --> byte address */
\ ??disk_write_3:
\ 00000024 4902 LSL R1,R1,#+9
428
429 SELECT(); /* CS = L */
\ 00000026 8026 MOV R6,#+128
\ 00000028 B601 LSL R6,R6,#+6 ;; #+8192
\ 0000002A .... LDR R0,??DataTable12 ;; 0xfffff434
\ 0000002C 0660 STR R6,[R0, #+0]
430
431 if (count == 1) { /* Single block write */
\ 0000002E 012D CMP R5,#+1
\ 00000030 0CD1 BNE ??disk_write_4
432 if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */
433 && 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
434 count = 0;
\ 00000048 0025 MOV R5,#+0
\ 0000004A 17E0 B ??disk_write_5
435 }
436 else { /* Multiple block write */
437 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
438 do {
439 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
440 buff += 512;
\ 00000062 3009 LSR R0,R6,#+4
\ 00000064 2418 ADD R4,R4,R0
441 } 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
442 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
443 count = 1;
\ 0000007A 0125 MOV R5,#+1
444 }
445 }
446
447 DESELECT(); /* CS = H */
\ ??disk_write_5:
\ 0000007C .... LDR R0,??DataTable13 ;; 0xfffff430
\ 0000007E 0660 STR R6,[R0, #+0]
448 rcvr_spi(); /* Idle (Release DO) */
\ 00000080 FF20 MOV R0,#+255
\ 00000082 ........ BL AT91_spi
449
450 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 ?Subroutine21
451 }
452 #endif
\ In segment CODE, align 4, keep-with-next
453 int mmc_write_page(DWORD block,DWORD page, const BYTE *buff)
454 /* Write Sector(s)
455
456 #ifndef _READONLY
457 extern DRESULT disk_write (
458 const BYTE *buff, // Data to be written
459 DWORD sector, // Sector number (LBA)
460 BYTE count // Sector count (1..255)
461 )*/
462 {
\ mmc_write_page:
\ 00000000 00B5 PUSH {LR}
\ 00000002 031C MOV R3,R0
\ 00000004 101C MOV R0,R2
463 DWORD sector;
464 BYTE acd;
465 sector=((block<<5)+page);
466 acd=disk_write (buff,sector,1);
\ 00000006 0122 MOV R2,#+1
\ 00000008 5B01 LSL R3,R3,#+5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -