📄 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 ?BANK_CALL_DIRECT_L08
EXTERN ?BANK_FAST_LEAVE_L08
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. {
PUSH BC
PUSH DE
; 29. if (mode)
XOR A
OR C
LD HL,10
ADD HL,SP
LD C,(HL)
INC HL
LD B,(HL)
PUSH BC
DEC HL
DEC HL
DEC HL
LD C,(HL)
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 ?0051
; 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
?0051:
POP HL
; 36. }
?0004:
POP HL
POP HL
JP LWRD ?BANK_FAST_LEAVE_L08
ScrollStringInit:
; 37.
; 38. void ScrollStringInit(char *str,char language,region_t *scroll)
; 39. {
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH BC
PUSH DE
LD HL,65526
ADD HL,SP
LD SP,HL
LD L,(IX+8)
LD H,(IX+9)
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-4)
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-2)
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,0
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-14)
LD (IX-12),A
; 58. kregion.height = scroll->height;
LD B,(IY+3)
LD (IX-11),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-2)
DEC B
JR Z,?0008
?0010:
?0009:
?0007:
; 61. {//汉字
; 62. code = *(int *)str_pt;
LD B,(HL)
LD (IX-10),B
INC HL
LD H,(HL)
LD (IX-9),H
; 63. }
; 64. else
JR ?0011
?0008:
; 65. {//ASCII
; 66. code = *str_pt;
LD C,(HL)
LD (IX-10),C
LD B,0
LD (IX-9),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,2
ADD HL,SP
PUSH HL
LD HL,(str_pt)
INC HL
LD C,(HL)
LD B,0
LD E,(IX-10)
LD D,(IX-9)
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-12)
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:
LD SP,IX
POP IX
POP IY
JP LWRD ?BANK_FAST_LEAVE_L08
HoriScrollString:
; 86.
; 87. //==========================================================
; 88. /*
; 89. 滚动屏幕
; 90. */
; 91. void HoriScrollString(signed char step,char language,region_t *scroll)
; 92. {
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
PUSH BC
PUSH DE
LD HL,65520
ADD HL,SP
LD SP,HL
LD L,(IX+8)
LD H,(IX+9)
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-20),L
LD (IX-19),H
; 100.
; 101. //余下部分区域
; 102. kregion.x = scroll->x + scroll->width - step;
LD A,(IY+2)
ADD A,(IY+0)
SUB E
LD (IX-18),A
; 103. kregion.y = scroll->y;
LD B,(IY+1)
LD (IX-17),B
; 104. kregion.width = step;
LD (IX-16),E
; 105. kregion.height = scroll->height;
LD B,(IY+3)
LD (IX-15),B
; 106.
; 107. //设定移动的源,目标区域
; 108. sregion.x = scroll->x + step;//暂时未考虑为负数的情况
LD A,(IY+0)
ADD A,(IX-4)
LD (IX-14),A
; 109. tregion.x = scroll->x;
LD B,(IY+0)
LD (IX-10),B
; 110. tregion.y = sregion.y = scroll->y;
LD B,(IY+1)
LD (IX-13),B
LD (IX-9),B
; 111. sregion.width = scroll->width - step;
LD A,(IY+2)
SUB E
LD (IX-12),A
; 112. sregion.height = scroll->height;
LD B,(IY+3)
LD (IX-11),B
; 113.
; 114. //向左移step列
; 115. RegionCopy(&sregion, &tregion);
LD HL,10
ADD HL,SP
LD C,L
LD B,H
LD HL,6
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-20),L
LD (IX-19),H
?0018:
; 123. }
; 124.
; 125. //汉字和ASCII的不同处理
; 126. if ((*str_pt >= FirstSectionCode)&&(language!=1))
LD A,(HL)
CP 161
JR C,?0020
LD B,(IX-2)
DEC B
JR Z,?0020
?0022:
?0021:
?0019:
; 127. {//汉字
; 128. code = *(int *)str_pt;
LD B,(HL)
LD (IX-6),B
INC HL
LD H,(HL)
LD (IX-5),H
; 129. tmpstrpt++;
INC (IX-20)
JR NZ,?0023
INC (IX-19)
; 130. }
; 131. else
JR ?0023
?0020:
; 132. {//ASCII
; 133. code = *str_pt;
LD C,(HL)
LD (IX-6),C
LD B,0
LD (IX-5),B
?0023:
; 134. }
; 135. tmpstrpt++;
INC (IX-20)
JR NZ,?0053
INC (IX-19)
?0053:
; 136.
; 137. if (!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
OR A
JR NZ,?0025
?0024:
; 138. {
; 139. //strhead_pt = str_pt;
; 140. str_pt = tmpstrpt;
LD L,(IX-20)
LD H,(IX-19)
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-4)
LD (scroll_cnt),A
; 145.
; 146. }
JP LWRD ?0014
CountString:
; 147.
; 148. int CountString(char *str,char language,region_t *scroll) //统计字数
; 149. {
PUSH IY
PUSH IX
PUSH BC
PUSH AF
PUSH DE
POP IX
; 150. int n=0;
; 151. int m=0;
LD HL,0
ADD HL,SP
XOR A
LD (HL),A
INC HL
LD (HL),A
LD IY,0
?0027:
; 152. while(*str!=0)
XOR A
OR (IX+0)
JR Z,?0026
?0028:
; 153. {
; 154. if((*str >= FirstSectionCode)&&(language!=1))
LD A,(IX+0)
CP 161
JR C,?0030
INC HL
LD B,(HL)
DEC B
JR Z,?0030
?0032:
?0031:
?0029:
; 155. {
; 156. if(m+16 > scroll->width)break;
LD HL,16
PUSH IY
POP BC
ADD HL,BC
LD C,L
LD B,H
LD HL,12
ADD HL,SP
LD D,(HL)
INC HL
LD H,(HL)
LD L,D
INC HL
INC HL
LD L,(HL)
LD H,0
OR 128
SBC HL,BC
JP PO,?0061
XOR H
?0061:
JP M,?0026
?0033:
?0034:
; 157. *str++;
; 158. *str++;
; 159. n++;
LD HL,0
ADD HL,SP
INC (HL)
INC HL
INC IX
INC IX
JR NZ,?0062
INC (HL)
?0062:
; 160. m=m+16;
LD BC,16
JR ?0065
; 161. }
; 162. else
?0030:
; 163. {
; 164. if(m+8>scroll->width)break;
LD HL,8
PUSH IY
POP BC
ADD HL,BC
LD C,L
LD B,H
LD HL,12
ADD HL,SP
LD D,(HL)
INC HL
LD H,(HL)
LD L,D
INC HL
INC HL
LD L,(HL)
LD H,0
OR 128
SBC HL,BC
JP PO,?0063
XOR H
?0063:
JP M,?0026
?0036:
?0037:
; 165. *str++;
; 166. n++;
LD HL,0
ADD HL,SP
INC (HL)
INC HL
INC IX
JR NZ,?0064
INC (HL)
?0064:
; 167. m=m+8;
LD BC,8
?0065:
ADD IY,BC
?0035:
JR ?0027
?0026:
; 168. }
; 169. }
; 170. return n;
LD HL,0
ADD HL,SP
LD B,(HL)
INC HL
LD H,(HL)
LD L,B
; 171. }
POP AF
POP AF
POP IX
POP IY
JP LWRD ?BANK_FAST_LEAVE_L08
Count_Byte:
; 172.
; 173. BYTE Count_Byte(char *str,char language) //统计字数 zxs added 2007.03.26
; 174. {
PUSH IX
PUSH BC
PUSH AF
PUSH DE
POP IX
; 175. BYTE n=0;
; 176. BYTE m=0;
LD HL,1
ADD HL,SP
LD (HL),0
DEC HL
LD (HL),0
?0039:
; 177. while(*str!=0)
XOR A
OR (IX+0)
JR Z,?0038
?0040:
; 178. {
; 179. if((*str >= FirstSectionCode)&&(language!=1))
LD A,(IX+0)
CP 161
JR C,?0042
INC HL
INC HL
LD B,(HL)
DEC B
JR Z,?0042
?0044:
?0043:
?0041:
; 180. {
; 181. if(m+16 > DISPLAYWIDTH)break;
DEC HL
DEC HL
LD C,(HL)
LD B,0
LD HL,16
ADD HL,BC
LD C,L
LD B,H
LD HL,128
OR L
SBC HL,BC
JP PO,?0070
XOR H
?0070:
JP M,?0038
?0045:
?0046:
; 182. *str++;
; 183. *str++;
; 184. n++;
LD HL,1
ADD HL,SP
INC (HL)
; 185. m=m+16;
DEC HL
LD A,(HL)
ADD A,16
INC IX
JR ?0073
; 186. }
; 187. else
?0042:
; 188. {
; 189. if(m+8>DISPLAYWIDTH)break;
LD HL,0
ADD HL,SP
LD C,(HL)
LD B,0
LD HL,8
ADD HL,BC
LD C,L
LD B,H
LD HL,128
OR L
SBC HL,BC
JP PO,?0071
XOR H
?0071:
JP M,?0038
?0048:
?0049:
; 190. *str++;
; 191. n++;
LD HL,1
ADD HL,SP
INC (HL)
; 192. m=m+8;
DEC HL
LD A,(HL)
ADD A,8
?0073:
INC IX
LD (HL),A
?0047:
JR ?0039
?0038:
; 193. }
; 194. }
; 195. return n;
LD HL,1
ADD HL,SP
LD L,(HL)
; 196. }
POP AF
POP AF
POP IX
JP LWRD ?BANK_FAST_LEAVE_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 + -