source: xtideuniversalbios/trunk/Configurator/Src/Libraries/menu/menuprog.asm

Last change on this file was 293, checked in by krille_n_@…, 12 years ago

Commit 1/2 (Library, Configurators and Serial Server):

  • Changed Emulate.inc so that making 286 and 386 versions now works. Additionally, only one processor type define is needed in the makefile.
  • Minor optimizations.
  • Fixed spelling and did some cleaning.
File size: 5.8 KB
Line 
1; Project name  :   Menu library
2; Description   :   ASM library for menu system.
3;                   Contains functions for displaying progress bar dialog.
4
5;--------------- Equates -----------------------------
6
7; Dialog init and return variables.
8; This is an expanded MSGVARS struct.
9struc PDLGVARS
10    .msgVars    resb    MSGVARS_size
11
12    ; Dialog parameters
13    .fpUser     resb    4   ; Far pointer to user specific data
14    .ffnTask    resb    4   ; Far pointer to task function
15
16    ; Return variables for different dialogs
17    .wRetUser   resb    2   ; User specific return variable
18endstruc
19
20;--------------------------------------------------------------------
21; Function prototype for Progress Task function (PDLGVARS.fnTask).
22; Cursor will be set to Title string location so user may modify the
23; title string if needed.
24; Remember to return with RETF instead of RET!
25;   Parameters:
26;       DS:SI:  User specified far pointer
27;   Returns:
28;       AX:     User specified return code if CF set
29;               Task completion percentage (0...100) if CF cleared
30;       CF:     Set if task was completed or cancelled
31;               Cleared if task must be continued
32;   Corrupts registers:
33;       BX, CX, DX
34;--------------------------------------------------------------------
35
36
37;-------------- Private global variables -------------
38; Section containing initialized data
39;SECTION .data
40
41
42;-------------- Public functions ---------------------
43; Section containing code
44SECTION .text
45
46
47;--------------------------------------------------------------------
48; Displays progress bar dialog.
49;
50; MenuProg_Show
51;   Parameters:
52;       BL:     Dialog width with borders included
53;       BH:     Dialog height with borders included
54;       SS:BP:  Ptr to MENUVARS
55;       ES:DI:  Far ptr to user specified task function
56;       DS:SI:  User specified far pointer
57;   Returns:
58;       AX:     User specified return code
59;   Corrupts registers:
60;       BX, CX, DX
61;--------------------------------------------------------------------
62ALIGN JUMP_ALIGN
63MenuProg_Show:
64    ; Create stack frame
65    eENTER  PDLGVARS_size, 0
66    sub     bp, PDLGVARS_size               ; Point to PDLGVARS
67
68    ; Initialize menu variables
69    mov     [bp+MENUVARS.wSize], bx         ; Menu size
70    mov     [bp+PDLGVARS.fpUser], si        ; Store user defined...
71    mov     [bp+PDLGVARS.fpUser+2], ds      ; ...far pointer
72    mov     [bp+PDLGVARS.ffnTask], di       ; Store far ptr to...
73    mov     [bp+PDLGVARS.ffnTask+2], es     ; ...task function
74    mov     WORD [bp+MENUVARS.wTopDwnH], 0101h  ; 1 title line, 1 info line
75    mov     WORD [bp+MENUVARS.fnEvent], MenuProg_Event
76
77    ; Enter menu
78    call    MenuCrsr_GetCenter              ; Get X and Y coordinates to DX
79    xor     cx, cx                          ; No menuitems
80    xor     bx, bx                          ; Menu flags
81    xor     ax, ax                          ; Selection timeout (disable)
82    call    Menu_Init                       ; Returns only after dlg closed
83
84    ; Return
85    mov     ax, [bp+PDLGVARS.wRetUser]      ; Load user return variable
86    add     bp, PDLGVARS_size               ; Point to old BP
87    eLEAVE                                  ; Destroy stack frame
88    ret
89
90
91;-------------- Private functions ---------------------
92
93;--------------------------------------------------------------------
94; Draws progress bar.
95;
96; MenuProg_DrawBar
97;   Parameters:
98;       AX:     Completion percentage (0...100)
99;       SS:BP:  Ptr to PDLGVARS
100;   Returns:
101;       Nothing
102;   Corrupts registers:
103;       AX, BX, CX, DX
104;--------------------------------------------------------------------
105ALIGN JUMP_ALIGN
106MenuProg_DrawBar:
107    ; Calculate number of chars to draw
108    eMOVZX  cx, [bp+MENUVARS.bWidth]        ; Dialog width to CX
109    sub     cl, 4                           ; Sub borders, CX=bar width
110    mul     cl                              ; AX=bar with * percentage
111    mov     bx, 100                         ; Prepare to div by 100
112    div     bl                              ; AL=Full char cnt
113    sub     cl, al                          ; CX=Empty char cnt
114    mov     bl, al                          ; BX=full char cnt
115
116    ; Draw full chars
117    mov     dl, FULL_BLCK                   ; Load full block char
118    xchg    bx, cx                          ; CX=full chars, BX=empty chars
119    call    Print_Repeat                    ; Repeat chars
120    mov     dl, MIN_BLCK                    ; Load min block char
121    mov     cx, bx                          ; CX=empty chars
122    call    Print_Repeat                    ; Repeat chars
123    ret
124
125
126;--------------------------------------------------------------------
127; File dialog event handler.
128;
129; MenuProg_Event
130;   Parameters:
131;       BX:     Callback event
132;       CX:     Selected menuitem index
133;       DX:     Event parameter (event specific)
134;       SS:BP:  Ptr to PDLGVARS
135;   Returns:
136;       AH:     Event specific or unused
137;       AL:     1=Event processed
138;               0=Event not processed (default action if any)
139;   Corrupts registers:
140;       BX, CX, DX
141;--------------------------------------------------------------------
142ALIGN JUMP_ALIGN
143MenuProg_Event:
144    cmp     bx, EVNT_MNU_UPD        ; Update menu string?
145    je      .EventUpd               ;  If so, jump to update
146    xor     ax, ax                  ; Event not processed
147    ret
148
149ALIGN JUMP_ALIGN
150.EventHandled:  ; Return point from all handled events
151    mov     ax, 1
152    ret
153
154;--------------------------------------------------------------------
155; EVNT_MNU_UPD event handler.
156;
157; .EventUpd
158;   Parameters:
159;       CX:     Index of menuitem to update (MFL_UPD_ITEM only)
160;       DL:     Update flag:
161;                   MFL_UPD_TITLE   Set to update title string
162;                   MFL_UPD_NFO     Set to update info string
163;                   MFL_UPD_ITEM    Set to update menuitem string
164;       SS:BP:  Ptr to PDLGVARS
165;   Returns:
166;       AX:     1 (Event processed)
167;   Corrupts registers:
168;       BX, CX, DX
169;--------------------------------------------------------------------
170ALIGN JUMP_ALIGN
171.EventUpd:
172    test    dl, MFL_UPD_NFO     ; Update info?
173    jz      .EventHandled       ;  If not, do nothing and return
174
175    ; Start task
176    push    ds
177    push    si
178    lds     si, [bp+PDLGVARS.fpUser]    ; Load user defined ptr
179    xor     ax, ax                      ; Zero percent
180ALIGN JUMP_ALIGN
181.TaskLoop:
182    push    ax
183    call    MenuCrsr_PointInfo          ; Point cursor to info string
184    pop     ax
185    call    MenuProg_DrawBar            ; Draw progress bar
186    call    MenuCrsr_PointTitle         ; Point cursor to title string
187    call    far [bp+PDLGVARS.ffnTask]   ; Call task function
188    jnc     .TaskLoop                   ; Loop until task complete
189
190    ; Task complete
191    mov     [bp+PDLGVARS.wRetUser], ax  ; Store user return value
192    pop     si
193    pop     ds
194    jmp     MenuDlg_ExitHandler         ; Close progress bar
Note: See TracBrowser for help on using the repository browser.