BUG en lectura de cintas (ZX-SPIN)

Emuladores y aplicaciones que ayudarán a la perpetuación del Spectrum y su software en el futuro

Moderador: Sir Cilve Sinclair

Responder
Z80user
Manic Miner
Mensajes: 215
Registrado: Vie Jun 08, 2007 9:42 am
Ubicación: En un lugar de la mancha
Contactar:

BUG en lectura de cintas (ZX-SPIN)

Mensaje por Z80user » Lun Mar 19, 2012 10:27 pm

Al intentar probar la rutina de carga, en algunos emuladores me da problemas por la velocidad, asi que para coger el toro por los cuernos, he realizado una rutina para leer lo que lee y mostrarlo por pantalla, de la forma mas rapida posible.

http://www.worldofspectrum.org/forums/s ... post611306 - - - post #6

Código: Seleccionar todo

org $8000
   ld hl, $e000       ; 8000 21 00 e0 $0ats
   ld b, $00       ; 8003 06 00 $07ts
   di          ; 8005 f3 $04ts
l_8006: in a, ($fe)       ; 8008 db fe $0bts
   add a, $40       ; 800a c6 40 $07ts
   rr c          ; 800c cb 19 $08ts
   in a, ($fe)       ; 8010 db fe $0bts
   add a, $40       ; 8012 c6 40 $07ts
   rr c          ; 8014 cb 19 $08ts
   in a, ($fe)       ; 8018 db fe $0bts
   add a, $40       ; 801a c6 40 $07ts
   rr c          ; 801c cb 19 $08ts
   in a, ($fe)       ; 8020 db fe $0bts
   add a, $40       ; 8022 c6 40 $07ts
   rr c          ; 8024 cb 19 $08ts
   in a, ($fe)       ; 8028 db fe $0bts
   add a, $40       ; 802a c6 40 $07ts
   rr c          ; 802c cb 19 $08ts
   in a, ($fe)       ; 8030 db fe $0bts
   add a, $40       ; 8032 c6 40 $07ts
   rr c          ; 8034 cb 19 $08ts
   in a, ($fe)       ; 8038 db fe $0bts
   add a, $40       ; 803a c6 40 $07ts
   rr c          ; 803c cb 19 $08ts
   in a, ($fe)       ; 8040 db fe $0bts
   add a, $40       ; 8042 c6 40 $07ts
   rr c          ; 8044 cb 19 $08ts
   ld (hl), c       ; 8046 71 $07ts
   ld l, b          ; 8047 68 $04ts
   djnz l_8006       ; 8048 10 bc $08/$0dts
   inc h          ; 804a 24 $04ts
   jr nz, l_8006       ; 804b 20 b9 $07/$0cts
   ei          ; 804d fb $04ts
   ld hl, $e000       ; 804e 21 00 e0 $0ats
   ld de, $4000       ; 8051 11 00 40 $0ats
l_8054: ld c, $08       ; 8054 0e 08 $07ts
l_8056: push de          ; 8056 d5 $0bts
   ld b, $13       ; 8057 06 1d $07ts
l_8059: ld a, (hl)       ; 8059 7e $07ts
   ld (de), a       ; 805a 12 $07ts
   inc hl          ; 805b 23 $06ts
   inc de          ; 805c 13 $06ts
   djnz l_8059       ; 805d 10 fa $08/$0dts
   pop de          ; 805f d1 $0ats
   inc d          ; 8060 14 $04ts
   dec c          ; 8061 0d $04ts
   jr nz, l_8056       ; 8062 20 f2 $07/$0cts
   ld a, d          ; 8064 7a $04ts
   sub $08          ; 8065 d6 08 $07ts
   ld d, a          ; 8067 57 $04ts
   ld a, e          ; 8068 7b $04ts
   add a, $20       ; 8069 c6 20 $07ts
   ld e, a          ; 806b 5f $04ts
   jr nz, l_8054       ; 806c 20 e6 $07/$0cts
   ld a, d          ; 806e 7a $04ts
   add a, $08       ; 806f c6 08 $07ts
   ld d, a          ; 8071 57 $04ts
   cp $58          ; 8072 fe 58 $07ts
   jr nz, l_8054       ; 8074 20 de $07/$0cts
   ret          ; 8076 c9 $0ats

En la direccion #8057 se puede cambiar el valor de LD B,$13 para ver mas columnas

Si antes de los IN A,($FE) se introduce un LD A,$FE a modo de retardo, cambiar el valor de B a $1D, para poder observar el tono guia de la ROM del Spectrum

La velocidad, es mas rapida que la que utilizo en la rutina mia de carga, no desenrollo el bucle de lectura cosa que aqui si hago.

Curiosamente con el emulador ZXSPIN 0.666 (la version que uso para editar sobre la marcha) al reproducir una cinta de audio con esta rutina, aparecen errores de lectura, (relentizan la cinta unos cuantos T-States en determinados momentos, en los que ademas, invierte la señal)

NOTA: Rutina creada, para poder observar lo que puede leer el Spectrum, y poder hacer investigaciones acerca de la velocidad de muestreo. y para demostrar que mi rutina de carga es factible.
Si vas a tirar Hardware, primero pregunta si alguien lo puede recuperar.
No abandones un ordenador en un vertedero, donalo a alguien.

Z80user
Manic Miner
Mensajes: 215
Registrado: Vie Jun 08, 2007 9:42 am
Ubicación: En un lugar de la mancha
Contactar:

Re: BUG en lectura de cintas TZX

Mensaje por Z80user » Lun Mar 26, 2012 9:20 pm

Posteriormente hize otra rutina, que hace lo mismo que esta (mostrar la señal), pero pintando cada onda en la parte izquierda de la pantalla, de forma alineada.
Se notaba la misma distorsion, es decir, la frecuencia de los pulsos variaba de unos a otros de forma constante.

He cronometrado con el ZX-SPIN el tiempo en el que la ROM original, invierte la señal, siendo esta constante a 2168 T-States durante 255 pulsos y luego tiene 1 de 2173 T-States
Posteriormente el pulso SYNC es invertido a 667 T-States y a 735 T-States.

0-. 855/855 - 857/855 - 855/857 - 855/859
1-. 1710/1713 - 1712/1710 - 1714/1712

Es decir, variar varia, pero no mas alla, de unos pocos T-States.
Al contar el numero muestras que se toman para ambos numeros y que la diferencia, es de aproximadamente 8 muestras.
El registro E contiene el valor #40, las instrucciones marcadas con * se repiten 8 veces
*IN A,[#FE]
*ADD A,E
*RL D
LD [HL],D
T-States = 11+4+8=23
T-States para 8 muestras 184 aproximadamente

Esto quiere decir que el muestrear desde un TZX, genera un error maximo de 184 T-States.

Lo que deberia durar 4341 T-States, puede durar 184 T-States menos o 184 T-States mas. un 4.24% de error.

Como aparecia aproximadamente cada 8 lineas, perdia 1 de cada 2 pulsos, quiere decir, que aproximadamente cada 16 * 4341 = 66288 T-States, la frecuencia, cambiaba.

En resumen, en los frames pares, hay una frecuencia para el "pure tone" y en los frames impares hay otra frecuencia completamente distinta distinta.

Código: Seleccionar todo

   di          ; 8000 f3 $04ts
l_8001: ld hl, $5800       ; 8001 21 00 58 $0ats
   ld b, $03       ; 8004 06 03 $07ts
l_8006: ld a, l          ; 8006 7d $04ts
   add a, a       ; 8007 87 $04ts
   add a, a       ; 8008 87 $04ts
   add a, a       ; 8009 87 $04ts
   and $18          ; 800a e6 18 $07ts
   or $20          ; 800c f6 20 $07ts
   ld (hl), a       ; 800e 77 $07ts
   inc l          ; 800f 2c $04ts
   jr nz, l_8006       ; 8010 20 f4 $07/$0cts
   inc h          ; 8012 24 $04ts
   djnz l_8006       ; 8013 10 f1 $08/$0dts
   ld hl, $4000       ; 8015 21 00 40 $0ats
l_8018: in a, ($fe)       ; 8018 db fe $0bts
   add a, $40       ; 801a c6 40 $07ts
   jr nc, l_8018       ; 801c 30 fa $07/$0cts
l_801e: in a, ($fe)       ; 801e db fe $0bts
   add a, $40       ; 8020 c6 40 $07ts
   jr c, l_801e       ; 8022 38 fa $0c/$07ts
   push hl          ; 8024 e5 $0bts
   ld b, $20       ; 8025 06 20 $07ts
l_8027: in a, ($fe)       ; 8027 db fe $0bts
   add a, $40       ; 8029 c6 40 $07ts
   rl c          ; 802b cb 11 $08ts
   in a, ($fe)       ; 802d db fe $0bts
   add a, $40       ; 802f c6 40 $07ts
   rl c          ; 8031 cb 11 $08ts
   in a, ($fe)       ; 8033 db fe $0bts
   add a, $40       ; 8035 c6 40 $07ts
   rl c          ; 8037 cb 11 $08ts
   in a, ($fe)       ; 8039 db fe $0bts
   add a, $40       ; 803b c6 40 $07ts
   rl c          ; 803d cb 11 $08ts
   in a, ($fe)       ; 803f db fe $0bts
   add a, $40       ; 8041 c6 40 $07ts
   rl c          ; 8043 cb 11 $08ts
   in a, ($fe)       ; 8045 db fe $0bts
   add a, $40       ; 8047 c6 40 $07ts
   rl c          ; 8049 cb 11 $08ts
   in a, ($fe)       ; 804b db fe $0bts
   add a, $40       ; 804d c6 40 $07ts
   rl c          ; 804f cb 11 $08ts
   in a, ($fe)       ; 8051 db fe $0bts
   add a, $40       ; 8053 c6 40 $07ts
   rl c          ; 8055 cb 11 $08ts
   ld (hl), c       ; 8057 71 $07ts
   inc l          ; 8058 2c $04ts
   ld a, c          ; 8059 79 $04ts
   cp $00          ; 805a fe 00 $07ts
   jr nz, l_8062       ; 805c 20 04 $07/$0cts
   djnz l_8027       ; 805e 10 c7 $08/$0dts
   jr l_8001       ; 8060 18 9f $0cts
l_8062: dec b          ; 8062 05 $04ts
l_8063: in a, ($fe)       ; 8063 db fe $0bts
   add a, $40       ; 8065 c6 40 $07ts
   rl c          ; 8067 cb 11 $08ts
   in a, ($fe)       ; 8069 db fe $0bts
   add a, $40       ; 806b c6 40 $07ts
   rl c          ; 806d cb 11 $08ts
   in a, ($fe)       ; 806f db fe $0bts
   add a, $40       ; 8071 c6 40 $07ts
   rl c          ; 8073 cb 11 $08ts
   in a, ($fe)       ; 8075 db fe $0bts
   add a, $40       ; 8077 c6 40 $07ts
   rl c          ; 8079 cb 11 $08ts
   in a, ($fe)       ; 807b db fe $0bts
   add a, $40       ; 807d c6 40 $07ts
   rl c          ; 807f cb 11 $08ts
   in a, ($fe)       ; 8081 db fe $0bts
   add a, $40       ; 8083 c6 40 $07ts
   rl c          ; 8085 cb 11 $08ts
   in a, ($fe)       ; 8087 db fe $0bts
   add a, $40       ; 8089 c6 40 $07ts
   rl c          ; 808b cb 11 $08ts
   in a, ($fe)       ; 808d db fe $0bts
   add a, $40       ; 808f c6 40 $07ts
   rl c          ; 8091 cb 11 $08ts
   ld (hl), c       ; 8093 71 $07ts
   inc l          ; 8094 2c $04ts
   ld a, c          ; 8095 79 $04ts
   cp $ff          ; 8096 fe ff $07ts
   jr nz, l_809e       ; 8098 20 04 $07/$0cts
   djnz l_8063       ; 809a 10 c7 $08/$0dts
   jr l_80a3       ; 809c 18 05 $0cts
l_809e: xor a          ; 809e af $04ts
l_809f: ld (hl), a       ; 809f 77 $07ts
   inc l          ; 80a0 2c $04ts
   djnz l_809f       ; 80a1 10 fc $08/$0dts
l_80a3: pop hl          ; 80a3 e1 $0ats
   inc h          ; 80a4 24 $04ts
   ld a, h          ; 80a5 7c $04ts
   and $07          ; 80a6 e6 07 $07ts
   jp nz, l_8018       ; 80a8 c2 18 80 $0a/$0ats
   ld a, h          ; 80ab 7c $04ts
   sub $08          ; 80ac d6 08 $07ts
   ld h, a          ; 80ae 67 $04ts
   ld a, l          ; 80af 7d $04ts
   add a, $20       ; 80b0 c6 20 $07ts
   ld l, a          ; 80b2 6f $04ts
   jp nc, l_8018       ; 80b3 d2 18 80 $0a/$0ats
   ld a, h          ; 80b6 7c $04ts
   add a, $08       ; 80b7 c6 08 $07ts
   ld h, a          ; 80b9 67 $04ts
   cp $58          ; 80ba fe 58 $07ts
   jp nz, l_8018       ; 80bc c2 18 80 $0a/$0ats
   ld hl, $4000       ; 80bf 21 00 40 $0ats
   jp l_8018       ; 80c2 c3 18 80 $0ats
   ld de, $fedb       ; 80c5 11 db fe $0ats
   add a, $40       ; 80c8 c6 40 $07ts
   rl c          ; 80ca cb 11 $08ts
   in a, ($fe)       ; 80cc db fe $0bts
   add a, $40       ; 80ce c6 40 $07ts
   rl c          ; 80d0 cb 11 $08ts
   in a, ($fe)       ; 80d2 db fe $0bts
   add a, $40       ; 80d4 c6 40 $07ts
   rl c          ; 80d6 cb 11 $08ts
   in a, ($fe)       ; 80d8 db fe $0bts
   add a, $40       ; 80da c6 40 $07ts
   rl c          ; 80dc cb 11 $08ts
   ld (hl), c       ; 80de 71 $07ts
   inc l          ; 80df 2c $04ts
   ld a, c          ; 80e0 79 $04ts
   ret          ; 80e1 c9 $0ats
   ldir          ; 80e2 ed b0 $10/$15ts
   ld a, h          ; 80e4 7c $04ts
   inc a          ; 80e5 3c $04ts
   and $0f          ; 80e6 e6 0f $07ts
   ld hl, $e000       ; 80e8 21 00 e0 $0ats
   ld b, $00       ; 80eb 06 00 $07ts
   di          ; 80ed f3 $04ts
l_80ee: in a, ($fe)       ; 80ee db fe $0bts
   add a, $40       ; 80f0 c6 40 $07ts
   rr c          ; 80f2 cb 19 $08ts
   ld (hl), c       ; 80f4 71 $07ts
   ld l, b          ; 80f5 68 $04ts
   djnz l_80ee       ; 80f6 10 f6 $08/$0dts
   inc h          ; 80f8 24 $04ts
   jr nz, l_80ee       ; 80f9 20 f3 $07/$0cts
   ei          ; 80fb fb $04ts
   ld hl, $e000       ; 80fc 21 00 e0 $0ats
   ld de, $4000       ; 80ff 11 00 40 $0ats
l_8102: ld c, $08       ; 8102 0e 08 $07ts
l_8104: push de          ; 8104 d5 $0bts
   ld b, $13       ; 8105 06 13 $07ts
l_8107: ld a, (hl)       ; 8107 7e $07ts
   ld (de), a       ; 8108 12 $07ts
   inc hl          ; 8109 23 $06ts
   inc de          ; 810a 13 $06ts
   djnz l_8107       ; 810b 10 fa $08/$0dts
   pop de          ; 810d d1 $0ats
   inc d          ; 810e 14 $04ts
   dec c          ; 810f 0d $04ts
   jr nz, l_8104       ; 8110 20 f2 $07/$0cts
   ld a, d          ; 8112 7a $04ts
   sub $08          ; 8113 d6 08 $07ts
   ld d, a          ; 8115 57 $04ts
   ld a, e          ; 8116 7b $04ts
   add a, $20       ; 8117 c6 20 $07ts
   ld e, a          ; 8119 5f $04ts
   jr nz, l_8102       ; 811a 20 e6 $07/$0cts
   ld a, d          ; 811c 7a $04ts
   add a, $08       ; 811d c6 08 $07ts
   ld d, a          ; 811f 57 $04ts
   cp $58          ; 8120 fe 58 $07ts
   jr nz, l_8102       ; 8122 20 de $07/$0cts
   ret          ; 8124 c9 $0at

Compilarlo y hacer un RANDOMIZE USR 32768.

Mini-instrucciones:
La rutina detecta un pulso, y muestra el siguiente. Lo que se ve es una onda completa, al verse el fondo, la señal esta a nivel bajo y cuando se ven pixels negros, esta a nivel alto.
Tiene una forma rudimentaria de detectar los cambios de nivel, pero funciona a velocidades bajas como las de los cargadores turbo.
P.D. hay codigo de mas en la anterior rutina.

P.D. noto que falta la posibilidad de subir ficheros en el foro.
Si vas a tirar Hardware, primero pregunta si alguien lo puede recuperar.
No abandones un ordenador en un vertedero, donalo a alguien.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 24 invitados