ap_common2.s01

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

S01
500
字号
	NAME	ap_common2(17)
	RSEG	COM_RES(0)
	RSEG	CONST(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
	PUBLIC	music_ext
	EXTERN	res_entry
	EXTERN	res_fp
	PUBLIC	voice_ext
	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.	//========== const field ===============
; 22.	const char music_ext[][4] = {"MP3", "WMA", "ASF", "WMV", "OGG", "APE"};
; 23.	const char voice_ext[][4] = {"WAV", "ACT"};
; 24.	
; 25.	 
; 26.	
; 27.	/*
; 28.	********************************************************************************
; 29.	* Description : 获得字符串的显示宽度
; 30.	*
; 31.	* Arguments   :
; 32.	*
; 33.	*
; 34.	* Returns     :
; 35.	*
; 36.	* Notes       : 能够识别 \r \n, 中文作为2个TCHAR 识别
; 37.	*
; 38.	********************************************************************************
; 39.	*/
; 40.	
; 41.	int get_text_width(const char *string)
; 42.	{
	PUSH	BC
	PUSH	IY
	PUSH	IX
	PUSH	DE
	POP	IX
; 43.	    int w=0;
	LD	IY,0
?0003:
; 44.	
; 45.	    ASSERT(string != NULL);
; 46.	
; 47.	    while(*string != 0)
	XOR	A
	OR	(IX+0)
	JR	Z,?0002
?0004:
; 48.	    {
; 49.	        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:
; 50.	        else if(*string < 0x80) w += CHAR_WIDTH;
	LD	A,(IX+0)
	CP	128
	JR	NC,?0011
?0010:
	LD	BC,6
	JR	?0041
?0011:
; 51.	        else w += TCHAR_WIDTH;
	LD	BC,8
?0041:
	ADD	IY,BC
?0012:
?0009:
; 52.	
; 53.	        string++;
	INC	IX
	JR	?0003
?0002:
; 54.	    }
; 55.	    return w;
	PUSH	IY
	POP	HL
; 56.	}
	POP	IX
	POP	IY
	POP	BC
	JP	LWRD ?BANK_FAST_LEAVE_L08
get_large_text_width:
; 57.	
; 58.	/*
; 59.	********************************************************************************
; 60.	* Description : 获得大字体字符串的显示宽度
; 61.	*
; 62.	* Arguments   :
; 63.	*
; 64.	*
; 65.	* Returns     :
; 66.	*
; 67.	* Notes       : 能够识别 \r \n, 中文作为2个TCHAR 识别
; 68.	*
; 69.	********************************************************************************
; 70.	*/
; 71.	
; 72.	int get_large_text_width(const char *string)
; 73.	{
	PUSH	BC
	PUSH	DE
; 74.	//注意: 如果 LARGE_CHAR_WIDTH != TCHAR_WIDTH, 请使用注释起来的代码
; 75.	
; 76.	    ASSERT(LARGE_CHAR_WIDTH == TCHAR_WIDTH);
; 77.	    return strlen(string) * 8;
	LD	L,E
	LD	H,D
	CALL	LWRD ?STRLEN_L11
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
; 78.	
; 79.	 
; 80.	}
	POP	AF
	POP	BC
	JP	LWRD ?BANK_FAST_LEAVE_L08
ResShowMultiString:
; 81.	
; 82.	 
; 83.	 
; 84.	/*
; 85.	********************************************************************************
; 86.	* Description : 在指定位置显示多语言字符串
; 87.	*
; 88.	* Arguments   : id, 资源代号
; 89.	        string_id, 语言代号
; 90.	        x, y, 屏幕坐标,x=255 表示x方向居中
; 91.	*
; 92.	* Returns     : 成功, 1
; 93.	        失败, 0
; 94.	*
; 95.	* Notes       :
; 96.	*
; 97.	********************************************************************************
; 98.	*/
; 99.	 
; 100.	
; 101.	int ResShowMultiString(WORD id, BYTE string_id, uchar x, uchar y)
; 102.	{
	PUSH	IY
	PUSH	IX
	LD	IX,0
	ADD	IX,SP
	PUSH	BC
	PUSH	DE
	LD	HL,65482
	ADD	HL,SP
	LD	SP,HL
; 103.	
; 104.	    //需要动态申请 string 的空间
; 105.	    char *p,AddBuf;
; 106.	    char buf[50];
; 107.	    BYTE StrLength,string_idtemp;
; 108.	
; 109.	    ASSERT(id <= UIID_MAX);
; 110.	
; 111.	    //读entry
; 112.	    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
; 113.	    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
; 114.	    if( res_entry.type != RES_TYPE_MSTRING) return 0;           //非Multisring 返回
	LD	A,(res_entry+6)
	CP	3
	JR	Z,?0014
?0013:
	LD	HL,0
; 115.	
; 116.	    ASSERT(res_entry.length <= sizeof(buf));
	JP	LWRD ?0037
?0014:
; 117.	
; 118.	    //读数据
; 119.	    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
	LD	DE,(res_fp)
	CALL	LWRD SD_FSeek
	POP	HL
	POP	HL
; 120.	    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
; 121.	
; 122.	    //定位到 string_id
; 123.	    p = buf;
	LD	HL,4
	ADD	HL,SP
	PUSH	HL
	POP	IY
; 124.	    string_idtemp=string_id;
	LD	B,(IX-2)
	LD	(IX-56),B
?0016:
; 125.	    while(string_id)
	XOR	A
	OR	(IX-2)
	JR	Z,?0015
?0017:
; 126.	    {
; 127.	
; 128.	        AddBuf=1;
	LD	(IX-58),1
?0019:
; 129.	        while(*p!=0)
	XOR	A
	OR	(IY+0)
	JR	Z,?0018
?0020:
; 130.	        {
; 131.	            AddBuf++;    //找到第string_id 个0
	INC	(IX-58)
; 132.	            p++;
	INC	IY
	JR	?0019
?0018:
; 133.	        }
; 134.	        string_id--;
	DEC	(IX-2)
; 135.	        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
; 136.	    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
	LD	DE,(res_fp)
	CALL	LWRD SD_FSeek
	POP	HL
	POP	HL
; 137.	        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
; 138.	        p = buf;
	LD	HL,4
	ADD	HL,SP
	PUSH	HL
	POP	IY
	JR	?0016
?0015:
; 139.	
; 140.	    }
; 141.	    string_id=string_idtemp;
; 142.	    ASSERT((WORD)(p - buf) <= res_entry.length);
; 143.	
; 144.	    StrLength=(BYTE)strlen(p);
	CALL	LWRD ?STRLEN_L11
; 145.	        if((x == 255)&&(string_id!=1)&&(string_id<5))    //16*16字体居中显示
	LD	B,(IX-56)
	LD	(IX-2),B
	LD	B,(IX+8)
	INC	B
	JR	NZ,?0022
	LD	B,(IX-2)
	DEC	B
	JR	Z,?0022
	LD	A,(IX-2)
	CP	5
	JR	NC,?0022
?0024:
?0023:
?0021:
; 146.	        {
; 147.	            {
; 148.	                     SetTextPos((SCR_WIDTH - (BYTE)get_large_text_width(p)) /2, y);
	LD	C,(IX+10)
	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,0
	LD	HL,220
	AND	A
	SBC	HL,DE
	EX	DE,HL
	LD	BC,2
	JR	?0053
; 149.	                 PutS(p, -1);
?0022:
; 150.	            }
; 151.	        }
; 152.	        else if((string_id!=1)&&(string_id<5))    ////16*16字体非居中显示
	LD	B,(IX-2)
	DEC	B
	JR	Z,?0027
	LD	A,(IX-2)
	CP	5
	JR	NC,?0027
?0029:
?0028:
?0026:
; 153.	        {
; 154.	            SetTextPos(x, y);
	LD	C,(IX+10)
	JR	?0052
; 155.	            PutS(p, -1);
; 156.	        }
; 157.	        else        //6*8字体显示
?0027:
; 158.	        {
; 159.	            if(x == 255)
	LD	B,(IX+8)
	INC	B
	JR	NZ,?0032
?0031:
; 160.	            {
; 161.	                SetTextPos((SCR_WIDTH - StrLength*CHAR_WIDTH) /2, y);
	LD	C,(IX+10)
	PUSH	BC
	LD	H,B
	ADD	HL,HL
	LD	E,L
	LD	D,H
	ADD	HL,HL
	ADD	HL,DE
	EX	DE,HL
	LD	HL,220
	AND	A
	SBC	HL,DE
	EX	DE,HL
	LD	C,2
?0053:
	CALL	LWRD ?SS_DIV_L02
	POP	BC
	JR	?0050
; 162.	                PutS(p, -1);
?0032:
; 163.	            }
; 164.	            else if(StrLength<22)
	LD	A,L
	CP	22
	LD	C,(IX+10)
	JR	NC,?0035
?0034:
; 165.	            {
; 166.	                SetTextPos(x, y);
?0052:
	LD	E,(IX+8)
?0050:
	CALL	LWRD SetTextPos
; 167.	                PutS(p, -1);
	LD	C,255
	PUSH	IY
	POP	DE
	JR	?0042
; 168.	            }
; 169.	            else
?0035:
; 170.	            {
; 171.	                SetTextPos(0, y);
	LD	E,0
	CALL	LWRD SetTextPos
; 172.	                PutS(p, 21);
	LD	C,21
	PUSH	IY
	POP	DE
	CALL	LWRD PutS
; 173.	                SetTextPos(0, y+8);
	LD	A,(IX+10)
	ADD	A,8
	LD	C,A
	LD	E,0
	CALL	LWRD SetTextPos
; 174.	                PutS(p+21, -1);
	LD	C,255
	LD	HL,21
	PUSH	IY
	POP	DE
	ADD	HL,DE
	EX	DE,HL
?0042:
	CALL	LWRD PutS
?0036:
?0033:
?0030:
?0025:
; 175.	            }
; 176.	        }
; 177.	
; 178.	    return 1;
	LD	HL,1
; 179.	}
?0037:
	LD	SP,IX
	POP	IX
	POP	IY
	JP	LWRD ?BANK_FAST_LEAVE_L08
; 180.	
; 181.	 
	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
	RSEG	UDATA0
file_name:
	DEFS	12
dir_name:
	DEFS	30
	END

⌨️ 快捷键说明

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