
The post has been translated automatically. Original language: Russian Kazakh
Recently, I found a treasure from my friend - the Game Boy Advance. But then I saw him playing Pokemon Red on his computer because he didn't have any cartridges. From that moment on, I was wondering how difficult it is to make YOUR OWN emulator.
CHIP-8 is a programming language and has only 35 instructions, they are also called opcodes. To emulate this language, we need to create an interpreter for CHIP-8 that can execute all 35 instructions. You can view the list of functions on the website https://johnearnest .github.io/Octo/docs/chip8ref.pdf
The CHIP-8 system has 16 registers, each occupying 8 bits (1 byte). A program counter, a 16-bit index register, an opcode placeholder, and a stack pointer, each with a size of 16 bits. The memory is 4 Kilobytes, where the interpreter occupies the first 512 bytes, and all programs written on CHIP-8 start at location 512. A minimum of a 16-level stack pointer is required, which is used to store return locations from the program counter register.
The CHIP-8 has two timers that count down from 60 to 0. The delay timer is used for events in the program and its value can be specified and read. The sound timer makes a sound when it reaches zero. After each operation execution, both timers decrease by 1.
The CHIP-8 has 16 buttons (0x0-0xF) that usually translate to the keyboard in this way:
1 2 3 C 1 2 3 4
4 5 6 D --\ Q W E R
7 8 9 E --/ A S D F
A 0 B F Z X C V
Usually, buttons 2, 4, 6 and 8 are used for directions.
You can find my incomplete Python implementation at the GitHub link along with the ROM files. I recommend using faster programming languages like Rust or C/C++, because compiled binaries are highly optimized, which leads to increased performance, which is extremely important for real-time emulation.
Жақында мен досымнан Қазына таптым - Game Boy Advance. Бірақ содан кейін мен оның Pokemon ойындарын компьютерімде көрдім, өйткені оның картридждері жоқ. Осы сәттен бастап мен эмуляторды жасау қаншалықты қиын деп ойладым.
CHIP-8-бағдарламалау тілі және ода тек 35 Нұсқаулық бар, оларды операциялық кодтар деп те атайды. Берілген тілге еліктеу үшін біз барлық 35 нұсқаулықты орындай алатын CHIP-8 аудармашысын жасауымыз керек. Мүмкіндіктер тізімін веб-сайттан көре аласыз https://johnearnest.github.io/Octo/docs/chip8ref.pdf
CHIP-8 жүйесінде әрқайсысы 8 бит (1 байт) алатын 16 регистр бар. Бағдарлама есептегіші, 16 биттік индекс регистрі, жұмыс кодын толтырғыш және стек көрсеткіші, әрқайсысының өлшемі 16 бит. Жад бұл 4 Килобайт мұнда алғашқы 512 байтты аудармашы алады, ал CHIP-8 - де жазылған барлық бағдарламалар 512 орыннан басталады. Бағдарлама есептегіш регистрінен қайтару орындарын сақтау үшін пайдаланылатын кем дегенде 16 деңгейлі стек көрсеткіші қажет.
CHIP-8 - де екі таймер бар олар 60-тан 0-ге дейін есептеледі. Кешіктіру таймері бағдарламадағы оқиғалар үшін пайдаланылады және оның мәнін көрсетуге және оқуға болады. Дыбыс таймері нөлге жеткенде дыбыс шығарады. Әр операциядан кейін екі таймер де 1-ге азаяды.
CHIP-8-де 16 батырма бар (0x0-0xF) олар әдетте пернетақтаға осылай аударылады:
1 2 3 C 1 2 3 4
4 5 6 D --\ Q W E R
7 8 9 E --/ A S D F
A 0 B F Z X C V
Әдетте, бағыттар үшін 2, 4, 6 және 8 түймелері қолданылады.
Сіз менің толық емес имплементациямды Python тілінде GitHub сілтемесінен ROM файлдарымен бірге таба аласыз. Мен жылдамырақ бағдарламалау тілдерін Rust немесе C/C++ ретінде пайдалануды ұсынамын, себебі құрастырылған бинарлық файлдар жоғары оңтайландырылған, нәтижесінде өнімділік жақсарады, бұл нақты уақыттағы эмуляция үшін өте маңызды.