Ano 1 · Ano 2 · Ano 3 · Ano 4 · Ano 5 · Ano 6 · Ano 7 · Ano 8 · Ano 9
Tópicos › Sétimo ano › Engenharia reversa e emulação do Technics KN5000
Ao longo de todo o ano, Felipe "Juca" Sanches trabalhou no teclado Technics KN5000. O driver no MAME passou da tela preta aos primeiros gráficos e ganhou um layout do painel; o primeiro PR foi aceito, assim como outro com uma ROM antes sem dump. Felipe decodificou o formato dos disquetes de update, tijolou placas (uma delas voltou a funcionar), instalou firmware modificado e mostrou um protótipo do port da VM do Another World. No fim do ano, fez pela porta paralela o dump da Program ROM, fez também o dump da placa HDAE5000 e concluiu que o código de boot fica nas ROMs table_data.
Sétimo ano: novembro de 2023 a outubro de 2024
O driver saiu da tela preta e mostrou os primeiros gráficos (PR #11835). Recebeu depois um layout do painel desenhado em SVG e passou a acender os LEDs que indicam a versão do firmware. O primeiro PR foi aceito no MAME (#12649), e depois também o PR #12902, com uma ROM antes sem dump. Um dos mantenedores do demodb.org perguntou pelo andamento da emulação e ofereceu ajuda.
A partir do vídeo "The game that broke MAME", compartilhado por Robson França, Felipe "Juca" Sanches contou que havia voltado, duas ou três semanas antes, a implementar o driver de emulação do teclado Technics KN5000 no MAME e que o driver ainda mostrava apenas uma tela preta. Dois dias depois, informou que a emulação já mostrava uma tela acinzentada.
Felipe "Juca" Sanches anunciou que o driver do KN5000 no MAME mostrava gráficos pela primeira vez (PR #11835), com splash screens ligeiramente diferentes conforme a versão do firmware e um framebuffer de 320x240 a 8 bpp. Sobre os pixels azul-marinho estranhos na splash screen da versão 2, Pablo Vasques Bravo-Villalba sugeriu que o LCD real borrasse a imagem, Leonardo Roman sugeriu que a cor fosse originalmente outra e RicBit sugeriu uma cor transparente que mostra a borda ou um erro de off-by-one no emulador. Felipe testou deslocar a paleta em uma posição para cada lado e concluiu que não era off-by-one: as duas tentativas pioraram a imagem.
Felipe desenhou em SVG o painel do Technics KN5000, com 1280x600 px e a tela em 320x240, ajustando as cores a partir de uma foto do teclado. Publicou o desenho no repositório KN5000_MAME_artwork e começou a convertê-lo em layout do MAME, que não aceita SVG diretamente. A primeira versão já mostrava o PNG com a tela posicionada; faltava declarar LEDs e botões.
Com o layout no MAME, Felipe mostrou as luzes do painel acesas durante o boot. Ligando o teclado com três botões pressionados, os LEDs indicam em binário a versão 10 do firmware, o que confirmou que a leitura dos botões estava certa. Ele contou que tem dumps de duas versões do firmware e que pretende extrair as ROMs restantes via MIDI, que RicBit lembrou ser uma serial 8N1.
Felipe compartilhou comentários da revisão do PR #11835 do MAME, com o esqueleto inicial dos drivers de teclados Technics.
Felipe anunciou o merge do PR #12649, o primeiro do driver do teclado Technics KN5000 no MAME, numa versão enxuta para passar na revisão de código. O restante será submetido aos poucos.
Felipe compartilhou uma mensagem de um entusiasta chinês que, com outras pessoas, mantém o demodb.org, base de dados de teclados eletrônicos e suas músicas de demonstração. Ele perguntou sobre o andamento da emulação do Technics KN5000 no MAME e ofereceu ajuda com arte e documentação.
Felipe "Juca" Sanches enviou ao MAME o PR #12902, que corrige uma ROM do KN5000 que constava como sem dump. O PR foi aceito.
Felipe decodificou o formato dos disquetes de update de sistema e trocou a placa-mãe depois de corromper o firmware. Com Pedro de Medeiros, no Calango Hacker Clube, tentou sem sucesso adaptar um drive de disquete comum e instalou um Gotek, que salvou arquivos mas não instalou o update. Instalou pela primeira vez um firmware modificado sem o "Sound Name Error" e documentou a rotina de update. Tijolou duas placas, uma das quais voltou a funcionar, e passou a testar firmware por disquete dezenas de vezes por dia.
Felipe "Juca" Sanches decodificou o formato do arquivo de update de sistema do KN5000 e publicou o script que o decodifica e recodifica. Poucos minutos antes do teste com o arquivo bom, porém, danificou o mecanismo de update do seu teclado, que ficou com firmware corrompido. Ele também localizou o código da sub-CPU e começou a entender como esse código é enviado pela CPU principal durante o boot, com a ideia de escrever um programa para fazer dump da mask ROM de boot da sub-CPU. Pediu a Pedro de Medeiros e a Ramiro que verificassem a versão de firmware dos seus teclados na tela de diagnóstico, para mapear os dumps que faltam: ele não tem dump das versões 1, 2, 3 e 4, mas tem uma placa com a versão 3 ainda por dumpar. Felipe comentou com RicBit a CPU TLCS900, que descreveu como um Z80 de 32 bits a 20 MHz, usada no Neo Geo Pocket Color.
Felipe "Juca" Sanches trocou a placa-mãe do seu KN5000, que voltou a funcionar, e guardou a placa com firmware corrompido para restaurar depois. Ele comprou uma placa anunciada como de firmware versão 2, com layout diferente; segundo ele, essa placa mais antiga tinha um DSP Analog Devices ADSP-21065L, de uma família que o MAME emula em parte. Suspeitou depois que fosse de um KN6500, e o vendedor confirmou que a foto do anúncio estava errada e cancelou a venda.
Em Brasília, Felipe "Juca" Sanches e Pedro de Medeiros tentaram adaptar um drive de disquete comum ao KN5000 no Calango Hacker Clube, sem sucesso. Felipe documentou que o teclado usa os pinos reservados 4 e 6 do conector de floppy: o FD I/O, ligado à porta D, no lugar do disk change, e o FD H/D, ligado a uma interrupção. Guilherme Ranoya e Pablo Vasques Bravo-Villalba especularam sobre o motivo dessa alteração. Instalaram então um Gotek, que funcionou para salvar arquivos mas não para instalar o update de sistema. A hipótese de Felipe, sem certeza, é que o boot do teclado seja mais rápido que a montagem da imagem pelo Gotek.
De volta a São Paulo, Felipe "Juca" Sanches concluiu que o problema de MIDI visto em Brasília provavelmente se devia à chave COMPUTER, que não estaria na posição MIDI: ao mudá-la no seu teclado, o MIDI parou de funcionar. Ele instalou pela primeira vez um firmware modificado, com splash screen "Happy Hacking KN5000", sem o "Sound Name Error" da sub-CPU, o que, segundo ele, prova que o formato do update está resolvido. Também suspeitou que falhas anteriores viessem de disquetes formatados à mão, e verificou que gravar o disco com dd a partir da imagem do fabricante funciona.
Felipe localizou a rotina que desenha as mensagens da interface de update de firmware do KN5000, que são bitmaps e não strings ASCII, e, dentro dela, um trecho que lê da RAM os padrões de bits gravados pela rotina de leitura do painel de controle. Com um programa próprio carregado por arquivo RCM, descobriu um quarto combo de botões; ao religar o teclado com esse combo, a placa ficou tijolada. Em seguida simulou no MAME o buffer de estado do painel para ativar o Flash Memory Update, em HLE, porque o microcontrolador de varredura usa mask ROM. Depois trocou a mainboard e começou a mapear os bits de cada botão, com a meta de ter uma demo para a Tosconf de 23/março.
Felipe tijolou uma segunda placa do KN5000. O update de firmware ainda funcionava, mas o boot entrava em loop, provavelmente por causa de dados corrompidos na flash de custom rhythm memory. Ele considerou duas saídas via firmware modificado: uma rotina que regravasse essa flash a partir do Initial Data Disk, ou um bootloader carregado de disquete. Ao documentar a rotina de update, identificou uma string_compare e a forma como os arquivos do disquete de instalação são tratados ("DATA FILE 1/2", formato PCK). Preferiu não dessoldar a flash paralela de 2 MB. Em 9/março anunciou que a placa voltou a funcionar.
Felipe percebeu que a placa do KN5000 que comprou de Ronaldo Verardo tem um adesivo indicando firmware versão 1 e pretende refazer o dump dos chips dessoldados para conferir. Ronaldo disse que nunca atualizou o firmware.
Felipe contou que vinha instalando firmware modificado no Technics KN5000 por disquete, dezenas de vezes por dia. Planeja um software que envie código executável ao teclado pelo cabo MIDI.
As primeiras tentativas foram o SysEx por MIDI e uma tela de hexdump. Depois, Felipe analisou a ppkn50.dll para inferir o protocolo da porta paralela da HDAE5000. Com código injetado no boot, fez pela porta paralela o dump da Program ROM; fez também o dump da HDAE5000 v2.06i e obteve o par de ROMs table_data, que, segundo concluiu depois, contêm o código de boot (/CS2). Planejou em seguida o dump da ROM de boot da subcpu.
Felipe "Juca" Sanches anunciou experimentos com o SysEx Bulk Dump do KN5000 para tentar fazer dump de ROM via MIDI. A ideia é colocar valores não convencionais na memória para que algum trecho dos dados enviados seja executado, talvez começando por dados aleatórios para ver se algo trava o sistema e afunilando a busca a partir daí. Ele indicou a ferramenta Ctrlr e pediu sugestões.
Felipe "Juca" Sanches publicou um vídeo com uma tela de hexdump do teclado Technics KN5000. Quando kretcheu sugeriu fazer OCR das telas, ele explicou que a ROM a extrair tem 0x80000 bytes, o que daria 4096 telas, e que o método de salvar em disquete grava só 0x1000 bytes por vez. Disse que seguiria procurando uma solução mais prática.
Felipe "Juca" Sanches levantou o esquemático da placa de extensão para HD do KN5000 e montou um cabo que liga a porta paralela a um Arduino. A ideia era fazer o dump de ROMs e criar um monitor com peek/poke. Ele analisou a ppkn50.dll do programa HD-TechManager5000 com strings, winedump e objdump, e L. sugeriu usar o Ghidra. Pela análise, Felipe montou uma tabela dos valores numéricos que, segundo supõe, identificam cada operação do protocolo com a placa HDAE5000. Ele também notou que está reconstruindo a forma de um cabo sem documentação que nunca teve em mãos.
Felipe "Juca" Sanches injetou código no boot do KN5000 para enviar bytes da ROM pela porta paralela. O dump de 512 KB da Program ROM bateu com o checksum de um dump que ele tinha feito por outros métodos. Ele fez depois o dump da placa HDAE5000, em uma versão (v2.06i) mais recente que as que já tinha. Também obteve o par de ROMs "table_data", do qual só tinha a ROM ímpar, e com isso o emulador passou a mostrar a tela de erro de comunicação entre as CPUs. Para passar dessa tela, faltam pelo menos o micro-DMA no core TLCS900 e o dump da mask ROM de boot da subcpu.
Felipe "Juca" Sanches investigou uma rotina que parecia inalcançável e, no esquemático, encontrou resistores que permitem trocar os chip-enables das ROMs. Ele constatou que as ROMs table_data usam /CS2 e que, pelo datasheet, o boot acontece por padrão nesse chip select; portanto são elas que contêm o código de boot. Para emular isso, será preciso implementar mapa de memória dinâmico no core TLCS900 do MAME. Se for viável de forma segura, a descoberta também pode permitir apagar a flash e liberar 2 MB para código próprio.
Felipe "Juca" Sanches descreveu como pretende fazer o dump da ROM de boot de 128 KB da subcpu. O payload enviado à subcpu seria alterado para ler 0xFE0000-0xFFFFFF e mandar os bytes à maincpu pelos latches de comunicação entre as CPUs, e a maincpu os repassaria à porta paralela. As dificuldades são as interrupções geradas pelos latches e algumas escritas em registradores de controle que o disassembler dele ainda não decodifica e que ele suspeita configurarem o micro-DMA.
L. e RicBit sugeriram formas de acelerar o disassembler em Python de Felipe, que levava mais de meia hora para processar o binário de 2 MB. Com um script de RicBit e sugestões de L., Felipe decodificou um bitmap de mensagem da rotina de update (224x22). Pedro de Medeiros indicou um módulo de TLCS-900/H para o Ghidra.
O disassembler de Felipe "Juca" Sanches levava mais de meia hora para processar o binário de 2 MB do KN5000. A demora veio do uso de símbolos de depuração encontrados no firmware como pontos de entrada adicionais, o que aumentou a cobertura. A análise também encontrou 450 jump tables ainda não tratadas. L. e RicBit sugeriram usar o Python 3.12, structural pattern matching, functools.cache ou lru_cache(maxsize=None) e itertools, e procurar trechos acidentalmente quadráticos.
Pedro de Medeiros compartilhou a fonte OpenType Z80 Sans, que faz o disassembly de instruções Z80. Também indicou a Felipe "Juca" Sanches um módulo de processador TLCS-900/H para o Ghidra, e Felipe disse que iria testá-lo.
Felipe "Juca" Sanches pediu ajuda para decodificar um bitmap monocromático de 616 bytes com a mensagem "FD TO FLASH MEMORY". A resolução certa era 224x22. RicBit escreveu um script em Python que converte um hexdump em PBM, e L. sugeriu abrir os dados no GIMP como raw. Felipe queria ver as imagens para trocar ponteiros por nomes no disassembly da rotina de atualização de firmware. Ele também criou um repositório git com o disassembly da Program ROM, para compartilhar de forma privada.
Felipe rodou um programa próprio que desenha na VGA a partir da ROM da placa de extensão. Depois mostrou um protótipo do port da VM do Another World em assembly TLCS-900 (repositório kn5000_homebrew), que ainda entrava em loop infinito na troca de threads. Leonardo Roman perguntou sobre portar jogos de Neo Geo Pocket para o teclado.
Felipe "Juca" Sanches rodou um pequeno programa, montado à mão, que desenha na VGA do KN5000 a partir da ROM da placa de extensão. Sobre a imagem resultante, disse depois que a paleta de cores estava errada. Ele indicou um assembler para a CPU e, no dia seguinte, contou que já o usava com sucesso. Planejou uma PCB com RAM e EPROM ou flash para carregar programas, regravar a flash do sistema e rodar um monitor serial. Também procurou identificar o conector da placa HD-AE5000: L. indicou um guia de identificação, Pablo Vasques Bravo-Villalba sugeriu um VHDCI e Felipe concluiu que parecia ser um Molex EBBI 50D. Hugo perguntou se Felipe tinha um emulador USB de disquete para o KN5000, e Ramiro Polla brincou que Felipe já tinha comprado todos os KN5000 do Brasil.
Felipe mostrou um protótipo do port da VM do Another World para o KN5000, escrito em assembly TLCS-900 por falta de compilador C para essa CPU e ainda dependente de hacks no firmware. Corrigiu a rasterização de polígonos, a paleta e a renderização de strings, publicou o código no repositório kn5000_homebrew (demos/anotherworld) e encontrou um bug na exibição do disassembly TLCS-900 no debugger do MAME. Em 18/abril relatou um loop infinito na troca de threads da VM e planejou comparar a sequência de task switching com a implementação HLE no MAME para achar o ponto em que o port diverge.
Felipe "Juca" Sanches enviou um vídeo gravado em três partes, e Pablo Vasques Bravo-Villalba comentou o conteúdo em áudio. Clemar Folly Jr sugeriu divulgar os avanços do projeto Technics em blogs, no Hackaday ou no YouTube. A partir de um vídeo compartilhado por L., Clemar comentou que os chips custom impedem reproduzir o Mac SE/30 sem placa doadora. Pablo sugeriu reimplementá-los em FPGA ou CPLD. Leonardo Roman perguntou sobre portar jogos de Neo Geo Pocket para o KN5000. Felipe avaliou que traduzir assembly x86 seria mais fácil do que emular o vídeo do Neo Geo Pocket, apesar de este usar a mesma CPU do KN5000.
Felipe preparou uma palestra sobre o KN5000 para a Tosconf e pediu ajuda para arquivar a página de downloads de um site sobre teclados Technics antes que saísse do ar. Clemar Folly Jr sugeriu divulgar os avanços do projeto.
Felipe preparou os slides da palestra sobre o KN5000 na Tosconf, conferência do Laboratório Hacker de Campinas, e prometeu repeti-la no YouTube caso não fosse gravada. Depois do evento voltou com um tubo CRT e passou a pensar em projetar um gabinete cocktail.
Felipe "Juca" Sanches pediu ajuda para arquivar todo o conteúdo da página de downloads do site da CA-Software sobre teclados Technics antes que o site saia do ar. RicBit sugeriu automatizar o trabalho com um crawler e ofereceu como base um script que já tinha escrito para outro site.
Felipe "Juca" Sanches enviou um vídeo gravado em três partes, e Pablo Vasques Bravo-Villalba comentou o conteúdo em áudio. Clemar Folly Jr sugeriu divulgar os avanços do projeto Technics em blogs, no Hackaday ou no YouTube. A partir de um vídeo compartilhado por L., Clemar comentou que os chips custom impedem reproduzir o Mac SE/30 sem placa doadora. Pablo sugeriu reimplementá-los em FPGA ou CPLD. Leonardo Roman perguntou sobre portar jogos de Neo Geo Pocket para o KN5000. Felipe avaliou que traduzir assembly x86 seria mais fácil do que emular o vídeo do Neo Geo Pocket, apesar de este usar a mesma CPU do KN5000.