Важная информация

User Tag List

Страница 1 из 7 12345 ... ПоследняяПоследняя
Показано с 1 по 10 из 62

Тема: sPycialist - эмулятор ПК Специалист на Python

  1. #1
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Владивосток
    Сообщений
    3,264
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    6
    Поблагодарили
    2 сообщений
    Mentioned
    14 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию sPycialist - эмулятор ПК Специалист на Python

    Что это

    sPycialist - это эмулятор ПК Специалист, написанный с чистого листа и полностью на языке программирования Python.

    История появления

    Вообще, изначально вдохновившись эмулятором ZX Spectrum - PyZX, также написанном на Python, я собирался написать свой эмулятор, так как PyZX по большей части - это автоматически конвертированный с Java эмулятор Jasper. Из-за этого его исходный код очень кривой и некрасивый. И вот я начал писать ZX-Pylot. Сделал эмуляцию первых 256 команд и подумал, что по сути у меня готова эмуляция процессора Intel 8080 (КР580ВМ80А) и вспомнил свой первый компьютер "Специалист", который построен на этом процессоре. И в результате вместо того, чтобы писать ZX-Pylot, я переключился на эмулятор Специалиста - sPycialist.

    Ключевые особенности

    • 100% Python
    • Из зависимостей используется только библиотеки pygame и numpy
    • Полная эмуляция процессора Intel 8080 (КР580ВМ80А), включая все флаги
    • Поддержка загрузки игр в RKS-формате

    Использование

    Эмулятор запускается из командной строки:

    Код:
    python spycialist.py
    Чтобы сменить игру, необходимо положить игру в формате RKS рядом с файлами эмулятора. Далее требуется изменить имя файла в константе GAME в файле spycialist.py. После чего потребуется перезапустить эмулятор.

    Информация для тех, кто не знаком с ПК Специалист: Чтобы запустить загруженную игру, после запуска эмулятора нужно нажать следующую последовательность клавиш: <F1>, <ENTER>, <U>, <ENTER>.

    Переназначить клавиши на свой вкус можно в файле spyc_keyboard.py. По умолчанию используется раскладка JCUKENG, как наиболее приближенная к оригиналу.

    Для чего это

    Данный эмулятор может представлять лишь академический интерес из-за невысокой скорости эмуляции и отсутствия какого-либо сервиса. Эмулятор писался сугубо из личного интереса. Тем не менее, основу sPycialist составляет эмулятор Intel 8080. Эмуляция данного процессора получилась достаточно точной - полностью проходятся все тесты 8080/8085 CPU Exerciser. Реализация Intel 8080 находится в отдельном файле и почти никак не завязана на эмуляцию ПК Специалст. Таким образом данный эмулятор процессора Intel 8080 может быть с успехом использован в каких-то сторонних Python-проектах.

    Известные проблемы

    • Скорость эмуляции оставляет желать лучшего, так как Python - это не тот язык, на котором пишут эмуляторы
    • Нет эмуляции звука

    Где взять

    Проект расположен на GitHub, а также для удобства приложен к этому сообщению.

    История версий

    v0.5 (20 января 2019 г.)
    - Дальнейшая оптимизация кода: на быстрых компьютерах доступна 100%-ная скорость эмуляции
    - Оптимизация опроса клавиатуры: устранено кросс-нажатие клавиш

    Предыдущие версии


    v0.4 (2 января 2019 г.)
    - Дальнейшая оптимизация кода
    - Новая процедура вывода на экран (svofski)
    - Новая процедура опроса клавиатуры (ivagor)

    v0.3 (31 декабря 2018 г.)
    - Существенное увеличение скорости эмуляции за счёт оптимизации вывода экрана

    v0.2 (29 декабря 2018 г.)
    - Оптимизация кода для повышения быстродействия

    v0.1 (26 декабря 2018 г.)
    - Первый релиз
    [свернуть]



    Скриншоты




    Вложения Вложения
    Последний раз редактировалось CityAceE; 06.02.2019 в 03:52.
    С уважением, Станислав.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Master
    Регистрация
    26.03.2005
    Адрес
    Ivanovo
    Сообщений
    636
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сразу тебе советую заюзать для регистров memoryview, что-то вроде:
    Код:
    _HL_b = bytearray(2)
    _H_L = memoryview(_HL_b)
    _H = _H_L[0:1]
    _L = _H_L[1:2]
    _HL = _H_L.cast('H')
    Доступ к половинкам и целым регистрам станет очень сильно быстрее и лежать они будут в одном физическом месте в памяти.
    Доступ будет как к массиву через _L[0] или _HL[0]
    Плюс замени все операции маскирования по FF на остаток от деления на маска + 1.
    Память лучше тоже через memoryview:
    Код:
    mem = memoryview(bytearray(65536))
    Последний раз редактировалось Q-Master; 26.12.2018 в 23:15.

  4. #3
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Владивосток
    Сообщений
    3,264
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    6
    Поблагодарили
    2 сообщений
    Mentioned
    14 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Q-Master, спасибо за столь ценные советы. Никогда до этого не приходилось сталкивался с memoryview! Есть отличный повод разобраться и применить. Авось эмулятор начнёт шевелиться чуть шустрее
    С уважением, Станислав.

  5. #4
    Оператор ДВК Аватар для hobot
    Регистрация
    30.08.2011
    Адрес
    Зеленоград
    Сообщений
    5,225
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    CityAceE, скриншоты просто прослезили ) Создал тему эмулятора на игровом форуме, замечательный предпраздничный релиз!
    https://www.old-games.ru/forum/posts/1521263/

    Мне вот что подумалось, сколько в IT отрасли ещё специалистов - у которых первой машиной была отечественная микроЭВМ? Может опрос какой-то организовать? Естественно все клоны спектрумов (и т.п.) нашего производства идут в зачёт как отечественные (что естественно!)
    Последний раз редактировалось hobot; 27.12.2018 в 04:50.
    Архив программ для УК-НЦ, ДВК и БК.

    Ищу игру "СТРАНА МОНСТРОВ" [monstr.sav] для ДВК.

  6. #5
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    10,576
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    7 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от CityAceE Посмотреть сообщение
    Авось эмулятор начнёт шевелиться чуть шустрее
    Я бы на твоем месте еще сделал работу с флагами не так, как у тебя - каждый флаг - отдельная переменная. А держал бы все их в одном байте или слове. Ну и отказался бы от универсальности эмуляции 8080/Z80.

  7. #6
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Владивосток
    Сообщений
    3,264
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    6
    Поблагодарили
    2 сообщений
    Mentioned
    14 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Я бы на твоем месте еще сделал работу с флагами не так, как у тебя - каждый флаг - отдельная переменная. А держал бы все их в одном байте или слове.
    А какие это может дать преимущества? Как я себе это понимаю, когда каждый флаг в отдельной переменной, его можно быстрее устанавливать/сбрасывать. Всего пара команд i8080 требует полного флагового регистра, и для этих команд не сильного дорого запаковать все флаги в один байт и производить обратную процедуру. А все остальные команды расставляют флаги по отдельности.

    Цитата Сообщение от Titus Посмотреть сообщение
    Ну и отказался бы от универсальности эмуляции 8080/Z80.
    Это, конечно, не сильно скажется на производительности, но, да, отказаться можно.
    С уважением, Станислав.

  8. #7
    Guru Аватар для svofski
    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    2,762
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Присоединюсь к хору советчиков =)

    1) Память списком это роскошно. Лучше представить ее байтовым массивом.
    2) Ассоциативная таблица, в которой ключ - байт и каждому ключу чего-то соответствует, это просто массив. Можно оставить таблицу для инициализации, потому что так ее проще читать, но для исполнения лучше перенести все хандлеры инструкций в простой линейный список.
    3) Счетчик тактов лучше сразу делать как m-state/t-state (например, [5,3,3]). Это пригодится для эмуляторов, где надо считать такты с учетом вейтов, хода луча итд.
    4) Я бы конечно сделал процессор классом. Сейчас и так у тебя все пронизано globals. А с классом это будут члены класса и ты будешь на них ссылаться как self.flag_c итд.
    Больше игр нет

  9. #8
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Владивосток
    Сообщений
    3,264
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    6
    Поблагодарили
    2 сообщений
    Mentioned
    14 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    svofski, спасибо за то, что нашёл время и интерес заглянуть в текст эмулятора и высказать свои соображения.

    Цитата Сообщение от svofski Посмотреть сообщение
    1) Память списком это роскошно. Лучше представить ее байтовым массивом.
    Уже сделал по рекомендации Q-Master'а.

    Цитата Сообщение от svofski Посмотреть сообщение
    2) Ассоциативная таблица, в которой ключ - байт и каждому ключу чего-то соответствует, это просто массив. Можно оставить таблицу для инициализации, потому что так ее проще читать, но для исполнения лучше перенести все хандлеры инструкций в простой линейный список.
    Не до конца понял мысль. В чём профит? Так мне было и будет проще менять процедуры обработки на тот случай, если вдруг я захочу что-то объединить, или наоборот выделить обработку какую-то команды в отдельную процедуру. Визуально это выглядит яснее. Хотя опять же, может быть я просто не до конца понял твою мысль.

    Цитата Сообщение от svofski Посмотреть сообщение
    3) Счетчик тактов лучше сразу делать как m-state/t-state (например, [5,3,3]). Это пригодится для эмуляторов, где надо считать такты с учетом вейтов, хода луча итд.
    Я подумаю над этим. Но уж больно утопичной выглядит идея написания на Python эмулятора, который будет учитывать ход луча У меня в эмуляторе нет ни одной задержки, так как задерживать нечего - всё и так слишком медленно шевелится.

    Цитата Сообщение от svofski Посмотреть сообщение
    4) Я бы конечно сделал процессор классом. Сейчас и так у тебя все пронизано globals. А с классом это будут члены класса и ты будешь на них ссылаться как self.flag_c итд.
    Да, тоже уже думал над этим, когда начал плодить global'ы. Но в итоге доделал уже так. Хотя мне эта масса global'ов совсем не нравится.

    Сейчас пытаюсь перевести хранение регистров и пока плохо получается. Нужно было всё делать разом сразу и везде. И я вроде сделал, но у меня теперь всё сломалось. Пытаюсь понять что и где пошло не так. Но это не так просто.
    С уважением, Станислав.

  10. #9
    Guru Аватар для svofski
    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    2,762
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    CityAceE, в ассоциативной таблице выборка по ключу это поиск в хеш таблице. Операция O(1) формально, но на практике довольно сложная. Выборка из линейного массива это просто вычисление смещения. В Питоне может быть и невелика будет разница, но я бы попробовал.
    Больше игр нет

  11. #10
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    10,576
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    7 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от CityAceE Посмотреть сообщение
    А какие это может дать преимущества? Как я себе это понимаю, когда каждый флаг в отдельной переменной, его можно быстрее устанавливать/сбрасывать. Всего пара команд i8080 требует полного флагового регистра, и для этих команд не сильного дорого запаковать все флаги в один байт и производить обратную процедуру. А все остальные команды расставляют флаги по отдельности.
    Я не знаю, питона, поэтому пример приведу на Си:

    Вот, например, твой вариант RLCA:

    Код:
        reg_a = reg_a << 1
        flag_c = bool(reg_a & 0x100)
        reg_a = (reg_a | flag_c) & 0xff
        if not i8080:
            flag_h = False
        fflag_n(False)
        fflag_3(bool(reg_a & 0b00001000))
        fflag_5(bool(reg_a & 0b00100000))
    И как можно оптимально это эмулировать (без учета универсальности Z80/8080):

    Код:
    	reg_A = (reg_A << 1) | (reg_A >> 7);			
    	reg_F = (reg_A & CONST_53C) | (reg_F & CONST_SZPH);

Страница 1 из 7 12345 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

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

Похожие темы

  1. Специалист-М
    от zx_ в разделе Специалист
    Ответов: 210
    Последнее: 23.03.2019, 16:26
  2. Ответов: 60
    Последнее: 19.03.2019, 08:50
  3. Тулзы для работы с образами на Python
    от Q-Master в разделе Утилиты
    Ответов: 4
    Последнее: 25.11.2014, 23:44
  4. Эмулятор ПК "Специалист" для Mac OS X
    от hdc в разделе Эмуляторы отечественных компьютеров
    Ответов: 1
    Последнее: 21.10.2009, 11:28
  5. Python
    от Black1980 в разделе Программирование
    Ответов: 12
    Последнее: 26.12.2006, 11:30

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •