1

witam,

zastanawiam sie nad mozliwoscia emulacji procesora z80 na 6502. chcialbym sie dowiedziec jakie sa Wasze przemyslenia na ten temat.

- szybkosc dzialania,
- wielkosc i umiejscowienie pamieci emulowanego proca

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

2

Szkoda, że nie byłeś na ostatnim sztabie w Warszawie. Postaraj się skontaktować z Pirxem, też op tym mocno myślał (i rozmawiał z Drakiem). Z tego, co pamietam (jako laik):
- sporo operacji z Z80 mozna stablicować, bo się powtarzają w pętli;
- prędkość działania na 6502 powinna być w tym przypadku zadowalająca (był poruszany temat emulacji ZX81, a w przyszłości ZX Spectrum), w niektórych przypadkach większa niż w ZX Spectrum (patrz pkt. 1), w innych wolniejsza;
Ja jestem za.

Sikor umarł...

3 Ostatnio edytowany przez drac030 (2007-01-30 12:00:21)

Ja (jak już niektórzy wiedzą) od czasu sztabu wyszedłem nieco poza same przemyślenia. Konkretnie napisałem trochę kodu - i rezultat jest niezadowalający. Zresztą chyba pirx doszedł już przedtem do takich samych wniosków.

To co zrobiłem, to emulator "klasyczny" (z pętlą interpretującą kolejne rozkazy). 64k pamięci Z80 to cztery (z pięciu) banków pamięci znajdujących się w 130XE pod adresami $4000-$7FFF. Maszyna emulowana to ZX Spectrum, więc w jednym z banków jest ROM systemu operacyjnego, w pozostałych RAM (łącznie z pamięcią obrazu).

Sekwencja dekodująca opkod ma w "best case" 9 rozkazów 6502 zajmujących 32 cykle (worst case jest dużo gorszy - 15 rozkazów, 54 cykle - ale występuje tylko w 0,94% wszystkich przypadków). Tyle dokładnie czasu wykonuje się NOP. NOP na Z80 zajmuje 4 cykle, a że Spectrum ma zegar 3,5 MHz, więc te 4 cykle trwają tyle, co dwa na Atari. Ergo, taki NOP wykonuje się idealnie z wydajnością 6,25% oryginału, a w rzeczywistości - ze względu na działalność Antica - nieco ponad 4%. Taką też szybkość - 4% oryginału - rozwija ZX OS przy początkowym zerowaniu pamięci. I nie sądzę, żeby tą metodą się dało wycisnąć wiele więcej.

Jak o tym była mowa na sztabie, rozwiązaniem może być JIT.

KMK
? HEX$(6670358)

4

Draco pisz, będziesz "world first" jeśli chodzi o JIT na 8-bitowce :)

Może faktycznie nie warto się brać od razu za ZX Spectrum tylko coś prostszego - ZX 80/81?

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.

5

dely napisał/a:

Może faktycznie nie warto się brać od razu za ZX Spectrum tylko coś prostszego - ZX 80/81?

O tym też była mowa na sztabie - nie wiadomo, czy się to opłaci, bo pytanie brzmi, czy na ZX80/81 istnieje jakiś program, dla którego warto byłoby uruchamiać emulator; że o pisaniu nie wspomnę.

Poza tym spektruś jest naprawdę bardzo prosty: składa się z Z80, 64k pamięci oraz układu ULA, który ma *jeden* rejestr sprzętowy (port 254). W związku z tym emulator zawiera kod emulujący rozkazy Z80 (z czego rozkazy IN i OUT emulują wspomniany rejestr), tablice służące do adresowania RAM-u, Display List i ... nic poza tym.

KMK
? HEX$(6670358)

6

program startuje od $0000 (fizycznie $4000) max wielkosc pamieci to 16kb prosze o jakis prosty kod:

hex, mnemonik z80, ilosc cykli z80

moze jakies dodawanie, albo operacje na pamieci, moze cos w petli oraz ilosc cykli po zakonczeniu dzialania z80 i emulowanego z80 na 6502 - cos z ograniczona iloscia rozkazow (chce sprobowac ale nie bede pisal wszystkiego)

chcialbym miec porownanie...

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

7

pytanie brzmi, czy na ZX80/81 istnieje jakiś program, dla którego warto byłoby uruchamiać emulator;

Hm, wydawało mi się, że nie chcesz pisać po to, żeby używać, tylko żeby pokazać, że się da lub dla "dobra narodu i partii" :)

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.

8 Ostatnio edytowany przez xxl (2007-01-30 14:55:44)

sprawdzilem ile bedzie wykonywal sie rozkaz:

LD Reg,$n   - 7 cykli z80 (zaladuj do Reg: A,B,C,D,E,H,L wartosc 8bit n) - nie zmienia rej stanu procesora?

i wyszlo mi, ze petla, skoki, interpretacja rozkazu i powrot do petli to 58 cykli 6502

@drac030 Twoje 32-54 cykle obejmowaly petle interpretacji?

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

9 Ostatnio edytowany przez drac030 (2007-01-30 14:59:02)

xxl: 32-54 cykle, jak napisałem, to dekodowanie opkodu, bez wykonania rozkazu (chyba, że to NOP, który nic innego więcej nie robi).

ld r,$xx u mnie to 32 cykle na dekodowanie + 19 na wykonanie, razem 51 - znowu, najszybszy przypadek (best case). Najgorszy: 54 cykle dekodowania + 19 wykonania (73), albo 32 cykle dekodowania + 41 wykonania (też 73).

Przypominam, że u mnie emulowany Z80 ma całe 64k pamięci. :)

dely napisał/a:

nie chcesz pisać po to, żeby używać, tylko żeby pokazać, że się da lub dla "dobra narodu i partii" :)

No, ale dobrze by było, żeby było też choć trochę używalne przy okazji, nieprawdaż? ;) Poza tym poczytałem o ZX80/81 w wikulcu i nie wiem, czy to nie cięższy przypadek niż ZX Spectrum - w spektrusiu ULA tworzy obraz, więc da się do tego łatwo zatrudnić Antica i sprawa jest z głowy. A w ZX80/81 obraz wytwarza Z80 ... :)

KMK
? HEX$(6670358)

10

pc aktualizujesz podczas wykonywania czy dekodowania rozkazu?

podaj rozkaz ktory wykonuje sie najdluzej

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

11 Ostatnio edytowany przez drac030 (2007-01-30 16:00:44)

PC aktualizowany jest przy dekodowaniu, a potem przy wykonywaniu też, jeśli to potrzebne.

Co do najdłuższego rozkazu, to trudno orzec. Np. pozornie prosty rozkaz LD I,A zajmuje bardzo dużo czasu, bo ma prefiks, a prefiks dorzuca do czasu wykonywania rozkazu od 34 do 56 cykli. Czyli mamy w najlepszym przypadku 32 dekodowanie + 34 prefiks + 9 wykonanie = 75 cykli. W najgorszym - 22 więcej (97).

JR NZ,disp:

* niewykonany: 32+19, 32+41 albo 54+19 cykli
* wykonany wstecz na tę samą stronę: 32+36 cykli
* wykonany wstecz na inną stronę: 32+55 cykli
* wykonany w przód na tę samą stronę: 32+37 cykli
* wykonany w przód na inną stronę: 32+56 cykli

LD (HL),$xx:

* niewykonany (adres wskazuje ROM): 32+32, 32+54 albo 54+32 cykle
* wykonany: 32+67, 32+89 albo 54+67 cykli

EDIT: policzyłem od nowa czasy ostatniego rozkazu.

KMK
? HEX$(6670358)

12

NOP - z warunkami jak wyzej czyli petla, skoki, interpretacja rozkazu i powrot do petli to 48 cykli 6502
LD (HL),$x - 62 cykle 6502

tylko, ze nie biore pod uwage istnienia romu czyli gdzie z80 chce zapisac tam zapisze (oczywisice w granicach swojej pamieci 16kb)

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

13 Ostatnio edytowany przez drac030 (2007-01-30 16:30:06)

48 cykli na NOP-a = dużo. U mnie, gdyby nie konieczność bankowania pamięci, maximum byłoby 36 cykli. Tak samo przy ld (HL) - sprawdzenie, czy ROM, kosztuje 12 cykli (EDIT: jednak 4 :)); a jak nie ROM, to pamięć trzeba przełączyć dwa razy. No i tak to idzie.

KMK
? HEX$(6670358)

14

Hmm... a ja byłbym za napisaniem emulka mimo to ;)

A bardziej serio mówiąc - może coś w typie konwertera, który "przetłumaczyłby" asm spektrumowski na pure 6502 assembler? To, o czym już kiedyś kolega Pirx wspomniał...

Bardzo głupie? ;)

I Ty zostaniesz big endianem...

15 Ostatnio edytowany przez xxl (2007-01-30 17:33:58)

duzo bo procka aktualizujaca pc wyglada tak:

clc
lda pc
adc #1
sta pc
lda pc+1
adc #0
sta pc+1

ale moze wygladac rowniez tak:

inc pc
bne end
inc pc+1
bpl end (32 kb ramu)
asl pc+1
end

a wtedy z 18 cykli robi sie od 8, bardzo rzadko 15 a w szczegolnym przypadku 19 co daje -10 cykli na interpretacji prawie kazdego rozkazu

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

16

pewnie zwróciliście uwage na taki szczegół, maszyna emulująca inną maszyne musi być od niej kilkakrotnie jeśli nie kilkanaście razy szybsza

tak więc poczekajcie aż pojawi sie dopałka 14MHz, albo napiszcie taki emul mimo wszystko i zadedykujcie go Pasiowi, wtedy może go zmobilizujecie

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

17 Ostatnio edytowany przez drac030 (2007-01-30 20:46:30)

miker napisał/a:

może coś w typie konwertera, który "przetłumaczyłby" asm spektrumowski na pure 6502 assembler? To, o czym już kiedyś kolega Pirx wspomniał...

To jest właśnie JIT (patrz posty wyżej). http://en.wikipedia.org/wiki/Just-in-time_compilation

xxl napisał/a:

a wtedy z 18 cykli robi sie od 8, bardzo rzadko 15 a w szczegolnym przypadku 19

No, dobrze, ale gdzie tu zalety uproszczonej organizacji RAM-u, skoro oszczędności w porównaniu do wersji 64k (bankowanej) są groszowe albo żadne (istotna różnica jest tylko przy przekraczaniu granicy stron, co występuje bardzo rzadko)? Chyba tylko tyle, że uruchomienie emulca nie wymaga 130XE.

A na dodatek weź pod uwagę, że przy zajęciu 32k na pamięć emulowanego procesora masz spore szanse, że program emulatora nie zmieści ci się w pozostałym obszarze - Z80 ma dobrze ponad 500 rozkazów :)

BTW. zredukowałem dekodowanie do 29 cykli w najczęstszym przypadku (max. 51).

KMK
? HEX$(6670358)

18 Ostatnio edytowany przez xxl (2007-01-30 20:52:35)

emulgator:

1. rejestry z80 na stronie zerowej poukladane tak, zeby mozna bylo uzywac adresowania (),y czyli np. rej H i L leza w kolejnosci L, H itd.
2. petla dekodujaca na stronie zerowej
3. tablice skokow 256b x 2 (L adresu, H adresu procedury emulacji rozkazu)
4. pamiec od $4000 - 32kb
5. dbamy przy operacji na stosie i skokach bezposrednich z80 o wlasciwa wartosc pc - pc powiekszone jest o $4000


petla dekodujaca na stronie zerowej:
start:
ldy #0
lda (pc),y
tax
lda Lo_tab,x
sta _jmp+1
lda Hi_tab,x
sta _jmp+2
_jmp:
jmp $ffff - 27 cykli i mamy zdekodowany rozkaz z80



procedura emulacji LD (HL),$n
_LD
iny
lda (PC),y   - argument
dey
sta (HL),y   - do pamieci
inc pc
bne _LDend
inc pc+1
bpl _LDend
lsr pc+1     - pc od $4000 do $7fff
jmp start
-- wlasnie zauwazylem ze pc ma sie zwiekszyc o 2 wiec tu wchodzi w gre procedura z adc #2


i to tyle, emulec nie jest taki ciezki do zrobienia cos mi sie wydaje. cos przegapilem?


a 65816 swoja droga by sie przydal, nie trzeba by bylo stronicowac pamieci z80...

---
tak chcialem zeby emulec zmiescil sie tak w 4 kb :-) i uruchomil na 65xe bez rozszerzenia dla z80 i 32kb ramu

---
jak wyglada Twoja procedura dekodowania rozkazu?

---
500 rozkazow :-) ufff to ja chyba zerknalem na inna tabele rozkazow z80 :-) zlamilem :-)

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

19 Ostatnio edytowany przez drac030 (2007-01-30 21:03:17)

xxl napisał/a:

i to tyle, emulec nie jest taki ciezki do zrobienia cos mi sie wydaje. cos przegapilem?

Prawie nic. U mnie dekodowanie wygląda tak:

nop lda (epc),y
    tax
    lda zzlo,x
    sta ?jp+1
    lda zzhi,x
    sta ?jp+2
    iny
    bne ?jp
    inc pc+1
    ldx pc+1
    lda hicon,x
    sta epc+1
    lda mbank0,x
    sta portb
?jp jmp $ffff

sorry, ale LD (HL),$xx nie chce mi się przepisywać ... :) mniej więcej to samo jest u ciebie, tylko w moim jest bankowanie RAM-u. No i lepsze wykorzystanie rejestru Y.

500 rozkazow :-) ufff to ja chyba zerknalem na inna tabele rozkazow z80 :-) zlamilem :-)

W tej, co ja mam, jest ich 564. Ale podobno są też jakieś nielegalne.

KMK
? HEX$(6670358)

20

skoro jest przeszło 500 rozkazów CPU, to wasze w/w przykłady dekodują ich max 256

ja słyszałem że nowe rozkazy można stworzyć przez łączenie innych rozkazów

użycie 65816 przekonałoby do niego bardziej opornych, w końcu poważne praktyczne zastosowanie

p.s.
na C64 jest emul basica ze Spectruma, pozatym możliwości graficzne C64 bardziej nadają się na emulacje kolorowego HiRes-u Spectruma

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

21

tebe napisał/a:

skoro jest przeszło 500 rozkazów CPU, to wasze w/w przykłady dekodują ich max 256

Mylisz się :)

KMK
? HEX$(6670358)

22 Ostatnio edytowany przez xxl (2007-01-30 22:01:25)

przyklad LDIR i LDD maja ten sam kod, tu beda miec ten sam adres skoku ale 'operand' bedzie wyznaczal ktoryu rozkaz bedzie wykonany - 256 tablice wystarcza


---
powyzsza petla dekodowania moze byc zmniejszona do 25 cykli (zawsze, a nie 29-51 u Ciebie), tylko trzeba zadbac o wlasciwe korzystanie z rej. y i to wydaje mi sie miejsce ktore pozwoli znacznie przyspieszyc emulacje.

moim skromnym zdaniem procedura dekodujaca powinna byc jak najkrotsza (wykonywana najczesciej) a ciezar aktualizacji rejestru pc spoczywac na procedurze wykonywania rozkazow. patrzac na to globalnie szybkosc emulacji powinna byc wieksza w moim przykladzie (nawet gdy dorobie stronicowanie po 16kb)

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

23 Ostatnio edytowany przez drac030 (2007-01-30 22:46:11)

powyzsza petla dekodowania moze byc zmniejszona do 25 cykli (zawsze, a nie 29-51 u Ciebie), tylko trzeba zadbac o wlasciwe korzystanie z rej. y i to wydaje mi sie miejsce ktore pozwoli znacznie przyspieszyc emulacje.

Fakt, można to jeszcze ciut skrócić. Ale urwanie jednego cyklu z dekodowania przyspiesza moją pętlę testową o sześć ramek - z dobrze ponad pięciuset; a zatem przy skróceniu o 4 cykle pętla przyspieszy o 24 ramki, czyli niecałe 5% (w stosunku do emulatora, bo w stosunku do oryginału - o jakieś dwa promile). Oczywiście, to zawsze jest coś, ale jeszcze trochę mało :)

moim skromnym zdaniem procedura dekodujaca powinna byc jak najkrotsza (wykonywana najczesciej) a ciezar aktualizacji rejestru pc spoczywac na procedurze wykonywania rozkazow.

Czemu? Znasz rozkaz, który po pobraniu opkodu nie wymaga zwiększenia PC?

patrzac na to globalnie szybkosc emulacji powinna byc wieksza w moim przykladzie (nawet gdy dorobie stronicowanie po 16kb)

Patrząc globalnie - z punktu widzenia już zrobionego stronicowania - nie wydaje mi się. Prawdopodobnie nie bierzesz paru rzeczy pod uwagę, zwłaszcza w tym całym LD (HL),n. Zaimplementuj, zdebuguj, pogadamy :)

KMK
? HEX$(6670358)

24 Ostatnio edytowany przez xxl (2007-01-30 23:24:07)

> Czemu? Znasz rozkaz, który po pobraniu opkodu nie wymaga zwiększenia PC?

po pobraniu nie, po wykonaniu owszem - chociazby JP - a to jest dla nas istotne wykonujemy rozkaz i oczekujemy aktualnych wartosci w rejestrach.

pc nie zawsze sie zwieksza o 1: rodzina ADC, SUB, OR, XOR, CP, INC, DEC, RLC, SRA, JP, CALL itd itd dwa razy robisz aktualizacje pc a wystarczy raz przy rozkazie (bo juz wiadomo co to bedzie) u Ciebie nie wiadomo dlatego 2 razy robisz to samo a cykle leca.

> Zaimplementuj, zdebuguj, pogadamy

przyjmuje wyzwanie. prosze o przykladowy w miare krotki kod z80 z iloscia cykli 6502 w jakim sie wykonal, moze byc lista niepowiazanych rozkazow tylko dla sprawdzenia... od podania przykladu prosze o tydzien czasu na napisanie emula (tydzien jak nie bedzie w przykladowym kodzie udziwnien). moze mi sie uda :-)

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

25 Ostatnio edytowany przez drac030 (2007-01-31 00:37:38)

xxl napisał/a:

po pobraniu nie, po wykonaniu owszem - chociazby JP - a to jest dla nas istotne wykonujemy rozkaz i oczekujemy aktualnych wartosci w rejestrach

Masz rację, JP (HL) jest rozkazem, który nie wymaga zwiększenia PC. Tylko czy on występuje na tyle często, żeby przeniesienie zwiększania z części dekodującej do wykonującej w ogóle na czymkolwiek zaważyło? Moim zdaniem nie - kluczowe znaczenie mają rozkazy często używane w pętlach, a JP (HL) raczej do nich nie należy.

Słowem - to są wszystko szczegóły, warte 1 ramkę na 500 :/ Mało. Wciąż to bardziej przypomina slideshow niż emulator.

xxl napisał/a:

pc nie zawsze sie zwieksza o 1: rodzina ADC, SUB, OR, XOR, CP, INC, DEC, RLC, SRA, JP, CALL itd itd dwa razy robisz aktualizacje pc a wystarczy raz przy rozkazie (bo juz wiadomo co to bedzie) u Ciebie nie wiadomo dlatego 2 razy robisz to samo a cykle leca.

No przecież mówię, że nie bierzesz czegoś pod uwagę :) Bo to jest celowe. Owszem, jak mamy zdekodowany rozkaz CALL, to wiadomo, że za nim są dwa bajty - ale one są "za nim" w przestrzeni adresowej Z80, natomast w przestrzeni adresowej 6502 to już niekoniecznie.

prosze o przykladowy w miare krotki kod z80 z iloscia cykli 6502 w jakim sie wykonal, moze byc lista niepowiazanych rozkazow tylko dla sprawdzenia... od podania przykladu prosze o tydzien czasu na napisanie emula (tydzien jak nie bedzie w przykladowym kodzie udziwnien). moze mi sie uda :-)

Ściągnij sobie z netu ROM Spectruma i działaj :)

KMK
? HEX$(6670358)