{"id":19623950,"url":"https://github.com/710lucas/risc-i-emu","last_synced_at":"2026-02-06T20:02:13.505Z","repository":{"id":182406314,"uuid":"654233578","full_name":"710lucas/RISC-I-Emu","owner":"710lucas","description":"A simple emulator based on the Berkeley RISC (RISC-I) created by David A. Patterson | Um simples emulador do Berkeley RISC (RISC-I) criado por David A. Patterson","archived":false,"fork":false,"pushed_at":"2025-01-26T14:17:17.000Z","size":101,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-28T05:34:53.265Z","etag":null,"topics":["berkeley","berkeley-risc","cpu-emulator","emulacao","emulation","risc","risc-i"],"latest_commit_sha":null,"homepage":"","language":"C++","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/710lucas.png","metadata":{"files":{"readme":"README-pt.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,"zenodo":null}},"created_at":"2023-06-15T17:07:38.000Z","updated_at":"2025-01-26T14:17:20.000Z","dependencies_parsed_at":"2024-08-03T18:43:13.306Z","dependency_job_id":"9c32677d-8372-4664-b03c-56c4d52d4e29","html_url":"https://github.com/710lucas/RISC-I-Emu","commit_stats":null,"previous_names":["luxs710/risc-i-emu","710lucas/risc-i-emu"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/710lucas/RISC-I-Emu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/710lucas%2FRISC-I-Emu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/710lucas%2FRISC-I-Emu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/710lucas%2FRISC-I-Emu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/710lucas%2FRISC-I-Emu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/710lucas","download_url":"https://codeload.github.com/710lucas/RISC-I-Emu/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/710lucas%2FRISC-I-Emu/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29174327,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-06T19:56:27.068Z","status":"ssl_error","status_checked_at":"2026-02-06T19:56:18.934Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["berkeley","berkeley-risc","cpu-emulator","emulacao","emulation","risc","risc-i"],"created_at":"2024-11-11T11:36:11.428Z","updated_at":"2026-02-06T20:02:13.478Z","avatar_url":"https://github.com/710lucas.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"[English](README.md)\n\n# Emulador de RISC-I\n\nEste projeto foi feito com o intuito de apenas me aprofundar mais no conhecimento dos opcodes do RISC-I, ele não foi testado muito a fundo e pode apresentar inúmeros problemas, então não considerem este projeto como uma emulação fiel ao RISC-I proposto por David A. Patterson, uma vez que, além de não estar completo, ele ainda possui decisões tomadas por mim, que fazem com que ele seja fundamentalmente diferente do modelo RISC-I originalmente proposto.\n\n\n\n## Documentação simples\n\nA maior parte das instruções possuem as seguintes caracteristicas:\n\n- Possuem 6 bytes\n- Informam: opcode (1 byte), operando1 (2 bytes), operando2 (2 bytes), operando3 (1 byte)\n\n\n---\n\n**Como os operandos funcionam:**\n\nUm operando pode tanto resultar em um valor imediato, quanto em um valor armazenado em um registrador.\n\nTemos registradores de 0x00 ate 0x1F, acima disso é impossível recuperar um valor de um registrador.\n\nLogo, o primeiro byte informa qual registrador deve ser recuperado, caso este valor seja acima de 0x1F (a partir de 0x20), o emulador irá recuperar o valor imediato no segundo byte.\n\nPor exemplo:\n\n- 0x0100 -\u003e recupera o valor no registrador (0x01)\n- 0xFF05 -\u003e recupera o valor imediato 0x05, já que o valor do primeiro byte(0xFF) é maior que 0x1F\n\n**Exceção para terceiro operando**\n\nComo o terceiro operando possui apenas um byte, ele **sempre** irá representar um registrador\n\n---\n\n**Dicionario:**\n\nOp1: primeiro operando, informa os 2 bytes correspondentes ao primeiro operando\n\nOp2: segundo operando, informa os 2 bytes correspondentes ao segundo operando\n\nOp3: terceiro operando, informa o byte correspondente ao terceiro operando\n\n\u003cbr\u003e\n\na: Valor no op1 (pode tanto ser valor em registrador quanto valor direto)\n\nb: Valor no op2 (pode tanto ser valor em registrador quanto valor direto)\n\n---\n\nEstrutura de algumas instruções:\n\n - Add: (0x01):\n   - \n     - 0x01 - opcode\n     - 0x0000 - op1\n     - 0x0000 - op2\n     - 0x00 - op3 → em qual registrador sera salvo o resultado\n     -  registradores[op3] = a+b\n     - Exemplo:\n       - \n       - 0x01FF01FF0401\n         - 0x01: opcode de adicionar\n         - 0xff01 -\u003e pegar valor 1\n         - 0xff04 -\u003e pegar valor 4\n         - 0x01 -\u003e armazenar 1 + 4 no registrador 01\n       - 0x010001FF0502\n         - 0x01: opcode\n         - 0x0001 -\u003e pegar valor em registrador 01 (valor = 5)\n         - 0xFF05 -\u003e pegar valor 5\n         - 0x02 -\u003e armazenar valor de 5+5 no registrador 2\n\n- ADDC  (0x02):\n  - \n  - Funciona da mesma maneira que o ADD, mas irá incrementar um caso a flag de carry tenha sido ativada\n  \n---\n- Sub (0x03) \u0026 SUBC (0x04):\n  - \n  - Funciona da mesma maneira que a adição e addc, basta mudar o opcode\n\n---\n- AND (0x06):\n  - \n  - Irá realizar a operação AND entre os valores **a** e **b** e armazenar no **op3**\n  - registradores[op3] = a\u0026b\n\n---\n- OR (0x07):\n  - \n   - Irá realizar a operação OR entre os valores **a** e **b** e armazenar no **op3**\n   - registradores[op3] = a|b\n\n---\n- XOR (0x08):\n  - \n   - Irá realizar a operação XOR entre os valores **a** e **b** e armazenar no **op3**\n   - registradores[op3] = a^b\n\n   \n---\n- SLL (0x09), Shift Left Logical:\n  - \n  - Realiza um shift left com o valor de **a**, a quantidade de shifts é determinada por **b** e o resultado é armazenado em **op3**\n  - registradores[op3] = a \u003c\u003c b;\n  - \n---\n- SRL (0x0A), Shift Right Logical:\n  - \n  - Realiza um right shift logical no valor de **a**, a quantidade de shifts é determinada por **b** e o resultado é armazenado em **op3**\n  - registradores[op3] = a \u003e\u003e\u003e b;\n---\n- SRA (0x0B), Shift Right Arithmetic:\n  - \n   - Realiza um right shift arithmetic no valor de **a**, a quantidade de shifts é determinada por **b** e o resultado é armazenado em **op3**\n   - registradores[op3] = a \u003e\u003e b;\n---\n- LDL (0x0C), Load\n  - \n  - Carrega um dado da memória na posição a+b e salva o seu valor em op3\n  - registradores[op3] = memory[a+b]\n  - obs.: a memória é organizada em bytes e os registradores em bits, logo, esta operação não é tão simples quanto parece, na verdade pegamos os 4 bytes a partir de a+b e, a partir deles, calculamos o valor inteiro que deve ser armazenado\n---\n- STL (0x0B), Store:\n  - \n  - Pega os valores no registrador op3 e salva na localização de memoria a+b\n  - memory[a+b] = registradores[op3]\n  - obs.: Assim como o load, há uma diferença no tamanho dos tipos de dados, onde é necessário armazenar o valor do registrador em 4 endereços de memória\n---\n- JMP\n- JMPR\n- CALL\n- RET\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F710lucas%2Frisc-i-emu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F710lucas%2Frisc-i-emu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F710lucas%2Frisc-i-emu/lists"}