⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ui_scroll_string.s01

📁 炬力方案176*132软件源码,适用于AK1025
💻 S01
字号:
	NAME	ui_scroll_string(17)
	RSEG	COM_RES(0)
	RSEG	UDATA0(0)
	EXTERN	CharOutRect
	PUBLIC	CountString
	PUBLIC	Count_Byte
	EXTERN	GetTextPos
	PUBLIC	HoriScrollString
	EXTERN	PutS
	EXTERN	RegionCopy
	PUBLIC	ScrollFlag
	PUBLIC	ScrollString
	PUBLIC	ScrollStringInit
	EXTERN	SetTextPos
	PUBLIC	region_scroll
	PUBLIC	scroll_buf
	EXTERN	scroll_cnt
	EXTERN	str_pt
	EXTERN	strhead_pt
	EXTERN	?CLZ80B_4_04_L00
	EXTERN	?BANK_CALL_DIRECT_L08
	EXTERN	?BANK_FAST_LEAVE_L08
	RSEG	COM_RES
ScrollString:
; 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/04/21 08:22:43 selina Exp $
; 9.	*******************************************************************************
; 10.	*/
; 11.	/*
; 12.	这个函数的作用是在汇编程序外包一层 C ,这样汇编在C中用BANK方式CALL
; 13.	*/
; 14.	#pragma codeseg(COM_RES)
; 15.	#include "actos.h"
; 16.	#include "ap_common.h"     
; 17.	#define  DISPLAYWIDTH  128      //显示一行字符的宽度 
; 18.	region_t  region_scroll; 
; 19.	char  scroll_buf[32];
; 20.	char  ScrollFlag;
; 21.	 
; 22.	void ScrollStringInit(char *str,char language,region_t *scroll);
; 23.	void HoriScrollString(signed char step,char language,region_t *scroll);
; 24.	int CountString(char *str,char language,region_t *scroll);
; 25.	
; 26.	/* (字符串首址,是否初始化true为要初始化) */
; 27.	void ScrollString( char * scrollstr, bool mode ,char language,region_t *scroll)
; 28.	{
	PUSH	BC
	PUSH	DE
; 29.	    if (mode)
	XOR	A
	OR	C
	LD	HL,10
	ADD	HL,SP
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	PUSH	BC
	DEC	HL
	DEC	HL
	DEC	HL
	LD	C,(HL)
	JR	Z,?0003
?0002:
; 30.	    {
; 31.	        //初始化滚屏(第一次调用时先显示一串字符)
; 32.	        ScrollStringInit(scrollstr,language,scroll);
	LD	A,BYTE3 ScrollStringInit
	LD	HL,LWRD ScrollStringInit
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	JR	?0051
; 33.	        return;
; 34.	    }
?0003:
; 35.	    HoriScrollString(1,language,scroll);
	LD	E,1
	LD	A,BYTE3 HoriScrollString
	LD	HL,LWRD HoriScrollString
	CALL	LWRD ?BANK_CALL_DIRECT_L08
?0051:
	POP	HL
; 36.	}
?0004:
	POP	HL
	POP	HL
	JP	LWRD ?BANK_FAST_LEAVE_L08
ScrollStringInit:
; 37.	
; 38.	void ScrollStringInit(char *str,char language,region_t *scroll)
; 39.	{
	PUSH	IY
	PUSH	IX
	LD	IX,0
	ADD	IX,SP
	PUSH	BC
	PUSH	DE
	LD	HL,65526
	ADD	HL,SP
	LD	SP,HL
	LD	L,(IX+8)
	LD	H,(IX+9)
	PUSH	HL
	POP	IY
; 40.	    int code;
; 41.	    int count;
; 42.	    bool result;
; 43.	    region_t kregion;//余下部分区域                      
; 44.	    scroll_cnt = 0;
	XOR	A
	LD	(scroll_cnt),A
; 45.	 
; 46.	    SetTextPos(scroll->x, scroll->y);
	LD	C,(IY+1)
	LD	E,(IY+0)
	CALL	LWRD SetTextPos
; 47.	    strhead_pt = str_pt = str;
	LD	L,(IX-4)
	LD	H,(IX-3)
	LD	(str_pt),HL
	LD	(strhead_pt),HL
; 48.	    //tmpstr = str;
; 49.	    count=CountString(str_pt,language,scroll); 
	PUSH	IY
	LD	C,(IX-2)
	EX	DE,HL
	LD	A,BYTE3 CountString
	LD	HL,LWRD CountString
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	POP	AF
; 50.	    str_pt = PutS(str_pt, count);
	LD	C,L
	LD	DE,(str_pt)
	CALL	LWRD PutS
	LD	(str_pt),HL
; 51.	 
; 52.	 
; 53.	
; 54.	      if(*str_pt!=0)
	XOR	A
	OR	(HL)
	JR	Z,?0006
?0005:
; 55.	      {
; 56.	        GetTextPos(&kregion.x, &kregion.y);
	LD	HL,0
	ADD	HL,SP
	LD	BC,1
	ADD	HL,BC
	LD	C,L
	LD	B,H
	DEC	HL
	EX	DE,HL
	CALL	LWRD GetTextPos
; 57.	        kregion.width = scroll->width+scroll->x - kregion.x;
	LD	A,(IY+0)
	ADD	A,(IY+2)
	SUB	(IX-14)
	LD	(IX-12),A
; 58.	        kregion.height = scroll->height;
	LD	B,(IY+3)
	LD	(IX-11),B
; 59.	        //汉字和ASCII的不同处理
; 60.	        if ((*str_pt >= FirstSectionCode)&&(language!=1))
	LD	HL,(str_pt)
	LD	A,(HL)
	CP	161
	JR	C,?0008
	LD	B,(IX-2)
	DEC	B
	JR	Z,?0008
?0010:
?0009:
?0007:
; 61.	          {//汉字
; 62.	            code = *(int *)str_pt;
	LD	B,(HL)
	LD	(IX-10),B
	INC	HL
	LD	H,(HL)
	LD	(IX-9),H
; 63.	          }
; 64.	        else
	JR	?0011
?0008:
; 65.	          {//ASCII
; 66.	             code = *str_pt;
	LD	C,(HL)
	LD	(IX-10),C
	LD	B,0
	LD	(IX-9),B
?0011:
; 67.	          }
; 68.	
; 69.	        //输出最后一个字
; 70.	        result = CharOutRect(code, *(str_pt+1), &kregion, scroll_cnt);
	LD	A,(scroll_cnt)
	LD	C,A
	PUSH	BC
	LD	HL,2
	ADD	HL,SP
	PUSH	HL
	LD	HL,(str_pt)
	INC	HL
	LD	C,(HL)
	LD	B,0
	LD	E,(IX-10)
	LD	D,(IX-9)
	CALL	LWRD CharOutRect
	POP	HL
	POP	HL
; 71.	        if (!result)
	OR	A
	JR	Z,?0014
?0012:
; 72.	          {
; 73.	            return;
; 74.	          }
?0013:
; 75.	        //scroll_cnt = kregion.width-1;
; 76.	    scroll_cnt = kregion.width;
	LD	A,(IX-12)
	LD	(scroll_cnt),A
; 77.	
; 78.	    }
; 79.	    else
	JR	?0014
?0006:
; 80.	    {
; 81.	        str_pt = strhead_pt;
	LD	HL,(strhead_pt)
	LD	(str_pt),HL
; 82.	        return;
; 83.	    }
?0014:
; 84.	
; 85.	}
?0015:
	LD	SP,IX
	POP	IX
	POP	IY
	JP	LWRD ?BANK_FAST_LEAVE_L08
HoriScrollString:
; 86.	
; 87.	//==========================================================
; 88.	/*
; 89.	滚动屏幕
; 90.	*/
; 91.	void HoriScrollString(signed char step,char language,region_t *scroll)
; 92.	{
	PUSH	IY
	PUSH	IX
	LD	IX,0
	ADD	IX,SP
	PUSH	BC
	PUSH	DE
	LD	HL,65520
	ADD	HL,SP
	LD	SP,HL
	LD	L,(IX+8)
	LD	H,(IX+9)
	PUSH	HL
	POP	IY
; 93.	    int code;
; 94.	    char *tmpstrpt;
; 95.	    region_t tregion;
; 96.	    region_t sregion;
; 97.	    region_t kregion;//余下部分区域
; 98.	
; 99.	    tmpstrpt = str_pt;
	LD	HL,(str_pt)
	LD	(IX-20),L
	LD	(IX-19),H
; 100.	
; 101.	    //余下部分区域
; 102.	    kregion.x = scroll->x + scroll->width - step;
	LD	A,(IY+2)
	ADD	A,(IY+0)
	SUB	E
	LD	(IX-18),A
; 103.	    kregion.y = scroll->y;
	LD	B,(IY+1)
	LD	(IX-17),B
; 104.	    kregion.width = step;
	LD	(IX-16),E
; 105.	    kregion.height = scroll->height;
	LD	B,(IY+3)
	LD	(IX-15),B
; 106.	
; 107.	    //设定移动的源,目标区域
; 108.	    sregion.x = scroll->x + step;//暂时未考虑为负数的情况
	LD	A,(IY+0)
	ADD	A,(IX-4)
	LD	(IX-14),A
; 109.	    tregion.x = scroll->x;
	LD	B,(IY+0)
	LD	(IX-10),B
; 110.	    tregion.y = sregion.y = scroll->y;
	LD	B,(IY+1)
	LD	(IX-13),B
	LD	(IX-9),B
; 111.	    sregion.width = scroll->width - step;
	LD	A,(IY+2)
	SUB	E
	LD	(IX-12),A
; 112.	    sregion.height = scroll->height;
	LD	B,(IY+3)
	LD	(IX-11),B
; 113.	
; 114.	    //向左移step列
; 115.	    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:
; 116.	
; 117.	
; 118.	
; 119.	test:
; 120.	    if (*str_pt == '\0')
	LD	HL,(str_pt)
	XOR	A
	OR	(HL)
	JR	NZ,?0018
?0017:
; 121.	    {
; 122.	        tmpstrpt = str_pt = strhead_pt;
	LD	HL,(strhead_pt)
	LD	(str_pt),HL
	LD	(IX-20),L
	LD	(IX-19),H
?0018:
; 123.	    }
; 124.	
; 125.	    //汉字和ASCII的不同处理
; 126.	    if ((*str_pt >= FirstSectionCode)&&(language!=1))
	LD	A,(HL)
	CP	161
	JR	C,?0020
	LD	B,(IX-2)
	DEC	B
	JR	Z,?0020
?0022:
?0021:
?0019:
; 127.	    {//汉字
; 128.	        code = *(int *)str_pt;
	LD	B,(HL)
	LD	(IX-6),B
	INC	HL
	LD	H,(HL)
	LD	(IX-5),H
; 129.	        tmpstrpt++;
	INC	(IX-20)
	JR	NZ,?0023
	INC	(IX-19)
; 130.	    }
; 131.	    else
	JR	?0023
?0020:
; 132.	    {//ASCII
; 133.	        code = *str_pt;
	LD	C,(HL)
	LD	(IX-6),C
	LD	B,0
	LD	(IX-5),B
?0023:
; 134.	    }
; 135.	    tmpstrpt++;
	INC	(IX-20)
	JR	NZ,?0053
	INC	(IX-19)
?0053:
; 136.	
; 137.	    if (!CharOutRect(code, *(str_pt+1), &kregion, scroll_cnt))
	LD	A,(scroll_cnt)
	LD	C,A
	PUSH	BC
	LD	HL,4
	ADD	HL,SP
	PUSH	HL
	LD	HL,(str_pt)
	INC	HL
	LD	C,(HL)
	LD	B,0
	LD	E,(IX-6)
	LD	D,(IX-5)
	CALL	LWRD CharOutRect
	POP	HL
	POP	HL
	OR	A
	JR	NZ,?0025
?0024:
; 138.	    {
; 139.	        //strhead_pt = str_pt;
; 140.	        str_pt = tmpstrpt;
	LD	L,(IX-20)
	LD	H,(IX-19)
	LD	(str_pt),HL
; 141.	        scroll_cnt = 0;
	LD	(scroll_cnt),A
; 142.	        goto test;
	JR	?0016
?0025:
; 143.	    }
; 144.	        scroll_cnt += step;//未支持负数
	LD	A,(scroll_cnt)
	ADD	A,(IX-4)
	LD	(scroll_cnt),A
; 145.	
; 146.	}
	JP	LWRD ?0014
CountString:
; 147.	
; 148.	int CountString(char *str,char language,region_t *scroll)   //统计字数
; 149.	{
	PUSH	IY
	PUSH	IX
	PUSH	BC
	PUSH	AF
	PUSH	DE
	POP	IX
; 150.	    int n=0;
; 151.	    int m=0;
	LD	HL,0
	ADD	HL,SP
	XOR	A
	LD	(HL),A
	INC	HL
	LD	(HL),A
	LD	IY,0
?0027:
; 152.	    while(*str!=0)
	XOR	A
	OR	(IX+0)
	JR	Z,?0026
?0028:
; 153.	    {
; 154.	     if((*str >= FirstSectionCode)&&(language!=1))
	LD	A,(IX+0)
	CP	161
	JR	C,?0030
	INC	HL
	LD	B,(HL)
	DEC	B
	JR	Z,?0030
?0032:
?0031:
?0029:
; 155.	     {
; 156.	         if(m+16 > scroll->width)break;
	LD	HL,16
	PUSH	IY
	POP	BC
	ADD	HL,BC
	LD	C,L
	LD	B,H
	LD	HL,12
	ADD	HL,SP
	LD	D,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,D
	INC	HL
	INC	HL
	LD	L,(HL)
	LD	H,0
	OR	128
	SBC	HL,BC
	JP	PO,?0061
	XOR	H
?0061:
	JP	M,?0026
?0033:
?0034:
; 157.	         *str++;
; 158.	         *str++;
; 159.	         n++;
	LD	HL,0
	ADD	HL,SP
	INC	(HL)
	INC	HL
	INC	IX
	INC	IX
	JR	NZ,?0062
	INC	(HL)
?0062:
; 160.	         m=m+16;
	LD	BC,16
	JR	?0065
; 161.	     }
; 162.	     else
?0030:
; 163.	     {
; 164.	        if(m+8>scroll->width)break;
	LD	HL,8
	PUSH	IY
	POP	BC
	ADD	HL,BC
	LD	C,L
	LD	B,H
	LD	HL,12
	ADD	HL,SP
	LD	D,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,D
	INC	HL
	INC	HL
	LD	L,(HL)
	LD	H,0
	OR	128
	SBC	HL,BC
	JP	PO,?0063
	XOR	H
?0063:
	JP	M,?0026
?0036:
?0037:
; 165.	        *str++;
; 166.	         n++;
	LD	HL,0
	ADD	HL,SP
	INC	(HL)
	INC	HL
	INC	IX
	JR	NZ,?0064
	INC	(HL)
?0064:
; 167.	         m=m+8;
	LD	BC,8
?0065:
	ADD	IY,BC
?0035:
	JR	?0027
?0026:
; 168.	     }
; 169.	    }
; 170.	    return n;
	LD	HL,0
	ADD	HL,SP
	LD	B,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,B
; 171.	}
	POP	AF
	POP	AF
	POP	IX
	POP	IY
	JP	LWRD ?BANK_FAST_LEAVE_L08
Count_Byte:
; 172.	
; 173.	BYTE Count_Byte(char *str,char language)   //统计字数 zxs added 2007.03.26
; 174.	{
	PUSH	IX
	PUSH	BC
	PUSH	AF
	PUSH	DE
	POP	IX
; 175.	    BYTE n=0;
; 176.	    BYTE m=0;
	LD	HL,1
	ADD	HL,SP
	LD	(HL),0
	DEC	HL
	LD	(HL),0
?0039:
; 177.	    while(*str!=0)
	XOR	A
	OR	(IX+0)
	JR	Z,?0038
?0040:
; 178.	    {
; 179.	     if((*str >= FirstSectionCode)&&(language!=1))
	LD	A,(IX+0)
	CP	161
	JR	C,?0042
	INC	HL
	INC	HL
	LD	B,(HL)
	DEC	B
	JR	Z,?0042
?0044:
?0043:
?0041:
; 180.	     {
; 181.	         if(m+16 > DISPLAYWIDTH)break;
	DEC	HL
	DEC	HL
	LD	C,(HL)
	LD	B,0
	LD	HL,16
	ADD	HL,BC
	LD	C,L
	LD	B,H
	LD	HL,128
	OR	L
	SBC	HL,BC
	JP	PO,?0070
	XOR	H
?0070:
	JP	M,?0038
?0045:
?0046:
; 182.	         *str++;
; 183.	         *str++;
; 184.	         n++;
	LD	HL,1
	ADD	HL,SP
	INC	(HL)
; 185.	         m=m+16;
	DEC	HL
	LD	A,(HL)
	ADD	A,16
	INC	IX
	JR	?0073
; 186.	     }
; 187.	     else
?0042:
; 188.	     {
; 189.	        if(m+8>DISPLAYWIDTH)break;
	LD	HL,0
	ADD	HL,SP
	LD	C,(HL)
	LD	B,0
	LD	HL,8
	ADD	HL,BC
	LD	C,L
	LD	B,H
	LD	HL,128
	OR	L
	SBC	HL,BC
	JP	PO,?0071
	XOR	H
?0071:
	JP	M,?0038
?0048:
?0049:
; 190.	        *str++;
; 191.	         n++;
	LD	HL,1
	ADD	HL,SP
	INC	(HL)
; 192.	         m=m+8;
	DEC	HL
	LD	A,(HL)
	ADD	A,8
?0073:
	INC	IX
	LD	(HL),A
?0047:
	JR	?0039
?0038:
; 193.	     }
; 194.	    }
; 195.	    return n;
	LD	HL,1
	ADD	HL,SP
	LD	L,(HL)
; 196.	}  
	POP	AF
	POP	AF
	POP	IX
	JP	LWRD ?BANK_FAST_LEAVE_L08
; 197.	
	RSEG	UDATA0
region_scroll:
	DEFS	4
scroll_buf:
	DEFS	32
ScrollFlag:
	DEFS	1
	END

⌨️ 快捷键说明

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