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

📄 ap_common2.s01

📁 5807收音机模块用于炬力平台
💻 S01
字号:
	NAME	ap_common2(17)
	RSEG	COM_RES(0)
	RSEG	CONST(0)
	EXTERN	PutS
	PUBLIC	ResShowMultiString
	PUBLIC	ResShowString
	EXTERN	SD_FRead
	EXTERN	SD_FSeek
	EXTERN	SetAsciiFont
	EXTERN	SetTextPos
	EXTERN	UpdateScreen
	PUBLIC	get_large_text_width
	PUBLIC	get_text_width
	PUBLIC	music_ext
	EXTERN	res_entry
	EXTERN	res_fp
	EXTERN	ui_auto_update
	PUBLIC	voice_ext
	EXTERN	?CLZ80B_4_04_L00
	EXTERN	?SS_DIV_L02
	EXTERN	?L_LSH_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.	*******************************************************************************
; 10.	*/ 
; 11.	#pragma codeseg(COM_RES)
; 12.	
; 13.	#include "ap_common.h"
; 14.	
; 15.	//========== global field ===============
; 16.	
; 17.	extern res_entry_t res_entry;
; 18.	
; 19.	//========== const field ===============
; 20.	#ifdef __OGG_SUPPORT
; 21.	    const char music_ext[][4] = {"MP3", "WMA", "ASF", "WMV", "OGG", "APE"};
; 22.	#else
; 23.	    const char music_ext[][4] = {"MP3", "WMA", "ASF", "WMV", "APE"};
; 24.	#endif
; 25.	const char voice_ext[][4] = {"WAV", "ACT"};
; 26.	
; 27.	//do not use printf
; 28.	//const char mychar[] = "0123456789";
; 29.	
; 30.	/*
; 31.	********************************************************************************
; 32.	* Description : 获得字符串的显示宽度
; 33.	*
; 34.	* Arguments   : 
; 35.	*               
; 36.	*
; 37.	* Returns     : 
; 38.	*
; 39.	* Notes       : 能够识别 \r \n, 中文作为2个TCHAR 识别
; 40.	*
; 41.	********************************************************************************
; 42.	*/
; 43.	
; 44.	int get_text_width(const char *string)
; 45.	{
	PUSH	BC
	PUSH	IY
	PUSH	IX
	PUSH	DE
	POP	IX
; 46.	        int w=0;
	LD	IY,0
?0003:
; 47.	
; 48.	        ASSERT(string != NULL);
; 49.	        
; 50.	        while(*string != 0)
	XOR	A
	OR	(IX+0)
	JR	Z,?0002
?0004:
; 51.	        {
; 52.	                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:
; 53.	                else if(*string < 0x80) w += CHAR_WIDTH;
	LD	A,(IX+0)
	CP	128
	JR	NC,?0011
?0010:
	LD	BC,6
	JR	?0039
?0011:
; 54.	                else w += TCHAR_WIDTH;
	LD	BC,8
?0039:
	ADD	IY,BC
?0012:
?0009:
; 55.	                
; 56.	                string++;
	INC	IX
	JR	?0003
?0002:
; 57.	        }
; 58.	        return w;
	PUSH	IY
	POP	HL
; 59.	}
	POP	IX
	POP	IY
	POP	BC
	JP	LWRD ?BANK_FAST_LEAVE_L08
get_large_text_width:
; 60.	
; 61.	/*
; 62.	********************************************************************************
; 63.	* Description : 获得大字体字符串的显示宽度
; 64.	*
; 65.	* Arguments   : 
; 66.	*               
; 67.	*
; 68.	* Returns     : 
; 69.	*
; 70.	* Notes       : 能够识别 \r \n, 中文作为2个TCHAR 识别
; 71.	*
; 72.	********************************************************************************
; 73.	*/
; 74.	
; 75.	int get_large_text_width(const char *string)
; 76.	{
	PUSH	BC
	PUSH	DE
; 77.	//注意: 如果 LARGE_CHAR_WIDTH != TCHAR_WIDTH, 请使用注释起来的代码
; 78.	
; 79.	        ASSERT(LARGE_CHAR_WIDTH == TCHAR_WIDTH);
; 80.	        return strlen(string) * LARGE_CHAR_WIDTH;
	LD	L,E
	LD	H,D
	CALL	LWRD ?STRLEN_L11
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
; 81.	        
; 82.	/*      
; 83.	        int w=0;
; 84.	
; 85.	        ASSERT(string != NULL);
; 86.	        
; 87.	        while(*string != 0)
; 88.	        {
; 89.	                if(*string == '\r'|| *string == '\n') {;}       //不计算回车换行
; 90.	                else if(*string < 0x80) w += LARGE_CHAR_WIDTH;
; 91.	                else w += TCHAR_WIDTH;
; 92.	                
; 93.	                string++;
; 94.	        }
; 95.	        return w;
; 96.	*/      
; 97.	}
	POP	AF
	POP	BC
	JP	LWRD ?BANK_FAST_LEAVE_L08
ResShowString:
; 98.	
; 99.	/*
; 100.	********************************************************************************
; 101.	* Description : 在指定位置显示字符串
; 102.	*
; 103.	* Arguments   : id, 资源代号
; 104.	                x, y, 屏幕坐标, x=255 表示x方向居中
; 105.	*
; 106.	* Returns     : 成功, 1
; 107.	                失败, 0
; 108.	*
; 109.	* Notes       : 
; 110.	                资源的类型可以是 RES_TYPE_STRING 或者 RES_TYPE_MSTRING
; 111.	*
; 112.	********************************************************************************
; 113.	*/
; 114.	int ResShowString(WORD id, uchar x, uchar y)
; 115.	{
	PUSH	IX
	LD	IX,0
	ADD	IX,SP
	PUSH	BC
	PUSH	DE
	LD	HL,65486
	ADD	HL,SP
	LD	SP,HL
; 116.	        //需要动态申请 string 的空间
; 117.	//      char *buf = NULL;
; 118.	        char buf[50];
; 119.	
; 120.	        ASSERT(id <= UIID_MAX);
; 121.	
; 122.	        //读entry
; 123.	        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
	CALL	LWRD ?0044
	POP	HL
	POP	HL
; 124.	        SD_FRead(res_fp, &res_entry, sizeof(res_entry_t));
	LD	HL,16
	PUSH	HL
	LD	BC,res_entry
	LD	DE,(res_fp)
	CALL	LWRD SD_FRead
	POP	AF
; 125.	        if(res_entry.type != RES_TYPE_STRING && 
; 126.	                res_entry.type != RES_TYPE_MSTRING) return 0;
	LD	A,(res_entry+6)
	DEC	A
	DEC	A
	JR	Z,?0014
	LD	A,(res_entry+6)
	CP	3
	JR	Z,?0014
?0016:
?0015:
?0013:
	LD	HL,0
; 127.	
; 128.	        //realloc buf = res_entry.length
; 129.	//      buf = (char *)BufAlloc(res_entry.length);
; 130.	//      ASSERT(buf != NULL);
; 131.	        ASSERT(res_entry.length <= sizeof(buf));
	JR	?0022
?0014:
; 132.	
; 133.	        //读数据
; 134.	        SD_FSeek(res_fp, SEEK_SET, res_entry.offset);
	LD	HL,(res_entry+2)
	PUSH	HL
	LD	HL,(res_entry)
	PUSH	HL
	CALL	LWRD ?0044
	POP	HL
	POP	HL
; 135.	        SD_FRead(res_fp, buf, res_entry.length);
	LD	HL,res_entry+4
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	PUSH	BC
	LD	HL,2
	ADD	HL,SP
	LD	C,L
	LD	B,H
	LD	DE,(res_fp)
	CALL	LWRD SD_FRead
	POP	AF
; 136.	
; 137.	        //显示 
; 138.	        SetAsciiFont(FONT_TYPE_LARGE);
	LD	E,4
	CALL	LWRD SetAsciiFont
; 139.	        if(x == 255)    //居中显示
	LD	B,(IX-2)
	INC	B
	LD	C,(IX+6)
	JR	NZ,?0018
?0017:
; 140.	        {
; 141.	                SetTextPos((SCR_WIDTH - (BYTE)get_large_text_width(buf)) /2, y);
	PUSH	BC
	LD	HL,2
	ADD	HL,SP
	EX	DE,HL
	CALL	LWRD ?0045
	POP	BC
	JR	?0040
; 142.	                PutS(buf, -1);
; 143.	        }
; 144.	        else
?0018:
; 145.	        {
; 146.	                SetTextPos(x, y);
	LD	E,(IX-2)
?0040:
	CALL	LWRD SetTextPos
; 147.	                PutS(buf, -1);
	LD	C,255
	LD	HL,0
	ADD	HL,SP
	EX	DE,HL
	CALL	LWRD PutS
?0019:
; 148.	        }
; 149.	        SetAsciiFont(FONT_TYPE_DEFAULT);        
	LD	E,0
	CALL	LWRD SetAsciiFont
; 150.	        if(ui_auto_update) UpdateScreen(NULL); //MSG
	LD	A,(ui_auto_update)
	OR	A
	JR	Z,?0021
?0020:
	LD	DE,0
	CALL	LWRD UpdateScreen
?0021:
; 151.	                
; 152.	        //释放内存
; 153.	        //if(buf != NULL) BufFree((int *)buf);
; 154.	        return 1;        
	LD	HL,1
; 155.	}
?0022:
	LD	SP,IX
	POP	IX
	JP	LWRD ?BANK_FAST_LEAVE_L08
?0044:
	LD	C,0
	LD	DE,(res_fp)
	JP	LWRD SD_FSeek
?0045:
	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,128
	AND	A
	SBC	HL,DE
	EX	DE,HL
	LD	C,2
	JP	LWRD ?SS_DIV_L02
ResShowMultiString:
; 156.	
; 157.	/*
; 158.	********************************************************************************
; 159.	* Description : 在指定位置显示多语言字符串
; 160.	*
; 161.	* Arguments   : id, 资源代号
; 162.	                string_id, 语言代号
; 163.	                x, y, 屏幕坐标,x=255 表示x方向居中
; 164.	*
; 165.	* Returns     : 成功, 1
; 166.	                失败, 0
; 167.	*
; 168.	* Notes       : 
; 169.	*
; 170.	********************************************************************************
; 171.	*/
; 172.	int ResShowMultiString(WORD id, BYTE string_id, uchar x, uchar y)
; 173.	{
	PUSH	IX
	PUSH	BC
	PUSH	DE
	LD	HL,65436
	ADD	HL,SP
	LD	SP,HL
; 174.	        //需要动态申请 string 的空间
; 175.	//      char *buf = NULL;
; 176.	        char *p;
; 177.	        char buf[100];
; 178.	
; 179.	        ASSERT(id <= UIID_MAX);
; 180.	
; 181.	        //读entry
; 182.	        SD_FSeek(res_fp, SEEK_SET, (long)id * sizeof(res_entry_t));
	LD	L,E
	LD	H,D
	LD	BC,0
	LD	A,4
	CALL	LWRD ?L_LSH_L03
	PUSH	BC
	PUSH	HL
	CALL	LWRD ?0044
	POP	HL
	POP	HL
; 183.	        SD_FRead(res_fp, &res_entry, sizeof(res_entry_t));
	LD	HL,16
	PUSH	HL
	LD	BC,res_entry
	LD	DE,(res_fp)
	CALL	LWRD SD_FRead
	POP	AF
; 184.	        if( res_entry.type != RES_TYPE_MSTRING) return 0;
	LD	A,(res_entry+6)
	CP	3
	JR	Z,?0024
?0023:
	LD	HL,0
; 185.	
; 186.	        //realloc buf = res_entry.length
; 187.	        //buf = (char *)BufAlloc(res_entry.length);
; 188.	        //ASSERT(buf != NULL);
; 189.	        ASSERT(res_entry.length <= sizeof(buf));
	JR	?0035
?0024:
; 190.	        
; 191.	        //读数据
; 192.	        SD_FSeek(res_fp, SEEK_SET, res_entry.offset);
	LD	HL,(res_entry+2)
	PUSH	HL
	LD	HL,(res_entry)
	PUSH	HL
	CALL	LWRD ?0044
	POP	HL
	POP	HL
; 193.	        SD_FRead(res_fp, buf, res_entry.length);
	LD	HL,res_entry+4
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	PUSH	BC
	LD	HL,2
	ADD	HL,SP
	LD	C,L
	LD	B,H
	LD	DE,(res_fp)
	CALL	LWRD SD_FRead
	POP	AF
; 194.	
; 195.	        //定位到 string_id
; 196.	        p = buf;
	LD	HL,0
	ADD	HL,SP
	PUSH	HL
	POP	IX
?0026:
; 197.	        while( string_id)
	LD	HL,102
	ADD	HL,SP
	XOR	A
	OR	(HL)
	JR	Z,?0025
?0027:
; 198.	        {
; 199.	                if(*p == 0) string_id--;    //找到第string_id 个0
	XOR	A
	OR	(IX+0)
	JR	NZ,?0029
?0028:
	DEC	(HL)
?0029:
; 200.	                p++;
; 201.	        }
; 202.	        ASSERT((WORD)(p - buf) <= res_entry.length);
	INC	IX
	JR	?0026
?0025:
; 203.	                
; 204.	        //复制到 buf, 这里从buf尾部复制到头部, 存在不安全因素
; 205.	        //strcpy(buf, p);
; 206.	    
; 207.	        SetAsciiFont(FONT_TYPE_LARGE);
	LD	E,4
	CALL	LWRD SetAsciiFont
; 208.	        if(x == 255)    //居中显示
	LD	HL,110
	ADD	HL,SP
	LD	B,(HL)
	INC	B
	INC	HL
	INC	HL
	LD	C,(HL)
	JR	NZ,?0031
?0030:
; 209.	        {
; 210.	                SetTextPos((SCR_WIDTH - (BYTE)get_large_text_width(p)) /2, y);
	PUSH	BC
	PUSH	IX
	POP	DE
	CALL	LWRD ?0045
	POP	BC
	JR	?0043
; 211.	                PutS(p, -1);
; 212.	        }
; 213.	        else
?0031:
; 214.	        {
; 215.	                SetTextPos(x, y);
	DEC	HL
	DEC	HL
	LD	E,(HL)
?0043:
	CALL	LWRD SetTextPos
; 216.	                PutS(p, -1);
	LD	C,255
	PUSH	IX
	POP	DE
	CALL	LWRD PutS
?0032:
; 217.	        }
; 218.	        
; 219.	        SetAsciiFont(FONT_TYPE_DEFAULT);        
	LD	E,0
	CALL	LWRD SetAsciiFont
; 220.	        if(ui_auto_update) UpdateScreen(NULL);
	LD	A,(ui_auto_update)
	OR	A
	JR	Z,?0034
?0033:
	LD	DE,0
	CALL	LWRD UpdateScreen
?0034:
; 221.	    
; 222.	        //释放内存
; 223.	        //if(buf != NULL) BufFree((int *)buf);
; 224.	        return 1;
	LD	HL,1
; 225.	}
?0035:
	EX	DE,HL
	LD	HL,104
	ADD	HL,SP
	LD	SP,HL
	EX	DE,HL
	POP	IX
	JP	LWRD ?BANK_FAST_LEAVE_L08
; 226.	
; 227.	
	RSEG	CONST
music_ext:
	DEFB	'MP3'
	DEFB	0
	DEFB	'WMA'
	DEFB	0
	DEFB	'ASF'
	DEFB	0
	DEFB	'WMV'
	DEFB	0
	DEFB	'OGG'
	DEFB	0
	DEFB	'APE'
	DEFB	0
voice_ext:
	DEFB	'WAV'
	DEFB	0
	DEFB	'ACT'
	DEFB	0
	END

⌨️ 快捷键说明

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