ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
ellipse.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 an 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 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 ELLIPSE [x],[y],[rx],[ry][, c]
72
73@example ELLIPSE 100,100,42,21
74@example ELLIPSE ,,10,20,RED
75@usedInExample graphics_clip_01.bas
76@usedInExample graphics_shapes_03.bas
77
78@seeAlso CIRCLE
79
80</usermanual> */
81void ellipse( Environment * _environment, char * _x, char * _y, char * _rx, char * _ry, char * _c, int _preserve_color ) {
82
84
85 Variable * xc = variable_define( _environment, "ellipse__xc", VT_POSITION, 0 );
86 Variable * yc = variable_define( _environment, "ellipse__yc", VT_POSITION, 0 );
87 Variable * rx = variable_define( _environment, "ellipse__rx", VT_POSITION, 0 );
88 Variable * ry = variable_define( _environment, "ellipse__ry", VT_POSITION, 0 );
89 Variable * c = variable_define( _environment, "ellipse__c", VT_POSITION, 0 );
90
91 // forCondition
92 Variable * forCondition = variable_temporary( _environment, VT_SBYTE, "(forCondition)" );
93
94 // one
95 Variable * one = variable_temporary( _environment, VT_POSITION, "(one)" );
96 variable_store( _environment, one->name, 1 );
97 // six
98 Variable * six = variable_temporary( _environment, VT_POSITION, "(six)" );
99 variable_store( _environment, six->name, 6 );
100
101 // int a2 = a∗a
102 Variable * a2 = variable_temporary( _environment, VT_POSITION, "(a2)" );
103 variable_move( _environment, variable_mul( _environment, rx->name, rx->name )->name, a2->name );
104 // int b2 = b∗b
105 Variable * b2 = variable_temporary( _environment, VT_POSITION, "(b2)" );
106 variable_move( _environment, variable_mul( _environment, ry->name, ry->name )->name, b2->name );
107 // int fa2 = 4∗a2
108 Variable * fa2 = variable_temporary( _environment, VT_POSITION, "(fa2)" );
109 variable_move( _environment, variable_mul2_const( _environment, a2->name, 4 )->name, fa2->name );
110
111 // int x
112 // for ( x = 0
113 Variable * x = variable_temporary( _environment, VT_POSITION, "(x)" );
114 variable_store( _environment, x->name, 0 );
115 // int y
116 // for ( y = b
117 Variable * y = variable_temporary( _environment, VT_POSITION, "(y)" );
118 variable_move( _environment, ry->name, y->name );
119 // int sigma
120 // for ( sigma = 2∗b2+a2∗(1−2∗b)
121 Variable * sigma = variable_temporary( _environment, VT_SDWORD, "(sigma)" );
122 variable_move( _environment,
123 variable_add( _environment,
124 variable_mul2_const( _environment,
125 b2->name,
126 2
127 )->name,
128 variable_mul( _environment,
129 a2->name,
130 variable_sub( _environment,
131 one->name,
132 variable_mul2_const( _environment,
133 ry->name,
134 2
135 )->name
136 )->name
137 )->name
138 )->name,
139 sigma->name );
140
142
143 char forLabel1[MAX_TEMPORARY_STORAGE];
144 sprintf( forLabel1, "%sfor1", label );
145 char endForLabel1[MAX_TEMPORARY_STORAGE];
146 sprintf( endForLabel1, "%sendfor1", label );
147
148 cpu_label( _environment, forLabel1 );
149
150 // for ( ; b2∗x <= a2∗y ; )
151 variable_move( _environment, variable_less_than( _environment,
152 variable_mul( _environment, b2->name, x->name )->name,
153 variable_mul( _environment, a2->name, y->name )->name,
154 1 )->name, forCondition->name );
155
156 cpu_compare_and_branch_8bit_const( _environment, forCondition->realName, 0x00, endForLabel1, 1 );
157
158 // DrawPixel ( xc+x , yc+y ) ;
159 plot( _environment,
160 variable_add( _environment, xc->name, x->name )->name,
161 variable_add( _environment, yc->name, y->name )->name,
162 c->name,
163 _preserve_color );
164
165 // DrawPixel ( xc−x , yc+y ) ;
166 plot( _environment,
167 variable_sub( _environment, xc->name, x->name )->name,
168 variable_add( _environment, yc->name, y->name )->name,
169 c->name,
170 _preserve_color );
171
172 // DrawPixel ( xc+x , yc−y ) ;
173 plot( _environment,
174 variable_add( _environment, xc->name, x->name )->name,
175 variable_sub( _environment, yc->name, y->name )->name,
176 c->name,
177 _preserve_color );
178
179 // DrawPixel ( xc−x , yc−y ) ;
180 plot( _environment,
181 variable_sub( _environment, xc->name, x->name )->name,
182 variable_sub( _environment, yc->name, y->name )->name,
183 c->name,
184 _preserve_color );
185
186 ;
187
188 // wait_key( _environment, 0 );
189
190 // if ( sigma >= 0 )
191 if_then( _environment, variable_greater_than_const( _environment, sigma->name, 0, 1 )->name );
192 // sigma += fa2∗(1−y) ;
193 variable_add_inplace_vars( _environment,
194 sigma->name,
195 variable_mul( _environment,
196 fa2->name,
197 variable_sub( _environment,
198 one->name,
199 y->name)->name
200 )->name
201 );
202
203 // y−−;
204 variable_decrement( _environment, y->name );
205
206 end_if_then( _environment );
207
208 // sig a += b2∗(4∗x+6);
209 variable_add_inplace_vars( _environment,
210 sigma->name,
211 variable_mul( _environment,
212 b2->name,
213 variable_add( _environment,
214 variable_mul2_const( _environment,
215 x->name,
216 4 )->name,
217 six->name
218 )->name
219 )->name
220 );
221
222 // for ( ... x++)
223 variable_increment( _environment, x->name );
224
225 cpu_jump( _environment, forLabel1 );
226
227 cpu_label( _environment, endForLabel1 );
228
230
231 // int fb2 = 4∗b2
232 Variable * fb2 = variable_temporary( _environment, VT_POSITION, "(fb2)" );
233 variable_move( _environment, variable_mul2_const( _environment, b2->name, 4 )->name, fb2->name );
234
235 char forLabel2[MAX_TEMPORARY_STORAGE];
236 sprintf( forLabel2, "%sfor2", label );
237 char endForLabel2[MAX_TEMPORARY_STORAGE];
238 sprintf( endForLabel2, "%sendfor2", label );
239
240 // for( x=a
241 variable_move( _environment, rx->name, x->name );
242
243 // for( y=0
244 variable_store( _environment, y->name, 0 );
245
246 // for( sigma = 2∗a2+b2∗(1−2∗a )
247 variable_move( _environment,
248 variable_add( _environment,
249 variable_mul2_const( _environment,
250 a2->name,
251 2
252 )->name,
253 variable_mul( _environment,
254 b2->name,
255 variable_sub( _environment,
256 one->name,
257 variable_mul2_const( _environment,
258 rx->name,
259 2
260 )->name
261 )->name
262 )->name
263 )->name,
264 sigma->name );
265
266 cpu_label( _environment, forLabel2 );
267
268 // for( a2∗y <= b2∗x )
269 variable_move( _environment, variable_less_than( _environment,
270 variable_mul( _environment, a2->name, y->name )->name,
271 variable_mul( _environment, b2->name, x->name )->name,
272 1 )->name, forCondition->name );
273
274 cpu_compare_and_branch_8bit_const( _environment, forCondition->realName, 0x00, endForLabel2, 1 );
275
276 // DrawPixel ( xc+x , yc+y ) ;
277 plot( _environment,
278 variable_add( _environment, xc->name, x->name )->name,
279 variable_add( _environment, yc->name, y->name )->name,
280 c->name,
281 _preserve_color );
282
283 // DrawPixel ( xc−x , yc+y ) ;
284 plot( _environment,
285 variable_sub( _environment, xc->name, x->name )->name,
286 variable_add( _environment, yc->name, y->name )->name,
287 c->name,
288 _preserve_color );
289
290 // DrawPixel ( xc+x , yc−y ) ;
291 plot( _environment,
292 variable_add( _environment, xc->name, x->name )->name,
293 variable_sub( _environment, yc->name, y->name )->name,
294 c->name,
295 _preserve_color );
296
297 // DrawPixel ( xc−x , yc−y ) ;
298 plot( _environment,
299 variable_sub( _environment, xc->name, x->name )->name,
300 variable_sub( _environment, yc->name, y->name )->name,
301 c->name,
302 _preserve_color );
303
304 ;
305
306 // if ( sigma >= 0 )
307 if_then( _environment, variable_greater_than_const( _environment, sigma->name, 0, 1 )->name );
308 // sigma += fb2∗(1−x);
309 variable_add_inplace_vars( _environment,
310 sigma->name,
311 variable_mul( _environment,
312 fb2->name,
313 variable_sub( _environment,
314 one->name,
315 x->name)->name
316 )->name
317 );
318
319 // x−−;
320 variable_decrement( _environment, x->name );
321
322 end_if_then( _environment );
323
324 // sigma += a2∗(4∗y+6);
325 variable_add_inplace_vars( _environment,
326 sigma->name,
327 variable_mul( _environment,
328 a2->name,
329 variable_add( _environment,
330 variable_mul2_const( _environment,
331 y->name,
332 4 )->name,
333 six->name
334 )->name
335 )->name
336 );
337
338 // wait_key( _environment, 0 );
339
340 // for ( ... y++)
341 variable_increment( _environment, y->name );
342
343 cpu_jump( _environment, forLabel2 );
344
345 cpu_label( _environment, endForLabel2 );
346
347 cpu_return( _environment );
348
350
351 Variable * xc = variable_retrieve_or_define( _environment, _x, VT_POSITION, 0 );
352 Variable * yc = variable_retrieve_or_define( _environment, _y, VT_POSITION, 0 );
353 Variable * rx = variable_retrieve_or_define( _environment, _rx, VT_POSITION, 0 );
354 Variable * ry = variable_retrieve_or_define( _environment, _ry, VT_POSITION, 0 );
355 Variable * c = NULL;
356 if ( _c ) {
357 c = variable_retrieve_or_define( _environment, _c, VT_COLOR, 0 );
358 }
359
360 Variable * pxc = variable_retrieve( _environment, "ellipse__xc" );
361 Variable * pyc = variable_retrieve( _environment, "ellipse__yc" );
362 Variable * prx = variable_retrieve( _environment, "ellipse__rx" );
363 Variable * pry = variable_retrieve( _environment, "ellipse__ry" );
364 Variable * pc = variable_retrieve( _environment, "ellipse__c" );
365
366 variable_move( _environment, xc->name, pxc->name );
367 variable_move( _environment, yc->name, pyc->name );
368 variable_move( _environment, rx->name, prx->name );
369 variable_move( _environment, ry->name, pry->name );
370
371 if ( c ) {
372 variable_move( _environment, c->name, pc->name );
373 } else {
374 variable_move( _environment, "PEN", pc->name );
375 }
376
377 cpu_call( _environment, "lib_ellipse");
378
379}
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 plot(Environment *_environment, char *_x, char *_y, char *_c, int _preserve_color)
Definition plot.c:46
void ellipse(Environment *_environment, char *_x, char *_y, char *_rx, char *_ry, char *_c, int _preserve_color)
Emit code for ELLIPSE command.
Definition ellipse.c:81
void end_if_then(Environment *_environment)
Emit ASM code for ENDIF.
Definition end_if_then.c:50
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