2021-06-22 13:05:09 +00:00
|
|
|
EttinOS
|
|
|
|
=======
|
|
|
|
|
|
|
|
EttinOS is a minimalist 16-bit DOS-like hobbyist operating system for
|
2021-06-24 15:34:41 +00:00
|
|
|
the IBM Personal Computer and compatible machines. Its git repository
|
2021-07-10 17:49:06 +00:00
|
|
|
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.
|
2021-06-22 13:05:09 +00:00
|
|
|
|
|
|
|
System requirements
|
|
|
|
-------------------
|
|
|
|
|
|
|
|
* An Intel 8086 or compatible CPU
|
|
|
|
* BIOS, or UEFI in legacy mode
|
|
|
|
* 64 KiB of RAM
|
2021-07-04 16:16:27 +00:00
|
|
|
* 1-4 floppy disk drives (hard disk drives are not supported)
|
2021-06-22 13:05:09 +00:00
|
|
|
|
|
|
|
Building
|
|
|
|
--------
|
|
|
|
|
|
|
|
Build dependencies:
|
|
|
|
* A Unix-like operating system
|
|
|
|
* coreutils
|
|
|
|
* dosfstools
|
|
|
|
* mtools
|
|
|
|
* nasm
|
2021-06-25 17:24:38 +00:00
|
|
|
* rw (optional)
|
2021-06-22 13:05:09 +00:00
|
|
|
|
|
|
|
Running make.sh will build EttinOS and create a bootable 360 KiB 5.25"
|
2021-06-26 15:55:47 +00:00
|
|
|
floppy disk image named EttinOS.img and a source image of the same
|
2021-07-04 16:16:27 +00:00
|
|
|
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.
|
2021-06-22 13:05:09 +00:00
|
|
|
|
2021-06-27 16:22:58 +00:00
|
|
|
Usage
|
2021-06-22 13:05:09 +00:00
|
|
|
-----
|
|
|
|
|
2021-06-27 16:22:58 +00:00
|
|
|
The input system is inspired by typewriters. Typing a character
|
2021-06-22 13:05:09 +00:00
|
|
|
overwrites the cursor location and the erase (=tab) key erases it. The
|
|
|
|
space and backspace keys move the cursor.
|
|
|
|
|
2021-07-04 16:16:27 +00:00
|
|
|
EttinOS assigns the drives letters from A to D and uses the FAT12 file
|
2021-07-10 17:49:06 +00:00
|
|
|
system. The hidden and total sectors entries of the BIOS parameter
|
|
|
|
block, the entire extended BIOS parameter block, file attributes, and
|
|
|
|
the file access date are not supported and are ignored if present: as a
|
|
|
|
result disk labels and subdirectories are not supported. Drive letters
|
|
|
|
and file names are case-insensitive and the latter follow the 8.3
|
|
|
|
format. Text files use CRLF line endings.
|
2021-07-04 16:16:27 +00:00
|
|
|
|
|
|
|
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 drive are stored as external programs: the command for a
|
|
|
|
program is its file specification without the extension.
|
2021-06-28 17:00:22 +00:00
|
|
|
|
2021-06-27 16:22:58 +00:00
|
|
|
Commands included in EttinOS:
|
|
|
|
* [A-D]:: Change the drive.
|
2021-07-04 16:16:27 +00:00
|
|
|
* ECHO: Print a message. Syntax: ECHO Message to be printed
|
2021-06-27 16:22:58 +00:00
|
|
|
* HELLO: Print "Hello world!".
|
2021-07-04 16:16:27 +00:00
|
|
|
* 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
|
2021-07-10 17:49:06 +00:00
|
|
|
screen at the same time. Press any key other than escape to continue
|
|
|
|
printing after each screen or escape to quit the program.
|
2021-06-25 17:24:38 +00:00
|
|
|
|
2021-06-22 13:05:09 +00:00
|
|
|
Programming
|
|
|
|
-----------
|
|
|
|
|
2021-07-04 16:16:27 +00:00
|
|
|
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.
|
2021-06-22 13:05:09 +00:00
|
|
|
|
|
|
|
System calls:
|
|
|
|
* Interrupt 0x20: Return to the shell.
|
|
|
|
* Interrupt 0x21: Input and output:
|
|
|
|
* 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.
|
|
|
|
* Interrupt 0x22: Disk operations:
|
2021-07-04 16:16:27 +00:00
|
|
|
* AH = 0x0: Load a file named at SI as a string ending in a null
|
2021-07-06 18:12:15 +00:00
|
|
|
to the offset BX and store the file size in CX and the
|
|
|
|
error codes in AL:
|
2021-07-01 13:50:43 +00:00
|
|
|
* 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
|
2021-06-22 13:05:09 +00:00
|
|
|
* AH = 0x1: Save a file (under construction).
|
2021-06-29 17:05:14 +00:00
|
|
|
|
|
|
|
Known bugs
|
|
|
|
----------
|
|
|
|
|
2021-07-04 16:16:27 +00:00
|
|
|
* 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.
|