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

2021/06/09

Primeros pasos en la toma de control de una Commodore 128D

Sucia pero...
Sucia pero...
 

De chico era un marginal, en lugar de tener una Commodore 64 como cualquier hijo de vecino, tenía una Atari 130 XE, debido a seguir un consejo técnico. Esto me dejó fuera de sintonía con el resto de mis conocidos, en un nicho donde era difícil conseguir software y afectó de modo profundo e impredecible qué soy hoy, supongo que si no quedé afuera del juego fue porque tuve acceso a una IBM PC muy poco tiempo despues por un pariente. De hecho, estoy escribiendo con el teclado Modelo M de 1987 de esa máquina.

La misma persona que me dió este consejo y otro más que tambien falló (comprar un microprocesador 6809E en lugar de un 6809) sin embargo fué decisiva en mi rumbo y formación, me hizo mi primera fuente 200 AC a 12 y 5 DC, me regaló mi primer osciloscopio, me ayudó a elegir y comprar mi primer tester, me explicó el funcionamiento del ULA de la sinclair y fuzzy logic y muchas más cosas que no puedo identificar, asi que nada tengo que reclamarle, nadie es perfecto.

Esa "E" en 6809 significa que el reloj necesita unos componentes externos para funcionar y eso produjo un primer impedimiento en que lo hiciera funcionar que nunca pude superar, sigue en mi lista de asuntos pendientes desde ya hace 35 años.

El consejo técnico debe haber venido por el lado de que la Atari tenía 128KB como la C128, corría a 1.8Mhz en lugar de 1 Mhz de la C64, debía ser más barata que la C128 y yo le debo haber aportado que se veía mucho más linda, cosas de chicos, pero un hecho indudable:

Atari 130XE
Atari 130XE gana

Commodore 128
Commodore 128 parece más seria

Commodore 64
Commodore 64 no llega a ser horrible...


Conclusión, ninguna novedad,  las decisiones puramente técnicas (y estéticas) no suelen ser las más apropiadas, hay que tener en cuenta otros factores, como la facilidad para quien intenta aprender algo, la disponibilidad de herramientas y una comunidad que le acompañe.

Quince años después de haberme desecho de la Atari 130XE, estaba en la feria del Parque Los Andes y veo algo raro, una C128D, que viene a ser una C128 pero en un gabinete con disketera y el teclado separado.

Es el mismo mother, incluso el teclado no es externo, está externalizado, tiene la misma interfaz paralela como si estuviera adentro, un cable de como veinte hilos.

Si mirás la entrada de la wikipedia, verás que en realidad parece  que se trata de una C128DCR, Cost Reduced, el gabinete metálico en lugar de plástico y el ROM de 1986, me falta abrirla para ver si tiene el chip de video 8568 que sería el tercer factor de confirmación.

La conecté y funcionó ok, fantástico, la almacené. Tiempo después me hice un ratito y la conecté a 220 V siendo de 110 V.

Ahora, quince años después, no recuerdo bien el contexto pero podría fijarme en el chat que tuvimos, un compañero de trabajo, pasabamos por temas nostálgicos cuando le conté de esta máquina y me alentó a hacerla funcionar.

Siguiendo su indicaciones, me fijé que los capacitores estuvieran ok. Le conté que recordaba haber visto un fusible intacto y cuando estaba en ello reparé en otro fusible, bien cerca de la entrada de alimentación, nada intacto. Debía estar tan ofuscado y desmoralizado en el momento del error que no reparé en este.


El fusible era el de abajo a la derecha
El fusible era el del centro abajo a la derecha
 

Me llevó dos horas netas a lo largo de varios días encontrar los adaptadores. El primero, el que además es selector de entrada, apareció rápido y lo que es notable es que en este momento no recuerdo donde lo encontré. El segundo tenía que estar en un frasco con los splitters, atenuadores y fichas de cable, como corresponde, pero nada, no lo podía hallar y cuando apareció ese frasco, no estaba. Por suerte, cuando ordené originalmente mantuve una cierta disciplina y en el mismo cajón estaban unas antenas de TV y estaba conectado a una de ellas.

La conecté con gran pánico y encendió el led de arranque, prendió y apagó el de la disketera, vamos bien. Conecté a la entrada de TV con unos mínimos sufrimientos y acá está:

 

Primer arranque
Primer arranque

Esas letritas raras tras el ready se deben a que tenía el keylock apretado, son caracteres gráficos.

Tras palpar un poco determiné que en gran medida la baja calidad se debe al adaptador selector.

 

Adaptadores
Adaptadores

 

¿Qué se puede hacer con esto?


Primero limpiarla un poco.

La verdad verdad es que no me interesa para jugar, para eso están los emuladores y si en todos estos años no los he usado, algo debe significar. Tampoco programarla, para eso están los emuladores y otro montón de otras arquitecturas más actuales y provechosas.

 

Video


Tengo que encontrarle un propósito y como lo que más me interesa ahora es FPGA y gracias a DVGHV aprendí mas o menos a lidiar con señales VGA, lo que me resultaría provechoso e interesante es tomar la señal y superponer la pantalla en una ventana, utilizando la placa PYNQ que tiene entrada y salida HDMI. Debería tomar cada cuadro de la C128 y superponerlo en algún lugar encima de lo que venga de la computadora por HDMI, tipo como eran las primeras placas aceleradoras 3D.

Para esto no necesito cargar ningún programa, sólo descifrar cual de las tres interfaces me conviene, tiene olor a megaproyecto, es más de lo que estoy dispuesto a hacer en estos días.

 

CP/M vía diskete

 

Me produce una atracción perversa arrancar en modo CP/M, pero esto requiere cargar desde floppy. Esta es mi cadena de dependencias:

  • Comprobar que desde PC se pueden formatear y grabar diskettes para Commodore.
  • Conseguir una fuente AT.
  • Armar una máquina con disketera de 5 1/4 con el resto de la basura que tengo, es que hace un par de años tiré demasiadas cosas.
  • Obtener la imagen de CP/M.
  • Obtener el sistema operativo y software para grabar el disco.
  • No sé si la disketera funciona.

 

CP/M vía emulador de disketera


Tengo un camino mejor y que representa ingenio a diferencia de lo anterior que es sólo copiarse de esfuerzos ajenos: descifrar como con un microcontrolador simular una disketera 1571 o 1581.

  • Obtener la especificación de comunicación.
  • Implementarla en un microcontrolador.
  • Obtener la imagen de CP/M.
  • Ponerla en la eeprom del microcontrolador.
  • Servirla en el momento apropiado.

Hay menos factores librados al azar. Pero debe ser increiblemente difícil, por más que los detalles de bajo nivel los debe estar resolviendo el microprocesador 6502 de la disketera.

Este proyecto no es novedoso, hay varios modelos dando vueltas por ahí, incluido un emulador para Raspberry Pi 3 que no descarto utilizar.

Para cargar otros programas, tengo otras posibilidades adicionales.

 

Carga vía cartridge

 

Este es bastante interesante, usar un microcontrolador que se haga pasar por un cartridge:

  • Obtener el pinout, protocolo y timing.
  • Implementar la emulación con el microcontrolador
  • Obtener algún programa
  • Ponerlo en la eeprom del microcontrolador
  • Conectar 

Con un ATMega328p me parece que no alcanza aunque corra a 20Mhz. Quizás si podría con la placa NUCLEO que vengo usando en un trabajo práctico y corre a 180Mhz, más que es tolerante a 5V, pero tendría que ver bien, anticipándome y viendo EasyFlash3 y C64-Pi parece que entramos en terrenos de FPGA. De un modo u otro me parece que me queda grande.

 

Carga vía emulador datassette


Conseguir archivos guardados en cassettes en formato wav o mp3 y meterlos no por el datassette que tengo, que no sé si funciona sino desde la placa de sonido:

  • Identificar la entrada de audio.
  • Comprobar que tenga un nivel electrónico apropiado para la salida de una compu o mejor aún un reproductor de mp3, como puede ser un celular viejo.
  • Armar algún tipo de conector.
  • Obtener algún programa.
  • Ponerlo en el reproductor
  • Cargarlo.

Este es de los menos interesantes pero quizás esté a mi alcance y prefiero terminar esta nota habiendo hecho algo concreto, no sólo planes que quién sabe cuándo y sí los ejecutaré.

Y ya empezamos mal, no sé por qué pensé que iba a ser como con la Spectrum que podías usar cualquier reproductor de cinta. No logro encontrar documentación, lo mejor es la existencia de un adaptador llamado C2N232 que permite hacer que una PC se haga pasar por el datassette mediante una conexión RS-232.

Si tomara ese camino el único mérito sería portar el firmware a un ATMega328p, que no sería poco porque está escrito en unas 700 líneas de assembly, mmmh.

Quizás estoy cometiendo el error de pensar que por que la comunicación es analógica, tal como indica sound input/output en el pinout del cassette de MSX tomado de un foro que hallé mientras buscaba algo que desambigüe el sentido de CASSETTE READ/WRITE, lo que me llevó al foro correcto.


Pinout MSX
Pinout MSX

Llevaré adelante el siguiente experimento, cuyo objetivo es determinar si la interfaz entre la CPU y el datassette es digital o analógica.

  1. Identificar la entrada y la salida de datos.
  2. Desarmar el datassette para poder medir sin armar conector.
  3. Encontrar un cassette.
  4. Escribir un programa
  5. Salvarlo
  6. Capturar la señal
  7. Analizarla

 

1 Pinout

+----+----++----+----+----+----+
| A1 | B2 || C3 | D4 | E5 | F6 |
+----+----++----+----+----+----+

 

Pinout Datassette C64
Pinout Datassette C64

 

2 Punto de medición

 

Interior Datassette
Interior Datassette

Con conector
Con conector

 

Mesa de trabajo
Mesa de trabajo

3 Cassette

 

Listo

 

4 Programa

 

10 A=A+1
20 PRINT A
30 GOTO 10

 

5 Salvarlo

 

SAVE "ONE",1,2

 

Proceso de grabación completo
Proceso de grabación completo

De paso observá que se ve muy bien, esos adaptadores y el cable de audio RCA evidentemente nada aportaban, le soldé una ficha RCA a un cable coaxial, RG11 o similar, el patrón de interferencia es de la cámara del celular. Es un motivo menos de preocupación, se veian unas rayitas horizontales muy cortas que en mi experiencia con PC indicaban fallo de la memoria de video, ahora no están más.

 

6 Capturas

 

Captura completa salvo...
Captura como 35 segundos completa salvo...


...el comienzo, donde se ve la bajada del sensor
...el comienzo, donde se ve la bajada del sensor



Todo igual...
Todo igual...

Detalle pulsos
Detalle pulsos


Para ver si ganaba información capturé apretar play/stop sin intervención de la compu, nada.

Play Stop
Play Stop

 

Ampliación de las zonas marcadas en orden cronológico:


Inicio sensor y motor
Inicio sensor y motor

Pulsos iniciales de lectura
Pulsos iniciales de lectura

Pulsos finales de lectura
Pulsos finales de lectura

No se si habrás observado, el violeta que es 6.2 V no regulados, no sé si lo que cáe es normal, a mirar el datassette por dentro.

Le conecté 4 V regulados y el motor anduvo, aún bajando hasta 3 V, no sé si a la velocidad apropiada, falla al rebobinar. Esto es un problemilla, C128 no está proveyendo el voltaje o la corriente apropiada. 

Volví a conectarlo a la C128 y obtuve resultados distintos, no hay señal salvo unos ruiditos del datassette a la C128. De paso capturé dos programas de distinta longitud:

Programa corto
Programa corto



Programa largo
Programa largo
Si te fijás bien, verás que los bloques del medio son distintos.

 

7 Análisis

 

No funcionó la grabación en sí, ya que parece que la señal "cassette motor" no es suficiente, me falta electrónica para lidiar con esto, supongo que debería poner un transistor que aumente la corriente.

La C128 ni se enteró, tras el save desactivó el video unos segundos, demasiados quizás. Luego dijo "ok". Esto significa que si quiero capturar, tengo que poner "cassette sense" a tierra.

No hubo ninguna manifestación de cambio, ni en el pin de ida ni el de vuelta, sólo esa señal cuadrada con período 380 uS, 2.64 khz, 400 uS, 250 khz en el segundo intento. Esto es bueno, la señal parece digital, con un microcontrolador debería poder capturarla con un GPIO y reproducirla luego.

El microcontrolador candidato preferido es el ATMega328p debido a manejarse con 5V, pero tiene muy poca RAM.

Como no puedo leer, no sé si la reproducción debería ser igual a la grabación, voy a apostar a que si. O quizás sería buena idea buscar algún manual. Si alguien que sabe me quiere tirar alguna pista, no me ofende.

Prometo que si hago algo más lo publicaré, lo que pasa es que esta nota es producto de mi alta procrastinación.



 




 





 

 






2021/04/18

Teclado hexadecimal USB: una pausa para los aspectos físicos

Como he logrado un éxito parcial y mi teclado presenta las funciones básicas, augurando sino un éxito completo al menos esquivar el fracaso, ya podría ir prestando atención a como voy a poner el Teensy dentro del gabinete del teclado, para lo cual debo considerar los siguientes aspectos:


  • Debe entrar en el lugar que tengo pensado sin que toque al circuito existente.
  • Debe exponer al exterior el conector.
  • Debe quedar accesible el botón de reprogramación sin necesidad de abrir el gabinete.
  • Debe quedar fijo, tal que al conectar el cable USB o al oprimir el botón de reprogramación no se suelte.

 

Lo que no tendré en cuenta pues supera mi capacidad y tiempo, es el tema de interferencias electromagnéticas y la disipación de la temperatura. Con respecto a lo primero, apostaré a que no pase nada y a lo último, tendré la precaución de que dejar espacio entre el chip y el gabinete.

 

Extra: quitar los pines

 

Por ahora nada me ha llevado más tiempo y producido más frustración que quitar los pines. Primero, intenté con paciencia quitar el plástico de los pines, para contrarrestar el efecto "la unión hace la fuerza", cada pin por separado es evidentemente más sencillo que la tira completa. Nada, estaba muy firme, le dí con el disco de corte de torno de mano a un lado y pude quitar todo el plástico.

Para desoldar los pines, tuve que desarrollar una técnica que comparto:

En lugar de calentar la soldadura, calentar el pin desde el lado contrario, se puede hacer con dos a la vez para compensar los movimientos, la punta del soldador queda trabada. Cuando comienza a moverse y recién en ese momento, con una pinza lo retirás. No toques con la pinza antes pues se enfría.

 [foto]

Pese al método, tuve un brote de impaciencia y perdí uno de los through holes, por suerte el de GND, hay otro por ahí.

 

Colocación del Teensy


Para medir el lugar pude haber hecho un esfuerzo intelectual y con un calibre medir con gran precisión, pero me agarró un cierto infantilismo y me pareció más pintoresco poner un poco de plastilina debidamente protegida con un plástico y poner el circuito en su posición, para que ésta se aplaste y tome la medida del hueco:


Plastilina antes
Plastilina antes

 
 
Aún así tenía la esperanza de poder usar el calibre, hace pocos meses adquirí uno mediocre pero de metal tras haber pasado casi treinta años de haber perdido el excelente que tenía, pero no hizo falta medir, a ojo se vé claramente que sin los pines la plaquita entra holgadamente y al estar levemente separada por el conector del plástico, cumple quizás con una leve ventilación:
 
 
Plastilina despues
Plastilina despues
 


Salida para el conector


Para exponer el conector al exterior un lamentable y desprolijo orificio alcanza. 

 

Acceso al botón de reprogramación


Otro triste agujero, con el beneficio extra de que al entrar la pieza en éste, produce una traba que va a servir para que al conectar el cable la placa se mantenga en su lugar.


Botón de reprogramación
Botón de reprogramación


 

La fijación


Había pensado usar cuatro pines y "clavarlos" en el plástico del fondo pero ya viste que lo mío no es el trabajo de precisión, va con la pistola plástica adhesiva.


 

Extra: periférico

 

En otro cajón tengo un touchpad cuyo rescate y adaptación a USB me ha servido de base para esta experiencia. Tuve la fantasía de quitarle las teclas de las flechas y ponerlo ahí, pero es una atrocidad y le quita lo retro. Luego pensé en una especie de cajoncito y que salga por un costado, pero sería frágil y desprolijo. Me quedé entonces con la idea de una ampliación, poner el touchpad en algún gabinetito copado y hacelo conectable.

Ya me conozco y si voy por ese camino no voy a terminar nunca. Lo que hice entonces es dejar un conector RJ-1, el del teléfono, que era lo que tenía a mano y tiene cuatro cables. El cajón de la basura sigue rindiendo frutos, alguien dijo "las noticias de hoy envolverán el pescado de mañana", yo puedo decir que la basura del ayer encontrará conmigo su destino, en algún momento.

No bien terminé de poner la masilla en el gabinete del teclado me dí cuenta de que pude haber puesto un conector ps/2, con lo cual me serviría para conectar cualquier legacy, pero bueno, ya pasó, si lo necesito fabricaré el cable adaptador.

Queda para cuando implemente el programa más completo del teclado incorporar el touchpad, no creo que implique ninguna dificultad.

Siguiendo el manual, ya dejo soldados los cables en los pines apropiados.


BoardData PinClock Pin (IRQ)
Teensy 3.6
Teensy 3.5
Teensy 3.2
Teensy 3.1
Teensy 3.0
Any
except 13 &
analog-only
pins
Any
except 13 &
analog-only
pins
Teensy LCAny
except 13
2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
12, 14, 15, 20, 21, 22, 23
Teensy 2.0Any, except 115, 6, 7, 8
Teensy 1.0Any0, 1, 2, 3, 4, 6, 7, 16
Teensy++ 2.0Any, except 60, 1, 2, 3, 18, 19, 36, 37
Teensy++ 1.0Any0, 1, 2, 3, 18, 19, 36, 37


Interior final con puerto para ampliación
Interior final con puerto para ampliación


 

Retoque final


Un poco de LEM y no te digo que nuevo, pero al menos parece limpio. 

Final
Final


En lo físico lo único que me ha faltado es conectar el switch de AP/X al Teensy para... no sé para qué, cualquier cambio de modo lo voy a hacer apretando varias veces NumLock.


Y aquí tenés la prueba de que funciona:

0123456789ABCDEF






2021/04/17

Teclado Hexadecimal USB: Versión 1 funcionando

Venís de la intro y un mini POC.

 

Tras mirar bastante el código  de PS2Keyboard, que es la clase que lee el teclado PS2 y observar el comportamiento de Keyboard, que es la clase que se hace pasar por un teclado USB, he logrado comprender bastantes cosas, empezando por las limitaciones.

                           [PS2Keyboard]
                               /   \
  PC <-- USB -->[Keyboard] Teensy   <-- ps2 --> Teclado
                               \   /
                               [ps2]


Usando PS2Keyboard y Keyboard, ya tengo un segundo prototipo, que funciona con lo básico, pero no puedo hacer que me funcionen las demás teclas como las flechas ni el NumLock.
 

PS2Keyboard

PS2Keyboard es de más alto nivel, toma las secuencias de código que provienen del teclado y las convierte en caracteres de 8 bits. Mapea las teclas especiales como "print screen" y "capslock" a un código arbitrario.

Se usa asi:

 if (keyboard.available()) {
    // read the next key
    char c = keyboard.read();

Si oprimis la tecla "4", recibís un "4" (ascii 52 o 0x34).

Tocando el código de la librería:

[$ARDUINO_FOLDER/hardware/teensy/avr/libraries/PS2Keyboard/PS2Keyboard.cpp]

 

     while (1) {
           s = get_scan_code();
           if (!s) return 0;
           if (s == 0xF0) {
                   state |= BREAK;
                   Serial.println("BREAK");
           } else if (s == 0xE0) {
                   state |= MODIFIER;
                   Serial.println("MODIFIER");

 

Si oprimís "4", en el serial emitís un BREAK, si oprimís flecha arriba, MODIFIER, MODIFIER, BREAK, pero para consumir unos caracteres inútiles por ahora.

 

Toqué un poco en el .h:

[$ARDUINO_FOLDER/hardware/teensy/avr/libraries/PS2Keyboard/PS2Keyboard.h]

// Every call to read() returns a single byte for
// each keystroke.  These configure what byte will
// be returned for each "special" key.  To ignore
// a key, use zero.
#define PS2_TAB                      9
#define PS2_ENTER                   13
#define PS2_BACKSPACE                7
#define PS2_ESC                     27
#define PS2_INSERT                  65     // 0
#define PS2_DELETE                  68     // 127
#define PS2_HOME                    66     // 0
#define PS2_END                     69     // 0
#define PS2_PAGEUP                  67     // 25
#define PS2_PAGEDOWN                70     // 26
#define PS2_UPARROW                 11
#define PS2_LEFTARROW                8
#define PS2_DOWNARROW               10
#define PS2_RIGHTARROW              21
 

 

 Y con eso tengo las letras A-F en donde quería.

 

 La versión actual queda:


include <PS2Keyboard.h>

const int DataPin = 5;
const int IRQpin =  3;

PS2Keyboard keyboard;

void setup() {
  keyboard.begin(DataPin, IRQpin);
  delay(1000);
}

void loop() {
 if (keyboard.available()) {
    char c = keyboard.read();
    Keyboard.print(c);
  }
}

 

El resto

ps2

ps2 es de bajo nivel, recibe sin interpretar cada código desde el teclado:

  for (;;) { /* ever */ 
    code = kbd.read();
    Serial.println(code, HEX);

Si oprimís la tecla "4", recibís:

6B
F0
6B

Aparentemente 6B es 4-keypress y F06B es 4-keyrelease

Si oprimís flecha arriba:

E0
75
E0
F0
75

Afirmaría que E075 es upArrow-keypress y E0F075 upArrow-keyrelease.

A ver, qué pasa si hago:

  • oprimir 4  
  • oprimir flecha
  • soltar flecha
  • soltar 4

6B -> 4 keypress
E0
75 -> flecha keypress
E0
F0
75 -> flecha keyrelease
F0
6B -> 4 keyrelease

Bien, si ahora oprimo el 4 y espero, aparece el 6B, si no me apuro en soltar, se llena de 6B. Ya está bien clarito, llegó el momento de mapear todo...

 


key presskey release
printscreenE012E07C



E0F07CE0F012
scroll lock7E






F07E



pauseE11477E1F014F077





backspace66






F066



num lock77






F077



insertE070





E0F070


homeE06C





E0F06C


page upE07D





E0F07D


deleteE071





E0F071


endE069





E0F069


page downE07A





E0F07A


up arrowE075





E0F075


left arrowE06B





E0F06B


down arrowE072





E0F072


right arrowE074





E0F074


esc76






F076



/E04A





E0F04A


*7C






F07C



-7B






F07B



76C






F06C



875






F075



97D






F07D



+79






F079



46B






F06B



573






F073



674






F074



169






F069



272






F072



37A






F07A



enterE05A





E0F05A


070






F070



.71






F071



Intuyo que si pudiera activar el NumLock, las teclas marcadas en verde enviarían otros códigos.


El código referenciado está en

$ARDUINO_FOLDER/libraries/ps2/ps2.h

$ARDUINO_FOLDER/libraries/ps2/ps2.cpp

 

Próximos pasos

Tengo que examinar Keyboard para ver si puedo enviar esos códigos directamente o tengo que hacer alguna conversión y quizás prender y apagar el LED. En otras palabras, que el teclado funcione de modo transparente salvo los reemplazos de teclas objetivo del ejercicio.