📄 basal_fmradio.s01
字号:
NAME basal_fmradio(17)
RSEG MOD_BS_FMRADIO(0)
RSEG RCODE(0)
EXTERN BankSwitch
EXTERN FM_Exit
EXTERN FM_GetStatus
EXTERN FM_Init
EXTERN FM_MUTE
EXTERN FM_Search
EXTERN FM_SetFreq
EXTERN FM_Standby
EXTERN FM_VolumeSet
EXTERN abs
PUBLIC d_FMStatus
PUBLIC fmSendCommand
PUBLIC m_FMPlaystatus
PUBLIC m_FMStationTab
EXTERN ?CLZ80B_4_04_L00
EXTERN ?SL_RSH_L03
EXTERN ?C_V_SWITCH_L06
EXTERN ?BANK_CALL_DIRECT_L08
EXTERN ?BANK_FAST_LEAVE_L08
RSEG MOD_BS_FMRADIO
fmSendCommand:
; 1. /*
; 2. *******************************************************************************
; 3. * ACTOS AP
; 4. * FM tunner basal module implementation
; 5. *
; 6. * (c) Copyright Actions Co,Ld.
; 7. *
; 8. * $Id: basal_fmradio.c,v 1.1.1.1 2006/05/22 03:24:00 selina Exp $
; 9. *******************************************************************************
; 10. */
; 11. #include "actos.h"
; 12. #include "fmradio.h"
; 13. //-----basal module ----
; 14. #pragma memory=dataseg(RCODE)
; 15. WORD m_FMStationTab[20]; //电台频率对照表(注:频率范围87M-108M 以K为精度要三位数,但由于最高位都是1,所以就可不记录,只记中低位就可以了).
; 16. fm_play_status_t m_FMPlaystatus; //当前电台信息
; 17. FMStatus_Tab_t d_FMStatus; //从FM硬件读取的当前频率和声道信息
; 18. #pragma memory=default
; 19.
; 20. #pragma codeseg(MOD_BS_FMRADIO)
; 21.
; 22.
; 23. BOOL fmSendCommand(BYTE cmd, int param)
; 24. {
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH BC
PUSH DE
PUSH AF
; 25. int i;
; 26. uchar k;
; 27.
; 28. switch(cmd)
CALL LWRD ?C_V_SWITCH_L06
DEFW 18
DEFB 1
DEFB 2
DEFB 4
DEFB 7
DEFB 9
DEFB 10
DEFB 11
DEFB 12
DEFB 17
DEFB 18
DEFB 64
DEFB 68
DEFB 69
DEFB 83
DEFB 85
DEFB 86
DEFB 131
DEFB 132
DEFW ?0000
DEFW ?0093
DEFW ?0084
DEFW ?0101
DEFW ?0094
DEFW ?0080
DEFW ?0083
DEFW ?0082
DEFW ?0081
DEFW ?0112
DEFW ?0111
DEFW ?0106
DEFW ?0060
DEFW ?0059
DEFW ?0034
DEFW ?0003
DEFW ?0057
DEFW ?0110
DEFW ?0001
?0001:
; 29. {
; 30. case MC_OPEN:
; 31. BankSwitch(address_24_of(FM_Init) >> 16);
LD HL,FM_Init
LD C,BYTE3 FM_Init
CALL LWRD ?0139
; 32. return FM_Init(m_FMPlaystatus.mode,(BYTE)param);
LD DE,(m_FMPlaystatus+5)
CALL LWRD FM_Init
JP LWRD ?0126
; 33. case MC_PLAY:
?0002:
; 34. BankSwitch(address_24_of(FM_SetFreq) >> 16);
; 35. FM_SetFreq(m_FMPlaystatus.freq);
; 36. break;
?0003:
; 37.
; 38. case MC_STEP:
; 39. if(m_FMPlaystatus.station_count==0)return FALSE;
LD A,(m_FMPlaystatus+4)
OR A
JP Z,?0128
?0004:
?0005:
; 40. k=0;
LD (IX-6),0
; 41. switch(param)
LD A,1
XOR C
OR B
JR NZ,?0020
?0007:
; 42. {
; 43. case UP: //找到下一电台频率
; 44. if(m_FMPlaystatus.station==m_FMPlaystatus.station_count)m_FMPlaystatus.station=0;
LD A,(m_FMPlaystatus+4)
LD B,A
LD A,(m_FMPlaystatus+3)
CP B
JR NZ,?0009
?0008:
XOR A
LD (m_FMPlaystatus+3),A
?0009:
; 45. m_FMPlaystatus.station++;
LD HL,m_FMPlaystatus+3
INC (HL)
; 46. for(i=0;i<20;i++)
LD IY,0
?0011:
LD BC,32788
PUSH IY
POP HL
LD A,B
XOR H
LD H,A
SBC HL,BC
JR NC,?0010
?0012:
; 47. {
; 48. if(m_FMStationTab[i]!=0)
PUSH IY
POP HL
ADD HL,HL
LD BC,m_FMStationTab
ADD HL,BC
LD A,(HL)
INC HL
OR (HL)
JR Z,?0017
?0014:
; 49. {
; 50. k++;
INC (IX-6)
; 51. if(k==m_FMPlaystatus.station)break;
LD A,(m_FMPlaystatus+3)
LD B,A
LD A,(IX-6)
CP B
JR Z,?0010
?0016:
?0017:
?0015:
INC IY
JR ?0011
?0010:
; 52. }
; 53.
; 54. }
; 55. if(i>=20) // 如没有找到电台,重新设置电台数
LD BC,32788
PUSH IY
POP HL
LD A,B
XOR H
LD H,A
SBC HL,BC
JR C,?0032
?0018:
; 56. {
; 57. m_FMPlaystatus.station_count = k - 1;
LD A,(IX-6)
ADD A,255
LD (m_FMPlaystatus+4),A
; 58. m_FMPlaystatus.station = 1;
LD A,1
JR ?0129
?0019:
; 59. }
; 60. break;
?0020:
LD A,C
OR B
JR NZ,?0032
; 61. case DOWN: //找到上一电台频率
; 62. if(m_FMPlaystatus.station==1)m_FMPlaystatus.station=m_FMPlaystatus.station_count+1;
LD A,(m_FMPlaystatus+3)
DEC A
JR NZ,?0022
?0021:
LD A,(m_FMPlaystatus+4)
INC A
LD (m_FMPlaystatus+3),A
?0022:
; 63. m_FMPlaystatus.station--;
LD HL,m_FMPlaystatus+3
DEC (HL)
; 64. for(i=0;i<20;i++)
LD IY,0
?0024:
LD BC,32788
PUSH IY
POP HL
LD A,B
XOR H
LD H,A
SBC HL,BC
JR NC,?0023
?0025:
; 65. {
; 66. if(m_FMStationTab[i]!=0)
PUSH IY
POP HL
ADD HL,HL
LD BC,m_FMStationTab
ADD HL,BC
LD A,(HL)
INC HL
OR (HL)
JR Z,?0030
?0027:
; 67. {
; 68. k++;
INC (IX-6)
; 69. if(k==m_FMPlaystatus.station)break;
LD A,(m_FMPlaystatus+3)
LD B,A
LD A,(IX-6)
CP B
JR Z,?0023
?0029:
?0030:
?0028:
INC IY
JR ?0024
?0023:
; 70. }
; 71. }
; 72. if(i>=20) // 如没有找到电台,重新设置电台数
LD BC,32788
PUSH IY
POP HL
LD A,B
XOR H
LD H,A
SBC HL,BC
JR C,?0032
?0031:
; 73. {
; 74. m_FMPlaystatus.station = m_FMPlaystatus.station_count = k +1;
LD B,(IX-6)
INC B
LD A,B
LD (m_FMPlaystatus+4),A
?0129:
LD (m_FMPlaystatus+3),A
?0032:
; 75. }
; 76. break;
?0033:
; 77. default:
; 78. break;
?0006:
; 79. }
; 80. m_FMPlaystatus.freq=m_FMStationTab[i];
PUSH IY
POP HL
ADD HL,HL
LD BC,m_FMStationTab
ADD HL,BC
LD B,(HL)
INC HL
LD H,(HL)
LD L,B
JP LWRD ?0118
; 81. BankSwitch(address_24_of(FM_SetFreq) >> 16);
; 82. FM_SetFreq(m_FMPlaystatus.freq);
; 83. return TRUE;
; 84.
; 85. case MC_STEPGRID:
?0034:
; 86. switch(param)
LD A,1
XOR C
OR B
JR NZ,?0047
?0036:
; 87. {
; 88. case UP:
; 89. if(((m_FMPlaystatus.freq+100)>0xa5e0+20)&&
; 90. (m_FMPlaystatus.mode==0))m_FMPlaystatus.freq=0x53d8;
LD HL,(m_FMPlaystatus+1)
LD BC,100
ADD HL,BC
LD C,L
LD B,H
LD HL,42484
AND A
SBC HL,BC
JR NC,?0038
LD A,(m_FMPlaystatus+5)
OR A
JR NZ,?0038
?0040:
?0039:
?0037:
LD HL,21464
JR ?0118
?0038:
; 91. else if(((m_FMPlaystatus.freq+100)>0x5f90+20)&&
; 92. (m_FMPlaystatus.mode==1))m_FMPlaystatus.freq=0x28e0;
LD HL,(m_FMPlaystatus+1)
LD BC,100
ADD HL,BC
LD C,L
LD B,H
LD HL,24484
AND A
SBC HL,BC
JR NC,?0043
LD A,(m_FMPlaystatus+5)
DEC A
JR NZ,?0043
?0045:
?0044:
?0042:
LD HL,10464
JR ?0118
; 93. else
?0043:
; 94. m_FMPlaystatus.freq+=100;
LD HL,m_FMPlaystatus+1
LD A,(HL)
ADD A,100
LD (HL),A
JR NC,?0057
INC HL
INC (HL)
?0046:
?0041:
; 95. break;
JR ?0057
?0047:
LD A,C
OR B
JR NZ,?0057
; 96. case DOWN:
; 97. if(((m_FMPlaystatus.freq-100)<0x53d8-20)&&
; 98. (m_FMPlaystatus.mode==0))m_FMPlaystatus.freq=0xa5e0;
LD HL,(m_FMPlaystatus+1)
LD BC,65436
ADD HL,BC
LD BC,21444
AND A
SBC HL,BC
JR NC,?0049
LD A,(m_FMPlaystatus+5)
OR A
JR NZ,?0049
?0051:
?0050:
?0048:
LD HL,42464
JR ?0118
?0049:
; 99. else if(((m_FMPlaystatus.freq-100)<0x28e0-20)&&
; 100. (m_FMPlaystatus.mode==1))m_FMPlaystatus.freq=0x5f90;
LD HL,(m_FMPlaystatus+1)
LD BC,65436
ADD HL,BC
LD BC,10444
AND A
SBC HL,BC
JR NC,?0054
LD A,(m_FMPlaystatus+5)
DEC A
JR NZ,?0054
?0056:
?0055:
?0053:
LD HL,24464
?0118:
LD (m_FMPlaystatus+1),HL
; 101. else
JR ?0057
?0054:
; 102. m_FMPlaystatus.freq-=100;
LD HL,m_FMPlaystatus+1
LD A,(HL)
ADD A,156
LD (HL),A
INC HL
LD A,(HL)
ADC A,255
LD (HL),A
?0057:
?0052:
; 103. break;
?0058:
; 104. default:
; 105. break;
?0035:
; 106. }
; 107. BankSwitch(address_24_of(FM_SetFreq) >> 16);
LD HL,FM_SetFreq
LD C,BYTE3 FM_SetFreq
CALL LWRD ?0140
; 108. FM_SetFreq(m_FMPlaystatus.freq);
LD DE,(m_FMPlaystatus+1)
CALL LWRD FM_SetFreq
; 109. return TRUE;
JP LWRD ?0000
; 110.
; 111.
; 112. case MC_SEARCH:
?0059:
; 113. FM_MUTE(SetMUTE);
LD E,1
CALL LWRD FM_MUTE
; 114. BankSwitch(address_24_of(FM_Search) >> 16);
LD HL,FM_Search
LD C,BYTE3 FM_Search
CALL LWRD ?0139
; 115. return FM_Search(m_FMPlaystatus.freq,param);
LD DE,(m_FMPlaystatus+1)
CALL LWRD FM_Search
?0126:
LD L,A
; 116.
; 117. case MC_SAVESTATION:
JP LWRD ?0114
?0060:
; 118. if(m_FMPlaystatus.station!=0) //当前电台在电台表中有保存的情况
LD A,(m_FMPlaystatus+3)
OR A
JR Z,?0062
?0061:
; 119. {
; 120. k=0;
; 121. for(i=0;i<20;i++)
LD (IX-6),0
LD IY,0
?0064:
LD BC,32788
PUSH IY
POP HL
LD A,B
XOR H
LD H,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -