userlist_del.s01
来自「炬力方案176*132软件源码,适用于AK1025」· S01 代码 · 共 497 行
S01
497 行
NAME userlist_del(17)
RSEG APC_USERPL_DEL(0)
RSEG CSTR(0)
RSEG APD_USERPL_DEL(0)
EXTERN FS_CD
EXTERN FS_FClose
EXTERN FS_FOpen
EXTERN FS_FRead
EXTERN FS_FSeek
EXTERN FS_FWrite
EXTERN FirstOffset
EXTERN LastOffset
EXTERN PlaylistCount
PUBLIC Read_Data
PUBLIC buff
PUBLIC fileA
PUBLIC fp1
EXTERN need_WPL
PUBLIC pl_list
PUBLIC save_offset1
PUBLIC user_pl_del
EXTERN ?CLZ80B_4_04_L00
EXTERN ?S_LSH_L02
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_USERPL_DEL
Read_Data:
; 1. #include "ap_music.h"
; 2. #ifdef ACTIVE_USERPL
; 3. #pragma memory=dataseg(APD_USERPL_DEL)
; 4. char buff[512];
; 5. char fileA[12];
; 6. user_playlist_t pl_list;
; 7. WORD save_offset1;
; 8. handle fp1;
; 9. #pragma memory=default
; 10. #pragma codeseg(APC_USERPL_DEL)
; 11. BOOL Read_Data(WORD offset)
; 12. {
CALL LWRD ?ENT_AUTO_DIRECT_L09
DEFW 65534
; 13. char IO27;
; 14. IO27 = input8(0x27);
IN A,(39)
LD (IX-2),A
; 15. output8(0x27,00);
XOR A
OUT (39),A
; 16. if(save_offset1==0xffff)
LD HL,(save_offset1)
LD A,L
AND H
INC A
JR Z,?0031
?0002:
; 17. {
; 18. save_offset1 = offset/4;
; 19. }
; 20. else
?0003:
; 21. {
; 22. if(save_offset1!=(offset/4))
LD L,(IX+2)
LD H,(IX+3)
SRL H
RR L
SRL H
RR L
LD BC,(save_offset1)
AND A
SBC HL,BC
JR Z,?0032
?0005:
; 23. {
; 24. FS_FWrite(buff,1,fp1);
LD HL,(fp1)
PUSH HL
LD C,1
LD DE,buff
CALL LWRD FS_FWrite
POP HL
; 25. save_offset1 = offset/4;
?0031:
LD L,(IX+2)
LD H,(IX+3)
SRL H
RR L
SRL H
RR L
LD (save_offset1),HL
; 26. }
; 27. else
?0006:
; 28. {
; 29. output8(0x27,IO27);
; 30. return TRUE;
; 31. }
?0007:
?0004:
; 32. }
; 33. if(FS_FSeek(1+offset/4,FS_SEEK_FFROMSTART,fp1))
LD HL,(fp1)
PUSH HL
LD C,0
PUSH BC
LD E,(IX+2)
LD D,(IX+3)
SRL D
RR E
SRL D
RR E
INC DE
LD B,C
CALL LWRD FS_FSeek
POP HL
POP HL
OR A
JR Z,?0009
?0008:
; 34. {
; 35. FS_FRead(buff,1,fp1);
LD HL,(fp1)
PUSH HL
LD C,1
LD DE,buff
CALL LWRD FS_FRead
POP HL
; 36. output8(0x27,IO27);
?0032:
LD A,(IX-2)
OUT (39),A
; 37. return TRUE;
LD L,1
; 38. }
JR ?0010
?0009:
; 39. else
; 40. {
; 41. output8(0x27,IO27);
LD A,(IX-2)
OUT (39),A
; 42. return FALSE;
LD L,0
; 43. }
?0010:
JP LWRD ?BANK_LEAVE_DIRECT_L08
; 44. }
user_pl_del:
; 45.
; 46. BOOL user_pl_del(WORD offset)
; 47. {
CALL LWRD ?ENT_AUTO_DIRECT_L09
DEFW -6
PUSH IY
; 48. WORD next;
; 49. WORD prev;
; 50. WORD FreeList;
; 51. // char Backbuf[32];
; 52. char IO27 = input8(0x27);
IN A,(39)
LD (IX-2),A
; 53. if(PlaylistCount==0)
LD HL,(PlaylistCount)
LD A,L
OR H
JR Z,?0036
?0011:
; 54. return FALSE;
?0012:
; 55. need_WPL=TRUE;
LD A,1
LD (need_WPL),A
; 56. memset(fileA,0x20,12);
LD BC,12
LD DE,fileA
LD HL,32
CALL LWRD ?MEMSET_L11
; 57. fileA[0]='U';
LD A,85
LD (fileA),A
; 58. fileA[1]='S';
LD A,83
LD (fileA+1),A
; 59. fileA[2]='E';
LD A,69
LD (fileA+2),A
; 60. fileA[3]='R';
LD A,82
LD (fileA+3),A
; 61. fileA[4]='P';
LD A,80
LD (fileA+4),A
; 62. fileA[5]='L';
LD A,76
LD (fileA+5),A
; 63. fileA[8]='P';
LD A,80
LD (fileA+8),A
; 64. fileA[9]='L';
LD A,76
LD (fileA+9),A
; 65. fileA[11]=0;
XOR A
LD (fileA+11),A
; 66. output8(0x27,0x00);
OUT (39),A
; 67. // FS_Backup(Backbuf,FS_BACKUP_DIRINFO,0);//目录项备份
; 68. FS_CD(FS_CD_ROOT);
LD DE,?0013
CALL LWRD FS_CD
; 69. fp1=FS_FOpen(fileA,0);
LD C,0
LD DE,fileA
CALL LWRD FS_FOpen
LD (fp1),HL
; 70.
; 71. if(fp1==NULL)
LD A,L
OR H
LD A,(IX-2)
OUT (39),A
JR NZ,?0015
?0014:
; 72. {
; 73. // FS_Restore(Backbuf,FS_RESTORE_DIRINFO,0);//目录项恢复
; 74. output8(0x27,IO27);
; 75. return FALSE ;
?0036:
LD L,0
; 76. }
JP LWRD ?0030
?0015:
; 77. output8(0x27,IO27);
; 78. PlaylistCount--;
LD HL,(PlaylistCount)
DEC HL
LD (PlaylistCount),HL
; 79. //先处理最后item
; 80. save_offset1 = 0xffff;
LD HL,65535
LD (save_offset1),HL
; 81. if(Read_Data(LastOffset))
LD DE,(LastOffset)
CALL LWRD ?0037
JR Z,?0017
?0016:
; 82. {
; 83. memcpy(&pl_list,buff+(LastOffset%4)*USER_PLAYLIST_SIZE,sizeof(user_playlist_t));
LD BC,43
LD HL,(LastOffset)
LD A,L
CALL LWRD ?0040
; 84. if(LastOffset==offset) //删除为最后一个
LD L,(IX+2)
LD H,(IX+3)
LD BC,(LastOffset)
AND A
SBC HL,BC
JR NZ,?0019
?0018:
; 85. {
; 86. LastOffset = pl_list.PrevOffset;
LD HL,(pl_list+39)
LD (LastOffset),HL
; 87. pl_list.DelFlag = 2;
LD A,2
LD (pl_list),A
; 88. memcpy(buff+(offset%4)*USER_PLAYLIST_SIZE,&pl_list,sizeof(user_playlist_t));
LD BC,43
LD A,(IX+2)
AND 3
LD L,A
LD H,B
EX DE,HL
JP LWRD ?0035
; 89. goto Finish;
?0019:
; 90.
; 91. }
; 92. FreeList = pl_list.NextOffset;
LD HL,(pl_list+41)
LD (IX-4),L
LD (IX-3),H
; 93. pl_list.NextOffset = offset;
LD L,(IX+2)
LD H,(IX+3)
LD (pl_list+41),HL
; 94. memcpy(buff+(LastOffset%4)*USER_PLAYLIST_SIZE,&pl_list,sizeof(user_playlist_t));
LD BC,43
LD HL,(LastOffset)
LD A,L
CALL LWRD ?0038
?0017:
; 95.
; 96.
; 97. }
; 98. //处理删除item
; 99. if(Read_Data(offset))
LD E,(IX+2)
LD D,(IX+3)
CALL LWRD ?0037
JR Z,?0022
?0021:
; 100. {
; 101.
; 102. memcpy(&pl_list,buff+(offset%4)*USER_PLAYLIST_SIZE,sizeof(user_playlist_t));
LD BC,43
LD A,(IX+2)
CALL LWRD ?0040
; 103. prev = pl_list.PrevOffset;
LD HL,(pl_list+39)
LD (IX-6),L
LD (IX-5),H
; 104. next = pl_list.NextOffset;
LD IY,(pl_list+41)
; 105. pl_list.NextOffset=FreeList;
LD L,(IX-4)
LD H,(IX-3)
LD (pl_list+41),HL
; 106. pl_list.DelFlag = 2;
LD A,2
LD (pl_list),A
; 107. memcpy(buff+(offset%4)*USER_PLAYLIST_SIZE,&pl_list,sizeof(user_playlist_t));
LD C,43
LD A,(IX+2)
CALL LWRD ?0038
?0022:
; 108.
; 109. }
; 110. //处理prev item
; 111. if(offset==FirstOffset)
LD HL,(FirstOffset)
LD C,(IX+2)
LD B,(IX+3)
AND A
SBC HL,BC
JR NZ,?0024
?0023:
; 112. {
; 113. FirstOffset = next;
LD (FirstOffset),IY
; 114.
; 115.
; 116. }
; 117. else
JR ?0027
?0024:
; 118. {
; 119. if(Read_Data(prev))
LD E,(IX-6)
LD D,(IX-5)
CALL LWRD ?0037
JR Z,?0027
?0026:
; 120. {
; 121. memcpy(&pl_list,buff+(prev%4)*USER_PLAYLIST_SIZE,sizeof(user_playlist_t));
LD BC,43
LD A,(IX-6)
CALL LWRD ?0040
; 122. pl_list.NextOffset=next;
LD (pl_list+41),IY
; 123. memcpy(buff+(prev%4)*USER_PLAYLIST_SIZE,&pl_list,sizeof(user_playlist_t));
LD C,43
LD A,(IX-6)
CALL LWRD ?0038
?0027:
?0025:
; 124. }
; 125.
; 126. }
; 127. //处理next item
; 128. if(Read_Data(next))
PUSH IY
POP DE
CALL LWRD ?0037
JR Z,?0029
?0028:
; 129. {
; 130.
; 131. memcpy(&pl_list,buff+(next%4)*USER_PLAYLIST_SIZE,sizeof(user_playlist_t));
LD BC,43
PUSH IY
POP HL
LD A,L
AND 3
LD E,A
XOR A
LD D,A
LD B,7
CALL LWRD ?S_LSH_L02
LD HL,buff
ADD HL,DE
LD DE,pl_list
LD B,A
LDIR
; 132. pl_list.PrevOffset=prev;
LD L,(IX-6)
LD H,(IX-5)
LD (pl_list+39),HL
; 133. memcpy(buff+(next%4)*USER_PLAYLIST_SIZE,&pl_list,sizeof(user_playlist_t));
LD C,43
PUSH IY
POP HL
LD A,L
AND 3
LD E,A
XOR A
LD D,A
?0035:
CALL LWRD ?0039
?0029:
?0020:
; 134.
; 135. }
; 136. Finish:
; 137. // IO27 = input8(0x27);
; 138. output8(0x27,00);
XOR A
OUT (39),A
; 139. FS_FWrite(buff,1,fp1);
LD HL,(fp1)
PUSH HL
LD C,1
LD DE,buff
CALL LWRD FS_FWrite
POP HL
; 140. FS_FClose(fp1);
LD DE,(fp1)
CALL LWRD FS_FClose
; 141. // FS_Restore(Backbuf,FS_RESTORE_DIRINFO,0);//目录项恢复
; 142. output8(0x27,IO27);
LD A,(IX-2)
OUT (39),A
; 143. return TRUE;
LD L,1
; 144.
; 145. }
?0030:
POP IY
JP LWRD ?BANK_LEAVE_DIRECT_L08
?0037:
LD A,BYTE3 Read_Data
LD HL,LWRD Read_Data
CALL LWRD ?BANK_CALL_DIRECT_L08
INC L
DEC L
RET
?0038:
AND 3
LD L,A
LD H,B
EX DE,HL
?0039:
LD B,7
CALL LWRD ?S_LSH_L02
LD HL,buff
ADD HL,DE
EX DE,HL
LD HL,pl_list
LD B,0
LDIR
RET
?0040:
AND 3
LD L,A
LD H,B
EX DE,HL
LD B,7
CALL LWRD ?S_LSH_L02
LD HL,buff
ADD HL,DE
LD DE,pl_list
LD B,0
LDIR
RET
; 146.
; 147. #endif
RSEG CSTR
?0013:
DEFB ':'
DEFB 0
RSEG APD_USERPL_DEL
buff:
DEFS 512
fileA:
DEFS 12
pl_list:
DEFS 43
save_offset1:
DEFS 2
fp1:
DEFS 2
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?