-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathm5272lib_old.c
212 lines (192 loc) · 6.47 KB
/
m5272lib_old.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
//------------------------------------------------------------------------------
// m5272lib.c
//
// Funciones para la plataforma de desarrollo ENT2004CF
//
// Actualizada por: Javier Guillén Álvarez
//------------------------------------------------------------------------------
#ifndef __M5272LIB_C__
#define __M5272LIB_C__
#include "m5272lib.h"
//------------------------------------------------------------------------------
// INLINE void _exit(int status)
//
// Descripción: Finaliza la ejecución en curso
// Entrada: int status, código de salida del programa (ignorado fuera de simulación)
// Salida: void
// Devuelve: void
//------------------------------------------------------------------------------
INLINE void _exit(int status)
{
asm volatile( "moveb #0,%%d1\n\t" "movel #0, %%d0\n\t" "trap #15\n\t"
::: "d0", "d1");
}
//------------------------------------------------------------------------------
// INLINE char inch(void)
//
// Descripción: lee una tecla del teclado del PC
// Entrada: void
// Salida: void
// Devuelve: char, carácter leído
// Comentario: El comportamiento de inch() es sin echo y puede reproducirse
// en ANSI C
//------------------------------------------------------------------------------
INLINE char inch(void)
{
char ch;
asm volatile( "movel #0x10, %%d0\n\t" "trap #15\n\t" "movel %%d1,%0\n\t"
: "=d" (ch) :
: "d0", "d1");
return (char) ch;
}
//------------------------------------------------------------------------------
// INLINE char inche(void)
//
// Descripción: lee una tecla del teclado del PC y la escribe en el terminal
// Entrada: void
// Salida: void
// Devuelve: char, carácter leído
// Comentario: El comportamiento de inche() es con eco y puede reproducirse
// en ANSI C
//------------------------------------------------------------------------------
INLINE char inche(void)
{
char ch;
ch=inch();
outch(ch);
return (char) ch;
}
//------------------------------------------------------------------------------
// INLINE void outch(char ch)
//
// Descripción: imprime carácteren la pantalla del PC
// Entrada: char ch, carácter que imprimir
// Salida: void
// Devuelve: void
//------------------------------------------------------------------------------
INLINE void outch(char ch)
{
asm volatile( "moveb %0,%%d1\n\t" "movel #0x13, %%d0\n\t" "trap #15\n\t"
: : "d" (ch)
: "d0", "d1");
}
//------------------------------------------------------------------------------
// void outNum(UINT base, long num, UBYTE opciones)
//
// Descripción:
// Imprime en el terminal el valor de 'num' en la base indicada con o sin
// signo y en mayúsculas o minúsculas.
//
// Entrada:
// UINT base,
// base del número 'num'
// long num,
// número a imprimir
// UBYTE opciones,
// Combinación de los flags SIN_SIGNO y MAYUSC indicando si la impresión
// es sin signo y/o en mayúsculas.
// Valor 0 para minúsculas con signo.
//
// Modificado por: Javier Guillén Álvarez
//------------------------------------------------------------------------------
// ALIAS para mantener compatibilidad con versiones anteriores de la biblioteca
#define print_number(base,sinSigno,num) outNum(base,num,sinSigno)
void outNum(UINT base, long num, UBYTE opciones)
{
char* chars = "0123456789abcdef";
char* charsMayusc = "0123456789ABCDEF";
char *p, buf[32];
unsigned long x;
if (!(opciones & SIN_SIGNO) && num < 0){
outch ('-');
x = -num;
}else
x = num;
p = buf + sizeof (buf);
*--p = '\0';
do{
if(opciones & MAYUSC){
*--p = charsMayusc[x % base];
}else{
*--p = chars[x % base];
}
x /= base;
}while (x != 0);
output (p);
}
//----------------------------------------------------------------------------------
// void outNumDec(UINT base, double n, UINT dec, UBYTE opciones)
//
// Descripción:
// Imprime en el terminal el número 'n' con 'dec' cifras
// decimales en base 'base' con/sin signo y en mayúsculas/minúsculas.
//
// NOTA: El redondeo siempre es hacia abajo en la última cifra
//
// Autor: Javier Guillén Álvarez
//----------------------------------------------------------------------------------
// ALIAS para cuando no se especifican opciones
void outNumDec(UINT base, double n, UINT dec, UBYTE opciones)
{
// Imprime la parte entera
outNum(base, (int)n, opciones);
if(dec != 0){
double dDecimal = n - (int)n;
// Multiplica la parte decimal por 10^dec
while(dec--){
dDecimal *= 10;
}
// Imprime la marca de decimal
outch('.');
// Imprime 'dec' decimales
outNum(base, (int)dDecimal, opciones);
}
}
//------------------------------------------------------------------------------
// INLINE void output(char *start)
//
// Descripción: imprime un texto en la pantalla del PC
// Entrada: char *start, texto que imprimir, terminado en 0
// Salida: void
// Devuelve: void
//------------------------------------------------------------------------------
INLINE void output(char *start)
{
if (start!=0){
int i=0;
for (i=0; start[i]!=0; i++){
outch(start[i]);
}
}
}
//------------------------------------------------------------------------------
// INLINE void retardo(UINT microsegundos)
//
// Descripción: Introduce un retardo de los microsegundos indicados aproximadamente
//
// NOTA: La fórmula de cálculo de 'ret' proporciona un error de +-5% si
// microsegundos >= 100. El error aumenta para tiempos menores.
//
// Autor: Javier Guillén Álvarez
//------------------------------------------------------------------------------
INLINE void retardo(UINT microsegundos)
{
UINT ret = (44 * microsegundos - 32)/16;
while(ret--);
}
//------------------------------------------------------------------------------
// INLINE LONG _strlen(char *st)
//
// Descripción: Calcula la longitud de una cadena de char terminada en 0
// Entrada: char *st, puntero a la cadena de texto que medir (acabada en 0)
// Salida: void
// Devuelve: LONG, número de caracteres de la cadena (sin contar el 0 final)
//------------------------------------------------------------------------------
INLINE LONG _strlen(char *st)
{
LONG len = 0;
char *pt = st;
while (*pt++) len++;
return len;
}
#endif