MOFOS: My Own Free Operating System. Bootstrap de arranque en ASM.

[ permalink ] [ download ]
;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
hits counter