ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
bank_write.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
37#if defined(__atari__) || defined(__atarixl__) ||defined(__plus4__) || defined(__vic20__) || defined(__c16__)
38
51/* <usermanual>
52@keyword BANK WRITE
53
54@english
55
56This instruction can be used to write a number of bytes to an
57out-of-memory bank from main memory. You must therefore indicate
58one of the available banks, the memory address from which you
59want to copy, the size in bytes and finally the destination
60address (the $0000 implies the beginning of the bank),
61which will be the bank memory.
62
63@italian
64
65Questa istruzione può essere utilizzata per scrivere un certo
66numero di byte in un banco fuori memoria, provenienti dalla memoria centrale.
67Si deve quindi indicare uno dei banchi disponibili, l'indirizzo
68di memoria nel quale si vuole copiare il dato (lo $0000 implica l'inizio
69del banco), la dimensione in byte ed infine l'indirizzo di
70sorgente, che sarà la memoria RAM.
71
72@syntax BANK WRITE bank FROM address1 TO address2 SIZE size
73
74@example BANK WRITE 1 FROM $0100 TO $2000 SIZE 128
75
76@seeAlso MEMSAVE
77
78@target all
79</usermanual> */
80
81void bank_write_vars( Environment * _environment, char * _address1, char * _bank, char * _address2, char * _size ) {
82
83 outline4("; bank write( ..., %s, %s, %s, %s)", _address1, _bank, _address2, _size );
84 // Variable * previous = bank_get( _environment );
85 // bank_set_var( _environment, _bank );
86 Variable * bankAddress = banks_get_address_var( _environment, _bank );
87 Variable * address1 = variable_retrieve_or_define( _environment, _address1, VT_ADDRESS, 0 );
88 Variable * address2 = variable_retrieve_or_define( _environment, _address2, VT_ADDRESS, 0 );
89 Variable * realAddress = variable_add( _environment, bankAddress->name, address2->name );
90 mmove_memory_memory( _environment, address1->name, realAddress->name, _size );
91 // bank_set_var( _environment, previous->name );
92 outline0("; end bank write")
93
94}
95
96void bank_write_vars_direct( Environment * _environment, char * _address1, char * _bank, char * _address2, char * _size ) {
97
98 outline0("; bank write")
99 Variable * address1 = variable_retrieve( _environment, _address1 );
100 Variable * effectiveAddress = variable_temporary( _environment, VT_ADDRESS, "(effectiveAddress)");
101 cpu_addressof_16bit( _environment, address1->realName, effectiveAddress->realName );
102 bank_write_vars( _environment, effectiveAddress->name, _bank, _address2, _size );
103 outline0("; end bank write")
104
105}
106
107void bank_write_vars_bank_direct_size( Environment * _environment, char * _address1, int _bank, char * _address2, int _size ) {
108
109 outline0("; bank write")
110 Variable * address1 = variable_retrieve( _environment, _address1 );
111 Variable * effectiveAddress = variable_temporary( _environment, VT_ADDRESS, "(effectiveAddress)");
112 Variable * bank = variable_temporary( _environment, VT_WORD, "(bank)");
113 Variable * size = variable_temporary( _environment, VT_WORD, "(size)");
114 cpu_addressof_16bit( _environment, address1->realName, effectiveAddress->realName );
115 variable_store( _environment, bank->name, _bank );
116 variable_store( _environment, size->name, _size );
117 bank_write_vars( _environment, effectiveAddress->name, bank->name, _address2, size->name );
118 outline0("; end bank write")
119
120}
121
122#endif
void cpu_addressof_16bit(Environment *_environment, char *_source, char *_destination)
Definition 6309.c:1485
Variable * variable_add(Environment *_environment, char *_source, char *_destination)
Add two variable and return the sum of them.
Variable * variable_retrieve(Environment *_environment, char *_name)
Variable * variable_retrieve_or_define(Environment *_environment, char *_name, VariableType _type, int _value)
Variable * variable_temporary(Environment *_environment, VariableType _type, char *_meaning)
Define a temporary variable.
Variable * variable_store(Environment *_environment, char *_destination, unsigned int _value)
Store a direct value to a variable.
int size
Definition _optimizer.c:678
void mmove_memory_memory(Environment *_environment, char *_from, char *_to, char *_size)
Emit ASM code for MMOVE [expr] TO [expr] SIZE [expr].
Definition mmove.c:53
void bank_write_vars_direct(Environment *_environment, char *_address1, char *_bank, char *_address2, char *_size)
Definition bank_write.c:80
void bank_write_vars_bank_direct_size(Environment *_environment, char *_address1, int _bank, char *_address2, int _size)
Definition bank_write.c:111
void bank_write_vars(Environment *_environment, char *_address1, char *_bank, char *_address2, char *_size)
Emit ASM code for instruction BANK WRITE ....
Definition bank_write.c:49
Variable * banks_get_address_var(Environment *_environment, char *_bank)
Definition _banks.c:152
char * name
Definition ugbc.h:979
char * realName
Definition ugbc.h:982
struct _Variable Variable
Structure of a single variable.
struct _Environment Environment
Structure of compilation environment.
@ VT_WORD
Definition ugbc.h:455
@ VT_ADDRESS
Definition ugbc.h:465
#define outline0(s)
Definition ugbc.h:4252
#define outline4(s, a, b, c, d)
Definition ugbc.h:4256