ui_scroll.s01

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

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

⌨️ 快捷键说明

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