old-DasOS/documentation/virtual-device.md

115 lines
4.4 KiB
Markdown
Raw Permalink Normal View History

2016-06-27 14:04:56 +00:00
# DasOS Virtual Device
DasOS emulates a virtual device that is shared between
all platform implementations. This device provides a
uniform environment with fixed specifications of hardware
and software as well as syscalls.
## Hardware
This section describes the virtual hardware components.
### CPU
The virtual device uses an *SPU Mark I* as the main processor.
### RAM
The *CPU* has a 32 MB *RAM* connected. In this RAM, both
data and code resides and the RAM has no memory protection.
### Screen
The screen connected to the *vGPU* has a resolution of
640x480 pixels and a color depth of 24 bits.
### vGPU
The *vGPU* provides access to the *Screen* and allows the
manipulation of its contents.
The gpu uses a double buffering system with a front and a
back buffer where as the front buffer is displayed on the
screen and the back buffer is modified by the CPU.
The gpu provides functions for printing text to the screen
as well as drawing visual primitives and clearing or swapping
the back buffer.
In addition to the features mentioned above, the back buffer is
accessible by a memory mapped area in the *RAM*.
### Persistent Storage
Two persistent storage devices are connected to the virtual device.
Both storage devices behave like IDE block devices where as the first
device is a fixed device and the second device is hot-pluggable.
The size and file format of the storage device is not specified.
## Software
This section describes the basic software components and interfaces
of the virtual device.
### BIOS
Each device implementation provides a *BIOS* that initialized
the device and provides host-dependant configuration.
### Boot Sequence
The boot sequence is initiated by the *BIOS* of the device
and can only be changed with a BIOS configuration.
- Determine existence of persistant storage devices
- Fixed device
- Swappable device
- Bootloading
- Searching for a fitting partition
- FAT32 formatted partition
- `/system.exp` must exist
- *Exploading* `/system.exp` into RAM
- Clearing *vGPU* text screen.
- Jump to *Entry Point*
### Memory Areas
#### Memory Mapped IO
The memory between `0x200000` and `0x400000` is reserved for
hardware use.
#### Entry Point
After successfully initialization, the virtual device jumps
to the address `0x400000` which is equal to the instruction
index `0x100000`.
### vGPU Interface
#### Back Buffer
The back buffer of the vGPU is organized in n RGB24 format
where pixels are stored in a 24 bpp format with R as the first
byte, G as the second and B as the last.
It is 900 kB large and maps the full screen area of 640x480 pixels
as a linear frame buffer from `0x200000` to `0x2E1000`.
#### MMIO Registers
The *vGPU* also uses some registers accessible via memory mapped io.
| Register | Address | Type | Description |
|----------|----------|------|-----------------------------------------|
| COLOR | 0x2E1000 | u32 | The color used for any draw commands. |
| CURSORX | 0x2E1004 | u16 | The x position of the draw cursor |
| CURSORY | 0x2E1006 | u16 | The y position of the draw cursor |
| SPRITE | 0x2E1008 | ptr | The address of the sprite to copy |
| WIDTH | 0x2E100C | u16 | The width of the sprite. |
| HEIGHT | 0x2E101E | u16 | The height of the sprite. |
| PITCH | 0x2E1010 | u32 | The pitch (memory width) of the sprite. |
#### HWIO Interface
The vGPU is controllable via the HWIO command of the SPU
with the command info >= `0x10000`.
| Command | CmdInfo | Input0 | Input1 | Description |
|---------|---------|--------|--------|-----------------------------------------------------------|
| Clear | 0x10000 | y | x | Clears the screen and moves the cursor to (x,y) |
| Line | 0x10001 | y | x | Draws a line from the cursor to (x,y). |
| Rect | 0x10002 | y | x | Draws a rectangle between the cursor and (x,y). |
| Fill | 0x10003 | y | x | Fills a rectangle between the cursor and (x,y). |
| Copy | 0x10004 | y | x | Renders the current sprite at (x,y) and moves the cursor. |
| Pixel | 0x10005 | y | x | Sets the pixel at (x,y). |
| Move | 0x10006 | y | x | Moves the cursor to (x,y). |
# TODO: Text Commands