1
0
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:
Chris Pressey 2015-10-16 15:36:56 +01:00
parent c3a0659058
commit 8ccabdf202

View File

@ -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>