Boot 1.0

Description

Pour les débutants comme moi en ASM,un ultra mini éditeur de texte
en mode console 16 bits bootable,avec invite de commande, qui ne prend en compte que les
caracteres alphabétiques du clavier (pour les autres il suffit de rajouter le
traitement de leurs scancodes),la touche entrée (fin de ligne),la touche space
la touche del et la touche esc pour quitter
La lecture des caractères tapés se fait par le port clavier 60h,
l'écriture se fait directement en ram texte B800h.
A utiliser comme boot dans virtualbox
je joins le fichier img.

Bonne prog




org 0

%define port_clavier_60 60h
%define nbreToucheSpecialeTraite 4
%define CouleurInvite 1110b
%define CouleurTexte 110b

%macro affiche 4
;%1=x,%2=y,%3=LPtext,%4=couleur
mov si,%3
mov bx,%1
mov di,%2
mov ah,%4
call VGA3
%endmacro

jmp 0x07C0:debut ;boot toujours en 7c0h

debut:

;initialisation des segments
;---------------------------

mov ax,cs
mov ds,ax ;data et code dans le même segment
mov ax,0B800h
mov es,ax ;es pointe sur ram vga texte
cli
mov ax,8000h
mov ss,ax ;segment pile
mov sp,0F000h ;pointeur pile
sti

;vga texte 80*25
;---------------
mov ax,3
int 10h

;affiche l'invite de commande
;----------------------------
mov si,Y_curseur
add si,word[deltaY]
mov ax,[si]
affiche word[X_curseur],ax,invite,CouleurInvite
inc word [X_curseur]

;attente d'une touche
;--------------------
attend_frappe:

mov ah,0
int 16h

;lecture du scan code tape
;--------------------------

xor ax,ax
in al,port_clavier_60
test al,10000000b ;breakcode ?
jnz attend_frappe ;si oui on ignore

;recherche touche spéciale
;-------------------------

mov bx,table_branchement
mov cx,nbreToucheSpecialeTraite
A1:
cmp al,[bx]
jnz A2
call word[bx+1]
jmp A3
A2:
add bx,3
dec cx
jnz A1

;makecode en caractere ascii
;--------------------------
mov si,scanCode
add si,ax
mov al,[si]
mov [touche],al

;affiche caractere tapé au clavier
;--------------------------------
mov si,Y_curseur
add si,word[deltaY]
mov ax,[si]
affiche word[X_curseur],ax,touche,CouleurTexte
mov ax,word[X_curseur]
cmp ax,70
jc caractere

jmp A3 ;fin de ligne atteinte,on bloc
caractere:
inc ax
mov word[X_curseur],ax

A3:
;vidage buff clavier bios
;------------------------
push es
push 40h
pop es
cli
mov ax,[es:1ah]
mov [es:1ch],ax
sti
pop es

;on quit ?
;---------

mov ax,word[exit]
cmp ax,1
jz fin
jmp attend_frappe

fin:
mov ax,3 ;on efface avant de sortir
int 10h
ret ;final

;---------------------------
VGA3: ;si=LPtext,bx=x,di=y,ah=couleur,es=B800h
pushad
shl bx,1
VGA3_debut:
lodsb
cmp al,0
jz VGA3_fin
mov [es:di+bx],ax
inc bx
inc bx
jmp VGA3_debut
VGA3_fin:
popad
ret
;-------------------------------
ESC:
inc word[exit]
ret
;-------------------------------
EFFACE:

;on n'efface pas l'invite de commande
mov ax,word[X_curseur]
cmp ax,1
jz efface1
;efface dernier caractere si fin de ligne atteinte
mov si,Y_curseur
add si,word[deltaY]
mov ax,[si]
affiche word[X_curseur],ax,blanc,CouleurTexte
;efface caractere tapé
dec word [X_curseur]
mov si,Y_curseur
add si,word[deltaY]
mov ax,[si]
affiche word[X_curseur],ax,blanc,CouleurTexte
efface1:
ret
;--------------------------------
ENTREE:
mov ax,word[deltaY]
add ax,2
cmp ax,40 ;20 lignes possibles
jc entree1
xor ax,ax ;y=0
mov ax,3 ;on efface l'écran
int 10h
xor ax,ax
entree1:
mov word[deltaY],ax
mov si,Y_curseur
add si,word[deltaY]
mov ax,[si]
mov word[X_curseur],0
affiche word[X_curseur],ax,invite,CouleurInvite
inc word [X_curseur]
ret
;---------------------------------
SPACE:
inc word [X_curseur]
ret
;----------------------------------

exit dw 0
X_curseur dw 0
deltaY dw 0
Y_curseur dw 0,160,320,480,640,800,960,1120,1280,1440
dw 1600,1760,1920,2080,2240,2400,2560,2720,2880,3040
touche db '0',0
blanc db ' ',0
invite db '>',0
scanCode resb 16
db 'AZERTYUIOP'
resb 4
db 'QSDFGHJKLMù'
resb 2
db '*WXCVBN,;:!',0
table_branchement db 1
dw ESC
db 0Eh
dw EFFACE
db 1Ch
dw ENTREE
db 39h
dw SPACE

times 510-($-$$) db 0 ;510 octets à 0
dw 0xAA55 ;+2 octets=512

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.