DivUSB, un interfaz USB para el Spectrum

Cursos, reparaciones, fichas, tutoriales, etc.

Moderador: Fundadores

Responder
Avatar de Usuario
Kyp !Sinclair 1
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 3377
Registrado: 30 Sep 2013, 14:54
Ubicación: Madrid
Has thanked: 28 times
Been thanked: 146 times

DivUSB, un interfaz USB para el Spectrum

Mensaje por Kyp »

Bueno. Al final me he picado y voy a intentar construir un interface USB basado en el chip CH376. No se hasta donde llegaré ni cuanto tardaré.

De momento, mientras me llega una placa de desarrollo voy a ir preparando el software.

Mi intención es hacer algo similar al DivIDE con esxDOS, es decir, extender los comandos de la ROM interceptando comandos que empiezan con punto. Para no reinventar la rueda, me voy a basar en el hardware del DivIDE y para poder probarlo, voy a usar el emulador ZX-Spin que emula dicho hardware.

Primer paso: Preparando la ROM alternativa

Para empezar, voy a preparar una ROM que permita arrancar el Spectrum con el DivUSB conectado, de forma que cuando se activa el mapeado automático del HW se restaura la ROM original.

El procedimiento es el siguiente. El HW detecta cuando se ejecuta una instrucción en seis direcciones de la ROM: 0000h (reset), 0008h (error), 0038h (int), 0066h (nmi), 04c6h (save) y 0562h (load). Esa instrucción se ejecuta normalmente pero la siguiente, en vez de leerse en la ROM original, se lee en la ROM alternativa. Para volver a la ROM original hay que ejecutar alguna instrucción en las direcciones $1ff8 a $1fff.

Este es el código de la ROM alternativa:

Código: Seleccionar todo

	org	$0000		; $00 : reset
	;
	di				; la misma instrucción que en la ROM original, la siguiente instrucción es la que se ejecuta realmente
	ld	hl,$0001		; se continuará la ejecución a partir de la dirección $0001
	jp	$1ff9			; restauramos la ROM original

	org	$0008		; $08 : error
	;
	ld	hl,(0x5c5d)	; la misma instrucción que en la ROM original, la siguiente instrucción es la que se ejecuta realmente
	push	hl			; guardamos HL en el stack
	ld	hl,$000b		; se continuará la ejecución a partir de la dirección $000b
	ex	(sp),hl		; intercambiamos el contenido del stack por HL (restauramos HL a su valor original y metemos en el stack la dirección de salto)
	jp	$1ff8			; restauramos la ROM original

	org	$0038		; $38 : int
	;
	push	af			; la misma instrucción que en la ROM original, la siguiente instrucción es la que se ejecuta realmente
	push	hl			; igual que $08 pero saltamos a $0039
	ld	hl,$0039
	ex	(sp),hl
	jp	$1ff8

	org	$0066		; $66 : nmi
	;
	push	af			; la misma instrucción que en la ROM original, la siguiente instrucción es la que se ejecuta realmente
	push	hl			; igual que $08 pero saltamos a $0071
	ld	hl,$0071
	ex	(sp),hl
	jp	$1ff8

	org	$1ff8			; retorno a la ROM original
	;
	ret				; $1ff8 : salimos volviendo a la dirección guardada en el stack
	jp	(hl)			; $1ff9 : salimos saltando a la dirección indicada por HL
	nop
	nop
	nop
	nop
	nop
	nop
Se usan dos métodos para continuar la ejecución en la ROM original:
- El método más sencillo es salir saltando a $1ff9. Previamente habremos guardado en HL la dirección por la que continuará la ejecución.
- Si necesitamos preservar el valor de HL salimos por $1ff8. Previamente tenemos que haber guardado en el stack la dirección por la que continuará el programa.

Ensamblamos con: PASMO --bin usb.s usb.bin

Y para probar configuramos en zx-Spin:
- En Hardware/Peripherals marcamos 'DivIDE'.
- En Hardware/ROM Images seleccionamos usb.bin como DivIDE firmware.

Arrancamos y vemos que no hace nada de especial. Para comprobar que funciona simulamos una NMI (F5) y veremos que no pasa nada :|
Con la ROM original se resetearía el Spectrum y con la ROM del FATware o del esxDOS saldría la pantalla de detección de discos al arrancar y, si tenemos algún disco, la de selección de archivos al activar la NMI.

En el próximo capítulo intentaré que salga algo en pantalla para que no se a tan soso.

Continuara...
Avatar de Usuario
wilco2009 !Sinclair 1
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 8152
Registrado: 01 Abr 2013, 23:47
Ubicación: Valencia
Has thanked: 47 times
Been thanked: 101 times

Re: DivUSB, un interfaz USB para el Spectrum

Mensaje por wilco2009 »

Esto promete! :)
"Aprender a volar es todo un arte. Aunque sólo hay que cogerle el truco. Consiste en tirarse al suelo y fallar".

Douglas Adams. Guía del autoestopista galáctico.
Avatar de Usuario
Ben-kenobi
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 3543
Registrado: 12 Nov 2013, 10:00
Has thanked: 1 time
Been thanked: 18 times

Re: DivUSB, un interfaz USB para el Spectrum

Mensaje por Ben-kenobi »

Muy interesanre! Lo seguire de cerca y si necesitas testeadores aqui estoy .
Quieres vinilos para makear tu spectrum? Mira Aqui
Avatar de Usuario
GroovyDrifter
Seguidor infernal
Seguidor infernal
Mensajes: 38
Registrado: 02 Oct 2014, 17:29
Ubicación: Mañolandia

Re: DivUSB, un interfaz USB para el Spectrum

Mensaje por GroovyDrifter »

Molaaaaaa

¿Podrias subir los datasheet del CH376? uno creo que lo tengo pero el mas interesante solo lo encuentro en chino...
ImagenDave... this conversation can serve no purpose anymore... Goodbye.
Avatar de Usuario
flopping
Fundador
Fundador
Mensajes: 9971
Registrado: 29 Mar 2013, 15:26
Ubicación: Valencia
Been thanked: 122 times
Contactar:

Re: DivUSB, un interfaz USB para el Spectrum

Mensaje por flopping »

Mola mucho, por cierto ademas del exdos, puedes usar el residos, que ya tiene soporte para USB, jejejejeje...
No me hago responsable de mis post pues estan escritos bajo la influencia del alcohol y drogas psicotropicas, por la esquizofrenia paranoide.
(C) 1982-2024, 42 años de ZX Spectrum.
http://www.va-de-retro.com/ un foro "diferente".

Mi juego, que puedes descargar desde aqui
Avatar de Usuario
Scooter !!Va-de-Retro
Demonio tercer orden
Demonio tercer orden
Mensajes: 966
Registrado: 27 Feb 2014, 11:33
Ubicación: Alicates
Has thanked: 1 time
Been thanked: 12 times

Re: DivUSB, un interfaz USB para el Spectrum

Mensaje por Scooter »

Luego subo el datasheet.

Enviado desde mi fnac 5.7 mediante Tapatalk
Solo se que no se nada (algunos no saben eso)
Avatar de Usuario
Mikes España - Com. Valenciana
Moderador
Moderador
Mensajes: 3388
Registrado: 08 Nov 2013, 14:15
Ubicación: Benaguasil (València)
Has thanked: 2 times
Been thanked: 140 times

Re: DivUSB, un interfaz USB para el Spectrum

Mensaje por Mikes »

Ánimo
"Mikes solo hay uno"
Mi 'Paraeta'
Avatar de Usuario
Querubin
Demonio tercer orden
Demonio tercer orden
Mensajes: 635
Registrado: 15 Ene 2016, 00:01
Ubicación: Totana

Re: DivUSB, un interfaz USB para el Spectrum

Mensaje por Querubin »

Estupenda iniciativa.

A ver si alguien se animara a lo mismo para Amstrad CPC.
poco a poco
Avatar de Usuario
primy
Demonio segundo orden
Demonio segundo orden
Mensajes: 1281
Registrado: 03 Nov 2014, 11:41
Has thanked: 16 times
Been thanked: 6 times
Contactar:

Re: DivUSB, un interfaz USB para el Spectrum

Mensaje por primy »

Kyp ya sabes que lo que necesites, tanto para hacer pruebas como para lo que den mis conocimientos.
Visita nuestra web y descarga nuestra revista gratis

http://www.yoteniaunjuego.com/
Avatar de Usuario
Kyp !Sinclair 1
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 3377
Registrado: 30 Sep 2013, 14:54
Ubicación: Madrid
Has thanked: 28 times
Been thanked: 146 times

Re: DivUSB, un interfaz USB para el Spectrum

Mensaje por Kyp »

Parte dos: un poco de infraestructura

Lo bueno y lo malo de sustituir la ROM original por una alternativa es que tenemos un ordenador completamente vacío, cualquier cosa que quera hacer tengo que hacerla por mi cuenta, por ejemplo, borrar la pantalla, escribir texto, ni siquiera hay un tipo de letra con el que escribir. Todo hay que hacerlo de cero.

Pues nada, me he puesto manos a la obra y ya tengo una rutina para borrar la pantalla y otra para escribir textos.

No creo que merezca la pena ir poniendo trozos de código difícil de seguir sin un contexto y que abultan un montón así que si a alguien le interesa que me pregunte.

De momento, un pantallazo:
Imagen

Adjunto la ROM por si alguien quiere probarla en un emulador o incluso grabarla en la flash del DivIDE y probarla en hardware real.
No es que haga gran cosa, pero mola ver que funciona :D :D :D
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
Responder

Volver a “Cursos y Tutoriales”