📄 sd.lst
字号:
07AB 2400 CLR R0
07AC 2411 CLR R1
07AD 8A1B STD Y+19,R1
07AE 8A0A STD Y+18,R0
(0232) entrycount++; // increment entry counter
07AF 9180010F LDS R24,entrycount
07B1 91900110 LDS R25,entrycount+1
07B3 9601 ADIW R24,1
07B4 93900110 STS entrycount+1,R25
07B6 9380010F STS entrycount,R24
(0233) }
(0234) // else ignore short_name_only entries
(0235) }
(0236) }
(0237) de++;
07B8 858E LDD R24,Y+14
07B9 859F LDD R25,Y+15
07BA 9680 ADIW R24,0x20
07BB 879F STD Y+15,R25
07BC 878E STD Y+14,R24
(0238) index++;
07BD 8988 LDD R24,Y+16
07BE 8999 LDD R25,Y+17
07BF 9601 ADIW R24,1
07C0 8B99 STD Y+17,R25
07C1 8B88 STD Y+16,R24
(0239) } while (*de->deName || index == 16); // 0 in de->deName[0] if no more entries
07C2 85EE LDD R30,Y+14
07C3 85FF LDD R31,Y+15
07C4 8020 LDD R2,Z+0
07C5 2022 TST R2
07C6 F009 BEQ 0x07C8
07C7 CE97 RJMP 0x065F
07C8 8988 LDD R24,Y+16
07C9 8999 LDD R25,Y+17
07CA 3180 CPI R24,0x10
07CB E0E0 LDI R30,0
07CC 079E CPC R25,R30
07CD F409 BNE 0x07CF
07CE CE90 RJMP 0x065F
(0240)
(0241) if (hasBuffer == 0) // end of entries
07CF 880A LDD R0,Y+18
07D0 881B LDD R1,Y+19
07D1 2000 TST R0
07D2 F439 BNE 0x07DA
07D3 2011 TST R1
07D4 F429 BNE 0x07DA
(0242) return 0;
07D5 E000 LDI R16,0
07D6 E010 LDI R17,0
07D7 E020 LDI R18,0
07D8 E030 LDI R19,0
07D9 C023 RJMP 0x07FD
(0243)
(0244) FileSize = de->deFileSize;
07DA 85EE LDD R30,Y+14
07DB 85FF LDD R31,Y+15
07DC 8C24 LDD R2,Z+28
07DD 8C35 LDD R3,Z+29
07DE 8C46 LDD R4,Z+30
07DF 8C57 LDD R5,Z+31
07E0 92300426 STS FileSize+1,R3
07E2 92200425 STS FileSize,R2
07E4 92500428 STS FileSize+3,R5
07E6 92400427 STS FileSize+2,R4
(0245) return (unsigned long) ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
07E8 85EE LDD R30,Y+14
07E9 85FF LDD R31,Y+15
07EA 8C22 LDD R2,Z+26
07EB 8C33 LDD R3,Z+27
07EC 2444 CLR R4
07ED 2455 CLR R5
07EE 85EE LDD R30,Y+14
07EF 85FF LDD R31,Y+15
07F0 8864 LDD R6,Z+20
07F1 8875 LDD R7,Z+21
07F2 2488 CLR R8
07F3 2499 CLR R9
07F4 0143 MOVW R8,R6
07F5 2466 CLR R6
07F6 2477 CLR R7
07F7 0C62 ADD R6,R2
07F8 1C73 ADC R7,R3
07F9 1C84 ADC R8,R4
07FA 1C95 ADC R9,R5
07FB 0183 MOVW R16,R6
07FC 0194 MOVW R18,R8
07FD 9666 ADIW R28,0x16
07FE 940E0DA1 CALL pop_gset5
0800 9622 ADIW R28,2
0801 9508 RET
_fatNextCluster:
offset --> R10
sector --> Y+12
fatOffset --> Y+8
fatMask --> Y+4
nextCluster --> Y+0
cluster --> Y+22
0802 940E0CAE CALL push_arg4
0804 940E0DA8 CALL push_gset3
0806 9760 SBIW R28,0x10
(0246) }
(0247)
(0248) /*-----------------------------------------------------------------------
(0249) 在FAT表中查询下一个簇所在扇区号
(0250) -----------------------------------------------------------------------*/
(0251) unsigned long fatNextCluster(unsigned long cluster)
(0252) {
(0253) unsigned long nextCluster;
(0254) unsigned long fatMask;
(0255) unsigned long fatOffset;
(0256) unsigned long sector;
(0257) unsigned int offset;
(0258)
(0259) if(Fat32Enabled)
0807 90200439 LDS R2,Fat32Enabled
0809 2022 TST R2
080A F0D9 BEQ 0x0826
(0260) {
(0261) // 一个表项为4bytes(32 bits)
(0262) fatOffset = cluster << 2;
080B E082 LDI R24,2
080C E090 LDI R25,0
080D 01FE MOVW R30,R28
080E 8826 LDD R2,Z+22
080F 8837 LDD R3,Z+23
0810 8C40 LDD R4,Z+24
0811 8C51 LDD R5,Z+25
0812 938A ST R24,-Y
0813 0181 MOVW R16,R2
0814 0192 MOVW R18,R4
0815 940E0DE8 CALL lsl32
0817 01FE MOVW R30,R28
0818 8700 STD Z+8,R16
0819 8711 STD Z+9,R17
081A 8722 STD Z+10,R18
081B 8733 STD Z+11,R19
(0263) // 设置 FAT32 bit mask
(0264) fatMask = FAT32_MASK;
081C EF4F LDI R20,0xFF
081D EF5F LDI R21,0xFF
081E EF6F LDI R22,0xFF
081F E07F LDI R23,0xF
0820 01FE MOVW R30,R28
0821 8344 STD Z+4,R20
0822 8355 STD Z+5,R21
0823 8366 STD Z+6,R22
0824 8377 STD Z+7,R23
(0265) }
0825 C017 RJMP 0x083D
(0266) else
(0267) {
(0268) // 一个表项为2bytes(16 bits)
(0269) fatOffset = cluster << 1;
0826 01FE MOVW R30,R28
0827 8826 LDD R2,Z+22
0828 8837 LDD R3,Z+23
0829 8C40 LDD R4,Z+24
082A 8C51 LDD R5,Z+25
082B 0C22 LSL R2
082C 1C33 ROL R3
082D 1C44 ROL R4
082E 1C55 ROL R5
082F 01FE MOVW R30,R28
0830 8620 STD Z+8,R2
0831 8631 STD Z+9,R3
0832 8642 STD Z+10,R4
0833 8653 STD Z+11,R5
(0270) // 设置 FAT16 bit mask
(0271) fatMask = FAT16_MASK;
0834 EF4F LDI R20,0xFF
0835 EF5F LDI R21,0xFF
0836 E060 LDI R22,0
0837 E070 LDI R23,0
0838 01FE MOVW R30,R28
0839 8344 STD Z+4,R20
083A 8355 STD Z+5,R21
083B 8366 STD Z+6,R22
083C 8377 STD Z+7,R23
(0272) }
(0273)
(0274) //计算FAT扇区号
(0275) sector = FirstFATSector + (fatOffset / BytesPerSector);
083D 90200433 LDS R2,BytesPerSector
083F 90300434 LDS R3,BytesPerSector+1
0841 2444 CLR R4
0842 2455 CLR R5
0843 01FE MOVW R30,R28
0844 8460 LDD R6,Z+8
0845 8471 LDD R7,Z+9
0846 8482 LDD R8,Z+10
0847 8493 LDD R9,Z+11
0848 925A ST R5,-Y
0849 924A ST R4,-Y
084A 923A ST R3,-Y
084B 922A ST R2,-Y
084C 0183 MOVW R16,R6
084D 0194 MOVW R18,R8
084E 940E0CCF CALL div32u
0850 9040042F LDS R4,FirstFATSector+2
0852 90500430 LDS R5,FirstFATSector+3
0854 9020042D LDS R2,FirstFATSector
0856 9030042E LDS R3,FirstFATSector+1
0858 0E20 ADD R2,R16
0859 1E31 ADC R3,R17
085A 1E42 ADC R4,R18
085B 1E53 ADC R5,R19
085C 01FE MOVW R30,R28
085D 8624 STD Z+12,R2
085E 8635 STD Z+13,R3
085F 8646 STD Z+14,R4
0860 8657 STD Z+15,R5
(0276) //计算FAT扇区号中表项的偏移地址
(0277) offset = fatOffset % BytesPerSector;
0861 90200433 LDS R2,BytesPerSector
0863 90300434 LDS R3,BytesPerSector+1
0865 2444 CLR R4
0866 2455 CLR R5
0867 01FE MOVW R30,R28
0868 8460 LDD R6,Z+8
0869 8471 LDD R7,Z+9
086A 8482 LDD R8,Z+10
086B 8493 LDD R9,Z+11
086C 925A ST R5,-Y
086D 924A ST R4,-Y
086E 923A ST R3,-Y
086F 922A ST R2,-Y
0870 0183 MOVW R16,R6
0871 0194 MOVW R18,R8
0872 940E0CD1 CALL mod32u
0874 0158 MOVW R10,R16
(0278)
(0279) ReadBlock(sector);
0875 01FE MOVW R30,R28
0876 8504 LDD R16,Z+12
0877 8515 LDD R17,Z+13
0878 8526 LDD R18,Z+14
0879 8537 LDD R19,Z+15
087A DBDC RCALL _ReadBlock
(0280)
(0281) // 读取下一个簇号
(0282) nextCluster = (*((unsigned long*) &((char*)BUFFER)[offset])) & fatMask;
087B E285 LDI R24,0x25
087C E092 LDI R25,2
087D 01F5 MOVW R30,R10
087E 0FE8 ADD R30,R24
087F 1FF9 ADC R31,R25
0880 8020 LDD R2,Z+0
0881 8031 LDD R3,Z+1
0882 8042 LDD R4,Z+2
0883 8053 LDD R5,Z+3
0884 01FE MOVW R30,R28
0885 8064 LDD R6,Z+4
0886 8075 LDD R7,Z+5
0887 8086 LDD R8,Z+6
0888 8097 LDD R9,Z+7
0889 2026 AND R2,R6
088A 2037 AND R3,R7
088B 2048 AND R4,R8
088C 2059 AND R5,R9
088D 01FE MOVW R30,R28
088E 8220 STD Z+0,R2
088F 8231 STD Z+1,R3
0890 8242 STD Z+2,R4
0891 8253 STD Z+3,R5
(0283)
(0284) // 是否文件的结束簇
(0285) if (nextCluster == (CLUST_EOFE & fatMask))
0892 01FE MOVW R30,R28
0893 8024 LDD R2,Z+4
0894 8035 LDD R3,Z+5
0895 8046 LDD R4,Z+6
0896 8057 LDD R5,Z+7
0897 01FE MOVW R30,R28
0898 8060 LDD R6,Z+0
0899 8071 LDD R7,Z+1
089A 8082 LDD R8,Z+2
089B 8093 LDD R9,Z+3
089C 1462 CP R6,R2
089D 0473 CPC R7,R3
089E 0484 CPC R8,R4
089F 0495 CPC R9,R5
08A0 F449 BNE 0x08AA
(0286) nextCluster = 0;
08A1 E040 LDI R20,0
08A2 E050 LDI R21,0
08A3 E060 LDI R22,0
08A4 E070 LDI R23,0
08A5 01FE MOVW R30,R28
08A6 8340 STD Z+0,R20
08A7 8351 STD Z+1,R21
08A8 8362 STD Z+2,R22
08A9 8373 STD Z+3,R23
(0287)
(0288) return nextCluster;
08AA 01FE MOVW R30,R28
08AB 8100 LDD R16,Z+0
08AC 8111 LDD R17,Z+1
08AD 8122 LDD R18,Z+2
08AE 8133 LDD R19,Z+3
08AF 9660 ADIW R28,0x10
08B0 940E0D9B CALL pop_gset3
08B2 9624 ADIW R28,4
08B3 9508 RET
FILE: E:\V3U~1\sd\M64-SD卡MP3程序\mp3.c
(0001) /************************************************************/
(0002) /* MP3 Code for M32L */
(0003) /* By pasyong */
(0004) /* 2006-4 */
(0005) /* Base ICC6.31A */
(0006) /************************************************************/
(0007) #include <iom64v.h>
(0008) #include <macros.h>
(0009) #include <stdio.h>
(0010) #include "1011.h"
(0011) #include "mp3.h"
(0012) #include "sd.h"
(0013) #include "fat.h"
(0014) #include "lcd.h"
(0015) #include "bmp.h"
(0016) #include "delay.h"
(0017)
(0018) void key_port(void)
(0019) {
(0020) DDRE=0X00;
_key_port:
08B4 2422 CLR R2
08B5 B822 OUT 0x02,R2
(0021) PORTE=0XFF;
08B6 EF8F LDI R24,0xFF
08B7 B983 OUT 0x03,R24
08B8 9508 RET
_main:
08B9 9725 SBIW R28,5
(0022) }
(0023) void main()
(0024) {
(0025) key_port();
08BA DFF9 RCALL _key_port
(0026) spi_init();
08BB 940E03DC CALL _spi_init
(0027) LCD_Init();
08BD 940E0A99 CALL _LCD_Init
(0028) LCD_clear();
08BF 940E0ADF CALL _LCD_clear
(0029) LCD_write_String(0,5,"MEGA64L MP3"); // 显示英文字符串
08C1 E186 LDI R24,0x16
08C2 E092 LDI R25,2
08C3 8399 STD Y+1,R25
08C4 8388 STD Y+0,R24
08C5 E025 LDI R18,5
08C6 2700 CLR R16
08C7 940E0B1F CALL _LCD_write_String
(0030) LCD_draw_map(0,2,AVR_bmp,40,24); // 显示“AVR”位图
08C9 E188 LDI R24,0x18
08CA 838C STD Y+4,R24
08CB E288 LDI R24,0x28
08CC 838A STD Y+2,R24
08CD E586 LDI R24,0x56
08CE E091 LDI R25,1
08CF 8399 STD Y+1,R25
08D0 8388 STD Y+0,R24
08D1 E022 LDI R18,2
08D2 2700 CLR R16
08D3 940E0C2B CALL _LCD_draw_map
(0031) LCD_draw_map(44,2,china_bmp,36,15); // 显示”实验室“位图
08D5 E08F LDI R24,0xF
08D6 838C STD Y+4,R24
08D7 E284 LDI R24,0x24
08D8 838A STD Y+2,R24
08D9 EC8E LDI R24,0xCE
08DA E091 LDI R25,1
08DB 8399 STD Y+1,R25
08DC 8388 STD Y+0,R24
08DD E022 LDI R18,2
08DE E20C LDI R16,0x2C
08DF 940E0C2B CALL _LCD_draw_map
(0032) mp3_port_init();vs1003_init();vs1003_init();
08E1 940E03E3 CALL _mp3_port_init
08E3 940E0442 CALL _vs1003_init
08E5 940E0442 CALL _vs1003_init
(0033) sd_port_init();SD_Init();SD_Init();
08E7 940E02F2 CALL _sd_port_init
08E9 940E0352 CALL _SD_Init
08EB 940E0352 CALL _SD_Init
(0034) SPCR = 0x50; //提速
08ED E580 LDI R24,0x50
08EE B98D OUT 0x0D,R24
(0035) SPSR = 0x01; //setup SPI
08EF E081 LDI R24,1
08F0 B98E OUT 0x0E,R24
(0036)
(0037) fatInit();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -