Форум программистов, компьютерный форум CyberForum.ru

Эмулятор CHIP-8 - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Написать перегруженные функции. http://www.cyberforum.ru/cpp-beginners/thread158328.html
Написать перегруженные функции и протестировать их в основной программе: А) перевода минут, часов и секунд в секунды; Б) перевода секунд в часы минуты секунды.
C++ Не устанавливается VC++6 Professional Edition Подскажите пожалуйста, при установке VC++6 Professional Edition выдаёт сообщение: Не найден файл D:\Mein Programen\VISUAL~1\VISUAL~1.EDI\acmboot.exe или один из его компонентов. Проверьте правильность пути и имени файла, а также наличие необходимых библиотек. Следующее сообщение:Couldn't find Acme setup У мени установлен Windows XP SP3. Пробовал несколько разных установочных пакетов.... http://www.cyberforum.ru/cpp-beginners/thread158303.html
Функция, формирующая массив C++
Ребят тпомогите написать программу, подскажите с чего начать... Вот задание - Функция, формирующая новый массив, упорядоченный по неубыванию, из двух массивов-параметров, уже упорядоченных по неубыванию. Заранее благодарен
C++ Условный оператор if
Добрый день! есть следующий код программы на C++: #include<cmath> #include<iostream> int main(){ l: double a; std::cout << "Enter an integer: \n" ; std::cin>> a; double b=1; double k = floor(sqrt(a)); int i = 0;
C++ Надо написать функцию которая выдаёт маршрут файла http://www.cyberforum.ru/cpp-beginners/thread158250.html
Помогите пожалуйста!!! Надо написать функцию которая выдаёт маршрут файла!
C++ Переменные в циклах я понимаю как работает переменная i первом цикле, но во втором не пойму. Переменная i объявлена, но не проинициализирована. Какое значение во втором цикле? char * left(const char * str, int n) { if(n<0) n=0; char * p = new char; int i; подробнее

Показать сообщение отдельно
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.08.2010, 13:38     Эмулятор CHIP-8
Цитата Сообщение от Евгений М. Посмотреть сообщение
Насчет интерфейса хотел бы предложите свою идею (См. вложение). Но не в точности как на рисунке (т.к. как реализовать без понятия), а близко. Надо бы еще реализовать брейкпоинты и все такое, что есть в обычном отладчике.
Ого, это очень круто. Правда я пока тоже без понятия как можно реализовать, но подумать надо.
Цитата Сообщение от Евгений М. Посмотреть сообщение
Кстати правильнее писать Debugger (с двумя g).
Опять эти глупые опечатки. Спасибо, поправил.

Добавлено через 45 минут
Ну вот уже и первый результат присутствия отладчика появился А ведь прошло совсем ничего.

Немного сейчас упаду в принцип работы самой приставки, чтобы объяснить баг. Для примера взял тот самый проблемный файл с логотипом приставки (Chip8 emulator Logo [Garstyciuks].c8).

Разрешение экрана у приставки 64х32.
Обработка опкода с маской DXYN отвечает за отрисовку спрайта в видеопамять. Координаты спрайта хранятся в регистрах V. Номера регистров берутся из опкода: VX - горизонтальная, VY соответственно вертикальная координата. В младших 4 битах передается высота спрайта. Ширина всегда 8 пикселов.

Соответственно, чтобы отрисовка происходила нормально значения в регистрах не должны превышать разрешение экрана. То есть 0x40 и 0x20. У нас же получалось так, что значения приходили намного большие.

Проблема, как оказалось, крылась в немного неверной обработки опкодов 1NNN (переход по адресу NNN) и 2NNN (вызов процедуры по адресу NNN).
Раньше переход на соответствующий адрес осуществлялся следующим образом:
C
1
PC = (opcode & 0xFFF);
Все просто. Накладываем соответствующую маску на опкод и приравниваем получившееся значение программному счетчику смещения.
Мы не смогли заподозрить очевидного. После каждой обработки опкода счетчик PC увеличивается на два значения и полученный адрес просто напросто пропускался.
В программе "логотипа" по этому адресу как раз находилась операция обнуления регистров VX.
То есть на языке Си этот участок программы можно было бы записать следующим образом:
C
1
2
3
4
5
6
7
8
9
10
11
12
void NullRegisters()
{
   VX = 0;
}
 
void foo()
{
    if(VX >= 0x40) // VX - координата отрисовки спрайта по горизонтали, 0x40 - ширина экрана
        NullRegisters();
    else
        VX += 8;
}
У нас получалось что функция NullRegisters всегда пропускалась

Проблема решилась очень просто. Во всяком случае ассерты контролирующие вылет за пределы видеопамяти у меня больше не вылетают на этой программке.
C
1
PC = (opc & 0xFFF) - 2;
Извините, если много и непонятно написал. Я просто очень рад и хочется поделиться

Очень оригинальное завершение у этой программы
Автор просто сделал вечный цикл. Опкод "прыжка" на адрес переходит на самого же себя.
 
Текущее время: 21:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru