A 115.200bps, los tiempos de instrucción en el spectrum van muy muy ajustados, ya que un baudio son unos 30,5 t-states, es decir, entre 7 y 8 instrucciones NOP del Spectrum.
Para darle más emoción al tema tenemos que jugar con tres variables
- 1) El Spectrum 48k y el spectrum 128k tienen velocidades distintas y si en el primero un baudio son 30,8 t-states. en el segundo son 30,4
- 2) Algunos driver USB-TTL no soportan 2 stop bits, algo standard y totalmente necesario a estas velocidades. Afortunadamente, los CH340G (los baratos) sí.
- 3) Los chips USB-serial admiten márgenes de error astronómicos para este propósito, del +- 3%, lo que vienen a ser unos 3 t-states por bit, o unos 33 por byte, es decir, un bit entero
Durante estos días me han estado dando ideas tanto Habi, como JGN (4Mhz), overCLK y mad3001 y he podido introducir mejoras en el código.
Al final, ajustar el código y probarlo en hw real era muy lento para los ajustes finos y cambios de temperatura que había que hacer, así que he programado un mini-emulador de spectrum (muy limitado) y emulador de puerto serie de tal forma que puedo probar los distintos casos. El emulador toma código compilado Z80 y lo ejecuta. Con una granularidad de cuarto de ciclo de reloj, esto es unos 70 nanosegundos, el puerto serie va cambiando de estado y mandando un fichero bit a bit, como lo haría el hw real. El minispectrum lee el puerto y va componiendo los datos, de nuevo tal y como se hace en el hw real.
Gracias al inventillo, y a las sugerencias de los compañeros, creo que tengo un código más o menos funcional, que sacaré como Rom extra para que probéis en vuestros equipos. Por si falla, también estará el loader original a 57600bps
Os dejo una captura del software en marcha