autosearchhandle.s01

来自「MP3 整个 SDK」· S01 代码 · 共 1,463 行 · 第 1/2 页

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

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?