; reinhard@finalmedia.de ; Sun Apr 5 10:27:23 PM CEST 2026 ; ; nasm -f bin bootloader.asm -o bootloader.bin ;# 1. CPU- & Segment-Initialisierung 0xFA ; CLI - Interrupts deaktivieren 0x31, 0xC0 ; XOR AX, AX - AX auf 0 setzen 0x8E, 0xD8 ; MOV DS, AX - Data Segment = 0 0x8E, 0xC0 ; MOV ES, AX - Extra Segment = 0 0x8E, 0xD0 ; MOV SS, AX - Stack Segment = 0 0xBC, 0x00, 0x7C ; MOV SP, 7C00h - Stack-Pointer unter den Bootloader setzen ;# 2. Sektoren von Disk laden (via BIOS) 0xB8, 0x7F, 0x02 ; MOV AX, 027Fh - AH=02 (Read), AL=7F (Anzahl Sektoren) 0xBB, 0x00, 0x10 ; MOV BX, 1000h - Ziel-Offset im Speicher 0x8E, 0xC3 ; MOV ES, BX - ES auf 1000h setzen (Puffer-Segment) 0x31, 0xDB ; XOR BX, BX - BX=0 (Offset innerhalb ES) 0xB9, 0x02, 0x00 ; MOV CX, 0002h - CH=0 (Zylinder), CL=2 (Start-Sektor) 0xCD, 0x13 ; INT 13h - BIOS Disk Service: Sektoren lesen ;# 3. Grafikmodus & VGA-Palette 0xB8, 0x13, 0x00 ; MOV AX, 0013h - AH=0 (Set Mode), AL=13 (320x200, 256 Farben) 0xCD, 0x10 ; INT 10h - BIOS Video Service 0xB8, 0x00, 0x10 ; MOV AX, 1000h 0x8E, 0xD8 ; MOV DS, AX - DS auf Datenbereich bei 1000h setzen 0xBA, 0xC8, 0x03 ; MOV DX, 03C8h - VGA Palette Address Register 0x30, 0xC0 ; XOR AL, AL - Start-Index 0 0xEE ; OUT DX, AL - Index an VGA senden 0x42 ; INC DX - DX = 03C9h (VGA Palette Data Register) 0x31, 0xF6 ; XOR SI, SI - Quell-Offset 0 0xB9, 0x00, 0x03 ; MOV CX, 0300h - 768 Bytes (256 Farben * 3 RGB-Werte) 0xF3, 0x6E ; REP OUTSB - Palette massenhaft an VGA senden ;# 4. Video-Speicher & Daten kopieren 0xB8, 0x00, 0xA0 ; MOV AX, A000h - VGA Video-Speicher Segment 0x8E, 0xC0 ; MOV ES, AX - ES auf Video-RAM zeigen lassen 0x31, 0xFF ; XOR DI, DI - Ziel-Offset 0 0xBE, 0x1E, 0x03 ; MOV SI, 031Eh - Quell-Offset der Bilddaten 0xB9, 0x00, 0xFA ; MOV CX, FA00h - 64.000 Bytes (ein voller Screen) 0xF3, 0xA4 ; REP MOVSB - Bilddaten in Video-RAM kopieren ;# 5. Wait for Vertical Retrace (Vsync) 0x31, 0xFF ; XOR DI, DI 0xBA, 0xDA, 0x03 ; MOV DX, 03DAh - VGA Status Register ; Wait-Loop: 0xEC ; IN AL, DX 0xA8, 0x08 ; TEST AL, 8 0x75, 0xFB ; JNZ - Warten, bis Retrace endet 0xEC ; IN AL, DX 0xA8, 0x08 ; TEST AL, 8 0x74, 0xFB ; JZ - Warten, bis Retrace beginnt ;# 6. Farbanpassung & Endlosschleife 0xBA, 0xC8, 0x03 ; MOV DX, 03C8h 0xB0, 0xF6 ; MOV AL, 0F6h 0xEE ; OUT DX, AL 0x42 ; INC DX - DX = 03C9h 0xB8, 0x00, 0x10 ; MOV AX, 1000h 0x8E, 0xD8 ; MOV DS, AX 0xBE, 0xE2, 0x02 ; MOV SI, 02E2h 0x01, 0xFE ; ADD SI, DI 0xB9, 0x1E, 0x00 ; MOV CX, 001Eh 0xF3, 0x6E ; REP OUTSB - Palette dynamisch updaten 0x83, 0xC7, 0x03 ; ADD DI, 3 0x81, 0xFF, 0x1E, 0x00 ; CMP DI, 001Eh 0x72, 0x02 ; JB 0x31, 0xFF ; XOR DI, DI 0xB9, 0x00, 0x80 ; MOV CX, 8000h (Wait-Counter) 0x49 ; DEC CX 0x75, 0xFD ; JNZ 0xEB, 0xD0 ; JMP (Loop zurueck zum Vsync) - (Hex im Prompt war EB, FB/EB, ED Bereich) ; Wenn du es in Assembler baust times 510-($-$$) db 0 ; Auffuellen auf 510 Bytes dw 0xAA55 ; Boot-Signatur (Ende Sektor 1) ; --- AB HIER SEKTOR 2 (Daten für den Grafikmodus) --- ; Hier fuegen wir die eigentliche Bilddaten und Paletten-Werte ; als Payload ein ; Beispiel: 768 Bytes Palette + 64000 Bytes Bilddaten ; das machen wir aber nicht hier, sondern in javascript ; willst du das hier machen, musst du ; ansonsten in nasm auch separat erzeugte bin files mit includieren: incbin "palette.bin" ; Bindet die Palettendaten ein incbin "image.bin" ; Bindet die Bilddaten ein ; oder alternativ einfach später aneinander kleben ; dann so etwa: ; cat boot.bin palette.bin image.bin > boot.img