User Tag List

Показано с 1 по 10 из 46

Тема: Специалист: эмуляция

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,215
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,648
    Поблагодарили
    573 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сегодня произвёл серьёзный рефакторинг код, выделив все повторяющиеся части всех логических и арифметических операций в отдельные функции в ущерб и так никакой производительности скрипта. Несколько раз самым внимательным образом сравнил собственную эмуляцию с эталонным эмулятором. Но ALUOP NN, как и прежде, выдаёт ошибку. Даже не знаю в какую сторону копать. Наверное просто глаз замылился и я что-то упускаю.

    Ну вот, например, так сейчас у меня выглядит эмуляция команды ORI на Python:

    Код:
    def or_a(reg):
        global reg_a, flag_p, flag_h, flag_c, flag_z, flag_s
        reg_a |= reg
        flag_s = bool(reg_a & 0b10000000)
        flag_z = not reg_a
        flag_h = False
        flag_p = parity[reg_a]
        flag_c = False
        fflag_n(False)
        fflag_3(bool(reg_a & 0b00001000))
        fflag_5(bool(reg_a & 0b00100000))
        return
    
    def b11110110():  # OR A,d
    global pc, ticks
        or_a(read_mem(inc_pc()))
        pc = inc_pc2()
        ticks += 7
    return
    А вот для сравнения как эмуляция той же команды выглядит в эталонном эмуляторе на С:

    Код:
    #define ORA(val) \
    {                                               \
        A |= (val);                                 \
        S_FLAG = ((A & 0x80) != 0);                 \
        Z_FLAG = (A == 0);                          \
        CLR(H_FLAG);                                \
        P_FLAG = PARITY(A);                         \
        CLR(C_FLAG);                                \
    }
    
    
            case 0xF6:            /* ori data8 */
                cpu_cycles = 7;
                work8 = RD_BYTE(PC++);
                ORA(work8);
            break;
    Как видите, на выходе получилось практически идентично. И всё равно тест проваливается.
    Последний раз редактировалось CityAceE; 24.12.2018 в 14:24.
    С уважением, Станислав.

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

  3. #2

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от CityAceE Посмотреть сообщение
    fflag_n(False) fflag_3(bool(reg_a & 0b00001000)) fflag_5(bool(reg_a & 0b00100000))
    Для 100% эмуляции 8080 это надо менять. Биты 5 и 3 всегда 0, бит 1 - всегда 1.

  4. #3

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,215
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,648
    Поблагодарили
    573 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Для 100% эмуляции 8080 это надо менять. Биты 5 и 3 всегда 0, бит 1 - всегда 1.
    Это я учёл, поэтому у меня так:

    Код:
    def fflag_3(flag):
        global flag_3
        if not i8080:
            flag_3 = flag
    
    
    def fflag_5(flag):
        global flag_5
        if not i8080:
            flag_5 = flag
    
    
    def fflag_n(flag):
        global flag_n
        if not i8080:
            flag_n = flag
    С уважением, Станислав.

  5. #4

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если я правильно понимаю, что здесь написано
    Цитата Сообщение от CityAceE Посмотреть сообщение
    fflag_n(False)
    Цитата Сообщение от CityAceE Посмотреть сообщение
    def fflag_n(flag): global flag_n if not i8080: flag_n = flag
    то бит 1 регистра флагов обнуляется, а д.б. всегда 1.
    Последний раз редактировалось ivagor; 24.12.2018 в 14:48.

  6. #5

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,215
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,648
    Поблагодарили
    573 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    При инициализации этому флагу присваивается True и, если это i8080 (а не Z80), то этот флаг у меня больше нигде не трогается. Этот момент я проверял, когда искал потенциальные ошибки.
    С уважением, Станислав.

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

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

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

Похожие темы

  1. Специалист: Варианты
    от Mick в разделе Специалист
    Ответов: 492
    Последнее: 16.06.2025, 17:23
  2. Специалист: Рекомпиляция.
    от Tim0xA в разделе Специалист
    Ответов: 38
    Последнее: 11.07.2022, 12:08
  3. Специалист-М
    от zx_ в разделе Специалист
    Ответов: 230
    Последнее: 18.12.2021, 14:41
  4. Специалист: Бейсик
    от Prusak в разделе Специалист
    Ответов: 28
    Последнее: 26.07.2019, 16:07
  5. Специалист: Разное
    от Splinter в разделе Специалист
    Ответов: 171
    Последнее: 09.05.2018, 07:50

Ваши права

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