📄 basal_fmradio.s01
字号:
SBC HL,BC
JP NC,?0000
?0065:
; 122. {
; 123. if(m_FMStationTab[i]!=0)k++;
PUSH IY
POP HL
ADD HL,HL
LD BC,m_FMStationTab
ADD HL,BC
LD A,(HL)
INC HL
OR (HL)
JR Z,?0068
?0067:
INC (IX-6)
?0068:
; 124. if(k==m_FMPlaystatus.station)
LD A,(m_FMPlaystatus+3)
LD B,A
LD A,(IX-6)
CP B
JR NZ,?0070
?0069:
; 125. {
; 126. m_FMStationTab[i]=m_FMPlaystatus.freq;
PUSH IY
POP HL
ADD HL,HL
LD BC,m_FMStationTab
ADD HL,BC
JP LWRD ?0137
; 127. break;
?0070:
; 128. }
; 129. }
; 130. }
INC IY
JR ?0064
?0063:
?0062:
; 131. else if(m_FMPlaystatus.station_count>19)return FALSE;
LD A,(m_FMPlaystatus+4)
LD B,A
LD A,19
CP B
JP C,?0128
?0072:
; 132. else //新的电台频率保存到电台表
?0073:
; 133. {
; 134. m_FMPlaystatus.station_count++;
LD HL,m_FMPlaystatus+4
INC (HL)
; 135. for(i=0;i<20;i++)
LD IY,0
?0075:
LD BC,32788
PUSH IY
POP HL
LD A,B
XOR H
LD H,A
SBC HL,BC
JP NC,?0000
?0076:
; 136. {
; 137. 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 NZ,?0079
?0078:
; 138. {
; 139. m_FMStationTab[i]=m_FMPlaystatus.freq;
PUSH IY
POP HL
ADD HL,HL
ADD HL,BC
LD BC,(m_FMPlaystatus+1)
LD (HL),C
INC HL
LD (HL),B
; 140. m_FMPlaystatus.station=i+1;
PUSH IY
POP HL
INC L
LD A,L
JP LWRD ?0135
; 141. break;
?0079:
; 142. }
; 143. }
; 144. }
INC IY
JR ?0075
?0074:
?0071:
; 145.
; 146. return TRUE;
; 147. case MC_SETMODE:
?0080:
; 148. m_FMPlaystatus.mode=(Station_bank_t)param;
LD A,C
LD (m_FMPlaystatus+5),A
; 149. break;
JP LWRD ?0000
?0081:
; 150. case MC_SETVOLUME:
; 151. BankSwitch(address_24_of(FM_VolumeSet) >> 16);
LD HL,FM_VolumeSet
LD C,BYTE3 FM_VolumeSet
CALL LWRD ?0140
; 152. FM_VolumeSet((BYTE)param);
LD E,(IX-2)
CALL LWRD FM_VolumeSet
; 153. m_FMPlaystatus.volume=(BYTE)param;
LD A,(IX-2)
LD (m_FMPlaystatus+6),A
; 154. break;
JP LWRD ?0000
?0082:
; 155. case MC_BACKUP:
; 156. memcpy((void *)(*(WORD *)param),m_FMStationTab, 40);
LD BC,40
LD L,(IX-2)
LD H,(IX-1)
LD E,(HL)
INC HL
LD D,(HL)
LD HL,m_FMStationTab
LDIR
; 157. memcpy((void *)(*(WORD *)(param+2)),&m_FMPlaystatus, sizeof(fm_play_status_t));
LD C,8
LD L,(IX-2)
LD H,(IX-1)
INC HL
INC HL
LD E,(HL)
INC HL
LD D,(HL)
JP LWRD ?0131
; 158. break;
?0083:
; 159.
; 160. case MC_RESTORE:
; 161. memcpy(m_FMStationTab, (void *)(*(WORD *)param), 40);
LD BC,40
LD DE,m_FMStationTab
LD L,(IX-2)
LD H,(IX-1)
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
LDIR
; 162. memcpy(&m_FMPlaystatus,(void *)(*(WORD *)(param+2)), sizeof(fm_play_status_t));
LD C,8
LD DE,m_FMPlaystatus
LD L,(IX-2)
LD H,(IX-1)
INC HL
INC HL
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
JP LWRD ?0121
; 163. break;
?0084:
; 164.
; 165. case MC_GETSTATUS:
; 166. BankSwitch(address_24_of(FM_GetStatus) >> 16);
LD HL,FM_GetStatus
LD C,BYTE3 FM_GetStatus
CALL LWRD ?0140
; 167. FM_GetStatus(&d_FMStatus);
LD DE,d_FMStatus
CALL LWRD FM_GetStatus
; 168. m_FMPlaystatus.freq=d_FMStatus.FM_CurrentFreq;
LD HL,(d_FMStatus+1)
LD (m_FMPlaystatus+1),HL
; 169. m_FMPlaystatus.stereo_status=d_FMStatus.FM_Stereo_Status;
LD A,(d_FMStatus)
LD (m_FMPlaystatus+7),A
; 170. k=0;
; 171. //当前电台频率值和电台表中某一频率差距小于150KHZ,此电台和此电台表对应
; 172. for(i=0;i<20;i++)
LD (IX-6),0
LD IY,0
?0086:
LD BC,32788
PUSH IY
POP HL
LD A,B
XOR H
LD H,A
SBC HL,BC
JR NC,?0085
?0087:
; 173. {
; 174. m_FMPlaystatus.station=0;
XOR A
LD (m_FMPlaystatus+3),A
; 175. 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,?0092
?0089:
; 176. {
; 177. k++;
INC (IX-6)
; 178. if(abs(m_FMPlaystatus.freq-m_FMStationTab[i])<100)
PUSH IY
POP HL
ADD HL,HL
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
LD HL,(m_FMPlaystatus+1)
AND A
SBC HL,BC
EX DE,HL
LD A,BYTE3 abs
LD HL,LWRD abs
CALL LWRD ?BANK_CALL_DIRECT_L08
LD BC,32868
LD A,B
XOR H
LD H,A
SBC HL,BC
JR NC,?0092
?0091:
; 179. {
; 180. m_FMPlaystatus.station=k;
LD A,(IX-6)
LD (m_FMPlaystatus+3),A
; 181. break;
JR ?0085
?0092:
?0090:
INC IY
JR ?0086
?0085:
; 182. }
; 183. }
; 184. }
; 185. memcpy((fm_play_status_t *)param,&m_FMPlaystatus, sizeof(fm_play_status_t));
LD BC,8
LD E,(IX-2)
LD D,(IX-1)
?0131:
LD HL,m_FMPlaystatus
JR ?0121
; 186. break;
?0093:
; 187. case MC_GETTABLE:
; 188. memcpy((WORD *)param,&m_FMStationTab[0], 20);
LD BC,20
LD E,(IX-2)
LD D,(IX-1)
LD HL,m_FMStationTab
?0121:
LDIR
; 189. break;
JP LWRD ?0000
?0094:
; 190. case MC_DELONE:
; 191. if(m_FMPlaystatus.station==0)return FALSE;
LD A,(m_FMPlaystatus+3)
OR A
JR NZ,?0096
?0095:
?0128:
LD L,0
JP LWRD ?0114
?0096:
; 192. for(k=m_FMPlaystatus.station;k<m_FMPlaystatus.station_count+1;k++)
LD (IX-6),A
?0098:
LD BC,(m_FMPlaystatus+4)
LD B,0
INC BC
LD L,(IX-6)
LD H,0
OR 128
SBC HL,BC
JP PO,?0116
XOR H
?0116:
JP P,?0097
?0099:
; 193. {
; 194. m_FMStationTab[k-1]=m_FMStationTab[k];
LD L,(IX-6)
LD H,0
ADD HL,HL
LD BC,m_FMStationTab-2
ADD HL,BC
PUSH HL
LD L,(IX-6)
LD H,0
ADD HL,HL
LD BC,m_FMStationTab
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
POP HL
LD (HL),C
INC HL
LD (HL),B
INC (IX-6)
JR ?0098
?0097:
; 195. }
; 196. m_FMStationTab[m_FMPlaystatus.station_count-1]=0;
LD HL,(m_FMPlaystatus+4)
LD H,0
ADD HL,HL
LD BC,m_FMStationTab-2
ADD HL,BC
XOR A
LD (HL),A
INC HL
LD (HL),A
; 197. m_FMPlaystatus.station_count--;
LD HL,m_FMPlaystatus+4
DEC (HL)
; 198. m_FMPlaystatus.station=0;
?0135:
LD (m_FMPlaystatus+3),A
; 199. return TRUE;
JR ?0000
; 200. case MC_DELALL:
?0101:
; 201. for(i=0;i<20;i++)
LD IY,0
?0103:
LD BC,32788
PUSH IY
POP HL
LD A,B
XOR H
LD H,A
SBC HL,BC
JR NC,?0102
?0104:
; 202. {
; 203. m_FMStationTab[i]=0;
PUSH IY
POP HL
ADD HL,HL
LD BC,m_FMStationTab
ADD HL,BC
XOR A
LD (HL),A
INC HL
LD (HL),A
INC IY
JR ?0103
?0102:
; 204. }
; 205. m_FMPlaystatus.station=0;
XOR A
LD (m_FMPlaystatus+3),A
; 206. m_FMPlaystatus.station_count=0;
LD (m_FMPlaystatus+4),A
; 207. break;
JR ?0000
?0106:
; 208. case MC_MUTE: //静音
; 209. BankSwitch(address_24_of(FM_MUTE) >> 16);
LD HL,FM_MUTE
LD C,BYTE3 FM_MUTE
CALL LWRD ?0140
?0108:
; 210. while(!(k = FM_MUTE(param)))
LD E,(IX-2)
CALL LWRD FM_MUTE
OR A
JR NZ,?0000
?0109:
; 211. {
; 212. output8(0x4e,input8(0x4e)|0x8);
IN A,(78)
SET 3,A
OUT (78),A
; 213. FM_GetStatus(&d_FMStatus);
LD DE,d_FMStatus
CALL LWRD FM_GetStatus
; 214. }
; 215.
; 216. break;
JR ?0108
?0107:
?0110:
; 217. case MC_CLOSE:
; 218. BankSwitch(address_24_of(FM_Standby) >> 16);
LD HL,FM_Standby
LD C,BYTE3 FM_Standby
CALL LWRD ?0140
; 219. FM_Standby();
CALL LWRD FM_Standby
; 220. FM_Exit();
CALL LWRD FM_Exit
; 221. break;
JR ?0000
?0111:
; 222. case MC_GETFREQ:
; 223. *(uint *)param = m_FMPlaystatus.freq;
LD L,C
LD H,B
?0137:
LD BC,(m_FMPlaystatus+1)
LD (HL),C
INC HL
LD (HL),B
; 224. break;
JR ?0000
?0112:
; 225. case MC_SETFREQ:
; 226. m_FMPlaystatus.freq = param;
LD (m_FMPlaystatus+1),BC
; 227. break;
?0113:
; 228. default:
; 229. break;
?0000:
; 230. }
; 231.
; 232. return TRUE;
LD L,1
; 233. }
?0114:
LD SP,IX
POP IX
POP IY
JP LWRD ?BANK_FAST_LEAVE_L08
?0139:
LD B,0
LD A,16
CALL LWRD ?SL_RSH_L03
LD E,L
CALL LWRD BankSwitch
LD C,(IX-2)
RET
?0140:
LD B,0
LD A,16
CALL LWRD ?SL_RSH_L03
LD E,L
JP LWRD BankSwitch
; 234.
; 235.
; 236.
RSEG RCODE
m_FMStationTab:
DEFS 40
m_FMPlaystatus:
DEFS 8
d_FMStatus:
DEFS 3
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -