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

📄 ap_common2.s01

📁 炬力方案176*132软件源码,适用于AK1025
💻 S01
字号:
	NAME	ap_common2(17)
	RSEG	COM_RES(0)
	RSEG	UDATA0(0)
	EXTERN	PutS
	PUBLIC	ResShowMultiString
	EXTERN	SD_FRead
	EXTERN	SD_FSeek
	EXTERN	SetTextPos
	PUBLIC	dir_name
	PUBLIC	file_name
	PUBLIC	get_large_text_width
	PUBLIC	get_text_width
	EXTERN	res_entry
	EXTERN	res_fp
	EXTERN	?CLZ80B_4_04_L00
	EXTERN	?SS_DIV_L02
	EXTERN	?L_LSH_L03
	EXTERN	?L_ADDASG_L03
	EXTERN	?BANK_CALL_DIRECT_L08
	EXTERN	?BANK_FAST_LEAVE_L08
	EXTERN	?STRLEN_L11
	RSEG	COM_RES
get_text_width:
; 1.	/*
; 2.	*******************************************************************************
; 3.	*                ACTOS AP
; 4.	*        ap common lib file, part 2
; 5.	*
; 6.	*        (c) Copyright, Actions Co,Ld.
; 7.	*             All Right Reserved
; 8.	*
; 9.	*  $Id: ap_common2.c,v 1.1.1.1 2006/05/22 03:23:59 selina Exp $
; 10.	*******************************************************************************
; 11.	*/
; 12.	#pragma codeseg(COM_RES)
; 13.	
; 14.	#include "ap_common.h"
; 15.	
; 16.	//========== global field ===============
; 17.	char file_name[12];
; 18.	char dir_name[30];
; 19.	extern res_entry_t res_entry;
; 20.	/*
; 21.	********************************************************************************
; 22.	* Description : 获得字符串的显示宽度
; 23.	*
; 24.	* Arguments   :
; 25.	*
; 26.	*
; 27.	* Returns     :
; 28.	*
; 29.	* Notes       : 能够识别 \r \n, 中文作为2个TCHAR 识别
; 30.	*
; 31.	********************************************************************************
; 32.	*/
; 33.	
; 34.	int get_text_width(const char *string)
; 35.	{
	PUSH	BC
	PUSH	IY
	PUSH	IX
	PUSH	DE
	POP	IX
; 36.	    int w=0;
	LD	IY,0
?0003:
; 37.	
; 38.	    ASSERT(string != NULL);
; 39.	
; 40.	    while(*string != 0)
	XOR	A
	OR	(IX+0)
	JR	Z,?0002
?0004:
; 41.	    {
; 42.	        if(*string == '\r'|| *string == '\n') {;}    //不计算回车换行
	LD	A,(IX+0)
	CP	13
	JR	Z,?0012
	LD	A,(IX+0)
	CP	10
	JR	Z,?0012
?0007:
?0008:
?0005:
?0006:
; 43.	        else if(*string < 0x80) w += CHAR_WIDTH;
	LD	A,(IX+0)
	CP	128
	JR	NC,?0011
?0010:
	LD	BC,6
	JR	?0028
?0011:
; 44.	        else w += TCHAR_WIDTH;
	LD	BC,8
?0028:
	ADD	IY,BC
?0012:
?0009:
; 45.	
; 46.	        string++;
	INC	IX
	JR	?0003
?0002:
; 47.	    }
; 48.	    return w;
	PUSH	IY
	POP	HL
; 49.	}
	POP	IX
	POP	IY
	POP	BC
	JP	LWRD ?BANK_FAST_LEAVE_L08
get_large_text_width:
; 50.	
; 51.	/*
; 52.	********************************************************************************
; 53.	* Description : 获得大字体字符串的显示宽度
; 54.	*
; 55.	* Arguments   :
; 56.	*
; 57.	*
; 58.	* Returns     :
; 59.	*
; 60.	* Notes       : 能够识别 \r \n, 中文作为2个TCHAR 识别
; 61.	*
; 62.	********************************************************************************
; 63.	*/
; 64.	int get_large_text_width(const char *string)
; 65.	{
	PUSH	BC
	PUSH	DE
; 66.	//注意: 如果 LARGE_CHAR_WIDTH != TCHAR_WIDTH, 请使用注释起来的代码
; 67.	
; 68.	    ASSERT(LARGE_CHAR_WIDTH == TCHAR_WIDTH);
; 69.	    return strlen(string) * 8;
	LD	L,E
	LD	H,D
	CALL	LWRD ?STRLEN_L11
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
; 70.	
; 71.	 
; 72.	}
	POP	AF
	POP	BC
	JP	LWRD ?BANK_FAST_LEAVE_L08
ResShowMultiString:
; 73.	
; 74.	/*
; 75.	********************************************************************************
; 76.	* Description : 在指定位置显示多语言字符串
; 77.	*
; 78.	* Arguments   : id, 资源代号
; 79.	        string_id, 语言代号
; 80.	        x, y, 屏幕坐标,x=255 表示x方向居中
; 81.	*
; 82.	* Returns     : 成功, 1
; 83.	        失败, 0
; 84.	*
; 85.	* Notes       :
; 86.	*
; 87.	********************************************************************************
; 88.	*/
; 89.	int ResShowMultiString(WORD id, BYTE string_id, uchar x, uchar y)
; 90.	{
	PUSH	IY
	PUSH	IX
	LD	IX,0
	ADD	IX,SP
	PUSH	BC
	PUSH	DE
	LD	HL,65482
	ADD	HL,SP
	LD	SP,HL
; 91.	    //需要动态申请 string 的空间
; 92.	    char *p,AddBuf;
; 93.	    char buf[50];
; 94.	    BYTE StrLength,string_idtemp;
; 95.	
; 96.	    ASSERT(id <= UIID_MAX);
; 97.	
; 98.	    //读entry
; 99.	    SD_FSeek(res_fp, SEEK_SET, (long)id * sizeof(res_entry_t)); // 指针指向字符在文件中的位置
	EX	DE,HL
	LD	BC,0
	LD	A,4
	CALL	LWRD ?L_LSH_L03
	PUSH	BC
	PUSH	HL
	LD	C,0
	LD	DE,(res_fp)
	CALL	LWRD SD_FSeek
	POP	HL
	POP	HL
; 100.	    SD_FRead(res_fp, &res_entry, sizeof(res_entry_t));          //res_fp->&res_entry
	LD	HL,16
	PUSH	HL
	LD	BC,res_entry
	LD	DE,(res_fp)
	CALL	LWRD SD_FRead
	POP	AF
; 101.	    if( res_entry.type != RES_TYPE_MSTRING) return 0;           //非Multisring 返回
	LD	A,(res_entry+6)
	CP	3
	JR	Z,?0014
?0013:
	LD	HL,0
; 102.	
; 103.	    ASSERT(res_entry.length <= sizeof(buf));
	JP	LWRD ?0024
?0014:
; 104.	
; 105.	    //读数据
; 106.	    SD_FSeek(res_fp, SEEK_SET, res_entry.offset);
	LD	HL,(res_entry+2)
	PUSH	HL
	LD	HL,(res_entry)
	PUSH	HL
	LD	C,0
?0030:
	LD	DE,(res_fp)
	CALL	LWRD SD_FSeek
	POP	HL
	POP	HL
; 107.	    SD_FRead(res_fp, buf, 50);
	LD	HL,50
	PUSH	HL
	LD	L,6
	ADD	HL,SP
	LD	C,L
	LD	B,H
	LD	DE,(res_fp)
	CALL	LWRD SD_FRead
	POP	AF
; 108.	
; 109.	    //定位到 string_id
; 110.	    p = buf;
	LD	HL,4
	ADD	HL,SP
	PUSH	HL
	POP	IY
; 111.	    string_idtemp=string_id;
?0016:
; 112.	    while(string_id)
	XOR	A
	OR	(IX-2)
	JR	Z,?0015
?0017:
; 113.	    {
; 114.	        AddBuf=1;
	LD	(IX-58),1
?0019:
; 115.	        while(*p!=0)
	XOR	A
	OR	(IY+0)
	JR	Z,?0018
?0020:
; 116.	        {
; 117.	            AddBuf++;    //找到第string_id 个0
	INC	(IX-58)
; 118.	            p++;
	INC	IY
	JR	?0019
?0018:
; 119.	        }
; 120.	        string_id--;
	DEC	(IX-2)
; 121.	        res_entry.offset=res_entry.offset+AddBuf;
	LD	HL,res_entry
	LD	E,(IX-58)
	LD	C,A
	LD	D,C
	LD	B,A
	CALL	LWRD ?L_ADDASG_L03
; 122.	        SD_FSeek(res_fp, SEEK_SET, res_entry.offset);
	LD	HL,(res_entry+2)
	PUSH	HL
	LD	HL,(res_entry)
	PUSH	HL
	LD	C,A
	JR	?0030
; 123.	        SD_FRead(res_fp, buf, 50);
; 124.	        p = buf;
?0015:
; 125.	    }
; 126.	    string_id=string_idtemp;
; 127.	    ASSERT((WORD)(p - buf) <= res_entry.length);
; 128.	
; 129.	        StrLength=(BYTE)strlen(p);
	CALL	LWRD ?STRLEN_L11
; 130.	        /*
; 131.	        if((x == 255)&&(string_id!=1)&&(string_id<5))    //16*16字体居中显示
; 132.	        {
; 133.	            SetTextPos((SCR_WIDTH - (BYTE)get_large_text_width(p)) /2, y);
; 134.	            PutS(p, -1);
; 135.	        }
; 136.	        else if((string_id!=1)&&(string_id<5))    ////16*16字体非居中显示
; 137.	        {
; 138.	            SetTextPos(x, y);
; 139.	            PutS(p, -1);
; 140.	        }
; 141.	        else        //6*8字体显示
; 142.	        {
; 143.	            if(x == 255)
; 144.	            {
; 145.	                SetTextPos((SCR_WIDTH - StrLength*CHAR_WIDTH) /2, y);
; 146.	                PutS(p, -1);
; 147.	            }
; 148.	            else if(StrLength<22)
; 149.	            {
; 150.	                SetTextPos(x, y);
; 151.	                PutS(p, -1);
; 152.	            }
; 153.	            else
; 154.	            {
; 155.	                SetTextPos(0, y);
; 156.	                PutS(p, 21);
; 157.	                SetTextPos(0, y+8);
; 158.	                PutS(p+21, -1);
; 159.	            }
; 160.	        }
; 161.	        */
; 162.	        if(x == 255)    //16*16字体居中显示
	LD	B,(IX+8)
	INC	B
	LD	C,(IX+10)
	JR	NZ,?0022
?0021:
; 163.	        {
; 164.	            SetTextPos((SCR_WIDTH - (BYTE)get_large_text_width(p)) /2, y);
	PUSH	BC
	PUSH	IY
	POP	DE
	LD	A,BYTE3 get_large_text_width
	LD	HL,LWRD get_large_text_width
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	LD	E,L
	LD	D,B
	LD	HL,176
	AND	A
	SBC	HL,DE
	EX	DE,HL
	LD	C,2
	CALL	LWRD ?SS_DIV_L02
	POP	BC
	JR	?0029
; 165.	            PutS(p, -1);
; 166.	        }
; 167.	        else                                            //16*16字体非居中显示
?0022:
; 168.	        {
; 169.	            SetTextPos(x, y);
	LD	E,(IX+8)
?0029:
	CALL	LWRD SetTextPos
; 170.	            PutS(p, -1);
	LD	C,255
	PUSH	IY
	POP	DE
	CALL	LWRD PutS
?0023:
; 171.	        }
; 172.	
; 173.	    return 1;
	LD	HL,1
; 174.	}
?0024:
	LD	SP,IX
	POP	IX
	POP	IY
	JP	LWRD ?BANK_FAST_LEAVE_L08
	RSEG	UDATA0
file_name:
	DEFS	12
dir_name:
	DEFS	30
	END

⌨️ 快捷键说明

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