ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
key_state.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
46/* <usermanual>
47@keyword KEY STATE
48
49@english
50
51The ''KEY STATE'' command allows you to know the pressing state of a
52single specific key. The reading is immediate: therefore, it is
53possible to detect the pressing of even more than one key at a time
54and, if the user is too fast or the program is too slow, there is
55the possibility that the pressing of the key is not detected.
56
57The parameter of this function is the so-called "keycode". Each
58key on the target computer's keyboard is encoded by a value, which
59is specific to the hardware being considered. It should not be
60confused with the ASCII code, which is a representation shared between
61the various targets.
62
63All the keys on the keyboard have been encoded by a specific
64constant, which is part of the dictionary of this language.
65
66@italian
67
68Il comando ''KEY STATE'' consente di conoscere lo stato di pressione di
69un singolo tasto specifico. La lettura è immediata: è quindi possibile
70rilevare la pressione anche di più tasti contemporaneamente e, se l'utente
71è troppo veloce o il programma è troppo lento, c'è la possibilità che la
72pressione del tasto non venga rilevata.
73
74Il parametro di questa funzione è il cosiddetto "keycode". Ogni tasto
75sulla tastiera del computer di destinazione è codificato da un valore,
76che è specifico per l'hardware in questione. Non deve essere confuso
77con il codice ASCII, che è una rappresentazione condivisa tra i vari target.
78
79Tutti i tasti della tastiera sono stati codificati da una costante
80specifica, che fa parte del dizionario di questo linguaggio.
81
82@syntax = KEY STATE(keycode)
83
84@example IF KEY STATE(KEY A) THEN
85@example PRINT "A has been pressed!"
86@example ENDIF
87
88@alias KEYSTATE
89
90</usermanual> */
91
92/* <usermanual>
93@keyword KEYSTATE
94
95@english
96
97@italian
98
99@syntax = KEY STATE(keycode)
100
101@alias KEY STATE
102
103</usermanual> */
104
105Variable * key_state( Environment * _environment, int _scancode ) {
106
107 Variable * result = variable_temporary( _environment, VT_SBYTE, "(result of KEY PRESSED)");
108
109 char value[MAX_TEMPORARY_STORAGE]; sprintf( value, "#$%2.2x", _scancode );
110
111 cia_key_state( _environment, value, result->realName );
112
113 return result;
114
115}
116
117Variable * key_state_var( Environment * _environment, char * _scancode ) {
118
119 Variable * scancode = variable_retrieve_or_define( _environment, _scancode, VT_BYTE, 0);
120 Variable * result = variable_temporary( _environment, VT_SBYTE, "(result of KEY STATE)");
121
122 cia_key_state( _environment, scancode->realName, result->realName );
123
124 return result;
125
126}
127
128#endif
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.
Variable * key_state_var(Environment *_environment, char *_scancode)
Definition key_state.c:56
Variable * key_state(Environment *_environment, int _scancode)
Definition key_state.c:43
Variable * scancode(Environment *_environment)
Definition scancode.c:43
void cia_key_state(Environment *_environment, char *_scancode, char *_result)
Definition cia.c:140
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_SBYTE
Definition ugbc.h:452
char DATATYPE_AS_STRING[][16]