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 + -
显示快捷键?