An operating system
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
5.1 KiB

EttinOS
=======
EttinOS is a minimalist 16-bit hobbyist disk operating system for the
IBM Personal Computer and compatible machines. Its git repository can be
found at https://ahti.space/git/crazyettin/EttinOS and that of
EttinOS-extra, a collection of programs for the system, at
https://ahti.space/git/crazyettin/EttinOS-extra.
System requirements
-------------------
* An Intel 8086 or compatible CPU
* BIOS, or UEFI in legacy mode
* 64 KiB of RAM
* 1-4 floppy disk drives (hard disk drives are not supported)
Building
--------
Build dependencies:
* A Unix-like operating system
* coreutils
* dosfstools
* mtools
* nasm
* rw (optional)
Running make.sh will build EttinOS and create a bootable 360 KiB 5.25"
floppy disk image named EttinOS.img and a source image of the same
format named EttinOS-src.img. To get 1440 KiB 3.5" images instead use
the argument -1440. If you want to use another format you will have to
build the system manually.
Usage
-----
The input system is inspired by typewriters. Typing a character
overwrites the cursor location and the erase (=tab) key erases it. The
space and backspace keys move the cursor.
EttinOS assigns the drives letters from A to D and uses a version of the
MS-DOS 3.0 FAT12 file system (in actual use since 2.1) without support
for file attributes and thus disk labels and subdirectories. Drive
letters and file names are case-insensitive and the latter follow the
8.3 format. Text files use CRLF line endings.
Drives and files are specified as ([A-D]:) and ([A-D]:)FILENAME.EXT
respectively. Specifying the current drive, indicated in the prompt, is
optional.
A command can be followed by arguments separated from eachother and the
command with spaces. Extra spaces are ignored. Commands other than
changing the current drive are stored as external programs: the command
for a program is its file specification without the extension.
Commands included in EttinOS:
* [A-D]:: Change the current drive.
* ECHO: Print a message. Syntax: ECHO Message to be printed
* HELLO: Print "Hello world!".
* LIST: Print a list of the files on a drive. Syntax: LIST DRIVE
* PRINT: Print a text file. Syntax: PRINT FILE
Both LIST and PRINT page their output if all of it does not fit on the
screen at the same time. Press any key other than escape to continue
printing after each screen or escape to quit the program.
Programming
-----------
EttinOS has a flat address space of 64 KiB. The data, stack, and extra
segments are set at the beginning of the RAM and the system stack at the
end of the address space. Programs are loaded at address 0x3000, the
number of the current drive is loaded in DL, and SI is pointed at the
command tail (a string ending in a null) when the program is executed.
The stack is reset back to the end of the address space after a program
has finished running.
System calls:
* Interrupt 0x20: Return to the shell.
* Interrupt 0x21: String operations:
* AH = 0x0: Print a string ending in a null from SI.
* AH = 0x1: Read a string ending in a null of at most AL
characters to DI until a return.
* AH = 0x2: Print a string ending in a null from SI followed by a
CRLF.
* AH = 0x3: Read a string ending in a null of at most AL
characters to DI until a return and print a CRLF.
* AH = 0x4: (Under construction) Convert a decimal string ending
in a null at SI to a value in AL.
* AH = 0x5: (Under construction) Convert a value in AL to a
decimal string ending in a null at DI.
* AH = 0x6: (Under construction) Convert a hexadecimal string
ending in a null at SI to a value in AL.
* AH = 0x7: (Under construction) Convert a value in AL to a
hexadecimal string ending in a null at DI.
* Interrupt 0x22: Disk operations:
* AH = 0x0: (Under construction) Load the directory of a drive
named at SI as a string ending in a null to the offset
BX and store the error codes in AL:
* AL = 0x0: Succesful load
* AL = 0x1: Drive not found
* AL = 0x2: Unable to read disk
* AH = 0x1: (Under construction) Store a directory at the offset
BX to a drive named at SI as a string ending in a
null.
* AH = 0x2: Load a file named at SI as a string ending in a null
to the offset BX and store the file size in CX and the
error codes in AL:
* AL = 0x0: Succesful load
* AL = 0x1: Drive not found
* AL = 0x2: Unable to read disk
* AL = 0x4: File or command not found
* AL = 0x8: Not enough memory
* AH = 0x3: (Under construction) Save a file.
Known bugs
----------
* Trying to access a disk of different format than the current one can
crash the system.
* Files beyond the ~40th one on the disk might not load properly.