usbdisk.s01

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

S01
450
字号
	NAME	usbdisk(17)
	RSEG	UDISK_RC(0)
	RSEG	UDISK_RD(0)
	EXTERN	ClearScreen
	EXTERN	DRV_ActiveUD
	PUBLIC	DispBuf
	EXTERN	Display
	PUBLIC	DisplayIndi
	EXTERN	IsCardOut
	EXTERN	MenuKeyPress
	EXTERN	MsgManager
	PUBLIC	OldVddVol
	EXTERN	ResClose
	EXTERN	SetContrast
	EXTERN	StandbyScreen
	EXTERN	UDiskExit
	EXTERN	UDiskGetStatus
	EXTERN	UDiskHandle
	EXTERN	UDiskInitAll
	EXTERN	UDiskPullCardOut
	PUBLIC	USBStatus
	EXTERN	g_comval
	PUBLIC	main
	EXTERN	res_fp
	EXTERN	sKY_CloseBacklight
	EXTERN	sKY_OpenBacklight
	EXTERN	?CLZ80B_4_04_L00
	EXTERN	?C_V_SWITCH_L06
	EXTERN	?BANK_FAST_LEAVE_L08
	RSEG	UDISK_RC
main:
; 1.	/*
; 2.	********************************************************************************
; 3.	*                       ACTOS
; 4.	*                      usbmain
; 5.	*
; 6.	*                (c) Copyright 2002-2003, Actions Co,Ld.
; 7.	*                        All Right Reserved
; 8.	*
; 9.	* File   : main.c
; 10.	* By     : Chliang
; 11.	* Version: v1.00     first version     04-1-6 14:33
; 12.	********************************************************************************
; 13.	*/
; 14.	#pragma function=non_banked
; 15.	
; 16.	#include "Udisk.h"
; 17.	
; 18.	#pragma memory=dataseg(UDISK_RD)
; 19.	char DisplayIndi,USBStatus;
; 20.	BYTE OldVddVol;
; 21.	char *DispBuf;
; 22.	extern BYTE MenuKeyPress;
; 23.	extern BYTE IsCardOut;
; 24.	extern comval_t g_comval;
; 25.	#pragma memory=default
; 26.	
; 27.	
; 28.	#pragma codeseg(UDISK_RC)
; 29.	int main(int para)
; 30.	{
	PUSH	BC
	PUSH	IX
	PUSH	DE
; 31.	    char    dispIndibak=0xff;
; 32.	    char    rii=0;
; 33.	
; 34.	
; 35.	    //~~~~~~~~~~~~~~~~~~~~~
; 36.	    //init usb disk
; 37.	    //~~~~~~~~~~~~~~~~~~~~~
; 38.	    DisplayIndi=0x00;                       //变量初始化
	XOR	A
	LD	(DisplayIndi),A
; 39.	
; 40.	
; 41.	    if(!UDiskInitAll(para))                     //AP初始化
	LD	IXL,255
	CALL	LWRD UDiskInitAll
	OR	A
	JP	Z,?0049
?0002:
; 42.	    {
; 43.	        return 0;
; 44.	    } 
?0003:
; 45.	
; 46.	    for(rii=0;rii<0x7f;rii++)
	LD	IXH,0
?0005:
	LD	A,IXH
	CP	127
	JR	NC,?0004
?0006:
	INC	IXH
; 47.	    {
; 48.	        ;   //delay
; 49.	    }    
; 50.	    //~~~~~~~~~~~~~~~~~~~~~
; 51.	    //message loop
; 52.	    //~~~~~~~~~~~~~~~~~~~~~
; 53.	    while(1)
	JR	?0005
?0004:
?0009:
; 54.	    {
; 55.	                //清watch dog!!
; 56.	        output8(0x4e,input8(0x4e)|0x08);
	IN	A,(78)
	SET	3,A
	OUT	(78),A
; 57.	        
; 58.	        MsgManager();                   //消息解释
	CALL	LWRD MsgManager
; 59.	         if(IsCardOut == 1)
	LD	A,(IsCardOut)
	DEC	A
	JR	NZ,?0012
?0011:
; 60.	        {
; 61.	            UDiskPullCardOut();
	CALL	LWRD UDiskPullCardOut
; 62.	            IsCardOut = 0;
	XOR	A
	LD	(IsCardOut),A
?0012:
; 63.	        }
; 64.	        UDiskHandle();                  //调用状态机执行命令
	CALL	LWRD UDiskHandle
; 65.	        
; 66.	        USBStatus=UDiskGetStatus();
	CALL	LWRD UDiskGetStatus
	LD	(USBStatus),A
; 67.	        //0:空闲  10h:上传  20h:下传  30h:弹出要求退出  40h:拔线要求退出  50h:切换到韧件升级应用
; 68.	        //60h:分区处理状态  70h:出错要求退出  80h:进入Suspend状态  90h:退出Suspend状态
; 69.	        if( (DisplayIndi==0xff) && ( USBStatus !=0x80 ) )
	LD	A,(DisplayIndi)
	INC	A
	JR	NZ,?0014
	LD	A,(USBStatus)
	DEC	A
	JP	PE,?0014
?0016:
?0015:
?0013:
; 70.	        {   
; 71.	           sKY_OpenBacklight();
	CALL	LWRD sKY_OpenBacklight
; 72.	           StandbyScreen(1);       //开显示屏
	LD	E,1
	CALL	LWRD StandbyScreen
; 73.	           SetContrast(g_comval.DisplayContrast);      //设对比度
	LD	DE,(g_comval+8)
	CALL	LWRD SetContrast
?0014:
; 74.	        }
; 75.	        if ( (USBStatus==0x30) || (USBStatus==0x40) || (USBStatus==0x50) || (USBStatus==0x70) )
	LD	A,(USBStatus)
	CP	48
	JP	Z,?0008
	CP	64
	JP	Z,?0008
	CP	80
	JP	Z,?0008
	CP	112
	JP	Z,?0008
?0019:
?0020:
?0017:
; 76.	            break;     
?0018:
; 77.	        if((MenuKeyPress==1) && (USBStatus==0))
	LD	A,(MenuKeyPress)
	DEC	A
	JR	NZ,?0022
	LD	A,(USBStatus)
	OR	A
	JP	Z,?0008
?0024:
?0023:
?0021:
; 78.	            break;          //0x00             
?0022:
; 79.	        switch (USBStatus)
	LD	DE,(USBStatus)
	CALL	LWRD ?C_V_SWITCH_L06
	DEFW	11
	DEFB	0
	DEFB	16
	DEFB	17
	DEFB	32
	DEFB	33
	DEFB	49
	DEFB	65
	DEFB	81
	DEFB	97
	DEFB	128
	DEFB	144
	DEFW	?0004
	DEFW	?0044
	DEFW	?0043
	DEFW	?0032
	DEFW	?0037
	DEFW	?0032
	DEFW	?0032
	DEFW	?0032
	DEFW	?0040
	DEFW	?0032
	DEFW	?0029
	DEFW	?0026
?0026:
; 80.	        {
; 81.	            case 0:
; 82.	                
; 83.	                if(DisplayIndi!=0x00)
	LD	A,(DisplayIndi)
	OR	A
	JP	Z,?0004
?0027:
; 84.	                {
; 85.	                    DisplayIndi=0x00;
	XOR	A
	JR	?0065
; 86.	                    Display(DisplayIndi);   //显示模块 0:传输结束  01:上传  02:下传
?0028:
; 87.	                }
; 88.	                break;
?0029:
; 89.	    
; 90.	            case 0x10:
; 91.	                if(DisplayIndi!=0x01)
	LD	A,(DisplayIndi)
	DEC	A
	JP	Z,?0004
?0030:
; 92.	                {
; 93.	                    DisplayIndi=0x01;
	LD	A,1
	JR	?0065
; 94.	                    Display(DisplayIndi);   //显示模块 0:传输结束  01:上传  02:下传
?0031:
; 95.	                }
; 96.	                break;
?0032:
; 97.	            case 0x11://显示Commu
; 98.	            case 0x21://显示DownLoad
; 99.	            case 0x31://显示UpLoad
; 100.	            case 0x41://显示Succ
; 101.	            case 0x61://显示Succ,退出
; 102.	                DisplayIndi=USBStatus>>4;
	LD	A,(USBStatus)
	RRA
	RRA
	RRA
	RRA
	AND	15
	LD	(DisplayIndi),A
; 103.	                if (USBStatus==0x61)
	LD	A,(USBStatus)
	CP	97
	JR	NZ,?0034
?0033:
; 104.	                {
; 105.	                    DisplayIndi -= 1;       //0x61与0x51显示一致
	LD	A,(DisplayIndi)
	ADD	A,255
	LD	(DisplayIndi),A
?0034:
; 106.	                }
; 107.	                DisplayIndi+=0x10;
	LD	A,(DisplayIndi)
	ADD	A,16
	LD	(DisplayIndi),A
; 108.	                if(dispIndibak != DisplayIndi)   //保证只显示一次
	LD	B,A
	LD	A,IXL
	CP	B
	JP	Z,?0004
?0035:
; 109.	                {
; 110.	                    dispIndibak=DisplayIndi;
	LD	IXL,B
; 111.	                    Display(DisplayIndi);
	JR	?0066
?0036:
; 112.	                }
; 113.	                break;
?0037:
; 114.	
; 115.	            case 0x51:      //切换到adfu
; 116.	                output8(0x27,input8(0x27) & 0x9f);  //关键盘和RTC中断
	IN	A,(39)
	AND	159
	OUT	(39),A
; 117.	                DisplayIndi=0x10;
	LD	A,16
	LD	(DisplayIndi),A
; 118.	                if(dispIndibak != DisplayIndi)      //保证只显示一次
	LD	A,IXL
	CP	16
	JP	Z,?0004
?0038:
; 119.	                {
; 120.	                    dispIndibak=DisplayIndi;
	LD	A,(DisplayIndi)
	LD	IXL,A
; 121.	                    Display(DisplayIndi);
?0066:
	LD	DE,(DisplayIndi)
	JR	?0064
?0039:
; 122.	                }
; 123.	                break;
?0040:
; 124.	            case 0x20:
; 125.	                if(DisplayIndi!=0x02)
	LD	A,(DisplayIndi)
	DEC	A
	DEC	A
	JP	Z,?0004
?0041:
; 126.	                {
; 127.	                    DisplayIndi=0x02;
	LD	A,2
?0065:
	LD	(DisplayIndi),A
; 128.	                    Display(DisplayIndi);   //显示模块 0:传输结束  01:上传  02:下传
	LD	E,A
?0064:
	CALL	LWRD Display
?0042:
; 129.	                }
; 130.	                break;
	JP	LWRD ?0004
?0043:
; 131.	            case 0x80:
; 132.	                sKY_CloseBacklight();
	CALL	LWRD sKY_CloseBacklight
; 133.	                ClearScreen(NULL);      //清成白屏
	LD	DE,0
	CALL	LWRD ClearScreen
; 134.	              //  UpdateScreen(NULL);
; 135.	             StandbyScreen(0);       //关显示屏
	LD	E,0
	CALL	LWRD StandbyScreen
; 136.	                DisplayIndi=0xff;       //置成其他值,为了退出Suspend时能显示
	LD	A,255
	LD	(DisplayIndi),A
; 137.	                break;
	JP	LWRD ?0004
?0044:
; 138.	            case 0x90:                  //退出Suspend状态
; 139.	                sKY_OpenBacklight();
	CALL	LWRD sKY_OpenBacklight
; 140.	                StandbyScreen(1);       //开显示屏
	LD	E,1
	CALL	LWRD StandbyScreen
; 141.	                SetContrast(g_comval.DisplayContrast);      //设对比度
	LD	DE,(g_comval+8)
	CALL	LWRD SetContrast
; 142.	                output8(0x27,input8(0x27) | 0x04);
	IN	A,(39)
	SET	2,A
	OUT	(39),A
; 143.	                break;
	JP	LWRD ?0004
?0045:
; 144.	            default:
; 145.	                break;
?0025:
?0008:
; 146.	        }
; 147.	        
; 148.	    }   
; 149.	    
; 150.	     
; 151.	    //~~~~~~~~~~~~~~~~~~~~~
; 152.	    //usb disk exit
; 153.	    //~~~~~~~~~~~~~~~~~~~~~     
; 154.	    UDiskExit();                            //USB退出
	CALL	LWRD UDiskExit
; 155.	
; 156.	    ResClose(res_fp);                       //关资源文件
	LD	DE,(res_fp)
	CALL	LWRD ResClose
; 157.	
; 158.	    sKY_CloseBacklight();
	CALL	LWRD sKY_CloseBacklight
; 159.	
; 160.	    DRV_ActiveUD(0x00,MODE_SLOW);
	LD	C,1
	LD	E,0
	CALL	LWRD DRV_ActiveUD
; 161.	    
; 162.	////////////////////////////     zxs add for card
; 163.	    output8(0x2f,input8(0x2f)|0x04);       //CE3 change to GIOA3
	IN	A,(47)
	SET	2,A
	OUT	(47),A
; 164.	    output8(0xf7,input8(0xf7)|0x01);      // PowerOff
	IN	A,(247)
	SET	0,A
	OUT	(247),A
; 165.	    output8(0xee,input8(0xee)&0xf7);      //GPIO A3=0
	IN	A,(238)
	RES	3,A
	OUT	(238),A
; 166.	////////////////////////////     zxs add for card    
; 167.	    
; 168.	    if(USBStatus == 0x00)                   //按Mode退出
	LD	A,(USBStatus)
	OR	A
	JR	NZ,?0047
?0046:
; 169.	            return RESULT_MAIN;
	LD	HL,10
	JR	?0050
?0047:
; 170.	    else if(USBStatus == 0x50)              //升级退出
	CP	80
	JR	NZ,?0049
?0048:
; 171.	            return RESULT_UPGRADE;
	LD	HL,3
; 172.	    else
	JR	?0050
?0049:
; 173.	            return 0;                       //拔线,弹出               //拔线,弹出      
	LD	HL,0
; 174.	            
; 175.	             
; 176.	}
?0050:
	POP	AF
	POP	IX
	POP	BC
	JP	LWRD ?BANK_FAST_LEAVE_L08
; 177.	
; 178.	#pragma memory=default
	RSEG	UDISK_RD
DisplayIndi:
	DEFS	1
USBStatus:
	DEFS	1
OldVddVol:
	DEFS	1
DispBuf:
	DEFS	2
	END

⌨️ 快捷键说明

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