📄 ap_common2.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 + -