Porque
Se você é um entusiasta de computadores retrô, pode pular com segurança o discurso motivacional e ir para a próxima seção.
Em agosto de 2018, eu e meu filho
Ivanq, de 13 anos, passamos escrevendo uma demo da
Good Apple . No festival
Chaos Constructions , nosso trabalho ficou em segundo lugar, pelo qual recebemos um prêmio em dinheiro de 35 mil rublos, que honestamente dividimos igualmente. Para uma criança, essa é uma boa renda, embora, ao criar sites, ele ganhe a mesma quantia em menos tempo. Obviamente, eu poderia gastar meu tempo com maior benefício econômico ... Mas não em agosto! Devemos descansar do trabalho. Programar para seu próprio prazer é um luxo que você só pode pagar em férias.

A recompensa material, é claro, não serve como motivação, mas reforça emoções positivas. Surpreendentemente, a demo de um computador soviético esquecido coletou
milhares de visualizações no youtube e acabou em uma
lista de reprodução com quase cem mil visualizações. Mas, o que é mais surpreendente, em 2018, um prêmio em dinheiro é concedido a ela! Talvez a própria improbabilidade do que está acontecendo dê origem a um surto emocional.
No entanto, há algo mais importante.
Ao criar o “Good Apple”, tivemos que trabalhar com hardware real, pois usamos os recursos do computador, que os emuladores não reproduzem corretamente. Antes de tudo, eu queria conseguir um trabalho igualmente estável com os discos rígidos IDE e com seus substitutos modernos na forma de Compact Flash.
Foi nesse projeto que meu filho de 13 anos ganhou uma experiência inestimável no desenvolvimento industrial. Ferro defeituoso. Bom hardware que não se comporta conforme descrito na documentação. Documentação elaborada com erros. Falta de documentação sobre vários problemas. Escreva seus próprios testes para identificar problemas com o ferro. Prazos de entrega. Testes em diferentes máquinas e configurações. Escreva seu próprio cross-assembler (quando ficou claro que as soluções existentes impedem o processo de desenvolvimento). E, finalmente, após uma breve celebração do sucesso - o lançamento obrigatório da versão final, corrigindo vários bugs.
À primeira vista, parece que uma experiência semelhante poderia ser obtida com algum Arduino moderno. De fato, tivemos que mergulhar na própria selva de circuitos. Calculamos o número de medidas para as quais as instruções são executadas. Em diferentes tipos de memória, desta vez é diferente. O controlador e o processador de memória operam em frequências diferentes, para que os mesmos comandos possam ser executados em momentos diferentes, mesmo no mesmo tipo de memória. A duração da execução do subprograma não é igual à soma das durações das instruções deste subprograma. Tivemos que escrever nossas próprias ferramentas para testar e otimizar o código em hardware real.

Acabou que meu filho estava estudando o circuito BK 0011 (para quais bordas do sinal ocorrem quando o RPLY é acionado etc.) - não entendo mais nada sobre isso. Então ele teve a idéia de criar seu próprio emulador BK, compatível com hardware real e preciso até o ritmo, e até escreveu o kernel ... No entanto, essa é outra história.
No total, em um mês - do estudo de montador à criação de suas próprias ferramentas de desenvolvimento, de testes rigorosos ao trabalho multimídia finalizado. Tudo isso seria impossível sem o principal: planejamento. Talvez a lição mais valiosa aprendida. Você assume uma tarefa impossível. Você entende que encontrará dificuldades insuperáveis. Estão planejando Você faz. O resultado surpreende a todos tanto que até os conhecedores culpam a trapaça ("você fez o overclock do processador!").
Por que não o ZX Spectrum?

Novamente, começarei com uma estranha: finanças. A julgar pelos anúncios no Avito, em média, o BC 0010 custa várias vezes mais que o ZX Spectrum. É claro que, para um exemplo raro do Spectrum nativo em perfeitas condições, eles solicitarão uma soma redonda. Mas o BC 0011m totalmente carregado ainda será mais caro. Se for capaz de encontrar. Os preços falam por si: o valor da coleção de BC 0010 é mais alto. E BK 0011m - e ainda mais. Ter esse computador em casa é muito bom.
O segundo argumento é de 16 bits. Não há nada de 8 bits no BC 0010. O processador nem sabe como adicionar números de 8 bits; não possui um comando ADDB. 16 bits em tudo. A razão para isso é a arquitetura DEC PDP-11. Muitos consideram o sistema de comando do processador PDP-11 o mais bem-sucedido e mais conveniente já criado. Claro, há quem queira argumentar com essa afirmação. Mas aqui está um fato: no Yandex
Demodulation Festival, três seminários foram dedicados às arquiteturas de processadores e dois deles foram sobre o PDP-11. Isso, de fato, é uma lenda, um marco na história da tecnologia de computadores, que ainda continua excitando as mentes dos entusiastas. O BK 0010 torna possível tocar nessa legenda. E não apenas para tocar, mas para entendê-lo nos mínimos detalhes, para sentir toda a beleza e graça do montador de DEC: registros absolutamente iguais, oito métodos de endereçamento, memória linear - beleza!
O terceiro argumento: muitas demos foram escritas para o ZX Spectrum. Para BC 0010 -
menos de cinquenta , contando pequenos de 256 bytes e 4 kilobytes. O lugar na demoscene é quase gratuito, é onde até um iniciante pode se mostrar!
E a última consideração, puramente subjetiva. Eu assisto à demoscene russa desde 1994. Infelizmente, o partido spektrumistov me parece mais tóxico e hostil. Claro, existem pessoas amigáveis maravilhosas! Eu tenho um grande respeito por eles e pelo trabalho deles. Mas, em geral - provavelmente por causa de seu caráter de massa - a cena do Spectrum estava cheia de conflitos, esclarecimentos de relações e até intrigas, como a votação de nomes (quando eles votam apenas em "seus próprios" em concursos). Enquanto estão no pequeno palco do BC-shnoy, eles não fazem perguntas como "quem é mais legal" e ficam felizes com cada novo participante. Repito: esta é minha impressão puramente pessoal, que você pode ignorar.
Ferro de verdade
Vinte anos se passaram antes de eu voltar a escrever programas para o BC. Ao longo dos 20 anos, muita coisa mudou. Para mim, pessoalmente, ocorreu uma grande mudança na mente: "Pense Diferente". Este slogan é colocado nos créditos finais da nossa demo "Good Apple".
Costumávamos carregar jogos de um gravador por 5 minutos. Depois vieram os controladores da unidade. Atrás deles estão os discos rígidos. Em seguida,
réplicas recém-encontradas de controladores com o Compact Flash a bordo. Agora é costume emular drives flash na cena retrô ... Mas espere, em 2019, temos uma fonte de som portátil de alta qualidade - iPhone. Então, vamos pegar o cabo de áudio DIN-5 padrão - mini jack (você nem precisará soldar novamente) e carregar o BK do iPhone em alta velocidade.
Analisei o rastreio da ROM,
revelei como poderia superar um pouco o algoritmo de inicialização do gravador e fazer o BC ler os dados 4 vezes mais rápido.
O próximo passo foi escrever um micro-carregador de inicialização que leia dados em um
formato turbo especialmente projetado. O carregador e os dados foram colocados um após o outro em um único arquivo WAV (o
conversor foi escrito por
Lenar Zakirov ). O BK 0010 lê e inicia automaticamente o micro-carregador, que, por sua vez, lê o restante dos dados do arquivo. As frequências no formato turbo atingem 22 KHz, portanto, os requisitos para a qualidade da fonte de som são altos. iPhone está lidando. Um bom tocador de música ainda mais. Placa de som do computador também.
Depois foi a vez do
montador cruzado . Ele adicionou opções para salvar o programa em WAV (tanto no formato padrão quanto no turbo). Além disso, o cross-assembler pode reproduzir imediatamente WAV através de uma placa de som. Imagine como o desenvolvimento acelerou! Não é necessário se preocupar em gravar uma imagem de disco em um cartão CF após cada compilação. Basta fazer alterações no código, clicar em "Build", o som flui para o CD e após alguns segundos o programa já está sendo executado em hardware real. Para receber som em um formato padrão, basta pressionar as teclas L (Carregar) e Enter no BC 0011 (carregar o primeiro programa encontrado). Para transmitir som no formato turbo, você deve primeiro executar o micro-carregador de inicialização (para mim, ele inicia automaticamente a partir do disco rígido quando o BC é ligado; a qualquer momento, você pode fazer login no sistema pressionando a tecla STOP).

É mais fácil conectar o BK à TV no modo monocromático, na entrada AV composta comum. É necessário soldar o cabo com uma “tulipa” em uma extremidade e DIN-5 na outra. Um sinal monocromático vem do 4º pino do DIN-5 do conector BK, designado “TV”. O solo é tradicionalmente associado ao segundo pino da DIN-5.
Pessoalmente, sou fã de monitores CRT monocromáticos - eles fornecem clareza de imagem inatingível em monitores coloridos com sua grade de abertura. Mas a maioria dos jogos e demos é preferível assistir em cores. Para fazer isso, use a saída BK “TVC” e conecte-a à TV via RGB SCART. Contatos 3, 4, 5 na DIN-5 - respectivamente vermelho, azul, verde. Pino 1 - Sincronização. O pino 2 está retificado. Quando conectado a uma TV LCD, é útil aplicar +5 volts ao 16º pino do SCART (através de um resistor de 200 ohm ou mais). Geralmente, são utilizados 5 volts no conector “TV” adjacente (pino 1).
Você pode usar um conversor SCART-HDMI. Avisarei imediatamente que o BC exibe uma imagem com uma frequência não de 48 quadros por segundo, mas 48,83; portanto, em vez de uma rolagem suave nos monitores LCD, será notado um tremor periódico. Resolvi esse problema
substituindo o ressonador de cristal de quartzo de 12 megahertz a 12.288 MHz. No entanto, espasmos eram perceptíveis apenas em algumas demos. A maioria dos programas BC não usa sincronização de taxa de quadros.
Por que não se contentar com o emulador, para o qual um computador real pode ser necessário? Encontrei quatro coisas pouco emuladas:
- Comportamento do falante em altas frequências.
- Sincronização da imagem e paletas com o feixe.
- Tempo exato de execução dos comandos (importante para a música através do Covox).
- Trabalhe com discos rígidos IDE em alta velocidade.
Se você não planeja fazer nenhuma das opções acima, o emulador é suficiente para você.
Emulação
No MacOS, eu uso o emulador
BK2010 . Não é muito preciso, mas adequado para a maioria das tarefas.
O emulador
GID mais avançado atualmente é executado no Windows. Também roda no CrossOver para MacOS e Wine para Linux. O emulador possui um bom depurador, um visualizador de páginas de memória e similares.
Para gravar imagens de disco no Compact Flash, eu uso o utilitário multi-plataforma
Etcher . Mas, mais frequentemente, transmito dados através do canal de áudio.
Ferramentas de desenvolvimento

Os caras do grupo de demonstração da
Equipe em Excesso incitaram o montador Alexei Morozov. No começo, usamos, mas logo Ivanq escreveu a sua - multiplataforma, em Python. Funciona mais devagar, mas muito mais rico em funcionalidades. Isso inclui suporte para projetos de vários arquivos e expressões aritméticas complexas, tipos de dados de palavra dupla, integração com o Sublime Text e suporte estendido a erros de compilação, salvando o resultado em um formato de arquivo de som, compilação não apenas para o BC, mas também para o UKSC e muito mais. Você pode ler sobre tudo isso na documentação oficial.
O assembler cruzado é chamado
PDPy11 .
Alguns veteranos reclamam que o PDPy11 não possui macros do montador de macro DEC clássico (Macro-11). O assembler de macros é, em certo sentido, um idioma diferente. Provavelmente é bom para escrever programas de sistema, mas jogos e demos sérios para BC foram escritos, tanto quanto eu sei, em montadores clássicos comuns. Ironicamente: para o código fonte dos programas BK, é habitual usar a extensão de arquivo .mac (de “macro”) mesmo naqueles assemblers que não suportam macros. De qualquer forma, os recursos do PDPy11 são suficientes para gravar programas de qualquer nível de complexidade.
O depurador está embutido no emulador
GID . Permite definir os endereços dos pontos de interrupção, interromper ou continuar a execução do programa a qualquer momento, ver o conteúdo dos registros e da memória, executar o programa passo a passo, alterar o conteúdo da memória, etc.
Para
converter gráficos para o formato BC, escrevemos um
conversor online . Resolução BK - 256x256 pixels no modo colorido ou 512x256 no modo monocromático. É melhor que as imagens maiores não sejam inseridas no conversor.
A documentação
Um ótimo
tutorial sobre programação em linguagem assembly foi escrito por Yuri Zaltsman. As diferenças entre BC 0011m e BC 0010 estão escritas
aqui . Havia também o modelo BK 0011 (sem o "m"), mas foi rapidamente retirado de produção, reconhecendo-o como malsucedido.
Apesar do BC 0011m ter ótimos recursos (paletas de cores, páginas adicionais de memória), primeiro aconselho a programação do BC 0010 - esse modelo é mais simples e compreensível. Qualquer programa escrito corretamente para o BC 0010 também será executado no BC 0011m.
O dispositivo do processador e o conjunto de instruções estão bem descritos na
Wikipedia .
Para os mais corajosos -
programação em códigos .
Olá mundo!
A área de memória da tela em BC 0010 começa com o endereço 40000 (canto superior esquerdo) e termina com o endereço 77777 (canto inferior direito da tela). Como você pode imaginar, a arquitetura do PDP-11 usa um sistema de números decimais 8. Mas o PDPy11 cross-assembler, é claro, permite que você escreva números também em sistemas binários, decimais e hexadecimais - faça o que quiser.
Para colocar um
ponto na tela , você precisa escrever um número na área de memória da tela. Os argumentos no assembler do DEC são escritos da esquerda para a direita: source e, em seguida, receiver Por exemplo:
MOV #100000,@#60040 ;
O sinal # significa que o argumento é apenas um número (não um endereço). O sinal @ # significa que o argumento é um endereço absoluto (ou seja, não será alterado quando o programa for movido para outro local da memória).
A limpeza da tela fica assim:
MOV #40000,R1 ; MOV #20000,R0 ; 1: CLR (R1)+ ; , R1 SOB R0,1 ;
O endereçamento indireto (R1) usa o registro R1 como um ponteiro de endereço. A memória no BC é endereçada por byte, mas a instrução CLR limpa imediatamente dois bytes vizinhos: primeiro 40000 e 40001, na próxima etapa do ciclo 40002 e 40003, e assim por diante. A notação (R1) + significa que após o uso do argumento você precisa aumentá-lo. Nesse caso, por 2, porque o comando processa 2 bytes. O contador de loop pode ser qualquer registrador. SOB subtrai uma unidade do registro e vai para o rótulo 1. Os rótulos locais são indicados por números e dois pontos, seu escopo entre dois rótulos globais. Os rótulos globais devem começar com uma letra e também terminar com dois pontos.
A instrução CLR pode ser feita para trabalhar com bytes anexando a letra "B". Então CLRB (R1) + aumentará o registro R1 não em 2, mas em 1.
MOV #40000,R1 MOV R1,R0 ; 1: CLRB (R1)+ SOB R0,1
Você pode fazer a mesma coisa mais curto. Limpamos a tela de baixo para cima usando o método de indexação de endereçamento:
MOV #40000,R0 1: CLRB 37777(R0) ; (37777+R0) SOB R0,1
Se for necessária alta velocidade, é melhor limpar a memória não por bytes, mas imediatamente com palavras. Será duas vezes mais rápido. Mas você pode acelerar além disso: por algum motivo, o comando CLR é mais lento que o MOV. Portanto:
CLR R2 ; R2 MOV #40000,R1 ; MOV #20000,R0 ; 1: MOV R2,(R1)+ ; , R1 SOB R0,1 ;
Agora, escolhendo uma das quatro maneiras de limpar a tela, você já pode definir pontos. No modo de cor, cada ponto corresponde a dois bits. Monocromático, um pouco. O BC não possui uma troca de programa dos modos de tela. À qual saída conectei o monitor, recebi essa imagem.
Para maior clareza, escrevemos as cores dos pontos no sistema de números binários:
MOVB #0b00001100,@#50010 MOVB #0b00110000,@#50112 MOVB #0b11000000,@#50313
As cores em cada par de bits são codificadas da seguinte forma: se apenas um bit par for definido - um ponto verde, apenas um bit ímpar - azul, os dois bits serão definidos - vermelho, os dois bits serão redefinidos - pretos. Bem, um monitor monocromático mostra cada bit como um ponto separado.
O comando MOVB grava 4 pontos na memória na tela de uma só vez, e o comando MOV grava 8 pontos. Se você não deseja afetar pontos vizinhos, use os comandos BIC (Bit Clear) e BIS (Bit Set), por exemplo:
BICB #0b00001100,@#50112 ; BISB #0b00000100,@#50112 ;
Um ponto interessante: no texto, escrevemos os bits menos significativos à direita dos bits mais significativos. E na tela, pelo contrário: os pontos correspondentes aos bits menos significativos aparecem à esquerda.
Na verdade, isso é tudo sobre o dispositivo de memória na tela BK 0010.
Mas e a
saída de texto ?
MOV #Text,R1 ; EMT 20 ; HALT ; Text: .ASCII “Hello, World!” .BYTE 0 ;
Mostre a fonte!

Será mais fácil começar olhando o código fonte das demos finalizadas:
In Your Space - demo para Covox, fontes no arquivo.
Boa Apple - fontes no GitLab (um projeto complexo de vários arquivos).
O EIS é um emulador de instruções aritméticas estendidas com códigos-fonte.
Fontes de três demos de 256 bytes.
Na 28ª edição da revista
Downgrade, um grande artigo sobre a evolução dos algoritmos de música rastreador no BC 0010, com fragmentos de programa e explicações detalhadas. Um conto nostálgico de um demosceno inicial.
Quando começar?
Agora mesmo. Após 4 semanas em Kazan será realizada a demopati
CAFe 2019 . O programa do festival tem uma competição
BK 0010 - 512 bytes . Este tamanho cabe 85 a 256 instruções - ideal para iniciantes. Duas semanas são suficientes para você lidar com as ferramentas e escrever a primeira demo simples. Depois disso, ainda haverá uma semana e meia para escrever um segundo trabalho mais sério.
Vá em frente, você pode!
Chat por telegrama , fórum
zx-pk - eles o ajudarão em qualquer lugar. envie trabalho para o concurso e, melhor ainda, venha você mesmo.
Cena está viva !