¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?

Software para o relacionado con el core ZX Spectrum / Software for or related to the ZX Spectrum core
Avatar de Usuario
mcleod_ideafix
Mensajes: 829
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?

Mensaje por mcleod_ideafix » 10 Feb 2017, 03:19

chernandezba escribió:Lo que ya no se porque en ZX-Uno falla también :P

Saludos
Porque eso lo tengo mal implementado. Me lo apunto para cambiarlo enseguida. Mi error ha sido asumir que para que MAPRAM funcione, también debe estar activo COMMEN, cuando no es así. Ha pasado desapercibido porque el modo MAPRAM sólo se usa cuando quieres probar un firm nuevo sin tener que flashear la ROM del DivMMC (y por tanto sin el riesgo a brickearlo).

Es más: creo que ahora mismo MAPRAM se puede poner a 1 o a 0 cuando uno quiera, cuando en realidad debería ponerse a 0 sólo después de un ciclo encendido-apagado-encendido. En el ZX-UNO esto significa que un reset normal no debería afectarle, pero un master reset sí.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
chernandezba
Mensajes: 832
Registrado: 02 Oct 2015, 23:35

Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?

Mensaje por chernandezba » 10 Feb 2017, 08:09

Curioso que tanto en ZEsarUX como en zxuno fallase lo mismo (aunque por razones diferentes)
Creo que 40crisis ha probado algo que nadie había probado antes, jejeje

En cualquier caso, gracias de nuevo a él por reportarlo.

:maestro:
----

ZEsarUX
ZX Second-Emulator And Released for UniX
https://github.com/chernandezba/zesarux

Avatar de Usuario
40crisis
Mensajes: 15
Registrado: 04 Feb 2017, 23:42

Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?

Mensaje por 40crisis » 10 Feb 2017, 13:50

Muchas gracias por haber encontrado el problema y solucionarlo.

Sobre las direccones especiales lo que dice el manual del divide:

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.

¿ Pero no sé si se aplica al modo Divide Mapram allram ?


Necesito ejecutar codigo en la zona RAM #0000-#4000 porque desarollo un emulador/port con una ROM en esta zona.
Por eso si no hay DIVIDE /DIVMMC necesito un Spectrum +2A/+2B/+3, o con Divide un Spectrum 128 /+2/+2A/+2B/+3.

Avatar de Usuario
bakoulis
Mensajes: 187
Registrado: 12 Sep 2016, 10:36

Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?

Mensaje por bakoulis » 10 Feb 2017, 18:12

When the core fixed and updated, please let us know to download the new from stable/binaries/
:D

Avatar de Usuario
mcleod_ideafix
Mensajes: 829
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?

Mensaje por mcleod_ideafix » 11 Feb 2017, 02:26

Estoy leyendo el modelo de programación del DivIDE, y este párrafo no sé exactamente cómo interpretarlo:
In automatic mapping, when MAPRAM is set, in location 0000h-1fffh appears
write-protected Bank No.3, instead of EEPROM/EPROM. The meaning-priority is
(from lowest to highest) EPROM jumper -> MAPRAM -> CONMEM. So because that
jumper is no more significant when MAPRAM or even CONMEM is set, it's used
to distinguish between fused or unfused EEPROM state for CONMEM mode.

So, when CONMEM is set, there is:
0000-1fffh - EEPROM/EPROM/NOTHING(if empty socket), and this area is
flash-writable if EPROM jumper is open.
2000-3fffh - 8k bank, selected by BANK 0..1 bits, always writable.

When MAPRAM is set, but CONMEM is zero, and entrypoint was reached:
0000-1fffh - Bank No.3, read-only
2000-3fffh - 8k bank, selected by BANK 0..1. If it's different from Bank No.3,
it's writable.

When MAPRAM is zero, CONMEM is zero, EPROM jumper is closed and entrypoint was
reached:
0000-1fffh - EEPROM/EPROM/NOTHING(if empty socket, so open jumper in this case),
read-only.
2000-3fffh - 8k bank, selected by BANK 0..1, always writable.

Otherwise, there's normal speccy memory layout. No modified ROM, no shit.
En concreto, esta parte:
So, when CONMEM is set, there is:
0000-1fffh - EEPROM/EPROM/NOTHING(if empty socket), and this area is
flash-writable if EPROM jumper is open.
2000-3fffh - 8k bank, selected by BANK 0..1 bits, always writable.

When MAPRAM is set, but CONMEM is zero, and entrypoint was reached:
0000-1fffh - Bank No.3, read-only
2000-3fffh - 8k bank, selected by BANK 0..1. If it's different from Bank No.3,
it's writable.
Entiendo que si CONMEN está a 1, en los primeros 8KB debe aparecer la EPROM, nunca la página 3 de RAM
Y que sólo si CONMEN es 0, y MAPRAM es 1, es cuando aparece la RAM 3 en los primeros 8KB, pero sólo en mapeado automático.

Dicho de otra forma: que si se fuerza al DivMMC a que se pagine (CONMEN=1), entonces da igual lo que valga MAPRAM. Siempre se ve la EEPROM en los primeros 8KB. Para que se vea la RAM 3 en ese espacio debe estar CONMEN a 0 (no se fuerza la paginación), y entonces sí que se tiene en cuenta el valor de MAPRAM, que debe valer 1.

¿Es así? Porque si es así, esta parte del test:

Código: Seleccionar todo

	   ld  a,%01000000      ; MAPRAM
	   out ($E3),a       	; page 3 at $0000 (read-only), page 0 at $2000
	   
; set attribute to B&W	   
	   ld hl,$D800
	   ld a,7
	   ld (hl),a
	   ld de,$D801
	   ld bc,767
	   ldir
	   
; copy to screen at $C000
	   ld hl,$0000
	   ld de,$C000
	   ld bc,6144
	   ldir
	   
wait:	   
		jr wait
No funcionará como se espera. En concreto, aquí sólo se está poniendo a 1 MAPRAM, pero para que se "vea" a la RAM 3 en el espacio de memoria de los primeros 8KB, debe haber una paginación automática.

Dicho de otra forma: esta línea de código:

Código: Seleccionar todo

	   ld  a,%01000000      ; MAPRAM
	   out ($E3),a       	; page 3 at $0000 (read-only), page 0 at $2000
Debería tener un comentario tal que así:

Código: Seleccionar todo

	   ld  a,%01000000      ; MAPRAM
	   out ($E3),a       	; page 3 at $0000 (read-only), page 0 at $2000 the next time automatic paging is triggered
Voy a ver si puedo probar el test con un DivIDE "pata negra" versión 57c y así salimos de dudas.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
mcleod_ideafix
Mensajes: 829
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?

Mensaje por mcleod_ideafix » 11 Feb 2017, 02:29

40crisis escribió:Sobre las direccones especiales lo que dice el manual del divide:

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.

¿ Pero no sé si se aplica al modo Divide Mapram allram ?
Sí. Según se desprende de lo que he puesto en el post anterior, el mapeo automático también se produce en el modo MAPRAM, y si quieres tener todo el tiempo al DivMMC mapeado, CONMEN a 1 es incompatible con MAPRAM a 1: con CONMEN a 1 siempre apareceráel firmware del DivMMC en ROM, y no lo que tengas en la RAM 3. Eso es lo que interpreto de lo que he leído.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
mcleod_ideafix
Mensajes: 829
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?

Mensaje por mcleod_ideafix » 11 Feb 2017, 02:39

mcleod_ideafix escribió:Voy a ver si puedo probar el test con un DivIDE "pata negra" versión 57c y así salimos de dudas.
De momento puedo decir que en SpecEmu, con la opción de DivIDE habilitado, el programa de test hace lo mismo que en el ZX-UNO, es decir, muestra la ROM en lugar del patrón almacenado en RAM.

EDITO: EightyOne v1.0 también se comporta igual que SpecEmu (y que ZX-UNO). El que no se comporta igual que los anteriores es FUSE. En concreto, en FUSE en el momento en que se pone a 1 MAPRAM, independientemente de lo que valga CONMEM, se pagina la RAM 3 y la RAM 0. En concreto, usando tu test, justo después de ejecutarse estas dos instrucciones

Código: Seleccionar todo

LD A,$40
OUT ($E3),A
fuse_divide_1.png
Ocurre lo siguiente (mirar en Memory Map)
fuse_divide_2.png
Se activan automáticamente las dos páginas de RAM del DivIDE sin esperar a que haya un mapeado automático, como parece entenderse de la lectura del modelo de programación, y que es lo que han implementado SpecEmu y EightyOne.

¿Hay algún otro emulador más que soporte DivIDE?

EDITO: acabo de probar con un DivIDE 57c y su comportamiento es el mismo que SpecEmu y que ZX-UNO. FUSE parece ser por tanto que tiene por tanto un fallo en la implementación del DivIDE.

..... o no. Acabo de leer esto, como una nota al pie de página de la documentación del DivIDE:
[*] Change introduced with r'_gal contents:
- divIDE behaves as normally, until the condition CONMEM=0, MAPRAM mode on,
JP2 open and bank1=1 happens
- then, divide RAM maps in immediately as 16kB banks (paired banks 0:1 or 2:3)
and the CONTROL REGISTER will get new meaning:
[ RETURN, WRITEENABLE, X, X, X, X, X, BANK0 ]
- setting RETURN serves as exit from this mode
- BANK0 selects one of these two 16k banks
- after initiation, WRITEENABLE depends on latest BANK0 state (0 enables)
- after initiation, the state of RETURN is 0 and the state of BANK0 unknown
Resulta que yo no tengo la GAL R' sino la R a secas. Tendré que flashear el código de la R' a ver qué pasa... Desde luego lo que sí tengo claro es que este comportamiento no es el que tengo implementado en ZX-UNO, y juraría que mi DivIDE tampoco. Voy a ver con el DivIDE Plus...
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
mcleod_ideafix
Mensajes: 829
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?

Mensaje por mcleod_ideafix » 11 Feb 2017, 02:41

40crisis escribió: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
OJO! Este programa no funciona con la RAM del DivIDE o DivMMC. Funciona únicamente en un +2A/+3 a causa de que ellos pueden paginar RAM en ROM. En ZX-UNO, en modo +2A/+3 y con el DivMMC habilitado, sí que funciona.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
chernandezba
Mensajes: 832
Registrado: 02 Oct 2015, 23:35

Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?

Mensaje por chernandezba » 11 Feb 2017, 09:19

Gracias por las pruebas Miguel
Estoy viendo que mi código está mal, estoy suponiendo que se pagina manualmente cuando CONMEM es 0, pero no es así. Con ese bit a 0, solo se página cuando hay paginación automática. Creo que fue por enterpretar estos finales de frase: "... and entry point was reached" como erratas y suponer que decía: "... an entry point was reached".

:blepblep:

En fin, lo corregiré y por tanto el programa de test fallará como dices

Saludos
----

ZEsarUX
ZX Second-Emulator And Released for UniX
https://github.com/chernandezba/zesarux

Avatar de Usuario
mcleod_ideafix
Mensajes: 829
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: ¿ Como Usar la RAM del Divmmc teniendo RAM en la zona $0000-$3FFF ?

Mensaje por mcleod_ideafix » 11 Feb 2017, 09:56

Esto es una versión del test que SI funciona en SpecEmu, Fuse y en ZX-UNO (en EightyOne no, no sé por qué).

Código: Seleccionar todo

		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

; transfer small reset routine into PAGE 3. One MAPRAM is active
; auto-mapping will be triggered upon executing instruction at $0000
; which will be forced by issuing a JP 0 from RAM.
           ld hl,CodeInit
           ld de,$2000
           ld bc,LCodeInit
           ldir


       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

; set attribute to B&W
	   ld hl,$D800
	   ld a,7
	   ld (hl),a
	   ld de,$D801
	   ld bc,767
	   ldir

           jp 0   ; jump to ROM to trigger auto-mapping

; copy to screen at $C000
CodeInit:
           di  ; the same as in the standard ROM
	   ld hl,$0000
	   ld de,$C000
	   ld bc,6144
	   ldir

wait:
		jr wait

LCodeInit  equ $-CodeInit

           end 32768
La parte que cambia es que después de escribir el patrón en RAM 3, se añade al principio de ella un pequeño código (que es lo que en el test original se ejecuta al final para copiar el patrón a la pantalla y así mostrarlo). Cuando MAPRAM esté activo, este código estará disponible en la posición 0 del espacio de memoria.

Para invocar ese código, lo que se hace entonces es saltar a la dirección 0. Como la dirección 0 forma parte del auto-mapping, éste ocurrirá y lo que se ejecutará no será la ROM del Spectrum sino el código que hay en RAM 3 (ya que sigue con MAPRAM activo).
Adjuntos
TDIVIDE.zip
(1.02 KiB) Descargado 90 veces
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Responder