User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 13

Тема: насчет эмуляции ULA

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

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Master Аватар для boo_boo
    Регистрация
    10.05.2005
    Адрес
    Москва
    Сообщений
    715
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию насчет эмуляции ULA

    во многих эмулях практикуется такой подход к эмуляции ULA-видеоконтроллера: после того, как процессор исполнит очередную команду, берется кол-во тактов, затраченное на эту команду, и выполняется соответствующий обьем отрисовки ULA.
    к примеру: некий PUSH занял 11 тактов, стало быть (в случае прямого хода луча) ULA рисует 22 точки. и так далее.
    НО -- ведь если у нас машина с раздельными полями памяти, ULA и Z80 обращаются к данным одновременно, то есть может возникнуть ситуация, когда PUSH положил на стек, находящийся в экранной памяти, старший байт слова, тем временем ULA считала байт по предыдущему адресу, а затем PUSH положил и младший байт, но ULA уже ускакала вперед, и на экран таким образом попал только старший байт слова, которое клал на стек PUSH.
    в упомянутом выше алгоритме эмуляции это не будет учтено, на экран попадут оба байта, то есть, строго говоря, такая эмуляция некорректна.

    прав ли я?

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

  3. #2
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,662
    Спасибо Благодарностей отдано 
    1,254
    Спасибо Благодарностей получено 
    1,883
    Поблагодарили
    711 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Да, ты прав, такая эмуляция не вполне корректна

  4. #3
    Guru Аватар для Lethargeek
    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,588
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    285
    Спасибо Благодарностей получено 
    237
    Поблагодарили
    186 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Давно уже пора полноценно эмулировать не только проц "изнутри" да юлу, но и шину (потактовое состояние). И всякие "девайсоплагины" будет проще прикручивать. Правда, эмуль тормознутый получится... но это ничего, у винтела дури хватает.
    Прихожу без разрешения, сею смерть и разрушение...

  5. #4
    Veteran
    Регистрация
    06.05.2006
    Адрес
    Ливны, Орловская обл
    Сообщений
    1,169
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Потактово это конечно хорошо, да и дури хватит(а при хорошей архитектуре эмуля может и лучше будет), но вот инфы по интимным делам железа внутри команд надо будет ещё поискать...

  6. #5
    Master Аватар для boo_boo
    Регистрация
    10.05.2005
    Адрес
    Москва
    Сообщений
    715
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Lethargeek
    Давно уже пора полноценно эмулировать не только проц "изнутри" да юлу, но и шину (потактовое состояние). И всякие "девайсоплагины" будет проще прикручивать. Правда, эмуль тормознутый получится... но это ничего, у винтела дури хватает.
    попробую, глянем, сколько там у винтела дури
    Цитата Сообщение от NovaStorm
    Потактово это конечно хорошо, да и дури хватит(а при хорошей архитектуре эмуля может и лучше будет), но вот инфы по интимным делам железа внутри команд надо будет ещё поискать...
    по каким "делам внутри команд"?
    Цитата Сообщение от Vladimir Kladov
    в каких это - многих? у меня в процессе выполнения команды НА КАЖДОМ ЦИКЛЕ строится видеолуч, например. И я уверен, что так же делается во всех эмуляторах, работающих с ULA (а не с рассыпухой). Иначе это уже не мультиколор, а частичный мультиколор.
    ну у тебя я не смотрел, сорцы-то закрыты
    в zemu, в глюкалке с точностью до опкода ULA работает. в US все кошерно.
    а у тебя как это реализовано? жестко на каждом такте дергается ULA, или как в US -- после записи в видеопамять/порт?

  7. #6
    Veteran
    Регистрация
    06.05.2006
    Адрес
    Ливны, Орловская обл
    Сообщений
    1,169
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Интим - это например LDIR,условные переходы и вообще что-то более-менее "сложное". Порядок изменения этоми инструкциями регистров разнится на клонах Z80, да на разных по технологии изготовления Z80. Для точной эмуляции, нужно было бы выбирать конкретный проц.

  8. #7
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,662
    Спасибо Благодарностей отдано 
    1,254
    Спасибо Благодарностей получено 
    1,883
    Поблагодарили
    711 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от NovaStorm
    Интим - это например LDIR,условные переходы и вообще что-то более-менее "сложное". Порядок изменения этоми инструкциями регистров разнится на клонах Z80, да на разных по технологии изготовления Z80.
    Бездоказательно, весьма бездоказательно...

  9. #8
    Master Аватар для boo_boo
    Регистрация
    10.05.2005
    Адрес
    Москва
    Сообщений
    715
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от NovaStorm
    Интим - это например LDIR,условные переходы и вообще что-то более-менее "сложное". Порядок изменения этоми инструкциями регистров разнится на клонах Z80, да на разных по технологии изготовления Z80. Для точной эмуляции, нужно было бы выбирать конкретный проц.
    это только пресловутого MEMPTR касается, а с ним уже ясно все (http://zx.pk.ru/showpost.php?p=44058&postcount=150). насчет разных технологий и странных клонов ходят слухи, но конкретных экземпляров пока не выявлено. если у тебя есть -- давай сюда
    Цитата Сообщение от Error404
    Я тут гонял zexall на нескольких эмуляторах z80 - результат удручающий. А он еще не самое полное тестирование проводит...
    конечно. но, к счастью с хардовым Z80 все куда приятней есть небольшая разница (см ссылку выше) но в целом один хрен так что это скорей показатель недоделанности некоторых эмуляторов

  10. #9
    Master Аватар для Vladimir Kladov
    Регистрация
    09.02.2005
    Адрес
    Новосибирск
    Сообщений
    933
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    17
    Поблагодарили
    17 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию ULA в EmuzWin

    у меня на асме написан код, который отвечает за декодирование ULA. Asm свой, но смысл понять можно.

    это - код макросов для эмуляции задержек и ULA.

    Код:
    ////////////////////////////////////////////////////////////////////////////////
    
              //         //   //                  ////
              //         //   //                 // //
              //         //   //                //  //
              //         //   //               //   //
              //         //   //              ////////
              //         //   //             //     //
                /////////     ////////////  //      //
    
    ////////////////////////////////////////////////////////////////////////////////
    
    MC_VIDEO_SCREEN_READY MACRO
        // буфер заполнен, вывод экрана и другие действия
        MOV  EAX, [VideoOutObj]
    
        // вывод экрана
        LEAVE_MMX
        PUSH ECX
          PUSH EAX
            XOR  B[&ZX].Reg_F, flag_N
            XCHG D[MC_Screen_Buffer_Pos], EDI
            .IF AntiSlowDown and 0
              MOV EDI, 71690+256
            .ENDIF
            MOV  D[&ZX].TactCount, EDI
            SUB  D[&ZX].TactCount, $100
            MOV  [&ZX].Reg_PC, BX
            CALL VideoOutObj_FrameReady
            XCHG [MC_Screen_Buffer_Pos], EDI
            .IF Gfx256
              MOV D[GfxVideoTarget], VideoOutObj_GfxPixels
              MOV D[ScreenAttrTarget], VideoOutObj_ScreenAttrs
            .ENDIF
          POP  EAX
          MOV  DL, 1 // ManageFlash = TRUE
          CALL VideoOutObj_ScreenReady
        POP  ECX
        ENTER_MMX
        XOR  EDI, EDI
      END //MC_VIDEO_SCREEN_READY
    
    //******************************************************************************
    ULA_unit MACRO Flag=YES
      .IF MultiColor
    
        .IF AntiSlowDown
          CMP D[&ZX].AntiSlow_HaltDetected, 0
          JZ  @@ULA_antislow1_&&
          CMP D[&ZX].AntiSlow_HaltDetected, 8
          JB  @@ULA_antislow_end&&
          // halt detected, ...
    @@ULA_antislow1_&&: // нет halt'ов, только in-ы
          CMP EDI, 71680
          JAE LONG @@ULA_end_all&&
          XCHG EDI, [MC_Screen_Buffer_Pos]
          CMP  EDI, MC_Screen_Buffer_Size
          XCHG EDI, [MC_Screen_Buffer_Pos]
          JAE LONG @@ULA_end_all&&
    @@ULA_antislow_end&&:
        .ENDIF
    
      .IF PrepareVideo
        LEA  ECX, [EDI-256]
        .IF UlaBuffer > 0
          ADD  ECX, UlaBuffer
        .ENDIF
        SUB  ECX, [ULA_TCounter0]
        JLE  LONG @@_ULA_end&&
        SHR  ECX, 2
        JZ   LONG @@_ULA_end&&
    
        MOV  EDX, ECX
        SHL  EDX, 2
        ADD  [ULA_TCounter0], EDX
    
        // CL = число байтов для отображения > 0
        XCHG EDI, [MC_Screen_Buffer_Pos]
        .IF "&Flag" = "YES"
          MOV  [&ZX].Reg_F, AH // если будет вызван FrameReady,
                               // то нужно текущее состояние Reg_F для TimeStamper-а
        .ENDIF
        PUSH EAX  //-------------------------------------\
    
        // цикл вывода байтов
    @@_ULAout_loop&&:
    
        .IF AntiSlowDown
          CMP EDI, MC_Screen_Buffer_Size
          JAE LONG @@_ULAfin&&
        .ENDIF
        // первым сохраняем текущий BorderColor и видеорежим
        MOV  DL, [&ZX].BorderColor
        MOV  DH, [&ZX].VideoMode
        MOV  [EDI*4+2+MC_Screen_Buffer], DX
    
        .IF Gfx256 = 0 OR GfxDraw = 0
          .IF GigaScreen
            MOV  [EDI*4+2+MC_Screen_Buffer_Giga], DL
            //int 3
          .ENDIF
        .ENDIF
    
        // продолжаем цепочку бордюра
        MOV  DX, [&ZX].BorderColorNext
        MOV  [&ZX].BorderColor, DX
        AND  B[&ZX].BorderColorNxt2, $F
    
    
        .IF Gfx256 AND GfxDraw  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          // в режиме мультиколора с включенным Gfx надо
          // пересылать Gfx-данные, которых в 8 раз больше
          MOVSX EAX, W[EDI*2+MC_Screen_Table_Pixels]
          //ADD EAX, EAX
          SHL EAX, 3
          JS  SHORT @@_ULA_8pixels_stored&&
          ADD EAX, [GFXVidAddress] // откуда брать 8 байтов
          XCHG ESI, EAX
            XCHG EDI, [GfxVideoTarget]
            MOVSD
            MOVSD
            XCHG EDI, [GfxVideoTarget]
          XCHG ESI, EAX
          // теперь нужен еще атрибут, хотя и Gfx-режим
          // берем байт атрибутов
          MOVZX EAX, W[EDI*2+MC_Screen_Table_Attrs]
          DEC  EAX
          JZ   LONG @@_ULA_8pixels_stored&&
    
          ADD  EAX, [&ZX].VideoBaseAddr
          MOVZX EDX, B[EAX]
          MOV  DH, [&ZX].Flash
          MOV  AL, B[EDX+GfxAttrConvertTable]
    
          XCHG EDI, [ScreenAttrTarget]
          STOSB
          XCHG EDI, [ScreenAttrTarget]
    
        .ELSE Gfx256 = 0 OR GfxDraw = 0   //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          // берем байт атрибутов
          MOVZX EAX, W[EDI*2+MC_Screen_Table_Attrs]
          DEC  EAX
          JZ   LONG @@_ULA_8pixels_stored&&
    
          // проверяем эффект "снег"
          CMP  B[&ZX].SnowEffect, 0
          JZ   SHORT @@_ULAload_data&&
    
          MOV  AL, B[&ZX].TactRCount
          AND  AL, $7F
          OR   AL, [&ZX].Reg_R_7
    
          ADD  EAX, [&ZX].VideoBaseAddr
          MOVZX EDX, B[EAX]
          MOV  DH, [&ZX].Flash
          MOV  DL, B[EDX+AttrConvertTable]
    
          // берем очередной байт 8 пикселов
          MOVZX EAX, W[EDI*2+MC_Screen_Table_Pixels]
    
          MOV  AL, B[&ZX].TactRCount
          AND  AL, $7F
          OR   AL, [&ZX].Reg_R_7
    
          ADD  EAX, [VideoBaseAddr]
          MOV  DH, B[EAX]
    
          MOV  W[EDI*4+MC_Screen_Buffer], DX
    
          JMP  SHORT @@_ULA_8pixels_stored&&
    
    @@_ULAload_data&&:
    
          ADD  EAX, [&ZX].VideoBaseAddr
          MOVZX EDX, B[EAX]
          MOV  DH, [&ZX].Flash
          MOV  DL, B[EDX+AttrConvertTable]
    
          // берем очередной байт 8 пикселов
          MOVZX EAX, W[EDI*2+MC_Screen_Table_Pixels]
          ADD  EAX, [&ZX].VideoBaseAddr
          MOV  DH, B[EAX]
    
          MOV  W[EDI*4+MC_Screen_Buffer], DX
    
          .IF GigaScreen // для GigaScreen, то же самое для альтернативного экрана:
              MOVZX EAX, W[EDI*2+MC_Screen_Table_Attrs]
              DEC  EAX
              JZ   SHORT @@_ULA_8pixels_stored&&
    
              ADD  EAX, [&ZX].AltVideoBaseAddr
              MOVZX EDX, B[EAX]
              MOV  DH, [&ZX].Flash
              MOV  DL, B[EDX+AttrConvertTable]
              // берем очередной байт 8 пикселов
              MOVZX EAX, W[EDI*2+MC_Screen_Table_Pixels]
              ADD  EAX, [&ZX].AltVideoBaseAddr
              MOV  DH, B[EAX]
    
              MOV  W[EDI*4+MC_Screen_Buffer_Giga], DX
          .ENDIF //GigaScreen
    
        .ENDIF //not Gfx256 ~~~~~~~~~~~~~~~~~~~~~~~~~
    
    @@_ULA_8pixels_stored&&:
        INC  EDI
        .IF RZX_play = 0
          CMP  EDI, BytesInFrame
          JB   LONG @@_ULAnext&&
    
          .IF AntiSlowDown
    //        CMP BX, $4000
    //        JAE @@ULA_AntiSlow_ScreenReady&&
    //        MC_VIDEO_SCREEN_READY
    //@@ULA_AntiSlow_ScreenReady&&:
          .ELSE
            MC_VIDEO_SCREEN_READY
          .ENDIF
    @@ULA_skipscreen&&:
    
          CMP  B[&ZX].StopOnEndOfFrame, 0
          JZ   SHORT @@_ULAnext&&
          MOV  D[&ZX].JumpPt, StopExec
        .ELSE
          CMP  EDI, BytesInFrame
          JB   SHORT @@_ULAnext&&
    
          DEC  EDI
        .ENDIF RZX_play = 0
    
    @@_ULAnext&&:
        DEC  ECX
        JG   @@_ULAout_loop&&
        //LOOP @@_ULAout_loop&&
    
    @@_ULAfin&&:
        POP  EAX
    
        XCHG EDI, [MC_Screen_Buffer_Pos] // EDI = TactCounter+256
    
    @@_ULA_end&&:
      .ELSE //not PrepareVideo
        LEA  ECX, [EDI-256]
        .IF UlaBuffer > 0
          ADD  ECX, UlaBuffer
        .ENDIF
    
        SUB  ECX, [ULA_TCounter0]
        JLE  LONG @@_ULAnovideo_end&&
        SHR  ECX, 2
        JZ   LONG @@_ULAnovideo_end&&
    
        MOV  EDX, ECX
        SHL  EDX, 2
        ADD  [ULA_TCounter0], EDX
    
        // CL = число байтов для "отображения" > 0
        XCHG EDI, [MC_Screen_Buffer_Pos]
        .IF "&Flag" = "YES"
          MOV  [&ZX].Reg_F, AH // если будет вызван FrameReady,
                               // то нужно текущее состояние Reg_F для TimeStamper-а
        .ENDIF
        PUSH EAX  //-------------------------------------\
    
        // цикл вывода байтов
    @@_ULAnovideo_out_loop&&:
    
        INC  EDI
        .IF RZX_play = 0
          CMP  EDI, BytesInFrame
          JB   SHORT @@_ULAnovideo_next&&
    
          .IF AntiSlowDown
    //        CMP EBX, $4000
    //        JAE @@ULA_AntiSlow_ScreenReady1_&&
    //        MC_VIDEO_SCREEN_READY
    //@@ULA_AntiSlow_ScreenReady1_&&:
          .ELSE
            MC_VIDEO_SCREEN_READY
          .ENDIF
    
          CMP  B[&ZX].StopOnEndOfFrame, 0
          JZ   SHORT @@_ULAnovideo_next&&
          MOV  D[&ZX].JumpPt, StopExec
        .ELSE
          CMP  EDI, BytesInFrame
          JB   SHORT @@_ULAnovideo_next&&
    
          DEC  EDI
        .ENDIF RZX_play = 0
    
    @@_ULAnovideo_next&&:
        DEC  ECX
        JG   @@_ULAnovideo_out_loop&&
        //LOOP @@_ULAnovideo_out_loop&&
    
        POP  EAX
    
        XCHG EDI, [MC_Screen_Buffer_Pos] // EDI = TactCounter+256
    
    @@_ULAnovideo_end&&:
      .ENDIF //PrepareVideo
    @@ULA_end_all&&:
      .ENDIF //MultiColor
      END  //ULA_unit
    продолжение следует...
    Последнюю версию EmuZWin (2.7) можно получить по этой ссылке, а "официальная" страница с описанием здесь. Если что-то не пашет, берите там же версии 2.6 или старше. [B]

  11. #10
    Master Аватар для Vladimir Kladov
    Регистрация
    09.02.2005
    Адрес
    Новосибирск
    Сообщений
    933
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    17
    Поблагодарили
    17 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    в каких это - многих? у меня в процессе выполнения команды НА КАЖДОМ ЦИКЛЕ строится видеолуч, например. И я уверен, что так же делается во всех эмуляторах, работающих с ULA (а не с рассыпухой). Иначе это уже не мультиколор, а частичный мультиколор.

    Инфы - море. Идите на worldofspectrum, там все лежит, и даже обновляется.
    Последнюю версию EmuZWin (2.7) можно получить по этой ссылке, а "официальная" страница с описанием здесь. Если что-то не пашет, берите там же версии 2.6 или старше. [B]

Страница 1 из 2 12 ПоследняяПоследняя

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

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

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

Похожие темы

  1. либа для эмуляции z80, v0.1
    от boo_boo в разделе Эмуляторы
    Ответов: 27
    Последнее: 24.08.2010, 22:37
  2. мысли по написанию модуля эмуляции z80 на С
    от boo_boo в разделе Эмуляторы
    Ответов: 9
    Последнее: 24.01.2006, 19:28

Ваши права

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