ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
c16.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#ifdef __c16__
36
37#include "../ugbc.h"
38
39/****************************************************************************
40 * CODE SECTION
41 ****************************************************************************/
42
43void c16_xpen( Environment * _environment, char * _destination ) {
44
45}
46
47void c16_ypen( Environment * _environment, char * _destination ) {
48
50
51}
52
53void c16_wait_key_or_fire( Environment * _environment, int _port, int _release ) {
54
55 _environment->bitmaskNeeded = 1;
56
57 deploy( joystick, src_hw_c16_joystick_asm );
58 deploy( keyboard, src_hw_c16_keyboard_asm );
59 deploy( wait_key_or_fire, src_hw_c16_wait_key_or_fire_asm );
60
61 if ( _port == -1 ) {
62 outline0("JSR WAITKEYFIRE");
63 } else {
64 outline1("LDA #$%2.2x", _port );
65 outline0("JSR WAITKEYFIREA");
66 }
67
68}
69
70void c16_wait_key_or_fire_semivar( Environment * _environment, char * _port, int _release ) {
71
72 _environment->bitmaskNeeded = 1;
73
74 deploy( joystick, src_hw_c16_joystick_asm );
75 deploy( keyboard, src_hw_c16_keyboard_asm );
76 deploy( wait_key_or_fire, src_hw_c16_wait_key_or_fire_asm );
77
78 if ( !_port ) {
79 outline0("JSR WAITKEYFIRE");
80 } else {
81 outline1("LDA %s", _port );
82 outline0("JSR WAITKEYFIREA");
83 }
84
85}
86
87void c16_wait_fire( Environment * _environment, int _port, int _release ) {
88
89 _environment->bitmaskNeeded = 1;
90
91 deploy( joystick, src_hw_c16_joystick_asm );
92
93 outline1("LDY #$%2.2x", _release );
94
95 switch( _port ) {
96 case -1:
97 outline0("JSR WAITFIRE");
98 break;
99 case 0:
100 outline0("JSR WAITFIRE0");
101 break;
102 case 1:
103 outline0("JSR WAITFIRE1");
104 break;
105 }
106
107}
108
109void c16_wait_fire_semivar( Environment * _environment, char * _port, int _release ) {
110
111 _environment->bitmaskNeeded = 1;
112
113 deploy( joystick, src_hw_c16_joystick_asm );
114
115 outline1("LDY #$%2.2x", _release );
116
117 if ( ! _port ) {
118 outline0("JSR WAITFIRE");
119 } else {
120 outline1("LDX %s", _port );
121 outline0("JSR WAITFIREA");
122 }
123
124}
125
126void c16_inkey( Environment * _environment, char * _key ) {
127
128 _environment->bitmaskNeeded = 1;
129
130 deploy( keyboard, src_hw_c16_keyboard_asm);
131
132 outline0("JSR INKEY");
133 outline1("STA %s", _key);
134
135}
136
137void c16_wait_key( Environment * _environment, int _release ) {
138
139 _environment->bitmaskNeeded = 1;
140
141 deploy( keyboard, src_hw_c16_keyboard_asm );
142
143 if ( _release ) {
144 outline0("JSR WAITKEYRELEASE");
145 } else {
146 outline0("JSR WAITKEY");
147 }
148
149}
150
151void c16_key_state( Environment * _environment, char *_scancode, char * _result ) {
152
153 _environment->bitmaskNeeded = 1;
154
156
157 deploy( keyboard, src_hw_c16_keyboard_asm );
158
159 outline1("LDX %s", _scancode);
160 outline0("JSR KEYSTATE");
161 cpu_ctoa( _environment );
162 outline1("STA %s", _result);
163
164}
165
166void c16_scancode( Environment * _environment, char * _result ) {
167
168 _environment->bitmaskNeeded = 1;
169
170 deploy( keyboard, src_hw_c16_keyboard_asm);
171
172 outline0("JSR SCANCODE");
173 outline1("STA %s", _result );
174
175}
176
177void c16_asciicode( Environment * _environment, char * _result ) {
178
179 _environment->bitmaskNeeded = 1;
180
181 deploy( keyboard, src_hw_c16_keyboard_asm);
182
183 outline0("JSR ASCIICODE");
184 outline1("STA %s", _result );
185
186}
187
188void c16_key_pressed( Environment * _environment, char *_scancode, char * _result ) {
189
190 _environment->bitmaskNeeded = 1;
191
193
194 deploy( keyboard, src_hw_c16_keyboard_asm );
195
196 outline1("LDX %s", _scancode);
197 outline0("JSR KEYPRESSED");
198 cpu_ctoa( _environment );
199 outline1("STA %s", _result);
200
201}
202
203void c16_scanshift( Environment * _environment, char * _shifts ) {
204
206
207 outline0("LDA #0");
208 outline1("STA %s", _shifts);
209 outline0("LDA #$10");
210 outline0("STA $DC00");
211 outline0("LDA $DC01");
212 outline0("AND #$80");
213 outline1("BNE %snoleft", label);
214 outline0("LDA #1");
215 outline1("STA %s", _shifts);
216 outhead1("%snoleft:", label );
217
218 outline0("LDA #$20");
219 outline0("STA $DC00");
220 outline0("LDA $DC01");
221 outline0("AND #$10");
222 outline1("BNE %snoright", label);
223 outline1("LDA %s", _shifts);
224 outline0("ORA #2");
225 outline1("STA %s", _shifts);
226 outhead1("%snoright:", label );
227
228}
229
230void c16_keyshift( Environment * _environment, char * _shifts ) {
231
232 _environment->bitmaskNeeded = 1;
233
234 deploy( keyboard, src_hw_c16_keyboard_asm );
235
236 outline0("JSR KEYSHIFT" );
237 outline1("STA %s", _shifts );
238
239}
240
241void c16_clear_key( Environment * _environment ) {
242
243 _environment->bitmaskNeeded = 1;
244
245 deploy( keyboard, src_hw_c16_keyboard_asm );
246
247 outline0("JSR CLEARKEY");
248
249}
250
251void c16_put_key( Environment * _environment, char *_string, char * _size ) {
252
253 _environment->bitmaskNeeded = 1;
254
255 outline1("LDA %s", _string );
256 outline0("STA TMPPTR" );
257 outline1("LDA %s", address_displacement( _environment, _string, "1" ) );
258 outline0("STA TMPPTR+1" );
259 outline1("LDX %s", _size );
260 outline0("JSR PUTKEY" );
261
262}
263
264void c16_sys_call( Environment * _environment, int _destination ) {
265
266 _environment->sysCallUsed = 1;
267
268 outline0("PHA");
269 outline1("LDA #$%2.2x", (_destination & 0xff ) );
270 outline0("STA SYSCALL0+1");
271 outline1("LDA #$%2.2x", ((_destination>>8) & 0xff ) );
272 outline0("STA SYSCALL0+2");
273 outline0("PLA");
274 outline0("JSR SYSCALL");
275
276}
277
278void c16_timer_set_status_on( Environment * _environment, char * _timer ) {
279
281
282 if ( _timer ) {
283 outline1("LDX %s", _timer );
284 } else {
285 outline0("LDX #0" );
286 }
287 outline0("LDY #$1" );
288 outline0("JSR TIMERSETSTATUS" );
289
290}
291
292void c16_timer_set_status_off( Environment * _environment, char * _timer ) {
293
295
296 if ( _timer ) {
297 outline1("LDX %s", _timer );
298 } else {
299 outline0("LDX #0" );
300 }
301 outline0("LDY #$0" );
302 outline0("JSR TIMERSETSTATUS" );
303
304}
305
306void c16_timer_set_counter( Environment * _environment, char * _timer, char * _counter ) {
307
309
310 if ( _timer ) {
311 outline1("LDX %s", _timer );
312 } else {
313 outline0("LDX #0" );
314 }
315 if ( _counter ) {
316 outline1("LDA %s", _counter );
317 } else {
318 outline0("LDA #0" );
319 }
320 outline0("STA MATHPTR2");
321 if ( _counter ) {
322 outline1("LDA %s", address_displacement( _environment, _counter, "1" ) );
323 }
324 outline0("STA MATHPTR3");
325 outline0("JSR TIMERSETCOUNTER" );
326
327}
328
329void c16_timer_set_init( Environment * _environment, char * _timer, char * _init ) {
330
332
333 if ( _timer ) {
334 outline1("LDX %s", _timer );
335 } else {
336 outline0("LDX #0" );
337 }
338 outline1("LDA %s", _init );
339 outline0("STA MATHPTR2");
340 outline1("LDA %s", address_displacement( _environment, _init, "1" ) );
341 outline0("STA MATHPTR3");
342 outline0("JSR TIMERSETINIT" );
343
344}
345
346void c16_timer_set_address( Environment * _environment, char * _timer, char * _address ) {
347
349
350 if ( _timer ) {
351 outline1("LDX %s", _timer );
352 } else {
353 outline0("LDX #0" );
354 }
355 outline1("LDA #<%s", _address );
356 outline0("STA MATHPTR2");
357 outline1("LDA #>%s", _address );
358 outline0("STA MATHPTR3");
359 outline0("JSR TIMERSETADDRESS" );
360
361}
362
363#endif
void cpu_ctoa(Environment *_environment)
Definition 6309.c:279
unsigned char src_hw_6502_timer_asm[]
Definition 6502_timer.c:1
char * address_displacement(Environment *_environment, char *_address, char *_displacement)
void wait_key_or_fire(Environment *_environment, int _port, int _release)
void c16_wait_fire_semivar(Environment *_environment, char *_port, int _release)
Definition c16.c:109
void c16_ypen(Environment *_environment, char *_destination)
Definition c16.c:47
void c16_xpen(Environment *_environment, char *_destination)
Definition c16.c:43
void c16_wait_fire(Environment *_environment, int _port, int _release)
Definition c16.c:87
void c16_timer_set_status_on(Environment *_environment, char *_timer)
Definition c16.c:278
void c16_key_pressed(Environment *_environment, char *_scancode, char *_result)
Definition c16.c:188
void c16_key_state(Environment *_environment, char *_scancode, char *_result)
Definition c16.c:151
void c16_wait_key_or_fire_semivar(Environment *_environment, char *_port, int _release)
Definition c16.c:70
void c16_clear_key(Environment *_environment)
Definition c16.c:241
void c16_wait_key(Environment *_environment, int _release)
Definition c16.c:137
void c16_scancode(Environment *_environment, char *_result)
Definition c16.c:166
void c16_put_key(Environment *_environment, char *_string, char *_size)
Definition c16.c:251
void c16_wait_key_or_fire(Environment *_environment, int _port, int _release)
Definition c16.c:53
void c16_timer_set_counter(Environment *_environment, char *_timer, char *_counter)
Definition c16.c:306
void c16_asciicode(Environment *_environment, char *_result)
Definition c16.c:177
void c16_timer_set_address(Environment *_environment, char *_timer, char *_address)
Definition c16.c:346
void c16_keyshift(Environment *_environment, char *_shifts)
Definition c16.c:230
void c16_timer_set_init(Environment *_environment, char *_timer, char *_init)
Definition c16.c:329
void c16_sys_call(Environment *_environment, int _destination)
Definition c16.c:264
void c16_timer_set_status_off(Environment *_environment, char *_timer)
Definition c16.c:292
void c16_scanshift(Environment *_environment, char *_shifts)
Definition c16.c:203
void c16_inkey(Environment *_environment, char *_key)
Definition c16.c:126
int bitmaskNeeded
Definition ugbc.h:2659
int sysCallUsed
Definition ugbc.h:3162
struct _Environment Environment
Structure of compilation environment.
#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
#define outhead1(s, a)
Definition ugbc.h:4247