воскресенье, 8 августа 2010 г.

Ассемблер виртуальной машины CHIP-8

Программа может исполняться в адресном пространстве размером 4 кБайт 0x000 - 0xFFF. Адрес старта программы 0x200, в младших адресах содержится системный шрифт (0x000-0x050) и оригинальный интерпрететор (0x051-0x199).

Процессор виртуальной машины CHIP-8 содержит 16 8-битных регистров , имеющих имена от V0 до VF. Регистры V0-9,VA-VE являются регистрами общего назначения (РОН). Регистр VF используется в качестве регистра флагов.

CHIP-8 содержит так же два специальных 16-битных регистра: PC и I. Первый является указателем команд и программно недоступен, второй - индексный и доступен для изменения.

Всего имеется 35 различных команд. Все инструкции имеют фиксированный размер 16 бит (2 байта). Ниже опишем все инструкции виртуальной машины CHIP-8.



Код операции Ассемблерная мнемоника Описание
00CXscdown x Переместить экран на х линий вниз. Только в модели Super. Не реализовано
00E0 cls Очистить экран
00EE rts Возврат из процедуры
00FB scright Скроллировать экран на 4 пиксела вправо. Только в модели Super. Не реализовано
00FC scleft Скроллировать экран на 4 пиксела влево. Только в модели Super. Не реализовано
00FE low Выключить расширенный режим отображения. Только в модели Super. 
00FF high Включить расширенный графический режим (128х64х1bpp). Только в модели Super.
1NNN jmp NNN Безусловный переход по адресу NNN
2NNN jsr NNN Вызов процедуры по адресу NNN
3XNN skeq VX,NN Пропустить следующую инструкцию если содержимое регистра X равно константе NN
4XNN skne VX,NN Пропустить следующую инструкцию, если значение в ргистре VX не равно константе NN
5XY0 skeq VX,VY Проппустить следующую инструкцию, если значения в регистрах VX и VY равны
6XNN mov VX,NN Поместить константу NN в регистр VX
7XNN add VX,NN Сложить константу NN со значением в регистре VX и поместить результат в VX. Флаг переноса НЕ выставляется
8XY0 mov VX,VY Скопировать значение из регистра VY в регистр VX
8XY1 or VX,VY Выполнить побитовое ИЛИ (or)  регистров VX и VY и поместить результат в VX
8XY2 and VX,VY Выполнить побитовое И (and)  регистров VX и VY и поместить результат в VX
8XY3 xor VX,VY Выполнить побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ (xor)  регистров VX и VY и поместить результат в VX
8XY4 add VX,VY Сложить содержимое регистров VX и VY, результат помстить в VX. При переполнении VF устанавливается в 1
8XY5 sub VX,VY Вычесть знечение в регистре VY из значения в регистре VX, поместить результат в VX. VF = 1 если был заем. 
8XY6 shr VX Побитовый сдвиг регистра VX на 1 бит вправо.  Значение младшего (нулевого) вытолкнутого бита помещается в VF. Регистр VY игнорируется (лучше поместить туда 0).
8XY7 rsb VX,VY Вычитание VX = VY - VX

VF = 1 при возникновени заема.
8XYE shl VX Битовый сдвиг регистра VX на 1 бит влево с переносом. Значение вытолкнутого бита помещается в регистр VF.
9XY0 skne VX,VY Пропустить следующую инсрукцию если значения регистров VX и VY не равны.
ANNN mvi NNN Поместить в индексный регистр константу NNN
BNNN jmi NNN Безусловный переход по адресу NNN+[V0]
CXNN rand VX,NN    Поместить в VX очередное значение генератора псевдослучайных чисел, не превосходящее NN
DXYS sprite VX,VY,s Draw sprite at screen location rx,ry height s

Sprites stored in memory at location in index register, maximum 8 bits wide. Wraps around the screen. If when drawn, clears a pixel, vf is set to 1 otherwise it is zero. All drawing is xor drawing (e.g. it toggles the screen pixels 
DXY0 xsprite VX,VY Draws extended sprite at screen location rx,ry

As above,but sprite is always 16 x 16. Superchip only, not yet implemented 
EK9E skpr K skip if key (register rk) pressed

The key is a key number, see the chip-8 documentation
EKA1 skup K skip if key (register rk) not pressed
FX07 gdelay VX Скопировать регистр delay timerв VX
FX0A key VX wait for for keypress,put key in register vr
FX15 sdelay VX Скопировать значение VX в регистр delay timer
FX18 ssound VX Скопировать значение VX в регистр sound timer
FX1E adi VX Сложить содержимое регистра VX и индексного регистра. Результата поместить в индексный регистр
FX29 font VX point I to the sprite for hexadecimal character in vr

Sprite is 5 bytes high
FX30 xfont VX point I to the sprite for hexadecimal character in vr


Sprite is 10 bytes high,Super only
FX33 bcd VX Записать двоично-десятичное представление регистра VX по адресам I,I+1,I+2
Значение индексного регистра I не изменяется.
FX55 str V0_VX Сохранить в памяти, начинающейся с адреса [I],  содержимое регистров V0-VX

Индексный регистр устанавливается на позицию за последним сохраненным элементом, т.е.  I = I + X + 1 
FX65 ldr V0-VX Загрузить из памяти, начинающейся с адреса [I],  содержимое регистров V0-VX.
Индексный регистр устанавливается на позицию за последним сохраненным элементом, т.е.  I = I + X + 1

Ссылки:

Комментариев нет:

Отправить комментарий