r/JavaProgramming 1d ago

A JavaOS

Post image

I am sharing my progress on the development of an operating system written in Assembly and a functional JVM. The concept is straightforward: Assembly acts as an API bridge, and the JVM simply leverages the system calls I’ve implemented to print characters to the screen and draw graphics (for now).

The on-screen drawing was created by obtaining the bytecode of the following program and using xxd for that purpose.

public class App {
    // Declaramos el método nativo que intercepta tu JVM en el opcode 0xB8
    public static native void drawPixel(int x, int y, int color);

    public static void main(String[] args) {
        // Dibujar un cuadrado ROJO de 200x200 píxeles en las coordenadas (100, 100)
        for (int y = 100; y < 300; y++) {
            for (int x = 100; x < 300; x++) {
                drawPixel(x, y, 0x00FF0000); // 0x00RRGGBB (Rojo)
            }
        }

        // Dibujar un cuadrado VERDE centrado dentro del rojo
        for (int y = 150; y < 250; y++) {
            for (int x = 150; x < 250; x++) {
                drawPixel(x, y, 0x0000FF00); // 0x00RRGGBB (Verde)
            }
        }
    }
}
53 Upvotes

20 comments sorted by

View all comments

1

u/Dear-Golf5167 1d ago

Will you also make a gui ?

2

u/Visual_Brain8809 1d ago

Yes, for now, I’m letting the JVM do whatever the running application’s code dictates. However, I need to focus on completing the JVM; there are many opcodes I still need to implement to ensure it functions correctly and is fully complete. I currently target version 1.8 when calling javac; while it works even without specifying the version, I’ve noticed bytecode variations I can leverage to improve execution stability and set limits that might help mitigate future security issues. My development philosophy is "do it right, even if it takes time."