ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
sg1000.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#include <math.h>
37
38static RGBi SYSTEM_PALETTE[] = {
39 { 0x00, 0x00, 0x00, 0xff, 0, "BLACK" },
40 { 0x00, 0x00, 0xff, 0xff, 1, "BLUE" },
41 { 0x88, 0x00, 0x00, 0xff, 2, "RED" },
42 { 0xff, 0x00, 0xff, 0xff, 3, "MAGENTA" },
43 { 0x00, 0xcc, 0x00, 0xff, 4, "GREEN" },
44 { 0xaa, 0xff, 0xe6, 0xff, 5, "CYAN" },
45 { 0xee, 0xee, 0x77, 0xff, 6, "YELLOW" },
46 { 0xff, 0xff, 0xff, 0xff, 7, "WHITE" }
47};
48
49/****************************************************************************
50 * CODE SECTION
51 ****************************************************************************/
52
53#ifdef __sg1000__
54
55void sg1000_inkey( Environment * _environment, char * _pressed, char * _key ) {
56
57 cpu_store_8bit( _environment, _pressed, 0 );
58 cpu_store_8bit( _environment, _key, 0 );
59
60}
61
62void sg1000_wait_key_or_fire( Environment * _environment, int _port, int _release ) {
63
64 sg1000_wait_fire( _environment, _port, _release );
65
66}
67
68void sg1000_wait_key_or_fire_semivar( Environment * _environment, char * _port, int _release ) {
69
70 sg1000_wait_fire_semivar( _environment, _port, _release );
71
72}
73
74void sg1000_wait_fire( Environment * _environment, int _port, int _release ) {
75
76 _environment->bitmaskNeeded = 1;
77
78 deploy( joystick, src_hw_sg1000_joystick_asm );
79
80 outline1("LD B, $%2.2X", _release);
81 outline0("CALL WAITFIRE");
82
83}
84
85void sg1000_wait_fire_semivar( Environment * _environment, char * _port, int _release ) {
86
87 _environment->bitmaskNeeded = 1;
88
89 deploy( joystick, src_hw_sg1000_joystick_asm );
90
91 outline1("LD B, $%2.2X", _release);
92 outline0("CALL WAITFIRE");
93
94}
95
96void sg1000_scancode( Environment * _environment, char * _pressed, char * _scancode ) {
97
98 cpu_store_8bit( _environment, _pressed, 0 );
99 cpu_store_8bit( _environment, _scancode, 0 );
100
101}
102
103void sg1000_key_pressed( Environment * _environment, char *_scancode, char * _result ) {
104
106
107 char nokeyLabel[MAX_TEMPORARY_STORAGE];
108 sprintf( nokeyLabel, "%slabel", label );
109
110 Variable * temp = variable_temporary( _environment, VT_BYTE, "(pressed)" );
111
112 sg1000_scancode( _environment, temp->realName, _result );
113 cpu_compare_8bit( _environment, _result, _scancode, temp->realName, 1 );
114 cpu_compare_and_branch_8bit_const( _environment, temp->realName, 0, nokeyLabel, 1 );
115 cpu_store_8bit( _environment, _result, 0xff );
116 cpu_jump( _environment, label );
117 cpu_label( _environment, nokeyLabel );
118 cpu_store_8bit( _environment, _result, 0x00 );
119 cpu_label( _environment, label );
120
121}
122
123
124void sg1000_scanshift( Environment * _environment, char * _shifts ) {
125
126 cpu_store_8bit( _environment, _shifts, 0 );
127
128}
129
130void sg1000_keyshift( Environment * _environment, char * _shifts ) {
131
132 cpu_store_8bit( _environment, _shifts, 0 );
133
134}
135
136void sg1000_clear_key( Environment * _environment ) {
137
138}
139
140
141void sg1000_sys_call( Environment * _environment, int _destination ) {
142
143 outline1("CALL $%4.4x", _destination );
144
145}
146
147void sg1000_timer_set_status_on( Environment * _environment, char * _timer ) {
148
149 deploy( timer, src_hw_z80_timer_asm);
150
151 if ( _timer ) {
152 outline1("LD A, (%s)", _timer );
153 outline0("LD B, A" );
154 } else {
155 outline0("LD B, 0" );
156 }
157 outline0("LD A, 1" );
158 outline0("LD C, A" );
159 outline0("CALL TIMERSETSTATUS" );
160
161}
162
163void sg1000_timer_set_status_off( Environment * _environment, char * _timer ) {
164
165 deploy( timer, src_hw_z80_timer_asm);
166
167 if ( _timer ) {
168 outline1("LD A, (%s)", _timer );
169 outline0("LD B, A" );
170 } else {
171 outline0("LD B, 0" );
172 }
173 outline0("LD A, 0" );
174 outline0("LD C, A" );
175 outline0("CALL TIMERSETSTATUS" );
176
177
178}
179
180void sg1000_timer_set_counter( Environment * _environment, char * _timer, char * _counter ) {
181
182 deploy( timer, src_hw_z80_timer_asm);
183
184 if ( _counter ) {
185 outline1("LD A, (%s)", _counter );
186 outline0("LD IXL, A" );
187 outline1("LD A, (%s)", address_displacement( _environment, _counter, "1" ) );
188 outline0("LD IXH, A" );
189 } else {
190 outline0("LD IX, 0" );
191 }
192 if ( _timer ) {
193 outline1("LD A, (%s)", _timer );
194 outline0("LD B, A" );
195 } else {
196 outline0("LD B, 0" );
197 }
198 outline0("CALL TIMERSETCOUNTER" );
199
200}
201
202void sg1000_timer_set_init( Environment * _environment, char * _timer, char * _init ) {
203
204 deploy( timer, src_hw_z80_timer_asm);
205
206 if ( _init ) {
207 outline1("LD A, (%s)", _init );
208 outline0("LD IXL, A" );
209 outline1("LD A, (%s)", address_displacement( _environment, _init, "1" ) );
210 outline0("LD IXH, A" );
211 } else {
212 outline0("LD IX, 0" );
213 }
214 if ( _timer ) {
215 outline1("LD A, (%s)", _timer );
216 outline0("LD B, A" );
217 } else {
218 outline0("LD B, 0" );
219 }
220 outline0("CALL TIMERSETINIT" );
221
222}
223
224void sg1000_timer_set_address( Environment * _environment, char * _timer, char * _address ) {
225
226 deploy( timer, src_hw_z80_timer_asm);
227
228 if ( _address ) {
229 outline1("LD HL, %s", _address );
230 outline0("LD A, L" );
231 outline0("LD IXL, A" );
232 outline0("LD A, H" );
233 outline0("LD IXH, A" );
234 } else {
235 outline0("LD IX, 0" );
236 }
237 if ( _timer ) {
238 outline1("LD A, (%s)", _timer );
239 outline0("LD B, A" );
240 } else {
241 outline0("LD B, 0" );
242 }
243 outline0("CALL TIMERSETADDRESS" );
244
245}
246
247void sg1000_put_key( Environment * _environment, char *_string, char * _size ) {
248
249}
250
251#endif
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_label(Environment *_environment, char *_label)
Definition 6309.c:356
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_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_temporary(Environment *_environment, VariableType _type, char *_meaning)
Define a temporary variable.
char * address_displacement(Environment *_environment, char *_address, char *_displacement)
void sg1000_scanshift(Environment *_environment, char *_shifts)
Definition sg1000.c:124
void sg1000_scancode(Environment *_environment, char *_pressed, char *_scancode)
Definition sg1000.c:96
void sg1000_wait_key_or_fire_semivar(Environment *_environment, char *_port, int _release)
Definition sg1000.c:68
void sg1000_inkey(Environment *_environment, char *_pressed, char *_key)
Definition sg1000.c:55
void sg1000_sys_call(Environment *_environment, int _destination)
Definition sg1000.c:141
void sg1000_keyshift(Environment *_environment, char *_shifts)
Definition sg1000.c:130
void sg1000_clear_key(Environment *_environment)
Definition sg1000.c:136
void sg1000_put_key(Environment *_environment, char *_string, char *_size)
Definition sg1000.c:247
void sg1000_wait_fire_semivar(Environment *_environment, char *_port, int _release)
Definition sg1000.c:85
void sg1000_timer_set_counter(Environment *_environment, char *_timer, char *_counter)
Definition sg1000.c:180
void sg1000_key_pressed(Environment *_environment, char *_scancode, char *_result)
Definition sg1000.c:103
void sg1000_timer_set_status_on(Environment *_environment, char *_timer)
Definition sg1000.c:147
void sg1000_timer_set_init(Environment *_environment, char *_timer, char *_init)
Definition sg1000.c:202
void sg1000_wait_key_or_fire(Environment *_environment, int _port, int _release)
Definition sg1000.c:62
void sg1000_timer_set_address(Environment *_environment, char *_timer, char *_address)
Definition sg1000.c:224
void sg1000_timer_set_status_off(Environment *_environment, char *_timer)
Definition sg1000.c:163
void sg1000_wait_fire(Environment *_environment, int _port, int _release)
Definition sg1000.c:74
int bitmaskNeeded
Definition ugbc.h:2659
char * realName
Definition ugbc.h:982
struct _RGBi RGBi
Structure to store color components (red, green and blue).
#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
#define outline0(s)
Definition ugbc.h:4252
#define outline1(s, a)
Definition ugbc.h:4253
#define deploy(s, e)
Definition ugbc.h:4288
#define MAKE_LABEL
Definition ugbc.h:3351