SHARP PC-G801.

Leng Año
Disp.
Exp.
Gráf.
Medidas
Z80 3,54Mhz BASIC, CASL, ASM 1988 8 K 5,8 K 4x24 No No No No 312 gr 215x100x18 4xAA
Resg.
Valor 1
Valor 2
Valor 3
I. Rareza
Observaciones
B *42 B *121 B *224s ASM *18s XX 50 € 70 € 150 € Derivada de la E200

La SHARP PC-G801 es una calculadora que se deriva Sharp PC-E200. Sólo trae de fábrica BASIC y CASL; y desgraciadamente no se puede activar el ensamblador en modo oculto como se puede hacee en la G820, si desde el modo programa de BASIC se introduce CALL #5, &HC000. No obstante no se ha perdido todo, ya que trae un completo MONITOR de lenguaje máquina como la G820, y si importamos programas en código máquina a través del comando R que hayan sido programados y compilados en cualquiera de las calculadoras Sharp de esta gama (como por ejemplo la G820/G850V, etc), funcionará a la perfección, ya que ejecutará el código sin problemas, y ejecutará las rutinas ASM del sistema, que se mantienen en todas estas máquinas, incluida la E200.

Es una buena noticia que se pueda programar en código ensamblador Z80, un procesador tan extendido y fácil/agradecido/potente de programar. Es una calculadora programable en BASIC bastante potente gracias al procesador compatible Z80 que monta.

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, en esta página intentaremos llenar esas lagunas. En cuanto al manual, serviría el de la E200, si no fuera porque esas máquinas sólo se comercializaron en Alemania, y por tanto los manuales que se pueden encontrar en Internet están en alemán.

En cuanto a su empleo, tiene 3 modos principales, además del de calculadora científica: BASIC, Editor de Textos y CASL.
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 CASL.
Los programas CASL 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 CASL (SHIFT + TEXT).


En cuanto a la memoria, de fábrica trae 8 K, de los que sólo hay disponibles 5,8. La pantalla es de 4 líneas de 24 caracteres, no disponiendo de modo gráfico. De hecho los píxeles son discontinuos, agrupados en bloques de caracteres de 7x5 píxeles. El teclado es adecuado y cómodo, con un formato QWERTY. El cuanto a tamaño y peso, es acertado; aunque un poquito grande. Es una máquina portable con una buena capacidad, aceptable pantalla y buena potencia proporcionada por el procesador Z80.


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.
La estructura general de un programa CASL es parecida a la de uno en ensamblador. Como muestra, el típico programa "¡Hola Mundo!" sería así:

CODIGO CASL "¡Hola Mundo!":
---------------
10 ;Programa Hola Mundo.
20MUNDO START
30 OUT MENS,LONG
40 RET
50MENS DC '¡Hola Mundo!'
60LONG DC 12
70 END
Comentarios:
---------------
Línea de comentario.
Comienzo del programa llamado "MUNDO".
Imprimimos en pantalla el mensaje que hay en MENS con la longitud LONG.
Finaliza el programa y vuelve al control principal.
Etiqueta MENS donde se almacena el mensaje a presentar en pantalla.
Longitud del mensaje.
Fin del programa. No hay más código.

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.

Como ya hemos comentado, no dispone de compilador en ensamblador de Z80, ni siquiera en modo oculto. Para ejecutar programas en código máquina ya compilados se deben programar y compilar en otra máquina equivalente que sí disponga de ensamblador como la G820(modo oculto, ver su página), y luego transferirlos desde la máquina con ensamblador mediante el MONITOR con el comando W (ejemplo W0100-02FF para transferir un programa compilado desde la posición de memoria 0100 hasta 02FF), y en la G801 recibir el programa con el comando R (ejemplo R0100).
Antes de recibir el programa en código máquina hay que reservar el área de memoria en el MONITOR de la siguiente manera: En BASIC teclear MON y [ENTER]
a continuación USER 300 [ENTER]
Con esto habremos reservado un área de memoria de 300 bytes. Hay que tener cuidado ya que se debe reservar el área de memoria suficiente para albergar el programa que deseamos ejecutar, de otro modo, correremos el riego de que el sistema se cuelgue.
A continuación mostramos una serie de rutinas muy útiles. El primer grupo son rutinas de la propia ROM de la G801 que podemos aprovechar para ahorrarnos mucha programación, el segundo son una serie de rutinas útiles en ASM de programación genérica que también nos servirán de ayuda. Para programar el "contador simple" de nuestro test de rendimiento 3, hemos echado mano de ambos grupos (ver programa completo en página de rendimiento Test 3).
El auténtico rendimiento a estas rutinas se le sacará desde otra máquina que se pueda programar en ensamblador, no obstante, si queremos probar alguna, podemos hacerlo desde el MONITOR con el Comando Gdirección, como por ejemplo GBD03, que muestra el estado de todos los registros de la máquina.
Nombre rutina Dirección HEX. Descripción Registros a cargar Devuelve
Rutinas de la ROM de la Sharp PC-G850V
PRINT 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,96
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 CAL 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
Tabla de correspondencia de pulsación de teclas:

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
El ordenador personal Sharp PC-G801 tiene extraordinarias y potentes herramientas que no llegaron casi a tener ninguna de las otras marcas. Además de 2 lenguajes de programación BASIC y CASL , también dispone de otras potentes herramientas científicas o de programación.

Una de estas herramientas 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. Para ver todas las posibilidades del monitor, ver la descripción que hacemos de él en la máquina G850V, si bien aquella tiene una pantalla de 6 líneas en vez de 4, las funcionalidades son las mismas.

Se accede al monitor tecleando el comando MON y [ENTER] desde el modo ejecución 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.

los principales comandos que conocemos son:
  • USER 300 [ENTER]. Reserva espacio de memoria para los programas en ensamblador. Si no lo reservamos, al entrar en el ensamblador nos dará un error.
  • G"Dirección de memoria en HEX". 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.
  • D. Muestra el contenido de memoria en tres bloques de datos. En el primero se muestran las direcciones de memoria en HEX, en el segundo el contenido hexadecimal de la memoria, y en el tercero su representación en caracteres.