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