ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
bank_read.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 READ
53
54@english
55
56This instruction can be used to read a number of bytes from an
57out-of-memory bank in main memory. You must therefore indicate
58one of the available banks, the memory address from which you
59want to copy (the $0000 implies the beginning of the bank),
60the size in bytes and finally the destination address,
61which will be the RAM memory.
62
63Note that, if the destination of read is an array, the array
64must be declared with the flag ''FOR BANK READ''.
65
66@italian
67
68Questa istruzione può essere utilizzata per leggere un certo
69numero di byte da un banco fuori memoria nella memoria centrale.
70Si deve quindi indicare uno dei banchi disponibili, l'indirizzo
71di memoria dal quale si vuole copiare (lo $0000 implica l'inizio
72del banco), la dimensione in byte ed infine l'indirizzo di
73destinazione, che sarà la memoria RAM.
74
75Si noti che se la destinazione della lettura è un array,
76l'array deve essere dichiarato con il flag ''FOR BANK READ''.
77
78@syntax BANK READ bank FROM address1 TO address2 SIZE size
79
80@example BANK READ 1 FROM $0100 TO $2000 SIZE 128
81
82@seeAlso MEMLOAD
83
84@target all
85</usermanual> */
86void bank_read_semi_var( Environment * _environment, int _bank, int _address1, char * _address2, int _size ) {
87
88 char * bankAddress = banks_get_address( _environment, _bank );
89 Variable * realAddress = variable_temporary( _environment, VT_ADDRESS, "(ADDRESS)" );
90 variable_store( _environment, realAddress->realName, 0 );
91 cpu_math_add_16bit( _environment, realAddress->realName, bankAddress, realAddress->realName );
92 cpu_math_add_16bit_const( _environment, realAddress->realName, _address1, realAddress->realName );
93
94 cpu_mem_move_indirect_direct_size( _environment, realAddress->realName, _address2, _size );
95
96}
97
110void bank_read_vars( Environment * _environment, char * _bank, char * _address1, char * _address2, char * _size ) {
111
112 Variable * bankAddress = banks_get_address_var( _environment, _bank );
113 Variable * address1 = variable_retrieve_or_define( _environment, _address1, VT_ADDRESS, 0 );
114 Variable * realAddress = variable_add( _environment, bankAddress->name, address1->name );
115 Variable * address2 = variable_retrieve_or_define( _environment, _address2, VT_ADDRESS, 0 );
116 Variable * size = variable_retrieve_or_define( _environment, _size, VT_WORD, 0 );
117
118 cpu_mem_move( _environment, realAddress->realName, address2->realName, size->realName );
119
120}
121
122void bank_read_vars_direct( Environment * _environment, char * _bank, char * _address1, char * _address2, char * _size ) {
123
124 Variable * bankAddress = banks_get_address_var( _environment, _bank );
125 Variable * address1 = variable_retrieve_or_define( _environment, _address1, VT_ADDRESS, 0 );
126 Variable * realAddress = variable_add( _environment, bankAddress->name, address1->name );
127 Variable * size = variable_retrieve_or_define( _environment, _size, VT_WORD, 0 );
128 Variable * address2 = variable_retrieve_or_define( _environment, _address2, VT_ADDRESS, 0 );
129
130 cpu_mem_move_direct2( _environment, realAddress->realName, address2->realName, size->realName );
131
132}
133
134void bank_read_vars_direct_size( Environment * _environment, char * _bank, char * _address1, char * _address2, int _size ) {
135
136 Variable * bankAddress = banks_get_address_var( _environment, _bank );
137 Variable * address1 = variable_retrieve_or_define( _environment, _address1, VT_ADDRESS, 0 );
138 Variable * realAddress = variable_add( _environment, bankAddress->name, address1->name );
139 Variable * address2 = variable_retrieve_or_define( _environment, _address2, VT_ADDRESS, 0 );
140
141 cpu_mem_move_direct2_size( _environment, realAddress->realName, address2->realName, _size );
142
143}
144
145void bank_read_vars_bank_direct_size( Environment * _environment, int _bank, char * _address1, char * _address2, int _size ) {
146
147 char * bankAddress = banks_get_address( _environment, _bank );
148 Variable * address1 = variable_retrieve_or_define( _environment, _address1, VT_ADDRESS, 0 );
149 Variable * realAddress = variable_add( _environment, bankAddress, address1->name );
150 Variable * address2 = variable_retrieve_or_define( _environment, _address2, VT_ADDRESS, 0 );
151
152 cpu_mem_move_direct2_size( _environment, realAddress->realName, address2->realName, _size );
153
154}
155
156#endif
void cpu_mem_move(Environment *_environment, char *_source, char *_destination, char *_size)
Definition 6309.c:4692
void cpu_math_add_16bit(Environment *_environment, char *_source, char *_destination, char *_other)
CPU 6309: emit code to add two 16 bit values
Definition 6309.c:1661
void cpu_math_add_16bit_const(Environment *_environment, char *_source, int _destination, char *_other)
Definition 6309.c:1674
void cpu_mem_move_indirect_direct_size(Environment *_environment, char *_source, char *_destination, int _size)
Definition 6309.c:4832
void cpu_mem_move_direct2(Environment *_environment, char *_source, char *_destination, char *_size)
Definition 6309.c:4764
void cpu_mem_move_direct2_size(Environment *_environment, char *_source, char *_destination, int _size)
Definition 6309.c:4747
Variable * variable_add(Environment *_environment, char *_source, char *_destination)
Add two variable and return the sum of them.
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 bank_read_semi_var(Environment *_environment, int _bank, int _address1, char *_address2, int _size)
Emit ASM code for instruction BANK READ ....
Definition bank_read.c:50
void bank_read_vars_bank_direct_size(Environment *_environment, int _bank, char *_address1, char *_address2, int _size)
Definition bank_read.c:218
void bank_read_vars_direct_size(Environment *_environment, char *_bank, char *_address1, char *_address2, int _size)
Definition bank_read.c:169
void bank_read_vars(Environment *_environment, char *_bank, char *_address1, char *_address2, char *_size)
Emit ASM code for instruction BANK READ ....
Definition bank_read.c:107
void bank_read_vars_direct(Environment *_environment, char *_bank, char *_address1, char *_address2, char *_size)
Definition bank_read.c:138
Variable * banks_get_address_var(Environment *_environment, char *_bank)
Definition _banks.c:152
char * banks_get_address(Environment *_environment, int _bank)
Definition _banks.c:121
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