SAS еmulator

Все об эмуляции ПК-01 "Львов" на современных платформах
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

SAS еmulator

Post by sas9568635 »

Посты про SAS еmulator, вынесено из темы Хочу написать свой эмулятор ПК-01 Львов на Delphi.
MARAT_BEST wrote:сорсы обязательно размещу !
Неплохо бы! Я хотел бы кое чего спионерить - "реализацию портов ввода вывода", а то мне надоело мусолить с втроенным в модуль DprToLvt (PasToLvt) толком недописаным эмулятором... :D хотелось бы приступить к самому компилятору... а вот без еще толком недописанного встр.эмулятора вроде как не могу...
User avatar
Zelya
Site Admin
Posts: 1071
Joined: 24 Jul 2008, 12:05

Re: Хочу написать свой эмулятор ПК-01 Львов на Delphi

Post by Zelya »

sas9568635 wrote: ???!!!! - Да я вообще-то написал тот пост так как он по теме "Хочу написать свой эмулятор ПК-01 Львов на Delphi"...:-) т.е для MARAT_BEST если он хочет конечно...
Я ничего не имею против Ваших постов. Возможно стоило разнести свой ответ на две части. Я предложил поискать метод бысторго доступа к пикселям изображения, показав, так сказать, направление. Только вот Делфи листинг я писать не буду, ибо конкретно подзабыл синтаксис.
sas9568635 wrote: А вообще я не понимаю.... Зачем отрисовка 50 раз в сек.... У меня отрисовывает часть (8х8) экрана только во время его вывода и только то (тот 8х8) что выводится?... И все впорядке! (Это вопрос ко всем)
Ваш эмуль полностью ест одно ядро процессора, при этом, не уверен, что он держит 100% скорости. Еще раз хочу обратить внимание на в корне неверный подход к принципам эмуляции. Вы не должны эмулировать каждую команду процессора по времени. Это надо делать "пачками", считая тики в переменной. Тогда и производительность будет хорошая, да и менять ее будет элементарно (соверменные компы с легкостью тянут практически любую скорость, хоть х2 хоть х1000) оставляя fps 50.
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

Re: Хочу написать свой эмулятор ПК-01 Львов на Delphi

Post by sas9568635 »

Zelya wrote:...Еще раз хочу обратить внимание на в корне неверный подход к принципам эмуляции. Вы не должны эмулировать каждую команду процессора по времени. Это надо делать "пачками", считая тики в переменной.
Мой Эмулятор в модуле он вообщем-то и не должен быть с правильными принципами, он предназначен там дла дебагенья т.е. для пошаговой проверки и просмотра... поэтому все то что вы пишите не совсем к данному случаю... или разве что "под занавес", до которого мне еще очень далеко... :-) Я его еще не могу довести до ума хоть как-то неговоря уже про ИДЕАЛизирование...
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

Re: Хочу написать свой эмулятор ПК-01 Львов на Delphi

Post by sas9568635 »

Рассматривая код в эмуляторе...
Непойму зачем ВСЕ эти переменные определены как — INTEGER ?

Code: Select all

    r_A : INTEGER;   // регистрики
    r_B : INTEGER;
    r_C : INTEGER;
    r_D : INTEGER;
    r_E : INTEGER;
    r_H : INTEGER;
    r_L : INTEGER;
    r_F : INTEGER;
    r_PC : integer;  // адрес в памяти
    r_SP : integer; 

  tmp  : integer;
  tmp3 : integer;
  tmp2 : integer;
  tmp1 : integer;
  opcode : integer;
Я вот сделал так...

Code: Select all

var
  r_A : Integer; // регистрики
  r_B : Byte;
  r_C : Integer;
  r_D : Byte;
  r_E : word;
  r_H : Byte;
  r_L : word;
  r_F : Byte;
  r_PC : word; // адрес в памяти
  r_SP : word;


 tmp : Byte;
 tmp3 : Byte;
 tmp2 : integer;
 tmp1 : integer;
 opcode : Byte;


Не все получилось заменить на Byte; и word;

Насколько я понял увеличилось быстродействие скажем на 25%!!!???. Если я не ошибаюсь конечно.... самому странно...

Также заменил
r_PC:=r_PC+1; на Inc(r_PC); r_PC:=r_PC+2; на Inc(r_PC,2);
r_PC:=r_PC-1; на Dec(r_PC); r_PC:=r_PC-2; на Dec(r_PC,2);
clock:=clock+5;.... r_C:=r_C-1;....
и т.д.
Незнаю дает ли оно что-то или компилятор такой умный что без разницы... но по крайней мере выглядит аккуратней :-)

После того как некоторые переменные изменены с integer; на Byte;
можно повыкидывать подобное

Code: Select all

  $1B: …...
      if (r_D<0) then
      begin
        r_D:=$FF;
      end;

  $13: ….
      if (r_D>$FF) then
      begin
        r_D:=0;
      end;
вопрос: А зачем в командах
$88,;89,8B,8C и т.д. Строка -
tmp2:=tmp2+0;
Что она дает?... Можно ли ее выкинуть?...
User avatar
Zelya
Site Admin
Posts: 1071
Joined: 24 Jul 2008, 12:05

Re: Хочу написать свой эмулятор ПК-01 Львов на Delphi

Post by Zelya »

sas9568635
Замена Integer на Word/Byte не увеличит быстродействия. А вот выбрасывание кода по проверке переполнения и замена плюсиков на инкрисы может незначительно ускорить, но никак не на 25%.

Насчет строки tmp2:=tmp2+0; ничего не знаю, откуда она появилась и какой в ней смысл. Выкинуть, думаю, можно и нунжно.

Кстати, а почему некоторые регистры стали Byte, а некоторые Word, а r_C вобще Integer остался?
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

Re: Хочу написать свой эмулятор ПК-01 Львов на Delphi

Post by sas9568635 »

Zelya wrote:sas9568635
Замена Integer на Word/Byte не увеличит быстродействия. А вот выбрасывание кода по проверке переполнения и замена плюсиков на инкрисы может незначительно ускорить, но никак не на 25%.
Поменял обратно на Integer к сожалению...
Zelya wrote:Насчет строки tmp2:=tmp2+0; ничего не знаю, откуда она появилась и какой в ней смысл. Выкинуть, думаю, можно и нунжно.
Ну в исходниках ты смотрел? команды те что я написал....
Смысла никакого не вижу else tmp2:=tmp2+0;...
я подумал что это когда "перепиливалось" от туда, от куда нельзя без else...
ну вот и вписали лишьбы что-то было...
А где такое есть?... в джаваскриптах есть? ну если then то и обязательно ветка else?..
Zelya wrote: Кстати, а почему некоторые регистры стали Byte, а некоторые Word, а r_C вобще Integer остался?
Я было пытался все их сделать Byte и Word и проверял на работоспособность... вот поэтому так и получилось... ну теперь то уже вернул обратно... там есть команды в которых есть проверка на отрицательное прежде чем его исхользовать как байт-положительное и т.д.
NeoSpectruman
Posts: 145
Joined: 21 Aug 2012, 22:30

Re: Хочу написать свой эмулятор ПК-01 Львов на Delphi

Post by NeoSpectruman »

немного офтопика

sas9568635
SAS еmulator 1.0Beta ?
ваше?
http://zx.pk.ru/showthread.php?t=21543

зачем 4 раза упоминать "вирусов нет"

от этого
складывается мнение "что они там есть"
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

Re: Хочу написать свой эмулятор ПК-01 Львов на Delphi

Post by sas9568635 »

NeoSpectruman wrote: sas9568635
SAS еmulator 1.0Beta ?
ваше?
http://zx.pk.ru/showthread.php?t=21543
Моё!
NeoSpectruman wrote: зачем 4 раза упоминать "вирусов нет"
от этого складывается мнение "что они там есть"
Я про вирусы было вообще забыл...
Скачал было инсталятор Дельфи 7, а он был заражен каким-то вроде безвредным вирусом, но распространняемым по скомпилированным екзешникам... я бы ничего и не знал если бы не сервис http://f-bit.ru который отказал размещать мой архив из-за наличия вируса... после чего я «вернулся» к предыдущему Дельфи6 и скомпилировал в нём... перестраховался проверил ДокторВебом онлайн... вот поетому и пишу, что на вирусы проверен... а если так каким-то образом что-то окажется, я ведь ни виноват! Проверяйте файлы так как Вы считаете нужным!
User avatar
Zelya
Site Admin
Posts: 1071
Joined: 24 Jul 2008, 12:05

Re: Хочу написать свой эмулятор ПК-01 Львов на Delphi

Post by Zelya »

По просьбам трудящихся на этой же машине потестил SASEmulator 1.2. Почему-то первый запуск был крайне медленным. Но зато потом все остальные работали явно шустрее. Как минимум, скорость при 256х256 выглядит почти идеальной. Порадовала смена расширения, огорчило отсутствие звука. Еще из особо неудобных вещей - невозможность сделать скриншот, нет подписей к кнопкам тулбара, кнопки не продублированы в меню и пропадают при уменьшении экрана, контролы со звездочками (те что стают красные) слишком уж странные, нельзя как-то переделать?
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

Re: Хочу написать свой эмулятор ПК-01 Львов на Delphi

Post by sas9568635 »

Zelya wrote:Оказывается SASEmulator глючит не единоразово. Не знаю с чем связано, но он крайне капризно реагирует на какие-то ресурсы, так как иногда работает быстрее, чем LVOVulator, но иногда просто ужасно тормозит.
Сам не пойму! Поэтому и в инструкции к программе написал:
Притормаживание вывода на экран. При расширении формы эмулятора на весь экран возможно притормаживание вывода на экран. Я все усилия приложил для того, чтобы этого не было. Но оно бывает наблюдается и я не пойму почему. Вроде как само «приходит» и «уходит» Если возникла такая ситуация. То возможны следующие варианты выхода из нее: (во всяком случае у меня получалось)
1. Попробуйте, нажать Паузу и минут на 10 оставить комп «в покое», сходить покурить, например
2. Можно попробовать перезагрузку компа.
3. В зависимости от системы можно попробовать поменять «битность» экрана с 16бит на 32бит или наоборот.
4. Можно просто попробовать запустить эмулятор позже
   Я надеюсь, что это (притормаживание) только у меня на компе, так как мой ноутбук ограничен в видеопамяти, на других компах я не испытывал эмулятор. У других, желающих использовать мой эмулятор, будет все в порядке!
Вывод на экран у меня делается через StretchDraw остальное я убрал, может добавить все-таки еще
обычный Draw?...
Zelya wrote: Это полезная фича. Но если говорить о слабых машинах, то куда полезнее фреймскип.
А что это такое?... Поточнее можно?
MARAT_BEST wrote:Сейчас вся эмуляция выведена на таймер, стандартный ,
Ты хочешь сказать что если стандартный таймер заменить чем-то другим например RDTSC то будет всё в порядке?... Хм.. надо попробывать. Но говорят, RDTSC очень нестабилен (неточный)..
MARAT_BEST wrote:который глючит и очень зависит от ресурсов машины, по этому подумываю про Directx
А можешь ссылку дать куда надо ткнуться, чтобы понять как это делать т. е. через Directx
MARAT_BEST wrote:только графика, звук и таймер. насколько я помню в win95 он появился как раз (Directx)
в 98 уже был!
User avatar
Zelya
Site Admin
Posts: 1071
Joined: 24 Jul 2008, 12:05

Re: Хочу написать свой эмулятор ПК-01 Львов на Delphi

Post by Zelya »

Вывод на экран у меня делается через StretchDraw остальное я убрал, может добавить все-таки еще
обычный Draw?...
Понятия не имею. Просто пару раз запустился с приятной скоростью. Но пару раз просто неиграбельный ужас.
А что это такое?... Поточнее можно?
Пропуск кадров. Кода программа не успевает отрисовывать заданный FPS, то она может пропускать несколько кадров, не рисуя их. Но, как правильно заметил MARAT_BEST для "Львова" фреймскип модет нести тяжеліе последствия в виде серьезнейшего мерцания или даже пропадания спрайтов.
в 98 уже был!
В 95-м уже был. Главное не использовать фичи новейших версий. Хотя, я тут почитал, вроде даже 9-й встает на 95-ку. Так что все норм, но лучше не увлекаться.
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

Re: Хочу написать свой эмулятор ПК-01 Львов на Delphi

Post by sas9568635 »

MARAT_BEST wrote:набери в гугле или яндексе delphi dirextx ... двумя словами не расскажешь :roll:
Да набирал... было... и не один раз... понаскачивал всякой фигни... :-) ничего не устраивает... "потеть" над всем тем надо не на шутку... :-)
MARAT_BEST wrote: новая версия
У тебя новые версие ежедневно выходят?!... :-) Как свежие газеты?!.. :-)
MARAT_BEST wrote: сделал так чтобы не главные формы создавались только по необходимости
Хм.. И что оно дало?... Считаю, что зря это делал. Нет смысла и т.д.
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

Re: Хочу написать свой эмулятор ПК-01 Львов на Delphi

Post by sas9568635 »

Марат обрати внимание!... может нет смысла замораживаться на всяких директИксах...
Вот я написал на форумы
Вот таймер 1 который временами дает глюки...

Code: Select all

procedure TMainFormEmu.TimerMainTimer(Sender: TObject);
begin
 i8080_do_opcodes(opcodes_to_run);// блок команд КР580
RefreshScreen;// перечертить экран
end;
Вот таймер 2 который будет в следующей версии(в меню можно будет выбрать способ вывода 1 или 2) Этом таймер я еще не проверил так как глюков не появлялось...
RDTSCfirstStart — флаг первого запуска, необращай внимания
GetTestRDTSC_ - измерянное кол-во таков RDTSC в 1 сек
RDTSCbak- бывшее состояние RDTSC
RDTSC1fps — колво тактов RDTSC в 1/50 секунду при FPS=50
RDTSC — текущее RDTSC

Code: Select all

function RDTSC: int64; assembler; asm  db $0F,$31 end;

procedure TMainFormEmu.TimerRDTSCTimer(Sender: TObject);
begin
if not RDTSCfirstStart then begin RDTSCfirstStart:=True; RDTSCbak:=RDTSC; end;//первый запуск таймера
RDTSC1fps:=Round((GetTestRDTSC_/FPS)*{поправка}(100/173));
if RDTSC >= RDTSCBAK+RDTSC1fps then begin
RDTSCbak:=RDTSC; RDTSCBAK:=RDTSCBAK+RDTSC1fps;
 i8080_do_opcodes(opcodes_to_run);// блок команд КР580
RefreshScreen;// перечертить экран
end;
Соль второго таймера, что отсчёт времени начинается СРАЗУ после того как закончился предыдущий отсчёт времени (RDTSCbak:=RDTSC; RDTSCBAK:=RDTSCBAK+RDTSC1fps;) и процедуры ( i8080_do_opcodes(opcodes_to_run) RefreshScreen;) выполняются когда «часики уже тикают»....
А вот в первом, врядле так оно. Поетому я хочу в 1 таймере вынести выполнение за пределы таймера т. е. чтобы они выполнялись по end-таймеру....
Правильно ли я мыслю?.... даст ли это чего?..
Марат! Я все это к тому. что есть другие способы вот такие как я пишу и прочие... а для ретро машин (ретро эмуляторов) заморачиваться на Директах... стоит ли?.. особенно если еще изучать нужно
User avatar
Zelya
Site Admin
Posts: 1071
Joined: 24 Jul 2008, 12:05

Re: Хочу написать свой эмулятор ПК-01 Львов на Delphi

Post by Zelya »

заморачиваться на Директах... стоит ли?
Стоит. Однозначно :).
sas9568635
Posts: 372
Joined: 20 Apr 2012, 16:00
Location: Конотоп

Re: Хочу написать свой эмулятор ПК-01 Львов на Delphi

Post by sas9568635 »

Zelya wrote:
заморачиваться на Директах... стоит ли?
Стоит. Однозначно :).
Я иммею ввиду для таких целей как эмуляторы (мой и Марата)?!.. Считаешь что стОит?..
Ну пусть Марат напишет на директе :-) а я посмотрю ! :-)
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest