[comp.lang.misc] Expanding the Core Wars Language

blodtoad@pitt.UUCP (M. Anthony Kapolka 3) (05/17/88)

And now for something completely different....


                     Vesper Processor Design Specs

             Copyright 1987,1988 by M. Anthony Kapolka III
		     kapolka@vax.cs.pittsburgh.edu

     Introduction
     ============

     The following information describes a virtual processor which is
     under design to serve in a Core Wars machine running a superset
     of Redcode called Vesper.  I am posting it to comp.lang.misc to
     obtain feedback regarding its design.  Feel free to mail me comments
     instead of posting them to the net.  Also, my apologies to anyone
     who thinks this is too frivolous.

     Core Wars originated at the University of Western Ontario and was
     introduced in Scientific American, May 1984, by A. K. Dewdney.
     The first Core Wars work was done by D. G. Jones.  What follows
     will make little sense unless you are familiar with the basic
     ideas of Core Wars.

     Vesper is an acronym for Virtual Environment, Segmented Processing
     Extended Redcode.  This document describes version 0.0 of vesper.

     My complaint with Core Wars as originally specified is that it is a
     RISC machine... hence successful battle programs seem of one type...
     small and replicating.  The SPL instruction, introduced by Robert
     Norton, (Sci Am March 1985) was used to great effect in the first
     international tournament (Sci Am Jan 1987).  I think it rewards
     small relatively stupid but quickly replicating code.  My intent is
     to provide a larger machine space, with lots of options, making the
     design of an absolute-best program impossible.  Strategy, at many
     levels, could become important.  A CISC machine seems a better
     candidate for the job.

     Before I consider implementing this, I'd like some opinions.  Vesper
     was designed to allow programs to compete in different categories...
     programs just in the CORE, programs which replicate, even programs 
     which get advice from their programmer during their execution (possible
     via OPR instruction)!  I intend it to be a good exploratory space to
     play at the assembly level.
     
     If you have strong opinions on any aspects of this machine please
     voice them!  Implementing this may be a task, however it really wouldn't
     be very difficult.  As for writing code in Vesper, well... that might
     stretch the mind a bit.

     Distributers should have demo models by October.  Order soon for
     the initial pre-Christmas shipment.


     Vesper Registers
     ================

     All registers are 12 bit, except where noted.  12 bits allows
     addressing up to 4K.

     CS  Code Segment 						(1-5)
                          IP  Instruction Pointer
                          AIP Auxiliary Instruction Pointer - broken down into
                              SIP Secondary Instruction Pointer  6 bits Lo AIP
                              TIP Tertiary Instruction Pointer   6 bits Hi AIP

                          IB  Instruction Base
                          IM  Instruction Modula
                          IST Instruction Step


     DS  Data Segment						(6-10)
                          DP  Data Pointer
                          ADP Auxiliary Data Pointer - broken down into
                              SDP Secondary Data Pointer  6 bits Lo ASP
                              TDP Tertiary Data Pointer   6 bits Hi ASP

                          DB  Data Base
                          DM  Data Modula
                          DST Data Step


     SS  Stack Segment						(11-15)
                          SP  Stack Pointer
                          ASP Auxiliary Stack Pointer - broken down into
                              SSP Secondary Stack Pointer  6 bits Lo ASP
                              TSP Tertiary Stack Pointer   6 bits Hi ASP

                          SB  Stack Base
                          SM  Stack Modula
                          SST Stack Step

     JI  Job Index - broken down into				(16)
           JN Job Number    6 bits Hi JI
           JP Job Priority  6 bits Lo JI

     FR  Flag Register - includes				(17)
           Carry Flag             - 1 Bit
           Zero Flag              - 1 Bit
           Success Flag           - 1 Bit
           Reserved               - 4 Bits
           Code Direction Flag    - 5 Bits

     AFR Auxiliary Flag Register - includes			(18)
           Reserved               - 2 Bits
           Stack Direction Flag   - 5 Bits
           Data Direction Flag    - 5 Bits

     AR  Auxiliary Register					(19)

     For a total of 19 registers



     Vesper Memory
     =============


     Each individual memory location is internally represented by 48 bits-

        1111 111 1 11 11   111111 111 111   111111111111   111111111111

          ^   ^  ^  ^  ^      ^    ^   ^         ^              ^
          |   |  |  |  |      |    |   |         |              |
          |   |  |  |  |      |    |   |         |              |_ Operand B
          |   |  |  |  |      |    |   |         |
          |   |  |  |  |      |    |   |         |_ Operand A
          |   |  |  |  |      |    |   |
          |   |  |  |  |      |    |   |_ Addressing Mode for B
          |   |  |  |  |      |    |
          |   |  |  |  |      |    |_ Addressing Mode for A
          |   |  |  |  |      |
          |   |  |  |  |      |_ Instruction
          |   |  |  |  |
          |   |  |  |  |_ Memory Mode for B
          |   |  |  |
          |   |  |  |_ Memory Mode for A
          |   |  |
          |   |  |_ Protection Bit
          |   |
          |   |_ Team ID
          |
          |_ Reserved for Expansion


     The processor has access to segments of memory via the CS, DS, and
     SS registers.  These segments are identified as follows:

     CORE - 4K segment.  Default linearly contiguous memory.

     GRID - 4K segment.  Default two dimensional contiguous memory.
            Default addressing is CS:IP,SIP.

     CUBE - 4K segment.  Default three dimensional contiguous memory.
            Default addressing is CS:IP,SIP,TIP.

     CHAF - 1K segment.  Default linearly contiguous memory.

     ZERO - 1K segment.  Default linearly contiguous memory.  The operating
            system "stores" values in certain protected memory locations
            in this segment.  All registers are mapped here, a
            system clock is here, and so on.   OPR calls have a
            tendency to make large changes to this segment.  But not
            all of the memory is used... there are some safe spots...
            Any code in this segment lives in constant danger of being
            overwritten.



     Memory Management
     =================

     Memory addressing in Vesper is very flexible, and potentially both
     powerful and confusing.

     Vesper can look at memory in four ways at any given time. Using the
     Code, Data, and Stack registers, or by an absolute linear method,
     Vesper can decide what locations are contiguous to other locations.
     These four ways are represented by symbols described below.

     Associated with each operand is a memory mode symbol.  Hence the two
     operands for an instruction can be pulled out of different segments,
     or even from different views of memory.

     Segments of memory have a default mapping.  By setting the direction
     flag for either the CS, DS, or SS above 26, you effectively change
     how memory for that segment is addressed.  This is described further
     below.

     As always, program execution proceedes according the Code Segment
     Direction Flag.



     Vesper Memory Modes
     ===================


     Encoded    Mnemonic   Name       Description

        0          ?       Data       Address memory as if Data

        1        <none>    Code       Address memory as if Code

        2          =       Stack      Address memory as if Stack

        3          !       Absolute   Address memory as if linear




     Direction Flag Decoding
     =======================

     There are three Direction Flags in this machine- one each associated
     with the Code, Data, and Stack segment registers.

     The Code direction flag is included as the 5 low bits of the Flag
     Register.  The Data and Stack direction flags combine to form an
     Auxiliary Flag Register.

     Normal execution is forward- or the direction flag is set to 1.
     Changing a direction flag will effect how the Code, Data, or Stack
     registers are updated during program execution.

     The SDIR instruction is used to change a direction flag register to a
     particular value.

     The REV instruction sets a direction flag to its reverse,
     ie. 1 changes to 5, 13 changes to 26 and so on.

     To obtain an idea of the direction associated with values of the
     direction register, consult the diagram below.




           15  \   14  \   13
         -----------------------     In GRID use direction as shown,
            16   \    9  \   12       superimposing the three diagrams.
          -----------------------      Directions 1 and 10 and 19 are
             17   \   10   \   11       all equivalent.


                  6   \   5   \   4
               -----------------------     In CUBE stack the diagrams as
                   7   \   0   \   3        shown to obtain 27 distinct
                -----------------------      directions.
                    8   \   1   \   2


                         14  \   23  \   22
                       -----------------------
                          25   \   18  \   21
                        -----------------------
                           26   \   19   \   20


     Setting a Direction Flag higher than 26 results in the processor
     viewing memory in a special way.  Contiguous memory locations are
     calculated for all operations by the folowing formulas.

     27 - Contiguous Memory =

              IP + Appropriate Step Register


     28 - Contiguous Memory =

              IP + Step Register MOD Modula Register


     29 - Contiguous Memory =

              (((IP MOD Modula Register) + Step Register) MOD Modula Register)
                + (IP DIV Modula Register) * Modula Register

     30 -
     31 - Reserved for Expansion


     For example, to treat every other piece of memory as if it 
     were linearly contiguous, set direction flag = 27 and step =
     2 or -2, depending on the direction you wish to have the IP 
     move.   




     Vesper Addressing Modes
     =======================

     Encoded    Mnemonic   Name       Description

        0          #       Immediate  Number following symbol is operand

        1        <none>    Relative   Number specifies offset from current
                                      IP for lookup using direction flag.
                                      The value at this location is the
                                      operand

        2          @       Indirect   Number specifies offset from current
                                      IP for lookup using direction flag.
                                      This value is then treated as an offset
                                      from its own address.  Lookup using
                                      this new offset and address provides
                                      a value for the operand.

        3          <       Auto
                           Decrement

       4-7         Reserved for Expansion





     Vesper Instruction Set
     ======================


     Mnemonic  Code  Arguments    Comments

       ADD       1    A    B      - A + B -> B

       AND       2    A    B      - A AND B -> B   Logical (bitwise) AND

       BOMB      3                - Any access to memory containing this
                                    instruction causes surrounding memory
                                    areas to be cleared.

       CBIT      4    A    B      - Clear bit A of Register B

       CMP       5    A    B      - If A not equal to B, skip over next
                                    instruction.

       DAT       6         B      - Non executable.  Data in B

       DJN       7    A    B      - Decrement B then jump to A if B not
                                    equal to zero.

       DJZ       8    A    B      - Decrement B then jump to A if B = Zero.

       JMFC      9    A    B      - Jump to A if Flag B is clear.

       JMFS     10    A    B      - Jump to A if Flag B is set.

       JMG      11    A    B      - Jump to A if B is > Zero.

       JMN      12    A    B      - Jump to A if B is not Zero.

       JMP      13    A           - Unconditional Jump to A

       JMZ      14    A    B      - Jump to A if B is Zero.

       LEAP     15                - Intersegment jump.  Pops CS, IP, and AIP
                                    off of Stack (in that order).

       LREG     16    A    B      - Load register A with operand B from 
				    location B

       MOV      17    A    B      - Move A into B

       NOP      18                - Executable, no operation- for dirty code.

       NOT      19    A    B      - A -> B  Logical (bitwise) Inversion

       OPR      20    A           - A = Request No.  Operating system call.
                                    Requires parameters pushed onto stack.
                                    Any Pass By References are made relative
                                    to current DS:DP,SDP,TDP.  Apostrophe '
                                    denotes call can be made only from the
                                    ZERO segment.

                                        1 - Display Message
                                             PBRef Start of Message
                                             PBVal Message Length

                                        2 - Obtain size of CS
                                             PBRef Return Value

                                        3'- Obtain CS of opponent
                                             PBRef Return Value

                                        4 - Obtain a Random Number
                                             PBRef Return Value

                                        5 - Obtain a Number from Keyboard
                                             PBRef Return Value

                                        6 - Spawn Job
                                             PBVal New JI
                                             PBVal New CS
                                             PBVal New IP
                                             PBVal New AIP

                                        7 - Hibernate Job
                                             PBVal JI

                                        8 - Kill Job(s)
                                             PBVal JI
                                             PBVal Number

       OR       21    A    B      - A OR B -> B  Logical (bitwise) OR.

       POP      22    A           - Retrieve A from Stack

       PROT     23    A           - Protect specified memory location.
       PCT                          Protected memory is unprotected if an
                                    instruction is executed which would
                                    instead overwrite that location, but the
                                    contents of that location remain unchanged.
                                    Future writing at that location is now
                                    possible.

       PUSH     24    A           - Push A onto Stack

       RCMP     25    A    B      - A real CMP- just sets flags

       REV      26                - Reverses Direction bits of Flag Register

       SBIT     27    A    B      - Sets bit A of Register B

       SDIR     28    A    B      - Set Direction bits to A of Flags Register.
                                    B indicated Code or Stack direction.

       SPL      29    A           - Splits instruction execution into next
                                    instruction and instruction at address A.

       SREG     30    A    B      - Store register A in operand B of location B

       SUB      31    A    B      - Subtract.  A - B -> B

       SWAP     32    A           - Swaps operands A and B in memory location
                                    A, including Memory and Addressing modes.

       SWAPO    33    A           - Swaps operands A and B in memory location
				    A, but does not swap modes as above.

       XOR      34    A    B      - A XOR B -> B  Logical (bitwise)
                                    Exclusive OR.

       RESV   35-63               - Currently Reserved

       HALT      0                - Halt execution, program defeated.



     Vesper Code
     ===========

     Vesper is written in the form

     Inst  M Mode A  A Mode A  Operand A   M Mode B  A Mode B  Operand B

     Omitting a mode selects the default.