EDSAC (apenas para os mais severos)

O que vem à sua mente quando ouve “programação de baixo nível”? Talvez C ++? Controle contínuo do ponteiro, tentativas de otimizar o desempenho, consumo de memória? Ou você provavelmente está representando instruções de montagem de alguma arquitetura popular hoje?



Se você se lembra de como um perfurador perfurou uma fita perfurada, um furo após o outro, por muitas horas, então este artigo é para você! Bem-vindo ao corte! :)



Lasciate ogni speranza, voi ch'entrate

- Dante Alighieri, La Divina Commedia


EDSAC - "Electronic Delay Storage Automatic Calculator", foi criado em Cambridge em 1949 para fins militares. Agora no esquecimento, eles se lembram dele apenas para fins educacionais na N-th província na pouco conhecida Alma Mater, a filha da Universidade Estadual de Petersburgo.

Há também o projeto EDSAC Replica , onde um grupo poderoso de entusiastas está criando um emulador e guias EDSAC para preservar a memória deste dispositivo incrível.



Um dos recursos mais interessantes do EDSAC é que ele é conceitualmente uma máquina muito simples.

- Guia Tutorial para o Simulador EDSAC


O induleto seco tem a seguinte aparência:



Fig 1.1. - Simulador EDSAC de perto.





Fig 1.2. - Simulador EDSAC afastado.



Você pode baixá-lo aqui .



À esquerda, você pode ver um editor de texto para obter instruções. Existem dois tipos de instruções: Pedidos iniciais 1 (doravante IO1) e Pedidos iniciais 2 (mega avançado). O editor destaca a linha alterada em amarelo, verde - as que foram salvas. Os comentários estão entre []. O editor tem várias etapas de memória para trás, então você pode reverter o programa pressionando Ctrl + Z. Tudo isso costumava ser digitado em fita perfurada, isso é um remake. A primeira instrução em IO1 é TNS, onde N é o endereço da última linha com a instrução + 1. O programa EDSAC mais simples é:



Listagem 1. - Código de pedido EDSAC, o programa mais simples.
T32S







Ela não faz nada. Como a maioria dos meus programas. A contagem regressiva começa no 31, pois as células de 0 a 30 são utilizadas inicialmente para dar a partida na própria máquina, posteriormente podem ser utilizadas como células de memória.



A propósito, por padrão o simulador está configurado para IO2, para alterná-lo para IO1, clique no painel superior de EDSAC -> IO1. É iniciado pelo botão Iniciar, interrompido por Parar, EP único - depuração passo a passo, para isso você precisa escrever Z0S / ZS / Z0F / ZF primeiro.



À direita você pode ver o simulador e o conteúdo da memória do computador. As palavras são 17 bits, um total de 1024 células de memória (ou 35 bits, 512 células de memória, como será mais conveniente, no meio há um misterioso "dígito sanduíche") Há também um acumulador (RAM) de 71 bits e um registrador de multiplicação de 35 bits. O simulador suporta entrada de telefone de disco, impressão. Ao ativar as dicas , você pode ver o conteúdo das células de memória passando o mouse sobre elas. Um número em 10CC aparecerá no topo. Você também pode ver o conteúdo do acumulador e do registrador de multiplicação.





Fig 2. - Formato de uma palavra de máquina.





Fig 3. - Formato das instruções da máquina.



Sobre números. O número é escrito na memória em complemento de dois usando a instrução: PNS ou PNL, onde N é um fator antes de dois. Por exemplo, P0S = 2 * 0 + 0 = 0, P0L = 2 * 0 + 1 = 1, P1S = 2, P1L = 3, etc. Números negativos são escritos em código complementar, você pode ler sobre isso no tutorial . EDSAC também funciona com números fracionários. Símbolo de palavra curta S (F para IO2) e L (D). Não apenas os números, mas também as instruções mudam de significado dependendo disso.



São dois guias, o principal e o abreviado , recomendo o último porque menos faias, o material é apresentado de forma mais clara, exemplos de trabalho.



Para fazer o código fornecido neles funcionar, você precisa substituir a primeira linha de ZOS / ZS / Z0F / ZF por X0S / X0F. Veja as instruções aí, ou já nos comentários do código.



Ao longo de vários meses, muitas versões do procedimento de impressão decimal foram produzidas. Se o programador fosse impenetravelmente estúpido, ou um idiota completo e um perdedor completo, a rotina de conversão exigiria cerca de cem instruções dele. Mas qualquer hacker que valha seu nome poderia colocá-lo em menos espaço. Por fim, ao remover alternadamente as instruções de um lugar para outro, o procedimento foi reduzido para cerca de cinquenta instruções.



- Stephen Levy, Hackers: Heroes of the Computer Revolution


Portanto, minha tarefa era escrever um programa para imprimir a enésima linha do triângulo de Pascal.



Listagem 2. - Kotlin, gerando a 3ª linha do triângulo de Pascal.
fun main(args: Array<String>) {
    var a = 1
    var row = 3
    row += 1
    for (i in 1..row) {
        print(a)
        print(" ")
        a = a * (row - i) / i
    }
}

      
      







Haverá um loop aninhado aqui, já que a divisão deve ser feita manualmente.



Listagem 3. - Código de pedido EDSAC, divisão inteira, arredondamento para baixo.
[31] T56S

[32] E37S [ ]

[33] P3L [ = 5]

[34] P1L [ = 2]

[35] P0S [ , 0]

[36] P0L [1]

[37] A35S [ ]

[38] T2S [ 2 ]

[39] A33S [ ]

[40] T1S [ 1 ]

[41] A1S [ ]

[42] S34S [ ]

[43] T1S [ 1]

[44] A2S [ ]

[45] A36S [ 1]

[46] T2S [ 1 ]

[47] A1S [ ]

[48] G50S [ < 0, ]

[49] T1S [ ]

[50] E41S[ ]

[51] T0S [ ]

[52] A2S [ ]

[53] S36S [ 1]

[54] T2S [ ]

[55] Z0S [ ]









Como você deve ter percebido, o endereçamento é absoluto, o que causa dor de cabeça, agressão, ranger de dentes, ódio, decepção, raiva, dificuldades (isso foi corrigido na versão 2 dos Pedidos Iniciais). Quando uma linha é deslocada, um lote é deslocado de uma vez . E é necessário reescrever os endereços de todas as linhas "flutuadas".



Finalmente a solução:



Listagem 4. - Código de pedido EDSAC, IO1, enésima linha do triângulo de Pascal.
[31] T154S [ +1]

[32] E84S [ 84 , ]

[33] PS [ ]

[34] PS [ ]

[35] P10000S [ , 10, 10^4]

[36] P1000S [ , 10, 10^3]

[37] P100S [ , 10, 10^2]

[38] P10S [ , 10, 10^1]

[39] P1S [ , 10, 10^0]

[40] QS [ ]

[41] #S [ ]

[42] A40S [ ]

[43] !S [ ]

[44] &S [ ]

[45] @S [ ]

[46] O43S [ ]

[47] O33S [ 10]

[48] PS [ ]

[49] A46S [ 46 ]

[50] T65S [ 65, ]

[51] T300S [ ]

[52] A35S [ 35, 10000<<1]

[53] T34S [ 34, ]

[54] E61S [ >= 0, 61]

[55] T48S [ 48, ]

[56] A47S [ 47 ]

[57] T65S [ 65, ]

[58] A33S [ 33 ]

[59] A40S [ 40 ]

[60] T33S [ 33, ]

[61] A48S [ 48 ]

[62] S34S [ ]

[63] E55S [ >= 0, , 55]

[64] A34S [ 34 ]

[65] PS [ , ]

[66] T48S [ 48, ]

[67] T33S [ 33,

]

[68] A52S [ 52 ]

[69] A4S [ 1]

[70] U52S [ 52]

[71] S42S [ ]

[72] G51S [ < 0, 51 ]

[73] A103S [ 103 ]

[74] T52S [ 52, ]

[75] PS [ ]

[76] PS [ ]

[77] PS [const = 0]

[78] PS [const = 0]

[79] PS [const = 0]

[80] E100S [ 100]

[81] E104S [ 104]

[82] P5S [ , P S,

10]

[83] E123S [ , 123]

[84] A110S [ 2]

[85] T30S [ 30, ]

[86] O41S [ ]

[87] T300S [ ]

[88] O44S [ ]

[89] O44S [ ]

[90] A76S [ ]

[91] A4S [ 1]

[92] T76S [ , ]

[93] E113S [ 113]

[94] T300S [ ]

[95] A30S [ 30 , ]

[96] T48S [ 48, ]

[97] A80S [ 80]

[98] T75S [ 75 , ]

[99] E49S [ ]

[100] A81S [ 81]

[101] T75S [ 75, ]

[102] E49S [ ]

[103] A35S [ ]

[104] A76S [ 76]

[105] S82S [ ]

[106] S110S [ 2]

[107] G87S [ <0, 87]

[108] X0S [ ]

[109] ZS [ , ]

[110] P1S [const = 2]

[111] P2S [const = 4]

[112] P0L [const = 1]

[113] T300S [ ]

[114] A76S [ 76 ]

[115] S111S [ 111 , 4]

[116] E124S [ >=0, 124 ]

[117] T300S [ ]

[118] A30S [ 30 ]

[119] T48S [ 48, , ]

[120] A83S [ 83]

[121] T75S [ 75 ]

[122] E49S [ ]

[123] O44S [ ]

[124] O44S [ ]

[125] T300S [ ]

[126] A82S [ ]

[127] A110S [ 2]

[128] S76S [ ]

[129] T29S [ 29, ]

[130] H29S [ 29 ]

[131] V30S [ 30 , ]

[132] L64S [ 8 ]

[133] L32S [ 7 ]

[134] T30S [ 30 ]

[135] T2S [ 2, ]

[136] A30S [ 30]

[137] T1S [ 1 , ]

[138] A1S [ 1, ]

[139] S76S [ 76]

[140] T1S [ 1, ]

[141] A2S [ 2]

[142] A110S [ 1 110]

[143] T2S [ 1 2, ]

[144] A1S [ 1]

[145] G147S [ < 0, , 147]

[146] T1S [ 1, ]

[147] E138S[ >= 0, , 138 , ]

[148] T300S [ ]

[149] A2S [ 2]

[150] S110S [ 1 110]

[151] U2S [ 2]

[152] T30S [ 30, ]

[153] E94S [ 94, ]









O que posso dizer sobre o IO2? Suporta sub-rotinas, endereçamento relativo, conjunto de comandos estendido.



O mesmo programa em IO2:



Listagem 5. - Código de pedido EDSAC, IO2, enésima linha do triângulo de Pascal.
..PK

T56K

[P6, ]

GKA3FT25@H29@VFT4DA3@TFH30@S6@T1F

V4DU4DAFG26@TFTFO5FA4DF4FS4F

L4FT4DA1FS3@G9@EFSFO31@E20@J995FJF!F

..PZ

[ n- ]

GK [ ]

[0] XF [ , ]

[1] O34@ [ , 34]

[2] O35@ [ , 35]

[3] O36@ [ , 36]

[4] TF [ ]

[5] A27@ [ 27 ]

[6] TF [ 0 , ]

[7] A7@ [ ]

[8] G56F [ P6]

[9] T20@ [ 20 ]

[10] A28@ [ ]

[11] A31@ [ 1]

[12] U28@ [ 28]

[13] T20@ [ 20, ]

[14] A33@ [ ]

[15] A31@ [+1]

[16] S28@ [ 28]

[17] T20@ [ 20, ]

[18] E37@ [ , 37]

[19] PD [const = 1]

[20] XF [ ]

[21] XF [ ]

[22] A33@ [ 33 ]

[23] A31@ [+1]

[24] S28@ [ 28 , ]

[25] E2@ [ >= 0, , 2]

[26] ZF [ , ]

[27] PD [ ]

[28] PF [ ]

[29] PD [ ]

[30] PD [ ]

[31] PD [const = 1]

[32] P1F [ ]

[33] P2D [ , EDSAC]

[34] #F [ ]

[35] @F [ ]

[36] &F [ ]

[37] H20@ [ 20 ]

[38] V27@ [ 27 , ]

[39] L1024F [ 12 ]

[40] L4F [ 4 ]

[41] T20@ [ 20 , ]

[42] T102@ [ 102, ]

[43] A20@ [ 20]

[44] T101@ [ 101 , ]

[45] A101@ [ 101, ]

[46] S28@ [ 28]

[47] T101@ [ 101, ]

[48] A102@ [ 102]

[49] A31@ [ 1 31]

[50] T102@ [ 1 102, ]

[51] A101@ [ 101]

[52] G54@ [ < 0, , 54]

[53] T101@ [ 101, ]

[54] E45@ [ >= 0, , 45 , ]

[55] T200@ [ ]

[56] A102@ [ ]

[57] S31@ [ 1 102]

[58] U102@ [ 102]

[59] T27@ [ 27, ]

[60] E22@ [ 22, ]

[61] EZPF [ ]











Fig 4. - Conclusão para o indicador = 5.



Espero que tenha gostado deste artigo e esteja imbuído das origens da programação. Quando você escreve tal código, você começa a apreciar todos os níveis de abstração que apareceram depois, você entende o longo caminho que a linguagem de programação percorreu para se tornar o que é. Obrigado pelo seu tempo!



PS Caros amigos da província de N, não, obrigado pelo código gentilmente cedido por mim, se vocês têm a mesma versão que eu. Boa sorte com RISC-V!



PPS Excelentes exemplos de código para o EDSAC IO2 são fornecidos aqui .



O código PPPS é publicado sob a licença do MIT.
Copyright 2021, ALEKSEI VASILEV

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the «Software»), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.




All Articles