📄 ui_directory_fun.s01
字号:
NAME ui_directory_fun(17)
RSEG COM_CTRL(0)
RSEG CSTR(0)
EXTERN FS_CD
PUBLIC GetActiveDirFrom
EXTERN GetFileTotal
PUBLIC Getdirbuf
PUBLIC Initdirbuf
PUBLIC Setdirbuf
EXTERN ToDirEntry
PUBLIC count_dir_num
EXTERN dirbuf
EXTERN ?CLZ80B_4_04_L00
EXTERN ?C_LSH_L01
EXTERN ?UC_DIV_L01
EXTERN ?US_RSH_L02
EXTERN ?BANK_CALL_DIRECT_L08
EXTERN ?BANK_FAST_LEAVE_L08
RSEG COM_CTRL
Initdirbuf:
; 1. /*
; 2. *******************************************************************************
; 3. * ACTOS AP
; 4. * ap common lib, directory control file
; 5. *
; 6. * (c) Copyright, Actions Co,Ld.
; 7. * All Right Reserved
; 8. *
; 9. * File: ui_directory_fun.c
; 10. * By : jmzhang
; 11. * Version: v1.00 first version 2005-9-22 19:35
; 12. *******************************************************************************
; 13. */
; 14. #pragma codeseg(COM_CTRL)
; 15. #include "ap_common.h"
; 16. #include "enhanced.h"
; 17. #include "actos.h"
; 18. #include "filesys.h"
; 19. #include "directory.h"
; 20.
; 21. extern const char Ui_IgnoreExt[4];// = {"* "};
; 22.
; 23.
; 24.
; 25. #pragma memory=dataseg(IDM_COM_FSL_D)
; 26. extern char dirbuf[125];
; 27.
; 28. #pragma memory=default
; 29.
; 30.
; 31. void Initdirbuf(void)
; 32. {
PUSH BC
PUSH DE
PUSH AF
; 33. int i;
; 34. byte status;
; 35. status = input8(0x05);
IN A,(5)
LD HL,0
ADD HL,SP
LD (HL),A
; 36. output8(0x05, 0xf6);
LD A,246
OUT (5),A
; 37.
; 38. for(i=0;i<125;i++)
LD DE,0
?0003:
LD BC,32893
LD L,E
LD H,D
LD A,B
XOR H
LD H,A
SBC HL,BC
JR NC,?0002
?0004:
; 39. dirbuf[i]=0;
LD HL,dirbuf
ADD HL,DE
LD (HL),0
INC DE
JR ?0003
?0002:
; 40.
; 41. output8(0x05, status);
LD HL,0
ADD HL,SP
LD A,(HL)
OUT (5),A
; 42. }
POP HL
POP DE
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
Setdirbuf:
; 43.
; 44.
; 45. //********************************************************************************
; 46. //* Description :用于建立快速查询表
; 47. //* n 最大值为999
; 48. //** Arguments :
; 49. //*
; 50. //* Returns :
; 51. //*
; 52. //* Notes :
; 53. //*
; 54. //********************************************************************************
; 55. void Setdirbuf(WORD n)
; 56. {
PUSH BC
PUSH IX
PUSH AF
PUSH AF
PUSH DE
POP IX
; 57. BYTE m,k;
; 58. byte status;
; 59.
; 60. if(n>999)
LD HL,999
AND A
SBC HL,DE
JR C,?0008
?0006:
?0007:
; 61. return;
; 62. status = input8(0x05);
IN A,(5)
LD HL,1
ADD HL,SP
LD (HL),A
; 63. output8(0x05, 0xf6);
LD A,246
OUT (5),A
; 64.
; 65. m=n/8;
LD B,3
CALL LWRD ?US_RSH_L02
; 66. k=n%8;
PUSH IX
POP HL
LD A,L
AND 7
; 67. k=1<<k;
LD B,A
LD A,1
CALL LWRD ?C_LSH_L01
; 68. dirbuf[m]=dirbuf[m]|k;
LD C,E
LD B,0
LD HL,dirbuf
ADD HL,BC
OR (HL)
LD (HL),A
; 69.
; 70. output8(0x05, status);
LD HL,1
ADD HL,SP
LD A,(HL)
OUT (5),A
; 71. }
?0008:
POP HL
POP HL
POP IX
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
Getdirbuf:
; 72.
; 73. //********************************************************************************
; 74. //* Description :输入为目录在list表中的位置,输出目录序号DirNo,
; 75. //* n 最大值为999
; 76. //** Arguments :
; 77. //*
; 78. //* Returns : 输出目录序号DirNo
; 79. //*
; 80. //* Notes :
; 81. //*
; 82. //********************************************************************************
; 83. WORD Getdirbuf(WORD n)
; 84. {
PUSH BC
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH DE
PUSH AF
PUSH AF
PUSH AF
PUSH AF
; 85. WORD h=0,k=0;
; 86. BYTE m,i,j;
; 87. BYTE needbreak=0;
; 88. byte status;
; 89.
; 90. if(n>999)
LD IY,0
XOR A
LD (IX-10),A
LD (IX-9),A
LD (IX-5),A
LD HL,999
SBC HL,DE
JR NC,?0010
?0009:
; 91. return 0;
LD L,A
LD H,A
JP LWRD ?0029
?0010:
; 92. status = input8(0x05);
IN A,(5)
LD (IX-4),A
; 93. output8(0x05, 0xf6);
LD A,246
OUT (5),A
; 94.
; 95. for(i=0;i<125;i++)
LD (IX-8),0
?0012:
LD A,(IX-8)
CP 125
JR NC,?0011
?0013:
; 96. {
; 97. k++;
INC (IX-10)
JR NZ,?0066
INC (IX-9)
?0066:
; 98. m=dirbuf[i];
LD C,A
LD B,0
LD HL,dirbuf
ADD HL,BC
LD B,(HL)
LD (IX-7),B
; 99. if((m&1)==1)h++;
BIT 0,B
JR Z,?0016
?0015:
INC IY
?0016:
; 100. if(h==n)
LD L,(IX-2)
LD H,(IX-1)
PUSH IY
POP BC
AND A
SBC HL,BC
JR Z,?0011
?0017:
; 101. break;
?0018:
; 102. for(j=0;j<7;j++)
LD (IX-6),0
?0020:
LD A,(IX-6)
CP 7
JR NC,?0019
?0021:
; 103. {
; 104. k++;
INC (IX-10)
JR NZ,?0067
INC (IX-9)
?0067:
; 105. m=m/2;
LD HL,3
ADD HL,SP
LD B,2
LD A,(HL)
CALL LWRD ?UC_DIV_L01
LD (HL),A
; 106. if((m&1)==1)h++;
BIT 0,A
JR Z,?0024
?0023:
INC IY
?0024:
; 107. if(h==n)
LD L,(IX-2)
LD H,(IX-1)
PUSH IY
POP BC
AND A
SBC HL,BC
JR NZ,?0026
?0025:
; 108. {
; 109. needbreak=1;
LD (IX-5),1
; 110. break;
JR ?0019
?0026:
INC (IX-6)
JR ?0020
?0019:
; 111. }
; 112.
; 113. }
; 114. if(needbreak)
XOR A
OR (IX-5)
JR NZ,?0011
?0027:
; 115. break;
?0028:
INC (IX-8)
JR ?0012
?0011:
; 116. }
; 117. output8(0x05, status);
LD A,(IX-4)
OUT (5),A
; 118. return k-1;
LD HL,65535
LD C,(IX-10)
LD B,(IX-9)
ADD HL,BC
; 119. }
?0029:
LD SP,IX
POP IX
POP IY
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
GetActiveDirFrom:
; 120.
; 121. //********************************************************************************
; 122. //* Description :输入目录序号DirNo,输出为此目录在list表中的位置
; 123. //* n 最大值为999
; 124. //** Arguments :
; 125. //*
; 126. //* Returns : 当前目录在文件/目录列表中的序号
; 127. //*
; 128. //* Notes :
; 129. //*
; 130. //********************************************************************************
; 131. WORD GetActiveDirFrom(WORD n)
; 132. {
PUSH BC
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH DE
PUSH AF
PUSH AF
PUSH AF
PUSH AF
; 133. WORD h=0,k=0;
; 134. BYTE m,i,j;
; 135. BYTE needbreak=0;
; 136. byte status;
; 137.
; 138. if(n>999)
XOR A
LD (IX-10),A
LD (IX-9),A
LD IY,0
LD (IX-5),A
LD HL,999
SBC HL,DE
JR C,?0070
?0030:
; 139. return 0;
?0031:
; 140. status = input8(0x05);
IN A,(5)
LD (IX-4),A
; 141. output8(0x05, 0xf6);
LD A,246
OUT (5),A
; 142.
; 143. if(n==0)
LD A,E
OR D
JR NZ,?0033
?0032:
; 144. return 0;
?0070:
LD HL,0
JP LWRD ?0052
?0033:
; 145. for(i=0;i<125;i++)
LD (IX-8),0
?0035:
LD A,(IX-8)
CP 125
JR NC,?0034
?0036:
; 146. {
; 147. k++;
; 148. m=dirbuf[i];
LD C,A
LD B,0
LD HL,dirbuf
ADD HL,BC
LD B,(HL)
LD (IX-7),B
; 149. if((m&1)==1)h++;
BIT 0,B
INC IY
JR Z,?0068
?0038:
INC (IX-10)
JR NZ,?0068
INC (IX-9)
?0068:
?0039:
; 150. if((k-1)==n)
LD HL,65535
PUSH IY
POP BC
ADD HL,BC
LD C,(IX-2)
LD B,(IX-1)
AND A
SBC HL,BC
JR Z,?0034
?0040:
; 151. break;
?0041:
; 152. for(j=0;j<7;j++)
LD (IX-6),0
?0043:
LD A,(IX-6)
CP 7
JR NC,?0042
?0044:
; 153. {
; 154. k++;
; 155. m=m/2;
LD HL,3
ADD HL,SP
LD B,2
LD A,(HL)
CALL LWRD ?UC_DIV_L01
LD (HL),A
; 156. if((m&1)==1)h++;
BIT 0,A
INC IY
JR Z,?0069
?0046:
INC (IX-10)
JR NZ,?0069
INC (IX-9)
?0069:
?0047:
; 157. if((k-1)==n)
LD HL,65535
PUSH IY
POP BC
ADD HL,BC
LD C,(IX-2)
LD B,(IX-1)
AND A
SBC HL,BC
JR NZ,?0049
?0048:
; 158. {
; 159. needbreak=1;
LD (IX-5),1
; 160. break;
JR ?0042
?0049:
INC (IX-6)
JR ?0043
?0042:
; 161. }
; 162.
; 163. }
; 164. if(needbreak)
XOR A
OR (IX-5)
JR NZ,?0034
?0050:
; 165. break;
?0051:
INC (IX-8)
JR ?0035
?0034:
; 166. }
; 167.
; 168. output8(0x05, status);
LD A,(IX-4)
OUT (5),A
; 169. return h;
LD L,(IX-10)
LD H,(IX-9)
; 170. }
?0052:
JP LWRD ?0029
count_dir_num:
; 171.
; 172. /*
; 173. ********************************************************************************
; 174. * Description : 当前目录下,有效的子目录的总数
; 175. *
; 176. * Arguments :
; 177. *
; 178. * Returns : 子目录总数
; 179. *
; 180. * Notes :
; 181. *
; 182. ********************************************************************************
; 183. */
; 184. WORD count_dir_num(void)
; 185. {
PUSH BC
PUSH DE
PUSH IY
PUSH IX
LD HL,65522
ADD HL,SP
LD SP,HL
; 186. WORD tmp,wtemp,total,direxist;
; 187. char strDir[12];
; 188. tmp = 0;
; 189. wtemp = 1;
LD IY,0
LD IX,1
?0054:
; 190. while(1)
; 191. {
; 192. if (! ToDirEntry(strDir, wtemp))
PUSH IX
POP BC
LD HL,2
ADD HL,SP
EX DE,HL
LD A,BYTE3 ToDirEntry
LD HL,LWRD ToDirEntry
CALL LWRD ?BANK_CALL_DIRECT_L08
INC L
DEC L
JR NZ,?0057
?0056:
; 193. {
; 194. return tmp;
PUSH IY
POP HL
; 195. }
EX DE,HL
LD HL,14
ADD HL,SP
LD SP,HL
EX DE,HL
POP IX
POP IY
POP DE
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
?0057:
; 196. else
; 197. {
; 198. // 只检查文件夹是否有效
; 199. total = GetFileTotal(strDir, TRUE);
LD HL,0
ADD HL,SP
PUSH HL
LD C,1
INC HL
INC HL
EX DE,HL
LD A,BYTE3 GetFileTotal
LD HL,LWRD GetFileTotal
CALL LWRD ?BANK_CALL_DIRECT_L08
LD C,L
LD B,H
POP HL
LD (HL),C
INC HL
LD (HL),B
; 200. FS_CD(strDir);
LD HL,2
ADD HL,SP
EX DE,HL
CALL LWRD FS_CD
; 201. if (ToDirEntry(strDir,1))
LD BC,1
LD HL,2
ADD HL,SP
EX DE,HL
LD A,BYTE3 ToDirEntry
LD HL,LWRD ToDirEntry
CALL LWRD ?BANK_CALL_DIRECT_L08
INC L
DEC L
JR Z,?0059
?0058:
; 202. {
; 203. direxist=1;
LD DE,1
; 204. }
; 205. else
JR ?0060
?0059:
; 206. {
; 207. direxist=0;
LD DE,0
?0060:
; 208. }
; 209. output8(0x4e,input8(0x4e)|0x8);
IN A,(78)
SET 3,A
OUT (78),A
; 210.
; 211. FS_CD("\\");
PUSH DE
LD DE,?0061
CALL LWRD FS_CD
POP DE
; 212. }
; 213. output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
IN A,(78)
SET 3,A
OUT (78),A
; 214. if((total != 0)||direxist)
LD HL,0
ADD HL,SP
LD A,(HL)
INC HL
OR (HL)
JR NZ,?0064
LD A,E
OR D
JR Z,?0063
?0064:
?0065:
?0062:
; 215. tmp++;
INC IY
?0063:
; 216.
; 217. wtemp ++;
; 218. }
; 219. }
INC IX
JP LWRD ?0054
RSEG CSTR
?0061:
DEFB 92,0
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -