Convertendo um Micro Computador da BBC (1981) em um Secure Disc Writer de $ 40.000



Introdução



Uma das histórias mais famosas sobre segurança de disquetes vem do Dungeon Master . Este jogo, lançado em dezembro de 1987, combinou o formato de disco físico sofisticado (bits fuzzy) com verificações de segurança secretas integradas ao próprio jogo.



Recomendo a leitura deste artigo , que fornece uma excelente visão geral dos disquetes, seguida por uma visão geral muito detalhada da proteção de bits difusos do Dungeon Master para o Atari ST. Há também este ótimo artigo que entra em mais detalhes sobre as histórias em torno da defesa do Mestre das Masmorras. Ele contém uma citação de um dos autores do Dungeon Master:



« , , 40 . , ».


A razão para esse preço alto foi provavelmente devido à precisão de tempo necessária para criar bits fuzzy de forma confiável. Nos dias em que a maior parte do mundo media o desempenho em microssegundos, a precisão necessária era medida em nanossegundos.



O BBC Micro tinha um processador 6502 a 2 MHz e levava dois ciclos de clock, ou 1 microssegundo, para executar suas instruções mais simples. Existe alguma esperança de que seja possível escrever bits fuzzy sob tais restrições? Vamos ver até onde podemos ir. Este trabalho será denominado "Projeto Lontra Oleada".



Para lhe dar uma noção do zeitgeist, aqui está a imagem de um duplicador de disquete de 3,5 ". É incrível como ele é semelhante a uma fotocopiadora, exceto que você insere discos no receptáculo em vez de papel! Parece que a Advanced World Products pode até ter vendido essa máquina para você .





BBC Micro Porta Personalizada



A BBC Micro era conhecida por sua excelente extensibilidade, inclusive por meio da chamada "porta do usuário". Esta porta é controlada pelo adaptador de interface versátil 6522 operando a 1 MHz. A própria porta possui 8 pinos de dados e 2 pinos de controle. Esses contatos fornecem um alto grau de controle. Os pinos de dados podem ser configurados individualmente como entradas e saídas, e os níveis dos pinos podem ser definidos para alto ou baixo.



Por que a porta do usuário é importante para nós? Tentaremos controlar a unidade de disco diretamente através dele. Ao remover o controlador de disquete da equação, podemos nos livrar dele e obter um controle mais direto sobre a unidade de disco e os fluxos de dados que estão sendo transferidos.





Porta do usuário para a unidade de disco



A imagem acima mostra meu cabo conectando a porta do usuário à unidade de disco. Os conectores são padrão e os fios que os conectam são apenas jumpers. Eu sinceramente me esforço para criar algo que pudesse ser feito “naquela época”, então não uso nenhum outro equipamento eletrônico.



O cabo está organizado da seguinte forma:





A principal conclusão desse diagrama é que a interface da unidade de disco é provavelmente mais simples do que se possa imaginar. Podemos controlar a unidade de disco e consultar seu status importante em apenas 8 pinos. Tudo é muito simples. Digamos que precisamos girar o drive, então é o suficiente para dar um sinal baixo para PB0 e PB1. Se você quiser esperar que o disco gire para o início da trilha, você precisa consultar o nível lógico em PB6 até que vejamos a mudança do nível do sinal de alto para baixo. Para o movimento passo a passo, é suficiente definir o nível lógico “passo para dentro” oposto a “passo para fora”, e então executar uma pulsação de um sinal baixo no contato “passo”.



Até agora tudo bem, temos controle básico sobre o drive, mas não gravamos nada ainda.



Problemas elétricos



Uma pequena digressão sobre problemas elétricos é imperativa, porque eu os encontrei. Conectar pares aleatórios de componentes pode fazer com que funcionem, mas às vezes são necessários ajustes. Aqui está a faixa de tensão observada inicialmente no pino W / DATA da unidade:





Estamos tentando gravar pulsos em um inversor com frequência FM de 250 kHz.



A tensão lógica 1 é de aproximadamente 3,4 V e a tensão lógica 0 é de aproximadamente 1,5 V. Este é um problema sério! Os níveis de tensão TTL aceitáveis ​​são bem definidos:



“O sinal de entrada TTL é considerado 'baixo' se tiver uma tensão entre 0 V e 0,8 V em relação ao pino de aterramento e é 'alto' quando estiver entre 2 V e VCC (5 V). Se um sinal de tensão na faixa de 0,8 V a 2,0 V é aplicado à entrada de um elemento TTL, então o elemento não dá uma resposta específica e, portanto, o sinal é considerado "indefinido".


Uma tensão lógica 0 de 1,5 V é considerada "indefinida" e não causará nenhuma ação. Na verdade, meu disco não estava gravando nada com este sinal.



O problema foi resolvido removendo o cabo da unidade de disquete EOL da unidade . Aqui está uma foto da minha unidade com a montagem EOL destacada em vermelho:





Isso resolve bem o problema dos níveis de tensão, após o que tudo funciona. Parece que muitas das portas do BBC Micro, exceto a porta do disco, não têm energia suficiente para acionar o cabo EOL. Mas espere - provavelmente houve algum motivo para instalar este resistor? Sim. Removê-lo tem dois truques:



  • Preste atenção ao comprimento dos cabos. Sem um resistor EOL, cabos longos estão sujeitos a distorção de sinal.
  • Observe os níveis de tensão em fios não conectados. Observei uma tensão de 1,32 V no pino do atuador S / SEL (seleção lateral). Isso não é normal porque esse valor também está na faixa de incerteza TTL. Onde a unidade gravará os dados? Talvez o lado superior, talvez o inferior. Ou talvez nenhum deles! O problema foi resolvido conectando cada cabo significativo e aplicando um sinal alto ou baixo a eles.


Precisa aumentar a largura de banda



O problema que contornamos até agora: como enviar um sinal para o pino W / DATA? Este é um contato "difícil". Possui alta largura de banda e requisitos de tempo precisos. Vamos parar de sonhar com bits difusos com precisão de nanossegundos por um segundo e tentar gravar pulsos FM simples na unidade.



A maioria dos discos para BBC Micro são FM (também conhecido como DFM, também conhecido como densidade única) codificado em 250 kHz. Gravar uma faixa FM é bastante simples. É necessário verificar se o drive gira e se a tampa do registro está aberta. Depois disso, a cada 4 microssegundos, executamos uma ondulação W / DATA para baixo e, em seguida, voltamos para um sinal alto (bit 1), ou não o fazemos (bit 0). Na maioria das vezes, cada segundo bit deve ser 1 (bit de sincronização para manter o tempo e a sincronização).



Controlar W / DATA por meio de um processador é uma tarefa impossível. 4 microssegundos são 8 ciclos de clock do processador; isso definitivamente não é suficiente para carregar um byte, deslocá-lo, escrever 0 e depois 1 para os níveis lógicos da porta do usuário. Um ciclo simples provavelmente levará mais de 12 microssegundos, o que é muito. Portanto, para gravar W / DATA rápido o suficiente, teremos que usar os recursos do chip 6522 VIA.



Registro de deslocamento 6522 VIA



O candidato mais óbvio para nossa tarefa é um registrador de deslocamento. O registrador de deslocamento é um registrador de 8 bits. No modo correspondente, carregar o registrador de deslocamento forçará o chip a transmitir sequencialmente 8 bits em um dos pinos da porta do usuário. Isso é ótimo - os bits são processados ​​em paralelo com o processador principal, de modo que o processador pode passar um tempo com segurança criando um novo conjunto de bits para começar a mudar.



Infelizmente, não consegui fazer esse circuito funcionar. O único modo de mudança que tem o potencial de funcionar razoavelmente rápido é a "mudança do relógio do sistema". A especificação do Western Design Center 6522 tem um belo contorno:





O clock do sistema VIA é de 1 MHz, portanto, o clock offset será de 500 kHz e a resolução do bit de saída será de 250 kHz. Isso é apenas o suficiente. No entanto, não descobri como fazer o relógio de turno funcionar de forma contínua e uniforme. Mesmo depois de tentar um tempo preciso para recarregar o registrador de deslocamento, o intervalo de pino do relógio de deslocamento sempre se parecia com este:





Acontece que em um único modo de deslocamento rápido o suficiente para nossos experimentos, recarregar o registrador de deslocamento causa um atraso antes de continuar com o deslocamento. Não nos convém.



6522 Modo de saída de pulso VIA



Um recurso pouco conhecido do 6522 é seu "modo de saída de pulso". Não está descrito nas especificações de todas as variações do 6522, mas aqui está uma pequena entrada sobre ele na especificação da Tecnologia MOS :





Finalmente, encontramos uma especificação que descreve com precisão seu comportamento. Este modo é muito interessante para nós, porque uma operação de escrita em VIA promete levar a duas ações distintas: um sinal lógico baixo é aplicado ao pino de saída e após 1 clock (1 microssegundo) ele retorna para um sinal alto sem esforço de nossa parte. Isto permite-nos a usá-lo para dirigir o sinal de saída de 250 kHz. Os recursos do processador são muito limitados - o loop não resolverá o problema de forma alguma, mas o bloco de código linear 6502 será capaz de lidar, por exemplo:



        \ &70 points to &FE60, aka. user 6522 VIA ORB register.
        STA (&70),Y        \ 8 cycles, pulse output
        STA (&70),Y        \ 8 cycles, pulse output
        STA (&70),Y        \ 8 cycles, pulse output
        LDA (&70),Y        \ 8 cycles, do not pulse output
        STA (&70),Y        \ 8 cycles, pulse output
        ...


Vai funcionar. O processador tem potência suficiente para isso. 8 ciclos de clock são 4 microssegundos, que é o tempo mais curto entre os pulsos de disco.



Infelizmente, tal operação é extremamenteusa ativamente a memória. Cada bit FM codificado requer 2 bytes de código de linha 6502. Cada bit de dados significativo é dois bits FM porque todos os outros bits são sincronizados. Uma faixa tem 3125 bytes de comprimento, então 3125 * 8 * 2 * 2 == 100 kB de código de linha é necessário. A BBC Micro tem 32 KB de RAM, então estamos sem sorte aqui. Setores únicos (pequenos) podem ser gravados, incluindo novos e poderosos mecanismos de proteção de disco. Mas não poderemos gravar setores grandes (1024 bytes) ou trilhas completas. Ambas as operações são necessárias para gravar um grande número de discos corretamente. Além disso, a resolução de tempo é de 1 microssegundo, o que não é suficiente para gravar muitas proteções e superfícies de disco mais complexas.



Podemos ficar felizes por termos conseguido fazer pelo menos algo funcionar, dadas essas restrições, mas esta solução não nos cabe totalmente.



Ajuda de uma porta de saída não promissora



Felizmente, converso com pessoas inteligentes como o Coletivo Bitshifters . (Confira a demonstração mais recente deles, Evil Influences !) Em uma conversa no Slack, Tom Seddon (autor do emulador b2 ) sugeriu ... usar a saída da porta RGB (?)



Cabo adaptador de vídeo para disco ... você não vê isso na Amazon todos os dias.



No começo eu ri dessa ideia, mas quanto mais eu pensava nisso, mais provável parecia para mim. A BBC Micro usa o chip de vídeo 6845 para temporizações . Como o 6522, é um processador temperamental, mas pelo menos seus recursos são bem decifrados graças à demonstração do Bitshifters que explora o 6845 impiedosamente. Além disso, fiz engenharia reversa para obter o emulador jsbeebemular corretamente o Hitachi 6845. Vamos dar uma olhada no trabalho do Oiled Otter neste vídeo e depois nos contar o que vimos:





Tudo funciona graças à configuração incomum do chip 6845. O 6845 funciona a 1 MHz, e o tempo do quadro é definido para ter uma linha raster a 32 microssegundos / 32 bytes por “quadro”. Em cada saída de quadro, os registros de memória de vídeo do 6845 são substituídos para recuperar os próximos 32 bytes de um local potencialmente diferente. Ou seja, a cada 32 microssegundos, um padrão de saída diferente é selecionado na tabela de padrões de saída. Configuramos os pinos RGB para transmitir 8 pixels por microssegundo, o que é 256 por padrão de saída. Isso nos dá um grande número de diferentes padrões de saída possíveis. Mas, como estamos gravando pedaços de 32 microssegundos de codificação de disco FM, apenas alguns padrões são adequados para nós. Em 32 microssegundos, podemos encaixar 8 pulsos / bits de FM. 4 bits serão sincronizados e geralmente são todos 1.4 bits serão bits de dados e existem apenas 16 combinações deles.



Por exemplo, se escrevermos um nibble de dados 0x5, a saída de 32 microssegundos deve ser semelhante a esta:





Os dados de vídeo estarão no formato 00FFFFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFF. O primeiro, o segundo, o quarto e o quinto 00 são bits de sincronização. Entre os bits de sincronização está o padrão de bits de dados 0101 ou 0x5.



As restrições de CPU e memória são bem equilibradas. Em última análise, este circuito é semelhante ao que tentaríamos com o registrador de deslocamento VIA se funcionasse: algum pequeno coprocessador (chip de vídeo) controla a transmissão de um conjunto de bits FM, e o processador central está livre para carregar e fornecer o próximo padrão. Os requisitos de memória são bastante razoáveis. Uma tabela dos fragmentos de saída necessários para 32 microssegundos, graças a um modo de endereçamento linear especial, cabe bem em 1024 bytes. A lista de índices de pesquisa para a faixa inteira é de aproximadamente 12 KB, então tudo se encaixa perfeitamente nos 32 KB de RAM da BBC Micro.



Recursos do BBC Micro / 6845



Último personagem / coluna 6845



Claro, para fazer isso funcionar, você precisa encontrar alguns recursos "divertidos". O primeiro é um recurso do 6845 que faz com que ele produza preto para o último caractere de cada linha de bitmap. Esta é a maldição dos desenvolvedores de demos e, agora, ao que parece, dos pesquisadores do disco também. Aqui está um slide de uma palestra recente em que demonstrei esse problema:





À esquerda está um efeito da demonstração, arruinado por barras pretas verticais causadas pelo problema do "último caractere / coluna preta". Várias linhas de varredura 6845 cabem em uma única passagem de varredura e, infelizmente, listras pretas aparecem involuntariamente. Com o controle de disco, o efeito é muito pior: as barras pretas são substituídas por pulsos indesejados, que são gravados no disco.



A imagem da solução é mostrada à direita: a onda transmitida ao disco é simplesmente invertida. Agora é normal que a última coluna seja sempre preta (mostrada com um contorno laranja), porque um zero é sempre necessário lá. Estritamente falando, isso viola os requisitos de tempo de algumas unidades de disco para sinais W / DATA baixos pulsantes. Aqui está um diagrama do tempo de uma unidade daquela época, Mitsubishi M4852 / M4853 :





De acordo com este esquema, a lógica 0 deve ser mantida em até 2100 ns. Com uma forma de onda invertida, espere 3000 ns ou mais. No entanto, as unidades que tenho apenas se preocupam com a queda dos pulsos de dados, não com sua duração. Isso não é surpreendente. Há alguns truques que eu poderia ter feito para evitar as peculiaridades do 6845 e garantir que os tempos de duração estejam de acordo com as especificações, mas isso acabou sendo opcional, então não o fiz.



DRAM



corrupção DRAM decadência é um pesadelo. Acontece quando falhamos em atualizar a DRAM a tempo. Citando o artigo da Wikipedia sobre atualização de memória :



“Esse processo é realizado automaticamente em segundo plano por um circuito de memória eletrônica e é invisível para o usuário”.


Isso é verdade para sistemas modernos, mas não para a BBC Micro. Na BBC Micro, a atualização de DRAM é um efeito colateral do subsistema de vídeo. Ele se beneficia da propriedade de que os modos de tela padrão ignoram iterativamente todas as linhas DRAM em um curto período de tempo. Você provavelmente já adivinhou onde isso vai dar - nosso modo de vídeo especial, usado para gerar quadros em 32 microssegundos, não é o modo de tela padrão. Ele não garante que irá ignorar todas as linhas DRAM, então ocorre corrupção de DRAM! Corrupção de DRAM não é brincadeira. Devido à corrupção de DRAM não planejada, estava perdendo vários programas e conteúdo de disco. Vou te mostrar, para rir, um programa BASIC que causa danos DRAM a si mesmo em apenas uma fração de segundo:





O triste sobre a corrupção de DRAM é que, se acontecer com você, você pode facilmente perder dados.



Por outro lado, se você espera corrupção de DRAM, geralmente pode contornar isso com facilidade. No caso do Oiled Otter, existem vários ciclos críticos em que o 6845 está em um estado incomum. Para salvar a atualização da DRAM em cada um desses ciclos, funciona um incremento manual de recuperação de dados da memória.



Oportunidades abertas



Agora que temos um sistema de gravação de disco em funcionamento, ignorando o controlador de disquete, o que podemos fazer com ele? No vídeo acima, já demonstramos sua capacidade de gravar discos FM codificados aleatoriamente.



Mas neste estudo tivemos muita sorte. Devido às deficiências do registrador de deslocamento VIA, tivemos que procurar uma solução com pinos de saída de vídeo e obtivemos acesso a uma resolução de temporização muito mais precisa no pino W / DATA . Estamos usando o MODE4 de um microcomputador BBC com um clock de pixel de 8 MHz. Isso significa que você pode gerar pixels pretos ou brancos a cada 125 ns, alternando os pulsos de gravação com resolução de 125 ns... Se quiséssemos gastar um pouco mais de memória extra (que temos) em mesas maiores, poderíamos usar MODE0, que usa um clock de pixel de 16 MHz, que oferece resolução de 62,5 ns. Eu me certifiquei de que 125ns é bom o suficiente para todas as proteções de disco testadas, mas é ótimo que ainda temos algum espaço de manobra.



Proteção de longa faixa



Minha proteção de disco favorita é a proteção de longa faixa. Ela era popular durante o Amiga... Acho que nunca foi usado na BBC Micro. Eu gosto da proteção de trilha longa porque é muito fundamental: o controlador de disquete tem muita tolerância para velocidades de gravação variáveis ​​(porque os drives de disco giram em velocidades diferentes), mas ele grava apenas em uma velocidade correta.



A proteção mais complexa com trilhas longas é gravar dois setores em uma trilha, na qual um dos setores é gravado em uma velocidade mais alta. A verificação da proteção contra cópia é baseada no tempo que levou para ler esses dois setores. O setor escrito em uma velocidade mais alta deve ser lido muito mais rápido.



O Oiled Otter pode registrar tal faixa? Sim, e muito fácil. Dada a resolução de saída de 125 ns, é fácil criar várias entradas de tabela de saída que parecem normais, mas com 125 nanossegundos cortados a cada 1 microssegundo. Aqui está um vídeo de criação de proteção de trilha longa e verificação de leituras de disco:







Proteção com bits fuzzy



Provavelmente, é hora de voltarmos ao ponto de partida: proteção com bits fuzzy. O Oiled Otter pode criar bits fuzzy no hardware de 1981? Vamos tentar. Aqui está uma imagem dos resultados de um par de leituras de setor depois que ele foi escrito pelo comando FUZZ do sistema Oiled Otter.





A instrução FUZZ escreve o nibble 0x8 e o bit de dados é progressivamente separado em incrementos de 125 ns. Isso é semelhante à descrição de como os bits difusos do Dungeon Master foram gravados. Como você pode ver na imagem, os bytes de dados 0x88 logo começam a ser lidos incorretamente e de maneira não determinística. Mas a variância não é 100% aleatória como os bits fracos - a variância é se o bit 0x8 foi escrito tarde o suficiente para ter uma chance de ser perdido. Se for omitido, ainda podemos ver que há padrões e lógica nessa loucura.



Os resultados apresentados acima são uma aplicação dos princípios dos bits difusos aos dados codificados em FM. Na codificação FM, cada bit de dados é intercalado com um bit de sincronização. Isso leva ao fato de que às vezes os bits do clock entram no fluxo de dados (veja os bytes 0xFF na primeira execução - provavelmente são bits do clock). A defesa do Mestre do Calabouço usa bits difusos em conjunto com o MFM. Isso leva a uma situação mais simples, onde bits difusos se movem entre duas codificações de bits de dados válidos e não tocam os bits de sincronização! Claro, Oiled Otter pode escrever MFM, GCR e qualquer outra codificação que você imaginar. Todos esses são apenas protocolos diferentes de um primitivo fundamental - a capacidade de transferir um pulso para o inversor a qualquer momento com boa resolução.



Para avaliá-lo corretamente, daremos a visualização dos bits difusos no disco a partir do osciloscópio. Os máximos são bastante desiguais, e quando os dois pulsos estão muito próximos um do outro (cerca de 1 microssegundo, muito próximos por qualquer codificação padrão), a força de reversão da magnetização reconhecida pelo drive até começa a diminuir.





Missão cumprida



Conseguimos registrar pulsos de disco com resolução de 125 ns. Isso é perfeitamente suficiente para criar proteções de disco complexas, incluindo trilhas longas, bits fracos e bits fuzzy. Nada mal para o hardware de 1981 com a velocidade de execução de comando mais rápida de 1 microssegundo!



Veja também:






All Articles