POKE y PEEK

Monitor de un CBM 3016 con un programa Commodore BASIC que usa PEEK y POKE en un bucle FOR en la línea 100 .

POKE ( Inglés para empujar = atascado, empuje) es una instrucción de la BASIC programación de lenguaje que se utiliza para transferir un valor especificado como un número ( un octeto o byte para arquitecturas de 8 bits ) a la especificada de memoria de direcciones en el espacio de direcciones el procesador (la CPU) ahorra. Su contraparte es la función de intérprete PEEK ( inglés para peek = mirar, mirar, mirar hacia arriba), que se utiliza para leer desde una dirección; el valor leído se transfiere al programa BASIC como valor de retorno .

La instrucción POKE se puede utilizar, por ejemplo, para manipular el contenido de una celda de memoria en la memoria principal de la computadora . Además, estar con los registros de control de hardware POKE y PEEK de los dispositivos periféricos de la computadora para el programa BÁSICO disponible a menos que funcione el sistema informático con E / S mapeadas en memoria .

Los comandos PEEK y POKE fueron introducidos por Bill Gates y Paul Allen en 1975 en el lenguaje de programación Altair BASIC .

función

El comando POKE llama a una rutina del intérprete BASIC , que realiza el acceso de escritura con los dos parámetros de dirección y valor . La función peek evalúa su parámetro como una dirección, realiza un acceso de lectura a esta dirección y transfiere el resultado como valor de retorno al programa BASIC.

formato
POKE Adresse, Wert
Wert = PEEK(Adresse)

El valor máximo de la dirección depende del ancho del bus de direcciones . El valor máximo depende del ancho del bus de datos . Para arquitecturas de 8 bits, los valores típicos son de 0 a 65535 para una dirección de 16 bits y de 0 a 255 para un valor de 8 bits. Si el sistema informático subyacente tiene brechas en su asignación de memoria y no hay errores de direccionamiento , se implementa el manejo de excepciones , una instrucción POKE a una dirección desocupada no hace nada, mientras que la función PEEK correspondiente entrega un valor de retorno indefinido.

usar

En la era de las computadoras domésticas , el comando POKE se usaba a menudo, ya que esta es la única forma en que los programas BASIC en muchos sistemas usan ciertas capacidades gráficas o de sonido de la computadora, que son compatibles con el hardware utilizado, pero no con el software. Se admiten los comandos integrados del intérprete BÁSICO. El programa BASIC recibe acceso al registro de control de hardware y controla el hardware directamente; una tarea que, según la terminología contemporánea, correspondería a un controlador de dispositivo .

ejemplo
POKE 53265, PEEK(53265) OR 32
Se configura leyendo usando PEEK, modificando usando OR 32 y escribiendo nuevamente usando POKE bit 5 (el que tiene el valor 2 5  = 32) en el registro 17 del módulo periférico VIC II (el controlador de pantalla de video ) en un Commodore 64 ; allí el VIC II (a través de E / S mapeadas en memoria ) tiene la dirección base D000 16  = 53248, el registro 17 está por lo tanto en la dirección 53248 + 17 = 53265. El bit 5 establecido de este registro hace que se active el modo de gráficos de mapa de bits. La combinación con OR tiene el efecto de que todos los bits leídos se escriben sin cambios, excepto el bit 5, que se establece independientemente del estado. Analógico a este, bit 5 con POKE 53265, NOT(PEEK(53265)) NOR 32o POKE 53265, PEEK(53265) AND NOT(32)borrado estado independiente y con POKE 53265, NOT(PEEK(53265)) XNOR 32o POKE 53265, PEEK(53265) XAND NOT(32)interruptor dependiente del estado ( toggle ser).

Con las instrucciones POKE, los datos específicos del sistema operativo se pueden cambiar de manera específica para lograr los efectos deseados por el usuario, por ejemplo, cambiando la repetición de teclas . Otro ejemplo de esta categoría para la función PEEK es reconocer la mera pulsación de la tecla Shift (sin otra tecla) cuando el sistema operativo no ofrece ningún otro medio.

ejemplo
POKE 650, 128
Active la repetición de teclas para todas las teclas de un Commodore 64. En la dirección 650 (una dirección de memoria principal normal en el área de los datos de gestión del sistema operativo), la parte de consulta del teclado del sistema operativo busca cómo debería funcionar la repetición de teclas. El valor 128 hace que se repitan todas las claves; Las alternativas son que no se repita la tecla y solo se repiten las teclas de cursor y borrar y el espacio.
ejemplo
IF PEEK(653) AND 1 THEN …
Consulta del bit indicador de cambio (bit 0 (con el valor 2 0  = 1) del byte en la dirección 653) de la consulta del teclado del sistema operativo de un Commodore 64. La parte después de ENTONCES solo se ejecuta cuando la tecla Mayús está actualmente presionada .

Otra aplicación es un programa BASIC que utiliza una subrutina creada en lenguaje máquina para su tarea . En lugar de cargar esta subrutina (a veces solo unos pocos bytes) como un archivo binario separado del dispositivo de almacenamiento masivo (en la era de la computadora doméstica, a menudo, simples grabadoras de casetes o conjuntos de datos ), la imagen de la memoria de la subrutina se almacena como una secuencia de números en el programa BASIC. Durante la fase de inicialización, el programa BASIC escribe esta imagen de memoria en un bucle usando instrucciones POKE en las direcciones de memoria de destino deseadas para que la subrutina pueda ser llamada allí. También es conocido parchear (modificar) programas en lenguaje de máquina usando instrucciones POKE específicas después de cargar desde el dispositivo de almacenamiento masivo y antes de iniciar el programa, en particular para hacer trampa en juegos de computadora. En la escena relevante, por ejemplo, se conocen trampas con las que el personaje del jugador es invulnerable o al menos significativamente más "vida" está disponible. La combinación de valor y dirección es individual para cada programa o juego (determinada, por ejemplo, mediante métodos de ingeniería inversa ) y, a veces, se la denomina un POKE en sí mismo (por ejemplo, "lista de POKE" en el sentido de enumerar trampas ).

Para que un programador sepa qué combinaciones de direcciones y valores cumplen un propósito deseado, es útil estudiar la documentación (instrucciones de funcionamiento y hojas de datos) y otra literatura (incluidos artículos en revistas especializadas) sobre los componentes periféricos, el funcionamiento sistema, etc.

El uso de instrucciones POKE a menudo reduce la legibilidad y comprensibilidad del texto del programa; Al mismo tiempo, es la razón por la que estos programas apenas son portátiles entre diferentes modelos de computadora y sus diferentes conjuntos de chips: los comandos POKE a menudo no son transferibles entre diferentes modelos o series del mismo fabricante. Los ejemplos anteriores para el control del teclado para el Commodore 64 se pueden transferir al Commodore VC 20 , ya que los sistemas operativos son muy similares en este sentido. Los controladores de visualización de video de ambos equipos difieren no solo en su posición en el plan de asignación de memoria, sino también en su estructura interna - aquí: no hay modo de gráficos de mapa de bits en el VC 20 - de modo que el ejemplo para activar el modo de gráficos de mapa de bits en el VC 20 no tiene correspondencia.

Dado que los datos administrativos del sistema operativo también se pueden sobrescribir con el comando POKE, el uso descuidado a menudo no da como resultado un mensaje de error adecuado , sino un bloqueo de la computadora  , con el potencial de destrucción del programa o los datos en la memoria. También pueden producirse efectos ópticos o acústicos no deseados si se producen errores en la programación del registro de control de hardware. En el mejor de los casos, no pasa nada. La solución de problemas es muy complicada por los efectos mencionados.

El significado de hoy

El uso de POKE está obsoleto en los sistemas actuales y utiliza las variantes BASIC actuales. Las CPU actuales solo usan la MMU para direccionamiento , que abstrae la dirección lógica de la física y evita la manipulación directa de la memoria a través de mecanismos especiales de protección (violación de la protección de la memoria ). Además, con pocas excepciones, los sistemas operativos modernos ya no tienen un plan de asignación de memoria estática en el que siempre se puede encontrar cierto contenido en las mismas direcciones. Entonces, no se accede a los recursos de hardware a través de direcciones fijas, sino a través de controladores de dispositivo , que a su vez leen y escriben en áreas de memoria previstas para este propósito.

enlaces web

POKE en C64-Wiki (con ejemplos de aplicación)

Evidencia individual

  1. POKE. En: Asesor de Microsoft QuickBasic 4.5. Microsoft, 1990, consultado el 27 de febrero de 2014 .
  2. PEEK. En: Asesor de Microsoft QuickBasic 4.5. Microsoft, 1990, consultado el 27 de febrero de 2014 .
  3. N.Montfort, P.Baudoin, J.Bell, I.Bogot, J.Douglass y otros. IMPRIMIR CHR $ (205,5 + RND (1)); : GOTO 10 Cambridge, MIT Press (2013) ISBN 978-0-262-01846-3 p. 171 ( En línea. (PDF 50 MB) Consultado el 26 de febrero de 2014 (inglés). )
  4. POKE. En: C64 Wiki. Consultado el 14 de abril de 2015 .
  5. Mapa de memoria del Commodore 64. Consultado el 16 de abril de 2015 .