sort_store_list.s01
来自「炬力方案176*132软件源码,适用于AK1025」· S01 代码 · 共 575 行
S01
575 行
NAME sort_store_list(17)
RSEG APC_LIST_FUN2(0)
RSEG CSTR(0)
RSEG APD_LIST_FUN2(0)
EXTERN FS_CD
EXTERN FS_FClose
EXTERN FS_FCreate
EXTERN FS_FWrite
EXTERN SetDspMips
PUBLIC SortStoreListToFile
PUBLIC StoreList
PUBLIC WriteVmData
PUBLIC WritrVMBuffer
EXTERN g_file_total
EXTERN list_sort
EXTERN ?CLZ80B_4_04_L00
EXTERN ?SS_DIV_L02
EXTERN ?SS_MOD_L02
EXTERN ?S_MUL_L02
EXTERN ?C_S_SWITCH_L06
EXTERN ?BANK_CALL_DIRECT_L08
EXTERN ?BANK_FAST_LEAVE_L08
EXTERN ?MEMSET_L11
RSEG APC_LIST_FUN2
WriteVmData:
; 1. #include "musiclist.h"
; 2. extern unsigned int g_file_total;
; 3. #pragma memory=dataseg(APD_LIST_FUN2)
; 4. char WritrVMBuffer[512];
; 5. #pragma memory=default
; 6.
; 7. #pragma codeseg(APC_LIST_FUN2)
; 8.
; 9. void WriteVmData(char *DataAddress,int PageNum,handle listhandle,BYTE DataType)
; 10. {
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH BC
PUSH DE
LD HL,65520
ADD HL,SP
LD SP,HL
; 11. unsigned int index_address;
; 12. unsigned int file_counter = 0;
; 13. int i,j;
; 14. int *page_address = (int *)DataAddress ;
LD (IX-12),E
LD (IX-11),D
; 15. char *store_data =DataAddress+2;
; 16. char *store_location=DataAddress;
; 17. BYTE IO05bak = input8(0x05);
IN A,(5)
LD (IX-6),A
; 18. for(i=0;i<PageNum;i++)
XOR A
LD (IX-18),A
LD (IX-17),A
LD (IX-16),A
LD (IX-15),A
?0003:
LD C,(IX-2)
LD B,(IX-1)
LD L,(IX-16)
LD H,(IX-15)
OR 128
SBC HL,BC
JP PO,?0044
XOR H
?0044:
JP P,?0002
?0004:
; 19. {
; 20. output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
IN A,(78)
SET 3,A
OUT (78),A
; 21. switch(DataType)
LD E,(IX+10)
CALL LWRD ?C_S_SWITCH_L06
DEFB 0
DEFW 4
DEFW ?0006
DEFW ?0007
DEFW ?0008
DEFW ?0009
DEFW ?0010
?0007:
; 22. {
; 23. case 0:
; 24. output8(0x05,0x34);
LD A,52
JR ?0049
; 25. break;
?0008:
; 26. case 1:
; 27. output8(0x05,0x35);
LD A,53
JR ?0049
; 28. break;
?0009:
; 29. case 2:
; 30. output8(0x05,0x36);
LD A,54
JR ?0049
; 31. break;
?0010:
; 32. case 3:
; 33. output8(0x05,0xc0);
LD A,192
?0049:
OUT (5),A
; 34. break;
?0011:
; 35. default:
; 36. break;
?0006:
; 37. }
; 38. // index_address = *page_address;
; 39. for(j=0;j<Pagelist;j++) //每个扇区存储7个文件信息
LD IY,0
?0013:
LD BC,32775
PUSH IY
POP HL
LD A,B
XOR H
LD H,A
SBC HL,BC
JP NC,?0012
?0014:
; 40. {
; 41. index_address = *page_address;
LD L,(IX-12)
LD H,(IX-11)
LD B,(HL)
INC HL
LD H,(HL)
LD L,B
LD (IX-20),L
LD (IX-19),H
; 42. store_data = (char *)(index_address*OneFileInfor+IDMStartAddress+2);
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,16386
ADD HL,BC
LD (IX-10),L
LD (IX-9),H
; 43. memcpy(&WritrVMBuffer[j*71],store_data,OneFileInfor-2);
LD DE,71
PUSH IY
POP BC
CALL LWRD ?S_MUL_L02
LD HL,WritrVMBuffer
ADD HL,DE
EX DE,HL
LD L,(IX-10)
LD H,(IX-9)
LD BC,30
LDIR
; 44. page_address+=OneFileInfor/2; // page_address 为int 型指针 所以要除2
LD HL,8
ADD HL,SP
LD A,(HL)
ADD A,32
LD (HL),A
INC HL
LD A,(HL)
ADC A,0
LD (HL),A
; 45. // 存location
; 46. {
; 47. char BakIO05 = input8(0x05);
IN A,(5)
LD (IX-5),A
; 48. if(index_address<399)
LD BC,399
LD L,(IX-20)
LD H,(IX-19)
AND A
SBC HL,BC
JR NC,?0017
?0016:
; 49. {
; 50. output8(0x05,0xc1);
LD A,193
OUT (5),A
; 51. store_location =(char *)DataAddress + index_address*OneLocationBYTE;
LD BC,41
LD E,(IX-20)
LD D,(IX-19)
JR ?0050
; 52. }
; 53. else
?0017:
; 54. {
; 55. output8(0x05,0xc2);
LD A,194
OUT (5),A
; 56. store_location =(char *)DataAddress + (index_address-399)*OneLocationBYTE;
LD HL,65137
LD C,(IX-20)
LD B,(IX-19)
ADD HL,BC
LD C,L
LD B,H
LD DE,41
?0050:
CALL LWRD ?S_MUL_L02
LD L,(IX-4)
LD H,(IX-3)
ADD HL,DE
LD (IX-8),L
LD (IX-7),H
?0018:
; 57. }
; 58. memcpy(&WritrVMBuffer[30+71*j],store_location,OneLocationBYTE);
LD HL,WritrVMBuffer+30
LD DE,71
PUSH IY
POP BC
CALL LWRD ?S_MUL_L02
ADD HL,DE
EX DE,HL
LD L,(IX-8)
LD H,(IX-7)
LD BC,41
LDIR
; 59. output8(0x05,BakIO05);
LD A,(IX-5)
OUT (5),A
; 60. }
; 61. file_counter++;
INC (IX-18)
JR NZ,?0045
INC (IX-17)
?0045:
; 62. //////////////////////test
; 63. if(file_counter==390)
LD HL,390
LD C,(IX-18)
LD B,(IX-17)
AND A
SBC HL,BC
JR NZ,?0020
?0019:
; 64. output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
IN A,(78)
SET 3,A
OUT (78),A
?0020:
; 65. //////////////////////test
; 66. if(file_counter>g_file_total) //总的存储项
LD HL,(g_file_total)
AND A
SBC HL,BC
JR C,?0012
?0021:
; 67. break;
?0022:
INC IY
JP LWRD ?0013
?0012:
; 68. }
; 69. output8(0x05,IO05bak); //05 端口恢复,否则可能和文件系统冲突
LD A,(IX-6)
OUT (5),A
; 70. output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
IN A,(78)
SET 3,A
OUT (78),A
; 71. FS_FWrite(WritrVMBuffer,1,listhandle); //
LD L,(IX+8)
LD H,(IX+9)
PUSH HL
LD C,1
LD DE,WritrVMBuffer
CALL LWRD FS_FWrite
POP HL
INC (IX-16)
JP NZ,?0003
INC (IX-15)
JP LWRD ?0003
?0002:
; 72. }
; 73. FS_FClose(listhandle); //写文件结束
LD E,(IX+8)
LD D,(IX+9)
CALL LWRD FS_FClose
; 74. }
?0064:
LD SP,IX
POP IX
POP IY
JP LWRD ?BANK_FAST_LEAVE_L08
StoreList:
; 75.
; 76. void StoreList(char *listaddress,int pagenum,char listtype)
; 77. {
PUSH IY
PUSH IX
PUSH DE
PUSH BC
POP IY
; 78. handle TempFileHandle;
; 79. FS_CD(":"); //回根目录创建列表文件
LD DE,?0023
CALL LWRD FS_CD
; 80. switch(listtype)
LD HL,10
ADD HL,SP
LD E,(HL)
CALL LWRD ?C_S_SWITCH_L06
DEFB 0
DEFW 4
DEFW ?0040
DEFW ?0025
DEFW ?0029
DEFW ?0033
DEFW ?0037
?0025:
; 81. {
; 82. case 0:
; 83. //FS_FRemove(TIT2FileName); //删除原来列表
; 84. TempFileHandle = FS_FCreate(TIT2FileName);
LD DE,?0026
CALL LWRD ?0065
; 85. if(TempFileHandle!=NULL)
JR Z,?0040
?0027:
; 86. WriteVmData(listaddress,pagenum,TempFileHandle,0);
LD C,0
JR ?0057
?0028:
; 87. break;
?0029:
; 88.
; 89. case 1: //删除原来列表
; 90. //FS_FRemove(TPE1FileName); //删除原来
; 91. TempFileHandle = FS_FCreate(TPE1FileName);
LD DE,?0030
CALL LWRD ?0065
; 92. if(NULL!= TempFileHandle)
JR Z,?0040
?0031:
; 93. WriteVmData(listaddress,pagenum,TempFileHandle,1);
LD C,1
JR ?0057
?0032:
; 94. break;
?0033:
; 95.
; 96. case 2:
; 97. //FS_FRemove(TALBFileName); //删除原来列表
; 98. TempFileHandle = FS_FCreate(TALBFileName);
LD DE,?0034
CALL LWRD ?0065
; 99. if(NULL!= TempFileHandle)
JR Z,?0040
?0035:
; 100. WriteVmData(listaddress,pagenum,TempFileHandle,2);
LD C,2
JR ?0057
?0036:
; 101. break;
?0037:
; 102.
; 103. case 3:
; 104. //FS_FRemove(FILENAMELSIT); //删除原来列表
; 105. TempFileHandle = FS_FCreate(FILENAMELSIT);
LD DE,?0038
CALL LWRD ?0065
; 106. if(NULL!= TempFileHandle)
JR Z,?0040
?0039:
; 107. WriteVmData(listaddress,pagenum,TempFileHandle,3);
LD C,3
?0057:
PUSH BC
PUSH IX
PUSH IY
POP BC
LD HL,4
ADD HL,SP
LD E,(HL)
INC HL
LD D,(HL)
LD A,BYTE3 WriteVmData
LD HL,LWRD WriteVmData
CALL LWRD ?BANK_CALL_DIRECT_L08
POP HL
POP HL
?0040:
; 108. break;
?0041:
; 109.
; 110. default:
; 111. break;
?0024:
; 112. }
; 113. }
POP HL
POP IX
POP IY
JP LWRD ?BANK_FAST_LEAVE_L08
?0065:
CALL LWRD FS_FCreate
PUSH HL
POP IX
LD A,L
OR H
RET
SortStoreListToFile:
; 114. void SortStoreListToFile(char *liststart,int file_num)
; 115. {
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH BC
PUSH AF
PUSH AF
PUSH DE
POP IY
; 116. char IO05bak = input8(0x05);
IN A,(5)
LD (IX-4),A
; 117. int pagenum = file_num/Pagelist; //VM 的每一页存储7个列表
LD BC,7
LD E,(IX-2)
LD D,(IX-1)
CALL LWRD ?SS_DIV_L02
LD (IX-6),E
LD (IX-5),D
; 118. if(file_num%Pagelist!=0)
LD E,(IX-2)
LD D,(IX-1)
CALL LWRD ?SS_MOD_L02
LD A,E
OR D
JR Z,?0063
?0042:
; 119. pagenum++;
INC (IX-6)
JR NZ,?0063
INC (IX-5)
?0063:
?0043:
; 120. memset( &WritrVMBuffer[497],0,15);
LD C,15
LD DE,WritrVMBuffer+497
LD L,B
LD H,B
CALL LWRD ?MEMSET_L11
; 121. output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
IN A,(78)
SET 3,A
OUT (78),A
; 122. output8(0x05,0x34); //IDM LOW BYTE->TIT2
LD A,52
OUT (5),A
; 123. list_sort(liststart,file_num,OneFileInfor);
LD L,32
PUSH HL
CALL LWRD ?0066
POP HL
; 124. output8(0x05,IO05bak);
LD A,(IX-4)
OUT (5),A
; 125. StoreList(liststart,pagenum,0);
LD C,0
PUSH BC
CALL LWRD ?0067
POP HL
; 126.
; 127. output8(0x05,0x35);
LD A,53
OUT (5),A
; 128. list_sort(liststart,file_num,OneFileInfor);
LD HL,32
PUSH HL
CALL LWRD ?0066
POP HL
; 129. output8(0x05,IO05bak);
LD A,(IX-4)
OUT (5),A
; 130. StoreList(liststart,pagenum,1);
LD C,1
PUSH BC
CALL LWRD ?0067
POP HL
; 131.
; 132. output8(0x05,0x36);
LD A,54
OUT (5),A
; 133. list_sort(liststart,file_num,OneFileInfor);
LD HL,32
PUSH HL
CALL LWRD ?0066
POP HL
; 134. output8(0x05,IO05bak);
LD A,(IX-4)
OUT (5),A
; 135. StoreList(liststart,pagenum,2);
LD C,2
PUSH BC
CALL LWRD ?0067
POP HL
; 136.
; 137. output8(0x05,0xc0);
LD A,192
OUT (5),A
; 138. list_sort(liststart,file_num,OneFileInfor);
LD HL,32
PUSH HL
CALL LWRD ?0066
POP HL
; 139. output8(0x05,IO05bak);
LD A,(IX-4)
OUT (5),A
; 140. StoreList(liststart,pagenum,3);
LD C,3
PUSH BC
CALL LWRD ?0067
POP HL
; 141. }
JP LWRD ?0064
?0066:
LD C,(IX-2)
LD B,(IX-1)
PUSH IY
POP DE
LD A,BYTE3 list_sort
LD HL,LWRD list_sort
JP LWRD ?BANK_CALL_DIRECT_L08
?0067:
LD C,(IX-6)
LD B,(IX-5)
PUSH IY
POP DE
LD A,BYTE3 StoreList
LD HL,LWRD StoreList
JP LWRD ?BANK_CALL_DIRECT_L08
; 142.
; 143.
; 144.
; 145.
; 146.
; 147.
; 148.
RSEG CSTR
?0023:
DEFB ':'
DEFB 0
?0026:
DEFB 'TIT2 BIN'
DEFB 0
?0030:
DEFB 'TPE1 BIN'
DEFB 0
?0034:
DEFB 'TALB BIN'
DEFB 0
?0038:
DEFB 'FILENAMEBIN'
DEFB 0
RSEG APD_LIST_FUN2
WritrVMBuffer:
DEFS 512
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?