Está en la página 1de 84

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

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:

1673
1676
1682
1685
1688
1691
1697
1700
1703
1706
1709
1712
1715
1718
1737
1750

0:
0:
0:
0:
0:

1753
1759
1762
1767
1774

0:
0:
0:
0:

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

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

la

aprenderemos

estructura
a

de

obtener

los

la

tabla

de

punteros,

as

variables
como

su

estructura.
La estructura de un puntero es la siguiente: (cada cuadro es
un byte)
LSB

MSB

BL

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

10

Se han obviado los segmentos debido a que sabemos que


las variables estn en la memoria RAM (DEFSEG=0).

ANEXO I - GUA

11

PI

PF

Variable Variable

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


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

string
=4 si es un Nmero

=8 si es una matriz de
strings

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

12

Longitud

Nombre

Direcci

Hexadecimal/
Ascii

nombre
14

53

n
6E 27

(1*16+4=20=&H14)

CHR$(53)=S

&H276E

.Sn'

34

43 48 32

76 27

34 43 48 32 76 27

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

C+H+2

&H2776

4CH2v'

40

43 48 41 52

C0 0C

40 43 48 41 52 C0

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

C+H+A+R

&H0CC0

14 53 6E 27

0C

@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

1 BYTE

DE

BC

0A

ANEXO I - GUA

13

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

MN
100-

ABS(XY)
100-

1
6

ABS(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

14

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

15

Nota: Los nmeros estn todos en hexadecimal

Cadena alfanumrica (texto): ejemplo de cadena de


texto
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

16

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.
Puntero de cdigos de
teclado
cdigos de
teclado

Inicio de la ROM
Direccin de inicio
librera
Direccin final de
librera

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

ASCII
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

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

17

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

................
..........
...........
..............
........
........
........
........
........
........
........
........
........
...........
................
................
................
................
...... .!.".#.$.
%.&.'.(.).).).).
).-.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$

ANEXO I - GUA

18

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

CSR TO STEP
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

19

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

; Direccionar segmento 5

20 NL=1:D=NL*15

; NL= Nmero de librera

30 P=63406+D

; Posicin de la tabla de punteros

40 INICIO=PEEKP+256*PEEK(P+1

; Obtener el inicio de la librera

50 FIN=PEEK(P+3)+256*PEEK(P+4

; 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

20

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

Inicio

Final

0400
0800
0900
1000
5010
5020
5040
5050
5060
5080
5090
5100
5200
5220
5230
5250
5260
5270
5280
5290

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
4:28946
4:29791

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
4:29790
4:31029

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

bytes
bytes
bytes
bytes
bytes
bytes
bytes
bytes
bytes
bytes
bytes
bytes
bytes
bytes
bytes
bytes
bytes
bytes
bytes
bytes
ANEXO I - GUA

21

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
5745
5750

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:51166
4:51537

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
4:51536
4:52187

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
0370
0650

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

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
6510
6520

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
5:24427
5:24452

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
5:24451
5:24476

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
0024
0024

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

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
M6510
M6710

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:39376
5:43179

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
5:43178
5:44181

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
3802
1002

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

24

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

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: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

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

25

LIBRERAS NO
DOCUMENTADAS
Existen varios programas de la biblioteca (libreras) no
documentados.

Estos

programas

corresponden

los

de

la

nmeros:
0400

->Programa

de

testeo

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

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

26

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

27

Librera: 0800

Programa para la Impresora

(carga de caracteres)
10

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,

20

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,

30

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

40

,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

50

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$;

60

"%"; 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

ANEXO I - GUA

28

Librera: 0900

Convertidor de PB100 a FX-

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

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

29

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

30

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

31

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

completos

introducir

lneas

nuevas

de

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)

Saltar a la ROM.

2)

Ejecutar el comando MODE 3x

3)

retornar a nuestro programa

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

32

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

reasignar

la

memoria

(moviendo

bloques

de

memoria) con facilidad sin alterar la ejecucin del programa


en uso.
Los modos especiales son el MODE30 ( ), MODE31( ),
MODE32 ( ), MODE33 ( ).

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

33

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

continuacin del programa borrado se desplazarn hacia


adelante para ocupar el hueco dejado.

ANEXO I - GUA

34

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

35

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

36

MODE33( )
Copia de un bloque de bytes de una parte a otra de la
memoria.
Sintaxis :
MODE33(Param1,Param2,Param3)
Param1 :

representa la direccin de memoria de

origen.
Param2 :

representa la direccin de memoria de

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

37

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
acceder a esta funcin cediendo el control a un programa
de la librera.
ANEXO I - GUA

38

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.

20 REM PONER AQU LOS COMANDOS QUE SE DESEEN

ANEXO I - GUA

39

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.
Esta

direccin

es

la

4 :7004

que

se

expresa

como

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

ANEXO I - GUA

40

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

41

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

Num
ab
cd
ef

Car
32
32
32

BASIC (codificado)
.
.
.

Zero
0
0
0

ANEXO I - GUA

42

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

43

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
incremento]: :NEXT

=Valor

Inicial

TO

Valor

Final

[STEP

Memoria
Step
N lnea
Direccin+segment
del FOR
o separador tras el
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

Final de MEMO

Registro 1, 13, 10
Registro 2, 13, 10

Registro n, 13, 10
26
x

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

ANEXO I - GUA

44

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

Tipo
Programacin general BASIC
Operaciones matemticas
Operaciones de cadenas de texto y entrada de

07

teclado
Operadores lgicos, de bucles y de comparacin

ANEXO I - GUA

45

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

Instruccin
BEEP

Cdigo
4,112

carcter ASCII
_p

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

ANEXO I - GUA

46

Instruccin
DATA
DEF
DEFM
DEFSEG
DEG
DIM
DMS$

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

carcter ASCII
_
_v
_w
_x
_8
_|
_

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

Instruccin
FACT
FIX
FOR
FRAC
FRE

Cdigo
5,103
5,126
4,129
5,127
5,141

carcter ASCII
_g
_~
_
_
_

Instruccin
GOSUB
GOTO

Cdigo
4,74
4,73

carcter ASCII
_J
_I

ANEXO I - GUA

47

H
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

Instruccin
IF
INKEY$
INPUT
INT

Cdigo
4,141
6,168
6,155
5,125

carcter ASCII
_
_
_
_}

Instruccin
KEY

Cdigo
6,169

carcter ASCII
_

Instruccin
LEFT$
LEN
LET
LIST
LLIST
LN

Cdigo
6,158
5,149
4,143
4,87
4,88
5,119

carcter ASCII
_
_
_
_W
_X
_w

ANEXO I - GUA

48

LOAD
LOG
LPRINT

4,89
5,120
4,164

_Y
_x
_

Instruccin
MID
MID$
MOD
MODE

Cdigo
6,154
6,156
7,199
4,176

carcter ASCII
_
_
_
_

Instruccin
NCR
NEW
NEXT
NOT
NPR

Cdigo
5,171
4,107
4,130
7,195
5,170

carcter ASCII
_
_k
_
_
_

Instruccin
ON
OPEN
OR
OUT

Cdigo
4,154
4,151
7,194
4,153

carcter ASCII
_
_
_
_

Instruccin
PASS
PBGET
PBLOAD

Cdigo
4,83
4,180
4,179

carcter ASCII
_S
_
_

ANEXO I - GUA

49

PEEK
PI
POKE
POL
PRINT
PUT

5,134
5,96
4,99
5,168
4,163
4,165

_
_`
_c
_
_
_

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

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
_
_
_

ANEXO I - GUA

50

Instruccin
TAB
TAN
THEN
TO
TROFF
TRON

Cdigo
7,182
5,109
7,71
7,193
4,95
4,93

carcter ASCII
_
_m
_G
_
__]

Instruccin
VAC
VAL
VALF
VAR
VERIFY

Cdigo
4,122
5,150
5,146
4,178
4,96

carcter ASCII
_z
_
_
_
_`

Instruccin
WRITE#

Cdigo
4,78

carcter ASCII
_N

Instruccin
XOR

Cdigo
7,198

carcter ASCII
_

ANEXO I - GUA

51

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

52

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

FRE

LET
LOCATE

ROUND
RND
ANEXO I - GUA

53

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

DMS$

OUT
ON
DEG

MID
INPUT
MID$
RIGHT$
LEFT$

CALCJMP
CHR$
STR$
PRINT
LPRINT
PUT
READ
REM
SET

HEX$

REC
POL

INKEY$
KEY

NPR
NCR
HYP
CALC$

STOP
MODE
VAR
PBLOAD
PBGET
TAB
CSR

ANEXO I - GUA

54

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

55

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

->nmero perteneciente al rango (1<= 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

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

56

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.-

PRINT(1)

Introducir

datosTAB(0(2)Calcular;
10

op=VAL(INPUT$(1,@)):ONop

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

ANEXO I - GUA

57

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

58

ANEXO I - GUA

59

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

60

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

Cdigo

ENG
MEMO
MODE
CALC
LIB
MENU
S (SHIFT)
IN
OUT
SHIFT+EXE
E

hexadecimal
242
251
240
250
252
218
14
244
245
253
69

(Exponencial)
ANS

246

ANEXO I - GUA

61

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

62

Eliminar ; detrs de PRINT


Ejemplo 1:
Sin ahorro:

10

PRINT

CHR$

(9);Escribe

tu

nombre+TAB(0);
Con ahorro:

10

PRINTCHR$

(9Escribe

tu

nombreTAB(0;
Ejemplo 2:
Sin ahorro:
Con ahorro:

1000 IF T>=9 THEN R$=A


1000 IFT9;R$=A

Ejemplo 3:
Sin ahorro:
Con ahorro:

200 ON ERROR GOTO 100


200 ONERRORGOTO100

Ejemplo 4:
Sin ahorro:
Con ahorro:

50 PRINT Z$;G$;X$;A$;B$;C$;
50 PRINTZ$G$X$A$B$C$;

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

ANEXO I - GUA

63

Con ahorro:

10 IFX>200GOTO200

Ejemplo 6:
Para estructuras complejas aqu tenemos el siguiente
ejemplo.
Sin ahorro:

50 IF B=0 OR G$= THEN GOTO 30 ELSE


IF X MOD 2+B MOD 2=0 THEN X=X/2

Con ahorro:

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:

FOR I=1 TO 10
FOR H=A TO B

Con ahorro:

FORI=1TO10
FORH=A TOB (Ntese el espacio entre A y

TO)

ANEXO I - GUA

64

Resumiendo: Existen bastantes maneras de ahorrar bytes


en modo BASIC. El mtodo de ahorro es recomendable para
aquellas

calculadoras

con

poca

memoria

para

programadores ms expertos.

ANEXO I - GUA

65

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

66

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

&H1

20*1=1
23*0=
0
22*0=0
1

Fila
virtual

2 *0=0

&H10
&H0

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

&H7

20*1=1

&H7C

2 *1=
8
22*1=4
1

2 *0=0
0

2 *0=0 67

&HC
ANEXO I - GUA

23*0=
0
22*0=0

&H0

21*0=0
20*0=0

&H00

2 *0=
0
22*0=0

&H0

2 *0=0
20*0=0

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

68

(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=31AND
M2
;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

69

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

programas ms

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

70

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

4055
4060
4070

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

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

71

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

72

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
(D+4:IFB-A>F-I;CALC$="DATA":FORN=1TO200:CALC$=CALC$

ANEXO I - GUA

73

4055
4060
4070
5000
5010

+
"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

74

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:

Ejecuta la librera Num desde BASIC

Ejemplo1:

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

75

Si se usa un nmero de librera que no existe se generar


un error no documentado:
Cdigo de

Mensaje de

Significado

Correccin

error

error

10

NF Error

No se encontr la

Introducir un nmero

(Error NF)

librera especificada

de librera existente

(Error Not

(desde modo BASIC)

Found)

ANEXO I - GUA

76

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

77

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

78

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

79

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

80

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 /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

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

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

81

CONECTOR DE PERIFRICOS
El esquema de conexin es el siguiente :

Entrada LOAD/RS 232C

PSTB. Peticin de impresora.


(Print Strobe)

IO4

IO3

IO5

IO2

10

10

IO6

IO1

11

11

IO7

bit 0 cursor
AD0

12

12

IO8

bit 2 cursor
AD2

13

13

AD1 bit 1 cursor

14

14

OE

. Impresora
BUSYBUSY
. Impresora
preparada
para
recibir
preparada para
recibir
datos
datos

A cero al abrirse
un canal de RS
232 C
Salida SAVE/RS
232C

RD/W
R

+5 V

Control REM Cassette.


=0 cassette en
marcha
Calculadora ON/OFF
=0 Calculadora encendida

0V
pasos a cero por
El conector deGND
perifricos
de la2cada
calculadora
no es un
carcter a
conector estndar. La marca CASIOimpresora
tiene su propia interfaz
15

15

ANEXO I - GUA

82

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

83

ndice
INTRODUCCIN............................................................................................................
DIRECCIONAMIENTO DE LA MEMORIA RAM..................................................................
TABLA DE PUNTEROS...................................................................................................
ALMACENAMIENTO DE VARIABLES Y PUNTEROS..........................................................
LISTADO DE LA MEMORIA ROM....................................................................................
LOCALIZACIN DE LA BIBLIOTECA (LIBRERAS)...........................................................
LIBRERAS NO DOCUMENTADAS...................................................................................
LLAMADAS DE SISTEMA: MODOS ESPECIALES............................................................
ESTRUCTURA INTERNA DE PROGRAMAS Y MEMO........................................................
CODIFICACIN DE LOS COMANDOS BASIC...................................................................
COMANDOS NUEVOS...................................................................................................
CDIGOS DE TECLAS ESPECIALES...............................................................................
OPTIMIZACIN DE CARACTERES..................................................................................
CAMBIAR CARACTERES ASCII.......................................................................................
PASO DE UN LIBRERA AL PROGRAMA P9.....................................................................
ACCESO A LIBRERAS DESDE BASIC.............................................................................
ELIMINAR CONTRASEA...............................................................................................
OCULTAR EL BANCO DE DATOS(MEMO).......................................................................
LONGITUD DE LOS PROGRAMAS..................................................................................
CONECTOR DE LA AMPLIACIN DE RAM (RP-33)..........................................................
CONECTOR DE PERIFRICOS........................................................................................

ANEXO I - GUA

84

También podría gustarte