Форум программистов, компьютерный форум 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; подробнее

Показать сообщение отдельно
Tronix
 Аватар для Tronix
157 / 104 / 5
Регистрация: 22.08.2010
Сообщений: 215
23.08.2010, 10:11     Эмулятор CHIP-8
Цитата Сообщение от fasked Посмотреть сообщение
Если я правильно понимаю, то например по прихождунию опкода F365 регистры V0, V1, V2, V3 должны заполниться значениями из памяти по смещению I. А это значит, что ваше замечание было верным
Правильно понимаете.
Еще вопрос по поводу вашего теста. Код ошибки 6. В описании написано:
ERROR 6
After substraction 1-1 register VF must be 1, but he still 0.
То есть при операции 1 - 1 флаг переноса должен быть равен 1. Почему? Откуда возникнет флаг "отрицательности"?

Добавлено через 29 минут
Кажется я очень сглупил
Вопрос отпал.
Да с этим я сам сначала тупил. Вот такая путаница - в случае сложение если происходит переполнение флаг VF устанавливается в 1, а вот при переполнение в результате отрицания флаг VF наоборот устанавливается в ноль. Если переполнения не произошло при отрицании - то VF = 1.
Но появился следующий:
Ошибка под номером 11. Куда же должен записываться результат, если не в регистр V0. После операции вычитания.
Дык все правильно, в V0 и записывается результат. Попробую прокомментировать:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ld v1, 1    ;в V1 заносим единицу
 
...
 
ld v0,1     ;в V0 тоже единица
ld ve,10       ;в VE - код ошибки 10, на случай если прыгнем по джампу на печать ошибки (процедура error)
ld vf,0        ;На всякий случай установим VF заведомо неправильный, на случай если эмулятор вообще
              ;не обрабатывает VF после отрицания.
subn v0,v1  ;вычитаем из v1 регистр v0. Тоесть из 1 вычитаем 1. Переполнения не произошло, поэтому
              ;как выше уже говорилось регистр VF должен принять значение 1. Результат должен по-
              ;меститься в V0 и должен быть равным нулю (1-1=0).
se vf,1     ;пропустить следующую инструкцию, если VF=1
jp error     ; Если VF не установился в 1, уходим на ERROR 10
ld ve,11       ;Установим код ошибки равный 11
se v0,0    ; Пропустить следующую инструкцию, если V0 равно нулю
jp error    ; V0 не равно нулю, поэтому печатаем ERROR 11
Таким образом, если появляется ошибка ERROR 11, то после выполнения операции вычитания из единицы единицу (1-1), результат в V0 получился не равным 0 (нулю).

Позволю напомнить, что в CHIP8 у нас есть две операции вычитания:
Assembler
1
SUB   VX, VY  ; код 8XY5
и
Assembler
1
SUBN   VX, VY ; код 8XY7
Первая вычитает из VX регистр VY и результат записывает в VX. (VX = VX - VY).
Вторая вычитает из VY регистр VX и результат записывает в VX. (VX = VY - VX).

В 11 тесте мы имеем дело со второй операцией вычитания. Возможно в этом проблема (тоесть вы в коде смотрите просто не на тот опкод).

Добавлено через 16 минут
То есть в этом коде:
C
1
2
3
4
5
6
7
8
9
else if((opc & 0xF) == 7)
    {
        if(REG_VY(opc) >= REG_VX(opc))
            REG_VF = 1;
        else
            REG_VF = 0;
 
        REG_VY(opc) -= REG_VX(opc);
    }
Я бы что-нибуть сделал со строчкой REG_VY(opc) -= REG_VX(opc); Должно быть как-то так по идее:
C
1
REG_VX(opc) = REG_VY(opc) - REG_VX(opc);
но в сях я "ноль", поэтому не пинайте сильно если не правильно написал. Главное смысл передал.
 
Текущее время: 06:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru