ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
sc3000.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 __sc3000__
54
55void sc3000_inkey( Environment * _environment, char * _pressed, char * _key ) {
56
57 deploy( scancode, src_hw_sc3000_scancode_asm );
58
59 sc3000_scancode( _environment, _pressed, _key );
60
61}
62
63void sc3000_wait_key_or_fire( Environment * _environment, int _port, int _release ) {
64
65 sc3000_wait_fire( _environment, _port, _release );
66
67}
68
69void sc3000_wait_key_or_fire_semivar( Environment * _environment, char * _port, int _release ) {
70
71 sc3000_wait_fire_semivar( _environment, _port, _release );
72
73}
74
75void sc3000_wait_fire( Environment * _environment, int _port, int _release ) {
76
77 _environment->bitmaskNeeded = 1;
78
79 deploy( joystick, src_hw_sc3000_joystick_asm );
80
81 outline1("LD B, $%2.2x", _release );
82 outline0("CALL WAITFIRE");
83
84}
85
86void sc3000_wait_fire_semivar( Environment * _environment, char * _port, int _release ) {
87
88 _environment->bitmaskNeeded = 1;
89
90 deploy( joystick, src_hw_sc3000_joystick_asm );
91
92 outline1("LD B, $%2.2x", _release );
93 outline0("CALL WAITFIRE");
94
95}
96
97void sc3000_scancode( Environment * _environment, char * _pressed, char * _scancode ) {
98
100
101 deploy( scancode, src_hw_sc3000_scancode_asm );
102
103 outline0("LD A, 0");
104 outline1("LD (%s), A", _pressed);
105 outline0("LD A, $40");
106 outline1("LD (%s), A", _scancode);
107 outline0("CALL SCANCODE");
108 outline0("CP 0");
109 outline1("JR Z, %snokey", label);
110 outline1("LD (%s), A", _pressed);
111 outline0("LD A, B");
112 outline1("LD (%s), A", _scancode);
113 outhead1("%snokey:", label);
114
115}
116
117void sc3000_key_pressed( Environment * _environment, char *_scancode, char * _result ) {
118
120
121 char nokeyLabel[MAX_TEMPORARY_STORAGE];
122 sprintf( nokeyLabel, "%slabel", label );
123
124 Variable * temp = variable_temporary( _environment, VT_BYTE, "(pressed)" );
125
126 sc3000_scancode( _environment, temp->realName, _result );
127 cpu_compare_8bit( _environment, _result, _scancode, temp->realName, 1 );
128 cpu_compare_and_branch_8bit_const( _environment, temp->realName, 0, nokeyLabel, 1 );
129 cpu_store_8bit( _environment, _result, 0xff );
130 cpu_jump( _environment, label );
131 cpu_label( _environment, nokeyLabel );
132 cpu_store_8bit( _environment, _result, 0x00 );
133 cpu_label( _environment, label );
134
135}
136
137
138void sc3000_scanshift( Environment * _environment, char * _shifts ) {
139
140}
141
142void sc3000_keyshift( Environment * _environment, char * _shifts ) {
143
144}
145
146void sc3000_clear_key( Environment * _environment ) {
147
148}
149
150void sc3000_sys_call( Environment * _environment, int _destination ) {
151
152 outline1("CALL $%4.4x", _destination );
153
154}
155
156void sc3000_timer_set_status_on( Environment * _environment, char * _timer ) {
157
158 deploy( timer, src_hw_z80_timer_asm);
159
160 if ( _timer ) {
161 outline1("LD A, (%s)", _timer );
162 outline0("LD B, A" );
163 } else {
164 outline0("LD B, 0" );
165 }
166 outline0("LD A, 1" );
167 outline0("LD C, A" );
168 outline0("CALL TIMERSETSTATUS" );
169
170}
171
172void sc3000_timer_set_status_off( Environment * _environment, char * _timer ) {
173
174 deploy( timer, src_hw_z80_timer_asm);
175
176 if ( _timer ) {
177 outline1("LD A, (%s)", _timer );
178 outline0("LD B, A" );
179 } else {
180 outline0("LD B, 0" );
181 }
182 outline0("LD A, 0" );
183 outline0("LD C, A" );
184 outline0("CALL TIMERSETSTATUS" );
185
186
187}
188
189void sc3000_timer_set_counter( Environment * _environment, char * _timer, char * _counter ) {
190
191 deploy( timer, src_hw_z80_timer_asm);
192
193 if ( _counter ) {
194 outline1("LD A, (%s)", _counter );
195 outline0("LD IXL, A" );
196 outline1("LD A, (%s)", address_displacement( _environment, _counter, "1" ) );
197 outline0("LD IXH, A" );
198 } else {
199 outline0("LD IX, 0" );
200 }
201 if ( _timer ) {
202 outline1("LD A, (%s)", _timer );
203 outline0("LD B, A" );
204 } else {
205 outline0("LD B, 0" );
206 }
207 outline0("CALL TIMERSETCOUNTER" );
208
209}
210
211void sc3000_timer_set_init( Environment * _environment, char * _timer, char * _init ) {
212
213 deploy( timer, src_hw_z80_timer_asm);
214
215 if ( _init ) {
216 outline1("LD A, (%s)", _init );
217 outline0("LD IXL, A" );
218 outline1("LD A, (%s)", address_displacement( _environment, _init, "1" ) );
219 outline0("LD IXH, A" );
220 } else {
221 outline0("LD IX, 0" );
222 }
223 if ( _timer ) {
224 outline1("LD A, (%s)", _timer );
225 outline0("LD B, A" );
226 } else {
227 outline0("LD B, 0" );
228 }
229 outline0("CALL TIMERSETINIT" );
230
231}
232
233void sc3000_timer_set_address( Environment * _environment, char * _timer, char * _address ) {
234
235 deploy( timer, src_hw_z80_timer_asm);
236
237 if ( _address ) {
238 outline1("LD HL, %s", _address );
239 outline0("LD A, L" );
240 outline0("LD IXL, A" );
241 outline0("LD A, H" );
242 outline0("LD IXH, A" );
243 } else {
244 outline0("LD IX, 0" );
245 }
246 if ( _timer ) {
247 outline1("LD A, (%s)", _timer );
248 outline0("LD B, A" );
249 } else {
250 outline0("LD B, 0" );
251 }
252 outline0("CALL TIMERSETADDRESS" );
253
254}
255
256void sc3000_put_key( Environment * _environment, char *_string, char * _size ) {
257
258}
259
260#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)
Variable * scancode(Environment *_environment)
Definition scancode.c:43
void sc3000_wait_fire_semivar(Environment *_environment, char *_port, int _release)
Definition sc3000.c:86
void sc3000_wait_key_or_fire(Environment *_environment, int _port, int _release)
Definition sc3000.c:63
void sc3000_scanshift(Environment *_environment, char *_shifts)
Definition sc3000.c:138
void sc3000_timer_set_status_on(Environment *_environment, char *_timer)
Definition sc3000.c:156
void sc3000_key_pressed(Environment *_environment, char *_scancode, char *_result)
Definition sc3000.c:117
void sc3000_wait_key_or_fire_semivar(Environment *_environment, char *_port, int _release)
Definition sc3000.c:69
void sc3000_timer_set_status_off(Environment *_environment, char *_timer)
Definition sc3000.c:172
void sc3000_clear_key(Environment *_environment)
Definition sc3000.c:146
void sc3000_timer_set_address(Environment *_environment, char *_timer, char *_address)
Definition sc3000.c:233
void sc3000_timer_set_counter(Environment *_environment, char *_timer, char *_counter)
Definition sc3000.c:189
void sc3000_keyshift(Environment *_environment, char *_shifts)
Definition sc3000.c:142
void sc3000_inkey(Environment *_environment, char *_pressed, char *_key)
Definition sc3000.c:55
void sc3000_timer_set_init(Environment *_environment, char *_timer, char *_init)
Definition sc3000.c:211
void sc3000_put_key(Environment *_environment, char *_string, char *_size)
Definition sc3000.c:256
void sc3000_scancode(Environment *_environment, char *_pressed, char *_scancode)
Definition sc3000.c:97
void sc3000_wait_fire(Environment *_environment, int _port, int _release)
Definition sc3000.c:75
void sc3000_sys_call(Environment *_environment, int _destination)
Definition sc3000.c:150
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
#define outhead1(s, a)
Definition ugbc.h:4247