mirror of
https://github.com/catseye/SixtyPical.git
synced 2024-11-29 18:49:22 +00:00
Going over the spec for version 0.8-PRE.
This commit is contained in:
parent
ef07f46f41
commit
f2f716de86
@ -14,20 +14,22 @@ the language.
|
|||||||
Types
|
Types
|
||||||
-----
|
-----
|
||||||
|
|
||||||
There are five TYPES in SixtyPical:
|
There are seven *types* in SixtyPical:
|
||||||
|
|
||||||
* bit (2 possible values)
|
* bit (2 possible values)
|
||||||
* byte (256 possible values)
|
* byte (256 possible values)
|
||||||
* byte table (256 entries, each holding a byte)
|
* byte table (256 entries, each holding a byte)
|
||||||
|
* word (65536 possible values)
|
||||||
|
* word table (256 entries, each holding a word)
|
||||||
* routine (code stored somewhere in memory, read-only)
|
* routine (code stored somewhere in memory, read-only)
|
||||||
* vector (address of a routine)
|
* vector (address of a routine)
|
||||||
|
|
||||||
Memory locations
|
Memory locations
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
A primary concept in SixtyPical is the MEMORY LOCATION. At any given point
|
A primary concept in SixtyPical is the *memory location*. At any given point
|
||||||
in time during execution, each memory location is either UNINITIALIZED or
|
in time during execution, each memory location is either *uninitialized* or
|
||||||
INITIALIZED. At any given point in the program text, too, each memory
|
*initialized*. At any given point in the program text, too, each memory
|
||||||
location is either uninitialized or initialized. Where-ever it is one or
|
location is either uninitialized or initialized. Where-ever it is one or
|
||||||
the other during execution, it is the same in the corresponding place in
|
the other during execution, it is the same in the corresponding place in
|
||||||
the program text; thus, it is a static property.
|
the program text; thus, it is a static property.
|
||||||
@ -64,17 +66,27 @@ They come in bit and byte types. There are two bit constants,
|
|||||||
off
|
off
|
||||||
on
|
on
|
||||||
|
|
||||||
and two-hundred and fifty-six byte constants,
|
two hundred and fifty-six byte constants,
|
||||||
|
|
||||||
0
|
0
|
||||||
1
|
1
|
||||||
...
|
...
|
||||||
255
|
255
|
||||||
|
|
||||||
|
and sixty-five thousand five hundred and thirty-six word constants,
|
||||||
|
|
||||||
|
0
|
||||||
|
1
|
||||||
|
...
|
||||||
|
65535
|
||||||
|
|
||||||
|
Note that all byte constants serve double duty as word constants in that
|
||||||
|
context.
|
||||||
|
|
||||||
### User-defined ###
|
### User-defined ###
|
||||||
|
|
||||||
There may be any number of user-defined memory locations. They are defined
|
There may be any number of user-defined memory locations. They are defined
|
||||||
by giving the type, which must be `byte`, `byte table`, or `vector`, and the
|
by giving the type (which may be any type except `bit` and `routine`) and the
|
||||||
name.
|
name.
|
||||||
|
|
||||||
byte pos
|
byte pos
|
||||||
@ -88,10 +100,10 @@ case, an explicit address in memory cannot be given.
|
|||||||
|
|
||||||
byte pos : 0
|
byte pos : 0
|
||||||
|
|
||||||
A user-defined vector memory location is decorated with READS and WRITES lists
|
A user-defined vector memory location is decorated with `inputs`, `outputs`
|
||||||
like a routine (see below), and it may only hold addresses of routines which
|
and `trashes` lists like a routine (see below), and it may only hold addresses
|
||||||
are compatible. (Meaning, the routine's inputs (resp. outputs, trashes)
|
of routines which are compatible. (Meaning, the routine's inputs (resp. outputs,
|
||||||
must be a subset of the vector's inputs (resp. outputs, trashes.))
|
trashes) must be a subset of the vector's inputs (resp. outputs, trashes.))
|
||||||
|
|
||||||
vector actor_logic
|
vector actor_logic
|
||||||
inputs a, score
|
inputs a, score
|
||||||
@ -102,10 +114,16 @@ must be a subset of the vector's inputs (resp. outputs, trashes.))
|
|||||||
Routines
|
Routines
|
||||||
--------
|
--------
|
||||||
|
|
||||||
Every routine must list all the memory locations it READS from, i.e. its
|
Every routine must list all the memory locations it *reads from*, which we
|
||||||
INPUTS, and all the memory locations it WRITES to, whether they are OUTPUTS
|
call its `inputs`, and all the memory locations it *writes to*. The latter
|
||||||
or merely TRASHED. Every memory location that is not written to by the
|
we divide into two groups: its `outputs` which it intentionally initializes,
|
||||||
routine (or any routines that the routine calls) is PRESERVED by the routine.
|
and its `trashes`, which it does not care about, and leaves uninitialized.
|
||||||
|
For example, if it uses a register to temporarily store an intermediate
|
||||||
|
value used in a multiplication, that register has no meaning outside of
|
||||||
|
the multiplication, and is one of the routine's `trashes`.
|
||||||
|
|
||||||
|
It is common to say that the `trashes` are the memory locations that are
|
||||||
|
*not preserved* by the routine.
|
||||||
|
|
||||||
routine foo
|
routine foo
|
||||||
inputs a, score
|
inputs a, score
|
||||||
@ -114,6 +132,9 @@ routine (or any routines that the routine calls) is PRESERVED by the routine.
|
|||||||
...
|
...
|
||||||
}
|
}
|
||||||
|
|
||||||
|
The `inputs` are sometimes called the routine's READS set, while the
|
||||||
|
`outputs` and `trashes` are collectively called the WRITES set.
|
||||||
|
|
||||||
Routines may call only routines previously defined in the program source.
|
Routines may call only routines previously defined in the program source.
|
||||||
Thus, directly recursive routines are not allowed. (However, routines may
|
Thus, directly recursive routines are not allowed. (However, routines may
|
||||||
also call routines via vectors, which are dynamically assigned. In this
|
also call routines via vectors, which are dynamically assigned. In this
|
||||||
@ -122,12 +143,12 @@ case, there is, for the time being, no check for recursive calls.)
|
|||||||
For a SixtyPical program to be run, there must be one routine called `main`.
|
For a SixtyPical program to be run, there must be one routine called `main`.
|
||||||
This routine is executed when the program is run.
|
This routine is executed when the program is run.
|
||||||
|
|
||||||
The memory locations given given as inputs are considered to be initialized
|
The memory locations given as inputs to a routine are considered to be initialized
|
||||||
at the beginning of the routine. Various instructions cause memory locations
|
at the beginning of the routine. Various instructions cause memory locations
|
||||||
to be initialized after they are executed. Calling a routine which trashes
|
to be initialized after they are executed. Calling a routine which trashes
|
||||||
some memory locations causes those memory locations to be uninitialized after
|
some memory locations causes those memory locations to be uninitialized after
|
||||||
that routine is called. At the end of a routine, all memory locations listed
|
that routine is called. At the end of a routine, all memory locations listed
|
||||||
as outputs must be initialised.
|
as outputs must be initialized.
|
||||||
|
|
||||||
A routine can also be declared as "external", in which case its body need
|
A routine can also be declared as "external", in which case its body need
|
||||||
not be defined but an absolute address must be given for where the routine
|
not be defined but an absolute address must be given for where the routine
|
||||||
@ -141,6 +162,13 @@ is located in memory.
|
|||||||
Instructions
|
Instructions
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
Instructions are inspired by, and in many cases closely resemble, the 6502
|
||||||
|
instruction set. However, in many cases they do not map 1:1 to 6502 instructions.
|
||||||
|
If a SixtyPical instruction cannot be translated validly to one more more 6502
|
||||||
|
instructions while retaining all the stated constraints, that's a static error
|
||||||
|
in a SixtyPical program, and technically any implementation of SixtyPical, even
|
||||||
|
an interpreter, should flag it up.
|
||||||
|
|
||||||
### ld ###
|
### ld ###
|
||||||
|
|
||||||
ld <dest-memory-location>, <src-memory-location> [+ <index-memory-location>]
|
ld <dest-memory-location>, <src-memory-location> [+ <index-memory-location>]
|
||||||
@ -148,13 +176,12 @@ Instructions
|
|||||||
Reads from src and writes to dest.
|
Reads from src and writes to dest.
|
||||||
|
|
||||||
* It is illegal if dest is not a register.
|
* It is illegal if dest is not a register.
|
||||||
* It is illegal if dest does not occur in the WRITES lists of the current
|
* It is illegal if dest does not occur in the WRITES of the current routine.
|
||||||
routine.
|
|
||||||
* It is illegal if src is not of same type as dest (i.e., is not a byte.)
|
* It is illegal if src is not of same type as dest (i.e., is not a byte.)
|
||||||
* It is illegal if src is uninitialized.
|
* It is illegal if src is uninitialized.
|
||||||
|
|
||||||
After execution, dest is considered initialized. The flags `z` and `n` may be
|
After execution, dest is considered initialized. The flags `z` and `n` may be
|
||||||
changed by this instruction; they must be named in the WRITES lists, and they
|
changed by this instruction; they must be named in the WRITES, and they
|
||||||
are considered initialized after it has executed.
|
are considered initialized after it has executed.
|
||||||
|
|
||||||
If and only if src is a byte table, the index-memory-location must be given.
|
If and only if src is a byte table, the index-memory-location must be given.
|
||||||
@ -169,8 +196,7 @@ underlying opcodes.
|
|||||||
Reads from src and writes to dest.
|
Reads from src and writes to dest.
|
||||||
|
|
||||||
* It is illegal if dest is a register or if dest is read-only.
|
* It is illegal if dest is a register or if dest is read-only.
|
||||||
* It is illegal if dest does not occur in the WRITES lists of the current
|
* It is illegal if dest does not occur in the WRITES of the current routine.
|
||||||
routine.
|
|
||||||
* It is illegal if src is not of same type as dest.
|
* It is illegal if src is not of same type as dest.
|
||||||
* It is illegal if src is uninitialized.
|
* It is illegal if src is uninitialized.
|
||||||
|
|
||||||
@ -187,10 +213,9 @@ Adds the contents of src to dest and stores the result in dest.
|
|||||||
|
|
||||||
* It is illegal if src OR dest OR c is uninitialized.
|
* It is illegal if src OR dest OR c is uninitialized.
|
||||||
* It is illegal if dest is read-only.
|
* It is illegal if dest is read-only.
|
||||||
* It is illegal if dest does not occur in the WRITES lists
|
* It is illegal if dest does not occur in the WRITES of the current routine.
|
||||||
of the current routine.
|
|
||||||
|
|
||||||
Affects n, z, c, and v flags, requiring that they be in the WRITES lists,
|
Affects n, z, c, and v flags, requiring that they be in the WRITES,
|
||||||
and initializing them afterwards.
|
and initializing them afterwards.
|
||||||
|
|
||||||
dest and src continue to be initialized afterwards.
|
dest and src continue to be initialized afterwards.
|
||||||
@ -203,10 +228,9 @@ Increments the value in dest. Does not honour carry.
|
|||||||
|
|
||||||
* It is illegal if dest is uninitialized.
|
* It is illegal if dest is uninitialized.
|
||||||
* It is illegal if dest is read-only.
|
* It is illegal if dest is read-only.
|
||||||
* It is illegal if dest does not occur in the WRITES lists
|
* It is illegal if dest does not occur in the WRITES of the current routine.
|
||||||
of the current routine.
|
|
||||||
|
|
||||||
Affects n and z flags, requiring that they be in the WRITES lists,
|
Affects n and z flags, requiring that they be in the WRITES,
|
||||||
and initializing them afterwards.
|
and initializing them afterwards.
|
||||||
|
|
||||||
### sub ###
|
### sub ###
|
||||||
@ -217,10 +241,9 @@ Subtracts the contents of src from dest and stores the result in dest.
|
|||||||
|
|
||||||
* It is illegal if src OR dest OR c is uninitialized.
|
* It is illegal if src OR dest OR c is uninitialized.
|
||||||
* It is illegal if dest is read-only.
|
* It is illegal if dest is read-only.
|
||||||
* It is illegal if dest does not occur in the WRITES lists
|
* It is illegal if dest does not occur in the WRITES of the current routine.
|
||||||
of the current routine.
|
|
||||||
|
|
||||||
Affects n, z, c, and v flags, requiring that they be in the WRITES lists,
|
Affects n, z, c, and v flags, requiring that they be in the WRITES,
|
||||||
and initializing them afterwards.
|
and initializing them afterwards.
|
||||||
|
|
||||||
dest and src continue to be initialized afterwards.
|
dest and src continue to be initialized afterwards.
|
||||||
@ -233,10 +256,9 @@ Decrements the value in dest. Does not honour carry.
|
|||||||
|
|
||||||
* It is illegal if dest is uninitialized.
|
* It is illegal if dest is uninitialized.
|
||||||
* It is illegal if dest is read-only.
|
* It is illegal if dest is read-only.
|
||||||
* It is illegal if dest does not occur in the WRITES lists
|
* It is illegal if dest does not occur in the WRITES of the current routine.
|
||||||
of the current routine.
|
|
||||||
|
|
||||||
Affects n and z flags, requiring that they be in the WRITES lists,
|
Affects n and z flags, requiring that they be in the WRITES,
|
||||||
and initializing them afterwards.
|
and initializing them afterwards.
|
||||||
|
|
||||||
### cmp ###
|
### cmp ###
|
||||||
@ -248,7 +270,7 @@ does not store the result anywhere, only sets the resulting flags.
|
|||||||
|
|
||||||
* It is illegal if src OR dest is uninitialized.
|
* It is illegal if src OR dest is uninitialized.
|
||||||
|
|
||||||
Affects n, z, and c flags, requiring that they be in the WRITES lists,
|
Affects n, z, and c flags, requiring that they be in the WRITES,
|
||||||
and initializing them afterwards.
|
and initializing them afterwards.
|
||||||
|
|
||||||
### and, or, xor ###
|
### and, or, xor ###
|
||||||
@ -262,10 +284,9 @@ the result in dest.
|
|||||||
|
|
||||||
* It is illegal if src OR dest OR is uninitialized.
|
* It is illegal if src OR dest OR is uninitialized.
|
||||||
* It is illegal if dest is read-only.
|
* It is illegal if dest is read-only.
|
||||||
* It is illegal if dest does not occur in the WRITES lists
|
* It is illegal if dest does not occur in the WRITES of the current routine.
|
||||||
of the current routine.
|
|
||||||
|
|
||||||
Affects n and z flags, requiring that they be in the WRITES lists of the
|
Affects n and z flags, requiring that they be in the WRITES of the
|
||||||
current routine, and sets them as initialized afterwards.
|
current routine, and sets them as initialized afterwards.
|
||||||
|
|
||||||
dest and src continue to be initialized afterwards.
|
dest and src continue to be initialized afterwards.
|
||||||
@ -284,10 +305,9 @@ and `c` becomes the bit that was shifted off the right.
|
|||||||
* It is illegal if dest is a register besides `a`.
|
* It is illegal if dest is a register besides `a`.
|
||||||
* It is illegal if dest is read-only.
|
* It is illegal if dest is read-only.
|
||||||
* It is illegal if dest OR c is uninitialized.
|
* It is illegal if dest OR c is uninitialized.
|
||||||
* It is illegal if dest does not occur in the WRITES lists
|
* It is illegal if dest does not occur in the WRITES of the current routine.
|
||||||
of the current routine.
|
|
||||||
|
|
||||||
Affects the c flag, requiring that it be in the WRITES lists of the
|
Affects the c flag, requiring that it be in the WRITES of the
|
||||||
current routine, and it continues to be initialized afterwards.
|
current routine, and it continues to be initialized afterwards.
|
||||||
|
|
||||||
### call ###
|
### call ###
|
||||||
@ -299,17 +319,15 @@ defined routine, or a vector location which contains the address of a routine
|
|||||||
which will be called indirectly. Execution will be transferred back to the
|
which will be called indirectly. Execution will be transferred back to the
|
||||||
current routine, when execution of the executable is finished.
|
current routine, when execution of the executable is finished.
|
||||||
|
|
||||||
Just before the call,
|
* It is illegal if any of the memory locations listed in the called routine's
|
||||||
|
`inputs` are uninitialized immediately before the call.
|
||||||
* It is illegal if any of the memory locations in the target executable's
|
|
||||||
READS list is uninitialized.
|
|
||||||
|
|
||||||
Just after the call,
|
Just after the call,
|
||||||
|
|
||||||
* All memory locations listed as TRASHED in the called routine's WRITES
|
* All memory locations listed in the called routine's `trashes` are considered
|
||||||
list are considered uninitialized.
|
to now be uninitialized.
|
||||||
* All memory locations listed as TRASHED in the called routine's OUTPUTS
|
* All memory locations listed in the called routine's `outputs` are considered
|
||||||
list are considered initialized.
|
to not be initialized.
|
||||||
|
|
||||||
### goto ###
|
### goto ###
|
||||||
|
|
||||||
@ -330,8 +348,8 @@ Just before the goto,
|
|||||||
|
|
||||||
In addition,
|
In addition,
|
||||||
|
|
||||||
* The target executable's WRITES lists must not include any locations
|
* The target executable's WRITES must not include any locations
|
||||||
that are not already included in the current routine's WRITES lists.
|
that are not already included in the current routine's WRITES.
|
||||||
|
|
||||||
### if ###
|
### if ###
|
||||||
|
|
||||||
@ -383,8 +401,7 @@ copy more general types of data (for example, vectors,) and it trashes the
|
|||||||
`z` and `n` flags and the `a` register.
|
`z` and `n` flags and the `a` register.
|
||||||
|
|
||||||
* It is illegal if dest is read-only.
|
* It is illegal if dest is read-only.
|
||||||
* It is illegal if dest does not occur in the WRITES lists of the current
|
* It is illegal if dest does not occur in the WRITES of the current routine.
|
||||||
routine.
|
|
||||||
* It is illegal if src is not of same type as dest.
|
* It is illegal if src is not of same type as dest.
|
||||||
* It is illegal if src is uninitialized.
|
* It is illegal if src is uninitialized.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user