SHARP PC-G820.
Leng | Año | Gráf. | Medidas | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Z80 | 3,54Mhz | BASIC, CASL, ASM | 1996 | 8 K | 6,8 K | 4x24 | No | No | No | No | 362 gr | 215x103x21 | 4xAA |
B *42 | B *121 | B *224s ASM *18s | XX | 70 € | 95 € | 150 € | Bajo coste, derivada de G801<E200 |
- Características
- Programacion CASL
- Referencia CASL
- Programación en Ensamblador
- Rutinas Sistema ASM
- Monitor ASM
Tras ese comando, aparecerá la pantalla:
***** ASSEMBLER ***** user area=NOT RESERVEDwork area=29794bytes < Asm Display Print > |
Es una calculadora programable en BASIC bastante potente gracias al procesador compatible Z80.
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 4 modos principales, además del de calculadora científica: BASIC, Editor de Textos, CASL y Lenguaje ensamblador(oculto).
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 Ensamblador.
Tiene además, como se ha comentado dos modos para poder programar en CASL y el ya citado oculto 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 CASL (SHIFT + TEXT) o mediante el comando CALL #5, &HC000 introducido en modo programa, respectivamente.
En cuanto a la memoria, de fábrica trae 8 K, de los que sólo hay disponibles 6,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.
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-G820, 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 G820 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:
object:0100H-011CH |
10 CLS |
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,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 |
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 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.