widget bug fixing
This commit is contained in:
parent
9992a05945
commit
36e72bb399
9 changed files with 374 additions and 628 deletions
274
src/boot-cga.asm
274
src/boot-cga.asm
|
|
@ -1,274 +0,0 @@
|
|||
; =============================================================================
|
||||
; Project : Custom BIOS / ROM
|
||||
; File : boot.asm
|
||||
; Author : frater
|
||||
;
|
||||
; License : GNU General Public License v3.0 or later (GPL-3.0+)
|
||||
;
|
||||
; This program is free software: you can redistribute it and/or modify
|
||||
; it under the terms of the GNU General Public License as published by
|
||||
; the Free Software Foundation, either version 3 of the License, or
|
||||
; (at your option) any later version.
|
||||
;
|
||||
; This program is distributed in the hope that it will be useful,
|
||||
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
; GNU General Public License for more details.
|
||||
;
|
||||
; You should have received a copy of the GNU General Public License
|
||||
; along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
;
|
||||
; =============================================================================
|
||||
|
||||
bits 16
|
||||
; ---------------------------------------------------------------------------
|
||||
;
|
||||
; configuration du bios
|
||||
;
|
||||
; ---------------------------------------------------------------------------
|
||||
|
||||
; initial stack
|
||||
%define STACK_SEG 0x0800 ; segment de base
|
||||
%define GFX_DRIVERS 'CGA'
|
||||
|
||||
section .text
|
||||
bits 16
|
||||
|
||||
%include "./common/chartable.asm"
|
||||
%include "./common/cursor.asm"
|
||||
%include "./common/patterns.asm"
|
||||
%include "./common/generic.asm"
|
||||
%include "./common/string.asm"
|
||||
|
||||
; definition du BDA
|
||||
%include "./common/bda.asm"
|
||||
|
||||
; drivers
|
||||
%if GFX_DRIVERS == 'VGA'
|
||||
%include "./drivers/gfx_vga.asm"
|
||||
%else
|
||||
; default drivers
|
||||
%include "./drivers/gfx_cgam.asm"
|
||||
%endif
|
||||
|
||||
%include "./drivers/mouse_ps2.asm"
|
||||
%include "./drivers/keyboard_ps2.asm"
|
||||
|
||||
%include "./common/debug_gfx.asm"
|
||||
|
||||
; GUI
|
||||
%include "./gui/lib-api.asm"
|
||||
|
||||
; --- Données texte ---
|
||||
str_quit db "Quitter", 0
|
||||
str_hello db "Hello", 0
|
||||
str_option1 db "option 1", 0
|
||||
str_option2 db "option 2", 0
|
||||
str_option3 db "option 3", 0
|
||||
|
||||
entrycode:
|
||||
cli
|
||||
mov ax, STACK_SEG ; creation du stack par défaut
|
||||
mov ss, ax
|
||||
mov sp, 0xFFFE ; haut du segment (64ko de stack), mot-aligné
|
||||
cld
|
||||
|
||||
call ivt_setup ; configuration d'une table d'interruption "dummy"
|
||||
call bda_setup ; initialisation du BDA
|
||||
|
||||
ISADBG ISA_GREEN, 0x01
|
||||
|
||||
; Install IRQ 0 : timer_isr
|
||||
mov ax,cs
|
||||
mov dx,ax
|
||||
mov bx,timer_isr
|
||||
mov ax,i8259_MASTER_INT
|
||||
|
||||
call ivt_setvector
|
||||
|
||||
ISADBG ISA_GREEN, 0x02
|
||||
|
||||
; initialisation des PIC 8259A
|
||||
call pic_init
|
||||
|
||||
ISADBG ISA_GREEN, 0x04
|
||||
|
||||
; load Roms
|
||||
call setup_load_rom
|
||||
|
||||
ISADBG ISA_GREEN, 0x08
|
||||
|
||||
; on vérifie que le BIOS VGA a installé une INT 10h
|
||||
call setup_check_vga
|
||||
|
||||
ISADBG ISA_GREEN, 0x10
|
||||
|
||||
; enable IRQ 0
|
||||
mov ah,IRQ_ENABLED
|
||||
mov al,0
|
||||
call pic_set_irq_mask
|
||||
|
||||
call kbd_init
|
||||
sti
|
||||
|
||||
DEBUG 0xFADE
|
||||
ISADBG ISA_GREEN, 0x20
|
||||
|
||||
; on active le mode graphique
|
||||
GFX INIT
|
||||
ISADBG ISA_GREEN, 0xFF
|
||||
|
||||
; call mouse_reset
|
||||
call mouse_init
|
||||
|
||||
GFX MOUSE_MOVE
|
||||
GFX MOUSE_SHOW
|
||||
|
||||
ISADBG ISA_RED, 0x81
|
||||
|
||||
xor ax,ax
|
||||
|
||||
.loops:
|
||||
call main_loop
|
||||
|
||||
nop
|
||||
jmp .loops
|
||||
|
||||
; --- Callbacks (Fonctions appelées par le moteur) ---
|
||||
on_click_quit:
|
||||
hlt
|
||||
jmp on_click_quit
|
||||
ret
|
||||
|
||||
on_click_hello:
|
||||
ret
|
||||
|
||||
%define .oldval word [bp-2]
|
||||
%define .my_slider word [bp-4]
|
||||
%define .value word [bp-6]
|
||||
main_loop:
|
||||
push bp
|
||||
mov bp, sp
|
||||
sub sp, 6
|
||||
|
||||
push cs
|
||||
pop ds
|
||||
|
||||
DEBUG 1
|
||||
ISADBG ISA_LEFT, 1
|
||||
|
||||
; Init du système GUI
|
||||
call gui_init_system
|
||||
DEBUG 2
|
||||
ISADBG ISA_LEFT, 2
|
||||
|
||||
; --- CRÉATION DYNAMIQUE DES BOUTONS ---
|
||||
|
||||
; Créer Bouton 1 "QUITTER"
|
||||
GUI OBJ_CREATE, OBJ_TYPE_BUTTON_ROUNDED, 10, 10, 80, 16
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_quit
|
||||
; Créer Bouton 2 "HELLO"
|
||||
GUI OBJ_CREATE, OBJ_TYPE_BUTTON_ROUNDED, 100, 50, 80, 16
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_hello
|
||||
|
||||
; Créer 3 checkbox "option"
|
||||
GUI OBJ_CREATE, OBJ_TYPE_CHECKBOX, 200, 50, 100, 15
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_option1
|
||||
|
||||
GUI OBJ_CREATE, OBJ_TYPE_CHECKBOX, 200, 50+16, 100, 15
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_option2
|
||||
|
||||
GUI OBJ_CREATE, OBJ_TYPE_CHECKBOX, 200, 50+16*2, 100, 15
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_option3
|
||||
|
||||
DEBUG 3
|
||||
ISADBG ISA_LEFT, 3
|
||||
|
||||
; Créer Slider (Drag)
|
||||
GUI OBJ_CREATE, OBJ_TYPE_SLIDER, 10, 100, 150, 12
|
||||
GUI OBJ_SET_MODE, ax, SLIDER_HORIZONTAL
|
||||
GUI OBJ_SLIDER_SET_ATTR, ax, 10, 140, 10, 15
|
||||
|
||||
GUI OBJ_CREATE, OBJ_TYPE_SLIDER, 400, 10, 16, 150
|
||||
mov .my_slider, ax
|
||||
|
||||
GUI OBJ_SET_MODE, .my_slider, SLIDER_VERTICAL
|
||||
GUI OBJ_SLIDER_SET_ATTR, .my_slider, 0, 31, 0, 12
|
||||
|
||||
mov .oldval, 0x1256
|
||||
mov .value, 0xFADE
|
||||
|
||||
DEBUG 4
|
||||
ISADBG ISA_LEFT, 4
|
||||
|
||||
.loop:
|
||||
call gui_process_all
|
||||
GUI OBJ_GET_VAL, .my_slider
|
||||
mov .value, ax
|
||||
|
||||
cmp ax,.oldval
|
||||
je .loop
|
||||
|
||||
; debug
|
||||
mov .oldval, ax
|
||||
GFX RECTANGLE_FILL,0,148,50,166, PATTERN_WHITE
|
||||
GFX GOTOXY, 8, 150
|
||||
|
||||
mov ax, .value
|
||||
call print_word_hex
|
||||
; end debug
|
||||
|
||||
; change palette...
|
||||
;and ax, 0x00FF
|
||||
;mov bh, 0x00
|
||||
;mov bl, al
|
||||
;mov ah, 0x0b
|
||||
;mov al, 0x00
|
||||
;int 0x10
|
||||
|
||||
mov dx, CRTC_COLOR_DATA
|
||||
and ax, 0x001F
|
||||
out dx, ax
|
||||
|
||||
jmp .loop
|
||||
leave
|
||||
ret
|
||||
|
||||
; -----------------------------------------------------------
|
||||
; timer ISR (IRQ -> INT)
|
||||
; -----------------------------------------------------------
|
||||
timer_isr:
|
||||
push ax
|
||||
|
||||
push fs
|
||||
mov ax,SEG_BDA_CUSTOM
|
||||
mov fs,ax
|
||||
; exemple de fonctionnement:
|
||||
; inc byte [fs:BDA_TIMER]
|
||||
|
||||
mov al, PIC_EOI ; EOI master
|
||||
out i8259_MASTER_CMD, al
|
||||
pop fs
|
||||
|
||||
pop ax
|
||||
iret
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; Padding jusqu'au reset vector
|
||||
; ------------------------------------------------------------------
|
||||
times 0xFFF0 - ($ - $$) db 0xFF
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; RESET VECTOR (exécuté par le CPU)
|
||||
; ------------------------------------------------------------------
|
||||
section .resetvect
|
||||
bits 16
|
||||
global reset_vector
|
||||
|
||||
reset_vector:
|
||||
; code minimal au reset
|
||||
jmp 0xF000:entrycode
|
||||
|
||||
builddate:
|
||||
db __DATE__
|
||||
times 16-($-$$) db 0 ; le stub tient dans 16 octets (ou moins)
|
||||
280
src/boot-vga.asm
280
src/boot-vga.asm
|
|
@ -1,280 +0,0 @@
|
|||
; =============================================================================
|
||||
; Project : Custom BIOS / ROM
|
||||
; File : boot.asm
|
||||
; Author : frater
|
||||
;
|
||||
; License : GNU General Public License v3.0 or later (GPL-3.0+)
|
||||
;
|
||||
; This program is free software: you can redistribute it and/or modify
|
||||
; it under the terms of the GNU General Public License as published by
|
||||
; the Free Software Foundation, either version 3 of the License, or
|
||||
; (at your option) any later version.
|
||||
;
|
||||
; This program is distributed in the hope that it will be useful,
|
||||
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
; GNU General Public License for more details.
|
||||
;
|
||||
; You should have received a copy of the GNU General Public License
|
||||
; along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
;
|
||||
; =============================================================================
|
||||
|
||||
bits 16
|
||||
; ---------------------------------------------------------------------------
|
||||
;
|
||||
; configuration du bios
|
||||
;
|
||||
; ---------------------------------------------------------------------------
|
||||
|
||||
; initial stack
|
||||
%define STACK_SEG 0x0800 ; segment de base
|
||||
%define GFX_DRIVERS 'VGA'
|
||||
|
||||
%define DEBUGER_ENABLED
|
||||
|
||||
section .text
|
||||
bits 16
|
||||
|
||||
%include "./common/chartable.asm"
|
||||
%include "./common/cursor.asm"
|
||||
%include "./common/patterns.asm"
|
||||
%include "./common/generic.asm"
|
||||
%include "./common/string.asm"
|
||||
|
||||
; definition du BDA
|
||||
%include "./common/bda.asm"
|
||||
|
||||
; drivers
|
||||
%if GFX_DRIVERS == 'VGA'
|
||||
%include "./drivers/gfx_vga.asm"
|
||||
%else
|
||||
; default drivers
|
||||
%include "./drivers/gfx_cgam.asm"
|
||||
%endif
|
||||
|
||||
%include "./drivers/mouse_ps2.asm"
|
||||
%include "./drivers/keyboard_ps2.asm"
|
||||
|
||||
%include "./common/debug_gfx.asm"
|
||||
%include "./common/debug_txt.asm"
|
||||
|
||||
; GUI
|
||||
%include "./gui/lib-api.asm"
|
||||
|
||||
; --- Données texte ---
|
||||
str_quit db "Quitter", 0
|
||||
str_hello db "Hello", 0
|
||||
str_option1 db "option 1", 0
|
||||
str_option2 db "option 2", 0
|
||||
str_option3 db "option 3", 0
|
||||
|
||||
entrycode:
|
||||
cli
|
||||
mov ax, STACK_SEG ; creation du stack par défaut
|
||||
mov ss, ax
|
||||
mov sp, 0xFFFE ; haut du segment (64ko de stack), mot-aligné
|
||||
cld
|
||||
|
||||
call ivt_setup ; configuration d'une table d'interruption "dummy"
|
||||
call bda_setup ; initialisation du BDA
|
||||
|
||||
ISADBG ISA_GREEN, 1
|
||||
|
||||
; Install IRQ 0 : timer_isr
|
||||
mov ax,cs
|
||||
mov dx,ax
|
||||
mov bx,timer_isr
|
||||
mov ax,i8259_MASTER_INT
|
||||
|
||||
call ivt_setvector
|
||||
; initialisation des PIC 8259A
|
||||
call pic_init
|
||||
; load Roms
|
||||
call setup_load_rom
|
||||
; on vérifie que le BIOS VGA a installé une INT 10h
|
||||
call setup_check_vga
|
||||
; enable IRQ 0
|
||||
mov ah,IRQ_ENABLED
|
||||
mov al,0
|
||||
call pic_set_irq_mask
|
||||
|
||||
call kbd_init
|
||||
sti
|
||||
; on active le mode graphique
|
||||
GFX INIT
|
||||
call mouse_init
|
||||
GFX MOUSE_SHOW
|
||||
|
||||
|
||||
call main_loop
|
||||
.loops:
|
||||
hlt
|
||||
jmp .loops
|
||||
|
||||
; --- Callbacks (Fonctions appelées par le moteur) ---
|
||||
on_click_quit:
|
||||
hlt
|
||||
jmp on_click_quit
|
||||
ret
|
||||
|
||||
on_click_hello:
|
||||
ret
|
||||
|
||||
|
||||
main_test:
|
||||
; GFX RECTANGLE_FILL, 10,10,50,20, PATTERN_WHITE, 15, 0
|
||||
|
||||
|
||||
|
||||
; GUI OBJ_CREATE, OBJ_TYPE_CHECKBOX, 200, 50, 100, 15
|
||||
mov ax, 200
|
||||
add ax, 4
|
||||
mov bx, 50
|
||||
|
||||
; centrage vertical
|
||||
mov cx, 15
|
||||
sub cx, GUI_CHECKBOX_SIZE
|
||||
shr cx, 1
|
||||
add bx, cx ; bx = Y1 + (h/2)
|
||||
|
||||
mov cx, ax ; x
|
||||
add cx, GUI_CHECKBOX_SIZE ; cx = X2
|
||||
|
||||
mov dx, bx
|
||||
add dx, GUI_CHECKBOX_SIZE ; Y2
|
||||
|
||||
; Fond blanc + Bordure noire
|
||||
GFX RECTANGLE_FILL, ax, bx, cx, dx, PATTERN_WHITE, 15, 0
|
||||
GFX RECTANGLE, ax, bx, cx, dx, 0
|
||||
|
||||
; Dessin du X (Diagonales)
|
||||
add ax, 2 ; x1
|
||||
add bx, 2 ; y1
|
||||
sub cx, 2 ; x2
|
||||
sub dx, 2 ; y2
|
||||
; Optimisation : Utilisation de LINE au lieu de PUTPIXEL en boucle
|
||||
; Diagonale 1 : (ax, bx) -> (cx, dx)
|
||||
GFX LINE, ax, bx, cx, dx, 0
|
||||
; Diagonale 2 : (ax, dx) -> (cx, bx)
|
||||
GFX LINE, ax, dx, cx, bx, 0
|
||||
|
||||
ret
|
||||
|
||||
%define .oldval word [bp-2]
|
||||
%define .my_slider word [bp-4]
|
||||
%define .value word [bp-6]
|
||||
main_loop:
|
||||
push bp
|
||||
mov bp, sp
|
||||
sub sp, 6
|
||||
|
||||
push cs
|
||||
pop ds
|
||||
; Init du système GUI
|
||||
call gui_init_system
|
||||
|
||||
; --- CRÉATION DYNAMIQUE DES BOUTONS ---
|
||||
|
||||
; Créer Bouton 1 "QUITTER"
|
||||
GUI OBJ_CREATE, OBJ_TYPE_BUTTON_ROUNDED, 10, 10, 80, 16
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_quit
|
||||
; Créer Bouton 2 "HELLO"
|
||||
GUI OBJ_CREATE, OBJ_TYPE_BUTTON_ROUNDED, 100, 50, 80, 16
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_hello
|
||||
|
||||
; Créer 3 checkbox "option"
|
||||
GUI OBJ_CREATE, OBJ_TYPE_CHECKBOX, 200, 50, 100, 15
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_option1
|
||||
|
||||
GUI OBJ_CREATE, OBJ_TYPE_CHECKBOX, 200, 50+16, 100, 15
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_option2
|
||||
|
||||
GUI OBJ_CREATE, OBJ_TYPE_CHECKBOX, 200, 50+16*2, 100, 15
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_option3
|
||||
|
||||
; Créer Slider (Drag)
|
||||
GUI OBJ_CREATE, OBJ_TYPE_SLIDER, 10, 100, 150, 12
|
||||
GUI OBJ_SET_MODE, ax, SLIDER_HORIZONTAL
|
||||
GUI OBJ_SLIDER_SET_ATTR, ax, 10, 140, 10, 15
|
||||
|
||||
GUI OBJ_CREATE, OBJ_TYPE_SLIDER, 400, 10, 16, 150
|
||||
mov .my_slider, ax
|
||||
|
||||
GUI OBJ_SET_MODE, .my_slider, SLIDER_VERTICAL
|
||||
GUI OBJ_SLIDER_SET_ATTR, .my_slider, 0, 31, 0, 12
|
||||
|
||||
mov .oldval, 0x1256
|
||||
mov .value, 0xFADE
|
||||
|
||||
.loop:
|
||||
call gui_process_all
|
||||
GUI OBJ_GET_VAL, .my_slider
|
||||
mov .value, ax
|
||||
|
||||
cmp ax,.oldval
|
||||
je .loop
|
||||
|
||||
; debug
|
||||
;mov .oldval, ax
|
||||
;GFX RECTANGLE_FILL,0,148,50,166, PATTERN_WHITE
|
||||
;GFX GOTOXY, 8, 150
|
||||
|
||||
;mov ax, .value
|
||||
;call print_word_hex
|
||||
; end debug
|
||||
|
||||
; change palette...
|
||||
;and ax, 0x00FF
|
||||
;mov bh, 0x00
|
||||
;mov bl, al
|
||||
;mov ah, 0x0b
|
||||
;mov al, 0x00
|
||||
;int 0x10
|
||||
|
||||
mov dx, CRTC_COLOR_DATA
|
||||
and ax, 0x001F
|
||||
out dx, ax
|
||||
|
||||
jmp .loop
|
||||
leave
|
||||
ret
|
||||
|
||||
; -----------------------------------------------------------
|
||||
; timer ISR (IRQ -> INT)
|
||||
; -----------------------------------------------------------
|
||||
timer_isr:
|
||||
push ax
|
||||
|
||||
push fs
|
||||
mov ax,SEG_BDA_CUSTOM
|
||||
mov fs,ax
|
||||
; exemple de fonctionnement:
|
||||
; inc byte [fs:BDA_TIMER]
|
||||
|
||||
mov al, PIC_EOI ; EOI master
|
||||
out i8259_MASTER_CMD, al
|
||||
pop fs
|
||||
|
||||
pop ax
|
||||
iret
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; Padding jusqu'au reset vector
|
||||
; ------------------------------------------------------------------
|
||||
times 0xFFF0 - ($ - $$) db 0xFF
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; RESET VECTOR (exécuté par le CPU)
|
||||
; ------------------------------------------------------------------
|
||||
section .resetvect
|
||||
bits 16
|
||||
global reset_vector
|
||||
|
||||
reset_vector:
|
||||
; code minimal au reset
|
||||
jmp 0xF000:entrycode
|
||||
|
||||
builddate:
|
||||
db __DATE__
|
||||
times 16-($-$$) db 0 ; le stub tient dans 16 octets (ou moins)
|
||||
262
src/boot.asm
262
src/boot.asm
|
|
@ -19,4 +19,264 @@
|
|||
; along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
;
|
||||
; =============================================================================
|
||||
%include "./boot-vga.asm"
|
||||
|
||||
bits 16
|
||||
; ---------------------------------------------------------------------------
|
||||
;
|
||||
; configuration du bios
|
||||
;
|
||||
; ---------------------------------------------------------------------------
|
||||
|
||||
; initial stack
|
||||
%define STACK_SEG 0x0800 ; segment de base
|
||||
|
||||
; pilote graphique de base: CGA, VGA
|
||||
%define GFX_DRIVERS 'VGA'
|
||||
|
||||
%define DEBUGER_ENABLED
|
||||
|
||||
section .text
|
||||
bits 16
|
||||
|
||||
%include "./common/chartable.asm"
|
||||
%include "./common/cursor.asm"
|
||||
%include "./common/patterns.asm"
|
||||
%include "./common/generic.asm"
|
||||
%include "./common/string.asm"
|
||||
|
||||
; definition du BDA
|
||||
%include "./common/bda.asm"
|
||||
|
||||
; drivers
|
||||
%if GFX_DRIVERS == 'VGA'
|
||||
%include "./drivers/gfx_vga.asm"
|
||||
%else
|
||||
; default drivers
|
||||
%include "./drivers/gfx_cgam.asm"
|
||||
%endif
|
||||
|
||||
%include "./drivers/mouse_ps2.asm"
|
||||
%include "./drivers/keyboard_ps2.asm"
|
||||
|
||||
%include "./common/debug_gfx.asm"
|
||||
%include "./common/debug_txt.asm"
|
||||
|
||||
; GUI
|
||||
%include "./gui/lib-api.asm"
|
||||
|
||||
; --- Données texte ---
|
||||
str_quit db "Quitter", 0
|
||||
str_hello db "Hello", 0
|
||||
str_option1 db "option 1", 0
|
||||
str_option2 db "option 2", 0
|
||||
str_option3 db "option 3", 0
|
||||
|
||||
entrycode:
|
||||
cli
|
||||
mov ax, STACK_SEG ; creation du stack par défaut
|
||||
mov ss, ax
|
||||
mov sp, 0xFFFE ; haut du segment (64ko de stack), mot-aligné
|
||||
cld
|
||||
|
||||
call ivt_setup ; configuration d'une table d'interruption "dummy"
|
||||
call bda_setup ; initialisation du BDA
|
||||
|
||||
ISADBG ISA_GREEN, 1
|
||||
|
||||
; Install IRQ 0 : timer_isr
|
||||
mov ax,cs
|
||||
mov dx,ax
|
||||
mov bx,timer_isr
|
||||
mov ax,i8259_MASTER_INT
|
||||
|
||||
call ivt_setvector
|
||||
; initialisation des PIC 8259A
|
||||
call pic_init
|
||||
; load Roms
|
||||
call setup_load_rom
|
||||
; on vérifie que le BIOS VGA a installé une INT 10h
|
||||
call setup_check_vga
|
||||
; enable IRQ 0
|
||||
mov ah,IRQ_ENABLED
|
||||
mov al,0
|
||||
call pic_set_irq_mask
|
||||
|
||||
call kbd_init
|
||||
sti
|
||||
; on active le mode graphique
|
||||
GFX INIT
|
||||
call mouse_init
|
||||
GFX MOUSE_SHOW
|
||||
|
||||
|
||||
call main_loop
|
||||
.loops:
|
||||
hlt
|
||||
jmp .loops
|
||||
|
||||
; --- Callbacks (Fonctions appelées par le moteur) ---
|
||||
on_click_quit:
|
||||
hlt
|
||||
jmp on_click_quit
|
||||
ret
|
||||
|
||||
on_click_hello:
|
||||
ret
|
||||
|
||||
|
||||
main_test:
|
||||
; GFX RECTANGLE_FILL, 10,10,50,20, PATTERN_WHITE, 15, 0
|
||||
|
||||
|
||||
|
||||
; GUI OBJ_CREATE, OBJ_TYPE_CHECKBOX, 200, 50, 100, 15
|
||||
mov ax, 200
|
||||
add ax, 4
|
||||
mov bx, 50
|
||||
|
||||
; centrage vertical
|
||||
mov cx, 15
|
||||
sub cx, GUI_CHECKBOX_SIZE
|
||||
shr cx, 1
|
||||
add bx, cx ; bx = Y1 + (h/2)
|
||||
|
||||
mov cx, ax ; x
|
||||
add cx, GUI_CHECKBOX_SIZE ; cx = X2
|
||||
|
||||
mov dx, bx
|
||||
add dx, GUI_CHECKBOX_SIZE ; Y2
|
||||
|
||||
; Fond blanc + Bordure noire
|
||||
GFX RECTANGLE_FILL, ax, bx, cx, dx, PATTERN_WHITE, 15, 0
|
||||
GFX RECTANGLE, ax, bx, cx, dx, 0
|
||||
|
||||
; Dessin du X (Diagonales)
|
||||
add ax, 2 ; x1
|
||||
add bx, 2 ; y1
|
||||
sub cx, 2 ; x2
|
||||
sub dx, 2 ; y2
|
||||
; Optimisation : Utilisation de LINE au lieu de PUTPIXEL en boucle
|
||||
; Diagonale 1 : (ax, bx) -> (cx, dx)
|
||||
GFX LINE, ax, bx, cx, dx, 0
|
||||
; Diagonale 2 : (ax, dx) -> (cx, bx)
|
||||
GFX LINE, ax, dx, cx, bx, 0
|
||||
|
||||
ret
|
||||
|
||||
%define .oldval word [bp-2]
|
||||
%define .my_slider word [bp-4]
|
||||
%define .value word [bp-6]
|
||||
main_loop:
|
||||
push bp
|
||||
mov bp, sp
|
||||
sub sp, 6
|
||||
|
||||
push cs
|
||||
pop ds
|
||||
; Init du système GUI
|
||||
call gui_init_system
|
||||
|
||||
; --- CRÉATION DYNAMIQUE DES BOUTONS ---
|
||||
|
||||
; Créer Bouton 1 "QUITTER"
|
||||
GUI OBJ_CREATE, OBJ_TYPE_BUTTON_ROUNDED, 10, 10, 80, 16
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_quit
|
||||
; Créer Bouton 2 "HELLO"
|
||||
GUI OBJ_CREATE, OBJ_TYPE_BUTTON_ROUNDED, 100, 50, 80, 16
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_hello
|
||||
|
||||
; Créer 3 checkbox "option"
|
||||
GUI OBJ_CREATE, OBJ_TYPE_CHECKBOX, 200, 50, 100, 15
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_option1
|
||||
|
||||
GUI OBJ_CREATE, OBJ_TYPE_CHECKBOX, 200, 50+16, 100, 15
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_option2
|
||||
|
||||
GUI OBJ_CREATE, OBJ_TYPE_CHECKBOX, 200, 50+16*2, 100, 15
|
||||
GUI OBJ_SET_TEXT, ax, cs, str_option3
|
||||
|
||||
; Créer Slider (Drag)
|
||||
GUI OBJ_CREATE, OBJ_TYPE_SLIDER, 10, 100, 150, 12
|
||||
GUI OBJ_SET_MODE, ax, SLIDER_HORIZONTAL
|
||||
GUI OBJ_SLIDER_SET_ATTR, ax, 10, 140, 10, 15
|
||||
|
||||
GUI OBJ_CREATE, OBJ_TYPE_SLIDER, 400, 10, 16, 150
|
||||
mov .my_slider, ax
|
||||
|
||||
GUI OBJ_SET_MODE, .my_slider, SLIDER_VERTICAL
|
||||
GUI OBJ_SLIDER_SET_ATTR, .my_slider, 0, 31, 0, 12
|
||||
|
||||
mov .oldval, 0x1256
|
||||
mov .value, 0xFADE
|
||||
|
||||
.loop:
|
||||
call gui_process_all
|
||||
GUI OBJ_GET_VAL, .my_slider
|
||||
mov .value, ax
|
||||
|
||||
cmp ax,.oldval
|
||||
je .loop
|
||||
|
||||
; debug
|
||||
;mov .oldval, ax
|
||||
;GFX RECTANGLE_FILL,0,148,50,166, PATTERN_WHITE
|
||||
;GFX GOTOXY, 8, 150
|
||||
|
||||
;mov ax, .value
|
||||
;call print_word_hex
|
||||
; end debug
|
||||
|
||||
; change palette...
|
||||
;and ax, 0x00FF
|
||||
;mov bh, 0x00
|
||||
;mov bl, al
|
||||
;mov ah, 0x0b
|
||||
;mov al, 0x00
|
||||
;int 0x10
|
||||
|
||||
mov dx, CRTC_COLOR_DATA
|
||||
and ax, 0x001F
|
||||
out dx, ax
|
||||
|
||||
jmp .loop
|
||||
leave
|
||||
ret
|
||||
|
||||
; -----------------------------------------------------------
|
||||
; timer ISR (IRQ -> INT)
|
||||
; -----------------------------------------------------------
|
||||
timer_isr:
|
||||
push ax
|
||||
|
||||
push fs
|
||||
mov ax,SEG_BDA_CUSTOM
|
||||
mov fs,ax
|
||||
; exemple de fonctionnement:
|
||||
; inc byte [fs:BDA_TIMER]
|
||||
|
||||
mov al, PIC_EOI ; EOI master
|
||||
out i8259_MASTER_CMD, al
|
||||
pop fs
|
||||
|
||||
pop ax
|
||||
iret
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; Padding jusqu'au reset vector
|
||||
; ------------------------------------------------------------------
|
||||
times 0xFFF0 - ($ - $$) db 0xFF
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
; RESET VECTOR (exécuté par le CPU)
|
||||
; ------------------------------------------------------------------
|
||||
section .resetvect
|
||||
bits 16
|
||||
global reset_vector
|
||||
|
||||
reset_vector:
|
||||
; code minimal au reset
|
||||
jmp 0xF000:entrycode
|
||||
|
||||
builddate:
|
||||
db __DATE__
|
||||
times 16-($-$$) db 0 ; le stub tient dans 16 octets (ou moins)
|
||||
|
|
|
|||
|
|
@ -24,9 +24,9 @@
|
|||
; https://wiki.nox-rhea.org/back2root/ibm-pc-ms-dos/hardware/informations/bios_data_area
|
||||
;
|
||||
|
||||
%define BDA_SEGMENT 0x0040 ; segment BDA (historically)
|
||||
%define SEG_BDA 0x0040 ; segment BDA (historically)
|
||||
%define SEG_BDA_CUSTOM 0x0050 ; custom data (mouse, gfx cursor, etc..)
|
||||
%define BDA_GUI_WIDGET 0x0070 ; Segment de données UI (Safe: après Stack, avant Heap)
|
||||
%define SEG_GUI 0x0070 ; Segment de données UI (Safe: après Stack, avant Heap)
|
||||
|
||||
%define PTR_MOUSE 0x0000
|
||||
%define PTR_GFX (PTR_MOUSE + mouse_size)
|
||||
|
|
|
|||
|
|
@ -39,20 +39,20 @@ strcpy:
|
|||
%undef .src_seg
|
||||
%undef .src_ofs
|
||||
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; strlen
|
||||
; Calcule la longueur d'une chaine [es:di]
|
||||
; Out: CX = Length
|
||||
; Out: AX = Length
|
||||
; -----------------------------------------------------------------------------
|
||||
%define .str_seg word [bp+4]
|
||||
%define .str_ofs word [bp+6]
|
||||
strlen:
|
||||
push bp
|
||||
mov bp, sp
|
||||
push ax
|
||||
push ax
|
||||
push es
|
||||
push di
|
||||
|
||||
xor cx, cx
|
||||
mov ax, .str_seg
|
||||
mov es, ax
|
||||
|
|
@ -68,7 +68,7 @@ strlen:
|
|||
.done:
|
||||
pop di
|
||||
pop es
|
||||
pop ax
|
||||
pop ax
|
||||
leave
|
||||
ret
|
||||
%undef .str_seg
|
||||
|
|
|
|||
|
|
@ -121,8 +121,6 @@ themes:
|
|||
db 0,4,12,15 ; HELL
|
||||
db 0,3,11,15 ; Hi Sky
|
||||
|
||||
|
||||
|
||||
; ------------------------------------------------------------
|
||||
; dummy function
|
||||
;
|
||||
|
|
@ -151,6 +149,7 @@ vga_init:
|
|||
PATTERN_PTR PATTERN_GRAY_LIGHT
|
||||
mov bl, 15
|
||||
call vga_background
|
||||
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------
|
||||
|
|
@ -289,8 +288,9 @@ vga_set_writemode:
|
|||
pop ax
|
||||
pop fs
|
||||
leave
|
||||
ret
|
||||
%undef .mode
|
||||
ret
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; gfx_set_charpos (x,y)
|
||||
|
|
@ -330,10 +330,10 @@ vga_set_charpos:
|
|||
|
||||
popa
|
||||
leave
|
||||
ret
|
||||
; clean defs
|
||||
%undef .x
|
||||
%undef .y
|
||||
ret
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; vga_putc_unalign (car)
|
||||
|
|
@ -472,10 +472,10 @@ vga_putc:
|
|||
pop gs
|
||||
popa
|
||||
leave
|
||||
ret
|
||||
; clean defs
|
||||
%undef .cpt
|
||||
%undef .glyph_row
|
||||
ret
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; write string from [DS:SI] to screen
|
||||
|
|
@ -499,16 +499,16 @@ vga_write:
|
|||
je .done
|
||||
push ax
|
||||
call vga_putc
|
||||
; pop ax
|
||||
pop ax
|
||||
jmp .loops
|
||||
|
||||
.done:
|
||||
pop ds
|
||||
pop ax
|
||||
leave
|
||||
ret
|
||||
%undef .txt_seg
|
||||
%undef .txt_ofs
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------
|
||||
; vga_line (x1, y1, x2, y2, color)
|
||||
|
|
@ -577,13 +577,13 @@ vga_line:
|
|||
call vga_mouse_show
|
||||
popa
|
||||
leave
|
||||
ret
|
||||
; clean defs
|
||||
%undef .x1
|
||||
%undef .y1
|
||||
%undef .x2
|
||||
%undef .y2
|
||||
%undef .color
|
||||
ret
|
||||
|
||||
%ifdef ____CLASSIC_LINE_____
|
||||
; ------------------------------------------------------------
|
||||
|
|
@ -709,7 +709,7 @@ vga_line_bresenham:
|
|||
pop es
|
||||
popa
|
||||
leave
|
||||
ret
|
||||
; clean defs
|
||||
%undef .x1
|
||||
%undef .y1
|
||||
%undef .x2
|
||||
|
|
@ -721,7 +721,7 @@ vga_line_bresenham:
|
|||
%undef _sy
|
||||
%undef _err
|
||||
%undef _e2
|
||||
; clean defs
|
||||
ret
|
||||
%endif
|
||||
|
||||
; ------------------------------------------------------------
|
||||
|
|
@ -902,7 +902,6 @@ vga_line_fast:
|
|||
pop es
|
||||
popa
|
||||
leave
|
||||
ret
|
||||
; clean defs
|
||||
%undef .x1
|
||||
%undef .y1
|
||||
|
|
@ -914,6 +913,7 @@ vga_line_fast:
|
|||
%undef _err
|
||||
%undef _sy_offset
|
||||
%undef _count
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------
|
||||
; vga_line_horizontal (y, x1, x2, color)
|
||||
|
|
@ -1042,12 +1042,12 @@ vga_line_horizontal:
|
|||
pop es
|
||||
popa
|
||||
leave
|
||||
ret
|
||||
; clean defs
|
||||
%undef .y
|
||||
%undef .x1
|
||||
%undef .x2
|
||||
%undef .color
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------
|
||||
; vga_line_vertical (x, y1, y2, color)
|
||||
|
|
@ -1118,13 +1118,13 @@ vga_line_vertical:
|
|||
pop es
|
||||
popa
|
||||
leave ; Nettoie la variable locale (mov sp, bp / pop bp)
|
||||
ret
|
||||
; clean defs
|
||||
%undef .x
|
||||
%undef .y1
|
||||
%undef .y2
|
||||
%undef .color
|
||||
%undef .height
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------
|
||||
; vga_draw_rect
|
||||
|
|
@ -1176,13 +1176,13 @@ vga_draw_rect:
|
|||
call vga_mouse_show
|
||||
popa
|
||||
leave
|
||||
ret
|
||||
; clean defs
|
||||
%undef .x1
|
||||
%undef .y1
|
||||
%undef .x2
|
||||
%undef .y2
|
||||
%undef .color
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------
|
||||
; cga_draw_rounded_frame
|
||||
|
|
@ -1254,12 +1254,14 @@ vga_draw_rounded_frame:
|
|||
|
||||
popa
|
||||
leave
|
||||
ret
|
||||
%undef .x1
|
||||
%undef .y1
|
||||
%undef .x2
|
||||
%undef .y2
|
||||
%undef .color
|
||||
%undef .coord1
|
||||
%undef .coord2
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------
|
||||
; vga_fill_rect
|
||||
|
|
@ -1282,6 +1284,8 @@ vga_fill_rect:
|
|||
pusha
|
||||
push es
|
||||
|
||||
call vga_mouse_hide
|
||||
|
||||
; --- 1. Trier Y1 et Y2 ---
|
||||
mov ax, .y1
|
||||
mov bx, .y2
|
||||
|
|
@ -1414,11 +1418,11 @@ vga_fill_rect:
|
|||
mov ax, 0xFF08 ; Reset Bit Mask
|
||||
out dx, ax
|
||||
|
||||
call vga_mouse_show
|
||||
|
||||
pop es
|
||||
popa
|
||||
leave
|
||||
ret
|
||||
|
||||
; Clean defs
|
||||
%undef .x1
|
||||
%undef .y1
|
||||
|
|
@ -1428,8 +1432,7 @@ vga_fill_rect:
|
|||
%undef _left_mask
|
||||
%undef _right_mask
|
||||
%undef _width
|
||||
|
||||
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------
|
||||
; vga_fill_rect_32
|
||||
|
|
@ -1456,10 +1459,12 @@ vga_fill_rect_32:
|
|||
push es
|
||||
push fs
|
||||
|
||||
push cs
|
||||
pop fs
|
||||
call vga_mouse_hide
|
||||
|
||||
; calcul de l'offset du pattern
|
||||
push cs
|
||||
pop fs ; fs = CS
|
||||
|
||||
; calcul de l'offset du pattern
|
||||
mov ax, .pat_id
|
||||
shl ax, 3
|
||||
add ax, pattern_8x8
|
||||
|
|
@ -1656,12 +1661,12 @@ vga_fill_rect_32:
|
|||
mov ax, 0x0001 ; Reset Enable Set/Reset
|
||||
out dx, ax
|
||||
|
||||
call vga_mouse_show
|
||||
|
||||
pop fs
|
||||
pop es
|
||||
popad
|
||||
leave
|
||||
ret
|
||||
|
||||
; Clean defs
|
||||
%undef .x1
|
||||
%undef .y1
|
||||
|
|
@ -1673,6 +1678,8 @@ vga_fill_rect_32:
|
|||
%undef _left_mask
|
||||
%undef _right_mask
|
||||
%undef _width
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------
|
||||
; vga_putpixel
|
||||
%define .x word [bp+4]
|
||||
|
|
@ -1727,11 +1734,11 @@ vga_putpixel:
|
|||
pop es
|
||||
popa
|
||||
leave
|
||||
ret
|
||||
; clean defs
|
||||
%undef .x
|
||||
%undef .y
|
||||
%undef .color
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------
|
||||
; GESTION DU CURSEUR
|
||||
|
|
@ -1805,6 +1812,7 @@ vga_mouse_cursor_move:
|
|||
pusha
|
||||
push ds
|
||||
push es
|
||||
cld
|
||||
|
||||
; BDA Data Segment
|
||||
mov ax, SEG_BDA_CUSTOM
|
||||
|
|
@ -1837,6 +1845,7 @@ vga_cursor_savebg:
|
|||
push es
|
||||
mov ax, SEG_VIDEO
|
||||
mov es, ax
|
||||
cld
|
||||
|
||||
; Calculer l'adresse de départ (y * 80 + x / 8)
|
||||
mov cx, [PTR_MOUSE + mouse.x]
|
||||
|
|
@ -1889,6 +1898,7 @@ vga_cursor_restorebg:
|
|||
push es
|
||||
mov ax, SEG_VIDEO
|
||||
mov es, ax
|
||||
cld
|
||||
|
||||
mov di, [PTR_MOUSE + mouse.cur_addr_start]
|
||||
lea si, [PTR_MOUSE + mouse.bkg_buffer]
|
||||
|
|
@ -1945,7 +1955,7 @@ vga_cursor_restorebg:
|
|||
|
||||
; ============================================================
|
||||
; vga_cursor_draw
|
||||
; Détruit: registres sauvegardés/restaurés (PUSHA/POPA)
|
||||
; Détruit: registres sauvegardés/restaurés (PUSHAD/POPAD)
|
||||
; ============================================================
|
||||
%define BYTES_SHIFT 3
|
||||
vga_cursor_draw:
|
||||
|
|
@ -1961,9 +1971,8 @@ vga_cursor_draw:
|
|||
push ds
|
||||
push es
|
||||
push gs
|
||||
; Note: pushad sauvegarde déjà tous les registres généraux (EAX...EDI)
|
||||
|
||||
cld ; Sécurité : Direction avant
|
||||
|
||||
mov ax, SEG_BDA_CUSTOM
|
||||
mov ds, ax
|
||||
mov ax, SEG_VIDEO
|
||||
|
|
@ -2110,7 +2119,7 @@ vga_cursor_draw:
|
|||
pop ds
|
||||
popad
|
||||
leave
|
||||
ret
|
||||
%undef .height
|
||||
%undef .bit_ofs
|
||||
%undef .mask
|
||||
%undef .mask
|
||||
ret
|
||||
|
|
|
|||
|
|
@ -137,10 +137,11 @@ endstruc
|
|||
gui_api_slider_attr:
|
||||
push bp
|
||||
mov bp, sp
|
||||
push gs
|
||||
push ax
|
||||
|
||||
push .id ; ID
|
||||
call gui_get_widget_ptr
|
||||
mov ax, .id
|
||||
call gui_get_widget_ptr_internal
|
||||
jc .err
|
||||
|
||||
mov ax, .min
|
||||
|
|
@ -156,6 +157,7 @@ gui_api_slider_attr:
|
|||
|
||||
.err:
|
||||
pop ax
|
||||
pop gs
|
||||
leave
|
||||
ret
|
||||
%undef .id
|
||||
|
|
@ -169,16 +171,18 @@ gui_api_slider_attr:
|
|||
gui_api_set_mode:
|
||||
push bp
|
||||
mov bp, sp
|
||||
push gs
|
||||
push ax
|
||||
|
||||
push .id
|
||||
call gui_get_widget_ptr
|
||||
mov ax, .id
|
||||
call gui_get_widget_ptr_internal
|
||||
jc .err
|
||||
|
||||
mov ax, .mode
|
||||
mov byte [gs:si + widget.attr_mode], al
|
||||
|
||||
.err:
|
||||
pop gs
|
||||
pop ax
|
||||
leave
|
||||
ret
|
||||
|
|
@ -194,10 +198,11 @@ gui_api_set_mode:
|
|||
gui_api_set_text:
|
||||
push bp
|
||||
mov bp, sp
|
||||
push gs
|
||||
push ax
|
||||
|
||||
push .id
|
||||
call gui_get_widget_ptr
|
||||
mov ax, .id
|
||||
call gui_get_widget_ptr_internal
|
||||
jc .err
|
||||
|
||||
mov ax, .segmt
|
||||
|
|
@ -206,6 +211,7 @@ gui_api_set_text:
|
|||
mov word [gs:si + widget.text_ofs], ax
|
||||
|
||||
.err:
|
||||
pop gs
|
||||
pop ax
|
||||
leave
|
||||
ret
|
||||
|
|
@ -231,7 +237,7 @@ gui_api_create:
|
|||
mov bp, sp
|
||||
push gs
|
||||
|
||||
mov ax, BDA_GUI_WIDGET
|
||||
mov ax, SEG_GUI
|
||||
mov gs, ax
|
||||
call gui_alloc_widget ; Returns GS:SI
|
||||
mov ax, -1
|
||||
|
|
@ -275,9 +281,10 @@ gui_api_create:
|
|||
gui_api_get_state:
|
||||
push bp
|
||||
mov bp, sp
|
||||
push gs
|
||||
|
||||
mov ax, .id ; ID
|
||||
call gui_get_widget_ptr
|
||||
mov ax, .id
|
||||
call gui_get_widget_ptr_internal
|
||||
jc .err
|
||||
|
||||
xor ax, ax
|
||||
|
|
@ -287,6 +294,7 @@ gui_api_get_state:
|
|||
.err:
|
||||
mov ax, -1
|
||||
.done:
|
||||
pop gs
|
||||
leave
|
||||
ret
|
||||
%undef .id
|
||||
|
|
@ -300,9 +308,10 @@ gui_api_get_state:
|
|||
gui_api_get_type:
|
||||
push bp
|
||||
mov bp, sp
|
||||
push gs
|
||||
|
||||
mov ax, .id ; ID
|
||||
call gui_get_widget_ptr
|
||||
mov ax,.id
|
||||
call gui_get_widget_ptr_internal
|
||||
jc .err
|
||||
|
||||
xor ax, ax
|
||||
|
|
@ -312,6 +321,7 @@ gui_api_get_type:
|
|||
.err:
|
||||
mov ax, -1
|
||||
.done:
|
||||
pop gs
|
||||
leave
|
||||
ret
|
||||
%undef .id
|
||||
|
|
@ -325,9 +335,11 @@ gui_api_get_type:
|
|||
gui_api_get_val:
|
||||
push bp
|
||||
mov bp, sp
|
||||
push gs
|
||||
|
||||
call gui_get_widget_ptr
|
||||
;jc .err
|
||||
mov ax,.id
|
||||
call gui_get_widget_ptr_internal
|
||||
jc .err
|
||||
|
||||
call gui_slider_update_value
|
||||
mov ax, [gs:si + widget.attr_val]
|
||||
|
|
@ -336,6 +348,7 @@ gui_api_get_val:
|
|||
.err:
|
||||
mov ax, -1
|
||||
.done:
|
||||
pop gs
|
||||
leave
|
||||
ret
|
||||
%undef .id
|
||||
|
|
@ -350,15 +363,17 @@ gui_api_get_val:
|
|||
gui_api_set_val:
|
||||
push bp
|
||||
mov bp, sp
|
||||
push gs
|
||||
|
||||
mov ax, .id ; ID
|
||||
call gui_get_widget_ptr
|
||||
mov ax,.id
|
||||
call gui_get_widget_ptr_internal
|
||||
jc .err
|
||||
|
||||
mov ax, .val
|
||||
mov [gs:si + widget.thumb_pos], ax
|
||||
|
||||
.err:
|
||||
pop gs
|
||||
leave
|
||||
ret
|
||||
%undef .id
|
||||
|
|
@ -374,9 +389,10 @@ gui_api_set_val:
|
|||
gui_api_destroy:
|
||||
push bp
|
||||
mov bp, sp
|
||||
push gs
|
||||
|
||||
mov ax, .id ; ID
|
||||
call gui_get_widget_ptr
|
||||
mov ax,.id
|
||||
call gui_get_widget_ptr_internal
|
||||
jc .err
|
||||
|
||||
call gui_free_widget
|
||||
|
|
@ -386,6 +402,7 @@ gui_api_destroy:
|
|||
.err:
|
||||
mov ax, -1
|
||||
.done:
|
||||
pop gs
|
||||
leave
|
||||
ret
|
||||
%undef .id
|
||||
|
|
@ -393,17 +410,29 @@ gui_api_destroy:
|
|||
; -----------------------------------------------------------------------------
|
||||
; gui_get_widget_ptr
|
||||
; Helper interne : Convertit ID en Pointeur
|
||||
; In: ID
|
||||
; Out: GS:SI = Ptr, CF=1 if error
|
||||
; -----------------------------------------------------------------------------
|
||||
%define .id word [bp+4]
|
||||
; -----------------------------------------------------------------------------
|
||||
gui_get_widget_ptr:
|
||||
push bp
|
||||
mov bp, sp
|
||||
push ax
|
||||
push cx
|
||||
|
||||
mov ax, .id
|
||||
call gui_get_widget_ptr_internal
|
||||
pop ax
|
||||
leave
|
||||
ret
|
||||
%undef .id
|
||||
|
||||
; -----------------------------------------------------------------------------
|
||||
; gui_get_widget_ptr_internal
|
||||
; Helper interne : Convertit ax en Pointeur
|
||||
; Out: GS:SI = Ptr, CF=1 if error
|
||||
; -----------------------------------------------------------------------------
|
||||
gui_get_widget_ptr_internal:
|
||||
push cx
|
||||
push dx
|
||||
|
||||
cmp ax, GUI_MAX_WIDGETS
|
||||
jae .error
|
||||
|
||||
|
|
@ -412,7 +441,7 @@ gui_get_widget_ptr:
|
|||
mul cx ; AX = Offset
|
||||
mov si, ax
|
||||
|
||||
mov ax, BDA_GUI_WIDGET
|
||||
mov ax, SEG_GUI
|
||||
mov gs, ax
|
||||
|
||||
clc
|
||||
|
|
@ -420,12 +449,9 @@ gui_get_widget_ptr:
|
|||
.error:
|
||||
stc
|
||||
.done:
|
||||
pop dx
|
||||
pop cx
|
||||
pop ax
|
||||
leave
|
||||
ret
|
||||
%undef .id
|
||||
|
||||
|
||||
; =============================================================================
|
||||
; SECTION : GESTION MÉMOIRE (ALLOCATION / LIBÉRATION)
|
||||
|
|
@ -434,7 +460,7 @@ gui_get_widget_ptr:
|
|||
; -----------------------------------------------------------------------------
|
||||
; gui_init_system
|
||||
; Initialise toute la mémoire des widgets à 0 (Libre)
|
||||
; Entrée : DS doit pointer vers BDA_GUI_WIDGET
|
||||
; Entrée : DS doit pointer vers SEG_GUI
|
||||
; -----------------------------------------------------------------------------
|
||||
gui_init_system:
|
||||
push eax
|
||||
|
|
@ -442,7 +468,7 @@ gui_init_system:
|
|||
push es
|
||||
push di
|
||||
|
||||
mov ax, BDA_GUI_WIDGET
|
||||
mov ax, SEG_GUI
|
||||
mov es, ax
|
||||
|
||||
cld
|
||||
|
|
@ -468,8 +494,9 @@ gui_alloc_widget:
|
|||
push ax
|
||||
push cx
|
||||
push bx
|
||||
push gs
|
||||
|
||||
mov ax, BDA_GUI_WIDGET
|
||||
mov ax, SEG_GUI
|
||||
mov gs, ax
|
||||
|
||||
mov si, 0 ; Début du pool
|
||||
|
|
@ -496,9 +523,12 @@ gui_alloc_widget:
|
|||
mov word [gs:si + widget.event_click], 0
|
||||
mov word [gs:si + widget.event_drag], 0
|
||||
mov byte [gs:si + widget.thumb_pct], 10 ; 10% par défaut
|
||||
mov word [gs:si + widget.thumb_pos], 0
|
||||
mov word [gs:si + widget.attr_val], 0
|
||||
|
||||
clc ; Clear Carry Flag
|
||||
.done:
|
||||
pop gs
|
||||
pop bx
|
||||
pop cx
|
||||
pop ax
|
||||
|
|
@ -513,15 +543,15 @@ gui_free_widget:
|
|||
push eax
|
||||
push es
|
||||
|
||||
mov ax, BDA_GUI_WIDGET
|
||||
mov ax, SEG_GUI
|
||||
mov es, ax
|
||||
|
||||
cld
|
||||
mov di, si
|
||||
mov cx, (widget_size)
|
||||
shr cx, 2 ; cx / 4
|
||||
xor eax, eax
|
||||
rep stosd ; Remplit tout de 0
|
||||
shr cx, 1 ; cx / 4
|
||||
xor ax, ax
|
||||
rep stosw ; Remplit tout de 0
|
||||
|
||||
; On efface le widget
|
||||
mov byte [es:si + widget.state], GUI_STATE_FREE
|
||||
|
|
|
|||
|
|
@ -37,10 +37,11 @@
|
|||
gui_draw_single_widget:
|
||||
pusha
|
||||
push es
|
||||
push gs
|
||||
|
||||
GFX MOUSE_HIDE ; On cache la souris AVANT de commencer le dessin du widget
|
||||
|
||||
mov ax, BDA_GUI_WIDGET
|
||||
mov ax, SEG_GUI
|
||||
mov gs, ax
|
||||
|
||||
mov al, [gs:si + widget.state]
|
||||
|
|
@ -98,6 +99,7 @@ gui_draw_single_widget:
|
|||
|
||||
.done:
|
||||
GFX MOUSE_SHOW ; On réaffiche la souris APRES, capturant le widget fini
|
||||
pop gs
|
||||
pop es
|
||||
popa
|
||||
ret
|
||||
|
|
@ -447,7 +449,7 @@ draw_checkbox:
|
|||
GFX RECTANGLE, ax, bx, cx, dx, 0
|
||||
|
||||
; Check if checked
|
||||
cmp word [gs:si + widget.thumb_pos], 0
|
||||
cmp word [gs:si + widget.attr_val], 0
|
||||
je .draw_label
|
||||
|
||||
push ax
|
||||
|
|
@ -509,7 +511,6 @@ draw_text:
|
|||
; --- Centrage Texte ---
|
||||
mov es, [gs:si + widget.text_seg]
|
||||
mov di, [gs:si + widget.text_ofs]
|
||||
xor cx, cx
|
||||
|
||||
push di
|
||||
push es
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ gui_process_all:
|
|||
push ds
|
||||
push gs
|
||||
|
||||
mov ax, BDA_GUI_WIDGET
|
||||
mov ax, SEG_GUI
|
||||
mov gs, ax
|
||||
|
||||
; Charger l'état de la souris pour toute la passe
|
||||
|
|
@ -87,7 +87,7 @@ gui_update_logic:
|
|||
|
||||
mov ax, SEG_BDA_CUSTOM
|
||||
mov ds, ax
|
||||
mov ax, BDA_GUI_WIDGET
|
||||
mov ax, SEG_GUI
|
||||
mov gs, ax
|
||||
|
||||
mov al, byte [gs:si + widget.state]
|
||||
|
|
@ -520,7 +520,7 @@ gui_logic_checkbox:
|
|||
jne .hover
|
||||
|
||||
; Clic validé ! Toggle value
|
||||
xor word [gs:si + widget.thumb_pos], 1
|
||||
xor word [gs:si + widget.attr_val], 1
|
||||
mov byte [gs:si + widget.oldstate], 255 ; Force redraw
|
||||
|
||||
mov al, 1
|
||||
|
|
|
|||
Loading…
Reference in a new issue