syntax checks on asmsubs

This commit is contained in:
Irmen de Jong 2018-10-08 22:35:39 +02:00
parent 50464ebda1
commit 42394f561b
3 changed files with 22 additions and 28 deletions

View File

@ -1,7 +1,6 @@
%option enable_floats %option enable_floats
~ main { ~ main {
sub start() { sub start() {
@ -19,9 +18,24 @@ sub start() {
s1 = "ciao" s1 = "ciao"
_vm_write_str(s1) _vm_write_str(s1)
A=xyz()
asmxyz(333, 2)
asmxyz(333,2)
X=asmxyz2(333,2)
return return
} }
sub xyz() -> byte {
return 33
}
asmsub asmxyz(v1: word @ XY, v2: byte @ A) -> clobbers() -> (byte @ A, word @ XY) {
return 44,4455
}
asmsub asmxyz2(v1: word @ XY, v2: byte @ A) -> clobbers(X) -> (byte @ A) {
return 44
}
} }

View File

@ -60,7 +60,7 @@ Code
Subroutine Subroutine
Defines a piece of code that can be called by its name from different locations in your code. Defines a piece of code that can be called by its name from different locations in your code.
It accepts parameters and can return result values. It accepts parameters and can return a value (optional).
It can define its own variables, and it is even possible to define subroutines nested inside other subroutines. It can define its own variables, and it is even possible to define subroutines nested inside other subroutines.
Their contents is scoped accordingly. Their contents is scoped accordingly.
@ -465,22 +465,15 @@ Defining a subroutine
^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
Subroutines are parts of the code that can be repeatedly invoked using a subroutine call from elsewhere. Subroutines are parts of the code that can be repeatedly invoked using a subroutine call from elsewhere.
Their definition, using the ``sub`` statement, includes the specification of the required input- and output parameters. Their definition, using the ``sub`` statement, includes the specification of the required parameters and return value.
Subroutines can be defined in a Block, but also nested inside another subroutine. Everything is scoped accordingly. Subroutines can be defined in a Block, but also nested inside another subroutine. Everything is scoped accordingly.
.. todo::
re-introduce register based params and return values.
For now, only register based parameters are supported (A, X, Y and paired registers AX, AY and XY,
and various flags of the status register P: Pc (carry), Pz (zero), Pn (negative), Pv (overflow).
For subroutine return values, it is the same (registers, status flags).
Calling a subroutine Calling a subroutine
^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
The arguments in parentheses after the function name, should match the parameters in the subroutine definition. The arguments in parentheses after the function name, should match the parameters in the subroutine definition.
The output variables must occur in the correct sequence of return values as specified It is possible to not store the return value but the compiler
in the subroutine's definiton. It is possible to not store the return values but the compiler
will issue a warning then telling you the result values of a subroutine call are discarded. will issue a warning then telling you the result values of a subroutine call are discarded.
.. caution:: .. caution::

View File

@ -398,13 +398,10 @@ You call a subroutine like this::
[ result = ] subroutinename_or_address ( [argument...] ) [ result = ] subroutinename_or_address ( [argument...] )
; example: ; example:
outputvar1, outputvar2 = subroutine ( arg1, arg2, arg3 ) resultvariable = subroutine ( arg1, arg2, arg3 )
Arguments are separated by commas. The argument list can also be empty if the subroutine Arguments are separated by commas. The argument list can also be empty if the subroutine
takes no parameters. takes no parameters.
If the subroutine returns one or more result values, you must use an assignment statement
to store those values somewhere. If the subroutine has no result values, you must
omit the assignment.
@ -413,7 +410,7 @@ Subroutine definitions
The syntax is:: The syntax is::
sub <identifier> ( [parameters] ) [ -> returnvalues ] { sub <identifier> ( [parameters] ) [ -> returntype ] {
... statements ... ... statements ...
} }
@ -424,24 +421,14 @@ The syntax is::
The open curly brace must immediately follow the subroutine result specification on the same line, The open curly brace must immediately follow the subroutine result specification on the same line,
and can have nothing following it. The close curly brace must be on its own line as well. and can have nothing following it. The close curly brace must be on its own line as well.
The parameters is a (possibly empty) comma separated list of "<parametername>: <datatype>" pairs specifying the input parameters.
The return type has to be specified if the subroutine returns a value.
.. todo:: .. todo::
asmsub with assigning memory address to refer to predefined ROM subroutines asmsub with assigning memory address to refer to predefined ROM subroutines
asmsub with a regular body to precisely control what registers are used to call the subroutine asmsub with a regular body to precisely control what registers are used to call the subroutine
.. data:: parameters
Comma separated list of "<parametername>:<datatype>" pairs specifying the input parameters.
Can be empty.
.. data:: proc_results
Comma separated list of result value datatypes.
A subroutine without return values must omit the whole part with the arrow
after the parameter list.
Loops Loops
----- -----