009:iniciacion

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

009:iniciacion [d/m/Y H:i] – creado miguel009: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, incluido el nuestro, pueden ser programados en distintos lenguajes: Basic, Cobol, Forth, etc. pero, ¿cómo es posible si por principio cualquier ordenador sólo entiende de «bits», es decir, de unos y ceros? Todos los ordenadores, incluido el nuestro, pueden ser programados en distintos lenguajes: Basic, Cobol, Forth, etc. pero, ¿cómo es posible si por principio cualquier ordenador sólo entiende de «bits», es decir, de unos y ceros?
  
-_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 ---en bits, por supuesto---, el intérprete adapta su respuesta al Basic que es lo que finalmente nos llega.
  
-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 intérprete adapta su respuesta al Basic que es lo que finalmente nos llega. +==== El programa Basic ====
- +
-___ El programa Basic______+
  
 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, sino que tiene que pasar a través del intérprete. 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, sino que tiene que pasar a través del intérprete.
  
-10 REM •'DEMOSTRACION" +<code basic> 
 +10 REM "DEMOSTRACION"
 15 LET z=0 15 LET z=0
- +20 FOR X=10 TO 200 STEP 
-20 FOR X=10 TO 200 5TEP 6 +30 FOR y=10 TO 20 STEP 4 
- +40 CIRCLE x, y + 60 + 10 * SIN x, z 
-30 FOR y =10 TO 20 STEP 4+50 NEXT y: LET z=+ 1: NEXT x 
- +70 PRINT AT 0, 11; PAPER 1INK 7; FLASH 1; "FINAL" 
-40 CIRCLE ,y+60 + 10*SIN x,+</code>
- +
-50 NEXT y: LET Z=+ 1: NEXT +
- +
-70 PRINT RT 0,11, PRPER 1INK +
- +
-7; FLfiSH 1;"FINRL+
  
 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, respetando todos los números de instrucción, sentencias REM, espacio con blanco, etc. Teclee cuidadosamente el programa demostración, respetando todos los números de instrucción, sentencias REM, espacio con blanco, etc.
  
-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, siempre se acuerda de apuntar dónde lo ha puesto en las posiciones de memoria 23635 y 23636 que están exclusivamente reser- +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, siempre se acuerda de apuntar dónde lo ha puesto en las posiciones de memoria 23635 y 23636 que están exclusivamente reservadas para este fin. Es la variable del sistema llamada «PROG».
- +
-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/256) byte más significativo=INT (número/256)+  * byte menos significativo=número-256*INT (número/256) 
 +  * byte más significativo=INT (número/256)
  
 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 más significativo+  * número=byte menos significativo+256*byte más significativo
  
 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 
 +</code>
  
 (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 por la página 183, donde están reflejados todos los caracteres y comandos al lado de sus correspondientes códigos.
- +
-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 por la página 183, donde están reflejados todos los caracteres y comandos al lado de sus correspondientes códigos.+
  
 A continuación, debe introducir la siguiente instrucción: A continuación, debe introducir la siguiente instrucció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 
 +</code>
  
 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
 +</code>
  
 Haga un listado (LIST) y se sorprenderá al ver lo que ha sucedido. Por supuesto que, en estas circunstancias, el programa no podría funcionar correctamente, por lo que hay que restituir los primitivos valores. Haga un listado (LIST) y se sorprenderá al ver lo que ha sucedido. Por supuesto que, en estas circunstancias, el programa no podría funcionar correctamente, por lo que hay que restituir los primitivos valores.
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
 +</code>
  
 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, está el código 34 que pertenece a las comillas y, a partir de aquí, comienza el letrero DEMOSTRACION. Después de cerrar de nuevo las comillas, se encuentra el código 13 que indica siempre al ordenador que ha fi- +A continuación, está el código 34 que pertenece a las comillas y, a partir de aquí, comienza el letrero DEMOSTRACION. Después de cerrar de nuevo las comillas, se encuentra el código 13 que indica siempre al ordenador que ha finalizado la instrucción en curso. Esta instrucción tiene, por tanto, 16 bytes (sin contar los cuatro primeros bytes que corresponden al número de instrucción y a la longitud de la misma). Compruebe que esto es así aplicando la fórmula 2 a los bytes que indican la longitud de la instrucción, teniendo en cuenta que, en este caso, el primero es el menos significativo y el segundo el más.
- +
-nalizado la instrucción en curso. Esta instrucción tiene, por tanto, 16 bytes (sin contar los cuatro primeros bytes que corresponden al número de instrucción y a la longitud de la misma). Compruebe que esto es así aplicando la fórmula 2 a los bytes que indican la longitud de la instrucción, teniendo en cuenta que, en este caso, el primero es el menos significativo y el segundo el más.+
  
 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;CHR$ ;PEEK a,3$ 9916 IF PEEK a=13 THEN BEEP .5,0 : GO SUB 99£5 99£0 NEXT 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": GO TO 9999 
- +9927 PRINT FLASH 1; "comienza la linea "256*PEEK (a+1)+PEEK (a+2): RETURN 
-9926 IF linea=9900 THEN PRINT FL PSH lj"se acabo el programa": GO TO 9999 +</code>
- +
-99£7 PRINT FLASH l;"comienza la linea ",256*PEEK ía+1)+PEEK (a+2 ): RETURN+
  • 009/iniciacion.1290795876.txt.gz
  • Última modificación: d/m/Y H:i
  • por miguel