📄 autosearchhandle.s01
字号:
POP AF
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
AutoSearchHandle:
; 218. /*
; 219. ********************************************************************************
; 220. * Description : 全自动搜索
; 221. *
; 222. * Arguments : Direct,Next或Last搜索.
; 223. *
; 224. * Returns : 如果有可识别的热键消息, 返回结果消息
; 225. 如果没有可识别的热键消息, 返回0
; 226. *
; 227. * Notes :
; 228. *
; 229. ********************************************************************************
; 230. */
; 231. int AutoSearchHandle(BYTE Direct)
; 232. {
PUSH BC
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH DE
PUSH AF
PUSH AF
PUSH AF
PUSH AF
; 233. int key;
; 234. bool need_draw = TRUE;
; 235. //BYTE Searchflag=1;
; 236. BYTE Search_Level = SearchLevel;
; 237. bool loop = TRUE;
; 238. BYTE Search_Loop = 2; //搜台的次数
; 239. BYTE temp;
; 240.
; 241. AutoTabNum = 0; // 全自动搜索,从极值开始.
XOR A
LD (AutoTabNum),A
; 242. fmSendCommand(MC_BACKUP, (int) &radio_param);
LD BC,radio_param
LD E,68
CALL LWRD ?0191
; 243. if (FMStatus.mode == 0)
LD (IX-8),1
LD (IX-7),3
LD (IX-6),1
LD (IX-5),2
LD A,(FMStatus+5)
OR A
LD A,(IX-2)
JR NZ,?0044
?0043:
; 244. {
; 245. if (Direct == 10) // US频段
CP 10
JR Z,?0186
?0045:
; 246. {
; 247. FMStatus.freq = 0x00;
; 248. }
; 249. else
?0046:
; 250. {
; 251. FMStatus.freq = 210;
LD HL,210
JR ?0178
?0047:
; 252. }
; 253. }
; 254. else
?0044:
; 255. { // JP频段
; 256. if (Direct == 10)
CP 10
JR NZ,?0050
?0049:
; 257. {
; 258. FMStatus.freq = 0;
?0186:
LD HL,0
JR ?0178
; 259. }
; 260. else
?0050:
; 261. {
; 262. FMStatus.freq = 140;
LD HL,140
?0178:
LD (FMStatus+1),HL
?0051:
?0048:
; 263. }
; 264. }
; 265.
; 266. temp = FMStatus.station_count;
LD A,(FMStatus+4)
LD (IX-4),A
?0053:
; 267. while (loop)
XOR A
OR (IX-6)
JP Z,?0052
?0054:
; 268. {
; 269. if (Direct != 0)
XOR A
OR (IX-2)
JP Z,?0118
?0055:
; 270. {
; 271. if (Direct == 10) //NEXT搜索处理
CP 10
JP NZ,?0058
?0057:
; 272. {
; 273. if(((FMStatus.freq+1)>210)&&(FMStatus.mode==0))
LD BC,(FMStatus+1)
INC BC
LD HL,210
AND A
SBC HL,BC
JR NC,?0060
LD A,(FMStatus+5)
OR A
JR NZ,?0060
?0062:
?0061:
?0059:
; 274. {
; 275. FMStatus.freq=0;
LD L,A
LD H,A
LD (FMStatus+1),HL
; 276. Search_Level--; // 以不同门限搜索.
DEC (IX-7)
; 277. Search_Loop--;
DEC (IX-5)
; 278. if (Search_Loop == 0)
OR (IX-5)
JR NZ,?0072
?0063:
; 279. {
; 280. loop = FALSE;
JR ?0183
; 281. }
; 282. else
?0064:
; 283. {
; 284. loop = RestartSearch(Search_Level);
?0065:
?0060:
; 285. }
; 286. }
; 287. else if(((FMStatus.freq+1)>140)&&(FMStatus.mode==1))
LD HL,140
AND A
SBC HL,BC
JR NC,?0068
LD A,(FMStatus+5)
DEC A
JR NZ,?0068
?0070:
?0069:
?0067:
; 288. {
; 289. FMStatus.freq=0;
LD L,A
LD H,A
LD (FMStatus+1),HL
; 290. Search_Level--;
DEC (IX-7)
; 291. Search_Loop--;
DEC (IX-5)
; 292. if (Search_Loop == 0)
OR (IX-5)
JR NZ,?0072
?0071:
; 293. {
; 294. loop = FALSE;
?0183:
LD (IX-6),H
; 295. }
; 296. else
JR ?0074
?0072:
; 297. {
; 298. loop = RestartSearch(Search_Level);
LD E,(IX-7)
LD A,BYTE3 RestartSearch
LD HL,LWRD RestartSearch
CALL LWRD ?BANK_CALL_DIRECT_L08
LD (IX-6),L
?0073:
; 299. }
; 300. }
; 301. else
JR ?0074
?0068:
; 302. FMStatus.freq+=1;
LD L,C
LD H,B
LD (FMStatus+1),HL
?0074:
?0066:
; 303. if (loop && Search_Show2(UP))
XOR A
OR (IX-6)
JP Z,?0118
LD E,1
LD A,BYTE3 Search_Show2
LD HL,LWRD Search_Show2
CALL LWRD ?BANK_CALL_DIRECT_L08
INC L
DEC L
JR Z,?0118
?0078:
?0077:
?0075:
; 304. {
; 305. ShowStationCount(AutoTabNum + 1);
; 306. key = TryPlayingHandle();
; 307. CleanStationCount();
CALL LWRD ?0193
; 308. need_draw = TRUE;
LD (IX-8),1
; 309. if (key == RESULT_RADIO) // 处理Play,mode键.
PUSH IY
POP HL
LD A,5
XOR L
OR H
JR Z,?0187
?0079:
; 310. {
; 311. key = RESULT_IGNORE;
; 312. loop = FALSE;
; 313. }
; 314. else
?0080:
; 315. {
; 316. if (key != RESULT_IGNORE && key != 0) // 处理热键.
LD A,48
XOR L
OR H
JR Z,?0118
LD A,L
OR H
JR Z,?0118
?0085:
?0084:
?0082:
; 317. {
; 318. loop = FALSE;
JR ?0180
?0083:
?0081:
?0076:
?0058:
; 319. }
; 320. }
; 321. }
; 322. }
; 323. else if (Direct == 20) //LAST搜索处理
CP 20
JR NZ,?0088
?0087:
; 324. {
; 325. if(((FMStatus.freq-1)<0)&&(FMStatus.mode==0))
?0092:
?0091:
?0089:
; 326. {
; 327. FMStatus.freq=0;
; 328. Search_Loop--;
; 329. if (Search_Loop == 0)
?0093:
; 330. {
; 331. loop = FALSE;
; 332. }
; 333. else
?0094:
; 334. {
; 335. loop = RestartSearch(Search_Level);
?0095:
?0090:
; 336. }
; 337. }
; 338. else if(((FMStatus.freq-1)<0)&&(FMStatus.mode==1))
?0100:
?0099:
?0097:
; 339. {
; 340. FMStatus.freq=0;
; 341. Search_Level--;
; 342. Search_Loop--;
; 343. if (Search_Loop == 0)
?0101:
; 344. {
; 345. loop = FALSE;
; 346. }
; 347. else
?0102:
; 348. {
; 349. loop = RestartSearch(Search_Level);
?0103:
; 350. }
; 351. }
; 352. else
?0098:
; 353. {
; 354. FMStatus.freq-=1;
LD HL,FMStatus+1
LD A,(HL)
ADD A,255
LD (HL),A
INC HL
LD A,(HL)
ADC A,255
LD (HL),A
?0104:
?0096:
; 355. }
; 356. if (loop && Search_Show2(DOWN))
XOR A
OR (IX-6)
JR Z,?0118
LD E,0
LD A,BYTE3 Search_Show2
LD HL,LWRD Search_Show2
CALL LWRD ?BANK_CALL_DIRECT_L08
INC L
DEC L
JR Z,?0118
?0108:
?0107:
?0105:
; 357. {
; 358. ShowStationCount(AutoTabNum + 1);
; 359. key = TryPlayingHandle();
; 360. CleanStationCount();
CALL LWRD ?0193
; 361. need_draw = TRUE;
LD (IX-8),1
; 362. if (key == RESULT_RADIO) // 处理Play,mode键.
PUSH IY
POP HL
LD A,5
XOR L
OR H
JR NZ,?0110
?0109:
; 363. {
; 364. key = RESULT_IGNORE;
; 365. loop = FALSE;
?0187:
LD IY,48
JR ?0180
; 366. }
; 367. else
?0110:
; 368. {
; 369. if (key != RESULT_IGNORE && key != 0) // 处理热键.
LD A,48
XOR L
OR H
JR Z,?0118
LD A,L
OR H
JR Z,?0118
?0115:
?0114:
?0112:
; 370. {
; 371. loop = FALSE;
?0180:
LD (IX-6),0
?0113:
?0111:
?0106:
JR ?0118
?0088:
; 372. }
; 373. }
; 374. }
; 375. }
; 376. else if (Direct == 50)
CP 50
JR NZ,?0118
?0117:
; 377. {
; 378. Direct = 0;
; 379. loop = 0;
; 380. key = 0;
LD (IX-2),0
LD (IX-6),0
LD IY,0
?0118:
?0116:
?0086:
?0056:
; 381. }
; 382. }
; 383.
; 384. if (loop && need_draw) //显示
XOR A
OR (IX-6)
JR Z,?0120
XOR A
OR (IX-8)
JR Z,?0120
?0122:
?0121:
?0119:
; 385. {
; 386. ShowFreqInFM2();
LD A,BYTE3 ShowFreqInFM2
LD HL,LWRD ShowFreqInFM2
CALL LWRD ?BANK_CALL_DIRECT_L08
; 387. need_draw = FALSE;
LD (IX-8),0
?0120:
; 388. }
; 389.
; 390. if (AutoTabNum >= 20) // 已搜到20个电台,正常退出.
LD A,(AutoTabNum)
CP 20
JR C,?0124
?0123:
; 391. loop = FALSE;
LD (IX-6),0
?0124:
; 392. if (loop)
XOR A
OR (IX-6)
JP Z,?0053
?0125:
; 393. {
; 394. key = ap_get_message();
CALL LWRD ap_get_message
LD C,A
LD B,0
PUSH BC
POP IY
; 395. switch (key)
LD A,29
XOR C
JP Z,?0053
; 396. {
; 397. bool Search_Flag = FALSE;
?0128:
; 398. case AP_MSG_STANDBY:
; 399. //do nothing
; 400. break;
?0129:
LD A,33
XOR C
JR Z,?0136
LD A,39
XOR C
JR NZ,?0130
?0136:
; 401. case AP_KEY_PLAY | AP_KEY_UP:
; 402. case AP_KEY_MODE | AP_KEY_UP: // 保存电台, 返回播放界面.
; 403. loop = FALSE;
; 404. key = RESULT_IGNORE;
LD (IX-6),B
LD IY,48
; 405. break;
JP LWRD ?0053
?0130:
; 406. default: //热键处理
; 407. key = ap_handle_hotkey(key);
PUSH IY
POP HL
LD E,L
CALL LWRD ap_handle_hotkey
LD C,A
PUSH BC
POP IY
; 408. if (key == RESULT_REDRAW)
LD A,46
XOR C
JR NZ,?0132
?0131:
; 409. need_draw = TRUE;
LD (IX-8),1
JP LWRD ?0053
?0132:
; 410. else if (key != 0)
PUSH IY
POP HL
LD A,L
OR H
JP Z,?0053
?0134:
; 411. {
; 412. loop = FALSE;
LD (IX-6),B
?0135:
?0133:
?0127:
?0126:
JP LWRD ?0053
?0052:
; 413. }
; 414. } // end switch(key)
; 415. } // end if(loop)
; 416. } // end while(loop)
; 417. if (AutoTabNum > 0)
LD A,(AutoTabNum)
OR A
JR Z,?0138
?0137:
; 418. {
; 419. memcpy(radio_param.param1, FMAutoTab, AutoTabNum * 2);
LD L,A
LD H,0
ADD HL,HL
LD C,L
LD A,C
LD B,H
LD DE,(radio_param)
LD HL,FMAutoTab
OR B
JR Z,?0176
LDIR
?0176:
; 420. //if(FMStatus.station_count < AutoTabNum)
; 421. if (temp < AutoTabNum) // 覆盖所有电台
LD A,(AutoTabNum)
LD B,A
LD A,(IX-4)
CP B
JR NC,?0140
?0139:
; 422. {
; 423. FMStatus.station_count = AutoTabNum;
LD A,B
JR ?0181
; 424. }
; 425. else
?0140:
; 426. {
; 427. if (key == 0)
PUSH IY
POP HL
LD A,L
OR H
JR NZ,?0143
?0142:
; 428. {
; 429. FMStatus.station_count = AutoTabNum;
LD A,B
LD (FMStatus+4),A
?0143:
; 430. }
; 431. if (key == RESULT_IGNORE) // 覆盖部分电台
LD A,48
XOR L
OR H
JR NZ,?0147
?0144:
; 432. {
; 433. if (temp != 0)
OR (IX-4)
JR Z,?0147
?0146:
; 434. FMStatus.station_count = temp;
?0181:
LD (FMStatus+4),A
?0147:
?0145:
?0141:
; 435. }
; 436. }
; 437. FMStatus.freq = FMAutoTab[0];
LD HL,(FMAutoTab)
LD (FMStatus+1),HL
; 438. FMStatus.station = 0;
XOR A
LD (FMStatus+3),A
; 439. fmSendCommand(MC_RESTORE, (int) &radio_param);
LD BC,radio_param
LD E,69
CALL LWRD ?0191
?0138:
; 440. }
; 441.
; 442. if (key == RESULT_IGNORE)
PUSH IY
POP HL
LD A,48
XOR L
OR H
JR NZ,?0149
?0148:
; 443. {
; 444. key = 0;
LD IY,0
?0149:
; 445. }
; 446.
; 447. //fmSendCommand(MC_MUTE,releaseMUTE);
; 448. //fmSendCommand(MC_SETVOLUME,FMStatus.volume);
; 449.
; 450. if (FMStatus.station_count > 0x00) // 没有搜到电台退出的情况.
LD A,(FMStatus+4)
OR A
JR Z,?0151
?0150:
; 451. {
; 452. fmSendCommand(MC_STEP, UP);
LD BC,1
LD E,7
CALL LWRD ?0191
; 453. for (temp = 0; temp < 0xff; temp++) // 延迟
LD (IX-4),0
?0153:
LD A,(IX-4)
CP 255
JR NC,?0152
?0154:
INC (IX-4)
JR ?0153
?0152:
; 454. {
; 455. }
; 456. fmSendCommand(MC_BACKUP, (int) &radio_param);
LD BC,radio_param
LD E,68
CALL LWRD ?0191
?0151:
; 457. }
; 458. return key;
PUSH IY
POP HL
; 459. }
JP LWRD ?0188
?0193:
LD DE,(AutoTabNum)
LD D,0
INC DE
LD A,BYTE3 ShowStationCount
LD HL,LWRD ShowStationCount
CALL LWRD ?BANK_CALL_DIRECT_L08
LD A,BYTE3 TryPlayingHandle
LD HL,LWRD TryPlayingHandle
CALL LWRD ?BANK_CALL_DIRECT_L08
PUSH HL
POP IY
LD A,BYTE3 CleanStationCount
LD HL,LWRD CleanStationCount
JP LWRD ?BANK_CALL_DIRECT_L08
; 460.
RSEG CSTR
?0004:
DEFB '['
DEFB 0
?0005:
DEFB 'CH'
DEFB 0
?0006:
DEFB ']'
DEFB 0
?0011:
DEFB '<'
DEFB 0
?0012:
DEFB 'FM'
DEFB 0
?0019:
DEFB '.'
DEFB 0
?0020:
DEFB '>'
DEFB 0
RSEG CONST
?0007:
DEFB ' '
DEFB 0
?0008:
DEFB 'FM'
DEFB 0
DEFB 0
RSEG UDATA0
FMAutoTab:
DEFS 40
AutoTabNum:
DEFS 1
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -