Mostrando entradas con la etiqueta ZX81. Mostrar todas las entradas
Mostrando entradas con la etiqueta ZX81. Mostrar todas las entradas

jueves, 28 de junio de 2018

Gráficos HIRES en el Sinclair ZX81 - Parte 3

Última entrega de esta serie de videos en los que repaso los diferentes sistemas de "alta resolución" del Sinclair ZX81. En esta tercera parte se revisan los diferentes sistemas de UDG.



domingo, 17 de junio de 2018

Gráficos HIRES en el Sinclair ZX81 - Parte 2

Se publica la Parte 2 en la que se hablan de los gráficos HI-RES propiamente dichos, incluyendo aquellas tarjetas de expansión que permitían tener esto gráficos.


domingo, 3 de junio de 2018

Gráficos HIRES en el Sinclair ZX81 - Parte 1

Comienzo una serie de videos en mi canal de YouTube referentes a los gráficos de "Alta Resolución" o HIRES en el Sinclair ZX81. En la serie, trato de explicar qué son y cuántos tipos hay de algoritmos para generar estos gráficos y caracteres. 

Muestro fotos y ejemplos de los diferentes juegos y demos. Y siempre que sea posible, corriendo en un ZX81 real, es decir, no es emulador. Cuando me vea obligado a ejecutar algún programa en emulador, se informará en el video.

La Parte 1 cubre los "Pseudo HIRES", en donde hay variedad de juegos y demos.



martes, 15 de mayo de 2018

Análisis de la ROM del ZX81

Hacía tiempo que quería dedicar algo de tiempo a analizar el firmware de la ROM del Sinclair ZX81 para ver si podía hacer alguna modificación, por supuesto, siendo consciente de mis limitaciones con el código máquina. ¿Por qué no introducir un mensaje como el copyright del ZX Spectrum?

Existen 3 versiones de la ROM del ZX81:
  • ROM original de Sinclair.
  • "Improved" ROM de Sinclair. Corrige errores de la ROM original.
  • ROM "Shoulders of Giant".
Las diferencias en el firmware entre la ROM original y la "improved" pueden consultarse en esta web.

Un repositorio con todas la ROM del ZX81 y sus clones se puede encontrar en este proyecto de github.

El CHECKSUM del firmware "Improved" es 855106, y presenta varias localizaciones no utilizadas (DEFB $FF). Y además tiene 1 byte de "spare" en la dirección 1DFFh (7679d).

En la rutina "The PRINT A Character Restart" (0010h) hay 1 byte con valor DEFB $FF.

En la rutina "The Collect Next Character Restart" (0020h) hay 3 bytes con el mismo valor $FF.

Y en la rutina "The Error-2 Routine" (0058h), hay 1 byte más con valor $FF.

Esto hace que se disponga de un total de 6 bytes disponibles, aunque en ubicaciones diferentes. Es el máximo disponible, si fuéramos capaces de reordenar todas las rutinas para no tener esos espacios sin usar.

La presentación del cursor en la parte baja de la pantalla es un poco rebuscada en la ROM de Sinclair. Se encuentra en la rutina "Cursor-in", a donde se llega desde la rutina "Initial"

0000   START
                I
                I
03CB   RAM-CHECK
971d        I
                I
03E5   INITIAL
997d        I
                I
14AD   CURSOR-IN
5293d      I
                I
14A6    SET-STK-B
5286d

En esta rutina CURSOR-IN se define el espacio disponible para las entradas de usuario, mediante la instrucción: LD (DF-SZ), +02

Esta instrucción carga el valor +02 en la variable del sistema DF-SZ que establece el número de líneas en la parte baja de la pantalla.

En esa misma rutina se establece el cursor (código 7Fh), seguido de un salto de línea (código 76h):

LD HL,(E-LINE)
LD (HL),+7F
INC HL
LD (HL),+76
....

La variable del sistema E-LINE apunta al espacio de trabajo.

Una vez terminada esta rutina, tiene una rocambolesca manera de regresar a la rutina INITIAL (LOWER), con saltos hacia otras rutinas, sin realizar ninguna operación más. Los valores entre paréntesis son las direcciones donde está la rutina de salto (JP/JR).

CURSOR-IN (L14AD)
|_SET-STB-B (L14A6). Salida mediante RET al CALL 14A6 en la EDIT KEY RUTINE
      |_EDIT KEY RUTINE (L05C4). Tras el CALL, salto JR L059D
            |_ED-EDGE (L059D)
                  |_CURSOR RIGHT (L0589)
                        |_KEYBOARD DECODING (L0523)
                              |_LOWER (L0472)

Esto da una idea de lo poco optimizado que está el firmware de esta ROM.

El firmware "Shoulders of Giant" es una variante de Geoff Wearmouth que mejora algunas rutinas de cálculo mediante el uso de algoritmos diferentes a los utilizados por Sinclair. Tiene un CHECKSUM de 853413 y difiere bastante con respecto a la original de Sinclair en cuanto a la disposición de las diferentes rutinas. 

El objeto de la optimización es generar el espacio necesario para el cambio principal que es el uso del método Newton-Raphson para el cálculo de la raíz cuadrada. Este método se ejecuta hasta 3 veces más rápido que el algoritmo de Sinclair. El nombre de "Shoulders of Giant" proviene de una cita de Sir Isaac Newton, que junto a su alumno Joseph Raphson publicó el artículo con el método. La cita es del año 1675:


"If I have seen further it is by standing on the shoulders of Giants."


Este método fue el seleccionado por Steve Vickers para el firmware de la ROM del Jupiter Ace. Ver página 92 del manual "Forth Programming". Hay que recordar que Steve Vickers escribió el firmware de la ROM del ZX81, además del manual de este ordenador, y posteriormente fundó Jupiter Cantab junto a Richard Altawasser.

Tiene 2 bytes de "spare" ubicados en la dirección L1DFE. Menos que la ROM "Improved". 


En el firmware "Shoulders of Giant" parece imposible poder generar más espacio para tener un mensaje de entrada como el del ZX Spectrum, dado el esfuerzo ya ejecutado para optimizar algunos de sus algoritmos. 

E igualmente, en el firmware "Improved" se requeriría un esfuerzo similar para, manteniendo las rutinas actuales, poder generar los bytes necesarios para ubicar un mensaje de entrada como el del ZX Spectrum, sabiendo que este mensaje ocupa 28 bytes -solo el mensaje-.


Referencias

"The Complete Timex TS1000/Sinclair ZX81 ROM Disassembly" by Dr. Ian Logan & Dr. Frank O´Hara

"Understanding Your ZX81 ROM" by Dr. Ian Logan

sábado, 3 de marzo de 2018

Libro "ZX81 User´s Handbook"

Recientemente he descubierto un libro magnífico sobre el ZX81, que cubre desde conceptos básicos, programación, hardware e incluso una introducción al código máquina.

El libro fue publicado por Newnes Microcomputer Books, y los autores, Trevor J. Terrell y Robert J. Simpson, volvieron a colaborar en un libro con el mismo título pero dedicado al ZX Spectrum.

La primera edición del libro es de 1982. Se desconoce si hubo más ediciones.




No abusa de las típicas secciones para teclear programas, y contiene mucha información del ordenador. Tiene dos capítulos dedicados al hardware, y uno enseñando lo básico sobre el código máquina. Dispone de una trabajado glosario de términos.

La encuadernación también sorprende porque la páginas están cosidas además de pegadas. En casi todos los libros sobre el ZX81 que tengo, siempre hay páginas sueltas. No es el caso de este libro.

Un libro estupendo, sin duda alguna.


domingo, 17 de diciembre de 2017

El ZX81 y los programadores en el siglo XXI

El ZX81 tiene un elenco de programadores más amplio de lo que pudiera creerse para un ordenador que tiene un número relativamente bajo de seguidores si lo comparamos con su hermano mayor, el ZX Spectrum.

Me estoy refiriendo a Bob Smith, Paul Farrow, Jim Bagley y Johan "Dr Beep" Koelman. No quiero olvidarme de la escena nacional a la que dedicaré un capítulo aparte, con programadores como dancresp, Antonio Villena, ........

Todos son bastantes activos tanto en webs como en el foro Sinclair ZX World, que explotan al máximo las características del ZX81, incluyendo el HIRES.

Bob Smith es un programador bastante activo con versiones de juegos tanto para ZX Spectrum como para el ZX81. Bob´s Stuff es la web de Bob Smith.







Entrevista a Bob Smith en "Yo Tenía un Juego"

Entrevista a Bob Smith en "Flickering Myth"

ZX Resource Centre es la web de Paul Farrow en donde se puede descargar programas nuevos para ZX81 (Celebration, Against The Elements) y versiones actualizadas de juegos del ZX80, como Kong y Pacman, pero usando la ROM del ZX81. Su web es muy interesante, con análisis profundos de todos los proyectos que lleva a cabo, tiene gran cantidad de información sobre los programas que desensambla y también sobre sus proyectos de hardware. Una auténtica referencia para usuarios del ZX80 y ZX81.


Jim Bagley es un veterano programador bastante activo en la escena retro, pero más enfocado al ZX Spectrum y la Game Boy. El hecho de ser nombrado aquí es debido a la versión del juego Dragon´s Lair para ZX81. También tiene algún juego programado por él con HIRES (WRX), como ZX81 Racing.




Entrevista a Jim Bagley en "Retro Gamer"

Johan "Dr Beep" Koelman es un programador de las Países Bajos muy activo y prolífico en el foro Sinclair ZX World, y especializado en juegos de 1K WRX HIRES. Recientemente ha publicado en el foro ZX81 Owners Club de Facebook todos sus juegos con motivo de su cumpleaños. Según explica él mismo, aunque era poseedor de un ZX Spectrum desde 1983, siempre tuvo cierta predilección por el ZX81.

En 1997 programó un emulador del ZX81 para el ZX Spectrum, y en 2011 hizo un primer programa para el ZX81, el port del juego Shogun. En ese momento descubrió la rutina WRX de Wilf Rigter, y desde entonces ha programado 40 juegos siguiendo este algoritmo y para 1K.

sábado, 25 de noviembre de 2017

Demos HIRES para ZX81

Si bien no son recientes, he descubierto en este hilo del foro ZX80/ZX81 dos demos de HIRES para el ZX81. Uno de ellos es de Bodo Wenzel y otro del usuario del foro zsolt.

La rutina programada por Bodo Wenzel consigue resoluciones de 320 x 240 píxeles y requiere un ZX81 con al menos 16Kb de RAM.

"Testbild" es una carta de ajuste que además puede moverse en las cuatro direcciones mediante las teclas de cursor. Bodo Wenzel además tiene otros programas demo usando HIRES: 25 aniversario, puzzle2, rezurrection y maxdemo.


Con unos resultados parecidos a los obtenidos en la rutina de Bodo Wenzel y en resolución 320 x 240, el usuario zsolt ha programado "FullHD81" y "FullHDzeddy".




También se pueden desplazar con SHIFT+tecla de cursor, y con SHIFT+9 se obtiene la imagen en video inverso.


sábado, 13 de mayo de 2017

Y otro kit de ZX81 a la venta...

Es difícil de creer, pero otro kit a la venta en eBay, con un precio de 499 GBP + gastos de envío.

En el momento de publicar esta entrada, aún sigue a la venta el kit anterior cuyo anuncio es del mes de Febrero.




sábado, 6 de mayo de 2017

Reemplazo de la ULA del ZX81

A la fecha de publicación de esta entrada, existen tres implementaciones que sustituirían a la ULA original del ZX81. Si bien, hay rumores de que algún usuario del foro Sinclair ZX World está trabajando en una implementación más moderna.

Las tres implementaciones son:

  • Diseño en CPLD de Alwin Henseler (2012). La CPLD utilizada es la Xilinx XC9572 de 84 pines. Más información puede obtenerse en este hilo del foro Sinclair ZX World, así como descargar todo la información que estaba disponible en internet, pero que ahora no lo está.



  • Diseño de Andy Rea (2007), utilizando componentes discretos, muy parecido al clon Harlequin del ZX Spectrum. Se utilizan unos 22 integrados TTL de la serie 74xx. Diseño versión 2 (2011), pero utilizando 2xGAL 20v8, 4xGAL 16v8 y 1x74LS374. Andy Rea ha realizado otras implementaciones en CPLD con más o menos éxito. El usuario SirMorris diseño una ULA mejorada, incluso con varios modos gráficos, en base al diseño de Andy Rea. Esta ULA mejorada estuvo a la venta en 2016 en SellMyRetro. 
Diseño Andy Rea basado en TTL 74xx

Diseño Andy Rea versión 2

Diseño SirMorris en CPLD

  • Diseño de Bodo Wenzel, adaptado por José Leandro (2008), basado en un chip MACH210 (4 x GAL 22V10). Como se puede ver en el articulo del enlace, el autor plantea dificultades al usar este chip dado lo obsoleto del modelo, entre otras cosas.

viernes, 7 de abril de 2017

Carga de programas en el ZX81

La velocidad de reproducción se fijó con referencia al Kansas City Standard (KCS) o Byte Standard, que establece que un casete es similar a un modem conectado a un puerto serie. Los “1” y los “0” son convertidos en tonos usando Audio Frequency-Shift Keying (ADSK). El “0” es representado por cuatro ciclos de 1200 Hz y onda sinusoidal, y el “1” con ocho ciclos de 2400 Hz. Esto da un ratio de 300 baudios (bit/segundo).

Albertus Bredekamp realizó pruebas reales de carga de casete con el ZX81 y obtuvo unas velocidades de 400 baudios en el caso de “0”, y 250 baudios en el caso de “1”. Suponiendo que la carga tuviera un 50% de “0” y el otro 50% de “1”, la tasa media nos daría 307 baudios. Tanto a los “0” como a los “1” les siguen un período de silencio de 1300 micro-segundos. Cada “0” está formado por cuatro pulsos, y cada pulso de “1” por nueve pulsos.

Por lo tanto, podemos considerar que la velocidad de carga media de un ZX81 es de 300 bit/s frente a los 1500 bit/s del ZX Spectrum.

La pérdida de la señal de sintonización con el TV se produce durante las operaciones de carga (LOAD) y grabación (SAVE) de software utilizando un reproductor externo conectado a las correspondientes tomas del ordenador. Esto es debido a que la señal de TV y la conexión con la toma TAPE comparten el mismo pin de la ULA (pin 16). Esta toma TAPE está conectada con la toma MIC del ordenador. La ULA no puede acometer a la vez ambas operaciones, generación de señal de TV y la operación TAPE/TAPE IN.

A continuación, la imagen que muestra un TV al ejecutar LOAD ""



Si el ZX81 dispone de circuito de video que permita usar una TV moderna a través de una toma de video compuesto o SCART, muy posiblemente la señal se pierda por completo (pantalla negra), volviéndose a recuperar tras terminar la carga o la grabación.

Se han probado diversos dispositivos externos para cargar programas a un ZX81 y se ha demostrado que es muy sensible al volumen, más aún que el ZX Spectrum. Funciona muy bien usando un PC o portátil conectándolo a través de la toma de auriculares con el cable original de audio del ZX81. Hay que subir el volumen al 75% y el 80% de potencia. Usando el programa de reproducción WinAmp va bastante bien. Asegurarse que está en MONO y no en STEREO. Con esta configuración, prácticamente todos los programas cargan.

sábado, 25 de marzo de 2017

Interface de ROM Externa para ZX81 (V)

MONTAJE 4


Este montaje basado en el chip 74ACT02 (CMOS), que es en realidad una variante del clon del ZX80 diseñado por wilco2009. Las ecuaciones que manejan las señales /MREQ y A14, muestran que /OE se activa cuando ambas señales están a 0, es decir cuando se está accediendo a la ROM. Este diseño es copia del clon del ZX80 de Grant Searle.



En la figura anterior se muestra el esquema de selección de la ROM en el clon del ZX80. La señal A14´ entra a la puerta 13 (74LS04) y se combina con la señal MREQ en la puerta 12 (74LS00). La señal 11 va hacia un multiplexor 74LS157 cuya salida se envía al pin 20 (/CS1) de la ROM del ZX81. La señal A14´ es la salida multiplexada de la señal A14 con GND.

/MREQ = 0; cuando el Z80 quiere comunicarse con la memoria, bien para leer o para escribir.


/ROMCS = 1; un dispositivo externo pone esta señal en alta para desactivar la ROM interna y también las “ghost”

/RFSH = 0; ciclo de refresco de la memoria activado en baja

/OE = 0; “Output Enable” se activa en baja

/CE = 0; “Chip Enable” se activa en baja


Con sonda lógica se analiza el ciclo de refresco:


A la vista de los resultados de la sonda lógica, se observa que durante el ciclo de refresco (/RSFH = 0), la señal /CE = 1, es decir la EPROM externa no está disponible, y las señales /REQ y /ROMCS se encuentran en valor 0, lo cual quiere decir que la ROM interna está activa y el Z80 puede acceder a la memoria. Del mismo modo, durante el ciclo de refresco, /RD = 0 lo cual es correcto.

Cuando no hay ciclo de refresco (/RFSH = 1), la EPROM se encuentra disponible (/CE = 0 y /ROMCS = 1) y los datos de la EPROM se encuentran disponibles (/OE = 0) cuando son requeridos (/MREQ = 0 y /RD =0). Las ecuaciones de la puerta NOR para /CE se cumplen. 

La otra ecuación de la puerta NOR para /OE también se cumple, ya que /OE replica la señal de /MREQ dado que A14 = 0 en todo momento.

Utilizando un componente TTL equivalente, como el 74LS02, apenas hay diferencias. Los ciclos son los mismos. A señal /RFSH está en alta menos tiempo que el componente CMOS, pero el resto de las señales responden de acuerdo a la señal de refresco.


Este mismo montaje se ha probado en otro ZX81 ya que el utilizado para pruebas dispone de ampliación interna de 16kB con SRAM. No obstante, en ninguno de los casos funciona.

viernes, 17 de marzo de 2017

Interface de ROM Externa para ZX81 (IV)

MONTAJE 3

Mismo esquema que el anterior, pero en este caso montaje al completo, incluyendo los chips 74HC374 (registro de flip-flops síncrono tipo D) y 74HC193 (contador binario) de tecnología CMOS.
En el chip 74HC374, las señales CLK y /OE son comunes a todos los flip-flops y se dispara por nivel alto del CLK. La señal /RD del ZX81 entra a CLK. Esta señal se encuentra en nivel alto en los ciclos T3 y T4, que es cuando se produce el refresco de las memorias, y por lo tanto provocando la activación del registro. Cuando /OE está a bajo nivel, el contenido de los 8 flip-flops se encuentra disponible a la salida. En el montaje, la conexión a GND garantiza esta disponibilidad. Por lo tanto, este chip garantiza el acceso a las líneas bajas del bus de direcciones (A3-A9) durante el ciclo de refresco.

El chip 74HC193 es un contador binario de 4 bits. Los datos se cargan cuando /LOAD (PE – pin 11) se encuentra a bajo nivel y cuando CLEAR (MR – pin 14) se encuentra igualmente a bajo nivel, algo que se garantiza con la conexión a GND de este último en el montaje. Con este esquema de conexiones, las entradas (D1 – D4) siempre están a alto nivel y las salidas (Q1 – Q3, Q4 no conectada) se activarán cuando NMI esté a bajo nivel, y por lo tanto /LOAD. Durante el proceso de generación del display, se genera una NMI cada vez que el Z80 deba ejecutar un scanline momento en el que se generará un pulso HSYNC.
























De esta manera se controla el acceso a las líneas A0 a A2 del bus de direcciones. La razón por la cual la señal COUNT-UP (pin 5) se encuentra conectada a la señal HALT del ZX81 se desconoce. La instrucción HALT provoca que el Z80 ejecute NOPs hasta que se produzca una interrupción (NMI o INT). Durante la generación del display, se produce un HALT al final de cada línea.











Independiente del selector para A13, el montaje muestra caracteres incorrectos.
En el esquema, se cambian las D0 a D5 y D7 que van al 74HC374, por las líneas A3 – A9, pero solo cambia el patrón de pantalla.