{"id":25832559,"url":"https://github.com/helcsnewsxd/famaf-computer_science-computer_organization","last_synced_at":"2025-02-28T21:39:56.625Z","repository":{"id":213568449,"uuid":"495145626","full_name":"helcsnewsxd/famaf-computer_science-computer_organization","owner":"helcsnewsxd","description":"Laboratorio de la materia de Organización del Computador de la Licenciatura en Ciencias de la Computación de FAMAF (UNC)","archived":false,"fork":false,"pushed_at":"2024-07-23T20:25:23.000Z","size":517,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2024-07-23T23:45:02.786Z","etag":null,"topics":["animation","assembly","famaf-unc","image","lab","low-level-programming","qemu","raspberry-pi-3","university-project"],"latest_commit_sha":null,"homepage":"","language":"Assembly","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/helcsnewsxd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2022-05-22T18:37:10.000Z","updated_at":"2024-07-23T23:45:08.206Z","dependencies_parsed_at":"2023-12-21T19:15:31.429Z","dependency_job_id":"0e0c82ca-d04f-4c79-b367-fe3c58f6a921","html_url":"https://github.com/helcsnewsxd/famaf-computer_science-computer_organization","commit_stats":null,"previous_names":["helcsnewsxd/organizacion-del-computador","helcsnewsxd/famaf-computer_science-computer_organization"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helcsnewsxd%2Ffamaf-computer_science-computer_organization","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helcsnewsxd%2Ffamaf-computer_science-computer_organization/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helcsnewsxd%2Ffamaf-computer_science-computer_organization/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helcsnewsxd%2Ffamaf-computer_science-computer_organization/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/helcsnewsxd","download_url":"https://codeload.github.com/helcsnewsxd/famaf-computer_science-computer_organization/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241245486,"owners_count":19933295,"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":["animation","assembly","famaf-unc","image","lab","low-level-programming","qemu","raspberry-pi-3","university-project"],"created_at":"2025-02-28T21:39:55.930Z","updated_at":"2025-02-28T21:39:56.617Z","avatar_url":"https://github.com/helcsnewsxd.png","language":"Assembly","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Organización del Computador - Proyecto 2022\n\n## Integrantes\n\n- [Bratti, Juan](https://github.com/juanbratti)\n- [Herrador, Emanuel Nicolás](https://github.com/helcsnewsxd)\n\n## ¿De qué se trata?\n\nEl proyecto se trata acerca de la realización de una animación en assembler ARMv8 usando el simulador **QEMU** (la idea es que sea \"dentro\" de una Raspberry Pi). El enunciado del proyecto puede encontrarse [aquí](./enunciado.pdf) y nuestra solución está en este [TAR](./TPQUEMU_Bratti_Herrador.tar.gz).\n\nLa animación realizada es un paisaje elaborado por un fondo con montañas y un descampado compuesto por árboles, yuyos, troncos y una casa estilo campestre. Además, se incluyen efectos de día y noche, y un amanecer.\n\nEl video terminado se puede encontrar en el siguiente [link](https://www.youtube.com/watch?v=4b9ZXc61V48).\n\n## Documentación a tener en cuenta para el desarrollo (no completa)\n\n### Defines o *variables globales*\n\n#### Tamaño del FrameBuffer\n```\nLARGO_FRAMEBUFFER = 480\nANCHO_FRAMEBUFFER = 640\nBITS_PER_PIXEL = 32\n```\n\n#### Algunos colores\n```\nAMARILLO = 0xFFF000\nAZUL = 0xFF\nAZUL_CLARO = 0x3333FF\nAZUL_OSCURO = 0x000066\nBLANCO = 0xFFFFFF\nCELESTE = 0x00FFEF\nGRIS = 0x808080\nMARRON = 0x663300\nNARANJA = 0xFF8000\nNEGRO = 0x0\nROJO = 0xFF0000\nROJO_CLARO = 0xFF3333\nROJO_OSCURO = 0xCC0000\nROSA = 0xFF66FF\nTURQUESA = 0x33FF99\nVERDE = 0xFF00\nVERDE_CLARO = 0x66FF66\nVERDE_OSCURO = 0x006600\nVIOLETA = 0xB300C0\n```\n\n### Uso de los Registros\n\n* `x0` → **Color**\n* `x19` → **ANCHO_FRAMEBUFFER**\n* `x20` → **LARGO_FRAMEBUFFER**\n* `x21` → **Para que siempre esté dentro del FrameBuffer**\n* `x22` → **Sumo al color en x24 en cada iteración**\n* `x23` → **Aclarar / Oscurecer**\n* `x24` → **Color a cambiar**\n* `x25` → **Sumo al color en x0 en cada iteración**\n* `x27` → **Address para return de itera línea**\n* `x28` → **SP -\u003e Stack Pointer**\n* `x29` → **FP -\u003e Frame Pointer. Se pone la dirección base del framebuffer**\n* `x30` → **Direcciones para los return de las funciones**\n\n### Datos piolas a tener en cuenta\n\n#### **- ¿Cómo guardo las variables si no quiero perder el valor pero debo modificarlas en la función?**\n\nSencillo, usando el stack. Para ello, sean x1,x2,x3 los registros que queremos guardar, debemos poner\n```\n// Para guardar los valores\nstr x1,[sp,-8]!\nstr x2,[sp,-8]!\nstr x3,[sp,-8]!\n\n    //\n    // Resto del código ...\n    //\n\n// Para recuperar los valores\nldr x3,[sp],8\nldr x2,[sp],8\nldr x1,[sp],8\n```\n\nIgual, puede hacerse pesado tener que poner todo esto si son muchos los registros a guardar. Para ello está el ejecutable [**fast**](/Etapa%20de%20producci%C3%B3n/fast) (un .cpp compilado). Si le pasamos los nros de los registros que queremos guardar separados por un espacio y al final la palabra *fin*, devuelve todas las instrucciones en el orden correcto que se deben colocar. Solo recordar que str va al principio del código mientras que los ldr al último para recuperar los valores.\nUn ejemplo de llamada puede ser:\n```\n┌──(helcsnewsxd㉿helcsnewsxd)-[~/Documentos/FaMAF/Segundo/Primer cuatri/ODC/lab/ODC-2022-LAB/Pruebas]\n└─$ ./fast          // Ejecutamos fast\n1 2 3 4 5 fin       // Esto sería lo que se pondría como input, el resto nos lo da el ejecutable\nstr x1,[sp,-8]!\nstr x2,[sp,-8]!\nstr x3,[sp,-8]!\nstr x4,[sp,-8]!\nstr x5,[sp,-8]!\n\nldr x5,[sp],8\nldr x4,[sp],8\nldr x3,[sp],8\nldr x2,[sp],8\nldr x1,[sp],8\n```\n\n#### **- Me da vagancia y me pierdo escribiendo los nombres de los registros, ¿no se pueden crear variables?**\n\nNo, no se pueden crear variables pero si se pueden usar *apodos* para los registros. Para ello, se debe tener en cuenta que para \"habilitar\" un apodo dentro de una función, debe utilizarse la siguiente instrucción:\n```\nEstructura -\u003e\n    apodo   .req    registro\n\nEjemplo -\u003e\n    color .req w10\n    xpixel .req x9\n    ypixel .req\n```\nLuego, recordar de \"deshabilitar\" estos apodos antes de terminar la función. Para ello, se hace lo siguiente:\n```\nEstructura -\u003e\n    .unreq  apodo\n\nEjemplo -\u003e\n    .unreq color\n    .unreq xpixel\n    .unreq ypixel\n```\n\n### **Funciones para creación de figuras**\n\nEstas funciones están implementadas en **`formas_geometricas.s`**\n\nUna cosa **importantísima** para destacar en este caso es el uso de algunos registros SAVED. En este caso, vamos a tomar la siguiente convención para todas las funciones de geometría de pintado:\n\n* `x21` → Si x21 es NO nulo, entonces las coordenadas funcionan con  módulo de las longitudes para que siempre se pinte dentro del FrameBuffer. Caso contrario, se pinta normalmente\n\n* `x23` → Si x23 es positivo, se aclara la región. Si x23 es negativo, se oscurece. Caso contrario, si es cero, se pinta normalmente.\n\n* `x24` → x24 es el color a modificar, a cambiar. Si es cero, se cambian todos los colores. Caso contrario, solo los píxeles con color igual a x24.\n\n* `x22` → Lo que se le va sumando al color x24 del mismo modo que se le suma x25 al x0.\n\n* `x25` → Degradado. Es lo que se suma o se resta en las iteraciones para darle un efecto de cambio de color a la figura.\n\n#### **- Dibujar pixel**\n\n##### *Argumentos*\n\n* `x0` → color\n* `(x9,x10)` → punto en el plano cartesiano con (0,0) arriba a la izquierda (nos queda mejor para el PixelArt)\n\n##### *Funcionamiento*\n\nSi el punto pertenece al Frame Buffer, se pinta el pixel correspondiente a la dirección de memoria\n```\nx12 = x29 + 4 * (x10 * ANCHO_FRAMBUFFER + x9)\n```\n\n##### *Llamada*\n\nSe llama simplemente escribiendo\n```\nbl Pinta_punto\n```\n**Notar que es una función nativa.**\n\n\n#### **- Itera línea**\n\n##### *Argumentos*\n\n* `(x1,x2) y (x3,x4)` extremos de la línea\n\n##### *Funcionamiento*\n\nUsando el **algoritmo de bresenham**, esta función devuelve todos los puntos que cumplen pertenecer a este segmento.\n\n##### *Llamada*\n\nEs un poco más rara la llamada debido a que se corta la función a mitad del proceso y luego se retoma. Hay que tener mucho cuidado con el guardado de los registros para no modificar algo que no queremos.\n\nUn ejemplo de llamada es:\n\n```\n// (x1,x2) y (x3,x4) extremos\n    str x26,[sp,-8]!\n    str x30,[sp,-8]!\n    \n    bl Itera_linea\n\n    // if x26 == FIN_ITERACION\n    cmp x26,FIN_ITERACION\n    b.eq Pinta_linea_fin_iteracion\n        // else\n        str x30,[sp,-8]!\n        \n        // Acá va lo que se hace con el punto que pertenece a esa recta.\n        // Tener en cuenta que si se modifican registros, hay que guardalos en el stack\n\n        ldr x30,[sp],8\n\n        ret     // para que me itere al siguiente punto\n\n    Pinta_linea_fin_iteracion:\n\n    ldr x30,[sp],8\n    ldr x26,[sp],8\n\n    ret\n```\n\n**Notar que es una función global.**\n\n\n#### **- Dibujar una línea**\n\n##### *Argumentos*\n\n* `x0` → color\n* `(x1,x2)` y `(x3,x4)` → extremos de la línea\n\n##### *Funcionamiento*\n\nPinta la línea de extremos (x1,x2) y (x3,x4) del color x0. Se realiza utilizando el **Algoritmo de Bresenham para líneas**. Para ello, se llama directamente a la función de itera línea.\n\n##### *Llamada*\n\nSe llama simplemente escribiendo\n```\nbl Pinta_linea\n```\n\n**Notar que es una función global.**\n\n\n#### **- Pinta triángulo**\n\n##### *Argumentos*\n\n* `x0` → color\n* `(x1,x2)`, `(x3,x4)` y `(x5,x6)` → extremos\n* `x25` → lo que se le va sumando al color\n\n##### *Funcionamiento*\n\nUtilizando la función de itera línea, la idea es iterar por todos los puntos del segmento de extremos (x1,x2) y (x3,x4), y dado (x,y) perteneciente a este, se pinta la línea de extremos (x,y) y (x5,x6). Se va sumando x25 en cada pinta_linea al color.\n\n##### *Llamada*\n\nSe llama simplemente poniendo\n```\nbl Pinta_triangulo\n```\n\n**Notar que es una función global.**\n\n\n#### **- Pinta rectángulo básico**\n\n##### *Argumentos*\n\n* `x0` → color\n* `(x1,x2) y (x3,x4)` → extremos opuestos\n* `x25` → lo que se le suma al color\n\n##### *Funcionamiento*\n\nSe itera por todos los puntos del rectángulo y se los pinta. La idea es usar fuertemente que los puntos que se dan son extremos opuestos y que el rectángulo es de lados *paralelos a los bordes*. Se le va sumando x25 al color en cada iteración del eje y.\n\n##### *Llamada*\n\nSe llama simplemente poniendo\n```\nbl Pinta_rectangulo\n```\n\n**Notar que es una función global.**\n\n\n#### **- Pinta cuadrilátero**\n\n##### *Argumentos*\n\n* `x0` → color\n* `(x1,x2)`, `(x3,x4)`, `(x5,x6)` y `(x7,x8)` → extremos del cuadrilátero\n* `x25` → lo que se le suma al color\n\n##### *Funcionamiento*\n\nPinta el cuadrilátero formado por esos cuatro puntos distintos. Se utiliza la función de Pinta triángulo teniendo en cuenta que hay que pintar tres para asegurarnos cubrir toda la zona. Por ende, también afecta x25 al color.\n\n##### *Llamada*\n\nSe llama simplemente escribiendo:\n```\nbl Pinta_cuadrilatero\n```\n\n**Notar que es una función global.**\n\n\n#### **- Dibuja círculo**\n\n##### *Argumentos*\n\n* `x0` → color\n* `(x1,x2)` → centro\n* `x3` → radio\n\n##### *Funcionamiento*\n\nUtilizando el algoritmo de bresenham para circunferencias, esta función dibuja la circunferencia (sin relleno) de centro (x1,x2) y radio x3.\n\n##### *Llamada*\n\n```\nbl Dibuja_circulo\n```\n\n**Es una función global.**\n\n\n#### **- Pinta círculo texturado**\n\n##### *Argumentos*\n\n* `x0` → color\n* `(x1,x2)` → centro\n* `x3` → radio\n* `x25` → lo que se le va sumando al color\n\n##### *Funcionamiento*\n\nLa idea es que quede un círculo con \"textura\" al que le falten algunos píxeles. Para ello, se usa la función Dibuja círculo (que usa bresenham) para hacer todos los círculos de radio entero menor o igual a `x3`. Entre el dibujo de cada circunferencia, se suma x25 al color.\n\n##### *Llamada*\n\n```\nbl Pinta_circulo_texturado\n```\n\n**Notar que es una función global.**\n\n\n#### **- Pinta circulo**\n\n##### *Argumentos*\n\n* `x0` → color\n* `(x1,x2)` → centro\n* `x3` → radio\n* `x25` → lo que se le va sumando al color\n\n##### *Funcionamiento*\n\nLa idea es tener un círculo de color sólido sin \"texturas\". Es decir que todos los píxeles estén pintados. Para ello, se itera por todos los puntos pertenecientes al cuadrado que tiene el círculo inscripto a él y a los que cumplan que ``r^2 \u003e= x^2 + y^2`` se los pinta. Por cada punto pintado se suma x25 al color.\n\n##### *Llamada*\n\n```\nbl Pinta_circulo\n```\n\n**Notar que es una función global.**\n\n\n### **Fondos**\n\nEstas funciones están implementadas en **`fondos.s`**\n\n#### **- Nube** ☁️\n\n##### *Funcionamiento*\nGenera una nube alrededor de un punto. En el caso de ```ConjuntoNubes```, se generan desde el punto que se da para la derecha →.\n\n##### *Llamada*\nNube grande ↓\n``` \nbl Nube1\n```\nNube pequeña ↓\n``` \nbl Nube2\n```\nConjunto de nubes ↓\n``` \nbl ConjuntoNubes\n```\n\n**Notar que es una función global.**\n\n#### **- Fondo de montañas** ⛰️\n\n##### *Funcionamiento*\nColoca al medio del framebuffer montañas.\n\n\n##### *Llamada*\n```\nbl Montanas\n```\n\n**Notar que es una función global.**\n\n\n#### **- Fondo de amanecer** 🌅 \n\n##### *Funcionamiento*\nColoca en la mitad superior del framebuffer un fondo de amanecer copado.\n\n##### *Llamada*\n* Para el primer llamado cuando el framebuffer está totalmente en negro:\n```\nbl Dibuja_fondo_amanecer1\n```\n\n* Para cambiar de noche a día:\n```\nbl Dibuja_fondo_amanecer2\n```\n\n\n**Notar que son funciones globales.**\n\n\n#### **- Sol de amanecer** ☀️ \n\n##### *Funcionamiento*\nColoca en la mitad superior derecha del framebuffer un sol de amanecer copado.\n\n##### *Llamada*\n```\nbl Dibuja_sol_amanecer\n```\n\n**Notar que es una función global.**\n\n\n#### **- Fondo de noche**\n\n##### *Funcionamiento*\nColoca en la mitad superior del framebuffer un fondo de noche copado, reemplazando el del día pero sin modificar nada más que el fondo.\n\n##### *Llamada*\n```\nbl Dibuja_fondo_noche\n```\n\n**Notar que es una función global.**\n\n\n#### **- Luna** 🌙\n\n##### *Funcionamiento*\nColoca en la mitad superior derecha del framebuffer una luna copada.\n\n##### *Llamada*\n```\nbl Dibuja_luna\n```\n\n**Notar que es una función global.**\n\n\n#### **- Pasto**  🌱\n\n##### *Funcionamiento*\nColoca en la mitad inferior del framebuffer el pasto verde sólido y liso.\n\n##### *Llamada*\n```\nbl Dibuja_pasto\n```\n\n**Notar que es una función global.**\n\n\n### **Vegetación**\n\nEstas funciones están implementadas en **`vegetacion.s`**\n\n#### **- Pino** 🌲 \n\n##### *Argumentos*\n* `(x1,x2)` → Origen del tronco. El pino se genera desde este punto hacia arriba.\n\n##### *Funcionamiento*\n\nA partir de un punto, se genera un pino de tamaño fijo con dos posibles variaciones (grande y mediano).\n\n##### *Llamada*\n\nPino grande ↓\n```\nbl Pino1\n```\nPino mediano ↓\n```\nbl Pino2\n```\nPino pequeño ↓\n```\nbl Pino3\n```\n\nExiste como utilidad auxiliar la función ```hojas``` la cual genera el árbol mediano sin tronco. Se la puede llamar usando ```bl Hojas```.\n\n**Notar que es una función global.**\n\n#### **- Arbusto** 🥬 \n\n##### *Argumentos*\n* `(x1,x2)` → Extremo superior izquierdo\n* `(x3,x4)` → Extremo inferior derecho\n\n##### *Funcionamiento*\n\nA partir de dos puntos extremos, se genera un arbusto de tamaño variable. Es importante que se respete que (x1,x2) es el extremo superior izquierdo y (x3,x4) el extremo inferior derecho.\n\n##### *Llamada*\n```\nbl Arbusto1\n```\n\n**Notar que es una función global.**\n\n### **Etapa 1**\n\nEstas funciones están implementadas en **`etapa_1.s`**\n\n#### **- Carpa** ⛺\n\n##### *Argumentos*\n* `(x1,x2)` → Extremo izquierdo\n* `(x3,x4)` → Extremo derecho\n* `(x5,x6)` → Altura de la carpa\n\n##### *Funcionamiento*\n\nA partir de 3 puntos, genera una carpa.\n\n##### *Llamada*\nCarpa con cola hacia la derecha ↓\n```\nbl CarpaDer\n```\nCarpa con cola hacia la izquierda ↓\n```\nbl CarpaIzq\n```\n**Notar que es una función global.**\n\n#### **- Fogata** 🔥\n\n##### *Argumentos*\n* `(x1,x2)` → Extremo izquierdo\n* `(x3,x4)` → Extremo derecho\n* DISCLAIMER: Ambos extremos deben estar sobre el mismo eje Y.\n\n##### *Funcionamiento*\n\nA partir de dos puntos extremos, se genera para arriba una fogata de tamaño variable. Para funcionamiento óptimo, elegir valores para x1 y x3 tal que la diferencia entre los dos sea no menor a ~ 20 píxeles\n\n##### *Llamada*\n```\nbl Fogata\n```\n\n**Notar que es una función global.**\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhelcsnewsxd%2Ffamaf-computer_science-computer_organization","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhelcsnewsxd%2Ffamaf-computer_science-computer_organization","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhelcsnewsxd%2Ffamaf-computer_science-computer_organization/lists"}