diff --git a/src/bda.asm b/src/bda.asm index 9cce339..36d3c4b 100644 --- a/src/bda.asm +++ b/src/bda.asm @@ -52,27 +52,26 @@ %define BDA_MOUSE 0x0000 struc mouse - .buffer resb 4 ; i8042 input buffer - .idx resb 1 ; index in the buffer - .packetlen resb 1 ; max buffer len (3 ou 4) + .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 + .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_oldx resw 1 - .cur_oldy resw 1 - .cur_newx resw 1 - .cur_newy resw 1 - .cur_visible resb 1 - .cur_seg resw 1 ; segment / offset of the pointer - .cur_ofs resw 1 - .cur_mask resb 1 ; pixels mask (bit per pixel) - .cur_bit_ofs resb 1 ; 0..7 bits d'offset (x&7) - .cur_bytes resb 1 ; byte 2 ou 3 bytes as source for cursor image - .bkg_saved resb 1 ; background saved - .bkg_buffer resb 48 ; buffer for saved background + .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_bank_add resw 1 ; + ou - 0x2000 + .cur_visible resb 1 + .cur_seg resw 1 ; segment / offset of the pointer + .cur_ofs resw 1 + .cur_mask resb 1 ; pixels mask (bit per pixel) + .cur_bit_ofs resb 1 ; 0..7 bits d'offset (x&7) + .bkg_saved resb 1 ; background saved + .bkg_buffer resb 16*3 ; buffer for saved background endstruc ; ----------------------------------------------------------------------------------- diff --git a/src/boot.asm b/src/boot.asm index 4b1bb3c..33838fd 100644 --- a/src/boot.asm +++ b/src/boot.asm @@ -93,12 +93,26 @@ reset: ; on active le mode graphique call gfx_init - ;call mouse_reset + ; call mouse_reset call mouse_init + + call gfx_cursor_move + endless: mov ax,BDA_DATA_SEG mov ds,ax +; mov ax, [BDA_MOUSE + mouse.x] +; add ax, 80 +; cmp ax,640 +; jb .moveok +; +; mov ax,0 +;.moveok: +; mov [BDA_MOUSE + mouse.x],ax +; +; call gfx_cursor_move + mov dx,0 call scr_gotoxy diff --git a/src/drivers/gfx_cgam.asm b/src/drivers/gfx_cgam.asm index bf65f60..4e5351a 100644 --- a/src/drivers/gfx_cgam.asm +++ b/src/drivers/gfx_cgam.asm @@ -37,13 +37,20 @@ ; Cette table doit être située au début du driver pour être ; accessible par la GUI à des offsets fixes. ; ------------------------------------------------------------ -gfx_api_table: + +%define INIT 0 +%define PUTPIXEL 3 +%define GETPIXEL 6 +%define MOUSE_UPDATE 9 + +gfx_api: jmp gfx_init ; Offset +0: Initialisation jmp gfx_putpixel ; Offset +3: Dessin pixel jmp gfx_getpixel ; Offset +6: Lecture pixel - jmp gfx_fill_rect ; Offset +9: Remplissage rectangle (Nouveau) - jmp gfx_invert_rect ; Offset +12: Inversion (Nouveau pour Menus) - jmp gfx_draw_hline ; Offset +15: Ligne horizontale rapide (Nouveau) + jmp gfx_cursor_move ; Offset +9: mouse update +; jmp gfx_fill_rect ; Remplissage rectangle (Nouveau) +; jmp gfx_invert_rect ; Offset +12: Inversion (Nouveau pour Menus) +; jmp gfx_draw_hline ; Offset +15: Ligne horizontale rapide (Nouveau) ; ------------------------------------------------------------ ; COMMENTAIRE SUR LA MÉTHODE D'APPEL @@ -211,12 +218,6 @@ gfx_cursor_calc_align: mov al, cl and al, 7 ; offset = x&7 mov byte [BDA_MOUSE + mouse.cur_bit_ofs], al - cmp al, 0 - jne .unaligned - mov byte [BDA_MOUSE + mouse.cur_bytes], 2 - ret -.unaligned: - mov byte [BDA_MOUSE + mouse.cur_bytes], 3 ret ; ------------------------------------------------------------ @@ -248,6 +249,28 @@ gfx_getpixel_fast: setnz al ret +gfx_cursor_move: + pusha + push ds + + ; move Data Segment + mov ax, BDA_DATA_SEG + mov ds, ax + + mov ax, VIDEO_SEG + mov es, ax + + call gfx_cursor_restorebg + + call gfx_cursor_savebg + + call gfx_cursor_draw + + pop ds + + popa + ret + ; ------------------------------------------------------------ ; Dessine le curseur 16x16 AND/XOR à [BDA_CURSOR_NEWX],[BDA_CURSOR_NEWY] ; @@ -255,7 +278,7 @@ gfx_getpixel_fast: ; Uses: BDA_CURSOR_BITOFF/BDA_CURSOR_BYTES (via gfx_cursor_calc_align) ; ------------------------------------------------------------ gfx_cursor_draw: - pusha + ; pusha mov ax, BDA_DATA_SEG mov ds, ax @@ -265,8 +288,8 @@ gfx_cursor_draw: mov ax, word [BDA_MOUSE + mouse.cur_ofs] mov si, ax - mov cx, word [BDA_MOUSE + mouse.cur_newx] - mov dx, word [BDA_MOUSE + mouse.cur_newy] + mov cx, word [BDA_MOUSE + mouse.x] + mov dx, word [BDA_MOUSE + mouse.y] ; calcule offset et bytes/ligne (2 ou 3) call gfx_cursor_calc_align @@ -310,7 +333,7 @@ gfx_cursor_draw: dec dh jnz .pair - popa + ; popa ret ; ------------------------------------------------------------ @@ -460,78 +483,51 @@ gfx_cursor_draw: ; utilise les variables du BDA pour stocker ; ------------------------------------------------------------ gfx_cursor_savebg: - pusha ; sauvegarde registres - - mov ax, BDA_DATA_SEG - mov ds, ax - - mov ax, VIDEO_SEG - mov es, ax - cmp byte [BDA_MOUSE + mouse.bkg_saved], 0 - jne .done ; déjà sauvé + jne .done ; ne pas sauver tant qu'il y a une image - mov cx, [BDA_MOUSE + mouse.x] + mov byte [BDA_MOUSE + mouse.bkg_saved], 1 ; image saved + + mov cx, [BDA_MOUSE + mouse.x] ; mov dx, [BDA_MOUSE + mouse.y] - mov byte [BDA_MOUSE + mouse.bkg_saved], 1 ; flag image saved + mov word [BDA_MOUSE + mouse.cur_x], cx ; sauvegarde la nouvelle position + mov word [BDA_MOUSE + mouse.cur_y], dx - mov word [BDA_MOUSE + mouse.cur_newx], cx ; sauvegarde la nouvelle position - mov word [BDA_MOUSE + mouse.cur_newy], dx - - call gfx_calc_addr ; ES:DI = byteaddr pour (X,Y) - mov dx,0x2000 ; offset pour lignes impaire + call gfx_calc_addr ; ES:DI = byteaddr pour (X,Y) + mov dx,0x2000 ; offset pour lignes impaire cmp di,dx jl .no_odd_bank - neg dx ; Y est déja une ligne impaire, on retire l'offset + neg dx ; Y est déja une ligne impaire, on retire l'offset .no_odd_bank: + mov ax, di ; préserver l'address de départ + mov word [BDA_MOUSE + mouse.cur_addr_start],ax + mov word [BDA_MOUSE + mouse.cur_bank_add], dx + mov ax, BDA_MOUSE + mouse.bkg_buffer - mov si, ax ; DS:SI = buffer de sauvegarde + mov si, ax ; DS:SI = buffer de sauvegarde mov bx, 8 - and cx,0x0007 ; alignement X - jnz .row3 - -.row3: ; sauve 3 bytes/ligne - mov byte [BDA_MOUSE + mouse.cur_bytes], 3 ; 3 bytes/ligne +.row: ; sauve 3 bytes/ligne ; ligne 'y', peut etre paire ou impaire - mov ax, word [es:di] ; charge first word - mov word [ds:si], ax ; sauvegarde - mov al, byte [es:di+2] ; charge 3ème byte + mov ax, word [es:di] ; charge first word + mov word [ds:si], ax ; sauvegarde + mov al, byte [es:di+2] ; charge 3ème byte mov byte [ds:si+2], al add si, 3 ; ligne 'y'+1; si paire +0x2000, si impaire -0x2000 - add di, dx ; charge first word other bank (+0x2000 ou -0x2000) + add di, dx ; charge first word other bank (+0x2000 ou -0x2000) mov ax, word [es:di] mov word [ds:si], ax mov al, byte [es:di+2] mov byte [ds:si+2], al add si, 3 sub di, dx - add di, CGA_STRIDE + add di, CGA_STRIDE * 2 dec bx - jnz .row3 - jmp .done - -.row2: ; sauve 2 bytes/ligne - mov byte [BDA_MOUSE + mouse.cur_bytes], 2 ; par défaut - ; ligne 'y', peut etre paire ou impaire - mov ax, word [es:di] ; charge first word - mov word [ds:si], ax ; sauvegarde - add si, 2 - - ; ligne 'y'+1; si paire +0x2000, si impaire -0x2000 - add di, dx ; charge first word other bank (+0x2000 ou -0x2000) - mov ax, word [es:di] - mov word [ds:si], ax - add si, 2 - sub di, dx - add di, CGA_STRIDE - dec bx - jnz .row3 + jnz .row .done: - popa ret ; ------------------------------------------------------------ @@ -540,72 +536,42 @@ gfx_cursor_savebg: ; utilise les variables du BDA pour stocker ; ------------------------------------------------------------ gfx_cursor_restorebg: - pusha ; sauvegarde registres - - mov ax, BDA_DATA_SEG - mov ds, ax - - mov ax, VIDEO_SEG - mov es, ax - - cmp byte [BDA_MOUSE + mouse.bkg_saved], 0 ; pas de background sauvé + cmp byte [BDA_MOUSE + mouse.bkg_saved], 0 ; pas de background sauvé je .done - mov cx,word [BDA_MOUSE + mouse.cur_oldx] ; restore de la position - mov dx,word [BDA_MOUSE + mouse.cur_oldy] - mov byte [BDA_MOUSE + mouse.bkg_saved], 0 ; le background a été restauré - - call gfx_calc_addr ; ES:DI = byteaddr pour (X,Y) - mov dx,0x2000 ; offset pour lignes impaire - cmp di,dx - jl .no_odd_bank - neg dx ; Y est déja une ligne impaire, on retire l'offset -.no_odd_bank: + mov cx,word [BDA_MOUSE + mouse.cur_x] ; restore de la position + mov dx,word [BDA_MOUSE + mouse.cur_y] + mov byte [BDA_MOUSE + mouse.bkg_saved], 0 ; le background a été restauré + mov ax, word [BDA_MOUSE + mouse.cur_addr_start] + mov di,ax + mov dx, word [BDA_MOUSE + mouse.cur_bank_add] + mov ax, BDA_MOUSE + mouse.bkg_buffer - mov si, ax ; DS:SI = buffer de sauvegarde - mov bx, 8 + mov si, ax ; DS:SI = buffer de sauvegarde + mov bx, 8 ; 16 lignes, mais nous traitons "en une fois" les paire/impaires - cmp byte [BDA_MOUSE + mouse.cur_bytes], 2 ; si la sauvegarde est en 2 bytes/ligne - je .row2 - -.row3: ; restore en 3 bytes/ligne +.row: ; restore en 3 bytes/ligne ; ligne 'y', peut etre paire ou impaire + mov ax,word [ds:si] ; recupère le 1er word + mov word [es:di],ax + mov al,byte [ds:si+2] ; charge 3ème byte + mov byte [es:di+2],al + add si, 3 + + ; ligne 'y'+1; si paire +0x2000, si impaire -0x2000 + add di, dx ; autre banque mémoire mov ax,word [ds:si] ; recupère le 1er word mov word [es:di],ax mov al,byte [ds:si+2] ; charge 3ème byte mov byte [es:di+2],al add si, 3 - ; ligne 'y'+1; si paire +0x2000, si impaire -0x2000 - add di, dx ; charge first word other bank (+0x2000 ou -0x2000) - mov ax,word [ds:si] ; recupère le 1er word - mov word [es:di],ax - mov al,byte [ds:si+2] ; charge 3ème byte - mov byte [es:di+2],al - add si, 3 - sub di, dx - add di, CGA_STRIDE + sub di, dx ; destination - bank + add di, CGA_STRIDE * 2 ; desination+=160 (on vient de faire 2 lignes) dec bx - jnz .row3 - jmp .done - -.row2: ; restore en 2 bytes/ligne - ; ligne 'y', peut etre paire ou impaire - mov ax,word [ds:si] ; recupère le 1er word - mov word [es:di],ax - add si, 2 - - ; ligne 'y'+1; si paire +0x2000, si impaire -0x2000 - add di, dx ; charge first word other bank (+0x2000 ou -0x2000) - mov ax,word [ds:si] ; recupère le 1er word - mov word [es:di],ax - add si, 2 - sub di, dx - add di, CGA_STRIDE - dec bx - jnz .row2 + jnz .row .done: - popa +; popa ret diff --git a/src/drivers/mouse_ps2.asm b/src/drivers/mouse_ps2.asm index 529e222..631006e 100644 --- a/src/drivers/mouse_ps2.asm +++ b/src/drivers/mouse_ps2.asm @@ -38,43 +38,7 @@ %define I8042_CMD_DIS_MOUSE 0xA7 %define I8042_CMD_WRITE_AUX 0xD4 - -%define CURSOR_W 16 -%define CURSOR_H 16 - -mouse_arrow: - dw 1001111111111111b ; 0x9FFF - dw 1000111111111111b ; 0x8FFF - dw 1000011111111111b ; 0x87FF - dw 1000001111111111b ; 0x83FF - dw 1000000111111111b ; 0x81FF - dw 1000000011111111b ; 0x80FF - dw 1000000001111111b ; 0x807F - dw 1000000000111111b ; 0x803F - dw 1000000000011111b ; 0x801F - dw 1000000000001111b ; 0x800F - dw 1000000011111111b ; 0x80FF - dw 1000100001111111b ; 0x887F - dw 1001100001111111b ; 0x987F - dw 1111110000111111b ; 0xFC3F - dw 1111110000111111b ; 0xFC3F - dw 1111111000111111b ; 0xFE3F - dw 0000000000000000b ; 0x0000 - dw 0010000000000000b ; 0x2000 - dw 0011000000000000b ; 0x3000 - dw 0011100000000000b ; 0x3800 - dw 0011110000000000b ; 0x3C00 - dw 0011111000000000b ; 0x3E00 - dw 0011111100000000b ; 0x3F00 - dw 0011111110000000b ; 0x3F80 - dw 0011111111000000b ; 0x3FC0 - dw 0011111000000000b ; 0x3E00 - dw 0011011000000000b ; 0x3600 - dw 0010001100000000b ; 0x2300 - dw 0000001100000000b ; 0x0300 - dw 0000000110000000b ; 0x0180 - dw 0000000110000000b ; 0x0180 - dw 0000000000000000b ; 0x0000 +%include "./services/cursor.asm" ; ------------------------------------------------------------ ; remise a zero des valeurs internes du "drivers" @@ -87,7 +51,7 @@ mouse_reset: ; 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 + mov byte [fs:BDA_MOUSE + mouse.packetlen],3 ; 3 bytes par défaut mov byte [fs:BDA_MOUSE + mouse.status],0 mov word [fs:BDA_MOUSE + mouse.x],320 ; vous pouvez aussi préciser le centre @@ -97,8 +61,8 @@ mouse_reset: mov word [fs:BDA_MOUSE + mouse.wheel],0 mov byte [fs:BDA_MOUSE + mouse.cur_visible], 1 - mov word [fs:BDA_MOUSE + mouse.cur_oldx], 0 - mov word [fs:BDA_MOUSE + mouse.cur_oldy], 0 + mov word [fs:BDA_MOUSE + mouse.cur_x], 0 + mov word [fs:BDA_MOUSE + mouse.cur_y], 0 mov ax, cs mov word [fs:BDA_MOUSE + mouse.cur_seg], ax @@ -351,16 +315,18 @@ isr_mouse_handler: mov al, [BDA_MOUSE + mouse.buffer] ; status mov [BDA_MOUSE + mouse.status], al - mov al, [BDA_MOUSE + mouse.buffer+1] ; delta X + xor ax,ax + mov al, byte [BDA_MOUSE + mouse.buffer+1] ; delta X cbw add [BDA_MOUSE + mouse.x], ax - mov al, [BDA_MOUSE + mouse.buffer+2] ; delta Y + xor ax,ax + mov al, byte [BDA_MOUSE + mouse.buffer+2] ; delta Y cbw sub [BDA_MOUSE + mouse.y], ax ; si packetlen = 4, gérer la molette; experimental - mov al, [BDA_MOUSE + mouse.buffer+3] ; delta Wheel + movsx ax, byte [BDA_MOUSE + mouse.buffer+3] ; delta Wheel cbw add word [BDA_MOUSE + mouse.wheel], ax diff --git a/src/services/cursor.asm b/src/services/cursor.asm new file mode 100644 index 0000000..1ada67f --- /dev/null +++ b/src/services/cursor.asm @@ -0,0 +1,38 @@ + + +%define CURSOR_W 16 +%define CURSOR_H 16 + +mouse_arrow: + dw 1001111111111111b ; 0x9FFF + dw 1000111111111111b ; 0x8FFF + dw 1000011111111111b ; 0x87FF + dw 1000001111111111b ; 0x83FF + dw 1000000111111111b ; 0x81FF + dw 1000000011111111b ; 0x80FF + dw 1000000001111111b ; 0x807F + dw 1000000000111111b ; 0x803F + dw 1000000000011111b ; 0x801F + dw 1000000000001111b ; 0x800F + dw 1000000011111111b ; 0x80FF + dw 1000100001111111b ; 0x887F + dw 1001100001111111b ; 0x987F + dw 1111110000111111b ; 0xFC3F + dw 1111110000111111b ; 0xFC3F + dw 1111111000111111b ; 0xFE3F + dw 0000000000000000b ; 0x0000 + dw 0010000000000000b ; 0x2000 + dw 0011000000000000b ; 0x3000 + dw 0011100000000000b ; 0x3800 + dw 0011110000000000b ; 0x3C00 + dw 0011111000000000b ; 0x3E00 + dw 0011111100000000b ; 0x3F00 + dw 0011111110000000b ; 0x3F80 + dw 0011111111000000b ; 0x3FC0 + dw 0011111000000000b ; 0x3E00 + dw 0011011000000000b ; 0x3600 + dw 0010001100000000b ; 0x2300 + dw 0000001100000000b ; 0x0300 + dw 0000000110000000b ; 0x0180 + dw 0000000110000000b ; 0x0180 + dw 0000000000000000b ; 0x0000