Compare commits

...

2 Commits

Author SHA1 Message Date
Juhani Krekelä b3ca33653f Start work on io.sys 2021-08-26 10:11:20 +03:00
Juhani Krekelä 094def1194 Add bootloader 2021-08-26 10:08:41 +03:00
7 changed files with 369 additions and 0 deletions

2
.gitignore vendored
View File

@ -3,3 +3,5 @@
*.OBJ *.OBJ
*.COM *.COM
*.SYS *.SYS
*.BIN
*.img

22
Makefile Normal file
View File

@ -0,0 +1,22 @@
ordos.img: BOOT.BIN IO.SYS ORDOS.SYS COMMAND.COM
rm -f ordos.img
mkdosfs -C $@ -M 0xff 320
rw -I 0x7c00 -i BOOT.BIN -o $@ -c 512
mcopy -i $@ IO.SYS ::
mcopy -i $@ ORDOS.SYS ::
mcopy -i $@ COMMAND.COM ::
BOOT.BIN IO.SYS ORDOS.SYS COMMAND.COM:
dosbox -exit build.bat
BOOT.BIN: boot.asm
IO.SYS: io.asm
ORDOS.SYS: msdos.asm stddos.asm
COMMAND.COM: command.asm
clean:
rm -f ordos.img
dosbox -exit clean.bat

2
README
View File

@ -8,12 +8,14 @@ File origins & License
Here 'ms-dos' refers to the Microsoft repository, while 'ordos' refers to Here 'ms-dos' refers to the Microsoft repository, while 'ordos' refers to
new files for Ordos. Everything is under the MIT license. new files for Ordos. Everything is under the MIT license.
boot.asm ordos
build.bat ordos build.bat ordos
clean.bat ordos clean.bat ordos
command.asm ms-dos v1.25/source/COMMAND.ASM command.asm ms-dos v1.25/source/COMMAND.ASM
debug.com ms-dos v1.25/bin/DEBUG.COM debug.com ms-dos v1.25/bin/DEBUG.COM
edlin.com ms-dos v1.25/bin/EDLIN.COM edlin.com ms-dos v1.25/bin/EDLIN.COM
exe2bin.exe ms-dos v1.25/bin/EXE2BIN.EXE exe2bin.exe ms-dos v1.25/bin/EXE2BIN.EXE
io.asm ordos
link.exe ms-dos v1.25/bin/LINK.EXE link.exe ms-dos v1.25/bin/LINK.EXE
masm.exe ms-dos v2.0/bin/MASM.EXE masm.exe ms-dos v2.0/bin/MASM.EXE
msdos.asm ms-dos v1.25/source/MSDOS.ASM msdos.asm ms-dos v1.25/source/MSDOS.ASM

170
boot.asm Normal file
View File

@ -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

View File

@ -5,3 +5,11 @@ exe2bin command.exe command.com
masm stddos; masm stddos;
link stddos; link stddos;
exe2bin stddos.exe ordos.sys exe2bin stddos.exe ordos.sys
masm boot;
link boot;
exe2bin boot.exe boot.bin
masm io;
link io;
exe2bin io.exe io.sys

View File

@ -5,3 +5,11 @@ del command.com
del stddos.obj del stddos.obj
del stddos.exe del stddos.exe
del ordos.sys del ordos.sys
del boot.obj
del boot.exe
del boot.bin
del io.obj
del io.exe
del io.sys

157
io.asm Normal file
View File

@ -0,0 +1,157 @@
; SPDX-License-Identifier: MIT
; Copyright (c) 2021 Juhani 'nortti' Krekelä.
iosegment equ 60h
dossegment equ iosegment + 1*1024/16 ; DOS starts 1KiB after IO system
dos segment at dossegment
org 0
dosinit proc far
dosinit endp
dos ends
code segment
code ends
constants segment
constants ends
data segment
data ends
iogroup group code, constants, data
code segment
assume cs:iogroup, ds:iogroup, es:iogroup
org 0
; Jump table
jmp init
jmp status
jmp getch
jmp putch
jmp unimplemented ; Output to printer
jmp unimplemented ; Serial read
jmp unimplemented ; Serial write
jmp diskread
jmp diskwrite
jmp diskchange
jmp setdate
jmp settime
jmp gettime
jmp flush
jmp mapdev
init:
cld
cli
mov ax, cs
mov ds, ax
mov es, ax
; Put setup stack just below 32K
xor ax, ax
mov ss, ax
mov sp, 8000h
sti
; Figure out memory size
int 12h
; AX = memory size in kilobytes
; We want it in paragraphs
; There are 64 paragraphs in a kilobyte
mov cx, 64
shl al, cl
; Memory size is passed in dx
mov dx, ax
; Disk table is passed in si
mov si, offset iogroup:disks_table
call dosinit
mov al, 'c'
jmp error
; OUT:
; al = character if any
; zf = there were no characters
status proc far
; TODO: Implement
xor ax, ax
test ax, ax
ret
status endp
getch:
mov al, 'g'
jmp error
; IN:
; ax = character
putch proc far
push ax
mov ah, 0eh
int 10h
pop ax
ret
putch endp
diskread:
mov al, 'r'
jmp error
diskwrite:
mov al, 'w'
jmp error
diskchange:
mov al, 'c'
jmp error
setdate:
mov al, 'd'
jmp error
settime:
mov al, 't'
jmp error
gettime:
mov al, 'T'
jmp error
flush:
mov al, 'f'
jmp error
mapdev:
mov al, 'm'
jmp error
unimplemented:
mov al, '@'
error:
mov ah, 0eh
int 10h
hang:
hlt
jmp hang
code ends
constants segment
disks_table:
db 1 ; 1 drive
db 0 ; Physical drive 0
dw offset iogroup:parameters_320k
parameters_320k:
dw 512 ; Sector size in bytes
db 2 ; Sectors per cluster
dw 1 ; Number of reserved sectors
dw 2 ; Number of FATs
dw 112 ; Number of directory entries
dw 320*2 ; Number of sectors
constants ends
end