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