Procedure
MP allows up to 8 parameters to be transferred to the procedure. There are three ways to pass parameters - by value, constant CONST
and variable VAR
. It is possible to use the OVERLOAD
modifier to overload procedures.
Available procedure modifiers: OVERLOAD
ASSEMBLER
FORWARD
REGISTER
INTERRUPT
PASCAL
.
Procedure parameters are read and valued from right to left tests\tests-medium\function_valuation_of_arguments.pas
It is possible to recurse procedures, provided that the procedure parameters will be passed by value and will be of a simple - ordinal type. The record or pointer type will not be properly allocated in memory.
Function
MP allows you to transfer up to 8 parameters to the function. There are three ways to pass parameters - by value, constant CONST
and variable VAR
. We return the result of the function by assigning it to the function name or using the automatically declared RESULT
variable, e.g:
function add(a,b: word): cardinal;
begin
Result := a+b;
end;
function mul(a,b: word): cardinal;
begin
mul := a*b;
end;
Available function modifiers: OVERLOAD
ASSEMBLER
FORWARD
REGISTER
INTERRUPT
PASCAL
INTERRUPT
not recommended for functions.
Function parameters are read and valued from right to left tests\tests-medium\function_valuation_of_arguments.pas
It is possible to recurse functions, provided that the function parameters will be passed by value and will be of a simple - ordinal type. The record or pointer type will not be properly allocated in memory.
Modifiers
assembler
The procedures/functions marked by ASSEMBLER
can only consist of an ASM block.
The compiler does not analyze the syntax of such blocks, treats them as a comment, possible errors are caught only during the assembly.
WARNING
It is required to maintain the state of theX
CPU6502
register, which is used to operate the MP software stack.
procedure color(a: byte); assembler;
asm
{ mva a 712
};
end;
overload
Overloaded procedures/functions are recognized by the parameter list.
procedure sum(var i: integer; a,b: integer); overload;
begin
i := a+b;
end;
procedure sum(var i: integer; a,b,c: integer); overload;
begin
i := a+b+c;
end;
function fsum(a,b: word): cardinal; assembler; overload;
asm
{
adw a b result
};
end;
function fsum(a,b: real): real; overload;
begin
Result := a+b;
end;
forward
If you want the procedure/function to be declared after its first call, use the FORWARD
modifier.
procedure name [(formal-parameter-list)]; forward;
...
...
...
procedure name;
begin
end;
register
Using REGISTER
modifier causes the first three formal parameters of the procedure/function to be placed on the zero page, in 32-bit general-purpose registers EDX
, ECX
, EAX
respectively.
procedure name (a,b,c: cardinal); register;
// a = edx
// b = ecx
// c = eax
interrupt
Procedures/Functions marked by INTERRUPT
end with RTI
instruction (instead of standard RTS
).
Regardless of whether such procedure/function is called in the program, the compiler always generates code for it.
It is recommended to use the ASM block for such procedure/function, otherwise the Mad Pascal software stack will be destroyed, which may lead to unstable program operation, including computer crashes. At the beginning of the procedure/function marked by INTERRUPT
, the programmer must take care to keep the CPU registers A
X
Y
, at the output to restore such registers, the compiler only inserts the final RTI
command.
procedure dli; interrupt;
asm
{ pha
lda #$c8
sta wsync
sta $d01a
pla
};
end; // the RTI instruction gets inserted automatically
pascal
Using the PASCAL
modifier will cause procedure/function to be treated as recursive. By default, the compiler automatically detects recursion, but there may be situations where this is not possible.
Example samples/math/evaluate.pas
stdcall
Using the STDCALL
modifier will force parameters to be passed to the procedure/function through the program stack. By default, the compiler tries to pass parameters through variables, without involving the program stack.
inline
The procedure, function is turned into a Mad Assembler macro, getting rid of calls involving the JSR
command.
It is not possible to use recursion for such procedures/functions.