Creando un bootloader en lima

primero tenemos que preguntarnos, para que? , como sera? , que caracteristicas tendra?
bueno , es posible hacer uno primero te proporcionare una base simple para la carga de archivos tendras que tener la siguiente jerarquia en tu projecto
/proyecto
/src
/boot
/bootloader.lima
/shell.lima
/fat12.lima
/makelima.mkl

ahora en proyecto/src/fat12.lima pon el siguiente codigo

# las llamadas al sistema de archivos
[intersegmental]
message fat12::action

# verificar si queremos cargar el sistema de archivos
var
    .cnd
    =
    (@ScratchVar(_action)=="0x01")

# si es verdad saltar a la accion 0
jt
    0

__endprog__

# 0 (load fs)
# 
# Resumen:
# 	cargar el sistema de archvios
# 
section
0
    # saltar al main del fs
    jump
    0.Main

    # indicar que se estan cargando los archivos
    echo "loading files..."

    # only vfat12 , the subdirs cant be load

    # this loads the files of your real pc in the path where is the uefi executable and coppy it to the
    # Z hard disk

    # Main
    # 
    # Resumen:
    # 	la copia
    # 
    # Params:
    # 	@(your files in the fd dir): para copiar al disco virtual
    #   @(obiusly your personal files if you want): pero es necesario para que puedas cargar los archivos
    # 
    section
    0.Main
        # nota : cualquier cambio hecho no se guardara por que hace una copia en memoria
        .
        var
            file_to_load
            =
            0

        #
        # obtener los archivos en la carpeta actual
        #

        mov
            @eax
            "/dir countf"

        # enviar el comando
        %^"!p"

        # establezer loa archivos maximos a cargar
        var
            max_files
            =
            @ScratchVar(_returned)

        # ir al primer elemento del array (0)
        var
            max_files
            -=
            1

        # ir a la accion
        jump
        0.load

    __endprog__

    # load
    # 
    # Resumen:
    # 	carga los archivos al sistema
    # 
    # Params:
    # 	@max_files: la cantidad maxima de archivos
    #   @file_to_load: el punto de entrada (la variable del archivo actual)
    # 
    section
    0.load

        #
        # declarar las variables
        #

        var
            name
            =
            prototype

        var
            content
            =
            prototype

        #
        # obtener la infformacion del archivo
        #

        # nombre de archivo

        # ajustar el comando a el comando para obtener el nombre
        mov
            @eax
            "/file_gName"

        # el item del archivo
        mov
            @bx
            file_to_load

        # mandar el comando
        %^"!p"

        # hacer la copia
        var
            name
            =
            @ScratchVar(_returned)

        # contenido del archivo
        
        # ajustar el comando a el comando para obtener el contenido
        mov
            @eax
            "/file_gContent"

        # el item del archivo
        mov
            @bx
            file_to_load

        # mandar el comando
        %^"!p"

        # hacer una copia
        var
            content
            =
            @ScratchVar(_returned)

        #
        # crear el archivo
        #

        # ahora si crearlo
        mov
            "Z->"(..)name
            content

        # verificar el archivo y cual es
        echo  "file "(..)name(..)" has been loaded."

        # ajustar la variable de condiciones para ver si supero los archivos maximos
        var
            .cnd
            =
            (file_to_load==max_files)

        # siguiente archivo
        var
            file_to_load
            +=
            1

        # si no lo supero cargar el siguiente archivo
        jf
            0.load
            # next file

    # si ya se cargaron todos detener el proceso
    __endprog__
[endmsg]

en shell.lima ponga el siguiente contenido

# la rutina del la terminal
[intersegmental]
message shell()

# el bucle

section
.loop

echo "LemonadeOS> "

# aqui agrega el sistema de comandos

jump
.loop
[endmsg]

y en bootloader.lima pongan el siguiente contenido

org
0
# cargar el sistema en el punto 0 de la memoria

jump
0

# importar las funciones del sistema de archivos
import
    src/fat12
;

# importar las funciones de la terminal
import
    src/shell
;

# 0
# 
# Resumen:
# 	el inicio del arranque
# 
section
0
    # la accion que establezimos para cargar el sistema de archivos
    mov
        _action
        0x01

    # mandar el mensaje a nuestro sistema de archivos
    sendmw fat12::action

    # ir a la termina
    sendmw shell()

__endprog__

ahora si ya tiene Lim22, (en windows o en wine) en makelima.mkl ponga el siguiente contenido

# compile the bootloader
package "/src/boot/bootloader.lima" -> convert_to -> "bin/bootx64.lima"

ejecute el makelima.mkl con el LimaInterpreter.exe y luego ejecute el proyecto/bin/bootx64.lima que se genero en el interprete y listo , les deberia funcionar , a mi no me funciono el loop de la terminal pero seguramente volviendo a las 7 me pondre a arreglar el interprete

Genial, esta interesante. No se, pero creo que si publicaras mas cosas de Lima, crea un post y hay ve respondiéndote a ti mismo, para no inundar mucho el foro

Ahorita saco la parte 2 respondiendo a este

Creando un bootloader en lima parte 2 : archivos por defecto

todo sistema debe tener archivos con los cuales iniciarse y algunos programas utiles , en esta parte veremos como hacerlo,

  1. en tu proyecto crea dos carpeta /programs y /diskfiles
  2. modifica tu makelima y agrega el siguiente contenido
# compile the programs
each "/programs" -> package "%file" -> convert_to -> "/image/%fname.bin"

# compile the programs
each "/diskfiles" -> package "%file" -> coppy_to -> "/image/%fname.bin"

esto lo que hace es que por cada archivo en programs lo compila a un .bin y tambien copia todos los archivos en diskfiles a la imagen , al ejecutar el makelima veras que en si tienes .limas en programs y algunos archivos por ejemplo

/programs
  /hello.lima
/diskfiles
  /readme.txt

en tu carpeta image veras esto

/image
  /hello.bin
  /readme.txt

y al iniciar tu sistema que por cierto esta en la carpeta image en bootx64.lima al ejecutarlo veras esto

 "file "bootx64.lima has been loaded.
 "file "readme.txt has been loaded.
 "file "hello.bin has been loaded.

esto es por que se han cargado los archivos en el disco virtual
NOTA: en image no puede haber subcarpetas dentro de image, por que si no el sistema crashea, solo puede haber un directorio raiz

1 me gusta

Se ve interesante, lima es interpretado no? supongo que cuenta con un interprete que se ejecuta en el bootloader no?

no , el bootloader se ejecuta en el interprete, luego cuando pueda hago un compilador

1 me gusta

increíble, y bueno, que tal funciona?, funciona bien?

segun yo , lima es portable por que solo tienes que escribir el codigo una vez y funciona en todos los sistemas,a mi si me funciona bien, aqui hice un sistema con ese tutorial y corre bien

Lim22 (lima interpreter + makelima program pack)
type mkl for swich to makelima
type lima for swich to lima
*lima@Lim22 interpreter
> mkl
*makelima@Lim22 compiler
> C:\Users\erick\OneDrive\ErickCraftStudiosMgrChannel\Saved Proyects\LimonadeOS\makelima.mkl
*makelima@Lim22 compiler
> lima
*lima@Lim22 interpreter
> C:\Users\erick\OneDrive\ErickCraftStudiosMgrChannel\Saved Proyects\LimonadeOS\image\bootx64.lima
file "bootx64.lima" has been loaded.
file "fs.lima" has been loaded.
file "hello.bin" has been loaded.
file "readme.bin" has been loaded.
LemonadeOS>

LemonadeOS>

LemonadeOS>

LemonadeOS>

LemonadeOS>

LemonadeOS>

LemonadeOS>

LemonadeOS>

LemonadeOS>

LemonadeOS>

de hecho hice primero el sistema y despues el tutorial basandome en lo que ya habia hech

oooh, ya entendi, se ve interesante

de momento el tutorial solo les enseña a crear un kernel basico , el tutorial para el sistema completo lo hago en otro hilo? o aqui

1 me gusta

Creo que lo puedes continuar aqui, no recomiendo inundar el foro con mas y mas temas

por que la verdad el ejemplo de la terminal que les di no tiene ningun comando y ni tienen logica para procesar la entrada del usuario, osea , solo carga los archivos , despues entra a la terminal y no pasa nada aparete como no hay ningun metodo de lectura del usuario y por eso el prompt se imprime sin control

1 me gusta

de momento asi se ve mi avance que hice, luego les enseño como agregarle colores al prompt y como hacer la logica de los comandos

Increíble, el compilador usa LLVM?

no es compilador pero mkl es el compilador de lima que convierte los acrhivos a limas normales (osea le quita los comentarios, lineas vacias , arregla las importaciones) y asi tenemos un archivo lima listo para ejecutarse

Como? Solo le quita los comentarios?

no es que le quita los comentarios , luego le quita las lineas vacias , despues resuelve las importacione (algo como los #include en C) y asi luego hace el mismo proceso a los archivos incluidos y asi termina el lima como un solo archivo y mas pequeño

Bueno, y cuales son los beneficios de tener un archivo mas pequeño, porque hasta ahora lo único que veo util es lo de resolver importaciones

pues que tarda un poco menos , esto se notaba en la version de scractch por que cuando se quitaban los comentarios y las lineas en blanco iva mas rapido , es algo que solo es para compatibilidad

a bueno, ahora entiendo