Core Next186 PC-XT con CGA

Moderador: antoniovillena

Avatar de Usuario
spark2k06
PLA
Mensajes: 49
Registrado: 17 Ago 2018, 18:43

Core Next186 PC-XT con CGA

Mensaje por spark2k06 » 28 Nov 2021, 09:57

No sabía en qué sección ponerlo y he seleccionado esta. Aunque ya tenemos el foro oficial del ZXUno, he pensado que forofpga es más adecuado para comentar detalles técnicos.

Partiendo del port que llevó a cabo @DistWave para el ZXUno del core de Next186, el caso es que ya podemos decir que tenemos el primer core de PCXT con una más que decente implementación de CGA y parcialmente Tandy, gracias al magnífico proyecto Graphics Gremlin de TubeTime. Además, los primeros beneficiados serán nada menos que el ZXUno y compatibles, como el ZXUnCore :D

Para que no haya problemas de espacio y de paso quitar todo lo que no es necesario, porque incluso podría haber conflictos con la gestión de puertos, he decidido prescindir de los modos de vídeo que parcialmente estaban implementados originalmente en el proyecto Next186, es decir, algunos modos de MCGA/EGA/VGA. En su lugar, he tenido que llevar a cabo las adaptaciones de las señales correspondientes del proyecto Graphics Gremlin para su correcta integración y prescindir de otras propias del bus ISA. Quiero recalcar que en este proyecto se ha llevado a cabo una implementación bastante fiel del chip Motorola 6845, con lo cual disponemos del acceso a todos sus registros y modos gráficos. CGA se encuentra completo, pero la implementación de Tandy de momento es parcial, más información sobre futuros planes del proyecto aquí, de los cuales podremos vernos beneficiados para el core de PCXT.

También he prescindido del módulo de sonido Covox Speech Thing, pero podríamos plantearnos disponer de un fichero de configuración como en el core de Spectrum, y que lo active quien lo desee. El caso es que, con suerte, cuando @jotego termine la implementación del chip OPL2, el jtopl2, es posible que también quepa y tengamos sonido Adlib en el ZXUno, mucho más interesante. Aunque ya veremos, porque el core en sí ya está bastante al límite.

He simplificado el uso de los relojes y los he reconfigurado, estableciendo la velocidad general de la máquina en unos casi 4.77Mhz, sin embargo, aún así es más rápido que un PCXT real, posiblemente sea debido a la cache que lleva el Next186. Antes el core original tenía un timing score disparado, y ahora ha quedado en 0, lo cual hará que sea muy estable. De hecho, el core original me suele dar problemas con algunas PCBs de ZXUnCore, incluso a frecuencias de refresco de la SRAM bajas... ya le haré una revisión más adelante para tratar de dejar el timing score también a 0.

Además de estas adaptaciones en el core, he tenido que sustituir las funciones de la BIOS correspondientes al acceso a vídeo (int 10h), para lo cual, me he apoyado en los fuentes disponibles en el proyecto Micro8088 de Sergey Kiselev.

El core aún presenta sus fallos, no cargan todos los juegos que en principio deberían cargar. Pueden ser dos los motivos:

1. Falta de funcionalidad en la BIOS
2. Carencias o fallos del core Next186

Para resolverlos poco a poco, no queda otro remedio que depurarlos y encontrar el motivo. Si se trata de la BIOS, habría que revisarla y actualizarla... incluso es posible que sea necesario ampliarla porque los 8KB actuales pueden llegar a quedarse cortos. Para ello, habría que hacer una pequeña readaptación del core y el bootstrap para que se realoje correctamente, sin embargo, como la memoria donde se encuentra alojada es RAM y se puede escribir, para hacer pruebas sin necesidad de resintetizar voy a facilitar el proceso actualización en caliente, por si alguien quiere colaborar. Bastaría con disponer del binario de la BIOS en disco y lanzar los siguiente comandos desde el debugger de MS/Dos en el mismo directorio donde se encuentra el fichero de la BIOS:

Código: Seleccionar todo


-n bios.dat
-l e000
-r si
SI xxxx
:e000
-r di
DI xxxx
:e000
-r es
ES xxxx
:f000

Con estos comandos, cargamos la BIOS en la sección de datos actual del debugger y preparamos los registros DS:SI y ES:DI para llevar a cabo una copia en el segmento de carga de la BIOS y posterior reinicio de la máquina con los siguientes:

Código: Seleccionar todo


-a
CLI
CLD
REP MOVSB
JMP F000:E05B
-g

Tras lo cual, la máquina se reiniciará automáticamente con la nueva BIOS de pruebas. Si es una BIOS más grande, digamos que 12KB en lugar de 8KB, habría que sustituir e000 por d000 en todos los casos para posicionarnos 4KB más atrás, y de la misma forma para otros tamaños.

Para que podáis comprobarlo, os adjunto una BIOS de pruebas que aún no tiene implementado el core, y que he incorporado recientemente. Se trata de la implementación del sonido beep cuando se imprime el carácter 7 (bel), con la nueva BIOS veréis que funciona... por ejemplo al lanzar el siguiente comando de MS/Dos:

Código: Seleccionar todo


echo ^G

Para compilar el fichero ASM debéis hacer uso del compilador MASM, con los siguientes comandos:

Código: Seleccionar todo


MASM BIOS.ASM
LINK /TINY BIOS

Os creará un fichero .COM, debéis cambiarlo a otra extensión para que el debugger no se haga un lío durante su carga.

El core actualmente tiene los siguientes problemas conocidos, los cuales habrá que ir investigando el problema y cómo o dónde aplicar la solución, en el core o en la BIOS:
  • Algunos juegos presentan glitches gráficos y/o parecen resultar más lentos de lo normal. Ejemplo: Army Moves
  • Algunos juegos se cuelgan en el menú o durante la redefinición de teclas. Ejemplo: Capitán Trueno
  • Algunos juegos no se cargan, ejemplos:
    - AlleyCat (Version 61Kb)
    - MadMix (EXEPACK)
  • PAKU PAKU no se muestra correctamente en el modo especial de 160x100.
  • No se está mostrando las fuentes de texto en los modos gráficos, a pesar de tenerlos alojados y disponibles en la BIOS.
  • En modo texto hay una primera línea fantasma mostrándose en pantalla.
  • No a todos los monitores le gusta la señal generada por el módulo de la Graphics Gremlin. Ejemplo: FLATRON M1917A
  • Algunos juegos presentan problemas con el sonido generado por el PC-Speaker al pulsar o mantener una tecla pulsada. Ejemplos: Solomon's Key o Titus The Fox.
No obstante, lo suyo sería crear un Excel compartido para ir registrando todos los problemas así como las soluciones que se vayan encontrando... ya sea a nivel de core o a nivel de BIOS.

Para ver fotos de algunos juegos y otros detalles de las funcionalidades del core, podéis verlo en el siguiente post que he creado en el foro de ZXUno.

Dicho todo esto, tenéis disponible los fuentes del proyecto en el siguiente repositorio de mi cuenta de GitHub.

A ver si entre todos dejamos un core digno de ser sustituto de una máquina original de PCXT..., sí, ya sé que es mucho decir 8-)
Adjuntos
BIOS_TEST.zip
(77.63 KiB) Descargado 269 veces
Última edición por spark2k06 el 04 Dic 2021, 15:03, editado 8 veces en total.

Avatar de Usuario
spark2k06
PLA
Mensajes: 49
Registrado: 17 Ago 2018, 18:43

Re: Core Next186 PC-XT con CGA

Mensaje por spark2k06 » 29 Nov 2021, 07:12

Actualización de la BIOS (Cambios en el repositorio):
  • Se ha corregido el fallo de no mostrar correctamente la fuente de caracteres en modo gráfico
  • Se ha añadido el sonido BEEP del caracter BEL (0x7)
Antes se veía así:

Imagen

Tras la corrección:

Imagen

Por otro lado, @DistWave me ha sugerido que haga limpieza del fichero unit186.v, no me había fijado y es cierto que hay restos de código del antiguo manejo de los bitplanes que ya no son necesarios. Lo he intentado pero no lo he conseguido, aunque sintetiza, no arranca el core... adjunto los últimos cambios que he intentado llevar a cabo y que no me han funcionado, por si a alguien se le ocurre cómo limpiarlo correctamente. Finalmente he conseguido hacer limpieza, cambios en GitHub:

https://github.com/spark2k06/next186lit ... e98d612e57
Última edición por spark2k06 el 06 Dic 2021, 07:47, editado 4 veces en total.

Avatar de Usuario
spark2k06
PLA
Mensajes: 49
Registrado: 17 Ago 2018, 18:43

Re: Core Next186 PC-XT con CGA

Mensaje por spark2k06 » 29 Nov 2021, 19:08

He identificado el problema que hace que no cargue el juego Alleycat, la versión de 61Kb, porque luego hay otra de 54Kb que si funciona. El problema en este caso se encuentra en el entrypoint del ejecutable:

Imagen

Las primeras instrucciones tienen como función el cambio de segmento para que el inicio del programa comience en el offset 0, parece que necesita ejecutarse así para acceder a diferentes recursos dentro del mismo segmento.

El caso es cómo lo lleva a cabo, escribiendo en la misma memoria de ejecución para preparar la instrucción JMP. Y es que, al parecer, se cuelga porque en el momento de saltar sigue siendo 0:0. Por las primeras pruebas que he llevado a cabo, mi primera sospecha es la gestión de la caché del Next186, que podría tener un bug. Si se ejecuta paso a paso con el depurador (con t) hasta pasar la instrucción de MOV, luego ya ejecutamos (con g), y funciona:

Imagen

De momento he parcheado el juego para que funcione:

Imagen

Pero habrá que revisar esa caché, seguro que está afectando a más juegos o programas, y confirmo que también sucede con el Next186 original.

Avatar de Usuario
spark2k06
PLA
Mensajes: 49
Registrado: 17 Ago 2018, 18:43

Re: Core Next186 PC-XT con CGA

Mensaje por spark2k06 » 30 Nov 2021, 07:02

Otro ejemplo con el mismo problema es MadMix:

Imagen

En este caso, se escribe en la misma memoria de ejecución y después la instrucción REP MOVSB no hace correctamente la copia:

Imagen

Y aquí igual, si vamos paso a paso en el debugger (con t) hasta pasar este MOV [0004], AX, entonces ejecutamos (con g) y el juego ya arranca bien:

Si lo cargamos en el debugger y lo ejecutamos directamente (con g), el juego arranca bien:

Imagen

En cuando a AlleyCAt, @yombo ha sugerido que tal vez podría ser que no se marcara como dirty la memoria tras la instrucción y por tanto la cache se refrescara. Entonces he hecho la prueba de mantener siempre el bit de dirty establecido, aunque ello suponga una perdida de rendimiento:

Código: Seleccionar todo

[cache_controller_xxx.v]
reg dirty = 1;

/*	
always @(cache0, cache1, cache2, cache3, cache4, cache5, cache6, cache7) begin
	dirty = 1'bx;
	case(1)
		free[0]: begin dirty = cache0[0]; end		
		free[1]: begin dirty = cache1[0]; end
		free[2]: begin dirty = cache2[0]; end
		free[3]: begin dirty = cache3[0]; end
		free[4]: begin dirty = cache4[0]; end
		free[5]: begin dirty = cache5[0]; end
		free[6]: begin dirty = cache6[0]; end
		free[7]: begin dirty = cache7[0]; end
	endcase
end	
*/

Pero sigue fallando. Seguiremos investigando, pero por lo que se ve, este fallo puede tener bastante repercusión en muchos juegos y programas, tanto para esta versión basada en la Graphics Gremlin, como para la original del Next186.
Última edición por spark2k06 el 01 Dic 2021, 08:12, editado 3 veces en total.

Avatar de Usuario
yombo
Veroboard
Mensajes: 18
Registrado: 17 Ago 2018, 10:51

Re: Core Next186 PC-XT con CGA

Mensaje por yombo » 30 Nov 2021, 07:36

Se me ocurre que para descartar que el motivo sea el fetch (la cpu obtiene la última instrucción antes de que se ejecute la escritura), podrías probar a meter bastantes nops en el alleycat (y modificando la dirección de escritura). Si se soluciona es que es eso.
ERROR:NgdBuild:455 - logical net 'yombo' has multiple driver(s):
ERROR:NgdBuild:924 - input pad net 'yombo' is driving non-buffer primitives:

Avatar de Usuario
spark2k06
PLA
Mensajes: 49
Registrado: 17 Ago 2018, 18:43

Re: Core Next186 PC-XT con CGA

Mensaje por spark2k06 » 01 Dic 2021, 16:35

yombo escribió:
30 Nov 2021, 07:36
Se me ocurre que para descartar que el motivo sea el fetch (la cpu obtiene la última instrucción antes de que se ejecute la escritura), podrías probar a meter bastantes nops en el alleycat (y modificando la dirección de escritura). Si se soluciona es que es eso.
Buena observación. Efectivamente el problema finalmente se encontraba en la cache de instrucciones, que es de 16 bytes. Basta con introducir unos cuantos NOPs para identificar el problema. Tras varias pruebas, finalmente he llevado a cabo un fix en el módulo Next186_CPU. El módulo de gestión dispone de una señal de FLUSH que se envía desde el que comento, cuando es necesario para determinadas instrucciones.

Pues bien, he añadido el envío de la señal de FLUSH en instrucciones de MOVs que acceden a memoria:

https://github.com/spark2k06/next186lit ... e4fd00f645

Con este cambio funciona correctamente AlleyCat (version de 61Kb), pero aún sigue dando error de descompresión el juego de MadMix. Pensé que también lo resolvería, porque todo parecía indicar que sucedía algo similar durante el arranque, pero no es así. De momento para que funcione, es necesario arrancarlo con el debugger de MSDos y lanzar su ejecución con el comando g.

Ya lo resolveremos, el usuario pgimeno del foro de misterfpga y el usuario ackerman del foro de retrowiki me han puesto sobre la pista sobre este tipo de ficheros, por lo visto se trata de ficheros empaquetados con EXEPACK.
Última edición por spark2k06 el 04 Dic 2021, 05:40, editado 1 vez en total.

Avatar de Usuario
spark2k06
PLA
Mensajes: 49
Registrado: 17 Ago 2018, 18:43

Re: Core Next186 PC-XT con CGA

Mensaje por spark2k06 » 02 Dic 2021, 07:18

Revisado el post que publicó ackerman en retrowiki, la clave por la que no está funcionando los juegos empaquetados con EXEPACK, es debido a la línea A20. En un PCXT real, esta línea no existe. y de hecho, en la versión de 512KB de SRAM no tenemos este problema. También se ha percatado de ello el usuario pgimeno del foro misterfpga, nuevamente, gracias a los dos.

Con el problema identificado, ya llevaré a cabo un fix en la versión de 2MB para que sólo sean direccionables 1MB y así de paso nos aproximamos un poco más a un PCXT real, podríamos llevar a cabo otra solución para mantener el MB accesible, como con las BIOS de AT que permiten cerrar A20, pero me gustaría hacer de este core lo más similar a un PCXT. Ese Megabyte restante quien sabe, igual podemos plantearnos utilizarlo como memoria EMS :)

Avatar de Usuario
spark2k06
PLA
Mensajes: 49
Registrado: 17 Ago 2018, 18:43

Re: Core Next186 PC-XT con CGA

Mensaje por spark2k06 » 04 Dic 2021, 11:20

ZXUno PCXT CGA (Beta 0.1)
  • Primera versión Beta.
  • Versión de 2MB de SRAM con direccionamiento de 1MB.
Modificaciones en GitHub:

https://github.com/spark2k06/next186lit ... 82597b5ac6

phpBB [media]


TODO
  • Depuración de software y juegos para la mejora continua de la BIOS y el core.
  • Soporte de memoria EMS para el megabyte disponible en la version de 2MB.
  • Eliminación completa de la cache utilizada por el Next186.
  • Eliminación de restos de acceso al soporte antiguo de VGA del Next186.
  • Si cabe, integración del modulo JTOPL2 de @jotego para dar soporte a Adlib cuando esté disponible.
  • Integración del módulo de video compuesto del proyecto Graphics Gremlin de @schlae.
  • Revisar por qué la señal de VGA generada por el módulo de la Graphics Gremlin no funciona en algunos monitores. Ejemplo: FLATRON M1917A
  • Mejora y corrección continua de otros fallos.

Avatar de Usuario
spark2k06
PLA
Mensajes: 49
Registrado: 17 Ago 2018, 18:43

Re: Core Next186 PC-XT con CGA

Mensaje por spark2k06 » 08 Dic 2021, 13:03

Se han eliminado todos los restos de acceso al soporte antiguo de VGA del Next186, pero aparte de las mejoras pendientes, uno de los puntos importantes es la corrección de fallos. Ya tengo identificados unos cuantos juegos que no son jugables, porque o bien no funcionan o si lo hacen no van bien, se cuelgan, etc...:
  • Army Moves: Glitches gráficos
  • Capitan Trueno: Se cuelga durante la redefinición de teclas
  • Paku Paku: No se muestra correctamente el modo 160x100, se duplican las filas
  • Tapper: Arranca pero no llega a comenzar el juego, se cuelga.
  • Fernando Martin: Funciona pero no se muestra correctamente la fuente de caracteres
Aparte tenemos el pequeño problema de la primera línea fantasma en el modo texto, que aún no he encontrado el motivo.

Luego hay muchos otros juegos que sí funcionan, pero antes de continuar con la solución de estos fallos, me gustaría descartar que sean bugs del sintetizador ISE de Xilinx, bugs que son realmente difíciles de detectar, como el siguiente que con un efecto claro en la representación de los fuentes y he tenido que solucionar:

viewtopic.php?f=32&t=432

Para descartarlo, voy a esperar a que este core sea portado por alguien a otra FPGA, y ver si allí también suceden. Mientras tanto, seguiré añadiendo funcionalidad como puede ser el uso de memoria expandida para el MByte restante de la versión de 2Mb, o cuando esté disponible el módulo de @jotego jtopl2, pues soporte Adlib.

Avatar de Usuario
spark2k06
PLA
Mensajes: 49
Registrado: 17 Ago 2018, 18:43

Re: Core Next186 PC-XT con CGA

Mensaje por spark2k06 » 20 Dic 2021, 07:59

Pronto EMS disponible para la versión de 2Mb de SRAM del ZXUno y ZXUnCore, gracias al administrador LTEMM de Lo-Tech, modificado para soportar 1Mb de memoria con 64 páginas. También tendremos mucha memoria convencional disponible haciendo uso de memoria alta :D


Imagen
Última edición por spark2k06 el 27 Dic 2021, 12:08, editado 1 vez en total.

Responder

Volver a “Cores”