ui_playlist3.s01

来自「MP3 整个 SDK」· S01 代码 · 共 495 行

S01
495
字号
	NAME	ui_playlist3(17)
	RSEG	PLAYLIST_FUN(0)
	EXTERN	CharOutRect
	PUBLIC	Count_playlist
	EXTERN	GetTextPos
	PUBLIC	HoriScroll_PlayList
	EXTERN	PutS
	EXTERN	RegionCopy
	PUBLIC	ScrollInit_PlayList
	PUBLIC	Scroll_PlayList
	EXTERN	SetTextPos
	EXTERN	scroll_cnt
	EXTERN	str_pt
	EXTERN	strhead_pt
	EXTERN	?CLZ80B_4_04_L00
	EXTERN	?SS_CMP_L02
	EXTERN	?BANK_CALL_DIRECT_L08
	EXTERN	?BANK_LEAVE_DIRECT_L08
	EXTERN	?BANK_FAST_LEAVE_L08
	EXTERN	?ENT_PARM_DIRECT_L09
	EXTERN	?ENT_AUTO_DIRECT_L09
	RSEG	PLAYLIST_FUN
Scroll_PlayList:
; 1.	/*
; 2.	*******************************************************************************
; 3.	*                ACTOS AP
; 4.	*        wma player basal module implementation
; 5.	*
; 6.	*        (c) Copyright Actions Co,Ld.
; 7.	*
; 8.	*  $Id: ui_playlist3.c,v 1.2 2006/04/25 10:50:14 jmzhang Exp $
; 9.	*******************************************************************************
; 10.	*/
; 11.	/*
; 12.	这个函数的作用是在汇编程序外包一层 C ,这样汇编在C中用BANK方式CALL
; 13.	*/
; 14.	#pragma codeseg(PLAYLIST_FUN)
; 15.	#include "actos.h"
; 16.	#include "ap_common.h"
; 17.	
; 18.	extern char *str_pt;//字符串当前指针
; 19.	extern char *strhead_pt;//字串首址记录
; 20.	extern BYTE scroll_cnt;
; 21.	
; 22.	int Count_playlist(char *str,char language,region_t *scroll);   //统计字数
; 23.	void ScrollInit_PlayList(char *str,char language,region_t *scroll);
; 24.	void HoriScroll_PlayList(signed char step,char language,region_t *scroll);
; 25.	
; 26.	
; 27.	/* (字符串首址,是否初始化true为要初始化) */
; 28.	void Scroll_PlayList( char * scrollstr, bool mode ,char language,region_t *scroll)
; 29.	{
	CALL	LWRD ?ENT_PARM_DIRECT_L09
; 30.	 
; 31.	    if (mode)
	INC	C
	DEC	C
	LD	L,(IX+12)
	LD	H,(IX+13)
	PUSH	HL
	LD	C,(IX+10)
	JR	Z,?0003
?0002:
; 32.	    {
; 33.	        //初始化滚屏(第一次调用时先显示一串字符)
; 34.	        ScrollInit_PlayList(scrollstr,language,scroll);
	LD	A,BYTE3 ScrollInit_PlayList
	LD	HL,LWRD ScrollInit_PlayList
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	JR	?0038
; 35.	        return;
; 36.	    }
?0003:
; 37.	    HoriScroll_PlayList(1,language,scroll);
	LD	E,1
	LD	A,BYTE3 HoriScroll_PlayList
	LD	HL,LWRD HoriScroll_PlayList
	CALL	LWRD ?BANK_CALL_DIRECT_L08
?0038:
	POP	HL
; 38.	    
; 39.	}
?0004:
	JP	LWRD ?BANK_LEAVE_DIRECT_L08
ScrollInit_PlayList:
; 40.	
; 41.	void ScrollInit_PlayList(char *str,char language,region_t *scroll)
; 42.	{
	CALL	LWRD ?ENT_AUTO_DIRECT_L09
	DEFW	65526
	PUSH	IY
	LD	L,(IX+10)
	LD	H,(IX+11)
	PUSH	HL
	POP	IY
; 43.	    int code;
; 44.	    int count;
; 45.	    bool result;
; 46.	    region_t kregion;//余下部分区域
; 47.	    scroll_cnt = 0;
	XOR	A
	LD	(scroll_cnt),A
; 48.	 
; 49.	    SetTextPos(scroll->x, scroll->y);
	LD	C,(IY+1)
	LD	E,(IY+0)
	CALL	LWRD SetTextPos
; 50.	    strhead_pt = str_pt = str;
	LD	L,(IX+2)
	LD	H,(IX+3)
	LD	(str_pt),HL
	LD	(strhead_pt),HL
; 51.	    //tmpstr = str;
; 52.	    count=Count_playlist(str_pt,language,scroll);
	PUSH	IY
	LD	C,(IX+4)
	EX	DE,HL
	LD	A,BYTE3 Count_playlist
	LD	HL,LWRD Count_playlist
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	POP	AF
; 53.	    str_pt = PutS(str_pt, count);
	LD	C,L
	LD	DE,(str_pt)
	CALL	LWRD PutS
	LD	(str_pt),HL
; 54.	 
; 55.	 
; 56.	
; 57.	      if(*str_pt!=0)
	XOR	A
	OR	(HL)
	JR	Z,?0006
?0005:
; 58.	      {
; 59.	        GetTextPos(&kregion.x, &kregion.y);
	LD	HL,2
	ADD	HL,SP
	LD	BC,1
	ADD	HL,BC
	LD	C,L
	LD	B,H
	DEC	HL
	EX	DE,HL
	CALL	LWRD GetTextPos
; 60.	
; 61.	        kregion.width =scroll->x+scroll->width-kregion.x;
	LD	A,(IY+2)
	ADD	A,(IY+0)
	SUB	(IX-10)
	LD	(IX-8),A
; 62.	        kregion.height = scroll->height;
	LD	B,(IY+3)
	LD	(IX-7),B
; 63.	        //汉字和ASCII的不同处理
; 64.	        if ((*str_pt >= FirstSectionCode)&&(language!=1))
	LD	HL,(str_pt)
	LD	A,(HL)
	CP	161
	JR	C,?0008
	LD	B,(IX+4)
	DEC	B
	JR	Z,?0008
?0010:
?0009:
?0007:
; 65.	          {//汉字
; 66.	            code = *(int *)str_pt;
	LD	B,(HL)
	LD	(IX-6),B
	INC	HL
	LD	H,(HL)
	LD	(IX-5),H
; 67.	          }
; 68.	        else
	JR	?0011
?0008:
; 69.	          {//ASCII
; 70.	             code = *str_pt;
	LD	C,(HL)
	LD	(IX-6),C
	LD	B,0
	LD	(IX-5),B
?0011:
; 71.	          }
; 72.	
; 73.	
; 74.	        //输出最后一个字
; 75.	        result = CharOutRect(code, &kregion, scroll_cnt);
	LD	A,(scroll_cnt)
	LD	C,A
	PUSH	BC
	LD	HL,4
	ADD	HL,SP
	LD	C,L
	LD	B,H
	LD	E,(IX-6)
	LD	D,(IX-5)
	CALL	LWRD CharOutRect
	POP	HL
; 76.	        if (!result)
	OR	A
	JR	Z,?0014
?0012:
; 77.	          {
; 78.	            return;
; 79.	          }
?0013:
; 80.	        //scroll_cnt = kregion.width-1;
; 81.	    scroll_cnt = kregion.width;
	LD	A,(IX-8)
	LD	(scroll_cnt),A
; 82.	
; 83.	    }
; 84.	    else
	JR	?0014
?0006:
; 85.	    {
; 86.	        str_pt = strhead_pt;
	LD	HL,(strhead_pt)
	LD	(str_pt),HL
; 87.	        return;
; 88.	    }
?0014:
; 89.	
; 90.	}
?0015:
	POP	IY
	JP	LWRD ?BANK_LEAVE_DIRECT_L08
HoriScroll_PlayList:
; 91.	
; 92.	//==========================================================
; 93.	/*
; 94.	滚动屏幕
; 95.	*/
; 96.	void HoriScroll_PlayList(signed char step,char language,region_t *scroll)
; 97.	{
	CALL	LWRD ?ENT_AUTO_DIRECT_L09
	DEFW	65520
	PUSH	IY
	LD	L,(IX+10)
	LD	H,(IX+11)
	PUSH	HL
	POP	IY
; 98.	    int code;
; 99.	    char *tmpstrpt;
; 100.	    region_t tregion;
; 101.	    region_t sregion;
; 102.	    region_t kregion;//余下部分区域
; 103.	
; 104.	    tmpstrpt = str_pt;
	LD	HL,(str_pt)
	LD	(IX-16),L
	LD	(IX-15),H
; 105.	
; 106.	    //余下部分区域
; 107.	    kregion.x = scroll->x+scroll->width-step;
	LD	A,(IY+2)
	ADD	A,(IY+0)
	SUB	(IX+2)
	LD	(IX-14),A
; 108.	    kregion.y = scroll->y;
	LD	B,(IY+1)
	LD	(IX-13),B
; 109.	    kregion.width = step;
	LD	B,(IX+2)
	LD	(IX-12),B
; 110.	    kregion.height = scroll->height;
	LD	B,(IY+3)
	LD	(IX-11),B
; 111.	
; 112.	    //设定移动的源,目标区域
; 113.	    sregion.x =  scroll->x+step;//暂时未考虑为负数的情况
	LD	A,(IY+0)
	ADD	A,(IX+2)
	LD	(IX-10),A
; 114.	    tregion.x =  scroll->x;
	LD	B,(IY+0)
	LD	(IX-6),B
; 115.	    tregion.y = sregion.y =  scroll->y;
	LD	B,(IY+1)
	LD	(IX-9),B
	LD	(IX-5),B
; 116.	    sregion.width =  scroll->width-step;
	LD	A,(IY+2)
	SUB	(IX+2)
	LD	(IX-8),A
; 117.	    sregion.height = scroll->height;
	LD	B,(IY+3)
	LD	(IX-7),B
; 118.	
; 119.	    //向左移step列
; 120.	    RegionCopy(&sregion, &tregion);
	LD	HL,12
	ADD	HL,SP
	LD	C,L
	LD	B,H
	LD	HL,8
	ADD	HL,SP
	EX	DE,HL
	CALL	LWRD RegionCopy
?0016:
; 121.	
; 122.	
; 123.	
; 124.	test:
; 125.	    if (*str_pt == '\0')
	LD	HL,(str_pt)
	XOR	A
	OR	(HL)
	JR	NZ,?0018
?0017:
; 126.	    {
; 127.	        tmpstrpt = str_pt = strhead_pt;
	LD	HL,(strhead_pt)
	LD	(str_pt),HL
	LD	(IX-16),L
	LD	(IX-15),H
?0018:
; 128.	    }
; 129.	
; 130.	    //汉字和ASCII的不同处理
; 131.	    if ((*str_pt >= FirstSectionCode)&&(language!=1))
	LD	A,(HL)
	CP	161
	JR	C,?0020
	LD	B,(IX+4)
	DEC	B
	JR	Z,?0020
?0022:
?0021:
?0019:
; 132.	    {//汉字
; 133.	        code = *(int *)str_pt;
	LD	B,(HL)
	LD	(IX-2),B
	INC	HL
	LD	H,(HL)
	LD	(IX-1),H
; 134.	        tmpstrpt++;
	INC	(IX-16)
	JR	NZ,?0023
	INC	(IX-15)
; 135.	    }
; 136.	    else
	JR	?0023
?0020:
; 137.	    {//ASCII
; 138.	        code = *str_pt;
	LD	C,(HL)
	LD	(IX-2),C
	LD	B,0
	LD	(IX-1),B
?0023:
; 139.	    }
; 140.	    tmpstrpt++;
	INC	(IX-16)
	JR	NZ,?0041
	INC	(IX-15)
?0041:
; 141.	
; 142.	    if (!CharOutRect(code, &kregion, scroll_cnt))
	LD	A,(scroll_cnt)
	LD	C,A
	PUSH	BC
	LD	HL,6
	ADD	HL,SP
	LD	C,L
	LD	B,H
	LD	E,(IX-2)
	LD	D,(IX-1)
	CALL	LWRD CharOutRect
	POP	HL
	OR	A
	JR	NZ,?0025
?0024:
; 143.	    {
; 144.	        //strhead_pt = str_pt;
; 145.	        str_pt = tmpstrpt;
	LD	L,(IX-16)
	LD	H,(IX-15)
	LD	(str_pt),HL
; 146.	        scroll_cnt = 0;
	LD	(scroll_cnt),A
; 147.	        goto test;
	JR	?0016
?0025:
; 148.	    }
; 149.	        scroll_cnt += step;//未支持负数
	LD	A,(scroll_cnt)
	ADD	A,(IX+2)
	LD	(scroll_cnt),A
; 150.	
; 151.	}
	POP	IY
	JP	LWRD ?BANK_LEAVE_DIRECT_L08
Count_playlist:
; 152.	
; 153.	int Count_playlist(char *str,char language,region_t *scroll)   //统计字数
; 154.	{
	CALL	LWRD ?ENT_AUTO_DIRECT_L09
	DEFW	0
	PUSH	IY
; 155.	    int n=0;
; 156.	    int m=0;
	LD	DE,0
	LD	IY,0
?0027:
; 157.	    while(*str!=0)
	LD	L,(IX+2)
	LD	H,(IX+3)
	XOR	A
	OR	(HL)
	JR	Z,?0026
?0028:
; 158.	    {
; 159.	     if((*str >= FirstSectionCode)&&(language!=1))
	LD	A,(HL)
	CP	161
	JR	C,?0030
	LD	B,(IX+4)
	DEC	B
	JR	Z,?0030
?0032:
?0031:
?0029:
; 160.	     {
; 161.	         if(m+16>scroll->width)break;
	LD	HL,16
	CALL	LWRD ?0049
	JR	C,?0026
?0033:
?0034:
; 162.	         *str++;
	INC	(IX+2)
	JR	NZ,?0042
	INC	(IX+3)
?0042:
; 163.	         *str++;
	INC	(IX+2)
	JR	NZ,?0043
	INC	(IX+3)
?0043:
; 164.	         n++;
	INC	DE
; 165.	         m=m+16;
	LD	BC,16
	JR	?0045
; 166.	     }
; 167.	     else    //采用大字体8*16
?0030:
; 168.	     {
; 169.	        if(m+8>scroll->width)break;
	LD	HL,8
	CALL	LWRD ?0049
	JR	C,?0026
?0036:
?0037:
; 170.	        *str++;
	INC	(IX+2)
	JR	NZ,?0044
	INC	(IX+3)
?0044:
; 171.	         n++;
	INC	DE
; 172.	         m=m+8;
	LD	BC,8
?0045:
	ADD	IY,BC
?0035:
	JR	?0027
?0026:
; 173.	     }
; 174.	    }
; 175.	    return n;
	EX	DE,HL
; 176.	}
	POP	IY
	JP	LWRD ?BANK_LEAVE_DIRECT_L08
?0049:
	PUSH	IY
	POP	BC
	ADD	HL,BC
	LD	C,L
	LD	B,H
	LD	L,(IX+10)
	LD	H,(IX+11)
	INC	HL
	INC	HL
	LD	L,(HL)
	LD	H,0
	JP	LWRD ?SS_CMP_L02
; 177.	
	END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?