EDSAC (solo para los más duros)

¿Qué le viene a la mente cuando escucha “programación de bajo nivel”? ¿Quizás C ++? Control de puntero continuo, intentos de optimizar el rendimiento, consumo de memoria? ¿O probablemente representa las instrucciones de ensamblaje de alguna arquitectura popular en la actualidad?



Si recuerdas cómo un perforador perforó una cinta perforada, un agujero tras otro, durante muchas horas, ¡este artículo es para ti! ¡Bienvenido bajo el corte! :)



Lasciate ogni speranza, voi ch'entrate

- Dante Alighieri, La Divina Commedia


EDSAC - "Calculadora automática de almacenamiento con retardo electrónico", fue creada en Cambridge en 1949 con fines militares. Ahora en el olvido, lo recuerdan solo con fines educativos en la provincia N-ésima en la poco conocida Alma Mater, la hija de la Universidad Estatal de Petersburgo.

También está The EDSAC Replica Project , donde un poderoso grupo de entusiastas está creando un emulador y guías EDSAC para preservar la memoria de este increíble dispositivo.



Una de las características más agradables del EDSAC es que conceptualmente es una máquina muy simple.

- Guía tutorial del simulador EDSAC


El dryndulet se ve así:



Figura 1.1. - Simulador EDSAC de cerca.





Figura 1.2. - Simulador EDSAC de distancia.



Puedes descargarlo aquí .



A la izquierda puede ver un editor de texto para obtener instrucciones. Hay dos tipos de instrucciones: Órdenes iniciales 1 (en adelante IO1) y Órdenes iniciales 2 (mega avanzadas). El editor resalta la línea modificada en amarillo, verde, las guardadas. Los comentarios se incluyen entre []. El editor tiene memoria varios pasos hacia atrás, por lo que puede revertir el programa presionando Ctrl + Z. Todo esto solía escribirse en cinta perforada, esto es un remake. La primera instrucción en IO1 es TNS, donde N es la dirección de la última línea con instrucción + 1. El programa EDSAC más simple es:



Listado 1. - Código de pedido EDSAC, el programa más simple.
T32S







Ella no hace nada. Como la mayoría de mis programas. La cuenta regresiva comienza desde 31, porque las celdas de 0..30 se usan inicialmente para iniciar la máquina, luego se pueden usar como celdas de memoria.



Por cierto, por defecto el simulador está configurado en IO2, para cambiarlo a IO1, haga clic en el panel superior de EDSAC -> IO1. Se inicia con el botón Inicio, se detiene con Detener, EP único: depuración paso a paso; para ello, primero debe escribir Z0S / ZS / Z0F / ZF.



A la derecha puede ver el simulador y el contenido de la memoria de la computadora. Las palabras son de 17 bits, un total de 1024 celdas de memoria (o 35 bits, 512 celdas de memoria, ya que será más conveniente, en el medio hay un misterioso "dígito sándwich"). También hay un acumulador (RAM) de 71 bits y un registro de multiplicación de 35 bits. El simulador admite la entrada de teléfono de disco, impresión. Al activar las sugerencias , puede ver el contenido de las celdas de memoria colocando el mouse sobre ellas. Aparecerá un número en 10CC en la parte superior. También puede ver el contenido del acumulador y el registro de multiplicación.





Fig 2. - Formato de una palabra de máquina.





Fig 3. - Formato de las instrucciones de la máquina.



Sobre números. El número se escribe en la memoria en complemento a dos utilizando la instrucción: PNS o PNL, donde N es un factor antes de dos. Por ejemplo, P0S = 2 * 0 + 0 = 0, P0L = 2 * 0 + 1 = 1, P1S = 2, P1L = 3, etc. Los números negativos están escritos en código de complemento, puedes leer sobre esto en el tutorial . EDSAC también trabaja con números fraccionarios. Símbolo de palabra corta S (F para IO2) y L (D). No solo los números, sino también las instrucciones cambian su significado dependiendo de esto.



Hay un par de guías, la principal y la abreviada , recomiendo la última porque hay menos hayas, el material se presenta más claro, ejemplos de trabajo.



Para que el código dado en ellos funcione, debe reemplazar la primera línea de ZOS / ZS / Z0F / ZF con X0S / X0F. Vea las instrucciones allí, o ya en los comentarios del código.



En el transcurso de varios meses, se han producido muchas versiones del procedimiento de impresión decimal. Si el programador era impenetrablemente estúpido, o era un completo idiota y un completo perdedor, entonces la rutina de conversión requeriría unas cien instrucciones de él. Pero cualquier hacker que se precie podría caber en menos espacio. Al final, al eliminar instrucciones de un lugar a otro, el procedimiento se redujo a unas cincuenta instrucciones.



- Stephen Levy, Hackers: héroes de la revolución informática


Entonces, mi tarea fue escribir un programa para imprimir la enésima línea del triángulo de Pascal.



Listado 2. - Kotlin, dando salida a la tercera línea del 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
    }
}

      
      







Habrá un bucle anidado aquí, ya que la división debe hacerse manualmente.



Listado 3. - Código de pedido EDSAC, división de enteros, redondeo hacia abajo.
[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 habrás notado, el direccionamiento es absoluto, lo que provoca dolor de cabeza, agresión, rechina los dientes, odio, decepción, enfado, dificultades (esto se solucionó en la versión 2 de las Órdenes Iniciales). Cuando se cambia una línea, se cambia MUCHO a la vez . Y es necesario volver a escribir las direcciones de todas las líneas "flotantes".



Finalmente la solución:



Listado 4. - Código de pedido EDSAC, IO1, enésima línea del 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, ]









¿Qué puedo decir sobre IO2? Soporta subrutinas, direccionamiento relativo, conjunto de comandos extendido.



El mismo programa en IO2:



Listado 5. - Código de pedido EDSAC, IO2, enésima fila del 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. - Conclusión para el indicador = 5.



Espero que haya disfrutado de este artículo y esté imbuido de los orígenes de la programación. Cuando escribes ese código, comienzas a apreciar todos esos niveles de abstracción que aparecieron después, comprendes el largo camino que recorrió el lenguaje de programación para convertirse en lo que son. ¡Gracias por tu tiempo!



PD Queridos amigos de la provincia de N, no gracias por el código amablemente proporcionado por mí, si tienen la misma versión que yo. ¡Buena suerte con RISC-V!



PPS Aquí se proporcionan excelentes ejemplos de código para EDSAC IO2 .



El código PPPS se publica bajo la licencia 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