Ano 1 · Ano 2 · Ano 3 · Ano 4 · Ano 5 · Ano 6 · Ano 7 · Ano 8 · Ano 9
Tópicos › Quarto ano › Engenharia reversa do teclado Technics KN5000
O assunto que mais ocupou o grupo foi o projeto de Felipe "Juca" Sanches de emular no MAME o teclado Technics SX-KN5000. O trabalho começou com a dessoldagem das mask ROMs e um driver preliminar do KN1500. Depois Felipe decifrou a compressão do arquivo de atualização, mapeou o hardware a partir do firmware e do service manual e extraiu a ROM de dados rítmicos pela função de backup em disquete. Para estudar o código, corrigiu o disassembler TLCS900 do MAME e iniciou o port do GNU binutils para a CPU.
Quarto ano: novembro de 2020 a outubro de 2021
Felipe treinou dessoldagem e encomendou soquetes SOIC44 para ler no TL866CS as mask ROMs dessoldadas pelo técnico Ronaldo Verardo. Depois analisou a ROM de boot da sub-CPU, que fica em barramento separado e para cujo encapsulamento ele não encontrou adaptador. Fez ainda o dump da ROM de dados rítmicos pelo backup em disquete e comprou uma placa-mãe de reposição.
Felipe "Juca" Sanches comprou um soprador de ar quente e passou a treinar a dessoldagem de CIs em placas de sucata; L. e FTMaciel comentaram ferramentas de dessoldagem. Ele encomendou soquetes SOIC44 com adaptadores para DIP, para ler no TL866CS as mask ROMs dessoldadas da placa principal do teclado Technics SX-KN5000 (duas CPUs Toshiba TLCS-900/H, dois DSPs, LCD colorido e drive de disquete), cujo service manual foi compartilhado. Felipe explicou que núcleos de CPU menos usados no MAME, como o TLCS-900, tendem a estar incompletos para novos firmwares. Ele também buscou o service manual do KN1500 no elektrotanya, que estava com defeito e voltou a funcionar dias depois.
Felipe "Juca" Sanches mostrou o vídeo da dessoldagem das ROMs do KN5000 feita por Ronaldo Verardo, o técnico de quem comprou o teclado. O grupo discutiu se o material sob os CIs era cola ou fluxo; Ronaldo explicou que é cola, necessária porque a solda é feita por onda, e mostrou a ponteira que fez com fio rígido. Também se comentou o gerador de som "Dynamic PCM" do teclado.
Pelo diagrama de blocos do manual de serviço, Felipe "Juca" Sanches concluiu que a mask ROM de 1 Mbit da sub-CPU, que controla DSPs e o gerador de tons, fica em um barramento separado, inacessível pela CPU principal. Como alternativa, considerou ler o chip diretamente ou modificar a parte do programa da sub-CPU guardada em flash. Citou também o raro módulo opcional de disco rígido HDAE5000.
Felipe "Juca" Sanches alterou no firmware o ponteiro dos "factory settings" para outra região. Depois de restaurar as configurações de fábrica e gravar um backup, o disquete passou a conter a memória apontada. Assim descobriu que a flash fica espelhada em 0xC00000 e fez o dump da ROM de dados rítmicos (1 MB). Depois disso o teclado ficou sem som mesmo com a imagem original reinstalada; Felipe apontou como possível causa ter alterado o mapeamento do chip select /CS2.
Felipe "Juca" Sanches compartilhou uma planilha e analisou a mask ROM de boot da sub-CPU, compatível pino a pino com uma M27C1001 e alimentada a 5 V. O encapsulamento parece ser TSSOP32, e ele não encontrou adaptador para o leitor.
Felipe "Juca" Sanches comprou outra placa-mãe de KN5000 como reposição. Para fazer emulação de alto nível dos microcontroladores do painel de botões, propôs capturar o protocolo serial com uma rotina residente instalada no vetor de interrupções. Ismael Luceno sugeriu o Bus Pirate, e Felipe abriu uma enquete sobre as mensagens do projeto.
Como preparação para o KN5000, Felipe esboçou um driver do Technics KN1500 no MAME, explicou a mudança de licença do MAME e escaneou o LCD do aparelho, com todos os segmentos acesos por um Arduino, para criar um layout SVG.
Felipe "Juca" Sanches esboçou um driver de emulação do teclado Technics KN1500 no MAME, ainda sem funcionar, como preparação para o KN5000. Flávio Amieiro sugeriu um vídeo explicando um driver do MAME. Felipe indicou sua palestra do FISL15 e explicou a mudança de licença do MAME: antes a licença proibia uso comercial; hoje o núcleo é BSD-3-clause e código GPL é aceito apenas em drivers.
Felipe "Juca" Sanches observou que a variante da CPU do KN5000 (barramento de 32 bits) provavelmente ainda não existe no MAME. Ele programou um Arduino para acender todos os segmentos do LCD do Technics SX-KN1500, escaneou o display e está vetorizando a imagem para criar um layout SVG para o MAME.
Com sugestões de RicBit, Felipe decodificou o formato comprimido do arquivo de atualização: um byte-mapa indica dados crus ou referências a um buffer circular de 4 KB. Ele publicou o descompressor em Python, localizou gráficos da interface no firmware e criou o repositório kn5000_homebrew. Um membro da comunidade MAMEDev observou que o algoritmo é quase idêntico ao LZSS, o que Felipe associou à assinatura "SLIDE4K" do cabeçalho.
Felipe "Juca" Sanches pediu ajuda a RicBit para identificar a compressão do arquivo de instalação de sistema do teclado Technics SX-KN5000 (Kn5kv10.img), no qual apareciam fragmentos de strings. RicBit sugeriu LZ77/LZ78 e explicou as diferenças, e Felipe começou a decodificar exemplos como "FOOT CONTROLLER". O objetivo era descomprimir o arquivo para estudar o código e obter mais informações sobre o hardware.
Felipe "Juca" Sanches alterou uma string no arquivo de update e o instalou no teclado, mostrando que o processo não valida checksum. Depois descreveu o formato: um byte-mapa indica se os próximos dados são crus ou referências de 2 bytes a trechos de um buffer circular de 4 KB. Em 27/07 publicou o script em Python que descomprime o arquivo HKMSPRG.SLD; a CPU do aparelho é a Toshiba TLCS900H.
Com o firmware descomprimido, Felipe "Juca" Sanches localizou com o binxelview gráficos da interface (FADE IN/OUT, logotipo Technics, diagramas MIDI) e criou o repositório kn5000_homebrew. Um membro da comunidade MAMEDev observou que o algoritmo é quase idêntico ao LZSS, e Felipe associou a isso a assinatura "SLIDE4K" do cabeçalho. A recompressão com o pacote lzss do PyPI deixou os instrumentos com mensagem de erro e o teclado sem som; Felipe notou que o pacote inicializa o buffer com espaços (0x20) e não com zeros, mas a imagem modificada ainda saía corrompida.
No debugger do MAME, Felipe identificou um controlador compatível com VGA. Também localizou a imagem da flash no espaço de endereçamento e analisou o boot, o vetor de interrupções e a comunicação por micro-DMA entre as duas CPUs. Publicou o branch do MAME com os drivers do KN1500 e do KN5000 e corrigiu o disassembler TLCS900 para os registradores de DMA da TLCS-900/H2.
No debugger do MAME, Felipe "Juca" Sanches reconheceu no firmware do KN5000 acessos às portas 3C4/3C5 e 3C8/3C9 típicos de VGA e encontrou a inicialização da paleta de 8 cores básicas. O esquemático confirmou o sinal VGA.IOCS, com as portas mapeadas a partir de 0x170000. Ele também documentou os chip selects de disquete, HDD opcional e porta paralela.
Felipe "Juca" Sanches alterou a paleta de cores do teclado e escreveu em assembly TLCS900H uma inicialização de modo texto VGA baseada no DOSBox, que resultou em tela preta; passou então a consultar o livro de Ferraro. Buscando instruções ret separadas pela distância entre duas rotinas conhecidas, concluiu que o conteúdo da flash corresponde aos primeiros 2 MB do arquivo descomprimido, mapeados no topo do espaço de endereçamento da CPU, e encontrou o ponto de entrada da CPU principal.
Felipe "Juca" Sanches estava transcrevendo as tabelas de SFRs das quatro variantes de TLCS900 suportadas pelo MAME e analisou o código de boot do KN5000 (watchdog, portas de I/O, timers, chip selects), chegando ao mapa de memória. Levantou a hipótese de que o boot ocorre pela "table data ROM", da qual tinha apenas metade do dump, e implementou de forma preliminar timers, interrupções, seriais e ADC no emulador.
A emulação travava num loop que espera variáveis alteradas por rotinas de interrupção. Felipe "Juca" Sanches explicou o vetor a partir de 0xFFFF00 (entry point 0xEF03C6) e listou, cruzando com o datasheet, os endereços de cada rotina de tratamento a implementar. Ele também publicou seu branch do MAME com a emulação em andamento dos teclados KN1500 e KN5000. RicBit comentou que esse tipo de loop é comum em jogos de Master System.
Felipe "Juca" Sanches recuperou o teclado: o problema era um disquete de instalação corrompido, e uma cópia gerada com dd a partir da imagem oficial resolveu. Em seguida analisou a rotina da INT0 (0xEF3525), que lê o registrador de comunicação com a sub-CPU em 0x140000 e dispara micro-DMA no canal 0. Na rotina de fim desse DMA, os 3 bits altos do byte recebido indexam uma jump table em 0xE00012.
Felipe "Juca" Sanches encontrou um bug no disassembler do MAME na instrução LDC para registradores de controle de micro-DMA. Pelo manual do compilador Toshiba, viu que a TLCS900/H2 usa endereços de registradores diferentes; compilou código C com o compilador proprietário para obtê-los e corrigiu o disassembler. Com isso identificou a rotina que configura os canais DMA 0 e 2 entre as CPUs e planeja substituir aos poucos o código original por implementações próprias em C.
Depois de considerar as opções levantadas pelo grupo (o compilador oficial da Toshiba, encontrado por Leonardo Roman, o libcpu e o sdcc), Felipe começou o port do GNU binutils para o TLCS900, a começar pelo disassembler, que compara com o do MAME. Ele pausou a engenharia reversa do teclado para fazer esse toolchain e, depois de uma pane de HD, concluiu que precisa documentar melhor o trabalho em público.
Em busca de um compilador ou assembler para TLCS900, Leonardo Roman encontrou no Internet Archive o compilador oficial da Toshiba, e RicBit sugeriu o libcpu, que Felipe "Juca" Sanches avaliou como aparentemente abandonado e que não compilou para ele. Ismael Luceno sugeriu o sdcc, que segundo Leonardo Roman suporta apenas o TLCS90. Felipe retomou a ideia de 14 anos antes (tlcs900archc) e iniciou o port do GNU binutils, começando pelo disassembler, como passo para o assembler e um futuro port do GCC.
Felipe "Juca" Sanches mostrou o disassembly do objdump de seu port do binutils lado a lado com o do MAME. Por ora o disassembler mostra os SFRs apenas por endereço numérico, e o próximo foco é o assembler.
Respondendo a kretcheu, que pediu notícias, Felipe "Juca" Sanches relatou commits que implementam o disassembly de mais instruções da CPU do teclado, embora ainda faltasse muito para terminar o assembler e o código tivesse muita repetição. Quando L. sugeriu um link do Hackaday que talvez ajudasse com o teclado, Felipe disse que tinha pausado a engenharia reversa do teclado para fazer o toolchain da CPU dele, que pretende usar para escrever código e inspecionar o funcionamento do teclado sem digitar opcodes num editor hexadecimal.
Felipe "Juca" Sanches explicou que implementa o disassembler do TLCS900 no binutils usando a tabela de opcodes do datasheet e compara a saída com o disassembler do MAME, testando com a ROM de boot do KN5000. Disse que deduziu o mapa de memória juntando o esquemático do service manual com a rotina de boot que configura os chip selects; por enquanto o driver usa um mapa estático. O teclado custava 5 mil reais em 1996.
Felipe "Juca" Sanches contou que uma pane no HD do notebook fez o histórico do shell voltar três semanas; o código estava em git público. Uma imagem postada antes no grupo lembrou a ele o comando de disassembly com binutils, e ele concluiu que precisa documentar melhor seu trabalho num lugar acessível ao público.
Felipe explicou a Shideravan o hardware do teclado e o estado do driver, disse que provavelmente usaria o KN5000 como controlador MIDI durante o desenvolvimento e considerou o SerenityOS como base de um sistema livre para o teclado, concluindo que talvez seja melhor fazer um do zero.
Felipe "Juca" Sanches explicou o projeto: o driver incompleto do KN5000 no MAME fica no branch technics_keyboards e ainda mostra tela preta, enquanto ele porta as ferramentas GNU (binutils, talvez o gcc) para o TOSHIBA TLCS900. O teclado tem duas CPUs TOSHIBA (uma para a interface e os periféricos, outra para o som), dois DSPs, um gerador de som custom, um controlador de disquete e um controlador VGA; o service manual traz o circuito completo. Também comentou drivers de teclados Ensoniq no MAME e a tentativa de emular o GranTrak10. Shideravan lembrou que a CPU é usada no Neo Geo Pocket, e Felipe disse esperar que o toolchain ajude o homebrew desse console.
Ismael Luceno compartilhou o FPGASID, reimplementação do SID em FPGA, uma das poucas com os filtros em analógico. Shideravan perguntou por um teclado só de entrada para o PC, e os participantes indicaram controladores MIDI USB. Felipe "Juca" Sanches sugeriu usá-los com os drivers de teclados do MAME, disse que provavelmente usaria o próprio KN5000 como controlador MIDI durante o desenvolvimento do driver e contou que comprou o teclado no Mercado Livre, junto com um segundo quebrado para dumpar as ROMs.
Felipe "Juca" Sanches encaminhou uma mensagem de L. com o PR que adiciona suporte a skins do WinAmp ao SerenityOS, começou a compilar o sistema e perguntou se ele poderia servir de base para um sistema livre no KN5000. L. respondeu que o SerenityOS roda em x86/x64, com port para ARM começando, e perguntou se a CPU do teclado tem MMU. Felipe concluiu que talvez seja melhor fazer do zero, mas que é cedo para pensar nisso.