ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
get_cmove.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/****************************************************************************
38 * CODE SECTION
39 ****************************************************************************/
40
48/* <usermanual>
49@keyword CMOVE (function)
50
51@english
52
53The ''CMOVE$'' function can be used to generate a string that moves the text cursor a
54pre-set distance away from its current position. The command is followed by a pair
55of variables that represent the width and height of the required offset, and these
56values are added to the current cursor coordinates. Like ''LOCATE'', either of the
57coordinates can be omitted, as long as the comma is positioned correctly. An additional
58technique is to use negative values as well as positive offsets.
59
60@italian
61
62The ''CMOVE$'' function can be used to generate a string that moves the text cursor
63a preset distance from its current position. The command is followed by a pair of
64variables representing the width and height of the requested offset, and these values
65​​are added to the current cursor coordinates. Like ''LOCATE'', both coordinates can be
66omitted, as long as the comma is correctly positioned. Another technique is to use
67negative values ​​and positive offsets.
68
69@syntax = CMOVE$( x, y )
70
71@example PRINT CMOVE$(10,10)
72
73@usedInExample texts_position_04.bas
74
75@seeAlso CMOVE (instruction)
76@target all
77</usermanual> */
78Variable * get_cmove( Environment * _environment, char * _x, char * _y ) {
79
80 Variable * x = variable_retrieve_or_define( _environment, _x, VT_BYTE, 0 );
81 Variable * y = variable_retrieve_or_define( _environment, _y, VT_BYTE, 0 );
82
83 Variable * result = variable_temporary( _environment, VT_DSTRING, "(get_cmove)" );
84 Variable * address = variable_temporary( _environment, VT_ADDRESS, "(get_cmove)" );
85 Variable * size = variable_temporary( _environment, VT_BYTE, "(get_cmove)" );
86
87 char resultString[MAX_TEMPORARY_STORAGE]; sprintf( resultString, "\x3 " );
88
89 variable_store_string(_environment, result->name, resultString );
90 cpu_dswrite( _environment, result->realName );
91 cpu_dsdescriptor( _environment, result->realName, address->realName, size->realName );
92
93 cpu_move_8bit_indirect_with_offset(_environment, x->realName, address->realName, 1 );
94 cpu_move_8bit_indirect_with_offset(_environment, y->realName, address->realName, 2 );
95
96 return result;
97
98}
99
100Variable * get_cmove_direct( Environment * _environment, int _x, int _y ) {
101
102 Variable * result = variable_temporary( _environment, VT_DSTRING, 0 );
103 Variable * address = variable_temporary( _environment, VT_ADDRESS, "(get_cmove)" );
104 Variable * size = variable_temporary( _environment, VT_BYTE, "(get_cmove)" );
105
106 char resultString[MAX_TEMPORARY_STORAGE]; sprintf( resultString, "\x3 " );
107
108 variable_store_string(_environment, result->name, resultString );
109 cpu_dswrite( _environment, result->realName );
110 cpu_dsdescriptor( _environment, result->realName, address->realName, size->realName );
111
112 Variable * tmp = variable_temporary( _environment, VT_BYTE, "(get_cmove)" );
113 cpu_store_8bit( _environment, tmp->realName, ( _x & 0xff ) );
114 cpu_move_8bit_indirect_with_offset( _environment, tmp->realName, address->realName, 1 );
115 cpu_store_8bit( _environment, tmp->realName, ( _y & 0xff ) );
116 cpu_move_8bit_indirect_with_offset( _environment, tmp->realName, address->realName, 2 );
117
118 return result;
119
120}
121
void cpu_dswrite(Environment *_environment, char *_index)
Definition 6309.c:5927
void cpu_move_8bit_indirect_with_offset(Environment *_environment, char *_source, char *_value, int _offset)
Definition 6309.c:5250
void cpu_store_8bit(Environment *_environment, char *_destination, int _value)
CPU 6309: emit code to store 8 bit
Definition 6309.c:761
void cpu_dsdescriptor(Environment *_environment, char *_index, char *_address, char *_size)
Definition 6309.c:5977
Variable * variable_retrieve_or_define(Environment *_environment, char *_name, VariableType _type, int _value)
Variable * variable_store_string(Environment *_environment, char *_destination, char *_value)
Store a string to a variable.
Variable * variable_temporary(Environment *_environment, VariableType _type, char *_meaning)
Define a temporary variable.
int size
Definition _optimizer.c:678
Variable * get_cmove_direct(Environment *_environment, int _x, int _y)
Definition get_cmove.c:100
Variable * get_cmove(Environment *_environment, char *_x, char *_y)
Emit code for = CMOVE(...,...).
Definition get_cmove.c:78
char * name
Definition ugbc.h:979
char * realName
Definition ugbc.h:982
#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
@ VT_ADDRESS
Definition ugbc.h:465
@ VT_DSTRING
Definition ugbc.h:483