📄 sd.lst
字号:
(0237) de++;
0FA0 8988 LDD R24,Y+16
0FA1 8999 LDD R25,Y+17
0FA2 9680 ADIW R24,0x20
0FA3 8B99 STD Y+17,R25
0FA4 8B88 STD Y+16,R24
(0238) index++;
0FA5 898A LDD R24,Y+18
0FA6 899B LDD R25,Y+19
0FA7 9601 ADIW R24,1
0FA8 8B9B STD Y+19,R25
0FA9 8B8A STD Y+18,R24
(0239) } while (*de->deName || index == 16); // 0 in de->deName[0] if no more entries
0FAA 89E8 LDD R30,Y+16
0FAB 89F9 LDD R31,Y+17
0FAC 8020 LDD R2,Z+0
0FAD 2022 TST R2
0FAE F009 BEQ 0x0FB0
0FAF CE97 RJMP 0x0E47
0FB0 898A LDD R24,Y+18
0FB1 899B LDD R25,Y+19
0FB2 3180 CPI R24,0x10
0FB3 E0E0 LDI R30,0
0FB4 079E CPC R25,R30
0FB5 F409 BNE 0x0FB7
0FB6 CE90 RJMP 0x0E47
(0240)
(0241) if (hasBuffer == 0) // end of entries
0FB7 880C LDD R0,Y+20
0FB8 881D LDD R1,Y+21
0FB9 2000 TST R0
0FBA F439 BNE 0x0FC2
0FBB 2011 TST R1
0FBC F429 BNE 0x0FC2
(0242) return 0;
0FBD E000 LDI R16,0
0FBE E010 LDI R17,0
0FBF E020 LDI R18,0
0FC0 E030 LDI R19,0
0FC1 C02D RJMP 0x0FEF
(0243)
(0244) FileSize = de->deFileSize;
0FC2 89E8 LDD R30,Y+16
0FC3 89F9 LDD R31,Y+17
0FC4 8C24 LDD R2,Z+28
0FC5 8C35 LDD R3,Z+29
0FC6 8C46 LDD R4,Z+30
0FC7 8C57 LDD R5,Z+31
0FC8 923002B2 STS _FileSize+1,R3
0FCA 922002B1 STS _FileSize,R2
0FCC 925002B4 STS _FileSize+3,R5
0FCE 924002B3 STS _FileSize+2,R4
(0245) LCD_write_english_string(0,1,LongNameBuffer);
0FD0 90200065 LDS R2,0x65
0FD2 90300066 LDS R3,0x66
0FD4 8239 STD Y+1,R3
0FD5 8228 STD Y+0,R2
0FD6 E021 LDI R18,1
0FD7 2700 CLR R16
0FD8 940E125D CALL _LCD_write_english_string
(0246) return (unsigned long) ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
0FDA 89E8 LDD R30,Y+16
0FDB 89F9 LDD R31,Y+17
0FDC 8C22 LDD R2,Z+26
0FDD 8C33 LDD R3,Z+27
0FDE 2444 CLR R4
0FDF 2455 CLR R5
0FE0 89E8 LDD R30,Y+16
0FE1 89F9 LDD R31,Y+17
0FE2 8864 LDD R6,Z+20
0FE3 8875 LDD R7,Z+21
0FE4 2488 CLR R8
0FE5 2499 CLR R9
0FE6 0143 MOVW R8,R6
0FE7 2466 CLR R6
0FE8 2477 CLR R7
0FE9 0C62 ADD R6,R2
0FEA 1C73 ADC R7,R3
0FEB 1C84 ADC R8,R4
0FEC 1C95 ADC R9,R5
0FED 0183 MOVW R16,R6
0FEE 0194 MOVW R18,R8
0FEF 9668 ADIW R28,0x18
0FF0 940E139F CALL pop_gset5
0FF2 9622 ADIW R28,2
0FF3 9508 RET
_fatNextCluster:
offset --> R10
sector --> Y+12
fatOffset --> Y+8
fatMask --> Y+4
nextCluster --> Y+0
cluster --> Y+22
0FF4 940E12C4 CALL push_arg4
0FF6 940E13BD CALL push_gset3
0FF8 9760 SBIW R28,0x10
(0247) }
(0248)
(0249) /*-----------------------------------------------------------------------
(0250) 在FAT表中查询下一个簇所在扇区号
(0251) -----------------------------------------------------------------------*/
(0252) unsigned long fatNextCluster(unsigned long cluster)
(0253) {
(0254) unsigned long nextCluster;
(0255) unsigned long fatMask;
(0256) unsigned long fatOffset;
(0257) unsigned long sector;
(0258) unsigned int offset;
(0259)
(0260) if(Fat32Enabled)
0FF9 902002C5 LDS R2,_Fat32Enabled
0FFB 2022 TST R2
0FFC F0D9 BEQ 0x1018
(0261) {
(0262) // 一个表项为4bytes(32 bits)
(0263) fatOffset = cluster << 2;
0FFD E082 LDI R24,2
0FFE E090 LDI R25,0
0FFF 01FE MOVW R30,R28
1000 8826 LDD R2,Z+22
1001 8837 LDD R3,Z+23
1002 8C40 LDD R4,Z+24
1003 8C51 LDD R5,Z+25
1004 938A ST R24,-Y
1005 0181 MOVW R16,R2
1006 0192 MOVW R18,R4
1007 940E13EE CALL lsl32
1009 01FE MOVW R30,R28
100A 8700 STD Z+8,R16
100B 8711 STD Z+9,R17
100C 8722 STD Z+10,R18
100D 8733 STD Z+11,R19
(0264) // 设置 FAT32 bit mask
(0265) fatMask = FAT32_MASK;
100E EF4F LDI R20,0xFF
100F EF5F LDI R21,0xFF
1010 EF6F LDI R22,0xFF
1011 E07F LDI R23,0xF
1012 01FE MOVW R30,R28
1013 8344 STD Z+4,R20
1014 8355 STD Z+5,R21
1015 8366 STD Z+6,R22
1016 8377 STD Z+7,R23
(0266) }
1017 C017 RJMP 0x102F
(0267) else
(0268) {
(0269) // 一个表项为2bytes(16 bits)
(0270) fatOffset = cluster << 1;
1018 01FE MOVW R30,R28
1019 8826 LDD R2,Z+22
101A 8837 LDD R3,Z+23
101B 8C40 LDD R4,Z+24
101C 8C51 LDD R5,Z+25
101D 0C22 LSL R2
101E 1C33 ROL R3
101F 1C44 ROL R4
1020 1C55 ROL R5
1021 01FE MOVW R30,R28
1022 8620 STD Z+8,R2
1023 8631 STD Z+9,R3
1024 8642 STD Z+10,R4
1025 8653 STD Z+11,R5
(0271) // 设置 FAT16 bit mask
(0272) fatMask = FAT16_MASK;
1026 EF4F LDI R20,0xFF
1027 EF5F LDI R21,0xFF
1028 E060 LDI R22,0
1029 E070 LDI R23,0
102A 01FE MOVW R30,R28
102B 8344 STD Z+4,R20
102C 8355 STD Z+5,R21
102D 8366 STD Z+6,R22
102E 8377 STD Z+7,R23
(0273) }
(0274)
(0275) //计算FAT扇区号
(0276) sector = FirstFATSector + (fatOffset / BytesPerSector);
102F 902002BF LDS R2,_BytesPerSector
1031 903002C0 LDS R3,_BytesPerSector+1
1033 2444 CLR R4
1034 2455 CLR R5
1035 01FE MOVW R30,R28
1036 8460 LDD R6,Z+8
1037 8471 LDD R7,Z+9
1038 8482 LDD R8,Z+10
1039 8493 LDD R9,Z+11
103A 925A ST R5,-Y
103B 924A ST R4,-Y
103C 923A ST R3,-Y
103D 922A ST R2,-Y
103E 0183 MOVW R16,R6
103F 0194 MOVW R18,R8
1040 940E12E5 CALL div32u
1042 904002BB LDS R4,_FirstFATSector+2
1044 905002BC LDS R5,_FirstFATSector+3
1046 902002B9 LDS R2,_FirstFATSector
1048 903002BA LDS R3,_FirstFATSector+1
104A 0E20 ADD R2,R16
104B 1E31 ADC R3,R17
104C 1E42 ADC R4,R18
104D 1E53 ADC R5,R19
104E 01FE MOVW R30,R28
104F 8624 STD Z+12,R2
1050 8635 STD Z+13,R3
1051 8646 STD Z+14,R4
1052 8657 STD Z+15,R5
(0277) //计算FAT扇区号中表项的偏移地址
(0278) offset = fatOffset % BytesPerSector;
1053 902002BF LDS R2,_BytesPerSector
1055 903002C0 LDS R3,_BytesPerSector+1
1057 2444 CLR R4
1058 2455 CLR R5
1059 01FE MOVW R30,R28
105A 8460 LDD R6,Z+8
105B 8471 LDD R7,Z+9
105C 8482 LDD R8,Z+10
105D 8493 LDD R9,Z+11
105E 925A ST R5,-Y
105F 924A ST R4,-Y
1060 923A ST R3,-Y
1061 922A ST R2,-Y
1062 0183 MOVW R16,R6
1063 0194 MOVW R18,R8
1064 940E12E7 CALL mod32u
1066 0158 MOVW R10,R16
(0279)
(0280) ReadBlock(sector);
1067 01FE MOVW R30,R28
1068 8504 LDD R16,Z+12
1069 8515 LDD R17,Z+13
106A 8526 LDD R18,Z+14
106B 8537 LDD R19,Z+15
106C DBDA RCALL _ReadBlock
(0281)
(0282) // 读取下一个簇号
(0283) nextCluster = (*((unsigned long*) &((char*)BUFFER)[offset])) & fatMask;
106D EB81 LDI R24,0xB1
106E E090 LDI R25,0
106F 01F5 MOVW R30,R10
1070 0FE8 ADD R30,R24
1071 1FF9 ADC R31,R25
1072 8020 LDD R2,Z+0
1073 8031 LDD R3,Z+1
1074 8042 LDD R4,Z+2
1075 8053 LDD R5,Z+3
1076 01FE MOVW R30,R28
1077 8064 LDD R6,Z+4
1078 8075 LDD R7,Z+5
1079 8086 LDD R8,Z+6
107A 8097 LDD R9,Z+7
107B 2026 AND R2,R6
107C 2037 AND R3,R7
107D 2048 AND R4,R8
107E 2059 AND R5,R9
107F 01FE MOVW R30,R28
1080 8220 STD Z+0,R2
1081 8231 STD Z+1,R3
1082 8242 STD Z+2,R4
1083 8253 STD Z+3,R5
(0284)
(0285) // 是否文件的结束簇
(0286) if (nextCluster == (CLUST_EOFE & fatMask))
1084 01FE MOVW R30,R28
1085 8024 LDD R2,Z+4
1086 8035 LDD R3,Z+5
1087 8046 LDD R4,Z+6
1088 8057 LDD R5,Z+7
1089 01FE MOVW R30,R28
108A 8060 LDD R6,Z+0
108B 8071 LDD R7,Z+1
108C 8082 LDD R8,Z+2
108D 8093 LDD R9,Z+3
108E 1462 CP R6,R2
108F 0473 CPC R7,R3
1090 0484 CPC R8,R4
1091 0495 CPC R9,R5
1092 F449 BNE 0x109C
(0287) nextCluster = 0;
1093 E040 LDI R20,0
1094 E050 LDI R21,0
1095 E060 LDI R22,0
1096 E070 LDI R23,0
1097 01FE MOVW R30,R28
1098 8340 STD Z+0,R20
1099 8351 STD Z+1,R21
109A 8362 STD Z+2,R22
109B 8373 STD Z+3,R23
(0288)
(0289) return nextCluster;
109C 01FE MOVW R30,R28
109D 8100 LDD R16,Z+0
109E 8111 LDD R17,Z+1
109F 8122 LDD R18,Z+2
10A0 8133 LDD R19,Z+3
10A1 9660 ADIW R28,0x10
10A2 940E1399 CALL pop_gset3
10A4 9624 ADIW R28,4
10A5 9508 RET
FILE: D:\Temp\AVRTest\SDMP3~1\uarst.c
(0001) /************************************************************/
(0002) /* UARST Code for M32L */
(0003) /* By pasyong */
(0004) /* 2006-4 */
(0005) /* Base ICC6.31A */
(0006) /************************************************************/
(0007) #include <iom32v.h>
(0008) #include <macros.h>
(0009) #include <stdio.h>
(0010)
(0011) //UART0 initialize
(0012) // desired baud rate: 9600
(0013) // actual: baud rate:9600 (0.0%)
(0014) // char size: 8 bit
(0015) // parity: Disabled
(0016) void uart0_init(void)
(0017) {
(0018) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
10A6 2422 CLR R2
10A7 B82A OUT 0x0A,R2
(0019) UCSRA = 0x00;
10A8 B82B OUT 0x0B,R2
(0020) UCSRC = BIT(URSEL) | 0x06;
10A9 E886 LDI R24,0x86
10AA BD80 OUT 0x20,R24
(0021) UBRRL = 0x2F; //set baud rate lo
10AB E28F LDI R24,0x2F
10AC B989 OUT 0x09,R24
(0022) UBRRH = 0x00; //set baud rate hi
10AD BC20 OUT 0x20,R2
(0023) UCSRB = 0x18;
10AE E188 LDI R24,0x18
10AF B98A OUT 0x0A,R24
10B0 9508 RET
_Puts:
s --> R20
10B1 940E13A2 CALL push_gset1
10B3 01A8 MOVW R20,R16
(0024) }
(0025) //串口输出字符串
(0026) void Puts( unsigned char *s)
(0027) {
10B4 C006 RJMP 0x10BB
(0028) while (*s)
(0029) {
(0030) putchar(*s);
10B5 01FA MOVW R30,R20
10B6 8100 LDD R16,Z+0
10B7 940E141E CALL _putchar
(0031) s++;
10B9 5F4F SUBI R20,0xFF
10BA 4F5F SBCI R21,0xFF
10BB 01FA MOVW R30,R20
10BC 8020 LDD R2,Z+0
10BD 2022 TST R2
10BE F7B1 BNE 0x10B5
10BF 940E13A5 CALL pop_gset1
10C1 9508 RET
FILE: D:\Temp\AVRTest\SDMP3~1\mp3.c
(0001) /************************************************************/
(0002) /* MP3 Code for M32L */
(0003) /* By pasyong */
(0004) /* 2006-4 */
(0005) /* Base ICC6.31A */
(0006) /************************************************************/
(0007) #include <iom32v.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 "uarst.h"
(0015) #include "3310.h"
(0016)
(0017) void key_port(void)
(0018) {
(0019) DDRD=0X00;
_key_port:
10C2 2422 CLR R2
10C3 BA21 OUT 0x11,R2
(0020) PORTD=0XFF;
10C4 EF8F LDI R24,0xFF
10C5 BB82 OUT 0x12,R24
10C6 9508 RET
(0021) }
(0022) void main()
(0023) {
(0024) key_port();
_main:
10C7 DFFA RCALL _key_port
(0025) spi_init();
10C8 940E0BDE CALL _spi_init
(0026)
(0027) mp3_port_init(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -