📄 ui_scroll_string.s01
字号:
NAME ui_scroll_string(17)
RSEG COM_RES(0)
RSEG UDATA0(0)
EXTERN CharOutRect
PUBLIC CountString
PUBLIC Count_Byte
EXTERN GetTextPos
PUBLIC HoriScrollString
EXTERN PutS
EXTERN RegionCopy
PUBLIC ScrollFlag
PUBLIC ScrollString
PUBLIC ScrollStringInit
EXTERN SetTextPos
PUBLIC region_scroll
PUBLIC scroll_buf
EXTERN scroll_cnt
EXTERN str_pt
EXTERN strhead_pt
EXTERN ?CLZ80B_4_04_L00
EXTERN ?SS_CMP_L02
EXTERN ?BANK_CALL_DIRECT_L08
EXTERN ?BANK_LEAVE_DIRECT_L08
EXTERN ?BANK_FAST_LEAVE_L08
EXTERN ?ENT_PARM_DIRECT_L09
EXTERN ?ENT_AUTO_DIRECT_L09
RSEG COM_RES
ScrollString:
; 1. /*
; 2. *******************************************************************************
; 3. * ACTOS AP
; 4. * wma player basal module implementation
; 5. *
; 6. * (c) Copyright Actions Co,Ld.
; 7. *
; 8. * $Id: ui_scroll.c,v 1.1.1.1 2006/04/21 08:22:43 selina Exp $
; 9. *******************************************************************************
; 10. */
; 11. /*
; 12. 这个函数的作用是在汇编程序外包一层 C ,这样汇编在C中用BANK方式CALL
; 13. */
; 14. #pragma codeseg(COM_RES)
; 15. #include "actos.h"
; 16. #include "ap_common.h"
; 17. #define DISPLAYWIDTH 128 //显示一行字符的宽度
; 18. region_t region_scroll;
; 19. char scroll_buf[32];
; 20. char ScrollFlag;
; 21.
; 22. void ScrollStringInit(char *str,char language,region_t *scroll);
; 23. void HoriScrollString(signed char step,char language,region_t *scroll);
; 24. int CountString(char *str,char language,region_t *scroll);
; 25.
; 26. /* (字符串首址,是否初始化true为要初始化) */
; 27. void ScrollString( char * scrollstr, bool mode ,char language,region_t *scroll)
; 28. {
CALL LWRD ?ENT_PARM_DIRECT_L09
; 29. if (mode)
INC C
DEC C
LD L,(IX+12)
LD H,(IX+13)
PUSH HL
LD C,(IX+10)
JR Z,?0003
?0002:
; 30. {
; 31. //初始化滚屏(第一次调用时先显示一串字符)
; 32. ScrollStringInit(scrollstr,language,scroll);
LD A,BYTE3 ScrollStringInit
LD HL,LWRD ScrollStringInit
CALL LWRD ?BANK_CALL_DIRECT_L08
JR ?0050
; 33. return;
; 34. }
?0003:
; 35. HoriScrollString(1,language,scroll);
LD E,1
LD A,BYTE3 HoriScrollString
LD HL,LWRD HoriScrollString
CALL LWRD ?BANK_CALL_DIRECT_L08
?0050:
POP HL
; 36. }
?0004:
JP LWRD ?BANK_LEAVE_DIRECT_L08
ScrollStringInit:
; 37.
; 38. void ScrollStringInit(char *str,char language,region_t *scroll)
; 39. {
CALL LWRD ?ENT_AUTO_DIRECT_L09
DEFW 65526
PUSH IY
LD L,(IX+10)
LD H,(IX+11)
PUSH HL
POP IY
; 40. int code;
; 41. int count;
; 42. bool result;
; 43. region_t kregion;//余下部分区域
; 44. scroll_cnt = 0;
XOR A
LD (scroll_cnt),A
; 45.
; 46. SetTextPos(scroll->x, scroll->y);
LD C,(IY+1)
LD E,(IY+0)
CALL LWRD SetTextPos
; 47. strhead_pt = str_pt = str;
LD L,(IX+2)
LD H,(IX+3)
LD (str_pt),HL
LD (strhead_pt),HL
; 48. //tmpstr = str;
; 49. count=CountString(str_pt,language,scroll);
PUSH IY
LD C,(IX+4)
EX DE,HL
LD A,BYTE3 CountString
LD HL,LWRD CountString
CALL LWRD ?BANK_CALL_DIRECT_L08
POP AF
; 50. str_pt = PutS(str_pt, count);
LD C,L
LD DE,(str_pt)
CALL LWRD PutS
LD (str_pt),HL
; 51.
; 52.
; 53.
; 54. if(*str_pt!=0)
XOR A
OR (HL)
JR Z,?0006
?0005:
; 55. {
; 56. GetTextPos(&kregion.x, &kregion.y);
LD HL,2
ADD HL,SP
LD BC,1
ADD HL,BC
LD C,L
LD B,H
DEC HL
EX DE,HL
CALL LWRD GetTextPos
; 57. kregion.width = scroll->width+scroll->x - kregion.x;
LD A,(IY+0)
ADD A,(IY+2)
SUB (IX-10)
LD (IX-8),A
; 58. kregion.height = scroll->height;
LD B,(IY+3)
LD (IX-7),B
; 59. //汉字和ASCII的不同处理
; 60. if ((*str_pt >= FirstSectionCode)&&(language!=1))
LD HL,(str_pt)
LD A,(HL)
CP 161
JR C,?0008
LD B,(IX+4)
DEC B
JR Z,?0008
?0010:
?0009:
?0007:
; 61. {//汉字
; 62. code = *(int *)str_pt;
LD B,(HL)
LD (IX-6),B
INC HL
LD H,(HL)
LD (IX-5),H
; 63. }
; 64. else
JR ?0011
?0008:
; 65. {//ASCII
; 66. code = *str_pt;
LD C,(HL)
LD (IX-6),C
LD B,0
LD (IX-5),B
?0011:
; 67. }
; 68.
; 69. //输出最后一个字
; 70. result = CharOutRect(code, *(str_pt+1), &kregion, scroll_cnt);
LD A,(scroll_cnt)
LD C,A
PUSH BC
LD HL,4
ADD HL,SP
PUSH HL
LD HL,(str_pt)
INC HL
LD C,(HL)
LD B,0
LD E,(IX-6)
LD D,(IX-5)
CALL LWRD CharOutRect
POP HL
POP HL
; 71. if (!result)
OR A
JR Z,?0014
?0012:
; 72. {
; 73. return;
; 74. }
?0013:
; 75. //scroll_cnt = kregion.width-1;
; 76. scroll_cnt = kregion.width;
LD A,(IX-8)
LD (scroll_cnt),A
; 77.
; 78. }
; 79. else
JR ?0014
?0006:
; 80. {
; 81. str_pt = strhead_pt;
LD HL,(strhead_pt)
LD (str_pt),HL
; 82. return;
; 83. }
?0014:
; 84.
; 85. }
?0015:
POP IY
JP LWRD ?BANK_LEAVE_DIRECT_L08
HoriScrollString:
; 86.
; 87. //==========================================================
; 88. /*
; 89. 滚动屏幕
; 90. */
; 91. void HoriScrollString(signed char step,char language,region_t *scroll)
; 92. {
CALL LWRD ?ENT_AUTO_DIRECT_L09
DEFW 65520
PUSH IY
LD L,(IX+10)
LD H,(IX+11)
PUSH HL
POP IY
; 93. int code;
; 94. char *tmpstrpt;
; 95. region_t tregion;
; 96. region_t sregion;
; 97. region_t kregion;//余下部分区域
; 98.
; 99. tmpstrpt = str_pt;
LD HL,(str_pt)
LD (IX-16),L
LD (IX-15),H
; 100.
; 101. //余下部分区域
; 102. kregion.x = scroll->x + scroll->width - step;
LD A,(IY+2)
ADD A,(IY+0)
SUB (IX+2)
LD (IX-14),A
; 103. kregion.y = scroll->y;
LD B,(IY+1)
LD (IX-13),B
; 104. kregion.width = step;
LD B,(IX+2)
LD (IX-12),B
; 105. kregion.height = scroll->height;
LD B,(IY+3)
LD (IX-11),B
; 106.
; 107. //设定移动的源,目标区域
; 108. sregion.x = scroll->x + step;//暂时未考虑为负数的情况
LD A,(IY+0)
ADD A,(IX+2)
LD (IX-10),A
; 109. tregion.x = scroll->x;
LD B,(IY+0)
LD (IX-6),B
; 110. tregion.y = sregion.y = scroll->y;
LD B,(IY+1)
LD (IX-9),B
LD (IX-5),B
; 111. sregion.width = scroll->width - step;
LD A,(IY+2)
SUB (IX+2)
LD (IX-8),A
; 112. sregion.height = scroll->height;
LD B,(IY+3)
LD (IX-7),B
; 113.
; 114. //向左移step列
; 115. RegionCopy(&sregion, &tregion);
LD HL,12
ADD HL,SP
LD C,L
LD B,H
LD HL,8
ADD HL,SP
EX DE,HL
CALL LWRD RegionCopy
?0016:
; 116.
; 117.
; 118.
; 119. test:
; 120. if (*str_pt == '\0')
LD HL,(str_pt)
XOR A
OR (HL)
JR NZ,?0018
?0017:
; 121. {
; 122. tmpstrpt = str_pt = strhead_pt;
LD HL,(strhead_pt)
LD (str_pt),HL
LD (IX-16),L
LD (IX-15),H
?0018:
; 123. }
; 124.
; 125. //汉字和ASCII的不同处理
; 126. if ((*str_pt >= FirstSectionCode)&&(language!=1))
LD A,(HL)
CP 161
JR C,?0020
LD B,(IX+4)
DEC B
JR Z,?0020
?0022:
?0021:
?0019:
; 127. {//汉字
; 128. code = *(int *)str_pt;
LD B,(HL)
LD (IX-2),B
INC HL
LD H,(HL)
LD (IX-1),H
; 129. tmpstrpt++;
INC (IX-16)
JR NZ,?0023
INC (IX-15)
; 130. }
; 131. else
JR ?0023
?0020:
; 132. {//ASCII
; 133. code = *str_pt;
LD C,(HL)
LD (IX-2),C
LD B,0
LD (IX-1),B
?0023:
; 134. }
; 135. tmpstrpt++;
INC (IX-16)
JR NZ,?0053
INC (IX-15)
?0053:
; 136.
; 137. if (!CharOutRect(code, *(str_pt+1), &kregion, scroll_cnt))
LD A,(scroll_cnt)
LD C,A
PUSH BC
LD HL,6
ADD HL,SP
PUSH HL
LD HL,(str_pt)
INC HL
LD C,(HL)
LD B,0
LD E,(IX-2)
LD D,(IX-1)
CALL LWRD CharOutRect
POP HL
POP HL
OR A
JR NZ,?0025
?0024:
; 138. {
; 139. //strhead_pt = str_pt;
; 140. str_pt = tmpstrpt;
LD L,(IX-16)
LD H,(IX-15)
LD (str_pt),HL
; 141. scroll_cnt = 0;
LD (scroll_cnt),A
; 142. goto test;
JR ?0016
?0025:
; 143. }
; 144. scroll_cnt += step;//未支持负数
LD A,(scroll_cnt)
ADD A,(IX+2)
LD (scroll_cnt),A
; 145.
; 146. }
POP IY
JP LWRD ?BANK_LEAVE_DIRECT_L08
CountString:
; 147.
; 148. int CountString(char *str,char language,region_t *scroll) //统计字数
; 149. {
CALL LWRD ?ENT_AUTO_DIRECT_L09
DEFW 0
PUSH IY
; 150. int n=0;
; 151. int m=0;
LD DE,0
LD IY,0
?0027:
; 152. while(*str!=0)
LD L,(IX+2)
LD H,(IX+3)
XOR A
OR (HL)
JR Z,?0026
?0028:
; 153. {
; 154. if((*str >= FirstSectionCode)&&(language!=1))
LD A,(HL)
CP 161
JR C,?0030
LD B,(IX+4)
DEC B
JR Z,?0030
?0032:
?0031:
?0029:
; 155. {
; 156. if(m+16 > scroll->width)break;
LD HL,16
CALL LWRD ?0064
JR C,?0026
?0033:
?0034:
; 157. *str++;
INC (IX+2)
JR NZ,?0054
INC (IX+3)
?0054:
; 158. *str++;
INC (IX+2)
JR NZ,?0055
INC (IX+3)
?0055:
; 159. n++;
INC DE
; 160. m=m+16;
LD BC,16
JR ?0057
; 161. }
; 162. else
?0030:
; 163. {
; 164. if(m+8>scroll->width)break;
LD HL,8
CALL LWRD ?0064
JR C,?0026
?0036:
?0037:
; 165. *str++;
INC (IX+2)
JR NZ,?0056
INC (IX+3)
?0056:
; 166. n++;
INC DE
; 167. m=m+8;
LD BC,8
?0057:
ADD IY,BC
?0035:
JR ?0027
?0026:
; 168. }
; 169. }
; 170. return n;
EX DE,HL
; 171. }
POP IY
JP LWRD ?BANK_LEAVE_DIRECT_L08
?0064:
PUSH IY
POP BC
ADD HL,BC
LD C,L
LD B,H
LD L,(IX+10)
LD H,(IX+11)
INC HL
INC HL
LD L,(HL)
LD H,0
JP LWRD ?SS_CMP_L02
Count_Byte:
; 172.
; 173. BYTE Count_Byte(char *str,char language) //统计字数 zxs added 2007.03.26
; 174. {
CALL LWRD ?ENT_AUTO_DIRECT_L09
DEFW 65534
LD E,(IX+2)
LD D,(IX+3)
; 175. BYTE n=0;
; 176. BYTE m=0;
LD (IX-1),0
LD (IX-2),0
?0039:
; 177. while(*str!=0)
LD L,E
LD H,D
XOR A
OR (HL)
JR Z,?0038
?0040:
; 178. {
; 179. if((*str >= FirstSectionCode)&&(language!=1))
LD A,(HL)
CP 161
JR C,?0042
LD B,(IX+4)
DEC B
JR Z,?0042
?0044:
?0043:
?0041:
; 180. {
; 181. if(m+16 > DISPLAYWIDTH)break;
LD C,(IX-2)
LD B,0
LD HL,16
ADD HL,BC
LD C,L
LD B,H
LD HL,128
CALL LWRD ?SS_CMP_L02
JR C,?0038
?0045:
?0046:
; 182. *str++;
INC DE
; 183. *str++;
INC DE
; 184. n++;
INC (IX-1)
; 185. m=m+16;
LD A,(IX-2)
ADD A,16
JR ?0061
; 186. }
; 187. else
?0042:
; 188. {
; 189. if(m+8>DISPLAYWIDTH)break;
LD C,(IX-2)
LD B,0
LD HL,8
ADD HL,BC
LD C,L
LD B,H
LD HL,128
CALL LWRD ?SS_CMP_L02
JR C,?0038
?0048:
?0049:
; 190. *str++;
INC DE
; 191. n++;
INC (IX-1)
; 192. m=m+8;
LD A,(IX-2)
ADD A,8
?0061:
LD (IX-2),A
?0047:
JR ?0039
?0038:
; 193. }
; 194. }
; 195. return n;
LD L,(IX-1)
; 196. }
JP LWRD ?BANK_LEAVE_DIRECT_L08
; 197.
RSEG UDATA0
region_scroll:
DEFS 4
scroll_buf:
DEFS 32
ScrollFlag:
DEFS 1
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -