From 094def11947327aff34cb2fe44b9c51877476409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Thu, 26 Aug 2021 10:08:41 +0300 Subject: [PATCH] Add bootloader --- .gitignore | 2 + Makefile | 17 ++++++ README | 1 + boot.asm | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++++ build.bat | 4 ++ clean.bat | 4 ++ 6 files changed, 198 insertions(+) create mode 100644 Makefile create mode 100644 boot.asm diff --git a/.gitignore b/.gitignore index 14f3a22..b2b03a9 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ *.OBJ *.COM *.SYS +*.BIN +*.img diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1057db0 --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ +ordos.img: BOOT.BIN + rm -f ordos.img + mkdosfs -C $@ -M 0xff 320 + rw -I 0x7c00 -i BOOT.BIN -o $@ -c 512 + +BOOT.BIN ORDOS.SYS COMMAND.COM: + dosbox -exit build.bat + +BOOT.BIN: boot.asm + +ORDOS.SYS: msdos.asm stddos.asm + +COMMAND.COM: command.asm + +clean: + rm -f ordos.img + dosbox -exit clean.bat diff --git a/README b/README index 39ae781..4070b88 100644 --- a/README +++ b/README @@ -8,6 +8,7 @@ File origins & License Here 'ms-dos' refers to the Microsoft repository, while 'ordos' refers to new files for Ordos. Everything is under the MIT license. +boot.asm ordos build.bat ordos clean.bat ordos command.asm ms-dos v1.25/source/COMMAND.ASM diff --git a/boot.asm b/boot.asm new file mode 100644 index 0000000..1864551 --- /dev/null +++ b/boot.asm @@ -0,0 +1,170 @@ +; SPDX-License-Identifier: MIT +; Copyright (c) 2021 Juhani 'nortti' Krekelä. + +iosegment segment at 60h +ioinit proc far +ioinit endp +iosegment ends + +bootloader segment +assume cs:bootloader, ds:bootloader, es:bootloader, ss:bootloader +org 7c00h + +jmp code + +; BPB + db "Ordos " ; OEM Identifier + dw 512 ; Bytes per sector + db 2 ; Sectors per cluster + dw 1 ; Reserved sectors + db 2 ; FATs + dw 112 ; Root directory entries + dw 2*320 ; Total sectors + db 0ffh ; Media descriptor + dw 1 ; Sectors per fat +sectorspertrack dw 8 +heads dw 2 + dd 0 ; Hidden sectors + dd 0 ; Total sectors (large) + +code: + cld + mov ax, cs + mov ds, ax + mov es, ax + cli + mov ss, ax + mov sp, 7c00h + sti + + mov drivenumber, dl + + ; TODO: Check we actually have the OS + mov ax, 10 + mov bx, 600h + mov cx, 17 ; This is what PC-DOS 1.10's full size ends up at + call loadsectors + + mov si, offset success_msg + call printstr + + jmp ioinit + +; IN: +; ax = LBA of first sector +; es:bx = destination buffer +; cx = number of sectors to load +loadsectors proc + push ax + push cx + push dx + push di + + loading_loop: + mov di, 3 + 1 ; Retry thrice, + 1 is since we dec first + + retry: + + push ax + push cx + + chs: + xor dx, dx + ; cylinder (track) - head - sector + ; cylinder = LBA / sectorspertrack / heads + ; head = LBA / sectorspertrack % heads + ; sector = LBA % sectorspertrack + 1 + div sectorspertrack + ; ax = LBA / sectorspertrack + ; dx = LBA % sectorspertrack + + ; sector + mov cl, dl + inc cl + + xor dx, dx + div heads + ; ax = LBA / sectorspertrack / heads + ; dx = LBA / sectorspertrack % heads + + ; head + mov dh, dl + + ; cylinder (track) + mov ch, al + shr ax, 1 + shr ax, 1 + and al, 0c0h + or cl, al + + mov ax, 0201h + mov dl, drivenumber + int 13h + + jc disk_error + + mov ax, 0e00h + '.' + int 10h + + pop cx + pop ax + + inc ax + add bx, 512 + + loop loading_loop + + pop di + pop dx + pop cx + pop ax + ret + + disk_error: + ; Do we still have retries remaining? + dec di + jnz reset_disk + + ; No, die + mov si, offset error_msg + call printstr + + hang: + hlt + jmp hang + + reset_disk: + ; Yes, reset disk and retry + xor ah, ah + int 13h + + pop cx + pop ax + jmp retry +loadsectors endp + +; IN: +; si = null-terminated string +printstr proc + lodsb + test al, al + jz ret_printstr + mov ah, 0eh + int 10h + jmp printstr + + ret_printstr: + ret +printstr endp + +drivenumber db (?) + +success_msg db 13, 10, "DOS Loaded", 13, 10, 0 +error_msg db 13, 10, "Disk error", 0 + +org 7c00h + 510 + dw 0aa55h + +bootloader ends + +end diff --git a/build.bat b/build.bat index 2f0c335..6e12eb0 100644 --- a/build.bat +++ b/build.bat @@ -5,3 +5,7 @@ exe2bin command.exe command.com masm stddos; link stddos; exe2bin stddos.exe ordos.sys + +masm boot; +link boot; +exe2bin boot.exe boot.bin diff --git a/clean.bat b/clean.bat index 76b5641..dacf244 100644 --- a/clean.bat +++ b/clean.bat @@ -5,3 +5,7 @@ del command.com del stddos.obj del stddos.exe del ordos.sys + +del boot.obj +del boot.exe +del boot.bin