Diferencias
Muestra las diferencias entre dos versiones de la página.
009:iniciacion [d/m/Y H:i] – creado miguel | 009:iniciacion [d/m/Y H:i] (actual) – [Iniciación: Cómo se almacena en memoria un programa Basic] miguel | ||
---|---|---|---|
Línea 15: | Línea 15: | ||
Todos los ordenadores, | Todos los ordenadores, | ||
- | _El intérprete | + | ==== El intérprete |
- | La explicación está en el «intérprete». En la memoria ROM reside, además del sistema operativo, el intérprete que se encarga de «traducir» a bits toda la infor- | + | La explicación está en el «intérprete». En la memoria ROM reside, además del sistema operativo, el intérprete que se encarga de «traducir» a bits toda la información que entra en el microprocesador. Es decir, nosotros hablamos al intérprete en Basic y éste a su vez, al microprocesador en bits. Cuando el microprocesador responde |
- | mación que entra en el microprocesador. Es decir, nosotros hablamos al intérprete en Basic y éste a su vez, al microprocesador en bits. Cuando el microprocesador responde —en bits, por supuesto—, | + | ==== El programa |
- | + | ||
- | ___ El programa | + | |
El programa Basic también reside en memoria, pero en la parte de RAM, por lo que puede ser alterado en todo momento. La forma en que está almacenado es un tanto peculiar. No puede ser directamente «digerido» por el microprocesador, | El programa Basic también reside en memoria, pero en la parte de RAM, por lo que puede ser alterado en todo momento. La forma en que está almacenado es un tanto peculiar. No puede ser directamente «digerido» por el microprocesador, | ||
- | 10 REM •'DEMOSTRACION" | + | <code basic> |
+ | 10 REM "DEMOSTRACION" | ||
15 LET z=0 | 15 LET z=0 | ||
- | + | 20 FOR X=10 TO 200 STEP 6 | |
- | 20 FOR X=10 TO 200 5TEP 6 | + | 30 FOR y=10 TO 20 STEP 4 |
- | + | 40 CIRCLE | |
- | 30 FOR y =10 TO 20 STEP 4. | + | 50 NEXT y: LET z=z + 1: NEXT x |
- | + | 70 PRINT AT 0, 11; PAPER 1; INK 7; FLASH 1; "FINAL" | |
- | 40 CIRCLE | + | </ |
- | + | ||
- | 50 NEXT y: LET Z=Z + 1: NEXT X | + | |
- | + | ||
- | 70 PRINT RT 0,11, PRPER 1, INK | + | |
- | + | ||
- | 7; FLfiSH | + | |
Vamos a realizar un pequeño experimento en este sentido que nos clarificará las ideas. | Vamos a realizar un pequeño experimento en este sentido que nos clarificará las ideas. | ||
Línea 45: | Línea 37: | ||
Teclee cuidadosamente el programa demostración, | Teclee cuidadosamente el programa demostración, | ||
- | Lo primero que tenemos que hacer para ver la estructura interna del programa Basic, es averiguar dónde se encuentra éste. El programa no está siempre situado en la misma zona, ya que el sistema operativo lo desplaza por la memoria según sus propias necesidades de espacio. Al final de cualquier desplazamiento, | + | Lo primero que tenemos que hacer para ver la estructura interna del programa Basic, es averiguar dónde se encuentra éste. El programa no está siempre situado en la misma zona, ya que el sistema operativo lo desplaza por la memoria según sus propias necesidades de espacio. Al final de cualquier desplazamiento, |
- | + | ||
- | vadas para este fin. Es la variable del sistema llamada «PROG». | + | |
A partir de este momento, es conveniente tener a la vista el manual de instrucciones del Spectrum abierto por la página 174. Allí se relacionan las variables del sistema y sus respectivos cometidos. | A partir de este momento, es conveniente tener a la vista el manual de instrucciones del Spectrum abierto por la página 174. Allí se relacionan las variables del sistema y sus respectivos cometidos. | ||
Línea 53: | Línea 43: | ||
Puesto que el Spectrum sólo puede almacenar un byte (ocho bits) en cada casilla de memoria, y toda la información que es capaz de manejar un microprocesador está en notación binaria (unos y ceros), ésto quiere decir que el menor número que puede haber en una posición de memoria es el 00000000 (0 en decimal) y el mayor el 11111111 (255 en decimal). Cualquier número que supere este valor, ha de ser almacenado en memoria utilizando técnicas especiales. En este caso concreto, cuando el Spectrum precisa anotar un número comprendido entre 0 y 65535 (todos los valores que comprenden las direcciones de memoria) lo divide en dos bytes (que llamamos «más significativo» y «menos significativo») utilizando las siguientes fórmulas: | Puesto que el Spectrum sólo puede almacenar un byte (ocho bits) en cada casilla de memoria, y toda la información que es capaz de manejar un microprocesador está en notación binaria (unos y ceros), ésto quiere decir que el menor número que puede haber en una posición de memoria es el 00000000 (0 en decimal) y el mayor el 11111111 (255 en decimal). Cualquier número que supere este valor, ha de ser almacenado en memoria utilizando técnicas especiales. En este caso concreto, cuando el Spectrum precisa anotar un número comprendido entre 0 y 65535 (todos los valores que comprenden las direcciones de memoria) lo divide en dos bytes (que llamamos «más significativo» y «menos significativo») utilizando las siguientes fórmulas: | ||
- | —Fórmula 1— | + | Fórmula 1: |
- | byte menos significativo=número-256*INT (número/ | + | * byte menos significativo=número-256*INT (número/ |
+ | * byte más significativo=INT (número/ | ||
Para restituir el número a su valor original, utiliza esta otra fórmula: | Para restituir el número a su valor original, utiliza esta otra fórmula: | ||
- | —Fórmula 2— | + | Fórmula 2: |
- | número=byte menos significativo+256«byte | + | * número=byte menos significativo+256*byte |
Vamos ahora con el ejemplo práctico. Ya hemos visto que el principio de nuestro programa Basic no es siempre el mismo. Vamos a averiguar dónde se encuentra en este caso. La dirección de comienzo está contenida en la variable PROG y, para restituir su valor original (no olvidemos que está partido en dos bytes), hay que teclear lo siguiente: | Vamos ahora con el ejemplo práctico. Ya hemos visto que el principio de nuestro programa Basic no es siempre el mismo. Vamos a averiguar dónde se encuentra en este caso. La dirección de comienzo está contenida en la variable PROG y, para restituir su valor original (no olvidemos que está partido en dos bytes), hay que teclear lo siguiente: | ||
- | PRINT PEEK 23635+256.PEEK 23636 | + | <code basic> |
+ | PRINT PEEK 23635+256*PEEK 23636 | ||
+ | </ | ||
(Hay que tener en cuenta que por lo general, el octeto menos significativo se almacena en primer lugar). | (Hay que tener en cuenta que por lo general, el octeto menos significativo se almacena en primer lugar). | ||
Línea 71: | Línea 64: | ||
Una vez hecho esto sabremos dónde comienza exactamente nuestro programa. Anote ese número. | Una vez hecho esto sabremos dónde comienza exactamente nuestro programa. Anote ese número. | ||
- | Por otra parte, resulta también necesario conocer dónde acaba el programa. Este detalle puede saberse sólo de forma aproximada, ya que el ordenador cuenta como programa algunos de los bytes que en realidad utiliza para almacenar las variables, pila de cálculo, etc. De todas | + | Por otra parte, resulta también necesario conocer dónde acaba el programa. Este detalle puede saberse sólo de forma aproximada, ya que el ordenador cuenta como programa algunos de los bytes que en realidad utiliza para almacenar las variables, pila de cálculo, etc. De todas formas, resulta bastante aproximado basarnos en el dato almacenado en la variable STKEND y que indica el comienzo de la zona libre de RAM. Para conocer este valor hay que aplicar de nuevo la fórmula 2 teniendo en cuenta que el byte menos significativo es el almacenado en primer lugar (PEEK 23653) y el más significativo es el que está en la posición de memoria 23654. |
- | formas, resulta bastante aproximado basarnos en el dato almacenado en la variable STKEND y que indica el comienzo de la zona libre de RAM. Para conocer este valor hay que aplicar de nuevo la fórmula 2 teniendo en cuenta que el byte menos significativo es el almacenado en primer lugar (PEEK 23653) y el más significativo es el que está en la posición de memoria 23654. | + | Ahora sólo nos queda analizar el contenido de la memoria a partir de esa posición. Para ello, en primer lugar abra el manual de instrucciones |
- | + | ||
- | Ahora sólo nos queda analizar el contenido de la memoria a partir de esa posición. Para ello, en primer lugar abra el manual de instruciones | + | |
A continuación, | A continuación, | ||
- | FOR n=comienzo TO comienzo + 21 :■ PRINT n, PEEK n: NEXT n | + | <code basic> |
+ | FOR n=comienzo TO comienzo + 21: PRINT n, PEEK n: NEXT n | ||
+ | </ | ||
Esto hará que se impriman en pantalla las primeras posiciones de memoria del programa y sus correspondientes contenidos. | Esto hará que se impriman en pantalla las primeras posiciones de memoria del programa y sus correspondientes contenidos. | ||
Línea 89: | Línea 82: | ||
Ahora hay que introducir estos valores en la memoria: | Ahora hay que introducir estos valores en la memoria: | ||
+ | <code basic> | ||
POKE comienzo, byte más significativo POKE comienzo+1, byte menos significativo | POKE comienzo, byte más significativo POKE comienzo+1, byte menos significativo | ||
+ | </ | ||
Haga un listado (LIST) y se sorprenderá al ver lo que ha sucedido. Por supuesto que, en estas circunstancias, | Haga un listado (LIST) y se sorprenderá al ver lo que ha sucedido. Por supuesto que, en estas circunstancias, | ||
Línea 97: | Línea 92: | ||
Haga la prueba haciendo un cambio en esta posición de memoria. Utilice la instrucción: | Haga la prueba haciendo un cambio en esta posición de memoria. Utilice la instrucción: | ||
+ | <code basic> | ||
POKE posición de memoria, 248 | POKE posición de memoria, 248 | ||
+ | </ | ||
Cuando liste de nuevo el programa se encontrará con que la instrucción es distinta pero si intenta ejecutar el programa este dará el mensaje «No sense in Basic». El problema no es propiamente del procedimiento empleado para efectuar el cambio, sino que el error viene dado por que el texto «DEMOSTRACION» tiene más de 10 letras y el sistema no admite que se grabe en cinta un programa con un nombre de más de 10 caracteres. | Cuando liste de nuevo el programa se encontrará con que la instrucción es distinta pero si intenta ejecutar el programa este dará el mensaje «No sense in Basic». El problema no es propiamente del procedimiento empleado para efectuar el cambio, sino que el error viene dado por que el texto «DEMOSTRACION» tiene más de 10 letras y el sistema no admite que se grabe en cinta un programa con un nombre de más de 10 caracteres. | ||
- | A continuación, | + | A continuación, |
- | + | ||
- | nalizado | + | |
Cada vez que encuentre un número en el programa basic, verá cómo detrás del código 14 (que indica al ordenador que se trata de un valor con el que probablemente tenga que operar), hay 5 bytes que carecen de significado aparente pero que son, en realidad, la representación en coma flotante del mismo número. Es la que el Spectrum utiliza para realizar los cálculos matemáticos que le indica el propio programa. | Cada vez que encuentre un número en el programa basic, verá cómo detrás del código 14 (que indica al ordenador que se trata de un valor con el que probablemente tenga que operar), hay 5 bytes que carecen de significado aparente pero que son, en realidad, la representación en coma flotante del mismo número. Es la que el Spectrum utiliza para realizar los cálculos matemáticos que le indica el propio programa. | ||
Línea 111: | Línea 106: | ||
Para poder aplicar lo visto hasta ahora a cualquiera de sus programas, puede utilizar la siguiente rutina que ha de incorporar al final del mismo, tecléandola directamente o bien mediante MERGE. Eso sí, asegúrese de que su programa no contiene líneas a partir de la 9900. Para hacerla funcionar haga GO TO 9900. | Para poder aplicar lo visto hasta ahora a cualquiera de sus programas, puede utilizar la siguiente rutina que ha de incorporar al final del mismo, tecléandola directamente o bien mediante MERGE. Eso sí, asegúrese de que su programa no contiene líneas a partir de la 9900. Para hacerla funcionar haga GO TO 9900. | ||
- | 9900 LET a = (PEEK £3635+256»PEEK £3636)-1: GO SUB 99£5: LET a=3+l | + | <code basic> |
- | + | 9900 LET a = (PEEK 23635+256*PEEK 23636)-1: GO SUB 9925: LET a=a+l | |
- | 9904 FOR a = a TO (PEEK £3653+£56* PEEK £3654) | + | 9904 FOR a = a TO (PEEK 23653+256*PEEK 23654) |
- | + | 9905 LET a$=CHR$ 63: IF PEEK a>31 THEN LET a$=CHR$ PEEK a | |
- | 9905 LET a $=CHR$ 63: IF PEEK a>3 1 THEN LET a$=CHR$ PEEK a | + | 9910 PRINT a; CHR$ 32; PEEK a, a$ |
- | + | 9916 IF PEEK a=13 THEN BEEP .5,0: GO SUB 9925 | |
- | 9910 PRINT a; | + | 9920 NEXT a |
- | + | 9925 LET linea=256*PEEK (a+l)+PEEK (a+2) | |
- | 99£5 LET l inea=£56»PEEK <a+l)+PE EK (a +£) | + | 9926 IF linea=9900 THEN PRINT FLASH l: "se acabo el programa": |
- | + | 9927 PRINT FLASH 1; " | |
- | 9926 IF linea=9900 THEN PRINT FL PSH lj"se acabo el programa": | + | </ |
- | + | ||
- | 99£7 PRINT FLASH l;" | + |