ui_scroll.s01
来自「MP3 整个 SDK」· S01 代码 · 共 475 行
S01
475 行
NAME ui_scroll(17)
RSEG COM_SCROLL(0)
RSEG UDATA0(0)
EXTERN CharOutRect
PUBLIC Count
EXTERN GetTextPos
PUBLIC HoriScroll
EXTERN PutS
EXTERN RegionCopy
PUBLIC Scroll
PUBLIC ScrollInit
EXTERN SetTextPos
PUBLIC scroll_cnt
PUBLIC str_pt
PUBLIC 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_SCROLL
Scroll:
; 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/05/22 03:23:59 selina Exp $
; 9. *******************************************************************************
; 10. */
; 11. /*
; 12. 这个函数的作用是在汇编程序外包一层 C ,这样汇编在C中用BANK方式CALL
; 13. */
; 14. #pragma codeseg(COM_SCROLL)
; 15. #include "actos.h"
; 16. //#include "ap_music.h"
; 17. #include "ap_common.h"
; 18.
; 19. char *str_pt;//字符串当前指针
; 20. char *strhead_pt;//字串首址记录
; 21. BYTE scroll_cnt;
; 22.
; 23.
; 24. void ScrollInit(char *str,char language);
; 25. void HoriScroll(signed char step,char language);
; 26. int Count(char *str,char language);
; 27.
; 28. /* (字符串首址,是否初始化true为要初始化) */
; 29. void Scroll( char * scrollstr, bool mode ,char language)
; 30. {
CALL LWRD ?ENT_PARM_DIRECT_L09
; 31. if (mode)
INC C
DEC C
LD C,(IX+10)
JR Z,?0003
?0002:
; 32. {
; 33. //初始化滚屏(第一次调用时先显示一串字符)
; 34. ScrollInit(scrollstr,language);
LD A,BYTE3 ScrollInit
LD HL,LWRD ScrollInit
CALL LWRD ?BANK_CALL_DIRECT_L08
; 35. return;
; 36. }
JR ?0004
?0003:
; 37. HoriScroll(1,language);
LD E,1
LD A,BYTE3 HoriScroll
LD HL,LWRD HoriScroll
CALL LWRD ?BANK_CALL_DIRECT_L08
; 38. }
?0004:
JP LWRD ?BANK_LEAVE_DIRECT_L08
ScrollInit:
; 39.
; 40.
; 41. void ScrollInit(char *str,char language)
; 42. {
CALL LWRD ?ENT_AUTO_DIRECT_L09
DEFW -8
PUSH IY
; 43. int code;
; 44. int count;
; 45. bool result;
; 46. region_t kregion;//余下部分区域
; 47. scroll_cnt = 0;
XOR A
LD (scroll_cnt),A
; 48.
; 49. SetTextPos(scrollregionx_def, scrollregiony_def);
LD C,110
LD E,45
CALL LWRD SetTextPos
; 50. strhead_pt = str_pt = str;
LD L,(IX+2)
LD H,(IX+3)
LD (str_pt),HL
LD (strhead_pt),HL
; 51. //tmpstr = str;
; 52. count=Count(str_pt,language);
LD C,(IX+4)
EX DE,HL
LD A,BYTE3 Count
LD HL,LWRD Count
CALL LWRD ?BANK_CALL_DIRECT_L08
; 53. //if(count > 9) count = 9;
; 54. str_pt = PutS(str_pt, count);
LD C,L
LD DE,(str_pt)
CALL LWRD PutS
LD (str_pt),HL
; 55.
; 56. if(*str_pt!=0)
XOR A
OR (HL)
JR Z,?0006
?0005:
; 57. {
; 58. 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
; 59.
; 60. kregion.width = scrollregionw_def+scrollregionx_def - kregion.x;
LD A,185
SUB (IX-8)
LD (IX-6),A
; 61. kregion.height = scrollregionh_def;
LD (IX-5),16
; 62. //汉字和ASCII的不同处理
; 63. 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:
; 64. {//汉字
; 65. code = *(int *)str_pt;
LD B,(HL)
INC HL
LD H,(HL)
LD L,B
PUSH HL
POP IY
; 66. }
; 67. else
JR ?0011
?0008:
; 68. {//ASCII
; 69. code = *str_pt;
LD C,(HL)
LD B,0
PUSH BC
POP IY
?0011:
; 70. }
; 71.
; 72. //输出最后一个字
; 73. result = CharOutRect(code, &kregion, scroll_cnt);
LD A,(scroll_cnt)
LD C,A
PUSH BC
LD HL,4
ADD HL,SP
LD C,L
LD B,H
PUSH IY
POP DE
CALL LWRD CharOutRect
POP HL
; 74. result = CharOutRect(code, &kregion, scroll_cnt);
LD A,(scroll_cnt)
LD C,A
PUSH BC
LD HL,4
ADD HL,SP
LD C,L
LD B,H
PUSH IY
POP DE
CALL LWRD CharOutRect
POP HL
; 75. if (!result)
OR A
JR Z,?0014
?0012:
; 76. {
; 77. return;
; 78. }
?0013:
; 79. //scroll_cnt = kregion.width-1;
; 80. scroll_cnt = kregion.width;
LD A,(IX-6)
LD (scroll_cnt),A
; 81. }
; 82. else
JR ?0014
?0006:
; 83. {
; 84. str_pt = strhead_pt;
LD HL,(strhead_pt)
LD (str_pt),HL
; 85. return;
; 86. }
?0014:
; 87. }
?0015:
POP IY
JP LWRD ?BANK_LEAVE_DIRECT_L08
HoriScroll:
; 88.
; 89. //==========================================================
; 90. /*
; 91. 滚动屏幕
; 92. */
; 93. void HoriScroll(signed char step,char language)
; 94. {
CALL LWRD ?ENT_AUTO_DIRECT_L09
DEFW -14
PUSH IY
; 95. int code;
; 96. char *tmpstrpt;
; 97. region_t tregion;
; 98. region_t sregion;
; 99. region_t kregion;//余下部分区域
; 100.
; 101. tmpstrpt = str_pt;
LD IY,(str_pt)
; 102.
; 103. //余下部分区域
; 104. // kregion.x = scrollregionx_def+scrollregionw_def-step;
; 105. kregion.x = scrollregionx_def+scrollregionw_def-step;
LD A,185
SUB (IX+2)
LD (IX-14),A
; 106. kregion.y = scrollregiony_def;
LD (IX-13),110
; 107. kregion.width = step;
LD B,(IX+2)
LD (IX-12),B
; 108. kregion.height = scrollregionh_def;
LD (IX-11),16
; 109.
; 110. //设定移动的源,目标区域
; 111. sregion.x = scrollregionx_def+step;//暂时未考虑为负数的情况
LD A,B
ADD A,45
LD (IX-10),A
; 112. tregion.x = scrollregionx_def;
LD (IX-6),45
; 113. tregion.y = sregion.y = scrollregiony_def;
LD (IX-9),110
LD (IX-5),110
; 114. sregion.width = scrollregionw_def-step;
LD A,140
SUB B
LD (IX-8),A
; 115. sregion.height = scrollregionh_def;
LD (IX-7),16
; 116.
; 117. //向左移step列
; 118. 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:
; 119.
; 120.
; 121.
; 122. test:
; 123. if (*str_pt == '\0')
LD HL,(str_pt)
XOR A
OR (HL)
JR NZ,?0018
?0017:
; 124. {
; 125. tmpstrpt = str_pt = strhead_pt;
LD HL,(strhead_pt)
LD (str_pt),HL
LD IY,(strhead_pt)
?0018:
; 126. }
; 127.
; 128. //汉字和ASCII的不同处理
; 129. 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:
; 130. {//汉字
; 131. code = *(int *)str_pt;
LD B,(HL)
LD (IX-2),B
INC HL
LD H,(HL)
LD (IX-1),H
; 132. tmpstrpt++;
; 133. }
; 134. else
INC IY
JR ?0023
?0020:
; 135. {//ASCII
; 136. code = *str_pt;
LD C,(HL)
LD (IX-2),C
LD B,0
LD (IX-1),B
?0023:
; 137. }
; 138. tmpstrpt++;
; 139.
; 140. if (!CharOutRect(code, &kregion, scroll_cnt))
LD A,(scroll_cnt)
LD C,A
PUSH BC
LD HL,4
ADD HL,SP
LD C,L
LD B,H
LD E,(IX-2)
LD D,(IX-1)
CALL LWRD CharOutRect
POP HL
OR A
INC IY
JR NZ,?0025
?0024:
; 141. {
; 142. //strhead_pt = str_pt;
; 143. str_pt = tmpstrpt;
LD (str_pt),IY
; 144. scroll_cnt = 0;
LD (scroll_cnt),A
; 145. goto test;
JR ?0016
?0025:
; 146. }
; 147. scroll_cnt += step;//未支持负数
LD A,(scroll_cnt)
ADD A,(IX+2)
LD (scroll_cnt),A
; 148.
; 149. }
POP IY
JP LWRD ?BANK_LEAVE_DIRECT_L08
Count:
; 150.
; 151. int Count(char *str,char language) //统计字数
; 152. {
CALL LWRD ?ENT_AUTO_DIRECT_L09
DEFW 0
PUSH IY
; 153. int n=0;
; 154. int m=0;
LD DE,0
LD IY,0
?0027:
; 155. while(*str!=0)
LD L,(IX+2)
LD H,(IX+3)
XOR A
OR (HL)
JR Z,?0026
?0028:
; 156. {
; 157. 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:
; 158. {
; 159. if(m+16>scrollregionw_def)break;
LD HL,16
CALL LWRD ?0045
JR C,?0026
?0033:
?0034:
; 160. *str++;
INC (IX+2)
JR NZ,?0038
INC (IX+3)
?0038:
; 161. *str++;
INC (IX+2)
JR NZ,?0039
INC (IX+3)
?0039:
; 162. n++;
INC DE
; 163. m=m+16;
LD BC,16
JR ?0041
; 164. }
; 165. else
?0030:
; 166. {
; 167. if(m+8>scrollregionw_def)break;
LD HL,8
CALL LWRD ?0045
JR C,?0026
?0036:
?0037:
; 168. *str++;
INC (IX+2)
JR NZ,?0040
INC (IX+3)
?0040:
; 169. n++;
INC DE
; 170. m=m+8;
LD BC,8
?0041:
ADD IY,BC
?0035:
JR ?0027
?0026:
; 171. }
; 172. }
; 173. return n;
EX DE,HL
; 174. }
POP IY
JP LWRD ?BANK_LEAVE_DIRECT_L08
?0045:
PUSH IY
POP BC
ADD HL,BC
LD C,L
LD B,H
LD HL,140
JP LWRD ?SS_CMP_L02
; 175.
RSEG UDATA0
str_pt:
DEFS 2
strhead_pt:
DEFS 2
scroll_cnt:
DEFS 1
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?