📄 music_list_menu.s01
字号:
NAME music_list_menu(17)
RSEG AP_MUSIC_LIST(0)
RSEG APC_MUSIC_LIST(0)
RSEG APD_MUSIC_LIST(0)
PUBLIC ActiveSeekNum
PUBLIC BLANKSTRING
PUBLIC BlankInfor
EXTERN FS_FClose
EXTERN FS_FRead
EXTERN FS_FSeek
PUBLIC HeadIDDisplay
PUBLIC LastSeekNum
EXTERN PutS
PUBLIC ReadListBuffer
PUBLIC ReadOneSectorData
EXTERN ResShowMultiString
EXTERN ResShowPic
EXTERN ScrollFlag
EXTERN ScrollString
EXTERN SetBackgdColor
EXTERN SetTextOutMode
EXTERN SetTextPos
PUBLIC active_location
EXTERN ap_get_message
EXTERN ap_handle_hotkey
EXTERN g_comval
EXTERN g_file_list_total
EXTERN g_music_vars
EXTERN list_fp
EXTERN menu_pos_list
EXTERN menulist_bck_pic
EXTERN region_scroll
EXTERN scroll_buf
PUBLIC show_active_musiclist
PUBLIC show_music_list
PUBLIC ui_music_list
EXTERN ?CLZ80B_4_04_L00
EXTERN ?US_DIV_L02
EXTERN ?US_MOD_L02
EXTERN ?S_MUL_L02
EXTERN ?C_V_SWITCH_L06
EXTERN ?BANK_CALL_DIRECT_L08
EXTERN ?BANK_LEAVE_DIRECT_L08
EXTERN ?BANK_FAST_LEAVE_L08
EXTERN ?ENT_AUTO_DIRECT_L09
EXTERN ?STRLEN_L11
RSEG AP_MUSIC_LIST
show_active_musiclist:
; 1. /*
; 2. *******************************************************************************
; 3. * ACTOS AP
; 4. * This program demostrates how to build an AP
; 5. *
; 6. * (c) Copyright Actions Co,Ld.
; 7. *
; 8. * $Id: music_list_menu.c,v 1.1.1.1 2007/03/02 16:31:22 mars Exp $
; 9. *******************************************************************************
; 10. */
; 11. #include "ap_music.h"
; 12. #define ListDisplayNum 6 //一屏最多显示的列表数目
; 13. #define OneSectorListNum 7 //每个扇区存储的列表数目
; 14. #define ListPerByte 71 //每个列表项总的字节数
; 15. #define OneLocationBYTE 41 //sizeof(location)
; 16. #define Color_BULE_Scroll_def 0x0000001f//深蓝
; 17. extern handle list_fp;
; 18. extern char ScrollFlag; //滚动标志位
; 19. extern char scroll_buf[]; //滚屏buffer区
; 20. extern region_t region_scroll; //滚屏区域
; 21. extern const char menu_pos_list[];
; 22. extern const WORD menulist_bck_pic[];
; 23.
; 24. #pragma memory=constseg(APC_MUSIC_LIST)
; 25. const char BLANKSTRING[4] = "[]--";
; 26. #pragma memory=dataseg(APD_MUSIC_LIST)
; 27. char ReadListBuffer[512];
; 28. file_location_t active_location; //当前选择列表文件的路径
; 29. char BlankInfor[16];
; 30. unsigned int ActiveSeekNum; //
; 31. unsigned int LastSeekNum;
; 32. WORD HeadIDDisplay; //列表类型显示
; 33. #pragma memory=default
; 34.
; 35.
; 36. #pragma codeseg(AP_MUSIC_LIST)
; 37. void ReadOneSectorData(unsigned int currentlist);
; 38. void show_active_musiclist(unsigned int active_one)
; 39. {
CALL LWRD ?ENT_AUTO_DIRECT_L09
DEFW 65534
; 40. BYTE buf_num = active_one% OneSectorListNum;
LD BC,7
LD E,(IX+2)
LD D,(IX+3)
CALL LWRD ?US_MOD_L02
LD (IX-1),E
; 41. BYTE pos_num = active_one% ListDisplayNum;
DEC BC
LD E,(IX+2)
LD D,(IX+3)
CALL LWRD ?US_MOD_L02
LD (IX-2),E
; 42. if(LastSeekNum!= ActiveSeekNum) //当前选中列表文件数据不在buffer中
LD HL,(ActiveSeekNum)
LD BC,(LastSeekNum)
AND A
SBC HL,BC
JR Z,?0003
?0002:
; 43. ReadOneSectorData(active_one);
LD E,(IX+2)
LD D,(IX+3)
CALL LWRD ?0078
?0003:
; 44. memcpy(&active_location,&ReadListBuffer[buf_num*ListPerByte+30],OneLocationBYTE); //将当前active的路径保存起来
LD BC,41
LD HL,ReadListBuffer+30
LD C,(IX-1)
LD DE,71
CALL LWRD ?S_MUL_L02
ADD HL,DE
LD DE,active_location
LD C,41
LDIR
; 45. ResShowPic(MFILE, explorer_pic_x_def, menu_pos_list[pos_num]-1);
LD C,(IX-2)
LD HL,menu_pos_list
ADD HL,BC
LD A,(HL)
ADD A,255
LD C,A
PUSH BC
CALL LWRD ?0087
POP AF
; 46. ResShowPic(FILEBCK, explorer_str_x_def-2, menu_pos_list[pos_num]-4);
LD C,(IX-2)
LD B,0
LD HL,menu_pos_list
ADD HL,BC
LD A,(HL)
ADD A,252
LD C,A
PUSH BC
LD C,30
LD DE,44
CALL LWRD ?0088
POP AF
; 47. ResShowPic(DHTHK,194,menu_pos_list[pos_num]+6);
LD C,(IX-2)
LD B,0
LD HL,menu_pos_list
ADD HL,BC
LD A,(HL)
ADD A,6
LD C,A
PUSH BC
LD C,194
LD DE,39
CALL LWRD ?0088
POP AF
; 48. if(ReadListBuffer[buf_num*ListPerByte]!=0)
LD C,(IX-1)
CALL LWRD ?0085
JR Z,?0005
?0004:
; 49. {
; 50. memcpy(scroll_buf,&ReadListBuffer[buf_num*ListPerByte],30); //取要滚动的数据到buf
LD DE,71
CALL LWRD ?S_MUL_L02
LD HL,ReadListBuffer
ADD HL,DE
LD DE,scroll_buf
LD C,30
LDIR
; 51. region_scroll.y = menu_pos_list[pos_num]-2; //滚动纵坐标的位置
LD C,(IX-2)
LD HL,menu_pos_list
ADD HL,BC
LD A,(HL)
ADD A,254
LD (region_scroll+1),A
; 52. ScrollString(scroll_buf, TRUE,g_comval.langid,®ion_scroll); //滚动第一屏
LD HL,region_scroll
PUSH HL
LD HL,g_comval+12
LD C,(HL)
PUSH BC
LD C,1
CALL LWRD ?0089
POP HL
POP HL
; 53. if(strlen(scroll_buf)<20)
LD HL,scroll_buf
CALL LWRD ?STRLEN_L11
LD BC,20
AND A
SBC HL,BC
JR NC,?0007
?0006:
; 54. ScrollFlag=0;
XOR A
JR ?0070
; 55. else
?0007:
; 56. ScrollFlag=1;
LD A,1
?0070:
LD (ScrollFlag),A
?0008:
; 57. }
; 58.
; 59. else
JR ?0009
?0005:
; 60. {
; 61. ScrollFlag = 0;
LD (ScrollFlag),A
; 62. memcpy(BlankInfor,BLANKSTRING,4);
LD C,4
LD DE,BlankInfor
LD HL,BLANKSTRING
LDIR
; 63. memcpy(&BlankInfor[4],&ReadListBuffer[buf_num*ListPerByte+56],12); //取短名
LD HL,ReadListBuffer+56
LD C,(IX-1)
CALL LWRD ?0083
; 64. SetTextPos(explorer_str_x_def, menu_pos_list[pos_num]-2);
LD C,(IX-2)
CALL LWRD ?0090
; 65. PutS(BlankInfor,-1);
?0009:
; 66. }
; 67. }
JP LWRD ?BANK_LEAVE_DIRECT_L08
?0081:
DEC BC
?0080:
PUSH IY
POP DE
CALL LWRD ?US_DIV_L02
EX DE,HL
ADD HL,HL
LD C,L
LD B,H
ADD HL,HL
?0079:
ADD HL,BC
EX DE,HL
?0078:
LD A,BYTE3 ReadOneSectorData
LD HL,LWRD ReadOneSectorData
JP LWRD ?BANK_CALL_DIRECT_L08
?0082:
LD E,(IX-2)
LD D,B
LD C,71
CALL LWRD ?S_MUL_L02
LD HL,ReadListBuffer
ADD HL,DE
EX DE,HL
LD A,BYTE3 ScrollString
LD HL,LWRD ScrollString
RET
?0084:
LD C,4
LD DE,BlankInfor
LD HL,BLANKSTRING
LDIR
LD HL,ReadListBuffer+56
LD C,(IX-2)
?0083:
LD DE,71
CALL LWRD ?S_MUL_L02
ADD HL,DE
LD DE,BlankInfor+4
LD C,12
LDIR
RET
?0085:
LD B,0
LD DE,71
?0086:
CALL LWRD ?S_MUL_L02
LD HL,ReadListBuffer
ADD HL,DE
LD A,(HL)
OR A
RET
?0087:
LD C,13
LD DE,198
?0088:
LD A,BYTE3 ResShowPic
LD HL,LWRD ResShowPic
JP LWRD ?BANK_CALL_DIRECT_L08
?0089:
LD DE,scroll_buf
LD A,BYTE3 ScrollString
LD HL,LWRD ScrollString
JP LWRD ?BANK_CALL_DIRECT_L08
?0090:
LD HL,menu_pos_list
ADD HL,BC
LD A,(HL)
ADD A,254
LD C,A
LD E,32
CALL LWRD SetTextPos
LD C,255
LD DE,BlankInfor
CALL LWRD PutS
RET
ui_music_list:
; 68.
; 69. void ui_music_list(unsigned int active,unsigned int old_active,bool scroll_flag)
; 70. {
CALL LWRD ?ENT_AUTO_DIRECT_L09
DEFW 65528
PUSH IY
; 71. BYTE i;
; 72. unsigned int top_list,bottom_list;
; 73. BYTE last_list,buf_num;
; 74. region_scroll.x=30;
LD A,30
LD (region_scroll),A
; 75. region_scroll.width=162;
LD A,162
LD (region_scroll+2),A
; 76. region_scroll.height=16;
LD A,16
LD (region_scroll+3),A
; 77. SetTextOutMode(1);
LD E,1
CALL LWRD SetTextOutMode
; 78. if(scroll_flag)
XOR A
OR (IX+10)
JR Z,?0011
?0010:
; 79. {
; 80. SetTextOutMode(0);
LD E,0
CALL LWRD SetTextOutMode
; 81. SetBackgdColor(Color_BULE_Scroll_def);
LD BC,0
LD DE,31
CALL LWRD SetBackgdColor
; 82. ScrollString(scroll_buf, FALSE,g_comval.langid,®ion_scroll);
LD HL,region_scroll
PUSH HL
LD HL,g_comval+12
LD C,(HL)
PUSH BC
LD C,0
CALL LWRD ?0089
POP HL
POP HL
; 83. SetTextOutMode(1);
LD E,1
CALL LWRD SetTextOutMode
; 84. }
; 85. else
JP LWRD ?0018
?0011:
; 86. {
; 87. ActiveSeekNum = active/OneSectorListNum; //当前选中列表文件所在的扇区
CALL LWRD ?0092
LD (ActiveSeekNum),DE
; 88. if(old_active!=active)
LD L,(IX+2)
LD H,(IX+3)
LD C,(IX+4)
LD B,(IX+5)
SBC HL,BC
LD BC,6
JP Z,?0014
?0013:
; 89. {
; 90. //清除旧的活动列表项
; 91. BYTE pos_num = old_active%ListDisplayNum;
LD E,(IX+4)
LD D,(IX+5)
CALL LWRD ?US_MOD_L02
LD (IX-1),E
; 92. ResShowPic(menulist_bck_pic[pos_num],menu_bck_x_def,menu_pos_list[pos_num]-4); //分段刷新背景
LD D,B
LD HL,menu_pos_list
ADD HL,DE
LD A,(HL)
ADD A,252
LD C,A
PUSH BC
LD C,9
LD L,E
LD H,B
ADD HL,HL
LD DE,menulist_bck_pic
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
CALL LWRD ?0088
POP AF
; 93. ResShowPic(MFILE, explorer_pic_x_def, menu_pos_list[pos_num]-1);
LD C,(IX-1)
LD B,0
LD HL,menu_pos_list
ADD HL,BC
LD A,(HL)
ADD A,255
LD C,A
PUSH BC
CALL LWRD ?0087
POP AF
; 94. ResShowPic(DHT,194,8);
LD C,8
PUSH BC
LD C,194
LD DE,38
CALL LWRD ?0088
POP AF
; 95. SetTextPos(explorer_str_x_def, menu_pos_list[pos_num]-2);
LD C,(IX-1)
LD B,0
LD HL,menu_pos_list
ADD HL,BC
LD A,(HL)
ADD A,254
LD C,A
LD E,32
CALL LWRD SetTextPos
; 96. buf_num = old_active%OneSectorListNum; //
LD BC,7
LD E,(IX+4)
LD D,(IX+5)
CALL LWRD ?US_MOD_L02
LD (IX-2),E
; 97. if(ReadListBuffer[buf_num*ListPerByte]!=0)
LD D,B
LD C,71
CALL LWRD ?0086
JR Z,?0016
?0015:
; 98. {
; 99. region_scroll.y = menu_pos_list[pos_num]-2;
LD C,(IX-1)
LD HL,menu_pos_list
ADD HL,BC
LD A,(HL)
ADD A,254
LD (region_scroll+1),A
; 100. ScrollString(&ReadListBuffer[buf_num*ListPerByte],TRUE,g_comval.langid,®ion_scroll);
LD HL,region_scroll
PUSH HL
LD HL,g_comval+12
LD C,(HL)
PUSH BC
LD C,1
PUSH BC
CALL LWRD ?0082
POP BC
CALL LWRD ?BANK_CALL_DIRECT_L08
POP HL
POP HL
; 101. }
; 102. else
JR ?0017
?0016:
; 103. {
; 104. memcpy(BlankInfor,BLANKSTRING,4);
; 105. memcpy(&BlankInfor[4],&ReadListBuffer[buf_num*ListPerByte+56],12); //取短名
CALL LWRD ?0084
; 106. PutS(BlankInfor,-1);
LD C,255
LD DE,BlankInfor
CALL LWRD PutS
?0017:
; 107. }
; 108. //显示当前活动项
; 109. LastSeekNum = old_active/OneSectorListNum; //旧的活动列表文件所在的扇区
LD BC,7
LD E,(IX+4)
LD D,(IX+5)
CALL LWRD ?US_DIV_L02
LD (LastSeekNum),DE
; 110. show_active_musiclist(active);
JP LWRD ?0022
; 111. }
; 112. else
?0014:
; 113. {
; 114. top_list = (active/ListDisplayNum)*ListDisplayNum;
LD E,(IX+2)
LD D,(IX+3)
CALL LWRD ?0091
PUSH HL
POP IY
; 115. if(top_list+ListDisplayNum > g_file_list_total)
LD BC,6
ADD HL,BC
LD C,L
LD B,H
LD HL,(g_file_list_total)
AND A
SBC HL,BC
JR NC,?0020
?0019:
; 116. bottom_list = g_file_list_total-1;
LD HL,65535
LD BC,(g_file_list_total)
JR ?0072
; 117. else
?0020:
; 118. bottom_list = top_list + ListDisplayNum-1 ; //尾项
LD HL,5
PUSH IY
POP BC
?0072:
ADD HL,BC
?0021:
; 119. last_list = bottom_list%ListDisplayNum;
LD BC,6
LD E,L
LD D,H
CALL LWRD ?US_MOD_L02
LD (IX-3),E
; 120. LastSeekNum = bottom_list/OneSectorListNum; //最后一项列表文件所在的扇区
INC BC
LD E,L
LD D,H
CALL LWRD ?US_DIV_L02
LD (LastSeekNum),DE
; 121. ResShowPic(MENUTWO,0,0); //显示背景画面
LD C,B
PUSH BC
LD DE,195
CALL LWRD ?0088
POP AF
; 122. ResShowMultiString(HeadIDDisplay, g_comval.langid,list_str_x_def, list_str_y_def); //显示列表名
LD C,148
PUSH BC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -