ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
c64reu.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 °_.
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 __c64reu__
36
37#include "../ugbc.h"
38
39/****************************************************************************
40 * CODE SECTION
41 ****************************************************************************/
42
43void c64reu_xpen( Environment * _environment, char * _destination ) {
44
46
47 outline0("LDA $D013");
48 outline0("ASL" );
49 outline1("STA %s", _destination);
50 outline1("BCC %s", label );
51 outline0("LDA #1");
52 outline1("STA _%s", address_displacement(_environment, _destination, "1"));
53 outhead1("%s:", label );
54
55}
56
57void c64reu_ypen( Environment * _environment, char * _destination ) {
58
60
61 outline0("LDA $d014");
62 outline1("STA %s", _destination);
63 outline0("LDA #0");
64 outline1("STA %s", address_displacement(_environment, _destination, "1"));
65
66}
67
68void c64reu_dload( Environment * _environment, char * _filename, char * _offset, char * _address, char * _size ) {
69
70 _environment->sysCallUsed = 1;
71
72 deploy( dload, src_hw_c64reu_dload_asm);
73
75
76 Variable * filename = variable_retrieve( _environment, _filename );
77 Variable * tnaddress = variable_temporary( _environment, VT_ADDRESS, "(address of target_name)");
78 Variable * tnsize = variable_temporary( _environment, VT_BYTE, "(size of target_name)");
79
80 Variable * address = NULL;
81 if ( _address ) {
82 address = variable_retrieve( _environment, _address );
83 }
84 Variable * size = NULL;
85 if ( _size ) {
86 size = variable_retrieve( _environment, _size );
87 }
88
89 switch( filename->type ) {
90 case VT_STRING:
91 cpu_move_8bit( _environment, filename->realName, tnsize->realName );
92 cpu_addressof_16bit( _environment, filename->realName, tnaddress->realName );
93 cpu_inc_16bit( _environment, tnaddress->realName );
94 break;
95 case VT_DSTRING:
96 cpu_dsdescriptor( _environment, filename->realName, tnaddress->realName, tnsize->realName );
97 break;
98 }
99
100 outline1("LDA %s", tnaddress->realName);
101 outline0("STA TMPPTR");
102 outline1("LDA %s", address_displacement(_environment, tnaddress->realName, "1"));
103 outline0("STA TMPPTR+1");
104 outline1("LDA %s", tnsize->realName);
105 outline0("STA MATHPTR0");
106
107 if ( address ) {
108
109 outline1("LDA %s", address->realName);
110 outline0("STA TMPPTR2");
111 outline1("LDA %s", address_displacement(_environment, address->realName, "1"));
112 outline0("STA TMPPTR2+1");
113 outline0("LDA #0");
114 outline0("STA MATHPTR1");
115
116 }
117
118 outline0("JSR C64REUDLOAD");
119
120}
121
122void c64reu_dsave( Environment * _environment, char * _filename, char * _offset, char * _address, char * _size ) {
123
124 _environment->sysCallUsed = 1;
125
126 deploy( dsave, src_hw_c64reu_dsave_asm);
127
129
130 Variable * filename = variable_retrieve( _environment, _filename );
131 Variable * tnaddress = variable_temporary( _environment, VT_ADDRESS, "(address of target_name)");
132 Variable * tnsize = variable_temporary( _environment, VT_BYTE, "(size of target_name)");
133
134 Variable * address = NULL;
135 if ( _address ) {
136 address = variable_retrieve( _environment, _address );
137 }
138 Variable * size = NULL;
139 if ( _size ) {
140 size = variable_retrieve( _environment, _size );
141 }
142
143 switch( filename->type ) {
144 case VT_STRING:
145 cpu_move_8bit( _environment, filename->realName, tnsize->realName );
146 cpu_addressof_16bit( _environment, filename->realName, tnaddress->realName );
147 cpu_inc_16bit( _environment, tnaddress->realName );
148 break;
149 case VT_DSTRING:
150 cpu_dsdescriptor( _environment, filename->realName, tnaddress->realName, tnsize->realName );
151 break;
152 }
153
154 outline1("LDA %s", tnaddress->realName);
155 outline0("STA TMPPTR");
156 outline1("LDA %s", address_displacement(_environment, tnaddress->realName, "1"));
157 outline0("STA TMPPTR+1");
158 outline1("LDA %s", tnsize->realName);
159 outline0("STA MATHPTR0");
160
161 if ( address ) {
162
163 outline1("LDA %s", address->realName);
164 outline0("STA TMPPTR2");
165 outline1("LDA %s", address_displacement(_environment, address->realName, "1"));
166 outline0("STA TMPPTR2+1");
167 outline0("LDA #0");
168 outline0("STA MATHPTR1");
169
170 }
171
172 if ( size ) {
173
174 outline1("LDA %s", size->realName);
175 outline0("STA MATHPTR4");
176 outline1("LDA %s", address_displacement(_environment, size->realName, "1"));
177 outline0("STA MATHPTR5");
178
179 } else {
180
181 outline0("LDA #$00");
182 outline0("STA MATHPTR4");
183 outline0("STA MATHPTR5");
184
185 }
186
187 outline0("JSR C64REUDSAVE");
188
189}
190
191void c64reu_sys_call( Environment * _environment, int _destination ) {
192
193 _environment->sysCallUsed = 1;
194
195 outline0("PHA");
196 outline1("LDA #$%2.2x", (_destination & 0xff ) );
197 outline0("STA SYSCALL0+1");
198 outline1("LDA #$%2.2x", ((_destination>>8) & 0xff ) );
199 outline0("STA SYSCALL0+2");
200 outline0("PLA");
201 outline0("JSR SYSCALL");
202
203}
204
205void c64reu_timer_set_status_on( Environment * _environment, char * _timer ) {
206
208
209 if ( _timer ) {
210 outline1("LDX %s", _timer );
211 } else {
212 outline0("LDX #0" );
213 }
214 outline0("LDY #$1" );
215 outline0("JSR TIMERSETSTATUS" );
216
217}
218
219void c64reu_timer_set_status_off( Environment * _environment, char * _timer ) {
220
222
223 if ( _timer ) {
224 outline1("LDX %s", _timer );
225 } else {
226 outline0("LDX #0" );
227 }
228 outline0("LDY #$0" );
229 outline0("JSR TIMERSETSTATUS" );
230
231}
232
233void c64reu_timer_set_counter( Environment * _environment, char * _timer, char * _counter ) {
234
236
237 if ( _timer ) {
238 outline1("LDX %s", _timer );
239 } else {
240 outline0("LDX #0" );
241 }
242 if ( _counter ) {
243 outline1("LDA %s", _counter );
244 } else {
245 outline0("LDA #0" );
246 }
247 outline0("STA MATHPTR2");
248 if ( _counter ) {
249 outline1("LDA %s", address_displacement( _environment, _counter, "1" ) );
250 }
251 outline0("STA MATHPTR3");
252 outline0("JSR TIMERSETCOUNTER" );
253
254}
255
256void c64reu_timer_set_init( Environment * _environment, char * _timer, char * _init ) {
257
259
260 if ( _timer ) {
261 outline1("LDX %s", _timer );
262 } else {
263 outline0("LDX #0" );
264 }
265 outline1("LDA %s", _init );
266 outline0("STA MATHPTR2");
267 outline1("LDA %s", address_displacement( _environment, _init, "1" ) );
268 outline0("STA MATHPTR3");
269 outline0("JSR TIMERSETINIT" );
270
271}
272
273void c64reu_timer_set_address( Environment * _environment, char * _timer, char * _address ) {
274
276
277 if ( _timer ) {
278 outline1("LDX %s", _timer );
279 } else {
280 outline0("LDX #0" );
281 }
282 outline1("LDA #<%s", _address );
283 outline0("STA MATHPTR2");
284 outline1("LDA #>%s", _address );
285 outline0("STA MATHPTR3");
286 outline0("JSR TIMERSETADDRESS" );
287
288}
289
290// void c64reu_dojo_ready( Environment * _environment, char * _value ) {
291
292// deploy( dojo, src_hw_c64reu_dojo_asm);
293
294// outline0("JSR DOJOISREADY" );
295// cpu_ztoa(_environment);
296// outline1("STA %s", _value );
297
298// }
299
300// void c64reu_dojo_read_byte( Environment * _environment, char * _value ) {
301
302// deploy( dojo, src_hw_c64reu_dojo_asm);
303
304// outline0("JSR DOJOREADBYTE" );
305// outline1("STA %s", _value );
306
307// }
308
309// void c64reu_dojo_write_byte( Environment * _environment, char * _value ) {
310
311// deploy( dojo, src_hw_c64reu_dojo_asm);
312
313// outline1("LDA %s", _value );
314// outline0("JSR DOJOWRITEBYTE" );
315
316// }
317
318// void c64reu_dojo_login( Environment * _environment, char * _username, char * _size, char * _password, char * _password_size, char * _session_id ) {
319
320// deploy( dojo, src_hw_c64reu_dojo_asm);
321
322// outline1("LDA #<%s", _session_id );
323// outline0("STA DOJOCURRENTKAPTR" );
324// outline1("LDA #>%s", _session_id );
325// outline0("STA DOJOCURRENTKAPTR+1" );
326// outline1("LDA %s", _username );
327// outline0("STA TMPPTR" );
328// outline1("LDA %s", address_displacement( _environment, _username, "1" ) );
329// outline0("STA TMPPTR+1" );
330// outline1("LDX %s", _size );
331// outline1("LDA %s", _password );
332// outline0("STA TMPPTR2" );
333// outline1("LDA %s", address_displacement( _environment, _password, "1" ) );
334// outline0("STA TMPPTR2+1" );
335// outline1("LDY %s", _password_size );
336// outline0("JSR DOJOLOGIN" );
337
338// }
339
340// void c64reu_dojo_success( Environment * _environment, char * _id, char * _result ) {
341
342// deploy( dojo, src_hw_c64reu_dojo_asm);
343
344// outline1("LDA #<%s", _id );
345// outline0("STA TMPPTR" );
346// outline1("LDA #>%s", _id );
347// outline0("STA TMPPTR+1" );
348// outline0("JSR DOJOSUCCESS" );
349// cpu_ctoa( _environment );
350// outline1("STA %s", _result );
351
352// }
353
354// void c64reu_dojo_create_port( Environment * _environment, char * _session_id, char * _application, char * _size, char * _port_id ) {
355
356// deploy( dojo, src_hw_c64reu_dojo_asm);
357
358// outline1("LDA #<%s", _port_id );
359// outline0("STA DOJOCURRENTKAPTR" );
360// outline1("LDA #>%s", _port_id );
361// outline0("STA DOJOCURRENTKAPTR+1" );
362// outline1("LDA %s", _application );
363// outline0("STA TMPPTR" );
364// outline1("LDA %s", address_displacement( _environment, _application, "1" ) );
365// outline0("STA TMPPTR+1" );
366// outline1("LDX %s", _size );
367// outline1("LDA #<%s", _session_id );
368// outline0("STA TMPPTR2" );
369// outline1("LDA #>%s", _session_id );
370// outline0("STA TMPPTR2+1" );
371// outline0("JSR DOJOCREATEPORT" );
372
373// }
374
375// void c64reu_dojo_destroy_port( Environment * _environment, char * _port_id, char * _result ) {
376
377// deploy( dojo, src_hw_c64reu_dojo_asm);
378
379// outline1("LDA #<%s", _port_id );
380// outline0("STA TMPPTR" );
381// outline1("LDA #>%s", _port_id );
382// outline0("STA TMPPTR+1" );
383// outline0("JSR DOJODESTROYPORT" );
384// cpu_ctoa( _environment );
385// outline1("STA %s", _result );
386
387// }
388
389// void c64reu_dojo_find_port( Environment * _environment, char * _session_id, char * _username, char * _size, char * _application, char * _application_size, char * _public_id ) {
390
391// deploy( dojo, src_hw_c64reu_dojo_asm);
392
393// outline1("LDA #<%s", _session_id );
394// outline0("STA DOJOCURRENTKAPTR" );
395// outline1("LDA #>%s", _session_id );
396// outline0("STA DOJOCURRENTKAPTR+1" );
397// outline1("LDA #<%s", _public_id );
398// outline0("STA DOJOCURRENTKAPTR2" );
399// outline1("LDA #>%s", _public_id );
400// outline0("STA DOJOCURRENTKAPTR2+1" );
401// outline1("LDA %s", _username );
402// outline0("STA TMPPTR" );
403// outline1("LDA %s", address_displacement( _environment, _username, "1" ) );
404// outline0("STA TMPPTR+1" );
405// outline1("LDX %s", _size );
406
407// outline1("LDA %s", _application );
408// outline0("STA TMPPTR2" );
409// outline1("LDA %s", address_displacement( _environment, _application, "1" ) );
410// outline0("STA TMPPTR2+1" );
411// outline1("LDY %s", _application_size );
412// outline0("JSR DOJOFINDPORT" );
413
414// }
415
416// void c64reu_dojo_put_message( Environment * _environment, char * _port_id, char * _message, char * _size, char * _result ) {
417
418// deploy( dojo, src_hw_c64reu_dojo_asm);
419
420// outline1("LDA %s", _message );
421// outline0("STA TMPPTR" );
422// outline1("LDA %s", address_displacement( _environment, _message, "1" ) );
423// outline0("STA TMPPTR+1" );
424// outline1("LDX %s", _size );
425
426// outline1("LDA #<%s", _port_id );
427// outline0("STA TMPPTR2" );
428// outline1("LDA #>%s", _port_id );
429// outline0("STA TMPPTR2+1" );
430// outline0("JSR DOJOPUTMESSAGE" );
431// cpu_ctoa( _environment );
432// outline1("STA %s", _result );
433
434// }
435
436// void c64reu_dojo_peek_message( Environment * _environment, char * _port_id, char * _result ) {
437
438// deploy( dojo, src_hw_c64reu_dojo_asm);
439
440// outline1("LDA #<%s", _port_id );
441// outline0("STA TMPPTR" );
442// outline1("LDA #>%s", _port_id );
443// outline0("STA TMPPTR+1" );
444// outline0("JSR DOJOPEEKMESSAGE" );
445// cpu_ctoa( _environment );
446// outline1("STA %s", _result );
447
448// }
449
450// void c64reu_dojo_get_message( Environment * _environment, char * _port_id, char * _result, char * _message ) {
451
452// deploy( dojo, src_hw_c64reu_dojo_asm);
453
454// outline1("LDA #<%s", _port_id );
455// outline0("STA TMPPTR2" );
456// outline1("LDA #>%s", _port_id );
457// outline0("STA TMPPTR2+1" );
458// outline0("JSR DOJOGETMESSAGE" );
459// cpu_ctoa( _environment );
460// outline1("STA %s", _result );
461// outline1("STX %s", _message );
462
463// }
464
465// void c64reu_dojo_ping( Environment * _environment, char * _result ) {
466
467// deploy( dojo, src_hw_c64reu_dojo_asm);
468
469// outline0("JSR DOJOPING" );
470// cpu_ctoa( _environment );
471// outline1("STA %s", _result );
472
473// }
474
475#endif
void cpu_addressof_16bit(Environment *_environment, char *_source, char *_destination)
Definition 6309.c:1485
void cpu_inc_16bit(Environment *_environment, char *_variable)
Definition 6309.c:4565
void cpu_move_8bit(Environment *_environment, char *_source, char *_destination)
CPU 6309: emit code to move 8 bit
Definition 6309.c:743
void cpu_dsdescriptor(Environment *_environment, char *_index, char *_address, char *_size)
Definition 6309.c:5977
unsigned char src_hw_6502_timer_asm[]
Definition 6502_timer.c:1
Variable * variable_retrieve(Environment *_environment, char *_name)
Variable * variable_temporary(Environment *_environment, VariableType _type, char *_meaning)
Define a temporary variable.
char * address_displacement(Environment *_environment, char *_address, char *_displacement)
int size
Definition _optimizer.c:678
void dload(Environment *_environment, char *_filename, char *_offset, char *_address, char *_bank, char *_size)
Emit code for DLOAD(...).
Definition dload.c:60
void dsave(Environment *_environment, char *_filename, char *_offset, char *_address, char *_size)
Emit code for DLOAD(...).
Definition dsave.c:58
void c64reu_timer_set_address(Environment *_environment, char *_timer, char *_address)
Definition c64reu.c:273
void c64reu_xpen(Environment *_environment, char *_destination)
Definition c64reu.c:43
void c64reu_sys_call(Environment *_environment, int _destination)
Definition c64reu.c:191
void c64reu_timer_set_init(Environment *_environment, char *_timer, char *_init)
Definition c64reu.c:256
void c64reu_dload(Environment *_environment, char *_filename, char *_offset, char *_address, char *_size)
Definition c64reu.c:68
void c64reu_dsave(Environment *_environment, char *_filename, char *_offset, char *_address, char *_size)
Definition c64reu.c:122
void c64reu_ypen(Environment *_environment, char *_destination)
Definition c64reu.c:57
void c64reu_timer_set_counter(Environment *_environment, char *_timer, char *_counter)
Definition c64reu.c:233
void c64reu_timer_set_status_on(Environment *_environment, char *_timer)
Definition c64reu.c:205
void c64reu_timer_set_status_off(Environment *_environment, char *_timer)
Definition c64reu.c:219
int sysCallUsed
Definition ugbc.h:3162
char * realName
Definition ugbc.h:982
struct _Variable Variable
Structure of a single variable.
struct _Environment Environment
Structure of compilation environment.
@ VT_STRING
Definition ugbc.h:474
@ VT_BYTE
Definition ugbc.h:450
@ VT_ADDRESS
Definition ugbc.h:465
@ VT_DSTRING
Definition ugbc.h:483
#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