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 + -
显示快捷键?