📄 basal_fmradio.s01
字号:
LD A,B
XOR H
LD H,A
SBC HL,BC
JP NC,?0000
?0065:
; 158. {
; 159. 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,?0068
?0067:
; 160. k++;
INC (IX-8)
?0068:
; 161. if (k == m_FMPlaystatus.station)
LD A,(m_FMPlaystatus+3)
LD B,A
LD A,(IX-8)
CP B
JR NZ,?0070
?0069:
; 162. {
; 163. m_FMStationTab[i] = m_FMPlaystatus.freq;
PUSH IY
POP HL
ADD HL,HL
LD BC,m_FMStationTab
ADD HL,BC
JP LWRD ?0138
; 164. break;
?0070:
; 165. }
; 166. }
; 167. }
INC IY
JR ?0064
?0063:
?0062:
; 168. else if (m_FMPlaystatus.station_count > 19)
LD A,(m_FMPlaystatus+4)
LD B,A
LD A,19
CP B
JP C,?0128
?0072:
; 169. return FALSE;
; 170. else //新的电台频率保存到电台表
?0073:
; 171. {
; 172. m_FMPlaystatus.station_count++;
LD HL,m_FMPlaystatus+4
INC (HL)
; 173. 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:
; 174. {
; 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 NZ,?0079
?0078:
; 176. {
; 177. 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
; 178. m_FMPlaystatus.station = i + 1;
PUSH IY
POP HL
INC L
LD A,L
JP LWRD ?0136
; 179. break;
?0079:
; 180. }
; 181. }
; 182. }
INC IY
JR ?0075
?0074:
?0071:
; 183.
; 184. return TRUE;
; 185. case MC_SETMODE:
?0080:
; 186. m_FMPlaystatus.mode = (Station_bank_t) param;
LD A,C
LD (m_FMPlaystatus+5),A
; 187. break;
JP LWRD ?0000
?0081:
; 188. case MC_SETVOLUME:
; 189. BankSwitch(address_24_of(FM_VolumeSet) >> 16);
LD HL,FM_VolumeSet
LD C,BYTE3 FM_VolumeSet
CALL LWRD ?0141
; 190. FM_VolumeSet((BYTE) param);
LD E,(IX-2)
CALL LWRD FM_VolumeSet
; 191. m_FMPlaystatus.volume = (BYTE) param;
LD A,(IX-2)
LD (m_FMPlaystatus+6),A
; 192. break;
JP LWRD ?0000
?0082:
; 193. case MC_BACKUP:
; 194. 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
; 195. memcpy((void *) (*(WORD *) (param + 2)), &m_FMPlaystatus, sizeof(fm_play_status_t));
LD C,9
LD L,(IX-2)
LD H,(IX-1)
INC HL
INC HL
LD E,(HL)
INC HL
LD D,(HL)
JP LWRD ?0132
; 196. break;
?0083:
; 197.
; 198. case MC_RESTORE:
; 199. 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
; 200. memcpy(&m_FMPlaystatus, (void *) (*(WORD *) (param + 2)), sizeof(fm_play_status_t));
LD C,9
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
; 201. break;
?0084:
; 202.
; 203. case MC_GETSTATUS:
; 204. BankSwitch(address_24_of(FM_GetStatus) >> 16);
LD HL,FM_GetStatus
LD C,BYTE3 FM_GetStatus
CALL LWRD ?0141
; 205. FM_GetStatus(&d_FMStatus);
LD DE,d_FMStatus
CALL LWRD FM_GetStatus
; 206. m_FMPlaystatus.freq=d_FMStatus.FM_CurrentFreq; //rda chenggangdeng
LD HL,(d_FMStatus+1)
LD (m_FMPlaystatus+1),HL
; 207. m_FMPlaystatus.stereo_status = d_FMStatus.FM_Stereo_Status;
LD A,(d_FMStatus)
LD (m_FMPlaystatus+7),A
; 208. k=0;
; 209. //当前电台频率值和电台表中某一频率差距小于150KHZ,此电台和此电台表对应
; 210. for(i=0;i<20;i++)
LD (IX-8),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:
; 211. {
; 212. m_FMPlaystatus.station=0;
XOR A
LD (m_FMPlaystatus+3),A
; 213. 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:
; 214. {
; 215. k++;
INC (IX-8)
; 216. if(abs(m_FMPlaystatus.freq-m_FMStationTab[i])<1)
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,32769
LD A,B
XOR H
LD H,A
SBC HL,BC
JR NC,?0092
?0091:
; 217. {
; 218. m_FMPlaystatus.station=k;
LD A,(IX-8)
LD (m_FMPlaystatus+3),A
; 219. break;
JR ?0085
?0092:
?0090:
INC IY
JR ?0086
?0085:
; 220. }
; 221. }
; 222. }
; 223. memcpy((fm_play_status_t *) param, &m_FMPlaystatus, sizeof(fm_play_status_t));
LD BC,9
LD E,(IX-2)
LD D,(IX-1)
?0132:
LD HL,m_FMPlaystatus
JR ?0121
; 224. break;
?0093:
; 225. case MC_GETTABLE:
; 226. memcpy((WORD *) param, &m_FMStationTab[0], 20);
LD BC,20
LD E,(IX-2)
LD D,(IX-1)
LD HL,m_FMStationTab
?0121:
LDIR
; 227. break;
JP LWRD ?0000
?0094:
; 228. case MC_DELONE:
; 229. if (m_FMPlaystatus.station == 0)
LD A,(m_FMPlaystatus+3)
OR A
JR NZ,?0096
?0095:
; 230. return FALSE;
?0128:
LD L,0
JP LWRD ?0114
?0096:
; 231. //m_FMStationTab[m_FMPlaystatus.station-1]=0;
; 232. for (k = m_FMPlaystatus.station; k < m_FMPlaystatus.station_count + 1; k++)
LD (IX-8),A
?0098:
LD BC,(m_FMPlaystatus+4)
LD B,0
INC BC
LD L,(IX-8)
LD H,0
OR 128
SBC HL,BC
JP PO,?0115
XOR H
?0115:
JP P,?0097
?0099:
; 233. {
; 234. m_FMStationTab[k - 1] = m_FMStationTab[k];
LD L,(IX-8)
LD H,0
ADD HL,HL
LD BC,m_FMStationTab-2
ADD HL,BC
PUSH HL
LD L,(IX-8)
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-8)
JR ?0098
?0097:
; 235. }
; 236. 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
; 237. m_FMPlaystatus.station_count--;
LD HL,m_FMPlaystatus+4
DEC (HL)
; 238. m_FMPlaystatus.station = 0;
?0136:
LD (m_FMPlaystatus+3),A
; 239. return TRUE;
JR ?0000
; 240. case MC_DELALL:
?0101:
; 241. 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:
; 242. {
; 243. 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:
; 244. }
; 245. m_FMPlaystatus.station = 0;
XOR A
LD (m_FMPlaystatus+3),A
; 246. m_FMPlaystatus.station_count = 0;
LD (m_FMPlaystatus+4),A
; 247. break;
JR ?0000
?0106:
; 248. case MC_MUTE: //静音
; 249. BankSwitch(address_24_of(FM_MUTE) >> 16);
LD HL,FM_MUTE
LD C,BYTE3 FM_MUTE
CALL LWRD ?0141
?0108:
; 250. while (!(k = FM_MUTE(param)))
LD E,(IX-2)
CALL LWRD FM_MUTE
OR A
JR NZ,?0000
?0109:
; 251. {
; 252. output8(0x4e, input8(0x4e) | 0x8);
IN A,(78)
SET 3,A
OUT (78),A
; 253. FM_GetStatus(&d_FMStatus);
LD DE,d_FMStatus
CALL LWRD FM_GetStatus
; 254. }
; 255.
; 256. break;
JR ?0108
?0107:
?0110:
; 257. case MC_CLOSE:
; 258. BankSwitch(address_24_of(FM_Standby) >> 16);
LD HL,FM_Standby
LD C,BYTE3 FM_Standby
CALL LWRD ?0141
; 259. FM_Exit(); //防止退出FM菜单,POP声
CALL LWRD FM_Exit
; 260. FM_Standby();
CALL LWRD FM_Standby
; 261. // FM_Exit();
; 262. break;
JR ?0000
?0111:
; 263. case MC_GETFREQ:
; 264. *(uint *) param = m_FMPlaystatus.freq;
LD L,C
LD H,B
?0138:
LD BC,(m_FMPlaystatus+1)
LD (HL),C
INC HL
LD (HL),B
; 265. break;
JR ?0000
?0112:
; 266. case MC_SETFREQ:
; 267. m_FMPlaystatus.freq = param;
LD (m_FMPlaystatus+1),BC
; 268. break;
?0113:
; 269. default:
; 270. break;
?0000:
; 271. }
; 272.
; 273. return TRUE;
LD L,1
; 274. }
?0114:
LD SP,IX
POP IX
POP IY
JP LWRD ?BANK_FAST_LEAVE_L08
?0140:
LD B,0
LD A,16
CALL LWRD ?SL_RSH_L03
LD E,L
CALL LWRD BankSwitch
LD HL,(m_FMPlaystatus+1)
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,16
ADD HL,BC
RET
?0141:
LD B,0
LD A,16
CALL LWRD ?SL_RSH_L03
LD E,L
CALL LWRD BankSwitch
RET
; 275.
RSEG RCODE
m_FMStationTab:
DEFS 40
m_FMPlaystatus:
DEFS 9
d_FMStatus:
DEFS 3
disable_hosc:
DEFS 1
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -