ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
c64.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 __c64__
36
37#include "../ugbc.h"
38
39/****************************************************************************
40 * CODE SECTION
41 ****************************************************************************/
42
43void c64_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 c64_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 c64_dload( Environment * _environment, char * _filename, char * _offset, char * _address, char * _size ) {
69
70 _environment->sysCallUsed = 1;
71
73 deploy_preferred( dcommon, src_hw_c128_dcommon_asm);
75
77
78 Variable * filename = variable_retrieve( _environment, _filename );
79 Variable * tnaddress = variable_temporary( _environment, VT_ADDRESS, "(address of target_name)");
80 Variable * tnsize = variable_temporary( _environment, VT_BYTE, "(size of target_name)");
81
82 Variable * address = NULL;
83 if ( _address ) {
84 address = variable_retrieve( _environment, _address );
85 }
86 Variable * size = NULL;
87 if ( _size ) {
88 size = variable_retrieve( _environment, _size );
89 }
90
91 switch( filename->type ) {
92 case VT_STRING:
93 cpu_move_8bit( _environment, filename->realName, tnsize->realName );
94 cpu_addressof_16bit( _environment, filename->realName, tnaddress->realName );
95 cpu_inc_16bit( _environment, tnaddress->realName );
96 break;
97 case VT_DSTRING:
98 cpu_dsdescriptor( _environment, filename->realName, tnaddress->realName, tnsize->realName );
99 break;
100 }
101
102 outline1("LDA %s", tnaddress->realName);
103 outline0("STA TMPPTR");
104 outline1("LDA %s", address_displacement(_environment, tnaddress->realName, "1"));
105 outline0("STA TMPPTR+1");
106 outline1("LDA %s", tnsize->realName);
107 outline0("STA MATHPTR0");
108
109 if ( address ) {
110
111 outline1("LDA %s", address->realName);
112 outline0("STA TMPPTR2");
113 outline1("LDA %s", address_displacement(_environment, address->realName, "1"));
114 outline0("STA TMPPTR2+1");
115 outline0("LDA #0");
116 outline0("STA MATHPTR1");
117
118 }
119
120 outline0("JSR C64DLOAD");
121
122}
123
124void c64_dsave( Environment * _environment, char * _filename, char * _offset, char * _address, char * _size ) {
125
126 _environment->sysCallUsed = 1;
127
129 deploy_preferred( dcommon, src_hw_c128_dcommon_asm);
131
133
134 Variable * filename = variable_retrieve( _environment, _filename );
135 Variable * tnaddress = variable_temporary( _environment, VT_ADDRESS, "(address of target_name)");
136 Variable * tnsize = variable_temporary( _environment, VT_BYTE, "(size of target_name)");
137
138 Variable * address = NULL;
139 if ( _address ) {
140 address = variable_retrieve( _environment, _address );
141 }
142 Variable * size = NULL;
143 if ( _size ) {
144 size = variable_retrieve( _environment, _size );
145 }
146
147 switch( filename->type ) {
148 case VT_STRING:
149 cpu_move_8bit( _environment, filename->realName, tnsize->realName );
150 cpu_addressof_16bit( _environment, filename->realName, tnaddress->realName );
151 cpu_inc_16bit( _environment, tnaddress->realName );
152 break;
153 case VT_DSTRING:
154 cpu_dsdescriptor( _environment, filename->realName, tnaddress->realName, tnsize->realName );
155 break;
156 }
157
158 outline1("LDA %s", tnaddress->realName);
159 outline0("STA TMPPTR");
160 outline1("LDA %s", address_displacement(_environment, tnaddress->realName, "1"));
161 outline0("STA TMPPTR+1");
162 outline1("LDA %s", tnsize->realName);
163 outline0("STA MATHPTR0");
164
165 if ( address ) {
166
167 outline1("LDA %s", address->realName);
168 outline0("STA TMPPTR2");
169 outline1("LDA %s", address_displacement(_environment, address->realName, "1"));
170 outline0("STA TMPPTR2+1");
171 outline0("LDA #0");
172 outline0("STA MATHPTR1");
173
174 }
175
176 if ( size ) {
177
178 outline1("LDA %s", size->realName);
179 outline0("STA MATHPTR4");
180 outline1("LDA %s", address_displacement(_environment, size->realName, "1"));
181 outline0("STA MATHPTR5");
182
183 } else {
184
185 outline0("LDA #$00");
186 outline0("STA MATHPTR4");
187 outline0("STA MATHPTR5");
188
189 }
190
191 outline0("JSR C64DSAVE");
192
193}
194
195void c64_sys_call( Environment * _environment, int _destination ) {
196
197 _environment->sysCallUsed = 1;
198
200
201 outline0("PHA");
202 outline1("LDA #$%2.2x", (_destination & 0xff ) );
203 outline0("STA SYSCALL0+1");
204 outline1("LDA #$%2.2x", ((_destination>>8) & 0xff ) );
205 outline0("STA SYSCALL0+2");
206 outline0("PLA");
207 outline0("JSR SYSCALL");
208
209}
210
211void c64_timer_set_status_on( Environment * _environment, char * _timer ) {
212
214
215 if ( _timer ) {
216 outline1("LDX %s", _timer );
217 } else {
218 outline0("LDX #0" );
219 }
220 outline0("LDY #$1" );
221 outline0("JSR TIMERSETSTATUS" );
222
223}
224
225void c64_timer_set_status_off( Environment * _environment, char * _timer ) {
226
228
229 if ( _timer ) {
230 outline1("LDX %s", _timer );
231 } else {
232 outline0("LDX #0" );
233 }
234 outline0("LDY #$0" );
235 outline0("JSR TIMERSETSTATUS" );
236
237}
238
239void c64_timer_set_counter( Environment * _environment, char * _timer, char * _counter ) {
240
242
243 if ( _timer ) {
244 outline1("LDX %s", _timer );
245 } else {
246 outline0("LDX #0" );
247 }
248 if ( _counter ) {
249 outline1("LDA %s", _counter );
250 } else {
251 outline0("LDA #0" );
252 }
253 outline0("STA MATHPTR2");
254 if ( _counter ) {
255 outline1("LDA %s", address_displacement( _environment, _counter, "1" ) );
256 }
257 outline0("STA MATHPTR3");
258 outline0("JSR TIMERSETCOUNTER" );
259
260}
261
262void c64_timer_set_init( Environment * _environment, char * _timer, char * _init ) {
263
265
266 if ( _timer ) {
267 outline1("LDX %s", _timer );
268 } else {
269 outline0("LDX #0" );
270 }
271 outline1("LDA %s", _init );
272 outline0("STA MATHPTR2");
273 outline1("LDA %s", address_displacement( _environment, _init, "1" ) );
274 outline0("STA MATHPTR3");
275 outline0("JSR TIMERSETINIT" );
276
277}
278
279void c64_timer_set_address( Environment * _environment, char * _timer, char * _address ) {
280
282
283 if ( _timer ) {
284 outline1("LDX %s", _timer );
285 } else {
286 outline0("LDX #0" );
287 }
288 outline1("LDA #<%s", _address );
289 outline0("STA MATHPTR2");
290 outline1("LDA #>%s", _address );
291 outline0("STA MATHPTR3");
292 outline0("JSR TIMERSETADDRESS" );
293
294}
295
296// void c64_dojo_ready( Environment * _environment, char * _value ) {
297
298// deploy( dojo, src_hw_c64_dojo_asm);
299
300// outline0("JSR DOJOISREADY" );
301// cpu_ztoa(_environment);
302// outline1("STA %s", _value );
303
304// }
305
306// void c64_dojo_read_byte( Environment * _environment, char * _value ) {
307
308// deploy( dojo, src_hw_c64_dojo_asm);
309
310// outline0("JSR DOJOREADBYTE" );
311// outline1("STA %s", _value );
312
313// }
314
315// void c64_dojo_write_byte( Environment * _environment, char * _value ) {
316
317// deploy( dojo, src_hw_c64_dojo_asm);
318
319// outline1("LDA %s", _value );
320// outline0("JSR DOJOWRITEBYTE" );
321
322// }
323
324// void c64_dojo_login( Environment * _environment, char * _username, char * _size, char * _password, char * _password_size, char * _session_id ) {
325
326// deploy( dojo, src_hw_c64_dojo_asm);
327
328// outline1("LDA #<%s", _session_id );
329// outline0("STA DOJOCURRENTKAPTR" );
330// outline1("LDA #>%s", _session_id );
331// outline0("STA DOJOCURRENTKAPTR+1" );
332// outline1("LDA %s", _username );
333// outline0("STA TMPPTR" );
334// outline1("LDA %s", address_displacement( _environment, _username, "1" ) );
335// outline0("STA TMPPTR+1" );
336// outline1("LDX %s", _size );
337// outline1("LDA %s", _password );
338// outline0("STA TMPPTR2" );
339// outline1("LDA %s", address_displacement( _environment, _password, "1" ) );
340// outline0("STA TMPPTR2+1" );
341// outline1("LDY %s", _password_size );
342// outline0("JSR DOJOLOGIN" );
343
344// }
345
346// void c64_dojo_success( Environment * _environment, char * _id, char * _result ) {
347
348// deploy( dojo, src_hw_c64_dojo_asm);
349
350// outline1("LDA #<%s", _id );
351// outline0("STA TMPPTR" );
352// outline1("LDA #>%s", _id );
353// outline0("STA TMPPTR+1" );
354// outline0("JSR DOJOSUCCESS" );
355// cpu_ctoa( _environment );
356// outline1("STA %s", _result );
357
358// }
359
360// void c64_dojo_create_port( Environment * _environment, char * _session_id, char * _application, char * _size, char * _port_id ) {
361
362// deploy( dojo, src_hw_c64_dojo_asm);
363
364// outline1("LDA #<%s", _port_id );
365// outline0("STA DOJOCURRENTKAPTR" );
366// outline1("LDA #>%s", _port_id );
367// outline0("STA DOJOCURRENTKAPTR+1" );
368// outline1("LDA %s", _application );
369// outline0("STA TMPPTR" );
370// outline1("LDA %s", address_displacement( _environment, _application, "1" ) );
371// outline0("STA TMPPTR+1" );
372// outline1("LDX %s", _size );
373// outline1("LDA #<%s", _session_id );
374// outline0("STA TMPPTR2" );
375// outline1("LDA #>%s", _session_id );
376// outline0("STA TMPPTR2+1" );
377// outline0("JSR DOJOCREATEPORT" );
378
379// }
380
381// void c64_dojo_destroy_port( Environment * _environment, char * _port_id, char * _result ) {
382
383// deploy( dojo, src_hw_c64_dojo_asm);
384
385// outline1("LDA #<%s", _port_id );
386// outline0("STA TMPPTR" );
387// outline1("LDA #>%s", _port_id );
388// outline0("STA TMPPTR+1" );
389// outline0("JSR DOJODESTROYPORT" );
390// cpu_ctoa( _environment );
391// outline1("STA %s", _result );
392
393// }
394
395// void c64_dojo_find_port( Environment * _environment, char * _session_id, char * _username, char * _size, char * _application, char * _application_size, char * _public_id ) {
396
397// deploy( dojo, src_hw_c64_dojo_asm);
398
399// outline1("LDA #<%s", _session_id );
400// outline0("STA DOJOCURRENTKAPTR" );
401// outline1("LDA #>%s", _session_id );
402// outline0("STA DOJOCURRENTKAPTR+1" );
403// outline1("LDA #<%s", _public_id );
404// outline0("STA DOJOCURRENTKAPTR2" );
405// outline1("LDA #>%s", _public_id );
406// outline0("STA DOJOCURRENTKAPTR2+1" );
407// outline1("LDA %s", _username );
408// outline0("STA TMPPTR" );
409// outline1("LDA %s", address_displacement( _environment, _username, "1" ) );
410// outline0("STA TMPPTR+1" );
411// outline1("LDX %s", _size );
412
413// outline1("LDA %s", _application );
414// outline0("STA TMPPTR2" );
415// outline1("LDA %s", address_displacement( _environment, _application, "1" ) );
416// outline0("STA TMPPTR2+1" );
417// outline1("LDY %s", _application_size );
418// outline0("JSR DOJOFINDPORT" );
419
420// }
421
422// void c64_dojo_put_message( Environment * _environment, char * _port_id, char * _message, char * _size, char * _result ) {
423
424// deploy( dojo, src_hw_c64_dojo_asm);
425
426// outline1("LDA %s", _message );
427// outline0("STA TMPPTR" );
428// outline1("LDA %s", address_displacement( _environment, _message, "1" ) );
429// outline0("STA TMPPTR+1" );
430// outline1("LDX %s", _size );
431
432// outline1("LDA #<%s", _port_id );
433// outline0("STA TMPPTR2" );
434// outline1("LDA #>%s", _port_id );
435// outline0("STA TMPPTR2+1" );
436// outline0("JSR DOJOPUTMESSAGE" );
437// cpu_ctoa( _environment );
438// outline1("STA %s", _result );
439
440// }
441
442// void c64_dojo_peek_message( Environment * _environment, char * _port_id, char * _result ) {
443
444// deploy( dojo, src_hw_c64_dojo_asm);
445
446// outline1("LDA #<%s", _port_id );
447// outline0("STA TMPPTR" );
448// outline1("LDA #>%s", _port_id );
449// outline0("STA TMPPTR+1" );
450// outline0("JSR DOJOPEEKMESSAGE" );
451// cpu_ctoa( _environment );
452// outline1("STA %s", _result );
453
454// }
455
456// void c64_dojo_get_message( Environment * _environment, char * _port_id, char * _result, char * _message ) {
457
458// deploy( dojo, src_hw_c64_dojo_asm);
459
460// outline1("LDA #<%s", _port_id );
461// outline0("STA TMPPTR2" );
462// outline1("LDA #>%s", _port_id );
463// outline0("STA TMPPTR2+1" );
464// outline0("JSR DOJOGETMESSAGE" );
465// cpu_ctoa( _environment );
466// outline1("STA %s", _result );
467// outline1("STX %s", _message );
468
469// }
470
471// void c64_dojo_ping( Environment * _environment, char * _result ) {
472
473// deploy( dojo, src_hw_c64_dojo_asm);
474
475// outline0("JSR DOJOPING" );
476// cpu_ctoa( _environment );
477// outline1("STA %s", _result );
478
479// }
480
481void c64_chain( Environment * _environment, char * _filename ) {
482
483 _environment->sysCallUsed = 1;
484 _environment->chainUsed = 1;
485
490
491 Variable * filename = variable_retrieve( _environment, _filename );
492 Variable * tnaddress = variable_temporary( _environment, VT_ADDRESS, "(address of target_name)");
493 Variable * tnsize = variable_temporary( _environment, VT_BYTE, "(size of target_name)");
494
495 switch( filename->type ) {
496 case VT_STRING:
497 cpu_move_8bit( _environment, filename->realName, tnsize->realName );
498 cpu_addressof_16bit( _environment, filename->realName, tnaddress->realName );
499 cpu_inc_16bit( _environment, tnaddress->realName );
500 break;
501 case VT_DSTRING:
502 cpu_dsdescriptor( _environment, filename->realName, tnaddress->realName, tnsize->realName );
503 break;
504 }
505
506 outline1("LDA %s", tnaddress->realName);
507 outline0("STA DCOMMONP1");
508 outline1("LDA %s", address_displacement(_environment, tnaddress->realName, "1"));
509 outline0("STA DCOMMONP1+1");
510 outline1("LDA %s", tnsize->realName);
511 outline0("STA DCOMMON0");
512 outline0("JMP CHAIN");
513
514}
515
516#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 chain(Environment *_environment, char *_filename)
Definition chain.c:101
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 c64_xpen(Environment *_environment, char *_destination)
Definition c64.c:43
void c64_timer_set_address(Environment *_environment, char *_timer, char *_address)
Definition c64.c:279
void c64_chain(Environment *_environment, char *_filename)
Definition c64.c:481
void c64_timer_set_status_on(Environment *_environment, char *_timer)
Definition c64.c:211
void c64_sys_call(Environment *_environment, int _destination)
Definition c64.c:195
void c64_timer_set_counter(Environment *_environment, char *_timer, char *_counter)
Definition c64.c:239
void c64_timer_set_status_off(Environment *_environment, char *_timer)
Definition c64.c:225
void c64_timer_set_init(Environment *_environment, char *_timer, char *_init)
Definition c64.c:262
void c64_dload(Environment *_environment, char *_filename, char *_offset, char *_address, char *_size)
Definition c64.c:68
void c64_ypen(Environment *_environment, char *_destination)
Definition c64.c:57
void c64_dsave(Environment *_environment, char *_filename, char *_offset, char *_address, char *_size)
Definition c64.c:124
unsigned char src_hw_c64_chain_asm[]
Definition c64_chain.c:1
unsigned char src_hw_c64_dcommon_asm[]
Definition c64_dcommon.c:1
unsigned char src_hw_c64_dload_asm[]
Definition c64_dload.c:1
unsigned char src_hw_c64_dsave_asm[]
Definition c64_dsave.c:1
unsigned char src_hw_c64_syscall_asm[]
Definition c64_syscall.c:1
int chainUsed
Definition ugbc.h:3287
int sysCallUsed
Definition ugbc.h:3162
VariableType type
Definition ugbc.h:988
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 deploy_preferred(s, e)
Definition ugbc.h:4299
#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