This program is free software; you can redistribute it and/or modify it under
-the terms of version 3 of the GNU Lesser General Public License or later as
-published by the Free Software Foundation.
+
Current implementation does not support object oriented
programming. While working on Fifth I got lots of cool new ideas that
@@ -258,7 +399,7 @@ require reimplementation of everything.
Currently I try to implement those new ideas in the project called
-Sixth
+Sixth.
@@ -267,41 +408,63 @@ operating system.
-
-
2 Introduction
-
+
+
3 Introduction
+
-Fifth is programming lanquage & operating system, running on virtual
-CPU, with custom instruction set. It is much like Charles Chunk
+Fifth is programming lanquage & operating system, running on virtual
+machine, 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.
-Screenshots
+Startup screen diplaying Fifth logo and full file list.
+
+
+
+
+
+
-Read more about:
+Sample words defined. Most of the words are commands that can be
+executed interactively from command line or from file. When executed
+they can be selectively compiled or interpreted.
+
Just unpack all files, witout altering original directory structure,
somewhere in your hard disk. For example: C:\MISC\FIFTH\…. To run
@@ -310,231 +473,261 @@ or EMULATOR.COM ), and virtual disk file ( DISK.RAW ).
+After downloading and unpacking the ZIP file you shoud get directory
+tree similar to this:
+
+
+
+DOC - Fifth documentation
+ commands - documentation on Fifth built-in commands
+ modules - documentation on additional commands, realized as loadable modules
+ shots - Fifth screenshots
+
+imageFile - files contained within 'disk.raw', just an extracted form.
+
+source - source files
+ emulator - emulator source
+ util - utilites
+
+disk.raw - Virtual disk file, has filesystem inside.
+emulator.com - main executable.
+
+
+
+
+
+
6 Requirements
+
+
+
+
6.1 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).
-
+
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).
-
-
4.2 Hardware:
-
+
+
6.2 Hardware
+
-
Minimum CPU 386.
-
-
64 KB free RAM below 640KB,
-
-
2 MB of free XMS.
-
-
VESA compatible video card.
-
+
Minimum CPU 386.
+
64 KB free RAM below 640KB,
+
2 MB of free XMS.
+
VESA compatible video card.
-
-
4.3 Human:
-
+
+
6.3 Human
+
-
Beginner level Forth knowledge is recommended.
-
-
Lots of enthusiasm.
-
+
Beginner level Forth knowledge is recommended.
+
Lots of enthusiasm.
-
-
5 Numbers representation
-
+
+
7 Numbers representation within Fifth
+
+
+Because we are in full experimentation mode here (no regard for
+compatibility whatsoever), why not to try also alternative number
+representation ?
+
-
-
+
+Here alternative hexadecimal number representation format is devised:
+
+
+
+
+
+
+
+
+
+Essentially square is split into 4 triangles. Each triangle represents
+one bit.
-
-Because I can define everything, starting from CPU, why not try also
-alternative and unique number representation ?
+Fifth uses this hexadecimal format as primary throughout entire
+system.
-Fifth uses its hexdecimal number representation as primary. Numbers
-shape is formed by dividing a square into four parts. And manipulating
-their color (black or white).
+See also: Bibi-binary.
-
-
6 Disk file map, and it's data structures
-
+
+
+
8 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.
-
-
6.1 disk allocation
-
-
+
+
8.1 Disk allocation
+
+
-
+
-
+
-
+
-
offset
-
length
-
description
+
offset
+
length
+
description
-
0
-
~4 Kb
-
Fifth core
+
0
+
~4 Kb
+
Fifth core
-
4 Kb
-
~32Kb
-
high-level boot code
+
4 Kb
+
~32 Kb
+
high-level boot code
-
37 Kb
-
~65Kb
-
FAT
+
37 Kb
+
~65 Kb
+
FAT
-
101Kb
-
~16MB
-
filesystem data area
+
101 Kb
+
~16 MB
+
filesystem data area
-
-
6.2 FAT entry format:
-
-
+
+
8.2 FAT entry format:
+
+
-
+
-
+
-
code
-
meaning
+
code
+
meaning
-
-2
-
last sector
+
-2
+
last sector
-
-1
-
empty sector
+
-1
+
empty sector
-
0 --
-
.. pointer to next block
+
0 --
+
.. pointer to next block
-
-
6.3 file entry format
-
-
+
+
8.3 File entry format
+
+
-
+
-
+
-
+
-
offset
-
length
-
description
+
offset
+
length
+
description
-
0
-
4
-
extension
+
0
+
4
+
extension
-
4
-
16
-
name
+
4
+
16
+
name
-
20
-
4
-
entry point
+
20
+
4
+
entry point
-
24
-
4
-
size
+
24
+
4
+
size
-
28
-
4
-
last modification time
+
28
+
4
+
last modification time
-
-
7 Core architecture
-
+
+
9 Core architecture
+
Fifth core is simply some amount of already compiled into machine code
and linked together modules (entries in other words). In compilation
@@ -546,64 +739,64 @@ dictionary space only. Random word can be removed from dictionary at
any time. Currently dictionary can contain at most 1000 entries.
-
-
7.1 dictionary entry format
-
-
+
+
9.1 Dictionary entry format
+
+
-
+
-
+
-
+
-
offset
-
length
-
description
+
offset
+
length
+
description
-
0
-
4
-
0 < previous entry
+
0
+
4
+
0 < previous entry
-
-
-
0 = last
+
+
+
0 = last
-
-
-
-1 = empty
+
+
+
-1 = empty
-
4
-
15
-
module name string
+
4
+
15
+
module name string
-
19
-
1
-
entry type
+
19
+
1
+
entry type
-
20
-
4
-
entry data
+
20
+
4
+
entry data
@@ -615,114 +808,603 @@ run through headers backwards and find needed entry.
-
-
7.2 Possible module types
-
-
+
+
9.2 Possible module types
+
+
-
+
-
+
-
+
-
type
-
description
-
"execute" action
+
type
+
description
+
"execute" action
-
0
-
data
-
compile "num" instruction
+
0
+
data
+
compile "num" instruction
-
-
-
with address to module
+
+
+
with address to module
-
1
-
submodule
-
compile "call" instruction
+
1
+
submodule
+
compile "call" instruction
-
-
-
with address to module
+
+
+
with address to module
-
2
-
imm. submodule
-
immediately call to module
+
2
+
imm. submodule
+
immediately call to module
-
-
7.3 Memory map: (average)
-
-
+
+
9.3 Memory map
+
+
-
+
-
+
-
+
-
<loc>
-
<size>
-
<desc>
+
location
+
size
+
description
-
0
-
~4096
-
core
+
0
+
~4096
+
core
-
1500000
-
~32000
-
highlevel Fifth boot code
+
1500000
+
~32000
+
highlevel Fifth boot code
-
200000h
-
-
core startup messages area
+
200000h
+
+
core startup messages area
-
5200000
-
-
end of dynamic memory space
+
5200000
+
+
end of dynamic memory space
-
-
8 Fifth source format
-
+
+
10 Virtual machine
+
+
+Using CPU emulator slows it down but I shouldn't now think too mutch
+about, and waste my time on batteling with problems whitch results on
+complex design of PC hardware. Also it allows me to use existing DOS
+and resident drivers services in real mode. So I don't need to deal
+with hardware too mutch. It also allows me to use all free XMS for
+flat code & data storage.
+
+
+
+Current emulator emulates 1 CPU. It has 2 stacks, ~50 instructions,
+and 4GB flat address space (theoretically). I'm not sure that DOS
+6.22 that I currently prefer can handle more than 64 MB of RAM. While
+I tried to keep instructionset simple, I was forced to put in lot of
+complex instructions to make it's performance acceptable on
+emulator. On actual silicon ~20 instructions is enaugh (I think).
+
+
+
+Maybe one day similar system will run directly on custom silicon chip :)
+
+
+
+
+CPU has following registers:
+
+
+
+
+
+
+
+
+
+
+
+
IP
+
instruction pointer
+
+
+
+
DSP
+
data stack pointer
+
+
+
+
RSP
+
return stack pointer
+
+
+
+
+
+
10.1 instruction set
+
+
+
+
10.1.1 overview table
+
+
+Virtual CPU, commands (most of them are avaiable as ordinary commands
+in programming language):
+
10.1.2 kbd@ - read scancode of pressed or released key
+
+
+Returns 0 if no data available.
+
+
+
+
+
10.1.3 vidput - put image1 into image2, at location x, y
+
+
+Does clipping, so part of a big image can be mapped into smaller one.
+
+
+
+
+
10.1.4 cmove - copy memory array
+
+
+Move memory from addr1 to addr2. If addr1 is greater than addr2 then
+count address foward while moving, elseway starts from end and counts
+backwards, so no data loss occurs when memory regions partially
+overlap.
+
+
+
+
+
10.1.5 tvidput - put image with transparency support
+
+
+Stack footprint
+
+
+addr1 addr2 x y --
+
+
+
+
+Put image1 into image2, at location x, y with transparency support
+
+
+
+Color 255 in source image is treated as transparent.
+
+
+
+
+
10.1.6 charput - draw text character
+
+
+Draw character to image buffer located at "addrdest" to specified x &
+y location. Decodes 8 bytes from source to bits, used to draw
+character.
+
+
+
+
+
+
+
+
11 Fifth source format
+
Fifth uses a different character table and codes than ASCII (still
almost similar). I call it FSCII (Fifth Standard Code for Information
@@ -732,109 +1414,785 @@ numeric values. So typical nemric characters "0123…" is treated
like ordinary letters.