Tópicos › Teclados Technics (KN5000, KN7000 e outros)
131 conversas · anos 3 a 9 do grupo

O assunto começa no ano 3 (2019-2020), quando Felipe "Juca" Sanches pensou em usar uma alternativa livre ao Gotek para entender o protocolo de atualização de firmware por disquete do Technics SX-KN5000. No ano 4 (2020-2021) o trabalho ganhou corpo. O técnico Ronaldo Verardo dessoldou as mask ROMs para leitura no TL866CS. Com sugestões de RicBit, Felipe decifrou a compressão do arquivo de update: um byte-mapa e um buffer circular de 4 KB. Um membro da comunidade MAMEDev depois observou que o algoritmo é quase idêntico ao LZSS, e Felipe associou isso à assinatura "SLIDE4K". Ele publicou o descompressor em Python e criou o repositório kn5000_homebrew. Também fez o dump da ROM de dados rítmicos alterando o ponteiro dos "factory settings" e gravando um backup em disquete. Para entender o hardware, esboçou no MAME um driver do KN1500 e, no do KN5000, identificou um controlador compatível com VGA, o mapa de memória, o vetor de interrupções e a comunicação por micro-DMA entre as duas CPUs. Publicou o branch technics_keyboards (ainda com tela preta) e corrigiu o disassembler TLCS900 do MAME. Leonardo Roman encontrou o compilador oficial da Toshiba, e Felipe pausou a engenharia reversa para começar um port do GNU binutils para o TLCS900. No ano 5 houve apenas a intenção de retomar esse port e uma tentativa de rodar o compilador da Toshiba pelo Wine, sem sucesso.
No ano 6 (2022-2023), depois da tentativa com o binutils, Felipe começou um disassembler próprio baseado no ExecTrace (TLCS900_ExecTrace). Com ele documentou jump tables do firmware, no qual também encontrou símbolos de depuração. RicBit sugeriu otimizações e Leonardo Roman compartilhou o manual da CPU. No MAME, preparou o primeiro commit com a variante TMP94C241 e corrigiu as interrupções, o que fez o firmware sair de um laço de espera, embora a tela continuasse preta. Registrou o boot num documento público que chegou a 45 páginas. O dono finlandês de um site antigo enviou os discos de update das versões 7 e 8, que Felipe publicou no Internet Archive, e depois a versão 6 e o HD-TechManager5000. Felipe também trocou a placa danificada do painel e fez experimentos com disquetes. Encontrou um tutorial de modificação do Gotek com um erro de alimentação, e Leonardo Roman sugeriu o FlashFloppy, cujo código Felipe passou a estudar.
No ano 7 (2023-2024) o driver mostrou os primeiros gráficos (PR #11835). Ganhou um layout do painel em SVG (repositório KN5000_MAME_artwork), e os LEDs passaram a indicar a versão do firmware. O primeiro PR foi aceito no MAME (#12649), seguido do #12902. Felipe decodificou o formato dos disquetes de update e instalou pela primeira vez, sem erros, um firmware modificado ("Happy Hacking KN5000"). No processo tijolou duas placas, uma das quais voltou a funcionar. No Calango Hacker Clube, com Pedro de Medeiros, tentou sem sucesso adaptar um drive comum e instalou um Gotek, que salvava arquivos mas não instalava o update. Depois de tentar extrair ROMs por SysEx e por uma tela de hexdump, analisou a ppkn50.dll e fez pela porta paralela da HDAE5000 o dump da Program ROM, da HDAE5000 v2.06i e do par table_data, onde descobriu que fica o código de boot (/CS2). Na mesma época mostrou um protótipo do port da VM do Another World em assembly TLCS-900, preparou uma palestra sobre o KN5000 para a Tosconf e escreveu um esboço de driver para o sintetizador SX-WSA1R. No ano 8 (2024-2025) vieram: - patches na ROM que enganam o self-test do painel e exibem telas internas; - o dump da ROM de boot da subCPU pela serial, ainda incompleto; - o merge da variante TMP94C241 depois de dividir o código em PRs menores; - o início do micro DMA, um PR de rascunho da porta serial e o PR #14068 (barramento de expansão e HD-AE5000), aceito em setembro; - os primeiros passos com o LLVM.
No ano 9 (2025-2026) o disassembly remontado da ROM chegou a 99,94% de byte-matching. Depois, com o Claude Code, os bytes divergentes caíram de 1310 para 177 (ainda sem revisão). O repositório kn5000-roms-disasm foi tornado público e a documentação foi publicada no site KN5000-docs. No MAME foram aceitos a porta serial e o painel interativo, que entrou no MAME 0.288 ainda sem som. Felipe emulou a HDAE5000 e a porta paralela, ligando o teclado a um PC com Windows 95 emulado. Também entraram os PRs da demo "Feature Presentation", já com som, e da data wheel. A VM do Another World passou a rodar a demo inteira no KN5000 emulado. Com um backend TLCS-900 para o LLVM, feito com IA, o Mines, escrito em C, deu os primeiros sinais de vida no KN5000. Felipe também avançou, com o Claude, na engenharia reversa do DSP uPD6383GF e compartilhou um datasheet não oficial. Levou o driver do WSA1R ao MAME e passou a reorganizar a contagem de ciclos do core TLCS900. Para o KN7000, criou um core para a CPU e o driver; os PRs #16250 e #16394 (SP7001) e os de softlists foram aceitos, e o do HD-SX6 do KN6000 seguia aberto. Ele conseguiu rodar código pelo cartão SD num teclado sem modificações. Com um loader oficial de conversores em disquete, fez o dump do firmware v1.3 e das wave ROMs. Depois rodou no aparelho diagnósticos do gerador de tons e dos DSPs, o Pinball Fantasies, um ProTracker e um leitor de PDF de partituras.
Ano a ano: Ano 3 · Ano 4 · Ano 5 · Ano 6 · Ano 7 · Ano 8 · Ano 9
Felipe "Juca" Sanches compartilhou uma alternativa de código aberto ao Gotek, que pretendia usar para entender o protocolo de atualização de firmware por disquete do Technics SX-KN5000.
Felipe "Juca" Sanches compartilhou uma alternativa de código aberto ao Gotek e explicou que pretende usá-la para entender o protocolo de atualização de firmware do teclado Technics SX-KN5000.
Felipe "Juca" Sanches compartilhou uma alternativa de código aberto ao Gotek USB floppy. Ele explicou que pretende usá-la num ataque "man-in-the-middle" para entender o protocolo de atualização de firmware do teclado Technics SX-KN5000, cujos disquetes de update usam um formato que ele desconhece.
As ROMs do KN5000 foram dessoldadas por Ronaldo Verardo e Felipe decifrou, com sugestões de RicBit, a compressão do arquivo de update (similar ao LZSS), publicando o descompressor e o repositório kn5000_homebrew; também fez o dump da ROM rítmica via backup em disquete. Mapeou VGA, boot, interrupções e micro-DMA no MAME (branch com KN1500 e KN5000), corrigiu o disassembler TLCS900 e começou o port do GNU binutils.
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.
Felipe mencionou a intenção de retomar o port do binutils para o TLCS900 e procurou o compilador da Toshiba, que Leonardo Roman apontou no archive.org, mas não conseguiu rodá-lo pelo Wine.
Felipe disse que pretendia retomar o port do binutils para o TLCS900 e procurou o compilador da Toshiba, que Leonardo Roman apontou no archive.org. Ismael Luceno buscou ajuda para portar o gcc-ia32 (x86 de 16 bits) para o GCC 12.
Felipe "Juca" Sanches comprou um Switch OLED e perguntou se há desenvolvimento homebrew na plataforma. Shideravan descreveu a cena: CFW instalados por meio de exploits, como o fusee-gelee, ports de jogos e emuladores, e diferenças entre revisões de hardware. Felipe mencionou que pretende retomar o port do binutils para o TLCS900, processador do teclado Technics KN5000.
Ismael Luceno procurou ajuda para portar o gcc-ia32, suporte a x86 de 16 bits no GCC, para o GCC 12, começando pelo modo standalone. Perguntado por Pedro de Medeiros sobre C++17, disse que em teoria seria possível, mas que o runtime é bem mais complexo.
Felipe "Juca" Sanches procurava o compilador proprietário da Toshiba para TLCS900, e Leonardo Roman apontou a cópia no archive.org. Felipe disse que não conseguiu rodá-lo pelo Wine e não lembrava como tinha feito isso antes. Também indicou o tópico do fórum sobre desenvolvimento homebrew para o teclado Technics KN5000.
Felipe começou um disassembler TLCS-900 baseado no ExecTrace, encontrou símbolos de depuração no firmware, preparou o primeiro commit com a variante TMP94C241 e corrigiu as interrupções no MAME, ainda com tela preta, registrando o boot num documento público que chegou a 45 páginas. Publicou no Internet Archive os discos de update v7 e v8 e depois recebeu a v6, trocou a placa do painel e fez experimentos com disquetes, enquanto Leonardo Roman sugeriu o FlashFloppy.
Felipe começou, com base no ExecTrace, um disassembler da CPU Toshiba TLCS-900/H e documentou as jump tables do firmware. RicBit sugeriu melhorias no código e Leonardo Roman compartilhou o manual da CPU. Felipe também encontrou símbolos de depuração no binário e comprou um Neo Geo Pocket Color, que usa a mesma CPU.
Felipe "Juca" Sanches começou um disassembler da CPU Toshiba TLCS-900/H, usada no teclado Technics KN5000 e no Neo Geo Pocket, com base no ExecTrace, depois de uma tentativa anterior com o GNU binutils. Ele propôs rotinas para detectar cartuchos de Neo Geo Pocket e vetores de boot. Na primeira etapa, desmontou 184 instruções em sequência a partir do ponto de entrada do firmware. O próximo passo é marcar as instruções de desvio. Quando L. perguntou sobre suporte a MIDI no MAME para o teclado emulado, ele respondeu que já existe.
Felipe "Juca" Sanches explicou como documenta as jump tables do firmware do KN5000 (por exemplo, a de 4 ponteiros em 0xFCB6F9, declarada com read_jump_table) para que o disassembler encontre mais rotinas. Ele também encontrou tabelas de 192 ponteiros e procura falhas de verificação de índice que permitam executar código para depurar seu descompressor. Ao publicar o código, RicBit identificou um trecho acidentalmente quadrático e sugeriu usar set() e match case, e Leonardo Roman compartilhou o manual do TLCS-900 de 1994 para resolver instruções desconhecidas. Felipe ainda citou a mesa Sony PVE-500, que usa CPUs TLCS-Z80 e tem driver no MAME.
Felipe "Juca" Sanches comprou no eBay um Neo Geo Pocket Color, que usa a mesma CPU do KN5000, e discutiu o que fazer com ele, como portar a VM do Another World, que esbarra na resolução da tela. Erin Pinheiro contou como trouxe um teclado musical do Reino Unido como bagagem despachada.
Felipe descobriu que o binário do firmware do teclado Technics KN5000 contém símbolos de depuração e escreveu uma função para ler as strings e os ponteiros, embora os nomes ainda não se encaixassem. Ele separou o código de estudo do KN5000 do disassembler genérico da CPU TLCS900H e citou como próximo passo detectar e interpretar o cabeçalho de cartuchos de Neo Geo Pocket Color.
Felipe começou a reorganizar o branch local para enviar ao MAME um pull request com o esboço do driver, cujo primeiro commit adiciona suporte à variante TMP94C241 do TLCS900. Depois corrigiu a execução das rotinas de interrupção, e com isso o firmware passou de um laço de espera, mas a tela continuou preta. Ele também fez uma transmissão ao vivo sobre o trabalho.
Felipe começou a reorganizar seu branch local do MAME com o esboço de driver do Technics KN5000 para enviar um pull request, que ainda não dá sinal de vida. O primeiro commit adiciona suporte à variante TMP94C241 do TLCS900. Ele também abriu um documento público para registrar o código de boot e a inicialização do hardware.
Felipe corrigiu a execução das rotinas de interrupção no emulador do TLCS900 usado pelo KN5000 no MAME. Com isso o firmware passou de um laço de espera que, segundo ele, aguarda uma variável atualizada por uma interrupção de timer, mas a tela VGA continua preta. Como próximo passo, ele propôs registrar a comunicação serial com o painel de botões e implementar emulação de alto nível (HLE) dos microcontroladores do painel, cujo código não foi extraído. Também notou que a Technics fabricou pianos digitais com a mesma arquitetura.
Felipe fez uma transmissão ao vivo no YouTube sobre a emulação do KN5000 no MAME. Depois mostrou a PCB do painel de controle danificada e o microcontrolador do painel. Disse que já comprou uma placa nova e que pretende usar a danificada com um Arduino para decodificar o protocolo. Pelo que entendeu, o chip contém uma mask ROM, e o dump exigiria decapping.
Felipe registrou o código de boot e a inicialização do hardware num documento público, que chegou a 22 páginas e depois a 45. Ele pediu leitura e comentários e cogitou publicar um livro sobre o processo, se o emulador funcionar.
Felipe mostrou um HD de 1 GB com mais de 20 anos e sem dados, comprado por ser um item especial. Contou que o documento sobre a emulação do KN5000 já tinha 22 páginas e que escrever o documento ajuda o próprio desenvolvimento do emulador, e pediu leitura e comentários.
Felipe indicou mensagens antigas do grupo e o documento do KN5000, que passou de 35 para 45 páginas numa noite. Ele planejou traduzir para o inglês a técnica de dump pela rotina de backup das configurações do usuário e cogitou publicar um livro sobre o processo, se o emulador funcionar.
Felipe recebeu do dono finlandês de um site antigo as versões 7 e 8 dos discos de atualização do firmware e publicou um pacote com os discos no Internet Archive; depois recebeu também a versão 6 e o software HD-TechManager5000. Ele identificou as versões instaladas no seu teclado, ainda sem dump. Como possível vetor de injeção de código para extrair a ROM principal sem alterá-la, avaliou a atualização da flash da placa de disco rígido.
Felipe pediu ao dono finlandês de um site de cerca de 20 anos os discos de atualização do firmware do KN5000 com links quebrados e recebeu as versões 7 e 8; a versão 6 ainda faltava. Ele listou as datas das versões 7 a 10 e explicou que versões antigas permitem comparar binários e procurar bugs exploráveis, e que ainda busca uma forma de fazer o dump a partir de um firmware não modificado. L. e Felipe notaram que o Wayback Machine guardou páginas 404 no lugar de alguns desses arquivos. Felipe publicou um pacote com os discos no Internet Archive.
Ao extrair o disquete de instalação do disco rígido opcional do KN5000, Felipe viu que a atualização da flash da controladora não é comprimida. Isso a torna candidata a vetor de injeção de código para fazer o dump da ROM principal sem alterá-la. Ele confirmou que um chip dessoldado por Ronaldo foi lido corretamente, verificando os bytes checados pelo autoteste. O dono finlandês do site lhe enviou a versão 6 do firmware e o software HD-TechManager5000, de 1998.
Felipe substituiu a placa danificada do painel por uma nova e verificou as versões de firmware: o teclado veio de fábrica com a versão 4 ("Main Program 1284"), ainda sem dump. A placa de disco rígido instalada tem firmware 2.06i, também sem dump, o que impede regravar qualquer uma das ROMs antes de extraí-las. Ele considerou projetar uma placa de extensão só com uma ROM ou comprar uma segunda placa-mãe, e sugeriu criar um substituto do binxelview para GNU/Linux.
Felipe trocou a placa danificada do painel e pretende usar a antiga com um Arduino para decodificar o protocolo. Nos experimentos com disquetes, encontrou nomes de pinos errados no esquemático do manual de serviço e um tutorial de modificação do Gotek com um erro de alimentação. Leonardo Roman sugeriu o FlashFloppy, e Felipe passou a estudar o código desse firmware.
Felipe fez uma transmissão ao vivo no YouTube sobre a emulação do KN5000 no MAME. Depois mostrou a PCB do painel de controle danificada e o microcontrolador do painel. Disse que já comprou uma placa nova e que pretende usar a danificada com um Arduino para decodificar o protocolo. Pelo que entendeu, o chip contém uma mask ROM, e o dump exigiria decapping.
Felipe substituiu a placa danificada do painel por uma nova e verificou as versões de firmware: o teclado veio de fábrica com a versão 4 ("Main Program 1284"), ainda sem dump. A placa de disco rígido instalada tem firmware 2.06i, também sem dump, o que impede regravar qualquer uma das ROMs antes de extraí-las. Ele considerou projetar uma placa de extensão só com uma ROM ou comprar uma segunda placa-mãe, e sugeriu criar um substituto do binxelview para GNU/Linux.
Com o painel consertado, Felipe começou os experimentos com disquetes, mas o drive do KN5000 riscou um disquete novo. Ao estudar o circuito no manual de serviço, encontrou nomes de pinos errados no controlador de disco. Erin atribuiu os erros a artefatos de escaneamento, como os de copiadoras Xerox que trocam caracteres.
O novo drive de disquete funcionou no KN5000, mas o drive USB do laptop danificou o disco. Felipe encontrou um tutorial de modificação do Gotek para o KN5000 com um erro de alimentação, e Leonardo sugeriu o firmware FlashFloppy. Felipe passou a ler o código-fonte do FlashFloppy para entender drives de disquete a fundo, e foram citados o Glasgow e o Greaseweazle.
O driver mostrou os primeiros gráficos e ganhou layout em SVG, e os PRs #12649 e #12902 foram aceitos no MAME; Felipe instalou pela primeira vez sem erros um firmware modificado e fez pela porta paralela o dump da Program ROM, da HDAE5000 e das ROMs table_data, onde fica o código de boot. Também mostrou um protótipo do port da VM do Another World, preparou uma palestra para a Tosconf e esboçou um driver do SX-WSA1R.
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.
O sintetizador tem um painel parecido com o do KN5000 e usa duas CPUs TLCS-900. Felipe encontrou dumps das quatro ROMs soquetadas, comprou o manual de serviço e escreveu um esboço de driver no MAME.
Felipe notou que o sintetizador Technics SX-WSA1R (1995) tem um painel parecido com o do KN5000 e usa duas CPUs TLCS-900 (TMP95C061). Encontrou dumps das quatro ROMs soquetadas, comprou e compartilhou o manual de serviço e viu que o boot da CPU principal tem estrutura quase igual à do KN5000. A ideia é usar o WSA1R para entender o protocolo entre as CPUs do KN5000. Felipe também escreveu um esboço de driver no MAME, que já passa nos autotestes, e desenhou a arte do painel em SVG.
Patches na ROM permitiram exibir telas internas no emulador, a ROM de boot da subCPU foi extraída pela serial (dump ainda incompleto) e a variante TMP94C241 foi aceita no MAME, seguida do início do micro DMA, de um rascunho da porta serial e do PR #14068 com a HD-AE5000, aceito em setembro. Felipe compilou o LLVM e avaliou caminhos para um compilador C para TLCS-900.
Patches na program ROM enganaram o self-test do painel e forçaram a exibição de telas internas pelo ID, e dezenas delas foram registradas. Depois, o script de patching do repositório kn5000_homebrew foi refatorado. Felipe disse que a VM do Another World rodando no KN5000 emulado já era quase realidade, ainda "extremamente bugada".
Felipe "Juca" Sanches avançou a sequência de boot do emulador do KN5000 no MAME com patches na program ROM. Um deles engana o self-test dos LEDs e botões do painel e elimina o erro de comunicação com os MCUs do painel. Outro força telas internas pelo ID gravado no endereço FB7863. Ele registrou dezenas de telas: demonstrações, equalizador, testes de drive de disquete, de LCD e de varredura de teclas. O objetivo declarado é entender o boot para dispensar esses hacks no emulador.
Felipe "Juca" Sanches comentou seus projetos recorrentes e disse que a VM do Another World rodando no KN5000 emulado no MAME já é quase realidade, ainda "extremamente bugada". Perguntado por Shideravan, explicou que o teclado é um computador com controlador VGA.
Felipe "Juca" Sanches refatorou o script de patching das ROMs do Technics KN5000 no repositório kn5000_homebrew.
Felipe trocou um plano complexo de dump pela ideia de fazer a subCPU enviar sua mask ROM pela porta serial do teclado. Documentou o disassembly do payload e, em 20/01, obteve um dump que parecia bom. Nas sessões no Calango Hacker Clube, trabalhou nos handlers de interrupção da serial para que o payload recebesse comandos e fizesse dumps da bootrom.
Felipe "Juca" Sanches trocou um plano complexo de dump por uma ideia mais direta: fazer a subCPU enviar sua mask ROM pela porta RS-422 "computer interface" do teclado. Para isso, encomendou um conversor e conectores. Constatou que a carga do payload e a comunicação entre as CPUs dependem do micro DMA, ainda não emulado no core TLCS-900 do MAME. Documentou o disassembly do payload da subCPU e, em 20/01, obteve um dump que parecia bom.
Felipe "Juca" Sanches se reuniu no Calango Hacker Clube, em Brasília, para continuar o trabalho de emulação no MAME. Iniciou o rebase do PR do KN5000 e passou a resolver os conflitos. Numa sessão, trabalhou no patch dos handlers de interrupção TX/RX da serial #1 da subCPU, para que o payload receba comandos do laptop e faça dumps da bootrom. Em seguida compartilhou o link do PR #13386.
Felipe dividiu o código do KN5000 em PRs menores, e o da variante TMP94C241, implementada a partir do datasheet, foi aceito após várias revisões. Depois ele começou a implementar o micro DMA, que deu os primeiros sinais de funcionamento, e passou a unificá-lo com o da variante do NeoGeo Pocket. Também abriu um PR de rascunho com a porta serial usada pelo painel e pelo MIDI.
Felipe "Juca" Sanches relatou a dificuldade de fazer o PR do KN5000 ser aceito no MAME e passou a dividir o código em PRs menores. O PR de melhorias no layout interno foi aceito, e ele apontou o da variante TMP94C241 como o mais importante.
Após várias revisões e rebases, o PR com a variante TMP94C241 do TLCS-900, implementada a partir do datasheet, foi aceito no MAME. Com isso, o driver do KN5000 avança mais no boot. Felipe "Juca" Sanches explicou que ainda tem commits pendentes, entre eles a declaração da ROM da subCPU. O dump, ainda incompleto, foi obtido com um patch no payload que envia os dados pela serial da própria subCPU.
Felipe "Juca" Sanches começou a implementar o micro DMA no core TMP94C241, que deu os primeiros sinais de funcionamento. Passou então a unificá-lo com a implementação existente da variante usada no NeoGeo Pocket.
Felipe abre um PR de rascunho com a implementação da porta serial do TMP94C241, usada pelo painel de controle e pelo MIDI do Technics KN5000.
Felipe escaneou o guia de instalação da HD-AE5000, placa opcional de disco rígido para o KN5000, e encontrou um desenho do teclado num CD-ROM de 1997. O PR #14068, com o barramento de expansão e a placa, foi aceito em 4 de setembro.
Felipe "Juca" Sanches escaneou e compartilhou o guia de instalação da HD-AE5000, placa opcional de disco rígido de terceiros para o Technics KN5000. Informou que tem mais três ou quatro documentos sobre o tema para escanear.
Felipe "Juca" Sanches encontrou um desenho do Technics KN5000 num CD-ROM de 1997 do Internet Archive, acessível pelo discmaster.
Felipe abre o PR #14068, que adiciona ao MAME o barramento de expansão do Technics KN5000 e a placa opcional HD-AE5000. O PR é aceito em 4 de setembro.
Felipe compilou o LLVM pela primeira vez e disse que o próximo passo seria tentar escrever um backend para o TLCS-900. Mais tarde perguntou se seria mais simples portar o compilador C do RetrOS-32, e L. lembrou que o SDCC parece suportar o TLCS-90.
Felipe "Juca" Sanches compilou o LLVM pela primeira vez, com os backends x86 e M68k, e disse que o próximo passo seria tentar escrever um backend para a CPU TLCS-900 do KN5000. Encontrou instruções 68000 que o llvm-objdump marcava como unknown, mas que o debugger do MAME decodificava, e disse ter identificado a causa. L. recomendou usar Ninja em vez de make.
A partir do RetrOS-32, compartilhado por Pedro, Felipe pergunta se seria mais fácil portar o compilador C desse sistema para TLCS-900 e rodar um SO no Technics KN5000 do que portar o LLVM ou o GCC. L. lembra que o SDCC parece já suportar o TLCS-90 (não o 900), como possível ponto de partida.
O disassembly do KN5000 chegou perto de 100% de byte-matching e foi documentado no site KN5000-docs; no MAME entraram a porta serial, o painel interativo (MAME 0.288), a demo com som e a data wheel, e Felipe emulou a HDAE5000. O Another World rodou no teclado emulado e o Mines, compilado com um backend LLVM para TLCS-900, deu os primeiros sinais de vida. Felipe avançou com o Claude na engenharia reversa do DSP uPD6383GF, levou o WSA1R e o KN7000 ao MAME, fez o dump do firmware v1.3 do KN7000 e rodou nele jogos, um ProTracker e um leitor de PDF de partituras.
A remontagem da ROM do KN5000 passou de 69,65% para 99,94% de byte-matching; depois, com o Claude Code, os bytes errados caíram de 1310 para 177, ainda sem revisão. No caminho foram extraídos imagens BMP e um XML da demo e encontrado um registrador que Felipe suspeita habilitar o vídeo VGA. A documentação foi publicada no site KN5000-docs.
Felipe lembrou que um código de desenho na placa VGA do KN5000 funcionava no MAME mas deixava a tela preta no aparelho real. No disassembly manual da Program ROM ele encontrou um registrador que suspeita habilitar o vídeo, ainda sem teste no hardware real.
Felipe passou a remontar o disassembly da ROM versão 10 do KN5000 (2 MB) e a comparar o resultado byte a byte com a original. Os erros de montagem no assembler AS caíram de 63 mil para zero, e o byte-matching subiu de 69,65% para 98,53%; o repositório kn5000-roms-disasm foi tornado público. Ele encontrou uma divergência entre builds do assembler AS na instrução CALL T, XHL e usou macros para reduzir 11 mil linhas. Ao estagnar em 99,60% na ROM da maincpu, passou a fazer o mesmo trabalho com o payload executável da subcpu e anunciou que chegaria a 100% e começaria uma terceira ROM.
Felipe extraiu da ROM table_data do KN5000 seis arquivos BMP usados na animação de demonstração e mostrou os comandos dd usados. A ROM principal referencia as artes pelo nome do arquivo, por meio de uma tabela de structs. Ele também encontrou um XML de 1997 que descreve a sequência da demo.
Felipe testou o Claude Code para avançar o byte-matching da ROM do KN5000, que já estava em 99,94%. Três sessões reduziram os bytes errados de 1310 para 177, ainda sem revisão. Ele estimou o custo em pouco mais de um centavo por byte corrigido, e RicBit sugeriu rodar modelos localmente com LM Studio.
Felipe publicou o site KN5000-docs, com a documentação da engenharia reversa do KN5000 e uma página sobre a reconstrução das ROMs. Ele relatou que Claude Code, manuais de serviço, datasheets e o issue tracker Beads formam um fluxo de disassembly, engenharia reversa e documentação. Também mostrou imagens em que os gráficos passam a aparecer com a paleta correta. Erin Pinheiro comentou o fato de ele pagar por software de código fechado.
Felipe "Juca" Sanches mostrou o avanço do disassembly das ROMs do Technics KN5000, compartilhou o tutorial do App Loader e anunciou a passagem de assembly para C no processo de byte-matching do ROM-set. Também mostrou o Another World antes de atingir 100% de byte-match.
Ismael Luceno comparou modelos abertos e fechados para escrever e traduzir código e propôs um repositório comum de regras de memória para agentes; publicou suas regras para o Kimi K2.5. Felipe "Juca" Sanches apontou o CLAUDE.md do disassembly do KN5000 e compartilhou uma especulação do Claude de que o subsistema de diagnóstico 'HAMA' se refira a Hamamatsu.
Felipe refez o layout do KN5000 e trabalhou na porta serial do painel, cujo PR foi aceito. O painel de controle interativo também foi aceito e entrou no MAME 0.288. Ele ainda emulou a HDAE5000 e a porta paralela, e teve aceitos os PRs da demo 'Feature Presentation' e da data wheel.
Felipe refez o layout interno do KN5000 no MAME com formas de botão reaproveitadas em SVG e duas vistas, compacta e close-up da tela. O pull request foi aceito. Em seguida voltou ao rascunho da porta serial do TMP94C241, usada pelo painel de controle e pelo MIDI, e pediu ajuda para entendê-la.
Felipe publicou dois vídeos: um sobre os layouts gráficos dos sintetizadores Access Virus no MAME e outro sobre os avanços de novembro de 2025 na emulação do Technics KN5000.
Felipe disse estar perto de entender o protocolo serial do painel de controle do KN5000 e que os detalhes estão num repositório privado do Arqueologia Digital. Ele lembrou projetos de dezembros anteriores, como a emulação da VM de Another World no MAME, e o sintetizador de Guido Stolfi associado ao Patinho Feio, que ainda não foi emulado.
Com o Claude Code, os LEDs e botões do painel do KN5000 passaram a funcionar no MAME, que já permite navegar pelos menus. Felipe descreveu seu fluxo de trabalho com logs e testes manuais e planejou uma série de PRs pequenos para o MAME; o som e os DSPs ainda estavam em investigação. RicBit comparou com seu método de scripts Tcl no openMSX e documentação verificada por testes.
Felipe publicou um vídeo do Technics KN5000 emulado no MAME com o painel de controle interativo.
Felipe "Juca" Sanches anunciou a aceitação do PR da porta serial do TMP94C241 no MAME, após cerca de três semanas, e depois abriu e teve aceito o PR do painel de controle interativo do Technics KN5000. O próximo passo anunciado foi a engenharia reversa dos chips de som.
Felipe "Juca" Sanches emulou a placa de disco rígido HDAE5000, formatou uma imagem CHD e implementou a porta paralela, conectando o KN5000 a um 486 com Windows 95 no MAME, e teve incluído no MAME o suporte ao modo bidirecional PS/2 no pc_lpt. A versão completa do TechManager5000 não rodou por falta de um componente OCX do VB; L. sugeriu colocar o OCX na pasta do programa, testar o Windows 98 e usar o Dependency Walker, e Pablo sugeriu o runtime instalável do VB4 e recebeu a imagem do disco para tentar. O grupo comentou as mensagens mal traduzidas do software.
Felipe "Juca" Sanches anunciou o MAME 0.288, primeira versão com o KN5000 interativo, ainda sem som, e pediu ajuda para emular os chips de som.
Felipe compartilha um vídeo do KN5000 no MAME rodando a demo 'Feature Presentation', em que L. nota que agora há som. Ele também divulga o repositório público com o trabalho em andamento sobre os teclados Technics.
Felipe abre e acompanha dois pull requests do KN5000 no MAME: o PR 15878, que faz a demo 'Feature Presentation' rodar e foi merged em 17/08, e o PR 15919, que emula a data wheel TEMPO/PROGRAM e foi merged em 31/08.
A VM de Another World foi portada para TLCS-900 e roda a demo inteira no KN5000 emulado. Um backend TLCS-900 para o LLVM, criado com IA, permitiu os primeiros sinais de vida do Mines no teclado. Felipe também analisou conteúdo abandonado no bytecode do Another World.
Depois de um vídeo com a abertura de Another World no MSX, L. sugeriu compilar a VM do jogo para Z80. Felipe mostrou que já havia portado grande parte da VM para assembly de TLCS-900, a fim de rodá-la no teclado KN5000, e disse que o emulador do KN5000 no MAME já pode ajudar a concluir o port.
Com o Claude Code, Felipe completou o port da VM de Another World para o KN5000, partindo da sua implementação HLE do MAME e de uma tentativa incompleta em assembly TLCS-900. A demo passou a rodar inteira sem glitches no MAME, e o código foi publicado com um site do projeto. O código compila como ROM principal ou como extensão da HDAE5000, mas só a primeira opção foi testada. Dois dias depois, Felipe disse que faltavam apenas o som e o arquivo de instalação em LZSS, além do teste no hardware real.
Felipe criou com IA, em um único dia de vibe-coding, um backend TLCS-900 para o LLVM, o que dá um compilador C para o KN5000. Ele planejou usar o port do jogo Mines como primeiro homebrew rodando junto do firmware original na HDAE5000. Os passos seguintes seriam um loader pelo disco rígido com FAT e o upload de binários pela porta serial. Macabeus recomendou revisar o código gerado e testar cenários reais em vez de mocks.
Felipe adicionou um ícone num menu do KN5000 para lançar o jogo Mines e organizou o trabalho com o issue tracker Beads. Os primeiros sinais de vida do Mines no KN5000, ainda com paleta errada e flickering mas já reagindo aos botões, vieram de código C compilado com o port do LLVM.
Respondendo a uma imagem de Felipe "Juca" Sanches, Pedro de Medeiros perguntou se o assembler de TLCS-900 poderia servir para desenvolver para o Neo Geo Pocket. Felipe disse que está funcional, que trocou o ASL pelo seu backend de TLCS-900 para LLVM e que o MAME emula o Neo Geo Pocket.
Felipe "Juca" Sanches publicou um mapa do Another World e, a partir da análise do bytecode, reativou com um patch o comportamento do besouro da primeira fase, montou de forma especulativa polígonos não utilizados e extraiu um trecho de música removido por um JMP. Também mostrou uma arte de cenário abandonada com uma escadaria que não existe no jogo final.
Com o Claude, Felipe avançou na engenharia reversa do instruction set do DSP NEC uPD6383GF, com 18,3% desvendados ao fim do primeiro dia, e depois compartilhou um datasheet não oficial. Ao trabalhar no WSA1R, encontrou trechos de código parecidos com os do KN5000, o que indica reuso. Um ajuste nos timers prejudicou o NeoGeo Pocket e levou à reorganização da contagem de ciclos do TLCS900 no MAME.
Felipe relata que o Claude está fazendo a engenharia reversa do instruction set do DSP não documentado NEC uPD6383GF, usado na placa de som do Technics KN5000. O ponto de partida foi um diagrama de blocos do service manual de outro aparelho com o mesmo chip. O trabalho seguiu estas etapas: - extrair da ROM da subCPU as tabelas de código e de parâmetros; - analisar estatisticamente os bits; - associar os programas a efeitos (reverb, chorus, flanger) e compará-los com algoritmos clássicos de DSP; - navegar pelos menus no emulador para correlacionar nomes de parâmetros com endereços do DSP. RicBit explica o raciocínio: com a premissa de um filtro Butterworth, os coeficientes esperados permitem deduzir a codificação dos opcodes. Ao fim do dia, 18,3% do instruction set estava desvendado, com esboço de disassembler e de emulação no MAME.
Felipe passa a trabalhar no Technics WSA1R, versão rack do Acoustic Modelling Synth, no MAME. No disassembly das ROMs encontra trechos de código parecidos com os do KN5000, o que indica reuso entre os aparelhos. Ele cruza as árvores de disassembly para chegar a um único codebase que compile, com bytematching, as ROMs de todos os aparelhos e releases. Isso também amplia o acervo de código de DSP disponível para a engenharia reversa do instruction set.
Felipe compartilha um 'datasheet não oficial' do DSP não documentado uPD6383GF, que reúne o que já se sabe com base na engenharia reversa feita ao longo de algumas semanas.
Depois que o PR do WSA1R foi merged pelo rb6502, notou-se que uma mudança de Felipe nos taps dos timers da CPU piorou o áudio do NeoGeo Pocket. Felipe abriu um PR de correção (16255), que deixou o WSA1R muito lento. Ao investigar, concluiu que a contagem de ciclos da família TLCS900 no MAME está desorganizada por herança do emulador de onde o core foi portado, que ele supõe ser o NeoPop. Agora reorganiza o core com o Claude para calcular os ciclos dos timers de acordo com os datasheets. Está em dúvida se envia esse PR tão perto de um release, pelo risco de efeitos colaterais em outros drivers.
Para o KN7000, Felipe criou com o Claude Code um core da CPU, que o MAME ainda não emulava, e o driver do teclado. O PR #16250 foi aceito, assim como o PR #16394, com o suporte ao SP7001, e PRs de softlists; o PR da expansão HD-SX6 do KN6000 seguia aberto. Felipe também pretende escrever um driver do KN2000.
Felipe compra um teclado Technics KN7000, adapta os scripts de descompressão de assets dos arquivos de update e extrai uma imagem da flash com o sistema principal. Com o Claude Code, cria no MAME um core de emulação da CPU, que o MAME ainda não emulava, e o driver do teclado. O Claude descobre que a tela de splash saía com ruído porque o core não implementava a instrução customizada udf07 (MN10300/AM33). Na CPU do KN7000 essa instrução é um bit-search (BSCH), usado no passo de Huffman do decoder JPEG. Felipe chama o resultado de '100% vibe-coded' e depois esclarece que interagiu muito com a IA, guiando a pesquisa. Shideravan alerta para o preconceito que o termo pode gerar e defende revisar o código gerado. RicBit comenta que a IA tem tenacidade, mas não criatividade.
Felipe abre um PR de suporte à expansão do Technics KN6000 com a placa opcional HD-SX6 no MAME. Ismael Carvalho comenta que tem aparecido na internet muita coisa parecida com as contribuições de Felipe e que é bom ver gente nova percebendo que o MAME vai além do arcade.
Felipe compartilha um documento (vhs-technics-kn7000-technote.pdf) e fotos. Shideravan pergunta se o material já foi dumpado e se o conteúdo seria o mesmo de um DVD comercial sobre os recursos do KN7000.
Felipe "Juca" Sanches anunciou que o PR #16250 do MAME, com o driver do Technics KN7000, foi aceito.
Felipe "Juca" Sanches encontrou fotos publicadas por Phil Leader, ex-funcionário da Technics no Japão, entre elas a do primeiro protótipo do KN2000. Explicou que só tem a fotografia do protótipo e que pretende um dia escrever para o MAME um driver do KN2000, modelo de produção ainda à venda no eBay e no Mercado Livre.
Felipe "Juca" Sanches mostrou o driver do KN7000 rodando a versão modificada do sistema que trabalha com um leitor de cartão SD alemão mais avançado que o drive de SD original, e quebrou uma proteção por senha. O PR #16394 (ROMs adicionais, softlist inicial e suporte ao SP7001) foi aceito.
Felipe "Juca" Sanches mostrou cinco PRs seus abertos no MAME, a maioria apenas com declarações de softlists. Depois informou que todos os de softlists foram aceitos, com merges de rb6502 e ajrhacker, e que segue aberto apenas o mais antigo, da placa opcional HD-SX6.
Felipe buscou formas de dumpar o firmware: estudou um exploit do cartão SD, pedido que o Claude Code bloqueou, e pensou em filmar a saída de vídeo do debugger do firmware. Depois mostrou um jogo rodando a partir do cartão SD num teclado sem modificações. Com um loader oficial de conversores em disquete, fez o dump do firmware v1.3 e das wave ROMs e passou a rodar diagnósticos do gerador de tons e dos DSPs.
Felipe quer executar código arbitrário no Technics KN7000 para dumpar as ROMs sem destruí-las, talvez explorando um bug nas funções do SD card. Ele relata que o Claude Code bloqueia o pedido por alertas de cibersegurança, inclusive no Opus, mas que deu várias dicas antes de bloquear. Compartilha um relatório em PDF sobre a segurança da mídia SD do KN7000. Depois de enviar feedback, mostra telas em que a própria IA argumenta a favor do caso e posta um trecho de um post de blog gerado sobre o tema.
Felipe descobre um debugger no firmware original do KN7000. Ele pensa em dumpar a ROM filmando a saída de vídeo página por página, mas o sinal tem muito ruído. Pablo sugere extrair um sinal mais limpo, talvez RGB, em um estágio anterior do circuito. Felipe nota que, no diagrama, só o pino do verde está ligado à saída de vídeo. Leonardo Roman aponta no diagrama os sinais RGB e os sincronismos (HRTC/VRTC) e diz que falta testar se é RGB (15 kHz) ou VGA (31 kHz).
Felipe "Juca" Sanches explicou que fez o dump do firmware do KN5000 pela placa de expansão HDAE5000, mas que o KN7000 não tem esse conector. Encontrou o SD-PLUG-iN7000, um produto que rodava código próprio pela interface de cartão SD. Como essa interface tem um processador com ROM ainda não extraída, preparar um cartão inicializável seria um problema de ovo e galinha.
Felipe "Juca" Sanches publicou um vídeo de um jogo rodando no KN7000. Segundo ele, o mais importante da demonstração é provar que dá para rodar código arbitrário a partir do cartão SD em um teclado sem modificações.
Felipe "Juca" Sanches descobriu que a Technics publicou disquetes com conversores de formatos de outros fabricantes, programas executáveis carregados por um loader oficial da ROM, o que permite rodar código no teclado. Com isso fez o dump da ROM v1.3 do seu KN7000 e das wave ROMs, abriu os PRs #16517 e #16520 no MAME e lembrou que o projeto vem desde 2021, com raízes em 2008. Ramiro Polla perguntou se o método serve para o KN5000, e Felipe respondeu que em teoria sim.
Com a execução de código no aparelho, Felipe "Juca" Sanches passou a rodar diagnósticos para coletar evidências sobre o gerador de tons e os DSPs, que não têm documentação. Fez a VM do Another World tocar os sons originais com um mixer de 4 canais escrito no assembly do DSP. No MAME, corrigiu um erro na emulação do gerador de tons que saturava a fila de polifonia, mas o áudio ainda gagueja.
Felipe rodou no KN7000 o Pinball Fantasies, escrito em C e compilado com um fork do LLVM, um ProTracker no estilo do Amiga e um leitor de PDF de partituras.
Felipe "Juca" Sanches fez o Pinball Fantasies rodar no KN7000, escrito em C e compilado com um fork do LLVM. O LCD lento borra o scroll do playfield, por limitação do hardware e não de desempenho. L. sugeriu girar a tela ou deixar rastro na bola, como o Windows fazia em laptops com LCD lento.
Querendo fazer algo útil para músicos, Felipe "Juca" Sanches aceitou a sugestão de L. de fazer um tracker e fez um ProTracker no estilo do Amiga para o KN7000, com vídeo e manual em PDF. Ainda não roda no MAME porque há PRs pendentes. Em resposta a uma pergunta sobre a CPU, indicou a página de documentação do KN7000 em arqueologiadigital.org.
Felipe "Juca" Sanches mostrou um leitor de PDF rodando no KN7000 para exibir partituras. Leonardo Roman sugeriu fazê-lo acompanhar as notas tocadas e rolar o PDF.
Índice escrito por agentes Claude que leram o log completo de cada período. Um segundo agente conferiu cada conversa contra as mensagens, e um terceiro conferiu os resumos do ano e dos temas contra as conversas. Pode conter imprecisões: cada item leva às mensagens originais. Para procurar palavras específicas, use a busca.