101

podczas emulacji z80 napotykam na rozkazy typu:

1.zaladuj jakis rejestr do akumulatora
2.wykonaj jakas operacje logiczna/arytmetyczna
3.zapisz wynik w poprzednim rejestrze

lub

1. petle z ldir (przesuwanie pamiec-pamiec)

itp...

podczas emulacji tracimy sporo czasu na interpretacje kazdego rozkazu osobno...

z80 ma prefixy, w tablicy rozkazow po prefixie jest duzo wolnego miejsca, mozna zrobic tak,
ze w kodzie (ingerencja w kod programu z80) gdy trafimy na taki kod jak z przykladu wsadzamy prefix i kod makro.

makro moze dzialac nawet szybciej niz zlepek rozkazow na z80, zwlaszcza przy podprogramach.

kolejna sprawa to jaka mozna miec motywacje podczas przenoszenia jakiejs gry z trumny na atari (poprzez emulacje)?
podpisac sie pod taka praca nie mozna, samej dlubaniny przy dekompilacji i wyszukiwaniu
podprogramow, ktore nie sa samomodyfikowane przez program cala masa...
jak znajdzie sie ktos, kto odwali czarna robote czyli deasembluje jakas gre, wydzieli z niej kod i dane to razem mozemy przeniesc taka gre na atari z predkoscia zblizona do oryginalu (jesli bedzie za wolno, wieksze czesci kodu z80 przepisze na 6502)

ordynarna emulacja jak pokazalem wczesniej jest za wolna do takich zabaw - ok 6% to zenada.

http://atari.pl/hsc/ad.php?i=1.

102

xxl napisał/a:

1.zaladuj jakis rejestr do akumulatora
2.wykonaj jakas operacje logiczna/arytmetyczna
3.zapisz wynik w poprzednim rejestrze

To może - acz oczywiście, nie musi - zależeć od stylu programowania jednej osoby. Można wsadzić w emulator rozpoznawanie określonych sekwencji, to jest łatwe, problem w tym, żeby wiedzieć, które z nich są typowe dla programowania w Z80, a które przyspieszają tylko jeden program, albo zgoła jeden jego kawałek (natomiast pozostałe zwalniają).

KMK
? HEX$(6670358)

103 Ostatnio edytowany przez xxl (2007-02-19 10:44:24)

akurat ten przyklad jest nagminny, jak narazie w kazdym programie znalazlem taka/podobna konstrukcje:

daleko szukac... w romie spectrum tez tak jest ;-)

wynika to miedzy innymi ze specyficznej organizacji pamieci ekranu.

http://atari.pl/hsc/ad.php?i=1.

104

w kodzie (ingerencja w kod programu z80) gdy trafimy na taki kod jak z przykladu wsadzamy prefix i kod makro.

To już nie będzie emulacja, tylko przerabianie.

jak znajdzie sie ktos, kto odwali czarna robote czyli deasembluje jakas gre, wydzieli z niej kod i dane to razem mozemy przeniesc

To załóż nowy topic :) Widać, że xxl-owi chodzi o przenoszenie gierek, a np. draco o napisanie emulatora, na którym będzie działać dowolny program. Ja jestem za tym drugim rozwiązaniem.

Czy możecie wyjaśnić, Stirlitz, dlaczego wasz służbowy adres stirlitz@rsha.gov.de ma aliasa justas@gru.su?
Nie czytam PM. Proszę używać e-mail.

105

xxl napisał/a:

daleko szukac... w romie spectrum tez tak jest ;-)

Ja nie zauważyłem, żeby na ogólnym tle kodu znajdującego się w ROM-ie Spectrum takie sekwencje występowały jakoś szczególnie często. Poza tym nawet jeśli, i nawet jeśli są związane z obsługą pamięci ekranu, to i tak niewiele z tego, bo akurat procedury ekranowe nie stanowią większości wykonywanego kodu. Popatrz sobie, ile czasu po wydaniu komendy CIRCLE Spectrum "myśli", a ile czasu rysuje...

KMK
? HEX$(6670358)

106

Ideę zaproponowaną przez XXLa wcale nie trudno zaimplementować w postaci swoistego JITera (hehe, jestem następny ;P). Mieli byśmy dwie procedury emulujące. Normalną i analizującą. Ta druga obok normalnego wykonywania rozkazów Z80 posiadałaby prosty (i szybki) automat skończony potrafiący rozpoznawać wzorce z biblioteki. Po znalezieniu pasującego wzorca wstawiali byśmy w odpowiednie miejsce patcha (prefix+kod) odpalającego odpowiednik w 6502. Bibliotekę pisałoby się ręcznie, a prosty skrypt mógłby generować na jej podstawie stany wspomnianego automatu, które ładowałoby się do emulatora. Emulując program mieli byśmy opcję przełączania pomiędzy dwiema procedurami emulującymi (bo analizująca jednak byłaby trochę wolniejsza i musiała by być jako opcja, bo nie ma sensu wielokrotnie analizować tego samego kodu).

Musimy tylko dowiedzieć się, które wolne miejsce na pewno są wolne, a nie zajęte przez jakieś używane nielegale.

107 Ostatnio edytowany przez drac030 (2007-02-19 12:33:39)

laoo/ng napisał/a:

Musimy tylko dowiedzieć się, które wolne miejsce na pewno są wolne, a nie zajęte przez jakieś używane nielegale.

Z tego, co mi wiadomo, żadne nie są wolne: "puste" miejsca w tabeli oznaczają rozkazy, które po dodaniu prefiksu działają tak samo, jak odpowiedniki bez prefiksu. Dokumentacja, którą czytałem sugeruje, że bywa to używane do utrudnienia analizy kodu (bo większość disasemblerów się na tym ponoć wykłada).

Jest jeszcze jeden problem, przynajmniej jeśli idzie o wersję dla 6502 - miejsce w pamięci. Według moich obliczeń taki sobie prosty emulator powinien zająć całą pamięć 130XE (odjąć miejsce na DOS). Rozszerzenia ponad 128k niestety niewiele tu dadzą.

KMK
? HEX$(6670358)

108 Ostatnio edytowany przez xxl (2007-02-19 12:46:30)

> Ja nie zauważyłem, żeby na ogólnym tle kodu znajdującego się w ROM-ie Spectrum takie sekwencje występowały jakoś szczególnie często.

oj bardzo czesto i nie koniecznie zwiazane z rysowaniem na ekranie - chociaz w giercach to jest bardzo widoczne i sekwencje sa dluzsze, wracajac do romu trumny pierwszy lepszy wielokrotny przyklad

ld a,r
or r / and r

zerkam teraz na jakies procki z romu ... cale procedurki mozna by bylo zastapic niekiedy.

@laoo no wlasnie nie bardzo automat, a co gdy podmieniany wzor bedzie grafika albo jakimis innymi danymi? po to wlasnie trzeba by bylo robic reczna deasemblacje i tylko kod poddawac patchowaniu.

> Z tego, co mi wiadomo, żadne nie są wolne: "puste" miejsca w tabeli oznaczają rozkazy, które po dodaniu prefiksu działają tak samo, jak odpowiedniki bez prefiksu. Dokumentacja, którą czytałem sugeruje, że bywa to używane do utrudnienia analizy kodu (bo większość disasemblerów się na tym ponoć wykłada).

heh no nie przesadzaj, ile takich programow znajdziesz? 1%? watpie

a co do zajetosci pamieci - nie ma potrzeby implementowania WSZYSTKICH rozkazow, po dekompilacji i wydzieleniu kodu z80 sprawdzamy z czego mozna zrezygnowac a jak jestesmy hardcoreowcami to sprawdzamy na jakich bitach w rej statusu program nie kozysta i zalaczamy wersje rozkazow emulujacych bez ustawiania odpowiednich bitow :D to by bylo cos.


---
@ laoo nie doczytalem Twojej wypowiedzi, teraz ja zrozumialem dopiero. masz racje. nie potrzeba by bylo dekompilacji robic.

http://atari.pl/hsc/ad.php?i=1.

109 Ostatnio edytowany przez drac030 (2007-02-19 12:43:41)

xxl napisał/a:

oj bardzo czesto

To zrób i pochwal się, ile ci to dało :-)

xxl napisał/a:

heh no nie przesadzaj, ile takich programow znajdziesz?

Wystarczy jeden.

a co do zajetosci pamieci - nie ma potrzeby implementowania WSZYSTKICH rozkazow, po dekompilacji i wydzieleniu kodu z80 sprawdzamy z czego mozna zrezygnowac

Jak już bystro zauważył dely, ty nie mówisz o emulatorze (czyli offtopikujesz w tej chwili :P)

KMK
? HEX$(6670358)

110

XXL: ale analiza będzie on-line podczas wykonywania programu. To samo co przeczyta Z80 przeczyta też analizujący automat więc podmianie będzie ulegał tylko conajmniej raz wykonany kod.
A co do pustych miejsc, to mam nadzieję, że chyba jakieś się znajdzie. Jakiś super nielegal crashujący procesor powinien się nadać, a po nim można zakodować symbol makra.

111 Ostatnio edytowany przez drac030 (2007-02-19 12:52:49)

laoo: grupy $x2 w zecie to chyba nie ma :P Ale jeśli chodzi nie o Z80, a o Spectrum, to RST 38H powinien się nadać, jest to legalny rozkaz, ale przypuszczalnie nieużywany (przynajmniej wprost).

KMK
? HEX$(6670358)

112 Ostatnio edytowany przez xxl (2007-02-19 12:55:51)

> To zrób i pochwal się, ile ci to dało :-)

ok. :-)
podaj liczbe cykli wykoania takiego czegos:

ld a,b
or c

a ja pochweale sie ile by to zajelo :-)


> Wystarczy jeden.

masz ambicje zrobic emulator 100%? komus sie to udalo?


> Jak już bystro zauważył dely, ty nie mówisz o emulatorze

tak? to o czym?

@ laoo nie doczytalem Twojej wypowiedzi, teraz ja zrozumialem dopiero. masz racje. nie potrzeba by bylo dekompilacji robic.

http://atari.pl/hsc/ad.php?i=1.

113

xxl napisał/a:

> To zrób i pochwal się, ile ci to dało :-)

ok. :-)
podaj liczbe cykli wykoania takiego czegos:

ld a,b
or c

a ja pochweale sie ile by to zajelo :-)

Jestem poza domem i tak z głowy ci cykli nie wyliczę. A poza tym, nie czytasz uważnie: nie interesuje mnie, ile BY to (te dwa rozkazy) zajęło cykli, tylko ILE CI TO DAŁO w ogólnej wydajności emulca :P

masz ambicje zrobic emulator 100%? komus sie to udalo?

Popatrz i przyznaj, to nie było zbyt inteligentne pytanie :P

tak? to o czym?

Zob. post #104.

KMK
? HEX$(6670358)

114 Ostatnio edytowany przez xxl (2007-02-19 13:06:22)

> Zob. post #104.

zob. jit ;-)

---

@laoo, co wiecej, mozna by bylo z kodu emulca usunac wszystko nie potrzebne do koncowej emulacji danego programu.

http://atari.pl/hsc/ad.php?i=1.

115

xxl napisał/a:

> Zob. post #104.

zob. jit ;-)

Zob. post #108 i nie trac watku własnych wypowiedzi. Co do JIT-a, zob. post #3 i #107 ;)

KMK
? HEX$(6670358)

116

> Zob. post #108 i nie trac watku własnych wypowiedzi.

Tez powinienes przeczytac

> Co do JIT-a, zob. post #3 i #107

obejrzyj tez wiki

http://atari.pl/hsc/ad.php?i=1.

117 Ostatnio edytowany przez drac030 (2007-02-19 13:20:50)

Post czytałem, a żeby wiedzieć, co to jest JIT, nie muszę sięgać do wikipedii :P Ale rozumiem twoje podekscytowanie, dla ciebie to nowość, ideę zakumałeś dwa posty wyżej, prawie kazdy tak reaguje :)

KMK
? HEX$(6670358)

118

idee 'zakumalem' wczesniej, dwa posty temu idea zostala nazwana jit :-)

http://atari.pl/hsc/ad.php?i=1.

119

No to skoro już kojarzysz nazwę (która się pojawiła w tym wątku 116 postów temu) z tym, co ona oznacza, możesz teraz ruszyć do dzieła i pochwalić się, co to daje (oraz ile tego ci się zmieściło w pamięci, zob. posty #3 i #107).

KMK
? HEX$(6670358)

120

drac030 napisał/a:

Jest jeszcze jeden problem, przynajmniej jeśli idzie o wersję dla 6502 - miejsce w pamięci. Według moich obliczeń taki sobie prosty emulator powinien zająć całą pamięć 130XE (odjąć miejsce na DOS). Rozszerzenia ponad 128k niestety niewiele tu dadzą.

Trochę wariacki pomysł, ale przedyskutować można w końcu wszystko :) Otóż zamiast pamięć z80 dzielić na 4 banki po 16k można podzielić np. na 16 banków po 4 k, a pozostałe 12k pamięci w banku można przeznaczyć na "dynamicznie ściągane" z repozytorium w innych bankach przekompilowane makra. Wystarczy, że makra będą kodem relokowalnym (teraz o to nie trudno) i automat analizujący kod z80 po napotkaniu fragmentu, który można by zjitować sprawdzałby, czy w aktualnym banku jest obsługujące go makro i jeśli nie, to je ściągał.

xxl napisał/a:

>@laoo, co wiecej, mozna by bylo z kodu emulca usunac wszystko nie potrzebne do koncowej emulacji danego programu.

Wykorzystując wcześniejszy pomysł można dokonać podziału na rozkazy często i rzadko używane. Obsługa tych często używanych byłaby standardowo w pamięci podstawowej, a te rzadsze byłyby umieszczane w operacyjnej części banku, w którym napotkano dany rozkaz.

Niestety kod byłby niestabilny, bo w najgorszym scenariuszu może zabraknąć pamięci na kod obsługi, ale coś za coś. Można mieć wolną, ale pewniejszą wersję, albo hakerską, ale bez 100% gwarancji, że zadziała :)

121

> (oraz ile tego ci się zmieściło w pamięci, zob. posty #3 i #107).

zob. post 108 (kolejny raz tym razem ze zrozumieniem) i 114
prosciej: nie potrzeba pakowac calej emulacji tylko to co jest potrzebne do emulacji konkretnego programu.

http://atari.pl/hsc/ad.php?i=1.

122

xxl napisał/a:

> nie potrzeba pakowac calej emulacji tylko to co jest potrzebne do emulacji konkretnego programu.

Post #104, tym razem ze zrozumieniem (może ty go nie widzisz, ewentualnie nie widzisz w całości?)

KMK
? HEX$(6670358)

123

laoo/ng napisał/a:

Trochę wariacki pomysł, ale przedyskutować można w końcu wszystko :) Otóż zamiast pamięć z80 dzielić na 4 banki po 16k można podzielić np. na 16 banków po 4 k, a pozostałe 12k pamięci w banku można przeznaczyć na "dynamicznie ściągane" z repozytorium w innych bankach przekompilowane makra. Wystarczy, że makra będą kodem relokowalnym (teraz o to nie trudno) i automat analizujący kod z80 po napotkaniu fragmentu, który można by zjitować sprawdzałby, czy w aktualnym banku jest obsługujące go makro i jeśli nie, to je ściągał.

Myślałem o tym, acz trochę w innej konfiguracji (nie 16x4, tylko 8x8). Jednakowoż mam tylko 130XE jako tymczasową maszynę, a na niej ani 16 ani 8 banków nie wyciągnę :) Natomiast jak mój komputer do mnie w końcu wróci, problem "banków" przestanie istnieć. Tak więc dałem sobie spokój.

KMK
? HEX$(6670358)

124 Ostatnio edytowany przez laoo/ng (2007-02-19 14:02:59)

Podział jest oczywiście umowny. Zależny jeszcze od tego ile kodu z80 udałoby się zjitować. Jeśli mało, to podział banku pół na pół w zupełności by wystarczył. A może także i to dałoby się skonfigurować podczas działania emulatora? (jak ktoś ma więcej pamięci, to może sobie pozwolić na więcej).

A co do zniknięcia problemu banków, to na dzień dzisiejszy ten problem zniknie tylko dla trzech (?) ludzi, a cała reszta wolałaby jednak wersję na pamięć PORTB (chociaż taki poważny program na pewno przyczyniłby się do produkcji warpów tudzież f7).

125

laoo/ng napisał/a:

A co do zniknięcia problemu banków, to na dzień dzisiejszy ten problem zniknie tylko dla trzech (?) ludzi, a cała reszta wolałaby jednak wersję na pamięć PORTB (chociaż taki poważny program na pewno przyczyniłby się do produkcji warpów tudzież f7).

Trochę na to liczę - że karty, czy to warpy czy f7 będą chętniej budowane, jeśli będzie na początek przynajmniej parę programów pozwalających wykorzystać - a przede wszystkim zobaczyć - ich możliwości.

Co do "zwykłej" wersji na pamięć bankowaną i 6502, to taki emulator-interpreter już prawie jest. Do jita na bankowanej pamięci nie będę podchodził, bo jak mówię, w 130XE nawet bez tego kod się ledwie zmieści... a na pamięci liniowej w f7 czy warpie zaprogramuje się to wszystko od nowa i inaczej.

KMK
? HEX$(6670358)