Olá pessoal,
Esta é a minha ferramenta CAD para tirar fotografias de uma máscara ROMs e extrair os bits, para que o conteúdo da ROM possa ser recuperado.
Os atalhos do teclado nesta ferramenta não são opcionais. Leia a documentação da GUI abaixo antes de começar a explorar.
Se você achar que essa ferramenta é útil, compre uma cópia do meu livro sobre explorações de microcontrolador para você ou para um aluno inteligente.
-Travis Goodspeed

O GBROM-Tutorial ensina como começar com fotografias da ROM de máscara do Gameboy e trabalha com uma imagem de ROM precisa.
O Myk82 ROM detém um depósito de rom do ROM do chip Myk82 em um cartão Fortezza. Este é o sucessor do clipper chip, e o repositório inclui não apenas todos os bits ROM, mas também refilmina para correção de erros.
Wersi-SLM2-51173 é uma ROM Zilog Z8 de um módulo de sintetização musical.
master - Melhorias de desempenho, evitando cópias profundas em listas. A contagem adequada da barra de status e a barra de status agora usa uma fonte de largura fixa.
2024-08-18-A opção de solucionador do Gatorom agora usa fiilenames descritivos. A GUI agora pode exportar um conjunto de resultados resolvidos com arquivo/exportação/solversetBytes. Retângulo de seleção mais claro. R e C agora desenharão o tipo de linha correto quando o usuário os confundir. ^H agora define a posição inicial. As chaves de zoom e movimento agora funcionam na segunda visão. As linhas perfeitamente duplicadas agora são selecionadas durante a DRC pela tecla V Linhas e colunas agora são armazenadas como listas classificadas em vez de conjuntos. Linhas e colunas estão agora em uma ordem consistente na exportação de arquivo. O desempenho aumenta na marcação de bits, marcação de bits e alinhamento de fundo. Binário Universal para MacOS. RomalignertLing funciona melhor para projetos com uma lacuna entre os bancos. Os bits fora da visão não são mais desenhados durante o arrasto, acelerando o ajuste de grupos de longas filas.
2024-07-14-As correções falham ao excluir um item selecionado duplo. Exclua e backspace agora exclua objetos como D . Vários desmontadores. As decodificações agora são atualizadas à medida que os limites de decodificação são alterados.
2024-06-23-Resolução de regras de Yara. Melhorias de estabilidade. Atualização da mira para os ângulos das linhas selecionadas. O espaço agora repete a última linha, seja linha ou coluna. Vários itens podem ser selecionados e o Shift+D duplica -os. Selecione com Shift para adicionar mais linhas ou Ctrl (CMD no macOS) para remover linhas. O arrasto certo move várias linhas, visualizando apenas bits relevantes. As cores da mira e a seleção agora são selecionáveis. O fundo não é mais azuleja ao zoom.
2024-05-19-Agora, as violações da RDC são limpas quando os bits são forçados. Exportação de histograma para plotar as distribuições de cores no GNUplot. Apoio a Wayland. Words explícita Seja suporte na CLI, GUI, solucionador e decodificadores básicos. Define o solucionador, exportando todas as soluções em potencial como arquivos binários. O alinhador não confiável foi depreciado. Solucionador da GUI. A desmontadora chama a unidaasmo de Mame.
2024-01-28-Desfazer e refazer. Diálogo de cordas. Chave de barragem para visibilidade da camada. Algoritmo de alinhamento confiável. O fechamento da janela principal fecha a aplicação.
2024-01-01-Corrige o erro do barramento no decodificador Z8 ao resolver tamanhos ímpares. Modo verboso na cli gatorom. Modo squeeze-lr agora no decodificador da GUI. Edite o item do menu para limpar todas as correções de bits. E selecionará a próxima violação da RDC. Imagens perfeitamente verticais não quebram mais o algoritmo de alinhamento.
2023-12-07-Destaque de seleção. Contagem de linhas/colunas na barra de status. Solucionador ASCII. Corrige vários acidentes no solucionador a partir de tamanhos de ROM estranhos. Gatorom decodificando na GUI. Remoção de decodificadores redundantes. Visualizador Hex e destaque de bytes selecionados. O Gatorom CLI agora é muito rigoroso em sair do acesso ilegal. Zilog Z8 ROM Suporte.
2023-09-13-Opção da CLI para desativar o OpenGL. Suporte de impressão. Janelas de trabalho construídas.
2023-08-06-O OpenGL agora está funcional e padrão. Gatorom incluído para decodificação de bits.
2023-07-20-Suporte secundário à tela. Amostragem alta. As correções falham ao atingir V após a exclusão de uma linha.
2023-06-17-Adicionado macOS em x86_64 e arm64.
2023-05-30-Primeira versão do Windows.
Essa ferramenta funciona no Windows, Linux, FreeBSD e MacOS, usando QT6 com a extensão QtCharts.
Construir a ferramenta é mais fácil da CLI. Em Bullseye Debian (11.x),
% sudo apt install make gcc g++ cmake git qt6-base-dev libqt6charts6-dev
qt6-translations-l10n linguist-qt6 qt6-l10n-tools qt6-tools-* qt6-image-formats-plugins
% git clone https://github.com/travisgoodspeed/maskromtool/
...
% cd maskromtool
% mkdir build; cd build
% cmake ..
% make -j 8 && sudo make install
No Windows e MacOS, use o QT para instalador de código aberto, certificando -se de incluir os gráficos e as extensões de formatos de imagem. Em seguida, abra CMakeLists.txt como um projeto. Ctrl+B compilará maskromtool . Se você tiver um problema com sua importação, como escolher a instalação QT errada, exclua CMakeLists.txt.user e reabrir o projeto para tentar novamente.
Para a conveniência dos usuários do Windows e MacOS, também fizemos alguns lançamentos pré -construídos.
Primeiro use o arquivo/abra ROM para abrir uma imagem ROM como uma fotografia. Tente usar formatos não compactados, mas cuidado que o MacOS não gosta de arquivos TIFF.
Segurando a tecla de controle (comando no macOS) enquanto rola a roda do mouse irá aumentar e diminuir o zoom. Você também pode beliscar-se em uma trilha. Arrastar com o botão do meio será pan ou role com dois dedos como o seu sistema operacional gosta.
Por convenção arbitrária, os bits devem estar em colunas longas com linhas mais curtas. Se as linhas do decodificador estiverem visíveis, elas devem estar no topo da imagem. Sinta -se à vontade para fotografá -lo de uma maneira e depois girá -lo para marcação.
Ao salvar seu projeto, o nome do arquivo da imagem será estendido com .json . Este arquivo JSON classificado e recuperado deve ser apropriado para uso no controle de versão, como repositórios Git.
Esses botões do teclado fornecem a maior parte da sua entrada. Para desenhar linhas, clique primeiro uma vez para escolher como posição inicial e pressione a tecla quando o mouse estiver acima da posição final. Excluir um item ou definir sua posição será aplicada à linha posicionada mais recentemente, a menos que você arraste uma caixa para selecionar uma linha.
Selecione um item arrastando -o com um clique do mouse esquerdo e observando para ficar verde. O item mais recentemente colocado é selecionado automaticamente. Alguns comandos funcionam em vários itens selecionados; outros apenas um.
Você pode excluir um erro com D ou ajustar sua posição um pouco com S , as teclas de seta ou um clique com o botão direito do mouse. Durante o movimento, os pedaços de linhas não relacionados podem estar ocultos para o desempenho, e a chave M ou liberando o botão direito do mouse os redesenhará.
No macOS, ^ significa comando em vez de ctrl.
Tab -- Show/Hide bits.
-- Show/Hide rows and columns.
^ -- Show/Hide background.
ALT -- Show/Hide crosshair.
R -- Draw a row from the last left-click position.
SHIFT R -- Repeat the last row.
C -- Draw a column from the last left-click position.
SHIFT C -- Repeat the last column.
SPACE -- Repeat the last row or column.
D -- Delete the selected objects.
SHIFT D -- Duplicate the selected lines.
S -- Set the selected object to the mouse position.
F -- Jump to the selected item.
ARROWS -- Move the selected items.
right-drag -- Move the selected items. (SHIFT or ^)
middle-drag -- Pan the view.
^ wheel -- Zoom.
Q -- Zoom to zero.
A -- Zoom in.
Z -- Zoom out.
H -- Jump to home position.
^H -- Set the home position.
SHIFT F -- Force a bit's value. (Again to flip.)
SHIFT A -- Force a bit's ambiguity. (Again to flip.)
M -- Remark all of the bits.
SHIFT M -- Update hex decoding and disassembly.
V -- Run the Design Rule Checks.
SHIFT V -- Clear the DRC violations.
E -- Jump to next violation.
^Z -- Undo
SHIFT ^Z -- Redo
^S -- Save changes.
Quando você começa a marcar bits, o software ainda não conhecerá o limiar entre um e um zero. Você pode configurar isso com Choose Bit Threshold View / escolha.
Mesmo os melhores bits não serão perfeitamente marcados; portanto, use SHIFT+F para forçar valores de bits onde você vê que o software está errado. SHIFT+A é semelhante e marca um pouco como ambíguo ou danificado. O menu DRC contém verificações de regras de design que destacarão problemas em seu projeto, como bits fracos ou alinhamento quebrado.
Se a colocação de muitas linhas se tornar tediosa, selecione um grupo com o botão esquerdo do mouse e duplique o conjunto inteiro com SHIFT+D . Em seguida, você pode arrastá -lo com o botão direito do mouse para a nova posição, deixando outra cópia na posição original. Se a taxa de quadros cair para isso, use a tecla TAB para ocultar temporariamente todos os bits, o que acelera bastante movendo muitas linhas em áreas densas.
A mira se ajustará à sua linha e coluna mais recentemente colocadas. Isso deve deixá -los inclinar um pouco para combinar com a realidade de suas fotografias.
Depois de marcar os bits e o Spot, verifique se eles são precisos com a RDC, execute o arquivo/exportação para despejá -los no ASCII para analisar com outras ferramentas, como Gatorom, BitViewer ou Zorrom.
Além da GUI, essa ferramenta possui uma interface de linha de comando que pode ser útil no script. Use o comutador --help para ver os parâmetros mais recentes e o interruptor --exit se você preferir que a GUI não permaneça aberta para uso interativo.
forum% maskromtool --help
Usage: maskromtool [options] image json
Mask ROM Tool
Options:
-h, --help Displays help on commandline options.
--help-all Displays help, including generic Qt options.
-v, --version Displays version information.
-V, --verbose Print verbose debugging messages.
--stress Stress test bit marking.
-e, --exit Exit after processing arguments.
--disable-opengl Disable OpenGL.
--enable-opengl Enable OpenGL.
-d, --drc Run default Design Rule Checks.
-D, --DRC Run all Design Rule Checks.
--sampler <Default> Bit Sampling Algorithm.
--diff-ascii <file> Compares against ASCII art, for finding errors.
-a, --export-ascii <file> Export ASCII bits.
-o, --export <file> Export ROM bytes.
--export-histogram <file> Export histogram.
--export-csv <file> Export CSV bits for use in Matlab or Excel.
--export-json <file> Export JSON bit positions.
--export-python <file> Export Python arrays.
--export-photo <file> Export a photograph.
Arguments:
image ROM photograph to open.
json JSON lines to open.
Para correr sem uma GUI, passe -platform offscreen . Se o programa travar em Wayland, force o uso do XORG, passando -platform xcb .
No Windows, é estranho para um executável ter uma GUI, mantendo um tronco na CLI. Resolvamos isso produzindo dois executáveis; Por favor, use maskromtool.exe para a GUI e maskromtoolcli.exe para a CLI.
Um executável separado, gatorom , envolve o decodificador da ROM sem os gráficos. Veja o Gatorom para obter detalhes.
forum% gatorom
Usage: gatorom [options] bitstream
Gato ROM: A Decoder for Mask ROM Bits
Options:
-h, --help Displays help on commandline options.
--help-all Displays help, including generic Qt
options.
-v, --version Displays version information.
-V, --verbose Talk too much.
-w, --wordsize <8> Word size.bits
-r, --rotate <degrees> Rotates the image in multiples of 90
degrees.
--flipx Flips the bits along the X axis.
--flipy Flips the bits along the Y axis.
-i, --invert Inverts the bits.
-o, --output <out.bin> Output file.
--random Randomize a ROM for testing.
--Random Randomize a crazy ROM.
--rawwidth, --seanriddle <width> Width of a raw binary input, in Sean
Riddle's style.
-I, --info Info about input.
-d, --dis <arch> Disassemble.
--print Print with a GUI dialog.
--printpdf <file.pdf> Print to a PDF file.
--decode-tlcs47font Decodes as a TMP47C434N Font.
--decode-z86x1 Decodes as a Zilog Z86x1.
--decode-cols-downl-swap Decodes as a uCOM4 ROM.
--decode-cols-downr Decodes first down then right like a
Gameboy.
--decode-cols-downl Decodes first down then left.
--decode-cols-left Decodes left-to-right.
--decode-cols-right Decodes right-to-left.
--decode-squeeze-lr Decodes even bits from the left, odd bits
from right like in the TMS32C15.
-z, --zorrom Zorrom compatibility mode, with flipx
before rotation.
--leftbank Only the left half of the bits.
--rightbank Only the right half of the bits.
-a, --print-bits Prints ASCII art of the transformed bits.
-A, --print-pretty-bits Prints ASCII art with spaces.
--solve Solves for an unknown format.
--solve-bytes <bytes> Bytes as a hint to the solver.
0:31,1:fe,2:ff
--solve-ascii Look for ASCII strings.
--solve-string <bytes> Byte string as a hint to the solver.
31,fe,ff
--solve-yara <rule> Yara rule file.
--solve-set <prefix> Exports all potential solutions.
Arguments:
bitstream ASCII art of ROM to decode.
Eu projetei a GUI em torno de uma QGraphicsScene . Os objetos de dados subjacentes usam o sistema de coordenadas QT, com flutuações para precisão melhor do que o pixel.
Depois de carregar uma fotografia de ROM, o usuário coloca colunas e linhas na fotografia. Cada interseção de uma coluna e uma linha é considerada um pouco, e um limite de cores configurável determina o valor desse bit. Onde a fotografia é interpretada mal, você também pode forçar o bit a um valor conhecido.
Depois que todos os bits forem marcados e o limiar escolhido, o software marcará cada parte da luz como azul (0) e cada parte escura como vermelha (1). Esses bits são então alinhados em listas vinculadas de linhas para exportação como ASCII, para uso em outras ferramentas.
Para identificar erros, um conjunto de verificações de regras de design (DRC) criticará o projeto aberto. Embora a interface principal seja a GUI, uma CLI também está disponível para scripts e testes.
Embora alguns milhares de bits possam ser marcados sem um erro, projetos maiores precisarão inevitavelmente gerenciar seus erros.
Um bom começo é usar as verificações da RDC e a configuração cuidadosa dos limites de bits até que não haja erros óbvios. Em seguida, navegue no projeto e pressione a tecla tab para mostrar e ocultar as anotações, certificando -se de que cada bit seja reconhecido corretamente.
Quando isso é insuficiente, como para ROMs com dezenas ou centenas de kilobits, ajuda a anotar a mesma ROM várias vezes, de preferência de fotografias diferentes. Erros de bits acontecerão na anotação de cada fotografia, é claro, mas eles acontecerão em lugares diferentes. Você pode usar o recurso --diff-ascii contra a saída de --export-ascii para comparar imagens, reconciliando suas diferenças até que todos os seus arquivos de projeto concordem.
A maioria das ROMs pode ser lida simplesmente lendo a cor de um único pixel no centro do bit. Para isso, o algoritmo de amostragem Default funcionará muito bem.

Para as ROMs de difusão cujos bits foram um pouco atrasados, o centro da broca não tem uma cor única, mas é cercada por linhas um pouco mais escuras. O Wide algoritmo levará a cor mais escura em cada canal após a amostra de seu tamanho de bits em largura, e Tall faz o mesmo, mas verticalmente.

Patches e melhorias para mascarar a ferramenta ROM são muito bem -vindos, mas não spam o rastreador de problemas com solicitações de recursos. As solicitações de tração devem ser enviadas através da página do Github e não devem envolver o projeto com dependências de bibliotecas de terceiros.
O código é escrito em um dialeto conservador do C ++, com o uso mínimo de recursos avançados. Eu tentei comentar completamente o código e as definições da classe.
O Gatorom é incluído como um decodificador de linha de comando que resolve os arranjos de bits. Consulte seu próprio arquivo ReadMe para documentação da CLI, principalmente para os métodos de solucionador que ainda não são suportados na GUI.
Separadamente, o Gatorom é usado como uma biblioteca para decodificar dentro da GUI Maskromtool. Use Editar/Decodificar para definir o estilo de decodificação e o View/HexPreview para ver uma decodificação ao vivo dos bits para hexadecimal.

Do decodificador, você pode destacar bytes hexadecimais e usar a seleção de visualização/destaque para visualizar os bytes selecionados. Aqui vemos as três primeiras palavras da ROM MYK82, que embalam 32 bits em cada posição. A desmontagem também está disponível quando unidasm da MAME está no caminho.

Um solucionador com script também é suportado, no qual máscaras simples ou regras YARA descrevem o firmware esperado. Todas as correspondências são enumeradas e, ao pular entre elas, você pode decifrar rapidamente imagens que não usam complicações de intervalo, reversão de linha ou outras.

O Zorrom de John McMaster é um excelente decodificador e a inspiração para a biblioteca de decodificação nesta ferramenta.
O Rompar de Adam Laurie pode ser a primeira ferramenta de marcação de bits a ser de origem aberta.
O Bitract de Chris Gerlinsky é outra ferramenta de código aberto para marcação de bits, e o BitViewer é sua ferramenta correspondente para decodificar bits para bytes.
O PLA Decode de Peter Bosch é uma ferramenta de marcação usada para extrair o microcódigo Intel antigo. Veja seu HardWear.io Talk de 2020 para mais detalhes.