?? ui_menu.s01
字號:
NAME ui_menu(17)
RSEG COM_CTRL(0)
RSEG CONST(0)
EXTERN ClearScreen
EXTERN ResShowMultiString
EXTERN ResShowPic
EXTERN UpdateScreen
EXTERN ap_get_message
EXTERN ap_handle_hotkey
PUBLIC menu_pos
EXTERN ui_auto_select
EXTERN ui_auto_update
PUBLIC ui_function_menu
EXTERN ?CLZ80B_4_04_L00
EXTERN ?SS_DIV_L02
EXTERN ?SS_MOD_L02
EXTERN ?C_V_SWITCH_L06
EXTERN ?BANK_CALL_DIRECT_L08
EXTERN ?BANK_FAST_LEAVE_L08
RSEG COM_CTRL
ui_function_menu:
; 1. /*
; 2. *******************************************************************************
; 3. * ACTOS AP
; 4. * ap common lib, menu ui file
; 5. *
; 6. * (c) Copyright, Actions Co,Ld.
; 7. * All Right Reserved
; 8. *
; 9. *******************************************************************************
; 10. */
; 11. #pragma codeseg(COM_CTRL)
; 12.
; 13. #include "ap_common.h"
; 14.
; 15. /*注意-以下函數必須能訪問到這些常量 */
; 16. const char menu_pos[5] = {POSITION_MENU1, POSITION_MENU2, POSITION_MENU3,
; 17. POSITION_MENU4, POSITION_MENU5};
; 18.
; 19. /*
; 20. ********************************************************************************
; 21. * Description : 功能菜單控件
; 22. *
; 23. * Arguments : menu, 功能菜單結體
; 24. callback, 功能菜單的回調函數,=NULL 表示沒有回調函數
; 25. *
; 26. * Returns : 結果消息, 或者0
; 27. *
; 28. * Notes :
; 29. *
; 30. ********************************************************************************
; 31. */
; 32. int ui_function_menu(function_menu_t *menu, const void (*callback)(int res_id))
; 33. {
PUSH BC
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
LD HL,65524
ADD HL,SP
LD SP,HL
PUSH DE
POP IY
; 34. int i;
; 35. char key;
; 36. BOOL need_draw=TRUE;
; 37. BOOL value_changed=TRUE;
; 38. int max_group; // menu->total / 5
; 39. int cur_group; //menu->active / 5
; 40. int n; //the item to show
; 41.
; 42. ASSERT(menu->active < menu->total);
; 43. ASSERT(menu->pic_active != NULL);
; 44. ASSERT(menu->pic_inactive != NULL);
; 45. ASSERT(menu->string != NULL);
; 46. ASSERT(menu->string_id < 3);
; 47.
; 48. //total pages
; 49. max_group = menu->total / 5;
EX DE,HL
LD E,(HL)
INC HL
LD D,(HL)
LD BC,5
CALL LWRD ?SS_DIV_L02
LD (IX-6),E
LD (IX-5),D
; 50. if((menu->total % 5) == 0) max_group--;
LD (IX-11),1
LD (IX-2),1
LD E,(IY+0)
LD D,(IY+1)
CALL LWRD ?SS_MOD_L02
LD A,E
OR D
JR NZ,?0003
?0002:
LD L,(IX-6)
LD H,(IX-5)
DEC HL
LD (IX-6),L
LD (IX-5),H
?0003:
?0005:
; 51.
; 52. while(1)
; 53. {
; 54. if(need_draw)
XOR A
OR (IX-11)
JP Z,?0023
?0007:
; 55. {
; 56. //clear screen
; 57. ClearScreen(NULL);
LD DE,0
CALL LWRD ClearScreen
; 58.
; 59. #if 1
; 60. //what page?
; 61. cur_group = menu->active / 5;
LD E,(IY+2)
LD D,(IY+3)
LD BC,5
CALL LWRD ?SS_DIV_L02
LD (IX-8),E
LD (IX-7),D
; 62. n = cur_group*5;
EX DE,HL
LD C,L
LD B,H
ADD HL,HL
ADD HL,HL
ADD HL,BC
LD (IX-4),L
LD (IX-3),H
; 63.
; 64. //show icons & text
; 65. for(i=0; i<5; i++)
XOR A
LD (IX-10),A
LD (IX-9),A
?0010:
LD BC,32773
LD L,(IX-10)
LD H,(IX-9)
LD A,B
XOR H
LD H,A
SBC HL,BC
JR NC,?0009
?0011:
; 66. {
; 67. if(n+i >= menu->total) break; //處理不足5個的情況
LD C,(IY+0)
LD B,(IY+1)
LD L,(IX-10)
LD H,(IX-9)
LD E,(IX-4)
LD D,(IX-3)
ADD HL,DE
OR 128
SBC HL,BC
JP PO,?0051
XOR H
?0051:
JP P,?0009
?0013:
?0014:
; 68. ResShowPic(menu->pic_inactive[n+i], menu_pos[i], 0);
LD C,0
PUSH BC
LD HL,menu_pos
LD C,(IX-10)
LD B,(IX-9)
ADD HL,BC
LD C,(HL)
LD L,(IY+4)
LD H,(IY+5)
PUSH HL
LD L,(IX-10)
LD H,B
ADD HL,DE
ADD HL,HL
EX DE,HL
POP HL
CALL LWRD ?0064
POP AF
INC (IX-10)
JR NZ,?0010
INC (IX-9)
JR ?0010
?0009:
; 69. }
; 70. //show active, 2 pixels left
; 71. ResShowPic(menu->pic_active[menu->active], menu_pos[menu->active % 5]-2, 0);
LD C,0
PUSH BC
LD E,(IY+2)
LD D,(IY+3)
LD BC,5
CALL LWRD ?SS_MOD_L02
LD HL,menu_pos
ADD HL,DE
LD A,(HL)
ADD A,254
LD C,A
LD L,(IY+2)
LD H,(IY+3)
ADD HL,HL
LD E,(IY+6)
LD D,(IY+7)
CALL LWRD ?0064
POP AF
; 72.
; 73. //check if show left arrows
; 74. if(cur_group > 0) ResShowPic(CARROWL, POSITION_MENUL, 0);
LD C,(IX-8)
LD B,(IX-7)
LD HL,0
OR 128
SBC HL,BC
JP PO,?0053
XOR H
?0053:
LD C,0
PUSH BC
LD C,2
JP P,?0016
?0015:
LD DE,52
JR ?0058
?0016:
; 75. else ResShowPic(CARROWN, POSITION_MENUL, 0);
LD DE,53
?0058:
CALL LWRD ?0065
POP AF
?0017:
; 76.
; 77. //check if show right arrows
; 78. if(cur_group < max_group) ResShowPic(CARROWR, POSITION_MENUR, 0);
LD C,(IX-6)
LD B,(IX-5)
LD L,(IX-8)
LD H,(IX-7)
OR 128
SBC HL,BC
JP PO,?0054
XOR H
?0054:
LD C,0
PUSH BC
LD C,115
JP P,?0019
?0018:
LD DE,54
JR ?0059
?0019:
; 79. else ResShowPic(CARROWN, POSITION_MENUR, 0);
LD DE,53
?0059:
CALL LWRD ?0065
POP AF
?0020:
; 80.
; 81. #else
; 82. //show icons & text
; 83. if(menu->total <= 5) /* iiiii*/
; 84. {
; 85. //show icon
; 86. for(i=0; i<menu->total; i++)
; 87. {
; 88. ResShowPic(menu->pic_inactive[i], menu_pos[i], 0);
; 89. }
; 90. //show active, 2 frame movie effect!!
; 91. ResShowPic(menu->pic_active[menu->active], menu_pos[menu->active]-2, 0);
; 92.
; 93. }
; 94. else //>5, to show arrow
; 95. {
; 96. //active item on middle
; 97. if(menu->active < 5) /* iiaii >*/
; 98. {
; 99. //show icon
; 100. for(i=0; i<5; i++)
; 101. {
; 102. ResShowPic(menu->pic_inactive[i], menu_pos[i], 0);
; 103. }
; 104. //show active, 2 frame movie effect!!
; 105. ResShowPic(menu->pic_active[menu->active], menu_pos[menu->active]-2, 0);
; 106. //show right arrow
; 107. ResShowPic(CARROWR, POSITION_MENUR, 0);
; 108. //clear left arrow
; 109. ResShowPic(CARROWN, POSITION_MENUL, 0);
; 110. } /* iiaii >*/
; 111. //active item on right
; 112. else /* < iiiia >*/
; 113. {
; 114. for(i=menu->active-4; i<= menu->active; i++)
; 115. {
; 116. ResShowPic(menu->pic_inactive[i], menu_pos[i-(menu->active-4)], 0);
; 117. }
; 118.
; 119. //show active, 2 frame movie effect!!
; 120. ResShowPic(menu->pic_active[menu->active], menu_pos[4]-2, 0);
; 121.
; 122. //show arrow
; 123. if(menu->active == menu->total-1)
; 124. {
; 125. //clear right arrow
; 126. ResShowPic(CARROWN, POSITION_MENUR, 0);
; 127. }
; 128. else
; 129. {
; 130. //show right arrow
; 131. ResShowPic(CARROWR, POSITION_MENUR, 0);
; 132. }
; 133. //show left arrow
; 134. ResShowPic(CARROWL, POSITION_MENUL, 0);
; 135. } /* < iiiia >*/
; 136. }// >5
; 137. #endif
; 138. //show text in middle of screen
; 139. ResShowMultiString(menu->string[menu->active], menu->string_id, 255, 16);
LD C,16
PUSH BC
LD C,255
PUSH BC
LD C,(IY+10)
LD L,(IY+2)
LD H,(IY+3)
ADD HL,HL
LD E,(IY+8)
LD D,(IY+9)
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
LD A,BYTE3 ResShowMultiString
LD HL,LWRD ResShowMultiString
CALL LWRD ?BANK_CALL_DIRECT_L08
POP AF
POP AF
; 140.
; 141. //check auto_update
; 142. if(!ui_auto_update) UpdateScreen(NULL);
LD A,(ui_auto_update)
OR A
JR NZ,?0022
?0021:
LD E,A
LD D,A
CALL LWRD UpdateScreen
?0022:
; 143.
; 144. need_draw = FALSE;
LD (IX-11),0
?0024:
; 145. while (ap_get_message() != 0);
CALL LWRD ap_get_message
OR A
JR NZ,?0024
?0025:
; 146. }//need draw
?0023:
?0008:
; 147.
; 148. //handle message
; 149. key = ap_get_message();
CALL LWRD ap_get_message
; 150. switch( key)
LD E,A
CALL LWRD ?C_V_SWITCH_L06
DEFW 7
DEFB 5
DEFB 6
DEFB 30
DEFB 33
DEFB 39
DEFB 69
DEFB 70
DEFW ?0040
DEFW ?0027
DEFW ?0031
DEFW ?0036
DEFW ?0060
DEFW ?0037
DEFW ?0027
DEFW ?0031
?0027:
; 151. {
; 152. case AP_KEY_NEXT:
; 153. case AP_KEY_NEXT | AP_KEY_HOLD:
; 154. if(menu->active < menu->total-1)
LD C,(IY+0)
LD B,(IY+1)
DEC BC
LD L,(IY+2)
LD H,(IY+3)
OR 128
SBC HL,BC
JP PO,?0055
XOR H
?0055:
JP P,?0029
?0028:
; 155. {
; 156. menu->active++;
INC (IY+2)
JR NZ,?0034
INC (IY+3)
; 157. }
; 158. else
JR ?0034
?0029:
; 159. {
; 160. menu->active = 0;
XOR A
LD (IY+2),A
LD (IY+3),A
?0030:
; 161. }
; 162. value_changed = TRUE;
; 163. need_draw = TRUE;
JR ?0034
; 164. break;
?0031:
; 165. case AP_KEY_PREV:
; 166. case AP_KEY_PREV | AP_KEY_HOLD:
; 167. if(menu->active > 0)
LD C,(IY+2)
LD B,(IY+3)
LD HL,0
OR 128
SBC HL,BC
JP PO,?0057
XOR H
?0057:
JP P,?0033
?0032:
; 168. {
; 169. menu->active--;
LD L,(IY+2)
LD H,(IY+3)
JR ?0063
; 170.
; 171. }
; 172. else
?0033:
; 173. {
; 174. menu->active = menu->total-1;
LD L,(IY+0)
LD H,(IY+1)
?0063:
DEC HL
LD (IY+2),L
LD (IY+3),H
?0034:
; 175. }
; 176. value_changed = TRUE;
; 177. need_draw = TRUE;
LD (IX-2),1
JR ?0062
; 178. break;
?0035:
; 179. case AP_KEY_PLAY | AP_KEY_UP: //取消退出
; 180. return RESULT_IGNORE;
; 181.
; 182. case AP_KEY_MODE | AP_KEY_UP: //確認退出
?0036:
; 183. return 0;
LD HL,0
; 184. //break;
; 185. case AP_MSG_WAIT_TIMEOUT:
JR ?0050
?0037:
; 186. //if(ui_auto_select) return 0;
; 187.
; 188. //this is recommoned by johnlee, 2004/03/02
; 189. if(ui_auto_select) return RESULT_IGNORE;
LD A,(ui_auto_select)
OR A
JR Z,?0045
?0038:
?0060:
LD HL,48
; 190.
; 191. break;
JR ?0050
?0039:
?0040:
; 192. default:
; 193. key = ap_handle_hotkey(key);
CALL LWRD ap_handle_hotkey
LD (IX-12),A
; 194. if(key == RESULT_REDRAW) need_draw = TRUE;
CP 46
JR NZ,?0042
?0041:
?0062:
LD (IX-11),1
JR ?0045
?0042:
; 195. else if(key != 0) return key;
XOR A
OR (IX-12)
JR Z,?0045
?0044:
LD L,A
LD H,0
; 196. }
?0050:
LD SP,IX
POP IX
POP IY
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
?0045:
?0043:
?0026:
; 197. ASSERT( menu->active < menu->total);
; 198.
; 199. //handle callback
; 200. if(callback != NULL && value_changed)
LD A,(IX+10)
OR (IX+11)
OR (IX+12)
JP Z,?0003
XOR A
OR (IX-2)
JP Z,?0003
?0049:
?0048:
?0046:
; 201. {
; 202. callback(menu->active);
LD E,(IY+2)
LD D,(IY+3)
LD A,(IX+12)
LD L,(IX+10)
LD H,(IX+11)
CALL LWRD ?BANK_CALL_DIRECT_L08
; 203. value_changed = FALSE;
LD (IX-2),0
?0047:
; 204. }
; 205.
; 206. }//while (1)
; 207. //return 0;
; 208.
; 209. }
JP LWRD ?0003
?0064:
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
?0065:
LD A,BYTE3 ResShowPic
LD HL,LWRD ResShowPic
JP LWRD ?BANK_CALL_DIRECT_L08
; 210.
RSEG CONST
menu_pos:
DEFB 19
DEFB '&'
DEFB '9'
DEFB 'L'
DEFB '_'
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -