FAUX Function demonstration code

mrburnette

Senior Member
FAUX functions ... a demonstration of what could be if the PICAXE allowed #INCLUDE function capability.

This is a pie-in-the-sky demonstration based on my Blog musings: http://www.picaxeforum.co.uk/entry.php?89-PE-Evolution-FAUX-Functions

While I cannot rewrite the Program Editor, I thought I would put together a working demonstration of how FAUX functions can be implemented today. Up to 3 FAUX functions can be implemented on an 08M2+ with each function having a complete set of independent named memory. Main memory is persisted in Bank_0, and Functions 1, 2, and 3 save Bank_0 in Bank_1, Bank_2, and Bank_3 respectively.

Why? Because, if implemented in the PE/Compiler, code snippets could be #INCLUDED (when functioning) and would NOT require a complete rewrite of the code to rename variables, Symbols, etc. Only light editing would be required. Not a library, per se, but so much better than nothing.

So, for your pleasure here is a working implementation of FAUX functions:
Code:
#picaxe 08m2
; 523 Bytes / 2048
; Test script to demonstrate ability of pseudo-functions to
; have full named-variable RAM space
; 21 May 2012 by M. Ray Burnette - public domain
;
;#include "F2C.bas" W0, W1	; prototype FAUX function1 passing W0 & W1
;#include "C2F.bas" W1, W0	; prototype FAUX function2 passing W1 & W0
;
;
Symbol Fahrenheit = W0		; optional synonym b1, b0
Symbol Celsius 	= W1		; optional synonym b3, b2
Symbol temp		= b5		; b5
;
;
SerTxd ("Demo Function 1 --> F2C",CR,LF)
For temp = 32 to 212
	Fahrenheit = temp		; test assignment
	gosub F2C			; FAUX function
	SerTxd (#Fahrenheit, "F= ", #Celsius, "C", CR, LF)
Next temp

SerTxd ("Demo Function 2 --> C2F",CR,LF)
For temp = 100 to 0 step -1
	Celsius = temp		; test assignment
	gosub C2F			; FAUX function
	SerTxd (#Celsius, "C= ", #Fahrenheit, "F", CR, LF)
Next temp

; ---------------------- Functions & Subroutines -------------
;
; FUNCTIONS provide what appears to be private RAM for general use
; Subroutines use public RAM and common variables
;
F2C: ;(Fahrenheit, Celsius)	; cheat as compiler just 'remaps'
; any variable in the list with its equivalent +28 / +56 / +84
; BANK_0 == 0 ; BANK_1 ==28 ; BANK_2 ==56 ; BANK_3 ==84
;
; First function uses private memory bank_1 as safe buffer RAM
bptr = 0	; Copy BANK_0 --> BANK_1 for safekeeping
Poke 28, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc
;
; Many to One Symbol mapping for use INSIDE the Function
; Purely optional usage and NO RAM penality
Symbol Fahrenheit1 = W0		; optional synonym b1, b0
Symbol Celsius1 	 = W1		; optional synonym b3, b2
; DEFINE additional Symbols here as required up to limit of RAM
; REMEMBER we are really still using BANK_0 RAM
; ALL RAM is available for this Function Routine
Symbol Constant1	 = b4 : Constant1	= 32
Symbol Multiplier1 = b5 : Multiplier1=  5 ; NOTE we are overwriting 'temp'
Symbol Divisor1	 = b6 : Divisor1	= 9
;
Celsius1 = Fahrenheit1 - Constant1 / Divisor1 * Multiplier1
;
; Prior to returning from the Function, buffer BANK_1 needs to be
; restored for ALL locations OTHER THAN those used by parameters
; Note: for purity, Fahrenheit1 should NOT change
bptr = 4
Peek 32, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc
RETURN ;(F2C == Celsius1)



C2F: ;(Fahrenheit, Celsius)
;
; Second function uses private memory bank_2 as safe buffer RAM
; BANK_0 == 0 ; BANK_1 ==28 ; BANK_2 ==56 ; BANK_3 ==84
bptr = 0	; Copy BANK_0 --> BANK_2 for safekeeping
Poke 56, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc
;
; Many to One Symbol mapping for use INSIDE the Function
; Purely optional usage and NO RAM penality
Symbol Fahrenheit2 = W0		; optional synonym b1, b0
Symbol Celsius2 	 = W1		; optional synonym b3, b2
; DEFINE additional Symbols here as required up to limit of RAM
; REMEMBER we are really still using BANK_0 RAM
; ALL RAM is available for this Function Routine
Symbol Constant2	 = b4 : Constant2	= 32
Symbol Multiplier2 = b5 : Multiplier2=  9 ; NOTE we are overwriting 'temp'
Symbol Divisor2	 = b6 : Divisor2	= 5
;
Fahrenheit2 = Celsius2 * Multiplier2 / Divisor2 + Constant2
;
; Prior to returning from the Function, buffer BANK_2 needs to be
; restored for ALL locations OTHER THAN those used by parameters
; Note: for purity, Celsius2 should NOT change
bptr = 4
Peek 60, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc, @bptrinc
RETURN ;(F2C == Fahrenheit2)
And here is the terminal output:
Code:
Demo Function 1 --> F2C
32F= 0C
33F= 0C
34F= 0C
35F= 0C
36F= 0C
37F= 0C
38F= 0C
39F= 0C
40F= 0C
41F= 5C
42F= 5C
43F= 5C
44F= 5C
45F= 5C
46F= 5C
47F= 5C
48F= 5C
49F= 5C
50F= 10C
51F= 10C
52F= 10C
53F= 10C
54F= 10C
55F= 10C
56F= 10C
57F= 10C
58F= 10C
59F= 15C
60F= 15C
61F= 15C
62F= 15C
63F= 15C
64F= 15C
65F= 15C
66F= 15C
67F= 15C
68F= 20C
69F= 20C
70F= 20C
71F= 20C
72F= 20C
73F= 20C
74F= 20C
75F= 20C
76F= 20C
77F= 25C
78F= 25C
79F= 25C
80F= 25C
81F= 25C
82F= 25C
83F= 25C
84F= 25C
85F= 25C
86F= 30C
87F= 30C
88F= 30C
89F= 30C
90F= 30C
91F= 30C
92F= 30C
93F= 30C
94F= 30C
95F= 35C
96F= 35C
97F= 35C
98F= 35C
99F= 35C
100F= 35C
101F= 35C
102F= 35C
103F= 35C
104F= 40C
105F= 40C
106F= 40C
107F= 40C
108F= 40C
109F= 40C
110F= 40C
111F= 40C
112F= 40C
113F= 45C
114F= 45C
115F= 45C
116F= 45C
117F= 45C
118F= 45C
119F= 45C
120F= 45C
121F= 45C
122F= 50C
123F= 50C
124F= 50C
125F= 50C
126F= 50C
127F= 50C
128F= 50C
129F= 50C
130F= 50C
131F= 55C
132F= 55C
133F= 55C
134F= 55C
135F= 55C
136F= 55C
137F= 55C
138F= 55C
139F= 55C
140F= 60C
141F= 60C
142F= 60C
143F= 60C
144F= 60C
145F= 60C
146F= 60C
147F= 60C
148F= 60C
149F= 65C
150F= 65C
151F= 65C
152F= 65C
153F= 65C
154F= 65C
155F= 65C
156F= 65C
157F= 65C
158F= 70C
159F= 70C
160F= 70C
161F= 70C
162F= 70C
163F= 70C
164F= 70C
165F= 70C
166F= 70C
167F= 75C
168F= 75C
169F= 75C
170F= 75C
171F= 75C
172F= 75C
173F= 75C
174F= 75C
175F= 75C
176F= 80C
177F= 80C
178F= 80C
179F= 80C
180F= 80C
181F= 80C
182F= 80C
183F= 80C
184F= 80C
185F= 85C
186F= 85C
187F= 85C
188F= 85C
189F= 85C
190F= 85C
191F= 85C
192F= 85C
193F= 85C
194F= 90C
195F= 90C
196F= 90C
197F= 90C
198F= 90C
199F= 90C
200F= 90C
201F= 90C
202F= 90C
203F= 95C
204F= 95C
205F= 95C
206F= 95C
207F= 95C
208F= 95C
209F= 95C
210F= 95C
211F= 95C
212F= 100C
Demo Function 2 --> C2F
100C= 212F
99C= 210F
98C= 208F
97C= 206F
96C= 204F
95C= 203F
94C= 201F
93C= 199F
92C= 197F
91C= 195F
90C= 194F
89C= 192F
88C= 190F
87C= 188F
86C= 186F
85C= 185F
84C= 183F
83C= 181F
82C= 179F
81C= 177F
80C= 176F
79C= 174F
78C= 172F
77C= 170F
76C= 168F
75C= 167F
74C= 165F
73C= 163F
72C= 161F
71C= 159F
70C= 158F
69C= 156F
68C= 154F
67C= 152F
66C= 150F
65C= 149F
64C= 147F
63C= 145F
62C= 143F
61C= 141F
60C= 140F
59C= 138F
58C= 136F
57C= 134F
56C= 132F
55C= 131F
54C= 129F
53C= 127F
52C= 125F
51C= 123F
50C= 122F
49C= 120F
48C= 118F
47C= 116F
46C= 114F
45C= 113F
44C= 111F
43C= 109F
42C= 107F
41C= 105F
40C= 104F
39C= 102F
38C= 100F
37C= 98F
36C= 96F
35C= 95F
34C= 93F
33C= 91F
32C= 89F
31C= 87F
30C= 86F
29C= 84F
28C= 82F
27C= 80F
26C= 78F
25C= 77F
24C= 75F
23C= 73F
22C= 71F
21C= 69F
20C= 68F
19C= 66F
18C= 64F
17C= 62F
16C= 60F
15C= 59F
14C= 57F
13C= 55F
12C= 53F
11C= 51F
10C= 50F
9C= 48F
8C= 46F
7C= 44F
6C= 42F
5C= 41F
4C= 39F
3C= 37F
2C= 35F
1C= 33F
0C= 32F
- Ray
 
Last edited:
Top