Edición / Hacking 8031 Eprom code

2

No estoy seguro de si este es el lugar correcto para hacer tal pregunta, pero aquí va.

Ok, entonces me meto mucho con una vieja caja de ritmos de los 80's. Se basa en un antiguo código de Programa de Procesador 8031 que se almacena en un eprom 27c256 y los datos de sonido se almacenan en 2 roms de máscara 27c040.

El 27c256 en esta máquina contiene el sistema operativo y también la tabla de datos que contiene los nombres de los diversos sonidos de batería y las direcciones de inicio para cada muestra. y en este chip hay datos a cada lado de la tabla. Ya hago eproms personalizados para la máquina, pero estoy limitado a solo "reemplazar" los datos en esta tabla, que limita la máquina a 47 sonidos diferentes.

Tuve una idea, y quiero exponerla a las cabezas para ver si estoy hablando basura o no ...

Al sistema operativo existente le queda bastante espacio al final del archivo (FF) ¿Es posible hackear el firmware de modo que en el punto en el que lea la tabla, inserte la instrucción a JUMP en otro parte del firmware y lea en una tabla que sea más grande en longitud con más muestras, etc. (digamos 100 sonidos en lugar de 47 o algo así) y luego, al final de este, regrese al lugar donde se encuentra el final de la tabla anterior. código.

En esencia, estoy hablando de omitir una parte del código y reemplazarlo con una pieza más grande. Sé que, por supuesto, no puedo hacer más grande lo que ya existe, ya que movería el resto del código, lo que, según tengo entendido, se rompería.

Actualmente estoy reemplazando los datos en la tabla simplemente parcheando los bytes que ya están allí.

Tal vez estoy hablando jibberish, tal vez no.

gracias Brad

    
pregunta Brad Holland

5 respuestas

3

Lo que estás proponiendo suena absolutamente factible. ¡No estás hablando jibberish! Si hay espacio no utilizado en la EPROM principal, puede parchear el código para saltar de la parte principal a una pequeña rutina en la parte no utilizada actualmente, y saltar de nuevo.

Probablemente necesitará desensamblar el código 8031 existente para determinar dónde aplicar el parche. Es posible que pueda modificar el código existente sin cambiar su tamaño. O puede sobrescribir las instrucciones con NOP (sin operación) si el nuevo código es más pequeño. La lógica en la EPROM puede hacer algún tipo de prueba para asegurarse de que no se usen más de 47 muestras. Tendrá que encontrar todos los lugares donde se realiza esta prueba y aumentar los 47 a un valor superior.

    
respondido por el John Honniball
3

El enfoque del que está hablando se llama "parcheo" y se realiza todo el tiempo para corregir errores. Ponga un salto a un área no utilizada, agregue algunas instrucciones en el área no utilizada, luego vuelva a saltar para volver a unirse al código original.

¡Si no puedes encontrar un desensamblador, escribe uno! Será una buena manera de aprender los conceptos básicos de la programación y familiarizarse con la arquitectura y el conjunto de instrucciones de 8031. El desensamblador se puede escribir en cualquier idioma y en cualquier máquina que sea conveniente.

    
respondido por el ScottMcP-MVP
3

De acuerdo con las otras dos respuestas sobre parches; hubo un comentario acerca de encontrar un desensamblador 8031. (Las notas 8031, 8032, 8051 y 8052 son todas del mismo microcontrolador, solo opciones de memoria ligeramente diferentes).

Instale el SDCC - Small Device C Compiler enlace gratuito (No está afiliado a San Diego Comic-Con, que a menudo aparece primero en google búsqueda de SDCC ...) Este kit de herramientas gratuito incluye el propio SDCC (un compilador de C) y algunas herramientas de soporte para simular y depurar los códigos hexadecimales. Para lo que estás haciendo, la herramienta que te será más útil es el simulador.

Abra un indicador de línea de comandos e inicie el simulador 8051 (suponiendo que su código hexadecimal esté en un archivo llamado yourFileNameHere.hex y haya instalado SDCC \ bin en la ruta):

s51 yourFileNameHere.hex

Dentro del simulador, escriba help para imprimir la ayuda sobre los comandos. Escriba dc para mostrar el desmontaje de las instrucciones 8051. run ejecuta todo el programa y step ejecuta la siguiente instrucción y luego se detiene. Puede usar esto para rastrear lo que está haciendo el código original, esto puede ayudar a señalar el camino hacia lo que estará parcheando y cómo.

No estoy seguro de si es posible modificar / parchear el código desde el propio simulador, todo lo que pude encontrar fue un comando fill . Así que es posible que desee utilizar un editor hexadecimal como Frhed enlace para ingresar su parche en el archivo hexadecimal y luego volver a cargarlo en el simulador para probar usando el comando download .

El control de fuente es tu amigo en una situación como esta. Git, subversion (svn), fossil-scm.com, todas las buenas opciones y gratis. Piense en ello como escalar una ladera de la montaña: muévase un poco, avance un poco y cometa ese punto de control. Avanza un poco más, haz otro commit. Si se arriesga y se resbala y cae (es decir, el código está muy desordenado), es fácil volver al último punto de control que funcionó para que no termine perdiendo horas de trabajo.

La instalación de SDCC incluye un compilador de C bastante decente, si estás dispuesto a ir por ese camino. Si terminas escribiendo una gran cantidad de código, puedes usar SDCC para compilarlo desde C o desde el ensamblado al código hexadecimal. Pero si solo va a parchear una imagen de memoria existente, y no tiene el código fuente C que genera ese código hexadecimal, s51 es la única herramienta que utilizará.

Una búsqueda de 8051 instruction set muestra varias fuentes válidas. De los mejores resultados de búsqueda que veo, ateml.com y silabs.com son fabricantes de microcontroladores basados en 8051, y keil.com vende herramientas de compilación / depuración. (Nota: mi empleador maximintegrated.com aún hace 8051 bajo los números de parte de Dallas Semiconductor DS89C450).

¡Espero que esto sea suficiente para que comiences!

    
respondido por el MarkU
2

Voy a estar en desacuerdo con la mayoría de las otras respuestas aquí. No creo que debas saltar a una nueva sección de código en absoluto, solo hay que parchear algunos puntos en el código que ya está allí.

En el código existente, debe haber direcciones en el código que apunten al comienzo de la tabla (s) que desea expandir. Al parecer, ya ha descubierto estas direcciones si está parchando los datos en estas tablas.

Por lo tanto, do necesita desensamblar el código y descubrir dónde se encuentran estas direcciones. Una vez que haya reubicado las tablas más allá del final del código existente, solo debe reemplazar las direcciones de inicio de las tablas con sus nuevos valores.

Además de las direcciones de inicio de cada tabla, es posible que el programa también esté verificando el final de cada tabla, lo que debe tener en cuenta. (La razón para hacerlo sería asegurar que el usuario no esté tratando de acceder a un sonido de batería más allá del final de la tabla). El código podría estar usando las direcciones finales de la tabla, o un conteo de las entradas de números en el La tabla o la tabla puede tener una entrada cero al final (en cuyo caso no necesitarás parchear nada).

    
respondido por el tcrosley
0

Gracias por toda la ayuda hasta ahora.

Hasta ahora he desensamblado el código, y luego encontré exactamente el punto en el que la tabla de ubicación y nombre de muestra comienza en el archivo hexadecimal (0x6BFD). Luego busqué el código desensamblado y encontré una declaración como esta: L0179:   2E36 906BFD MOV DPTR, # 06BFDh

Por lo tanto, volviendo a la dirección 2E36 en el archivo Hex, seguramente vi 2 bytes que dicen 6B FD.

Luego copié los datos de la tabla en un área en blanco del archivo y modifiqué esa dirección en consecuencia, la máquina arranca y funciona bien.

Supongo que ahora necesito ver si puedo empezar a piratearlo para ver si ahora puedo hacer que la máquina dirija más muestras :)

    
respondido por el Brad Holland

Lea otras preguntas en las etiquetas