Last Updated or created 2023-07-21
UPDATE 20230721 Bootdemo
I found some parts of our (Edk and Me) bootloader demo.
It was compiled using masm or tasm.
Encountering a problem converting the code into a raw bin, to put on a floppy I diverted to another setup to try to get things working.
Using old code (below) and a example from YT, I made the following setup.
Visual studio code, with the x64 assembly plugin.
xxd as hexviewer.
fasm as assembler (This makes things easier, because it is a native Linux x86 compiler. So no need for dosbox anymore.)
I’ve created a Makefile to automate things.
clean: rm -f *obj rm -f *.bin exec: fasm demo.asm fasm boot.asm cat boot.bin loadpart.bin > demo.bin qemu-system-x86_64 -boot a -fda demo.bin
Some of our old demo code:
;-------- snip Start: JMP SHORT BootHere NOP DB "FASH-EDK" DW 512 DB 2 DW 1 DB 2 DW 0070h DW 02d0h ;max. aantal sectoren van volume A DB 0Fdh ;media descriptor DW 0002h ;aantal sectoren per FAT DW 0009h ;aantal sectoren per spoor DW 2 DW 0 BootHere: mov bp,5 tryboot: push bp mov bx,4000h mov es,bx mov bx,0 mov cx,2 ;vanaf sector 2 mov dx,0 ;drive A, kant 0 mov ah,02h MOV AL,8 int 13h ;sector(en) lezen pop bp jnc bootok dec bp jnz tryboot bootok: mov bp,5 ;---------- snap
New setup using fasm (bootloader) boot.asm
org 0x7c00 ; still not sure about this, have not found this in our demo mov bx, 0x1000 ; load sector address mov es, bx mov bx, 0x0 ; Sector read function mov dh, 0x0 ; head 0 mov dl, 0x0 ; drive 0 mov ch, 0x0 ; cylinder 0 mov cl, 0x02 ; start sector readdisk: mov ah, 0x02 ; read sec mov al, 0x02 ; demo is > 512 so 2 sectors int 0x13 ; call bios mov ax, 0x1000 mov ds, ax mov es, ax jmpcode: jmp 0x1000:0x0 ; far jmp demo ; Expand bin to 512 byte sector times 510-($-$$) db 0 dw 0xaa55 ; Sector header (ROM as this at the start)
Graphics demo i wrote a long time ago, converted into fasm loadpart.asm
mov ah,0 mov ax, 4f02h ; Set VESA video mode mov bx, 10dh ; Your video mode number int 10h mov al,0 drawall: mov dx,0 mov cx,0 drawloop: mov ah,0ch mov bh,0 push ax int 10h pop ax inc al inc cx cmp cx,319 jc drawloop mov cx,0 inc dx cmp dx,199 jmp drawloop jmp drawall ; complete sector with zeros times 512-($-$$) db 0
Booting the demo in milli seconds using qemu.
Next to do: Write this to floppy and test on real hardware.
A reset starts the virtual machine and boots from a virtual floppy.
The drawing of the pixels is slow, because I used a int 10h function for every pixel, instead of writing to screen memory directly.
ndisasm – disassemble binary
ndisasm loadpart.bin 00000000 B400 mov ah,0x0 00000002 B8024F mov ax,0x4f02 00000005 BB0D01 mov bx,0x10d 00000008 CD10 int 0x10 0000000A B000 mov al,0x0 0000000C BA0000 mov dx,0x0 0000000F B90000 mov cx,0x0 00000012 B40C mov ah,0xc 00000014 B700 mov bh,0x0 00000016 50 push ax 00000017 CD10 int 0x10 00000019 58 pop ax 0000001A FEC0 inc al 0000001C 41 inc cx 0000001D 81F93F01 cmp cx,0x13f 00000021 72EF jc 0x12 00000023 B90000 mov cx,0x0 00000026 42 inc dx 00000027 81FAC700 cmp dx,0xc7 0000002B EBE5 jmp short 0x12 0000002D EBDD jmp short 0xc 0000002F 0000 add [bx+si],al 00000031 0000 add [bx+si],al 00000033 0000 add [bx+si],al 00000035 0000 add [bx+si],al
UPDATE 20230721 Bootdemo update
Got a part working again in PCem.
This is from our bootdemo.
A scroller and sector loader in a bootsector.
Needed some include files
masm, link, exe2com creates a 12- sector sized floppy.
And we’ve got a (little distorted but working) Scroller in boot sector with custom font!
font: db 64 dup (0) ;space db 0,0,2,2,0,0,0,0 ;! db 0,2,2,2,2,0,0,0 db 0,2,2,2,2,0,0,0 db 0,2,2,2,2,0,0,0 db 0,0,2,2,0,0,0,0 db 0,0,2,2,0,0,0,0 db 0,0,0,0,0,0,0,0 db 0,0,2,2,0,0,0,0