Dados General Nova - Data General Nova

Um sistema Nova (bege e amarelo, parte inferior central) e um sistema de disco rígido de cartucho (aberto, abaixo do Nova) em uma montagem em rack quase vazia.
Painel frontal do Data General Nova 1200
Uma Nova 1200, no meio à direita, processou as imagens geradas pelo EMI-Scanner, o primeiro scanner de TC disponível comercialmente no mundo .

O Data General Nova é uma série de minicomputadores de 16 bits lançados pela empresa americana Data General . A família Nova era muito popular na década de 1970 e, por fim, vendeu dezenas de milhares de unidades.

O primeiro modelo, conhecido simplesmente como "Nova", foi lançado em 1969. O Nova era embalado em um único gabinete para montagem em rack e tinha capacidade de computação suficiente para lidar com a maioria das tarefas simples. O Nova se tornou popular em laboratórios de ciências em todo o mundo. Foi seguido no ano seguinte pelo SuperNOVA , que correu cerca de quatro vezes mais rápido.

Introduzida durante um período de rápido progresso no design de circuito integrado (ou "microchip"), a linha passou por várias atualizações nos cinco anos seguintes, introduzindo o 800 e 1200, o Nova 2, Nova 3 e, finalmente, o Nova 4. A a implementação de um único chip também foi introduzida como microNOVA em 1977, mas não teve uso generalizado quando o mercado mudou para novos designs de microprocessador. A Fairchild Semiconductor também apresentou uma versão de microprocessador do Nova em 1977, o Fairchild 9440 , mas também teve uso limitado no mercado.

A linha Nova foi sucedida pelo Data General Eclipse , que era semelhante em muitos aspectos, mas adicionou suporte a memória virtual e outros recursos exigidos por sistemas operacionais modernos . Uma atualização de 32 bits do Eclipse resultou na série Eclipse MV da década de 1980.

História

Edson de Castro e o PDP-X

Edson de Castro foi o gerente de produto da pioneira Digital Equipment Corporation (DEC) PDP-8 , um computador de 12 bits amplamente conhecido como o primeiro verdadeiro minicomputador. Ele também liderou o projeto do PDP-8 / I atualizado, que usava os primeiros circuitos integrados no lugar de transistores individuais.

Durante o processo PDP-8 / I, de Castro visitou fabricantes de placas de circuito que estavam fazendo avanços rápidos na complexidade das placas que podiam montar. de Castro concluiu que o 8 / I poderia ser produzido com montagem totalmente automatizada em grandes placas, o que teria sido impossível apenas um ano antes. Outros dentro da DEC se acostumaram com as placas menores usadas em máquinas anteriores e estavam preocupados em rastrear problemas quando havia muitos componentes em uma única placa. Para o 8 / I, optou-se por ficar com placas pequenas, usando a nova embalagem " flip-chip " para uma melhoria modesta na densidade.

Durante o período em que o PDP-8 estava sendo desenvolvido, a introdução do ASCII e sua principal atualização em 1967 levaram a uma nova geração de designs com comprimentos de palavra que eram múltiplos de 8 bits em vez de múltiplos de 6 bits como na maioria dos designs anteriores. Isso levou a designs de gama média trabalhando em comprimentos de palavra de 16 bits em vez das atuais linhas de 12 e 18 bits da DEC. de Castro estava convencido de que era possível melhorar o PDP-8 construindo uma CPU de minicomputador de 16 bits em uma única placa quadrada de 15 polegadas.

Em 1967, de Castro iniciou um novo esforço de design conhecido como "PDP-X", que incluía vários recursos avançados. Entre eles estava um único design subjacente que poderia ser usado para construir plataformas de 8, 16 e 32 bits. Isso progrediu ao ponto de produzir vários documentos detalhados de arquitetura. Ken Olsen não apoiou este projeto, sentindo que não oferecia vantagens suficientes sobre o PDP-8 de 12 bits e o PDP-9 de 18 bits . Eventualmente, foi cancelado na primavera de 1968.

Design da Nova

O cancelamento do PDP-X levou de Castro a considerar deixar o DEC para construir um sistema por conta própria. Ele não estava sozinho; no final de 1967, um grupo de engenheiros com ideias semelhantes se formou para considerar tal máquina. O grupo incluía Pat Green, um gerente de divisão, Richard Sogge, outro engenheiro de hardware e um engenheiro de software, Henry Burkhardt III. Em contraste com o PDP-X, o novo esforço concentrou-se em uma única máquina que poderia ser lançada no mercado rapidamente, pois de Castro achava que o conceito do PDP-X era ambicioso demais para uma pequena empresa iniciante .

Discutindo isso com os outros da DEC, o conceito inicial levou a uma máquina de 8 bits que seria menos custosa de implementar. O grupo começou a conversar com Herbert Richman, um vendedor da Fairchild Semiconductor que conhecia os outros por meio de seus contatos com a DEC. Na época, a Fairchild estava lutando com a Texas Instruments e Signetics no crescente mercado de TTL e estava introduzindo novas fábricas que permitiam designs mais complexos. A última série 9300 da Fairchild permitia até 96 portas por chip, e eles usaram isso para implementar vários chips de 4 bits como contadores binários e registradores de deslocamento .

O uso desses ICs reduziu a contagem total de ICs necessária para implementar uma unidade lógica aritmética (ALU) completa, o principal componente matemático de uma CPU, permitindo a expansão de um design de 8 bits para 16 bits. Isso exigiu a expansão da CPU de uma única placa de circuito impresso de 15 por 15 polegadas (38 cm × 38 cm) para duas, mas tal design ainda seria significativamente mais barato de produzir do que o 8 / I, embora ainda seja mais poderoso e Baseado em ASCII. Uma terceira placa continha o circuito de entrada / saída e um sistema completo normalmente incluía outra placa com 4 kB de memória de acesso aleatório . Um sistema completo de quatro placas que cabe em um único chassi de montagem em rack.

As placas foram projetadas para que pudessem ser conectadas por meio de um backplane de circuito impresso , com o mínimo de fiação manual, permitindo que todas as placas fossem construídas de maneira automatizada. Isso reduziu bastante os custos acima de 8 / I, que consistia em muitas placas menores que precisavam ser conectadas no backplane, que por sua vez era conectado por meio de wire wrap . A construção de placa maior também tornou o Nova mais confiável, o que o tornou especialmente atraente para ambientes industriais ou de laboratório.

O novo design usava uma arquitetura simples de carga e armazenamento que ressurgiria nos designs RISC na década de 1980. Como a complexidade de um flip-flop estava sendo rapidamente reduzida à medida que eram implementados em chips, o design compensou a falta de modos de endereçamento do design de carga / armazenamento adicionando quatro acumuladores de uso geral , em vez do único registro que seria encontrado em ofertas de baixo custo semelhantes, como a série PDP.

Nova introdução

No final de 1967, Richman apresentou o grupo ao advogado Fred Adler, de Nova York, que começou a buscar várias fontes de financiamento para capital inicial. Em 1968, Adler fez um grande acordo de financiamento com um consórcio de fundos de capital de risco da área de Boston, que concordou em fornecer um investimento inicial de $ 400.000 com um segundo $ 400.000 disponível para aumento da produção. de Castro, Burkhart e Sogge saíram da DEC e começaram a Data General (DG) em 15 de abril de 1968. Green não se juntou a eles, considerando o empreendimento muito arriscado, e Richman não se juntou até que o produto estivesse pronto e funcionando no final do ano.

O trabalho no primeiro sistema levou cerca de nove meses, e os primeiros esforços de vendas começaram naquele novembro. Eles tiveram um pouco de sorte porque a Fall Joint Computer Conference foi adiada até dezembro daquele ano, então eles puderam trazer uma unidade de trabalho para o Moscone Center, onde eles executaram uma versão do Spacewar! . A DG lançou oficialmente o Nova em 1969 a um preço base de US $ 3.995 (equivalente a $ 28.193 em 2020), anunciando-o como "o melhor computador pequeno do mundo". O modelo básico não era muito útil fora da caixa, e adicionar 4 kW (8 kB) de RAM na forma de memória central normalmente aumentava o preço para US $ 7.995. Em contraste, um 8 / I com 4 kW (6 kB) custava US $ 12.800.

A primeira venda foi para uma universidade no Texas, com a equipe montando um exemplar que foi enviado em fevereiro. No entanto, isso foi em meio a uma greve no setor aéreo e a máquina nunca chegou. Eles enviaram um segundo exemplar, que chegou prontamente quando a greve havia terminado naquele ponto, e em maio o original foi finalmente entregue também.

O sistema foi bem-sucedido desde o início, com o 100º sendo vendido após seis meses e o 500º após 15 meses. As vendas aceleraram à medida que novas versões foram introduzidas e, em 1975, a empresa tinha vendas anuais de US $ 100 milhões.

Super Nova

Ken Olsen previu publicamente que o DG iria falhar, mas com o lançamento do Nova ficou claro que isso não aconteceria. Nessa época, várias outras empresas estavam falando sobre a introdução de designs de 16 bits também. Olsen decidiu que estes representavam uma ameaça para sua linha de 18 bits, bem como de 12 bits, e iniciou um novo esforço de design de 16 bits. Ele surgiu em 1970 como o PDP-11 , um design muito mais complexo que era tão diferente do PDP-X quanto o Nova. Os dois projetos competiam fortemente no mercado.

Rumores do novo sistema do DEC chegaram à DG logo depois que o Nova começou a ser comercializado. Na primavera de 1970, eles contrataram um novo designer, Larry Seligman, para superar qualquer máquina possível em construção. Duas mudanças importantes ocorreram desde que o Nova foi projetado; uma foi que a Signetics introduziu o 8260, um IC de 4 bits que combinava um somador, XNOR e AND, o que significa que o número de chips necessários para implementar a lógica básica foi reduzido em cerca de três vezes. Outra era que a Intel estava falando agressivamente sobre memórias baseadas em semicondutores, prometendo 1000 bits em um único chip e rodando em velocidades muito mais altas do que o núcleo.

O novo design de Seligman aproveitou essas duas melhorias. Para começar, os novos ICs permitiram que a ALU fosse expandida para a largura total de 16 bits nas mesmas duas placas, permitindo que ela realizasse operações matemáticas e lógicas em um único ciclo e, assim, tornando o novo design quatro vezes mais rápido que o original . Além disso, uma nova memória de núcleo menor foi usada que melhorou o tempo de ciclo de 1.200 ns do original para 800 ns, oferecendo mais1/3melhoria. O desempenho pode ser melhorado ainda mais com a substituição do núcleo por memória somente leitura ; sem o ciclo de leitura / gravação do núcleo, ele pode ser acessado a 300 ns para um aumento dramático de desempenho.

A máquina resultante, conhecida como SuperNOVA , foi lançada em 1970. Embora os modelos iniciais ainda usassem núcleo, todo o projeto foi baseado na premissa de que memórias semicondutoras mais rápidas estariam disponíveis e a plataforma poderia fazer uso total delas. Ele foi lançado no mesmo ano que o SuperNOVA SC , apresentando memória de semicondutor (SC). A memória de desempenho muito superior permitiu que o CPU, que era síncrono com a memória, aumentasse ainda mais a velocidade para funcionar a um tempo de ciclo de 300 ns (3,3 MHz). Isso o tornou o minicomputador mais rápido disponível em muitos anos. Inicialmente, a nova memória também era muito cara e esquentava, por isso não foi amplamente utilizada.

1200 e 800

Placa de circuito impresso Nova 1200 CPU . O 74181 ALU é o grande IC centro-direito.

Como uma demonstração do poder de sua tecnologia de matriz de gate da Micromatrix , em 1968 a Fairchild fez o protótipo do 4711, uma ALU de 4 bits de chip único. O design nunca foi planejado para produção em massa e era muito caro para produzir. A introdução do Signetics 8260 em 1969 forçou sua mão; tanto a Texas Instruments quanto a Fairchild introduziram suas próprias ALUs de 4 bits em 1970, o 74181 e o 9341, respectivamente. Em contraste com o 8260, os novos designs ofereciam todas as funções lógicas comuns e reduziram ainda mais a contagem de chips.

Isso levou DG a considerar o projeto de uma nova CPU usando esses ICs mais integrados. No mínimo, isso reduziria a CPU a uma única placa para o Nova básico ou o SuperNOVA. Surgiu um novo conceito em que um único chassi seria capaz de hospedar qualquer uma das máquinas simplesmente trocando a placa de circuito da CPU, o que permitiria aos clientes comprar o sistema de baixo custo e fazer upgrade a qualquer momento.

Enquanto Seligman estava trabalhando no SuperNOVA, a empresa recebeu uma carta de Ron Gruner dizendo "Eu li sobre o seu produto, li seus anúncios e vou trabalhar para você. E vou ser em seu escritório em uma semana para falar com você sobre isso. " Ele foi contratado na hora. Gruner foi encarregado da máquina de baixo custo, enquanto Seligman projetou uma versão correspondente de alto desempenho.

O modelo de baixo custo da Gruner foi lançado em 1970 como o Nova 1200 , o 1200 referindo-se ao uso da memória central de 1.200 ns do Nova original. Ele apresentava um ALU de 4 bits baseado em um único chip 74181 e, portanto, era essencialmente um Nova reempacotado. O SuperNOVA de quatro ALU reembalado de Seligman foi lançado em 1971 como o Nova 800 , resultando em uma nomenclatura um tanto confusa, onde o modelo de menor número tem desempenho superior. Ambos os modelos foram oferecidos em uma variedade de caixas, o 1200 com sete slots, o 1210 com quatro e o 1220 com quatorze.

Modelos posteriores

A essa altura, o PDP-11 estava finalmente sendo enviado. Ele ofereceu uma arquitetura de conjunto de instruções muito mais rica do que a deliberadamente simples do Nova. A melhoria contínua nos projetos de CI, e especialmente sua relação preço-desempenho , estava corroendo o valor das instruções simplificadas originais. Seligman foi encarregado de projetar uma nova máquina que seria compatível com o Nova, oferecendo um ambiente muito mais rico para quem o desejasse. Esse conceito foi enviado como a série Data General Eclipse , que oferecia a capacidade de adicionar circuitos adicionais para personalizar o conjunto de instruções para cargas de trabalho científicas ou de processamento de dados. O Eclipse teve sucesso em competir com o PDP-11 na extremidade superior do mercado.

Na mesma época, rumores de uma nova máquina de 32 bits da DEC começaram a surgir. A DG decidiu que precisavam de um produto semelhante e Gruner foi encarregado do que se tornou o Projeto Fountainhead. Dado o escopo do projeto, eles concordaram que todo o esforço deveria ser realizado fora do local, e Gruner escolheu um local no Research Triangle Park na Carolina do Norte . Este projeto se tornou muito complexo e foi cancelado anos depois.

Enquanto esses esforços estavam em andamento, o trabalho na linha Nova continuou.

840

Executando Nova 840 (O painel frontal foi substituído por um de um 1220)

O 840, oferecido pela primeira vez em 1973, também incluía um novo sistema de memória paginada permitindo endereços de até 17 bits. Um índice desloca o endereço base para a maior memória de 128 kword. Na verdade, a instalação dessa quantidade de memória exigiu um espaço considerável; o 840 é enviado em um grande estojo de 14 slots.

Nova 2

A próxima versão foi o Nova 2 , com as primeiras versões lançadas em 1973. O Nova 2 era essencialmente uma versão simplificada das máquinas anteriores, pois o aumento da densidade do chip permitiu que a CPU fosse reduzida em tamanho. Enquanto o SuperNOVA usava três placas de 15 × 15 "para implementar a CPU e sua memória, o Nova 2 encaixava tudo isso em uma única placa. A ROM era usada para armazenar o código de inicialização, que era então copiado para o núcleo quando o" programa carregava "switch foi virado. Versões estavam disponíveis com quatro (" 2/4 "), sete e dez (" 2/10 ") slots.

Nova 3

Dados Geral Nova 3

O Nova 3 de 1975 adicionou mais dois registradores, usados ​​para controlar o acesso a uma pilha embutida. O processador também foi reimplementado usando componentes TTL , aumentando ainda mais o desempenho do sistema. O Nova 3 era oferecido nas versões de quatro slots (Nova 3/4) e doze slots (Nova 3/12).

Nova 4

Parece que a Data General originalmente pretendia que o Nova 3 fosse o último de sua linha, planejando substituir o Nova pelas máquinas Eclipse posteriores. No entanto, a demanda contínua levou a uma Nova 4 máquina, desta vez com base em quatro AMD Am2901 mordeu-slice ALUs . Esta máquina foi projetada desde o início para ser o Nova 4 e o Eclipse S / 140, com microcódigo diferente para cada um. Um coprocessador de ponto flutuante também estava disponível, ocupando um slot separado. Uma opção adicional permitia o mapeamento de memória, permitindo que os programas acessassem até 128 kwords de memória usando a troca de banco . Ao contrário das máquinas anteriores, o Nova 4 não incluía um console no painel frontal e, em vez disso, contava com o terminal para emular um console quando necessário.

Havia três versões diferentes do Nova 4, o Nova 4 / C, o Nova 4 / S e o Nova 4 / X. O Nova 4 / C era uma implementação de placa única que incluía toda a memória (16 ou 32 kwords). O Nova 4 / S e 4 / X usaram placas de memória separadas. O Nova 4 / X tinha a unidade de gerenciamento de memória on-board (MMU) habilitada para permitir o uso de até 128 kwords de memória (o MMU também foi instalado no Nova 4 / S, mas foi desabilitado pelo firmware). Tanto o 4 / S quanto o 4 / X incluem um “pré-buscador” para aumentar o desempenho, buscando até duas instruções da memória antes de serem necessárias.

microNOVA

A Data General também produziu uma série de implementações de chip único do processador Nova como o microNOVA . Mudanças na arquitetura do ônibus limitaram a velocidade drasticamente, a ponto de ficar com cerca de metade da velocidade do Nova original. O microNOVA original com o processador “mN601” foi lançado em 1977. Ele foi seguido pelo microNOVA MP / 100 em 1979, que reduziu a CPU a um único chip VLSI , o mN602. Uma versão maior também foi oferecida como o microNOVA MP / 200 , enviado no mesmo ano.

O microNOVA foi posteriormente reempacotado em um estojo estilo PC com dois disquetes como o Enterprise . Enterprise foi lançado em 1981, rodando RDOS , mas a introdução do IBM PC no mesmo ano fez com que a maioria das outras máquinas desaparecesse do radar.

Legado de Nova

O Nova influenciou o design dos computadores Xerox Alto (1973) e Apple I (1976), e sua arquitetura foi a base para a série Computervision CGP (Computervision Graphics Processor). Seu design externo foi relatado como a inspiração direta para o painel frontal do microcomputador MITS Altair (1975).

A Data General acompanhou o sucesso do Nova original com uma série de designs mais rápidos. A família de sistemas Eclipse foi posteriormente introduzida com um conjunto estendido de instruções compatível para cima, e a série MV estendeu ainda mais o Eclipse em uma arquitetura de 32 bits para competir com o DEC VAX . O desenvolvimento da série MV foi documentado no popular livro de Tracy Kidder de 1981, The Soul of a New Machine . A própria Data General mais tarde evoluiria para um fornecedor de servidores e matrizes de armazenamento baseados em processador Intel, sendo eventualmente adquirida pela EMC .

Em 2004, ainda havia Novas e Eclipses de 16 bits em execução em uma variedade de aplicações em todo o mundo, incluindo controle de tráfego aéreo. Existe um grupo diversificado, mas fervoroso, de pessoas em todo o mundo que restauram e preservam os sistemas Data General originais de 16 bits.

Descrição técnica

Design do processador

Registros do Data General Nova
1 5 1 4 1 3 1 2 1 1 1 0 0 9 0 8 0 7 0 6 0 5 0 4 0 3 0 2 0 1 0 0 (posição do bit)
Registros acumuladores
0 Cadastre-se 0
1 Registre-se 1
Registros de índice
2 Registro de índice 2
3 Registro de índice 3
Contador de programa
  PC     P rogram C ounter
Registro de status
  C C arry flag

O Nova, ao contrário do PDP-8 , era uma arquitetura load-store . Ele tinha quatro registradores de acumulador de 16 bits , dos quais dois (2 e 3) podiam ser usados ​​como registradores de índice . Havia um contador de programa de 15 bits e um registrador de transporte de um único bit . Tal como acontece com o PDP-8, o endereçamento de página atual + zero era central. Não havia registro de pilha , mas designs de Eclipse posteriores utilizariam um endereço de memória de hardware dedicado para esta função.

Os primeiros modelos da Nova processado matemática em série em pacotes de quatro-bits, usando um único 74181 BitSlice ALU . Um ano após sua introdução, este projeto foi aprimorado para incluir uma unidade matemática completa de 16 bits paralela usando quatro 74181s, sendo este projeto conhecido como SuperNova. Versões futuras do sistema adicionaram uma unidade de pilha e multiplicação / divisão de hardware.

O Nova 4 / Eclipse S / 140 foi baseado em quatro ALUs AMD 2901 bit-slice, com microcódigo em memória somente leitura , e foi o primeiro Nova projetado apenas para memória principal DRAM , sem provisão para memória de núcleo magnético .

Memória e I / O

Os primeiros modelos estavam disponíveis com 8 K palavras de memória de núcleo magnético como opção, que praticamente todo mundo tinha que comprar, elevando o custo do sistema para US $ 7.995.

Esta placa de memória central foi organizada de forma planar como quatro grupos de quatro bancos, cada banco carregando dois conjuntos de núcleos em uma matriz de 64 por 64; assim, havia 64 x 64 = 4096 bits por conjunto, x 2 conjuntos fornecendo 8.192 bits, x 4 bancos fornecendo 32.768 bits, x 4 grupos fornecendo um total de 131.072 bits e isso dividido pelo tamanho da palavra da máquina de 16 bits gerou 8.192 palavras de memória.

O núcleo nesta placa de memória de 8K com palavras ocupava uma "placa-em-placa" localizada centralmente, 5,25 "de largura por 6,125" de altura, e era coberto por uma placa protetora. Ele foi cercado pelos circuitos de leitura-gravação-reescrita do driver de suporte necessário. Todo o núcleo e os componentes eletrônicos de suporte correspondentes se encaixam em uma única placa padrão de 15 x 15 polegadas (380 mm). Até 32K desse núcleo de RAM podem ser suportados em uma caixa de expansão externa. O ROM de semicondutor já estava disponível na época, e os sistemas sem RAM (ou seja, apenas com ROM) tornaram-se populares em muitos ambientes industriais. As máquinas Nova originais funcionavam a aproximadamente 200 kHz , mas seu SuperNova foi projetado para funcionar a até 3 MHz quando usado com memória principal de semicondutor especial.

O painel traseiro padronizado e os sinais de E / S criaram um projeto de E / S simples e eficiente que simplificou a interface de dispositivos programados de E / S e Canal de Dados com o Nova em comparação com as máquinas concorrentes. Além de sua estrutura de barramento de E / S dedicada, o painel traseiro da Nova tinha pinos wire wrap que podiam ser usados ​​para conectores não padrão ou outros fins especiais.

Modelo de programação

O formato da instrução pode ser amplamente categorizado em uma das três funções: 1) manipulação de registro a registro, 2) referência de memória e 3) entrada / saída. Cada instrução estava contida em uma palavra. A manipulação de registro para registro era quase semelhante ao RISC em sua eficiência de bits; e uma instrução que manipulava dados de registro também poderia realizar testes, deslocamentos e até decidir descartar o resultado. As opções de hardware incluem uma unidade inteira de multiplicação e divisão, uma unidade de ponto flutuante (precisão simples e dupla) e gerenciamento de memória .

Software de dados gerais em fita perfurada

O primeiro Nova veio com um intérprete BASIC em fita perfurada . À medida que o produto crescia, a Data General desenvolveu muitas linguagens para os computadores Nova, rodando em uma variedade de sistemas operacionais consistentes. FORTRAN IV , ALGOL , Extended BASIC, Data General Business Basic , Interactive COBOL e vários montadores estavam disponíveis na Data General. Os fornecedores terceirizados e a comunidade de usuários expandiram as ofertas com Forth , Lisp , BCPL , C , ALGOL e outras versões proprietárias de COBOL e BASIC .

Conjunto de instruções

As instruções da máquina implementadas abaixo são o conjunto comum implementado por todos os processadores da série Nova. Modelos específicos geralmente implementam instruções adicionais, e algumas instruções são fornecidas por hardware opcional.

Instruções aritméticas

Todas as instruções aritméticas operavam entre acumuladores. Para operações que requerem dois operandos, um foi retirado do acumulador de origem e outro do acumulador de destino, e o resultado foi depositado no acumulador de destino. Para operações de operando único, o operando foi retirado do registro de origem e o resultado substituiu o registro de destino. Para todos os opcodes de operando único, era permitido que os acumuladores de origem e destino fossem os mesmos e a operação funcionasse conforme o esperado.

Todas as instruções aritméticas incluíam um bit "sem carga" que, quando definido, suprimia a transferência do resultado para o registrador de destino; isso foi usado em conjunto com as opções de teste para realizar um teste sem perder o conteúdo existente do registro de destino. Em linguagem assembly, adicionar um '#' ao opcode define o bit sem carga.

A CPU continha um registro de bit único denominado bit de transporte, que, após uma operação aritmética, conteria o transporte do bit mais significativo. O bit de transporte pode ser definido com um valor desejado antes de executar a operação usando um campo de dois bits na instrução. O bit pode ser definido, apagado ou complementado antes de executar a instrução. Na linguagem assembly, essas opções foram especificadas adicionando uma letra ao opcode: 'O' - definir o bit de transporte; 'Z' - limpar o carry, 'C' - complementar o carry bit, nada - deixe o carry bit sozinho. Se o bit sem carga também fosse especificado, o valor de transporte especificado seria usado para o cálculo, mas o registrador de transporte real permaneceria inalterado.

Todas as instruções aritméticas incluíam um campo de dois bits que poderia ser usado para especificar uma opção de deslocamento, que seria aplicada ao resultado antes de ser carregado no registrador de destino. Um deslocamento para a direita ou para a esquerda de um único bit pode ser especificado, ou os dois bytes do resultado podem ser trocados. As mudanças eram circulares de 17 bits, com o carry "à esquerda" do bit mais significativo. Em outras palavras, quando um deslocamento para a esquerda foi executado, o bit mais significativo do resultado foi deslocado para o bit de transporte e o conteúdo anterior do bit de transporte foi deslocado para o bit menos significativo do resultado. As trocas de bytes não afetaram o carry. Na linguagem assembly, essas opções foram especificadas adicionando uma letra ao opcode: 'L' - shift left; 'R' - deslocar para a direita, 'S' - trocar bytes; nada - não execute uma mudança ou troca.

Todas as instruções aritméticas incluíam um campo de três bits que poderia especificar um teste a ser aplicado ao resultado da operação. Se o teste foi avaliado como verdadeiro, a próxima instrução na linha foi ignorada. Na linguagem assembly, a opção de teste foi especificada como um terceiro operando para a instrução. Os testes disponíveis foram:

  • SZR - pula no resultado zero
  • SNR - ignorar resultado diferente de zero
  • SZC - ignorar no transporte zero
  • SNC - ignorar transporte diferente de zero
  • SBN - pula se o transporte e o resultado são diferentes de zero
  • SEZ - ignora se o carry ou o resultado, ou ambos, for zero
  • SKP - sempre ignorar
  • nada - nunca pule

As instruções aritméticas reais eram:

  • MOV - move o conteúdo do acumulador de origem para o acumulador de destino
  • COM - move o complemento bit a bit do acumulador de origem para o acumulador de destino
  • ADD - adiciona o acumulador de origem ao acumulador de destino
  • ADC - pegue o complemento bit a bit do acumulador de origem e adicione-o ao acumulador de destino
  • NEG - move o negativo do acumulador de origem para o acumulador de destino
  • SUB - subtrai o acumulador de origem de conteúdo do acumulador de destino
  • INC - adicione 1 ao conteúdo do acumulador de origem e mova para o acumulador de destino
  • AND - executa o AND bit a bit dos dois acumuladores e coloca o resultado no acumulador de destino

Um exemplo de instruções aritméticas, com todas as opções utilizadas, é:

ADDZR # 0,2, SNC

Isso decodificado como: limpar o bit de transporte; adicione o conteúdo de AC2 (acumulador 2) a AC0; deslocar circularmente o resultado um bit para a direita; teste o resultado para ver se o bit de transporte está definido e pule a próxima instrução em caso afirmativo. Descarte o resultado após realizar o teste. Na verdade, isso adiciona dois números e testes para ver se o resultado é ímpar ou par.

Instruções de referência de memória

O conjunto de instruções Nova continha um par de instruções que transferiam o conteúdo da memória para acumuladores e vice-versa, duas instruções de transferência de controle e duas instruções que testavam o conteúdo de um local de memória. Todas as instruções de referência de memória continham um campo de endereço de oito bits e um campo de dois bits que especificava o modo de endereçamento de memória. Os quatro modos foram:

  • Modo 0 - endereçamento absoluto. O conteúdo do campo de endereço da instrução é preenchido com zeros à esquerda e usado como o endereço de destino.
  • Modo 1 - endereçamento relativo. O conteúdo do campo de endereço da instrução é estendido para a esquerda e adicionado ao valor atual do contador do programa (que, no momento em que a instrução é executada, aponta para a próxima instrução). O resultado é usado como o endereço de destino.
  • Modo 2 - endereçamento indexado. O conteúdo do campo de endereço da instrução é estendido para a esquerda e adicionado ao valor atual do acumulador 2. O resultado é usado como o endereço de destino.
  • Modo 3 - endereçamento indexado. O conteúdo do campo de endereço da instrução é estendido por sinal à esquerda e adicionado ao valor atual do acumulador 3. O resultado é usado como o endereço de destino.

Obviamente, o modo 0 só era capaz de endereçar as primeiras 256 palavras de memória, dado o campo de endereço de oito bits. Essa parte da memória foi chamada de "página zero". As palavras de memória de página zero eram consideradas preciosas para os programadores de linguagem assembly da Nova por causa do pequeno número disponível; apenas as localizações da página zero podiam ser endereçadas de qualquer lugar no programa sem recorrer ao endereçamento indexado, que exigia amarrar o acumulador 2 ou 3 para usar como um registro de índice. Na linguagem assembly, uma diretiva ".ZREL" fazia com que o montador colocasse as instruções e palavras de dados que a seguiram na página zero; uma diretiva ".NREL" colocou as seguintes instruções e palavras de dados na memória "normal". Modelos posteriores da Nova adicionaram instruções com campos de endereçamento estendidos, que superaram essa dificuldade (com uma penalidade de desempenho).

O montador calculou os deslocamentos relativos para o modo 1 automaticamente, embora também fosse possível escrevê-lo explicitamente na fonte. Se uma instrução de referência de memória referenciou um endereço de memória no espaço .NREL, mas nenhum especificador de modo, o modo 1 foi assumido e o montador calculou o deslocamento entre a instrução atual e a localização referenciada, e colocou isso no campo de endereço da instrução (desde que o resultado valor caber no campo de 8 bits).

As duas instruções de carregamento e armazenamento foram:

  • LDA - carrega o conteúdo de um local de memória no acumulador especificado.
  • STA - armazena o conteúdo do acumulador especificado em um local da memória.

Ambas as instruções incluíam um bit "indireto". Se este bit foi definido (feito em linguagem assembly adicionando um '@' ao opcode), o conteúdo do endereço de destino foi considerado um endereço de memória em si, e esse endereço seria referenciado para fazer o carregamento ou armazenamento.

As duas instruções de transferência de controle foram:

  • JMP - transfere o controle para o local de memória especificado
  • JSR ("sub-rotina de salto") - Faz o mesmo que a instrução JMP, mas adicionalmente carrega o endereço de retorno (a instrução seguindo a instrução JSR em linha) no acumulador 3 antes de saltar.

Como no caso das instruções de carregamento e armazenamento, as instruções de salto continham um bit indireto, que da mesma forma foi especificado na montagem usando o caractere '@'. No caso de um salto indireto, o processador recuperou o conteúdo do local de destino e usou o valor como o endereço de memória para o qual saltar. No entanto, ao contrário das instruções load e store, se o endereço indireto tivesse o conjunto de bits mais significativo, ele executaria um ciclo adicional de indireção. Nos processadores da série Nova anteriores ao Nova 3, não havia limite para o número de ciclos indiretos; um endereço indireto que referenciasse a si mesmo resultaria em um loop de endereçamento indireto infinito, com a instrução nunca sendo concluída. (Isso pode ser alarmante para os usuários, já que nesta condição, pressionar o botão STOP no painel frontal não adianta nada. Foi necessário reiniciar a máquina para interromper o loop.)

As duas instruções de teste de memória foram:

  • ISZ - incrementa a localização da memória e pula a próxima instrução se o resultado for zero.
  • DSZ - diminui a localização da memória e pula a próxima instrução se o resultado for zero.

Como no caso das instruções load e store, havia um bit indireto que realizaria um único nível de endereçamento indireto. Essas instruções eram estranhas porque, nas Novas com memória de núcleo magnético, a instrução era executada dentro da própria placa de memória. Como era comum na época, as placas de memória continham um circuito "write-back" para resolver o problema de leitura destrutiva inerente à memória do núcleo magnético. Mas o mecanismo de write-back também continha uma mini unidade aritmética, que o processador usava para diversos fins. Para as instruções ISZ e DSZ, o incremento ou decremento ocorreu entre a localização da memória que está sendo lida e o write-back; a CPU simplesmente esperava ser informada se o resultado era zero ou diferente de zero. Essas instruções eram úteis porque permitiam que um local da memória fosse usado como contador de loop sem amarrar um acumulador, mas eram mais lentas do que executar as instruções aritméticas equivalentes.

Alguns exemplos de instruções de referência de memória:

LDA 1, COUNT

Transfere o conteúdo da localização da memória rotulada COUNT para o acumulador 1. Supondo que COUNT esteja no espaço .NREL, esta instrução é equivalente a: LDA 1,1, (COUNT - (. + 1)) onde '.' representa a localização da instrução LDA.

JSR @ 0,17

Pule indiretamente para o endereço de memória especificado pelo conteúdo da localização 17, no espaço da página zero, e deposite o endereço de retorno no acumulador 3. Esse era o método padrão para fazer uma chamada de sistema RDOS nos primeiros modelos Nova; o mnemônico em linguagem assembly ".SYSTM" traduzido para isso.

JMP 0,3

Salte para a localização da memória cujo endereço está contido no acumulador 3. Este era um meio comum de retornar de uma chamada de função ou sub-rotina, uma vez que a instrução JSR deixou o endereço de retorno no acumulador 3.

STA 0,3, -1

Armazene o conteúdo do acumulador 0 no local que é um a menos que o endereço contido no acumulador 3.

DSZ COUNT

Diminua o valor no local rotulado COUNT e pule a próxima instrução se o resultado for zero. Como no caso acima, se COUNT for considerado no espaço .NREL, isso é equivalente a: DSZ 1, (COUNT - (. + 1))

Instruções I / O

O Novas implementou um modelo canalizado para interface com dispositivos de I / O. No modelo, esperava-se que cada dispositivo de E / S implementasse dois sinalizadores, denominados "Ocupado" e "Concluído", e três registros de dados e controle, denominados A, B e C. Instruções de E / S estavam disponíveis para ler e escrever os registros e enviar um dos três sinais para o dispositivo, conhecido como "iniciar", "limpar" e "pulso". Em geral, o envio de um sinal de início inicia uma operação de E / S que foi configurada carregando valores nos registradores A / B / C. O sinal de liberação interrompeu uma operação de E / S e eliminou qualquer interrupção resultante. O sinal de pulso foi usado para iniciar operações auxiliares em subsistemas complexos, como operações de busca em unidades de disco. Dispositivos pesquisados ​​geralmente movem dados diretamente entre o dispositivo e o registrador A. Os dispositivos DMA geralmente usavam o registro A para especificar o endereço de memória, o registro B para especificar o número de palavras a serem transferidas e o registro C para sinalizadores de controle. O canal 63 referia-se à própria CPU e era usado para várias funções especiais.

Cada instrução de E / S continha um campo de número de canal de seis bits, um campo de quatro bits para especificar qual registro ler ou escrever e um campo de dois bits para especificar qual sinal deveria ser enviado. Na linguagem assembly, o sinal era especificado adicionando uma letra ao opcode: 'S' para início, 'C' para limpar, 'P' para pulso e nada para nenhum sinal. Os opcodes eram:

  • DIA - move o conteúdo do registro A do dispositivo para o acumulador especificado
  • DOA - envia o conteúdo do acumulador especificado para o registro A do dispositivo no canal especificado
  • DIB - move o conteúdo do registro B do dispositivo para o acumulador especificado
  • DOB - envia o conteúdo do acumulador especificado para o registro B do dispositivo no canal especificado
  • DIC - move o conteúdo do registro C do dispositivo para o acumulador especificado
  • DOC - envia o conteúdo do acumulador especificado para o registro C do dispositivo no canal especificado
  • NIO - "sem E / S", um nome impróprio. A instrução foi usada para enviar um sinal a um dispositivo sem fazer uma transferência de registro.

Além disso, quatro instruções estavam disponíveis para testar o status de um dispositivo:

  • SKPBN - pula a próxima instrução se o sinalizador de ocupado do dispositivo estiver definido
  • SKPBZ - pula a próxima instrução se o sinalizador de ocupado do dispositivo estiver limpo
  • SKPDN - pula a próxima instrução se o sinalizador de conclusão do dispositivo estiver definido
  • SKPDZ - pula a próxima instrução se o sinalizador de concluído do dispositivo estiver limpo

Iniciar um dispositivo fez com que ele definisse seu sinalizador de ocupado. Quando a operação solicitada foi concluída, convencionalmente o dispositivo limpou seu sinalizador de ocupado e definiu seu sinalizador concluído; a maioria dos dispositivos tinha seu mecanismo de solicitação de interrupção conectado ao sinalizador feito, portanto, definir o sinalizador feito causava uma interrupção (se as interrupções estivessem habilitadas e o dispositivo não fosse mascarado).

Instruções Especiais

Essas instruções executaram várias funções de controle e status da CPU. Todos eles eram, na verdade, mnemônicos abreviados para instruções de E / S no canal 63, o canal de E / S autorreferencial da CPU.

  • INTA - confirmação de interrupção. Transferido o número do canal do dispositivo de interrupção para o acumulador especificado.
  • INTDS - desabilitou todas as interrupções
  • INTEN - habilitou todas as interrupções
  • IORST - reinicialização de E / S. Enviou um sinal de reinicialização no barramento de E / S, que parou todas as E / S, desabilitou as interrupções e limpou todas as interrupções pendentes.
  • MSKO - máscara para fora. Usou o conteúdo do acumulador especificado para configurar a máscara de interrupção. A forma como a máscara era interpretada dependia da implementação de cada dispositivo de E / S. Alguns dispositivos não puderam ser mascarados.
  • READS - transferiu o conteúdo dos 16 switches de dados do painel frontal para o acumulador especificado.
  • HALT - parou a CPU. Uma vez parada, a CPU pode ser reiniciada apenas por intervenção manual no painel frontal.

Interrupções e manuseio de interrupções

Do ponto de vista do hardware, o mecanismo de interrupção era relativamente simples, mas também menos flexível do que as arquiteturas de CPU atuais. O backplane suportava uma única linha de solicitação de interrupção, à qual todos os dispositivos capazes de interromper se conectavam. Quando um dispositivo precisava solicitar uma interrupção, ele aumentava essa linha. A CPU recebeu a interrupção assim que concluiu a instrução atual. Como afirmado acima, esperava-se que um dispositivo levantasse seu sinalizador de E / S "concluído" quando solicitasse uma interrupção, e a convenção era que o dispositivo limparia sua solicitação de interrupção quando a CPU executasse uma instrução de limpeza de E / S no canal do dispositivo número.

A CPU esperava que o sistema operacional colocasse o endereço de sua rotina de serviço de interrupção no endereço de memória 1. Quando um dispositivo era interrompido, a CPU fazia um salto indireto através do endereço 1, colocando o endereço de retorno no endereço de memória 0 e desabilitando outras interrupções. O tratador de interrupção executaria então uma instrução INTA para descobrir o número do canal do dispositivo de interrupção. Isso funcionou levantando um sinal de "reconhecimento" no painel traseiro. O sinal de reconhecimento foi conectado em formato de cadeia em todo o backplane, de forma que ele passasse por cada placa no barramento. Esperava-se que qualquer dispositivo solicitando uma interrupção bloqueasse a propagação posterior do sinal de reconhecimento pelo barramento, de modo que, se dois ou mais dispositivos tivessem interrupções pendentes simultaneamente, apenas o primeiro veria o sinal de reconhecimento. Esse dispositivo então respondeu colocando seu número de canal nas linhas de dados do barramento. Isso significava que, no caso de solicitações de interrupção simultâneas, o dispositivo que tinha prioridade era determinado por aquele que estava fisicamente mais próximo da CPU no compartimento de placa.

Depois que a interrupção foi processada e a rotina de serviço enviou ao dispositivo uma limpeza de E / S, ele retomou o processamento normal habilitando interrupções e, em seguida, retornando por meio de um salto indireto através do endereço de memória 0. Para evitar que uma interrupção pendente interrompa imediatamente antes o salto de retorno (que faria com que o endereço de retorno fosse sobrescrito), a instrução INTEN tinha um atraso de ciclo de uma instrução. Ao ser executada, as interrupções não seriam habilitadas até a execução da seguinte instrução, que se esperava que fosse a instrução JMP @ 0.

A rotina de serviço de interrupção do sistema operacional normalmente executava um salto indexado usando o número do canal recebido, para saltar para a rotina de tratamento de interrupção específica para o dispositivo. Havia alguns dispositivos, notavelmente o circuito de detecção de falha de energia da CPU, que não respondeu à instrução INTA. Se o INTA retornou um resultado zero, a rotina do serviço de interrupção teve que pesquisar todos os dispositivos que não responderam ao INTA usando as instruções SKPDZ / SKPDN para ver qual deles interrompeu.

O sistema operacional pode gerenciar de alguma forma a ordem das interrupções, definindo uma máscara de interrupção usando a instrução MSKO. A intenção era permitir que o sistema operacional determinasse quais dispositivos tinham permissão para interromper em um determinado momento. Quando esta instrução foi emitida, uma máscara de interrupção de 16 bits foi transmitida a todos os dispositivos no backplane. Cabia ao dispositivo decidir o que a máscara realmente significava para ele; por convenção, um dispositivo mascarado não deveria aumentar a linha de interrupção, mas a CPU não tinha meios de fazer isso. A maioria dos dispositivos mascaráveis ​​permitia que o bit da máscara fosse selecionado por meio de um jumper na placa. Havia dispositivos que ignoravam completamente a máscara.

Nos sistemas com memória de núcleo magnético (que retinha seu conteúdo sem energia), a recuperação de uma falha de energia era possível. Um circuito de detecção de falha de energia na CPU emitiu uma interrupção quando foi detectada a perda da energia principal que entra no computador; a partir deste ponto, a CPU teve um curto período de tempo até que um capacitor na fonte de alimentação perdesse sua carga e a energia da CPU faltasse. Isso foi tempo suficiente para interromper a E / S em andamento, emitindo uma instrução IORST e, em seguida, salvar o conteúdo dos quatro acumuladores e o bit de transporte na memória. Quando a energia retornasse, se a chave do painel frontal da CPU estivesse na posição LOCK, a CPU iniciaria e executaria um salto indireto através do endereço de memória 2. Esperava-se que fosse o endereço de uma rotina de serviço do sistema operacional que recarregaria os acumuladores e carregue o bit e, em seguida, retome o processamento normal. Cabia à rotina de serviço descobrir como reiniciar as operações de E / S que foram interrompidas pela falta de energia.

Layout do painel frontal

Como era a convenção do dia, a maioria dos modelos Nova fornecia um console no painel frontal para controlar e monitorar as funções da CPU. Todos os modelos anteriores ao Nova 3 contavam com um layout de painel frontal canônico, conforme mostrado na foto do painel do Nova 840 acima. O layout continha um botão liga / desliga chaveado, duas fileiras de lâmpadas de exibição de endereço e dados, uma fileira de botões de entrada de dados e uma fileira de botões de função que ativavam várias funções da CPU quando pressionados. As lâmpadas de endereço sempre exibem o valor atual do contador do programa, em binário. As lâmpadas de dados exibiam vários valores dependendo de qual função da CPU estava ativa no momento. À esquerda da lâmpada de dados mais à esquerda, uma lâmpada adicional exibia o valor atual do carry. Na maioria dos modelos, as lâmpadas eram lâmpadas incandescentes soldadas à placa do painel; substituir lâmpadas queimadas era uma desgraça para os engenheiros de serviço de campo da Data General.

Cada uma das chaves de dados controlava o valor de um bit em um valor de 16 bits e, de acordo com a convenção geral de dados, eram numerados de 0 a 15 da esquerda para a direita. Os comutadores de dados forneciam entrada para a CPU para várias funções e também podiam ser lidos por um programa em execução usando a instrução READS em linguagem assembly. Para reduzir a desordem do painel e economizar dinheiro, os interruptores de função foram implementados como interruptores momentâneos de duas vias. Quando uma alavanca do interruptor de função era levantada, ela acionava a função cujo nome estava impresso acima do interruptor no painel; quando a alavanca era pressionada para baixo, ativava a função cujo nome aparecia abaixo da chave. A alavanca do interruptor retornou à posição neutra quando liberada.

Fazendo referência à foto do Nova 840, os primeiros quatro interruptores da esquerda executaram as funções EXAMINE e DEPÓSITO para os quatro acumuladores. Pressionar EXAMINE em um deles fazia com que o valor atual do acumulador fosse exibido em binário pelas lâmpadas de dados. Pressionar DEPÓSITO transferiu o valor binário representado pelas configurações atuais das chaves de dados para o acumulador.

Indo para a direita, a próxima chave foi a chave RESET / STOP. Pressionar STOP fez com que a CPU parasse após completar a instrução atual. Pressionar RESET fez com que a CPU parasse imediatamente, apagou vários registros internos da CPU e enviou um sinal de reinicialização de E / S para todos os dispositivos conectados. O interruptor à direita disso era o interruptor INICIAR / CONTINUAR. Pressionar CONTINUE fez com que a CPU retomasse a execução da instrução atualmente apontada pelo contador do programa. Pressionar START transferiu o valor atualmente definido nos interruptores de dados 1-15 para o contador do programa e, em seguida, começou a executar a partir daí.

Os próximos dois interruptores forneceram acesso de leitura e gravação à memória do painel frontal. Pressionar EXAMINE transferiu o valor definido nos interruptores de dados 1-15 para o contador do programa, buscou o valor no local de memória correspondente e exibiu seu valor nas lâmpadas de dados. Pressionar EXAMINE NEXT incrementou o contador do programa e, em seguida, executou uma operação examinar naquele local da memória, permitindo ao usuário percorrer uma série de locais da memória. Pressionar DEPÓSITO gravou o valor contido nas chaves de dados no local da memória apontado pelo contador do programa. Pressionar DEPÓSITO PRÓXIMO primeiro incrementou o contador do programa e depois o depositou no local de memória apontado.

A função INST STEP fez com que a CPU executasse uma instrução, no local do contador do programa atual, e então parasse. Uma vez que o contador do programa seria incrementado como parte da execução da instrução, isso permitia ao usuário dar um passo em um programa. MEMORY STEP, um nome impróprio, fazia com que a CPU executasse um único ciclo de clock e parasse. Isso era de pouca utilidade para os usuários e geralmente era usado apenas pelo pessoal de serviço de campo para diagnósticos.

PROGRAM LOAD era o mecanismo normalmente usado para inicializar um Nova. Quando essa opção foi acionada, fez com que a ROM de inicialização de 32 palavras fosse mapeada nas primeiras 32 palavras de memória, definiu o contador do programa para 0 e iniciou a CPU. A ROM de inicialização continha código que leria 256 palavras (512 bytes) de código de um dispositivo de E / S selecionado para a memória e, em seguida, transferiria o controle para o código de leitura. As chaves de dados 8-15 foram usadas para informar à ROM de inicialização de qual canal de E / S inicializar. Se a chave 0 estivesse desligada, a ROM de inicialização presumiria que o dispositivo era um dispositivo com polling (por exemplo, o leitor de fita de papel) e executaria um loop de entrada com polling até que 512 bytes fossem lidos. Se a chave 0 estava ligada, a ROM de inicialização presumiu que o dispositivo era compatível com DMA e iniciou uma transferência de dados DMA. A ROM de inicialização não era inteligente o suficiente para posicionar o dispositivo antes de iniciar a transferência. Este foi um problema ao reiniciar após um travamento; se o dispositivo de inicialização era uma unidade de disco, suas cabeças provavelmente foram deixadas em um cilindro aleatório. Eles tiveram que ser reposicionados no cilindro 0, onde o RDOS escreveu o bloco de inicialização de primeiro nível, para que a sequência de inicialização funcionasse. Convencionalmente, isso era feito girando o inversor em sua sequência de carregamento, mas os usuários que ficavam frustrados com o tempo de espera (até 5 minutos, dependendo do modelo do inversor) aprenderam a inserir no painel frontal um código de E / S para "recalibrar" o inversor e passo a passo a CPU por ele, uma operação que levava apenas alguns segundos para um usuário experiente.

O interruptor de alimentação era um interruptor com chave de 3 vias com as posições marcadas OFF, ON e LOCK. Na posição OFF, toda a energia foi removida da CPU. Girar a chave para ON aplica energia à CPU. No entanto, ao contrário das CPUs atuais, a CPU não iniciou automaticamente quando a alimentação foi aplicada; o usuário tinha que usar PROGRAM LOAD ou algum outro método para iniciar a CPU e iniciar a sequência de inicialização. Girar a chave para LOCK desabilitou as chaves de função do painel frontal; girando a chave para LOCK e removendo a chave, o usuário pode tornar a CPU resistente à adulteração. Em sistemas com memória de núcleo magnético, a posição LOCK também ativou a função de recuperação automática por falha de energia. A chave pode ser removida nas posições OFF ou LOCK.

atuação

O Nova 1200 executou instruções de acesso à memória central (LDA e STA) em 2,55 microssegundos (μs). O uso de memória somente leitura economizou 0,4 μs. As instruções do acumulador (ADD, SUB, COM, NEG, etc.) levaram 1,55 μs, MUL 2,55 μs, DIV 3,75 μs, ISZ 3,15-4,5 μs. No Eclipse MV / 6000 posterior, LDA e STA levou 0,44 μs, ADD, etc. levou 0,33 μs, MUL 2,2 μs, DIV 3,19 μs, ISZ 1,32 μs, FAD 5,17 μs, FMMD 11,66 μs.

Exemplos de linguagem assembly

Programa Hello World

Este é um exemplo mínimo de programação na linguagem assembly Nova. Ele foi projetado para ser executado em RDOS e imprime a string “ Hello, world. ”No console.

    ; a "hello, world" program for Nova running RDOS
    ; uses PCHAR system call
    .titl hello
    .nrel
    .ent start

 start:
 dochar:
    lda    0,@pmsg  ; load ac0 with next character,
    mov#   0,0,snr  ; test ac0; skip if nonzero (don't load result)
    jmp    done
    .systm
    .pchar          ; print first
    jmp    er       ; skipped if OK
    movs   0,0      ; swap bytes
    .systm
    .pchar          ; print second
    jmp    er       ; skipped if OK
    isz    pmsg     ; point to next character
    jmp    dochar   ; go around again

 done:
    .systm          ; normal exit
    .rtn
 er:
    .systm          ; error exit
    .ertn
    halt

 pmsg:
    .+1             ; pointer to first character of string
                    ; note bytes are packed right-to-left by default
                    ; <15><12> denotes a CR LF pair.
    .txt /Hello, world.<15><12>/
    0               ; flag word to end string

    .end start

Multiplicação de 16 bits

Os modelos básicos do Nova vinham sem hardware embutido para multiplicar e dividir a capacidade, para manter os preços competitivos. A rotina a seguir multiplica duas palavras de 16 bits para produzir um resultado de palavra de 16 bits (o estouro é ignorado). Ele demonstra o uso combinado de ALU op, shift e test (pular). Observe que, quando essa rotina é chamada por jsr, AC3 contém o endereço de retorno . Isso é usado pela instrução de retorno jmp 0,3. Uma maneira idiomática de limpar um acumulador é sub 0,0. Outras instruções simples podem ser organizadas para carregar um conjunto específico de constantes úteis (por exemplo, -2, -1 ou +1).

 mpy:	; multiply AC0 <- AC1 * AC2, by Toby Thain

 	sub 0,0		; clear result
 mbit:	movzr 1,1,szc	; shift multiplier, test lsb
 	add 2,0		; 1: add multiplicand
 	movzl 2,2,szr	; shift and test for zero
 	jmp mbit	; not zero, do another bit
 	jmp 0,3		; return

Acumulador de impressão binária

A rotina a seguir imprime o valor de AC1 como um número binário de 16 dígitos no console RDOS. Ele revela outras peculiaridades do conjunto de instruções do Nova. Por exemplo, não há nenhuma instrução para carregar um valor “imediato” arbitrário em um acumulador (embora as instruções de referência de memória codifiquem tal valor para formar um endereço efetivo). Geralmente, os acumuladores devem ser carregados a partir de locais de memória inicializados (por exemplo n16). Outras máquinas contemporâneas, como o PDP-11 , e praticamente todas as arquiteturas modernas, permitem cargas imediatas, embora muitas, como ARM, restrinjam a faixa de valores que podem ser carregados imediatamente.

Como a .systmmacro de chamada RDOS implementa um jsr, AC3 é substituído pelo endereço de retorno da .pcharfunção. Portanto, um local temporário é necessário para preservar o endereço de retorno do chamador desta função. Para uma rotina recursiva ou de outra forma reentrante, uma pilha, hardware se disponível, software se não, deve ser usado em seu lugar. A instrução de retorno se torna a jmp @ retrnque explora o modo de endereçamento indireto do Nova para carregar o PC de retorno.

As definições de constantes no final mostram dois recursos do montador: a raiz do montador é octal por padrão ( 20= dezesseis) e as constantes de caractere podem ser codificadas como, por exemplo "0.

 pbin:  ; print AC1 on console as 16 binary digits, by Toby Thain

        sta     3,retrn     ; save return addr
        lda     2,n16       ; set up bit counter
 loop:  lda     0,chr0      ; load ASCII '0'
        movzl   1,1,szc     ; get next bit in carry
        inc     0,0         ; bump to '1'
        .systm
        .pchar              ; AC0-2 preserved
        jmp     err         ; if error
        inc     2,2,szr     ; bump counter
        jmp     loop        ; loop again if not zero
        lda     0,spc       ; output a space
        .systm
        .pchar
        jmp     err         ; if error
        jmp     @retrn

 spc:   " ;that's a space
 chr0:  "0
 n16:   -20
 retrn: 0

Fatos

A Canadian Broadcasting Corporation em Montreal usou a Nova 1200 para automação de play-out de canal até o final dos anos 1980. Foi então substituído por unidades Nova 4 recondicionadas e estas estiveram em uso até meados de 1990.

Veja também

Notas

Referências

Citações

Bibliografia

links externos