ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
gprint.c
Go to the documentation of this file.
1/*****************************************************************************
2 * ugBASIC - an isomorphic BASIC language compiler for retrocomputers *
3 *****************************************************************************
4 * Copyright 2021-2025 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
41extern char DATATYPE_AS_STRING[][16];
42
48/* <usermanual>
49@keyword GPRINT
50
51@english
52
53The ''GPRINT'' (''G''raphic ''PRINT'') statement is used to print a text
54string, in graphical mode, at a specific position on the screen, with the
55option to specify the font to use.
56
57Unlike the traditional ''PRINT'' statement, which prints text in the
58console's character grid, ''GPRINT'' is designed to work in graphical
59mode. It prints text pixel by pixel, treating it as a graphic element.
60
61The text is positioned precisely at the pixel level, making it ideal
62for games, custom interfaces, and designs that require precise control
63over position. The ''x'' and ''y'' coordinates typically refer to the
64upper-left corner of the first letter of the text.
65
66Using the ''WITH font'' argument allows you to dynamically select
67different character sets or fonts that have been previously loaded
68into the program or are available internally, using the ''LOAD ATLAS'' statement.
69
70@italian
71
72L'istruzione ''GPRINT'' (''G''raphic ''PRINT'') è utilizzata stampare una
73stringa di testo, in modalità grafica, in una posizione specifica sullo
74schermo, con la possibilità di specificare il font da utilizzare.
75
76A differenza della tradizionale istruzione ''PRINT'', che stampa testo
77nella griglia di caratteri della console, ''GPRINT'' è progettata per
78funzionare in modalità grafica. Stampa quindi il testo pixel per pixel,
79trattandolo come un elemento grafico.
80
81Il testo viene posizionato in modo preciso a livello di pixel, il che
82lo rende ideale per giochi, interfacce personalizzate e disegni che
83richiedono un controllo esatto della posizione. Le coordinate ''x'' e
84''y'' si riferiscono tipicamente all'angolo in alto a sinistra della
85prima lettera del testo.
86
87L'utilizzo dell'argomento ''WITH font'' permette di selezionare
88dinamicamente diversi set di caratteri o font che sono stati
89precedentemente caricati nel programma o sono disponibili internamente,
90con l'istruzione ''LOAD ATLAS''.
91
92@syntax GPRINT text [AT x,y] WITH font
93
94@example myFont := LOAD ATLAS("font.png") FRAME SIZE(4,8)
95@example GPRINT "HELLO WORLD!" WITH myFont
96
97@target all
98@verified
99</usermanual> */
100void gprint( Environment * _environment, char * _atlas, char * _text, char * _x, char * _y ) {
101
102 if ( _environment->gprintInline ) {
103
105
106 char doneLabel[MAX_TEMPORARY_STORAGE];
107 sprintf( doneLabel, "%sdone", label );
108
109 // PROCEDURE print[ text AS STRING, x AS BYTE, y AS BYTE ]
110 // SHARED letters
111 // len = LEN(text)
112
113 Variable * atlas = variable_retrieve( _environment, _atlas );
114 Variable * atlasFrameWidth = NULL;
115 if ( atlas->type == VT_IMAGEREF ) {
116 atlasFrameWidth = variable_temporary( _environment, VT_BYTE, "(frame width)");
117 cpu_move_8bit( _environment, address_displacement( _environment, atlas->realName, "12" ), atlasFrameWidth->realName );
118 }
119 Variable * text = variable_retrieve( _environment, _text );
120 Variable * address = variable_temporary( _environment, VT_ADDRESS, "(text address)" );
121 Variable * size = variable_temporary( _environment, VT_BYTE, "(text size)" );
122 Variable * letter = variable_temporary( _environment, VT_BYTE, "(text size)" );
123
124 switch( text->type ) {
125 case VT_STRING:
126 cpu_move_8bit( _environment, text->realName, size->realName );
127 cpu_addressof_16bit( _environment, text->realName, address->realName );
128 cpu_inc_16bit( _environment, address->realName );
129 break;
130 case VT_DSTRING:
131 cpu_dsdescriptor( _environment, text->realName, address->realName, size->realName );
132 break;
133 case VT_CHAR:
134 cpu_addressof_16bit( _environment, text->realName, address->realName );
135 cpu_store_8bit( _environment, size->realName, 1 );
136 break;
137 default:
139 }
140
141 Variable * x = variable_retrieve_or_define( _environment, _x, VT_POSITION, 0 );
142 Variable * dx = variable_temporary( _environment, VT_POSITION, "(dx)" );
143 Variable * y = variable_retrieve_or_define( _environment, _y, VT_POSITION, 0 );
144
145 cpu_compare_and_branch_8bit_const( _environment, size->realName, 0, doneLabel, 1 );
146
147 variable_move( _environment, x->name, dx->name );
148
149 // i = 0: DO
150
151 Variable * i = variable_temporary( _environment, VT_BYTE, "(i)");
152 cpu_store_8bit( _environment, i->realName, 0 );
153
154 cpu_label( _environment, label );
155
156 // PUT IMAGE letters FRAME ASC(MID$(text,i))-64 AT x+i*4,y
157
158 cpu_move_8bit_indirect2( _environment, address->realName, letter->realName );
159
160 put_image( _environment, _atlas, dx->name, y->name, NULL, NULL, letter->name, NULL, FLAG_WITH_PALETTE );
161
162 if ( atlas->type == VT_IMAGEREF ) {
163 variable_add_inplace_vars( _environment, dx->name, atlasFrameWidth->name );
164 } else {
165 variable_add_inplace( _environment, dx->name, atlas->frameWidth );
166 }
167
168 cpu_inc_16bit( _environment, address->realName );
169
170 // INC i
171
172 cpu_inc( _environment, i->realName );
173
174 // LOOP UNTIL i = len
175
176 cpu_compare_and_branch_8bit( _environment, i->realName, size->realName, label, 0 );
177
178 cpu_label( _environment, doneLabel );
179
180 // END PROCEDURE
181
182 } else {
183
185
186 variable_global( _environment, "gprint_atlas" );
187 Variable * paramAtlas = variable_define( _environment, "gprint_atlas", VT_IMAGEREF, 0 );
188 variable_global( _environment, "gprint_address" );
189 Variable * paramAddress = variable_define( _environment, "gprint_address", VT_ADDRESS, 0 );
190 variable_global( _environment, "gprint_size" );
191 Variable * paramSize = variable_define( _environment, "gprint_size", VT_BYTE, 0 );
192 variable_global( _environment, "gprint_frame_width" );
193 Variable * paramFrameWidth = variable_define( _environment, "gprint_frame_width", VT_BYTE, 0 );
194 variable_global( _environment, "gprint_x" );
195 Variable * paramX = variable_define( _environment, "gprint_x", VT_POSITION, 0 );
196 variable_global( _environment, "gprint_y" );
197 Variable * paramY = variable_define( _environment, "gprint_y", VT_POSITION, 0 );
198
200
201 char doneLabel[MAX_TEMPORARY_STORAGE];
202 sprintf( doneLabel, "%sdone", label );
203
204 // PROCEDURE print[ text AS STRING, x AS BYTE, y AS BYTE ]
205 // SHARED letters
206 // len = LEN(text)
207
208 Variable * letter = variable_temporary( _environment, VT_BYTE, "(text size)" );
209
210 Variable * x = variable_retrieve( _environment, paramX->name );
211 Variable * dx = variable_temporary( _environment, VT_POSITION, "(dx)" );
212 Variable * y = variable_retrieve( _environment, paramY->name );
213
214 cpu_compare_and_branch_8bit_const( _environment, paramSize->realName, 0, doneLabel, 1 );
215
216 variable_move( _environment, x->name, dx->name );
217
218 // i = 0: DO
219
220 Variable * i = variable_temporary( _environment, VT_BYTE, "(i)");
221 cpu_store_8bit( _environment, i->realName, 0 );
222
223 cpu_label( _environment, label );
224
225 // PUT IMAGE letters FRAME ASC(MID$(text,i))-64 AT x+i*4,y
226
227 cpu_move_8bit_indirect2( _environment, paramAddress->realName, letter->realName );
228
229 put_image( _environment, paramAtlas->name, dx->name, y->name, NULL, NULL, letter->name, NULL, FLAG_WITH_PALETTE );
230
231 outline0(";variable_add_inplace_vars");
232 variable_add_inplace_vars( _environment, dx->name, paramFrameWidth->name );
233 outline0(";variable_add_inplace_vars");
234
235 cpu_inc_16bit( _environment, paramAddress->realName );
236
237 // INC i
238
239 cpu_inc( _environment, i->realName );
240
241 // LOOP UNTIL i = len
242
243 cpu_compare_and_branch_8bit( _environment, i->realName, paramSize->realName, label, 0 );
244
245 cpu_label( _environment, doneLabel );
246
247 cpu_return( _environment );
248
249 // END PROCEDURE
250
252
253 Variable * atlas = variable_retrieve( _environment, _atlas );
254
255 if ( atlas->type == VT_IMAGEREF ) {
256 variable_move( _environment, atlas->name, paramAtlas->name );
257 } else {
258 variable_move( _environment, image_ref( _environment, atlas->name )->name, paramAtlas->name );
259 }
260
261 Variable * text = variable_retrieve( _environment, _text );
262 switch( text->type ) {
263 case VT_STRING:
264 cpu_move_8bit( _environment, text->realName, paramSize->realName );
265 cpu_addressof_16bit( _environment, text->realName, paramAddress->realName );
266 cpu_inc_16bit( _environment, paramAddress->realName );
267 break;
268 case VT_DSTRING:
269 cpu_dsdescriptor( _environment, text->realName, paramAddress->realName, paramSize->realName );
270 break;
271 case VT_CHAR:
272 cpu_addressof_16bit( _environment, text->realName, paramAddress->realName );
273 cpu_store_8bit( _environment, paramSize->realName, 1 );
274 break;
275 default:
277 }
278
279 if ( atlas->type == VT_IMAGEREF ) {
280 cpu_move_8bit( _environment, address_displacement( _environment, atlas->realName, "12" ), paramFrameWidth->realName );
281 } else {
282 variable_store( _environment, paramFrameWidth->name, atlas->frameWidth );
283 }
284
285 Variable * x = variable_retrieve( _environment, _x );
286 Variable * y = variable_retrieve( _environment, _y );
287
288 variable_move( _environment, x->name, paramX->name );
289 variable_move( _environment, y->name, paramY->name );
290
291 cpu_call( _environment, "lib_gprint" );
292
293 }
294
295}
296
void cpu_addressof_16bit(Environment *_environment, char *_source, char *_destination)
Definition 6309.c:1485
void cpu_inc(Environment *_environment, char *_variable)
Definition 6309.c:4555
void cpu_label(Environment *_environment, char *_label)
Definition 6309.c:356
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_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_move_8bit(Environment *_environment, char *_source, char *_destination)
CPU 6309: emit code to move 8 bit
Definition 6309.c:743
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_retrieve(Environment *_environment, char *_name)
void variable_add_inplace(Environment *_environment, char *_source, int _destination)
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.
void variable_global(Environment *_environment, char *_pattern)
Variable * variable_define(Environment *_environment, char *_name, VariableType _type, int _value)
Define a variable for the program.
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_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.
char * address_displacement(Environment *_environment, char *_address, char *_displacement)
int size
Definition _optimizer.c:678
Variable * image_ref(Environment *_environment, char *_image)
Definition image_ref.c:43
void put_image(Environment *_environment, char *_image, char *_x1, char *_y1, char *_x2, char *_y2, char *_frame, char *_sequence, int _flags)
Emit ASM code for PUT IMAGE [image] AT [int],[int].
Definition put_image.c:53
void gprint(Environment *_environment, char *_atlas, char *_text, char *_x, char *_y)
Emit code for GPRINT... instruction.
Definition gprint.c:100
int gprintInline
Definition ugbc.h:3292
char * name
Definition ugbc.h:979
VariableType type
Definition ugbc.h:988
int frameWidth
Definition ugbc.h:1162
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.
#define CRITICAL_PRINT_UNSUPPORTED(v, t)
Definition ugbc.h:3487
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_IMAGEREF
Definition ugbc.h:537
@ VT_CHAR
Definition ugbc.h:498
@ VT_ADDRESS
Definition ugbc.h:465
@ VT_DSTRING
Definition ugbc.h:483
#define outline0(s)
Definition ugbc.h:4252
#define FLAG_WITH_PALETTE
Definition ugbc.h:4571
#define deploy_begin(s)
Definition ugbc.h:4356
#define MAKE_LABEL
Definition ugbc.h:3351
char DATATYPE_AS_STRING[][16]