initial commit

This commit is contained in:
Frater 2026-01-08 10:26:52 +01:00
commit 08f66b73e1
10 changed files with 783 additions and 0 deletions

20
src/drivers/debug.asm Normal file
View file

@ -0,0 +1,20 @@
debug_puts:
.next:
lodsb ; AL = *SI++
test al, al
jz .done
mov dx, DEBUG_PORT
out dx, al
jmp .next
.done:
ret
debug_putc:
.next:
mov dx, DEBUG_PORT
out dx, al
ret

62
src/drivers/gfx.asm Normal file
View file

@ -0,0 +1,62 @@
%define GFX_MODE 0x06 ; MCGA HiRes (B/W)
%define GFX_WIDTH 640
%define GFX_HEIGHT 200
gfx_init:
; init graphics mode
mov ah, 0x00 ; AH=00h set video mode
mov al, GFX_MODE
int 0x10
call gfx_background
ret
; PutPixel(x=cx, y=dx, color=al) sur page bh
gfx_putpixel:
mov ah, 0Ch
;mov al, 0Fh ; couleur (0..15)
;mov bh, 00h ; page
;mov cx, 100 ; x
;mov dx, 50 ; y
int 10h
ret
gfx_background:
mov ax,VIDEO_SEG
mov es,ax
xor di,di
mov ax,0xaaaa
mov cx,0x1000
rep stosw
mov ax,0x5555
mov cx,0x1000 ; 640/8/2
rep stosw
ret
; gfx_background:
xor dx,dx ; Y
.loop_y:
test dl,1
jnz .pair
mov cx,0 ; X = 0
jmp .loop_x
.pair:
mov cx,1 ; X = 1
.loop_x:
mov ah,0x0c ; putpixel
mov al,0x0f ; blanc
xor bh,bh
int 10h
add cx,2 ; x=x+2
cmp cx,GFX_WIDTH
jb .loop_x
inc dx
cmp dx,GFX_HEIGHT
jb .loop_y
ret

45
src/drivers/gfx_cgam.asm Normal file
View file

@ -0,0 +1,45 @@
;
; graphics drivers for CGA 640x200x2
;
%define GFX_MODE 0x06 ; MCGA HiRes (B/W)
%define GFX_WIDTH 640
%define GFX_HEIGHT 200
%define CGA_STRIDE 80
%define CGA_ODD_BANK 0x2000
%define BG16_SIZE 48
; ce mode est entrelacé, un bit/pixel, 8 pixels par octet
gfx_init:
; init graphics mode
mov ah, 0x00 ; AH=00h set video mode
mov al, GFX_MODE
int 0x10
call gfx_background
ret
; PutPixel(x=cx, y=dx, color=al) sur page bh
gfx_putpixel:
mov ah, 0Ch
;mov al, 0Fh ; couleur (0..15)
;mov bh, 00h ; page
;mov cx, 100 ; x
;mov dx, 50 ; y
int 10h
ret
; draw background pattern
gfx_background:
mov ax,VIDEO_SEG
mov es,ax
xor di,di
mov ax,0xaaaa
mov cx,0x1000
rep stosw
mov ax,0x5555
mov cx,0x1000 ; 640/8/2
rep stosw
ret

127
src/drivers/mouse_ps2.asm Normal file
View file

@ -0,0 +1,127 @@
;
; controlleur de souris via le i8042 (PC Classique)
;
%define PS2_PORT_BUFFER 0x60
%define PS2_PORT_CTRL 0x64
%define MOUSE_CMD_RESET 0xff
%define MOUSE_CMD_DEFAULT 0xf6
%define MOUSE_EN_STREAM 0xf4
%define MOUSE_DIS_STREAM 0xf5
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
mouse_init:
; Activer le port souris
mov ax, BDA_SEGMENT
mov ds,ax
; effacer les variables du drivers
mov [BDA_MOUSE_IDX],0
mov dword [BDA_MOUSE_BUFFER],0
mov al, 0xA8
out PS2_PORT_CTRL, al
; Lire le command byte
mov al, 0x20
out PS2_PORT_CTRL, al
in al, PS2_PORT_BUFFER
; Activer IRQ12 (bit 1)
or al, 0x02
; Réécrire le command byte
mov ah, al
mov al, PS2_PORT_BUFFER
out PS2_PORT_CTRL, al
mov al, ah
out PS2_PORT_BUFFER, al
ret
; envoyer une commande souris
mouse_sendcmd:
.wait:
in al, PS2_PORT_CTRL
test al, 2
jnz .wait
mov al, 0xD4
out PS2_PORT_CTRL, al
.wait2:
in al, PS2_PORT_CTRL
test al, 2
jnz .wait2
mov al, bl ; BL = commande souris
out PS2_PORT_BUFFER, al
ret
mouse_handler:
push ax
push bx
; use BDA segment
push ds
mov ax,BDA_SEGMENT
mov ds,ax
xor bx,bx
in al, PS2_PORT_BUFFER ; lire octet souris
mov [BDA_MOUSE_BUFFER + BDA_MOUSE_IDX], al
inc [BDA_MOUSE_IDX]
cmp [BDA_MOUSE_IDX], 3
jne .done
mov [BDA_MOUSE_IDX], 0
; decode buffer
mov al, [BDA_MOUSE_BUFFER+1]
cbw
add [BDA_MOUSE_X], ax
mov al, [BDA_MOUSE_BUFFER+2]
cbw
sub [BDA_MOUSE_Y], ax
.done:
mov al, 0x20
out 0xA0, al ; EOI PIC esclave
out 0x20, al ; EOI PIC maître
pop ds
pop bx
pop ax
iret

106
src/drivers/textmode.asm Normal file
View file

@ -0,0 +1,106 @@
;
; text mod functions
;
;
vid_seg dw VIDEO_SEG
cursor_ofs dw 0
txt_attr db VIDEO_ATTR
; -----------------------------------------------------------------------------
; cls : efface l'écran en remplissant txtmode_CELLS cellules par " " + ATTR
; -----------------------------------------------------------------------------
txtmode_clear:
mov ax,0xB800 ; select video segment
mov es,ax
xor ax,ax ; 0
; mov [cursor_ofs],ax ; reset 'virtual' cursor
mov di,ax
; default attr + space
mov ah, [txt_attr]
mov al, ' '
;
mov cx,2000 ; 25x80
rep stosw ; attr + char
ret
; -----------------------------------------------------------------------------
; puts : imprime une chaîne ASCIIZ (DS:SI) en VRAM (ES:cursor_ofs)
; - gère '\n' (LF=10) comme nouvelle ligne
; - ignore '\r' (CR=13)
; -----------------------------------------------------------------------------
txtmode_puts:
.next:
lodsb ; AL = *SI++
test al, al
jz .done
cmp al, 10 ; '\n'
je .lf
cmp al, 13 ; '\r'
je .next
call txtmode_putc
jmp .next
.lf:
call txtmode_newline
jmp .next
.done:
ret
; -----------------------------------------------------------------------------
; putc : imprime le caractère AL à la position du curseur logiciel
; -----------------------------------------------------------------------------
txtmode_putc:
push ax
push bx
push di
mov di, [cursor_ofs]
; écrire char + attr
mov ah, txt_attr
stosw ; écrit AX à ES:DI, puis DI += 2
; mettre à jour cursor_ofs
mov [cursor_ofs], di
; si fin d'écran, on “reboucle” au début (simple)
; (vous pouvez remplacer par un scroll si besoin)
mov bx, 4000 ; 80x25x2
cmp di, bx
jb .ok
mov word [cursor_ofs], 0
.ok:
pop di
pop bx
pop ax
ret
; -----------------------------------------------------------------------------
; newline : avance le curseur au début de la ligne suivante (80 colonnes)
; -----------------------------------------------------------------------------
txtmode_newline:
push ax
push dx
mov ax, [cursor_ofs] ; offset en octets
xor dx, dx
mov cx, 160 ; taille d'une ligne en octets = 160
div cx ; AX = ligne, DX = reste (offset dans la ligne)
inc ax ; ligne suivante
cmp ax, 25
jb .set
xor ax, ax ; si dépasse, revient en haut (simple)
.set:
mov cx, 160 ; cursor_ofs = ligne * 160
mul cx ; DX:AX = AX*CX ; ici AX suffit
mov [cursor_ofs], ax
pop dx
pop ax
ret