Anda di halaman 1dari 83

INTRODUCCIN

Alquimista 1997. Esta es una recopilacin de la informacin recogida durante varios aos basada en un estudio ms o menos profundo de la calculadora CASIO FX-850P. Algunos captulos han sido proporcionados de manera desinteresada por terceras personas. Otros han sido completados en menor o mayor parte. Gracias a todos ellos. Todava pueden existir muchas ms funciones ocultas de la calculadora. Aqu se han intentado ver la mayora de ellas (puede que todas). No obstante el estudio de esta gua puede abrir nuevos horizontes en la comprensin de las estructuras de la calculadora. El lector experimentar un control ms elevado de la calculadora, para as dar uso segn su conveniencia. Precaucin: Al acceder a muchas de estas nuevas

posibilidades, acceso a memoria de sistema, punteros de sistema, etc, hay que tener un cuidado especial, ya que se corre el riesgo de alterar el sistema.

ANEXO I - GUA

Es aconsejable usar la interfaz de comunicaciones y transferir todos los datos de mucha importancia al PC. Aqu no se describe la interfaz de comunicaciones.

ANEXO I - GUA

DIRECCIONAMIENTO DE LA MEMORIA RAM


Es posible direccionar la memoria RAM desde un rango de -32769 hasta 65536 (exclusivas ambas direcciones). Las direcciones negativas se suman a 65536, siendo esta nueva direccin la definitiva. Ej.- direccin -1 (-1+65536) 65535

direccin -32768 (-32768+65536) 32767 La memoria RAM de la calculadora es cclica y al igual que la memoria de un PC, posee diversas maneras de direccionamiento. Si queremos direccionar un byte en el segmento 0 y la posicin 1024, esta direccin se expresar de la siguiente manera : 0 :1024. No obstante esta no es la nica manera de representarla, si bien el mismo byte tambin podra ser direccionado por el par segmento :desplazamiento,1 :1008 2 :992 , etc... . De cualquier manera siempre nos referimos al byte 1024 del segmento 0 (tomando este segmento como absoluto), o lo que es lo mismo, a la direccin real.

ANEXO I - GUA

El clculo de la direccin real es el siguiente : 16 x N segmento+desplazamiento Ej.- direccin 2 : 256 Cuando se lee el byte en la direccin anterior no se lee el byte de la direccin 256, sino el byte de la direccin (16*2+256=288). Dependiendo del tipo de expansin de memoria RAM(RP-8 (8 Kb)), (RP-33(32 Kb) la memoria total puede ser de 16 Kb o de 40 Kb. Para el caso de memoria de 40 Kb el final de la RAM est en la direccin 40960. A partir de esta direccin la memoria se convierte en cclica, es decir, el byte 40960+1 ser como direccionar el principio de la memoria (0 :0). En resumen el byte 40960 (para el caso de tener la mxima ampliacin RAM) ser el fin de la capacidad de almacenar bytes, pero no el fin de la capacidad de direccionar ms all de este lmite. La siguiente figura muestra una representacin grfica de la memoria de la calculadora.

ANEXO I - GUA

ANEXO I - GUA

TABLA DE PUNTEROS
El sistema guarda la informacin primordial para el manejo de programas, variables, zonas de memoria especiales y punteros. Esta informacin es de un valor muy especial tanto para el usuario como para el sistema. Sabiendo utilizar los punteros se puede tomar un control casi total de la calculadora, as como lograr algunos efectos interesantes. Direcci n 0: 0000 0: 0512 0: 0768 0: 0512 0: 1024 0: 1610 0: 1613 0: 1616 0: 1619 0: 1627 0: 1628 0: 1629 0: 1630 Descripcin BUFFER de pantalla. BUFFER de entrada de comandos,0. BUFFER VALF( ) ( 155 bytes ),0. BUFFER de entrada de comandos,0. Modo de almacenamiento frmulas (Function Memory),0. Puntero del puntero del programa donde se ha realizado en el ltimo comando PB (compatibilidad PB-100). SEG+DIR de READ#. Puntero del puntero del ltimo programa en el que se ha estado en BASIC. Puntero parmetros para INPUT (Texto si hay, sino variable). Despus de una edicin si es 13 ha sido pulsado EXE, si es 253 se ha pulsado shift +EXE. =0 LIB apagado; >0 LIB encendido. Modo angular; 0=DEG; 1 =RAD; 2=GRA. Si es igual a 0 DEFM apagado; >0 DEFM encendido.

ANEXO I - GUA

0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0:

1673 1676 1682 1685 1688 1691 1697 1700 1703 1706 1709 1712 1715 1718 1737 1750 1753 1759 1762 1767 1774 1776 1785 1820 1858

0: 1867 0: 4095 9 5: 6340 6

Puntero inicio de la pila de caracteres. Puntero fila de la pila de caracteres. Puntero cabeza de la Pila FOR NEXT. Puntero cabeza de la Pila GOSUB. Puntero cola de la Pila GOSUB. Puntero de FIN del rea de sistema. Puntero de inicio de la tabla de variables. Puntero del ltimo byte de variables. Puntero de primer byte de MEMO. Puntero de ltimo byte de MEMO. Puntero del puntero de MEMO. Puntero del puntero de P9 ( Tabla de punteros ). Puntero del puntero de P0 ( Tabla de punteros ). Direccin de punteros de la librera 5:63406. =2 PRT encendido. Puntero del ltimo comando de programa ejecutado. Puntero DATA Puntero ON ERROR GOTO =ERL ( 2 bytes ). =ERR ( 1 byte ). Lnea de programa ejecutndose, ltima editada o introducida (2 bytes ). Puntero del comando que se est ejecutando. ANS ( como variables, 8 bytes ). =4 CAPS encendido, =0 minsculas (slo lectura). Puntero del puntero del ltimo programa de librera ejecutado. Buffer PASS ( 8 bytes ASCIIZ =terminado en carcter 0 ). Fin de RAM Tabla de punteros de los programas de librera.

ANEXO I - GUA

ALMACENAMIENTO DE VARIABLES Y PUNTEROS


Este captulo mostrar como se almacenan en la memoria RAM las variables, los punteros y las tablas de punteros de programa, librera y banco de datos (MEMO). El comienzo de la tabla de variables viene dado por el puntero de inicio de la tabla de variables en la direccin [0:1697] (ver captulo Tabla de Punteros). Antes de pasar a describir estructura. La estructura de un puntero es la siguiente: (cada cuadro es un byte) LSB MSB BL la estructura a obtener de los la tabla de as variables como su aprenderemos punteros,

LSB= Byte menos significativo del puntero MSB= Byte ms significativo del puntero BL = Segmento Bloque de memoria La frmula para obtener la direccin de memoria a la que apunta el puntero es la siguiente:
ANEXO I - GUA

P=PEEK(LSB)+256*PEEK(MSB) La variable P ser la direccin de memoria deseada. El Segmento Bloque se usar con la instruccin DEFSEG de BASIC. DEFSEG=BL*4096 De este modo tendremos una direccin de memoria con segmento: desplazamiento. El segmento 0 corresponde a la RAM y los segmentos 4, 5 a la ROM. Volviendo a la estructura de las variables calcularemos el inicio de la tabla de variables por el procedimiento descrito anteriormente: PI=PEEK1697+256*PEE1698 El punto de inicio PI es la direccin de memoria donde estar ubicada la primera variable. Usando tambin el puntero, ltimo byte de la tabla de variables, de la tabla de punteros tendremos la direccin donde termina la ltima variable. PF=PEEK1700+256*PEE1701

ANEXO I - GUA

Se han obviado los segmentos debido a que sabemos que las variables estn en la memoria RAM (DEFSEG=0).

ANEXO I - GUA

10

PI
Variable Variable

PF
Variable Variable

Cada estructura de variable tiene un tamao distinto segn el nombre de la variable y el tipo de variable.
Longitud del nombre de la variable*16+Tipo Nombre de la variable Direccin de la variable

Tipo = 0 si la variable es una string =4 si es un Nmero strings


Se sumar 2 si el valor es tecleado y nada si es un valor calculado (ms precisin)

=8 si es una matriz de

En esta direccin empezar el valor de la variable. La longitud del valor depender de si es un nmero o una cadena de texto (string). Esta direccin esta en notacin inversa. Un ejemplo prctico de tabla de variables es el siguiente listado de la memoria RAM. Hay dos variables numricas S y CH2 y una variable de tipo string CHAR$.

ANEXO I - GUA

11

Longitud nombre 14
(1*16+4=20=&H14)

Nombre 53
CHR$(53)=S

Direcci n 6E 27
&H276E

Hexadecimal/ Ascii
14 53 6E 27

.Sn'
34 43 48 32 76 27

34
(3*16+4=52=&H34)

43 48 32
C+H+2

76 27
&H2776

4CH2v'
40 43 48 41 52 C0 0C

40
(4*16+0)=64=&H40

43 48 41 52
C+H+A+R

C0 0C
&H0CC0

@CHAR.

Ntese que la ltima variable es de tipo string (CHAR$) y no aparece en memoria el carcter $. Los bytes en hexadecimal aparecen consecutivos:
14 53 6E 27 34 43 48 32 76 27 40 43 48 41 52 C0 0C

Mirando en la direccin de la variable podemos tener nmeros o cadenas de texto: Nmero: A.BCDEFGHIJKL*10xy
MN LT JK HI FG DE BC

1 BYTE

0A

ANEXO I - GUA

12

El exponente depende de si el nmero es mayor o igual a 1 y/o menor que cero. La variable T controla esta dependencia. T=(1 si el nmero es >=1) + (5 si el nmero es <0) MN es calculado con respecto a este parmetro. La tabla podra ser la siguiente: T 0 5 1 6 MN 100ABS(XY) 100ABS(XY) ABS(XY) ABS(XY)

Ejemplo 1: Variable XX=-0.23456789012 En memoria se hace una conversin a notacin cientfica: conversin: -2.3456789012E-1 Memoria:
99 05 12 90 78 56 34 02

ANEXO I - GUA

13

Ejemplo 2: Variable XX=-0.23456789012E-18 En memoria se hace una conversin a notacin cientfica: conversin: -2.3456789012E-19 Memoria:
81 05 12 90 78 56 34 02

Ejemplo 3: Variable XX=256789012E-18 En memoria se hace una conversin a notacin cientfica: conversin: 2.56789012E-10 Memoria:
90 00 00 12 90 78 56 02

ANEXO I - GUA

14

Nota: Los nmeros estn todos en hexadecimal Cadena alfanumrica de texto

(texto): ejemplo de cadena

Este tipo de variable es mucho ms sencillo que la anterior. Slo se compone de la longitud de la cadena de texto ms su equivalente en ASCII
Longitud Letras ASCII

ANEXO I - GUA

15

LISTADO DE LA MEMORIA ROM

La memoria ROM comienza en el segmento de bloque 4. Para acceder a esta direccin de memoria hay que usar la instruccin DEFSEG=4*4096. A partir de la zona aqu listada comienza la biblioteca de programas (libreras). En este bloque se muestra el inicio de la ROM. Se muestran en distintos colores algunas zonas importantes de la ROM.
Inicio de la ROM Direccin de inicio librera Direccin final de librera Puntero de cdigos de teclado cdigos de teclado

Inicio de tabla de punteros de librera Final de tabla de punteros de librera

Dir. Hexadecimal
0000 0010 0020 0030 0040 0050 0060 0070 0080 0090 00A0 00B0 00C0 00D0 00E0 00F0 0100 0110 0120 0130 0140 0150 0160 43 00 FF 04 00 2D AD 00 3B 56 00 A5 86 00 3C 9B 15 15 14 14 14 18 00 4D 00 FF 24 00 2A 33 20 4D 43 00 A7 D3 20 93 99 78 6B 4B 6F 59 AB 00 04 04 FF E0 FE 08 35 00 4B 46 FE 0C D5 00 98 92 15 15 14 14 15 00 00 FF 40 FF 05 00 A1 38 F6 4A 44 00 9E D8 13 96 91 77 6C 49 6A 7A 00 00 FF 00 FF 24 DC 89 28 F2 49 52 DC 8C A4 F3 5B 24 15 15 14 16 15 00 00 01 04 FF E0 DB F5 87 0E 55 45 DB F5 9D 04 27 23 79 6D 81 9B 7F 00 00 56 60 FF 05 DA DF DA AE 1D 0F DA DF DA 83 02 0F 19 15 14 14 15 00 00 0B 01 FF BD 03 00 FC 80 1F 0F 03 00 FC AF 1F 1A A3 6E 6D 7C 67 00 00 1B 04 FF F7 2F 0D 2E 2C 4E 58 A8 FD 9C 3F 9F 9A 19 15 14 15 15 00 00 00 B0 FF 05 5E 2B 30 3A 42 5A A3 A6 D0 3E A0 8F 97 6F 82 93 7D 00 00 57 01 FF BD 8A 36 32 3D 48 53 8D D6 D2 40 95 90 18 15 14 14 18 7F 00 55 04 FF F7 F0 39 31 4C 47 41 F0 D9 D1 97 94 8E 9C 70 8D AC A7 CC 00 30 FF FF 05 FA 29 34 50 59 57 FA A2 D4 5C 26 22 15 14 17 15 18 7F 00 30 FF FF 00 DE 88 37 4F 54 51 DE 8B D7 5D 25 21 60 4A 47 63 A8 CE 00 30 FF 90 00 DD F4 85 12 1E FF DD F4 84 11 0B FF 15 14 14 14 18 7F 00 31 FF 05 06 00 00 81 1C FB 00 00 00 82 06 FB 00 AC A3 57 6C AA D2 00

ASCII
CM....V...WU0001 ...@..`........ ............... .$.$...... ...../^. -*...+69). 358(..02147 . .. :=LPO.. ;MKJIU..NBHGYT. VCFDRE..XZSAWQ.. ..... . .... . . ...?>@\].. <['.. &%. $#.. "!.. .x.w.y....`. .k.l.m.n.o.p.J. .K.I..m...G.W .o.j..|...c.l .Y.z..g.}... ......... ................

ANEXO I - GUA

16

0170 0180 0190 01A0 01B0 01C0 01D0 01E0 01F0 0200 0210 0220 0230 0240 0250 0260 0270 0280 0290 02A0 02B0 02C0 02D0 02E0 02F0 0300 0310 0320 0330 0340 0350 0360 0370 0380 0390 03A0 03B0 03C0 03D0 03E0 03F0 0400 0410 0420 0430 0440 0450 0460 0470 0480

00 B6 F7 FF B2 BA C2 CA D3 DB E3 EB EF F7 FF 07 0D 15 1D 25 29 48 6B 95 BB E7 0E 31 51 72 85 8F 8F 8F 8F 8F 90 3C 45 4E 62 72 EE 5B 20 20 49 20 41 20

00 FE 05 FF 03 03 03 03 03 03 03 03 03 03 03 04 04 04 04 04 04 04 04 04 04 04 05 05 05 05 05 05 05 05 05 05 05 E2 2D 4F 63 73 40 26 54 4C 4E 52 4C 43

00 05 DB FF B3 BB C3 CB D4 DC E4 EC F0 F8 00 08 0E 16 1E 26 2D 4C 6F 99 BF EC 14 35 56 76 89 8F 8F 8F 8F 8F 20 30 45 50 64 74 F0 5F 41 4F 54 4F 28 53

00 B6 F7 FF 03 03 03 03 03 03 03 03 03 03 04 04 04 04 04 04 04 04 04 04 04 04 05 05 05 05 05 05 05 05 05 05 2B 31 41 51 65 75 9F 27 4E 47 20 55 4D 52

00 FE 05 FF B4 BC C4 CC D5 DD E5 ED F1 F9 01 09 0F 17 1F 27 31 50 73 9E C4 F1 18 38 5A 7A 8F 8F 8F 8F 8F 8F 2D 32 42 52 66 76 E8 A5 20 20 46 4E 49 20

00 05 DB FF 03 03 03 03 03 03 03 03 03 03 04 04 04 04 04 04 04 04 04 04 04 04 05 05 05 05 05 05 05 05 05 05 2A 33 43 53 67 77 E4 5D 41 4C 52 44 44 20

00 B6 F7 FF B5 BD C5 CD D6 DE E6 ED F2 FA 02 09 10 18 20 28 35 54 7A A3 CA F5 1C 3C 5E 81 8F 8F 8F 8F 8F 8F 2F 34 44 54 68 78 E9 87 53 4E 41 28 24 54

00 FE 05 FF 03 03 03 03 03 03 03 03 03 03 04 04 04 04 04 04 04 04 04 04 04 04 05 05 05 05 05 05 05 05 05 05 E3 35 45 55 69 79 EA EF 4E 20 43 52 28 4F

00 05 FF FF B6 BE C6 CE D7 DF E7 ED F3 FB 03 09 11 19 21 29 39 59 81 A8 D1 F8 20 41 64 85 8F 8F 8F 8F 8F 8F 21 36 46 56 6A 7A EB 86 20 45 20 41 24 20

00 B6 FF FF 03 03 03 03 03 03 03 03 03 03 04 04 04 04 04 04 04 04 04 04 04 04 05 05 05 05 05 05 05 05 05 05 22 37 47 57 6B 3F 8D 53 41 58 41 4E 2C 20

00 FE FF FF B7 BF C7 CF D8 E0 E8 EE F4 FC 04 0A 12 1A 22 29 3D 5D 85 AF D8 FD 26 45 68 85 8F 8F 8F 8F 8F 8F 23 38 48 58 6C 2C 85 49 43 50 42 23 49 53

00 05 FF FF 03 03 03 03 03 03 03 03 03 03 04 04 04 04 04 04 04 04 04 04 04 04 05 05 05 05 05 05 05 05 05 05 24 39 49 59 6D 3B E5 4E 53 20 53 4C 4E 54

00 B6 FF FF B8 C0 C8 D0 D9 E1 E9 EE F5 FD 05 0B 13 1B 23 29 41 61 89 B2 DB 05 2B 49 6B 85 8F 8F 8F 8F 8F 8F 3E 2E 4A 5A 6E 3A E6 20 20 53 20 45 4B 45

00 FE FF F9 03 03 03 03 03 03 03 03 03 03 04 04 04 04 04 04 04 04 04 04 04 05 05 05 05 05 05 05 05 05 05 05 E0 E7 4B 8A 6F ED 25 43 41 51 53 4E 45 50

00 05 FF F7 B9 C1 C9 D2 DA E2 EA EF F6 FE 06 0C 14 1C 24 29 45 67 8F B7 E1 0A 2D 4D 6E 85 8F 8F 8F 8F 8F 90 3D 29 4C 8E 70 84 5C 4F 54 52 47 28 59 20

00 BD FF 05 03 03 03 03 03 03 03 03 03 03 04 04 04 04 04 04 04 04 04 04 04 05 05 05 05 05 05 05 05 05 05 05 E1 28 4D 61 71 DF EC 53 4E 20 4E 56 24 20

................ .......... ........... .............. ........ ........ ........ ........ ........ ........ ........ ........ ........ ........... ................ ................ ................ ................ ...... .!.".#.$. %.&.'.(.).).).). ).-.1.5.9.=.A.E. H.L.P.T.Y.].a.g. k.o.s.z..... ........ ........ ........... ........ .&.+.-. 1.5.8.<.A.E.I.M. Q.V.Z.^.d.h.k.n. r.v.z...... ........ ........ ........ ........ ........ ........ . +-*/!"#$>= <0123456789.)( E-EABCDEFGHIJKLM NOPQRSTUVWXYZa bcdefghijklmnopq rstuvwxyz?;: @ %\ [&_']SIN COS TAN ASN ACS ATN LOG LN EXP SQR INT FRAC ABS SGN ROUND(RAN#LEN(V AL(MID$($ INKEY$ CSR TO STEP

ANEXO I - GUA

17

0490 04A0 04B0 04C0 04D0 04E0 04F0 0500 0510 0520 0530 0540 0550 0560 0570 0580

54 52 4C 45 20 20 20 54 45 43 20 20 20 52 53 20

48 24 4C 58 52 49 45 4F 41 4C 50 4E 44 49 53 3F

45 28 42 54 45 4E 4E 52 52 45 4F 50 45 46 3F 3F

4E 44 45 20 54 50 44 45 20 41 4C 52 46 59 3F 3F

20 4D 45 20 55 55 20 20 53 52 28 28 4D 4C 3F 20

44 53 50 47 52 54 4F 44 45 20 48 3F 20 49 20 44

45 24 20 4F 4E 20 4E 41 54 44 59 3F 53 53 3F 49

47 28 4C 54 20 4D 20 54 20 45 50 3F 41 54 3F 4D

28 4D 45 4F 49 4F 52 41 3F 46 52 20 56 52 3F 20

48 49 54 20 46 44 45 20 3F 4D 45 4E 45 55 20 45

45 44 20 20 20 45 41 52 3F 20 43 43 4C 4E 57 52

58 24 46 47 50 20 44 45 20 26 28 52 4F 4E 52 41

24 28 4F 4F 52 53 20 4D 3F 48 46 28 41 45 49 53

28 24 52 53 49 54 52 20 3F 43 41 3F 44 57 54 45

53 2C 20 55 4E 4F 45 43 3F 55 43 3F 56 50 45 20

54 41 4E 42 54 50 53 4C 20 52 54 3F 45 41 23 3

THEN DEG(HEX$(ST R$(DMS$(MID$($A LLBEEP LET FOR N EXT GOTO GOSUB RETURN IF PRINT INPUT MODE STOP END ON READ RES TORE DATA REM CL EAR SET ??? ??? CLEAR DEFM &HCUR POL(HYPREC(FACT NPR(??? NCR(??? DEFM SAVELOADVE RIFYLISTRUNNEWPA SS??? ??? WRITE# ??? DIM ERASE :

ANEXO I - GUA

18

LOCALIZACIN DE LA BIBLIOTECA (LIBRERIAS)


La biblioteca de programas se compone de 116 programas diferentes segn el manual de usuario. Existen, sin embargo, varios programas no documentados y rutinas que son llamados desde otras libreras. Esto hace un total de 141 programas distintos. Estos programas estn localizados en mdulos de memoria ROM, llegando a ocupar 128 Kb (2 mdulos de 64 Kb). Para obtener su localizacin exacta es necesario obtener de la tabla de punteros de biblioteca la informacin necesaria (Direccin de inicio, final, Nombre de la librera) La tabla de punteros de libreras esta compuesta de grupos de quince bytes, tantos como libreras hay. Esta tabla se encuentra en el segmento 5 de memoria ROM. El programa de ejemplo de localizacin podra ser el siguiente:
10 DEFSEG=5*4096 20 NL=1:D=NL*15 30 P=63406+D 40 INICIO=PEEKP+256*PEEK(P+1 50 FIN=PEEK(P+3)+256*PEEK(P+4 ; Direccionar segmento 5 ; NL= Nmero de librera ; Posicin de la tabla de punteros ; Obtener el inicio de la librera ; Obtener el fin de la librera

60 NUM$=CHR$(PEEK(P+7))+CHR$(PEEK(P+8))+CHR$(PEEK(P+9))+ CHR$(PEEK(P+10))+ CHR$(PEEK(P+11)) 70 PRINT NUM$ ;Imprime nmero librera (Ej.5500)

ANEXO I - GUA

19

La siguiente tabla incluye la localizacin de todos los programas de biblioteca, as como su longitud. Estos datos se han transmitido de la calculadora al ordenador PC usando la interfaz del presente proyecto, usando un programa similar al mostrado en la hoja anterior. El primer nmero antes de los dos puntos en los valores Inicio y Final es el bloque de ROM o segmento donde se encuentra la librera.

N. Librera
0400 0800 0900 1000 5010 5020 5040 5050 5060 5080 5090 5100 5200 5220 5230 5250 5260 5270

Inicio
4:01424 4:03286 4:04416 4:08268 4:09475 4:10181 4:10632 4:12287 4:13497 4:15487 4:16595 4:17770 4:23006 4:24276 4:25521 4:26378 4:27099 4:27952

Final
4:03285 4:04415 4:08267 4:09474 4:10180 4:10631 4:12286 4:13496 4:15486 4:16594 4:17769 4:23005 4:24275 4:25520 4:26377 4:27098 4:27951 4:28945

Longitud
1861 1129 3851 1206 0705 0450 1654 1209 1989 1107 1174 5235 1269 1244 0856 0720 0852 0993 bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes

ANEXO I - GUA

20

5280 5290 5300 5350 5510 5520 5530 5540 5550 5560 5570 5600 5605 5610 5615 5620 5625 5630 5635 5650 5655 5660 5665 5670 5675 5700 5705 5710 5715 5720 5725 5730 5735 5740

4:28946 4:29791 4:31030 4:33197 4:36467 4:37093 4:37485 4:37849 4:38359 4:39154 4:39588 4:41304 4:42142 4:42513 4:43124 4:43387 4:43985 4:44405 4:44737 4:45445 4:45715 4:46163 4:46602 4:46950 4:47338 4:47736 4:48014 4:48444 4:48790 4:49131 4:49476 4:49900 4:50306 4:50675

4:29790 4:31029 4:33196 4:36466 4:37092 4:37484 4:37848 4:38358 4:39153 4:39587 4:41303 4:42141 4:42512 4:43123 4:43386 4:43984 4:44404 4:44736 4:45444 4:45714 4:46162 4:46601 4:46949 4:47337 4:47735 4:48013 4:48443 4:48789 4:49130 4:49475 4:49899 4:50305 4:50674 4:51165

0844 1238 2166 3269 0625 0391 0363 0509 0794 0433 1715 0837 0370 0610 0262 0597 0419 0331 0707 0269 0447 0438 0347 0387 0397 0277 0429 0345 0340 0344 0423 0405 0368 0490

bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes

ANEXO I - GUA

21

5745 5750 5760 5800 5810 5820 5830 5840 5900 5910 5920 5930 5932 5934 5936 5938 5950 5960 5970 5980 6210 6220 6230 6240 6310 6320 6330 6410 6420 6430 6440 6450 6460 6500

4:51166 4:51537 4:52188 4:53605 4:54971 4:56759 4:58362 4:59958 4:61808 5:1166 5:3488 5:4375 5:5801 5:7003 5:8200 5:9508 5:10561 5:12474 5:13498 5:16383 5:17332 5:17677 5:18129 5:18578 5:19130 5:19633 5:20095 5:20642 5:21007 5:21477 5:21946 5:22516 5:22681 5:22880

4:51536 4:52187 4:53604 4:54970 4:56758 4:58361 4:59957 4:61807 5:1165 5:3487 5:4374 5:5800 5:7002 5:8199 5:9507 5:10560 5:12473 5:13497 5:16382 5:17331 5:17676 5:18128 5:18577 5:19129 5:19632 5:20094 5:20641 5:21006 5:21476 5:21945 5:22515 5:22680 5:22879 5:24426

0370 0650 1416 1365 1787 1602 1595 1849 4892 2321 0886 1425 1201 1196 1307 1052 1912 1023 2884 0948 0344 0451 0448 0551 0502 0461 0546 0364 0469 0468 0569 0164 0198 1546

bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes

ANEXO I - GUA

22

6510 6520 6530 6540 6610 6620 6630 6640 6650 6660 6670 6680 6710 6711 6712 6720 6721 6722 6730 6731 6732 6740 6741 6742 6750 6751 6752 6760 6761 6762 6770 6771 6772 K0630

5:24427 5:24452 5:24477 5:24502 5:24527 5:25310 5:26100 5:26861 5:27628 5:28698 5:29845 5:30458 5:31230 5:31257 5:31283 5:31309 5:31336 5:31362 5:31388 5:31415 5:31441 5:31467 5:31494 5:31520 5:31546 5:31573 5:31599 5:31625 5:31652 5:31678 5:31704 5:31731 5:31757 5:31783

5:24451 5:24476 5:24501 5:24526 5:25309 5:26099 5:26860 5:27627 5:28697 5:29844 5:30457 5:31229 5:31256 5:31282 5:31308 5:31335 5:31361 5:31387 5:31414 5:31440 5:31466 5:31493 5:31519 5:31545 5:31572 5:31598 5:31624 5:31651 5:31677 5:31703 5:31730 5:31756 5:31782 5:39375

0024 0024 0024 0024 0782 0789 0760 0766 1069 1146 0612 0771 0026 0025 0025 0026 0025 0025 0026 0025 0025 0026 0025 0025 0026 0025 0025 0026 0025 0025 0026 0025 0025 7592

bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes bytes

ANEXO I - GUA

23

M6510 M6710 M6720 M6730 M6740 M6750 M6760 M6770 S6020 S6030 S6210 S6220 S6230 S6240 S6310 S6320 S6330 S6410 S6420 S6430 S6440

5:39376 5:43179 5:44182 5:45200 5:46340 5:47588 5:48887 5:49734 5:50666 5:51950 5:53239 5:53552 5:53900 5:54136 5:54702 5:54891 5:55008 5:55312 5:55661 5:56154 5:56676

5:43178 5:44181 5:45199 5:46339 5:47587 5:48886 5:49733 5:50665 5:51949 5:53238 5:53551 5:53899 5:54135 5:54701 5:54890 5:55007 5:55311 5:55660 5:56153 5:56675 5:57379

3802 bytes 1002 bytes 1017 bytes 1139 bytes 1247 bytes 1298 bytes 0846 bytes 0931 bytes 1283 bytes 1288 bytes 0312 bytes 0347 bytes 0235 bytes 0565 bytes 0188 bytes 0116 bytes 0303 bytes 0348 bytes 0492 bytes 0521 bytes 0703 bytes

ANEXO I - GUA

24

LIBRERAS NO DOCUMENTADAS
Existen varios programas de la biblioteca (libreras) no documentados. nmeros: 0400 calculadora 0800 ->Programa para la impresora 0900 -> Convertidor de PB100 a FX-850P Para acceder a los programas basta (desde el MODE 0) teclear el nmero y pulsar la tecla LIB. Es posible tambin acceder a la librera de men por su propio nmero de programa. K0630 -> Men de libreras Los listados siguientes corresponden a las libreras no documentadas: Librera: 0400
10 20 30 40 50 70 80 100

Estos

programas ->Programa

corresponden de testeo

a de

los la

Test de la calculadora

CLEAR:CLS:DEFSEG=0:K=PEEK(&H6B4)/4+PEEK(&H6B5)*64 IF K<32 THENK1=8:K2=K-K1 IF K=32 OR K=64 THENK1=32:K2=K-K1 IF K=40THENPOKE&H8000,10:POKE0,0:IFPEEK&HA000=10THENK1=32:K2=8 ELSEK1=8: K2=32 PRINT"Main";K1;TAB(8);"Kbyte Option";K2;"Kbyte";:PRINT:A=64:D=1:A1=0 GOSUB1000:A=A+A:D=(D+D)MOD256:IF A<K*1024 THEN70 FORI=1 TO9:A=K*1024-A1-1:IF I=5 OR I=9 THEND=&H80 ELSE D=&H20 GOSUB1010:IF A1=0 THENA1=1 ELSEA1=A1*2

ANEXO I - GUA

25

110 120 130 160 170 180 190 191 192 193 194

200 201 202 203 210 220 230 250 280 290 320 330 350 360 390 410 420 430 460 470 490 510 520 1000 1010 1020 1030 1000 0

NEXT A=K*1024-A1-1:GOSUB1000:A1=A1*2:IF A1<K*1024 THEN120 PRINT" OK RAM";:GOSUB10000:PRINT:DEFSEG=&H4000 ROM=(PEEK(4)+1+PEEK(5)*256)*2 IF PEEK(0)<>&H43 THENPRINT"NG ROM 1";:GOTO1030 IF ROM<>1024 THEN200 D1=PEEK(&H5955):D2=PEEK&HA6AA:D3=PEEK&HFFFF:DEFSEG=&H5000 D4=PEEK0:D5=PEEK&H5955:D6=PEEK&HA6AA IF PEEK&HFFFF<>&H20 THENPRINT"NG ROM 2";:GOTO1030 PRINT"OK 512K*2 ROM?";:PRINT PRINTRIGHT$(HEX$(D1),2);" ";RIGHT$(HEX$(D2),2);" ";RIGHT$(HEX$(D3),2);" "; RIGHT$(HEX$(D4),2);" ";RIGHT$(HEX$(D5),2);" ";RIGHT$(HEX$ (D6),2);"";:GOTO210 IF PEEK(ROM*128-1)<>&H20 THENPRINT"NG ROM 1";:GOTO1030 D1=PEEK&H5955:IF ROM=256 THEND2=PEEK&H26AA ELSE D2=PEEK&HA6AA PRINT"OK";STR$(ROM);"K ROM?";:PRINT PRINTRIGHT$(HEX$(D1),2);" ";RIGHT$(HEX$(D2),2);" "; GOSUB10000 CLS:FOR I=0 TO 63:PRINTCHR$(&HFF);:NEXT:LOCATE 0,0 DEFCHR$(&HFF)="FFFFFFFFFF":GOSUB10000:DEFCHR$ (&HFF)="0000000000": GOSUB10000 DEFCHR$(&HFF)="AA55AA55AA":GOSUB10000:DEFCHR$ (&HFF)="55AA55AA55":TRON: GOSUB10000:TROFF CLS:PRINT"Printer CHECK";:LPRINT:GOSUB10000 LPRINT"Main";K1;"Kbyte Option";K2;"Kbyte" FOR I=32 TO 255:IF I=&H7F THENI=&H80 LPRINTCHR$(I);:NEXT:LPRINT PRINT"RS 232C CHECK";:PRINT:GOSUB10000 OPEN "COM0:5,E,8,2,C,D,C,B,N" AS #1:PRINT#1,123:INPUT #1,D CLOSE:IF D<> 123 THENPRINT"NG RS 232C";:GOTO1030 PRINT"OK RS 232C";:GOSUB10000:PRINT PRINT"MT CHECK <REC>";:PRINT:GOSUB10000 OPEN "CAS0:TEST" FOR OUTPUT AS #1:PRINT#1,"ABC":CLOSE PRINT"MT <REW> and <PLAY>";:PRINT:GOSUB10000 OPEN "CAS0:TEST" FOR INPUT AS #1:INPUT #1,A$:CLOSE IF A$<>"ABC" THENPRINT"NG MT";:PRINT:GOTO1030 PRINT"OK MT";:PRINT END POKE A,D IF PEEKA=D THENRETURN IF A>=K1 THENPRINT"NG RAM 2"; ELSE PRINT "NG RAM 1"; BEEP:GOTO1030 BEEP:IF INPUT$(1,@)=CHR$(0) THEN10000ELSE RETURN

ANEXO I - GUA

26

Librera: 0800 (carga de caracteres)


10

Programa para la Impresora

DATA1E,28,A8,28,1E,0,2,7C,80,0,8,4,FE,80,80,0,20,40,80,0,C6,AA,92,82,C6, 72,8E,80,8E,72,AA,54,AA,54,AA,FE,FE,FE,FE,FE,1C,22,22,1C,22,7E,88,A4,A4, 58,20,1E,20,40,40,14,2A,2A,2A,0,3C,52,52,3C,0,3E,8,8,30,8,1C,22,22,5C,80, 18,26,3C,64,18,F8,88,F8,0,0 DATA48,F8,8,0,0,B8,A8,E8,0,0,A8,A8,F8,0,0,E0,20,F8,0,0,E8,A8,B8,0,0,F8,A8 ,B8,0,0,C0,80,F8,0,0,F8,A8,F8,0,0,E8,A8,F8,0,0,20,70,20,0,0,20,20,20,0,0,78 ,20,40,38,0,48,50,28,48,0,20, 20,0,0,F8,10,10,54,10,10 DATAA,4A,2A,1A,A,A,1A,2A,4A,A,28,68,38,2C,28,20,40,FE,40,20,10,38,54,10 ,10,8,4,FE,4,8,10,10,54,38,10,22,3C,20,3E,22,18,3A,7E,3A,18,38,7C,3E,7C,3 8,18,3C,7E,3C,18,18,7A,7E,7A,18,7C,44,44,44,7C,38,44,44,44,38,8,18,28,18 ,8,40,20,10,8,4,44,28,10,28,44 DATAFE,90,F0,92,FE,24,DC,54,7E,54,FE,A8,A8,AA,FE,FE,92,92,92,FE,50,50,7 E,90,10,84,F8,A0,A2,BC,12,7E,92,82,42,38,44,FE,44,28,22,22,FA,22,22,88,8 8,BE,88,88,3E,22,3E,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 CLS:PRINT"Down load .....";:a$=CHR$(27):b$=CHR$(0):LPRINTa$;":";b$;b$;b$;a$; "%"; CHR$(1);b$;:x=128:GOSUB60:x=224:GOSUB60:CLS:END LPRINTa$;"&";b$;CHR$(x);CHR$(x+31);:FORi=x TOx+31:LPRINTCHR$(139);: FORj=1TO5:READc$:LPRINTCHR$(VAL("&H"+c$));b$;:NEXT:LPRINTb$;:NEXT: RETURN

20

30

40

50

60

ANEXO I - GUA

27

Librera: 0900 850P


10 20 30 50 70 90 110 120 200 210 220 230 240 250 260 270 280 290 300 410 430 460 470 490 500 510 520 530 540 550 560 570

Convertidor de PB100 a FX-

MODE8:DEFSEG=0:GOTO110 GOSUB20 OPENp$ FORINPUTAS#1:IFASC(INPUT$(1,1))<>2 THENCLOSE:GOTO30 ELSERETURN IFg$="" THENRETURN ELSEGOSUB70:FORk=1 TOLEN(g$):k$=MID$(g$,k,1): MODE32(k$): NEXT:g$="":FORl=0 Tok-2:g$=g$+CHR$(PEEK(l+768)):NEXT: RETURN POKE768,0:POKE769,0:POKE1608,0:POKE1609,3:RETURN n=PEEK(e):e=e-1:RETURN n$="":a=2:a$="":j$="":i=0:p$="":m=512:f$="":c$="":o=0:g=0:e=0:d=0:e$ ="" p=0:b$="":k=0:g$="":c=0:w=0:u=0:v=0:s=0:o$="":i$="":q=0:h$="":r=0:m $="":k$="":h=0:f=0: t=0:l=0:b=0:x=0:y=0:n=0:d$="" IFPEEK(m)=32 THENm=m+1:GOTO200 IFPEEK(m)=4 ANDPEEK(m+1)=180 THENf$="VF":GOSUB2190:GOSUB2120: GOSUB2220: GOTO410 IFPEEK(m)<>4 ORPEEK(m+1)<>179 THENa n=PEEK(m+a):IFn=32 THENa=a+1:GOTO230 IFn=0 ORn=34 ORn=48 ORn=49 THENf$="PF":GOSUB2190:GOSUB2120: GOSUB2220: GOTO410 IFn=7 ANDPEEK(m+a+1)=187THENf$="AF":a=a+2:GOSUB2190:GOSUB2120: GOSUB2220:GOTO410 IFn=35 THENf$="MF":a=a+1:GOSUB2190:GOSUB2120 ELSEa n=PEEK(m+a) IFn=0 THENg=0:GOTO410 IFn=32 THENa=a+1:GOTO270 IFn=44 THENa=a+1:GOSUB2250:IFn=77 THENg=1:GOSUB2220 ELSEa ELSEa a=1709:o=(PEEK(a+1))*256+(PEEK(a))-1:f=o:e=o:h=o-FRE(1)+1 FORd=1867 TO1874:e$=e$+CHR$(PEEKd):NEXT b$="":a$="":OPENp$ FORINPUTAS#1:p=ASC(INPUT$(1,1)):IFp<144 THENCLOSE: GOTO460 b$=INPUT$(10,1):CLOSE IFp MOD16=15 THENa$="":GOTO510 FORk=1 TO8:j$=MID$(b$,k,1):IFj$<>CHR$(7) THENa$=a$+j$:NEXT i=ASC(MID$(b$,10)):c=VAL("&h"+MID$(HEX$(p),3,1))-8 IFc=<2 THENn$="MF":GOTO560 IFc=6 THENn$="VF":GOTO560 IFc=3ORc=7 THENn$="AF":GOTO560 n$="PF" g$=a$:GOSUB50:b$=g$:PRINTb$;TAB(9);n$;:PRINT IFf$<>n$ THEN460

ANEXO I - GUA

28

580 600 710 720 730 735 740 750 760 810 1010 1020 1030 1110 1130 1140 1160 1170 1180 1182 1184 1186 1188 1190 1192 1194 1196 1223 1225 1230 1240 2030 2040 2050 2060 2080 2090 2100 2120 2130 2140 2150

IFc$<>"" ANDc$<>b$ THEN460 ONc GOTO810,,,,810,810,810 GOSUB30 n=ASC(INPUT$(1,1)):IFn=255 ORn=241 THEN730 ELSEd$=d$+CHR$ (n):GOTO720 CLOSE:g$=d$:GOSUB50:d$=g$ IFLEN(d$)>8 THENREAD$ IFLEN(d$)<8 THENd$=d$+CHR$(0):GOTO740 IFe$=d$ THEN810 PASSd$ GOSUB30:MODE35(:CLOSE:f=PEEK(1609)*256+PEEK(1608)-1 IFf$="VF" THEN10010 ELSEPRINT"Converting..."; IFf$="MF" THEN6010 IFf$="PF" THEN1140 w=48:o$=HEX$(PEEK(1715)+PEEK(1716)*25615):POKE1616,VAL("&h"+RIGHT$( o$,2)): POKE1617,VAL("&h"+LEFT$(o$,2)) FORk=48 TO57:k$=CHR$(k):MODE30(k$):NEXT:GOTO1160 w=PEEK(PEEK(1611)*256+PEEK(1610)+8):k$=CHR$(w):MODE30(k$) q=0:x=0:y=0:l=0:GOSUB70:GOSUB2040:u=n:GOSUB90:v=n:o$=RIGHT$ (HEX$(v),2)+ RIGHT$(HEX$(u),2):o$=MID$(STR$ (VAL(o$)),2):s=PEEK(1609)*256+PEEK(1608) FORk=1 TOLEN(o$):POKE768+k-1,ASC(MID$ (o$,k,1)):s=s+1:NEXT:POKE768+k-1,0: i$=HEX$(s):POKE1609,VAL(LEFT$ (i$,2)):POKE1608,VAL(RIGHT$(i$,2)) GOSUB90 IFn=255 THEN1240 IFn=254 THENq=0:x=0:y=0:l=0:GOTO1225 IFn=7 THENy=y+1:IFy>=2 THENy=0:l=1:GOTO1225 IFy=1 THEN1225 IFn=167 THENx=1:GOTO1225 IFn*x*l=93 THENn=94:GOTO1223 IFn=165 ORn=151 THENq=SGN(n-151):GOTO1223 IFn*q=94 THENn=151:q=0 l=0 IFPEEK(1608)>=247 THEN5000 h$=CHR$(n):MODE32(h$):GOTO1180 GOSUB2080:MODE31(m$):GOTO1160 IFPEEK(m+a)=44 ANDPEEK(m+a+1)=77 THENg=1:RETURN e=o GOSUB90:IFn=224 THENw=w+1:GOTO2050 IFn=240 THENEND ELSERETURN m$=CHR$(w) r=e-f:t=o-r+1:MODE33(f+1,t,r):f=t-1:IF(FRE(1))-r<0 THEN20 RETURN n=PEEK(m+a):IFn=44 ANDf$="MF" THENRETURN IFn=0 THENRETURN IFn=32 THENa=a+1:GOTO2120 IFn<>34 THENa ELSEa=a+1

ANEXO I - GUA

29

2160 2170 2190 2195 2200 2220 2230 2250 5000 6010 6020 6030 6040 6060 6070 6075 6080 6090 6100 1001 0 1002 0 1003 0 1004 0 1005 0 1007 0 1008 0 1008 5 1009 0 1010 0 1011 0 1012 0 1013 0

n=PEEK(m+a):IFn=34 THENa=a+1:c$=LEFT$(c$,8):RETURN IFn=0 THENc$=LEFT$(c$,8):RETURN ELSEc$=c$+CHR$(n):a=a+1:GOTO2160 n=PEEK(m+a):IFn=48 ORn=49 THENp$="PMT"+CHR$(n)+":":a=a+1:RETURN IFn=32 THENa=a+1:GOTO2190 p$="PMT0:":RETURN n=PEEK(m+a):IFn=0 THENRETURN IFn=32 THENa=a+1:GOTO2220 ELSEa n=PEEK(m+a):a=a+1:IFn=32 THEN2250 ELSERETURN j$=j$+"ST error":GOTO5000 IFg=1THEN6040 RESTORE# RESTORE#"",1,6060:WRITE#:GOTO6030 RESTORE#CHR$(26),0,6060:READ$ GOSUB70:e=o GOSUB90:IFn=240 THENEND IFPEEK(1608)>=247 THEN5000 IFn<>255 THENh$=CHR$(n):MODE32(h$):GOTO6070 GOSUB2090:k=768:s=256*PEEK(1609)+PEEK(1608):l$="" IFk=s THENWRITE#l$:GOTO6060 ELSEl$=l$+CHR$ (PEEK(k)):k=k+1:GOTO6100 e=o:j=0:a=0:IFi\16>0 THEN10100 IFa=0 THENPRINT"GET ";(e-f-1)/8;"data";:PRINT:PRINT "Converting..."; IFe<f+5 THENEND GOSUB70:n=PEEK(e-7):IFn>10 THEN10070 FORk=0 TO7:GOSUB90:POKE768+k,n:NEXT:MODE34("A("+STR$(j) +")"+CHR$(0)): j=j+1: GOTO10030 a=n\16 FORk=0 TO7:GOSUB90:a=a-1:IFa>=0 THENMODE32(CHR$(n)) NEXT MODE34("A$("+STR$(j)+")"+CHR$(0)):j=j+1:GOTO10030 GOSUB90:b=n:a=30:IF(i\16)=14 THENa=62 PRINT"GET $,";(e-f-a-2)/8;"data";:PRINT:PRINT"Converting...";:GOSUB70 FORk=0 TOa:GOSUB90:b=b-1:IFb>=0 THENMODE32(CHR$(n)) NEXT:MODE34("$"+CHR$(0)):GOTO10030

ANEXO I - GUA

30

LLAMADAS DE SISTEMA: MODOS ESPECIALES


Los modos especiales aqu mostrados no estn

documentados en el manual. Es posible, desde BASIC, ejecutar comandos propios del sistema, como borrar programas programas. Estos comandos tienen el formato MODE 3x, siendo la x el comando especial. En realidad estos modos no se pueden ejecutar directamente desde la RAM, aunque s desde la ROM de la librera de funciones. Por esta razn hay que implementar una rutina que se encargue de los procedimientos bsicos: 1) 2) 3) Saltar a la ROM. Ejecutar el comando MODE 3x retornar a nuestro programa completos o introducir lneas nuevas de

Es absolutamente necesario no alterar o cambiar el nmero de algunas lneas del programa que vaya a usar el modo especial. Los comandos que afecten a la edicin de otros programas (introducir lneas, borrar, etc) deben de ejecutarse desde un programa inferior o en el mismo programa (usado para

ANEXO I - GUA

31

lneas

posteriores).

Por

ejemplo

podremos,

desde

el

programa 2, introducir lneas en el programa 3. Esto se debe a que a partir de un programa inferior se puede en uso. Los modos especiales son el MODE30 ( ), MODE31( ), MODE32 ( ), MODE33 ( ). reasignar la memoria (moviendo bloques de memoria) con facilidad sin alterar la ejecucin del programa

MODE30( )
Borra el programa especificado como si usramos el comando NEW de BASIC. Sintaxis : MODE30( k$ ) k$ : Parmetro de tipo string (cadena de texto). Introducir en k$ un valor entre 0 y 9. Nota: No sirve usar otra variable distinta a k$. (Se puede usar otra variable pero asignndosele despus a la variable k$. Ej.- P$=0:k$=P$)

ANEXO I - GUA

32

k$ tiene que ser un carcter no un entero. (Ej.- 0 no es correcto, hay que poner 0. Se va a emplear el ahorro de caracteres. 10 k$=5:GOSUB 20:END:REM borrar el programa 5 20 GOSUB 21 21 DEFSEG=0:a=PEEK1685+256*PEEK1686:FORb=0TO7:POKEa+b, VAL(MID$(20424700510004116024004,b*3+1,3:NEXT:FORb=0 TO1:Ifb;RETURNELSEa=PEEK1682+256*PEEK1683:POKEa,128: POKEa+1,24:POKEa+2,4:RETURN:NEXT Observacin: Hay que borrar desde un programa anterior al programa que deseamos borrar. Los programas a continuacin del programa borrado se desplazarn hacia adelante para ocupar el hueco dejado.

ANEXO I - GUA

33

MODE31( )
Introduce la lnea en formato ASCIIZ de la direccin 768 en el programa especificado. Sintaxis : MODE31( m$ ) m$ : Parmetro de tipo string (cadena de texto). Introducir en m$ un valor entre 0 y 9. Se coloca en el Buffer de la funcin VALF la lnea a introducir (en la direccin 768). La lnea estar en formato ASCIIZ, es decir, una cadena de texto terminada con el valor 0. Las lneas a implementar en el programa que ejecutemos sern: Iniciar la variable m$ con un valor entre 0 y 9 (Ej.- m$=5) 1140 GOSUB1150 1150 DEFSEG=0:p=PEEK1685+256*PEEK1686:POKEp+5,215:POKEp+6 :POKEp+7,4:POKE1608,0:POKE1609,3:RETURN 1160 RETURN Poner en la direccin de memoria 768 la lnea introducir

ANEXO I - GUA

34

MODE32( )
Similar al MODE30. Sintaxis : MODE32( k$ ) k$ : Parmetro de tipo string (cadena de texto). Introducir en k$ un valor entre 0 y 9. Nota: No sirve usar otra variable distinta a k$. (Se puede usar otra variable pero asignndosele despus a la variable k$. Ej.- P$=0:k$=P$) k$ tiene que ser un carcter no un entero. (Ej.- 0 no es correcto, hay que poner 0. Se va a emplear el ahorro de caracteres. 10 k$=5:GOSUB 20:END:REM borrar el programa 5 20 GOSUB 21 21 DEFSEG=0:a=PEEK1685+256*PEEK1686:FORb=0TO7:POKEa+b, VAL(MID$(204247005050000200117004,b*3+1,3:NEXT:FORb=0 TO1:Ifb;RETURNELSEa=PEEK1682+256*PEEK1683:POKEa,212: POKEa+1,17:POKEa+2,4:RETURN:NEXT

ANEXO I - GUA

35

MODE33( )
Copia de un bloque de bytes de una parte a otra de la memoria. Sintaxis : MODE33(Param1,Param2,Param3) Param1 : origen. Param2 : destino. Param3 : representa la direccin de memoria de origen ms un desplazamiento. (Param3-Param1)=n de bytes a copiar. Debido a su caracterstica de funcin oculta sta tiene que ser llamada de una manera un tanto especial. Los parmetros de entrada tienen que ser unas variables fijas. Param1= f+1 Param2= t Param3= r Todas las variables usadas son de tipo entero.
ANEXO I - GUA

representa la direccin de memoria de representa la direccin de memoria de

36

Es obligatorio pasar los parmetros con los nombres de variables indicadas. MODE33(f+1,t,r) Representacin Grfica Ejemplo : Copiar de la zona de memoria 0 :1000h, 17 bytes, a la zona de memoria 0 :1 Param1 Param3=Param1+17 0 :1000h MEMORIA 0 :1 Param2

Descripcin detallada Esta funcin no puede ser accedida directamente desde el modo de operacin BASIC o modo CAL. Por esto se ha de

ANEXO I - GUA

37

acceder a esta funcin cediendo el control a un programa de la librera. Ser necesario preparar unas lneas especficas en el programa que quiera hacer uso de esta llamada al sistema. Esta llamada a sistema la realiza la calculadora en algunos programas de la librera (no descritos en el manual del propietario), exactamente en el programa 0900 y ms exactamente en la lnea 2090. Esta lnea se comporta en este programa, como una subrutina llamada por el comando GOSUB.

2090 r=e-f:t=o-r+1:MODE33(f+1,t,r):f=t-1 :IF(FRE(1))-r<0 THEN 20 2100 RETURN


Retorno de la subrutina

Debido a los parmetros existentes delante de la llamada a sistema MODE33(), es necesario volver a configurar estos, para adaptarlos a nuestros propsitos. Para esto tendremos que poner una lnea nmero 20 en nuestro programa BASIC con los comandos que se deseen. Las lneas siguientes pueden ser de distinta numeracin de las mostradas en el prximo ejemplo, pero su contenido debe de ser idntico.

ANEXO I - GUA

38

20 REM PONER AQU LOS COMANDOS QUE SE DESEEN 25 ON ERROR GOTO 20 30 GOSUB XX :RESUME ZZ Lnea que sigue a la XX XX POKE1759,92 :POKE1760,27 :POKE1761,4 :f=[P]-1 : e=([desp]-1)+[P] :o=[d]+(e-f)-1 :JCSOFT (poner cualquier expresin que provoque un error.) ZZ ........... Siendo : [P] el inicio de la cadena origen, [desp] el nmero de bytes a desplazar a partir de [P] y [d] la zona de memoria destino donde queremos situar el bloque de bytes. XX y ZZ representan nmeros de lnea cualesquiera (con la condicin de que ZZ>XX). NOTAS : las variables entre corchetes [P], [desp], [d] pueden ser cambiadas por las variables que deseemos. Las dems variables deben de ser las mismas que en el ejemplo anterior (f, e, o). Las sentencias POKE de la lnea XX son las encargadas de situar en el puntero de ON ERROR GOTO la direccin de memoria de la lnea 2090 del programa de librera 0900.

ANEXO I - GUA

39

Esta

direccin

es

la

4 :7004

que

se

expresa

como

92+256*27 en el banco de memoria nmero 4 (segmento).

Nota: Una aplicacin prctica del MODE31 y del MODE33 se puede ver en el captulo Paso de una Librera al programa P9.

ANEXO I - GUA

40

ESTRUCTURA INTERNA DE PROGRAMAS Y MEMO


Los programas en BASIC estn situados despus del rea de variables. Las lneas de programa estn formadas por una estructura del tipo: Long (Longitud lnea ) : 1 byte Num (Nmero lnea ) : Word (2 bytes) Car (Carcter espacio) : byte ASCII(32) BASIC(Instrucciones BASIC) : [Lon] bytes Zero (Carcter 0) : 1 byte El programa equivale a una estructura formada por n lneas ms el carcter ASCII(0). Para saber donde empieza un programa de los nueve disponibles se emplear la siguiente frmula:
P=PEEK1715+256*PEEK1716-15*(PROGRAMA+1) INICIO=PEEKP+256*PEEK(P+1 FIN=PEEK(P+3)+256*PEEK(P+4

Donde PROGRAMA es el nmero de programa (0-9). INICIO es la zona de memoria donde comienza el programa. FIN es la zona de programa donde termina el programa. Una representacin de un programa podra ser la siguiente.
INICIO INICIO+x+1 INICIO+x+y+2 FIN Lon x y z 0 Num ab cd ef Car 32 32 32 BASIC (codificado) . . . Zero 0 0 0

ANEXO I - GUA

41

Dentro de cada lnea en la parte de BASIC codificado existen unos cdigos especiales para identificar las instrucciones o separarlas. Estos son los siguientes:
Carcter 1 2 3 4,5,6,7 Descripcin Dos puntos (: ) para separar instrucciones Comienzo de comentario (REM) o () Representa instrucciones de salto (GOTO,GOSUB, ON , THEN, ELSE). Va acompaado por un nmero de 2 bytes o por una variable. TOKENS (instrucciones BASIC codificadas)

Estructura de instrucciones BASIC


La calculadora almacena cada estructura BASIC en memoria de una manera determinada. Para unas instrucciones en concreto tiene una pila de datos reservada en memoria. Existen unas pilas para las instrucciones GOSUB y FORNEXT. Tabla GOSUB Es una estructura de pila. Comienza en la direccin &HB80 de 8 en 8 bytes( ver captulo Tabla de Punteros para encontrar la cabeza y la cola de la pila)
Memoria
Cada cuadro es un byte

Direccin+segmento del puntero del programa llamador.

N de lnea del GOSUB

Direccin+segmento del separador tras el GOSUB ( : , 0 )

ANEXO I - GUA

42

Tabla FOR La pila de esta instruccin est dispuesta de 26 en 26 bytes ( ver captulo Tabla de Punteros para encontrar la cabeza y la cola de la pila).
FOR Variable de control =Valor Inicial TO Valor Final [STEP incremento]: :NEXT
Memoria
Direccin+segment Step N lnea o separador tras el del FOR NEXT Direccin+segment o separador tras el FOR Direccin+segmento de la variable de control Valor Final

Banco de datos (MEMO)


El banco de datos est formado por cadenas de texto ASCII ms el retorno de carro y el avance de lnea. El punto de entrada en la memoria se localiza con los punteros ( ver captulo Tabla de Punteros para encontrar el inicio
y el final de MEMO).

La estructura es la siguiente: Inicio de MEMO Registro 1, 13, 10 Registro 2, 13, 10 Registro n, 13, 10 26 x

Final de MEMO

Nota: El ltimo byte de MEMO es el cdigo ASCII 26.

ANEXO I - GUA

43

CODIFICACIN DE LOS COMANDOS BASIC

Los comandos BASIC se almacenan en la memoria de la calculadora en forma codificada, ocupando as menos espacio fsico en la RAM. El tamao ocupado por cada instruccin es de dos bytes. El primer byte indica el tipo de instruccin de que se trata (programacin general BASIC, operaciones matemticas, operaciones de cadenas de texto y entrada de teclado y por ltimo operadores lgicos, de bucles y de comparacin). El segundo byte es el identificador de la instruccin. Atendindonos al primer byte tendremos los siguientes valores segn el tipo:

Valor 04 05 06 07

Tipo Programacin general BASIC Operaciones matemticas Operaciones de cadenas de texto y entrada de teclado Operadores lgicos, de bucles y de comparacin

ANEXO I - GUA

44

Listado alfabtico de las instrucciones:

A
Instruccin ABS ACS ALL AND ANGLE AS ASC ASN ATN Cdigo 5,123 5,111 7,187 7,196 4,110 7,188 5,148 5,110 5,112 carcter ASCII _{ _o _ _ _n _ _ _n _p

B
Instruccin BEEP Cdigo 4,112 carcter ASCII _p

C
Instruccin CALC$ CALCJMP CHR$ CLEAR CLOSE CLS COS CSR CUR Cdigo 6,173 4,159 6,160 4,106 4,114 4,113 5,108 7,184 5,99 carcter ASCII _ _ _ _j _r _q _l _ _c

D
Instruccin Cdigo carcter ASCII
ANEXO I - GUA

45

DATA DEF DEFM DEFSEG DEG DIM DMS$

4,128 4,118 4,119 4,120 5,56 4,124 6,151

_ _v _w _x _8 _| _

E
Instruccin EDIT ELSE END EOF ERASE ERL ERR ERROR EXP Cdigo 4,111 *7,72 4,135 5,138 4,133 5,79 5,80 4,134 5,121 carcter ASCII _o _H _ _ _ _O _P _ _y

F
Instruccin FACT FIX FOR FRAC FRE Cdigo 5,103 5,126 4,129 5,127 5,141 carcter ASCII _g _~ _ _ _

G
Instruccin GOSUB GOTO Cdigo 4,74 4,73 carcter ASCII _J _I

H
ANEXO I - GUA

46

Instruccin HEX$ HYP HYPACS HYPASN HYPATN HYPCOS HYPSIN HYPTAN

Cdigo 6,163 5,172 5,117 5,116 5,118 5,114 5,113 5,115

carcter ASCII _ _ _u _t _v _r _q _s

I
Instruccin IF INKEY$ INPUT INT Cdigo 4,141 6,168 6,155 5,125 carcter ASCII _ _ _ _}

K
Instruccin KEY Cdigo 6,169 carcter ASCII _

L
Instruccin LEFT$ LEN LET LIST LLIST LN LOAD LOG LPRINT Cdigo 6,158 5,149 4,143 4,87 4,88 5,119 4,89 5,120 4,164 carcter ASCII _ _ _ _W _X _w _Y _x _

ANEXO I - GUA

47

M
Instruccin MID MID$ MOD MODE Cdigo 6,154 6,156 7,199 4,176 carcter ASCII _ _ _ _

N
Instruccin NCR NEW NEXT NOT NPR Cdigo 5,171 4,107 4,130 7,195 5,170 carcter ASCII _ _k _ _ _

O
Instruccin ON OPEN OR OUT Cdigo 4,154 4,151 7,194 4,153 carcter ASCII _ _ _ _

P
Instruccin PASS PBGET PBLOAD PEEK PI POKE POL PRINT Cdigo 4,83 4,180 4,179 5,134 5,96 4,99 5,168 4,163 carcter ASCII _S _ _ _ _` _c _ _
ANEXO I - GUA

48

PUT

4,165

R
Instruccin RAN# READ REC REM RESTORE RESUME RETURN RIGHT$ RND ROUND RUN Cdigo 5,147 4,168 5,167 4,169 4,77 4,76 4,75 6,157 5,145 5,144 4,109 carcter ASCII _ _ _ _ _M _L K _ _ _ _m

S
Instruccin SAVE SET SGN SIN SQR STEP STOP STR$ Cdigo 4,108 4,172 5,124 5,107 5,122 7,192 4,174 6,161 carcter ASCII _l _k _| _k _z _ _ _

T
Instruccin TAB TAN THEN TO Cdigo 7,182 5,109 7,71 7,193 carcter ASCII _ _m _G _

ANEXO I - GUA

49

TROFF TRON

4,95 4,93

__]

V
Instruccin VAC VAL VALF VAR VERIFY Cdigo 4,122 5,150 5,146 4,178 4,96 carcter ASCII _z _ _ _ _`

W
Instruccin WRITE# Cdigo 4,78 carcter ASCII _N

X
Instruccin XOR Cdigo 7,198 carcter ASCII _

ANEXO I - GUA

50

Tabla de cdigos (TOKENS) :Orden numrico Primer Byte: 2 4 5 6 7 Byte 71 THEN 72 ELSE 73 GOTO 74 GOSUB 75 RETURN 76 RESUME 77 RESTORE 78 WRITE# 79 ERL 80 ERR 81 82 83 PASS 84 85 86 87 LIST 88 LLIST 89 LOAD 90 91 92 93 TRON 94 95 TROFF 96 VERIFY PI 97 98 99 POKE CUR 100 101 102 103 FACT 104 105

ANEXO I - GUA

51

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

CLEAR NEW SAVE RUN ANGLE EDIT BEEP CLS CLOSE

DEF DEFM DEFSEG VAC DIM

SIN COS TAN ASN ACS ATN HYPSIN HYPCOS HYPTAN HYPASN HYPACS HYPATN LN LOG EXP SQR ABS SGN INT FIX FRAC

DATA FOR NEXT ERASE ERROR END

PEEK

EOF IF LET LOCATE ROUND RND FRE

ANEXO I - GUA

52

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

VALF RAN# ASC LEN VAL OPEN OUT ON DEG CALCJMP CHR$ STR$ PRINT LPRINT PUT READ REM SET STOP MODE VAR PBLOAD PBGET TAB CSR REC POL NPR NCR HYP CALC$ HEX$ DMS$ MID INPUT MID$ RIGHT$ LEFT$

INKEY$ KEY

ANEXO I - GUA

53

186 187 188 189 190 191 192 193 194 195 196 197 198 199

ALL AS STEP TO NOT AND OR XOR MOD

ANEXO I - GUA

54

COMANDOS NUEVOS

En este captulo se van a tratar varios comandos o instrucciones BASIC que no estn documentadas en el manual de usuario. Es una pena que no se hayan incluido en el manual, ya que son de una gran utilidad. Instruccin: INPUT@n;Variable @ -> Carcter comodn n <=250) Variable -> perteneciente al rango a~z; A~Z;a$~z$;A$~Z$ Utilidad: Introducir un mximo nmero n de caracteres. El signo ? no aparece al pedir la variable. Ejemplo.10 PRINTEdad?;:INPUT@3;edad ->nmero perteneciente al rango (1<= n

Con esta instruccin no hay que comprobar que se introduzcan ms de tres caracteres. La instruccin se encarga de esto, librndonos as de programacin adicional.

ANEXO I - GUA

55

Instruccin: INPUT$( n, @) n ->nmero perteneciente al rango (1<= n

<=250) @ -> Carcter comodn. Utilidad: Para elegir opciones en los programas. Elimina un barrido al refrescar la pantalla. Para usar claves de acceso al programa, ya que introduce un mximo nmero n de caracteres sin ser visualizados. Ejemplo.5 10 GOTO100,200: GOTO 10 100 REM Introducir datos 200 REM Calcular Tambin se puede emplear la instruccin para provocar una pausa en el programa: 10 PRINTPulsa una tecla para seguir; 20 $=INPUT$(1,@) 30 REM continuar el programa PRINT(1) Introducir

datosTAB(0(2)Calcular; op=VAL(INPUT$(1,@)):ONop

ANEXO I - GUA

56

Instruccin: CALC$

Utilidad: Almacenar una frmula en la variable de tipo string (cadena de texto), que guarda su contenido en el rea de almacenamiento de frmulas ( Function Memory), desde un programa BASIC. Ejemplo.10 CALC$=AREA=BASE*ALTURA

Pulsando OUT (tecla de Function Memory) visualizaremos la frmula. Normalmente se acompaara esta variable con la funcin CALCJMP

Instruccin: CALCJMP

Utilidad: Realiza la funcin de la tecla CALC (Function Memory) asignando valores a las variables en la frmula. Ejemplo.10 CALC$=AREA=BASE*ALTURA 20 CALCJMP Nota: Esta funcin slo debe ser utilizada desde el MODE 0 (Modo CALC). Utilizarla desde el MODE 1 (Modo BASIC) generar un error de llamada a funcin no vlida (FC error)
ANEXO I - GUA

57

ANEXO I - GUA

58

Instruccin: DEFCHR$(n) n ->nmero, rango 252 <=n<=255

Utilidad: Variable que define los 4 ltimos caracteres del cdigo ASCII de la calculadora. Para una mejor clarificacin ver captulo Cambiar Caracteres Ascii. Ejemplo.10 DEFCHR$(252)=FFFFFFFFFF 20 PRINT CHR$(252);

ANEXO I - GUA

59

CDIGOS DE TECLAS ESPECIALES


Cdigos de teclado para teclas especiales: El cdigo de las teclas se puede obtener con la sentencia: T=ASC(KEY) Tecla ENG MEMO MODE CALC LIB MENU S (SHIFT) IN OUT SHIFT+EXE E (Exponencial) ANS Cdigo hexadecimal 242 251 240 250 252 218 14 244 245 253 69 246

ANEXO I - GUA

60

OPTIMIZACIN DE CARACTERES
A la hora de introducir los programas es posible reducir la memoria usada. Los espacios en blanco entre comandos son usados como bytes desperdiciados. Este ahorro de espacio puede resultar beneficioso para aquellos usuarios que no dispongan de la ampliacin de memoria RP-33. Al mismo tiempo el ahorro de bytes se traduce en ahorro de edicin, ya que podemos escribir casi todos los comandos e instrucciones juntos. Esto va a redundar en una perdida de legibilidad. Quizs este modo de programar debera de ser usado por programadores ms expertos. Se van a mostrar varios ejemplos de ahorro de bytes: Eliminacin de parntesis sobrantes, signos de

concatenacin, espacios en blanco entre instrucciones, puntos y comas, dobles instrucciones, etc... , son varios modos de reducir bytes: Eliminar parntesis antes de ( :, THEN, EOL) Eliminar comillas antes de (EOL)
ANEXO I - GUA

61

Eliminar ; detrs de PRINT Ejemplo 1: Sin ahorro: nombre+TAB(0); Con ahorro: 10 PRINTCHR$ (9Escribe tu nombreTAB(0; Ejemplo 2: Sin ahorro: Con ahorro: Ejemplo 3: Sin ahorro: Con ahorro: Ejemplo 4: Sin ahorro: Con ahorro: Ejemplo 5: Cuando hay una instruccin condicional del tipo: IF THEN GOTO 100 se puede reducir THEN GOTO por GOTO. Sin ahorro: 10 IF X>200 THEN GOTO 200 50 PRINT Z$;G$;X$;A$;B$;C$; 50 PRINTZ$G$X$A$B$C$; 200 ON ERROR GOTO 100 200 ONERRORGOTO100 1000 IF T>=9 THEN R$=A 1000 IFT9;R$=A 10 PRINT CHR$ (9);Escribe tu

ANEXO I - GUA

62

Con ahorro: Ejemplo 6:

10 IFX>200GOTO200

Para estructuras complejas aqu tenemos el siguiente ejemplo. Sin ahorro: Con ahorro: 50 IF B=0 OR G$= THEN GOTO 30 ELSE IF X MOD 2+B MOD 2=0 THEN X=X/2 50 FB=0ORG$=GOTO30ELSEIFXMOD2+BM OD2 =0;X=X/2 Hay varios operadores que pueden ser substituidos: >= <= <> PI

En la estructura FOR I=A TO C no podremos reducir despus de la variable de inicio si esta es una letra. Sin ahorro: Con ahorro:
TO)

FOR I=1 TO 10 FOR H=A TO B FORI=1TO10 FORH=A TOB (Ntese el espacio entre A y

ANEXO I - GUA

63

Resumiendo: Existen bastantes maneras de ahorrar bytes en modo BASIC. El mtodo de ahorro es recomendable para aquellas calculadoras con poca memoria y para programadores ms expertos.

ANEXO I - GUA

64

CAMBIAR CARACTERES ASCII


La calculadora se reserva para su uso los cuatro ltimos caracteres de su cdigo ASCII. Usando el comando DEFCHR$ (n) (Ver captulo Comandos Nuevos) se pueden redefinir los caracteres. Un carcter representado en la pantalla es una malla de 5x7 puntos, como se muestra en la figura.

Para cambiar un carcter hay separar en columnas el carcter. La primera columna equivale a un valor en hexadecimal, las cuatro filas de arriba forman medio byte y los tres inferiores, ms una fila virtual, el otro medio byte, y as sucesivamente para las dems columnas. Nada mejor que un ejemplo para aclararlo todo:

ANEXO I - GUA

65

Vamos a cambiar el carcter 252 por el siguiente signo (el smbolo de un condensador):

Separando las columnas tendremos: Para el pixel activo el valor es 1, cero para el apagado. 23*0= 0 22*0=0 21*0=0 20*1=1 23*0= 0 22*0=0 Fila virtual 21*0=0 20*0=0 23*0= 0 22*1=4 21*1=2 20*1=1 23*1= 8 22*1=4 2 *0=0 2 *0=0 66
0 1

&H1 &H10 &H0

&H7 &H7C &HC


ANEXO I - GUA

23*0= 0 22*0=0 21*0=0 20*0=0 23*0= 0 22*0=0 2 *0=0 20*0=0


1

&H0 &H00 &H0

Las dems columnas son iguales que las dos primeras, ya que el dibujo es simtrico. Uniendo todos los bytes nos quedara: 10 DEFCHR$(252)=107C007C10 De esta manera tenemos ya el carcter 252 creado. Para visualizarlo basta con usar : 20 PRINTCHR$(252; Este es un programa que ayudar a editar los caracteres.
8000 8005 8010 8020 8030 DATACreador de caracteres (DEFCHR$) REM redefine los 4 ultimos caracteres CLS:A$="0000000000":X=0:M=128:LOCATE1,1:PRINTCHR$(255; C=VALF("&H"+MID$(A$,X*2+1,2 B$=LEFT$(A$,X*2)+MID$(HEX$(C),3)+MID$

ANEXO I - GUA

67

(A$,X*2+3:PRINTCHR$(11CHR$(5B$; 8040 C$=LEFT$(A$,X*2)+MID$(HEX$(CXORM),3)+MID$ (A$,X*2+3:F=0:LOCATE3,1:PRINTMID$("",2+(0=(C ANDM,1; 8050 F=1-F:IFF;DEFCHR$(255)=C$ELSEDEFCHR$(255)=B$ 8060 T=ASC(KEY:IFT=0GOTO8050ELSEIFT=30ANDM<128;M=M*2ELSEIFT=31AN DM2 ;M=M\2ELSEIFT=29ANDX>0;A$=B$:X=X-1:GOTO8020ELSEIFT=28ANDX<4; 8065 8070 8075 8076 8077 8080 8090 8100 A$=B$:X=X+1:GOTO8020 IFT>27ANDT<32GOTO8030 IFT=13;C=C XORM IFT=244GOTO8090 IFT=245GOTO8100 IFT>64ANDT<91;LOCATE0,1:PRINTCHR$(T; GOTO8030 CALC$=B$:PRINTCHR$(11CHR$(6"CALC";:$=INPUT$(1,@:GOTO8030 ONERRORGOTO8105:DEFCHR$(252)=CALC$:$="Seguir, Borrar o CALC (S,B,C)?" :F=1:GOTO8110 8105 $="Seguir o Borrar (S,B) ?":F=0:RESUME8110 8110 PRINTCHR$(11CHR$(5$; 8120 $=INPUT$(1:IF$="S"GOTO8030ELSEIF$="B"GOTO8000ELSEIF$="C"ANDF=1 ;A$=CALC$:GOTO8020ELSE8120

Resumiendo: Con un poco de imaginacin se pueden crear caracteres que se adecuen a nuestras necesidades con relativa facilidad.

ANEXO I - GUA

68

PASO DE UNA LIBRERA AL PROGRAMA P9


Los programas de la librera o biblioteca no pueden ser listados mediante procedimientos normales de edicin. Una solucin a este problema podra ser la copia de un programa de librera en un programa de la calculadora. Por razones de comodidad a la hora de programar se va a usar el programa P9 de BASIC. De usar un programa inferior, tendramos la dificultad de mover los programas posteriores de sitio en la memoria. Al ser el ltimo programa de la calculadora slo nos tenemos que preocupar de este programa, no de los anteriores. Existen varias maneras de trasladar un programa de la librera al P9. Una de ellas es manual y la otra automtica. Estos programas, por supuesto se podran mejorar, y puede ser un punto de partida para otros optimizados. Un ejemplo de forma manual sera la de insertar lneas conteniendo datos en el programa P9 hasta totalizar el tamao total en bytes de la librera para despus pasar byte a byte la informacin al P9. El clculo de datos a introducir lo realiza el programa nuestro.
ANEXO I - GUA

programas ms

69

Para no tener que llevar la cuenta de los datos introducidos, usaremos el Function Memory (Funcin de Almacenamiento de frmulas). De este modo tendremos que introducir x lneas con los datos de Function Memory en el P9. Conviene vaciar el P9 totalmente, aunque no sera necesario. El programa de ejecucin normal sera: (el nmero de las lneas puede ser el que se desee).
4000 4001 4010 4015 4020 4030 4040 4050 REM Pasa programa de libreria a P9 CLS DEFSEG=0:P=PEEK1712+256*PEEK1713:I=PEEKP+256*PEE K(P+1:F=PEEK(P+3)+256*PEEK(P+4 CLS:PRINT"Numero de libreria ?"TAB(0;:INPUT@5;R$ CLS:DEFSEG=5*4096:FORD=63413TO2^16STEP15:S$=" FORN=D TOD-1+LEN(R$:S$=S$+CHR$(PEEKN:NEXT CLS:PRINTD-7;S$;:IFR$<>S$;NEXT:END CLS:D=D-7:A=PEEKD+256*PEEK(D+1:B=PEEK(D+3)+256* PEEK(D+4:IFB-A>FI;CALC$="DATA":FORN=1TO200:CALC$= CALC$+"J":NEXT:PRINT"Hay que introducir en P9"(B-A-F+I)\ 204+1TAB(0"veces la linea de OUT":END PRINT"Pasando"B-A"bytes";TAB(0; C=4096*PEEK(D+2:FORN=0TOB-A:DEFSEG=C:B=PEEK(A+N: DEFSEG=0:POKEI+N,B:PRINTCHR$(5N;:NEXT BEEP:CLS:END

4055 4060 4070

Explicacin: En la lnea 4010 obtenemos el inicio y el final del P9, mirando en la tabla de punteros de programas (ver captulo Tabla de Punteros).
ANEXO I - GUA

70

La lnea 4015 es la de introduccin de la librera que deseamos pasar. Las siguientes hasta la 4040 son para comprobar la existencia de la librera. Busca en la tabla de punteros de librera, segmento 5 de memoria y mira en la tabla el numero de librera (ver captulo Localizacin de Libreras). Si existe contina, si no existe termina el programa. En la lnea 4050 llena el Function Memory con el comando DATA JJJJJJJJJJJJ. (J es un valor arbitrario). Indica al usuario que debe introducir x veces el valor de la Function Memory en el P9. Una vez hecho esto, cambiaremos al programa P9, y en BASIC editaremos las x lneas de la forma siguiente: Entraremos en el modo EDIT e introduciremos un nmero de lnea y a continuacin pulsaremos la tecla OUT y despus EXE. Conviene introducir los nmeros de lnea consecutivos para mayor claridad (Ej.- Nmeros de lneas 1,2,3,4.x) Una vez terminado este proceso volvemos de nuevo al programa nuestro y lo volvemos a ejecutar. Si el proceso anterior ha sido realizado correctamente el programa ir a las lneas finales, trasladando byte a byte el programa de la librera al P9.

ANEXO I - GUA

71

Estos procesos son bastante lentos debido a la propia velocidad del microprocesador de la calculadora y por la interaccin del usuario. Para reducir el tiempo de interaccin del usuario (editando el P9) est el siguiente programa que trabaja de una manera automtica. Est basado en el programa anterior, pero realizando las tareas de edicin usando llamadas a sistema (con lo que nos evitamos el engorro de la edicin).
10 999 1000 1140 1150 1160 2999 3000 3005 3010 3020 4000 4010 4015 4020 4030 4040 4050 CCAL$=CALC$:PRI=1:GOTO 4000 REM Insertar una linea en el P9 (llamada a Sistema MODE31) m$="9" GOSUB 1150 DEFSEG=0:PE=PEEK1685+256*PEEK1686:POKEPE+5,215: POKEPE+6,26:POKEPE+7,4:POKE1608,0:POKE1609,3:RETURN RETURN REM Pasar CALC$ al Buffer VALF (llamada a sistema MODE33) a=1024:b=768:c=LEN(CALC$):GOSUB 3005 GOSUB 3020:RESUME3010 RETURN DEFSEG=0:ONERRORGOTO 3020:POKE1759,92:POKE1760,27: POKE1761,4:f=a-1:e=c+f:o=b+c-1:jcsoft CLS:REM Pasa programa de libreria a P9 DEFSEG=0:P=PEEK1712+256*PEEK1713:I=PEEKP+256*PEEK (P+1:F=PEEK(P+3)+256*PEEK(P+4 IFPRI;CLS:PRINT"Numero de libreria ?"TAB(0;:INPUT@5;R$:PRI=0 CLS:DEFSEG=5*4096:FORD=63413TO2^16STEP15:S$=" FORN=D TOD-1+LEN(R$:S$=S$+CHR$(PEEKN:NEXT CLS:PRINTD-7;S$;:IFR$<>S$;NEXT:END CLS:D=D7:A=PEEKD+256*PEEK(D+1:B=PEEK(D+3)+256*PEEK

ANEXO I - GUA

72

4055 4060 4070 5000 5010

(D+4:IFB-A>FI;CALC$="DATA":FORN=1TO200:CALC$=CALC$+ "J":NEXT:PRINT"Introduciendo en P9"(B-A-F+I)\204+1TAB(0" veces la linea de OUT";:in=(B-A-F+I)\204+1:GOTO 5000 PRINT"Pasando"B-A"bytes";TAB(0;:ONERRORGOTO 4060 C=4096*PEEK(D+2:FORN=0TOB-A:DEFSEG=C:B=PEEK(A+N: DEFSEG=0:POKEI+N,B:PRINTCHR$(5N;:NEXT BEEP:CLS:CALC$=CCAL$:END FOR R=1 TO in:AA$=CALC$:CALC$=STR$(R)+" "+CALC$: GOSUB 3000:GOSUB1000:CALC$=AA$:NEXTR GOTO 4000

Explicacin: Es vlido todo lo citado para el programa anterior menos en lo referente a la edicin. El proceso automtico seguido es el de llenar la variable CALC$ de Function Memory con el nmero de lnea y moverlo a la direccin 768 de la memoria (donde se encuentra el Buffer de la funcin VALF) usando la llamada a sistema MODE33 (ver captulo Llamadas de Sistema). Una vez hecho esto introducimos la lnea en el P9 con la llamada al sistema MODE31. Una vez terminado se pasar byte a byte la librera al P9.

ANEXO I - GUA

73

ACCESO A LIBRERAS DESDE BASIC


Para acceder a las libreras de programas desde el modo calculadora (MODE 0) hay que teclear el nmero de librera y luego pulsar la tecla LIB. Desde dentro de un programa tambin podemos acceder a las libreras, mediante una serie de instrucciones. Instruccin: GOTOLIB0:Num, THENLIB0:Num, GOSUBLIB0:Num Num -> Nmero de librera (ver captulo Localizacin de libreras) Descripcin: Ejemplo1: Ejecuta la librera Num desde BASIC 5 REM ejecuta el men de libreras 10 GOTOLIB0:K0630 Ejemplo2: 5 REM ejecuta librera de matrices 100 IFa THENLIB0:5100 Ejemplo3: 5 REM salta a una librera de estadstica 10 GOSUBLIB0:S6410

ANEXO I - GUA

74

Si se usa un nmero de librera que no existe se generar un error no documentado:


Cdigo de error Mensaje de error Significado Correccin

10

NF Error (Error NF) (Error Not Found)

No se encontr la librera especificada (desde modo BASIC)

Introducir un nmero de librera existente

ANEXO I - GUA

75

ELIMINAR CONTRASEA
A veces el uso de una contrasea entraa el riesgo de que sta permanezca en el olvido. La contrasea se almacena en la RAM como una cadena ASCIIZ de 8 bytes, es decir, una cadena de texto de 8 bytes ms el byte cero. El mtodo de eliminacin de la contrasea es de lo ms simple. Lo primero que hay que hacer es localizar la direccin de memoria donde se aloja la misma. Lo segundo es llenar el primer byte de esa direccin con el carcter cero. Para el primer paso en el captulo Tabla de Punteros podemos conocer la direccin donde se aloja la contrasea. Esta direccin es la 1867. Basta usar la instruccin POKE1867,0 y la contrasea estar eliminada. As de simple.

ANEXO I - GUA

76

OCULTAR EL BANCO DE DATOS(MEMO)


Este apartado sirve para ocultar el banco de datos (MEMO) hacindola parecer vaca. Hay que tener en cuenta unos detalles a la hora de ocultar MEMO. Es indispensable una vez oculta, no volver a escribir en el banco de datos, porque podemos desestabilizar el sistema. El procedimiento es similar a la eliminacin de la contrasea (ver captulo Eliminar contrasea ). Consiste en cambiar el primer byte de MEMO a cero (o a otro byte menor que 32). Se aconseja en el primer byte de MEMO escribir un carcter espacio antes de cambiar a cero. Un programa podra ser el siguiente:
10 20 30 CLS:DEFSEG=0 P=PEEK1703+256*PEEK1704 IFPEEKP=0;PRINTMemo oculta o vacaTAB(0Deseas recuperarla 40 (S/N)?;:INPUT@2;$:IF$=SOR$=s;POKEP,32:END PRINTDeseas ocultar la MEMO(S/N)?;:INPUT@2;$:IF$=SOR$=s ;POKEP,0:END

ANEXO I - GUA

77

LONGITUD DE LOS PROGRAMAS


Para llevar un control de la memoria ocupada por los programas no se ha implementado ninguna funcin. No obstante en esta gua extraoficial se ha puesto remedio para ello. Para conocer la longitud de los programas los punteros de los programas nos pueden servir (Ver captulo Tabla de Punteros). Cada estructura de programa consta de 15 bytes de informacin. Estas van desde el P9 al P0, continuando despus con la informacin del Banco de Datos (MEMO).
[xxxx] Lo que hay en la direccin xxxx (vara segn la cantidad de RAM [1709] [1712] [1715]

MEMO P9 P8 P7 P6 P5 P4 P3 P2 P1 P0
15 bytes

INICIO

B L

FINAL

B L

8 0

32

32

32

32

32

32

ANEXO I - GUA

78

Un ejemplo de programa para conocer la longitud de los programas podra ser el siguiente: Nota: No leemos la informacin de BL, ya que el segmento est en la RAM (DEFSEG=0). Si quisiramos hacer lo mismo con las libreras tendramos que usar DEFSEG=4*4096 o DEFSEG=5*4096.
10 20 30 40 50 CLEAR:DEFSEG=0:GOSUB100:P=PEEK1712+256*PEEK1713+DESP I=PEEKP+256*PEEK(P+1 F=PEEK(P+3)+256*PEEK(P+4 IFR;R$="MEMO"ELSER$="P"+P$ CLS:PRINT"Longitud: Fisica="F-I;TAB(8": Logica="F-I-1" bytes";:LOCATE2,1:PRINTR$: 100 GOTO10 CLS:PRINTCHR$(9"Longitud de programas"TAB(0"(M)EMO /N. PROGRAMA ?";: 110 120 130 140 150 INPUT@2;P$ PP=VAL(P$ IFP$="M";DESP=-15:R=1:RETURN IFPP<0ORPP>9GOTO100 IFASC(P$>57ORASC(P$<48GOTO100 DESP=15*(15-(PP+6:RETURN

ANEXO I - GUA

79

CONECTOR DE LA AMPLIACIN DE RAM (RP-33)


La ampliacin RP-33 es un producto hardware de la calculadora. En el manual de usuario no se menciona nada sobre su topologa. Abajo se da una breve descripcin de las conexiones con la calculadora:

16 conectores

14 conectores

1
SPI W/R CS2 CS AD8 AD9 AD11 OE AD10 CS1 ID8 ID7 ID6 ID5 ID3 ID4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

1 /2

Read/Write Chip Select 2 Chip Select Direccin 8 Direccin 9 Direccin 11 Output Enable Direccin 10 Chip Select 1 Datos 8 Datos 7 Datos 6 Datos 5 Datos 3 Datos 4

VPP VPP CS3 AD12 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 ID1 ID2 Vss Vss

Alimentacin Alimentacin Chip Select 3 Direccin 12 Direccin 7 Direccin 6 Direccin 5 Direccin 4 Direccin 3 Direccin 2 Direccin 1 Direccin 1 Datos 1 Datos 2 0 Voltios (Masa) 0 Voltios (Masa)

ANEXO I - GUA

80

CONECTOR DE PERIFRICOS
El esquema de conexin es el siguiente :

1 2

1 2 3 4 5 6 7 8 9
10 11 12 13 14

+5 V

BUSY. Impresora BUSY. Impresora preparada para recibir preparada para recibir datos datos

3 4 5

Entrada LOAD/RS 232C PSTB. Peticin de impresora. (Print Strobe) Control REM Cassette. =0 cassette en marcha Calculadora ON/OFF =0 Calculadora encendida IO5 IO6 IO7 IO8 AD1 bit 1 cursor OE 2 pasos a cero por

A cero al abrirse un canal de RS 232 C Salida SAVE/RS 232C IO4 IO3 IO2 IO1 bit 0 cursor AD0 bit 2 cursor AD2 RD/W R

6 7 8 9
10 11 12 13 14

15 15 GND 0V El conector de perifricos de la calculadora no es un cada carcter a impresora conector estndar. La marca CASIO tiene su propia interfaz

ANEXO I - GUA

81

de transmisin de datos y no est muy por la labor de vender conectores sueltos. Es un conector de 30 patillas (15 arriba - 15 abajo de forma totalmente paralelas). Las seales de este conector son niveles TTL de 0 a 5V frente a las de un conector RS-232. Sirve tanto para la comunicacin serie como para sacar datos a la impresora.

ANEXO I - GUA

82

ndice
INTRODUCCIN.........................................................................................................................................1 DIRECCIONAMIENTO DE LA MEMORIA RAM....................................................................................3 TABLA DE PUNTEROS..............................................................................................................................6 ALMACENAMIENTO DE VARIABLES Y PUNTEROS..........................................................................8 LISTADO DE LA MEMORIA ROM.........................................................................................................16 LOCALIZACIN DE LA BIBLIOTECA (LIBRERIAS).........................................................................19 LIBRERAS NO DOCUMENTADAS........................................................................................................25 LLAMADAS DE SISTEMA: MODOS ESPECIALES.............................................................................31 ESTRUCTURA INTERNA DE PROGRAMAS Y MEMO.......................................................................41 CODIFICACIN DE LOS COMANDOS BASIC.....................................................................................44 COMANDOS NUEVOS..............................................................................................................................55 CDIGOS DE TECLAS ESPECIALES.....................................................................................................60 OPTIMIZACIN DE CARACTERES.......................................................................................................61 CAMBIAR CARACTERES ASCII............................................................................................................65 PASO DE UN LIBRERA AL PROGRAMA P9........................................................................................69 ACCESO A LIBRERAS DESDE BASIC.................................................................................................74 ELIMINAR CONTRASEA......................................................................................................................76 OCULTAR EL BANCO DE DATOS(MEMO)..........................................................................................77 LONGITUD DE LOS PROGRAMAS........................................................................................................78 CONECTOR DE LA AMPLIACIN DE RAM (RP-33)...........................................................................80 CONECTOR DE PERIFERICOS...............................................................................................................81

ANEXO I - GUA

83

Anda mungkin juga menyukai