diff --git a/SOURCE/BOOT.ASM b/SOURCE/BOOT.ASM index f80d4fe..d856c6c 100644 --- a/SOURCE/BOOT.ASM +++ b/SOURCE/BOOT.ASM @@ -1,26 +1,54 @@ -[ORG 0x7c00] +CPU 8086 +ORG 0x7c00 + jmp 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 " +;Disk description tables + +%ifdef F1440 +;1.44 MB 3.5" floppy disk (enable by passing -d F1440 to NASM) +oemlabel db "ETTINOS " +sectorsize dw 0x200 ;bytes +clustersize db 0x1 ;sectors +bootsectors 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 +driveid dw 0x0 +drivesignature db 0x29 +volumeid dd 0x0 +volumelabel db "ETTINOS " +filesystem db "FAT12 " + +%else +;360 KiB 5.25" floppy disk (default) +oemlabel db "ETTINOS " +sectorsize dw 0x200 ;bytes +clustersize db 0x2 ;sectors +bootsectors dw 0x1 +fats db 0x2 +rootentries dw 0x70 +logicalsectors dw 0x2d0 +mediadescriptor db 0xfd +sectorsperfat dw 0x2 +sectorspertrack dw 0x9 +sides dw 0x2 +hiddensectors dd 0x0 +largesectors dd 0x0 +driveid dw 0x0 +drivesignature db 0x29 +volumeid dd 0x0 +volumelabel db "ETTINOS " +filesystem db "FAT12 " + +%endif start: @@ -38,9 +66,13 @@ sti ;Store the boot device number mov [bootdev], dl -;Load the root FAT +;Load the root ;Set the source -mov ax, 0x13 +mov ah, 0x0 +mov al, [fats] +mul word [sectorsperfat] +add ax, [bootsectors] +push ax call calcsource ;Set the destination mov si, 0x7e00 @@ -48,18 +80,25 @@ mov bx, ds mov es, bx mov bx, si ;Set the size -mov al, 0xe +push dx +mov ax, [rootentries] +mov dx, 0x20 +mul dx +mov dx, 0x0 +div word [sectorsize] +pop dx +push ax ;Load mov ah, 0x2 int 0x13 -;Search the root FAT for the system FAT +;Search the root 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 cx, word [rootentries] mov ax, 0x0 search: ;Store CX in the stack @@ -68,7 +107,7 @@ push cx mov si, sysfile mov cx, 0xb rep cmpsb -je loadsysfat +je loadfat ;Set DI to the next entry add ax, 0x20 mov di, 0x7e00 @@ -78,7 +117,9 @@ pop cx loop search ;Load the system FAT -loadsysfat: +loadfat: +;Load CX from the stack +pop cx ;Store the first cluster mov ax, word [es:di+0xf] mov word [cluster], ax @@ -89,16 +130,23 @@ call calcsource mov di, 0x7e00 mov bx, di ;Set the size -mov al, 0x9 +mov ax, [sectorsperfat] ;Load mov ah, 0x2 int 0x13 -;Load the system -loadsys: +;Load the system file + +;Load a cluster +loadcluster: ;Set the source -mov ax, word [cluster] -add ax, 0x1f +pop bx +pop ax +push ax +push bx +add ax, bx +sub ax, 0x2 +add ax, word [cluster] call calcsource ;Set the destination mov ax, 0x0 @@ -106,7 +154,7 @@ mov es, ax mov bx, word [pointer] ;Set the size mov al, 0x1 -;Load a cluster +;Load mov ah, 0x2 int 0x13 @@ -115,7 +163,7 @@ mov ax, [cluster] mov dx, 0x0 mov bx, 0x3 mul bx -mov bx, 2 +mov bx, 0x2 div bx mov si, 0x7e00 add si, ax @@ -123,45 +171,43 @@ mov ax, word [ds:si] or dx, dx jz even odd: -shr ax, 4 -jmp contcluster +shr ax, 1 +shr ax, 1 +shr ax, 1 +shr ax, 1 +jmp contcalc even: and ax, 0xfff -contcluster: +contcalc: mov word [cluster], ax cmp ax, 0xff8 jge boot add word [pointer], 0x200 -jmp loadsys +jmp loadcluster boot: jmp 0x0:0x9e00 -sysfile: -db "SYSTEM BIN" +sysfile db "SYSTEM BIN" -bootdev: -db 0 +bootdev db 0x0 -cluster: -dw 0x0 - -pointer: -dw 0x9e00 +cluster dw 0x0 +pointer dw 0x9e00 calcsource: push ax push bx mov bx, ax mov dx, 0x0 -div word [SectorsPerTrack] +div word [sectorspertrack] add dl, 0x1 mov cl, dl mov ax, bx mov dx, 0x0 -div word [SectorsPerTrack] +div word [sectorspertrack] mov dx, 0x0 -div word [Sides] +div word [sides] mov dh, dl mov ch, al pop bx diff --git a/SOURCE/BYTE2HEX.INC b/SOURCE/BYTE2HEX.INC index 655d346..78a6ac1 100644 --- a/SOURCE/BYTE2HEX.INC +++ b/SOURCE/BYTE2HEX.INC @@ -1,9 +1,15 @@ -;Converts a byte in AH to a hex string at DI. +;Converts a byte in AL to a hex string at DI. byte2hex: ;Store the initial registers in the stack -pusha +push si +push ax +push bx +push cx + +;Move the byte to AH +mov ah, al ;Set a key for the hex digits mov si, .key @@ -14,7 +20,10 @@ mov cx, 0x2 .loop: ;Read a nibble -rol ax, 0x4 +rol ax, 0x1 +rol ax, 0x1 +rol ax, 0x1 +rol ax, 0x1 mov bx, ax ;Convert the nibble to a hex digit @@ -30,9 +39,11 @@ dec cx jnz .loop ;Load the initial registers from the stack -popa +pop cx +pop bx +pop ax +pop si ret -.key: -db "0123456789abcdef" +.key db "0123456789abcdef" diff --git a/SOURCE/CMPSTR.INC b/SOURCE/CMPSTR.INC index 0eef00d..014cdda 100644 --- a/SOURCE/CMPSTR.INC +++ b/SOURCE/CMPSTR.INC @@ -1,9 +1,10 @@ -;Compares strings from SI and SI and sets the carry flag if they are equal and clears it if not. +;Compares strings from SI and DI until a null and either sets the carry flag if they are equal or clears it if not. cmpstr: ;Store the initial registers in the stack -pusha +push ax +push bx .loop: @@ -38,6 +39,7 @@ stc .done: ;Load the initial registers from the stack -popa +pop bx +pop ax ret diff --git a/SOURCE/HELLO.INC b/SOURCE/HELLO.INC index 1dc1afc..b3f7133 100644 --- a/SOURCE/HELLO.INC +++ b/SOURCE/HELLO.INC @@ -7,5 +7,4 @@ call println ret -.hello: -db "Hello world!", 0x0 \ No newline at end of file +.hello db "Hello world!", 0x0 \ No newline at end of file diff --git a/SOURCE/HELP.INC b/SOURCE/HELP.INC index 02311f1..a8abcb8 100644 --- a/SOURCE/HELP.INC +++ b/SOURCE/HELP.INC @@ -7,5 +7,4 @@ call println ret -.help: -db "Input:", 0xd, 0xa, "* Typing a character overwrites the cursor location.", 0xd, 0xa, "* The erase (=tab) key erases the cursor location.", 0xd, 0xa, "* The space and backspace keys move the cursor.", 0xd, 0xa, "Commands:", 0xd, 0xa, "* echo: echoes its input.", 0xd, 0xa, "* hello: a hello world program.", 0xd, 0xa, "* help: you are reading it.", 0xd, 0xa, "* keycode: echoes the BIOS code of a key.", 0x0 +.help db "Input:", 0xd, 0xa, "* Typing a character overwrites the cursor location.", 0xd, 0xa, "* The erase (=tab) key erases the cursor location.", 0xd, 0xa, "* The space and backspace keys move the cursor.", 0xd, 0xa, "Commands:", 0xd, 0xa, "* echo: echoes its input.", 0xd, 0xa, "* hello: a hello world program.", 0xd, 0xa, "* help: you are reading it.", 0xd, 0xa, "* keycode: echoes the BIOS code of a key.", 0x0 diff --git a/SOURCE/KEYCODE.INC b/SOURCE/KEYCODE.INC index fdfb321..e056e7e 100644 --- a/SOURCE/KEYCODE.INC +++ b/SOURCE/KEYCODE.INC @@ -15,12 +15,12 @@ mov si, .prefix call printstr ;Convert the scancode to a hex string -mov ah, [.scan] +mov al, [.scan] mov di, .keycode call byte2hex ;Convert the ascii value to a hex string -mov ah, [.ascii] +mov al, [.ascii] mov di, .keycode add di, 0x2 call byte2hex @@ -31,14 +31,9 @@ call println ret -.prefix: -db "0x", 0x0 +.prefix db "0x", 0x0 -.scan: -db 0x0 +.scan db 0x0 +.ascii db 0x0 -.ascii: -db 0x0 - -.keycode: -times 0x5 db 0x0 +.keycode times 0x5 db 0x0 diff --git a/SOURCE/PRINTNL.INC b/SOURCE/PRINTNL.INC index 9d603db..481073f 100644 --- a/SOURCE/PRINTNL.INC +++ b/SOURCE/PRINTNL.INC @@ -3,16 +3,15 @@ printnl: ;Store the initial registers in the stack -pusha +push si ;Print the newline mov si, .nl call printstr ;Load the initial registers from the stack -popa +pop si ret -.nl: -db 0xd, 0xa, 0x0 +.nl db 0xd, 0xa, 0x0 diff --git a/SOURCE/PRINTSTR.INC b/SOURCE/PRINTSTR.INC index 1ba6070..7f3af5c 100644 --- a/SOURCE/PRINTSTR.INC +++ b/SOURCE/PRINTSTR.INC @@ -3,7 +3,7 @@ printstr: ;Store the initial registers in the stack -pusha +push ax .loop: @@ -24,6 +24,6 @@ jmp .loop .done: ;Load the initial registers from the stack -popa +pop ax ret diff --git a/SOURCE/READCH.INC b/SOURCE/READCH.INC index 012e022..9b0680e 100644 --- a/SOURCE/READCH.INC +++ b/SOURCE/READCH.INC @@ -25,5 +25,4 @@ pop bx mov ah, bh pop bx -.done: ret diff --git a/SOURCE/READSTR.INC b/SOURCE/READSTR.INC index 2c96c0f..16b7d42 100644 --- a/SOURCE/READSTR.INC +++ b/SOURCE/READSTR.INC @@ -3,7 +3,10 @@ readstr: ;Store the initial registers in the stack -pusha +push ax +push bx +push cx +push dx ;Store the input length in the stack mov ah, 0 @@ -116,7 +119,10 @@ jmp .findend .done: ;Load the initial registers from the stack -popa +pop dx +pop cx +pop bx +pop ax ret diff --git a/SOURCE/SYSTEM.ASM b/SOURCE/SYSTEM.ASM index 7d4eaae..5ea6f85 100644 --- a/SOURCE/SYSTEM.ASM +++ b/SOURCE/SYSTEM.ASM @@ -1,4 +1,6 @@ -[ORG 0x9e00] +CPU 8086 +ORG 0x9e00 + jmp start ;Calls @@ -86,26 +88,18 @@ mov si, error call println jmp loop -cpl: -db 0x0 +cpl db 0x0 -welcome: -db 0xd, 0xa, "Welcome to EttinOS!", 0xd, 0xa, 0x0 +welcome db 0xd, 0xa, "Welcome to EttinOS!", 0xd, 0xa, 0x0 -prompt: -db "> ", 0x0 +prompt db "> ", 0x0 cmd: -.echo: -db "echo", 0x0 -.hello: -db "hello", 0x0 -.help: -db "help", 0x0 -.keycode: -db "keycode", 0x0 -error: -db "Unknown command", 0x0 +.echo db "echo", 0x0 +.hello db "hello", 0x0 +.help db "help", 0x0 +.keycode db "keycode", 0x0 -buffer: -times 0xff db 0 +error db "Unknown command", 0x0 + +buffer times 0xff db 0 diff --git a/make.sh b/make.sh index ffa2d71..8ae9905 100755 --- a/make.sh +++ b/make.sh @@ -1,11 +1,18 @@ #!/bin/bash cd SOURCE/ -nasm BOOT.ASM -f bin -o ../BOOT.BIN + +if [ "$1" == "-F1440" ] + then nasm BOOT.ASM -d F1440 -f bin -o ../BOOT.BIN + else nasm BOOT.ASM -f bin -o ../BOOT.BIN +fi nasm SYSTEM.ASM -f bin -o ../SYSTEM.BIN cd .. rm -f EttinOS.img -mkfs.fat -C EttinOS.img 1440 +if [ "$1" == "-F1440" ] + then mkfs.fat -C EttinOS.img 1440 + else mkfs.fat -C EttinOS.img 360 +fi dd if=BOOT.BIN of=EttinOS.img conv=notrunc bs=512 count=1 mcopy -i EttinOS.img SYSTEM.BIN ::