📄 main.s01
字号:
NAME main(17)
RSEG APC_LIST_FUN1(0)
RSEG CSTR(0)
RSEG CONST(0)
RSEG UDATA0(0)
RSEG APD_LIST_FUN1(0)
EXTERN BankSwitch
PUBLIC CheckMusicType
EXTERN DRV_ActiveDrive
EXTERN DRV_ActiveUD
EXTERN DRV_DetectUD
EXTERN FS_FRemove
EXTERN FS_GetName
EXTERN SetDspMips
EXTERN SortStoreListToFile
PUBLIC StoreID3toIDM
EXTERN VMRead
EXTERN VMWrite
PUBLIC delay1
EXTERN fselGetLocation
EXTERN fselGetNextFile
EXTERN fselInit
PUBLIC g_ID3InfoBuf
PUBLIC g_file_total
PUBLIC g_music_list_val
PUBLIC list_location
PUBLIC main
EXTERN mp3GetID3Info
EXTERN unitochar
EXTERN wmaGetTAGInfo
EXTERN ?CLZ80B_4_04_L00
EXTERN ?S_MUL_L02
EXTERN ?BANK_CALL_DIRECT_L08
EXTERN ?BANK_FAST_LEAVE_L08
EXTERN ?MEMSET_L11
EXTERN ?STRCMP_L11
RSEG APC_LIST_FUN1
delay1:
; 1. #include "musiclist.h"
; 2. #include "ap_music.h"
; 3. unsigned int g_file_total;
; 4. char g_ID3InfoBuf[90];
; 5. #pragma memory=dataseg(APD_LIST_FUN1)
; 6. file_location_t list_location;
; 7. music_vars_t g_music_list_val;
; 8. #pragma memory=default
; 9.
; 10. Music_type_t CheckMusicType( char * filename );
; 11. void StoreID3toIDM( bool mode,unsigned int FileNum,file_location_t *location,int langid);
; 12. #pragma codeseg(APC_LIST_FUN1)
; 13.
; 14. void delay1(void)
; 15. {
PUSH BC
PUSH DE
PUSH IX
; 16. int i,j=0;
; 17. for(i=0;i<1000;i++) {;}
LD DE,0
?0003:
LD BC,33768
LD L,E
LD H,D
LD A,128
XOR H
LD H,A
SBC HL,BC
JR NC,?0002
?0004:
INC DE
JR ?0003
?0002:
; 18. j++;
; 19. }
POP IX
POP DE
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
main:
; 20.
; 21. int main(int param)
; 22. {
PUSH BC
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH DE
LD HL,65514
ADD HL,SP
LD SP,HL
; 23. int result;
; 24. unsigned int file_num=0;
; 25. unsigned int file_total_flash=0;
; 26. unsigned int file_total_card=0;
; 27. char *start_pointer = (char *)IDMStartAddress;
LD (IX-20),0
LD (IX-19),64
; 28. handle TempFileHandle;
; 29. BYTE MusicType;
; 30. ID3Info_t ID3List;
; 31. BYTE FlashDiskState = 0; //flash 磁盘状态
; 32. BYTE CardDiskState = 0; //插卡磁盘状态
; 33. BYTE DiskType;
; 34. /*
; 35. BYTE IO00Bak = input8(0x00);
; 36. BYTE IO70Bak = input8(0x70);
; 37. //////////////////////// MCU 48M
; 38. output8(0x70, input8(0x70)&0xbf|0xb8); //mcu pll enable & 48mhz
; 39. delay1();
; 40. output8(0x00, input8(0x00)&0xef|0x20); //select mcu pll
; 41. delay1();
; 42. ///////////////////////
; 43. */
; 44. output8(0x4e,input8(0x4e)|0x08);
IN A,(78)
SET 3,A
OUT (78),A
; 45. DRV_ActiveUD(0,MODE_SLOW);
LD C,1
LD E,0
CALL LWRD DRV_ActiveUD
; 46. //装文件系统 //install file system
; 47. if ( DRV_ActiveDrive('C',MODE_SLOW) ) //flash ok
LD IY,0
XOR A
LD (IX-16),A
LD (IX-15),A
LD (IX-18),A
LD (IX-17),A
LD (IX-22),A
LD (IX-23),A
LD C,1
LD E,67
CALL LWRD DRV_ActiveDrive
OR A
JR Z,?0007
?0006:
; 48. {
; 49. FlashDiskState = 1;
LD (IX-22),1
?0007:
; 50. }
; 51.
; 52. if (DRV_DetectUD(1) == 0x20)
LD E,1
CALL LWRD DRV_DetectUD
CP 32
JR NZ,?0011
?0008:
; 53. { //有卡
; 54. DRV_ActiveUD(1,MODE_SLOW);
LD C,1
LD E,C
CALL LWRD DRV_ActiveUD
; 55. if (DRV_ActiveDrive('H', MODE_SLOW)) //card ok
LD C,1
LD E,72
CALL LWRD DRV_ActiveDrive
OR A
JR Z,?0011
?0010:
; 56. {
; 57. CardDiskState = 1;
LD (IX-23),1
?0011:
?0009:
; 58. }
; 59. }
; 60. if(FlashDiskState == 0 && CardDiskState == 0) //磁盘都错误就直接返回
XOR A
OR (IX-22)
JR NZ,?0013
OR (IX-23)
JR NZ,?0013
?0015:
?0014:
?0012:
; 61. return 0;
LD L,A
LD H,A
JP LWRD ?0051
?0013:
; 62. else if(FlashDiskState ==1)
LD B,(IX-22)
DEC B
JR NZ,?0017
?0016:
; 63. DiskType = 'C';
LD (IX-24),67
; 64. else
JR ?0018
?0017:
; 65. DiskType = 'H';
LD (IX-24),72
?0018:
; 66.
; 67. output8(0x4e,input8(0x4e)|0x08);
IN A,(78)
SET 3,A
OUT (78),A
?0019:
; 68. // while ( GetSysMsg() != NULL ) {};
; 69. //安装ud驱动 //install ud driver
; 70. // res_fp = ResOpen("ui30.res");
; 71. // SetBackgdColor(Color_BLACK_def);
; 72. // SetPenColor(Color_WHITE_def);
; 73.
; 74. BuildAnotherList:
; 75.
; 76. ID3List.TIT2_length = 30;
LD (IX-14),30
; 77. ID3List.TPE1_length = 30;
LD (IX-11),30
; 78. ID3List.TALB_length = 30;
LD (IX-8),30
; 79. ID3List.TENC_length = 0;
LD (IX-5),0
; 80. ID3List.TIT2_buffer = & g_ID3InfoBuf[0]; //标题
LD (IX-13),LOW(g_ID3InfoBuf)
LD (IX-12),HIGH(g_ID3InfoBuf)
; 81. ID3List.TPE1_buffer = & g_ID3InfoBuf[30]; //艺术家
LD (IX-10),LOW(g_ID3InfoBuf+30)
LD (IX-9),HIGH(g_ID3InfoBuf+30)
; 82. ID3List.TALB_buffer = & g_ID3InfoBuf[60]; //专辑
LD (IX-7),LOW(g_ID3InfoBuf+60)
LD (IX-6),HIGH(g_ID3InfoBuf+60)
; 83. ID3List.TENC_buffer = & g_ID3InfoBuf[90];
LD (IX-4),LOW(g_ID3InfoBuf+90)
LD (IX-3),HIGH(g_ID3InfoBuf+90)
; 84.
; 85. FSELInit(FSEL_TYPE_MUSIC, FSEL_ALL_SEQUENCE, FSEL_TYPE_COMMONDIR,DiskType);//初始化文件选择器
LD L,(IX-24)
PUSH HL
LD C,0
PUSH BC
LD E,C
LD A,BYTE3 fselInit
LD HL,LWRD fselInit
CALL LWRD ?BANK_CALL_DIRECT_L08
POP AF
POP AF
; 86.
; 87. FS_FRemove(TIT2FileName); //删除原来列表
LD DE,?0020
CALL LWRD FS_FRemove
; 88. FS_FRemove(TPE1FileName); //删除原来列表
LD DE,?0021
CALL LWRD FS_FRemove
; 89. FS_FRemove(TALBFileName); //删除原来列表
LD DE,?0022
CALL LWRD FS_FRemove
; 90. FS_FRemove(FILENAMELSIT); //删除原来列表
LD DE,?0023
CALL LWRD FS_FRemove
?0025:
; 91.
; 92. // TIT2FileHandle = FS_FCreate(TIT2FileName); //因为TIT2FileHandle用到IDM LOW, FS_FCreate 会用到IDM LOW 作为buf,所以先创建
; 93.
; 94. while(FSELGetNext(list_location.filename)) //找到文件
LD DE,list_location+26
LD A,BYTE3 fselGetNextFile
LD HL,LWRD fselGetNextFile
CALL LWRD ?BANK_CALL_DIRECT_L08
INC L
DEC L
JP Z,?0024
?0026:
; 95. {
; 96. output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
IN A,(78)
SET 3,A
OUT (78),A
; 97. fselGetLocation(&list_location);
LD DE,list_location
LD A,BYTE3 fselGetLocation
LD HL,LWRD fselGetLocation
CALL LWRD ?BANK_CALL_DIRECT_L08
; 98. MusicType = CheckMusicType(list_location.filename);
LD DE,list_location+26
LD A,BYTE3 CheckMusicType
LD HL,LWRD CheckMusicType
CALL LWRD ?BANK_CALL_DIRECT_L08
; 99. switch (MusicType)
LD A,L
CP 2
JR C,?0032
CP 5
JR NC,?0032
?0028:
; 100. {
; 101. case Music_WMA: //WMA 的ID3 信息
; 102. case Music_WMV:
; 103. case Music_ASF:
; 104. if (wmaGetTAGInfo(list_location.filename, &ID3List))
LD HL,10
ADD HL,SP
LD C,L
LD B,H
LD DE,list_location+26
LD A,BYTE3 wmaGetTAGInfo
LD HL,LWRD wmaGetTAGInfo
CALL LWRD ?BANK_CALL_DIRECT_L08
INC L
DEC L
JR Z,?0036
?0029:
; 105. {
; 106. unitochar(g_ID3InfoBuf, 30, (char)param); //WMA Tag(unicode) change to ASCII & GB2312
LD L,(IX-2)
PUSH HL
LD BC,30
CALL LWRD ?0102
POP AF
; 107. unitochar(&g_ID3InfoBuf[30], 30, (char)param);
LD L,(IX-2)
PUSH HL
LD BC,30
LD DE,g_ID3InfoBuf+30
CALL LWRD ?0103
POP AF
; 108. unitochar(&g_ID3InfoBuf[60], 30, (char)param);
LD L,(IX-2)
PUSH HL
LD BC,30
LD DE,g_ID3InfoBuf+60
CALL LWRD ?0103
POP AF
; 109. }
; 110. else
JR ?0027
?0030:
; 111. {
; 112. g_ID3InfoBuf[0] = 0x0;
?0031:
; 113. }
; 114. break;
?0032:
CP 1
JR NZ,?0036
; 115.
; 116. case Music_MP3:
; 117. if (mp3GetID3Info(list_location.filename, & ID3List, param))
LD L,(IX-2)
LD H,(IX-1)
PUSH HL
LD HL,12
ADD HL,SP
LD C,L
LD B,H
LD DE,list_location+26
LD A,BYTE3 mp3GetID3Info
LD HL,LWRD mp3GetID3Info
CALL LWRD ?BANK_CALL_DIRECT_L08
POP AF
INC L
DEC L
JR NZ,?0027
?0033:
; 118. {
; 119. // strcpy(g_ID3InfoBuf, & g_ID3InfoBuf[0]);
; 120. // strcat(g_ID3InfoBuf, " ");
; 121. // strcat(g_ID3InfoBuf, & g_ID3InfoBuf[30]);
; 122. // strcat(g_ID3InfoBuf, " ");
; 123. // strcat(g_ID3InfoBuf, & g_ID3InfoBuf[60]);
; 124. // strcat(g_ID3InfoBuf, " ");
; 125. }
; 126.
; 127. else
?0034:
; 128. {
; 129. g_ID3InfoBuf[0] = 0x0;
?0035:
; 130. }
; 131. break;
?0036:
; 132.
; 133. default:
; 134. g_ID3InfoBuf[0] = 0x0;
XOR A
LD (g_ID3InfoBuf),A
; 135. break;
?0027:
; 136. }
; 137.
; 138. if(file_num>480) //超出范围 15K 0x7c00-0x7fff IDM low 被文件系统用掉
PUSH IY
POP BC
LD HL,480
AND A
SBC HL,BC
JR C,?0024
?0037:
; 139. break;
?0038:
; 140.
; 141. if(g_ID3InfoBuf[0])
LD A,(g_ID3InfoBuf)
OR A
LD L,(IX-2)
LD H,(IX-1)
PUSH HL
LD HL,list_location
PUSH HL
JR Z,?0040
?0039:
; 142. StoreID3toIDM(1,file_num,&list_location,param);
LD E,1
JR ?0099
; 143. else
?0040:
; 144. StoreID3toIDM(0,file_num,&list_location,param);
LD E,A
?0099:
LD A,BYTE3 StoreID3toIDM
LD HL,LWRD StoreID3toIDM
CALL LWRD ?BANK_CALL_DIRECT_L08
POP HL
POP HL
?0041:
; 145. file_num++;
INC IY
JP LWRD ?0025
?0024:
; 146. } //while 循环
; 147. g_file_total=file_num; //记录总的文件个数
LD (g_file_total),IY
; 148. BankSwitch((unsigned long)SortStoreListToFile >> 16); //将排序存文件部分切为主bank
LD E,BYTE3 SortStoreListToFile
CALL LWRD BankSwitch
; 149. if(file_num!=0) //没有文件就不生成列表
LD A,IYL
OR IYH
JR Z,?0043
?0042:
; 150. SortStoreListToFile(start_pointer,file_num); //按关键字排序并将排序后的列表写到列表文件
PUSH IY
POP BC
LD E,(IX-20)
LD D,(IX-19)
LD A,BYTE3 SortStoreListToFile
LD HL,LWRD SortStoreListToFile
CALL LWRD ?BANK_CALL_DIRECT_L08
?0043:
; 151. if(DiskType =='C') //保存Flash 中列表文件的个数
LD A,(IX-24)
CP 67
PUSH IY
POP HL
JR NZ,?0045
?0044:
; 152. file_total_flash = file_num;
LD (IX-16),L
LD (IX-15),H
; 153. else
JR ?0046
?0045:
; 154. file_total_card = file_num; //保存插卡中列表文件个数
LD (IX-18),L
LD (IX-17),H
?0046:
; 155.
; 156. if(DiskType =='C' && CardDiskState ==1)
CP 67
JR NZ,?0048
LD B,(IX-23)
DEC B
JR NZ,?0048
?0050:
?0049:
?0047:
; 157. {
; 158. file_num = 0;
; 159. DiskType = 'H';
; 160. start_pointer = (char *)IDMStartAddress; //指针重新赋值
LD (IX-20),B
LD (IX-19),64
LD IY,0
LD (IX-24),72
; 161. goto BuildAnotherList;
JP LWRD ?0019
?0048:
; 162. }
; 163.
; 164. VMRead(&g_music_list_val, VM_AP_MUSIC,sizeof(g_music_list_val)); //将播放列表数据写到VM
LD HL,95
PUSH HL
LD BC,4096
LD DE,g_music_list_val
CALL LWRD VMRead
POP HL
; 165. g_music_list_val.file_list_total_flash = file_total_flash;
LD L,(IX-16)
LD H,(IX-15)
LD (g_music_list_val+86),HL
; 166. g_music_list_val.file_list_total_card = file_total_card;
LD L,(IX-18)
LD H,(IX-17)
LD (g_music_list_val+88),HL
; 167. g_music_list_val.file_list_num = 0; //将原来播放序号清0
LD HL,0
LD (g_music_list_val+90),HL
; 168. VMWrite(& g_music_list_val, VM_AP_MUSIC);
LD BC,4096
LD DE,g_music_list_val
CALL LWRD VMWrite
; 169. /*
; 170. output8(0x00,IO00Bak);
; 171. delay1();
; 172. output8(0x70,IO00Bak);
; 173. delay1();
; 174. */
; 175. return file_num;
PUSH IY
POP HL
; 176. }
?0051:
LD SP,IX
POP IX
POP IY
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
?0102:
LD DE,g_ID3InfoBuf
?0103:
LD A,BYTE3 unitochar
LD HL,LWRD unitochar
JP LWRD ?BANK_CALL_DIRECT_L08
StoreID3toIDM:
; 177.
; 178. //向IDM 存储ID3 信息
; 179. void StoreID3toIDM( bool mode,unsigned int FileNum,file_location_t *location, int langid)
; 180. {
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH BC
PUSH DE
PUSH AF
PUSH AF
PUSH AF
; 181. BYTE IO05bak = input8(0x05);
IN A,(5)
LD (IX-5),A
; 182. BYTE NameNum;
; 183. char *IDMaddress = (char *)(FileNum*OneFileInfor+IDMStartAddress); // IDM 中存储的起始地址
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -