tkmem128-ii

Public

@lrrosa

Share tkmem128-ii

Check access before sharing the link.

Who can open this board

Anyone can open this board. No sign-in is required.

This link opens the latest version. Copying it does not grant additional access.

Loading 3D model… large boards can take a moment.

README

TKMEM-128 II

conferidores

Expansão externa de 128 KB (ou 512 KB) de RAM paginada no padrão ZX Spectrum 128 para TK90X, TK95 e ZX Spectrum 48K. Redesenho completo em KiCad 10, com arquivos de fabricação prontos.

O nome vem da placa brasileira que originou este redesenho, mas o circuito é do Velesoft e nasceu para o ZX Spectrum 48K. A adaptação de 2012 ao TK usava um contato que no Spectrum carrega vídeo; aqui isso foi corrigido, e a placa voltou a servir nas duas famílias. Ver Compatibilidade.

Estado: placas fabricadas e conferidas eletricamente, ainda não montadas. ERC e DRC estão zerados, a netlist foi conferida contra a intenção de projeto, e as duas placas voltaram da fábrica em setembro de 2026 com todas as ilhas aprovadas no teste de continuidade. O que ainda não foi feito: montar os componentes e ligar num micro real. Antes de mandar fabricar, leia docs/ANTES-DE-FABRICAR.md — há itens que dependem de medir peças físicas.

O conector de borda é o TE/AMP 5645235, de entrada vertical. As cotas do footprint saíram do desenho de cliente e estão no datasheet arquivado, mas ninguém montou a peça ainda.


Este projeto é uma derivação

Ele não inventa o circuito: junta e redesenha dois trabalhos anteriores.

OrigemAutorO que veio de lá
external 128kb upgrade (zx48_to_128-EASY_3), 2009Velesoft (Pavel Cimbal, República Tcheca)O circuito base: as equações do GAL20V8, o latch da porta 0x7FFD e o esquema de paginação da SRAM, incluindo a extensão de 512K
TKMEM-128, 2012Luccas Eletrônica (Eduardo Luccas, Brasil)A adaptação ao TK90X/TK95: soquete de EPROM com a ROM do Spectrum 128, jumpers de seleção de ROM, a auto-desativação da RAM interna de 32K por um pino livre do barramento, e a divisão em placa principal + expansor

Créditos também a Flávio Matsumoto, que sugeriu o circuito do Velesoft para os TKs e identificou a caixa Patola PB 085/3, e a Daniel Jose Viana (danjovic), cujo trabalho documentou as cotas da placa para essa caixa.

E a goloskokovic/zx16to128upgrade, que redistribui o material do Velesoft com o crédito devido. De lá vieram duas coisas que não estavam aqui: os pontos de desativação da RAM interna num ZX Spectrum 48K, por Issue de placa-mãe (ver docs/PREPARAR-O-TK.md), e os arquivos da variante EASY_6b, que permitiram comparar as duas versões do circuito original (ver docs/VELESOFT-EASY3-x-EASY6B.md). Nenhum desses dois foi verificado em bancada por nós.

Este redesenho é distribuído sob CERN-OHL-S v2 (ver LICENSE.txt), uma licença fortemente recíproca: quem fabricar, modificar ou distribuir precisa disponibilizar as fontes das modificações sob a mesma licença.


O que a placa faz

O ZX Spectrum 128 difere do 48K em três coisas: 128K de RAM em 8 bancos de 16K, o chip de som AY-3-8912, e o espelhamento da memória de vídeo ("shadow video"). Esta placa entrega a primeira. O som AY exige interface separada; o shadow video é inviável numa interface externa, porque exigiria interceptar a RAM baixa da ULA dentro do micro.

Na prática a grande maioria dos jogos de 128K funciona — a exceção são os poucos títulos que dependem do shadow video.

Mapa de memória

FaixaQuem responde
0x0000-0x3FFFROM — a interna do micro, ou a 27C256 da placa (jumper)
0x4000-0x7FFFRAM baixa interna do micro (memória de vídeo da ULA). Não é decodificada aqui
0x8000-0xBFFFSRAM externa, banco 2 fixo
0xC000-0xFFFFSRAM externa, banco selecionado pela porta 0x7FFD

Como a SRAM externa cobre 0x8000-0xFFFF, os 32 KB superiores de RAM interna precisam ser desativados — é a única alteração necessária dentro do micro, e a única coisa que difere entre TK e ZX Spectrum. Veja docs/PREPARAR-O-TK.md.

Sobre a variante EASY_6b do Velesoft. Circula junto com a nossa em outros repositórios, e é fácil confundir com uma versão melhor. Não é: a serigrafia da placa dela diz MEMORY UPGRADE FOR ZX 16. É para um Spectrum de 16 KB, onde a RAM inteira vem de fora — por isso as equações dela também decodificam 0x4000-0x7FFF. Este projeto deriva da EASY_3; a comparação completa, incluindo a conferência do nosso esquemático e do nosso layout contra os do Velesoft, está em docs/VELESOFT-EASY3-x-EASY6B.md.

Porta 0x7FFD

Um 74HCT273 latcheia o barramento de dados quando o GAL detecta a escrita na porta (A15=0, A5=1, A1=0, /IORQ e /WR ativos):

BitSinalFunção
0–2BANK0..BANK2Banco de RAM em 0xC000
3VRAMShadow screen — latcheado, sem uso nesta arquitetura (disponível em TP1)
4ROMA14Seleciona a metade da 27C256
5DIS128Trava a paginação até o reset
6–7BANK3..BANK4Extensão 512K (só no modo ZX512)

A trava do bit 5 é elegante: DIS128 entra na equação do clock do latch (CLK7FFD = ... + DIS128), então ao ser setado o clock fica preso em nível alto e o latch nunca mais é acionado.


Compatibilidade

TK90X, TK95 e ZX Spectrum 48K. Não é uma promessa vaga: reduz-se a uma regra que dá para verificar.

O barramento de expansão é o mesmo conector de 2×28 nas duas famílias, mas nove contatos não carregam a mesma coisa em cada uma. Enquanto a placa não tocar nenhum deles, ela serve nas duas:

ContatoNo TK90X/TK95No ZX Spectrum 48K
4+9 VUSS
7N.C.GND
15GNDsinal
16, 17, 18livresY, V e U do vídeo componente
34, 3512 Vdifere
37+5 V−5 V

Esta placa liga 34 dos 54 contatos, e nenhum é dessa lista. Alimentação sai dos contatos 3 (+5 V), 6 e 14 (GND), que são iguais nas duas máquinas.

A verificação é automática, para a afirmação não envelhecer:

python tools/confere_compatibilidade.py

Ele cruza a lista de divergências de busdef.py com os contatos que a netlist realmente usa, e falha se algum aparecer.

⚠️ O que ainda é específico de cada máquina: desativar a RAM interna de 32 KB. Isso não é opcional — sem desativar, a memória do micro colide com a SRAM externa em 0x8000-0xFFFF. No TK é um fio do contato 29 ao pino 10 do IC27; num Spectrum o ponto é outro e depende da Issue da placa-mãe — os dois procedimentos estão em docs/PREPARAR-O-TK.md. Num Spectrum a placa não aciona nada pelo contato 29 — mas não porque o contato seja diferente: ele é N.C. nas duas máquinas. É porque o procedimento publicado para o Spectrum amarra o pino do mod ao +5 V do próprio CI, sem trazer fio até o conector. Levar o truque do TK para lá é a mesma topologia, e esbarra numa diferença elétrica — analisada aqui.

Não montamos a placa num Spectrum: a compatibilidade acima é do barramento, conferida contato a contato, não de bancada — e o ponto interno do Spectrum vem de terceiros, também não verificado por nós.


As duas placas

A placa de componentes fica em pé dentro da caixa. O conector de borda é soldado diretamente nela — e como esse conector é de entrada vertical (a placa que entra fica perpendicular à que segura o conector), a fenda dele cai no plano horizontal e recebe a placa do micro.

Os terminais do conector são retos e atravessam a placa, sobrando ~3,18 mm do outro lado em duas fileiras a 4,85 mm. A tira de expansão entra entre essas fileiras — uma passa por cima dela, a outra por baixo — e é soldada dos dois lados. Ela não tem conector nenhum: ilhas de solda nas duas faces de um extremo, dedos de borda no outro.

O conector fica fora da caixa Patola, atravessando o recorte que se abre na frente dela. Não é escolha estética: no TK e no ZX Spectrum a abertura EXPANSION é recuada dentro da carcaça, então a caixa encosta na traseira do micro e só o conector entra. A placa, por sua vez, assenta rente ao fundo da caixa.

No conector, 1..28 fica na fileira de baixo (junto à aresta inferior da placa), igual à fileira inferior da placa do micro; 29..56 fica do lado de dentro. É a mesma convenção no TK e no ZX Spectrum, onde essas fileiras são chamadas de B e A.

⚠️ O lado dos componentes tem que ficar virado para a tira de expansão, nunca para o lado do conector. Ao contrário, a placa dentro da caixa esbarra no micro e não encaixa direito. Na prática o conector de borda é o único componente do lado do cobre: entra por baixo e é soldado por cima.

PlacaArquivoConteúdo
Principalhardware/tkmem128-ii.kicad_proGAL20V8B, 74HCT273, SRAM DIP-32, EPROM 27C256, 3 jumpers, desacoplamento e o conector de borda
Tira de expansãohardware/expansor/Ilhas de solda nas duas faces de um lado, dedos de borda do outro — nenhum componente, só o fio de terra W1

A placa principal é de 4 camadas; a tira de expansão, de 2.

CamadaPlaca principalTira
F.Cusinal27 retas de 1,5 mm (pinos 29..56)
In1.Cuplano de GND inteiro—
In2.Cuplano de +5V inteiro—
B.Cusinal27 retas de 1,5 mm (pinos 1..28)

Como todos os componentes são passantes, cada ilha de +5V e de GND toca o seu plano direto: não há uma única trilha de alimentação nas faces de sinal, e nenhuma via serve só para alimentação. Sinal de 0,5 mm, isolação de 0,2 mm, 21 vias, e nenhum fio de ligação.

O furo grande no topo é o H1, e ele não é furo de parafuso: por ali passa a torre de fixação da caixa Patola, que tem Ø5 externo e nasce do fundo da tampa. O parafuso da caixa corre dentro da torre e nunca toca a placa — H1 serve para localizar, não para apertar.

O conector é passante e é usado pelos dois lados — por baixo entra o conector, por cima solda a tira —, então a numeração dele está serigrafada nas duas faces.

O verso é o manual da placa. Traz as três tabelas de jumper, a função do R4 e a licença — na bancada, com um shunt na pinça, isso vale mais que este README.

A tira é soldada dos dois lados, então cada face traz a numeração dos seus pinos: 29..56 na frente, 1..28 no verso.

E fabricadas

Primeira tiragem, setembro de 2026. Todas as ilhas passaram no teste de continuidade — as placas ainda não foram montadas nem ligadas num micro.

O verso cumpriu o que o render prometia: as três tabelas de jumper e a nota do R4 ficam legíveis a olho nu com a serigrafia de 1,2 mm — que é o ponto de tê-las na placa em vez de só aqui.

A tira mostra os dois itens do formulário que não viajam nos gerbers (item 0 do ANTES-DE-FABRICAR) tendo saído certos: os dedos vieram com ENIG e com o chanfro de 45°. O entalhe na borda de baixo, à direita do centro, é o rasgo da guia — aprofundado de 5,0 para 7,0 mm depois da conferência em papel.


O que mudou em relação ao original

MelhoriaMotivo
Passagem do barramento (dedos de borda na expansora)O original ocupava o barramento; agora dá para encadear outros periféricos
Desacoplamento por CI (100 nF em cada um) + 10 µF de reservatórioO original tinha desacoplamento mínimo
4 camadas com planos de GND e +5V inteirosAlimentação sem uma única trilha nas faces de sinal, retorno de corrente curto e imunidade a ruído. O original era de 2 camadas
Jumper JP2 com duas estratégias de ROMCSO ROMCS do barramento é ativo em nível alto para desligar a ROM interna, o oposto da saída /ROMCS do GAL. É a explicação mais provável para a ROM 128 do original "funcionar num TK e não em outro". JP2 permite escolher entre acionar pelo GAL ou fixar em nível alto (como fazem os cartuchos da Interface 2), com R5 em série
Auto-desativação sem jumper nenhumA original usava o pino 17, livre no TK mas V do vídeo componente no ZX Spectrum — daí o jumper e o aviso de que a posição errada danifica o micro. Aqui o sinal vai pelo pino 29, que é N.C. nas duas máquinas, então o pull-up é permanente e JP4 deixou de existir. Ver a análise
GAL com .jed pronto e verificadoO usuário não precisa montar nada: o .jed distribuído é gerado das equações deste projeto e conferido fusível a fusível contra o mapa de referência (checksum C5752, zero divergências)
Degrau zero na corrente de periféricosA tira de expansão solda nos terminais do próprio conector, ficando coplanar com a placa do micro. O periférico seguinte entra no mesmo plano, sem escadinha
Bit N da porta 7FFD no flip-flop NO original embaralhava as entradas do latch; aqui a ordem é natural e o esquemático se lê sozinho
Endereços e dados da EPROM 1:1Obrigatório (o conteúdo da ROM é fixo) e documentado
Pontos de teste (VRAM, CLK7FFD)Para depurar sem grampear em perna de CI
LED de energia (opcional)Diagnóstico imediato
Peças em produção na BOMAS6C1008 e ATF20V8B no lugar de peças só encontráveis como estoque antigo

Configuração dos jumpers

JumperPosiçãoEfeito
JP1 SELECIONA ROM1-2ROM 128: a EPROM da placa responde em 0x0000-0x3FFF
2-3ROM interna: EPROM desligada (padrão)
JP2 ROMCS BARRAMENTOabertoUsa a ROM interna do micro (padrão)
1-2Aciona ROMCS pelo GAL (comportamento da placa original)
2-3Fixa ROMCS em nível alto (estilo Interface 2)
JP3 ZX128/ZX512aberto128K — SRAM AS6C1008 (padrão)
fechado512K — SRAM AS6C4008

Esta tabela está serigrafada no verso da placa, uma por jumper, com as mesmas palavras — ver o render do verso acima.

⚠️ JP1 em 1-2 sem JP2 não faz nada útil: sem desligar a ROM interna, os dois chips disputam o barramento de dados. Use os dois juntos ou nenhum.

A auto-desativação da RAM não tem jumper. R4 mantém o pino 29 em nível 1 permanentemente, e esse pino é N.C. tanto no TK quanto no ZX Spectrum. Num Spectrum a placa não faz nada ali; num TK, com o fio interno do pino 29 ao pino 10 do IC27, ela desliga os 32 KB. Nada a configurar.


Lista de material

Placa principal

RefValorEncapsulamentoObservação
U1GAL20V8B, ATF20V8B-15PC ou PALCE20V8HDIP-24 300 milGrave hardware/gal/tkmem128.jed — peças equivalentes em hardware/gal
U274HCT273DIP-20 300 milLatch da porta 7FFD
U3AS6C1008-55PCN (128K×8)DIP-32 600 milOu AS6C4008-55PCN (512K×8) no modo ZX512 — outras peças servem, ver equivalentes
U427C256DIP-28 600 milOpcional — ver seção da ROM
R2, R41 kΩaxial, vertical
R50 Ωaxial, verticalFio; 100–470 Ω se houver disputa no ROMCS
R32,2 kΩaxial, verticalOpcional (LED)
C1–C5100 nF cerâmicodisco 5 mm, passo 5 mm
C610 µF eletrolíticoradial 5 mm, passo 2 mm
D1LED 3 mmOpcional
JP1, JP2header 1×3passo 2,54 mm
JP3header 1×2passo 2,54 mm
J1TE/AMP 5645235 — conector de borda 56 vias, entrada verticalpasso 2,54 mm, fileiras a 4,85 mmÚnico componente do lado do cobre; recebe os dedos do micro
—soquetes torneados DIP-20/24/28/32Recomendado

Equivalentes para U3 (a SRAM)

O projeto não depende de um fabricante. Serve qualquer SRAM 128K×8 de 5 V em DIP-32 na pinagem JEDEC de 1 Mbit — que é a pinagem padrão dessa família: /CS1 no 22, /OE no 24, /WE no 29, CE2 no 30, VCC no 32, GND no 16.

PeçaFabricanteSituação
AS6C1008-55PCNAllianceDa BOM — ainda em produção, a mais fácil de achar nova
HM628128A (ex.: HM628128ALP-7)HitachiDescontinuada; comum como estoque antigo
TC551001ToshibaDescontinuada
KM681000SamsungDescontinuada
CY62128Cypress
IS61C1024 / IS62C1024ISSIO 1024 é 1024 kbit = 1 Mbit, não 1 M×8

⚠️ Uma 62256 não serve. É 32K×8 (256 kbit) em DIP-28 — outra capacidade e outro encapsulamento. A confusão é fácil porque a numeração parece próxima.

A única divergência real entre essas peças é o pino 30, e vale conferir no datasheet da que você comprou:

Pino 30Funciona?
CE2 / CS2, ativo altoSim — é o caso da AS6C1008
NC, não conectadoSim — o sinal é ignorado e o /CS1 do pino 22 controla sozinho
A17Aí é uma 512K×8, não uma 128K — ver abaixo

Isso funciona porque /SA17 é uma saída invertida do GAL:

/SA17 = A14 * A15 * BANK3 * /ZX512

Com JP3 aberto, o pull-up põe ZX512 em alto, o produto zera e o pino 30 fica fixo em nível alto — exatamente o CE2 que a memória espera.

⚠️ Com uma 128K×8, JP3 fica aberto — sempre. Fechado por engano, o pino 30 deixa de ser nível fixo e passa a receber /SA17 paginado: toda vez que o software escrever BANK3=1 na porta 0x7FFD, o pino cai para nível baixo e desabilita a RAM em 0xC000. A falha é intermitente e depende do jogo, que é o pior tipo de falha para diagnosticar.

Velocidade é indiferente. Peças dessa família vão de 55 a 100 ns, e a 3,5 MHz há mais de 500 ns entre o endereço ficar válido e o Z80 amostrar o dado. Até a mais lenta sobra.

Procedência importa mais que velocidade. As descontinuadas circulam como estoque antigo e SRAM antiga é alvo comum de remarcação. Se o preço for parecido, prefira a peça em produção.

No modo 512 KB

Aí a peça tem que ser uma 512K×8 de verdade — AS6C4008, HM628512, TC554001, IS61C4008 — porque o pino 30 passa a ser A17 e o pino 1, A18. E JP3 fecha. Ver Modo 512 KB.

Tira de expansão

Não leva componente nenhum, nem conector: os "conectores" são cobre da própria PCB, e o único item a soldar além das ilhas é um pedaço de fio.

RefO que éObservação
J1Ilhas de solda nas duas faces, até a bordaSolda nos terminais retos do conector da placa principal, por cima e por baixo
J2Dedos de bordaPassagem do barramento ao próximo periférico
W1Fio isolado curtoLiga as duas ilhas GND - FIO ISOLADO no verso (pinos 6 e 14); passa por cima das trilhas, por isso isolado

Montagem

Guias detalhados:

Dois pontos que costumam pegar quem monta:

  1. A guia do conector de borda. O conector de 56 vias vem sem guia. Na posição 5/52 você encaixa um pedacinho de PCB (ou material equivalente) casando com o rasgo entre os dedos do TK — a placa não tem furos ali, porque não há terminal nessa posição. Sem a guia é fácil plugar deslocado e danificar o micro.
  2. A tira de expansão é soldada dos dois lados. Ela entra entre as duas fileiras de terminais retos do conector — uma fileira por cima, outra por baixo — e as ilhas chegam até a borda, então o terminal encontra cobre mesmo se for curto.

Fabricação

Arquivos prontos em production/: Gerber X2, furação Excellon, BOM e mapa de posições, para as duas placas.

Cada placa tem o seu gerbers.zip, que é o arquivo que se envia à fábrica.

Placa principalTira de expansão
Camadas4 (F.Cu / GND / +5V / B.Cu)2
Espessura1,6 mm1,6 mm
Trilha0,5 mm1,5 mm
Isolação0,2 mm0,25 mm
Furo mínimo0,3 mm— (sem furos)
Via0,8 mm com furo de 0,4 mmnenhuma
Furo não metalizado1 × Ø5,4 (H1, passagem da torre da caixa)nenhum

Tudo folgado dentro da capacidade padrão de fábrica barata — nada aqui entra em faixa de preço especial, a não ser as 4 camadas da placa principal.

⚠️ Peça 4 camadas para a placa principal. Se pedir 2 por engano, a fábrica descarta os dois planos internos e a placa sai sem alimentação nenhuma — falha que não aparece na inspeção visual. Ver ANTES-DE-FABRICAR, item 3b.

A tira de expansão precisa de acabamento em ouro (ENIG) na placa inteira e chanfro de 45° na borda dos dedos. Os dedos entram e saem do conector do periférico seguinte muitos ciclos, e as ilhas de solda do outro extremo também chegam à borda — HASL descasca nos dois casos. Peça o chanfro explicitamente, é um item à parte no pedido.


Gravando o GAL

Já vai pronto: grave hardware/gal/tkmem128.jed direto no programador. Checksum de fusíveis C5752 — confira no software do gravador ao abrir o arquivo.

Esse .jed não foi copiado de lugar nenhum: é gerado por tools/galgen.py a partir das equações deste projeto, e conferido fusível a fusível contra o mapa de referência do projeto do Velesoft — zero divergências em 2706 fusíveis. O fonte em sintaxe GALasm está em tkmem128.pld para quem quiser modificar.

Programadores XGecu (T48/T56) gravam GAL20V8B, ATF20V8B e PALCE20V8H — mas escolha no software o dispositivo que você tem de verdade: o mapa de fusíveis é o mesmo, o algoritmo de gravação não.


A ROM do Spectrum 128

A imagem da ROM não está neste repositório — ela é copyright da Amstrad/Sky. O hardware (soquete U4 + jumpers) está lá; a imagem você monta com as suas cópias de 128-0.rom e 128-1.rom:

cat 128-0.rom 128-1.rom > rom_tkmem128_27c256.bin

A ordem importa: A14 da EPROM vem de ROMA14 (bit 4 da porta 7FFD), então a ROM 0 (editor do 128) tem que ficar na metade baixa.

Vale dizer que a ROM é dispensável: o autor da TKMEM-128 original deixou de fornecê-la depois de constatar que os jogos de 128K não dependem dela, e que ela causava incompatibilidades entre unidades diferentes de TK90X.


Estrutura do repositório

hardware/
  tkmem128-ii.kicad_pro/.kicad_sch/.kicad_pcb   placa principal
  expansor/                                   tira de expansão
  lib/                                        símbolos e footprints próprios
  gal/                                        fonte e documentação do GAL
production/
  placa-principal/                            gerbers, furação, BOM, posições, PDF
  tira-expansao/                            idem
docs/
  PREPARAR-O-TK.md   MONTAGEM.md   ANTES-DE-FABRICAR.md
  VELESOFT-EASY3-x-EASY6B.md                  comparação com a variante do autor original
  relatorios/                                 saídas de ERC e DRC
tools/                                        geradores do projeto KiCad

A biblioteca de símbolos e footprints é local ao projeto — nada depende da versão das bibliotecas do seu KiCad.

O projeto KiCad nasceu gerado por script a partir de uma descrição única da netlist (tools/) — é o que garante que esquemático e placa não divergem — e depois foi refinado à mão no KiCad. A fonte corrente são os arquivos em hardware/; os geradores ficam como registro e ferramenta de apoio.

Estado da verificação

PlacaERCDRCLigações
Principal00 erros (6 avisos cosméticos)0 pendentes
Tira de expansão00 erros (4 avisos cosméticos)0 pendentes

A netlist exportada pelo KiCad foi comparada nó a nó com a intenção de projeto nas duas placas: 74 nets na principal e 53 na tira, zero divergência.


Licença

Hardware sob CERN-OHL-S v2 — ver LICENSE.txt.

Copyright Leonardo Rosa e contribuidores.
Derivado de: "external 128kb upgrade" (Velesoft, 2009)
             TKMEM-128 (Luccas Eletrônica, 2012)

Este código-fonte é licenciado sob CERN-OHL-S v2 ou posterior.
Você pode redistribuí-lo e modificá-lo nos termos dessa licença.
Distribuído SEM QUALQUER GARANTIA, incluindo as de COMERCIALIZAÇÃO,
ADEQUAÇÃO A UM FIM ESPECÍFICO E NÃO-VIOLAÇÃO.
Consulte a CERN-OHL-S v2 para os termos aplicáveis.
Comments

No comments yet. Be the first to ask about this board.

Ask about this board

Sign in to BoardRepo

New here? Signing in creates your account; there is no separate sign-up.