ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
key_pressed.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 KEY PRESSED
47
48@english
49
50The ''KEY PRESSED'' command allows you to know the pressing state of a
51single specific key, during the "duty cycle" of the keyboard driver.
52The reading is deferred: therefore, it is
53possible to detect the pressing of just one key at a time but there is
54no possibility that the pressing of the key is not detected.
55
56The parameter of this function is the so-called "keycode". Each
57key on the target computer's keyboard is encoded by a value, which
58is specific to the hardware being considered. It should not be
59confused with the ASCII code, which is a representation shared between
60the various targets.
61
62All the keys on the keyboard have been encoded by a specific
63constant, which is part of the dictionary of this language.
64
65@italian
66
67Il comando ''KEY PRESSED'' consente di conoscere lo stato di
68pressione di un singolo tasto specifico, durante il "duty cycle"
69del driver della tastiera. La lettura è differita: quindi, è
70possibile rilevare la pressione di un solo tasto alla volta
71ma non c'è possibilità che la pressione del tasto non venga rilevata.
72
73Il parametro di questa funzione è il cosiddetto "keycode". Ogni
74tasto sulla tastiera del computer di destinazione è codificato
75da un valore, che è specifico dell'hardware in questione. Non deve
76essere confuso con il codice ASCII, che è una rappresentazione
77condivisa 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 PRESSED(keycode)
83
84@example IF KEY PRESSED(KEY A) THEN
85@example PRINT "A has been pressed!"
86@example ENDIF
87
88</usermanual> */
89
90Variable * key_pressed( Environment * _environment, int _scancode ) {
91
92 Variable * result = variable_temporary( _environment, VT_SBYTE, "(result of KEY PRESSED)");
93
94 char value[MAX_TEMPORARY_STORAGE]; sprintf( value, "#$%2.2x", _scancode );
95
96 cia_key_pressed( _environment, value, result->realName );
97
98 return result;
99
100}
101
102Variable * key_pressed_var( Environment * _environment, char * _scancode ) {
103
104 Variable * result = variable_temporary( _environment, VT_SBYTE, "(result of KEY PRESSED)");
105 Variable * scancode = variable_retrieve_or_define( _environment, _scancode, VT_BYTE, 0xff);
106
107 cia_key_pressed( _environment, scancode->realName, result->realName );
108
109 return result;
110
111}
112
113#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_pressed_var(Environment *_environment, char *_scancode)
Definition key_pressed.c:55
Variable * key_pressed(Environment *_environment, int _scancode)
Definition key_pressed.c:43
Variable * scancode(Environment *_environment)
Definition scancode.c:43
void cia_key_pressed(Environment *_environment, char *_scancode, char *_result)
Definition cia.c:177
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]