📄 navi_read.s01
字号:
NAME navi_read(17)
RSEG APC_NAVI_UI_READ(0)
RSEG APD_NAVI_READ(0)
EXTERN CurListoffset
EXTERN CurTotalNum
EXTERN FS_FRead
EXTERN FS_FSeek
EXTERN Navfileoffset
PUBLIC Navi_read
PUBLIC Navi_read_head
EXTERN Navifp
EXTERN buffer
PUBLIC file_info
PUBLIC g_path_info
EXTERN navi_buff
EXTERN ?CLZ80B_4_04_L00
EXTERN ?S_LSH_L02
EXTERN ?S_MUL_L02
EXTERN ?L_LSH_L03
EXTERN ?SL_DIV_L03
EXTERN ?SL_MOD_L03
EXTERN ?SL_CMP_L03
EXTERN ?L_ADDASG_L03
EXTERN ?BANK_CALL_DIRECT_L08
EXTERN ?BANK_LEAVE_DIRECT_L08
EXTERN ?BANK_FAST_LEAVE_L08
EXTERN ?ENT_AUTO_DIRECT_L09
EXTERN ?MEMSET_L11
RSEG APC_NAVI_UI_READ
Navi_read:
; 1. #include "ap_music.h"
; 2. extern handle Navifp;
; 3. extern long CurListoffset; //每个表的偏移量
; 4. extern long CurTotalNum;
; 5. extern long Navfileoffset; //当前表的已经读的偏移量
; 6. extern BOOL Navi_read(long fileoffset);
; 7. #pragma memory=dataseg(APD_NAVI)
; 8. extern char navi_buff[NAVI_GROUP*30];
; 9. extern char buffer[512];
; 10. #pragma memory=default
; 11.
; 12. #pragma memory=dataseg(APD_NAVI_READ)
; 13.
; 14. file_info_t file_info;
; 15. Location_Path_t g_path_info;
; 16. #pragma memory=default
; 17.
; 18.
; 19. #pragma codeseg(APC_NAVI_UI_READ)
; 20.
; 21.
; 22.
; 23.
; 24. BOOL Navi_read(long fileoffset)
; 25. {
PUSH BC
PUSH DE
PUSH AF
; 26. BOOL result=TRUE;
; 27. char IO27Bak = input8(0x27);
IN A,(39)
LD HL,1
ADD HL,SP
LD (HL),A
; 28. output8(0x27,0); //关DSP中断
XOR A
OUT (39),A
; 29. if(FS_FSeek(fileoffset/512,FS_SEEK_FFROMSTART,Navifp))
DEC HL
LD (HL),1
LD HL,(Navifp)
PUSH HL
LD L,A
PUSH HL
LD H,L
PUSH HL
LD H,2
PUSH HL
EX DE,HL
CALL LWRD ?SL_DIV_L03
EX DE,HL
CALL LWRD FS_FSeek
POP HL
POP HL
OR A
JR Z,?0003
?0002:
; 30. {
; 31. if(!FS_FRead(buffer,1,Navifp))
LD HL,(Navifp)
PUSH HL
LD C,1
LD DE,buffer
CALL LWRD FS_FRead
POP HL
OR A
JR NZ,?0006
?0004:
; 32. result= FALSE;
?0005:
; 33. }
; 34. else
?0003:
; 35. result= FALSE;
LD L,A
LD H,A
ADD HL,SP
LD (HL),A
?0006:
; 36. output8(0x27,IO27Bak);
LD HL,1
ADD HL,SP
LD A,(HL)
OUT (39),A
; 37. return result;
DEC HL
LD L,(HL)
; 38. }
POP AF
POP AF
POP AF
JP LWRD ?BANK_FAST_LEAVE_L08
Navi_read_head:
; 39.
; 40. BOOL Navi_read_head(long fileoffset,char direct,WORD *DelNum)
; 41. {
CALL LWRD ?ENT_AUTO_DIRECT_L09
DEFW 65518
; 42.
; 43.
; 44. BOOL result=TRUE;
; 45. char msz_temp[12];
; 46. char count=0;
; 47. long End;
; 48.
; 49. memset(msz_temp,0,11);
LD BC,11
LD HL,6
ADD HL,SP
EX DE,HL
LD L,B
LD H,B
CALL LWRD ?MEMSET_L11
; 50. memset(&file_info,0,sizeof(file_info_t));
LD BC,64
LD DE,file_info
CALL LWRD ?MEMSET_L11
; 51. if(fileoffset==0)
LD A,(IX+2)
OR (IX+3)
OR (IX+4)
OR (IX+5)
JR NZ,?0008
?0007:
; 52. {
; 53. msz_temp[0]='R';
LD (IX-12),82
; 54. msz_temp[1]='O';
LD (IX-11),79
; 55. msz_temp[2]='O';
LD (IX-10),79
; 56. msz_temp[3]='T';
LD (IX-9),84
; 57. msz_temp[4]=0;
LD (IX-8),H
; 58. file_info.PathorFile =1 ; //root
JR ?0037
; 59. }
; 60. else
?0008:
; 61. {
; 62. msz_temp[0]='\\';
LD (IX-12),92
; 63. msz_temp[1]=0;
LD (IX-11),H
; 64. file_info.PathorFile =1 ; //parent
?0037:
LD A,1
LD (file_info),A
?0009:
; 65. }
; 66.
; 67.
; 68.
; 69. result= Navi_read(fileoffset);
LD C,(IX+4)
LD B,(IX+5)
LD E,(IX+2)
LD D,(IX+3)
CALL LWRD ?0039
LD (IX-17),L
; 70.
; 71. if(direct==0)
XOR A
OR (IX+10)
JP NZ,?0011
?0010:
; 72. {
; 73. CurListoffset=fileoffset;
LD C,(IX+4)
LD B,(IX+5)
LD L,(IX+2)
LD H,(IX+3)
LD (CurListoffset),HL
LD (CurListoffset+2),BC
; 74. if(fileoffset%512+sizeof(Location_Path_t)<512)
LD L,A
LD H,A
PUSH HL
LD H,2
PUSH HL
LD H,L
PUSH HL
LD H,2
PUSH HL
CALL LWRD ?0040
PUSH BC
PUSH HL
LD HL,64
POP BC
ADD HL,BC
EX DE,HL
LD L,A
LD H,A
POP BC
ADC HL,BC
LD C,L
LD B,H
EX DE,HL
CALL LWRD ?SL_CMP_L03
JR NC,?0013
?0012:
; 75. memcpy(&g_path_info,buffer+fileoffset%512,sizeof(Location_Path_t));
LD BC,64
LD DE,g_path_info
LD L,B
LD H,B
PUSH HL
LD H,2
PUSH HL
CALL LWRD ?0041
LD BC,buffer
ADD HL,BC
LD BC,64
JP LWRD ?0038
; 76. else
?0013:
; 77. {
; 78. End = 512-fileoffset%512;
LD L,A
LD H,A
PUSH HL
LD H,2
PUSH HL
CALL LWRD ?0041
LD E,C
LD D,B
LD C,L
LD B,H
LD HL,512
SBC HL,BC
LD C,L
LD B,H
LD L,A
LD H,A
SBC HL,DE
PUSH HL
LD L,C
LD (IX-16),L
LD H,B
LD (IX-15),H
POP BC
LD (IX-14),C
LD (IX-13),B
; 79. memcpy(&g_path_info,buffer+fileoffset%512,End);
PUSH HL
LD DE,g_path_info
LD L,A
LD H,A
PUSH HL
LD H,2
PUSH HL
CALL LWRD ?0041
LD BC,buffer
ADD HL,BC
POP BC
LD A,C
OR B
JR Z,?0035
LDIR
?0035:
; 80. fileoffset = fileoffset+End;
LD HL,20
ADD HL,SP
LD C,(IX-14)
LD B,(IX-13)
LD E,(IX-16)
LD D,(IX-15)
CALL LWRD ?L_ADDASG_L03
; 81. result= Navi_read(fileoffset);
CALL LWRD ?0039
LD (IX-17),L
; 82. memcpy(&g_path_info+End,buffer+fileoffset%512,sizeof(Location_Path_t)-End);
LD C,(IX-16)
LD B,(IX-15)
LD HL,64
AND A
SBC HL,BC
PUSH HL
LD E,C
LD D,B
LD B,6
CALL LWRD ?S_LSH_L02
LD HL,g_path_info
ADD HL,DE
EX DE,HL
LD HL,0
PUSH HL
LD H,2
PUSH HL
CALL LWRD ?0041
LD BC,buffer
ADD HL,BC
POP BC
LD A,C
OR B
JR Z,?0036
?0038:
LDIR
?0036:
?0014:
; 83. }
; 84. if(g_path_info.PathorFile!=0)
LD A,(g_path_info)
OR A
JR Z,?0016
?0015:
; 85. return FALSE;
LD L,0
JP LWRD ?0032
?0016:
; 86. CurTotalNum = g_path_info.DirNum + g_path_info.FileNum +1-g_path_info.DelFileNum;
LD HL,(g_path_info+37)
LD E,A
LD D,A
PUSH DE
PUSH HL
LD HL,g_path_info+31
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD E,(HL)
INC HL
LD D,(HL)
PUSH DE
PUSH BC
LD HL,(g_path_info+27)
POP BC
ADD HL,BC
EX DE,HL
LD HL,(g_path_info+29)
POP BC
ADC HL,BC
EX DE,HL
AND A
POP BC
SBC HL,BC
EX DE,HL
POP BC
SBC HL,BC
PUSH HL
PUSH DE
LD HL,1
POP BC
ADD HL,BC
EX DE,HL
LD L,A
LD H,A
POP BC
ADC HL,BC
LD C,L
LD B,H
EX DE,HL
LD (CurTotalNum),HL
LD (CurTotalNum+2),BC
; 87. Navfileoffset = CurListoffset+sizeof(Location_Path_t); //有可能越界
LD L,A
LD H,A
PUSH HL
LD L,64
PUSH HL
LD HL,(CurListoffset)
POP BC
ADD HL,BC
EX DE,HL
LD HL,(CurListoffset+2)
POP BC
ADC HL,BC
LD C,L
LD B,H
EX DE,HL
LD (Navfileoffset),HL
LD (Navfileoffset+2),BC
; 88. *DelNum = g_path_info.DelFileNum;
LD HL,(g_path_info+37)
PUSH HL
LD L,(IX+12)
LD H,(IX+13)
POP BC
LD (HL),C
INC HL
LD (HL),B
?0011:
; 89. }
; 90.
; 91.
; 92. //write root information
; 93. //for display
; 94. memset(navi_buff,0,30*NAVI_GROUP);
LD BC,180
LD DE,navi_buff
LD L,B
CALL LWRD ?MEMSET_L11
; 95. if((direct==0))
XOR A
OR (IX+10)
JR NZ,?0018
?0017:
; 96. {
; 97. memcpy(file_info.filename,msz_temp,11);
LD BC,11
LD DE,file_info+1
LD HL,6
ADD HL,SP
LDIR
; 98. file_info.Nextoffset=g_path_info.Parentoffset;
LD HL,(g_path_info+35)
LD (file_info+13),HL
; 99. memcpy(navi_buff,&file_info,16);
LD C,16
LD DE,navi_buff
LD HL,file_info
LDIR
; 100. memcpy(navi_buff+28,&g_path_info.Parentoffset,2);
INC BC
INC BC
LD DE,navi_buff+28
LD HL,g_path_info+35
LDIR
; 101. count = 1;
LD (IX-18),1
; 102.
; 103. }
; 104. else
JR ?0019
?0018:
; 105. {
; 106. Navfileoffset = fileoffset; //有可能越界
LD C,(IX+4)
LD B,(IX+5)
LD L,(IX+2)
LD H,(IX+3)
LD (Navfileoffset),HL
LD (Navfileoffset+2),BC
; 107. count = 0;
LD (IX-18),0
?0019:
; 108.
; 109. }
; 110. End = CurListoffset+(CurTotalNum-1+ *DelNum)*sizeof(file_info_t)+sizeof(Location_Path_t);
LD L,(IX+12)
LD H,(IX+13)
LD B,(HL)
INC HL
LD H,(HL)
LD L,B
LD BC,0
PUSH BC
PUSH HL
LD HL,(CurTotalNum)
POP BC
ADD HL,BC
EX DE,HL
LD HL,(CurTotalNum+2)
POP BC
ADC HL,BC
PUSH HL
PUSH DE
LD HL,65535
POP BC
ADD HL,BC
EX DE,HL
LD HL,65535
POP BC
ADC HL,BC
LD C,L
LD B,H
EX DE,HL
LD A,6
CALL LWRD ?L_LSH_L03
PUSH BC
PUSH HL
LD HL,(CurListoffset)
POP BC
ADD HL,BC
EX DE,HL
LD HL,(CurListoffset+2)
POP BC
ADC HL,BC
PUSH HL
PUSH DE
LD HL,64
POP BC
ADD HL,BC
EX DE,HL
LD HL,0
POP BC
ADC HL,BC
LD C,L
LD B,H
EX DE,HL
LD (IX-16),L
LD (IX-15),H
LD (IX-14),C
LD (IX-13),B
?0021:
; 111. while(count<NAVI_GROUP)
LD A,(IX-18)
CP 6
JP NC,?0020
?0022:
; 112. {
; 113. if(Navfileoffset<End)
LD L,(IX-14)
LD H,(IX-13)
PUSH HL
LD L,(IX-16)
LD H,(IX-15)
PUSH HL
LD BC,(Navfileoffset+2)
LD HL,(Navfileoffset)
CALL LWRD ?SL_CMP_L03
JP NC,?0020
?0023:
; 114. {
; 115. if(Navfileoffset%512==0)
LD HL,0
PUSH HL
LD H,2
PUSH HL
LD HL,(Navfileoffset)
CALL LWRD ?SL_MOD_L03
LD A,L
OR H
OR C
OR B
JR NZ,?0028
?0025:
; 116. {
; 117. if(!Navi_read(Navfileoffset))
LD BC,(Navfileoffset+2)
LD DE,(Navfileoffset)
CALL LWRD ?0039
INC L
DEC L
JR NZ,?0028
?0027:
; 118. {
; 119.
; 120. result=FALSE;
LD (IX-17),L
; 121. break;
JP LWRD ?0020
?0028:
?0026:
; 122. }
; 123.
; 124.
; 125.
; 126. }
; 127. if(*(buffer+Navfileoffset%512)!=3)
LD HL,0
PUSH HL
LD H,2
PUSH HL
LD BC,(Navfileoffset+2)
LD HL,(Navfileoffset)
CALL LWRD ?SL_MOD_L03
LD BC,buffer
ADD HL,BC
LD A,(HL)
CP 3
JR Z,?0030
?0029:
; 128. {
; 129. //memcpy(navi_buff+count*16,buffer+Navfileoffset%512,16);
; 130. memcpy(navi_buff+count*30,buffer+Navfileoffset%512,1);
LD BC,1
CALL LWRD ?0042
LD HL,navi_buff
ADD HL,DE
EX DE,HL
LD L,B
LD H,B
PUSH HL
LD H,2
PUSH HL
LD BC,(Navfileoffset+2)
LD HL,(Navfileoffset)
CALL LWRD ?SL_MOD_L03
LD BC,buffer
ADD HL,BC
LD BC,1
LDIR
; 131. memcpy(navi_buff+count*30+1,buffer+Navfileoffset%512+17,27);
LD HL,navi_buff+1
CALL LWRD ?0042
ADD HL,DE
EX DE,HL
PUSH DE
LD C,B
PUSH BC
LD B,2
PUSH BC
LD BC,(Navfileoffset+2)
LD HL,(Navfileoffset)
CALL LWRD ?SL_MOD_L03
EX DE,HL
LD HL,buffer+17
ADD HL,DE
POP DE
LD BC,27
LDIR
; 132. navi_buff[count*30+27]=0;
LD HL,navi_buff+27
LD C,(IX-18)
LD DE,30
CALL LWRD ?S_MUL_L02
ADD HL,DE
LD (HL),B
; 133. memcpy(navi_buff+count*30+28,buffer+Navfileoffset%512+13,2);
LD HL,navi_buff+28
LD E,C
CALL LWRD ?0043
ADD HL,DE
EX DE,HL
PUSH DE
LD C,B
PUSH BC
LD B,2
PUSH BC
LD BC,(Navfileoffset+2)
LD HL,(Navfileoffset)
CALL LWRD ?SL_MOD_L03
EX DE,HL
LD HL,buffer+13
ADD HL,DE
POP DE
LD BC,2
LDIR
; 134.
; 135. count++;
INC (IX-18)
?0030:
; 136. }
; 137. Navfileoffset=Navfileoffset+sizeof(file_info_t);
LD HL,Navfileoffset
LD BC,0
LD DE,64
CALL LWRD ?L_ADDASG_L03
; 138.
; 139. }
; 140. else
?0024:
; 141. break;
?0031:
JP LWRD ?0021
?0020:
; 142.
; 143. }
; 144.
; 145. return result;
LD L,(IX-17)
; 146.
; 147. }
?0032:
JP LWRD ?BANK_LEAVE_DIRECT_L08
?0039:
LD A,BYTE3 Navi_read
LD HL,LWRD Navi_read
JP LWRD ?BANK_CALL_DIRECT_L08
?0041:
LD C,(IX+4)
LD B,(IX+5)
?0040:
LD L,(IX+2)
LD H,(IX+3)
JP LWRD ?SL_MOD_L03
?0042:
LD E,(IX-18)
?0043:
LD D,B
LD C,30
JP LWRD ?S_MUL_L02
; 148.
RSEG APD_NAVI_READ
file_info:
DEFS 64
g_path_info:
DEFS 64
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -