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 + -
显示快捷键?