usbdisk_2l.s01

来自「MP3 整个 SDK」· S01 代码 · 共 623 行

S01
623
字号
	NAME	usbdisk_2l(17)
	RSEG	UDISK_RC(0)
	RSEG	CSTR(0)
	RSEG	UDISK_RD(0)
	RSEG	UDISK_RS(0)
	EXTERN	AlwaysShowCardDisk
	EXTERN	BankSwitch
	EXTERN	DRV_ActiveUD
	EXTERN	DRV_DetectUD
	EXTERN	DispBuf
	PUBLIC	Display
	PUBLIC	FlashLed
	EXTERN	GetSysInfo
	EXTERN	GetSysMsg
	EXTERN	GetUsbAttribute
	EXTERN	GetUsbSetupInfo
	EXTERN	GetUsbVidPid
	PUBLIC	HoldDispState
	PUBLIC	IsCardOut
	PUBLIC	MenuKeyPress
	PUBLIC	MsgManager
	EXTERN	ResOpen
	EXTERN	ResShowPic
	EXTERN	UD_SDCardWPDetect
	EXTERN	UDiskGetCardStatus
	EXTERN	UDiskInit
	PUBLIC	UDiskInitAll
	EXTERN	UDiskRun
	EXTERN	UDiskSetDiskNum
	EXTERN	UDiskSetWP
	EXTERN	VMRead
	PUBLIC	g_comval
	EXTERN	res_fp
	EXTERN	sKY_HoldCheck
	EXTERN	sysinfo
	PUBLIC	sysinfopt
	PUBLIC	usbattribute
	PUBLIC	usbsetupinfo
	PUBLIC	vidpidstring
	PUBLIC	wUDiskDisp
	EXTERN	?CLZ80B_4_04_L00
	EXTERN	?C_S_SWITCH_L06
	EXTERN	?BANK_CALL_DIRECT_L08
	RSEG	UDISK_RC
MsgManager:
; 1.	/*
; 2.	********************************************************************************
; 3.	*                       ACTOS
; 4.	*                      usbdisk
; 5.	*
; 6.	*                (c) Copyright 2002-2003, Actions Co,Ld.
; 7.	*                        All Right Reserved
; 8.	*
; 9.	* File   : usbdisk35.c
; 10.	* By     : Chliang
; 11.	* Version: v1.00     first version     2003-11-18 11:47
; 12.	********************************************************************************
; 13.	*/
; 14.	#pragma function=non_banked
; 15.	
; 16.	#include "Udisk.h"
; 17.	
; 18.	#pragma memory=dataseg(UDISK_RD)
; 19.	usbsetupinfo_t usbsetupinfo;        //U盘安装信息数据结构
; 20.	ADFU_SysInfo_t *sysinfopt;
; 21.	usbattri_t usbattribute;            //U盘属性数据结构
; 22.	vidpid_t vidpidstring;              //PID,VID数据结构
; 23.	BYTE MenuKeyPress;
; 24.	BYTE HoldDispState;
; 25.	BYTE IsCardOut;                     //jpu
; 26.	comval_t g_comval;                  //全局变量数据结构
; 27.	extern char DisplayIndi;
; 28.	extern char *DispBuf;
; 29.	extern  ADFU_SysInfo_t sysinfo;
; 30.	#pragma memory=default
; 31.	
; 32.	
; 33.	#pragma memory=constseg(UDISK_RS)
; 34.	WORD    wUDiskDisp[3]={UDISKRDY,UDISKUPL,UDISKDL};
; 35.	//WORD    wADFUDisp[7]={UPG_RDY, UPG_BUSY, UPG_DOWN, UPG_UP, UPG_DONE, UPG_DONE, UPG_FAIL};
; 36.	#pragma memory=default
; 37.	
; 38.	
; 39.	#pragma codeseg(UDISK_RC)
; 40.	void MsgManager(void)
; 41.	{
	PUSH	DE
; 42.	    char i;
; 43.	    if(MenuKeyPress==1)         //已收到Menu键,不再收消息,以防非空闲状态下跑该函数把KeyUp收走
	LD	A,(MenuKeyPress)
	DEC	A
	JR	Z,?0007
?0002:
?0003:
; 44.	            return;
; 45.	    if( (i = GetSysMsg()) == Msg_KeyMenu )          //收到Menu键
	CALL	LWRD GetSysMsg
	CP	16
	JR	NZ,?0005
?0004:
; 46.	    {
; 47.	        MenuKeyPress=1;
	LD	A,1
	LD	(MenuKeyPress),A
; 48.	        return;
; 49.	    }
	JR	?0007
?0005:
; 50.	    else if ( i == MSG_SD_OUT )
	CP	177
	JR	NZ,?0007
?0006:
; 51.	    {
; 52.	        IsCardOut = 1;
	LD	A,1
	LD	(IsCardOut),A
; 53.	        return;
; 54.	    }
?0007:
; 55.	}
?0008:
	POP	DE
	RET
Display:
; 56.	
; 57.	
; 58.	
; 59.	void Display(char dispIndi)
; 60.	{
	PUSH	BC
	PUSH	IX
	PUSH	AF
	PUSH	AF
	LD	IXH,E
; 61.	    char    disptemp = dispIndi & 0x0f;
	LD	A,E
	AND	15
	LD	HL,2
	ADD	HL,SP
	LD	(HL),A
; 62.	    char    i,j,k;
; 63.	
; 64.	    k = input8(0x27);
	IN	A,(39)
	DEC	HL
	LD	(HL),A
; 65.	    output8(0x27,0x0);          //显示时不开中断,避免低频跑中断服务(下面代码会降频),降低效率
	XOR	A
	OUT	(39),A
; 66.	    
; 67.	    i = input8(0x00);
	IN	A,(0)
	DEC	HL
	LD	(HL),A
; 68.	    output8(0x00,i | 0x01);     //显示屏不支持60MHz送屏,降频
	LD	B,A
	SET	0,B
	LD	A,B
	OUT	(0),A
; 69.	    for(j=0;j<0x40;j++){}
	LD	IXL,0
?0010:
	LD	A,IXL
	CP	64
	JR	NC,?0009
?0011:
	INC	IXL
	JR	?0010
?0009:
; 70.	    if(dispIndi<0x10)
	LD	A,IXH
	CP	16
	JR	NC,?0014
?0013:
; 71.	    {    
; 72.	        if(dispIndi==0x00)               //显示任务指示 0:无显示动作  01:上传  02:下传  03:传输结束
	LD	B,IXH
	INC	B
	DEC	B
	JR	NZ,?0016
?0015:
; 73.	        {
; 74.	                ResShowPic(UDISKRDY,0,0);
	LD	C,B
	PUSH	BC
	LD	DE,254
	JR	?0075
; 75.	                goto displayend;
?0016:
; 76.	        }
; 77.	        if(dispIndi==0x01)
	DEC	B
	JR	NZ,?0019
?0018:
; 78.	        {
; 79.	                ResShowPic(UDISKBCK,0,0);
	LD	C,B
	JR	?0077
; 80.	                ResShowPic(UDISKUPL, 68, 76);
; 81.	                goto displayend;
?0019:
; 82.	        }
; 83.	        if(dispIndi==0x02)
	LD	B,IXH
	DEC	B
	DEC	B
	JR	NZ,?0023
?0020:
; 84.	        {
; 85.	                ResShowPic(UDISKBCK,0,0);
	LD	C,B
	JR	?0078
; 86.	                ResShowPic(UDISKDL, 68, 76);
?0021:
; 87.	        }
; 88.	
; 89.	    }
; 90.	    else
?0014:
; 91.	    {   
; 92.	      
; 93.	        switch (disptemp)
	LD	HL,2
	ADD	HL,SP
	LD	E,(HL)
	CALL	LWRD ?C_S_SWITCH_L06
	DEFB	0
	DEFW	7
	DEFW	?0023
	DEFW	?0024
	DEFW	?0025
	DEFW	?0026
	DEFW	?0027
	DEFW	?0023
	DEFW	?0023
	DEFW	?0023
?0024:
; 94.	        {
; 95.	            case 0:
; 96.	                ResShowPic(UPG_RDY,0,0);
	LD	C,0
	PUSH	BC
	LD	DE,11
	JR	?0075
; 97.	                break;
?0025:
; 98.	            case 1:                
; 99.	                ResShowPic(UPG_BUSY,0,30);
	LD	C,30
	PUSH	BC
	LD	C,0
	LD	DE,7
	JR	?0075
; 100.	                break;
?0026:
; 101.	            case 2:
; 102.	                ResShowPic(UDISKBCK,0,0);
	LD	C,0
?0078:
	PUSH	BC
	LD	DE,252
	CALL	LWRD ResShowPic
	POP	AF
; 103.	                ResShowPic(UDISKDL, 68, 76);
	LD	C,76
	PUSH	BC
	LD	C,68
	LD	DE,253
	JR	?0075
; 104.	                break;
?0027:
; 105.	            case 3:
; 106.	                ResShowPic(UDISKBCK,0,0);
	LD	C,0
?0077:
	PUSH	BC
	LD	DE,252
	CALL	LWRD ResShowPic
	POP	AF
; 107.	                ResShowPic(UDISKUPL, 68, 76);
	LD	C,76
	PUSH	BC
	LD	C,68
	LD	DE,255
?0075:
	CALL	LWRD ResShowPic
	POP	AF
; 108.	                break;
?0028:
; 109.	            case 4:
; 110.	                //ResShowPic(UDISKBCK, 0, 0);
; 111.	                //ResShowPic(UPG_DONE, 40, 21);
; 112.	                break;
?0029:
; 113.	            case 5:
; 114.	                //ResShowPic(UDISKBCK, 0, 0);
; 115.	                //ResShowPic(UPG_DONE, 40, 21);
; 116.	                break;
?0030:
; 117.	            case 6:
; 118.	                //ResShowPic(UDISKBCK, 0, 0);
; 119.	                //ResShowPic(UPG_FAIL, 40, 21);
; 120.	                break;
?0031:
; 121.	            default:
; 122.	                break;
?0023:
?0022:
?0017:
; 123.	        }
; 124.	    }  
; 125.	    
; 126.	displayend:
; 127.	    if(HoldDispState==1)
	LD	A,(HoldDispState)
	DEC	A
	JR	NZ,?0033
?0032:
; 128.	    {
; 129.	       ResShowPic(UDLOCK_S, 65, 49);
	LD	C,49
	PUSH	BC
	LD	C,65
	LD	DE,8
	CALL	LWRD ResShowPic
	POP	AF
?0033:
; 130.	    }
; 131.	
; 132.	    if (!((input8(0xfd)&0x10)==0x10)) 
	IN	A,(253)
	BIT	4,A
	JR	NZ,?0037
?0034:
; 133.	    {
; 134.	        if(((input8(0xfd)&0x20)==0x20))
	IN	A,(253)
	BIT	5,A
	JR	Z,?0037
?0036:
; 135.	        ResShowPic(CARDLOCK,25,30);
	LD	C,30
	PUSH	BC
	LD	C,25
	LD	DE,32
	CALL	LWRD ResShowPic
	POP	AF
?0037:
?0035:
; 136.	    }  
; 137.	    output8(0x00,i);        //升回频率
	LD	HL,0
	ADD	HL,SP
	LD	A,(HL)
	OUT	(0),A
; 138.	    for(j=0;j<0x40;j++){}
	LD	IXL,0
?0039:
	LD	A,IXL
	CP	64
	JR	NC,?0038
?0040:
	INC	IXL
	JR	?0039
?0038:
; 139.	    output8(0x27,k);      //恢复中断
	LD	HL,1
	ADD	HL,SP
	LD	A,(HL)
	OUT	(39),A
; 140.	}
	POP	HL
	POP	HL
	POP	IX
	POP	BC
	RET
UDiskInitAll:
; 141.	
; 142.	
; 143.	bool UDiskInitAll(int para)
; 144.	{
	PUSH	BC
	PUSH	DE
; 145.	    int i;
; 146.	
; 147.	    //安装ud驱动
; 148.	    if(DRV_DetectUD(0x00) == 0xff)
	LD	E,0
	CALL	LWRD DRV_DetectUD
	INC	A
	JP	Z,?0056
?0042:
; 149.	            return 0;
; 150.	    else
?0043:
; 151.	        DRV_ActiveUD(0x00,MODE_FAST);       //快速模式ud驱动
	LD	C,0
	LD	E,C
	CALL	LWRD DRV_ActiveUD
; 152.	
; 153.	    res_fp = ResOpen("ui30.res");
	LD	DE,?0044
	CALL	LWRD ResOpen
	LD	(res_fp),HL
; 154.	 
; 155.	
; 156.	            ResShowPic(UDISKRDY,0,0);                  //显示空闲画面
	LD	C,0
	PUSH	BC
	LD	DE,254
	CALL	LWRD ResShowPic
	POP	AF
; 157.	    GetUsbSetupInfo(&usbsetupinfo);
	LD	DE,usbsetupinfo
	CALL	LWRD GetUsbSetupInfo
; 158.	    GetUsbAttribute(&usbattribute);
	LD	DE,usbattribute
	CALL	LWRD GetUsbAttribute
; 159.	    GetUsbVidPid(&vidpidstring);
	LD	DE,vidpidstring
	CALL	LWRD GetUsbVidPid
; 160.	
; 161.	        //read comval
; 162.	    VMRead(&g_comval, VM_SYSTEM, sizeof(g_comval));     //读VRAM
	LD	HL,32
	PUSH	HL
	LD	BC,512
	LD	DE,g_comval
	CALL	LWRD VMRead
	POP	HL
; 163.	        //check if valid
; 164.	    if(g_comval.magic != MAGIC_COMVAL)      //取联机模式设定
	LD	HL,57005
	LD	BC,(g_comval)
	AND	A
	SBC	HL,BC
	JR	Z,?0046
?0045:
?0049:
; 165.	           COMVAL_INIT(g_comval);
	LD	A,11
	LD	(g_comval+8),A
	XOR	A
	LD	(g_comval+12),A
	LD	A,3
	LD	(g_comval+9),A
	LD	HL,57005
	LD	(g_comval),HL
	XOR	A
	LD	(g_comval+13),A
	LD	(g_comval+11),A
	LD	A,30
	LD	(g_comval+10),A
	XOR	A
	LD	(g_comval+14),A
	LD	C,A
	LD	B,A
	LD	(g_comval+2),BC
	LD	(g_comval+4),BC
	LD	(g_comval+15),A
	LD	(g_comval+16),A
	LD	(g_comval+17),A
	LD	A,4
	LD	(g_comval+18),A
	XOR	A
	LD	(g_comval+19),A
?0046:
; 166.	
; 167.	    //==================================================================================
; 168.	    //**********************以下函数调用次序不能改动***************************************
; 169.	    //==================================================================================
; 170.	
; 171.	    DispBuf=(char *)DISPLAY_BUFFER_ADDR;
	LD	HL,22528
	LD	(DispBuf),HL
; 172.	
; 173.	    UDiskSetDiskNum(g_comval.OnlineMode);   //设置联机模式
	LD	DE,(g_comval+14)
	LD	A,BYTE3 UDiskSetDiskNum
	LD	HL,LWRD UDiskSetDiskNum
	CALL	LWRD ?BANK_CALL_DIRECT_L08
; 174.	    
; 175.	    AlwaysShowCardDisk(1);                  //设置是否显示多盘符   
	LD	E,1
	LD	A,BYTE3 AlwaysShowCardDisk
	LD	HL,LWRD AlwaysShowCardDisk
	CALL	LWRD ?BANK_CALL_DIRECT_L08
; 176.	
; 177.	    UDiskInit((void *)FlashLed,&usbsetupinfo,&usbattribute,&vidpidstring);  //U盘初始终化,输入参数:callback函数,属性...
	LD	HL,vidpidstring
	PUSH	HL
	LD	HL,usbattribute
	PUSH	HL
	LD	BC,usbsetupinfo
	LD	DE,FlashLed
	LD	A,BYTE3 UDiskInit
	LD	HL,LWRD UDiskInit
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	POP	AF
	POP	AF
; 178.	
; 179.	    if(sKY_HoldCheck())                     //HOLD表示需要写保护
	CALL	LWRD sKY_HoldCheck
	OR	A
	JR	Z,?0051
?0050:
; 180.	    {
; 181.	        UDiskSetWP('C');
	LD	E,67
	LD	A,BYTE3 UDiskSetWP
	LD	HL,LWRD UDiskSetWP
	CALL	LWRD ?BANK_CALL_DIRECT_L08
; 182.	        HoldDispState=1;
	LD	A,1
	LD	(HoldDispState),A
; 183.	                ResShowPic(UDLOCK_S, 68, 132);
	LD	C,132
	PUSH	BC
	LD	C,68
	LD	DE,8
	CALL	LWRD ResShowPic
	POP	AF
?0051:
; 184.	    }
; 185.	    if (UDiskGetCardStatus())            //UDiskGetCardStatus返回值:1:有卡或初始化失败  0:没卡
	LD	A,BYTE3 UDiskGetCardStatus
	LD	HL,LWRD UDiskGetCardStatus
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	INC	L
	DEC	L
	JR	Z,?0055
?0052:
; 186.	    { //有卡
; 187.	        if(UD_SDCardWPDetect())                       //卡是否写保护
	LD	A,BYTE3 UD_SDCardWPDetect
	LD	HL,LWRD UD_SDCardWPDetect
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	LD	A,L
	OR	H
	JR	Z,?0055
?0054:
; 188.	        {
; 189.	            UDiskSetWP('H');
	LD	E,72
	LD	A,BYTE3 UDiskSetWP
	LD	HL,LWRD UDiskSetWP
	CALL	LWRD ?BANK_CALL_DIRECT_L08
; 190.	            //HoldDispState=1;
; 191.	                ResShowPic(CARDLOCK,22,38);
	LD	C,38
	PUSH	BC
	LD	C,22
	LD	DE,32
	CALL	LWRD ResShowPic
	POP	AF
?0055:
?0053:
; 192.	        }
; 193.	    }
; 194.	
; 195.	
; 196.	    sysinfopt=&sysinfo;
	LD	HL,sysinfo
	LD	(sysinfopt),HL
; 197.	    GetSysInfo(sysinfopt);          //取得ADFU UPD的信息头
	EX	DE,HL
	CALL	LWRD GetSysInfo
; 198.	    BankSwitch( (unsigned long)UDiskRun >>16 );
	LD	HL,0
	LD	E,L
	CALL	LWRD BankSwitch
; 199.	    UDiskRun(para);                             //启动USB引擎
	LD	HL,0
	ADD	HL,SP
	LD	E,(HL)
	INC	HL
	LD	D,(HL)
	CALL	LWRD UDiskRun
; 200.	
; 201.	    return 1;
	LD	A,1
; 202.	}
?0056:
	POP	HL
	POP	BC
	RET
FlashLed:
; 203.	
; 204.	
; 205.	void FlashLed(void)
; 206.	{
; 207.	}
	RET
; 208.	
; 209.	#pragma memory=default
	RSEG	CSTR
?0044:
	DEFB	'ui30.res'
	DEFB	0
	RSEG	UDISK_RD
usbsetupinfo:
	DEFS	64
sysinfopt:
	DEFS	2
usbattribute:
	DEFS	32
vidpidstring:
	DEFS	4
MenuKeyPress:
	DEFS	1
HoldDispState:
	DEFS	1
IsCardOut:
	DEFS	1
g_comval:
	DEFS	32
	RSEG	UDISK_RS
wUDiskDisp:
	DEFW	254
	DEFW	255
	DEFW	253
	END

⌨️ 快捷键说明

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