mirror of
https://github.com/catseye/SixtyPical.git
synced 2024-11-29 18:49:22 +00:00
Work on the spec a bit.
This commit is contained in:
parent
c3a0659058
commit
8ccabdf202
@ -1,17 +1,17 @@
|
|||||||
Sixtypical
|
SixtyPical
|
||||||
==========
|
==========
|
||||||
|
|
||||||
Sixtypical is a simplified version of [Sixtypical][].
|
This document describes the SixtyPical programming language version 0.2,
|
||||||
|
both its execution aspect and its static analysis aspect (even though
|
||||||
|
these are, technically speaking, separate concepts.)
|
||||||
|
|
||||||
This is a complete reboot of the previous design and implementation, which
|
This document is nominally normative, but the tests in the `tests` directory
|
||||||
was semantically a mess due to the way it was built.
|
are even more normative.
|
||||||
This aims to be a simpler design which gets the static semantics right first,
|
|
||||||
and only then is extended to be more practical.
|
|
||||||
|
|
||||||
Types
|
Types
|
||||||
-----
|
-----
|
||||||
|
|
||||||
There are two TYPES in Sixtypical:
|
There are two TYPES in SixtyPical:
|
||||||
|
|
||||||
* bit (2 possible values)
|
* bit (2 possible values)
|
||||||
* byte (256 possible values)
|
* byte (256 possible values)
|
||||||
@ -19,17 +19,13 @@ There are two TYPES in Sixtypical:
|
|||||||
Memory locations
|
Memory locations
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
The 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.
|
||||||
|
|
||||||
(There is actually a third state, WRITTEN, which indicates that the memory
|
|
||||||
location is not only initialized, but also that it has been written to in
|
|
||||||
the current routine.)
|
|
||||||
|
|
||||||
There are four general kinds of memory location. The first three are
|
There are four general kinds of memory location. The first three are
|
||||||
pre-defined and built-in.
|
pre-defined and built-in.
|
||||||
|
|
||||||
@ -53,9 +49,9 @@ Each of these hold a bit. They are initially uninitialized.
|
|||||||
### Constants ###
|
### Constants ###
|
||||||
|
|
||||||
It may be strange to think of constants as memory locations, but keep in mind
|
It may be strange to think of constants as memory locations, but keep in mind
|
||||||
that a memory location in Sixtypical need not map to a memory location in the
|
that a memory location in SixtyPical need not map to a memory location in the
|
||||||
underlying hardware. All constants are read-only. Each is
|
underlying hardware. All constants are read-only. Each is initially
|
||||||
initially initialized with the value that corresponds with its name.
|
initialized with the value that corresponds with its name.
|
||||||
|
|
||||||
They come in bit and byte types. There are two bit constants,
|
They come in bit and byte types. There are two bit constants,
|
||||||
|
|
||||||
@ -81,7 +77,8 @@ 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, i.e. its
|
||||||
INPUTS, and all the memory locations it WRITES to, whether they are OUTPUTS
|
INPUTS, and all the memory locations it WRITES to, whether they are OUTPUTS
|
||||||
or merely TRASHED. Every memory location that is not written to is PRESERVED.
|
or merely TRASHED. Every memory location that is not written to by the
|
||||||
|
routine (or any routines that the routine calls) is PRESERVED by the routine.
|
||||||
|
|
||||||
routine foo
|
routine foo
|
||||||
inputs a, score
|
inputs a, score
|
||||||
@ -93,8 +90,15 @@ or merely TRASHED. Every memory location that is not written to is PRESERVED.
|
|||||||
Routines may call only routines previously defined in the program source.
|
Routines may call only routines previously defined in the program source.
|
||||||
Thus, recursive routines are not allowed.
|
Thus, recursive routines are not allowed.
|
||||||
|
|
||||||
There must be one routine called `main`. This routine is executed when
|
For a SixtyPical program to be run, there must be one routine called `main`.
|
||||||
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
|
||||||
|
at the beginning of the routine. Various instructions cause memory locations
|
||||||
|
to be initialized after they are executed. Calling a routine which trashes
|
||||||
|
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
|
||||||
|
as outputs must be initialised.
|
||||||
|
|
||||||
Instructions
|
Instructions
|
||||||
------------
|
------------
|
||||||
@ -106,19 +110,14 @@ 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 list of the current
|
* It is illegal if dest does not occur in the WRITES lists 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.
|
||||||
* It is illegal if src does not either:
|
|
||||||
* be a constant, or
|
|
||||||
* occur in the READS list of the current routine, or
|
|
||||||
* occur in the WRITES list of the current routine AND
|
|
||||||
that location has previously been written inside this routine.
|
|
||||||
|
|
||||||
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, and they are considered initialized after it has
|
changed by this instruction; they must be named in the WRITES lists, and they
|
||||||
executed.
|
are considered initialized after it has executed.
|
||||||
|
|
||||||
Some combinations, such as `ld x, y`, are illegal because they do not map to
|
Some combinations, such as `ld x, y`, are illegal because they do not map to
|
||||||
underlying opcodes.
|
underlying opcodes.
|
||||||
@ -143,15 +142,10 @@ Notes:
|
|||||||
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 list of the current
|
* It is illegal if dest does not occur in the WRITES lists 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.
|
||||||
* It is illegal if src does not either:
|
|
||||||
* be a constant, or
|
|
||||||
* occur in the READS list of the current routine, or
|
|
||||||
* occur in the WRITES list of the current routine AND
|
|
||||||
that location has previously been written inside this routine.
|
|
||||||
|
|
||||||
After execution, dest is considered initialized. No flags are
|
After execution, dest is considered initialized. No flags are
|
||||||
changed by this instruction (unless of course dest is a flag.)
|
changed by this instruction (unless of course dest is a flag.)
|
||||||
@ -172,17 +166,13 @@ 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 AND READS lists
|
* It is illegal if dest does not occur in the WRITES lists
|
||||||
of the current routine.
|
of the current routine.
|
||||||
* It is illegal if src does not either:
|
|
||||||
* be a constant, or
|
|
||||||
* occur in the READS list of the current routine, or
|
|
||||||
* occur in the WRITES list of the current routine AND
|
|
||||||
that location has previously been written inside this routine.
|
|
||||||
|
|
||||||
Affects n, z, c, and v flags.
|
Affects n, z, c, and v flags, requiring that they be in the WRITES lists,
|
||||||
|
and initializing them afterwards.
|
||||||
|
|
||||||
dest continues to be initialized afterwards.
|
dest and src continue to be initialized afterwards.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
@ -191,7 +181,19 @@ Notes:
|
|||||||
|
|
||||||
### inc ###
|
### inc ###
|
||||||
|
|
||||||
TODO: these do not honour carry!
|
inc <dest-memory-location>
|
||||||
|
|
||||||
|
Increments the value in dest. Does not honour carry.
|
||||||
|
|
||||||
|
* It is illegal if dest is uninitialized.
|
||||||
|
* It is illegal if dest is read-only.
|
||||||
|
* It is illegal if dest does not occur in the WRITES lists
|
||||||
|
of the current routine.
|
||||||
|
|
||||||
|
Affects n and z flags, requiring that they be in the WRITES lists,
|
||||||
|
and initializing them afterwards.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
inc x → INX
|
inc x → INX
|
||||||
inc y → INY
|
inc y → INY
|
||||||
@ -203,7 +205,15 @@ TODO: these do not honour carry!
|
|||||||
|
|
||||||
Subtracts the contents of src from dest and stores the result in dest.
|
Subtracts the contents of src from dest and stores the result in dest.
|
||||||
|
|
||||||
The constraints and effects are exactly the same as for `add`.
|
* It is illegal if src OR dest OR c is uninitialized.
|
||||||
|
* It is illegal if dest is read-only.
|
||||||
|
* It is illegal if dest does not occur in the WRITES lists
|
||||||
|
of the current routine.
|
||||||
|
|
||||||
|
Affects n, z, c, and v flags, requiring that they be in the WRITES lists,
|
||||||
|
and initializing them afterwards.
|
||||||
|
|
||||||
|
dest and src continue to be initialized afterwards.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
@ -212,7 +222,19 @@ Notes:
|
|||||||
|
|
||||||
### dec ###
|
### dec ###
|
||||||
|
|
||||||
TODO: these do not honour carry!
|
inc <dest-memory-location>
|
||||||
|
|
||||||
|
Decrements the value in dest. Does not honour carry.
|
||||||
|
|
||||||
|
* It is illegal if dest is uninitialized.
|
||||||
|
* It is illegal if dest is read-only.
|
||||||
|
* It is illegal if dest does not occur in the WRITES lists
|
||||||
|
of the current routine.
|
||||||
|
|
||||||
|
Affects n and z flags, requiring that they be in the WRITES lists,
|
||||||
|
and initializing them afterwards.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
dec x → DEX
|
dec x → DEX
|
||||||
dec y → DEY
|
dec y → DEY
|
||||||
@ -224,9 +246,10 @@ TODO: these do not honour carry!
|
|||||||
|
|
||||||
Subtracts the contents of src from dest, but does not store the result.
|
Subtracts the contents of src from dest, but does not store the result.
|
||||||
|
|
||||||
The constraints and effects are the same as for `sub`, except that `c`
|
* It is illegal if src OR dest is uninitialized.
|
||||||
need not be initialized before executing `cmp`, and the `v` flag is
|
|
||||||
unaffected.
|
Affects n, z, and c flags, requiring that they be in the WRITES lists,
|
||||||
|
and initializing them afterwards.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
@ -235,6 +258,8 @@ Notes:
|
|||||||
cmp x, 1 → CPX #1
|
cmp x, 1 → CPX #1
|
||||||
cmp y, 1 → CPY #1
|
cmp y, 1 → CPY #1
|
||||||
|
|
||||||
|
- - - -
|
||||||
|
|
||||||
### and ###
|
### and ###
|
||||||
|
|
||||||
and <dest-memory-location>, <src-memory-location>
|
and <dest-memory-location>, <src-memory-location>
|
||||||
|
Loading…
Reference in New Issue
Block a user