The system now boots from a FAT12 file system!
This commit is contained in:
parent
9065e2c591
commit
cc35d72a4e
|
@ -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.
|
||||
|
||||
byte2hexstr:
|
||||
byte2hex:
|
||||
|
||||
;Store the initial registers in the stack
|
||||
pusha
|
|
@ -17,13 +17,13 @@ call printstr
|
|||
;Convert the scancode to a hex string
|
||||
mov ah, [.scan]
|
||||
mov di, .keycode
|
||||
call byte2hexstr
|
||||
call byte2hex
|
||||
|
||||
;Convert the ascii value to a hex string
|
||||
mov ah, [.ascii]
|
||||
mov di, .keycode
|
||||
add di, 0x2
|
||||
call byte2hexstr
|
||||
call byte2hex
|
||||
|
||||
;Print the keycode
|
||||
mov si, .keycode
|
|
@ -6,6 +6,6 @@ println:
|
|||
call printstr
|
||||
|
||||
;Print a newline
|
||||
call printcrlf
|
||||
call printnl
|
||||
|
||||
ret
|
|
@ -1,12 +1,12 @@
|
|||
;Prints a newline
|
||||
|
||||
printcrlf:
|
||||
printnl:
|
||||
|
||||
;Store the initial registers in the stack
|
||||
pusha
|
||||
|
||||
;Print the newline
|
||||
mov si, .crlf
|
||||
mov si, .nl
|
||||
call printstr
|
||||
|
||||
;Load the initial registers from the stack
|
||||
|
@ -14,5 +14,5 @@ popa
|
|||
|
||||
ret
|
||||
|
||||
.crlf:
|
||||
.nl:
|
||||
db 0xd, 0xa, 0x0
|
|
@ -6,6 +6,6 @@ readln:
|
|||
call readstr
|
||||
|
||||
;Print a newline
|
||||
call printcrlf
|
||||
call printnl
|
||||
|
||||
ret
|
|
@ -1,20 +1,20 @@
|
|||
[ORG 0x7e00]
|
||||
[ORG 0x9e00]
|
||||
jmp start
|
||||
|
||||
;Calls
|
||||
%include "printcrlf.inc"
|
||||
%include "printstr.inc"
|
||||
%include "println.inc"
|
||||
%include "readstr.inc"
|
||||
%include "readln.inc"
|
||||
%include "cmpstr.inc"
|
||||
%include "byte2hexstr.inc"
|
||||
%include "PRINTNL.INC"
|
||||
%include "PRINTSTR.INC"
|
||||
%include "PRINTLN.INC"
|
||||
%include "READSTR.INC"
|
||||
%include "READLN.INC"
|
||||
%include "CMPSTR.INC"
|
||||
%include "BYTE2HEX.INC"
|
||||
|
||||
;Commands
|
||||
%include "echo.inc"
|
||||
%include "hello.inc"
|
||||
%include "help.inc"
|
||||
%include "keycode.inc"
|
||||
%include "ECHO.INC"
|
||||
%include "HELLO.INC"
|
||||
%include "HELP.INC"
|
||||
%include "KEYCODE.INC"
|
||||
|
||||
start:
|
||||
|
14
make.sh
14
make.sh
|
@ -1,8 +1,14 @@
|
|||
#!/bin/bash
|
||||
|
||||
cd source/
|
||||
nasm boot.asm -f bin -O0 -o ../boot.bin
|
||||
nasm system.asm -f bin -O0 -o ../system.bin
|
||||
cd SOURCE/
|
||||
nasm BOOT.ASM -f bin -O0 -o ../BOOT.BIN
|
||||
nasm SYSTEM.ASM -f bin -O0 -o ../SYSTEM.BIN
|
||||
|
||||
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 New Issue