Leitor de Disquetes Amiga Baseado em Arduino: Recuperação de Dados Open-Source e Acessível
Componentes Necessários
| Componente | Quantidade | Observações |
|---|---|---|
| Resistor 1k ohm | 1 | |
| Protoboard (genérica) | 1 | |
| Fios Jumper (genéricos) | 1 conjunto | |
| Fonte para Protoboard SparkFun 5V/3.3V | 1 | |
| Arduino UNO (ou Pro Mini) | 1 | Funciona com ambos |
Software e Serviços Online
- Arduino IDE
Sobre o Projeto
Objetivo
Criar uma forma simples, barata e open-source de recuperar dados de disquetes DD (Double Density) do Amiga a partir do Windows 10 e outros sistemas operacionais.
Solução
Um Arduino + uma aplicação Windows.
Por que?
Para preservar dados desses disquetes para o futuro. Um PC normal não consegue ler disquetes Amiga devido à forma como os dados são gravados.
Site do Projeto: https://amiga.robsmithdev.co.uk/
Esta é a V1 do projeto. A V2 contém leitura e escrita aprimoradas!
Experiências com Amiga
Devo minha carreira ao Amiga, especificamente ao A500+ que meus pais me deram no Natal aos 10 anos. Comecei jogando, mas depois fiquei curioso sobre o que mais ele podia fazer. Brinquei com o Deluxe Paint III e aprendi sobre o Workbench.
Histórico
Usei o Amiga em projetos de GCSE e A-Level (graças ao Highspeed Pascal, compatível com Turbo Pascal no PC). Faz muito tempo, e tenho caixas de disquetes e um A500+ que não funciona mais. Pensei em fazer backup desses disquetes no computador, tanto para preservação quanto nostalgia.
O site Amiga Forever tem uma excelente lista de opções incluindo hardware, e o uso de duas unidades de disquete em um PC. Infelizmente, nenhuma era opção com hardware moderno, e os controladores KryoFlux/Catweasel são muito caros. Fiquei surpreso que a maioria fosse closed-source.
Muito ligado à eletrônica e tendo brincado com dispositivos Atmel (AT89C4051) na universidade, decidi olhar para o Arduino (crédito ao GreatScott pela inspiração mostrando como é fácil começar) e me perguntei se isso seria possível.
Pesquisa
Quando comecei, não sabia como a unidade de disquete funcionava, e menos ainda como os dados eram codificados. Os seguintes sites foram inestimáveis:
- techtravels.org
- FAQ do formato .ADF (Amiga Disk File) por Laurent Clévy
- Amiga Forever
- Wikipedia - Amiga Disk File
- English Amiga Board
- QEEWiki - Contadores no ATmega168/328
- Pinout de unidade de disquete
- Lista de formatos de disquete
Tentativas de Desenvolvimento
Tentativa 1: Registradores de Deslocamento
Primeira abordagem usando dois registradores de deslocamento 8-bit (SN74HC594N) para reduzir a frequência de amostragem necessária. Funcionou para clock de 500kHz, mas os dados não eram significativos. Precisei de um osciloscópio para depurar.
Tentativa 2: Interrupção (ISR)
Removi os registradores e tentei detectar pulsos via interrupção. O overhead da ISR e a lentidão do digitalRead() tornaram inviável.
Tentativa 3: Contador de Hardware
Lembrei-me do módulo "Embedded Systems" na universidade (University of Leicester) onde o Prof. Pont sugeriu usar contadores de hardware. O ATMega328 tem timers que podem contar pulsos de entrada externa – velocidade deixou de ser problema.
Tentativa 4: Loop de Fase Bloqueada (PLL) via Software
O sinal da unidade saía de fase com meu clock de 500kHz. Implementei ressincronização a cada pulso detectado, ajustando o contador do timer. Funcionou! Consegui ler dados quase perfeitos.
Tentativa 5: ISR Otimizada (NAKED)
Para eliminar jitter, movi a ressincronização para uma ISR naked (sem prologue/epilogue do compilador). Reduzi para 5 instruções assembly (0,3125µs). Melhorou resultados, mas alguns disquetes ainda falhavam.
Tentativa 6: Trigger Schmitt
Adicionei SN74HCT14N (Hex Schmitt Trigger) com resistor pull-up de 1kΩ. Não houve diferença perceptível.
Tentativa 7: Validação de Dados MFM
Apliquei regras de codificação MFM para detectar erros: não pode haver dois '1' adjacentes nem mais de três '0' adjacentes. Detectou poucos erros MFM, mas alguns disquetes ainda não liam.
Decodificação
A unidade emite pulsos para cada transição de fase (0→1 ou 1→0). Os pulsos SÃO os dados MFM brutos, podendo ir direto para algoritmos de decodificação.
Busquei a palavra de sincronização 0x4489 (ou 0x2AAAAAAA44894489 com máscara 0x7FFFFFFFFFFFFFFF para bugs em código Amiga antigo). Encontrei até 11 por trilha (setores Amiga).
Decodifiquei cabeçalhos e dados, gravei como arquivo ADF (formato simples: 512 bytes por setor, ambos lados, em ordem). Usei checksums para validar setores e reli até ter 11 válidos.
Próximos Passos
- V2 já disponível com leitura e escrita aprimoradas!
- Projeto livre e open-source sob GPL v3.
- Suporte a formato FDI (universal, bem documentado) para proteções de cópia não-padrão.
- Opção de gravação de disquetes (suportando FDI e ADF).
Código
Repositório GitHub: Arduino sketch e código fonte Windows
Esquemáticos
Consulte as imagens de esquemáticos no projeto original (diagrama de circuito e animação GIF do timing).
Processo de manufatura
- A Evolução e Arte da Animação
- A Evolução dos Disquetes: Da Mídia Magnética ao Armazenamento Óptico
- Construa um Spybot Controlado por Bluetooth com Arduino
- FlickMote: Controle Remoto IR por Gestos para Casa Inteligente
- DIY Arduino TV B-Gone: Controle Remoto Universal para Todas as TVs
- Construa um Relógio Mestre LED Personalizado com Alarme – Visível a 12 Metros
- Find Me: Localizador Inteligente de Objetos com Arduino e Bluetooth
- Soluções de Energia Otimizadas para Projetos Arduino
- Jogo da Velha com Arduino, Matriz LED MAX7219 e Caixa de Papelão
- Leitor de Disquetes Amiga Baseado em Arduino: Recuperação de Dados Open-Source e Acessível