From 7c9ad48b19a5e76d9d029e6c19b10e538d8b8f17 Mon Sep 17 00:00:00 2001 From: Frater <13979047+saintfrater@users.noreply.github.com> Date: Mon, 16 Feb 2026 19:45:13 +0100 Subject: [PATCH] vga Drivers +Mouse --- src/{boot-ok.asm => boot-cga.asm} | 0 src/boot-vga.asm | 200 ++++++++++++++ src/boot.asm | 176 +----------- src/common/bda.asm | 80 +++--- src/common/cursor.asm | 1 + src/common/debug_txt.asm | 22 +- src/drivers/gfx_cgam.asm | 102 ++++--- src/drivers/gfx_vga.asm | 433 +++++++++++++++++++++++++----- src/drivers/mouse_ps2.asm | 108 ++++---- src/gui/lib-logic.asm | 12 +- 10 files changed, 730 insertions(+), 404 deletions(-) rename src/{boot-ok.asm => boot-cga.asm} (100%) create mode 100644 src/boot-vga.asm diff --git a/src/boot-ok.asm b/src/boot-cga.asm similarity index 100% rename from src/boot-ok.asm rename to src/boot-cga.asm diff --git a/src/boot-vga.asm b/src/boot-vga.asm new file mode 100644 index 0000000..d4481d6 --- /dev/null +++ b/src/boot-vga.asm @@ -0,0 +1,200 @@ +; ============================================================================= +; 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 . +; +; ============================================================================= + + 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 + + .loops: + call main_loop + jmp .loops + +; --- Callbacks (Fonctions appelées par le moteur) --- +on_click_quit: + hlt + jmp on_click_quit + ret + +on_click_hello: + ret + +main_loop: + push bp + mov bp, sp + %define .oldval word [bp-2] + %define .my_slider word [bp-4] + %define .value word [bp-6] + sub sp, 6 + + push cs + pop ds + + GFX GOTOXY, 5,5 + GFX WRITE, str_hello + + + ; Init du système GUI +; call gui_init_system + + .loop: +; call gui_process_all + + mov dh, 1 + mov dl, 10 + call scr_gotoxy + + mov ax, BDA_CUSTOM_SEG + mov fs, ax + mov ax, word [fs:PTR_MOUSE + mouse.x] + call scr_puthex16 + + mov al, ' ' + call scr_putc + + mov ax, word [fs:PTR_MOUSE + mouse.y] + call scr_puthex16 + + nop + jmp .loop + leave + ret + +; ----------------------------------------------------------- +; timer ISR (IRQ -> INT) +; ----------------------------------------------------------- +timer_isr: + push ax + + push fs + mov ax,BDA_CUSTOM_SEG + 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) diff --git a/src/boot.asm b/src/boot.asm index 3fb0629..2698dd9 100644 --- a/src/boot.asm +++ b/src/boot.asm @@ -19,178 +19,4 @@ ; along with this program. If not, see . ; ; ============================================================================= - - 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" - -; 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 - - ISADBG ISA_GREEN, 32 - - ; on active le mode graphique - GFX INIT - call mouse_reset - - ; call mouse_init - - GFX MOUSE_MOVE - ISADBG ISA_RED, 0x80 - - GFX MOUSE_SHOW - ISADBG ISA_RED, 0x81 - - .loops: - call main_loop - 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 - - .loop: -; call gui_process_all - - jmp .loop - leave - ret - -; ----------------------------------------------------------- -; timer ISR (IRQ -> INT) -; ----------------------------------------------------------- -timer_isr: - push ax - - push fs - mov ax,BDA_CUSTOM_SEG - 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) +%include "./boot-vga.asm" diff --git a/src/common/bda.asm b/src/common/bda.asm index 703a306..af0de64 100644 --- a/src/common/bda.asm +++ b/src/common/bda.asm @@ -28,6 +28,9 @@ %define BDA_CUSTOM_SEG 0x0050 ; custom data (mouse, gfx cursor, etc..) %define BDA_GUI_WIDGET 0x0070 ; Segment de données UI (Safe: après Stack, avant Heap) +%define PTR_MOUSE 0x0000 +%define PTR_GFX (PTR_MOUSE + mouse_size) + ; video related information (compatible with VGA bios) %define BDA_VIDEO_CURR_MODE 0x0049 %define BDA_VIDEO_COLUMNS 0x004A @@ -37,7 +40,7 @@ ; information relative à la souris ; -%define BDA_BitPP 4 +%define BDA_BitPPixel 4 %define BKG_DWORDS_PER_LINE 1 ; 1 dword stocké par ligne %define BKG_LINES 16 @@ -45,55 +48,52 @@ %define BKG_TOTAL_BYTES (BKG_TOTAL_DWORDS * 4) ; 64 struc mouse - .buffer resb 4 ; i8042 input buffer - .idx resb 1 ; index in the buffer - .packetlen resb 1 ; max buffer len (3 ou 4) - .status resb 1 ; mouse status (button etc) - .wheel resb 1 ; if a packet size is 4; experimental - .x resw 1 ; - .y resw 1 ; - ; cursor management - .cur_x resw 1 ; preservation des x,y du background - .cur_y resw 1 ; - .cur_addr_start resw 1 ; adresse de départ de la sauvegarde - .cur_drawing resb 1 ; - .cur_counter resb 1 ; compteur de fois que le curseur a été caché (0 = visible, <0 = invisible) - .cur_seg resw 1 ; segment / offset of the pointer - .cur_ofs resw 1 ; - .bkg_saved resb 1 ; background saved - alignb 4 ; alignement 4 bytes - ; buffer for saved background - .bkg_buffer resd 16*BDA_BitPP + .buffer resb 4 ; i8042 input buffer + .idx resb 1 ; index in the buffer + .packetlen resb 1 ; max buffer len (3 ou 4) + .status resb 1 ; mouse status (button etc) + .wheel resb 1 ; if a packet size is 4; experimental + .x resw 1 ; + .y resw 1 ; + ; cursor management + .cur_x resw 1 ; preservation des x,y du background + .cur_y resw 1 ; + .cur_addr_start resw 1 ; adresse de départ de la sauvegarde + .cur_drawing resb 1 ; + .cur_counter resb 1 ; compteur de fois que le curseur a été caché (0 = visible, <0 = invisible) + .cur_seg resw 1 ; segment / offset of the pointer + .cur_ofs resw 1 ; + .bkg_saved resb 1 ; background saved + alignb 4 ; alignement 4 bytes + ; buffer for saved background + .bkg_buffer resd 16*BDA_BitPPixel endstruc struc gfx - .cur_x resw 1 ; x,y en pixel - .cur_y resw 1 - .cur_offset resw 1 ; offset calculé pour le prochain caractère - .cur_line_ofs resw 1 ; "interligne" +2000h ou -2000h - .cur_shift resb 1 ; x&7 (0..7) - .cur_mode resb 1 ; + .cur_x resw 1 ; x,y en pixel + .cur_y resw 1 + .cur_offset resw 1 ; offset calculé pour le prochain caractère + .cur_line_ofs resw 1 ; "interligne" +2000h ou -2000h + .cur_shift resb 1 ; x&7 (0..7) + .cur_mode resb 1 ; endstruc -%define BDA_MOUSE 0x0000 -%define BDA_GFX (BDA_MOUSE + mouse_size) - ; ----------------------------------------------------------------------------------- ; bda_setup ; Initialise la BDA à zéro ; ----------------------------------------------------------------------------------- bda_setup: - pusha - push ds + pusha + push ds - mov ax, BDA_CUSTOM_SEG - mov es, ax + mov ax, BDA_CUSTOM_SEG + mov es, ax - mov ax, 0x5F - mov cx,0xFF - xor di, di - rep stosb ; clear BDA area + mov ax, 0x5F + mov cx,0xFF + xor di, di + rep stosb ; clear BDA area - pop ds - popa - ret \ No newline at end of file + pop ds + popa + ret \ No newline at end of file diff --git a/src/common/cursor.asm b/src/common/cursor.asm index 87aaef5..88503d1 100644 --- a/src/common/cursor.asm +++ b/src/common/cursor.asm @@ -21,6 +21,7 @@ mouse_arrow: dw 1111110000111111b ; 0xFC3F dw 1111111000111111b ; 0xFE3F dw 0000000000000000b ; 0x0000 + dw 0010000000000000b ; 0x2000 dw 0011000000000000b ; 0x3000 dw 0011100000000000b ; 0x3800 diff --git a/src/common/debug_txt.asm b/src/common/debug_txt.asm index c1e07e8..d66c7bc 100644 --- a/src/common/debug_txt.asm +++ b/src/common/debug_txt.asm @@ -23,7 +23,7 @@ %define DEBUG_PORT 0xe9 ; 0x402 ou 0xe9 debug_puts: -.next: + .next: push dx mov dx, DEBUG_PORT lodsb ; AL = *SI++ @@ -31,7 +31,7 @@ debug_puts: jz .done out dx, al jmp .next -.done: + .done: pop dx ret @@ -49,9 +49,9 @@ debug_puthex4: jbe .num add al, 'A' - 10 jmp .pout -.num: + .num: add al, '0' -.pout: + .pout: call debug_putc ret @@ -88,6 +88,8 @@ scr_gotoxy: scr_putc: mov ah, 0x0E + mov bh, 0x00 + mov bl, 0x0f int 10h ret @@ -98,12 +100,14 @@ scr_puthex4: jbe .num ; yes add al, 'A' - 10 ; convert to 'A'..'F' jmp .pout -.num: - add al, '0' ; convert to '0'..'9' -.pout: - mov ah, 0x0E + .num: + add al, '0' ; convert to '0'..'9' + .pout: + mov ah, 0x0e + mov bh, 0x00 + mov bl, 0x0f int 10h - ret + ret ; AL = byte -> print 2 hex digits scr_puthex8: diff --git a/src/drivers/gfx_cgam.asm b/src/drivers/gfx_cgam.asm index e2cfb37..c9081c1 100644 --- a/src/drivers/gfx_cgam.asm +++ b/src/drivers/gfx_cgam.asm @@ -172,13 +172,12 @@ cga_calc_addr: ; si le mode n'est pas transparent, la couleur de fond ; est l'inverse de la couleur du texte ; --------------------------------------------------------------------------- +; --- Définition des arguments --- +%define .mode word [bp+4] cga_set_writemode: push bp mov bp, sp - ; --- Définition des arguments --- - %define .mode word [bp+4] - push fs push ax mov ax, BDA_CUSTOM_SEG @@ -186,12 +185,13 @@ cga_set_writemode: mov ax, .mode - mov byte [fs:BDA_GFX + gfx.cur_mode], al + mov byte [fs:PTR_GFX + gfx.cur_mode], al pop ax pop fs leave ret +%undef .mode ; --------------------------------------------------------------------------- ; gfx_set_charpos (x,y) @@ -219,12 +219,12 @@ cga_set_charpos: mov cx, .x mov dx, .y - mov [fs:BDA_GFX + gfx.cur_x], cx - mov [fs:BDA_GFX + gfx.cur_y], dx + mov [fs:PTR_GFX + gfx.cur_x], cx + mov [fs:PTR_GFX + gfx.cur_y], dx mov ax, cx and ax, 0x07 - mov [fs:BDA_GFX + gfx.cur_shift], al + mov [fs:PTR_GFX + gfx.cur_shift], al ; calcul de l'offset de la position 'x,y': ; si 'y' est paire, DI < 0x2000 & add = 0x2000 @@ -247,8 +247,8 @@ cga_set_charpos: neg ax add ax, CGA_STRIDE .even: - mov [fs:BDA_GFX + gfx.cur_line_ofs], ax - mov [fs:BDA_GFX + gfx.cur_offset], bx + mov [fs:PTR_GFX + gfx.cur_line_ofs], ax + mov [fs:PTR_GFX + gfx.cur_offset], bx pop fs @@ -323,10 +323,10 @@ cga_putc: call get_glyph_offset ; Base offset VRAM pour la scanline Y - mov di, [fs:BDA_GFX + gfx.cur_offset] - mov bx, [fs:BDA_GFX + gfx.cur_line_ofs] - mov ch, [fs:BDA_GFX + gfx.cur_mode] - mov cl, [fs:BDA_GFX + gfx.cur_shift] + mov di, [fs:PTR_GFX + gfx.cur_offset] + mov bx, [fs:PTR_GFX + gfx.cur_line_ofs] + mov ch, [fs:PTR_GFX + gfx.cur_mode] + mov cl, [fs:PTR_GFX + gfx.cur_shift] mov .cpt, 4 @@ -391,8 +391,8 @@ cga_putc: jnz .row_loop ; Avancer curseur d'un caractère (8 pixels) - inc word [fs:BDA_GFX + gfx.cur_offset] - add word [fs:BDA_GFX + gfx.cur_x], 8 + inc word [fs:PTR_GFX + gfx.cur_offset] + add word [fs:PTR_GFX + gfx.cur_x], 8 call cga_mouse_show ; Restauration souris @@ -1272,10 +1272,10 @@ cga_mouse_hide: mov ds, ax ; Décrémenter le compteur - dec byte [BDA_MOUSE + mouse.cur_counter] + dec byte [PTR_MOUSE + mouse.cur_counter] ; Vérifier si on vient juste de passer en mode caché (c-à-d on est à -1) - cmp byte [BDA_MOUSE + mouse.cur_counter], -1 + cmp byte [PTR_MOUSE + mouse.cur_counter], -1 jne .skip_restore ; Si on est à -2, -3... elle est déjà cachée call cga_cursor_restorebg @@ -1300,10 +1300,10 @@ cga_mouse_show: mov ds, ax ; Incrémenter le compteur - inc byte [BDA_MOUSE + mouse.cur_counter] + inc byte [PTR_MOUSE + mouse.cur_counter] ; Vérifier si on est revenu à 0 (Visible) - cmp byte [BDA_MOUSE + mouse.cur_counter], 0 + cmp byte [PTR_MOUSE + mouse.cur_counter], 0 jne .skip_draw ; Si on est encore à -1, -2... on reste caché ; C'est la transition Caché -> Visible : On affiche le curseur @@ -1331,13 +1331,13 @@ cga_mouse_cursor_move: mov ax, BDA_CUSTOM_SEG mov ds, ax - cmp byte [BDA_MOUSE + mouse.cur_counter], 0 + cmp byte [PTR_MOUSE + mouse.cur_counter], 0 jl .done ; Si < 0, on ne dessine rien ! - cmp byte [BDA_MOUSE + mouse.cur_drawing],0 + cmp byte [PTR_MOUSE + mouse.cur_drawing],0 jne .done - mov byte [BDA_MOUSE + mouse.cur_drawing],1 + mov byte [PTR_MOUSE + mouse.cur_drawing],1 mov ax, VIDEO_SEG mov es, ax @@ -1347,7 +1347,7 @@ cga_mouse_cursor_move: call cga_cursor_savebg call cga_cursor_draw - mov byte [BDA_MOUSE + mouse.cur_drawing],0 + mov byte [PTR_MOUSE + mouse.cur_drawing],0 .done: pop es pop ds @@ -1360,7 +1360,7 @@ cga_mouse_cursor_move: ; Stocke 16 DWORDs: chaque DWORD contient les 4 bytes de la ligne ; ------------------------------------------------------------ cga_cursor_savebg: - cmp byte [BDA_MOUSE + mouse.bkg_saved], 0 ; le buffer n'a pas encore été restauré + cmp byte [PTR_MOUSE + mouse.bkg_saved], 0 ; le buffer n'a pas encore été restauré jne .done push es @@ -1368,16 +1368,16 @@ cga_cursor_savebg: mov es, ax ; mémoriser position courante (utilisée pour restore) - mov cx, [BDA_MOUSE + mouse.x] - mov dx, [BDA_MOUSE + mouse.y] - mov [BDA_MOUSE + mouse.cur_x], cx - mov [BDA_MOUSE + mouse.cur_y], dx + mov cx, [PTR_MOUSE + mouse.x] + mov dx, [PTR_MOUSE + mouse.y] + mov [PTR_MOUSE + mouse.cur_x], cx + mov [PTR_MOUSE + mouse.cur_y], dx ; calcule ES:DI pour (x,y) call cga_calc_addr - mov [BDA_MOUSE + mouse.cur_addr_start], di - lea si, [BDA_MOUSE + mouse.bkg_buffer] + mov [PTR_MOUSE + mouse.cur_addr_start], di + lea si, [PTR_MOUSE + mouse.bkg_buffer] mov cx,16 @@ -1398,7 +1398,7 @@ cga_cursor_savebg: pop es .done: - mov byte [BDA_MOUSE + mouse.bkg_saved], 1 ; Flag mis à jour après la copie + mov byte [PTR_MOUSE + mouse.bkg_saved], 1 ; Flag mis à jour après la copie ret ; ------------------------------------------------------------ @@ -1406,7 +1406,7 @@ cga_cursor_savebg: ; Restaure 16 lignes sauvegardées. ; ------------------------------------------------------------ cga_cursor_restorebg: - cmp byte [BDA_MOUSE + mouse.bkg_saved], 0 + cmp byte [PTR_MOUSE + mouse.bkg_saved], 0 je .done push es @@ -1414,8 +1414,8 @@ cga_cursor_restorebg: mov es, ax ; restaurer depuis la dernière position sauvegardée - mov di, [BDA_MOUSE + mouse.cur_addr_start] - lea si, [BDA_MOUSE + mouse.bkg_buffer] + mov di, [PTR_MOUSE + mouse.cur_addr_start] + lea si, [PTR_MOUSE + mouse.bkg_buffer] mov cx, 16 .row_loop: @@ -1434,18 +1434,20 @@ cga_cursor_restorebg: pop es .done: - mov byte [BDA_MOUSE + mouse.bkg_saved], 0 ; Flag mis à jour après la restauration + mov byte [PTR_MOUSE + mouse.bkg_saved], 0 ; Flag mis à jour après la restauration ret ; ============================================================ ; cga_cursor_draw ; Détruit: registres sauvegardés/restaurés (PUSHA/POPA) ; ============================================================ -%define .height word [bp-2] -%define .mask dword [bp-6] cga_cursor_draw: push bp mov bp, sp + + ; variables + %define .height word [bp-2] + %define .mask dword [bp-6] sub sp, 6 ; Reserve space for locals pushad @@ -1460,7 +1462,7 @@ cga_cursor_draw: mov es, ax ; --- CLIPPING VERTICAL --- - mov dx, [ds:BDA_MOUSE + mouse.y] + mov dx, [ds:PTR_MOUSE + mouse.y] mov bx, GFX_HEIGHT cmp dx, bx jae .exit_total @@ -1478,7 +1480,7 @@ cga_cursor_draw: ; X est en bits (0-639). X >> 3 donne l'octet de départ (0-79). ; Si StartByte >= 77, on déborde. - mov cx, [BDA_MOUSE + mouse.x] + mov cx, [PTR_MOUSE + mouse.x] shr cx, 3 ; CX = Byte Offset (0-79) xor esi, esi ; ESI = Masque de protection (0 = tout dessiner) @@ -1508,17 +1510,17 @@ cga_cursor_draw: mov .mask, esi ; --- ADRESSAGE --- - mov cx, [BDA_MOUSE + mouse.x] - mov dx, [BDA_MOUSE + mouse.y] + mov cx, [PTR_MOUSE + mouse.x] + mov dx, [PTR_MOUSE + mouse.y] call cga_calc_addr ; DI = Offset VRAM - mov ax, [BDA_MOUSE + mouse.cur_seg] + mov ax, [PTR_MOUSE + mouse.cur_seg] mov gs, ax - mov si, [BDA_MOUSE + mouse.cur_ofs] + mov si, [PTR_MOUSE + mouse.cur_ofs] ; --- CALCUL de l'offset entre 2 lignes +0x2000 ou -0x2000 --- mov ax, 0x2000 ; Banque +1 - mov cx, [BDA_MOUSE + mouse.y] + mov cx, [PTR_MOUSE + mouse.y] test cx, 1 jz .setup_done neg ax ; banque -1 @@ -1529,28 +1531,20 @@ cga_cursor_draw: .row_loop: ; --- CONSTRUCTION DES MASQUES (EAX/EBX) --- push cx ; préserver la banque "suivante" - mov cl, [BDA_MOUSE + mouse.x] + mov cl, [PTR_MOUSE + mouse.x] and cl, 0x07 ; --- MASQUE AND (EAX) --- - mov eax, 0xFFFFFFFF mov ax, [gs:si] ; masque AND - xchg al, ah ; Redresser pour l'ordre des pixels CGA - ;bswap eax ; equivalence i386+ - xchg ah, al ; Échange les octets de poids faible (AL <-> AH) rol eax, 16 ; Bascule les 16 bits de poids fort vers le bas + mov ax, 0xFFFF xchg ah, al ; Échange les nouveaux octets de poids faible - ; fin bswap eax equivalence i386+ - ror eax, cl - or eax, .mask ; Force les bits clippés à 1 (garde le fond) ; --- MASQUE XOR (EBX) --- xor ebx, ebx mov bx, [gs:si+32] ; masque XOR - ;xchg bl, bh - ;bswap ebx rol ebx, 16 xchg bh, bl ror ebx, cl diff --git a/src/drivers/gfx_vga.asm b/src/drivers/gfx_vga.asm index b7d62eb..609f340 100644 --- a/src/drivers/gfx_vga.asm +++ b/src/drivers/gfx_vga.asm @@ -28,6 +28,7 @@ %define GFX_MODE 0x12 ; VGA HiRes (640x480x16) %define GFX_WIDTH 640 %define GFX_HEIGHT 480 +%define GFX_OFFSET 80 ; ; bit : descr ; 0 : text color : 0=black, 1=white @@ -74,7 +75,6 @@ %define MOUSE_HIDE 11 %define MOUSE_SHOW 12 %define MOUSE_MOVE 13 -%define MOUSE_DRAW 14 ; ------------------------------------------------------------ ; COMMENTAIRE SUR LA MÉTHODE D'APPEL @@ -91,10 +91,10 @@ graph_driver: dw vga_init ; init de la carte graphique dw vga_putpixel ; dessin d'un pixel dw vga_none ; lecture d'un pixel - dw vga_none ; gotoxy - dw vga_none ; mode texte - dw vga_none ; dessin d'un caractère - dw vga_none ; dessin d'une chaine de caractère + dw vga_set_charpos ; gotoxy + dw vga_set_writemode ; mode texte + dw vga_putc ; dessin d'un caractère + dw vga_write ; dessin d'une chaine de caractère dw vga_none ; dessin d'une ligne (Bresenham) avec décision horizontale/verticale dw vga_none ; dessin d'un rectangle dw vga_none ; dessin d'un rectangle plein @@ -102,7 +102,6 @@ graph_driver: dw vga_mouse_hide ; cache la souris dw vga_mouse_show ; montre la souris dw vga_mouse_cursor_move ; déplacement du curseur - dw vga_cursor_draw ; ------------------------------------------------------------ ; dummy function @@ -116,7 +115,7 @@ vga_none: ; ------------------------------------------------------------ ; initialise le mode graphique (via l'int 10h) ; -; ce mode est entrelacé, un bit/pixel, 8 pixels par octet +; ce mode est divisé en bitplane; 4 bits/pixel, 8 pixels par octet ; ------------------------------------------------------------ vga_init: ; init graphics mode @@ -132,7 +131,6 @@ vga_init: PATTERN_PTR PATTERN_GRAY_LIGHT mov bl, 15 call vga_background - ISADBG ISA_GREEN, 0x88 ret ; ------------------------------------------------------------ @@ -190,7 +188,7 @@ vga_background: ; Boucle principale (480 lignes) xor edx, edx ; EDX servira d'index pour le pattern (0-7) - mov ecx, 480 + mov ecx, GFX_HEIGHT .line_loop: mov al, [esi + edx] ; Charger l'octet du pattern pour la ligne actuelle @@ -221,6 +219,259 @@ vga_background: ; popad ret + +; --------------------------------------------------------------------------- +; gfx_set_writemode (mode) +; Défini le mode d'écriture : +; +; bit : descr +; 0 : text color : 0=black, 1=white +; 1 : transparent : 1=apply background attribut +; +; si le mode n'est pas transparent, la couleur de fond +; est l'inverse de la couleur du texte +; --------------------------------------------------------------------------- +; --- Définition des arguments --- +%define .mode word [bp+4] +vga_set_writemode: + push bp + mov bp, sp + + push fs + push ax + mov ax, BDA_CUSTOM_SEG + mov fs,ax + + mov ax, .mode + + mov byte [fs:PTR_GFX + gfx.cur_mode], al + + pop ax + pop fs + leave + ret +%undef .mode + +; --------------------------------------------------------------------------- +; gfx_set_charpos (x,y) +; In : CX = x (pixels), DX = y (pixels) +; Out: variables DS:GFX_CUR_* +; Notes: +; - calcule l'offset VRAM de la scanline y: base = (y&1?2000:0) + (y>>1)*80 + (x>>3) +; - stocke aussi shift = x&7 +; --------------------------------------------------------------------------- +; --- Définition des arguments --- +%define .x word [bp+4] +%define .y word [bp+6] +vga_set_charpos: + push bp + mov bp, sp + + pusha + push fs + + mov ax,BDA_CUSTOM_SEG + mov fs,ax + + ; store x,y en pixel + mov cx, .x + mov dx, .y + + mov [fs:PTR_GFX + gfx.cur_x], cx + mov [fs:PTR_GFX + gfx.cur_y], dx + + mov ax, cx + and ax, 0x07 + mov [fs:PTR_GFX + gfx.cur_shift], al + + call vga_calc_addr + + mov [fs:PTR_GFX + gfx.cur_offset], bx + pop fs + + popa + leave + ret +; clean defs +%undef .x +%undef .y + +; --------------------------------------------------------------------------- +; get_glyph_offset +; In : AL = char (ASCII) +; Out: CS:SI -> 8 bytes +; --------------------------------------------------------------------------- +get_glyph_offset: + cmp al, 0x20 + jb .qmark ; al < 20h (' ' + cmp al, 0x7E + ja .qmark ; al > 7Eh ('~') + sub al, 0x20 + jmp .ok + + .qmark: + mov al, '?' + sub al, 0x20 + + .ok: + xor ah, ah + mov si, ax + shl si, 3 + add si, font8x8 + ret + +; --------------------------------------------------------------------------- +; cga_putc_unalign (car) +; - x non aligné (x&7 != 0) +; - écrit sur 2 bytes (di et di+1) dans chaque banque +; --------------------------------------------------------------------------- +; convert al -> AX aligned with "cl" +%macro ALIGN_BYTE 0 + mov ah,al + xor al,al + shr ax,cl + xchg ah,al +%endmacro + +; --- Définition des arguments --- +%define .car word [bp+4] +vga_putc: + push bp + mov bp, sp + ; --- Définition des variables locales --- + %define .cpt word [bp-2] + sub sp, 2 ; 1 word variable locale + + pusha + push fs + push es + + call vga_mouse_hide ; Protection souris + + mov bx, VIDEO_SEG + mov es, bx + mov bx, BDA_CUSTOM_SEG + mov fs, bx + + mov ax, .car + call get_glyph_offset + + ; Base offset VRAM pour la scanline Y + mov di, [fs:PTR_GFX + gfx.cur_offset] + mov ch, [fs:PTR_GFX + gfx.cur_mode] + mov cl, [fs:PTR_GFX + gfx.cur_shift] + mov bx, GFX_OFFSET + + mov .cpt, 4 + + .row_loop: + ; gestion du fond de texte + test ch, 00000010b ; transparent background ? + jz .skip_attribut ; oui + + test ch, 00000001b ; background blanc ? + je .bkg_black + + ; background = white + mov ax, 0xFF00 + shr ax, cl + xchg al, ah + or [es:di], ax + or [es:di+bx], ax + jmp .skip_attribut + + .bkg_black: ; OK + ; background = black + mov ax, 0xFF00 + shr ax, cl + xchg al, ah + not ax + and [es:di], ax + and [es:di+bx], ax + + .skip_attribut: + ; ligne "paire" du gylphe + xor ax, ax + mov al, [cs:si] + inc si + ALIGN_BYTE + mov dx, ax + + ; ligne "impaire" du gylphe + mov al, [cs:si] + inc si + ALIGN_BYTE + xchg ax, dx + + test ch,00000001b + jz .black_text + + ; white text + not ax + not dx + and [es:di], ax + and [es:di+bx], dx + + jmp .next + + .black_text: + or [es:di], ax + or [es:di+bx], dx + + .next: + ; add di,CGA_STRIDE + + dec .cpt + jnz .row_loop + + ; Avancer curseur d'un caractère (8 pixels) + inc word [fs:PTR_GFX + gfx.cur_offset] + add word [fs:PTR_GFX + gfx.cur_x], 8 + + call vga_mouse_show ; Restauration souris + + pop es + pop fs + popa + leave + ret +%undef .car +%undef .cpt + +; +; write string from [DS:SI] to screen +; +; --- Définition des arguments --- +%define .txt_seg word [bp+4] +%define .txt_ofs word [bp+6] +vga_write: + push bp + mov bp, sp + push ax + push ds + + mov ax, .txt_seg + mov ds, ax + mov si, .txt_ofs + cld + + .loops: + lodsb + cmp al,0 + je .done + push ax + call vga_putc + jmp .loops + + .done: + pop ds + pop ax + leave + ret +%undef .txt_seg +%undef .txt_ofs + + ; Entrée: AX = X (0-639), BX = Y (0-479), CL = Couleur (0-15) %define .x word [bp+4] %define .y word [bp+6] @@ -302,10 +553,10 @@ vga_mouse_hide: mov ds, ax ; Décrémenter le compteur - dec byte [BDA_MOUSE + mouse.cur_counter] + dec byte [PTR_MOUSE + mouse.cur_counter] ; Vérifier si on vient juste de passer en mode caché (c-à-d on est à -1) - cmp byte [BDA_MOUSE + mouse.cur_counter], -1 + cmp byte [PTR_MOUSE + mouse.cur_counter], -1 jne .skip_restore ; Si on est à -2, -3... elle est déjà cachée call vga_cursor_restorebg @@ -330,10 +581,10 @@ vga_mouse_show: mov ds, ax ; Incrémenter le compteur - inc byte [BDA_MOUSE + mouse.cur_counter] + inc byte [PTR_MOUSE + mouse.cur_counter] ; Vérifier si on est revenu à 0 (Visible) - cmp byte [BDA_MOUSE + mouse.cur_counter], 0 + cmp byte [PTR_MOUSE + mouse.cur_counter], 0 jne .skip_draw ; Si on est encore à -1, -2... on reste caché ; C'est la transition Caché -> Visible : On affiche le curseur @@ -361,18 +612,18 @@ vga_mouse_cursor_move: mov ax, BDA_CUSTOM_SEG mov ds, ax - cmp byte [BDA_MOUSE + mouse.cur_counter], 0 + cmp byte [PTR_MOUSE + mouse.cur_counter], 0 jl .done ; Si < 0, on ne dessine rien ! - cmp byte [BDA_MOUSE + mouse.cur_drawing],0 + cmp byte [PTR_MOUSE + mouse.cur_drawing],0 jne .done - mov byte [BDA_MOUSE + mouse.cur_drawing],1 + mov byte [PTR_MOUSE + mouse.cur_drawing],1 call vga_cursor_restorebg call vga_cursor_savebg call vga_cursor_draw - mov byte [BDA_MOUSE + mouse.cur_drawing],0 + mov byte [PTR_MOUSE + mouse.cur_drawing],0 .done: pop es pop ds @@ -382,7 +633,7 @@ vga_mouse_cursor_move: ; Buffer requis : 192 octets (16 lignes * 3 octets * 4 plans) ; ATTENTION : Vérifiez que mouse.bkg_buffer dans bda.asm est assez grand ! vga_cursor_savebg: - cmp byte [BDA_MOUSE + mouse.bkg_saved], 0 + cmp byte [PTR_MOUSE + mouse.bkg_saved], 0 jne .done push es @@ -390,12 +641,12 @@ vga_cursor_savebg: mov es, ax ; Calculer l'adresse de départ (y * 80 + x / 8) - mov cx, [BDA_MOUSE + mouse.x] - mov dx, [BDA_MOUSE + mouse.y] + mov cx, [PTR_MOUSE + mouse.x] + mov dx, [PTR_MOUSE + mouse.y] call vga_calc_addr ; Doit retourner DI = offset VRAM - mov [BDA_MOUSE + mouse.cur_addr_start], di + mov [PTR_MOUSE + mouse.cur_addr_start], di - lea si, [BDA_MOUSE + mouse.bkg_buffer] + lea si, [PTR_MOUSE + mouse.bkg_buffer] mov dx, EGAVGA_CONTROLLER ; Graphics Controller Port mov al, 0x04 ; Read Plane Select Register @@ -429,20 +680,20 @@ vga_cursor_savebg: out dx, ax pop es - mov byte [BDA_MOUSE + mouse.bkg_saved], 1 + mov byte [PTR_MOUSE + mouse.bkg_saved], 1 .done: ret vga_cursor_restorebg: - cmp byte [BDA_MOUSE + mouse.bkg_saved], 0 + cmp byte [PTR_MOUSE + mouse.bkg_saved], 0 je .done push es mov ax, VIDEO_SEG mov es, ax - mov di, [BDA_MOUSE + mouse.cur_addr_start] - lea si, [BDA_MOUSE + mouse.bkg_buffer] + mov di, [PTR_MOUSE + mouse.cur_addr_start] + lea si, [PTR_MOUSE + mouse.bkg_buffer] ; Sécurité : S'assurer que ES pointe bien vers la vidéo pour le restore mov ax, VIDEO_SEG @@ -490,7 +741,7 @@ vga_cursor_restorebg: out dx, ax pop es - mov byte [BDA_MOUSE + mouse.bkg_saved], 0 + mov byte [PTR_MOUSE + mouse.bkg_saved], 0 .done: ret @@ -498,13 +749,16 @@ vga_cursor_restorebg: ; vga_cursor_draw ; Détruit: registres sauvegardés/restaurés (PUSHA/POPA) ; ============================================================ +%define BYTES_SHIFT 3 + vga_cursor_draw: push bp mov bp, sp - sub sp, 4 ; [bp-2]: height, [bp-4]: x_bit_offset - ; local variables - %define .height word [bp-2] - %define .bit_ofs word [bp-4] + ; local variables + %define .height word [bp-2] + %define .bit_ofs word [bp-4] + %define .mask dword [bp-6] + sub sp, 8 ; [bp-2]: height, [bp-4]: x_bit_offset pushad push ds @@ -519,7 +773,7 @@ vga_cursor_draw: mov es, ax ; --- CLIPPING VERTICAL --- - mov dx, [BDA_MOUSE + mouse.y] + mov dx, [PTR_MOUSE + mouse.y] mov bx, GFX_HEIGHT cmp dx, bx jae .exit_total @@ -533,8 +787,41 @@ vga_cursor_draw: .y_ok: mov .height, ax + ; --- CLIPPING HORIZONTAL --- + ; On calcule si les 4 octets vont dépasser la ligne (80 octets) + ; X est en bits (0-639). X >> 3 donne l'octet de départ (0-79). + ; Si StartByte >= 77, on déborde. + + mov cx, [PTR_MOUSE + mouse.x] + shr cx, 3 ; CX = Byte Offset (0-79) + xor eax, eax ; ESI = Masque de protection (0 = tout dessiner) + + cmp cx, 76 ; 76 est le dernier offset sûr (76,77,78,79) + jbe .mask_ready ; Si <= 76, pas de débordement + + ; Calcul du débordement + ; Si CX=77 (Déborde 1 byte) -> Masque 0x000000FF (LSB car bswap) + ; Si CX=78 (Déborde 2 bytes)-> Masque 0x0000FFFF + ; Si CX=79 (Déborde 3 bytes)-> Masque 0x00FFFFFF + cmp cx, 77 + jne .check_78 + mov eax, 0x000000FF + jmp .mask_ready + + .check_78: + cmp cx, 78 + jne .check_79 + mov eax, 0x0000FFFF + jmp .mask_ready + + .check_79: + mov eax, 0x00FFFFFF ; Cas extrême (bord droit) + + .mask_ready: + mov .mask, eax + ; --- Calcul Adresse et Shift --- - mov ax, [BDA_MOUSE + mouse.x] + mov ax, [PTR_MOUSE + mouse.x] mov cx, ax and ax, 7 ; Reste (0-7) = décalage de bit mov .bit_ofs, ax @@ -545,7 +832,7 @@ vga_cursor_draw: mov ax, 0x0F02 ; Map Mask = All planes out dx, ax - mov dx, 0x3CE ; Graphics Controller + mov dx, EGAVGA_CONTROLLER mov ax, 0x0005 ; Mode 0 out dx, ax mov ax, 0x0001 ; Enable Set/Reset = 0 (CPU Data) @@ -554,53 +841,65 @@ vga_cursor_draw: out dx, ax ; Source du Sprite -> (GS:SI) - mov ax, [BDA_MOUSE + mouse.cur_seg] + mov ax, [PTR_MOUSE + mouse.cur_seg] mov gs, ax - mov si, [BDA_MOUSE + mouse.cur_ofs] + mov si, [PTR_MOUSE + mouse.cur_ofs] .row_loop: - ; --- PREPARE MASKS --- - ; On récupère le masque de l'image (AND) et du curseur (XOR) - mov ax, [gs:si] ; AX = AND Mask (16 bits) - xchg al, ah ; Souvent nécessaire selon l'endianness du sprite - xor ebx, ebx - mov bx, ax - not ebx ; On veut des 1 partout sauf là où le curseur est présent - - ; Décalage pour l'alignement au pixel près - mov cx, .bit_ofs - ror ebx, cl ; Rotation pour ne pas perdre de bits - - ; --- CONFIG VGA POUR AND --- - mov dx, 0x3CE + mov dx, EGAVGA_CONTROLLER mov ax, 0x0803 ; Data Rotate/Function Select: AND (bits 3-4 = 01b) out dx, ax - ; Application sur 3 octets (pour couvrir les 16 pixels + le shift) - %rep 3 - mov al, [es:di] ; CHARGE LES LATCHES (Indispensable) - mov eax, ebx - shr eax, 16 ; Récupère la partie haute (si 32-bit shift utilisé) - stosb ; Écrit AL et DI++ (Applique le AND sur les 4 plans) - %endrep - sub di, 3 ; Revient au début de la ligne pour le XOR + ; --- PASSE 1 : MASQUE AND (Effacement du fond) --- + mov ax, [gs:si] ; Charger 16 pixels (0=curseur, 1=fond) + shl eax, 16 ; décalage de AX vers le poid for: XXXX0000 + mov ax, 0xFFFF + mov cx, .bit_ofs + ror eax, cl ; Décaler : 1 là où on veut effacer (0 ailleurs) + or eax, .mask ; Appliquer le masque de clipping à droite + + + mov ebx, eax ; EBX contient le masque AND sur 3 octets + mov cx, BYTES_SHIFT ; Appliquer sur 3 octets (24 pixels potentiels) + .block_AND: + mov al, [es:di] ; Charger les latches VGA + rol ebx, 8 ; Extraire l'octet suivant (poids fort d'abord) + mov al, bl + stosb ; Écrire et DI++ + loop .block_AND + sub di, BYTES_SHIFT ; Revenir au début de la ligne pour le XOR - ; --- CONFIG VGA POUR XOR --- mov ax, 0x1803 ; Data Rotate/Function Select: XOR (bits 3-4 = 11b) out dx, ax - ; Récupération du masque XOR (la forme blanche/noire du curseur) - mov ax, [gs:si+32] - ; ... (Appliquer le même décalage et stosb que pour le AND) ... + ; --- PASSE 2 : MASQUE XOR (Dessin du curseur) --- + xor eax, eax + mov ax, [gs:si+32] ; Charger 16 pixels (1=blanc, 0=transparent) + movzx eax, ax ; S'assurer que le reste est à 0 + shl eax, 16 ; Aligner + mov cx, .bit_ofs + shr eax, cl ; Décaler (les bits de padding restent à 0) + mov ebx, .mask ; Appliquer le masque de clipping à droite + not ebx + and eax, ebx ; Appliquer le masque de clipping à droite + + mov ebx, eax ; EBX contient le masque XOR sur 3 octets + mov cx, BYTES_SHIFT + .block_XOR: + mov al, [es:di] ; Charger les latches + rol ebx, 8 + mov al, bl + stosb + loop .block_XOR ; --- NEXT ROW --- - add di, 80 - 3 ; Ligne suivante (80 octets par ligne) + add di, 80 - BYTES_SHIFT ; Ligne suivante en VRAM (80 octets/ligne) add si, 2 dec word .height jnz .row_loop ; --- RESTORE VGA --- - mov dx, 0x3CE + mov dx, EGAVGA_CONTROLLER mov ax, 0x0003 ; Function = Replace out dx, ax mov ax, 0xFF08 ; Bit Mask = 0xFF @@ -614,6 +913,8 @@ vga_cursor_draw: pop ds popad leave + %undef .height + %undef .bit_ofs + %undef .mask ret -%undef .height -%undef .mask + diff --git a/src/drivers/mouse_ps2.asm b/src/drivers/mouse_ps2.asm index fad7943..38e2a9f 100644 --- a/src/drivers/mouse_ps2.asm +++ b/src/drivers/mouse_ps2.asm @@ -47,28 +47,28 @@ mouse_reset: mov fs,ax ; effacer les variables du drivers - mov byte [fs:BDA_MOUSE + mouse.idx],0 - mov dword [fs:BDA_MOUSE + mouse.buffer],0 - mov byte [fs:BDA_MOUSE + mouse.packetlen],3 ; 3 bytes par défaut - mov byte [fs:BDA_MOUSE + mouse.status],0 + mov byte [fs:PTR_MOUSE + mouse.idx],0 + mov dword [fs:PTR_MOUSE + mouse.buffer],0 + mov byte [fs:PTR_MOUSE + mouse.packetlen],3 ; 3 bytes par défaut + mov byte [fs:PTR_MOUSE + mouse.status],0 - mov word [fs:BDA_MOUSE + mouse.x],GFX_WIDTH / 2 - mov word [fs:BDA_MOUSE + mouse.y],GFX_HEIGHT / 2 + mov word [fs:PTR_MOUSE + mouse.x],GFX_WIDTH / 2 + mov word [fs:PTR_MOUSE + mouse.y],GFX_HEIGHT / 2 - mov word [fs:BDA_MOUSE + mouse.cur_x], 0 - mov word [fs:BDA_MOUSE + mouse.cur_y], 0 + mov word [fs:PTR_MOUSE + mouse.cur_x], 0 + mov word [fs:PTR_MOUSE + mouse.cur_y], 0 - mov byte [BDA_MOUSE + mouse.cur_counter], -1 ; Force l'état caché au départ - mov byte [BDA_MOUSE + mouse.cur_drawing], 0 ; Reset du verrou de dessin - mov byte [BDA_MOUSE + mouse.bkg_saved],0 ; flag image saved + mov byte [fs:PTR_MOUSE + mouse.cur_counter], -1 ; Force l'état caché au départ + mov byte [fs:PTR_MOUSE + mouse.cur_drawing], 0 ; Reset du verrou de dessin + mov byte [fs:PTR_MOUSE + mouse.bkg_saved],0 ; flag image saved mov ax, cs - mov word [fs:BDA_MOUSE + mouse.cur_seg], ax - mov word [fs:BDA_MOUSE + mouse.cur_ofs], mouse_arrow + mov word [fs:PTR_MOUSE + mouse.cur_seg], ax + mov word [fs:PTR_MOUSE + mouse.cur_ofs], mouse_arrow ; experiemntal - mov byte [fs:BDA_MOUSE + mouse.wheel],0 + mov byte [fs:PTR_MOUSE + mouse.wheel],0 ret ; ------------------------------------------------------------ @@ -157,7 +157,7 @@ mouse_detect_packet_len: mov ax, BDA_CUSTOM_SEG mov fs,ax - mov byte [fs:BDA_MOUSE + mouse.packetlen], 3 + mov byte [fs:PTR_MOUSE + mouse.packetlen], 3 ; SET_RATE + 200 mov bl, MOUSE_SET_RATE @@ -188,7 +188,7 @@ mouse_detect_packet_len: je .is4 ret .is4: - mov byte [fs:BDA_MOUSE + mouse.packetlen], 4 + mov byte [fs:PTR_MOUSE + mouse.packetlen], 4 ret ; ------------------------------------------------------------ @@ -280,7 +280,7 @@ mouse_sendcmd: ; ------------------------------------------------------------ isr_mouse_handler: ; sauvegarder tout les registres - pusha + pushad push ds ; use BDA segment @@ -290,7 +290,7 @@ isr_mouse_handler: ; lire un octet depuis le contrôleur et le stocker dans le buffer in al, i8042_PS2_DATA ; lire octet souris - movzx bx, byte [BDA_MOUSE + mouse.idx] + movzx bx, byte [PTR_MOUSE + mouse.idx] cmp bl,0 jne .read_packet @@ -298,88 +298,88 @@ isr_mouse_handler: test al, 00001000b ; bit 3 = 1 jz .done_eoi ; allignement erroné -.read_packet: - mov byte [BDA_MOUSE + mouse.buffer + bx], al - inc byte [BDA_MOUSE + mouse.idx] + .read_packet: + mov byte [PTR_MOUSE + mouse.buffer + bx], al + inc byte [PTR_MOUSE + mouse.idx] ; vérifier si le packet est complet - mov al, [BDA_MOUSE + mouse.packetlen] - cmp byte [BDA_MOUSE + mouse.idx], al + mov al, byte [PTR_MOUSE + mouse.packetlen] + cmp byte [PTR_MOUSE + mouse.idx], al jb .done_eoi ; packet complet, on decode les données (ou on jette si c'est incorrect) - mov byte [BDA_MOUSE + mouse.idx], 0 ; reset de l'index de lecture + mov byte [PTR_MOUSE + mouse.idx], 0 ; reset de l'index de lecture ; debut du décodage des données - mov bl, [BDA_MOUSE + mouse.buffer] ; status + mov bl, byte [PTR_MOUSE + mouse.buffer] ; status ; --- BOUTONS --- - mov al,bl ; extraction des boutons + mov al, bl ; extraction des boutons and al, 00000111b ; Bits 0, 1, 2 = Gauche, Droite, Milieu - mov [BDA_MOUSE + mouse.status], al + mov [PTR_MOUSE + mouse.status], al xor ax,ax - mov al, byte [BDA_MOUSE + mouse.buffer+1] ; delta X - test bl,00010000b ; signe X (4eme bit) + mov al, byte [PTR_MOUSE + mouse.buffer+1] ; delta X + test bl, 00010000b ; signe X (4eme bit) jz .x_pos mov ah,0xff ; X est négatif -.x_pos: - add [BDA_MOUSE + mouse.x], ax + .x_pos: + add [PTR_MOUSE + mouse.x], ax xor ax,ax - mov al, byte [BDA_MOUSE + mouse.buffer+2] ; delta Y - test bl,00100000b ; signe Y (5eme bit) + mov al, byte [PTR_MOUSE + mouse.buffer+2] ; delta Y + test bl, 00100000b ; signe Y (5eme bit) jz .y_pos - mov ah,0xff ; y est négatif -.y_pos: - sub [BDA_MOUSE + mouse.y], ax + mov ah, 0xff ; y est négatif + .y_pos: + sub [PTR_MOUSE + mouse.y], ax ; --- CLAMPING X --- ; Check minimum (0) - cmp word [BDA_MOUSE + mouse.x], 0 + cmp word [PTR_MOUSE + mouse.x], 0 jge .check_x_max - mov word [BDA_MOUSE + mouse.x], 0 + mov word [PTR_MOUSE + mouse.x], 0 jmp .done_x -.check_x_max: + .check_x_max: ; Check maximum (e.g., 639 for graphics, or pixel width) - cmp word [BDA_MOUSE + mouse.x], GFX_WIDTH-1 ; Replace with variable or define + cmp word [PTR_MOUSE + mouse.x], GFX_WIDTH-1 ; Replace with variable or define jle .done_x - mov word [BDA_MOUSE + mouse.x], GFX_WIDTH-1 -.done_x: + mov word [PTR_MOUSE + mouse.x], GFX_WIDTH-1 + .done_x: ; --- CLAMPING Y --- ; Check minimum (0) - cmp word [BDA_MOUSE + mouse.y], 0 + cmp word [PTR_MOUSE + mouse.y], 0 jge .check_y_max - mov word [BDA_MOUSE + mouse.y], 0 + mov word [PTR_MOUSE + mouse.y], 0 jmp .done_y -.check_y_max: + .check_y_max: ; Check maximum - cmp word [BDA_MOUSE + mouse.y], GFX_HEIGHT-1 ; Replace with variable or define + cmp word [PTR_MOUSE + mouse.y], GFX_HEIGHT-1 ; Replace with variable or define jle .done_y - mov word [BDA_MOUSE + mouse.y], GFX_HEIGHT-1 -.done_y: + mov word [PTR_MOUSE + mouse.y], GFX_HEIGHT-1 + .done_y: ; check si il y a un 4eme byte a traiter - mov al, [BDA_MOUSE + mouse.packetlen] + mov al, [PTR_MOUSE + mouse.packetlen] cmp al,4 jne .done ; si packetlen = 4, gérer la molette; experimental et non fonctionnel - movsx ax, byte [BDA_MOUSE + mouse.buffer+3] ; delta Wheel - add word [BDA_MOUSE + mouse.wheel], ax + movsx ax, byte [PTR_MOUSE + mouse.buffer+3] ; delta Wheel + add word [PTR_MOUSE + mouse.wheel], ax -.done: + .done: ; update la position du curseur sur l'écran ; en ce moment c'est commented out (debug) ; call cga_mouse_cursor_move GFX MOUSE_MOVE -.done_eoi: + .done_eoi: mov al, 0x20 out i8259_SLAVE_CMD, al ; EOI PIC esclave out i8259_MASTER_CMD, al ; EOI PIC maître ; restaurer tous les registres pop ds - popa + popad iret \ No newline at end of file diff --git a/src/gui/lib-logic.asm b/src/gui/lib-logic.asm index 346a723..fff44eb 100644 --- a/src/gui/lib-logic.asm +++ b/src/gui/lib-logic.asm @@ -23,7 +23,7 @@ gui_process_all: push ds mov ax, BDA_CUSTOM_SEG mov ds, ax - mov bl, [BDA_MOUSE + mouse.status] + mov bl, [PTR_MOUSE + mouse.status] pop ds mov si, 0 ; Pointeur début tableau @@ -97,8 +97,8 @@ gui_update_logic: xor ax, ax ; les macros peuvent modifer les registres cx, dx & bx - mov cx, [BDA_MOUSE + mouse.x] - mov dx, [BDA_MOUSE + mouse.y] + mov cx, [PTR_MOUSE + mouse.x] + mov dx, [PTR_MOUSE + mouse.y] ; --- Hit Test --- cmp cx, [gs:si + widget.x] @@ -115,7 +115,7 @@ gui_update_logic: cmp dx, bx ja .miss ; mouse.y >= widget.y ? - mov bl, [BDA_MOUSE + mouse.status] + mov bl, [PTR_MOUSE + mouse.status] .case_0: cmp byte [gs:si + widget.type], OBJ_TYPE_LABEL @@ -437,7 +437,7 @@ gui_logic_slider: push ds mov ax, BDA_CUSTOM_SEG mov ds, ax - mov ax, [BDA_MOUSE + mouse.x] + mov ax, [PTR_MOUSE + mouse.x] pop ds sub ax, [gs:si + widget.attr_anchor] @@ -465,7 +465,7 @@ gui_logic_slider: push ds mov ax, BDA_CUSTOM_SEG mov ds, ax - mov ax, [BDA_MOUSE + mouse.y] + mov ax, [PTR_MOUSE + mouse.y] pop ds sub ax, [gs:si + widget.attr_anchor]