Buenas foreros,
Estoy desarrollando un programa que, entre otras cosas, extrae el código BASIC de un programa a partir de un snapshot creado con un emulador. Para ello me he guiado de la información técnica del artículo de cpcwiki: http://www.cpcwiki.eu/index.php/Technic ... tive_BASIC
En principio ya lo extrae y decodifica pero he dado por supuestas ciertas cosas cuya explicación no he encontrado. A ver si alguno de los expertos del foro puede echarme una mano.
En primer lugar, veo que el código BASIC de cualquier programa se almacena en la memoria RAM a partir de la posición 0x170 (368 decimal). Mi duda es si esto es así siempre o si es configurable y, de ser así, dónde guardaría el firmware dicha información.
Suponiendo un snapshot en cuya memoria no hay código BASIC sino un juego binario cargado y en ejecución, la información en la RAM a partir de la posición 0x170 podría interpretarse erróneamente como una línea en BASIC si los primeros bytes (tamaño y número de línea) tienen cierto sentido. Por ello, con algunos snapshots mi programa detecta erróneamente una o dos líneas de BASIC. Entonces, mi pregunta es ¿cómo sabe el firmware si hay líneas en BASIC o no? ¿Almacena en alguna parte el número de líneas introducidas?. La lógica me dice que el valor de HIMEM estará por debajo de esa posición de memoria, lo que me plantea otra duda: ¿En qué posición de la RAM se guarda el valor de HIMEM y, esta posición es la misma en las diferentes versiones del firmware?
Un saludo
Dudas sobre el intérprete de BASIC
Dudas sobre el intérprete de BASIC
La máquina más segura es una máquina apagada
Re: Dudas sobre el intérprete de BASIC
Para saber si tienes un programa Basic debes comprobar si la longitud dada en los dos primeros bytes se corresponde efectivamente con la longitud de la primera linea basic (cuenta todos los bytes hasta llegar a ese valor y comprueba si hay un 00h en esa posición, contando también con los dos primeros bytes) y asi sucesivamente hasta que te encuentres con un 0000h, que indica el final del programa basic.
Como ejemplo nada mejor que un "hola mundo"
12,00,0a,00,bf,22,68,6f,6c,61,20,6d,75,6e,64,6f,22,00,06,00,14,00,ca,00,00,00
12h y 00h es la longitud de la primera linea basic (es un número de 16bits pero se lee al reves, 0012h). Por lo tanto tenemos que contar 18 bytes desde el 12h en adelante y comprobamos que sí, que hay un 00h, de modo que estamos muy probablemente ante un programa basic (cada linea basic acaba con un 00h, por eso los programas basic deben terminar siempre con tres 00h consecutivos) .
Leemos los siguientes dos bytes: 06h y 00h lo que significa una longitud de 0006h y volvemos a encontrarnos con un 00h después de contar.
Y por último leemos los siguientes dos bytes y nos encontramos con un 0000h lo que significa que hemos llegado al final del programa.
Que yo sepa un programa basic siempre empieza en la dirección 0170h
El Basic es muy simple y parece que no tiene medidas de control asi que tendrás que interpretar cada token y dotar de "inteligencia" a tu programa para lograr distinguir entre programas basic y código máquina.
Saludos
Como ejemplo nada mejor que un "hola mundo"
12,00,0a,00,bf,22,68,6f,6c,61,20,6d,75,6e,64,6f,22,00,06,00,14,00,ca,00,00,00
12h y 00h es la longitud de la primera linea basic (es un número de 16bits pero se lee al reves, 0012h). Por lo tanto tenemos que contar 18 bytes desde el 12h en adelante y comprobamos que sí, que hay un 00h, de modo que estamos muy probablemente ante un programa basic (cada linea basic acaba con un 00h, por eso los programas basic deben terminar siempre con tres 00h consecutivos) .
Leemos los siguientes dos bytes: 06h y 00h lo que significa una longitud de 0006h y volvemos a encontrarnos con un 00h después de contar.
Y por último leemos los siguientes dos bytes y nos encontramos con un 0000h lo que significa que hemos llegado al final del programa.
Que yo sepa un programa basic siempre empieza en la dirección 0170h
El Basic es muy simple y parece que no tiene medidas de control asi que tendrás que interpretar cada token y dotar de "inteligencia" a tu programa para lograr distinguir entre programas basic y código máquina.
Saludos
Re: Dudas sobre el intérprete de BASIC
Gracias por responder. Entonces detectar una línea BASIC es cuestión de asegurarse de que está bien formada (terminación en 0x00). Alternativamente compruebo que el número de línea (tercer y cuarto byte) es un valor correlativo mayor que la línea anterior (de haberla) y ya que la cadena resultante no debería ser mayor de 255 bytes el tamaño de la línea (primer y segundo byte) codificada en tokens es imposible que sea mayor de 255.
La máquina más segura es una máquina apagada
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro
La Comunidad Española |