mirror of
https://github.com/irmen/prog8.git
synced 2024-11-02 22:04:40 +00:00
syntax checks on asmsubs
This commit is contained in:
parent
50464ebda1
commit
42394f561b
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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::
|
||||||
|
@ -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
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user