Puedo hacer load "" code en ensamblador?

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Responder
Avatar de Usuario
iadvd
rst 0
Mensajes: 39
Registrado: Mar Abr 09, 2019 9:48 am
Ubicación: Tokio, Japon
Contactar:

Puedo hacer load "" code en ensamblador?

Mensaje por iadvd » Dom Jun 16, 2019 2:27 am

Buenas tengo una duda técnica de ficheros tap y ensamblador... si alguien me pudiese orientar se lo agradezco...

Tengo un tap que se compone de tres taps o bloques binarios unidos. El primero es un cargador basic que fuerza la carga del segundo tap en una zona de memoria y lo lanza con randomize usr hasta ahí todo bien... pero quiero que el segundo bloque que es un programa lanzado por el primero, cuando se apriete cierta tecla cargue en memoria con un load "" code el tercer tap y lo lance.

Esto lo quería hacer poniendo en ensamblador en el segundo bloque un org a una posicion alta de memoria que el tercer bloque que quiero cargar no pisa, y cuando se pulsa la tecla requerida el programa hace un jump , jp, o un call a la dirección alta de memoria que he preparado en la que simplemente habría el equivalente a un load "" code en ensamblador seguido del equivalente al randomize usr de la posicion de memoria donde esta el código recién cargado del tercer tap. Se puede hacer esto?

Mi duda es primero si se puede hacer el load "" code con ensamblador y luego saltar o hacer call y por otro mi duda es si el emulador de spectrum cargará automáticamente dicho tercer bloque del tap en memoria, lo digo porque en un spectrum real implicaría darle al play físicamente del casete pero lo que aquí quiero es que el emulador entienda que debe cargar automáticamente el tercer bloque bin del tap.

Bueno si se puede hacer esto mismo con un truco desde el cargador basic del primer bloque también sería genial!

Gracias!!! :D

maeloterkim
rst 0
Mensajes: 21
Registrado: Mar Abr 30, 2019 8:52 am

Re: Puedo hacer load "" code en ensamblador?

Mensaje por maeloterkim » Dom Jun 16, 2019 7:42 am

Hola

La forma más sencilla quizás sea la siguiente

En el cargador BASIC haces esto:

10 LOAD "CODE1" CODE direccionMemoriaCODE1,longitudBytesCODE1
20 RANDOMIZE USR direccionMemoriaCODE1
30 REM La linea BASIC 30, 40 , etc se ejecutará al pulsar tecla en CODE1 y volver al BASIC con un RET
40 LOAD "CODE2" CODE direccionMemoriaCODE2,longitudBytesCODE2
50 RANDOMIZE USR direccionMemoriaCODE2

En el código máquina del primer bloque, cuando se apriete cierta tecla que vuelva al BASIC con un RET

Si es necesario que ejecutes de nuevo el CODE1 puedes llamarlo desde CODE2

El único "problema" es que no te puedes librar de que el usuario deba pulsar una tecla para hacer el LOAD
si es en emulador

Y además el usuario también debe pulsar en el cassette si es spectrum real

Pero sería mucho mejor que primero cargaras todos los bloques si te caben en memoria, desde el cargador BASIC
y después desde código máquina, vas ejecutando el que te interese según la tecla

Si te cabe en 48K lo puedes hacer así

10 LOAD "CODE1" CODE direccionMemoriaCODE1,longitudBytesCODE1
20 LOAD "CODE2" CODE direccionMemoriaCODE2,longitudBytesCODE2
30 RANDOMIZE USR direccionMemoriaCODE1

y a partir de aquí el código máquina se encarga de ir ejecutando el código adecuado

Si no te cabe en 48K puedes hacerlo en 128K

Solo es cuestión de ir paginando con el cargador para ir poniendo el código en distintos trozos de memoria

Lo ideal es que el usuario solo "use el cassette" una vez si se puede hacer

Avatar de Usuario
iadvd
rst 0
Mensajes: 39
Registrado: Mar Abr 09, 2019 9:48 am
Ubicación: Tokio, Japon
Contactar:

Re: Puedo hacer load "" code en ensamblador?

Mensaje por iadvd » Dom Jun 16, 2019 9:56 am

Hola! Muchísimas gracias, los dos bloques no caben en memoria de ahí que el primero sea sobreescrito por el segundo :D

Mañana lunes probaré la solución y escribo por aquí!
Saludos
:) :)

Avatar de Usuario
Nat
Herbert
Mensajes: 95
Registrado: Lun Mar 25, 2019 9:31 am

Re: Puedo hacer load "" code en ensamblador?

Mensaje por Nat » Dom Jun 16, 2019 11:47 am

Spectaculator tiende a continuar cargando, como un cassette normal. Si es un TAP con el cargador y 3 bloques CODE es posible que haya que rebobinar manualmente el Cassette Recorder al bloque siguiente.
Saludos,
Nat

Avatar de Usuario
iadvd
rst 0
Mensajes: 39
Registrado: Mar Abr 09, 2019 9:48 am
Ubicación: Tokio, Japon
Contactar:

Re: Puedo hacer load "" code en ensamblador?

Mensaje por iadvd » Lun Jun 17, 2019 5:19 am

Gracias Nat tomo nota! para un juego nuevo estoy convirtiendo la típica pantalla de carga con un dibujo en un miniprograma de "greetings" (música mas chula, saludos varios, imagen de carga... es un experimento) que tiene algunas cosas que no caben en el programa en si del juego pero que no quiero abandonar, así que como experimento estoy metiendo estas cosas como miniprograma (de pocos k's para que no haga lenta la carga del juego) en vez de pantalla de carga sencilla con un dibujo, de tal forma que cuando pulsas c la carga continúa y ya si que se carga el juego en si (asi que realmente espero que el usuario pulse una tecla para continuar y dar al "play" físicamente, pero esperando que el emulador cargue el siguiente bloque binario de la fila tap que aglutina todos). Por si acaso haré una versión que no incluye este miniprograma y que solo tendrá la clásica imagen de carga (por si algún emulador no reacciona bien el cargador con miniprograma!)

volveré por aquí cuando haga la prueba a ver si hoy me da tiempo! gracias de nuevo,
:D

Avatar de Usuario
iadvd
rst 0
Mensajes: 39
Registrado: Mar Abr 09, 2019 9:48 am
Ubicación: Tokio, Japon
Contactar:

Re: Puedo hacer load "" code en ensamblador?

Mensaje por iadvd » Jue Jun 20, 2019 3:40 am

(Nota: lo conseguí al final, en mi siguiente mensaje!)

Buenas ya he probado pero no parece funcionar, al menos con Fuse... el ret provoca un reseteo de la máquina, con lo que no vuelve al siguiente paso del listado basic... he intentado también en vez de ret un jp pero tampoco tuvo buen resultado.

He podido verificar que el listado basic esta correctamente en la dirección 5CCB (23755) y mas o menos es distinguible el comienzo del siguiente comando LOAD "" CODE que quiero lanzar, se carga correctamente el primer programa, pero cuando pulso la tecla y lanzo el ensamblador, si dicho ensamblador hace solo ret la maquina se resetea y si en vez de ret intento un jp directo a la linea siguiente del codigo, se queda todo en negro (no resetea pero si miro debug de memoria esta en una zona de memoria que no tiene ningun sentido y no ha habido carga del siguiente bloque bin/tap).

No podría lanzar directamente un código ensamblador desde el programa primero que fuerce un load "" code?

Desde luego que si el problema es que el emulador lee totalmente el tap y ya lo ha "consumido", porque no hace espera real sino que carga todo en memoria a una, entonces no hay solución posible. Por lo que veo en el Fuse, al menos si miro el estado actual del casete virtual, esta apuntando al siguiente bloque pendiente de leer, con lo que por ese lado parece estar también correctamente posicionado (en espera de hacer un nuevo load "" code)

he estado buscando en internet pero no encuentro el ensamblador equivalente... se podrá?
debería de haber algo (o no?) es como en los juegos que tienen dos partes que cuando acabas la primera te piden que pulses el play del casete para cargar la segunda...

gracias de nuevo! esta historia es la única que me falta para acabar mi nuevo juego, es un extra pero si puedo me gustaría implementarlo, si no pues haré algo mas sencillo!
:D :D
Última edición por iadvd el Jue Jun 20, 2019 6:26 am, editado 1 vez en total.

Avatar de Usuario
iadvd
rst 0
Mensajes: 39
Registrado: Mar Abr 09, 2019 9:48 am
Ubicación: Tokio, Japon
Contactar:

Re: Puedo hacer load "" code en ensamblador?

Mensaje por iadvd » Jue Jun 20, 2019 6:25 am

Perdón perdón ya lo conseguí!!! :D :D :D

maeloterkim tenia toda la razón, un ret tal cual vale,
inicialmente me daba fallo porque el ensamblador lo estaba colocando en mi código c en medio de otros códigos existentes... si coloco el ret al final de la memoria (al final del todo de mi programa de c donde ya no hay nada) y hago un call a dicha posición el ret se ejecuta de maravilla y vuelve al cargador. A los que os suene como funciona La Churrera en el código principal de churromain haciendo esto va de maravilla:

void main (void) {
do_game ();

#asm
call LOADERCALL
#endasm

}

// From beepola. Phaser engine by Shiru.
#include "music.h"

#asm
.loadercall
ret
#endasm

Al menos en Fuse el cargador sigue leyendo el siguiente bloque y ya carga el juego!
Pues ya lo tengo todo muchísimas gracias!!! :D :D :D

K.O.D.
Jack The Nipper
Mensajes: 115
Registrado: Mar Sep 30, 2008 8:45 am
Ubicación: Valencia

Re: Puedo hacer load "" code en ensamblador?

Mensaje por K.O.D. » Vie Jun 21, 2019 12:17 pm


Avatar de Usuario
iadvd
rst 0
Mensajes: 39
Registrado: Mar Abr 09, 2019 9:48 am
Ubicación: Tokio, Japon
Contactar:

Re: Puedo hacer load "" code en ensamblador?

Mensaje por iadvd » Sab Jun 22, 2019 7:21 am

K.O.D. muy útil muchísimas gracias!!! :D :D ya lo tengo funcionando pero para próximas ocasiones será muy bueno saberlo!

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados