ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
fellipse.c
Go to the documentation of this file.
1/*****************************************************************************
2 * ugBASIC - an isomorphic BASIC language compiler for retrocomputers *
3 *****************************************************************************
4 * Copyright 2021-2026 Marco Spedaletti (asimov@mclink.it)
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *----------------------------------------------------------------------------
18 * Concesso in licenza secondo i termini della Licenza Apache, versione 2.0
19 * (la "Licenza"); è proibito usare questo file se non in conformità alla
20 * Licenza. Una copia della Licenza è disponibile all'indirizzo:
21 *
22 * http://www.apache.org/licenses/LICENSE-2.0
23 *
24 * Se non richiesto dalla legislazione vigente o concordato per iscritto,
25 * il software distribuito nei termini della Licenza è distribuito
26 * "COSÌ COM'È", SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, esplicite o
27 * implicite. Consultare la Licenza per il testo specifico che regola le
28 * autorizzazioni e le limitazioni previste dalla medesima.
29 ****************************************************************************/
30
31/****************************************************************************
32 * INCLUDE SECTION
33 ****************************************************************************/
34
35#include "../../ugbc.h"
36
37/****************************************************************************
38 * CODE SECTION
39 ****************************************************************************/
40
51/* <usermanual>
52@keyword ELLIPSE
53
54@english
55
56This command allows you to draw a filled ellipse with starting coordinates in ''(x,y)''
57and radius ''rx'' for the horizontal component and ''ry'' for the vertical component.
58The color is indicated by the parameter ''c''. If the abscissa
59and/or ordinate is omitted, the last graphic position drawn will be used. In
60addition, the color can also be omitted and, if necessary, the last color set with the
61''PEN'' or ''INK'' command will be used.
62
63@italian
64Questo comando consente di disegnare una ellisse piena avente coordinate di partenza in
65''(x,y)'' e raggio orizzontale ''rx'' mentre avrà raggio verticale ''ry''.
66Il colore viene indicato dal parametro ''c''. Se
67l'ascissa e/o l'ordinata viene omessa, sarà utilizzata l'ultima posizione grafica
68disegnata. In più, anche il colore può essere omesso e, nel caso, sarà utilizzato
69l'ultimo colore impostato con il comando ''PEN'' o ''INK''.
70
71@syntax FELLIPSE [x],[y],[rx],[ry][, c]
72
73@example FELLIPSE 100,100,42,21
74@example FELLIPSE ,,10,20,RED
75
76@seeAlso ELLIPSE
77
78</usermanual> */
79
80/* <usermanual>
81@keyword ELLIPSE FILL
82
83@english
84
85@italian
86
87@syntax ELLIPSE FILL [x],[y],[rx],[ry][, c]
88
89@alias FELLIPSE
90
91@target all
92</usermanual> */
93void fellipse( Environment * _environment, char * _x, char * _y, char * _rx, char * _ry, char * _c, int _preserve_color ) {
94
96
97 Variable * xc = variable_define( _environment, "ellipse__xc", VT_POSITION, 0 );
98 Variable * yc = variable_define( _environment, "ellipse__yc", VT_POSITION, 0 );
99 Variable * rx = variable_define( _environment, "ellipse__rx", VT_POSITION, 0 );
100 Variable * ry = variable_define( _environment, "ellipse__ry", VT_POSITION, 0 );
101 Variable * c = variable_define( _environment, "ellipse__c", VT_POSITION, 0 );
102
103 // forCondition
104 Variable * forCondition = variable_temporary( _environment, VT_SBYTE, "(forCondition)" );
105
106 // one
107 Variable * one = variable_temporary( _environment, VT_POSITION, "(one)" );
108 variable_store( _environment, one->name, 1 );
109 // six
110 Variable * six = variable_temporary( _environment, VT_POSITION, "(six)" );
111 variable_store( _environment, six->name, 6 );
112
113 // int a2 = a∗a
114 Variable * a2 = variable_temporary( _environment, VT_POSITION, "(a2)" );
115 variable_move( _environment, variable_mul( _environment, rx->name, rx->name )->name, a2->name );
116 // int b2 = b∗b
117 Variable * b2 = variable_temporary( _environment, VT_POSITION, "(b2)" );
118 variable_move( _environment, variable_mul( _environment, ry->name, ry->name )->name, b2->name );
119 // int fa2 = 4∗a2
120 Variable * fa2 = variable_temporary( _environment, VT_POSITION, "(fa2)" );
121 variable_move( _environment, variable_mul2_const( _environment, a2->name, 4 )->name, fa2->name );
122
123 // int x
124 // for ( x = 0
125 Variable * x = variable_temporary( _environment, VT_POSITION, "(x)" );
126 variable_store( _environment, x->name, 0 );
127 // int y
128 // for ( y = b
129 Variable * y = variable_temporary( _environment, VT_POSITION, "(y)" );
130 variable_move( _environment, ry->name, y->name );
131 // int sigma
132 // for ( sigma = 2∗b2+a2∗(1−2∗b)
133 Variable * sigma = variable_temporary( _environment, VT_SDWORD, "(sigma)" );
134 variable_move( _environment,
135 variable_add( _environment,
136 variable_mul2_const( _environment,
137 b2->name,
138 2
139 )->name,
140 variable_mul( _environment,
141 a2->name,
142 variable_sub( _environment,
143 one->name,
144 variable_mul2_const( _environment,
145 ry->name,
146 2
147 )->name
148 )->name
149 )->name
150 )->name,
151 sigma->name );
152
154
155 char forLabel1[MAX_TEMPORARY_STORAGE];
156 sprintf( forLabel1, "%sfor1", label );
157 char endForLabel1[MAX_TEMPORARY_STORAGE];
158 sprintf( endForLabel1, "%sendfor1", label );
159
160 cpu_label( _environment, forLabel1 );
161
162 // for ( ; b2∗x <= a2∗y ; )
163 variable_move( _environment, variable_less_than( _environment,
164 variable_mul( _environment, b2->name, x->name )->name,
165 variable_mul( _environment, a2->name, y->name )->name,
166 1 )->name, forCondition->name );
167
168 cpu_compare_and_branch_8bit_const( _environment, forCondition->realName, 0x00, endForLabel1, 1 );
169
170 // // DrawPixel ( xc+x , yc+y ) ;
171 // plot( _environment,
172 // variable_add( _environment, xc->name, x->name )->name,
173 // variable_add( _environment, yc->name, y->name )->name,
174 // c->name,
175 // _preserve_color );
176
177 // // DrawPixel ( xc−x , yc+y ) ;
178 // plot( _environment,
179 // variable_sub( _environment, xc->name, x->name )->name,
180 // variable_add( _environment, yc->name, y->name )->name,
181 // c->name,
182 // _preserve_color );
183
184 draw( _environment,
185 variable_add( _environment, xc->name, x->name )->name,
186 variable_add( _environment, yc->name, y->name )->name,
187 variable_sub( _environment, xc->name, x->name )->name,
188 variable_add( _environment, yc->name, y->name )->name,
189 c->name,
190 _preserve_color );
191
192 // // DrawPixel ( xc+x , yc−y ) ;
193 // plot( _environment,
194 // variable_add( _environment, xc->name, x->name )->name,
195 // variable_sub( _environment, yc->name, y->name )->name,
196 // c->name,
197 // _preserve_color );
198
199 // // DrawPixel ( xc−x , yc−y ) ;
200 // plot( _environment,
201 // variable_sub( _environment, xc->name, x->name )->name,
202 // variable_sub( _environment, yc->name, y->name )->name,
203 // c->name,
204 // _preserve_color );
205
206 draw( _environment,
207 variable_add( _environment, xc->name, x->name )->name,
208 variable_sub( _environment, yc->name, y->name )->name,
209 variable_sub( _environment, xc->name, x->name )->name,
210 variable_sub( _environment, yc->name, y->name )->name,
211 c->name,
212 _preserve_color );
213
214 // wait_key( _environment, 0 );
215
216 // if ( sigma >= 0 )
217 if_then( _environment, variable_greater_than_const( _environment, sigma->name, 0, 1 )->name );
218 // sigma += fa2∗(1−y) ;
219 variable_add_inplace_vars( _environment,
220 sigma->name,
221 variable_mul( _environment,
222 fa2->name,
223 variable_sub( _environment,
224 one->name,
225 y->name)->name
226 )->name
227 );
228
229 // y−−;
230 variable_decrement( _environment, y->name );
231
232 end_if_then( _environment );
233
234 // sig a += b2∗(4∗x+6);
235 variable_add_inplace_vars( _environment,
236 sigma->name,
237 variable_mul( _environment,
238 b2->name,
239 variable_add( _environment,
240 variable_mul2_const( _environment,
241 x->name,
242 4 )->name,
243 six->name
244 )->name
245 )->name
246 );
247
248 // for ( ... x++)
249 variable_increment( _environment, x->name );
250
251 cpu_jump( _environment, forLabel1 );
252
253 cpu_label( _environment, endForLabel1 );
254
256
257 // int fb2 = 4∗b2
258 Variable * fb2 = variable_temporary( _environment, VT_POSITION, "(fb2)" );
259 variable_move( _environment, variable_mul2_const( _environment, b2->name, 4 )->name, fb2->name );
260
261 char forLabel2[MAX_TEMPORARY_STORAGE];
262 sprintf( forLabel2, "%sfor2", label );
263 char endForLabel2[MAX_TEMPORARY_STORAGE];
264 sprintf( endForLabel2, "%sendfor2", label );
265
266 // for( x=a
267 variable_move( _environment, rx->name, x->name );
268
269 // for( y=0
270 variable_store( _environment, y->name, 0 );
271
272 // for( sigma = 2∗a2+b2∗(1−2∗a )
273 variable_move( _environment,
274 variable_add( _environment,
275 variable_mul2_const( _environment,
276 a2->name,
277 2
278 )->name,
279 variable_mul( _environment,
280 b2->name,
281 variable_sub( _environment,
282 one->name,
283 variable_mul2_const( _environment,
284 rx->name,
285 2
286 )->name
287 )->name
288 )->name
289 )->name,
290 sigma->name );
291
292 cpu_label( _environment, forLabel2 );
293
294 // for( a2∗y <= b2∗x )
295 variable_move( _environment, variable_less_than( _environment,
296 variable_mul( _environment, a2->name, y->name )->name,
297 variable_mul( _environment, b2->name, x->name )->name,
298 1 )->name, forCondition->name );
299
300 cpu_compare_and_branch_8bit_const( _environment, forCondition->realName, 0x00, endForLabel2, 1 );
301
302 // // DrawPixel ( xc+x , yc+y ) ;
303 // plot( _environment,
304 // variable_add( _environment, xc->name, x->name )->name,
305 // variable_add( _environment, yc->name, y->name )->name,
306 // c->name,
307 // _preserve_color );
308
309 // // DrawPixel ( xc−x , yc+y ) ;
310 // plot( _environment,
311 // variable_sub( _environment, xc->name, x->name )->name,
312 // variable_add( _environment, yc->name, y->name )->name,
313 // c->name,
314 // _preserve_color );
315
316 draw( _environment,
317 variable_add( _environment, xc->name, x->name )->name,
318 variable_add( _environment, yc->name, y->name )->name,
319 variable_sub( _environment, xc->name, x->name )->name,
320 variable_add( _environment, yc->name, y->name )->name,
321 c->name,
322 _preserve_color );
323
324 // // DrawPixel ( xc+x , yc−y ) ;
325 // plot( _environment,
326 // variable_add( _environment, xc->name, x->name )->name,
327 // variable_sub( _environment, yc->name, y->name )->name,
328 // c->name,
329 // _preserve_color );
330
331 // // DrawPixel ( xc−x , yc−y ) ;
332 // plot( _environment,
333 // variable_sub( _environment, xc->name, x->name )->name,
334 // variable_sub( _environment, yc->name, y->name )->name,
335 // c->name,
336 // _preserve_color );
337
338 draw( _environment,
339 variable_add( _environment, xc->name, x->name )->name,
340 variable_sub( _environment, yc->name, y->name )->name,
341 variable_sub( _environment, xc->name, x->name )->name,
342 variable_sub( _environment, yc->name, y->name )->name,
343 c->name,
344 _preserve_color );
345
346 // if ( sigma >= 0 )
347 if_then( _environment, variable_greater_than_const( _environment, sigma->name, 0, 1 )->name );
348 // sigma += fb2∗(1−x);
349 variable_add_inplace_vars( _environment,
350 sigma->name,
351 variable_mul( _environment,
352 fb2->name,
353 variable_sub( _environment,
354 one->name,
355 x->name)->name
356 )->name
357 );
358
359 // x−−;
360 variable_decrement( _environment, x->name );
361
362 end_if_then( _environment );
363
364 // sigma += a2∗(4∗y+6);
365 variable_add_inplace_vars( _environment,
366 sigma->name,
367 variable_mul( _environment,
368 a2->name,
369 variable_add( _environment,
370 variable_mul2_const( _environment,
371 y->name,
372 4 )->name,
373 six->name
374 )->name
375 )->name
376 );
377
378 // wait_key( _environment, 0 );
379
380 // for ( ... y++)
381 variable_increment( _environment, y->name );
382
383 cpu_jump( _environment, forLabel2 );
384
385 cpu_label( _environment, endForLabel2 );
386
387 cpu_return( _environment );
388
390
391 Variable * xc = variable_retrieve_or_define( _environment, _x, VT_POSITION, 0 );
392 Variable * yc = variable_retrieve_or_define( _environment, _y, VT_POSITION, 0 );
393 Variable * rx = variable_retrieve_or_define( _environment, _rx, VT_POSITION, 0 );
394 Variable * ry = variable_retrieve_or_define( _environment, _ry, VT_POSITION, 0 );
395 Variable * c = NULL;
396 if ( _c ) {
397 c = variable_retrieve_or_define( _environment, _c, VT_COLOR, 0 );
398 }
399
400 Variable * pxc = variable_retrieve( _environment, "ellipse__xc" );
401 Variable * pyc = variable_retrieve( _environment, "ellipse__yc" );
402 Variable * prx = variable_retrieve( _environment, "ellipse__rx" );
403 Variable * pry = variable_retrieve( _environment, "ellipse__ry" );
404 Variable * pc = variable_retrieve( _environment, "ellipse__c" );
405
406 variable_move( _environment, xc->name, pxc->name );
407 variable_move( _environment, yc->name, pyc->name );
408 variable_move( _environment, rx->name, prx->name );
409 variable_move( _environment, ry->name, pry->name );
410
411 if ( c ) {
412 variable_move( _environment, c->name, pc->name );
413 } else {
414 variable_move( _environment, "PEN", pc->name );
415 }
416
417 cpu_call( _environment, "lib_fellipse");
418
419}
void cpu_label(Environment *_environment, char *_label)
Definition 6309.c:356
void cpu_call(Environment *_environment, char *_label)
Definition 6309.c:3755
void cpu_jump(Environment *_environment, char *_label)
Definition 6309.c:3739
void cpu_return(Environment *_environment)
Definition 6309.c:4030
void cpu_compare_and_branch_8bit_const(Environment *_environment, char *_source, int _destination, char *_label, int _positive)
CPU 6309: emit code to compare two 8 bit values and jump if they are equal/different
Definition 6309.c:876
Variable * variable_add(Environment *_environment, char *_source, char *_destination)
Add two variable and return the sum of them.
Variable * variable_retrieve(Environment *_environment, char *_name)
Variable * variable_retrieve_or_define(Environment *_environment, char *_name, VariableType _type, int _value)
Variable * variable_mul2_const(Environment *_environment, char *_destination, int _steps)
Double a variable for various times and return the result.
void variable_decrement(Environment *_environment, char *_source)
Decrement a variable by one.
Variable * variable_less_than(Environment *_environment, char *_source, char *_destination, int _equal)
Compare two variable and return the result of comparation.
Variable * variable_move(Environment *_environment, char *_source, char *_destination)
Store the value of a variable inside another variable by converting it.
void variable_increment(Environment *_environment, char *_source)
Increment a variable by one.
Variable * variable_define(Environment *_environment, char *_name, VariableType _type, int _value)
Define a variable for the program.
Variable * variable_mul(Environment *_environment, char *_source, char *_destination)
Make a multiplication between two variable and return the product of them.
void variable_add_inplace_vars(Environment *_environment, char *_source, char *_destination)
Add two variable and return the sum of them on the first.
Variable * variable_sub(Environment *_environment, char *_source, char *_dest)
Make a differenze between two variable and return the difference of them.
Variable * variable_temporary(Environment *_environment, VariableType _type, char *_meaning)
Define a temporary variable.
Variable * variable_store(Environment *_environment, char *_destination, unsigned int _value)
Store a direct value to a variable.
Variable * variable_greater_than_const(Environment *_environment, char *_source, int _destination, int _equal)
void draw(Environment *_environment, char *_x0, char *_y0, char *_x1, char *_y1, char *_c, int _preserve_color)
Emit ASM code to implement DRAW command.
Definition draw.c:153
void end_if_then(Environment *_environment)
Emit ASM code for ENDIF.
Definition end_if_then.c:50
void fellipse(Environment *_environment, char *_x, char *_y, char *_rx, char *_ry, char *_c, int _preserve_color)
Emit code for ELLIPSE command.
Definition fellipse.c:93
void if_then(Environment *_environment, char *_expression)
Emit ASM code for IF ... THEN ....
Definition if_then.c:123
char * name
Definition ugbc.h:979
char * realName
Definition ugbc.h:982
#define deploy_end(s)
Definition ugbc.h:4365
#define MAX_TEMPORARY_STORAGE
Definition ugbc.h:563
struct _Variable Variable
Structure of a single variable.
struct _Environment Environment
Structure of compilation environment.
@ VT_POSITION
Definition ugbc.h:468
@ VT_SDWORD
Definition ugbc.h:462
@ VT_SBYTE
Definition ugbc.h:452
@ VT_COLOR
Definition ugbc.h:471
#define deploy_begin(s)
Definition ugbc.h:4356
#define MAKE_LABEL
Definition ugbc.h:3351