Antecedentes e primeiras amostras
Em um antigo post, escrevi que estava trabalhando na engenharia reversa do chip PLA do Commodore 128. Agora que quase concluí esse processo, é hora de compartilhar minhas descobertas.
Foi um projeto muito interessante porque eu não sabia muito sobre projeto e fabricação de semicondutores. Meu conhecimento se limitava a olhar fotos de cristais e admirar essas lindas fotos.
Para mim, minha pesquisa começou com a compra de um microscópio barato para soldar componentes de montagem em superfície (SMD).

Microscópio barato
Depois de algum tempo, encontrei um vídeo no Youtube mostrando uma maneira mais fácil de remover cristais de silício de uma caixa.
O método parecia bastante simples de implementar em casa, porque eu já tinha todo o equipamento necessário. Remover um CI de um pacote geralmente requer ácido sulfúrico aquecido ou outros produtos químicos perigosos que eu realmente não queria experimentar em casa. Então eu desenterrei alguns chips MOS quebrados em meu inventário (nunca jogue nada fora, pode ser útil). Com um pouco de trabalho, consegui duas matrizes 8521R0 e uma PLA 8721. No post anterior, mostrei a primeira foto real.

Foto completa do chip PLA 8721
Melhor microscópio
Embora o experimento tenha sido bem-sucedido, percebi imediatamente que o microscópio não tinha resolução suficiente para tirar fotos com qualidade suficiente para mim. Com uma lente Barlow 2x, a ampliação máxima é 90x. Além disso, o microscópio não tem platina, então tive que colocar o cristal na mesa e mover todo o microscópio; este projeto é muito instável e é difícil remover as peças necessárias com sua ajuda.
Então encontrei e comprei um microscópio melhor, também por um preço razoável.

Microscópio AmScope ME580-T Ele fez um
trabalho muito melhor ao tirar fotos de qualidade decente, mas não fiquei satisfeito com a câmera que comprei com ela. Esta é uma câmera barata sem controle remoto, exceto para o aplicativo AmScope. Naquela época, a fundação Raspberry Pi lançou uma nova câmera de alta qualidade para o Raspberry Pi. Esta câmera tem um suporte C compatível com o microscópio, então eu imediatamente a comprei e instalei no microscópio. Ele faz um trabalho incrível em fornecer controle completo no conforto do Linux.

Parte do molde de silício 8521R0
Em comparação com o sistema anterior, esta é uma grande melhoria. Devido ao aumento da resolução, tive que costurar as fotos para obter imagens maiores. Parece simples no início, mas acabou (como você deve ter adivinhado) uma tarefa nada fácil. Ainda tenho dificuldade em costurar fotos, mas estou melhorando gradativamente minha habilidade. Um dos fatores-chave para uma foto panorâmica bem-sucedida é a uniformidade de foco, equilíbrio de branco, etc. Quanto mais uniformes forem as fotografias, mais fácil e melhor será a costura.
Mecanização
Tudo isso me fez começar a mecanizar a mesa. Comecei a ficar muito cansado de movimentar manualmente a mesa, em que as fotos se deslocavam ao longo de vários eixos e outras distorções ocorriam.
Depois de fazer muito design, impressão 3D e pesquisa sobre firmware CNC, eu vim com o seguinte design:

Microscópio modificado AmScope ME580-T
Na parte superior, há uma tela Raspberry de 7 polegadas, atrás da qual está um Raspberry Pi4. A foto não mostra a câmera RPi HiQ montada no microscópio. O RPi tira fotos, exibe-as no visor e também executa o código Python que aciona a placa CNC.
O estágio e o estágio de nivelamento são acionados por motores de passo 28BYJ-48, que são acionados por uma pequena placa ESP32 executando Grbl_Esp32 e quatro controladores de motor de passo AD4498.
O circuito tem alguns problemas de software e hardware, mas funciona muito bem para meus objetivos.
Inverta o chip
Tendo lidado com a logística, voltei a fazer a engenharia reversa do próprio chip. Originalmente, eu queria lidar com o chip PLA porque seria a coisa mais fácil de descobrir. PLA significa Programmable Logic Array ; estruturas semelhantes eram muito comuns na era do Commodore.
Com base no esquema da Wikipedia, devemos esperar que existam duas matrizes principais no chip, AND e OR. As entradas são conectadas a AND e os pinos saem da matriz OR.
Voltando à cena anterior do dado, podemos melhorá-la adicionando anotações aos pinos e áreas do chip. Tendo lidado com o propósito dos cristais, podemos ver que todas as entradas estão conectadas a um array e todas as saídas estão conectadas a outro, como esperado. também nos ajudará a entender onde está qual array.

Instantâneo do dado 8721 PLA com anotações
Aqui vemos os pinos de I / O marcados e sua conexão ao quadro de chumbo e aos pinos do próprio DIP. Também visíveis estão as duas áreas principais que compõem a estrutura PLA, a matriz AND e a matriz OR. Além disso, há alguma lógica adicional marcada aqui com um ponto de interrogação. Seu propósito era desconhecido para mim, mas como todos os contatos de saída passam por ele, presumi que fosse algum tipo de estágio de saída.
Matriz AND
Portanto, se primeiro começarmos a examinar a matriz AND mais de perto, veremos a imagem abaixo. As cores estão um pouco distorcidas, porque esta foto foi tirada com uma câmera AmScope e eu não consegui descobrir como ajustar o equilíbrio de branco nela.

AND Matrix com Metal Layer
A imagem não é muito útil para entender o que está acontecendo, porque todas as partes interessantes estão cobertas pela camada superior de metal. Eu estava começando a aprender naquela época, então usei força bruta para remover o metal. Apaguei o metal por um forte impacto mecânico; depois de estudar ao microscópio, descobriu-se que tudo foi removido em geral, exceto o próprio substrato.
Felizmente, os detalhes que eu precisava estavam na camada de difusão localizada no substrato:

Substrato de matriz E
Olhando de perto a imagem, você pode ver pequenas linhas onduladas onde o transistor está localizado para criar uma conexão na matriz.
Matriz OR
Passando para a matriz OR, vemos exatamente o mesmo formato. Difícil de analisar sem remover a camada de metal, mas mais fácil em comparação com a matriz AND. E é muito mais fácil quando apenas o substrato e a camada de difusão são deixados.

OU morrer com camada de metal

OR Matrix Substrate
Decodificação de matriz completa
Munidos desse conhecimento, podemos prosseguir para recuperar a matriz lógica PLA completa a partir das imagens.
Marquei todos os transistores em cada matriz com pontos e obtive a seguinte imagem:

Uma matriz AND com uma camada de metal
Em uma matriz AND, todas as entradas são horizontais e um sinal normal e invertido é alimentado para cada linha. Na matriz OR, todas as derivações são horizontais e conectadas a linhas verticais chamadas mintermos.
Depois de examinar os pontos, podemos decodificar os mintermos, realizando a lógica "AND" para todas as linhas verticais na matriz AND, por exemplo
p0 = CHAREN & HIRAM & BA & !MS3 & GAME & RW & AEC & A12 & !A13 & A14 & A15
Para pinos, pegamos uma linha horizontal para cada pino e combinamos com "ou", por exemplo.
SDEN = p42 | p43 | p66 | p69
É assim que obtivemos todo o conjunto de equações lógicas. Hooray!
Estágio de saída
Vamos voltar à foto completa do cristal - agora temos tudo, exceto o retângulo marcado com um ponto de interrogação no caminho de saída.
Olhando para as fotografias de alta resolução desta área, vemos padrões semelhantes para cada pino. Em todos os casos, exceto em dois, essa estrutura é ignorada e a saída da matriz OR vai diretamente para o pino de saída. No entanto, isso não se aplica a dois contatos:
DWE
e CASENB
.
DWE
O sinal Write Enable é aplicado aos chips DRAM do sistema principal e o CASENB passa o sinal CAS para a RAM. Esses dois sinais são de alguma forma processados por essas estruturas de porta de saída, então tive que fazer a engenharia reversa deste bloco.

Bloco de saída com camada de metal

Substrato do bloco de saída
Depois de passar muito tempo lendo informações sobre o projeto e a fabricação de chips de silício, bem como fazer muitas tentativas, fui capaz de desenhar um circuito de aparência lógica. Não vou entrar em detalhes sobre todo o processo aqui, mas vou documentar e publicá-lo mais tarde. Aqui também gostaria de agradecer a Frank Wolfe por sua ajuda, se possível, apoiando seu projeto!

Circuito de bloco de saída
Olhando um pouco mais adiante, a forma como este circuito é usado é com pinos
DWE
e o CASENB
transforma em um D-latch normal. A trava que permite isso é representada no PLA por um par de linhas no OR.
Resultado
Então, obtivemos o resultado final e agora podemos escrever o código HDL completo para o chip PLA do computador C128. Para isso estarei usando Verilog. Considerar. que este é meu primeiro código Verilog, portanto, pode não ser o ideal. Usar uma trava D para um pino geralmente é considerado uma prática ruim em Verilog, mas, neste caso, estou replicando a lógica e a funcionalidade do chip acabado.
Eu verifiquei se possível, mas se estiver faltando alguma coisa, por favor denuncie!
Ao contrário do PLA C64, o chip PLA C128 não pode ser substituído apenas por uma EPROM ou algo semelhante devido à presença de travas de saída.
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
Qual é o próximo
O próximo chip analisado será o chip MMU do computador C128, que levará muito mais tempo para funcionar, porque não é apenas PLA comum.
Veja também: