{"id":20374941,"url":"https://github.com/f0rno/marina-8bits-computer","last_synced_at":"2025-03-04T21:25:48.144Z","repository":{"id":149079979,"uuid":"621261514","full_name":"F0rno/Marina-8bits-Computer","owner":"F0rno","description":"Un ordenador programable de 8 bits simulado en logisim-evolution","archived":false,"fork":false,"pushed_at":"2023-03-30T11:07:26.000Z","size":3162,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-15T07:02:36.409Z","etag":null,"topics":["8bit-computers","8bit-cpu","8bits","assembly","computer","python3"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/F0rno.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-30T10:04:04.000Z","updated_at":"2024-01-16T22:45:06.000Z","dependencies_parsed_at":"2023-06-30T04:31:38.960Z","dependency_job_id":null,"html_url":"https://github.com/F0rno/Marina-8bits-Computer","commit_stats":null,"previous_names":["f0rno/marina-8bits-computer"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/F0rno%2FMarina-8bits-Computer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/F0rno%2FMarina-8bits-Computer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/F0rno%2FMarina-8bits-Computer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/F0rno%2FMarina-8bits-Computer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/F0rno","download_url":"https://codeload.github.com/F0rno/Marina-8bits-Computer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241923821,"owners_count":20043082,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["8bit-computers","8bit-cpu","8bits","assembly","computer","python3"],"created_at":"2024-11-15T01:27:58.357Z","updated_at":"2025-03-04T21:25:48.113Z","avatar_url":"https://github.com/F0rno.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Marina\n\n![](assets/imgs/components/marina-full.png)\n\nEste proyecto trata sobre como crear un [ordenador](https://es.wikipedia.org/wiki/Computadora) de 8bits, que cumpla los requisitos de una [máquina de Turing](https://es.wikipedia.org/wiki/M%C3%A1quina_de_Turing):\n\n* Leer/Escribir caracteres de una memoria\n* Poder moverse por esa memoria\n* Actuar en base a unos estados definidos\n\nUna vez nuestro ordenador cumpla todos estos requisitos, estaremos seguros de que podra ejecutar cualquier algoritmo de computación.\n\nTodo esto inspirado por la serie de videos de [Ben Eater](https://www.youtube.com/watch?v=HyznrdDSSGM\u0026list=PLowKtXNTBypGqImE405J2565dvjafglHU), y contado por [mí](https://twitter.com/F_de_Fornell).\n\n## Problema\n\nQueremos hacer un ordenador así que necesitaremos resolver estas cuestiones:\n\n1. ¿Dónde lo vamos a montar?\n2. ¿Qué diseño tendrá el circuito?\n3. ¿Cuál es la base teórica detrás de los ordenadores?\n4. ¿Qué componentes necesitamos para la parte practica?\n5. ¿Cómo se programa?\n\n## Soluciones\n\n### 1º Cuestión:\n\nPara crear el circuito de nuestro ordenador usaremos un programa de simulación de circuitos, en este caso yo he elegido [logisim-evolution](https://github.com/logisim-evolution/logisim-evolution), pero se puede utilizar otro si lo queréis.\n\n### 2º Cuestión:\n\nA la hora de elegir que forma tendrá el circuito se abren una infinidad de diseños, pero en lo personal prefiero usar uno basado en un BUS. Más concretamente el patrón [SAP](https://es.wikipedia.org/wiki/Simple-As-Possible_computer).\n\n![](assets/imgs/SAP.png)\n\n### 3º Cuestión:\n\nEstamos siguiendo los pasos para crear un ordenador, pero. ¿Qué es un ordenador?, pues según Wikipedia es: `una máquina electrónica digital programable que ejecuta una serie de comandos para procesar los datos de entrada, obteniendo convenientemente información que posteriormente se envía a las unidades de salida`. Y eso es cierto, pero lo que yo quiero es la definición de su modelo teórico fundamental, la máquina de Turing.\n\n#### ¿Qué es la máquina de Turing?\n\nEs un dispositivo que manipula símbolos sobre una tira de cinta de acuerdo con una tabla de reglas.\n\n![](assets/imgs/turing_machine.png)\n\nUn ejemplo visual con una tabla sencilla, para que se entienda mejor:\n\n![](assets/imgs/TuringBeispielAnimatedGIF.gif)\n\nY ahora con una tabla más compleja:\n\n![](assets/imgs/turing_machine_complex.gif)\n\nSimple ¿no?, pues solo con estas mecánicas tan sencillas se puede ejecutar cualquier algoritmo de computación. Y la verdad, suena a que es mentira o imposible, pero no lo es:\n\nEn términos generales, lo que hace la máquina es leer datos de una memoria y actuar en base a ellos siguiendo unas instrucciones predefinidas. ¿No os suena familiar?, es como programar un ordenador, este también manipula una memoria siguiendo unas instrucciones/estados que le hemos dado.\n\nAhora, con todo este contexto, podemos decir que:\n\n* Sabemos que es y que hace la máquina de Turing\n* Que un ordenador moderno no es más que una máquina de Turing extremadamente compleja que funciona con circuitos electrónicos\n\n### 4º Cuestión:\n\nAhora, para llevar a cabo su construcción necesitaremos los siguientes componentes:\n\n#### `CLOCK`\n\nManda una señal para sincronizar a todos los componentes del ordenador.\n\n![](assets/imgs/components/clock.png)\n\n#### `PROGRAM COUNTER`\n\nEs un registro que guarda un número que puede incrementar y decrementar, para moverse por las direcciones de la memoria. Se utiliza para saber el cauce de la ejecución.\n\n![](assets/imgs/components/PC.png)\n\n![](assets/imgs/components/PC_in.png)\n\n#### `MAR`\n\nEs el registro de dirección de la memoria, almacena un número de 4bits y lo decodifica en 16 direcciones de memoria posibles. Para usarlo como dirección actual de la memoria.\n\n![](assets/imgs/components/MAR.png)\n\n![](assets/imgs/components/mar_in.png)\n\n#### `RAM`\n\nEs la memoria principal del ordenador, guarda los datos/instrucciones que ejecuta el ordenador.\n\n![](assets/imgs/components/ram.png)\n\n#### `REGISTRO A`\n\nAlmacena el número al que la ALU suma o resta otro número.\n\n![](assets/imgs/components/register-a.png)\n\n![](assets/imgs/components/register-a-in.png)\n\n#### `REGISTRO B`\n\nAlmacena el número que la ALU suma o resta al REGISTRO A.\n\n![](assets/imgs/components/register-b.png)\n\n![](assets/imgs/components/register-a-in.png)\n\n#### `ALU`\n\nEs la encargada de hacer las operaciones aritméticas(+,-), con los REGISTROS A y B.\n\n![](assets/imgs/components/alu.png)\n\n![](assets/imgs/components/alu-in.png)\n\n#### `FLAGS REGISTER`\n\nEs el registro que almacena el estado de la última operación de la ALU, si el resultado anterior acarreo un 1 activa la CARRING FLAG o si el resultado fue 0 activa la ZERO FLAG.\n\n![](assets/imgs/components/flags.png)\n\n![](assets/imgs/components/flags-in.png)\n\n#### `REGISTRO DE INSTRUCCIONES`\n\nEs el registro que guarda la instrucción a ejecutar, para pasársela al decodificador de instrucciones.\n\n![](assets/imgs/components/register-instruc.png)\n\n![](assets/imgs/components/register-a-in.png)\n\n#### `DECODIFICADOR DE INSTRUCCIONES`\n\nEs el encargado de decodificar las instrucciones programadas en la RAM para que el ordenador ejecute las acciones necesarias para que esa instrucción se lleve a cabo.\n\n![](assets/imgs/components/instruction_decoder.png)\n\n![](assets/imgs/components/instruction_decoder_in.png)\n\n#### `BUS`\n\nSon unos cables a los que se le conectan todos los componentes del ordenador, para comunicarse entre sí.\n\n![](assets/imgs/components/BUS.png)\n\n### 5º Cuestión:\n\nVale ahora sí, la pieza final para entender como funciona un ordenador es entender cómo es que es programable, porque al fin y al cabo, ¿cómo hacemos que el ordenador ejecute las instrucciones que le damos?. Por ejemplo, un programa que suma 2 más 2 y muestra el resultado:\n\n```\nLDA 15\nADD 15\nOUT\n```\n\nLo que he hecho aquí es cargar en el registro A lo que halla en la dirección de memoria 15, en este caso un 2, después le he sumado al registro A otra vez el valor de la dirección de memoria 15 y he mostrado el resultado.\n\n#### ¿CÓMO?, pues asi:\n\nCogemos y por cada instrucción que pueda interpretar el ordenador, la rompemos en acciones que pueden hacer los componentes del ordenador, que son estas:\n\nHL CE CO JP AI AO EO SU BI BO FI MI RI RO II IO\tOI\n\nEstos son los microcódigos, con los que nos referimos a acciones como:\n\n* HL: Parar el reloj\n* AI: Meter en el registro A lo que haya en el BUS\n* CO: Volcar lo que tiene el PC en el BUS\n\nVale, pues vamos a desmontar la siguiente instrucción.\n\n#### ``LDA 15``\n\n1. CO MI\n2. RO II\n3. CE\n4. IO MI\n5. RO AI\n\nCO volcamos en el BUS la dirección actual del PC y lo metemos en el MAR para ir a esa dirección de memoria.\n\nRO volcamos lo que hay en esa posición de la RAM y lo metemos en el registro de instrucciones.\n\nCE el PC aumenta el contador, para que la próxima vez que hagamos un CO sé la siguiente dirección de memoria.\n\nIO volcamos lo que hay en el registro de instrucciones en el BUS, pero este registro solo saca los 4bits que corresponde a la dirección 15 indicada en la instrucción. MI para ir a esa dirección de memoria.\n\nRO sacamos el valor que haya en esa posición de la RAM y lo metemos en el registro A.\n\nY así con cada instrucción que tenga nuestra máquina. Aquí podéis ver las instrucciones con sus microcódigos que tiene Marina. Hay también veréis que los microcódigos se dividen también en steps(pasos), porque hay microcódigos que no se pueden ejecutar a la vez o no interesa hacerlo, así que rompemos la ejecución de los microcódigos en 8 pasos.\n\nDe esto se encarga el decodificador de instrucciones:\n\n![](assets/imgs/components/instruction_decoder_in.png)\n\n### Generación de la ROM:\n\nPara que el ordenador sepa qué microcódigos ejecutar y cuando, utilizaremos una ROM. Usaremos las instrucciones como dirección y como datos en esa dirección que microcódigos tenemos que ejecutar. Cuando le llegue una instrucción al decodificador de instrucciones, este mirara en la ROM, según qué instrucción y paso es, sabrá qué microcódigo tiene que ejecutar.\n\nPodemos generar la ROM con este archivo `instruc_decoder_rom_generator.py`.\n\n### ¿Cómo usar a Marina?\n\nPara poder ejecutar un programa lo único que hay que hacer es cargar en la RAM las instrucciones, para ello hay dos formas diferentes: la manual o con el compilador.\n\n#### Manual\n\nMiramos los mnemónicos de la [tabla de instrucciones](https://docs.google.com/spreadsheets/d/1ntU3Rf7l5LElHSgGCQE4OmPOD4lz0emifyxvnIvVKok/edit#gid=0), realizamos el programa y con la misma tabla, los pasamos a su valor binario:\n\n```\nLDA 15\nADD 15\nOUT\n```\n\n\n| ADDR | INSTRUC | VALUE | RAM ADDR | INSTRUC | VALUE ADDR |\n| :----: | :-------: | :-----: | :--------: | :-------: | :----------: |\n|  0  |   LDA   |  15  |   0000   |  0010  |    1111    |\n|  1  |   ADD   |  15  |   0001   |  0011  |    1111    |\n|  2  |   OUT   |   0   |   0010   |  1010  |    0000    |\n\nActivamos los pines de programación manual, y la secuencia para meterlos en la RAM es:\n\n![](assets/imgs/components/manual-commands.png)\n\nPonemos en el ADDR la dirección de memoria de la 1º instrucción:\n\n0000 0000, BUS_IN, MI, CLOCK\n\nY cuando estamos en la dirección 0.\n\n![](assets/imgs/components/manual-commands-2.png)\n\n0010 1111, BUS_IN, RI, CLOCK\n\nY así con las instrucciones restantes, hasta que necesitemos introducir las variables necesarias como la dirección 15 que guarda un 2.\n\n0000 1111, BUS_IN, MI, CLOCK\n\n0000 0010, BUS_IN, RI, CLOCK\n\n#### Compilador\n\nOtra vez hacemos el programa usando los mnemónicos de la [tabla de instrucciones](https://docs.google.com/spreadsheets/d/1ntU3Rf7l5LElHSgGCQE4OmPOD4lz0emifyxvnIvVKok/edit#gid=0) y usando el archivo `compilador.py` ponemos los mnemónicos aquí:\n\n![](assets/imgs/compiler/program-list.png)\n\nY las direcciones de las instrucciones aquí:\n\n![](assets/imgs/compiler/program-list-addr.png)\n\nSí, el programa necesita alguna variable como el 1 de la dirección 15, se pone aquí:\n\n![](assets/imgs/compiler/program-value.png)\n\nEjecutamos el `compilador.py` y nos genera el archivo ROM correspondiente al programa, ahora solo habría que cargar el archivo en la RAM, dándole click derecho en sobre la RAM y eligiendo la ROM que cargar.\n\nYa lo sé, no es muy cómodo, pero el proyecto ya se está alargando demasiado y no me da para desarrollar una lectura de fichero.\n\nIndependientemente del método, al final hay que entrar en la pestaña Simulate y activar el auto-click.\n\n## Agradecimientos y fuentes\n\n* Fuente principal del proyecto, tanto por la parte teórica y práctica: [Ben Eater](https://twitter.com/ben_eater)\n* Punto de referencia principal a la hora de diseñar los componentes en logisim-evolution: [Leonardo Berardino](https://github.com/leonicolas/computer-8bits)\n* Como usar las puertas lógicas: [Karl Rombauts](https://medium.com/@karlrombauts/building-an-8-bit-computer-in-logisim-part-1-building-blocks-a4f1e5ea0d03)\n* Contexto de otro proyecto: [spel3o](https://www.instructables.com/How-to-Build-an-8-Bit-Computer)\n* Contexto de otro proyecto: [eddiewastaken](https://github.com/eddiewastaken/logisim-discrete-CPU)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ff0rno%2Fmarina-8bits-computer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ff0rno%2Fmarina-8bits-computer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ff0rno%2Fmarina-8bits-computer/lists"}