Fifth - virtual machine, operating system, programming language
--
-
-
- download latest snapshot
++
Fifth - virtual machine, operating system, programming language
++-Table of Contents
+++-
+
- 1. General + - -
- 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. +
- 2. !Project deprecated! +
- 3. Introduction + - -
- Program author:
-
-
-
- Svjatoslav Agejenko +
- 4. Installation +
- 5. Fifth distribution directory tree description +
- 6. Requirements + -
- Homepage: http://svjatoslav.eu +
- 7. Numbers representation within Fifth +
- 8. Disk file map, and it's data structures + -
- Email: mailto://svjatoslav@svjatoslav.eu +
- 9. Core architecture + +
- 10. Virtual machine + +
- 11. Fifth source format + + +
- 12. Fifth commands + + +
- 13. Dynamically loadable modules + + +
-1 !Project deprecated!
+++ +1 General
++-
+
- This program is free software: released under Creative Commons Zero +(CC0) license + +
- Program author:
+
-
+
- Svjatoslav Agejenko +
- Homepage: https://svjatoslav.eu +
- Email: mailto://svjatoslav@svjatoslav.eu +
+
+ - Other software projects hosted at svjatoslav.eu +
++1.1 Source code
+++-
+
- Download latest snapshot in TAR GZ format + +
- Browse Git repository online + +
+Clone Git repository using command: +
++git clone https://www2.svjatoslav.eu/git/fifth.git +
+
+-2 !Project deprecated!
+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.
+ ++3.1 screenshots
++-++
+-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. +
+ + + +++ ++Built in text editor. +
-+ +3 Installation
-+++-4 Installation
+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 ).
-Read more about distribution directory layout +Read more about Fifth distribution directory tree description.
-4 Software/Hardware/Human requirements
---4.1 Software:
-+ +++ +5 Fifth distribution directory tree description
++++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 ? +
--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 -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): +
+ + ++ + +
++ + ++ + + + + + + + + + +# +name +stack footprint +description ++ + +0 +nop +-- +does nothing ++ + +1 +halt +-- +halt CPU ( return to DOS on emulator ) ++ + +2 +kbd@ +– c +read scancode of pressed or released key ++ + +3 +num <dword> +– n +put immidiate number into datastack ++ + +4 +jmp <dword> +-- +jump to specified code ++ + +5 +call <dword> +jump to specified code, save return address to return stack ++ + +6 +1+ +n – n+1 ++ + +7 +1- +n – n-1 ++ + +8 +dup +n – n n +duplicate top of data stack ++ + +9 +drop +n -- +drop last element in data stack ++ + +10 +if <dword> +n -- +jump to addr if top element was 0 ++ + +11 +ret +jump to code, specified in return stack. ++ + +12 +c@ +addr – n +read byte from memory at specified address ++ + +13 +c! +n addr -- +store byte to specified memory ++ + +14 +push +DSTK -> RSTK +move top of datastack to returnstack ++ + +15 +pop +RSTK -> DSTK +move top of returnstack to datastack ++ + +16 +<unused> ++ + +17 +rot +n1 n2 n3 – n2 n3 n1 +rotate stack elements ++ + +18 +disk@ +FromDiskSect ToMem -- +read 1KB from disk into RAM ++ + +19 +disk! +FromMem ToDiskSect -- +write 1KB to disk ++ + +20 +@ +addr – n +read 32 bit number from memory ++ + +21 +! +n addr -- +store 32 bit number to memory ++ + +22 +over +n1 n2 – n1 n2 n1 ++ + +23 +swap +n1 n2 – n2 n1 ++ + +24 ++ +n1 n2 – n1+n2 ++ + +25 +- +n1 n2 – n1-n2 ++ + +26 +* +n1 n2 – n1*n2 ++ + +27 +/ +n1 n2 – n1/n2 ++ + +28 +> +n1 n2 – result +is true when n1 > n2 ++ + +29 +< +n1 n2 – result +is true when n1 < n2 ++ + +30 +not +n1 – not_n1 +logical not ++ + +31 +i +– n +copies top of return stack into datastack ++ + +32 +cprt@ +addr – n +read one byte from hardware port ++ + +33 +cprt! +n addr -- +store one byte to hardware port ++ + +34 +i2 +– n +like "i" but takes second top stack element ++ + +35 +i3 +– n +like "i" but takes third top stack element. ++ + +36 +shl +n amount – n +left bit shift ++ + +37 +shr +n amount – n +right bit shift ++ + +38 +or +n1 n2 – n +logical or ++ + +39 +xor +n1 n2 – n +exclusive logical or ++ + +40 +vidmap +addr -- +copy memory from "addr" to video memory. ++ + +41 +mouse@ +– x y button +read mouse coordinates & buttons ++ + +42 +vidput +addr1 addr2 x y -- +put image1 into image2, at location x, y ++ + +43 +cmove +addr1 addr2 amount +move memory from addr1 to addr2 ++ + +44 +cfill +c addr amount -- +fill memory starting at "addr" with "c" bytes. ++ + +45 +tvidput +addr1 addr2 x y -- +put image with transparency support ++ + +46 +depth +– depth +returns current depth of data stack. ++ + +47 +charput +colorfg colorbg addrsrc addrdest x y +draw text character +++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.
-8.1 FSCII:
--+
+-11.1 FSCII
++- + - + - + - DEC -HEX -function +DEC +HEX +function - 0 - 15 -0 - F -HEX numbers +0 - 15 +0 - F +HEX numbers - 252 -FC -backspace +252 +FC +backspace - 253 -FD -tabulator (TAB) +253 +FD +tabulator (TAB) - 254 -FE -carriage return (CR) +254 +FE +carriage return (CR) - 255 -FF -space +255 +FF +space - else -ordinary characters, same as in ASCII. +else +ordinary characters, same as in ASCII. --