SAS Emulator (эмулятор «ПК-01 Львов»)

...
  • Yason wrote:
    Pathoswithin wrote:Мне кажется, приходят две клавиши по очереди: сначала 224/225, потом основной код.
    Ну это как на турбоПоскакале, - если приходит "0", - то это дополнительная клавиша, опрашивай клаву еще раз и будет код допонительной. Но тут "224", да еще и "225" какие-то, да еще и разный код нажата/отжата, хотя действие and 0x7f приводит к одному коду конкретной клавиши.
    В общем, всем спасибо за помощь, а также создателям scancode и его исходникам :-)
    Вот на "скорую руку" "наклепал" вот такое (см.ниже) под меня "подточенное", хотя и другим может пригодится. Пока еще более тщательно не проверял, но похоже, что там всё правильно.
    Spoiler:

    Code: Select all

        ; запускасть ScanCodeKey
        ;Результат обработки в
        ScanCodeKey1 rd 1 ; "Чистый" код
        ScanCodeKey2 rd 1 ; обработаный код (-128 если больше 128)
        ScanCodeKeyUD rd 1 ; если 0 - отжата, если 1 -нажата
        ScanCodeKeyExt rd 1 ; 0- обычный код; 1 - доп ext (224); 2 - доп2 ext2 (225)
      ScanCodeKey_int40_2dop:
         mov  eax,2  
         mcall
         shr  eax,8                   ; scancode
         and  eax,0xff
            ret
            
    ScanCodeKey:   ; START ScanCode
      mov [ScanCodeKeyExt],0
    ScanCode_m1:
     call ScanCodeKey_int40_2dop
     
        cmp  eax,224 ; если доп код....
        jne  ScanCode_cmp_225;  если не равно нулю
      mov [ScanCodeKeyExt],1
    call ScanCodeKey_int40_2dop; .... опросить клаву еще раз
        JMP ScanCode_m2
        
    ScanCode_cmp_225:
       cmp  eax,225 ; если доп2 код....
        jne  ScanCode_m2;  если не равно нулю
      mov [ScanCodeKeyExt],2
    call ScanCodeKey_int40_2dop; .... опросить клаву еще раз
      
    ; САМА кодировка      
    ScanCode_m2:
    mov[ScanCodeKey1], eax ; "Чистый" код     
     ; Клавиша нажата DOWN
    mov[ScanCodeKeyUD],1 ; если 0 - отжата, если 1 -нажата    
        cmp  eax,128
        jb   no_up
    ; Клавиша отжата секция UP 
     mov[ScanCodeKeyUD],0 ; если 0 - отжата, если 1 -нажата
    
    no_up:
        mov    ebx,eax
        and    ebx,0x7f
    mov [ScanCodeKey2],ebx ; обработаный код (-128 если больше 128)
    ret
    
  • Хе! :-)
    А знаете ли вы....
    что если запустить программу Scancode и открыть крышку ноута, то....
    открытие крышки ноута имеет код: 224/227 (т.е. Ext 227)

    Не знал!
  • На ноутбучной клавиатуре бывает клавиша "спящий режим". У неё тоже должен быть такой код.
  • Pathoswithin wrote:На ноутбучной клавиатуре бывает клавиша "спящий режим". У неё тоже должен быть такой код.
    Открытие крышки, работает в KlbrInWin и в QEMU, а в КОС, увы не работает! И то что ты говоришь, тоже не работает НИГДЕ! :-)
    Но у меня другие печали....
    Переделал эмуль на доп.клавиши (стрелки) это работает в KlbrInWin и в QEMU, а в КОС,- НЕ РАБОТАЕТ! Как это понимать и что с этим делать ?
    Вот попробуй прикреплённый файл запустить, в KlbrInWin, QEMU, и в КОС, должны работать стрелки и "стрельба" любой управляющей например Home, End и т.д.
    Это не работает в КОС ни на основной клаве ноута, ни на подключённой клаве к ноуту!
    Вот те и дела! :-(
    Aerocobra.7z (24.39 KiB)
    Downloaded 288 times
    Проблемой века :-) это конечно не является, так как будет предусмотрено возможность менять любая на любую, но всё равно, определённый дискомфорт, при том всём, что в эмулях KlbrInWin, QEMU оно то работает нормально.
    Попробуйте, плиз, у себя Aerocobra.7z все кто может и всем кому не лень, может это у меня чего-то не так.
  • Вот оригинал реализации в дельфи одной из команд КР580

    Code: Select all

    {SUI}
    .............
      $D6: 
      begin
     tmp1:=do_read(r_PC+1);    tmp2:=(r_A-tmp1) and $FF;    r_F:=flags[tmp2];  
       if (r_A<tmp1) then     begin      r_F:=r_F or f_C;    end;
        if (((tmp2  xor r_A  xor tmp1) and $10)<>0) then     begin      r_F:=r_F or f_A;
        end;    r_A:=tmp2;    clock:=clock+7;    r_PC:=r_PC+2;
      end;
    ...............
    
    похожих участков команд реализующих процедуру $D6 и другие процедуры-команды-кр580 очень много.

    Для более безболезненного переноса процедур-команд-кр580, в ФАСМ, а их "спаковал" вот в такое:

    Code: Select all

    ...............
    Procedure mD5m; begin m06m; m33m; end;
    Procedure mD6m; begin m47m; m75m; m09m; m76m; m36m_a:=tmp1; m36m;end;
    ...............
    {SUI}
    Procedure CD6; begin mD6m; mD5m; end;
    .........
    т.е. процедура "CD6" вызывает "mD6m" и "mD5m", а те в свою очередь еще процедуры... и те в свою очередь еще... и так долго и нудно, :-) думаю таких вложений доходит до 10, а может и более.

    Если оставить их "запакованными", то размер запускного КОС будет маленьким, но и скорость работы тоже будет маленькая (ну или же нагрузка на процессор большая, точно не знаю), если же я распакую их, то код, - длиннее, скорость работы, - быстрее.
    Вопрос: стоит ли это делать, (т.е. распаковку)?... оправдаются ли мои ожидании в увеличении быстродействия в КОС? к слову, в винде, это не ощущается (запакованные от не запакованных процедур реализующих команды КР580)... ну или слабо ощущается... ну или не всегда ощущается. Тщательных тестов по этому поводу я не делал.
    Мысленно подсчитав, что команд КР-580, точнее процедур реализующих эти команды , в 2/100 сек выполняется 10000-15000 и каждая из них с немаленькими вложениями других процедур одна-в-одну, думаю, распаковка должна дать о себе знать?!
    Спецы, что скажите ?
  • Тут надо замерять производительность. Трудно сказать, что требует больше тактов: эмулятор или вывод на экран.

    Запустил. Вместо управления какие-то глюки. А ты учитываешь, что за время ожидания, в очереди может быть несколько клавиш?
  • Pathoswithin wrote:Тут надо замерять производительность. Трудно сказать, что требует больше тактов: эмулятор или вывод на экран.
    Насколько я успел понять, в КОС всё очень чувствительно, по моему когда-то, в начале написания эмуля, я "прокуручивал" только блок команд и только вывод на экран, само-по-себе - и то, и другое само-по-себе заметно для загрузки процессора, но тогда разных видов задержек по моему еще не было. Займусь исследованием.
    Pathoswithin wrote:Запустил. Вместо управления какие-то глюки. А ты учитываешь, что за время ожидания, в очереди может быть несколько клавиш?
    Знаешь, ты мне мысль подкинул, причём обратную! :-) Задумавшись, над тем почему не с дополнительными клавишами эмуль в KOS работает нормально, а почему с дополнительными программа ScanCode в КОС работает нормально, в чём разница кода программы ScanCode и моего кода, который я в принципе взял из этой программы (ScanCode), понял следующее: что ScanCode обрабатывает клавиатуру, по факту события(ожидает события) клавиатуры, причём на абсолютно на каждый отдельный код. А у меня код спешит с опросом клавиатуры, т.е. при появлении доп. кода, мой код, сразу же опрашивает клавиатуру еще раз. В эмуляторах KlbrInWin и в QEMU почему-то такие "номера" проходят, а вот в оригинале похоже что нет.
    вот код моего опроса который я уже выкладывал :
    Spoiler:

    Code: Select all

        ; запускасть ScanCodeKey
        ;Результат обработки в
        ScanCodeKey1 rd 1 ; "Чистый" код
        ScanCodeKey2 rd 1 ; обработаный код (-128 если больше 128)
        ScanCodeKeyUD rd 1 ; если 0 - отжата, если 1 -нажата
        ScanCodeKeyExt rd 1 ; 0- обычный код; 1 - доп ext (224); 2 - доп2 ext2 (225)
    
      ScanCodeKey_int40_2dop:
         mov  eax,2  
         mcall
         shr  eax,8                   ; scancode
         and  eax,0xff
            ret
            
    ScanCodeKey:   ; START ScanCode
      mov [ScanCodeKeyExt],0
    ScanCode_m1:
     call ScanCodeKey_int40_2dop
     
        cmp  eax,224 ; если доп код....
        jne  ScanCode_cmp_225;  если не равно нулю
      mov [ScanCodeKeyExt],1
    call ScanCodeKey_int40_2dop; .... опросить клаву еще раз
        JMP ScanCode_m2
        
    ScanCode_cmp_225:
       cmp  eax,225 ; если доп2 код....
        jne  ScanCode_m2;  если не равно нулю
      mov [ScanCodeKeyExt],2
    call ScanCodeKey_int40_2dop; .... опросить клаву еще раз
      
    ; САМА кодировка      
    ScanCode_m2:
    mov[ScanCodeKey1], eax ; "Чистый" код     
     ; Клавиша нажата DOWN
    mov[ScanCodeKeyUD],1 ; если 0 - отжата, если 1 -нажата    
        cmp  eax,128
        jb   no_up
    ; Клавиша отжата секция UP 
     mov[ScanCodeKeyUD],0 ; если 0 - отжата, если 1 -нажата
    
    no_up:
        mov    ebx,eax
        and    ebx,0x7f
    mov [ScanCodeKey2],ebx ; обработаный код (-128 если больше 128)
    
    ; "единый" код
    ;ScanCodeKeyUnitedCode rd 1 ; "единый" код
    ret
    
    В ScanCode после появления события, он "прокручивается" лишь раз, а у меня как видишь
    ...............
    cmp eax,224 ; если доп код....
    ......................
    call ScanCodeKey_int40_2dop; .... опросить клаву еще раз
    ..................
    Займусь! проверю!
  • Pathoswithin wrote:Тут надо замерять производительность. Трудно сказать, что требует больше тактов: эмулятор или вывод на экран.
    Измерял! Вывод на экран требует всего лишь 5-7%, а всё остальное код! Доходит и до 40% вместе с выводом, и даже до 100% в зависимости от игрушки. Видимо надо распаковывать потихоньку, слава богу, что это безболезненно, так как всё "завязано" на ячейки памяти, а не на регистры процессора.
  • «Ну шо я могу сказать..... « (с) Л.И. Брежнев :-)
    … С дополнительными клавишами надеюсь проблема решена, пример тому вложенный файл. Это игра «Лабиринт», по мотивам ретро-машины «Агат», кстати написал игру на КР-580 для «ПК-01 Львов», - я!
    Эмулятор вполне нормально работает под КОС и KlbrInWin, а вот QEMU, - завал полный!
    В КОС и KlbrInWin разная скорость работы, хотя я с этим вряд ли что-то поделаю. Была мысль написать процедуру автоопределение и авторегулировка скорости для КОС и KlbrInWin, (в момент запуска эмуля), заключающаяся в подсчёте каких-то действий в единицу времени при запуске, и последующая калибровка скорости, но считаю, что это ничего не даст. Разные игры и программы в зависимости от, того как они написаны для «ПК-01 Львов», будут все равно по разному себя вести, в плане скорости и потребления ресурсов процессора. В общем всё сводится к тому, что при генерации игры, нужно будет указывать скорость, задержку таймера, и тип движка с определённым таймером, для какой-то конкретной среды запуска эмуля КОС, KlbrInWin или QEMU.
    В дальнейших планах, - реализовать все клавиши клавиатуры эмулятора.
    В данный момент реализованы, стрелки, пробел, «1» , «2», «3», enter. Остальные тоже работают, но их можно использовать, только там, там где «стрелять — любая» :-).
    =================================================

    Image

    Image
    Labirint.7z (22.6 KiB)
    Downloaded 283 times
  • Сегодня попробовал сделать режим 512х512, получилось не плохо, точнее говоря всё очень даже хорошо, скорость не падает, ресурсы, не «притапливает», эмуль работает не торможенно. :-) Ура!
    Перекомпилировал все игры под режим 512х512 и под стрелки. Также добавлена еще одна игра в архив, - "Bomber Man" . Скорость игр не отрегулирована, работают быстрее, чем надо, хотя по виндовым меркам, установлена нормальная скорость. То, что данные примеры работает быстрее чем надо, хорошо тем, что видно, что игры не торможенные и эмуль тоже. :-) Как я уже писал, всё равно каждую игру нужно будет регулировать отдельно, а поскольку на вкус и цвет, карандаши разные, :-) то поэтому, и нужно создавать генератор, для того, чтобы каждый мог, абсолютно любую игру эмулятора, регулировать самостоятельно, по скорости, граф.режиму и т. д. а не мне все игры компилировать. :-) Тем более игр для эмулятора не мало. Выбранных мной, имеющих статут «ничё, поиграть можно», :-) - более 130 штук.
    Games.7z (231.37 KiB)
    Downloaded 294 times
    В архиве Games.7z, находятся каталоги «_NOPack», «_Pack» в которых 9 аналогичных игр, в не запакованном и запакованном виде соответственно. Игры в ахриве: Aerocobra, Arcanoid, Bomber Man, King Valey, Rick1, Алибаба, Башня, Лабиринт, Пьяный лифтёр.
    Как всегда, эмуль и игры работают вполне нормально работает под КОС и KlbrInWin, а вот QEMU, - завал полный!
    Если есть участники которые запускали, под другими средами, например под Sun xVM VirtualBox, или в чём-то другом, прошу написать отзывы. Я не проверял не знаю, и ничего сказать не могу.

    Image

    Image

    Ну вот пока и всё. Доработка и усовершенствование эмулятора продолжается. :-)
  • ALEXS1983: Сейчас, значительно лучше. Тестировал на реальном железе. Загрузка ЦПУ[/b снизилась (где-то на 30%). Управление стрелками, работает. :)
  • Yason wrote: Загрузка ЦПУ[/b снизилась (где-то на 30%). Управление стрелками, работает. :)

    Знаю, знаю, что снизился :-) она ведь не просто сама-по-себе снизилась, это всё мои старания :-)
    См. следующее сообщение
  • 768х512. А вот как вам вот такой граф. режим, а?
    Cannon Ball
    Cannon Ball.7z (21.06 KiB)
    Downloaded 316 times
    Image
    Image
  • ALEXS1983 wrote:
    Yason wrote: Загрузка ЦПУ[/b снизилась (где-то на 30%). Управление стрелками, работает. :)

    Знаю, знаю, что снизился :-) она ведь не просто сама-по-себе снизилась, это всё мои старания :-)
    Молодец. Image :)
  • Who is online

    Users browsing this forum: No registered users and 1 guest