Важная информация
Показано с 1 по 4 из 4

Тема: Интерпретатор CHIP-8 на степлере.

  1. #1 Интерпретатор CHIP-8 на степлере. 
    Супер модератор Аватар для Kakos_nonos
    Регистрация
    07.01.2011
    Адрес
    Кубань
    Сообщений
    1,531
    Сказал(а) спасибо
    126
    Поблагодарили 428 раз(а) в 291 сообщениях
    Записей в блоге
    6
    Вот, написал интерпретатор CHIP-8 на степлере.
    CHIP-8 - это виртуальная машина 70-х годов для игр типа тетриса.
    Правда, работает примерно половина игр. Наверно, они используют недокументированные возможности.
    Самое главное - идёт моя любимая игра - тетрис.
    В архиве интерпретатор и несколько игр и демок на Chip-8.
    На интерпретаторе ТОТОР она работает, а на LINT - как-то очень медленно.
    Это странно, ведь обычно программы идут быстрее, чем на ТОТОРе.
    Вложения
    • Тип файла: rar chip8.rar (8.0 Кб, Просмотров: 7)
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  2. Пользователь сказал cпасибо:

    Абадябер (24.01.2012)

  3. #2  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Kakos_nonos, это попросту великолепно! Вот, мы с вами можем теперь наблюдать, как СТЕПЛЕР становится достаточно серьезным языком программирования - посмотрите, какие проекты стали на нем выходить! Да, может не таким, как Pascal и C, однако со своей изюминкой, и достаточно большим списком типовых задач, для решения которых он вполне подходит. Это радует.

    По поводу тормозов в LInt: Тут вообще вопрос интересный. Как понимаю, сама задержка реализуется циклом с вычитанием единицы, так? Ну, хотя бы только вот почему:
    Код :
    $(5)(speed)
    {tikalka}
    $(5)(5$^1-)
    #(5$|)<tikalka>
    Мне интересно, какое число для задержки вы выбирали в тетрисе? Если выбрать единицу, то у меня начинаются жуткие лаги, в TOTOP все хорошо. Если двойку - то LInt начинает носиться как сумасшедший. Я ради интереса ввел 30000 - скорость огромная, словно вообще без задержки. Ввел 15000 - опять тормозит. Вероятно, или где-то ошибка в LInt, или, возможно, какие-то недоразумения. Например, мне точно известно, что код процедуры задержки исполняется LInt верно - программа будет зациклена, пока переменная 5 не станет равна нулю. Возможно, переменная speed (4) попросту модифицируется где-либо, например, если где-то остались лишние значения на стеке, во время присвоения, например, третьей переменной какого-либо значения.
    Также, такой вопрос:
    Насколько часто организуется задержка? Перед исполнением каждой новой отдельной команды, или же программы сами вызывают эту процедуру?

    Интересно, что в компилированной COM версии эмулятора все работает вообще шустро, причем, судя по всему, ему на величину задержки вообще плевать =). Вообщем, буду разбираться, что за дела такие.

    И, еще раз, большое спасибо вам за программу. На степлере был написан эмулятор и компилятор. Это... звучит круто =)
    Последний раз редактировалось Абадябер; 24.01.2012 в 03:07.
    Дружба-магия-радость!
    Ответить с цитированием  
     

  4. #3  
    Супер модератор Аватар для Kakos_nonos
    Регистрация
    07.01.2011
    Адрес
    Кубань
    Сообщений
    1,531
    Сказал(а) спасибо
    126
    Поблагодарили 428 раз(а) в 291 сообщениях
    Записей в блоге
    6
    Тут что интересно, это то, что тормозит не из-за процедуры задержки.
    Когда программа запускается, вызывается процеду clearscreen, которая очищает экран, заполняя его синим фоном.
    Так вот, я как-то увидел, как эта процедура МЕДЛЕННО, в течении нескольких секунд заполняет синим экран сверху вниз, хотя должна это делать мгновенно.
    Код этой процедуры вот:
    Код СТЕПЛЕР:
    ={clearscreen}=
    ?[4,6]
    $(6)(~H1F00)
    $(4)(0)
    {onec}
    M(~HB800,4$^63.^2*^4$^1984.^64/^160*+,S,12,2)
    $(4)(4$^1+)
    #(4$^2048-|)<onec>
    $(pc)(pc$^2+)
    **
    Как видите, обращений к паузе тут нет, поэтому, причина, скорее всего не в ней.

    Задержка происходит в после одной-двух инструкций. Это происходит так: Вот код процедуры дешифрации (оййй!):
    Код СТЕПЛЕР:
    ={deshif}=
    *(cur$|^cur^1+$^~HE0-|*|)<clearscreen>
    *(cur$|^cur^1+$^~HEE-|*|)<return>
    *(cur$^16/^1-)[cur$^15.^256*^cur^1+$+]<jump>
    *(cur$^16/^2-)[cur$^15.^256*^cur^1+$+]<call>
    *(cur$^16/^3-)[cur^1+$,cur$^15.]<skipifeq>
    *(cur$^16/^4-)[cur^1+$,cur$^15.]<skipifneq>
    *(cur$^16/^5-)[cur^1+$^16/,cur$^15.]<skipifeqrr>
    *(cur$^16/^6-)[cur^1+$,cur$^15.]<setregconst>
    *(cur$^16/^7-)[cur^1+$,cur$^15.]<addregconst>
    *(cur$^16/^8-|^cur^1+$^15.|*|)[cur^1+$^16/,cur$^15.]<setreg>
    *(cur$^16/^8-|^cur^1+$^15.^1-|*|)[cur^1+$^16/,cur$^15.]<orreg>
    *(cur$^16/^8-|^cur^1+$^15.^2-|*|)[cur^1+$^16/,cur$^15.]<andreg>
    *(cur$^16/^8-|^cur^1+$^15.^3-|*|)[cur^1+$^16/,cur$^15.]<xorreg>
    *(cur$^16/^8-|^cur^1+$^15.^4-|*|)[cur^1+$^16/,cur$^15.]<addreg>
    *(cur$^16/^8-|^cur^1+$^15.^5-|*|)[cur^1+$^16/,cur$^15.]<subreg>
    *(cur$^16/^8-|^cur^1+$^15.^6-|*|)[cur$^15.]<rshift>
    *(cur$^16/^8-|^cur^1+$^15.^7-|*|)[cur^1+$^16/,cur$^15.]<subregyx>
    *(cur$^16/^8-|^cur^1+$^15.^14-|*|)[cur$^15.]<lshift>
    *(cur$^16/^9-)[cur^1+$^16/,cur$^15.]<skipifneqrr>
    *(cur$^16/^10-)[cur$^15.^256*^cur^1+$+]<seti>
    *(cur$^16/^11-)[cur$^15.^256*^cur^1+$+]<jumpplus0>
    *(cur$^16/^12-)[cur^1+$,cur$^15.]<random>
    *(cur$^16/^13-)[cur$^15.,cur^1+$^16/,cur^1+$^15.]<drawsprite>
    *(cur$^16/^14-|^cur^1+$^~H9E-|*|)[cur$^15.]<skipifpress>
    *(cur$^16/^14-|^cur^1+$^~HA1-|*|)[cur$^15.]<skipifnpress>
    *(cur$^16/^15-|^cur^1+$^7-|*|)[cur$^15.]<readdt>
    *(cur$^16/^15-|^cur^1+$^~HA-|*|)[cur$^15.]<waitkey>
    *(cur$^16/^15-|^cur^1+$^~H15-|*|)[cur$^15.]<setdelay>
    *(cur$^16/^15-|^cur^1+$^~H18-|*|)[cur$^15.]<setsound>
    *(cur$^16/^15-|^cur^1+$^~H1E-|*|)[cur$^15.]<addi>
    *(cur$^16/^15-|^cur^1+$^~H29-|*|)[cur$^15.]<gotonum>
    *(cur$^16/^15-|^cur^1+$^~H33-|*|)[cur$^15.]<bdc>
    *(cur$^16/^15-|^cur^1+$^~H55-|*|)[cur$^15.]<stores>
    *(cur$^16/^15-|^cur^1+$^~H65-|*|)[cur$^15.]<fill>
    **
    Допустим, у нас текущий опкод подходит под команду jump (1NNN) (третья строчка)
    Она выполняется.
    Далее, процесс сравнения команды с опкодами продолжается, и если попалась какая-то команда (Например, сдвиг (rshift)), то она тоже выполняется, и паузы между этими двумя операциями не будет.
    Пауза произойдёт только после завершения процкедуры дешифрации.

    Например, вот код:

    6578 Устанавливаем V6 в 78h
    8561 Устанавливаем V5 в V5 or V6
    A18F Устанавливаем I в 184h

    Во время его выполнения пауза не произоёдёт ни разу, поскольку все они выполнятся за один проход.

    А во время выполнения этого кода пауза произойдёт три раза:

    С17F
    91A0
    D564
    00E0

    Для тетриса я делаю задержку 300-700

    Жалко только, что не все программы работают. Возможно, в коде где-то ошибка, возмлжно ещё что-то.
    Есть, однако, одно серъёзное упущение:
    В оригинальном интерпретаторе область памяти F00-FFF отводилась под экран.
    У меня же, под экран отводится обычная видеопамять ПК, а та область не используется. Запись и чтение с экрана производится командой вывода спрайта DXYN. Так вот, скорее всего, программы пытаются от туда что-то приочитать, а читают одни нули, поскольку чам ничего нет. Также, возможно и пишут, но ничего не отображается.
    Хороший пример - арканоид. Там шарик свободно летает по полю, не видя препятствий, скорее всего, причина именно в чтении видеопамяти.
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  5. #4  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Большое спасибо, что все так подробно расписали =)
    Так вот, я как-то увидел, как эта процедура МЕДЛЕННО, в течении нескольких секунд заполняет синим экран сверху вниз, хотя должна это делать мгновенно.
    Очень странно. Ради интереса я запустил процедуру очистки экрана отдельно (создал программу с двумя процедурами, установка 80x50 и заполнение экрана синим цветом), и все сработало мгновенно. При этом, мы знаем, что процедура очистки реализована так, что любые входные параметры и состояние памяти в целом не влияют на ход ее работы. Она просто забивает видеопамять значением 1F00.
    Процедура прямой пересылки памяти протестирована множество раз, она работает корректно, и довольно шустро.
    Так что, прямо не знаю, полтергейст какой-то =). На досуге поковыряюсь, ведь галактические гармония и порядок должны быть восстановлены
    Но я уже чувствую, что стоит искать причину не совсем там, где я хочу ее увидеть. Так было всегда =).

    В оригинальном интерпретаторе область памяти F00-FFF отводилась под экран.
    У меня же, под экран отводится обычная видеопамять ПК, а та область не используется
    Если вы хотите повысить совместимость программ с вашим эмулятором, то почему-бы не обрабатывать эту ситуацию? Ну да, это будут определенные трудности (особенно, если формат хранения данных в видеопамяти виртуальной машины отличается от формата хранения данных в видеопамяти компьютера), зато результат может оказаться стоящим работы.
    Последний раз редактировалось Абадябер; 25.01.2012 в 03:00.
    Дружба-магия-радость!
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Интерпретатор ЛИСПа на СТЕПЛЕРе
    от Kakos_nonos в разделе Проекты на Степлере
    Ответов: 3
    Последнее сообщение: 27.08.2012, 18:40
  2. Почтовый клиент на СТЕПЛЕРе
    от Kakos_nonos в разделе Проекты на Степлере
    Ответов: 3
    Последнее сообщение: 24.01.2012, 03:21
  3. LSInt (интерпретатор Абадябера)
    от Абадябер в разделе Степлер
    Ответов: 15
    Последнее сообщение: 19.12.2011, 03:14
  4. Программы на СТЕПЛЕРе
    от Kakos_nonos в разделе Степлер
    Ответов: 4
    Последнее сообщение: 01.12.2011, 04:20
  5. Brainfuck-интерпретатор
    от Kakos_nonos в разделе Разработки на Ассемблере
    Ответов: 5
    Последнее сообщение: 20.04.2011, 15:39
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •