initial commit
This commit is contained in:
commit
08f66b73e1
10 changed files with 783 additions and 0 deletions
20
src/drivers/debug.asm
Normal file
20
src/drivers/debug.asm
Normal 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
62
src/drivers/gfx.asm
Normal 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
45
src/drivers/gfx_cgam.asm
Normal 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
127
src/drivers/mouse_ps2.asm
Normal 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
106
src/drivers/textmode.asm
Normal 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
|
||||
|
||||
Loading…
Reference in a new issue