Ingeniería inversa de un chip de computadora Commodore

Antecedentes y primeras muestras



En una publicación anterior escribí que estaba trabajando en ingeniería inversa del chip PLA del Commodore 128. Ahora casi he completado este proceso, así que es hora de compartir mis hallazgos.



Fue un proyecto muy interesante porque no sabía mucho sobre diseño y fabricación de semiconductores. Mi conocimiento se limitaba a mirar imágenes de cristales y admirar estas hermosas fotografías.



Para mí, mi investigación comenzó con la compra de un microscopio económico para soldar componentes de montaje en superficie (SMD).





Microscopio barato



Después de un tiempo, encontré un video en Youtube que muestra una forma más fácil de quitar los cristales de silicio de una carcasa.





El método parecía lo suficientemente simple como para implementarlo en casa, porque ya tenía todo el equipo necesario. Quitar un CI de un paquete generalmente requiere ácido sulfúrico calentado u otros químicos peligrosos con los que realmente no quería experimentar en casa. Así que desenterré un par de chips MOS rotos en mi inventario (nunca tires nada, podría ser útil). Con un poco de trabajo, obtuve dos matrices 8521R0 y una 8721 PLA. En la publicación anterior, mostré la primera foto real.





Foto completa del chip 8721 PLA



Mejor microscopio



Aunque el experimento fue un éxito, inmediatamente me di cuenta de que el microscopio no tenía la resolución suficiente para tomar fotografías con la calidad suficiente para mí. Con una lente Barlow 2x, el aumento máximo es 90x. Además, el microscopio no tiene platina, por lo que tuve que colocar el cristal sobre la mesa y luego mover todo el microscopio; este diseño es muy inestable y es difícil quitar las piezas necesarias con su ayuda.



Así que encontré y compré un microscopio mejor, también por un precio razonable.





Microscopio AmScope ME580-T Hizo un



trabajo mucho mejor tomando fotos de calidad decente, pero no estaba contento con la cámara que compré con él. Esta es una cámara barata sin control remoto, a excepción de la aplicación AmScope. En ese momento, la fundación Raspberry Pi lanzó una nueva cámara de alta calidad para Raspberry Pi. Esta cámara tiene una montura C compatible con el microscopio, así que la compré inmediatamente y la instalé en el microscopio. Hace un trabajo increíble al proporcionar un control completo desde la comodidad de Linux.





Parte de la matriz de silicio 8521R0



En comparación con el sistema anterior, esta es una gran mejora. Debido a la mayor resolución, tuve que unir las fotos para obtener imágenes más grandes. Parece simple al principio, pero resultó (como habrás adivinado) no una tarea fácil en absoluto. Todavía tengo dificultades para unir fotos, pero estoy mejorando gradualmente mi habilidad. Uno de los factores clave para una toma panorámica exitosa es la uniformidad en el enfoque, el balance de blancos, etc. Cuanto más uniformes sean las fotografías, más fácil y mejor será la costura.



Mecanización



Todo esto me hizo empezar a mecanizar la mesa. Empecé a cansarme mucho de mover manualmente la mesa, en la que las fotos se desplazaban a lo largo de varios ejes y se producían otras distorsiones.



Después de hacer mucho diseño, impresión 3D e investigación de firmware CNC, se me ocurrió el siguiente diseño:





Microscopio modificado AmScope ME580-T



En la parte superior hay una pantalla Raspberry de 7 pulgadas, detrás de la cual hay una Raspberry Pi4. La foto no muestra la cámara RPi HiQ montada en el microscopio. El RPi toma fotos, las muestra en la pantalla y también ejecuta el código Python que maneja la placa CNC.



La etapa en cuestión y la etapa de nivelación son impulsadas por motores paso a paso 28BYJ-48, que son impulsados ​​por una pequeña placa ESP32 que ejecuta Grbl_Esp32 , así como cuatro controladores de motor paso a paso AD4498.



El circuito tiene ciertos problemas de software y hardware, pero funciona bastante bien para mis propósitos.



Invierta el chip



Después de ocuparme de la logística, volví a realizar ingeniería inversa del chip. Originalmente quería abordar el chip PLA porque sería lo más fácil de entender. PLA son las siglas de Programmable Logic Array ; estructuras similares eran muy comunes en la era Commodore.



Según el esquema de Wikipedia, deberíamos esperar que haya dos matrices principales en el chip, Y y O. Las entradas están conectadas a Y y los pines salen de la matriz OR.



Volviendo al tiro anterior del dado, podemos mejorarlo agregando anotaciones a los pines y áreas del chip. Habiendo tratado con el propósito de los cristales, podemos ver que todas las entradas están conectadas a una matriz y todas las salidas están conectadas a otra, como se esperaba. Además, nos ayudará a entender dónde está qué matriz.





Instantánea del dado de PLA 8721 con anotaciones



Aquí vemos los pines de E / S marcados y su conexión al marco de plomo y a los pines del DIP. También son visibles las dos áreas principales que componen la estructura PLA, la matriz AND y la matriz OR. Además, hay algo de lógica adicional aquí abajo, marcado con un signo de interrogación. Su propósito era desconocido para mí, pero dado que todos los contactos de salida lo atraviesan, asumí que se trataba de una especie de etapa de salida.



Y matriz



Entonces, si primero comenzamos a examinar la matriz AND más de cerca, veremos la imagen a continuación. Los colores están un poco distorsionados, porque esta foto fue tomada con una cámara AmScope y no pude averiguar cómo establecer el balance de blancos en ella.





Y Matriz con capa de metal



La imagen no es muy útil para comprender lo que está sucediendo porque todas las partes interesantes están cubiertas por la capa de metal superior. Estaba empezando a aprender en ese entonces, así que usé la fuerza bruta para quitar el metal. Borré el metal por un fuerte impacto mecánico; después de estudiar bajo un microscopio, resultó que todo se eliminó en general, excepto el sustrato en sí.



Afortunadamente, los detalles que necesitaba estaban en la capa de difusión ubicada en el sustrato:





Sustrato de la matriz Y



mirando de cerca la imagen, puede ver pequeñas líneas onduladas donde se encuentra el transistor para crear una conexión en la matriz.



O matriz



Pasando a la matriz OR, vemos exactamente el mismo formato. Difícil de analizar sin quitar la capa de metal, pero más fácil en comparación con la matriz AND. Y es mucho más fácil cuando solo quedan el sustrato y la capa de difusión.





O morir con capa de metal





Sustrato de matriz OR



Decodificación de matriz completa



Armados con este conocimiento, podemos proceder a recuperar la matriz lógica PLA completa a partir de imágenes.



Marqué todos los transistores en cada matriz con puntos y obtuve la siguiente imagen:





Una matriz AND con una capa metálica



En una matriz AND, todas las entradas son horizontales y se envía una señal normal e invertida a cada línea. En la matriz OR, todas las derivaciones son horizontales y están conectadas a líneas verticales llamadas minitérminos.



Después de examinar los puntos, podemos decodificar los minitérminos realizando la lógica "Y" para todas las líneas verticales en la matriz Y, por ejemplo,



p0 = CHAREN & HIRAM & BA & !MS3 & GAME & RW & AEC & A12 & !A13 & A14 & A15



para los pines, tomamos una línea horizontal para cada pin y la combinamos con "o", por ejemplo.



SDEN = p42 | p43 | p66 | p69



Así es como obtuvimos el conjunto completo de ecuaciones lógicas. ¡Hurra!



Etapa de salida



Volvamos a la foto completa del cristal; ahora tenemos todo excepto el rectángulo marcado con un signo de interrogación en la ruta de salida.



Al observar las fotografías de mayor resolución de esta área, vemos patrones similares para cada pin. En todos los casos menos dos, esta estructura se omite y la salida de la matriz OR va directamente al pin de salida. Sin embargo, esto no se aplica a dos contactos: DWEy CASENB.



DWE¿Se aplica la señal de habilitación de escritura a los chips DRAM del sistema principal y CASENB pasa la señal CAS a la RAM? Estas dos señales son procesadas de alguna manera por estas estructuras de puerta de salida, por lo que necesitaba realizar ingeniería inversa en este bloque.





Bloque de salida con capa de metal





Sustrato de bloque de salida



Después de pasar una buena cantidad de tiempo leyendo información sobre el diseño y la fabricación de chips de silicio, y también haciendo muchos intentos, pude crear un circuito de apariencia lógica. No entraré en detalles sobre todo el proceso aquí, pero lo documentaré y publicaré más adelante. Aquí también me gustaría agradecer a Frank Wolfe por su ayuda, si es posible, ¡apoya su proyecto!





Circuito de bloque de salida



Mirando un poco más lejos, la forma en que se usa este circuito es con pines DWEy lo CASENBconvierte en un D-latch normal. El pestillo que permite esto está representado en el PLA por un par de líneas en el OR.



Resultado



Así que obtuvimos el resultado final y ahora podemos escribir el código HDL completo para el chip C128 PLA. Para esto utilizaré Verilog. Considerar. que este es mi primer código Verilog, por lo que puede que no sea óptimo. El uso de un D-latch para un pin se considera generalmente una mala práctica en Verilog, pero en este caso estoy replicando la lógica y la funcionalidad del chip terminado.



Lo verifiqué si es posible, pero si me falta algo, ¡infórmelo!



A diferencia del PLA C64, el chip PLA C128 no se puede reemplazar con una EPROM simple o algo similar debido a la presencia de pestillos de salida.



module pla_8721(
    input rom_256,
    input va14,
    input charen,
    input hiram,
    input loram,
    input ba,
    input vma5,
    input vma4,
    input ms0,
    input ms1,
    input ms2,
    input ms3,
    input z80io,
    input z80en,
    input exrom,
    input game,
    input rw,
    input aec,
    input dmaack,
    input vicfix,
    input a10,
    input a11,
    input a12,
    input a13,
    input a14,
    input a15,
    input clk,

    output sden,
    output roml,
    output romh,
    output clrbnk,
    output from,
    output rom4,
    output rom3,
    output rom2,
    output rom1,
    output iocs,
    output dir,
    output reg dwe,
    output reg casenb,
    output vic,
    output ioacc,
    output gwe,
    output colram,
    output charom);

wire p0;
wire p1;
wire p2;
wire p3;
wire p4;
wire p5;
wire p6;
wire p7;
wire p8;
wire p9;
wire p10;
wire p11;
wire p12;
wire p13;
wire p14;
wire p15;
wire p16;
wire p17;
wire p18;
wire p19;
wire p20;
wire p21;
wire p22;
wire p23;
wire p24;
wire p25;
wire p26;
wire p27;
wire p28;
wire p29;
wire p30;
wire p31;
wire p32;
wire p33;
wire p34;
wire p35;
wire p36;
wire p37;
wire p38;
wire p39;
wire p40;
wire p41;
wire p42;
wire p43;
wire p44;
wire p45;
wire p46;
wire p47;
wire p48;
wire p49;
wire p50;
wire p51;
wire p52;
wire p53;
wire p54;
wire p55;
wire p56;
wire p57;
wire p58;
wire p59;
wire p60;
wire p61;
wire p62;
wire p63;
wire p64;
wire p65;
wire p66;
wire p67;
wire p68;
wire p69;
wire p70;
wire p71;
wire p72;
wire p73;
wire p74;
wire p75;
wire p76;
wire p77;
wire p78;
wire p79;
wire p80;
wire p81;
wire p82;
wire p83;
wire p84;
wire p85;
wire p86;
wire p87;
wire p88;
wire p89;

wire casenb_int;
wire casenb_latch;

/* Product terms */

assign p0 = charen & hiram & ba & !ms3 & game &  rw & aec & a12 & !a13 & a14 & a15;
assign p1 = charen & hiram &      !ms3 & game & !rw & aec & a12 & !a13 & a14 & a15;
assign p2 = charen & loram & ba & !ms3 & game &  rw & aec & a12 & !a13 & a14 & a15;
assign p3 = charen & loram &      !ms3 & game & !rw & aec & a12 & !a13 & a14 & a15;

assign p4 = charen & hiram & ba & !ms3 & !exrom & !game &  rw & aec & a12 & !a13 & a14 & a15;
assign p5 = charen & hiram &      !ms3 & !exrom & !game & !rw & aec & a12 & !a13 & a14 & a15;
assign p6 = charen & loram & ba & !ms3 & !exrom & !game &  rw & aec & a12 & !a13 & a14 & a15;
assign p7 = charen & loram &      !ms3 & !exrom & !game & !rw & aec & a12 & !a13 & a14 & a15;

assign p8 = ba & !ms3 & exrom & !game & rw & aec & a13 & !a13 & a14 & a15;
assign p9 =      !ms3 & exrom & !game & rw & aec & a12 & !a13 & a14 & a15;

assign p10 = ba & !ms2 & ms3 &  rw & aec & a12 & !a13 & a14 & a15;
assign p11 =      !ms2 & ms3 & !rw & aec & a12 & !a13 & a14 & a15;

assign p12 = charen & hiram & ba & !ms3 & game &  rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;
assign p13 = charen & hiram &      !ms3 & game & !rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;
assign p14 = charen & loram & ba & !ms3 & game &  rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;
assign p15 = charen & loram &      !ms3 & game & !rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;

assign p16 = charen & hiram & ba & !ms3 & !exrom & !game &  rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;
assign p17 = charen & hiram &      !ms3 & !exrom & !game & !rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;
assign p18 = charen & loram & ba & !ms3 & !exrom & !game &  rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;
assign p19 = charen & loram &      !ms3 & !exrom & !game & !rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;

assign p20 = ba & !ms3 & exrom & !game & rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;
assign p21 =      !ms3 & exrom & !game & rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;

assign p22 = ba & !ms2 & ms3 &  rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;
assign p23 =      !ms2 & ms3 & !rw & aec & !a10 & !a11 & a12 & !a13 & a14 & a15;

assign p24 = charen & hiram & ba & !ms3 & game &  rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p25 = charen & hiram &      !ms3 & game & !rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p26 = charen & loram & ba & !ms3 & game &  rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p27 = charen & loram &      !ms3 & game & !rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;

assign p28 = charen & hiram & ba & !ms3 & !exrom & !game &  rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p29 = charen & hiram &      !ms3 & !exrom & !game & !rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p30 = charen & loram & ba & !ms3 & !exrom & !game &  rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p31 = charen & loram &      !ms3 & !exrom & !game & !rw & aec & !a10 & a11 & a12 & !a13       & a15;

assign p32 = ba & !ms3 & exrom & !game & rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p33 =      !ms3 & exrom & !game & rw & aec & !a10 & a11 & a12 & !a13       & a15;

assign p34 = ba & !ms2 & ms3 &  rw & aec & !a10 & a11 & a12 & !a13 & a14 & a15;
assign p35 =      !ms2 & ms3 & !rw & aec & !a10 & a11 & a12 & !a13       & a15;

assign p36 = !aec;
assign p37 = !rw & aec & !a10 & a11 & a12 & !a13 & a15;

assign p39 = !charen & hiram & !ms3 &           game & rw & aec & a12 & !a13 & a14 & a15;
assign p40 = !charen & loram & !ms3 &           game & rw & aec & a12 & !a13 & a14 & a15;
assign p41 = !charen & hiram & !ms3 & !exrom & !game & rw & aec & a12 & !a13 & a14 & a15;

assign p42 = va14 & !vma5 & vma4 & !ms3          &  game & !aec;
assign p43 = va14 & !vma5 & vma4 & !ms3 & !exrom & !game & !aec;

assign p44 = !ms0 & !ms1 & ms2 &ms3 & z80en & rw & aec & a12 & !a13 & a14 & a15;
assign p45 = hiram & loram & !ms3 & !exrom & rw & aec & !a13 & !a14 & a15;

assign p46 = !ms3 & exrom & !game & aec & !a13 & !a14 & a15;
assign p47 = ms0 & !ms1 & ms3 & exrom & !game & aec & !a14 & a15;
assign p48 = !ms0 & ms1 & ms3                 & aec & !a14 & a15;

assign p49 = hiram & !ms3 & !exrom & !game & aec & a13 & !a14 & a15;
assign p50 = ms3 & exrom & !game & aec & a13 & !a14 & a15;

assign p51 = vma5 & vma4 & !ms3 & exrom & !game & !aec;
assign p52 =  ms0 & !ms1 & ms3 & rw & aec & !a12 & !a13 & a14 & a15;
assign p53 = !ms0 &  ms1 & ms3 & rw & aec & !a12 & !a13 & a14 & a15;
assign p54 = !ms0 & !ms1 & ms3 & rw & aec & !a12 & !a13 & a14 & a15;

assign p55 = !ms0 & !ms1 & z80io & !z80en & rw & aec & !a12 & !a13 & !a14 & !a15;
assign p56 = !ms0 & !ms1 & ms3 & rw & aec & !a14 &  a15;
assign p57 = !ms0 & !ms1 & ms3 & rw & aec &  a14 & !a15;

assign p58 = hiram         & !ms3          &  game & rw & aec & a13 &  a14 & a15;
assign p59 = hiram         & !ms3 & !exrom & !game & rw & aec & a13 &  a14 & a15;
assign p60 = hiram & loram & !ms3          &  game & rw & aec & a13 & !a14 & a15;

assign p61 = !z80io & !z80en & aec & !a10 & !a11        & !a13 & a14 & a15;
assign p62 = !z80io & !z80en & aec               &  a12 & !a13 & a14 & a15;
assign p63 = !z80io & !z80en & aec & !a10 &  a11 &  a12 & !a13 & a14 & a15;

assign p64 = !rw & aec;
assign p65 =  rw & aec;
assign p66 = !aec;

assign p67 = !ms2 & !z80en       & aec & !a10 & !a11 & a12 & !a13 & !a14 & !a15;
assign p68 = !ms2 & !z80en & !rw & aec & !a10 & !a11 & a12 & !a13 & !a14 & !a15;

assign p69 = !charen & !vma5 & vma4 & ms3 & aec;

assign p70 = !rom_256 & !ms0 & !ms1 & ms3 & rw & aec               & a14 & !a15;
assign p71 = !rom_256 & !ms0 & !ms1 & ms3 & rw & aec & !a12 & !a13 & a14 &  a15;
assign p72 = !rom_256 & !ms0 & !ms1 & z80io & !z80en & rw & aec & !a12 & !a13 & !a14 & !a15;

assign p73 = clk;
assign p74 = rw & !aec & vicfix;

assign p75 =            !ms0 & !ms1       & ms3 & rw & aec       &  a13 & a14 & a15;
assign p76 = !rom_256 & !ms0 & !ms1       & ms3 & rw & aec       &  a13 & a14 & a15;
assign p77 =            !ms0 &  ms1       & ms3 & rw & aec       &  a13 & a14 & a15;
assign p78 =            !ms0 &  ms1 & ms2 & ms3 & rw & aec & a12 & !a13 & a14 & a15;
assign p79 =             ms0 & !ms1       & ms3 & rw & aec       &  a13 & a14 & a15;
assign p80 =             ms0 & !ms1 & ms2 & ms3 & rw & aec & a12 & !a13 & a14 & a15;

assign p81 = !ms3 & exrom & !game & aec &  a12        & !a14 & !a15;
assign p82 = !ms3 & exrom & !game & aec        &  a13 & !a14;
assign p83 = !ms3 & exrom & !game & aec               &  a14;
assign p84 = !ms3 & exrom & !game & aec & !a12 & !a13 &  a14 &  a15;

assign p85 = !loram & ms3 &  aec;
assign p86 = !hiram & ms3 & !aec;

/* outputs */

assign sden = p42 || p43 || p66 || p69;
assign roml = p45 || p46 || p47;
assign romh = p49 || p50 || p51 || p52 || p79 || p80;
assign clrbnk = p85 || p86;
assign from = p48 || p53 || p77 || p78;
assign rom4 = p54 || p55 || p75;
assign rom3 = p56 || p70;
assign rom2 = p57;
assign rom1 = p58 || p59 || p60 || p71 || p71 || p76;
assign iocs = p0 || p1 || p2 || p3 || p4 || p5 || p6 || p7 || p8 || p9 || p10 || p11 || p62;
assign dir = p12 || p14 || p16 || p18 || p20 || p22 || p24 || p26 || p28 || p30 || p32 || p34 || p39 || p40 || p41 || p44 || p65;
assign vic = p12 || p13 || p14 || p15 || p16 || p17 || p18 || p19 || p20 || p21 || p22 || p23 || p61;
assign ioacc = p0 || p1 || p2 || p3 || p4 || p5 || p6 || p7 || p8 || p9 || p10 || p11 || 
               p12 || p13 || p14 || p15 || p16 || p17 || p18 || p19 || p20 || p21 || p22 || p61 || p62;
assign gwe = p37;
assign colram = p24 || p25 || p26 || p27 || p28 || p29 || p30 || p31 || p32 || p33 || p34 || p35 || p36 || p63 || p67;
assign charrom = p39 || p40 || p41 || p42 || p43 || p44 || p69;

assign casenb_latch = p73 || p74;

assign casenb_int = p0 || p1 || p2 || p3 || p4 || p5 || p6 || p7 || p8 || p9
                || p10 || p11 || p12 || p13 || p14 || p15 || p16 || p17 || p18 || p19
                || p20 || p21 || p22 || p23 || p39 || p40 || p41 || p42 || p43 || p44
                || p45 || p46 || p47 || p48 || p49 || p50 || p51 || p52 || p53 || p54
                || p55 || p56 || p57 || p58 || p59 || p60 || p61 || p62 || p63 || p67
                || p69 || p70 || p71 || p72 || p75 || p76 || p77 || p78 || p79 || p80
                || p81 || p82 || p83 || p84;

/* Latched outputs */

always @ (clk or p64)
  if (clk)
    dwe <= p64;

always @ (casenb_latch or casenb_int)
  if (casenb_latch)
    casenb <= casenb_int;

endmodule


Que sigue



El siguiente chip analizado será el chip MMU de computadora C128, que tardará mucho más en funcionar, porque no es un PLA ordinario.



Ver también:






All Articles