Virtual machine

From ScienceZero
Revision as of 15:57, 9 April 2014 by Bjoern (Talk | contribs) (Created page with "Notation for functions : Define a new function ; End definition ( Start comment ) End comment Example, a function called inc that increases a value by 1 : inc ...")

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Notation for functions

 :  Define a new function
 ;  End definition
 (  Start comment
 )  End comment
 Example, a function called inc that increases a value by 1
   : inc 1 add ;
 Write numbers directly without using LDC/LDN/LDE since they are implied
 After being defined a function can be used just like any other instruction


Notation of stack diagrams for instructions and functions

 A stack diagram shows how many items a function/instruction take from the stack and put back
 Show what is taken off the stack then what is put back on the stack separated by --
 n n -- n
 Example, a function called mul that takes two numbers off the stack and writes one number back
   : mul ( n n -- n ) 0 rot for over add next nip ;
 Use n for general numbers but name the items if it makes sense
 For example a function that calculates power from voltage and current
   : power ( volt ampere -- watt ) mul ;


When writing down the stack on one line, the top of the stack is to the right on the line.

A stack with four items, 7 is the topmost item.

 1 4 2 7 

Performing an ADD instruction will result in this stack:

 1 4 9

2 and 7 are discarded and the sum 9 is written back to the stack.


Each instruction is one byte (8 bits). The 4 most significant bits is the type of instruction and the 4 least significant bits is the data.

 7      0
 ttttdddd


The registers and stack cells are 32 bit each, the registers are internal to the virtual machine The registers will be put on the return stach when a function is called so the machine can return safely


Registers

 PC Program counter        - Points to the next instruction
 DP Data stack pointer     - Points to the next free cell on the data stack
 RP Return stack pointer   - Points to the next free cell on the return stack
 LP Local variable pointer - Points to the first local variable or local array element on the return stack
                             This is also used when unwinding a stack frame

Machine code instructions Version 2

Type     Data
   0 LDC #imm4             - Load 4 bit immediate constant
   1 LDN #imm4             - Load 4 bit immediate negative constant
   2 LDE #imm4             - Load extend as TOP = TOP:imm4
   3 LSL #imm4             - Logical shift left by n + 1
   4 DIM #imm4             - Reserve n + 1 elements on the return stack
   5 LDL #imm4             - Load local variable from the return stack
   6 STL #imm4             - Store local variable on the return stack
   7 SYS #'aaaa'           - Call system function as TOP:imm4
   8 LEA #'aaaa'           - Load effective address as TOP:imm4
   9 JUMP #'aaaa'          - Jump as TOP:imm4
   A CALL #'aaaa'          - Call function as TOP:imm4
   B OPR0 *RESERVED*       - Reserved for future expansion
   C OPR1 #imm4
           0 ADD.          - 32 bit IEEE 754 floating-point operation
           1 SUB.
           2 MUL.
           3 DIV.
           4 SQRT.
           5 TOF.          - Convert from integer to floating-point
           6 TOI.          - Convert from floating-point to integer 
           7 *RESERVED*    - Reserved for future expansion of floating-point
           8 *RESERVED*   
           9 *RESERVED*   
           A *RESERVED*   
           B *RESERVED*   
           C *RESERVED*   
           D *RESERVED*   
           E *RESERVED*   
           F *RESERVED*   
   D OPR2 #imm4
           0 ADD           - 32 bit two's complement addition
           1 SUB
           2 MUL
           3 DIV           - 32 bit unsigned division
           4 SDIV
           5 LSL
           6 LSR
           7 ASR
           8 ROR
           9 AND
           A OR
           B EOR
           C NOT
           D NEG
           E INC
           F DEC      
   E OPR3 #imm4
           0 DUP
           1 DROP
           2 SWAP
           3 OVER
           4 ROT
           5 -ROT
           6 R
           7 >R
           8 @R / COPYR
           9 LD32
           A ST32
           B LD16
           C ST16
           D LD8
           E ST8
           F NOP
   F OPR4 #imm4
           0 FOR
           1 NEXT
           2 DO
           3 WHILE
           4 UNTIL
           5 AGAIN
           6 RP           - Return pointer
           7 >RP          
           8 FLAG
           9 NFLAG        - Not Flag, (if 0 else -1 endif)
           A IF
           B ELSE
           C ENDIF
           D JUMP
           E CALL
           F RETURN 



Function call stack frame

         V0      V1      V2  <--  Local variables on the return stack accessed with the LDL and STL instructions
 PC LP <empty> <empty> <empty> ...
           \    
            \     
             The new LP points to the first local variable for the function
             RP points to the first free cell
 
 DIM #2 will cause the next two cells to be filled with 0, RETURN will delete any variables
         V0      V1      V2 
 PC LP    0       0    <empty> ...
           \               \                
            \               RP is advanced by two to the first free cell
             LP still points to the same position but the two first variables now contains 0