home
;MOFOS - My Own Free Operating System
;Copyleft (>) haLLs, 20/09/2004
; Se trata de un BOOTSTRAP, un programa de arranke desde la BIOS, que esta
; pensado para iniciar el futuro kernel de un futuro sistema operativo xD
; (soƱar era gratis no?)
[ORG 0x7C00]
jmp main ;saltamos a la rutina main, dentro de la memoria del bootstrap (07C0)
;*********;
; DATOS ;
;*********;
boot_msg db 'Arrancando MOFOS...',13,10,0 ;asignamos una cadena de caracteres
vga_mode dw 0x4f02, 0x0116 ;resolucion 1024x768x24
ok_msg db 'OK',0
nook_msg db 'ERROR',0
prompt_msg db 'MOFOS prompt > ',0 ;mensaje de prompt
debug_msg db 'kaka',0
info_msg db 'El comando introducido es: ',0 ;mensaje de info
;******************;
; RUTINAS VARIAS ;
;******************;
;show_char
; muestra un caracter por pantalla
;
show_char:
mov ah, 0eh
mov bx, 7
int 10h
ret
;show_string
; muestra un null-terminated string por pantalla
;
show_string:
lodsb ;cargamos el primer byte de lo apuntado por ds:si
cmp al, 0 ;miramos si llegamos al caracter nulo
je end_show_string ;para acabar de mostrar
call show_char
jmp show_string
end_show_string:
ret
;show_crlf
; muestra un salto de linea con retorno de carro por pantalla
;
show_crlf:
mov al, 13
call show_char
mov al, 10
call show_char
ret
;clear_screen
; resetea el modo de pantalla para asi limpiar la pantalla
;
clear_screen:
mov ax, [vga_mode] ;ponemos funcion
mov bx, [vga_mode+2] ;modo de video
int 10h
ret
;get_char
; espera a k se pulse una tecla, y la muestra
;
get_char:
xor ax,ax
int 16h
ret
;get_string
; pilla un string hasta ke se ha pulsado 'enter'
;
get_string:
push di ;guardamos pa ke apunte al principio de la cadena
get_string_char:
call get_char
cmp al,13 ;es 'enter' ?
je get_string_end ;si? pues termina de pillar chars
stosb ;no? pues guarda
call show_char
jmp get_string_char ;seguimos pillando chars
get_string_end:
mov al,0
stosb ;null terminated string
;show_string_esdi
; muestra un string contenido en es:di
;
show_string_esdi:
push ds ;guardamos los regs
push si
mov ax,es ;apuntamos al sitio correcto
mov ds,ax
mov ax,di
mov si,ax
call show_string ;mostramos cadena
pop si ;restauramos valores
pop ds
ret
cmp_strings:
;********************;
; RUTINA PRINCIPAL ;
;********************;
main:
mov ax,cs ;vamos a mover los segmentos al actual
mov ds,ax
cli ;clear interrupts, no vaia a ser ke la kaguemos...
mov ss,ax
mov sp,0x0fffc ;ahi, lejos de nuestro codigo... pa no machacar na
sti
add ax,2000
mov es,ax ;porke yo lo valgo
call clear_screen
mov si, boot_msg
call show_string
call show_crlf
prompt:
mov si, prompt_msg
call show_string
call get_string
mov si, info_msg
call show_string
call show_string_esdi
call show_crlf
jmp prompt
end_main:
jmp end_main ;terminamos
times 510-($-$$) db 0
dw 0aa55h