Karoshi MSX Community
25 de Marzo de 2017, 04:23:50 am *
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 Calendario Ingresar Registrarse  
Páginas: [1] 2 3
  Imprimir  
Autor Tema: TUTORIAL: Desarrollo compatible para todas las familias de MSX  (Leído 23714 veces)
0 Usuarios y 1 Visitante están viendo este tema.
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


Ver Perfil WWW Email
« : 12 de Enero de 2007, 08:32:31 pm »

Últimamente se ha comentado por aquí lo problemático que puede ser desarrollar juegos MSX en una plataforma u otra. Como de lo que se trata es de hacer programas que sean compatibles, esa es la gracia, con cualquier modelo, creo que sería interesante desarrollar una lista de normas de buena conducta para que a la hora de desarrollar software, se pueda garantizar su correcto funcionamiento en la mayor cantidad posible de modelos, idealmente todos.

Así a bote pronto se me ocurren los siguientes:


PARTE I

Versión de MSX

Es lo primero que deberiamos comprobar. Si consultamos  el valor de MSXVER ($002D) obtendremos el modelo sobre el que nos encontramos:

  • 0 - MSX1
  • 1 - MSX2
  • 2 - MSX2+
  • 3 - TR
  • 4 - OCM  Cheesy

A continuación, si no estamos sobre un MSX1 y nuestro programa lo requiere podemos afinar más la identificación consultando un par de posiciones de memoria en las que podremos encontrar información acerca de determinados usos locales para los que nuestro modelo de MSX ha sido acondicionado:
 
Estas posiciones son la $2B y la $2C. Su contenido se distribuye de la siguiente manera:

Código:
-------
| 2BH |  
-------
 b0  --+
|  Generador de carácteres
 b1 |
|  0: Japones 1: Internacional
 b2 |  2: Ruso (¿Coreano?)
|
 b3  --+

 b4  --+
|  Formato de fecha
 b5 |
|  0:Y/M/D 1:M/D/Y 2:D/M/Y
 b6  --+

 b7   Periodo de sincronismo (VSYNC)
  0:60Hz 1:50Hz


-------
| 2CH |  
-------
 b0  --+
|  Tipo de teclado
 b1 |
|  0:Japonés 1:Internacional
 b2 |  2:Francés 3:Inglés
|  4:Alemán 5:Ruso 6:Español
 b3  --+

 b4  --+
|
 b5 |  Versión del BASIC (PRINT USING, etc.)
|  
 b6 |  0:Japonés 1:Internacional
|
 b7  --+

Especialmente importantes son los contenidos del bit 7 de $2B (sincronismo) y de los bits 0-3 de $2C (tipo de teclado).


RAM mínima disponible

El estandar determina que la RAM mínima disponible que puede tener un equipo de la norma es de 8Kb, ¿que significa esto?, pues que si hacemos los juegos pensando en usar 16Kb de RAM, no funcionarán en esas máquinas que sólo monten 8Kb. La decisión es nuestra, en caso de optar por la compatibilidad, deberemos ajustar nuestras necesidades a esa cantidad de memoria, que en realidad será bastante menor de 8Kb (no llegarán a 5Kb los disponibles).

Las areas de datos, en un caso o en otro deberán inicializarse como sigue:

8Kb RAM : Area de datos en RAM a partir de $E000
16Kb RAM : Area de datos en RAM a partir de $C000

Modelos MSX1 conocidos con 8Kb de RAM:



RAM máxima disponible (MSX1)/ Slots primarios) y slots secundarios (Subslots)

El Z80 o micro compatible que incorporan los MSX únicamente puede acceder a un rango de direcciones lineal comprendido entre 0 y 65535 ($FFFF), de ahí que la máxima memoria a la que puede acceder un MSX1 es de 64K (los MSX2 pueden acceder hasta a 4Mb mediante un mapper; pero eso ya es otra historia), no hay margen para más.
Estos 64Kb son lineales para la CPU; pero en realidad su disposición física puede diferir mucho de la lógica. En teoría nosotros vemos lo mismo que la CPU :

Código:
--- 0000 ---+----------+
   |          |
Página 0    |   BIOS   |
   |          |
--- 4000 ---+----------+
   |          |
Página 1    |   BASIC  |
   |          |
--- 8000 ---+----------+
   |          |
Página 2    | RAM>16KB |
   |          |
--- C000 ---+----------+
Página    | RAM 16KB |
--- E000 ---+----------+
3    | RAM  8KB |
--- FFFF ---+----------+

Las páginas 0 y 1 siempre están ocupadas por la BIOS y el intérprete de BASIC respectivamente, a partir de ahí el contenido de las dos siguientes dependerá de la cantidad de RAM disponible por el MSX, los equipos con 32Kb o más (¿existen equipos con 24Kb de RAM?) tendrán RAM disponible en las páginas 2 y 3 ($8000 y $C000), los equipos con 16Kb sólo en la página 3 ($C000) y los de 8Kb, igualmente en la página 3; pero a partir de $E000. Respecto a esto, es importante hacer notar que lo único que podremos asumir en un MSX al inicializarse es que en la página 3 siempre tendremos RAM.

Sin embargo, lo habitual es que un equipo MSX incorpore 64Kb, ¿donde están los otros 32Kb?. Están ahí, sólo que enmascarados por la BIOS y por el BASIC; despues de todo hemos dicho que un Z80 no puede ver más alla de 64Kb, así que si tuvieramos los 64Kb de RAM visibles, no podriamos tener al mismo tiempo ni BIOS, ni intérprete BASIC.

Esa RAM "paralela" se esconde en lo que a partir de ahora vamos a llamar slot y que físicamente corresponden, cada uno de ellos, a una ranura de cartucho (aunque no tienen porque ser accesibles por nosotros Wink).

Cuando deciamos que la disposición física puede diferir mucho de la visible lógica, nos referiamos entonces a esto:


Código:
Número de slot

   +--------+--------+--------+--------+--------+--------+--------+
   |    0   |    1   |    2   |   3-0  |   3-1  |   3-2  |   3-3  |
   |        |        |        |        |        |        |        |
--- 0000 ---+========+========+========+========+========+========+========+
   |        |        |        |        |        |        |        |
Página 0    |  BIOS  |        |        |        |        |   RAM  |
   |        |        |        |        |        |        |        |
--- 4000 ---+--------+--------+--------+--------+--------+--------+--------+
   |        |        |        |        |        |        |        |
Página 1    |  BASIC |        |        |        |        |   RAM  |        |
   |        |        |        |        |        |        |        |
--- 8000 ---+--------+--------+--------+--------+--------+--------+--------+
   |        |        |        |        |        |        |        |
Página 2    |        |        |        |        |        |   RAM  |        |
   |        |        |        |        |        |        |        |
--- C000 ---+--------+--------+--------+--------+--------+--------+--------+
   |        |        |        |        |        |        |        |
Página 3    |        |        |        |        |        |   RAM  |        |
   |        |        |        |        |        |        |        |
--- FFFF ---+--------+--------+--------+--------+--------+--------+--------+

Esta sería la disposición de la RAM en un Philips VG-8020. Según el esquema podemos comprobar como los 64Kb se encuentran en serie en el slot 3, mientras que la BIOS y el BASIC están en el slot 0 (es lo habitual). Esto podemos comprobarlo desde BASIC ejecutando:

Código:
PRINT HEX$(INP(&HA8))

El resultado obtenido será $F0. Este valor tendremos que interpretarlo a partir de lo siguiente:

Puerto $A8

Código:
bit  7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+
| 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+---+
 +---+   +---+   +---+   +---+
 Slot    Slot    Slot    Slot
 Pág.3   Pág.2   Pág.1   Pág.0

Este resultado nos está indicando que en ese preciso instante (desde BASIC) en las páginas 2 y 3 estamos "viendo" el slot 3, que como consta en el anterior esquema contiene RAM y que en las páginas 0 y 1 vemos el slot 0, que contiene la BIOS y el BASIC,... todo en orden Smiley

Si queremos activar los otros 32Kb podriamos pensar que con un OUT &HA8,&HFF lo tendríamos todo arreglado; pero claro, más de uno ya habrá caido en la cuenta que desde BASIC no podemos desactivar ni la página de la BIOS, ni la del BASIC, el cuelgue sería inmediato. Para este menester será siempre necesario recurrir al código máquina; mediante una rutina como la que sigue conseguiriamos nuestro proposito de activar los 64K:

Código:
di
in a, ($ A8)
and $ F0
ld c, a
RRCA
RRCA
RRCA
RRCA
or c
ei
out ($A8),a

¿Y ya tendriamos los 64Kb dispuestos para ser usados?;.....pues no....Tongue

En el caso del Philips VG-8020 y de otros muchos modelos, si que es cierto que los 64Kb se encuentran en el mismo slot; pero la norma no especifica esto como algo de obligado cumplimiento; por lo que cada fabricante montará esas páginas de 16Kb donde más le convenga, podrán estar distribuidas al azar por cualquiera de los 4 slots. Está claro que para activar una página en concreto se hace necesaria una rutina que no se limite a aplicar una regla fija, sino que busque por todos los slots esa RAM. Ahora, como si todavía no fuera lo suficientemente complicado, entrarán en juego los slots secundarios 8o.
En el mapa de memoria del Philips podemos ver como la RAM está en el slot 3; pero hay algo más, esta aparece realmente en el 3-2, ¿que significa eso?; pues que cada uno de los slots primarios puede subdividirse en otros cuatro (0-3) llamados secundarios o subslots, estos nuevos slots no tienen representación física, se mapean únicamente a nivel lógico. Si un slot primario va a poder estar dividido o no en secundarios podemos consultarlo en las siguiente tabla de posiciones de memoria:

EXPTBL

$FCC1 - Slot 0: $80 = expandido, 0 = no expandido.
$FCC2 - Slot 1: $80 = expandido, 0 = no expandido.
$FCC3 - Slot 2: $80 = expandido, 0 = no expandido.
$FCC4 - Slot 3: $80 = expandido, 0 = no expandido.


Por culpa de todo esto, un nuevo y rápido cálculo nos muestra que de las 16 ubicaciones originales que teniamos para las páginas de 16Kb, ¡ahora podremos tener hasta 64!.
La rutina de la que hemos hablado ya no deberá unicamente buscar la RAM por los slots primarios; sino que tendrá que tener en cuenta también la existencia de los slots secundarios.

Otro ejemplo típico de manipulación de slots es el caso de las ROMs de 32Kb ($4000-$BFFF). Si nos planteamos el hacer una, hemos de tener en cuenta que la BIOS únicamente inicializará por su cuenta la página 1 ($4000-$7FFF) que es donde se encuentra la cabecera de la ROM con la dirección de ejecución de la misma. Tendremos que ser nosotros los que inicialicemos la página 2 con los 16Kb superiores de nuestra ROM y para ello tendremos que averiguar en que slot primario y secundario se encuentra. El procedimiento sería como el que sigue:

Código por Ramones/ TMHB

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

Con esta rutina, nuestra ROM ya estará completa en las páginas 1 y 2 y podrá ejecutarse correctamente.
 
ROMs de 48Kb (por Ramones)

Aunque las ROMs más comunes en el MSX son las de 16Kb y 32Kb (1 y 2 páginas respectivamente) tambien podemos ensamblar ROMs de 48Kb con las que tendriamos el rango completo de direcciones (64Kb) bajo nuestro control.
Son algo más complicadas que las anteriores, el principal problema es que la única página que nos quedaba disponible sin usar es la página 0 y esta página contiene la BIOS. Esto complica algo la programación, ya no sólo porque dejaremos de tener disponible la BIOS para nuestro programa, sino porque con la BIOS perderemos el ISR (Interrupt Service Routine) asociado al modo de interrupciones estandar en los MSX, el IM1, instalado a partir de la dirección $38.

Para sobrellevar esto podremos emplear ciertas estrategias como:

  • Usar la página 0 como almacen de datos: para ello, tendríamos que activar nuestra página de la ROM, usar los datos allí contenidos y finalmente restaurar la BIOS. El proceso se repetiría para cada acceso que quisieramos hacer.
    Todo esto habría que hacerlo siempre con las interrupciones desactivadas, ya que como hemos dicho, en el modo IM1, el sistema trataría de ejecutar el código a partir de la dirección $38 al producirse una interrupción y en caso de suceder eso mientras que nuestra página estuviese activa, no existiría tal código y el programa se colgaría.
  • Programando un nuevo ISR: tendriamos que sustituir el ISR original de la BIOS con uno nuestro en la dirección $38, de esta manera ya podríamos tener permanentemente activa esta página, que ya podría contener lo que nosotros quisieramos, código, datos o ambos.
  • Cambiando el modo de interrupciones a IM2: similar al anterior, mediante este método podríamos tener permanentemente activada la página ya que las interrupciones ya no tratarían de ejecutar el código en $38, nuestro ISR se instalaría en función de los requisitos de IM2 (ver ejemplo en la sección de snippets).
  • Soluciones mixtas: ningún método es definitivo y en función de nuestras necesidades podremos en unos momentos tener la página permanentemente activada y en otros desactivarla para poder usar la BIOS.

En cualquier caso, la forma de acceder a esa página y de recuperar la bios, ya no puede ser realizada por las rutinas del sistema, es decir la BIOS. El MSX no cuenta con una manera de posicionar en la página de la BIOS otro slot y volver a recuperar la BIOS con otra rutina de sistema. Por eso hemos de hacerlo nosotros mismos, y para ello hay que ser conscientes y respetuosos con los slots y subslots. Lo que adjunto es un poco evolución de lo anteriormente expuesto, ya que necesitamos tener en la variable slotvar, el slot/subslot de nuestra ROM, por lo tanto estas rutinas no son funcionales si no hemos ejecutado antes la rutina search_slot.

Código:
; ------------------------------
; SETROMPAGE0
; Posiciona nuestro cartucho en
; Pagina 0
; -----------------------------

setrompage0:

ld a,(slotvar)
jr setslotpage0



; ------------------------------
; RECBIOS
; Posiciona la bios ROM
; -------------------------------

recbios:
ld a,(EXPTBL)



; ---------------------------
; SETSLOTPAGE0
; Posiciona el slot pasado
; en pagina 0 del Z80
; A: Formato FxxxSSPP
; ----------------------------

setslotpage0:
di

ld b,a ; B = Slot param in FxxxSSPP format


in a,(0A8h)
and 011111100b
ld d,a ; D = Primary slot value

ld a,b

and 03
or d
ld d,a ; D = Final Value for primary slot

; Check if expanded
ld a,b
bit 7,a
jr z,recbiosprimary ; Not Expanded


and 03h
rrca
rrca
and 011000000b
ld c,a
ld a,d
and 00111111b
or c
ld c,a ; Primary slot value with main slot in page 3

ld a,b
and 00001100b
rrca
rrca
and 03h
ld b,a ; B = Expanded slot in page 3
ld a,c
out (0A8h),a ; Slot : Main Slot, xx, xx, Main slot
ld a,(0FFFFh)
cpl
and 011111100b
or b
ld (0FFFFh),a ; Expanded slot selected


recbiosprimary:
ld a,d ; A = Final value
out (0A8h),a
; Slot Final. Ram, rom c, rom c, Main
ret


FIN DE LA PARTE I
« Última modificación: 30 de Enero de 2014, 12:42:28 pm por Jon_Cortazar » En línea

Doom dee doom dee doom
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


Ver Perfil
« Respuesta #1 : 12 de Enero de 2007, 08:45:04 pm »

Como temas adicionales, sólo se me ocurre lo siguiente:

- No se deben utilizar modos no estándar del TMS9918/9928/9929 y compatibles. Los modos mixtos no son compatibles con TODOS los MSX1.

- Si se utiliza el modo R800 del Turbo-R, no se deben utilizar instrucciones no oficiales del Z80, porque no todas ellas son soportadas.

Y una recomendación:

- BIOS para (casi) todo.

Un fantástico trabajo, JL! Muchísimas gracias por compartirlo con nosotros en los foros.
En línea
Ramones
Visitante
« Respuesta #2 : 12 de Enero de 2007, 08:58:50 pm »

Enhorabuena JL.  Fantástico y encima desmigajado totalmente para que nadie tenga dudas. Smiley

Insisto en el tema de que metamos todo esto en la web de Edu. Smiley Es que, no es por menospreciar lo interesante del foro en este aspecto, solo que el hilo, se morira y se perderá y luego será dificil de encontrar.

Opto mejor por dejarlo en un sitio de fácil acceso, como es una web bien preparada.

Cosas a añadir. Ya lo dices claro, los 28 ciclos de retardo para el outi, yo contaba 24 sin contar el extra de refresco de memoria, pero faltaría añadir que el problema es el mismo para OUT.

Así pues, con esos datos, tenemos que:

outi
nop
nop
outi

es correcto.

La version out(c),x es

out(c),a
nop
nop
nop
out(c),a

Basada en el mismo principio. Wink

Sobre los 50/60hz, tenemos esto en el TH del MSX2:

* International MSX



There are different kinds of MSX for various countries. The following items

are different by country:



- Keyboard arrangement, character set, PRINT USING format

- Timer interrupt frequency



The version of machine can be found by reading the ID byte information in ROM

(see Figure 2.19) and the correspondence for MSX of each country will be

accomplished (see Table 2.23).





   Figure 2.19   Contents of ID byte



-------

| 2BH |   b0  --+

-------    |  character generator

     b1   |

      |  0: Japan   1: United States, etc.

     b2   |  2: USSR

      |

     b3  --+



     b4  --+

      |  date format

     b5   |

      |  0:Y/M/D   1:M/D/Y       2:D/M/Y

     b6  --+



     b7      interrupt period (VSYNC)

         0:60Hz   1:50Hz





-------

| 2CH |   b0  --+

-------    |  keyboard

     b1   |

      |  0:Japan   1:United States, etc.

     b2   |  2:France   3:United Kingdom

      |  4:Germany   5:USSR      6:Spain

     b3  --+



     b4  --+

      |

     b5   |  information about PRINT USING

      |  or others

     b6   |

      |

     b7  --+



Lo cual quiere decir que si eso existe en MSX1 y lo miraré ahora, se puede averiguar solo mirando eso si la máquina es PAL o NTSC, mirando la direccion 2Bh, y por lo menos en las bios MSX1 que estoy mirando si se cumple. Smiley Y espera, que me pase a papel el TH del MSX1 de la página de Edu ... sip, 2Bh, en efecto te dice si la máquina es PAL o NTSC. Smiley

Sobre los slots... si habría que añadir, aunque fuese la rutina básica para posicionar de tu rom, si ejecuta en 04000h o 08000h (lo más normal) los otros 16k, aunque también están en el TH del MSX1 y del MSX2 con rutinas llamadas "where_am_I" que me hacen gracia en estos momentos. Smiley








En línea
MsxKun
Karoshi Forum's Guru
*******
Mensajes: 1554


Kimochi-ii


Ver Perfil WWW Email
« Respuesta #3 : 12 de Enero de 2007, 10:31:57 pm »

Muy currado, JL Smiley
Creo que habria añadir tb el tema PSG, y su registro 7 de la muerte.
En línea

--

Cindy Lauper She Bops!
e_sedes
Karoshi Maniac
****
Mensajes: 442



Ver Perfil Email
« Respuesta #4 : 12 de Enero de 2007, 10:44:53 pm »

Excelente idea y trabajo, JL! Sugiero que esto quede pegado arriba, siempre a la vista. Y si pudiese ser que el primer mensaje se fuese editando para incluir las sucesivas aportaciones sería redondo. Y lo de que se recoja en otros lados también. Nunca está de más tener las cosas importantes en más de un sitio, que ya sabemos lo que pasa, que un día peta el servidor y no hay copias y tal...



<modo pejiguero/on> ( y más o menos OT)
Y espera, que me pase a papel el TH del MSX1 de la página de Edu ... sip, 2Bh, en efecto te dice si la máquina es PAL o NTSC. Smiley
Ya que esto va de corrección técnica será mejor decir que es 50Hz ó 60Hz. Es muy común eso de cambiar de PAL a NTSC o viceversa, y no es correcto. Se cambia la frecuencia pero no la norma. Será PAL/50Hz ó PAL/60Hz y NTSC/60Hz ó NTSC/50Hz. La norma de Brasil, por ejemplo, es un PAL a 60Hz. En Francia es a 50Hz pero SECAM... (bueno, no exactamente, porque SECAM es un poco coñazo y por eso los aparatos franceses traen salida RGB y tal, pero bueno... Tongue)
Perdón por el rollo, pero es algo que no se por qué no me gusta. Ya veis, cada uno tenemos lo nuestro  Tongue Roll Eyes Wink Grin
<modo pejiguero/off>

un saludo.
En línea

sempre fun un valente corredor
Ramones
Visitante
« Respuesta #5 : 12 de Enero de 2007, 11:24:58 pm »

Perdón por el rollo, pero es algo que no se por qué no me gusta. Ya veis, cada uno tenemos lo nuestro  Tongue Roll Eyes Wink Grin
un saludo.

Además tienes razón. El bit solo indica el refresco. Lo de PAL y NTSC es una costumbre mal adquirida, que incluso veo en el manual (TH) del 9938.

Bueno, podemos averiguar el refresco, hablemos como toca. Wink

En línea
Dioniso
Visitante
« Respuesta #6 : 13 de Enero de 2007, 03:24:24 am »

Creo que habria añadir tb el tema PSG, y su registro 7 de la muerte.

No sé en qué momento el registro 7 llegó a suponer la muerte ... Gracias de todos modos por hablar de esto de este modo MsxKun. Sin duda habrá quien diga que este tema me resulta algo personal ... Pues claro que sí, y si dijera que no mentiría como un bellaco. Pero la verdad es que no veo la gravedad y el bochorno que se le da.

Mi rutina para detectar versión en Beepertron (venga, ahora podéis rajar):

Código:
;MSX Version
ld a,($2d)
or a
jr z,MSX1
cp 3 ;turbo-r
jr nz,guess_hz
call $183
or a
jr z,guess_hz
ld a,$80
call $180 ;modo z80 en turbo-r
;detectamos herzios
guess_hz:
ld a,1
ld ($c018),a ;MSX 2 o superior - podemos modificar los herzios.
ld a,($ffe8)
bit 1,a
jr z,its_60hz
xor a
ld ($c019),a ; 0=50hz (variable para herzios)
jr end_check_version
its_60hz:
ld a,1
ld ($c019),a ;1=60hz
jr end_check_version

MSX1:
xor a
ld ($c018),a

end_check_version:
En línea
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



Ver Perfil WWW Email
« Respuesta #7 : 13 de Enero de 2007, 10:15:49 am »

Interesante thread!! (ya mismo es un sticky thread para que no se pierda ni nada por los infinitas lindes de los foros Karoshieros  Wink Roll Eyes )

Por cierto, Jl, te pediría que todos los cambios, sugerencias, etc... que creas oportuno modificar, alterar y demás, hazlo en el primer mensaje del hilo, para así dejar el documento al 100% de su lectura en el principio, y que la gente no tenga que leerse todas las sugerencias/cambios separaditas en todo el hilo.

Again, fantástico trabajo JL!, ya te queda menos para cambiar de categoría de user  Cheesy Cheesy Cheesy Cheesy! (si es que siempre te nos adelantas...)
« Última modificación: 13 de Enero de 2007, 10:17:39 am por Viejo_archivero » En línea

Jon Cortázar Abraido (aka El Viejo Archivero)
RELEVO Videogames
[Dioniso: La cafeína está haciendo su trabajo; yo espero hacer el mío.]
[pitpan: Me sigue pareciendo más productivo jugar al SNAIL MAZE que seguir esta discusión.]
Ramones
Visitante
« Respuesta #8 : 13 de Enero de 2007, 11:24:17 am »

Una de slots y subslots rapidita. Lo básico para hacer una Rom de 32k y de 48k, normal de ASM/C. Dejo al margen las de Basic, puesto que no tengo conocimientos sobre ellas, y hay información en otras páginas (que lo ponga aquí quien más sepa de ellas).

Esto sacado de los TH. Las Roms pueden ser inicializadas tanto en la pagina 0, 1 y 2 del Z80. Dejo al margen las de pagina 0 pues son algo raritas, aunque tenemos casos donde se usaron (Hero, Crazy Train...).

Las de pagina 1 y 2, es decir, 04000h-7FFFh, y 08000h-0BFFFh, son inicializadas por el MSX. El MSX detecta la cabeceza 041h,042h, coge la dirección contenida en 04002h, o 08002h, posiciona ese slot/subslot y ejecuta. Pero no podemos dar por hecho que las otras 16k estén posicionadas, pues la BIOS no lo hace.

Por ello, ya que las vamos a utilizar, es necesario saber en que slot/subslot estamos y posicionar esas 16k Extra. Esto se realiza con esta pequeña rutina ASM, repito, contenida en THs.

Adjunto pequeño programa inicializador, también explicado en los TH, que crea una Rom arrancable en pagina 1, y busca las 16k extra (08000h-0BFFFh), y las posiciona.


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


Y ahora hablemos de las Roms de 48k. Estas Roms, perfectamente legales, cuentan con un problema: Las 16 extra utilizadas se posicionan en la misma zona del Z80 que la BIOS. Esto nos complica la programación, y contamos con algunas maneras de usarlas:

[] Como almacen de datos: Posicionamos la pagina de la Rom, usamos los datos, y volvemos a poner la BIOS. Siempre con las INTERRUPCIONES DESACTIVADAS, ya que en el modo IM1, el sistema salta a 038h cuando se produce una interrupción y podría destrozarnos el programa.

[] Con código propio. Pero hemos, o bien cambiar el modo de interrupción a IM2 (cosa que funciona pero no se hasta que punto es standard), o bien creamos nuestra propia rutina de control de interrupciones. 038h en adelante.

[] Un poco de ambos.

En cualquier caso, la forma de acceder a esa página y de recuperar la bios, ya no puede ser realizada por las rutinas del sistema, es decir la BIOS. El MSX no cuenta con una manera de posicionar en la página de la BIOS otro slot y volver a recuperar la BIOS con otra rutina de sistema. Por eso hemos de hacerlo nosotros mismos, y para ello hay que ser conscientes y respetuosos con los slots y subslots. Lo que adjunto es un poco evolución de lo anteriormente expuesto, ya que necesitamos tener en la variable slotvar, el slot/subslot de nuestra Rom, por lo tanto estas rutinas no son funcionales si no hemos ejecutado antes la rutina search_slot.

Código:
; ------------------------------
; SETROMPAGE0
; Posiciona nuestro cartucho en
; Pagina 0
; -----------------------------

setrompage0:

ld a,(slotvar)
jr setslotpage0



; ------------------------------
; RECBIOS
; Posiciona la bios ROM
; -------------------------------

recbios:
ld a,(EXPTBL)



; ---------------------------
; SETSLOTPAGE0
; Posiciona el slot pasado
; en pagina 0 del Z80
; A: Formato FxxxSSPP
; ----------------------------

setslotpage0:
di

ld b,a ; B = Slot param in FxxxSSPP format


in a,(0A8h)
and 011111100b
ld d,a ; D = Primary slot value

ld a,b

and 03
or d
ld d,a ; D = Final Value for primary slot

; Check if expanded
ld a,b
bit 7,a
jr z,recbiosprimary ; Not Expanded


and 03h
rrca
rrca
and 011000000b
ld c,a
ld a,d
and 00111111b
or c
ld c,a ; Primary slot value with main slot in page 3

ld a,b
and 00001100b
rrca
rrca
and 03h
ld b,a ; B = Expanded slot in page 3
ld a,c
out (0A8h),a ; Slot : Main Slot, xx, xx, Main slot
ld a,(0FFFFh)
cpl
and 011111100b
or b
ld (0FFFFh),a ; Expanded slot selected


recbiosprimary:
ld a,d ; A = Final value
out (0A8h),a
; Slot Final. Ram, rom c, rom c, Main
ret


Repito. Cuando accedais a esa página, aseguraros que teneis las interrupciones desactivadas, o bien, cuando está posicionada no se os ocurra activarlas, a no ser que conteis con vuestro propio interrupt handler.

Ale, si algo no queda claro, lo puedo extender un poco, pero para empezar creo que es suficiente.



En línea
MsxKun
Karoshi Forum's Guru
*******
Mensajes: 1554


Kimochi-ii


Ver Perfil WWW Email
« Respuesta #9 : 13 de Enero de 2007, 12:38:51 pm »

Creo que habria añadir tb el tema PSG, y su registro 7 de la muerte.

No sé en qué momento el registro 7 llegó a suponer la muerte ... Gracias de todos modos por hablar de esto de este modo MsxKun. Sin duda habrá quien diga que este tema me resulta algo personal ... Pues claro que sí, y si dijera que no mentiría como un bellaco. Pero la verdad es que no veo la gravedad y el bochorno que se le da.

Que no lo decia de mala fe, hombre  Smiley
Lo llamo de la muerte precisamente por eso, pq en teoria era el Armaggedon del MSX, que lo hacia explotar y todo eso. En realidad, a nadie le ha ocurrido, y ya esta. Se coló el registro, y nadie de los que usamos el replayer tampoco nos dimos cuenta, asi que no hay por que decir que fuera culpa tuya. Yo, al ignorar que ni existia eso, lo use. Culpa mia por ignorante, de usarlo, en mi caso.
No hay que darle mas vueltas, como tu dices, se le dio demasiada gravedad. No hay problema, ya esta solucionado y ahora se puede tener en cuenta. Pero esta bien que para aquellos que en aquel entonces no estuvieran por aqui o quienes vieran este post si se cuelga en la web y no sepan de que va el tema, esten alerta con el.
Aun asi para mi siempre sera el registro de la muerte Wink  Pero en el buen sentido.
En línea

--

Cindy Lauper She Bops!
MsxKun
Karoshi Forum's Guru
*******
Mensajes: 1554


Kimochi-ii


Ver Perfil WWW Email
« Respuesta #10 : 13 de Enero de 2007, 12:45:43 pm »

En cualquier caso, la forma de acceder a esa página y de recuperar la bios, ya no puede ser realizada por las rutinas del sistema, es decir la BIOS. El MSX no cuenta con una manera de posicionar en la página de la BIOS otro slot y volver a recuperar la BIOS con otra rutina de sistema.

M... y que hay de la rutina CALSLT ($001c)?
La he probado y parecer funcionar, pero claro, puedo estar metiendo la pata, pa variar  Tongue
En línea

--

Cindy Lauper She Bops!
Ramones
Visitante
« Respuesta #11 : 13 de Enero de 2007, 01:08:43 pm »

M... y que hay de la rutina CALSLT ($001c)?
La he probado y parecer funcionar, pero claro, puedo estar metiendo la pata, pa variar  Tongue

En absoluto, no metes la pata. Pero CALSTL vale para llamar a una subrutina contenida en cualquier slot/subslot.

Lo que explicaba es como disponer de toda la página completa para tratar los datos y recuperar despues la BIOS de nuevo. Wink

Lo tuyo es correcto y funciona. Smiley
En línea
MsxKun
Karoshi Forum's Guru
*******
Mensajes: 1554


Kimochi-ii


Ver Perfil WWW Email
« Respuesta #12 : 13 de Enero de 2007, 01:32:10 pm »

Ahora veo, asi te ahorras tener que tener alguna rutina en pag0 a la cual saltar, por pequeña que sea... Conectas y catapumchimbola, tienes datos y haces. Pillao Smiley
En línea

--

Cindy Lauper She Bops!
andrear1979
Karoshi Newbie
*
Mensajes: 13



Ver Perfil WWW Email
« Respuesta #13 : 13 de Enero de 2007, 06:13:39 pm »

Hi friends, I would point out a recommendation
for PSG register 7: the two most significant bits
affect the joystick connection order, and must
not be involuntarily altered.

That means, if you want to write a binary
value B to reg 7 in ASM, try something like
this:

A=reg(7)
reg(7)=(A AND 11000000b) OR (B AND 00111111b)

Otherwise, you could find joysticks not responding
or exchanged. This is usually not visible on many
emulators, but only on real MSXes.

My best regards,

Andrea
En línea

"... all toghether, good bad and mean, shall last forever in the Software Bin"
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


Ver Perfil WWW Email
« Respuesta #14 : 13 de Enero de 2007, 07:10:37 pm »

Bueno, en cuanto pueda y se me enfríen las yemas de los dedos ire actualizando el primer mensaje con vuestras aportaciones. Lo primero, gracias a Ramones por redactar ese texto y ejemplos de uso de slots y página 0, lo incluiré citando al autor Smiley. Totalmente cierto el lapsus del PAL/NTSC/50/60, en todo caso se ha de hablar realmente de 50/60Hz, que es lo que realmente determina la disponibilidad del VDP en cada refresco. También trataré de incluir el tema de los modos mixtos y el uso de instrucciones no oficiales del Z80.

Respecto al PSG#7, no creo que deba ser incluido aquí ya que no se trata de un tema de compatibilidad entre máquinas, es simplemente de una cuestión de no debe de hacerse en ninguna máquina, sea de la generación que sea. Si se investigase un poco más el origen de esa recomendación hecha por los creadores de hardware igual habría tema para hacer un pequeño artículo...

Citar
That means, if you want to write a binary
value B to reg 7 in ASM, try something like
this:

A=reg(7)
reg(7)=(A AND 11000000b) OR (B AND 00111111b)

Otherwise, you could find joysticks not responding
or exchanged. This is usually not visible on many
emulators, but only on real MSXes.

Hey, Andrea, thanks for your info! Smiley ; but right now I believe that since the infamous PSG#7 affaire, this problem is a very well-known one Roll Eyes. Anyway I found interesting the last bit of your post; you say that misusing the register could lead to swapped or even non working joysticks. Have you found the info somewhere or maybe do you have electronic knowledge of what happens if you output incorrect data?

Thanks again! Wink
En línea

Doom dee doom dee doom
Páginas: [1] 2 3
  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!