Karoshi MSX Community
05 de Julio de 2021, 08:42:49 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: ROM, RAM y sjasm  (Leído 3353 veces)
0 Usuarios y 1 Visitante están viendo este tema.
burguera
Visitante
« : 06 de Noviembre de 2011, 09:45:37 pm »

Hi! A ver, tengo una dudilla un tanto peculiar. Estoy haciendo una ROM de 32KB con sjasm, y para declarar mis variables en RAM hago tal que:

Código:
       
      ds    0c000h-$,0FFh       ; Relleno para que la ROM ocupe 32KB
       
      MAP  0c000h

VAR1  # 1
VAR2  # 3

Hasta aquí todo bien. Sin embargo, al trastear con el replayer PT3 adaptado SapphiRe es cuando he tenido extraños problemas.

En primer lugar, adapté la sintaxis de asMSX a sjasm y el replayer va perfecto. Al meterlo en mi proyecto, cambié todos los "ds" de la zona de variables del replayer por "#" y el invento petó de mala manera. Mirando las direcciones RAM asignadas, no veo nada raro.

Por probar, volví a dejar las declaraciones de espacio del replayer con "ds" y cambié todas las mías a "ds". Tanto usando un "org 0c000h" con sin él, hay un problema: la ROM resultante ocupa más de 32KB (al ensamblar, sjasm mete en el fichero lo que se supone que es RAM). BlueMSX se traga el fichero y funciona, pero otros emuladores no.

So... ¿qué diferencia hay entre usar el # y el ds a efectos de lo que acabo de decir? Mirando las direcciones asignadas, en ambos casos el resultado es el mismo.
En línea
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« Respuesta #1 : 06 de Noviembre de 2011, 11:11:07 pm »

Buenas.

A mí me pasó exactamente igual con el asMSX y con el replayer PT3.

No es lo mismo (en asMSX) reservar un hueco de memoria con .byte, que llenar la memoria con un dato con db

El compilador calcula las direcciones igual, y al estar en RAM al zona de las variables, funciona (en el emulador), pero realmente te está compilando un fichero como si en esa zona hubiera código, por eso te crea un fichero de más de 32KB.

A mí me funcionaba en blueMSX, pero en ordenadores reales, no.

No sé cual es la directiva para reservar espacio en sjasm, pero el problema es el que te he descrito. Con usar la directiva correspondiente, adios problema. Además verás que la ROM pasa a medir exactamente 32KB


Esto fue lo que me explicó pitpan cuando pregunté eso mismo en MRC:
Código:
Para reservar espacio para las variables, si es que estás usando asMSX, deberías emplear DS y no DB o DW,
porque lo que quieres es reservar espacio, no definir constantes en la ROM.
Verifícalo, porque probablemente ése sea el problema: estás metiendo algún dato a partir de 0C000h y por eso te genera "código" en esa parte.
« Última modificación: 06 de Noviembre de 2011, 11:20:52 pm por assembler » En línea
burguera
Visitante
« Respuesta #2 : 07 de Noviembre de 2011, 01:00:12 am »

Buenas! Gracias por los comentarios, assembler. Efectivamente, creo recordar que asMSX se comporta como tú dices. Sin embargo, parece que en sjasm no es así. Igual hay alguna forma de decirle que a partir de C000 es RAM y el resto es ROM, de forma que no te cree un fichero que lo englobe todo. Ni idea.

Supongo que la forma natural de trabajar con sjasm es usar los MAP, y así lo hacía, pero no entendía por qué al añadir el código de SapphiRe me petaba. Ahora ya lo sé, mea culpa, problema solucionado. Os cuento, por si os interesa. En la declaración de variables del replayer PT3 tenía algo parecido a esto:

Código:

   MAP  0c000h

VAR1 # 3
VAR2 # 5
VARS:
VAR3 # 2
VAR4 # 3
Con lo que esperaba que VAR1=0c000h, VAR2=0c003h, VARS=0c008h, VAR3=0c008h, VAR4=0c00ah. Sin embargo, lo que obtenía era lo que esperaba salvo que VARS=0c000h.

Error de novato: el valor de VARS se asigna según el contador de direcciones general, mientras que el resto se asigna según el MAP. Solución: hacer

Código:
VARS # 0

Lo dicho, una chorrada, resultado de hacer un “buscar y cambiar” a saco para convertir el código asMSX de SapphiRe al sjasm que necesitaba.

Disculpad las molestias! :-)

En cualquier caso, los que trabajáis con sjasm, ¿usáis MAP para definir la zona de variables en RAM al programar una ROM?
En línea
Imanok
Karoshi Hero
*****
Mensajes: 626


« Respuesta #3 : 07 de Noviembre de 2011, 09:28:23 am »

Yo también uso sjasm y lo tengo montado metiendo lo que va en RAM al final de todo, de la siguiente forma:

Código:
; *** FINAL DEL PROGRAMA ***

; *** Llena hasta 32Kb ***
programend: ds 0C000h - $,0FFh

; *** Variables ***

variable1: equ 0E000h ; Variable de 1byte
variable2: equ variable1 + 1 ; Variable de 1byte
variable3: equ variable2 + 1 ; Variable de 2bytes
variable4: equ variable3 + 2 ; Variable de 2bytes
endmem: equ variable4 + 2
end



En línea
burguera
Visitante
« Respuesta #4 : 07 de Noviembre de 2011, 12:15:33 pm »

Cierto, es lo más directo, Imanok. De todas formas, echa un vistazo al uso de MAP y de los #, según el manual hacen exactamente lo mismo que haces tú pero con una sintaxis más cómoda.
En línea
Imanok
Karoshi Hero
*****
Mensajes: 626


« Respuesta #5 : 07 de Noviembre de 2011, 12:54:14 pm »

Seguro que mi método es más coñazo... pero también más portable a otros ensambladores.

Además, esta forma te permite reutilizar parte del espacio de buffers ya asignados, para otras cosas (no sé si eso se puede hacer con MAP y #). Por ejemplo, el espacio que uso como buffer de descompresión (2Kb), lo reutilizo una vez descomprimidos los datos como 3 buffers diferentes (pantalla, definición de patrones animados y tabla de colores de patrones animados).
En línea
burguera
Visitante
« Respuesta #6 : 07 de Noviembre de 2011, 02:06:08 pm »

Sí, más portable sin duda.

Según el manual, hacer


Código:
 
  MAP 0c000h
VAR1 # 2
VAR2 # 3
es lo mismo que hacer
Código:
VAR1 EQU 0c000h
VAR2 EQU VAR1+2
A efectos prácticos es lo mismo. Aunque menos portable, indeed
En línea
Páginas: [1]
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!