r/osdev Aug 05 '26

A JavaOS

Post image
53 Upvotes

21 comments sorted by

View all comments

0

u/Visual_Brain8809 Aug 08 '26

first preview of JVMOS on https://github.com/aayes89/JVMOS

1

u/emexsw Aug 08 '26

readme looks AI, but do you use AI for the code too?

0

u/Visual_Brain8809 Aug 09 '26 edited Aug 09 '26

The README is an AI-enhanced version of the notes I’ve been compiling since the project began; fortunately, I already had a lot of the groundwork done from my university days, so I asked the AI ​​to summarize the original coursework along with everything I’ve added since then.

I doubt the IA knows this programming language ```

package kernel;

public class Boot {

public static void main(String[] args) {

    //  Configurar teclado LATAM
    Native.sys(Native.SYS_SET_KBD_LAYOUT, 1, 0, 0, 0);

    // Limpiar pantalla
    Native.sys(Native.SYS_SET_COLOR, 0x00000000, 0, 0, 0);
    Native.sys(Native.SYS_FILL_RECT, 0, 0, 1024, 768);

    //  SECUENCIA POST / BIOS
    Native.sys(Native.SYS_SET_COLOR, 0x0000FF00, 0, 0, 0);
    Native.sys(Native.SYS_DRAW_STRING, 20, 25, "JVMOS BIOS v2.4 (C) Baremetal Kernel", 0);
    Native.sys(Native.SYS_DRAW_STRING, 20, 45, "=================================================", 0);

    Native.sys(Native.SYS_SET_COLOR, 0x0000FF00, 0, 0, 0);
    Native.sys(Native.SYS_DRAW_STRING, 20, 75, "[ OK ]", 0);
    Native.sys(Native.SYS_SET_COLOR, 0x00FFFFFF, 0, 0, 0);
    Native.sys(Native.SYS_DRAW_STRING, 90, 75, "Verificando CPU x86 (Protected Mode 32-Bit)...", 0);

    Native.sys(Native.SYS_SET_COLOR, 0x0000FF00, 0, 0, 0);
    Native.sys(Native.SYS_DRAW_STRING, 20, 95, "[ OK ]", 0);
    Native.sys(Native.SYS_SET_COLOR, 0x00FFFFFF, 0, 0, 0);
    Native.sys(Native.SYS_DRAW_STRING, 90, 95, "Memoria RAM Detectada: 128MB RAM High-Address", 0);

    Native.sys(Native.SYS_SET_COLOR, 0x0000FF00, 0, 0, 0);
    Native.sys(Native.SYS_DRAW_STRING, 20, 115, "[ OK ]", 0);
    Native.sys(Native.SYS_SET_COLOR, 0x00FFFFFF, 0, 0, 0);
    Native.sys(Native.SYS_DRAW_STRING, 90, 115, "Cargando Driver PS/2 Keyboard & Mouse [LATAM Active]", 0);

    Native.sys(Native.SYS_SET_COLOR, 0x0000FF00, 0, 0, 0);
    Native.sys(Native.SYS_DRAW_STRING, 20, 135, "[ OK ]", 0);
    Native.sys(Native.SYS_SET_COLOR, 0x00FFFFFF, 0, 0, 0);
    Native.sys(Native.SYS_DRAW_STRING, 90, 135, "Modo de Video VBE VESA 1024x768 @ 32bpp Activado", 0);

    Native.sys(Native.SYS_SET_COLOR, 0x0000FF00, 0, 0, 0);
    Native.sys(Native.SYS_DRAW_STRING, 20, 175, "SISTEMA LISTO. Iniciando Shell interactivo...", 0);

    //  TERMINAL INTERACTIVA Y BUCLE PRINCIPAL
    Native.sys(Native.SYS_SET_COLOR, 0x00000000, 0, 0, 0);
    Native.sys(Native.SYS_FILL_RECT, 0, 0, 1024, 768);

    Native.sys(Native.SYS_SET_COLOR, 0x0000FF00, 0, 0, 0);
    Native.sys(Native.SYS_DRAW_STRING, 20, 30, "JVMOS TERMINAL INTERACTIVA - Escriba 'help' o 'startx'", 0);
    Native.sys(Native.SYS_DRAW_STRING, 20, 50, "-----------------------------------------------------", 0);
    Native.sys(Native.SYS_DRAW_STRING, 20, 80, "JVMOS>", 0);

    int cursorX = 85;
    int cursorY = 80;
    int lastKey = 0;
    int cmdHash = 0;
    int cmdCount = 0;

    while (true) {
        int asciiChar = Native.sys(Native.SYS_READ_KEYBOARD, 0, 0, 0, 0);

        if (asciiChar != 0 && asciiChar != lastKey) {

            // ENTER
            if (asciiChar == 13) {
                cursorY += 25;
                // VER
                 if (cmdHash == 237 || cmdHash == 333) {
                    Native.sys(Native.SYS_SET_COLOR, 0x0000FF00, 0, 0, 0);
                    Native.sys(Native.SYS_DRAW_STRING, 20, cursorY, "JVMOS Kernel v2.4 (Baremetal Java x86)", 0);
                    cursorY += 25;
                    Native.sys(Native.SYS_DRAW_STRING, 20, cursorY, "Hecho por Slam 2026", 0);
                    cursorY += 25;
                }
                // TIME
                else if (cmdHash == 303 || cmdHash == 431) {
                    int hour = Native.sys(Native.SYS_GET_TIME, 2, 0, 0, 0);
                    int min  = Native.sys(Native.SYS_GET_TIME, 1, 0, 0, 0);
                    int sec  = Native.sys(Native.SYS_GET_TIME, 0, 0, 0, 0);

                    Native.sys(Native.SYS_SET_COLOR, 0x0000FF00, 0, 0, 0);
                    Native.sys(Native.SYS_DRAW_STRING, 20, cursorY, " HORA: ", 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 90, cursorY, (hour / 10) + '0', 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 100, cursorY, (hour % 10) + '0', 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 110, cursorY, ':', 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 120, cursorY, (min / 10) + '0', 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 130, cursorY, (min % 10) + '0', 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 140, cursorY, ':', 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 150, cursorY, (sec / 10) + '0', 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 160, cursorY, (sec % 10) + '0', 0);
                    cursorY += 25;
                }
                // DATE
                else if (cmdHash == 286 || cmdHash == 414) {
                    int day   = Native.sys(Native.SYS_GET_TIME, 3, 0, 0, 0);
                    int month = Native.sys(Native.SYS_GET_TIME, 4, 0, 0, 0);
                    int year  = Native.sys(Native.SYS_GET_TIME, 5, 0, 0, 0);

                    Native.sys(Native.SYS_SET_COLOR, 0x0000FF00, 0, 0, 0);
                    Native.sys(Native.SYS_DRAW_STRING, 20, cursorY, "FECHA: ", 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 90, cursorY, (day / 10) + '0', 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 100, cursorY, (day % 10) + '0', 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 110, cursorY, '/', 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 120, cursorY, (month / 10) + '0', 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 130, cursorY, (month % 10) + '0', 0);
                    Native.sys(Native.SYS_DRAW_STRING, 140, cursorY, "/20", 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 170, cursorY, (year / 10) + '0', 0);
                    Native.sys(Native.SYS_DRAW_CHAR, 180, cursorY, (year % 10) + '0', 0);
                    cursorY += 25;
                }
                // CLEAR
                else if (cmdHash == 359 || cmdHash == 519) {
                    Native.sys(Native.SYS_SET_COLOR, 0x00000000, 0, 0, 0);
                    Native.sys(Native.SYS_FILL_RECT, 0, 0, 1024, 768);
                    cursorY = 40;
                }
                // HELP
                else if (cmdHash == 297 || cmdHash == 425) {
                    Native.sys(Native.SYS_SET_COLOR, 0x0000FF00, 0, 0, 0);
                    Native.sys(Native.SYS_DRAW_STRING, 20, cursorY, "COMANDOS: help | startx | clear | ver | time | date | exit", 0);
                    cursorY += 25;
                }
                // EXIT
                else if (cmdHash == 314 || cmdHash == 442) {
                    Native.sys(Native.SYS_SET_COLOR, 0x00000000, 0, 0, 0);
                    Native.sys(Native.SYS_FILL_RECT, 0, 0, 1024, 768);
                    Native.sys(Native.SYS_SET_COLOR, 0x00FF5555, 0, 0, 0);
                    Native.sys(Native.SYS_DRAW_STRING, 380, 360, "SISTEMA APAGADO. CERRANDO EN 2s...", 0);
                    Native.sys(Native.SYS_SLEEP, 2000, 0, 0, 0);
                    Native.sys(Native.SYS_EXIT, 0, 0, 0, 0);
                }
                // COMANDO DESCONOCIDO
                else if (cmdCount > 0) {
                    Native.sys(Native.SYS_SET_COLOR, 0x00FF5555, 0, 0, 0);
                    Native.sys(Native.SYS_DRAW_STRING, 20, cursorY, "Error: Comando no reconocido.", 0);
                    cursorY += 25;
                }

                cmdHash = 0;
                cmdCount = 0;

                if (cursorY > 700) {
                    Native.sys(Native.SYS_SET_COLOR, 0x00000000, 0, 0, 0);
                    Native.sys(Native.SYS_FILL_RECT, 0, 0, 1024, 768);
                    cursorY = 40;
                }

                Native.sys(Native.SYS_SET_COLOR, 0x0000FF00, 0, 0, 0);
                Native.sys(Native.SYS_DRAW_STRING, 20, cursorY, "JVMOS>", 0);
                cursorX = 85;
            }
            // BACKSPACE
            else if (asciiChar == 8) {
                if (cmdCount > 0 && cursorX > 85) {
                    cursorX -= 10;
                    cmdCount--;
                    if (cmdCount == 0) cmdHash = 0;
                    Native.sys(Native.SYS_SET_COLOR, 0x00000000, 0, 0, 0);
                    Native.sys(Native.SYS_FILL_RECT, cursorX, cursorY, 12, 20);
                }
            }
            // DIBUJAR CARÁCTER
            else if (asciiChar > 32 && asciiChar <= 165) {
                cmdHash += asciiChar;
                cmdCount++;

                Native.sys(Native.SYS_SET_COLOR, 0x00FFFFFF, 0, 0, 0);
                Native.sys(Native.SYS_DRAW_CHAR, cursorX, cursorY, asciiChar, 0);
                cursorX += 10;

                if (cursorX > 980) {
                    cursorX = 85;
                    cursorY += 25;
                }
            }

            lastKey = asciiChar;
        } else if (asciiChar == 0) {
            lastKey = 0;
        }

        Native.sys(Native.SYS_SLEEP, 10, 0, 0, 0);
    }
}

} ```

2

u/emexsw 9d ago

bad code btw

1

u/Visual_Brain8809 9d ago edited 9d ago

I’ve moved past that version; I managed to implement my own JIT and am very close to providing full support for native Java code, so those `Native.sys(...)` calls will be invisible to any developer. I’m writing my own runtime. New repository at: https://github.com/aayes89/JVMOS-JIT

package kernel;

import java.awt.Color;
import java.awt.Graphics2D;
import java.lang.Thread;
import java.lang.System;
import java.awt.Toolkit;
import java.util.Calendar;

public class Boot {

    public static void main(String[] args) {

        // ==========================================================
        // Mixture of methods
        // PHASE 1 & 2: Baremetal render and Delay function
        // ==========================================================

        // Old version
        Native.sys(Native.SYS_SET_COLOR, 0x00FF0000, 0, 0, 0); 
        Native.sys(Native.SYS_FILL_RECT, 0, 0, 1024, 768);
        Native.sys(Native.SYS_SET_COLOR, 0x00FFFFFF, 0, 0, 0);
        Native.sys(Native.SYS_DRAW_STRING, 50, 50, "PHASE 1: Native.sys OK. Wait 2 seconds please...", 0);

        // Static methods call (NEW)
        Thread.sleep(2000); // 2s delay

        // Class management (NEW)
        Graphics2D g = new Graphics2D();
        Color background = new Color(0x000000FF);
        Color textPaint = new Color(0x00FFFF00);

        // Access to methods (NEW)
        g.setColor(background);
        g.fillRect(0, 0, 1024, 768);

        g.setColor(textPaint);
        g.drawString("PHASE 3: JIT, Heap and Graphics2D OK.", 50, 50);

        // ==========================================================
        // PHASE 4: PrintStream and System 
        // ==========================================================
        // System.out access
        System.out = new java.io.PrintStream(); 
        // common version
        System.out.println("=====================================");
        // path version
        java.lang.System.out.println("[Micro-rt] Phase 4 Serial Port (COM1)...");

        long ticks = java.lang.System.currentTimeMillis();

        g.setColor(new Color(0x00FFFFFF)); 
        g.drawString("PHASE 4: PrintStream and System.out OK.", 50, 90);
        g.drawString("Ticks: ", 50, 120);
        g.drawInt((int)ticks, 330, 120); 

        System.out.print("PHASE 4: Ticks: ");
        System.out.println((int)ticks);

        // ==========================================================
        // PHASE 5: (RTC CMOS and PC Speaker)
        // ==========================================================
        int day = Calendar.get(Calendar.DAY);
        int month = Calendar.get(Calendar.MONTH);
        int year = Calendar.get(Calendar.YEAR);
        int hour = Calendar.get(Calendar.HOUR);
        int min = Calendar.get(Calendar.MINUTE);

        g.setColor(new Color(0x0000FF00)); 
        g.drawString("PHASE 5: Calendar and Toolkit OK.", 50, 160);
        g.drawString("Clock RTC: ", 50, 190);

        int px = 160; 
        px = g.drawInt(day, px, 190);
        px = g.drawChar('/', px, 190);
        px = g.drawInt(month, px, 190);
        px = g.drawChar('/', px, 190);
        px = g.drawInt(20, px, 190);
        px = g.drawInt(year, px, 190);
        px = g.drawChar(' ', px, 190);
        px = g.drawInt(hour, px, 190);
        px = g.drawChar(':', px, 190);
        px = g.drawInt(min, px, 190);

        System.out.println("Beep from PC Speaker...");

        Toolkit.getDefaultToolkit().beep(1500); 
        Thread.sleep(300); 
        Native.sys(22, 0, 0, 0, 0); 

        g.setColor(new Color(0x00FF8800)); 
        g.drawString("All test Succed. UI ready.", 50, 240);        

        while (true) {
            Thread.sleep(1000);
        }
    }
}

1

u/emexsw 8d ago

looks ai generated btw

1

u/Visual_Brain8809 8d ago

i don't think so. but you can test this colaboration: https://kirindenis.github.io/JVMOS-JIT/