📄 ui_slider.s01
字号:
NAME ui_slider(17)
RSEG COM_CTRL(0)
RSEG CONST(0)
EXTERN ClearScreen
EXTERN PutS
EXTERN PutSDImage
EXTERN SD_FRead
EXTERN SD_FSeek
EXTERN SetTextPos
EXTERN UpdateScreen
EXTERN ap_get_message
EXTERN ap_handle_hotkey
EXTERN get_text_width
EXTERN itoa_1
EXTERN itoa_2
EXTERN itoa_3
EXTERN itoa_4
EXTERN res_entry
EXTERN res_fp
EXTERN res_region
PUBLIC slider_ResShowPic
EXTERN ui_auto_select
EXTERN ui_auto_update
PUBLIC ui_slider
EXTERN ?CLZ80B_4_04_L00
EXTERN ?SS_DIV_L02
EXTERN ?S_MUL_L02
EXTERN ?L_LSH_L03
EXTERN ?C_V_SWITCH_L06
EXTERN ?BANK_CALL_DIRECT_L08
EXTERN ?BANK_FAST_LEAVE_L08
RSEG COM_CTRL
slider_ResShowPic:
; 1. /*
; 2. *******************************************************************************
; 3. * ACTOS AP
; 4. * ap common lib, slider control 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. //为了不用bank切换而使用 ResShowPic()
; 16. extern res_entry_t res_entry;
; 17. extern region_t res_region;
; 18.
; 19. //只有这个界面使用
; 20. int slider_ResShowPic(WORD id, uchar x, uchar y)
; 21. {
PUSH BC
PUSH DE
PUSH AF
PUSH AF
; 22. WORD buf[2]; //buffer for sd read
; 23.
; 24. ASSERT(id <= UIID_MAX);
; 25.
; 26. //读entry
; 27. SD_FSeek(res_fp, SEEK_SET, (long)id * sizeof(res_entry_t));
LD L,E
LD H,D
LD BC,0
LD A,4
CALL LWRD ?L_LSH_L03
PUSH BC
PUSH HL
LD C,0
LD DE,(res_fp)
CALL LWRD SD_FSeek
POP HL
POP HL
; 28. SD_FRead(res_fp, &res_entry, sizeof(res_entry_t));
LD HL,16
PUSH HL
LD BC,res_entry
LD DE,(res_fp)
CALL LWRD SD_FRead
POP AF
; 29. if(res_entry.type != RES_TYPE_PIC) return 0;
LD A,(res_entry+6)
DEC A
JR Z,?0003
?0002:
LD HL,0
; 30. ASSERT(res_entry.length <= 512);
JR ?0006
?0003:
; 31.
; 32. //读数据
; 33. SD_FSeek(res_fp, SEEK_SET, res_entry.offset);
LD HL,(res_entry+2)
PUSH HL
LD HL,(res_entry)
PUSH HL
LD C,A
LD DE,(res_fp)
CALL LWRD SD_FSeek
POP HL
POP HL
; 34. //SD_FRead(res_fp, &(res_region.width), 2);
; 35. //SD_FRead(res_fp, &(res_region.height), 2);
; 36. SD_FRead(res_fp, buf, sizeof(buf));
LD HL,4
PUSH HL
DEC HL
DEC HL
ADD HL,SP
LD C,L
LD B,H
LD DE,(res_fp)
CALL LWRD SD_FRead
POP AF
; 37. //ASSERT(buf[0] <= 128);
; 38. //ASSERT(buf[1] <= 32);
; 39. res_region.width = (char)buf[0];
LD HL,0
ADD HL,SP
LD A,(HL)
LD (res_region+2),A
; 40. res_region.height = (char)buf[1];
INC HL
INC HL
LD A,(HL)
LD (res_region+3),A
; 41.
; 42. //显示
; 43. res_region.x = x;
LD HL,6
ADD HL,SP
LD A,(HL)
LD (res_region),A
; 44. res_region.y = y;
LD HL,12
ADD HL,SP
LD A,(HL)
LD (res_region+1),A
; 45. PutSDImage(&res_region, res_fp->rwpointer);
LD HL,20
LD BC,(res_fp)
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD E,(HL)
INC HL
LD D,(HL)
PUSH DE
PUSH BC
LD DE,res_region
CALL LWRD PutSDImage
POP HL
POP HL
; 46. if(ui_auto_update) UpdateScreen(&res_region);
LD A,(ui_auto_update)
OR A
JR Z,?0005
?0004:
LD DE,res_region
CALL LWRD UpdateScreen
?0005:
; 47. return 1;
LD HL,1
; 48. }
?0006:
POP AF
POP AF
POP AF
POP AF
JP LWRD ?BANK_FAST_LEAVE_L08
ui_slider:
; 49.
; 50. /*
; 51. ********************************************************************************
; 52. * Description : 滑动杆控件
; 53. *
; 54. * Arguments : slider, 滑动杆结构
; 55. callback, 滑动杆的回调函数,=NULL 表示没有回调函数
; 56. *
; 57. * Returns : 结果消息, 或者0
; 58. *
; 59. * Notes : 控件本身没有重画功能, 因为控件不能重画背景
; 60. *
; 61. ********************************************************************************
; 62. */
; 63. int ui_slider(slider_t *slider, const void (*callback)(int res_id))
; 64. {
PUSH BC
PUSH IY
PUSH IX
LD IX,0
ADD IX,SP
LD HL,65506
ADD HL,SP
LD SP,HL
PUSH DE
POP IY
; 65. int start, end; //x坐标
; 66. char buf[10]; //注意可能含符号 <<-0000>>
; 67. char *p; //格式化buf时使用
; 68. char key;
; 69. BOOL need_draw=TRUE;
; 70. BOOL value_changed=TRUE; //值是否改变, 需要callback
; 71. const region_t bar_region={0, 16, SCR_WIDTH, 16}; //控件所在区域
LD HL,10
ADD HL,SP
EX DE,HL
LD HL,?0007
LD BC,4
LDIR
; 72. const region_t num_region={44, 8, 40, 8}; //数字区域
LD HL,6
ADD HL,SP
EX DE,HL
LD HL,?0008
LD C,4
LDIR
; 73. WORD value; //to keep slider->value
; 74. BYTE hold_state=0; //按住状态,为了加快控件改变的速度
LD (IX-12),1
LD (IX-13),1
?0010:
; 75. //0:normal; 1:holding up, 2:holding down
; 76.
; 77. ASSERT(slider->value <= slider->max);
; 78. ASSERT(slider->value >= slider->min);
; 79. ASSERT(slider->step > 0);
; 80.
; 81. while(1)
; 82. {
; 83. if(need_draw)
XOR A
OR (IX-12)
JP Z,?0013
?0012:
; 84. {
; 85. //clear screen
; 86. ClearScreen(&bar_region);
LD HL,10
ADD HL,SP
EX DE,HL
CALL LWRD ClearScreen
; 87.
; 88. //show pic
; 89. slider_ResShowPic(SBAR, POSITION_SLIDERBAR, 16);
LD C,16
PUSH BC
LD C,15
LD DE,474
LD A,BYTE3 slider_ResShowPic
LD HL,LWRD slider_ResShowPic
CALL LWRD ?BANK_CALL_DIRECT_L08
POP AF
; 90. start = POSITION_SLIDERBAR+1;
; 91. end = (POSITION_SLIDERBAR -1) +
; 92. SLIDER_BAR_WIDTH * (slider->value - slider->min) / (slider->max - slider->min);
LD C,(IY+0)
LD B,(IY+1)
LD L,(IY+4)
LD H,(IY+5)
AND A
SBC HL,BC
LD C,L
LD B,H
LD DE,98
CALL LWRD ?S_MUL_L02
LD C,(IY+0)
LD B,(IY+1)
LD L,(IY+2)
LD H,(IY+3)
AND A
SBC HL,BC
LD C,L
LD B,H
CALL LWRD ?SS_DIV_L02
LD HL,14
ADD HL,DE
LD (IX-16),L
LD (IX-15),H
LD (IX-26),16
LD (IX-25),0
?0015:
; 93. ASSERT(end < SCR_WIDTH);
; 94. //分段显示背景
; 95. while(start+SLIDER_BG_WIDTH < end)
LD HL,4
LD C,(IX-26)
LD B,(IX-25)
ADD HL,BC
LD C,(IX-16)
LD B,(IX-15)
OR 128
SBC HL,BC
JP PO,?0060
XOR H
?0060:
LD C,16
PUSH BC
LD C,(IX-26)
JP P,?0014
?0016:
; 96. {
; 97. slider_ResShowPic(SBKGRD, start, 16);
LD DE,475
LD A,BYTE3 slider_ResShowPic
LD HL,LWRD slider_ResShowPic
CALL LWRD ?BANK_CALL_DIRECT_L08
POP AF
; 98. start += SLIDER_BG_WIDTH;
LD HL,4
ADD HL,SP
LD A,(HL)
ADD A,4
LD (HL),A
JR NC,?0015
INC HL
INC (HL)
JR ?0015
?0014:
; 99. }
; 100. // 在背景的尽头处显示拖把
; 101. slider_ResShowPic(SSLIDER, start, 16);
LD DE,478
LD A,BYTE3 slider_ResShowPic
LD HL,LWRD slider_ResShowPic
CALL LWRD ?BANK_CALL_DIRECT_L08
POP AF
; 102.
; 103. //format text <-xxxx>
; 104. p = buf;
LD HL,20
ADD HL,SP
; 105. *p++ = '<';
LD (HL),60
; 106. *p++ = '<';
INC HL
INC HL
LD (IX-30),L
LD (IX-29),H
DEC HL
LD (HL),60
; 107. if(slider->value < 0)
BIT 7,(IY+5)
JR Z,?0018
?0017:
; 108. {
; 109. value = -(slider->value);
LD C,(IY+4)
LD B,(IY+5)
AND A
LD HL,0
SBC HL,BC
LD (IX-28),L
LD (IX-27),H
; 110. *p++ = '-'; //显示负数
LD L,(IX-30)
LD H,(IX-29)
INC HL
LD (IX-30),L
LD (IX-29),H
DEC HL
LD (HL),45
; 111. }
; 112. else
JR ?0019
?0018:
; 113. {
; 114. value = slider->value;
LD L,(IY+4)
LD (IX-28),L
LD H,(IY+5)
LD (IX-27),H
?0019:
; 115. }
; 116.
; 117. if(value >= 1000)
LD BC,1000
LD L,(IX-28)
LD H,(IX-27)
AND A
SBC HL,BC
JR C,?0021
?0020:
; 118. {
; 119. itoa_4(value, p);
LD C,(IX-30)
LD B,(IX-29)
LD E,(IX-28)
LD D,(IX-27)
LD A,BYTE3 itoa_4
LD HL,LWRD itoa_4
CALL LWRD ?BANK_CALL_DIRECT_L08
; 120. p += 4;
LD HL,0
ADD HL,SP
LD A,(HL)
ADD A,4
JR ?0070
INC HL
JR ?0066
ADC A,0
JR ?0072
JR ?0062
?0021:
; 121. }
; 122. else if(value >= 100)
LD BC,100
LD L,(IX-28)
LD H,(IX-27)
AND A
SBC HL,BC
JR C,?0024
?0023:
; 123. {
; 124. itoa_3(value, p);
LD C,(IX-30)
LD B,(IX-29)
LD E,(IX-28)
LD D,(IX-27)
LD A,BYTE3 itoa_3
LD HL,LWRD itoa_3
CALL LWRD ?BANK_CALL_DIRECT_L08
; 125. p += 3;
LD HL,0
ADD HL,SP
LD A,(HL)
ADD A,3
JR ?0070
INC HL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -