SHARP PC G850V.
Leng | Año | Gráf. | Medidas | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Z80 | 8Mhz | BASIC, C, ASM | 2001 | 32 K | 30,1 K | 6x24 | 48x144 | No | No | No | 260 gr | 196x95x20 | 4xAA | EN JAP EN |
B *106 | B *303 | B *105s C *31s ASM *10s | XX | 90 € | 135 € | 200 € | Modelo destacado |
- Características
- Programacion C
- Referencia C
- Programacion CASL
- Referencia CASL
- Progr. Ensamblador ASM
- Rutinas Sistema ASM
- Monitor ASM
- Comunicaciones
Desgraciadamente, es una de tantas calculadoras que sólo se puso a la venta en Japón, y por tanto no hay casi bibliografía o documentación ni siquiera en Internet. No obstante con la documentación que aportaremos en esta página, más el documento PDF que hemos puesto como manual, se podrán aprovechar casi al máximo esta máquina. La recomendamos, ya que es una maravilla de la evolución de este tipo de ordenadores personales. También de dispone de la traducción particular del apéndice A, que trata en detalle las comunicaciones del puerto interfaz de 11 pines, que se puede encontrar pulsando aquí.
En cuanto a su empleo, tiene 4 modos principales, además del de calculadora científica: BASIC, Editor de Textos, C y Lenguaje ensamblador.
Para trabajar en BASIC basta con pulsar la tecla BASIC para entrar en el modo de programa "PROGRAM MODE" y ya está lista para que introduzcamos el programa BASIC que deseemos. Una vez terminemos, si volvemos a pulsar "BASIC" se pondrá en el modo de ejecución "RUN MODE" y tras introducir RUN y ENTER, se ejecutará el programa. El editor BASIC es independiente del editor de textos, y podremos salvar y cargar los programas en el sistema de archivo directamente desde el MODO de Programa con SAVE y LOAD.
En el MODO editor de textos, podremos editar ficheros de texto, así como los programas que introduzcamos en C, o Ensamblador.
Tiene además, como se ha comentado dos modos para poder programar en C y ensamblador "ASM". Los programas se introducen a través del editor de textos, y se ejecutan a través de los menús específicos a los que se accede tras pulsar las teclas C (SHIFT + TEXT) o ASMBL (SHIFT + BASIC) respectivamente.
La programación en BASIC y C es relativamente parecida (salvando las distancias), pero en la ejecución la calculadora se convierte en dos máquinas distintas, ya que el rendimiento en C es muy superior al BASIC.
En cuanto a la memoria, de fábrica trae 32 K, que junto con el sistema de archivos permite almacenar unos cuantos programas. La pantalla es una maravilla, siendo una de sus principales características,con 6 líneas de 24 caracteres mostrándose muy nítida. Pocas calculadoras tienen esa nitidez de pantalla. El teclado es adecuado y cómodo, con un formato QWERTY. El cuanto a tamaño y peso, es bastante acertado; habiéndose reducido el que presentan modelos anteriores como puede ser la G820. Es una máquina muy portable con una extraordinaria capacidad, buena pantalla y excelente potencia proporcionada por el procesador Z80.
Es un ordenador personal muy conseguido que tristemente marca el fin de una época en la que se da paso a otro tipo de aparatos como fueron las PDA,s. y porsteriormente los teléfonos inteligentes.
En las otras pestañas del cuerpo principal de esta página encontrarás como sacarle partido.
Características no documentadas y trucos.
Mediante el siguiente comando, "OUT &H69,6", la calculadora entrará en un modo de TEST de todos los sistemas. ¡CUIDADO! porque se borrarán todos los datos.
Programación en C.
Para la programación en C, veamos a través de unos pequeños pasos,
como le podremos sacar partido. Para ver la lista completa de comandos C que soporta la calculadora, presionar sobre la pestaña "Referencia C".
*** TEXT EDITOR ***
Edit Del PrintSio File Basic Rfile |
Para empezar a introducir el programa, pulsamos "E" de "Edit". Nos aparecerá la esta pantalla:
< |
Para escribir, editar o corregir, se puede mover fácilmente por la pantalla a través de las teclas del cursor que hay abajo, al lado derecho del teclado.
Introducimos el siguiente programa de prueba de la izquierda (el segundo es otro ejemplo de un contador simple para que se vea otro programa un poco más complicado, pero en este primer ejemplo, nos centramos en el de la izquierda):
10 main() |
10 main() |
2.- Una vez que hayamos terminado de introducir el programa, pulsamos la tecla "TEXT" de nuevo, luego "F" de File, y en la pantalla
<< PROGRAM FILE >>
Save Load Kill
File |
Pulsamos "S" de "Save" para salvar el programa en memoria. Nos pedirá el nombre que queremos darle al programa, así que introducimos "pruebac". Y ya está, ya hemos introducido nuestro primer programa y lo hemos salvado con el nombre "pruebac".
3.- Ahora vamos a ejecutarlo. Para ello, pulsamos las teclas "SHIFT" + "C". "C" es la tecla "TEXT" que en combinación con SHIFT abre el compilador. Nos aparecerá la pantalla:
*** C ***
Complile Trace Go Stdout |
Primero compilamos pulsando "C" de "Compile". Atención, se compilará el programa que tenemos en el editor en ese momento. Como lo acabamos de introducir no habrá problema, perosi no fiera así, en el menú "TEXT", deberemos ir a "LOAD", cargar el programa que queramos ejecutar e ir al compilador.
4.- Tras haberlo compilado, no tenemos más que ejecutarlo, en ese mismo menú del compilador pulsando la tecla "G" de "Go", y se ejecutará nuestro programa.
void abort(void);
int abs(int x);
double acos(double x);
double acosh(double x);
void angle(unsigned n);
double asin(double x);
double asinh(double x);
double atan(double x);
double atanh(double x);
void breakpt(void);
void *calloc(unsigned n, unsigned size);
int circle(int x, int y, int r, double s-angle, double e-angle, double ratio, int reverse, unsigned short kind);
void clearerr(FILE * stream);
void clrscr(void);
double cos(double x);
double cosh(double x);
void exit(int status);
double exp(double x);
int fclose(FILE *stream);
int feof(FILE *stream);
int fflush(FILE * stream);
int fgetc(FILE *stream);
char *fgets(char *, int n, FILE *stream);
unsigned long flof(FILE *stream);
FILE *fopen(char *path, char *type);
int fprintf(FILE * stream, const char * format [, arg, …]);
int fputc(int c, FILE * stream);
int fputs(const char *s, FILE *stream);
void free(void *ptr);
int fscanf(FILE * stream, const char * format [, address, …]);
int gcursor(int x, int y);
int getc(FILE *stream);
int getch(void);
int getchar(void);
char *gets(char * s);
void gotoxy(unsigned x, unsigned y);
int gprint(char *image);
int isalnum(int c);
int isalpha(int c);
int iscntrl(int c);
int isdigit(int c);
int isgraph(int c);
int islower(int c);
int isprint(int c);
int ispunct(int c);
int isspace(int c);
int isupper(int c);
int isxdigit(int c);
int kbhit(void);
int line(int x1, int y1, int x2, int y2, int reverse, unsigned short mask, int rectangle);
double log(double x);
double log20(double x);
void *malloc(unsigned size);
int miniget(void);
void miniput(char byte);
int paint(int x, int y, unsigned short kind);
int pioget(void);
void pioput(char byte);
void pioset(char byte);
int point(int x, int y);
double pow(double x, double y);
int preset(int x, int y);
int printf(const char * format [, arg, …]);
int pset(int x, int y, int reverse);
int putc(int c, FILE * stream);
int putchar(int c);
int puts(const char *s);
int scanf(const char * format [, address, …]);
double sin(double x);
double sinh(double x);
int sprintf(char * s, const char * format [, arg, …]);
double sqrt(double x);
int sscanf(char * s, const char * format [, address, …]);
char *strcat(char * s1, const char *s2);
char *strchr(const char *s, int c);
int strcmp(const char *s1, const char *s2);
char *strcpy(const char *s1, const char *s2);
int strlen(const char *string);
double tan(double x);
double tanh(double x);
int tolower(int c);
int toupper(int c);
Programación en CASL.
El problema de la enseñanza de código de máquina (o su versión nemónica
Ensamblador) es que al estar tan directamente relacionado con los
rescursos de la máquina, y ejecutar directamente las instrucciones del
procesador, si hay un error de programación, es muy frecuente que la
máquina se cuelgue y no se pueda volver a controlar. Llegando en casos
extremos a incluso perderse todo el contenido y teniendo como única
solución el reseteo del ordenador y consiguiente borrado. Es normal que
mientras se está desarrollando un programa, se equivoque alguna
dirección del código, o no se prevea el final de un bucle, con lo que
el programa se descontrola o se entra en un bucle sin fin del cual no
se puede salir.
Para evitar esto, y crear un ambiente seguro y amigable para los
alumnos japoneses, el Ministerio de Educación Japonés llegó a un
acuerdo con las empresas electronicas del país (CASIO, SHARP, etc) por
el cual se desarrollaba un estándar educativo llamado CASL mediante el
cual se creaba un lenguaje de programación parecido al ensamblador, que
corriera en una máquina virtual segura, de tal manera que si había
fallos, se detectaban bien en el ensamblaje o se bloqueaban los efectos
nocivos en ejecución.
De esta manera nace el lenguaje CASL, que corre en una máquina virtual
llamada COMET. "COMET Assembly Specification Language". Es un pseudo
lenguage ensamblador no relacionado con ninguna máquina o procesador en
particular.
Características
principales.
- La máquina virtual COMET simula un ordenador de 16 bits que dispone de una memoria con direcciones que van desde 0 hasta 65535.
- El tamaño de la palabra (word) es de 16 bits, es decir puede almacenar números de 0 a 66536 o negativos en notación de complemento a 2 de -32767 a +32768.
- Las etiquetas son convertidas a direcciones durante el Ensamblado.
- Valores: 12 (valor decimal), #100 (valor hexadecimal=256 decimal).
- Todos los registros del procesador virtual son de 16 bits, excepto FR.
- Dispone de 4 registros generales para empleo en la programación: GR0, GR1, GR2 y GR3.
- Hay un registro GR4 que se encarga de almacenar la dirección de la pila del sistema (stack).
- Hay un registro PC que almacena la dirección de ejecución actual del programa.
- Hay un registro de flags FR de 2 bits, que almacena los flags del sistema para desbordamientos o para indicar los resultados de almacenamiento o aritméticos. Contiene 10 si el resultado es negativo, 00 si es positivo, ó 01 si es cero.
- Hay dos registros más para control de la ejecución y depuración: BP para pausa, y BC para BREAK.
CODIGO CASL "¡Hola Mundo!": |
Comentarios: |
En las calculadoras Sharp de la serie G800, el programa se introduce en el editor de textos.
- Cada línea va numerada.
- Las etiquetas como "MUNDO", "MENS" o "LONG" van a continuación del número de línea, sin espacio intermedio.
- Las Directivas del lenguaje o las instrucciones como START, RET, END, OUT, LD...., van después del número de línea, o etiqueta con un espacio.
- Los comentarios se introducen en una línea después de la directiva ";". (línea 10).
- Como se observa en el ejemplo, un programa comienza con una
directiva START, y finaliza con END. Si la última línea no es END da error "OTHER ERROR".
Referencia CASL.
Directiva o instrucción | Explicación |
---|---|
DIRECTIVAS de la máquina virtual COMET | |
START |
Marca el inicio del programa. Ejemplo: 10 START o 10NOMBREPROG START |
END |
Marca el final del código del programa CASL. Es obligatorio
ponerlo; si no, el ensamblador dará el error OTHER ERROR. |
EXIT |
Abandona la ejecución del programa y devuelve el control al
sistema operativo del ordenador de bolsillo. |
IN BUFFER, LONG |
Entrada de caracteres desde el teclado. Al ejecutarse,
almacenará el número de caracteres que se vayan pulsando marcado en
LONG, a partir de la dirección especificada en BUFFER. Ejemplo: 10 START 20 IN BUFFER,LONG 25 EXIT 30BUFFER DS 4 ; inicialmente contendrá 4 ceros consecutivos 40LONG DC 4 50 END |
OUT TEXTO, LONG |
Presentará en pantalla el texto contenido a partir de la
dirección TEXTO. El número de caracteres de texto viene marcado por
LONG. Ejemplo: 10 START 20 OUT TEXTO,LONG 25 EXIT 30TEXTO DC 'Hola' 40LONG DC 4 50 END |
WRITE |
Imprime en pantalla el contenido de los registros y espera la
pulsación de una tecla. Muy útil para depuración del programa. |
DC 'A' |
Definición de una constante. Reserva espacio de memoria y
asigna los datos. Ejemplo: 100A DC 'A' ;Almacena en la direccion establecida por la etiqueta A, el valor A 110TEXTO DC 'HOLA' ; Almacena en la dirección establecida por la etiqueta TEXTO, 4 caracteres que forman la palabra "HOLA". Ocupa 4 direcciones consecutivas. |
DS 5 |
Reserva un número de direcciones consecutivas de memoria
para utilizar como almacenamiento. Ejemplo: 100ALM DS 5 ; Reserva a partir de la dirección establecida por la etiqueta ALM, 5 direcciones de memoria. |
INSTRUCCIONES del lenguaje Ensamblador CASL | |
LEA GRx, valor |
Carga el registro especificado con el valor asignado. (valor
puede ser una dirección). Es una carga directa de un valor en el
registro especificado. Ejemplo: LD GR1,#380. (GR1=#380 hexadecimal o GR1=896 decimal) |
ST GRx, dir | Almacena el contenido del registro especificado en la
dirección marcada. Ejemplo: ST GR1,#1006. (El contenido de GR1 se guarda en la dirección #1006. Si GR1 contenía #40, la dirección #1006 ahora contiene #40. |
LD GRx, dir | El contenido de la dirección marcada se carga en el registro
especificado. Ejemplo: LD GR1,#1006. |
ADD GRx,dir |
Suma el contenido almacenado en el registro GRx con el
contenido de la dirección dir, y la suma es depositada en GRx. El
registro FR de flags refleja el resultado: 10 si el resultado es
negativo, 00 si es positivo, ó 01 si es cero (todo ello en binario, o
2,0,1 en decimal). Ejemplo: 10 START 20 LD GR0,A ; carga GR0 con el contenido de la direccion de la etiqueta A. La carga directa del registro podría ser LEA GR0,3 30 ADD GR0,B ; suma el contenido de GR0 que es 3 al contenido de la dirección B que es 7, depositando la suma 10 en GR0. GR0=10. 40 EXIT 50A DC 3 60B DC 7 70 END |
SUB GRx,dir |
Resta el contenido almacenado en la dirección dir al
contenido del registro GRx, y la resta es depositada en GRx. El
registro FR de flags
refleja el resultado. Ejemplo: 10 START 20 LD GR0,A ; carga GR0 con el contenido de la direccion de la etiqueta A. La carga directa del registro podría ser LEA GR0,11 ó LEA GR0,#B. 30 SUB GR0,B ; le resta el contenido de GR0 que es 11 al contenido de la dirección B que es 6, depositando la suma 5 en GR0. GR0=5. 40 EXIT 50A DC 11 60B DC 6 70 END |
AND GRx,dir |
Realiza el AND lógico entre el contenido del registro
especificado y el valor contenido en la dirección dir y lo deposita en
el registro. El registro de flags FR se modifica de acuerdo al
resultado. Ejemplo: 10 START 20 LD GR0,A ; carga GR0 con el contenido de la direccion de la etiqueta A. La carga directa del registro podría ser LEA GR0,19 ó LEA GR0,#13. 30 AND GR0,B ; Realiza el AND lógico del contenido de GR0 que es 19 con el contenido de la dirección B que es 3, depositandolo en GR0. GR0=3. 40 EXIT 50A DC 19 60B DC 3 70 END |
OR GRx,dir |
Realiza el OR lógico entre el contenido del registro
especificado y el
valor contenido en la dirección dir y lo deposita en el registro. El
registro de flags FR se modifica de acuerdo al resultado. Ejemplo: 10 START 20 LD GR0,A ; carga GR0 con el contenido de la direccion de la etiqueta A. La carga directa del registro podría ser LEA GR0,19 ó LEA GR0,#13. 30 OR GR0,B ; Realiza el OR lógico del contenido de GR0 que es 19 con el contenido de la dirección B que es 3, depositandolo en GR0. GR0=23 ó GR0=#17. 40 EXIT 50A DC 19 60B DC 6 70 END |
EOR GRx,dir | Realiza el XOR lógico entre el contenido del registro
especificado y el
valor contenido en la dirección dir y lo deposita en el registro. El
registro de flags FR se modifica de acuerdo al resultado. Ejemplo: 10 START 20 LD GR0,A ; carga GR0 con el contenido de la direccion de la etiqueta A. La carga directa del registro podría ser LEA GR0,19 ó LEA GR0,#13. 30 EOR GR0,B ; Realiza el OR lógico del contenido de GR0 que es 19 con el contenido de la dirección B que es 3, depositandolo en GR0. GR0=21 ó GR0=#15. 40 EXIT 50A DC 19 60B DC 6 70 END |
CPA GRx,dir | Compara aritméticamente (con signo) el contenido del
registro
especificado con el contenido de la dirección dir, y modifica el
registro de flags FR, de acuerdo al resultado. |
CPL GRx,dir | Compara LÓGICAMENTE (sin signo) el contenido del registro
especificado con el contenido de la dirección dir, y modifica el
registro de flags FR, de acuerdo al resultado. |
SLA GRx,dir | Traslado hacia la izquierda de tantos bits como los
establecidos en el valor de la dirección, a excepción del bit de signo.
Los lugares de la derecha nuevos son rellenados con ceros.El
registro de flags FR se modifica de acuerdo al resultado. Ejemplo: 10 START 20 LD GR0,A ; carga GR0 con el contenido de la direccion de la etiqueta A. GR0=19=00010011 30 SLA GR0,2 ; Desplaza los bits 2 veces hacia la izquierda, rellenado con ceros los dos bits de la derecha. GR0=76=01001100 40 EXIT 50A DC 19 70 END |
SRA GRx,dir | Traslado hacia la derecha tantos bits, como los establecidos
en el valor de la dirección, a excepción del bit de signo. Los lugares
de la izquierda nuevos son rellenados el valor del bit de signo. El
registro de flags FR se modifica de acuerdo al resultado. Ejemplo: 10 START 20 LD GR0,A ; carga GR0 con el contenido de la direccion de la etiqueta A. GR0=19=00010011 30 SRA GR0,2 ; Desplaza los bits 2 veces hacia la derecha, rellenado con el bit de signo los dos bits de la derecha. GR0=4=00000100 40 EXIT 50A DC 19 70 END |
SLL GRx,dir | Traslado hacia la izquierda de tantos bits como los
establecidos en el
valor de la dirección. Los lugares de la
derecha nuevos son rellenados con ceros.El
registro de flags FR se modifica de acuerdo al resultado. |
SRL GRx,dir | Traslado hacia la derecha tantos bits, como los establecidos en el valor de la dirección. Los lugares de la izquierda nuevos son rellenados cero. El registro de flags FR se modifica de acuerdo al resultado. |
JPZ dir | Salta a la dirección indicada, si el valor del resgistro de
flags FR es cero(01) o positivo(00). |
JMI dir | Salta a la dirección indicada, si el valor del resgistro de flags FR es negativo (10). |
JNZ dir | Salta a la dirección indicada, si el valor del resgistro de flags FR no es cero (01). |
JZE dir | Salta a la dirección indicada, si el valor del resgistro de flags FR es cero (01). |
JMP dir | Salta a la dirección indicada de manera incondicional. |
PUSH 0,GRx | Almacena el valor del registro indicado en la pila. Modifica
el valor del registro GR4 o SP de la pila. |
POP GRx | Recupera el último valor almacenado en la pila y lo carga en el registro indicado. Modifica el valor del registro GR4 o SP de la pila. |
CALL dir | Llama a una rutina que comienza en la dirección dir. |
RET | Marca el final de una rutina, saliendo de ella y volviendo a
la dirección siguiente a la que fue llamada. |
Programación Ensamblador.
Para programar en Ensamblador directamente hay que seguir el suguiente esquema. Hay que tener en cuenta que siempre que se programa en ensamblador
se corre el riesgo de colgar totalmente el sistema y perder absolutamente todos los datos que contiene el ordenador, por lo que se recomienda muy
encarecidamente, hacer primero una copia de seguridad. Los japoneses resolvieron este problema creando el lenguaje CASL, que no deja de ser un
lenguaje muy parecido al ASM, pero en un ambiente protegido para evitar los cuelgues de la máquina. No obstante, el tema que nos ocupa es
el ensamblador de Z80 de la Sharp PC-G850V, así que vamos a ello:
Esquema de programación en ASM:
En BASIC teclear MON y [ENTER]
a continuación USER 300 [ENTER]
Ir al editor de textos pulsando la tecla "TEXT", luego la E de "Edit" e introducimos el programa en ASM (Ensamblador).
Hemos preprarado este sencillo programa que comentaremos:
Normalmente la potencia del código de máquina se complementa con llamadas a direcciones de rutinas propias del sistema. Esto es lo que vamos a hacer,
le diremos a la G850V que imprima la frase "MENSAJE DE PRUEBA" en la línea 3, columna 1. Para ello utilizaremos la rutina del sistema
llamada "PRINT" que está en la dirección -BFF1H-. Esta rutina imprime una cadena cuya longitud debemos cargar en el registro
B, la posición de la pantalla en el registro DE (x,y), y el inicio de la cadena a imprimir en el registro HL.
CODIGO ASM: |
Comentarios: |
Obtendremos esta pantalla:
Ahora volvemos a BASIC pulsando la tecla "BASIC" e introducimos un pequeño programa BASIC que llamará al código que hemos compilado y que se inicia en la dirección H100. Para ello tecleamos:
10 CLS |
*Nota: Si no queremos crear el programa BASIC podremos ejecutar el programa de dos formas: Desde BASIC tecleando "CALL &H100" o yendo al monitor de código máquina e introduciendo el comando "G0100".
Si no queremos escribir este programa BASIC, bastará teclear CALL &H100 y el código de máquina se ejecutará inmediatamente.
Llamada a la ROM del sistema muy útil.
Una interesantísima utilidad, sobre todo cuando estamos perdidos en la programación en ensamblador es colocar la siguiente llamada a la ROM en el punto conflictivo. "CALL 0BD03H", mostrará una pantalla con el contenido de todos los registros del procesador Z80 y esperará a que pulsemos una tecla.
Ejemplo completo. Prueba de rendimiento 3. Contador simple. Para terminar, vamos a programar en código de máquina uno de nuestros programas para medir el rendimiento de un aspecto de la máquina. Los test de rendimiento están descritos en esta página. En concreto, la prueba 3 es un simple contador que cuenta y muestra en pantalla los números del 1 al 10.000.
CODIGO ASM "Contador Simple": |
Comentarios: |
Nombre rutina | Dirección HEX. | Descripción | Registros a cargar | Devuelve | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Rutinas de la ROM de la Sharp PC-G850V | |||||||||||||||||
BFF1H | Imprime una cadena en la pantalla. | En B longitud cadena. DE posición (x,y). HL dirección de la cadena a imprimir. | En C número de veces que haya habido que hacer scroll. DE posición final. HL dirección final tras lectura. | ||||||||||||||
PUTCHR | BE62H | Imprime un carácter en la pantalla. | En A el carácter. DE posición (x,y). | ||||||||||||||
CONCHR | BFEEH | Imprime un carácter en la pantalla el número de veces definido en B. | En A el carácter. B número de veces a repetir el carácter. DE posición (x,y). | ||||||||||||||
INPUT | BE53H | Guarda la tecla pulsada en A sin esperar. | Código en A según tabla que hay más abajo de códigos de teclado. | ||||||||||||||
INPUT WAIT | BCFDH | Espera a que se pulse una tecla y guarda el código en A. | Código en A según tabla que hay más abajo de códigos de teclado. | ||||||||||||||
OFF | BD2DH | Apaga el Ordenador. | |||||||||||||||
BASIC DELETE | BCF1H | Borra el programa BASIC en el editor BASIC. | |||||||||||||||
TEXT DELETE | BCF7H | Borra lo que haya en el editor de texto. | |||||||||||||||
STAT MODE | BCBEH | Cambia la calculadora al MODO STAT. | |||||||||||||||
REG STATUS | BD03H | Muestra el estado de todos los registros del sistema y espera pulsación. | |||||||||||||||
Rutinas ASM nuevas. | |||||||||||||||||
CLS | Borrar pantalla. | No existe en la ROM, por lo que se muestra una rutina completa que se puede llamar como CALL CLS, modificando los números de línea para adaptarlo a nuestro programa | 210CLS: 220 XOR A 230 LD B,144 240 LD D,0 250 LD E,0 260 CALL 0BFEEH 270 RET |
||||||||||||||
NUM2DEC | Convierte un número de un registro a una cadena decimal. | En HL número a convertir. En DE la dirección de donde queremos que se almacene la cadena resultante (ejemplo, si HL contiene el número "689", a partir de la dirección que contenga DE se almacenará 30 30 36 38 39, que son los caracteres ASCII en hexadecimal de la cadena "00689". Notar que obviamente se necesitan reservar 5 bytes para almacenar el número, ya que el número máximo es 65535). | 1000NM2DEC: LD BC,-10000 1010 CALL NUM1 1015 LD BC,-1000 1018 CALL NUM1 1020 LD BC,-100 1030 CALL NUM1 1040 LD C,-10 1050 CALL NUM1 1060 LD C,B 1070NUM1: LD A,-1 1080NUM2: INC A 1090 ADD HL,BC 1100 JR C, NUM2 1120 SBC HL,BC 1125 ADD A,48 1130 LD (DE),A 1140 INC DE 1150 RET |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | OFF | Q | W | E | R | T | Y | U | A | S | D | F | G | H | J | |
1 | K | Z | X | C | V | B | N | M | , | BASIC | TEXT | CAPS | Cana | TAB | SPACE | ↓ |
2 | ↑ | ← | → | ANS | 0 | . | = | + | RETURN | L | ; | CONST | 1 | 2 | 3 | - |
3 | M + | I | O | INS | 4 | 5 | 6 | * | R-CM | P | BS | ∏ | 7 | 8 | 9 | / |
4 | ) | NPR | →DEG | √ | x2 | yx ^ | ( | 1 / x | MDF | 2ndF | sin | cos | ln | log | tan | F⇔E |
5 | CLS | ON |
- Hay que añadir 80H si se está presionando simultáneamente la tecla SHIFT. Ejemplo SHIFT + "B" da 95H.
- Si se presionan dos o más teclas se obtiene el código 52h
Una de ellas es el MONITOR de lenguaje máquina, que nos ayuda a hacer seguimiento del contenido de la memoria, y en general a programar en código de máquina ASM.
Se accede al monitor tecleando el comando MON y [ENTER] tanto desde el modo ejecución(RUN), como el de programa(PRO) de BASIC.
Una vez dentro nos aparece la frase "MACHINE LANGUAJE MONITOR" en la parte superior, y un prompt de sistema que es un asterisco "*", a partir de aquí acepta comandos. Con la memoria protegida por contrseña no se puede acceder al monitor.
Los principales comandos y aspectos a tener en cuenta son:
- Antes de nada, decir que todas las direcciones que se introduzcan se consideran en Hexadecimal. G100 será, "Ejecutar" a partir de &H100. Para introducir más de una dirección, éstas se separarán por comas ",". Ej. "*D0100, 01FF".
- El lenguaje de máquina (ASM) es un lenguaje de bajo nivel que tiene acceso a todos los recursos del sistema, y por tanto es muy potente. Por contra, y lógicamente, no existe ningún tipo de protección, por lo que debe tenerse en cuenta que la ejecución de cualquier programa en código de máquina no depurado, puede colgar la máquina de manera irrecuperable o borrar todos los datos. Tenga en cuenta esto, y haga antes las correspondientes copias de seguridad.
- USER 300 , USER300 ó USER0300 [ENTER]. Reserva espacio de memoria para los programas en ensamblador. Si no lo reservamos, al entrar en el ensamblador nos dará un error. A continuación mostrará un mensaje con el área reservada "FREE:0100-0300". Utilizado sin argumento, "USER" nos dará el mensaje de información del área reservada: "FREE:0100-0300" o "FREE:AREA NOT RESERVED" si no e hubiera reservado ninguna de antemano.
- S0100. Modifica el contenido de la memoria a partir de la dirección introducida. Muestra lo siguiente "0100:28-" donde "0100" es la dirección y "28" es su contendio actual. Podemos introducir un nuevo valor y darle a ENTER, en cuyo caso habremos cambiado el contenido, o darle símplemente a ENTER, y sin variar el contenido irá a la siguiente dirección de memoria. Los datos están en HEXADECIMAL: "28" es &H28 que es 40 decimal.
- G0100. Ejecuta un programa en código de máquina iniciándolo en la dirección introducida. (sin espacios). Como ejemplo, para llamar a los programas normalmente será G100 ó G0100. Tiene el efecto del mandato GOSUB de BASIC, es decir, ejecutará el código de máquina desde la dirección que introduzcamos hasta que encuentre una instrucción RET de código de máquina. Si no hay una instrucción RET el programa seguirá con resultados impredecibles.
- GBD03. Ponemos esta llamada especial a una función de la ROM por ser muy útil. Muestra el estado actual de todos los registros del procesador. Para salir y volver al prompt del monitor pulse BREAK(ON).
- D, D0200. Muestra el contenido de la memoria en tres columnas de datos. En la primera expone las direcciones de memoria en formato HEXADECIMAL, en la segunda el contenido HEXADECIMAL de la memoria, y en la tercera su representación en caracteres (los caracteres 00 a IF que no tienen representación se muestran como un punto "."). Si no se expecifica dirección como en "D", el volcado de memoria será desde la dirección 0100H. Se podrá ir moviendo por la memoria con las teclas del cursos arriba y abajo (↑ y ↓). Adicionalmente, debajo de la primera dirección de la columna de la izquierda, se muestra un número entre paréntesis (32), este número es el CHECKSUM de los 24 datos mostrados en la pantalla de la G850V, y nos servirá para detectar errores.
- P. Activa o desactiva el modo IMPRESORA e ilumina el cartel "PRINT" que hay en la esquina abajo-derecha de la pantalla. No tendrá ningún efecto si no hay ninguna impresora conectada a la máquina.
- BPD0110. Inserta un punto de parada de programa BREAKPOINT en la dirección marcada. Se pueden establecer
sólo cuatro breakpoints, si se introduce un quinto se borrará el primero. Se ha de tener cuidado en que la dirección
que se marque corresponda a una instrucción de código de máquina del programa, y no a un dato, ya que de esa manera
no se conseguiría la acción de control y análisis del código que se pretente. Si se introduce BP sin dirección,
se mostrarán los breapoints establecidos previamente.
Con BP0 se borrarán todos los breakpoints introducidos. Un breakpoint se invalida después de su ejecución, por tanto, si establecemos uno dentro de un bucle, sólo se ejecutará en la primera ocasión.
Nota: el contenido de la dirección cuando se ejecuta el breakpoint es reemplazado momentáneamente por F7H. Si se pulsa BREAK para salir, el contenido de esa dirección seguirá siendo F7 y deberá modificarlo manualmente para volver a recomponer su programa. - R. Recepción de datos por el puerto I/O (SIO). Se utiliza para trasnferir programas en código de máquina desde un PC. Si no se especifica dirección se cargará en la dirección contenida en los mismos datos transmitidos. Con R0100, los datos serán cargados a partir de 0100H.
- W0100,01FF. Transmisión de datos al puerto I/O (SIO). Se utiliza para trasnferir programas en código de máquina desde la Sharp a un PC u otro dispositivo. W0100,01FF transferirá el contenido desde 0100H (primera dirección), hasta 01FF (última dirección).
- Mensajes de error generados por el monitor.
Descripción | |
---|---|
SYNTAX ERROR | Comando con sintaxis incorrecta |
MEMORY ERROR | Se ha intentado asignar un área de código máquina fuera del rango permitido. Este error también se produce cuando hay almacenados muchos programas BASIC que reducen el rango de almacenamiento y se intenta asignar más memoria para código de máquina de la que queda disponible. |
I/O DEVICE ERROR | Error de transmisión o fallo en la operación de entrada/salida. |
OTHER ERROR | Otros errores. |
Antes de nada hay que tener en cuenta lo siguiente:
- La lógica estándar definida para la interfaz RS-232 Serie establece que las señales de datos (TXD y RXD) tienen lógica invertida, es decir, el 0 lo marca una señal positiva de +3 a 15V y el 1 lo marca una señal negativa de -3 a -15V. Para las señales de control, la lógica es inversa, es decir, el estado activo es positivo, y el inactivo negativo, igualmente en ese margen de voltaje. Las señales que van desde los -3V a los +3V no se consideran y se desprecian para evitar errores.
- Atención, porque la lógica del conector de 11 pins de Sharp, aunque sigue el estándar RS-232 tiene dos diferencias muy significativas: (1) Toda la lógica está invertida, es decir al revés del estántar RS 232, y (2) las señales van únicamente e el rango entre 0 y 5V.
- El pin 2 de la RS-232 RXD coincide con el pin 6 INVERTIDO de Sharp.
- El pin 3 de la RS-232 TXD coincide con el pin 7 INVERTIDO de Sharp.
- El pin 5 de la RS-232 SG (Masa o GND) coincide con el pin 3 de Sharp.
- El pin 7 de la RS-232 RTS coincide con el pin 9 INVERTIDO de Sharp.
- El pin 8 de la RS-232 CTS coincide con el pin 4 INVERTIDO de Sharp.
- El pin 4 de la RS-232 DTR coincide con el pin 5 INVERTIDO de Sharp.
- El pin 6 de la RS-232 DRS coincide con el pin 8 INVERTIDO de Sharp.
- Señales superiores a voltaje +6V podrían dañar las calculadoras Sharp, por lo que obviamente, hay que evitar el rango que va de +6 a +15V y -6 a -15V, es decir, no se puede conectar directamente una calculadora Sharp a una interfaz Serie directamente, so pena de que la podamos fundir.
Cómo comunicar la Sharp PC-G850 con otras máquinas Sharp de su Serie.
Las máquinas de la serie, y por tanto con las que se puede conectar por este método son: G801, G802, G803, G813, G815, G820, G830, G850, G850S, G850V, G850VS, E200, E220, E500 Y E500S.
Aquí las conexiones son muy sencillas, no necesitan soldaduras, y no tendremos los problemas de compatibilidad con la interfaz Serie RS-232 (de señales invertidas ni de voltaje máximo), ya que conectaremos dos máquinas que tienen el mismo interfaz de Sharp de 11 pines (paso 2,54'').
Primero veremos una descripción del connector estándar de Sharp en todas estas calculadoras, que fueron las últimas programables en BASIC de de Sharp. En la imagen se muestra la descripción del conector, que suele estar en la parte izquierda de las máquinas, describiéndolo de arriba a abajo (el pin 1 es el del lado de la pantalla, y el 11 el del teclado).
Para conectar dos calculadoras bastará hacer las siguientes conexiones.
Veamos las conexiones, hay que conectar los siguiente 5 cables (ver en la imagen de la derecha):
• El pin 3 MASA(GND)de una máquina, con el 3 de la otra.
• El pin 6 RXD de una, con el 7 TXD de la otra. Los cruzamos.
• El pin 7 TXD de una, con el 6 RXD de la otra. Los cruzamos.
• El pin 4 RTS de una, con el 9 CTS de la otra. Los cruzamos.
• El pin 9 CTS de una, con el 4 RTS de la otra. Los cruzamos.
Nosotros lo hemos probado entre una G850V y una G820, funcionando a la perfección. Hemos transmitido tanto programas BASIC, como programas en código de máquina, siendo compatibles en un grado muy elevado. La G820, a pesar de en teoría no tener ensamblador (ver G820 para activarlo), le hemos pasado el programa de test "Contador simple" y lo ha ejecutado a la perfección, quedando patente, que casi todas estas máquinas son incluso compatible a nivel de rutinas de la ROM.
En las imágenes de abajo, ampliables en caso necesario pulsando sobre ellas, se puede observar la conexión que se ha hecho entre ambas utilizando cables estándar tipo arduino o para montajes electrónicos muy fácilmente adquiribles en ebay, banggood o aliexpress a un precio muy barato. En nuestro caso, y para trabajar más cómodo, hemos empalmado un cable macho-macho con uno hembra-macho para alargarlos. Se puede observar como se mantiene el cable gris claro, que es el que hemos utilizado para la masa(GND), y como los otros se cruzan dos a dos.
Para tranferir ficheros de texto.
Puede ser texto, programas en C, CASL o en ensamblador, ya que todos ellos se gestionan con el editor de textos. Antes de nada, salvar los textos o programas que pudiera haber en el editor.
- Nos metemos en el editor de texto de ambas máquinas pulsando la tecla "TEXT".
- Cargamos en la Sharp 1, que es la que contiene el texto o programa a transmitir, el fichero en el editor, mediante la combinación de pasos "File" luego "Load" y cargamos el fichero deseado. (Evitar este paso si ya está en el editor)
- En ambas máquinas, y otra vez en el menú principal del editor, nos metemos en el menú SIO pulsando la S de "Sio"
- En la Sharp 1 EMISORA pulsamos S de "Save". Aparecerá en pantalla "--- SENDING ---".
- En la Sharp 2 RECEPTORA pulsamos L de "Load". Aparecerá en pantalla "--- RECEIVING ---".
- Una vez finalizada la transferencia, las pantallas volverán al menú << SIO >>. Eso indicará que ha finalizado la transferencia.
- Puede comprobar que en el editor de texto ya se ha transferido el texto o programa.
- Pudiera ser necesario modificar los parámetros de transmisión si se hubieran variado en las máquinas respecto a los que tiene por defecto después de un hardreset (1200 baudios, bits de datos=8, bit de parada=1, paridad=none, fin de línea=CR LF, fin de línea=1A, número de línea=yes). Para ello en el menú SIO pulsar "F" de format y comprobar que las dos máquinas tienen exactamente los mismos parámetros. Se aconseja dejar los que tienen por defecto y aumentar si se quiere únicamente la velocidad de transmisión de 1200 a 4800 (hay modelos que llegan a 9600, pero no todos), pero en ambos aparatos la misma.
Para tranferir programas BASIC.
Básicamente es igual, lo único que el programa BASIC se guarda en un editor especial al que se accede con la tecla BASIC, la cual alterna entre los modos ejecución y programa (RUN o PROGRAM), y por ello, hay que cargar el programa en el editor de TEXTOS normal y luego transferirlo como en el caso anterior. Antes de nada, salvar los textos o programas que pudiera haber en el editor.
- Nos metemos en el editor de texto de ambas máquinas pulsando la tecla "TEXT".
- En la Sharp 1, que es la que contiene el programa BASIC a transmitir, en el menú del editor de textos pulsamos la tecla B de "Basic" y a continuación la T de "Text←basic". Eso convertirá el programa en texto y lo cargará desde el editor BASIC al editor de TEXTOS. Desde aquí ya estamos igual que en caso anterior, por lo que continuamos con los mismos pasos.
- En ambas máquinas, y otra vez en el menú principal del editor, nos metemos en el menú SIO pulsando la S de "Sio"
- En la Sharp 1 EMISORA pulsamos S de "Save". Aparecerá en pantalla "--- SENDING ---".
- En la Sharp 2 RECEPTORA pulsamos L de "Load". Aparecerá en pantalla "--- RECEIVING ---".
- Una vez finalizada la transferencia, las pantallas volverán al menú << SIO >>. Eso indicará que ha finalizado la transferencia.
- Puede comprobar que en el editor de texto ya se ha transferido el texto o programa.
- Ahora, en la máquina Sharp 2 lo tenemos en el editor de TEXTOS, pero tenemos que pasarlo al de BASIC, para lo cual, en el menú de TEXTOS, pulsamos B de BASIC y de nuevo B de "Basic←text". Con esta orden, tendremos ya el programa BASIC en su editor específico y podemos ejecutarlo.
Cómo comunicar la Sharp PC-G850 con un ordenador PC.
Para las comunicaciones con un ordenador PC, hemos escogido un circuito muy barato, pero eficiente, el FT232RL que utiliza el chip de FTDI con EEPROM programable que es un interfaz de USB a TTL Serial. Se puede ver la imagen del circuito en la imagen de la izquierda. Se puede encontrar muy fácilemte en ebay, a un precio de 2 € si podéis esperar a que venga de China, o por 5 € si lo pedís a España, en cuyo caso llegará en 2 ó 3 días. Igual que en los casos anteriores necesitaremos sólo 5 cables tipo arduino, en este caso macho-hembra.
La placa FT232RL FTDI de la fotografía, que es la que recomendamos por su sencillez, capacidad de programación y posibilidades que ofrece, lleva un jumper para configurar las salidas de señal a 3,3V o a 5V. Lo dejamos como está, en la de 5V.
Como se comentó en la cabecera se este artículo, la lógica de señales de las Sharp es inversa, por lo que vamos a necesitar reprogramar la EEPROM del circuito y decirle que invierta las señales. Como acciones previas de configuración de nuestra placa:
- Descargamos el driver en http://www.ftdichip.com/Drivers/VCP.htm, escogiendo nuestro sistema operativo. Se ha probado en windows con el driver "CDM v2.12.10 WHQL Certified.exe"
- Una vez instalado, comprobamos el número de puerto serie que está emulando. Cuidado porque al enchufar la placa a diferentes puertos USB cambia el número de puerto serie COM4, COM5... Para comprobar el número de puerto, podemos utilizar esta pequeña utilidad industrologic.com/disk/utility/portfinder.exe, que nos dirá el puerto nuevo que acabamos de instalar (lo identificamos porque el fabricante "Manufacturer:FTDI". En el caso de la imagen e la derecha se ha instalado el puerto COM5).
- Una vez instalado el puerto, vamos a reprogramar la EEPROM de la placa para que genere las señales en lógica inversa (desgraciadamente esto hará que no podamos utilizar el circuito más que con las calculadoras Sharp. De todas formas esto no debe ser una preocupación ya que puede reprogramar las veces que se necesite el chip). Para ello instalamos el programa de reprogramación del mismo fabricante FT_PROG que se puede encontrar en http://www.ftdichip.com/Support/Utilities.htm. Lo descargamos y lo instalamos.
- Abrimos FT_PROG, le damos al icono de la lupa del menú "scan and parse" y aparecerá nuestro puerto serie. Pulsamos en las rama del árbol de la izquierda "hardware Specific" y luego en "Invert RS232 Signals" y rellenamos todas las casillas de inversión de la señales. Debe quedar como en la imagen de la derecha. Si no se es experto recomendamos no tocar nada más y le damos al icono del rayo "Program Devices", y ya está, ya lo hemos terminado de configurar.
- Cerramos todos los programas, desenchufamos la plaquita, y la volvemos a enchufar. Ya debe estar programada, configurada y lista para la comunicación con nuestras Sharp.
Ahora vamos a ver como nos comunicamos y transferimos programas entre las Sharp y el PC. Necesitamos un programa de comunicaciones de puerto serie. Como Windows ha dejado de tener en el sistema operativo el Hyperterminal, recomendamos dos programas muy sencillitos y que ocupan muy poco. EL primero es Term232 que se puede encontrar en http://industrologic.com/resource.htm#software, y el segundo es Putty que se puede encontrar en http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html.
Para transferir programas del ordenador hay que seguir los siguientes pasos:
- Abrimos el programa de comunicaciones. En este caso se ha utilizado Term232 por ser más configurable.
- Pulsamos el icono de la mano señalando el puerto RS232 de 9 pines para configurar los parámetros (señalado con un círculo rojo en la imagen inferior). Ponemos el puerto sobre el que se haya instalado nuestro circuito USD<>RS232 y podemos dejar los demás parámetros como están, ya que la opción por defecto coincide con la de las calculadoras Sharp. El único que se recomienda cambiar, además del puerto, es el de la velocidad. En el caso de la PC-G850V, ésta puede llegar hasta los 9600 baudios (ver imagen inferior con la pantalla de configuración).
- Si no lo hemos hecho antes, comprobamos los parámetros de transmisión de la Sharp. Recordamos que tiene por defecto después de un hardreset (1200 baudios, bits de datos=8, bit de parada=1, paridad=none, fin de línea=CR LF, fin de línea=1A, número de línea=yes). Para ello, ir al menú TEXT pulsado la tecla TEXT, luego para ir al menú SIO pulsar "S", y lurgo pulsar "F" de format y comprobar que tienen los mismos parámetros que hemos puesto en Term232 (Si no se ha modificado ninguno, tanto Term232 como las Sharp los tienen iguales). Se aconseja dejar los que tienen por defecto y aumentar si se quiere únicamente la velocidad de transmisión hasta los 9600 baudios.
- Para enviar un fichero del PC a la calculadora este debe estar en formato texto plano, en la Sharp pulsamos la tecla TEXT para entrar en el menú del editor de textos, luego "S" para entrar en el mení SIO, y L de "Load". En la calculadora aparecerá una pantalla con "--- RECEIVING ---" y se quedará a la espera de recibir datos. Vamos a Term232 y pulsamos el icono de la carpeta amarilla con la flecha hacia arriba (señalada en la imagen), cargamos en el menú de selección de ficheros el programa o texto que queremos transferir y ya está. Veremos como parpadea una luz en la placa hasta que finaliza la transferencia. Es posible que no se quite la pantalla de "--- RECEIVING ---" de manera automática. En ese caso, damos a la tecla BREAK(ON), y nos volvemos a meter en el editor con la tecla TEXT, si activamos la edición con la tecla "E" comprobaremos que el programa se ha transferido sin problemas. Si hemos transferido un programa BASIC, todavía tenemos que pasarlo al editor BASIC, para lo cual, en el menú de TEXTOS, pulsamos B de BASIC y de nuevo B de "Basic←text". Con esta orden, tendremos ya el programa BASIC en su editor específico y podemos ejecutarlo.
- Para enviar un fichero de la calculadora al PC, en Term232 pulsamos el icono de la carpeta amarilla con la flecha hacia abajo. Se abrirá una ventana para que demos el nombre del fichero al que queremos que se transfiera y donde podremos navegar hasta la carpeta en la que se almacenará. El Term232 se quedará a la espera de recibir datos. Vamos a la Sharp, tecla TEXT para ir al menú del Editor, Tecla S para ir a menú SIO y de nuevo tecla S de "Save". Veremos qcomo el texto del fichero va apareciendo en la venta de Term232 y a la vez se irá guardando en el fichero que le hayamos dicho. Una vez finalizada la transferencia volvemos a pulsar sobre el icono de la carpeta amarilla con la flecha hacia abajo para cerrarlo.