¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?
¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?
Hola,
Tengo una pregunta sobre el uso del DIVMMC RAM.
Mi proyecto es utilizar en un spectrum +2A/+2B/+3 64K de RAM (de $0000 a $FFFF)
Eso funciona bien si no utilizo el DIVMMC. Creo que es porque el RAM $0000-$4000 del Divmmc
entra en conflicto con el RAM del Spectrum.
Intenté de utilizar la pagina RAM 0 y 3 del Divide.
Puedo poner data sin problema en la pagina 0. Pero la pagina 3 ne suele funcionar.
Veo le siguiente en el emulador ZesarUX utilizando el DIVMMC Zxuno:
Cuando escribo en el RAM pagina 3, solo el valor en la dirección 0 esta correcta y se repite
en toda la pagina.
El codigo fuente:
.org $8000
; test divide ram
; divide specific code to select divide ram
di
ld a,$0F ; bank 7 at $C000 screen at shadow at $c000
ld bc,$7FFD
out (c),a
ld a,%10000011 ; DivIDE page 3
out ($E3),a ; page in at $2000, if present
; fill ram with test data: 0,1,2,3....
ld bc,8192
ld hl,$2000
fillbyte:
ld (hl),l
dec bc
inc hl
ld a,b
cp $ff
jr nz,fillbyte
ld a,%10000000 ; DivIDE page 0
out ($E3),a ; page in at &2000, if present
ld bc,8192
ld hl,$2000
; fill ram with test data: 0,1,2,3....
fillbyte1:
ld (hl),l
dec bc
inc hl
ld a,b
cp $ff
jr nz,fillbyte1
ld a,%01000000 ; MAPRAM
out ($E3),a ; page 3 at &0000 (read-only), page 0 at &2000
wait:
jr wait
.end
He añadido el test en fichero TAP y el codigo fuente:
Ver fichero actualizado con salida a pantalla más abajo
Tengo una pregunta sobre el uso del DIVMMC RAM.
Mi proyecto es utilizar en un spectrum +2A/+2B/+3 64K de RAM (de $0000 a $FFFF)
Eso funciona bien si no utilizo el DIVMMC. Creo que es porque el RAM $0000-$4000 del Divmmc
entra en conflicto con el RAM del Spectrum.
Intenté de utilizar la pagina RAM 0 y 3 del Divide.
Puedo poner data sin problema en la pagina 0. Pero la pagina 3 ne suele funcionar.
Veo le siguiente en el emulador ZesarUX utilizando el DIVMMC Zxuno:
Cuando escribo en el RAM pagina 3, solo el valor en la dirección 0 esta correcta y se repite
en toda la pagina.
El codigo fuente:
.org $8000
; test divide ram
; divide specific code to select divide ram
di
ld a,$0F ; bank 7 at $C000 screen at shadow at $c000
ld bc,$7FFD
out (c),a
ld a,%10000011 ; DivIDE page 3
out ($E3),a ; page in at $2000, if present
; fill ram with test data: 0,1,2,3....
ld bc,8192
ld hl,$2000
fillbyte:
ld (hl),l
dec bc
inc hl
ld a,b
cp $ff
jr nz,fillbyte
ld a,%10000000 ; DivIDE page 0
out ($E3),a ; page in at &2000, if present
ld bc,8192
ld hl,$2000
; fill ram with test data: 0,1,2,3....
fillbyte1:
ld (hl),l
dec bc
inc hl
ld a,b
cp $ff
jr nz,fillbyte1
ld a,%01000000 ; MAPRAM
out ($E3),a ; page 3 at &0000 (read-only), page 0 at &2000
wait:
jr wait
.end
He añadido el test en fichero TAP y el codigo fuente:
Ver fichero actualizado con salida a pantalla más abajo
Última edición por 40crisis el 10 Feb 2017, 15:24, editado 3 veces en total.
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?
Hola
En el emulador , la paginación de divide es excluyente con la de divmmc , y a la inversa, si activas uno se desactiva el otro.
Esto lo hago porque internamente utilizan mismo sistema de paginación (diviface.c).
Es mas, en un entorno real, tener los dos interfaces conectados no puede ser "bueno", dado que ambos activan la paginación automática en los mismos casos , y no estoy seguro qué leerá el z80 en esos casos
Según la documentación oficial:
"Automatic mapping occurs at the begining of refresh cycle after fetching
opcodes (M1 cycle) from 0000h, 0008h, 0038h, 0066h, 04c6h and 0562h. It's
also mapped instantly (100ns after /MREQ of that fetch is falling down) after
executing opcode from area 3d00..3dffh. Memory is automatically disconnected in
refresh cycle of the instruction fetch from so called off-area, which is
1ff8-1fffh.
"
Por tanto mi consejo es que no uses los dos a la vez.
Alguien puede validar en un entorno real qué sucede?
En el emulador , la paginación de divide es excluyente con la de divmmc , y a la inversa, si activas uno se desactiva el otro.
Esto lo hago porque internamente utilizan mismo sistema de paginación (diviface.c).
Es mas, en un entorno real, tener los dos interfaces conectados no puede ser "bueno", dado que ambos activan la paginación automática en los mismos casos , y no estoy seguro qué leerá el z80 en esos casos
Según la documentación oficial:
"Automatic mapping occurs at the begining of refresh cycle after fetching
opcodes (M1 cycle) from 0000h, 0008h, 0038h, 0066h, 04c6h and 0562h. It's
also mapped instantly (100ns after /MREQ of that fetch is falling down) after
executing opcode from area 3d00..3dffh. Memory is automatically disconnected in
refresh cycle of the instruction fetch from so called off-area, which is
1ff8-1fffh.
"
Por tanto mi consejo es que no uses los dos a la vez.
Alguien puede validar en un entorno real qué sucede?
Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?
Mi codigo funciona con la emulacíon DIVIDE de FUSE.
Otro ejemplo utilizando RAM at $0000-$4000 que soporta el DIVIDE: Pac-Man Emulator para ZX Spectrum +2A
http://simonowen.com/spectrum/pacemuzx/
Este ejemplo funciona con FUSE con Divide interface activado pero no carga con ZesarUX o ZX-UNO con Divmmc activado.
Desactivando el Divmmc carga con ZesarUX o ZX-UNO
¿ Hay alguna diferencia entre la memoría RAM del DIVIDE y DIVMMC ?
Otro ejemplo utilizando RAM at $0000-$4000 que soporta el DIVIDE: Pac-Man Emulator para ZX Spectrum +2A
http://simonowen.com/spectrum/pacemuzx/
Este ejemplo funciona con FUSE con Divide interface activado pero no carga con ZesarUX o ZX-UNO con Divmmc activado.
Desactivando el Divmmc carga con ZesarUX o ZX-UNO
¿ Hay alguna diferencia entre la memoría RAM del DIVIDE y DIVMMC ?
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?
Es lo que ya te decía, no puedes tener los dos interfaces paginando a la vez
No hay ninguna diferencia en la RAM de los dos, funcionan exactamente igual
No hay ninguna diferencia en la RAM de los dos, funcionan exactamente igual
Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?
No entiendo el conflicto de paginación. Porque en el caso que haya DIVIDE disponible, no utilizo el modo de paginación especial disponible a partir del Spectrum +2A en mi codigo (puerto #1FFD ).
Estoy en modo 128/+2 estandar y intento solamente substituir el contenido del EEPROM at #0000-#1FFF con la pagina 3 RAM del DIVIDE y
poner en la zona #2000-3FFF la pagina 0 RAM del DIVIDE.
Como veo que el codigo funciona perfectamente en el emulador FUSE con Divide activado, me pregunto si el problema no puede venir del ZesarUX y del ZXUno.
Me gustaría que funcionaría en el ZX-UNO con divmmc también porque es mi plataforma de pruebas y desarollo.
Estoy en modo 128/+2 estandar y intento solamente substituir el contenido del EEPROM at #0000-#1FFF con la pagina 3 RAM del DIVIDE y
poner en la zona #2000-3FFF la pagina 0 RAM del DIVIDE.
Como veo que el codigo funciona perfectamente en el emulador FUSE con Divide activado, me pregunto si el problema no puede venir del ZesarUX y del ZXUno.
Me gustaría que funcionaría en el ZX-UNO con divmmc también porque es mi plataforma de pruebas y desarollo.
- antoniovillena
- Mensajes: 2621
- Registrado: 27 Sep 2015, 20:41
Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?
Habría que ver cual es el comportamiento correcto. En un emulador funciona y en otro no. Es cuestión de probarlo en spectrum real. Si en real funciona es porque hay algo en zesarux y zxuno que no está bien. Si no, el problema está en el spectaculator
Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?
Hola,
como dice Antonio, alguien me puede ayudar a comprobarlo en un verdadero Spectrum.
En el emulador Fuse está funcionando.
Tiene que ser un Spectrum 128 / +2 / +2A / +2B / +3 con Divide o Divmmc
Porque no tengo nada de eso.
Si es correcto se ve así:
http://dl.free.fr/njgeuvR73
Si no es correcto se ve el rom:
http://dl.free.fr/iBTwWdMTg
Al archivo con el TAP para probar:
http://dl.free.fr/kVQAXbfIC
como dice Antonio, alguien me puede ayudar a comprobarlo en un verdadero Spectrum.
En el emulador Fuse está funcionando.
Tiene que ser un Spectrum 128 / +2 / +2A / +2B / +3 con Divide o Divmmc
Porque no tengo nada de eso.
Si es correcto se ve así:
http://dl.free.fr/njgeuvR73
Si no es correcto se ve el rom:
http://dl.free.fr/iBTwWdMTg
Al archivo con el TAP para probar:
http://dl.free.fr/kVQAXbfIC
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?
A ver, o bien lo he entendido mal, o lo he entendido bien y la explicación es la misma que ya he dado, es decir:
Si estamos hablando de activar divmmc y divide a la vez, esto NO va a funcionar, ni en emulador ni en real. El emulador además ya se encarga de desactivar la paginación del otro dispositivo (divide o divmmc) pues los dos a la vez no pueden usarse, ni en real tampoco.
Pero si no es esto que yo digo, por favor acláralo porque no queda nada bien explicado
Saludos
Si estamos hablando de activar divmmc y divide a la vez, esto NO va a funcionar, ni en emulador ni en real. El emulador además ya se encarga de desactivar la paginación del otro dispositivo (divide o divmmc) pues los dos a la vez no pueden usarse, ni en real tampoco.
Pero si no es esto que yo digo, por favor acláralo porque no queda nada bien explicado
Saludos
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?
Misterio resuelto
Olvida mis comentarios sobre conflictos entre divide y divmmc. Cuando lo mencionabas al principio pensaba que el problema venía de ahí y me ofusqué.
Probé tu programa de testeo y entendí que pasaba: básicamente un bug en ZEsarUX. Cuando activas al final MAPRAM, el segmento 0000-1fffh siempre aparecía con 0 porque en todas las direcciones estaba retornando la misma posición 0 de la página 3. Me faltaba sumar a la posición la dirección indicada (0000-1fffh).
Fallo absurdo
Gracias por tus comentarios, bug corregido en el último codigo fuente. Y en este lógicamente ya se ve el patrón de pantalla perfecto
Lo que ya no se porque en ZX-Uno falla también
Saludos
Olvida mis comentarios sobre conflictos entre divide y divmmc. Cuando lo mencionabas al principio pensaba que el problema venía de ahí y me ofusqué.
Probé tu programa de testeo y entendí que pasaba: básicamente un bug en ZEsarUX. Cuando activas al final MAPRAM, el segmento 0000-1fffh siempre aparecía con 0 porque en todas las direcciones estaba retornando la misma posición 0 de la página 3. Me faltaba sumar a la posición la dirección indicada (0000-1fffh).
Fallo absurdo
Gracias por tus comentarios, bug corregido en el último codigo fuente. Y en este lógicamente ya se ve el patrón de pantalla perfecto
Lo que ya no se porque en ZX-Uno falla también
Saludos
- chernandezba
- Mensajes: 841
- Registrado: 02 Oct 2015, 23:35
Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?
Por cierto no se exactamente en qué usaras la RAM que mapeas entre 0-3fffh pero acuérdate sobre la paginación automática de divide/divmmc: si ejecutas código en esas direcciones, hay direcciones concretas que hacen saltar la paginación y te pueden colgar la máquina...