ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
draw_tsb_string.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
41void draw_tsb_string( Environment * _environment, char * _string, char * _x, char * _y, char * _c, int _preserve_color ) {
42
44
46
47 char drawStringLabel[MAX_TEMPORARY_STORAGE]; sprintf( drawStringLabel, "%sds", label );
48
49 char move5CommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( move5CommandLabel, "%smv5", label );
50 char doneCommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( doneCommandLabel, "%sdone", label );
51 char upCommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( upCommandLabel, "%sup", label );
52 char downCommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( downCommandLabel, "%sdown", label );
53 char upDCommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( upDCommandLabel, "%supd", label );
54 char downDCommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( downDCommandLabel, "%sdownd", label );
55 char leftCommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( leftCommandLabel, "%sleft", label );
56 char rightCommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( rightCommandLabel, "%sright", label );
57 char leftDCommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( leftDCommandLabel, "%sleftd", label );
58 char rightDCommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( rightDCommandLabel, "%srightd", label );
59 char drawCommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( drawCommandLabel, "%sdraw", label );
60 char angleCommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( angleCommandLabel, "%sangle", label );
61 char angles2CommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( angles2CommandLabel, "%sangles2", label );
62 char angle45CommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( angle45CommandLabel, "%sa45", label );
63 char angle135CommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( angle135CommandLabel, "%sa135", label );
64 char angle225CommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( angle225CommandLabel, "%sa225", label );
65 char angle315CommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( angle315CommandLabel, "%sa315", label );
66 char angleDCommandLabel[MAX_TEMPORARY_STORAGE]; sprintf( angleDCommandLabel, "%sangled", label );
67
68 Variable * drawUCommandLetter = variable_retrieve( _environment, "DRAWUCOMMAND" );
69 Variable * drawDCommandLetter = variable_retrieve( _environment, "DRAWDCOMMAND" );
70 Variable * drawLCommandLetter = variable_retrieve( _environment, "DRAWLCOMMAND" );
71 Variable * drawRCommandLetter = variable_retrieve( _environment, "DRAWRCOMMAND" );
72 Variable * drawECommandLetter = variable_retrieve( _environment, "DRAWECOMMAND" );
73 Variable * drawFCommandLetter = variable_retrieve( _environment, "DRAWFCOMMAND" );
74 Variable * drawGCommandLetter = variable_retrieve( _environment, "DRAWGCOMMAND" );
75 Variable * drawHCommandLetter = variable_retrieve( _environment, "DRAWHCOMMAND" );
76 Variable * drawUDCommandLetter = variable_retrieve( _environment, "DRAWUDCOMMAND" );
77 Variable * drawDDCommandLetter = variable_retrieve( _environment, "DRAWDDCOMMAND" );
78 Variable * drawLDCommandLetter = variable_retrieve( _environment, "DRAWLDCOMMAND" );
79 Variable * drawRDCommandLetter = variable_retrieve( _environment, "DRAWRDCOMMAND" );
80 Variable * drawEDCommandLetter = variable_retrieve( _environment, "DRAWEDCOMMAND" );
81 Variable * drawFDCommandLetter = variable_retrieve( _environment, "DRAWFDCOMMAND" );
82 Variable * drawGDCommandLetter = variable_retrieve( _environment, "DRAWGDCOMMAND" );
83 Variable * drawHDCommandLetter = variable_retrieve( _environment, "DRAWHDCOMMAND" );
84
85 // Move to the start of routine
86 cpu_jump( _environment, drawStringLabel );
87
88 // ----------------------------[ SUBROUTINE: READ PARAMETER ]
89
90 // string -> (address, size)
91 Variable * address = variable_temporary( _environment, VT_ADDRESS, "(address)" );
92 Variable * size = variable_temporary( _environment, VT_BYTE, "(address)" );
93
94 // xxx, -> (paddress, psize)
95 Variable * paddress = variable_temporary( _environment, VT_ADDRESS, "(address)" );
96 Variable * psize = variable_temporary( _environment, VT_BYTE, "(size)" );
97
98 // ------------------------------------ STARTING ROUTINE
99 cpu_label( _environment, drawStringLabel );
100
101 // String with the drawing commands,
102 Variable * string = variable_define( _environment, "drawstring__string", VT_DSTRING, 0 );
103
104 // Color to be used
105 Variable * color = variable_define( _environment, "drawstring__color", VT_COLOR, 0 );
106
107 // Starting position
108 Variable * startingX = variable_define( _environment, "drawstring__x", VT_POSITION, 0 );
109 Variable * startingY = variable_define( _environment, "drawstring__y", VT_POSITION, 0 );
110
111 // Letter with command
112 Variable * command = variable_temporary( _environment, VT_BYTE, "(command)" );
113
114 // Next coordinates to move to.
115 Variable * x = variable_temporary( _environment, VT_POSITION, "(x)" );
116 Variable * y = variable_temporary( _environment, VT_POSITION, "(y)" );
117
118 // Next delta coordinates.
119 Variable * dx = variable_temporary( _environment, VT_POSITION, "(dx)" );
120 Variable * dy = variable_temporary( _environment, VT_POSITION, "(dy)" );
121
122 // Next delta coordinates scaled
123 Variable * ds = variable_temporary( _environment, VT_POSITION, "(ds)" );
124
125 // Scale.
126 Variable * scale = variable_retrieve( _environment, "DRAWSCALE" );
127
128 // Is blank required?
129 Variable * blank = variable_temporary( _environment, VT_BYTE, "(blank)" );
130
131 cpu_dsdescriptor( _environment, string->realName, address->realName, size->realName );
132
133 gr_locate( _environment, startingX->name, startingY->name );
134 // Take starting x and y
135 variable_move( _environment, startingX->name, x->name );
136 variable_move( _environment, startingY->name, y->name );
137
138 // ------------------------------------ FETCH AND DECODE LOOP
139 begin_do_loop( _environment );
140
141 variable_store( _environment, blank->name, 0xff );
142
143 // Are drawing commands ended? Exit fetch and decode loop.
144 cpu_compare_and_branch_8bit_const( _environment, size->realName, 0, label, 1 );
145
146 // Retrieve command letter.
147 cpu_move_8bit_indirect2( _environment, address->realName, command->realName );
148 cpu_dec( _environment, size->realName );
149 cpu_inc_16bit( _environment, address->realName );
150
151 // Is it '3' ? -> LEFT
152 cpu_compare_and_branch_8bit( _environment, command->realName, drawLCommandLetter->realName, leftCommandLabel, 1 );
153
154 // Is it '0' ? -> RIGHT
155 cpu_compare_and_branch_8bit( _environment, command->realName, drawRCommandLetter->realName, rightCommandLabel, 1 );
156
157 // Is it '1' ? -> UP
158 cpu_compare_and_branch_8bit( _environment, command->realName, drawUCommandLetter->realName, upCommandLabel, 1 );
159
160 // Is it '2' ? -> DOWN
161 cpu_compare_and_branch_8bit( _environment, command->realName, drawDCommandLetter->realName, downCommandLabel, 1 );
162
163 // Is it '8' ? -> LEFT & DRAW
164 cpu_compare_and_branch_8bit( _environment, command->realName, drawLDCommandLetter->realName, leftDCommandLabel, 1 );
165
166 // Is it '5' ? -> RIGHT & DRAW
167 cpu_compare_and_branch_8bit( _environment, command->realName, drawRDCommandLetter->realName, rightDCommandLabel, 1 );
168
169 // Is it '6' ? -> UP & DRAW
170 cpu_compare_and_branch_8bit( _environment, command->realName, drawUDCommandLetter->realName, upDCommandLabel, 1 );
171
172 // Is it '7' ? -> DOWN & DRAW
173 cpu_compare_and_branch_8bit( _environment, command->realName, drawDDCommandLetter->realName, downDCommandLabel, 1 );
174
175 // Is it '3*' ? -> 45°
176 cpu_compare_and_branch_8bit( _environment, command->realName, drawECommandLetter->realName, angleCommandLabel, 1 );
177
178 // Is it '0*' ? -> 135°
179 cpu_compare_and_branch_8bit( _environment, command->realName, drawFCommandLetter->realName, angleCommandLabel, 1 );
180
181 // Is it '1*' ? -> 225°
182 cpu_compare_and_branch_8bit( _environment, command->realName, drawGCommandLetter->realName, angleCommandLabel, 1 );
183
184 // Is it '2*' ? -> 315°
185 cpu_compare_and_branch_8bit( _environment, command->realName, drawHCommandLetter->realName, angleCommandLabel, 1 );
186
187 // Is it '8*' ? -> 45°
188 cpu_compare_and_branch_8bit( _environment, command->realName, drawEDCommandLetter->realName, angleDCommandLabel, 1 );
189
190 // Is it '5*' ? -> 135°
191 cpu_compare_and_branch_8bit( _environment, command->realName, drawFDCommandLetter->realName, angleDCommandLabel, 1 );
192
193 // Is it '6*' ? -> 225°
194 cpu_compare_and_branch_8bit( _environment, command->realName, drawGDCommandLetter->realName, angleDCommandLabel, 1 );
195
196 // Is it '7*' ? -> 315°
197 cpu_compare_and_branch_8bit( _environment, command->realName, drawHDCommandLetter->realName, angleDCommandLabel, 1 );
198
199 // Is it '9' ? -> end
200 cpu_compare_and_branch_8bit_const( _environment, command->realName, '9', label, 1 );
201
202 // No command was recognized: silently, move to the next character.
203 cpu_jump( _environment, doneCommandLabel );
204
205 // ----------------------------[ UP ]
206 cpu_label( _environment, upDCommandLabel );
207 variable_store( _environment, blank->name, 0 );
208 cpu_label( _environment, upCommandLabel );
209
210 cpu_store_8bit( _environment, dy->realName, 1 );
211
212 variable_move( _environment, origin_resolution_relative_transform_y( _environment, dy->name, 0 )->name, dy->name );
213 variable_move( _environment, variable_mul( _environment, dy->name, scale->name )->name, ds->name );
214
215 variable_move( _environment,
216 variable_sub( _environment, y->name,
217 ds->name
218 )->name,
219 y->name
220 );
221 cpu_jump( _environment, drawCommandLabel );
222
223 // ----------------------------[ DOWN ]
224 cpu_label( _environment, downDCommandLabel );
225 variable_store( _environment, blank->name, 0 );
226 cpu_label( _environment, downCommandLabel );
227
228 cpu_store_8bit( _environment, dy->realName, 1 );
229
230 variable_move( _environment, origin_resolution_relative_transform_y( _environment, dy->name, 0 )->name, dy->name );
231 variable_move( _environment, variable_mul( _environment, dy->name, scale->name )->name, ds->name );
232
233 variable_move( _environment,
234 variable_add( _environment, y->name,
235 ds->name
236 )->name,
237 y->name
238 );
239 cpu_jump( _environment, drawCommandLabel );
240
241 // ----------------------------[ LEFT ]
242 cpu_label( _environment, leftDCommandLabel );
243 variable_store( _environment, blank->name, 0 );
244 cpu_label( _environment, leftCommandLabel );
245
246 cpu_store_8bit( _environment, dx->realName, 1 );
247
248 variable_move( _environment, origin_resolution_relative_transform_x( _environment, dx->name, 0 )->name, dx->name );
249 variable_move( _environment, variable_mul( _environment, dx->name, scale->name )->name, ds->name );
250
251 variable_move( _environment,
252 variable_sub( _environment, x->name,
253 ds->name
254 )->name,
255 x->name
256 );
257 cpu_jump( _environment, drawCommandLabel );
258
259 // ----------------------------[ RIGHT ]
260 cpu_label( _environment, rightDCommandLabel );
261 variable_store( _environment, blank->name, 0 );
262 cpu_label( _environment, rightCommandLabel );
263
264 cpu_store_8bit( _environment, dx->realName, 1 );
265
266 variable_move( _environment, origin_resolution_relative_transform_x( _environment, dx->name, 0 )->name, dx->name );
267 variable_move( _environment, variable_mul( _environment, dx->name, scale->name )->name, ds->name );
268
269 variable_move( _environment,
270 variable_add( _environment, x->name,
271 ds->name
272 )->name,
273 x->name
274 );
275 cpu_jump( _environment, drawCommandLabel );
276
277 // ----------------------------[ ANGLE 45, 135, 225, 315 ]
278
279 cpu_label( _environment, angleDCommandLabel );
280 variable_store( _environment, blank->name, 0 );
281 cpu_label( _environment, angleCommandLabel );
282
283 cpu_store_8bit( _environment, dx->realName, 1 );
284 cpu_store_8bit( _environment, dy->realName, 1 );
285
286 variable_move( _environment, origin_resolution_relative_transform_x( _environment, dx->name, 0 )->name, dx->name );
287 variable_move( _environment, variable_mul( _environment, dx->name, scale->name )->name, ds->name );
288
289 cpu_compare_and_branch_8bit( _environment, command->realName, drawFCommandLetter->realName, angle45CommandLabel, 1 );
290
291 cpu_compare_and_branch_8bit( _environment, command->realName, drawGCommandLetter->realName, angle135CommandLabel, 1 );
292
293 cpu_compare_and_branch_8bit( _environment, command->realName, drawECommandLetter->realName, angle225CommandLabel, 1 );
294
295 cpu_compare_and_branch_8bit( _environment, command->realName, drawHCommandLetter->realName, angle315CommandLabel, 1 );
296
297 cpu_label( _environment, angle45CommandLabel );
298 variable_move( _environment,
299 variable_add( _environment, x->name,
300 ds->name
301 )->name,
302 x->name
303 );
304 variable_move( _environment,
305 variable_sub( _environment, y->name,
306 ds->name
307 )->name,
308 y->name
309 );
310 cpu_jump( _environment, drawCommandLabel );
311
312 cpu_label( _environment, angle135CommandLabel );
313 variable_move( _environment,
314 variable_add( _environment, x->name,
315 ds->name
316 )->name,
317 x->name
318 );
319 variable_move( _environment,
320 variable_add( _environment, y->name,
321 ds->name
322 )->name,
323 y->name
324 );
325 cpu_jump( _environment, drawCommandLabel );
326
327 cpu_label( _environment, angle225CommandLabel );
328 variable_move( _environment,
329 variable_sub( _environment, x->name,
330 ds->name
331 )->name,
332 x->name
333 );
334 variable_move( _environment,
335 variable_add( _environment, y->name,
336 ds->name
337 )->name,
338 y->name
339 );
340 cpu_jump( _environment, drawCommandLabel );
341
342 cpu_label( _environment, angle315CommandLabel );
343 variable_move( _environment,
344 variable_sub( _environment, x->name,
345 ds->name
346 )->name,
347 x->name
348 );
349 variable_move( _environment,
350 variable_sub( _environment, y->name,
351 ds->name
352 )->name,
353 y->name
354 );
355 cpu_jump( _environment, drawCommandLabel );
356
357 // ----------------------------[ DRAW (or BLANK) ]
358 cpu_label( _environment, drawCommandLabel );
359
360 // If blank move has been requested, we avoid to draw anything.
361 cpu_compare_and_branch_8bit_const( _environment, blank->realName, 0xff, move5CommandLabel, 1 );
362
363 // Let's draw from the previous position to the current position.
364 draw( _environment,
365 origin_resolution_relative_transform_x( _environment, NULL, 0 )->name,
366 origin_resolution_relative_transform_y( _environment, NULL, 0 )->name,
367 x->name, y->name, color->name, _preserve_color );
368
369 // Update current position (this is done also if nothing is drawn!)
370 cpu_label( _environment, move5CommandLabel );
371 gr_locate( _environment, x->name, y->name );
372
373 // Move to the next character of the drawing commands string.
374 // cpu_inc( _environment, size->realName );
375 // cpu_dec_16bit( _environment, address->realName );
376 cpu_store_16bit( _environment, dx->realName, 0 );
377 cpu_store_16bit( _environment, dy->realName, 0 );
378 cpu_store_16bit( _environment, ds->realName, 0 );
379
380 // Move to the next character of the drawing commands string.
381 cpu_label( _environment, doneCommandLabel );
382
383 end_do_loop( _environment );
384 // ------------------------------------ FETCH AND DECODE LOOP (end)
385
386 cpu_label( _environment, label );
387 cpu_return( _environment );
388
390
391 Variable * string = variable_retrieve( _environment, _string );
392 Variable * c = variable_retrieve_or_define( _environment, _c, VT_COLOR, 0 );
393 Variable * startX = variable_retrieve_or_define( _environment, _x, VT_POSITION, 0 );
394 Variable * startY = variable_retrieve_or_define( _environment, _y, VT_POSITION, 0 );
395
396 if ( ( string->type != VT_STRING ) && ( string->type != VT_DSTRING ) ) {
398 }
399
400 if( string->type == VT_STRING ) {
401 Variable * dstring = variable_temporary( _environment, VT_DSTRING, "(dstring)" );
402 cpu_dsdefine( _environment, string->realName, dstring->realName );
403 string = dstring;
404 }
405
406 Variable * parameter = variable_retrieve( _environment, "drawstring__string" );
407 Variable * colorParameter = variable_retrieve( _environment, "drawstring__color" );
408 Variable * StartXParameter = variable_retrieve( _environment, "drawstring__x" );
409 Variable * StartYParameter = variable_retrieve( _environment, "drawstring__y" );
410
411 variable_move( _environment, string->name, parameter->name );
412 variable_move( _environment, c->name, colorParameter->name );
413 variable_move( _environment, startX->name, StartXParameter->name );
414 variable_move( _environment, startY->name, StartYParameter->name );
415 cpu_call( _environment, "lib_draw_tsb_string");
416
417}
void cpu_store_16bit(Environment *_environment, char *_destination, int _value)
CPU 6309: emit code to store 16 bit
Definition 6309.c:1503
void cpu_dsdefine(Environment *_environment, char *_string, char *_index)
Definition 6309.c:5884
void cpu_label(Environment *_environment, char *_label)
Definition 6309.c:356
void cpu_dec(Environment *_environment, char *_variable)
Definition 6309.c:4630
void cpu_call(Environment *_environment, char *_label)
Definition 6309.c:3755
void cpu_store_8bit(Environment *_environment, char *_destination, int _value)
CPU 6309: emit code to store 8 bit
Definition 6309.c:761
void cpu_jump(Environment *_environment, char *_label)
Definition 6309.c:3739
void cpu_return(Environment *_environment)
Definition 6309.c:4030
void cpu_move_8bit_indirect2(Environment *_environment, char *_value, char *_source)
Definition 6309.c:5294
void cpu_inc_16bit(Environment *_environment, char *_variable)
Definition 6309.c:4565
void cpu_compare_and_branch_8bit(Environment *_environment, char *_source, char *_destination, char *_label, int _positive)
Definition 6309.c:851
void cpu_dsdescriptor(Environment *_environment, char *_index, char *_address, char *_size)
Definition 6309.c:5977
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 * origin_resolution_relative_transform_x(Environment *_environment, char *_x, int _is_relative)
Variable * variable_retrieve_or_define(Environment *_environment, char *_name, VariableType _type, int _value)
Variable * variable_move(Environment *_environment, char *_source, char *_destination)
Store the value of a variable inside another variable by converting it.
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.
Variable * origin_resolution_relative_transform_y(Environment *_environment, char *_y, int _is_relative)
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.
int size
Definition _optimizer.c:678
char * name
Definition _optimizer.c:672
void color(Environment *_environment, int _index, int _shade)
Emit ASM code for instruction COLOR [int], [int].
Definition color.c:59
void begin_do_loop(Environment *_environment)
Emit ASM code for DO ....
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 draw_tsb_string(Environment *_environment, char *_string, char *_x, char *_y, char *_c, int _preserve_color)
void end_do_loop(Environment *_environment)
Emit ASM code for ... LOOP.
Definition end_do_loop.c:49
void gr_locate(Environment *_environment, char *_x, char *_y)
Emit code for GR LOCATE command.
Definition gr.c:89
char * name
Definition ugbc.h:979
VariableType type
Definition ugbc.h:988
char * realName
Definition ugbc.h:982
#define deploy_end(s)
Definition ugbc.h:4365
#define MAX_TEMPORARY_STORAGE
Definition ugbc.h:563
#define CRITICAL_CANNOT_USE_DRAW_WITHOUT_STRING(t)
Definition ugbc.h:3683
struct _Variable Variable
Structure of a single variable.
struct _Environment Environment
Structure of compilation environment.
@ VT_POSITION
Definition ugbc.h:468
@ VT_STRING
Definition ugbc.h:474
@ VT_BYTE
Definition ugbc.h:450
@ VT_ADDRESS
Definition ugbc.h:465
@ VT_COLOR
Definition ugbc.h:471
@ VT_DSTRING
Definition ugbc.h:483
#define deploy_begin(s)
Definition ugbc.h:4356
#define MAKE_LABEL
Definition ugbc.h:3351