The system now boots from a FAT12 file system!
This commit is contained in:
parent
9065e2c591
commit
cc35d72a4e
15 changed files with 206 additions and 84 deletions
176
SOURCE/BOOT.ASM
Normal file
176
SOURCE/BOOT.ASM
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
[ORG 0x7c00]
|
||||||
|
jmp short start
|
||||||
|
nop
|
||||||
|
|
||||||
|
;1.44 MB 3.5" floppy disk description table
|
||||||
|
OEMLabel db "EttinOS "
|
||||||
|
BytesPerSector dw 0x200
|
||||||
|
SectorsPerCluster db 0x1
|
||||||
|
BootRecordSectors dw 0x1
|
||||||
|
FATs db 0x2
|
||||||
|
RootEntries dw 0xe0
|
||||||
|
LogicalSectors dw 0xb40
|
||||||
|
MediaDescriptor db 0xf0
|
||||||
|
SectorsPerFAT dw 0x9
|
||||||
|
SectorsPerTrack dw 0x12
|
||||||
|
Sides dw 0x2
|
||||||
|
HiddenSectors dd 0x0
|
||||||
|
LargeSectors dd 0x0
|
||||||
|
DriveNumber dw 0x0
|
||||||
|
DriveSignature db 0x29
|
||||||
|
VolumeID dd 0x0
|
||||||
|
VolumeLabel db "EttinOS "
|
||||||
|
FileSystem db "FAT12 "
|
||||||
|
|
||||||
|
start:
|
||||||
|
|
||||||
|
;Set up the data segment
|
||||||
|
mov ax, 0x0
|
||||||
|
mov ds, ax
|
||||||
|
|
||||||
|
;Set up the stack
|
||||||
|
cli
|
||||||
|
mov ax, 0x0
|
||||||
|
mov ss, ax
|
||||||
|
mov sp, 0x7c00
|
||||||
|
sti
|
||||||
|
|
||||||
|
;Store the boot device number
|
||||||
|
mov [bootdev], dl
|
||||||
|
|
||||||
|
;Load the root FAT
|
||||||
|
;Set the source
|
||||||
|
mov ax, 0x13
|
||||||
|
call calcsource
|
||||||
|
;Set the destination
|
||||||
|
mov si, 0x7e00
|
||||||
|
mov bx, ds
|
||||||
|
mov es, bx
|
||||||
|
mov bx, si
|
||||||
|
;Set the size
|
||||||
|
mov al, 0xe
|
||||||
|
;Load
|
||||||
|
mov ah, 0x2
|
||||||
|
int 0x13
|
||||||
|
|
||||||
|
;Search the root FAT for the system
|
||||||
|
;Set DI to the root FAT
|
||||||
|
mov ax, ds
|
||||||
|
mov es, ax
|
||||||
|
mov di, 0x7e00
|
||||||
|
;Initialise the search loop
|
||||||
|
mov cx, word [RootEntries]
|
||||||
|
mov ax, 0x0
|
||||||
|
search:
|
||||||
|
;Store CX in the stack
|
||||||
|
push cx
|
||||||
|
;Check for the binary
|
||||||
|
mov si, sysfile
|
||||||
|
mov cx, 0xb
|
||||||
|
rep cmpsb
|
||||||
|
je loadsysfat
|
||||||
|
;Set DI to the next entry
|
||||||
|
add ax, 0x20
|
||||||
|
mov di, 0x7e00
|
||||||
|
add di, ax
|
||||||
|
;Load CX from the stack
|
||||||
|
pop cx
|
||||||
|
loop search
|
||||||
|
|
||||||
|
;Load the system FAT
|
||||||
|
loadsysfat:
|
||||||
|
;???
|
||||||
|
mov ax, word [es:di+0xf]
|
||||||
|
mov word [cluster], ax
|
||||||
|
;Set the source
|
||||||
|
mov ax, 0x1
|
||||||
|
call calcsource
|
||||||
|
;Set the destination
|
||||||
|
mov di, 0x7e00
|
||||||
|
mov bx, di
|
||||||
|
;Set the size
|
||||||
|
mov al, 0x9
|
||||||
|
;Load
|
||||||
|
mov ah, 0x2
|
||||||
|
int 0x13
|
||||||
|
|
||||||
|
;Load the system
|
||||||
|
loadsys:
|
||||||
|
;Set the source
|
||||||
|
mov ax, word [cluster]
|
||||||
|
add ax, 0x1f
|
||||||
|
call calcsource
|
||||||
|
;Set the destination
|
||||||
|
mov ax, 0x0
|
||||||
|
mov es, ax
|
||||||
|
mov bx, word [pointer]
|
||||||
|
;Set the size
|
||||||
|
mov al, 0x1
|
||||||
|
;Load a cluster
|
||||||
|
mov ah, 0x2
|
||||||
|
int 0x13
|
||||||
|
|
||||||
|
;Calculate the next cluster
|
||||||
|
mov ax, [cluster]
|
||||||
|
mov dx, 0x0
|
||||||
|
mov bx, 0x3
|
||||||
|
mul bx
|
||||||
|
mov bx, 2
|
||||||
|
div bx
|
||||||
|
mov si, 0x7e00
|
||||||
|
add si, ax
|
||||||
|
mov ax, word [ds:si]
|
||||||
|
or dx, dx
|
||||||
|
jz even
|
||||||
|
odd:
|
||||||
|
shr ax, 4
|
||||||
|
jmp contcluster
|
||||||
|
even:
|
||||||
|
and ax, 0xfff
|
||||||
|
contcluster:
|
||||||
|
mov word [cluster], ax
|
||||||
|
cmp ax, 0xff8
|
||||||
|
jge boot
|
||||||
|
add word [pointer], 0x200
|
||||||
|
jmp loadsys
|
||||||
|
|
||||||
|
boot:
|
||||||
|
jmp 0x0:0x9e00
|
||||||
|
|
||||||
|
sysfile:
|
||||||
|
db "SYSTEM BIN"
|
||||||
|
|
||||||
|
bootdev:
|
||||||
|
db 0
|
||||||
|
|
||||||
|
cluster:
|
||||||
|
dw 0x0
|
||||||
|
|
||||||
|
pointer:
|
||||||
|
dw 0x9e00
|
||||||
|
|
||||||
|
calcsource:
|
||||||
|
push ax
|
||||||
|
push bx
|
||||||
|
mov bx, ax
|
||||||
|
mov dx, 0x0
|
||||||
|
div word [SectorsPerTrack]
|
||||||
|
add dl, 0x1
|
||||||
|
mov cl, dl
|
||||||
|
mov ax, bx
|
||||||
|
mov dx, 0x0
|
||||||
|
div word [SectorsPerTrack]
|
||||||
|
mov dx, 0x0
|
||||||
|
div word [Sides]
|
||||||
|
mov dh, dl
|
||||||
|
mov ch, al
|
||||||
|
pop bx
|
||||||
|
pop ax
|
||||||
|
mov dl, byte [bootdev]
|
||||||
|
ret
|
||||||
|
|
||||||
|
;Padding
|
||||||
|
times 0x1fe-($-$$) db 0x0
|
||||||
|
|
||||||
|
;Boot signature
|
||||||
|
dw 0xaa55
|
|
@ -1,6 +1,6 @@
|
||||||
;Converts a byte in ah to a hex string at di.
|
;Converts a byte in ah to a hex string at di.
|
||||||
|
|
||||||
byte2hexstr:
|
byte2hex:
|
||||||
|
|
||||||
;Store the initial registers in the stack
|
;Store the initial registers in the stack
|
||||||
pusha
|
pusha
|
|
@ -17,13 +17,13 @@ call printstr
|
||||||
;Convert the scancode to a hex string
|
;Convert the scancode to a hex string
|
||||||
mov ah, [.scan]
|
mov ah, [.scan]
|
||||||
mov di, .keycode
|
mov di, .keycode
|
||||||
call byte2hexstr
|
call byte2hex
|
||||||
|
|
||||||
;Convert the ascii value to a hex string
|
;Convert the ascii value to a hex string
|
||||||
mov ah, [.ascii]
|
mov ah, [.ascii]
|
||||||
mov di, .keycode
|
mov di, .keycode
|
||||||
add di, 0x2
|
add di, 0x2
|
||||||
call byte2hexstr
|
call byte2hex
|
||||||
|
|
||||||
;Print the keycode
|
;Print the keycode
|
||||||
mov si, .keycode
|
mov si, .keycode
|
|
@ -6,6 +6,6 @@ println:
|
||||||
call printstr
|
call printstr
|
||||||
|
|
||||||
;Print a newline
|
;Print a newline
|
||||||
call printcrlf
|
call printnl
|
||||||
|
|
||||||
ret
|
ret
|
|
@ -1,12 +1,12 @@
|
||||||
;Prints a newline
|
;Prints a newline
|
||||||
|
|
||||||
printcrlf:
|
printnl:
|
||||||
|
|
||||||
;Store the initial registers in the stack
|
;Store the initial registers in the stack
|
||||||
pusha
|
pusha
|
||||||
|
|
||||||
;Print the newline
|
;Print the newline
|
||||||
mov si, .crlf
|
mov si, .nl
|
||||||
call printstr
|
call printstr
|
||||||
|
|
||||||
;Load the initial registers from the stack
|
;Load the initial registers from the stack
|
||||||
|
@ -14,5 +14,5 @@ popa
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.crlf:
|
.nl:
|
||||||
db 0xd, 0xa, 0x0
|
db 0xd, 0xa, 0x0
|
|
@ -6,6 +6,6 @@ readln:
|
||||||
call readstr
|
call readstr
|
||||||
|
|
||||||
;Print a newline
|
;Print a newline
|
||||||
call printcrlf
|
call printnl
|
||||||
|
|
||||||
ret
|
ret
|
|
@ -1,20 +1,20 @@
|
||||||
[ORG 0x7e00]
|
[ORG 0x9e00]
|
||||||
jmp start
|
jmp start
|
||||||
|
|
||||||
;Calls
|
;Calls
|
||||||
%include "printcrlf.inc"
|
%include "PRINTNL.INC"
|
||||||
%include "printstr.inc"
|
%include "PRINTSTR.INC"
|
||||||
%include "println.inc"
|
%include "PRINTLN.INC"
|
||||||
%include "readstr.inc"
|
%include "READSTR.INC"
|
||||||
%include "readln.inc"
|
%include "READLN.INC"
|
||||||
%include "cmpstr.inc"
|
%include "CMPSTR.INC"
|
||||||
%include "byte2hexstr.inc"
|
%include "BYTE2HEX.INC"
|
||||||
|
|
||||||
;Commands
|
;Commands
|
||||||
%include "echo.inc"
|
%include "ECHO.INC"
|
||||||
%include "hello.inc"
|
%include "HELLO.INC"
|
||||||
%include "help.inc"
|
%include "HELP.INC"
|
||||||
%include "keycode.inc"
|
%include "KEYCODE.INC"
|
||||||
|
|
||||||
start:
|
start:
|
||||||
|
|
14
make.sh
14
make.sh
|
@ -1,8 +1,14 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
cd source/
|
cd SOURCE/
|
||||||
nasm boot.asm -f bin -O0 -o ../boot.bin
|
nasm BOOT.ASM -f bin -O0 -o ../BOOT.BIN
|
||||||
nasm system.asm -f bin -O0 -o ../system.bin
|
nasm SYSTEM.ASM -f bin -O0 -o ../SYSTEM.BIN
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
cat boot.bin system.bin > EttinOS.img
|
if [[ -f EttinOS.img ]]
|
||||||
|
then
|
||||||
|
rm EttinOS.img
|
||||||
|
fi
|
||||||
|
mkfs.fat -C EttinOS.img 1440
|
||||||
|
mcopy -i EttinOS.img SYSTEM.BIN ::
|
||||||
|
dd if=BOOT.BIN of=EttinOS.img conv=notrunc bs=512 count=1
|
||||||
|
|
|
@ -1,60 +0,0 @@
|
||||||
[ORG 0x7c00]
|
|
||||||
jmp short start
|
|
||||||
nop
|
|
||||||
|
|
||||||
;Disk description table
|
|
||||||
db "EttinOS " ;Disk label
|
|
||||||
dw 0x200 ;Bytes per sector
|
|
||||||
db 0x1 ;Sectors per cluster
|
|
||||||
dw 0x1 ;Sectors reserved for the boot record
|
|
||||||
db 0x2 ;Number of copies of the FAT
|
|
||||||
dw 0xe0 ;Number of directory entries
|
|
||||||
dw 0xb40 ;Number of logical sectors
|
|
||||||
db 0xf0 ;Media descriptor type
|
|
||||||
dw 0x9 ;Sectors per FAT
|
|
||||||
dw 0x12 ;Sectors per track
|
|
||||||
dw 0x2 ;Number of heads
|
|
||||||
dd 0x0 ;Number of hidden sectors
|
|
||||||
dd 0x0 ;Number of LBA sectors
|
|
||||||
dw 0x0 ;Drive number
|
|
||||||
db 0x29 ;Drive signature
|
|
||||||
dd 0x0 ;Volume ID
|
|
||||||
db "EttinOS " ;Volume label
|
|
||||||
db "FAT12 " ;File system type
|
|
||||||
|
|
||||||
start:
|
|
||||||
|
|
||||||
;Set up the data segment
|
|
||||||
mov ax, 0x0
|
|
||||||
mov ds, ax
|
|
||||||
|
|
||||||
;Set up the stack
|
|
||||||
cli
|
|
||||||
mov ax, 0x0
|
|
||||||
mov ss, ax
|
|
||||||
mov sp, 0x7c00
|
|
||||||
sti
|
|
||||||
|
|
||||||
;Load the system
|
|
||||||
;Set the source
|
|
||||||
mov dh, 0x0
|
|
||||||
mov ch, 0x0
|
|
||||||
mov cl, 0x2
|
|
||||||
;Set the destination
|
|
||||||
mov ax, 0x0
|
|
||||||
mov es, ax
|
|
||||||
mov bx, 0x7e00
|
|
||||||
;Set the size
|
|
||||||
mov al, 0x5
|
|
||||||
;Load
|
|
||||||
mov ah, 0x2
|
|
||||||
int 0x13
|
|
||||||
|
|
||||||
;Boot the system
|
|
||||||
jmp 0x0:0x7e00
|
|
||||||
|
|
||||||
;Padding
|
|
||||||
times 0x1fe-($-$$) db 0x0
|
|
||||||
|
|
||||||
;Boot signature
|
|
||||||
dw 0xaa55
|
|
Loading…
Reference in a new issue