1 puntos por GN⁺ 2025-02-08 | 1 comentarios | Compartir por WhatsApp
  • El ensamblador está directamente conectado con la estructura de la CPU, por lo que el primer objetivo de aprendizaje es importante; el 6502 es una plataforma de entrada con una estructura simple y un ecosistema real
  • Con solo 6 registros y 56 instrucciones originales, permite aprender rápidamente conceptos básicos como registros, carga/almacenamiento, operaciones lógicas y aritméticas, y bifurcaciones
  • Como fue una CPU real usada en Apple II, Commodore VIC 20, Commodore 64 y BBC micro, es fácil hacer aprendizaje práctico con emuladores, dispositivos de recreación y materiales gratuitos
  • Easy 6502 ofrece un ensamblador y simulador basado en JavaScript para probar código directamente en la web, ideal para tomarle la mano en poco tiempo
  • Z80, RISC moderno y x86-x64 también vale la pena aprenderlos, pero como primer paso el 6502 reduce la carga de aprendizaje gracias a su baja complejidad

Por qué el 6502 es adecuado para principiantes

  • La programación en ensamblador tiene una conexión con el hardware más fuerte que los lenguajes de alto nivel, así que la primera CPU con la que uno se topa influye mucho en la dificultad del aprendizaje
  • El ensamblador de 6502 no ofrece hoy un entorno especialmente cómodo para escribir aplicaciones de uso profesional
    • Si no te interesa la programación retro en sí, no hace falta quedarse mucho tiempo en 6502
  • Como plataforma de entrada, sus ventajas son la simplicidad y su carácter real
    • Gracias a su estructura simple, se pueden aprender rápido los conceptos básicos
    • Hay muchos dispositivos reales, emuladores, libros y materiales en línea, así que es fácil trazar una ruta de aprendizaje
  • Los registros y las instrucciones se mantienen reducidos

    • El 6502 tiene solo 6 registros
      • 1 acumulador
      • 2 registros índice
      • registro de estado
      • registro de pila
      • contador de programa
    • El único registro de 16 bits en el 6502 es el contador de programa
    • Tener pocos registros limita la escritura de aplicaciones reales, pero ayuda a entender el papel y funcionamiento de los registros
    • El conjunto original del 6502 incluye solo 56 instrucciones
    • Incluso con este conjunto pequeño se pueden aprender los principales tipos de instrucciones
      • carga/almacenamiento
      • operaciones lógicas
      • operaciones aritméticas
      • bifurcaciones
    • Estos tipos siguen existiendo de una u otra forma en las CPU modernas
    • En x86-x64 no es fácil ni siquiera empezar a contar registros e instrucciones, y tampoco se puede decir que conjuntos RISC modernos como ARM sean realmente pequeños y simples

Ecosistema real y otras alternativas

  • Un ecosistema viejo, pero vivo

    • El 6502 fue introducido a mediados de los años 70 por MOS Technology como una versión más barata y simplificada del Motorola 6800
      • El mismo equipo había desarrollado antes el Motorola 6800
    • Después ganó popularidad rápidamente y se usó en varias microcomputadoras famosas
      • Apple II
      • Commodore VIC 20
      • Commodore 64
      • BBC micro
    • Es fácil encontrar emuladores de estos equipos, y en algunos casos también hay recreaciones modernas en hardware
    • Los sucesores del 6502 siguen produciéndose al momento de escribir el artículo, y dispositivos nuevos como Neo6502 de Olimex también ejecutan variantes de la familia 6502
    • Hay muchos materiales gratuitos de aprendizaje en internet, y una buena parte puede encontrarse en 6502.org
  • Materiales de aprendizaje para practicar de inmediato

    • Easy 6502 es un libro electrónico de Nick Morgan, adecuado para quienes quieren probar el 6502 de forma breve
    • Incluye no solo texto e imágenes, sino también un ensamblador y simulador de 6502 escritos en JavaScript
      • Se puede escribir directamente código simple en ensamblador 6502 desde la página web
    • Visual6502.org no es tanto una herramienta para aprender ensamblador como un recurso que muestra visualmente la simplicidad del 6502
  • Diferencias frente a otros candidatos para empezar

    • Las CPU virtuales creadas con fines educativos pueden tener un conjunto de instrucciones limpio y “perfecto”, pero es difícil que cuenten con tantos materiales y comunidad como el 6502
    • CPU retro como Z80, 6809 y 68000 también son buenas opciones
      • Se considera que las tres son mejores que el 6502 para programación seria
      • Para aprender conceptos básicos, la simplicidad del 6502 resulta más ventajosa
    • El Z80 tiene muchos más registros que el 6502 y también un conjunto alternativo de registros, por lo que es menos fácil para empezar
    • Arquitecturas RISC modernas como ARM, MIPS y RISC-V son cosas que un programador serio de ensamblador debería aprender en algún momento
      • Aun así, no son ideales como punto de entrada
      • Su simplicidad se relaciona más con la implementación interna del chip que con el conjunto de instrucciones
    • La mayoría de los microprocesadores modernos se programan en lenguajes de alto nivel, y la experiencia de escribir instrucciones de ensamblador directamente no ocupa un lugar alto entre las prioridades del diseño de CPU
    • En ARM64, para cargar una constante de 64 bits en un registro pueden hacer falta 4 instrucciones, incluyendo desplazamientos de bits
      • En comparación, el proceso de cargar una constante en un registro en 6502 es simple
    • x86-x64 puede considerarse el conjunto de instrucciones más popular en escritorios y servidores modernos, y ARM lo viene alcanzando
      • Tiene instrucciones ricas con cantidad variable de operandos y no está limitado por restricciones de tamaño de 32 bits, por lo que en algunos aspectos puede ser más fácil de programar que ARM
      • Pero para los principiantes sigue siendo muy complejo, y 40 años de historia no han hecho a x86-x64 más simple

1 comentarios

 
GN⁺ 2025-02-08
Opiniones de Hacker News
  • Me cuesta estar de acuerdo con que la simplicidad del 6502 sea mejor que la del 68000.
    El 68000 tiene más registros y anchos de datos más grandes, pero su estructura es uniforme. En la práctica, hay dos tipos, A y D, repetidos como D0~D7 y A0~A7, así que lo que se puede hacer en D0 también se puede hacer en D3. La simplicidad de la estructura debe equilibrarse con la simplicidad de programar, y con el 6502, apenas intentas escribir un programa un poco complejo, te topas constantemente con sus limitaciones.
    La mejor forma de aprender a sortear las limitaciones de una máquina pequeña es, más bien, ignorar esas limitaciones y convertirse en un ingeniero de software experimentado. Si eres principiante, conviene empezar con algo que tenga más modos de direccionamiento, que facilite manejar arreglos grandes y que ofrezca registros y anchos de enteros más holgados.

    • Lo veo de forma parecida, pero desde otra perspectiva. Durante las últimas décadas trabajé sobre todo con 6502, 68k, z80 y x86/64 en el ámbito de las demos, y hasta me dio la impresión de que este texto quizá lo escribió una IA.
      Se afirma que el 6502 es simple porque tiene 6 registros, pero cualquiera que lo use apenas una semana se da cuenta de que, en la práctica, maneja tres registros. De ahí también viene el apodo de CPU semáforo.
      El 6502 es divertido y limpio, pero no es adecuado si quieres un enfoque moderno. Si quieres seguir el camino glorioso al estilo de los 90, mejor empieza por MIPS, o simplemente por Neon. También podría decirse que el Z80, por sus registros y su complejidad, se parece más a lo que uno encuentra hoy.
      El ensamblador moderno en sí no es inherentemente complejo. Si empiezas con FASM no es difícil, pero el enfoque de bajo nivel siempre se complica rápido. Luego empiezas a crear macros y, al final, terminas montando tu propia versión pobre de algo parecido a C.
    • Aprender a sortear las limitaciones de una máquina pequeña es una buena etapa para convertirse en un ingeniero de software/hardware experimentado.
      La ventaja de los sistemas pequeños es que puedes entenderlos por completo, desde el silicio hasta el sistema operativo y el software.
      El 6809 es más simple que el 68K, más potente que el 6502 y tiene buena ortogonalidad, pero no cuenta con una base de software del mismo nivel. Creo que Motorola tomó una dirección bastante buena con los conjuntos de instrucciones y la arquitectura vista por el programador del 6809 y del 68K. Recuerdo que el PDP-11/VAX y el NS32K también eran bastante ortogonales en un sentido similar.
    • El 6502 es mejor que el Z80 para ensamblador de juguete, pero eso no es decir mucho. Tampoco es fácil sostener que sea claramente mejor que el conjunto de instrucciones AVR de 8 bits.
      Si pensamos en plataformas más modernas, hay un argumento fuerte para enseñar RISC-V en vez de MC68k. Si se mira solo el conjunto básico de instrucciones enteras, RISC-V es muy simple y elegante, y a la vez se parece a arquitecturas modernas como ARM, Aarch-64 y MIPS. Existe en 32 y 64 bits, y su documentación oficial también es accesible.
      MC68k tiene demasiadas particularidades que hoy no son muy relevantes. Su ventaja sería que se usó en varias plataformas de hardware y que todavía tiene una comunidad retro activa, pero eso es más un factor de interés que una relevancia real.
    • El 68K también resulta algo incómodo por el bus de 24 bits, las restricciones de alineación y el soporte ambiguo para indexar arreglos. También molesta que no tenga factor de escala.
      El 68020 está muy cerca del máximo al que una arquitectura de conjunto de instrucciones puede aproximarse a C, y se siente muy bien de usar.
    • Aprendí a programar con el 6510, pero coincido en que el conjunto de instrucciones del 68000 era mucho mejor, y más fácil de leer y aprender. Yo también elegiría el 68000.
      Dicho eso, usar 65XX en las primeras computadoras Commodore fue muy gratificante. Como no había protección de memoria, podías modificar directamente la memoria de video, tocar sprites, fuentes, bordes e interrupciones, y también escribir código automodificable. El ensamblador del 68000 en Amiga era un entorno más seguro y controlado.
  • Creo que el 6502 no es una buena primera familia de instrucciones para aprender ensamblador. Terminas dedicando mucho tiempo a lidiar con las peculiaridades de una arquitectura ingeniosa, pero profundamente defectuosa.
    Esos modismos de workaround no se trasladan bien a arquitecturas mejores que no estaban atadas a las restricciones de herramientas y presupuesto que tenía MOS en ese momento.
    Si quieres aprender un conjunto de instrucciones pequeño pero potente, con algunas peculiaridades, ARM v6M es mejor. Todavía se produce de forma significativa, y en toolchains open source modernas tiene buen soporte de depurador, compilador, ensamblador y linker.
    Si valoras la apertura de la arquitectura y puedes tolerar una plataforma aún menos madura, elige un MCU RISC-V. Si no puedes decidir, elige el RP2350.
    El conjunto de instrucciones ARMv6M es pequeño y, si usas cargas relativas al PC para cargar constantes tal como indica la documentación, no necesitas secuencias de instrucciones largas y tediosas. Tampoco hace falta código automodificable ni indexar memoria mediante la página cero, y el ancho de los registros coincide con el espacio de direcciones. Al ser de 32 bits, en realidad es más fácil de aprender y enseñar que la mayoría de los conjuntos de instrucciones de 8/16 bits. Si eso suena aburrido, no te preocupes: ARMv6 también tiene suficientes peculiaridades para hacer code golf.

    • Me gusta la arquitectura 6502, pero si un principiante interesado en computadoras antiguas no tiene experiencia previa con ensamblador, por lo general lo orientaría hacia otra cosa.
      Empecé con ensamblador PIC16 y he tocado un poco varias arquitecturas, pero por limpieza la que más me gustó fue MIPS32.
      Como pequeño complemento: todavía se pueden comprar 6502 nuevos, MCU con núcleo 6502 y chips periféricos fabricados por Western Design Center. También los venden en lugares como Mouser.
      https://www.mouser.com/c/?m=Western%20Design%20Center%20%28W...
    • Hace tiempo usé bastante ensamblador 6502, y se dedica bastante tiempo a lidiar con una arquitectura de 8 bits.
      Solo multiplicar dos números de 16 bits requiere un buen bloque de código. No me parece útil que un programador nuevo tenga que pelearse con eso.
      Como se dijo, los conjuntos de instrucciones ARM tempranos son una buena opción.
    • ARM también tiene algunos puntos dolorosos para principiantes por la forma en que los inmediatos entran dentro de la instrucción. Puede no ser intuitivo por qué algunos inmediatos u offsets son posibles y otros no.
      Claro que es un problema presente en varios lenguajes ensambladores, pero al principio sería bueno empezar con un conjunto de instrucciones que no tenga ese problema.
    • Ni siquiera logro intuir bien a qué se refiere eso de “profundamente defectuosa”.
    • Me sigue viniendo a la mente la serie en protoboard con 65C02 de Ben Eater[1]. ¿Habrá alguna forma de reproducir lo que hace en esos videos con una CPU ARM?
      [1] https://youtube.com/playlist?list=PLowKtXNTBypFbtuVMUVXNR0z1...
  • Hablando desde la experiencia de haber enseñado ensamblador durante varios años a estudiantes de pregrado, estoy de acuerdo en que el 6502 es bueno para principiantes. Pero la razón no son solo las virtudes del lenguaje 6502 en sí.
    He enseñado 68K, MIPS, ARM, x86, etc., y la principal razón por la que los estudiantes reaccionaron bien cuando enseñé 6502 fue el contexto alrededor de la CPU. Con 6502 programamos una máquina real fácil de entender: el Nintendo Entertainment System.
    E/S básica mapeada en memoria, sin sistema operativo, sin instrucciones de pipeline, sin delay slots, sin red, sin ruido innecesario. Es casi una caja simple con un reloj, una CPU, algunas direcciones de memoria, chips auxiliares y E/S mapeada a direcciones de memoria. El 6502 no es el conjunto de instrucciones más simple, pero la simplicidad del sistema ayuda mucho.
    Las restricciones del 6502 también fueron importantes para que los estudiantes entendieran por qué las instrucciones tienen esa forma. La CPU fue diseñada y cableada dentro de las restricciones de la época, y eso se refleja en la manera de programarla.
    Elegir 6502 y NES para enseñar a principiantes fue un éxito. No tanto por ser 6502, sino porque el 6502 obligaba a que el propio sistema que mueve bits fuera simple.
    Después de que los estudiantes tocaron el 6502 y vieron moverse tiles de la NES en la pantalla, fue fácil ampliar de forma natural hacia cómo el 68000 resuelve las cosas de otra manera, cómo apareció MIPS, cómo se usan el pipelining y los delay slots, y cómo comparar RISC y CISC. Cuando hay una base, avanzar se vuelve muy simple.

  • Si no se trata de aprender un conjunto de instrucciones usado actualmente, me sorprende un poco que casi no se mencione el ensamblador PDP-11 como buen punto de partida.
    Tal vez sea porque lo primero que aprendí bien fue PDP-11, pero los primeros microprocesadores me parecieron todos un paso atrás. Usé ensamblador Z80 durante algunos años, pero hoy no lo recomendaría. No es un conjunto de instrucciones ortogonal, y el 6502 tiene tan pocos registros que es difícil que dé una buena sensación de lo que es escribir ensamblador.

    • Hoy en día es bastante difícil conseguir un PDP-11, y tampoco es sencillo conseguir un sistema operativo, compiladores, etc.
      Si te gusta el PDP-11, puedes obtener ventajas parecidas en forma algo limitada con MSP430, y en forma algo reforzada con 68000.
      Pero, la verdad, lo mejor es olvidar esas reliquias y aprender RISC-V. O elegir una de las varias variantes de Arm. Personalmente me atrae emocionalmente el ARM7TDMI, con el que trabajé mucho a mediados de los 2000. El modo Thumb puede ser un poco más fácil de aprender que el modo Arm original, pero ninguno de los dos resulta tan satisfactorio como RISC-V.
    • De acuerdo. PDP-11 es muchísimo más cómodo; no hay comparación.
      Se podría argumentar que sus modos de direccionamiento son conceptualmente más complejos que los de RISC, pero en la práctica es muy probable que los modos de direccionamiento del 6502 sean más difíciles de entender que los del PDP-11.
    • Aprender ensamblador PDP-11 también te ayuda a entender por qué algunos modismos de C son como son. Por ejemplo, los punteros a punteros corresponden directamente a un modo de direccionamiento nativo de la arquitectura.
    • El conjunto de instrucciones -11 es una obra maestra de ingeniería. DEC tenía todo lo necesario para dominar por completo el negocio de las microcomputadoras.
      Pero DEC ignoró esa oportunidad, e IBM se quedó con ese lugar usando el tosco conjunto de instrucciones 8086.
      Ahora ya no tiene sentido aprender -11.
  • No entiendo bien cómo se llega a esa conclusión. Cuando los estudiantes tienen su primer contacto con la programación de computadoras, puede tener sentido empezar con un lenguaje de juguete/pequeño sin uso real. Pero ensamblador no debería ser el primer lenguaje que aprendan.
    El ensamblador es una herramienta muy práctica y normalmente se usa mucho para depuración e ingeniería inversa. Entonces, ¿por qué dedicar tiempo al ensamblador de una plataforma que desapareció hace mucho?
    La mejor forma de aprender ensamblador es experimentando. Puedes escribir código en tu lenguaje favorito y ver la salida intermedia en ensamblador, o mirar por dentro con objdump o gdb. También puedes modificar cosas y ver qué pasa.
    También se puede hacer con emuladores de computadoras antiguas, pero es más difícil. Incluso para imprimir un solo texto en pantalla hay que aprender la arquitectura de esa computadora, su hardware y las funciones de la ROM, y ese conocimiento casi no se aplica a Linux o Windows en x86-64.

    • Me costaba entender C, y recién se me abrió el camino después de aprender hexadecimal y programación en ensamblador en el 68HC11.
      Para alguien totalmente principiante, conceptos como punteros eran demasiado abstractos y difíciles, pero al aprender direccionamiento indirecto en ensamblador, de pronto quedó claro por qué C tiene punteros y cómo funcionan.
      Antes usaba principalmente Python, que estaba mucho más abstraído. La gente suele olvidar que funciones como los punteros existen por restricciones de hardware y rendimiento. Si no sabes qué hace realmente la CPU por dentro y por qué, tu comprensión intuitiva queda limitada.
    • Si pasas unos meses tocando hardware y programando en ensamblador, entiendes el funcionamiento básico de la computadora de una forma completamente distinta a la de los lenguajes de alto nivel.
      No he escrito ni una línea de ensamblador desde la preparatoria, pero gracias a una comprensión básica de cómo se ejecutan las operaciones y cómo funcionan los registros, me resulta mucho más fácil entender las razones, condiciones y excepciones de la programación y la optimización. También valoro mucho más el código limpio y eficiente.
    • Incluso cuando teníamos diez años nos fue bastante bien con él como segundo lenguaje, después de un cómic sobre programación en BASIC.
      Si quieres probar un poco del pasado, está aquí:
      https://www.atariarchives.org/
    • Hay, a grandes rasgos, dos caminos para aprender programación. Un enfoque de arriba hacia abajo, que baja desde conceptos abstractos hasta la implementación real, como SICP; y un enfoque de abajo hacia arriba, que empieza con código concreto de bajo nivel y deja que las abstracciones surjan de forma natural.
      Como estudié electrónica, naturalmente empecé con ensamblador (Motorola HC11). Para cuando terminó el curso, todos habíamos creado de forma independiente macros para cosas como bucles for, y de ahí el paso a C fue natural. Al terminar el curso de C, también apareció de forma natural la orientación a objetos al estilo C, lo que llevó al siguiente curso de C++.
      La desventaja de este enfoque es que no ofrece un camino gradual hacia el paradigma funcional ni hacia paradigmas no imperativos en general. También te deja el hábito de pensar constantemente en cómo funciona un lenguaje por dentro, y eso a veces puede ser contraproducente. Incluso cuando intenté aprender Haskell, mi cabeza empezaba por tratar de entender cómo funcionaba el intérprete.
      Aprender ensamblador no es solo aprender un lenguaje, sino entender cómo funciona la máquina: buses, mapeo de memoria, periféricos, etc. En plataformas antiguas, esta parte es mucho más simple. Por eso, aunque las instrucciones ARM sean más fáciles de aprender que las instrucciones CISC del HC11, todo lo demás hace que el HC11 sea más amigable para principiantes.
    • En el compilador dmd, si compilas con -vasm, te muestra durante la compilación el ensamblador generado. Algunos lo criticaron diciendo que bastaba con usar objdump o -S, pero cuando lo usas directamente entiendes por qué es cómodo: porque imprime directamente solo el ensamblador, sin una enorme cantidad de código repetitivo para crear el archivo objeto.
      Por ejemplo, si estás trabajando en un generador de código AArch64, más específicamente en la generación de código de punto flotante, y tienes una función como esta:
      float test(float a, float b) { return a * b; }
      Al compilar con dmd -c test.c -arm -vasm, se imprimen la dirección, la instrucción en hexadecimal, el mnemónico de la instrucción y la URL de la especificación de la instrucción.
      Sé que el código no está del todo correcto. Ya dije que todavía está en desarrollo :-)
  • Para mí, el conjunto de instrucciones 6502 fue un buen primer lenguaje ensamblador.
    En 1977 vivía en una pequeña cabaña en Oregon y compré una Apple II para entretenerme. En menos de un año terminé trabajando en el programa que más tarde se convirtió en Apple Writer, escrito completamente en ensamblador.
    https://en.wikipedia.org/wiki/Apple_Writer
    Aquí dicen que el ensamblador 6502 era bastante tosco y difícil de escribir, y mirando hacia atrás estoy de acuerdo. Pero en 1977 no tenía un punto de comparación.
    Como la Apple II no tenía un lenguaje de alto nivel rápido, mi pequeño programa se convirtió en un producto de Apple gracias a la falta de alternativas.
    Pensándolo bien, Apple Writer cabía en 8 KB de RAM, pero realmente hacía su trabajo. Incluso tenía un lenguaje de macros que la gente usaba para procesar listas de direcciones.
    Hace poco amplié mi sistema principal a 96 GB de RAM para ejecutar DeepSeek localmente con más facilidad, y también tengo una RTX 4090. De pronto me di cuenta de que con esa RAM podría guardar casi 12 millones de copias de Apple Writer.
    Es bastante surrealista, pero desde 1977 he tenido varias ocasiones para decir cosas así.

  • Como lenguaje ensamblador inicial, prefiero RISC-V. Tiene buen diseño, es más intuitivo, cuenta con soporte de herramientas y lenguajes modernos como GCC, LLVM y Rust, y corre en QEMU y en hardware real que se puede comprar.

    • ARMv7 también cumple esos criterios y es agradable de usar. Se puede usar en línea dentro de BBC Basic en la Acorn Archimedes.
    • La última vez que revisé, RISC-V todavía no tenía un macroensamblador digno de ese nombre.
    • Si hablamos de “hardware real que se puede comprar”, la última vez que revisé el 65C02 todavía se fabricaba y vendía.
      Incluso puede funcionar nada menos que a 14 MHz.
  • El tema de la simplicidad del conjunto de instrucciones del 6502, personalmente, me resulta molesto. Quienes creen que esa simplicidad es buena parecen no haber avanzado más allá de Hello World
    Programar algo de complejidad media en 6502 es difícil. 8 bits son demasiado limitados; por ejemplo, basta ver el direccionamiento de pantalla en la Commodore 64. La multiplicación y la división hay que implementarlas a mano, y la suma/resta de 16 bits, aunque simple, no es para nada trivial si se quiere hacer de forma eficiente
    Si el objetivo es aprender ensamblador básico, la plataforma 8086+DOS es mucho más manejable en comparación

    • En el contexto de un primer contacto con ensamblador, que haya que implementar multiplicación/división a mano es más bien algo bueno
      Pasar varios algoritmos de multiplicación y división a ensamblador es una muy buena forma de aprender
    • Las restricciones son parte de la diversión. El ensamblador 8086 no es tan divertido
      Si de todos modos vas a aprender algo que no es relevante hoy por no ser x86-64, RISC-V ni ARM, no veo bien cuál sería la ventaja del 8086
    • El ensamblador que más usé probablemente fue 8086, o más exactamente el 80286 en modo real
      Disfruté cada momento, y los registros de segmento tampoco me molestaban mucho
  • Asisto a una escuela técnica centrada en ciencias de la computación, y un profesor de informática al que le gusta lo retro y mostrar su propia máquina arcade se enfocó en el 6502 en lugar del ensamblador 8808 que estaba en el plan de clases establecido
    Honestamente fue una de las mejores experiencias de aprendizaje de mi vida, y no me gustaría que hubiera sido de otra manera. Incluso nos hizo construir la computadora en protoboard de Ben Eater, así que tuvo un componente muy práctico y fue realmente interesante

  • Mi primer contacto con el lenguaje ensamblador fue con el PDP-10, y lo único que tenía era el manual del procesador DEC-10
    Estaba completamente confundido. Había cientos de instrucciones y las explicaciones eran opacas. No tenía idea de qué era un registro, qué era un acumulador, qué era una dirección ni qué era una pila. David Rolfe me escribió algunas subrutinas que necesitaba para mi versión en Fortran de Empire, lo cual ayudó un poco, pero seguía perdido
    Un día le pregunté a mi amigo Shal Farley qué era una pila, y me dijo: “Imagínate una pila de platos. Pones un plato encima (push) y sacas uno (pop)”. En ese momento se me prendió la luz y lo entendí de inmediato
    Después empecé a trabajar con el microprocesador 6800 en una pequeña placa. Tenía unas 40 instrucciones y todas cabían en una sola tarjeta. Esas 40 instrucciones eran fáciles de aprender y, de repente, todo tuvo sentido
    Cuando volví al manual del -10, todo empezó a tener sentido