Página 1 de 2

Nuevo core: Apple II

Publicado: 08 Nov 2015, 19:08
por Quest
Recién salido del horno, ya tenemos core para el Apple II :D

Aún le faltan cosillas y el manejo de discos no es el mejor del mundo, pero es funcional y usable. Está basado en el original de Stephen A. Edwards (http://www.cs.columbia.edu/~sedwards/apple2fpga/) y en la adaptación de vlait a las placas Papilio (https://github.com/vlait/papilio-duo/tr ... papilioduo). Como es habitual, remapeo de pines, nuevos relojes, quitados switches, etc, etc.

Ya lo tenéis disponible en el repositorio habitual, en /cores/Apple2_spartan6

El proyecto ISE está por defecto para las placas v3, pero he dejado un UCF para las v2 para el que quiera sintetizarlo por su cuenta en una v2. En la carpeta "build" hay .bit para ambas placas (la de v2 no probada).

Funciones actuales del core:

- Salida VGA solamente por el momento
- Sonido funcional
- Teclado PS/2
- No dispone de soporte de Joystick por el momento
- Carga de imágenes de disco por SD (sistema engorroso, pero funcional, explicado luego)
- Led de actividad de lectura de la SD

Para hacerlo funcionar con discos de Apple II, necesitas:

- Una imagen de disco en formato .nib, si no está en ese formato (suelen estar en .dsk o .do), puedes usar en windows la utilidad dsk2nib.exe disponible en la carpeta "roms" del core para convertirlo. He dejado un par de imágenes preparadas en la carpeta "roms", el DOS 3.3 (apple33.nib) y el juego Spy vs. Spy (SpyVsSpy.nib).
- Una tarjeta SD que no vayas a usar para ninguna otra cosa (importante).
- Una utilidad de volcado RAW de archivos a disco, como DD de linux o HDD Raw Copy Tool de Windows (http://hddguru.com/software/HDD-Raw-Copy-Tool/)

Procedimiento:

- Antes de nada: el procedimiento destruirá todo lo que tengas en la tarjeta SD. Sólo se puede grabar una única imagen de disco por tarjeta SD.
- Usando el programa preferido (DD, HDD Raw Copy tool o el que quieras), volcar el archivo .nib a la tarjeta SD.

Para que funcione en el ZX-UNO, meter la SD ya preparada, y grabar el .bit
Arrancará directamente del disco.

Fotillos en marcha:
Apple_II_ZXUNO.jpg
AppleII_spy1.jpg
AppleII_spy2.jpg

Re: Nuevo core: Apple II

Publicado: 08 Nov 2015, 20:01
por mcleod_ideafix
¡Dios! ¡¡Esto ya se nos está yendo de las manos!! :O Tíos, ¡que he perdido la cuenta de los cores que llevamos hechos/portados!
Aunque aún faltan algunos sistemas míticos: Dragon, Commodore, Amstrad y MSX. Ya caerán... ;)

Re: Nuevo core: Apple II

Publicado: 08 Nov 2015, 20:29
por Radastan
ZX Uno con Amstrad CPC 6128, C64, MSX, ZX Spectrum, y SAM Coupé, todos intercambiables a golpe de teclado... y se acaba el Mundo para mi. Tremendo.

Re: Nuevo core: Apple II

Publicado: 10 Nov 2015, 06:46
por Hark0
Ay.... un CPC 6128... mi otra máquina de juventud.... ;)

Re: Nuevo core: Apple II

Publicado: 20 Nov 2015, 20:18
por gacaffe
Hola,

Acabo de registrarme en el foro. En primer lugar deciros que esto del ZX-Uno me tiene como loco. Un gran trabajo. Ya van dos eventos retros a los que asisto y no os pillo, en el próximo habrá más suerte.

Quería contaros una historia curiosa respecto a la implementación de Steve Edwards. Hace justo un año descargué la versión 1.1. del core, que era la única que había disponible en la página de Edwards, con la idea de probarla en la placa DE2-115. Hice el cambio de pines y el disco emulado mediante SD-card no tiraba. Escribió al señor este, que sorprendentemente me escribió bastante rápido y me comentó que había otra versión con el disco mejorado (la 1.2., en la que contribuyó Michel Stempin) y me la envío. Con la versión 1.2. todo fue rodado. A raíz de esto Steve colgó la versión 1.2. en su web. No sé si es esta la que descargasteis o la de github (que no conocía).

Bueno, solo quería contaros mi historia al respecto y resaltar lo majo que es este hombre.

También tengo una pregunta respecto al joystick (gamepad). El joystick del Apple II es analógico, ¿cómo se podría gestionar esto con el ZX-Uno? ¿Habéis conectado algún joystick analógico con otro core?

Estoy dándole vueltas a hacer un adaptador analógico/digital basado en PWM para utilizar con joysticks analógicos (gamepad del apple II, joystick del Dragon, etc.). Bueno, si tenéis experiencia o ideas os agradecería algún consejo.

Re: Nuevo core: Apple II

Publicado: 20 Nov 2015, 22:55
por mcleod_ideafix
gacaffe escribió:También tengo una pregunta respecto al joystick (gamepad). El joystick del Apple II es analógico, ¿cómo se podría gestionar esto con el ZX-Uno? ¿Habéis conectado algún joystick analógico con otro core?
Se me ocurren dos formas: o usar un ratón, o pasar directamente del modo analógico y usar un joystick Atari de toda la vida (los únicos que se pueden usar en el ZX-Uno). Esto último es por ejemplo lo que se hace con los adaptadores que permiten usar un joystick Atari a un Dragon, por ejemplo.
gacaffe escribió:Estoy dándole vueltas a hacer un adaptador analógico/digital basado en PWM para utilizar con joysticks analógicos (gamepad del apple II, joystick del Dragon, etc.). Bueno, si tenéis experiencia o ideas os agradecería algún consejo.
Para implementar un conversor A/D en una FPGA que lo tenga de serie (creo que los Artix 7 de Xilinx ya lo tienen), lo único que se me ocurre es un truco que he visto por algún sitio, que consiste en usar los amplificadores diferenciales de las señales que son diferenciales: en una de las entradas pondrías la señal analógica a convertir, y en el otro pin, una señal que vendría de un DAC hecho dentro de la propia FPGA usando por ejemplo un codificador sigma-delta. El conjunto funcionaría como un conversor A/D por aproximaciones sucesivas. No tengo ni idea de si esto realmente podría funcionar o no.

En el IBM PC, los joysticks analógicos se implementan usando un NE555 que usan como un oscilador de frecuencia variable, en donde la variación viene dada por la posición del potenciómetro interno del joystick. Así, diferentes posiciones del joystick darían diferentes frecuencias, que pueden medirse fácilmente desde la FPGA consiguiendo así un valor proporcional a la posición del joystick.

Re: Nuevo core: Apple II

Publicado: 20 Nov 2015, 23:34
por antoniovillena
mcleod_ideafix escribió: En el IBM PC, los joysticks analógicos se implementan usando un NE555 que usan como un oscilador de frecuencia variable, en donde la variación viene dada por la posición del potenciómetro interno del joystick. Así, diferentes posiciones del joystick darían diferentes frecuencias, que pueden medirse fácilmente desde la FPGA consiguiendo así un valor proporcional a la posición del joystick.
Pues los que yo llegué a programar (los que iban a la tarjeta de sonido) tenían un circuito RC donde la R era el potenciómetro de cada eje. Desde ensamblador tú metías un 1 para cargar el condensador y luego esperabas a que se descargara (el tiempo iba en función de la posición del potenciómetro). En función de ese tiempo calculabas la posición. Antes de jugar había que calibrar los ejes para que la posición intermedia tuviese un valor conocido.

Re: Nuevo core: Apple II

Publicado: 21 Nov 2015, 06:32
por gacaffe
Muchas gracias. Muy interesante.
mcleod_ideafix escribió:
gacaffe escribió:También tengo una pregunta respecto al joystick (gamepad). El joystick del Apple II es analógico, ¿cómo se podría gestionar esto con el ZX-Uno? ¿Habéis conectado algún joystick analógico con otro core?
Se me ocurren dos formas: o usar un ratón, o pasar directamente del modo analógico y usar un joystick Atari de toda la vida (los únicos que se pueden usar en el ZX-Uno). Esto último es por ejemplo lo que se hace con los adaptadores que permiten usar un joystick Atari a un Dragon, por ejemplo.
[/quote]
He encontrado un circuito que adapta un joystick Atari al interfaz analógico del Dragon. Esto me va a venir genial para mi Dragon: http://vrai.net/retro/?p=112
mcleod_ideafix escribió:
gacaffe escribió:Estoy dándole vueltas a hacer un adaptador analógico/digital basado en PWM para utilizar con joysticks analógicos (gamepad del apple II, joystick del Dragon, etc.). Bueno, si tenéis experiencia o ideas os agradecería algún consejo.
Para implementar un conversor A/D en una FPGA que lo tenga de serie (creo que los Artix 7 de Xilinx ya lo tienen), lo único que se me ocurre es un truco que he visto por algún sitio, que consiste en usar los amplificadores diferenciales de las señales que son diferenciales: en una de las entradas pondrías la señal analógica a convertir, y en el otro pin, una señal que vendría de un DAC hecho dentro de la propia FPGA usando por ejemplo un codificador sigma-delta. El conjunto funcionaría como un conversor A/D por aproximaciones sucesivas. No tengo ni idea de si esto realmente podría funcionar o no.

En el IBM PC, los joysticks analógicos se implementan usando un NE555 que usan como un oscilador de frecuencia variable, en donde la variación viene dada por la posición del potenciómetro interno del joystick. Así, diferentes posiciones del joystick darían diferentes frecuencias, que pueden medirse fácilmente desde la FPGA consiguiendo así un valor proporcional a la posición del joystick.
[/quote]

Lo de la Artix, aunque tiene una pinta impresionante, lo descarto porque está ligado a una familia de FPGA concreta. Escarbando en el tema del 555 he encontrado este enlace sobre cómo reconstruir un gamepad de Apple II.

http://quinndunki.com/blondihacks/?p=2225

Por lo visto el Apple II tiene un 555 internamente que varía su frecuencia de oscilación según varía el potenciómetro. Esto está bien, pero emular la parte analógica del 555 para que interactúe con una resistencia externa no creo que sea viable.

Precisamente lo que tenía en mente es lo que comenta Antonio Villena en el siguiente post.

Genial. En cuanto tenga algo funcional os lo cuento.

Creo que no deberíais descartar los mandos analógicos, porque la sensación de juego es muy diferente a una emulación con un mando digital. Pongo como ejemplo el Pong (valga la redundancia :) ).

Bueno, muchas gracias, ya os voy contando.

Gabriel

Re: Nuevo core: Apple II

Publicado: 21 Nov 2015, 06:40
por gacaffe
antoniovillena escribió:
mcleod_ideafix escribió: En el IBM PC, los joysticks analógicos se implementan usando un NE555 que usan como un oscilador de frecuencia variable, en donde la variación viene dada por la posición del potenciómetro interno del joystick. Así, diferentes posiciones del joystick darían diferentes frecuencias, que pueden medirse fácilmente desde la FPGA consiguiendo así un valor proporcional a la posición del joystick.
Pues los que yo llegué a programar (los que iban a la tarjeta de sonido) tenían un circuito RC donde la R era el potenciómetro de cada eje. Desde ensamblador tú metías un 1 para cargar el condensador y luego esperabas a que se descargara (el tiempo iba en función de la posición del potenciómetro). En función de ese tiempo calculabas la posición. Antes de jugar había que calibrar los ejes para que la posición intermedia tuviese un valor conocido.
¡Esa era la idea que tenía en mente, pero me parecía demasiado simple! La calibración no parece muy complicada, máximo, mínimo y valor central (habría que ver si es necesario este último). También se podría calibrar analíticamente teniendo en cuenta la impedancia (compleja) de salida de los pines de la FPGA.

En realidad hay varios frentes abiertos, pero voy cacharreando y os cuento. Se me ocurren los siguientes:
- Usar red RC y utilizar dos pines de la FPGA para sensar el estado del potenciómetro (que sería la R de la red RC)
- Diseñar circuitos de adaptación de mando reales (por otra parte difíciles de conseguir) al interfaz digital de la FPGA

Gracias

Re: Nuevo core: Apple II

Publicado: 21 Nov 2015, 13:43
por mcleod_ideafix
gacaffe escribió:He encontrado un circuito que adapta un joystick Atari al interfaz analógico del Dragon. Esto me va a venir genial para mi Dragon: http://vrai.net/retro/?p=112
Tiene toda la pinta de ser el mismo que diseñé hace ya un tiempo ;) Había uno diseñado (circuito de arriba), pero no podría funcionar con un joystick digital sin modificarlo, así que propuse otra forma de usar el 4066 (circuito de abajo)
http://www.cocopedia.com/wiki/index.php ... ck_Adapter
gacaffe escribió:Creo que no deberíais descartar los mandos analógicos, porque la sensación de juego es muy diferente a una emulación con un mando digital. Pongo como ejemplo el Pong (valga la redundancia :) ).
Miraremos a ver si es posible usando una solución como la de Antonio, pero implementando la medición en hardware. Si no se puede (o no cabe), siempre queda la opción de usar un driving controller como los del Indy 500, que esos sí funcionan perfectamente en el ZX-Uno :)