meekins@cis.ohio-state.edu (Tim Meekins) (06/13/91)
**************************************************************************
* *
* ZAVTRA MACRO UTILITIES DISK *
* Copyright 1990,91 by Tim Meekins *
* All Rights Reserved *
* *
* THIS PRODUCT IS SHAREWARE!! *
* If you find yourself using this product extensively, please take the *
* time and send several dollars to the author to compensate for the *
* many hours spent developing this product for your use. Support of *
* this product will help in the development of future products. *
* *
**************************************************************************
* *
* The author can be reached at: *
* *
* Tim Meekins *
* 8372 Morris Rd. *
* Hilliard, OH 43026 *
* *
* Internet: meekins@cis.ohio-state.edu *
* timm@pro-tcc.cts.com *
* *
**************************************************************************
M16.PASCAL DOCUMENTATION
========================
Release 1.1
This file (M16.PASCAL) consists of two macros for developing Pascal-like
subroutines. I highly reccomend that you use these macros when writing
subroutines, especially if there is a need to pass parameters back and forth.
The two macros are SUBROUTINE and RETURN.
--------------------------------------------------------------------------
SUBROUTINE &Parameters,&WorkSpace
&Parameters contains a list of parameters that are being passed to the
subroutine. Each paramter is separated with a comma, and each parameter
is prefixed with the length of the parameter in bytes, separated by a ':'.
&WorkSpace is the amount of space to be reserved for local variables.
--------------------------------------------------------------------------
RETURN &Return
Return is the value to return. &Return is prefixed with the length of the
return value and separated with a ':'.
If the return length is 2 then the Accumulator contains &Return.
If the return length is 4 then the Accumulator contains the LSB of &Return
and the X-register contains the MSB of &Register.
If the return length is 10 then the Y-Register contains the LSB of
&Return's address and the X-Register contains the MSB of &Return's Address.
--------------------------------------------------------------------------
AN EXAMPLE:
;
; An example of using SUBROUTINE and RETURN
;
Local1 equ 0 ;These are the local variables!
Local2 equ Local1+2
Local3 equ Local2+2
Space equ Local3+2 ;This is the workspace needed!!
;
;
SUBROUTINE (2:Parm1,4:Parm2),Space
;
; Put the body of the subroutine here, the local variables and parameters
; can be used simply by referencing them, for example,
; LDA Parm1
; STA Local2
;
RETURN 2:Local3 ;Return Local3 in Y reg.
Return values may also be returned via the stack. In our previous example,
Just after SUBROUTINE was declared, we could have placed:
Return1 equ Parm1+2 ;Note, this is the first
Return2 equ Return1+2 ; parameter
--------------------------------------------------------------------------
THE STACK.
Below is the stack of the previous example:
Stack Offset
___ _____
18 \
Return2 17___ |
16 |
Return1 15___ |
14 \ These values are placed on the stack by
Parm1 13___ / the calling program. When the subroutine
12 | exits, only Return1 and Return2 are left on
11 | the stack.
10 |
Parm2 9____ _____/
8 \
7 > This is the return address for RTL
Return Addr 6____ _____/
5 \
Local3 4____ |
3 \ This is the local storage created by the
Local2 2____ / subroutine
1 |
Local1 0_____ _____/ <- Top of stack
--
++------------S-U-P-P-O-R-T---S-H-A-R-E-W-A-R-E---O-R---D-I-E-!-----------++
|| Tim Meekins || Snail Mail: || Apple II ||
|| meekins@cis.ohio-state.edu || 8372 Morris Rd. || Forever! ||
\\___timm@pro-tcc.cts.com________/\____Hilliard, OH 43026__/\_____________//