Página 1 de 1
Se puede sacar el Acumulador desde Basic?¿
Publicado: 18 Feb 2013, 15:20
por mentalthink
Bueno el tema es que me pusé ayer un ratillo con el ASM, y con el Basic de CPC, que me encantá, y al ver que al llamar a las rutinas del Firware desde el Basic, se gana una velocidad asombrosa.... me preguntaba si se puden hacer "trapicheos" como sacar la info que tiene el Acumulador del Z80 directamente desde basic...
Estuve pensando que con el peek, supongo que se puede hacer, lo que no sé si la dirección de memoria es siempre la misma, o es algo que cambia... en ese caso se podría sacar la info de los registros HL, DE, BC etc...
Supongo que no séra muy complejo mezclar el Basic con el ASM, y creo que inclusive se podrían hacer librerias para hacer juegos en medio basic o aplicaciones con un desempeño muy rápido... Creo que esto es lo típico llamado RSX, pero con la facilidad que tienen a dia de hoy los editores de los Emuladores, quizás se pudiera generar un código basic más avanzado sabiendo como llamar a los entresijos del ASM...
Saludos!!!
Re: Se puede sacar el Acumulador desde Basic?¿
Publicado: 18 Feb 2013, 15:26
por mcleod_ideafix
El valor del acumulador cambia continuamente, ya que es precisamente el registro destino de la gran mayoría de operaciones aritmético-lógicas, por lo que sacar su valor para BASIC... no sé qué sentido tiene. Otra cosa es que tú quieras llamar a una rutina de la ROM cuyo resultado lo saca en el acumulador. En ese caso, desde ASM llama a la rutina y que al volver de ella, tu código ASM guarde dicho valor en alguna posición de memoria que puedas examinar con PEEK. No sé en el Amstrad, pero en el Spectrum, cuando llamas a código máquina con USR, el valor de vuelta de USR es el valor que tenga el registro BC, así que si quisiera hacer esto con el Spectrum, lo que haría a la vuelta de la rutina es cargar el registro A en C, poner B a 0, y volver con RET.
Re: Se puede sacar el Acumulador desde Basic?¿
Publicado: 18 Feb 2013, 15:38
por zup
Mírate la instrucción BASIC call, pero no confíes en el manual del CPC.
En el libro "Rutinas en Lenguaje Máqina para Amstrad" (Joe Pritchard), se describe el funcionamiento de call. Hay tres modos:
- Ejecutar código máquina.
- Ejecutar código máquina pasándole variables por valor.
- Ejecutar código máquina pasándole variables por referencia.
- ...más alguna variante referida a cadenas.
En el primer caso, ejecutas el código y punto.
En el segundo caso, se te pasa un puntero a un área que contiene los valores de las variables. Con esto puedes pasar valores del BASIC al código máquina, pero no puedes modificar esos valores (o más bien las modificaciones se perderán al retornar).
En el tercer caso, vas a disponer de punteros a las direcciones de memoria de las variables. Podrás (o no) leer las variables y modificarlas para utilizarlas después en BASIC, o leer unas y escribir otras, o cualquier cosa que se te ocurra.
Yo no sé mucho de CPCs (el libro es de mi mujer, que no hace nada con el CPC desde los 80), seguro que otras personas te pueden ilustrar mejor. O si no, intenta encontrar el libro que te he citado y saca tus propias conclusiones.
Re: Se puede sacar el Acumulador desde Basic?¿
Publicado: 18 Feb 2013, 16:03
por mentalthink
El valor del acumulador cambia continuamente, ya que es precisamente el registro destino de la gran mayoría de operaciones aritmético-lógicas
De momento estó ya lo tengo claro, porque pensaba que era una posición fija, si siempre se guardan cosas pensaba que sería un sitio fijo... lo de tener sentido, hombre yo lo veo igual que cuando picas el código en ASM, tienes que saber que estás haciendo aunque sea una suma... Si se puede llamar desde el Basic, pues algo se podrá hacer con él.
Sobre lo que me comentas ZUP, me lo voy a mirar, de hecho recuerdo cuando empecé a ver el libro del Amstrad, que me llamo mucho la atención eso de que los Calls, tuvieran varios parametros, recordaba con 8 años que los ponia al voleo a ver que pasaba, pero ni sabía que eran... También gracias por eso de que se pasan los valores por copia o referencia... La verdad que el Basic del Amstrad es una gozada...
Saludetes!!!
Re: Se puede sacar el Acumulador desde Basic?¿
Publicado: 18 Feb 2013, 21:08
por mcleod_ideafix
Creo que el libro que necesitas es éste: "Domine el Código Máquina en su Amstrad CPC464"
http://www.amstrad.es/programacion/ensa ... quina.html
Re: Se puede sacar el Acumulador desde Basic?¿
Publicado: 18 Feb 2013, 21:37
por mentalthink
Gracias McLeod, si si todos estos los tengo "enfiláos", poquito a poco tampoco es una cosa que me corra mucha prisa... pero esas dudillas así que se me ocurren, pues supongo que por aquí es más sencillo encontrar una respuesta...
Saludos!!!
Re: Se puede sacar el Acumulador desde Basic?¿
Publicado: 18 Feb 2013, 21:44
por Namek
En el Spectrum es muy facil pasar el valor de cualquier registro a BASIC, ya que la funcion USR que se usa para saltar a la direccion de memoria donde esta el programa en ASM devuelve como resultado el valor que tenga el registro BC en el momento de retornar al BASIC, por tanto si tenemos un programa en ASM que carga un valor en BC, por ejemplo LD BC,1 y luego RET, al saltar al programa en ASM con PRINT USR "direccion del programa" veremos en pantalla el valor 1 que es lo que tiene BC en el momento del RET, si en el AMSTRAD no hay nada parecido lo mas facil seria meter el valor que queramos recuperar desde BASIC en una direccion de memoria fija y leer el valor con peek.