navi_file.s01
来自「炬力方案176*132软件源码,适用于AK1025」· S01 代码 · 共 2,198 行 · 第 1/3 页
S01
2,198 行
NAME navi_file(17)
RSEG MO_EH_FSLAPI(0)
RSEG CSTR(0)
RSEG UDATA0(0)
RSEG MOD_EH_API(0)
RSEG MOC_EH_FSLAPI(0)
PUBLIC DISC_Location_process
EXTERN DRV_ActiveDrive
PUBLIC ExtAmv2
PUBLIC ExtDsc2
PUBLIC ExtMusic2
PUBLIC ExtTxt2
PUBLIC ExtVoice2
EXTERN FS_CD
EXTERN FS_Dir
EXTERN FS_GetCurDir
EXTERN FS_GetName
EXTERN FS_Init
PUBLIC GetExtBuf
PUBLIC GetPathinfo
PUBLIC IgnoreExt2
PUBLIC Init
PUBLIC PageNum
PUBLIC RootName2
EXTERN SetDspMips
PUBLIC StackPathoffset
PUBLIC ToDirEntry
PUBLIC ToNextExt
PUBLIC WrFiletoIDM
PUBLIC WrFinfotoIDM
PUBLIC WrFoldNextIDM
PUBLIC WrFoldertoIDM
PUBLIC WrPathtoIDM
PUBLIC fselDirLayer
PUBLIC fselDirNo
PUBLIC fselDiskLetter
PUBLIC fselError
PUBLIC fselExtNo
PUBLIC fselFileNo
PUBLIC fselGetLocationC
PUBLIC fselInit
PUBLIC fselMode
PUBLIC fselNextDir
PUBLIC fselPLOrCommonDir
PUBLIC fselRandCount
PUBLIC fselTotal
PUBLIC fselType
EXTERN g_comval
PUBLIC g_offset
PUBLIC m_szTemp
PUBLIC m_szTemp1
EXTERN unitochar
EXTERN ?CLZ80B_4_04_L00
EXTERN ?SL_DIV_L03
EXTERN ?SL_MOD_L03
EXTERN ?SL_CMP_L03
EXTERN ?L_ADDASG_L03
EXTERN ?L_SUBASG_L03
EXTERN ?BANK_CALL_DIRECT_L08
EXTERN ?BANK_FAST_LEAVE_L08
EXTERN ?MEMSET_L11
RSEG MO_EH_FSLAPI
Init:
; 1. #include "actos.h"
; 2. #include "enhanced.h"
; 3. #include "debug.h"
; 4.
; 5. //global variable should be resident
; 6. BYTE fselPLOrCommonDir;
; 7. BYTE fselType; //Type of select, Music or voice.
; 8. BYTE fselMode; //Mode of select, Sequence, repeat one ...
; 9. WORD fselFileNo; //Number of current file,
; 10. //=0 mean NULL, 1 mean first file
; 11. BYTE fselExtNo; //Number of current file ext name..
; 12. //== 0xff Initialized status, should restart select.
; 13. char fselDiskLetter;
; 14. BYTE fselError; // store error id;
; 15. WORD fselRandCount;
; 16. BYTE fselDirNo[TOTALDIRLAYER]; //Number of current valid directory
; 17. long StackPathoffset[TOTALDIRLAYER];
; 18. char PageNum;
; 19. long g_offset;
; 20. //=0 mean NULL, 1 mean first valid directory
; 21. BYTE fselDirLayer; //当前目录层次.与fselDirNo[]共同记录当前目录在目录树中的位置.
; 22. //************************************************************************
; 23. //fselDirLayer == 0, fselDirNo[0] == 0; 表示根目录
; 24. //fselDirLayer == 0, fselDirNo[0] == 1; 表示根目录下第一个子目录.
; 25. //fselDirLayer == 1, fselDirNo[0] == 1, fselDirNo[1] == 1;表示根目录下第一个子目录中第一个子目录.
; 26. //************************************************************************
; 27. WORD fselTotal; //Total of current select file
; 28.
; 29. extern comval_t g_comval;
; 30.
; 31. #pragma memory=constseg(MOD_EH_API)
; 32. /* music: mp3, wma, asf, wmv
; 33. * voice: act, wav
; 34. */
; 35. #ifdef __OGG_SUPPORT
; 36. const char ExtMusic2[][4] = {"MP3", "WMA", "ASF", "WMV", "OGG","APE","WAV","ACT","JPG","BMP","GIF","TXT","AMV"};
; 37. #endif
; 38. #ifndef __OGG_SUPPORT
; 39. const char ExtMusic2[][4] = {"MP3", "WMA", "ASF", "WMV","APE"};
; 40. #endif
; 41. const char ExtVoice2[][4] = {"WAV", "ACT"};
; 42. const char RootName2[] = {":"};
; 43. const char IgnoreExt2[4] = {"* "};
; 44.
; 45. const char ExtDsc2[][4] = {"JPG","BMP","GIF"};
; 46. const char ExtTxt2[][4] = {"TXT"};
; 47. const char ExtAmv2[][4] = {"AMV"};
; 48. #pragma memory=default
; 49.
; 50.
; 51. #pragma memory=dataseg(MOC_EH_FSLAPI)
; 52. char m_szTemp[12];
; 53. char m_szTemp1[12];
; 54. #pragma memory=default
; 55.
; 56.
; 57. #pragma codeseg(MO_EH_FSLAPI)
; 58. BOOL ToDirEntry(char *strDir, const WORD Num);
; 59. /********************************************************************************
; 60. * Description : Initialize the the file selector parament.
; 61. *
; 62. * Arguments :
; 63. * type: music or voice
; 64. mode: 6 kinds mode
; 65. * Returns :
; 66. * TRUE: Successful
; 67. * FALSE: Fail, detail information in fselError
; 68. * Notes : Should select path in the case of only file name is invalid
; 69. *
; 70. ********************************************************************************/
; 71. void Init(unsigned char type, BYTE mode)
; 72. {
PUSH IX
PUSH BC
PUSH DE
; 73. BYTE i;
; 74.
; 75. fselType = type;
LD A,E
LD (fselType),A
; 76. fselDirLayer = 0;
XOR A
LD (fselDirLayer),A
; 77. fselMode = mode;
LD A,C
LD (fselMode),A
; 78. for(i=0; i<TOTALDIRLAYER; i++)
LD IXL,0
?0001:
LD A,IXL
CP 8
JR NC,?0000
?0002:
; 79. fselDirNo[i] = 0;
LD C,IXL
LD B,0
LD HL,fselDirNo
ADD HL,BC
LD (HL),B
INC IXL
JR ?0001
?0000:
; 80. fselFileNo = 0;
LD HL,0
LD (fselFileNo),HL
; 81. fselExtNo = 0;
XOR A
LD (fselExtNo),A
; 82. fselError = 0;
LD (fselError),A
; 83. fselTotal = 0;
LD (fselTotal),HL
; 84. //return root dir
; 85. FS_CD(":");
LD DE,?0004
CALL LWRD FS_CD
; 86. }
POP HL
POP HL
POP IX
JP LWRD ?BANK_FAST_LEAVE_L08
GetExtBuf:
; 87. /********************************************************************************
; 88. * Description : Get name buffer of current extend
; 89. *
; 90. * Arguments : None
; 91. * Returns : the buffer of current file extend name
; 92. * Notes : None
; 93. *
; 94. ********************************************************************************/
; 95. char * GetExtBuf(void)
; 96. {
PUSH BC
; 97. output8(0x4e,input8(0x4e)|0x8);
IN A,(78)
SET 3,A
OUT (78),A
; 98. if ( fselType == FSEL_TYPE_MUSIC)
LD A,(fselType)
OR A
JR NZ,?0006
?0005:
; 99. return ExtMusic2[fselExtNo];
LD HL,(fselExtNo)
LD H,A
ADD HL,HL
ADD HL,HL
LD BC,ExtMusic2
JR ?0166
?0006:
; 100. else if( fselType == FSEL_TYPE_VOICE)
DEC A
JR NZ,?0008
?0007:
; 101. return ExtVoice2[fselExtNo];
LD HL,(fselExtNo)
LD H,A
ADD HL,HL
ADD HL,HL
LD BC,ExtVoice2
JR ?0166
?0008:
; 102. else if( fselType == FSEL_TYPE_DSC)
LD A,(fselType)
CP 3
JR NZ,?0010
?0009:
; 103. return ExtDsc2[fselExtNo];
LD HL,(fselExtNo)
LD H,0
ADD HL,HL
ADD HL,HL
LD BC,ExtDsc2
JR ?0166
?0010:
; 104. else if(fselType == FSEL_TYPE_AMV)
CP 5
LD HL,(fselExtNo)
LD H,0
ADD HL,HL
ADD HL,HL
JR NZ,?0012
?0011:
; 105. return ExtAmv2[fselExtNo];
LD BC,ExtAmv2
JR ?0166
; 106. else
?0012:
; 107. return ExtTxt2[fselExtNo];
LD BC,ExtTxt2
?0166:
ADD HL,BC
; 108. }
?0013:
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
fselInit:
; 109. /********************************************************************************
; 110. * Description : Initialize the FSEL module
; 111. *
; 112. * Arguments :
; 113. type: Select type, is FSEL_TYPE_MUSIC or FSEL_TYPE_VOICE
; 114. * mode: Select mode, is FSEL_ALL_SEQUENCE or FSEL_ALL_REPEATONE ...
; 115. * DirLevel: Directory deep level, 0 or 1 now.
; 116. *
; 117. * Returns :
; 118. * TRUE: Successful,
; 119. * FALSE: Fail, detail information in fselError.
; 120. * Notes :Must call it before call other fsel Module functions
; 121. *
; 122. ********************************************************************************/
; 123. BOOL fselInit(unsigned char type, BYTE mode, BYTE PlayListOrCommonDir, BYTE CardOrFlash)
; 124. {
PUSH BC
PUSH DE
; 125. fselDiskLetter = 0x00;
XOR A
LD (fselDiskLetter),A
; 126.
; 127. if ( CardOrFlash == 'C' )
LD HL,10
ADD HL,SP
LD A,(HL)
CP 67
JR NZ,?0015
?0014:
; 128. {
; 129. if ( !DRV_ActiveDrive('C', 1) )
LD C,1
LD E,67
CALL LWRD DRV_ActiveDrive
OR A
JR Z,?0021
?0016:
; 130. goto DiskError;
?0017:
; 131. fselDiskLetter = 'C';
LD A,67
JR ?0175
?0015:
; 132. }
; 133. else if ( CardOrFlash == 'H' )
CP 72
JR NZ,?0021
?0020:
; 134. {
; 135. if ( !DRV_ActiveDrive('H', 1) )
LD C,1
LD E,72
CALL LWRD DRV_ActiveDrive
OR A
JR Z,?0021
?0022:
; 136. goto DiskError;
?0023:
; 137. fselDiskLetter = 'H';
LD A,72
?0175:
LD (fselDiskLetter),A
; 138. }
; 139. else
JR ?0024
?0021:
?0018:
; 140. {
; 141. DiskError:
; 142. fselError = FSEL_ERR_DISK;
LD A,22
JR ?0177
; 143. return FALSE;
; 144. }
?0024:
?0019:
; 145.
; 146. if(!FS_Init())
CALL LWRD FS_Init
OR A
JR NZ,?0026
?0025:
; 147. {
; 148. fselError = FSEL_ERR_FS;
LD A,20
?0177:
LD (fselError),A
; 149. return FALSE;
JR ?0030
; 150. }
?0026:
; 151.
; 152. Init(type,mode);
LD HL,2
ADD HL,SP
LD C,(HL)
DEC HL
DEC HL
LD E,(HL)
LD A,BYTE3 Init
LD HL,LWRD Init
CALL LWRD ?BANK_CALL_DIRECT_L08
; 153.
; 154. if (PlayListOrCommonDir == FSEL_TYPE_COMMONDIR)
LD HL,8
ADD HL,SP
XOR A
OR (HL)
JR Z,?0179
?0027:
; 155. {
; 156. fselPLOrCommonDir = FSEL_TYPE_COMMONDIR;
; 157. return TRUE;
; 158. }
?0028:
; 159. else if (PlayListOrCommonDir == FSEL_TYPE_PLAYLIST)
LD B,A
DEC B
JR NZ,?0030
?0029:
; 160. {
; 161. fselPLOrCommonDir = FSEL_TYPE_PLAYLIST;
LD A,1
?0179:
LD (fselPLOrCommonDir),A
; 162. }
; 163. else
JR ?0031
?0030:
; 164. {
; 165. return FALSE;
LD L,0
; 166. }
JR ?0032
?0031:
; 167. return TRUE;
LD L,1
; 168. }
?0032:
POP AF
POP AF
JP LWRD ?BANK_FAST_LEAVE_L08
fselNextDir:
; 169. /********************************************************************************
; 170. * Description : Select the next directory of current select directory
; 171. *
; 172. * Arguments :
; 173. * strDir: Dos 8.3 directory name of the next.
; 174. *
; 175. * Returns :
; 176. * TRUE: success.
; 177. * FALSE: fail, detail info store in fselError.
; 178. * Notes : None
; 179. *
; 180. ********************************************************************************/
; 181. BOOL fselNextDir(char *strDir)
; 182. {
PUSH BC
PUSH IX
PUSH DE
; 183. WORD wtemp;
; 184. wtemp = fselDirNo[fselDirLayer];
LD BC,(fselDirLayer)
LD B,0
LD HL,fselDirNo
ADD HL,BC
LD C,(HL)
PUSH BC
POP IX
; 185. wtemp ++; //指向下一个文件
; 186. if (! ToDirEntry(strDir, wtemp))
INC IX
PUSH IX
POP BC
LD A,BYTE3 ToDirEntry
LD HL,LWRD ToDirEntry
CALL LWRD ?BANK_CALL_DIRECT_L08
INC L
DEC L
JR Z,?0035
?0033:
; 187. {
; 188. return FALSE;
; 189. }
?0034:
; 190. fselDirNo[fselDirLayer] = wtemp;
LD BC,(fselDirLayer)
LD B,0
LD HL,fselDirNo
ADD HL,BC
PUSH IX
POP BC
LD (HL),C
; 191. return TRUE;
LD L,1
; 192. }
?0035:
POP AF
POP IX
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
ToDirEntry:
; 193. /********************************************************************************
; 194. * Description : seek to specify Directory Entry
; 195. *
; 196. * Arguments :
; 197. * strDir: Dos 8.3 Directory name
; 198. * num: number of the Directory Entry to seek
; 199. *
; 200. * Returns :
; 201. * TRUE: Successful
; 202. * FALSE: Fail, detail information in fselError
; 203. * Notes :
; 204. *
; 205. ********************************************************************************/
; 206. BOOL ToDirEntry(char *strDir, const WORD Num)
; 207. {
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH BC
PUSH DE
LD HL,100
AND A
SBC HL,BC
JR C,?0184
; 208. WORD temp;
; 209.
; 210. if ( Num > FSEL_MAX_DIRNUM || Num < 1 )
LD BC,1
LD L,(IX-2)
LD H,(IX-1)
SBC HL,BC
JR C,?0184
?0038:
?0039:
?0036:
; 211. {
; 212. fselError = FSEL_ERR_OUTOF;
; 213. return FALSE;
; 214. }
?0037:
; 215.
; 216. memset(strDir,0x00,12);
LD C,12
LD L,B
CALL LWRD ?MEMSET_L11
; 217. if (!FS_Dir(strDir, IgnoreExt2, FS_DIR_DIR))
LD C,129
PUSH BC
LD BC,IgnoreExt2
CALL LWRD FS_Dir
POP HL
OR A
JR Z,?0184
?0040:
; 218. {
; 219. fselError = FSEL_ERR_OUTOF;
; 220. return FALSE;
; 221. }
?0041:
; 222. if (Num ==1)
LD A,1
XOR (IX-2)
OR (IX-1)
JR Z,?0180
?0042:
; 223. return TRUE;
?0043:
; 224.
; 225. ///seek to the specify directory entry
; 226. temp = 2;
LD IY,2
?0045:
; 227. while ( temp <= Num)
PUSH IY
POP BC
LD L,(IX-2)
LD H,(IX-1)
AND A
SBC HL,BC
JR C,?0044
?0046:
; 228. {
; 229. if (!FS_Dir(strDir, IgnoreExt2, FS_DIR_DIR_CONT))
LD C,1
PUSH BC
LD BC,IgnoreExt2
LD E,(IX-4)
LD D,(IX-3)
CALL LWRD FS_Dir
POP HL
OR A
JR NZ,?0048
?0047:
; 230. {
; 231. fselError = FSEL_ERR_OUTOF;
?0184:
LD A,1
LD (fselError),A
; 232. return FALSE;
LD L,0
; 233. }
JR ?0049
?0048:
; 234. temp++;
INC IY
JR ?0045
?0044:
; 235. }
; 236. output8(0x4e,input8(0x4e)|0x8);
IN A,(78)
SET 3,A
OUT (78),A
; 237. return TRUE;
?0180:
LD L,1
; 238. }
?0049:
LD SP,IX
POP IX
POP IY
JP LWRD ?BANK_FAST_LEAVE_L08
fselGetLocationC:
; 239. /********************************************************************************
; 240. * Description : Get the selected location
; 241. *
; 242. * Arguments :
; 243. * location: the buffer to store location
; 244. * Returns :
; 245. * TRUE: Successful
; 246. * FALSE: Fail, detail information in fselError.
; 247. * Notes : None
; 248. *
; 249. ********************************************************************************/
; 250. BOOL fselGetLocationC(file_location_t *location)
; 251. {
PUSH DE
; 252. #if 0
; 253. BYTE i;
; 254. long lEntry;
; 255. location->disk = fselDiskLetter;
; 256.
; 257. for(i=0; i<TOTALDIRLAYER; i++)
; 258. location->DirNo[i] = fselDirNo[i];
; 259.
; 260. location->ClusterNo = FS_GetCurDir();
; 261. location->dirLayer = fselDirLayer;
; 262.
; 263. lEntry = FS_GetCurDirEntry();
; 264. if (fselFileNo != 0 )
; 265. {
; 266. if ( !fselGetByNO(location->filename, fselFileNo) )
; 267. {
; 268. location->filename[0] = 0x00;
; 269. location->path[0] = ':';
; 270. location->dirLayer = 0;
; 271. return FALSE;
; 272. }
; 273. }
; 274. else
; 275. location->filename[0] = 0x00;
; 276.
; 277. // 只有在fselDirNo[0] == 0时,当前目录是根目录.
; 278. if ( fselDirLayer > 7 || fselDirNo[0] == 0)
; 279. {
; 280. m_szTemp1[0] = ':';
; 281. fselDirNo[0] = 0;
; 282. fselDirLayer = 0;
; 283. }
; 284. else
; 285. {
; 286. FS_CD("\\");
; 287. ToDirEntry(m_szTemp1,fselDirNo[fselDirLayer]);
; 288. }
; 289. output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
; 290. memcpy(location->path, m_szTemp1, 11);
; 291. FS_CD(m_szTemp1);
; 292.
; 293. FS_SetCurDirEntry(lEntry);
; 294. return TRUE;
; 295. #endif
; 296. }
POP HL
JP LWRD ?BANK_FAST_LEAVE_L08
ToNextExt:
; 297. /********************************************************************************
; 298. * Description : Seek to the next file extend name
; 299. *
; 300. * Arguments : none
; 301. * Returns :
; 302. TRUE: Successful
; 303. FALSE: fail.
; 304. * Notes : None
; 305. *
; 306. ********************************************************************************/
; 307. bool ToNextExt(void)
; 308. {
; 309. fselExtNo ++;
LD HL,fselExtNo
INC (HL)
; 310. output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
IN A,(78)
SET 3,A
OUT (78),A
; 311. if ( fselType == FSEL_TYPE_MUSIC)
LD A,(fselType)
OR A
JR NZ,?0051
?0050:
; 312. {
; 313. if (fselExtNo>=NAVI_FILE_TYPE_NUM)
LD A,(fselExtNo)
CP 13
JR C,?0073
?0052:
; 314. {
; 315. fselExtNo = 0;
JR ?0196
; 316. return FALSE;
; 317. }
?0053:
?0051:
; 318. }
; 319. else if(fselType == FSEL_TYPE_VOICE)
DEC A
JR NZ,?0056
?0055:
; 320.
; 321. {
; 322. if (fselExtNo>=FSEL_VOICE_EXTNUM)
LD A,(fselExtNo)
CP 2
JR C,?0073
?0057:
; 323. {
; 324. fselExtNo = 0;
JR ?0196
; 325. return FALSE;
; 326. }
?0058:
?0056:
; 327. }
; 328.
; 329. else if(fselType == FSEL_TYPE_DSC)
LD A,(fselType)
CP 3
JR NZ,?0061
?0060:
; 330.
; 331. {
; 332. if(fselExtNo>=FSEL_DSC_EXTNUM)
LD A,(fselExtNo)
CP 3
JR C,?0073
?0062:
; 333.
; 334. {
; 335. fselExtNo = 0;
JR ?0196
; 336. return FALSE;
; 337. }
?0063:
?0061:
; 338.
; 339. }
; 340. else if(fselType == FSEL_TYPE_AMV)
CP 5
JR NZ,?0066
?0065:
; 341. {
; 342. if(fselExtNo>=FSEL_AMV_EXTNUM)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?