Added partition table to OS image, automatically format the first partition using FAT12

This commit is contained in:
Georges Dupéron 2018-07-08 02:58:10 +02:00
parent d56b7442a4
commit 893a9b9d93
3 changed files with 43 additions and 16 deletions

View File

@ -19,6 +19,7 @@ addons:
- wmctrl
# example-os build dependencies:
- nasm
- mtools
matrix:
include:

View File

@ -1,6 +1,12 @@
os_filename = os.bat
tests = test/qemu-system-i386 test/qemu-system-arm test/virtualbox test/bochs test/gui-sh test/dosbox
os_image_size_kb = 1440
os_sectors_before_partition = 720
# CHS parameters for 1.44 MB floppy disk
os_floppy_chs_h = 2
os_floppy_chs_s = 9
.PHONY: all
# all: os.arm.disasm
all: $(os_filename) os.ndisasm.disasm os.reasm.asm os.reasm os.file .gitignore Makefile
@ -12,6 +18,12 @@ all: $(os_filename) os.ndisasm.disasm os.reasm.asm os.reasm os.file .gitignore M
$(os_filename): os.asm ../deploy-screenshots Makefile
rm -f $@
nasm -o $@ $<
mformat -v "Example OS" \
-T $$(($(os_image_size_kb)*1024/512-$(os_sectors_before_partition))) \
-h $(os_floppy_chs_h) \
-s $(os_floppy_chs_s) \
-i "$@@@$$(($(os_sectors_before_partition)*512))"
# mcopy … "$@@@$$(($(os_sectors_before_partition)*512))"
chmod a+x-w $@
os.file: $(os_filename) Makefile

View File

@ -5,23 +5,24 @@ db `#!/usr/bin/env sh\n`
db `: <<'EOF'\n`
db `GOTO msdos\n`
;;; The #!… above is interpreted as … jnz short 0x7c78 in x86 assembly.
times 0x7c78-0x7c00-($-$$) db 0
;; Switch to 320x200x256 VGA mode
;;; Switch to 320x200x256 VGA mode
mov ax, 0x0013
int 10h
;; Framebuffer address is 0xa000, store it into the fs register (the segment base, in multiples of 16)
;;; Framebuffer address is 0xa000, store it into the fs register (the segment base, in multiples of 16)
push 0xa000
pop fs
;; Set pixel value (0, then increase at each step below)
;;; Set pixel value (0, then increase at each step below)
xor bl, bl
;; set register di to 0
;;; set register di to 0
xor di,di
;; Store pixels, display something flashy.
;;; Store pixels, display something flashy.
loop:
mov byte [fs:di], bl
inc bl
@ -38,33 +39,46 @@ endline:
je end
jmp loop
;; Infinite loop
;;; Infinite loop
end:
jmp end
;; Fill the remaining bytes with 0 and end with 55 AA
times 512-2-($-$$) db 0
db 0x55
db 0xaa
;;; Fill the remaining bytes with 0 and write a partition table
times 0x1b8-($-$$) db 0
db "ExOSxx" ;; 0x1b8 unique disk ID (4 bytes, can be any value)
;;; Partition table entries follow this format:
;;; 1 byte Bootable flag (0x00 = no, 0x80 = yes)
;;; 3 bytes Start Head Sector Cylinder (8 bits + 6 bits + 10 bits)
;;; 1 byte Partition type (0x01 = FAT12)
;;; 3 bytes End Head Sector Cylinder (8 bits + 6 bits + 10 bits)
;;; 4 bytes LBA offset
;;; 4 bytes LBA length
db 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x3d, 0x0b, 0x00, 0x00 ;; 0x1be p1
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ;; 0x1ce p2
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ;; 0x1de p3
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ;; 0x1ee p4
db 0x55, 0xaa ;; 0x1fe End the bootsector with 55 AA, which is the MBR signature.
;; end of the bootsector, close the sh here-document skipped via : <<'EOF'
;;; This is the end of the first 512 bytes (the bootsector).
;;; After the bootsector, close the sh here-document skipped via : <<'EOF'
db `\n`
db `EOF\n`
db `echo Hello world by the OS, from sh!\n`
db `while sleep 10; do :; done\n`
db `exit\n`
;; for good measure: go into an infinite loop if the exit did not happen.
;;; for good measure: go into an infinite loop if the exit did not happen.
db `while :; do sleep 1; done\n`
;; end of the SH section, everything until this point is skipped by MS-DOS batch due to the GOTO'
;;; end of the SH section, everything until this point is skipped by MS-DOS batch due to the GOTO'
db `:msdos\n`
db `@cls\n`
db `@echo Hello world by the OS, from MS-DOS!\n`
db `command.com\n`
db `exit\n`
;; for good measure: go into an infinite loop if the exit did not happen.
;;; for good measure: go into an infinite loop if the exit did not happen.
db `:loop\n`
db `GOTO loop\n`
;; Fill up to 1.44M with 0
;;; Fill up to 1.44M with 0
times (1440*1024)-($-$$) db 0