📄 mp3.s
字号:
.byte 255,255
.byte 255,255
.byte 255,255
.byte 255,255
.byte 255,255
.byte 255,255
.byte 255,255
.byte 255,255
.byte 255,255
.byte 255,255
.byte 255,128
.byte 2,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 255,242
.byte 130,'T
.byte 9,232
.byte 255,22
.byte 224,1
.byte 46,0
.byte 0,0
.byte 0,0
.byte 168,2
.byte 92,172
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.dbsym e vsBeepMP3 _vsBeepMP3 A[4800:4800]kc
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序/mp3.h
.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\mp3.c
.dbfunc e key_port _key_port fV
.even
_key_port::
.dbline -1
.dbline 17
; /************************************************************/
; /* MP3 Code for M32L */
; /* By pasyong */
; /* 2006-4 */
; /* Base ICC6.31A */
; /************************************************************/
; #include <iom32v.h>
; #include <macros.h>
; #include <stdio.h>
; #include "1011.h"
; #include "mp3.h"
; #include "sd.h"
; #include "fat.h"
; #include "uarst.h"
;
; void key_port(void)
; {
.dbline 18
; DDRD=0X00;
clr R2
out 0x11,R2
.dbline 19
; PORTD=0XFF;
ldi R24,255
out 0x12,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 22
; }
; void main()
; {
.dbline 23
; key_port();
xcall _key_port
.dbline 24
; spi_init();
xcall _spi_init
.dbline 25
; mp3_port_init();vs1011_init();vs1011_init();
xcall _mp3_port_init
.dbline 25
xcall _vs1011_init
.dbline 25
xcall _vs1011_init
.dbline 26
; sd_port_init();SD_Init();SD_Init();
xcall _sd_port_init
.dbline 26
xcall _SD_Init
.dbline 26
xcall _SD_Init
.dbline 27
; uart0_init();
xcall _uart0_init
.dbline 28
; SPCR = 0x50; //提速
ldi R24,80
out 0xd,R24
.dbline 29
; SPSR = 0x01; //setup SPI
ldi R24,1
out 0xe,R24
.dbline 31
;
; fatInit(); //查询SDFAT格式
xcall _fatInit
.dbline 32
; if(Fat32Enabled) //设置FAT格式标志
lds R2,_Fat32Enabled
tst R2
breq L3
.dbline 33
; FAT_MASK=FAT32_MASK;
ldi R20,255
ldi R21,255
ldi R22,255
ldi R23,15
sts _FAT_MASK+1,R21
sts _FAT_MASK,R20
sts _FAT_MASK+2+1,R23
sts _FAT_MASK+2,R22
xjmp L6
L3:
.dbline 35
; else
; FAT_MASK=FAT16_MASK;
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
sts _FAT_MASK+1,R21
sts _FAT_MASK,R20
sts _FAT_MASK+2+1,R23
sts _FAT_MASK+2,R22
xjmp L6
L5:
.dbline 39
;
;
; while(1)
; {
.dbline 41
; //播放音乐
; for(t=3;t<50;t++)
ldi R24,3
ldi R25,0
sts _t+1,R25
sts _t,R24
xjmp L11
L8:
.dbline 42
.dbline 43
clr R2
sts _flag,R2
.dbline 44
lds R16,_t
lds R17,_t+1
xcall _fatGetDirEntry
xcall _mp3_play
.dbline 45
L9:
.dbline 41
lds R24,_t
lds R25,_t+1
adiw R24,1
sts _t+1,R25
sts _t,R24
L11:
.dbline 41
lds R24,_t
lds R25,_t+1
cpi R24,50
ldi R30,0
cpc R25,R30
brlo L8
.dbline 46
L6:
.dbline 38
xjmp L5
X0:
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e mp3_play _mp3_play fV
; t1 -> <dead>
; rate -> <dead>
; NextCluster -> y+4
; LBA -> y+0
; i -> R10,R11
; n -> R14
; data_pointer -> R12,R13
; FirstClust -> y+18
.even
_mp3_play::
xcall push_arg4
xcall push_gset5
sbiw R28,8
.dbline -1
.dbline 51
; {
; flag=0;
; mp3_play(fatGetDirEntry(t));
; }
; }
; }
;
;
; void mp3_play(unsigned long FirstClust)
; {
.dbline 55
; uint32 LBA,NextCluster;
; uint16 i,data_pointer,rate;
; uint8 n,t1;
; NextCluster = FirstClust;
movw R30,R28
ldd R2,z+18
ldd R3,z+19
ldd R4,z+20
ldd R5,z+21
movw R30,R28
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
xjmp L14
L13:
.dbline 58
;
; while (1)
; {
.dbline 59
; LBA =fatClustToSect(NextCluster);
movw R30,R28
ldd R16,z+4
ldd R17,z+5
ldd R18,z+6
ldd R19,z+7
xcall _fatClustToSect
movw R30,R28
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 60
; for (i=0;i<SectorsPerCluster;i++)
clr R10
clr R11
xjmp L19
L16:
.dbline 61
; {
.dbline 62
; if(flag==0) ReadBlock(LBA+i); //读完后文件指针自动后移
lds R2,_flag
tst R2
brne L20
.dbline 62
movw R2,R10
clr R4
clr R5
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R16,R6
movw R18,R8
xcall _ReadBlock
L20:
.dbline 66
;
; //按键处理程序
; //ST/PS键按下
; if(!(PIND&STOP))
sbic 0x10,6
rjmp L22
.dbline 67
; {
.dbline 68
; delay_nus(250);
ldi R16,250
ldi R17,0
xcall _delay_nus
.dbline 69
; if(!(PIND&STOP))
sbic 0x10,6
rjmp L24
.dbline 70
; {
.dbline 71
; flag^=0x01;
ldi R24,1
lds R2,_flag
eor R2,R24
sts _flag,R2
.dbline 72
; }
L24:
.dbline 73
; }
L22:
.dbline 75
; //VOLUP键按下
; if(!(PIND&VOLDOWN))
sbic 0x10,4
rjmp L26
.dbline 76
; {
.dbline 77
; delay_nus(250);
ldi R16,250
ldi R17,0
xcall _delay_nus
.dbline 78
; if(!(PIND&VOLDOWN))
sbic 0x10,4
rjmp L28
.dbline 79
; {
.dbline 80
; vol=vol+((uint)(2<<8)+2);
lds R24,_vol
lds R25,_vol+1
subi R24,254 ; offset = 514
sbci R25,253
sts _vol+1,R25
sts _vol,R24
.dbline 81
; if(vol>=0xF0F0) vol=0xF0F0;
cpi R24,240
ldi R30,240
cpc R25,R30
brlo L30
.dbline 81
ldi R24,61680
ldi R25,240
sts _vol+1,R25
sts _vol,R24
xjmp L31
L30:
.dbline 82
; else vs1011_cmd_write(0x0b,vol); //每次左右声道VOL减2
lds R18,_vol
lds R19,_vol+1
ldi R16,11
xcall _vs1011_cmd_write
L31:
.dbline 83
; }
L28:
.dbline 84
; }
L26:
.dbline 86
; //VOLDOWN键按下
; if(!(PIND&VOLUP))
sbic 0x10,5
rjmp L32
.dbline 87
; {
.dbline 88
; delay_nus(250);
ldi R16,250
ldi R17,0
xcall _delay_nus
.dbline 89
; if(!(PIND&VOLUP))
sbic 0x10,5
rjmp L34
.dbline 90
; {
.dbline 91
; vol=vol-((uint)(2<<8)+2);
lds R24,_vol
lds R25,_vol+1
subi R24,2
sbci R25,2
sts _vol+1,R25
sts _vol,R24
.dbline 92
; if(vol<=0x0505) vol=0x0505;
ldi R24,1285
ldi R25,5
lds R2,_vol
lds R3,_vol+1
cp R24,R2
cpc R25,R3
brlo L36
.dbline 92
sts _vol+1,R25
sts _vol,R24
xjmp L37
L36:
.dbline 93
; else vs1011_cmd_write(0x0b,vol); //每次左右声道VOL加2
lds R18,_vol
lds R19,_vol+1
ldi R16,11
xcall _vs1011_cmd_write
L37:
.dbline 94
; }
L34:
.dbline 95
; }
L32:
.dbline 97
; //NEXT键按下
; if(!(PIND&NEXTSONG))
sbic 0x10,3
rjmp L38
.dbline 98
; {
.dbline 99
; delay_nus(250);
ldi R16,250
ldi R17,0
xcall _delay_nus
.dbline 100
; if(!(PIND&NEXTSONG)) goto NEXT; //跳到下一首歌曲
sbic 0x10,3
rjmp L40
.dbline 100
xjmp L42
L40:
.dbline 101
; }
L38:
.dbline 103
; //PREV键按下
; if(!(PIND&PREVSONG))
sbic 0x10,2
rjmp L43
.dbline 104
; {
.dbline 105
; delay_nus(250);
ldi R16,250
ldi R17,0
xcall _delay_nus
.dbline 106
; if(!(PIND&PREVSONG))
sbic 0x10,2
rjmp L45
.dbline 107
; {
.dbline 108
; t=t-2;goto NEXT; //返回前一首歌曲
lds R24,_t
lds R25,_t+1
sbiw R24,2
sts _t+1,R25
sts _t,R24
.dbline 108
xjmp L42
L45:
.dbline 110
; }
; }
L43:
.dbline 113
;
;
; data_pointer=0;
clr R12
clr R13
xjmp L48
L47:
.dbline 115
; while(data_pointer<512)
; {
.dbline 116
; if(PINB&MP3_DATA_REQ)
sbis 0x16,2
rjmp L50
.dbline 117
; {
.dbline 118
; for(n=0;n<32;n++)
clr R14
xjmp L55
L52:
.dbline 119
.dbline 120
ldi R24,<_BUFFER
ldi R25,>_BUFFER
movw R30,R12
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _vs1011_data_write
.dbline 121
movw R24,R12
adiw R24,1
movw R12,R24
.dbline 122
L53:
.dbline 118
inc R14
L55:
.dbline 118
mov R24,R14
cpi R24,32
brlo L52
.dbline 123
; {
; vs1011_data_write(BUFFER[data_pointer]);
; data_pointer++;
; }
; }
L50:
.dbline 124
; if (data_pointer==511) break; //如果现在的数据不够了,则跳出来
movw R24,R12
cpi R24,255
ldi R30,1
cpc R25,R30
brne L56
.dbline 124
xjmp L49
L56:
.dbline 125
L48:
.dbline 114
movw R24,R12
cpi R24,0
ldi R30,2
cpc R25,R30
brlo L47
L49:
.dbline 126
L17:
.dbline 60
movw R24,R10
adiw R24,1
movw R10,R24
L19:
.dbline 60
lds R2,_SectorsPerCluster
lds R3,_SectorsPerCluster+1
cp R10,R2
cpc R11,R3
brsh X1
xjmp L16
X1:
.dbline 127
; }
; }
; NextCluster = fatNextCluster(NextCluster);
movw R30,R28
ldd R16,z+4
ldd R17,z+5
ldd R18,z+6
ldd R19,z+7
xcall _fatNextCluster
movw R30,R28
std z+4,R16
std z+5,R17
std z+6,R18
std z+7,R19
.dbline 128
; if (NextCluster >=(CLUST_RSRVD&FAT_MASK))break;
ldi R20,246
ldi R21,255
ldi R22,255
ldi R23,255
lds R4,_FAT_MASK+2
lds R5,_FAT_MASK+2+1
lds R2,_FAT_MASK
lds R3,_FAT_MASK+1
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R30,R28
ldd R6,z+4
ldd R7,z+5
ldd R8,z+6
ldd R9,z+7
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo L58
.dbline 128
xjmp L15
L58:
.dbline 129
L14:
.dbline 57
xjmp L13
L15:
L42:
.dbline 130
; }
; NEXT: delay_nus(3); /* 下一首歌曲*/
ldi R16,3
ldi R17,0
xcall _delay_nus
.dbline -2
L12:
adiw R28,8
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l t1 1 c
.dbsym l rate 1 i
.dbsym l NextCluster 4 l
.dbsym l LBA 0 l
.dbsym r i 10 i
.dbsym r n 14 c
.dbsym r data_pointer 12 i
.dbsym l FirstClust 18 l
.dbend
.area bss(ram, con, rel)
.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\mp3.c
_t::
.blkb 2
.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序/mp3.h
.dbsym e t _t i
_true::
.blkb 1
.dbsym e true _true c
_FAT_MASK::
.blkb 4
.dbsym e FAT_MASK _FAT_MASK l
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -