main.s01
来自「MP3 整个 SDK」· S01 代码 · 共 1,338 行 · 第 1/2 页
S01
1,338 行
NAME main(17)
RSEG CODE(0)
RSEG CSTR(0)
RSEG CONST(0)
RSEG UDATA0(0)
RSEG IDATA0(0)
RSEG CDATA0(0)
EXTERN AutoSearchHandle
EXTERN ClearScreen
EXTERN DRV_ActiveUD
PUBLIC FMStationTab
PUBLIC FMStatus
PUBLIC FMStatusJP
PUBLIC FMStatusUS
PUBLIC FMdeal
PUBLIC Freqtab
EXTERN GetBattery
EXTERN GetDefaultComval
PUBLIC MY_DUMP
EXTERN PutS
EXTERN ResClose
EXTERN ResOpen
EXTERN ResShowMultiString
EXTERN SearchHandle
EXTERN SetTextPos
EXTERN ShowFreqInFM
PUBLIC TimeCount
EXTERN UpdateScreen
PUBLIC Updateflag
EXTERN VMRead
EXTERN VMWrite
EXTERN ap_get_message
EXTERN ap_handle_hotkey
EXTERN ap_message_init
EXTERN ap_sleep
PUBLIC clrregion
EXTERN fmSendCommand
PUBLIC fmdataflag
PUBLIC g_comval
PUBLIC g_list
EXTERN itoa_4
PUBLIC main
PUBLIC radio_param
EXTERN res_fp
PUBLIC string
EXTERN ui_popup_list
EXTERN ui_show_batt
EXTERN ui_show_volfm
PUBLIC volmuteflag
PUBLIC volume_callback
EXTERN ?CLZ80B_4_04_L00
EXTERN ?S_V_SWITCH_L06
EXTERN ?BANK_CALL_DIRECT_L08
EXTERN ?BANK_FAST_LEAVE_L08
EXTERN ?STRCPY_L11
EXTERN ?MEMCMP_L11
RSEG CODE
volume_callback:
; 1. /*
; 2. *******************************************************************************
; 3. * ACTOS AP
; 4. * main ap of sdk 3.0
; 5. *
; 6. * (c) Copyright, Actions Co,Ld.
; 7. * All Right Reserved
; 8. *
; 9. * $Id: main.c,v 1.1.1.1 2006/05/22 03:24:00 selina Exp $
; 10. *******************************************************************************
; 11. */
; 12. #include "ap_radio.h"
; 13. //#include "mem.h"
; 14. #include "actos.h"
; 15.
; 16. #define OpenFMPower1() output8(0xf8,input8(0xf8)|0x02) //enable GPIO_E1
; 17. #define CloseFMPower1() output8(0xf8,input8(0xf8)&0xfd) //disable GPIO_E1
; 18. #define OpenFMPower2() output8(0xfa,input8(0xfa)&0xfd) //set GPIO_E1 o 0
; 19. #define CloseFMPower2() output8(0xfa,input8(0xfa)|0x02) //set GPIO_E1 to 1
; 20. int TimeCount;
; 21. FMRADIO_param_t radio_param;
; 22. //slider_t slider;
; 23. region_t clrregion;
; 24. //function_menu_t menu; //菜单结构体
; 25. pop_up_list_t g_list;
; 26. comval_t g_comval;
; 27. char Updateflag; //刷新标志
; 28. //电台频率对照表(注:频率范围87M-108M(US)或76M-90M(Japan),以K为精度要三位数,但由于最高位都是1,所以就可不记录,只记中低位就可以了).
; 29. WORD FMStationTab[40];
; 30. fm_play_status_t FMStatus; //当前电台信息,8 bytes
; 31. fm_play_status_t FMStatusUS; //US电台信息暂存,8 bytes
; 32. fm_play_status_t FMStatusJP; //Japan电台信息暂存,8bytes
; 33. char fmdataflag[3]; //第一次进FM标志,3 bytes
; 34. char Freqtab[10];
; 35.
; 36.
; 37.
; 38. const WORD string[] = {FMENU1, FMENU15, FMENU2, FMENU3, FMENU16, FMENU4, FMENU5,FMENU6}; //FMENU15:电台录音 by ccm
; 39. //函数定义
; 40. int SearchHandle(BYTE Direct); //自动搜索处理,Direct=10,NEXT,=20,LAST
; 41. int AutoSearchHandle(BYTE Direct);
; 42. int FMdeal(); //FM应用的处理
; 43. void ShowFreqInFM(); //FM主界面显示
; 44. bool Search_Show(FM_direct_t Direct); //自动搜台时的显示
; 45. bool volmuteflag=0; //静音标志
; 46. void volume_callback(int Vol) //音量设置的CALLBACK函数
; 47. {
PUSH BC
PUSH DE
; 48. //实时改变音量的值
; 49. fmSendCommand(MC_SETVOLUME,Vol);
LD C,E
LD B,D
LD E,64
CALL LWRD ?0169
; 50. }
POP HL
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
?0170:
LD E,12
?0169:
LD A,BYTE3 fmSendCommand
?0171:
LD HL,LWRD fmSendCommand
JP LWRD ?BANK_CALL_DIRECT_L08
MY_DUMP:
; 51.
; 52.
; 53. void MY_DUMP(char *string, int value)
; 54. {
PUSH BC
PUSH DE
PUSH AF
PUSH AF
PUSH AF
; 55. char dump_buf[6];
; 56. dump_buf[0] = ',';
LD HL,0
ADD HL,SP
LD (HL),44
; 57. SetTextPos(0, 16);
LD C,16
LD E,0
CALL LWRD SetTextPos
; 58. PutS((string), -1);
LD C,255
LD HL,6
ADD HL,SP
LD E,(HL)
INC HL
LD D,(HL)
CALL LWRD PutS
; 59. itoa_4((value), &dump_buf[1]);
LD HL,0
ADD HL,SP
LD BC,1
ADD HL,BC
LD C,L
LD B,H
LD HL,8
ADD HL,SP
LD E,(HL)
INC HL
LD D,(HL)
LD A,BYTE3 itoa_4
LD HL,LWRD itoa_4
CALL LWRD ?BANK_CALL_DIRECT_L08
; 60. dump_buf[5] = '>';
LD HL,5
ADD HL,SP
LD (HL),62
; 61.
; 62. PutS(dump_buf, 6);
LD C,6
LD HL,0
ADD HL,SP
EX DE,HL
CALL LWRD PutS
; 63. UpdateScreen(NULL);
LD DE,0
CALL LWRD UpdateScreen
?0003:
; 64. while( ap_get_message() != (AP_KEY_PLAY| AP_KEY_UP)) {;}
CALL LWRD ap_get_message
CP 33
JR NZ,?0003
?0004:
; 65. }
?0002:
LD HL,10
ADD HL,SP
LD SP,HL
JP LWRD ?BANK_FAST_LEAVE_L08
main:
; 66.
; 67. #define OpenFM()
; 68. int main(int param)
; 69. {
PUSH BC
PUSH IY
PUSH IX
PUSH DE
PUSH AF
; 70. int result;
; 71.
; 72. //Open VCCOUT for FM Module. by ccm
; 73. int i,j;
; 74. TimeCount=0;
LD HL,0
LD (TimeCount),HL
; 75. OpenFMPower1();
IN A,(248)
SET 1,A
OUT (248),A
; 76.
; 77. OpenFMPower2();
IN A,(250)
RES 1,A
OUT (250),A
; 78. for(i=0;i<599;i++)
ADD HL,SP
XOR A
LD (HL),A
INC HL
LD (HL),A
?0006:
LD BC,33367
DEC HL
LD D,(HL)
INC HL
LD H,(HL)
LD L,D
LD A,128
XOR H
LD H,A
SBC HL,BC
JR NC,?0005
?0007:
; 79. {
; 80. j = 50;
LD IX,50
?0010:
; 81. for(;j>0;j--) {;}
PUSH IX
POP BC
LD HL,0
OR 128
SBC HL,BC
JP PO,?0124
XOR H
?0124:
JP P,?0009
?0011:
; 82. }
DEC IX
JR ?0010
?0009:
LD HL,0
ADD HL,SP
INC (HL)
INC HL
JR NZ,?0006
INC (HL)
JR ?0006
?0005:
?0014:
; 83. // if(!DRV_Install("I2C_SLA.DRV",0)) while(1) {;}
; 84. //clear message queue for make sure delay 0.5s
; 85. while(ap_get_message() != 0) {;}
CALL LWRD ap_get_message
OR A
JR NZ,?0005
?0015:
?0013:
; 86. ap_sleep(1);
LD DE,1
LD A,BYTE3 ap_sleep
LD HL,LWRD ap_sleep
CALL LWRD ?BANK_CALL_DIRECT_L08
; 87.
; 88. res_fp=ResOpen("ui30.res"); //打开资源
LD DE,?0016
LD A,BYTE3 ResOpen
LD HL,LWRD ResOpen
CALL LWRD ?BANK_CALL_DIRECT_L08
LD (res_fp),HL
; 89. ASSERT(res_fp!=NULL); //问题报错,DEBUG时有效
; 90. //-------安装ud驱动------------
; 91. DRV_ActiveUD(0x00,MODE_SLOW);
LD C,1
LD E,0
CALL LWRD DRV_ActiveUD
; 92.
; 93. result=VMRead(&F_comval,VM_SYSTEM,sizeof(F_comval)); //读系统变量
LD HL,32
PUSH HL
LD BC,512
LD DE,g_comval
CALL LWRD VMRead
POP HL
; 94. ASSERT(result);
; 95. //check if valid
; 96. if(F_comval.magic != MAGIC_COMVAL) //第一次读,初始化
LD HL,57005
LD BC,(g_comval)
AND A
SBC HL,BC
JR Z,?0018
?0017:
; 97. {
; 98. DUMP_STRING("F_comval init-ed!");
; 99. //COMVAL_INIT(F_comval);
; 100. GetDefaultComval(&F_comval);
LD DE,g_comval
CALL LWRD GetDefaultComval
?0018:
; 101. }
; 102. ap_message_init(&F_comval); //系统消息(如RTC COUNTER)初始化
LD DE,g_comval
LD A,BYTE3 ap_message_init
LD HL,LWRD ap_message_init
CALL LWRD ?BANK_CALL_DIRECT_L08
; 103. result=VMRead(FMStationTab,VM_AP_RADIO,80+8*3+3); //长度重新计算
LD HL,107
PUSH HL
LD BC,8192
LD DE,FMStationTab
CALL LWRD VMRead
POP HL
; 104. ASSERT(result);
; 105. result=FMdeal();
LD A,BYTE3 FMdeal
LD HL,LWRD FMdeal
CALL LWRD ?BANK_CALL_DIRECT_L08
PUSH HL
POP IY
; 106. //保存变量
; 107. fmSendCommand(MC_BACKUP,(int)&radio_param);
LD BC,radio_param
LD E,68
CALL LWRD ?0169
; 108. if (result == RESULT_RECORD) //截获FM中所有Rec热键录音。
PUSH IY
POP HL
LD A,9
XOR L
OR H
JR NZ,?0020
?0019:
; 109. result = RESULT_FMREC_START;
LD IY,13
?0020:
; 110. if ((result != RESULT_FMREC_NOSTART)&&(result != RESULT_FMREC_START)) //非电台录音退出!for FM record by ccm
PUSH IY
POP HL
LD A,14
XOR L
OR H
JR Z,?0022
LD A,13
XOR L
OR H
JR Z,?0022
?0024:
?0023:
?0021:
; 111. {
; 112. fmSendCommand(MC_CLOSE,0);
LD BC,0
LD E,2
CALL LWRD ?0169
; 113. //Close VCCOUT. by ccm
; 114. CloseFMPower();
IN A,(223)
RES 1,A
SET 0,A
OUT (223),A
; 115. CloseFMPower2();
IN A,(250)
SET 1,A
OUT (250),A
; 116. CloseFMPower1();
IN A,(248)
RES 1,A
OUT (248),A
?0022:
; 117. }
; 118. VMWrite(FMStationTab,VM_AP_RADIO);
LD BC,8192
LD DE,FMStationTab
CALL LWRD VMWrite
; 119. ResClose(res_fp); //资源关闭
LD DE,(res_fp)
LD A,BYTE3 ResClose
LD HL,LWRD ResClose
CALL LWRD ?BANK_CALL_DIRECT_L08
; 120.
; 121. return result;
PUSH IY
POP HL
; 122. }
POP AF
POP AF
POP IX
POP IY
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
FMdeal:
; 123.
; 124. int FMdeal()
; 125. {
PUSH BC
PUSH DE
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
LD HL,65524
ADD HL,SP
LD SP,HL
; 126. int result=0,key;
; 127. char FMBand[3],buf[4]={"FM"};
LD HL,4
ADD HL,SP
EX DE,HL
LD HL,?0025
LD BC,4
LDIR
; 128. //标志:need_draw,重画 BandSwitch,频段切换 FirstWait,刚进AP
; 129. bool need_draw=TRUE,BandSwitch=TRUE,FirstWait=TRUE;
; 130. long i;
; 131. int k,h;
; 132. static char active=0; //进入菜单的选中号
; 133.
; 134.
; 135. //result=0;
; 136. if(memcmp(fmdataflag,buf,2)!=0)
LD IY,0
LD (IX-4),1
LD (IX-3),1
LD (IX-2),1
INC BC
INC BC
LD DE,fmdataflag
LD HL,4
ADD HL,SP
CALL LWRD ?MEMCMP_L11
LD A,L
OR H
JR Z,?0028
?0027:
; 137. {
; 138. for(k=0;k<40;k++)
XOR A
LD (IX-10),A
LD (IX-9),A
?0030:
LD BC,32808
LD L,(IX-10)
LD H,(IX-9)
LD A,B
XOR H
LD H,A
SBC HL,BC
JR NC,?0029
?0031:
; 139. {
; 140. FMStationTab[k]=0;
LD L,(IX-10)
LD H,(IX-9)
ADD HL,HL
LD BC,FMStationTab
ADD HL,BC
XOR A
LD (HL),A
INC HL
LD (HL),A
INC (IX-10)
JR NZ,?0030
INC (IX-9)
JR ?0030
?0029:
; 141. }
; 142. memcpy(fmdataflag,buf,3); //FM BUFFER标志赋初值
LD BC,3
LD DE,fmdataflag
LD HL,4
ADD HL,SP
LDIR
; 143. //US和JP暂存区赋初值
; 144. // FMStatusUS.freq=0x53d8;
; 145. FMStatusUS.freq=0x53d8;
LD HL,21464
LD (FMStatusUS+1),HL
; 146. FMStatusUS.mode=0;
XOR A
LD (FMStatusUS+5),A
; 147. FMStatusUS.volume=24;
LD A,24
LD (FMStatusUS+6),A
; 148. FMStatusUS.station=0;
XOR A
LD (FMStatusUS+3),A
; 149. FMStatusUS.station_count=0;
LD (FMStatusUS+4),A
; 150. FMStatusUS.stereo_status=1;
LD A,1
LD (FMStatusUS+7),A
; 151. FMStatusJP.freq=0x28E0;
LD HL,10464
LD (FMStatusJP+1),HL
; 152. FMStatusJP.mode=1;
LD (FMStatusJP+5),A
; 153. FMStatusJP.volume=24;
LD A,24
LD (FMStatusJP+6),A
; 154. FMStatusJP.station=0;
XOR A
LD (FMStatusJP+3),A
; 155. FMStatusJP.station_count=0;
LD (FMStatusJP+4),A
; 156. FMStatusJP.stereo_status=1;
LD A,1
LD (FMStatusJP+7),A
; 157. memcpy(&FMStatus,&FMStatusUS,sizeof(FMStatus));
LD C,8
LD DE,FMStatus
LD HL,FMStatusUS
LDIR
?0028:
?0034:
; 158. }
; 159.
; 160. //clear the message pool 清除“初始化...”过程中按下的键!
; 161. while(ap_get_message() != AP_KEY_NULL){;}
CALL LWRD ap_get_message
OR A
JR NZ,?0028
?0035:
; 162.
; 163. while(1)
?0033:
?0037:
; 164. {
; 165. if(BandSwitch) //初始化
XOR A
OR (IX-3)
JP Z,?0040
?0039:
; 166. {
; 167. //initial
; 168. if(FMStatus.mode==0)radio_param.param1=FMStationTab;
LD A,(FMStatus+5)
OR A
JR NZ,?0042
?0041:
LD HL,FMStationTab
JR ?0129
; 169. else
JR ?0043
?0042:
; 170. radio_param.param1=&FMStationTab[20];
LD HL,FMStationTab+40
?0129:
LD (radio_param),HL
?0043:
; 171. (fm_play_status_t *)radio_param.param2=&FMStatus;
LD HL,FMStatus
LD (radio_param+2),HL
; 172.
; 173. if(!fmSendCommand(MC_OPEN,SearchLevel)) //硬件错误提示
LD BC,5
LD E,1
CALL LWRD ?0169
INC L
DEC L
JR NZ,?0045
?0044:
; 174. {
; 175. ClearScreen(NULL);
LD E,L
LD D,L
CALL LWRD ClearScreen
; 176. ResShowMultiString(FMERROR,F_comval.langid,-1,8);
LD C,8
PUSH BC
LD C,255
PUSH BC
LD BC,(g_comval+12)
LD DE,399
LD A,BYTE3 ResShowMultiString
LD HL,LWRD ResShowMultiString
CALL LWRD ?BANK_CALL_DIRECT_L08
POP AF
POP AF
; 177. //UpdateScreen(NULL);
; 178. strcpy(fmdataflag," ");
LD DE,?0046
LD HL,fmdataflag
CALL LWRD ?STRCPY_L11
; 179. ap_sleep(3);
LD DE,3
LD A,BYTE3 ap_sleep
LD HL,LWRD ap_sleep
CALL LWRD ?BANK_CALL_DIRECT_L08
; 180. return RESULT_MAIN;
LD HL,10
; 181. }
JP LWRD ?0121
?0045:
; 182. fmSendCommand(MC_MUTE,SetMUTE);
LD BC,1
CALL LWRD ?0170
; 183. fmSendCommand(MC_RESTORE,(int)&radio_param);
LD BC,radio_param
LD E,69
CALL LWRD ?0169
; 184. fmSendCommand(MC_PLAY,0);
LD BC,0
LD E,4
CALL LWRD ?0169
; 185. fmSendCommand(MC_SETVOLUME,FMStatus.volume);
LD BC,(FMStatus+6)
LD B,0
LD E,64
CALL LWRD ?0169
; 186.
; 187. fmSendCommand(MC_GETSTATUS,(int)&FMStatus);
LD BC,FMStatus
LD E,131
CALL LWRD ?0169
; 188. BandSwitch=FALSE;
; 189. FirstWait=TRUE;
LD (IX-3),0
LD (IX-2),1
?0040:
; 190. }
; 191.
; 192. if(need_draw) //屏幕重画
XOR A
OR (IX-4)
JR Z,?0048
?0047:
; 193. {
; 194. ShowFreqInFM();
LD A,BYTE3 ShowFreqInFM
LD HL,LWRD ShowFreqInFM
CALL LWRD ?BANK_CALL_DIRECT_L08
; 195. need_draw=FALSE;
LD (IX-4),0
?0048:
; 196. }
; 197. if(FirstWait) //初次进入AP等待1.5S释放MUTE(静音)
XOR A
OR (IX-2)
JR Z,?0050
?0049:
; 198. {
; 199. FirstWait=FALSE;
; 200. ap_sleep(3);
LD DE,3
LD A,BYTE3 ap_sleep
LD HL,LWRD ap_sleep
CALL LWRD ?BANK_CALL_DIRECT_L08
; 201. // if(FMStatus.volume)
; 202. fmSendCommand(MC_MUTE,releaseMUTE);
LD BC,0
CALL LWRD ?0170
LD (IX-2),0
?0050:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?