ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
input_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
41#if defined(__c128__) || defined(__c64__) || defined(__c64reu__)
42
43extern char DATATYPE_AS_STRING[][16];
44
45/* <usermanual>
46@keyword INPUT (function)
47
48@english
49
50The INPUT$ function reads a string of characters specified on the
51keyboard and stores them in a variable. Unlike ''INPUT'', which pauses
52and waits until the user presses wnter, ''INPUT$'' reads a fixed
53''number'' of characters without prompting for an enter.
54
55It is used to read barcodes, serial numbers, or other fixed
56character sequences, and to create simpler and more direct
57user interfaces, avoiding the need to press enter after each
58character.
59
60''INPUT$'' always reads the specified ''number'' of characters,
61even if the user types fewer than that. It does not perform any
62checks on the validity of the characters entered.
63
64@italian
65
66La funzione ''INPUT$'' legge una stringa di caratteri specificati
67sulla tastiera e li memorizza in una variabile. ''INPUT'', che si
68ferma e attende che l'utente prema wnter, ''INPUT$'' legge un
69''number'' fisso di caratteri senza richiedere un invio.
70
71Viene utilizzata per leggere codici a barre, numeri di serie
72o altre sequenze di caratteri fisse e per creare interfacce
73utente più semplici e dirette, evitando la necessità di premere
74invio dopo ogni carattere.
75
76''INPUT$'' legge sempre il ''number'' di caratteri specificato,
77anche se l'utente ne digita meno. Non esegue alcun controllo
78sulla validità dei caratteri immessi.
79
80@syntax = INPUT$(number)
81
82@example IF INPUT$(3) = "123" THEN
83@example PRINT "123 has been pressed!"
84@example ENDIF
85
86@seeAlso INPUT (instruction)
87
88</usermanual> */
89
90Variable * input_string( Environment * _environment, char * _size ) {
91
93
94 char repeatLabel[MAX_TEMPORARY_STORAGE]; sprintf(repeatLabel, "%srepeat", label );
95
96 Variable * result = variable_temporary( _environment, VT_DSTRING, "(result of INPUT$)");
97 Variable * offset = variable_temporary( _environment, VT_BYTE, "(offset inside INPUT$)");
98 Variable * address = variable_temporary( _environment, VT_ADDRESS, "(address of result of INPUT$)");
99 Variable * size = variable_retrieve_or_define( _environment, _size, VT_BYTE, 0 );
100 Variable * pressed = variable_temporary( _environment, VT_BYTE, "(key pressed?)");
101 Variable * key = variable_temporary( _environment, VT_CHAR, "(key pressed)");
102
103 cpu_dsfree( _environment, result->realName );
104 cpu_dsalloc( _environment, size->realName, result->realName );
105 cpu_dsdescriptor( _environment, result->realName, address->realName, pressed->realName );
106
107 cpu_store_8bit( _environment, offset->realName, 0 );
108
109 cpu_label( _environment, repeatLabel );
110
111 cia_inkey( _environment, key->realName );
112
113 cpu_bveq( _environment, key->realName, repeatLabel );
114
115 cpu_move_8bit_indirect_with_offset2( _environment, key->realName, address->realName, offset->realName );
116
117 cpu_inc( _environment, offset->realName );
118
119 cpu_compare_8bit( _environment, offset->realName, size->realName, pressed->realName, 1 );
120
121 cpu_bveq( _environment, pressed->realName, repeatLabel );
122
123 return result;
124
125}
126
127#endif
void cpu_dsfree(Environment *_environment, char *_index)
Definition 6309.c:5917
void cpu_bveq(Environment *_environment, char *_value, char *_label)
Definition 6309.c:334
void cpu_compare_8bit(Environment *_environment, char *_source, char *_destination, char *_other, int _positive)
CPU 6309: emit code to compare two 8 bit values
Definition 6309.c:811
void cpu_inc(Environment *_environment, char *_variable)
Definition 6309.c:4555
void cpu_move_8bit_indirect_with_offset2(Environment *_environment, char *_source, char *_value, char *_offset)
Definition 6309.c:5262
void cpu_label(Environment *_environment, char *_label)
Definition 6309.c:356
void cpu_dsalloc(Environment *_environment, char *_size, char *_index)
Definition 6309.c:5895
void cpu_store_8bit(Environment *_environment, char *_destination, int _value)
CPU 6309: emit code to store 8 bit
Definition 6309.c:761
void cpu_dsdescriptor(Environment *_environment, char *_index, char *_address, char *_size)
Definition 6309.c:5977
Variable * variable_retrieve_or_define(Environment *_environment, char *_name, VariableType _type, int _value)
Variable * variable_temporary(Environment *_environment, VariableType _type, char *_meaning)
Define a temporary variable.
int size
Definition _optimizer.c:678
int offset
Definition _optimizer.c:681
Variable * input_string(Environment *_environment, char *_size)
void cia_inkey(Environment *_environment, char *_key)
Definition cia.c:115
char * realName
Definition ugbc.h:982
#define MAX_TEMPORARY_STORAGE
Definition ugbc.h:563
struct _Variable Variable
Structure of a single variable.
struct _Environment Environment
Structure of compilation environment.
@ VT_BYTE
Definition ugbc.h:450
@ VT_CHAR
Definition ugbc.h:498
@ VT_ADDRESS
Definition ugbc.h:465
@ VT_DSTRING
Definition ugbc.h:483
#define MAKE_LABEL
Definition ugbc.h:3351
char DATATYPE_AS_STRING[][16]