Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: pentacour en 27 de Noviembre de 2009, 01:08:45 pm



Título: ROMs de 32kb con sjasm
Publicado por: pentacour en 27 de Noviembre de 2009, 01:08:45 pm
Como ahora programo para MSX donde puedo y me supone compilar tanto en Windows, Linux o Mac, muy a pesar mío he tenido que dejar asmsx. El nuevo elegido ha sido sjasm, que creo que también se utiliza por aquí.

El caso es que con asmsx no tenía problema en hacer una ROM de 32Kb, pero con sjasm estoy ya a punto de llorar. He probado tanto el código que proponía Robsy (que me funcionaba en asmsx perfectamente)

Código:
LOCALIZAR_SEGUNDA_PAGINA:
; Rutina que localiza la segunda pagina de 16 KB
; de una ROM de 32 KB ubicada en 4000h
; -Basada en la rutina de Konami-
; Compatible con carga en RAM
; Compatible con expansores de slots
;------------------------------------------------
 ld hl,4000h
 ld b,[hl]
 xor a
 ld [hl],a
 ld a,[hl]
 or a
 jr nz,LBLROM
 ; El programa esta en RAM - no buscar
 ld [hl],b
 jr LBLCONT
LBLROM:
 di
 ; Slot primario
 call RSLREG
 rrca
 rrca
 and 03h
 ; Slot secundario
 ld c,a
 ld hl,0FCC1h
 add a,l
 ld l,a
 ld a,[hl]
 and 80h
 or c
 ld c,a
 inc l
 inc l
 inc l
 inc l
 ld a,[hl]
 ; Definir el identificador de slot
 and 0ch
 or c
 ld h,80h
 ; Habilitar permanentemente
 call ENASLT
 ei
LBLCONT:

como el código de Ramones

Código:
ENASLT:   equ  024h
slotvar: equ 0E000h ; My Rom slot
RSLREG: equ 0138h
EXPTBL: equ 0FCC1h ; Bios Slot / Expansion Slot

org 04000h

db 041h,042h
dw initmain
ds 12


initmain:

di
im 1
ld sp,0F380h
call search_slotset


; Slot posicionado

jr $



; -----------------------
; SEARCH_SLOTSET
; Posiciona en pagina 2
; Nuestro ROM.
; -----------------------

search_slotset:
call search_slot
jp ENASLT


; -----------------------
; SEARCH_SLOT
; Busca slot de nuestro rom
; -----------------------

search_slot:

call RSLREG
rrca
rrca
and 3
ld c,a
ld b,0
ld hl,0FCC1h
add hl,bc
ld a,(hl)
and 080h
or c
ld c,a
inc hl
inc hl
inc hl
inc hl
ld a,(hl)
and 0Ch
or c;
ld h,080h
ld (slotvar),a
ret
que se propone en este hilo (http://karoshi.auic.es/index.php?topic=628.0)

La página 2 (que comienza en 8000h) no la encuentro. Es decir, los datos que veo a partir de la 8000h no son los que he puesto (gráficos definidos a partir de 8000h corruptos). Como con asmsx la "receta" salió a la primera no he indagado más sobre el intríngulis de activación de páginas, y ahora me lo he mirado por encima y en diagonal.

Si alguien usa el sjasm y me pudiese dar la "receta" que funcione (con explicación o url de explicación ya sería la leche), prometo leerme el MSX Red Book de cabo a rabo y entender perfectamente el funcionamiento de activación de páginas  ::)

Por si acaso, me lo voy mirando ya  ;)


Título: Re: ROMs de 32kb con sjasm
Publicado por: pitpan en 27 de Noviembre de 2009, 02:29:16 pm
Pues ni idea, la verdad.

La rutina que indicas, que es la que implementa en asMSX la macro .SEARCH (si no recuerdo mal el nombre), no es más que la empleada por Konami con una pequeña modificación por si la ROM se ha cargado en RAM. Quizás el problema esté en otro punto... ¿Has podido verificar que efectivamente la primera página esté en 4000h? ¿Has comprobado con un debugger o editor hexadecimal que los primeros 16 bytes del fichero ROM son correctos y se corresponden con la información de cabecera adecuada?

En cuanto a versiones alternativas del asMSX, decirte que sí que se distribuyó una para Linux no hace demasiado, que funcionaba incluso mejor que la de Windows. Para Mac, en cambio, no he hecho ninguna prueba una vez que comprobé que la versión de Bison incluida en el DVD de desarrollo era excesivamente antigua. Sustituyendo ésta por una versión más moderna, no tendría que haber ningún problema en recompilarlo para MacOSX, creo yo.


Título: Re: ROMs de 32kb con sjasm
Publicado por: pentacour en 27 de Noviembre de 2009, 02:49:22 pm
Estoy entendiendo la rutina y es que no parece haber más. Quizás sea algún problema con sjasm que no acabo de ver. Según un fichero intermedio que genera, ya había comprobado que la primera página empieza en 4000h con las cabeceras correctas. Se ejecuta todo bien, pero los gráficos que caen definidos a partir de 8000h salen mal. Una opción también sería mirar la rutina que genera el ensamblador con un editor hexadecimal y compararla con la que genere asmsx, pero me da una pereza...

Sobre asmsx, pues se me ha pasado esa versión. ¿Tienes a mano algún enlace de donde descargarla?


Título: Re: ROMs de 32kb con sjasm
Publicado por: pitpan en 27 de Noviembre de 2009, 03:28:54 pm
Pues como todo va como va, he hecho un mini-archivo con los dos ejecutables en su última versión, 0.15b, para Win32 y Linux (compilado directamente en un Ubuntu 9.04). Como instrucciones, valen las del 0.12g más o menos... ;)


Título: Re: ROMs de 32kb con sjasm
Publicado por: pentacour en 27 de Noviembre de 2009, 03:49:40 pm
Gracias! Me funciona correctamente. Luego lo pruebo, pero creo que el problema vendrá cuando me siente en un Mac a programar...  ::)


Título: Re: ROMs de 32kb con sjasm
Publicado por: pentacour en 27 de Noviembre de 2009, 06:31:38 pm
Esta tarde tocaba Mac y al final ya lo he solucionado porque no me quedaba otro remedio (mientras se lanza asmsx para Mac ::) )  Era un problema al definir las páginas "lógicas de sjasm", que si las hacía más grandes de 4000h, aunque en el fichero intermedio parecía mostrar que las direcciones iban bien, algo no ensamblaba como era de esperar. Y si las hago <= que 4000h debo estar atento al cambio de página en el código porque si se pasa del tamaño tampoco parece ensamblar como espero, aunque tampoco se queja.

Ahora a seguir picando código  ;)


Título: Re: ROMs de 32kb con sjasm
Publicado por: Ramones en 27 de Noviembre de 2009, 09:36:45 pm
Esta tarde tocaba Mac y al final ya lo he solucionado porque no me quedaba otro remedio (mientras se lanza asmsx para Mac ::) )  Era un problema al definir las páginas "lógicas de sjasm", que si las hacía más grandes de 4000h, aunque en el fichero intermedio parecía mostrar que las direcciones iban bien, algo no ensamblaba como era de esperar. Y si las hago <= que 4000h debo estar atento al cambio de página en el código porque si se pasa del tamaño tampoco parece ensamblar como espero, aunque tampoco se queja.

Ahora a seguir picando código  ;)


No termino de entender que te pasa. Yo llevo mucho tiempo usando el sjasm 0.39 en Win, Linux, Unix BSD y OSX (Darwin BSD). Debido a que me pasa como a ti, nunca se donde voy a estar. :)

Si todo tu problema es que te pasabas de 04000h en la página 1, una solución que te puede ayudar es "forzar" las páginas. Así lo que pongas dentro nunca se pasará porque te saltará un error del propio sjasm. Pero claro... este problema lo veo más para cuando realizas un Megarom con páginas de tamaño "fijo" (8 o 16k ) que para una rom lineal de 32k, donde poco importa el tamaño de los datos siempre y cuando no te pases, claro, del tamaño de esa rom (8,16,32,48,64k)

¿Cómo hacer esto? Fácil, pongamos un ejemplo.

Imaginemos una Rom de 8k. Su límite lo pondríamos así, en la última instrucción del programa

endrom: ds 06000h -$, 0FFh

Cualquier cosa que pongas antes de "endrom" si hace que el tamaño del programa supere las 8k te saltará una excepción (con el sjasm) tipo :

"block with negative size"

Si quieres controlar 16, pues cambiar el 06000h por 08000h, 32k con 0C000h, etc...

Tiene un inconveniente, claro. Que pierdes 1 byte.

:)

Vale... ni caso... que mirando la documentación del sjasm tiene una directiva SIZE, para tal uso. xDDDDDD Pero es lógicamente para el tamaño completo del programa. Y no pierdes ningún byte. Si pones SIZE 32*1024, pues te controla que no te pases de ahí.

Ains...












Título: Re: ROMs de 32kb con sjasm
Publicado por: pentacour en 28 de Noviembre de 2009, 12:48:56 am
El "problema" es que me hacía a la idea de tener 32Kb seguidos y había querido "engañar" al ensamblador poniendo que la página 1 ocupaba 32kb, de tal manera que para mi fuese transparente el cambio de página de mi código. Es decir, me da igual en cuál de las dos páginas caiga un trozo de código determinado. Esto era trivial en asmsx, pero por lo que veo, aquí debo planificar un poco qué meto en cada página porque si me paso de los 16Kb de la primera página, aunque en el fichero .lst muestre que sigue en la siguiente página, el resultado no era el esperado.

Tendré en cuenta lo que me comentas para darme cuenta si me paso del tamaño de una página.

Cita de: Ramones
Debido a que me pasa como a ti, nunca se donde voy a estar. Smiley

Jeje, pero el caso es ese, poder programar para MSX donde sea  ;)


Título: Re: ROMs de 32kb con sjasm
Publicado por: NapalM en 28 de Noviembre de 2009, 02:47:50 am
Citar
Jeje, pero el caso es ese, poder programar para MSX donde sea  ;)
Por eso yo uso el GEN80 desde el emulador, si el programa es para MSX, que se pueda compilar en MSX :P
Así, con tener cualquier emulador me vale :)
Va a gustos claro y no tiene tantas "facilidades"


Título: Re: ROMs de 32kb con sjasm
Publicado por: pentacour en 28 de Noviembre de 2009, 08:19:24 am
Mmmmm, así podría hasta programar con el teléfono móvil....  ;D

Jeje, está bien la opción, pero de momento necesito más "facilidades".


Título: Re: ROMs de 32kb con sjasm
Publicado por: alucardX en 09 de Diciembre de 2009, 01:20:31 am
Hola,

Sin más, comentar que asmsx funciona 100% con Wine en (línea de comandos) cualquier *IX, ya sea Linux y OSX, al menos a mí me permite compilar en ambas plataformas sin problemas.

Un saludote

Como ahora programo para MSX donde puedo y me supone compilar tanto en Windows, Linux o Mac, muy a pesar mío he tenido que dejar asmsx. El nuevo elegido ha sido sjasm, que creo que también se utiliza por aquí.


Título: Re: ROMs de 32kb con sjasm
Publicado por: pentacour en 09 de Diciembre de 2009, 01:27:12 pm
Cita de: alucardX
Sin más, comentar que asmsx funciona 100% con Wine en (línea de comandos) cualquier *IX, ya sea Linux y OSX,

Ok. De todas maneras me hacía gracia usar un ensamblador prescindiendo de Wine, pero tendré en cuenta que funciona con él.