Create site free
Эмулятор приставки CHIP8 - Песочница - Разработка игр на Game Maker (Simple Mode) - Форум Game Maker. Разработка игр.
Здравствуй Гость | Перейти на сайт

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 3123»
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Песочница » Эмулятор приставки CHIP8 (сегодня на хабре тему увидил, решил попробовать)
Эмулятор приставки CHIP8
WertyXBOCT Дата: Среда, 04.08.2010, 19:34 | Сообщение # 1
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Собственно тема:
http://habrahabr.ru/blogs/development/100907/
Вот думаю, попробовать написать подобное. Здесь буду освещать свою разработку.

Проект буду делать в GM8, для чтения файла, и, возможно некоторых вещей, буду использовать 39DLL.

В приложении пустой проект, и гекс 39dll. Собственно начинаю работу...
С прочтения статьи на хабре, и просмотра 35 команд на википедии. Нужно их еще перевести.
Как всегда, статью дочитаю походу дела), перевел все команды, выкладываю doc файл. Можете меня поправить, если я где-то накосячил с переводом.

Прикрепления: Emulator.rar(187Kb) · 8907055.doc(87Kb)


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru


Сообщение отредактировал WertyXBOCT - Среда, 04.08.2010, 20:27
 
3bl3gamer Дата: Среда, 04.08.2010, 20:05 | Сообщение # 2
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
ага, а потом устроим конкурс на лучшую игру под этот эмулятор! biggrin
Quote (WertyXBOCT)
для чтения файла <...> буду использовать 39DLL.

эээ... а чем ГМовское чтение не угодило?
 
SRes Дата: Среда, 04.08.2010, 20:11 | Сообщение # 3
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
А-нука, ща почитаем-с ! Спасибо за интересный материал.
Quote
эээ... а чем ГМовское чтение не угодило?

Очевидно, ГМ не умеет читать больше 1го байта. (а извращаться чтобы сделать из 4ех разных байт одно число.. Да и вообще с 39длл чтение удобнее)
Впрочем могу что-то путать... Давно не юзал ГМ для чтения файлов, но тоже помню что с 39длл удобнее.


Velociped Inc.
 
3bl3gamer Дата: Среда, 04.08.2010, 20:19 | Сообщение # 4
Хоть палкой гони
Группа: Проверенные
Сообщений: 650
Статус: Offline
так. чуствую себя нубом. но! как прицепить этот экстеншн? скопировал всё содержимое папки "extensions"(что из рархива) в экстеншены ГМа, но при открытии проекта ГМ ругается, что 39длл не нашёл.
 
SRes Дата: Среда, 04.08.2010, 20:23 | Сообщение # 5
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
Добавляешь 39длл скрипты в проект, копируешь 39длл в папку с проектом и все. No rocket science, как говорится.


Velociped Inc.
 
WertyXBOCT Дата: Среда, 04.08.2010, 20:28 | Сообщение # 6
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Не, экстеншен устанавливать надо, через меню экстеншенов)
Resource -> Select Extension Packages -> Install, выбираешь ged или gex, я точно не помню. Потом перезагружаешь гм, открываешь мой проект. Но там пока кода только выбрать файл).

Добавлено (04.08.2010, 20:28)
---------------------------------------------
Гмовское чтение, не позволяет читать больше одного байта, плюс мне 39dll овское очень нравится, то что там есть буфера, все такое. Еще у 39dll неоспоримый плюс, в том что есть работа с битами, у гм такого нет.



Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
WertyXBOCT Дата: Среда, 04.08.2010, 20:42 | Сообщение # 7
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Так, из инструментов, нам еще понадобится просмотровальщик файлов в hex, это нам для компилирования вручную файла.
http://freemariupol.narod.ru/programs/Haker/HexEditor.htm
тут вот есть, берите любой), только не испортите себе диски, каким нибудь из них)
Я взял этот, потому что он скачался. http://www.dreamsyssoft.com/hextreme-hex-editor/

Кстати, компилятор, эмулятор и игры, можно взять с сайта http://www.pong-story.com/chip8/, собственно есть в статье.

Сейчас, буду вручную компилировать файл MAZE, т.к. он самый маленький.

Прикрепления: MAZE.noext(0Kb)


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
WertyXBOCT Дата: Среда, 04.08.2010, 22:46 | Сообщение # 8
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
А вот и то как я работал, и то что получилось в конце.
Справа MAZE в HEX, слева блокнот, в котором я пытался подставить команды и попробовал представить результат работы.
Снизу слева калькулятор, в режими программист, считал из одной системы в другую, а слева справка по командам.
Вот текст из блокнота на всякий случай.
Code

-> 60 00 [09] Sets VX to NN. V0 = 00
-> 61 00 [09] V1 = 00
-> A2 22 [21] Sets I to the address NNN. I = 222 // = 542
-> C2 01 [23] Sets VX to a random number and NN. V2 = rnd()*01
-> 32 01 [06] Skips next if VX equals NN. if V2 == 01 goto next+1
-> A2 1E [21] I = 21E // = 542
-> D0 14 [24] Draws a sprite... draw(0,1,4)
-> 70 04 [10] Adds NN to VX. V0+=04
-> 30 40 [06] if V0 != 40 // = 64
-> 12 04 [04] Jumps to address NNN. goto(204) // = 516
-> 60 00 [09] Sets VX to NN. V0 = 00
-> 71 04 [10] V1+=04
-> 31 20 [06] if V1 == 20 // = 32
-> 12 04 [04] goto(204) // 516
-> 12 1C [04] goto(21C) // 540
-> 80 40 [11] Sets VX to the value of VY. V0 = V4
-> 20 10 [11] V0 = V1
-> 20 40 [11] V0 = V4
-> 80 10 [11] V0 = V1

Добавлено (04.08.2010, 21:33)
---------------------------------------------

Code
01 V0 = 0
02 V1 = 0
03 I  = 0x222 (напоминаю, память начинается с 0x200)
04 V2 = rnd()*01 (предполагаю что именно так происходит)
05 if V2 == 01 jumpCode(07)
06 I  = 0x21E
07 draw(V0,V1,4) (тут собственно вывод на экран в позиции V0 V1 8*4 пикселей из памяти начиная с адреса I)
08 V0 = V0 + 04
09 if V0 != 40 jumpCode(11) // = 64  
10 goto(204) // = 516
11 V0 = 00
12 V1+=04
13 if V1 == 20 jumpCode(15) // = 32  
14 goto(204) // 516
15 goto(21C) // 540
16 V0 = V4
17 V0 = V1
18 V0 = V4
19 V0 = V1

Получившийся почтикод. Можете считать что я просто удалил символы от -> до собственно кода, но на самом деле я думал как работает эта программа.

Добавлено (04.08.2010, 21:40)
---------------------------------------------
Теперь беремся за написание эмулятора. Можете считать, это все особой формой мазохизма)

Добавлено (04.08.2010, 21:42)
---------------------------------------------
И тут выясняется, что в пустом проекте подключен не тот экстеншен)

Добавлено (04.08.2010, 22:12)
---------------------------------------------
Значит, смотрим код на хабре,

Code
    Display : Array [0..64*32] of Byte; //video memory
       Memory : Array [0..4096] of Byte; //RAM memory
...

Я тут подумал, и решил, попробовать сделать эти переменные буферами. А значит нужна функция для чтения произвольного места из буфера, создания буфера состоящего из н-ного количества байт, и т.д. Еще 80 байт шрифт занимает, но мы его использовать не будем... пока.
короче погряз я в изучении исходников у того парня. Странно, но нигде нет информации о том, где собственно программа храниться, и каким образом ее вычитывать из файла.

Добавлено (04.08.2010, 22:46)
---------------------------------------------
В общем, я и Sres, довольно долго уже спорим, как обстоит хранение рома в программе, в итоге, к консенсусу не пришли, и я буду хранить ее после 200$. Нда, такие дела. А еще вон еще сколько всего предстоит написать)

Прикрепления: 1951883.jpg(472Kb)


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
SRes Дата: Среда, 04.08.2010, 23:05 | Сообщение # 9
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
Подтверждаю, ведем плодотворную дискуссию, только я пытаюсь писать на МАСМ, а Хвост на ГМе (сочувствую, учитывая никакущую работу с памятью в оном).


Velociped Inc.
 
NewStrannik Дата: Четверг, 05.08.2010, 00:31 | Сообщение # 10
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
Ух ты! Интересненько. Изучаю документации.

Насчёт памяти: вначале маленький шрифт, потом интерпретатор (так на оригинальных приставках), а после $200 идёт уже эмулируемая нами игрушка.

Добавлено (05.08.2010, 00:31)
---------------------------------------------
> Хвост на ГМе (сочувствую, учитывая никакущую работу с памятью в оном).
Массивы и/или какие-нибудь дата_структуры будут эмулировать память (16 регистров + индекс, стэк, память RAM, два таймера), ничего страшного в этом нет. Разве что затраты большие...

 
SRes Дата: Четверг, 05.08.2010, 00:57 | Сообщение # 11
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
Да нет, все можно эмулировать, но не так удобно.
Я продвинулся пока-что совсем не далеко... Объявил основные переменные и пишу основной цикл отрисовки. А сейчас спать...
Завтра уезжаю на море, так что работу над эмулятором не факт, что буду вести (но постараюсь, очень уж интересная затея).


Velociped Inc.
 
DreamRunner Дата: Четверг, 05.08.2010, 08:19 | Сообщение # 12
Админ
Группа: Админы
Сообщений: 1382
Статус: Offline
Конечно возможности так себе smile но можно сваять тетрис или змейку с адскими пиликающими звуками smile
 
WertyXBOCT Дата: Четверг, 05.08.2010, 12:11 | Сообщение # 13
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Вот пока что есть. Ничего не компилирует, но вроде все инструменты для этого написал. Нужно обработать все команды, пока только 6.425 команда обрабатывается. Для компилирования MAZE необходима команда 2NNN, вызов процедуры, пока не знаю как ее написать.
Прикрепления: chip8.gmk(13Kb)


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
NewStrannik Дата: Четверг, 05.08.2010, 13:57 | Сообщение # 14
Всех уже задолбал
Группа: Проверенные
Сообщений: 808
Статус: Offline
> команда 2NNN
Добавляешь в стэк текущий регистр I (он же указатель на память текущего выполняемого кода, или нет?), потом по окончании процедуры (команда 00EE) берём адрес из стэка и возвращаемся... Т.е. от адреса NNN до команды 00EE - процедура.


Сообщение отредактировал NewStrannik - Четверг, 05.08.2010, 13:59
 
WertyXBOCT Дата: Четверг, 05.08.2010, 15:31 | Сообщение # 15
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Хым, несложно. Вечерком допишу.


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
Stasundr Дата: Пятница, 06.08.2010, 00:09 | Сообщение # 16
Всех уже задолбал
Группа: Высший Советник
Сообщений: 1058
Статус: Offline
Раз такая пьянка, попробую на C++ сделать smile


.blanco
 
WertyXBOCT Дата: Суббота, 07.08.2010, 00:00 | Сообщение # 17
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Посмотрел исходник MAZE. Все не так просто, как думалось. Но и не так сложно как могло быть).


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
WertyXBOCT Дата: Суббота, 07.08.2010, 10:39 | Сообщение # 18
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
По поводу ошибок:
Строки 16,17 и 18,19 - функции, вносят в память битовую маску. Ведь фиг догадаешься о такой подлянке)
Code

RIGHT:              ; 4*4 bitmap of the left line
     DB $1.......
     DB $.1......
     DB $..1.....
     DB $...1....

Строки 10,14,15 - содержащие код goto(...)оказались JUMPом на метку. В принципе, тут я угадал, но, куда прыгают на самом деле нет.
Code
14 goto(204) // 516  
15 goto(21C) // 540

Как я вычисляю адрес, (516-512)/2 = 2, смотрим вторую строку, а там V1=0; 15-ая строка (540-512)/2 = 14. А глядя в исходник, становится видно, что jump совершается на третью и пятнадцатую строку. goto(204) прыжок на строку рандома, а goto(21C) бесконечный цикл, дабы вывести на экран лабиринт.

Поправил еще пару мелких ошибок в коде, и вроде как получилось откомпилировать. Но ошибки остались, и ошибки логические.

Добавлено (07.08.2010, 10:36)
---------------------------------------------
И тут выясняется, что (540-512)/2 = 14 правильный адрес. Потому-что следующим шагом, мы инкриментируем позицию, и выполняем код на следующей строке.

Добавлено (07.08.2010, 10:39)
---------------------------------------------
Правда у меня нифига не так сделано, но работает только когда я так адрес указываю. Хым. Еще добавил математические функции. И нужно разобраться, почему отрисовка происходит фиг его знает как.

Прикрепления: chip8_2.gmk(13Kb)


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
WertyXBOCT Дата: Суббота, 07.08.2010, 11:24 | Сообщение # 19
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Теперь MAZE выполняет на раз, без ошибок). Можно пробовать что нибудь другое выполнить.
Прикрепления: chip8_22.gmk(13Kb)


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
SRes Дата: Среда, 11.08.2010, 14:21 | Сообщение # 20
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
Пишу из Симферополя...
Компилятор по чуть-чуть пилю, не соврал. На данный момент готова загрузка игры в память, отображение видеопамяти, и работа с некоторыми командами :

  • 00E0 Clears the screen
  • 6XNN Sets VX to NN
  • ANNN Sets I to the address NNN
  • 3XNN Skips the next instruction if VX equals NN
  • 4XNN Skips the next instruction if VX doesn't equal NN
  • 5XY0 Skips the next instruction if VX equals VY
  • CXNN Sets VX to a random number and NN
  • DXYN Draws a sprite at coordinate (VX, VY) that has a width of 8 pixels and a height of N pixels. Each row of 8 pixels is read as bit-coded starting from memory location I; I value doesn't change after the execution of this instruction. As described above, VF is set to 1 if any screen pixels are flipped from set to unset when the sprite is drawn, and to 0 if that doesn't happen.

Пишу, как обещал, на чистом асме (ассемблер - MASM), весь код свой, кроме генератора псевдослучайных чисел.

Добавлено (11.08.2010, 14:21)
---------------------------------------------
Реализовал все что требуется для работы MAZE, но появилась куча багов (скрывавшихся по мере тестирования команд по одной), надеюсь вытяну.



Velociped Inc.
 
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Песочница » Эмулятор приставки CHIP8 (сегодня на хабре тему увидил, решил попробовать)
Страница 1 из 3123»
Поиск:



Сообщество Gmaker.SU 2005-2012
Используются технологии uCoz
Простой вход