FIFTH - virtual machine, operating system, programming language
Download
Online homepage
Other applications hosted on svjatoslav.eu
Program author:
Svjatoslav Agejenko
Homepage: http://svjatoslav.eu
Email: svjatoslav@svjatoslav.eu
This software is distributed under GNU GENERAL PUBLIC LICENSE Version 2.
Introduction
Fifth is programming lanquage & operating system, running on
virtual CPU, with custom instruction set. It is much like
Charles Chunk Moore's Forth, it also uses stack architecture,
and many commands are similar. Basically I got familiar with
concepts of Forth, and being inspired created my own system.
Note:
Current implementation does not support object oriented programming.
While working on Fifth I got lots of cool new ideas that require reimplementation
of everything.
Currently I try to implement those new ideas in the project called Sixth.
Screenshots
Read more about:
Virtual CPU
Built-in commands
Additional commands, realized as loadable modules
Example Fifth source file - text editor
Installation
Just unpack all files, witout altering original directory structure,
somewhere in your hard disk. For example: C:\MISC\FIFTH\....
To run fifth you need minimally just 2 files.
emulator itself ( EMULATOR.EXE or EMULATOR.COM ), and
virtual disk file ( DISK.RAW ).
Read more about distribution directory layout.
Software/Hardware/Human requirements
Software:
MS-DOS 6.22, with HIMEM.SYS loaded.
Mouse driver if you have a mouse.
Does work only when CPU is in real mode.
To recompile ASM sources I used FASM (Flat Assembler).
I ran QBasic utilities on QB 4.5 .
VESA support by BIOS, or external driver (UNIVBE).
Hardware:
Minimum CPU 386.
64 KB free RAM below 640KB,
2 MB of free XMS.
VESA compatible video card.
Human:
Beginner level Forth knowledge is recommended.
Enthusiasm.
Numbers representation
Fifth uses hexdecimal number representation as primary.
Numbers shape is formed by dividing a square into four parts.
And manipulating their color (black or white).
Disk file map, and it's data structures
Core and high-level boot code is stored outside of the filesystem to allow
easy access to it, at early booting time, when filesystem is not yet
initialized.
disk allocation:
offset length description
0 ~4 Kb Fifth core
4 Kb ~32Kb high-level boot code
37 Kb ~65Kb FAT
101Kb ~16MB filesystem data area
FAT entry format:
-2 last sector
-1 empty sector
0 -- .. pointer to next block
file entry format
offset length description
0 4 extension
4 16 name
20 4 entry point
24 4 size
28 4 last modification time
Core architecture
Fifth core is simply some amount of already compiled into machine code
and linked together modules (entries in other words). In compilation
process modules is compiled one by one and simply stored on top of
already existing and growing core. Separately from core is kept
dictionary, this is special list that contain names of compiled modules,
variables etc. and they locations in core. Constants use dictionary space
only. Random word can be removed from dictionary at any time. Currently
dictionary can contain at most 1000 entries.
dictionary entry format
offset length description
0 4 0 < previous entry
0 = last
-1 = empty
4 15 module name string
19 1 entry type
20 4 entry data
Core headers as linked list of module names make up something like dictionary.
When some entry address is needed compiler can quickly run through headers
backwards and find needed entry.
Possible module types
type description "execute" action
0 data compile "num" instruction
with address to module
1 submodule compile "call" instruction
with address to module
2 imm. submodule immediately call to module
Memory map: (average)
0 ~4096 core
1500000 ~32000 highlevel Fifth boot code
200000h core startup messages area
5200000 end of dynamic memory space
Fifth source format
Fifth uses a different character table and codes than ASCII.
I call it FSCII (Fifth Standard Code for Information Interchange)
for example space character is not 32 but 255 instead.
I plan to use mainly HEX numbers, and create new characters
to represent numeric values. So typical nemric characters "0123..."
is treated like ordinary letters.
FSCII:
DEC HEX function
0 - 15 0 - F HEX numbers
252 FC backspace
253 FD tabulator (TAB)
254 FE carriage return (CR)
255 FF space
else ordinary characters, like in ASCII.