PC-01 Lviv

It is currently 19 Mar 2024, 11:37

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00




Post new topic  Reply to topic  [ 26 posts ]  Go to page 1 2 Next
Author Message
 Post subject: SAS еmulator
PostPosted: 15 Sep 2012, 20:48 
Offline

Joined: 20 Apr 2012, 16:00
Posts: 372
Location: Конотоп
Посты про SAS еmulator, вынесено из темы Хочу написать свой эмулятор ПК-01 Львов на Delphi.
Quote:
сорсы обязательно размещу !
Неплохо бы! Я хотел бы кое чего спионерить - "реализацию портов ввода вывода", а то мне надоело мусолить с втроенным в модуль DprToLvt (PasToLvt) толком недописаным эмулятором... :D хотелось бы приступить к самому компилятору... а вот без еще толком недописанного встр.эмулятора вроде как не могу...


Top
   
PostPosted: 17 Sep 2012, 19:28 
Offline
Site Admin
User avatar

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


Top
   
PostPosted: 17 Sep 2012, 21:21 
Offline

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


Top
   
PostPosted: 19 Nov 2012, 10:27 
Offline

Joined: 20 Apr 2012, 16:00
Posts: 372
Location: Конотоп
Рассматривая код в эмуляторе...
Непойму зачем ВСЕ эти переменные определены как — INTEGER ?
Code:
    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:
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:
  $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;
Что она дает?... Можно ли ее выкинуть?...


Top
   
PostPosted: 19 Nov 2012, 13:16 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
sas9568635
Замена Integer на Word/Byte не увеличит быстродействия. А вот выбрасывание кода по проверке переполнения и замена плюсиков на инкрисы может незначительно ускорить, но никак не на 25%.

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

Кстати, а почему некоторые регистры стали Byte, а некоторые Word, а r_C вобще Integer остался?


Top
   
PostPosted: 19 Nov 2012, 15:01 
Offline

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


Top
   
PostPosted: 04 Jul 2013, 20:33 
Offline

Joined: 21 Aug 2012, 22:30
Posts: 145
немного офтопика

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

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

от этого
складывается мнение "что они там есть"


Top
   
PostPosted: 04 Jul 2013, 20:58 
Offline

Joined: 20 Apr 2012, 16:00
Posts: 372
Location: Конотоп
Quote:
sas9568635
SAS еmulator 1.0Beta ?
ваше?
http://zx.pk.ru/showthread.php?t=21543
Моё!
Quote:
зачем 4 раза упоминать "вирусов нет"
от этого складывается мнение "что они там есть"
Я про вирусы было вообще забыл...
Скачал было инсталятор Дельфи 7, а он был заражен каким-то вроде безвредным вирусом, но распространняемым по скомпилированным екзешникам... я бы ничего и не знал если бы не сервис http://f-bit.ru который отказал размещать мой архив из-за наличия вируса... после чего я «вернулся» к предыдущему Дельфи6 и скомпилировал в нём... перестраховался проверил ДокторВебом онлайн... вот поетому и пишу, что на вирусы проверен... а если так каким-то образом что-то окажется, я ведь ни виноват! Проверяйте файлы так как Вы считаете нужным!


Top
   
PostPosted: 04 Sep 2013, 00:19 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
По просьбам трудящихся на этой же машине потестил SASEmulator 1.2. Почему-то первый запуск был крайне медленным. Но зато потом все остальные работали явно шустрее. Как минимум, скорость при 256х256 выглядит почти идеальной. Порадовала смена расширения, огорчило отсутствие звука. Еще из особо неудобных вещей - невозможность сделать скриншот, нет подписей к кнопкам тулбара, кнопки не продублированы в меню и пропадают при уменьшении экрана, контролы со звездочками (те что стают красные) слишком уж странные, нельзя как-то переделать?


Top
   
PostPosted: 04 Sep 2013, 14:17 
Offline

Joined: 20 Apr 2012, 16:00
Posts: 372
Location: Конотоп
Quote:
Оказывается SASEmulator глючит не единоразово. Не знаю с чем связано, но он крайне капризно реагирует на какие-то ресурсы, так как иногда работает быстрее, чем LVOVulator, но иногда просто ужасно тормозит.
Сам не пойму! Поэтому и в инструкции к программе написал:
Quote:
Притормаживание вывода на экран. При расширении формы эмулятора на весь экран возможно притормаживание вывода на экран. Я все усилия приложил для того, чтобы этого не было. Но оно бывает наблюдается и я не пойму почему. Вроде как само «приходит» и «уходит» Если возникла такая ситуация. То возможны следующие варианты выхода из нее: (во всяком случае у меня получалось)
1. Попробуйте, нажать Паузу и минут на 10 оставить комп «в покое», сходить покурить, например
2. Можно попробовать перезагрузку компа.
3. В зависимости от системы можно попробовать поменять «битность» экрана с 16бит на 32бит или наоборот.
4. Можно просто попробовать запустить эмулятор позже
   Я надеюсь, что это (притормаживание) только у меня на компе, так как мой ноутбук ограничен в видеопамяти, на других компах я не испытывал эмулятор. У других, желающих использовать мой эмулятор, будет все в порядке!
Вывод на экран у меня делается через StretchDraw остальное я убрал, может добавить все-таки еще
обычный Draw?...
Quote:
Это полезная фича. Но если говорить о слабых машинах, то куда полезнее фреймскип.
А что это такое?... Поточнее можно?
Quote:
Сейчас вся эмуляция выведена на таймер, стандартный ,
Ты хочешь сказать что если стандартный таймер заменить чем-то другим например RDTSC то будет всё в порядке?... Хм.. надо попробывать. Но говорят, RDTSC очень нестабилен (неточный)..
Quote:
который глючит и очень зависит от ресурсов машины, по этому подумываю про Directx
А можешь ссылку дать куда надо ткнуться, чтобы понять как это делать т. е. через Directx
Quote:
только графика, звук и таймер. насколько я помню в win95 он появился как раз (Directx)
в 98 уже был!


Top
   
PostPosted: 04 Sep 2013, 14:23 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
Quote:
Вывод на экран у меня делается через StretchDraw остальное я убрал, может добавить все-таки еще
обычный Draw?...
Понятия не имею. Просто пару раз запустился с приятной скоростью. Но пару раз просто неиграбельный ужас.
Quote:
А что это такое?... Поточнее можно?
Пропуск кадров. Кода программа не успевает отрисовывать заданный FPS, то она может пропускать несколько кадров, не рисуя их. Но, как правильно заметил MARAT_BEST для "Львова" фреймскип модет нести тяжеліе последствия в виде серьезнейшего мерцания или даже пропадания спрайтов.
Quote:
в 98 уже был!
В 95-м уже был. Главное не использовать фичи новейших версий. Хотя, я тут почитал, вроде даже 9-й встает на 95-ку. Так что все норм, но лучше не увлекаться.


Top
   
PostPosted: 05 Sep 2013, 09:47 
Offline

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


Top
   
PostPosted: 05 Sep 2013, 09:51 
Offline

Joined: 20 Apr 2012, 16:00
Posts: 372
Location: Конотоп
Марат обрати внимание!... может нет смысла замораживаться на всяких директИксах...
Вот я написал на форумы
Quote:
Вот таймер 1 который временами дает глюки...
Code:
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:
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-таймеру....
Правильно ли я мыслю?.... даст ли это чего?..
Марат! Я все это к тому. что есть другие способы вот такие как я пишу и прочие... а для ретро машин (ретро эмуляторов) заморачиваться на Директах... стоит ли?.. особенно если еще изучать нужно


Top
   
PostPosted: 05 Sep 2013, 10:23 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
Quote:
заморачиваться на Директах... стоит ли?
Стоит. Однозначно :).


Top
   
PostPosted: 05 Sep 2013, 11:36 
Offline

Joined: 20 Apr 2012, 16:00
Posts: 372
Location: Конотоп
Quote:
Quote:
заморачиваться на Директах... стоит ли?
Стоит. Однозначно :).
Я иммею ввиду для таких целей как эмуляторы (мой и Марата)?!.. Считаешь что стОит?..
Ну пусть Марат напишет на директе :-) а я посмотрю ! :-)


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 26 posts ]  Go to page 1 2 Next

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
cron
Powered by phpBB® Forum Software © phpBB Limited