Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Postanowiłem napisać emulator. Niestety nie znam żadnej architektury procesora na tyle, by móc się bawić w jej implementowanie. Rozwiązanie wydawało mi się proste... Właśnie tworzę własną.
ANARCH, czyli architektura bez władcy. Będzie się zmieniać. Nawet jej ostateczna wersja jeszcze pewnie zdąży się zmienić.
Oto ta część specyfikacji, która zapewne nie ulegnie już zmianie.
Mamy pamięć m - jest to tabica bajtów, w ofcijalnym emulatorze ma 640K długości (dlatego umawiamy się że wszystkie programy na ANARCH muszą póki co wykorzystywać nie więcej niż te 640K - zarówno kod jak i dane).
Mamy dwa wskaźniki: p oraz q. Wartość p i q jest zawsze dostępna dla procesora. Wskaźniki te wskazują na konkretny adres w pamięci. Czytanie wartości pod wskaźnikiem to czytanie danego adresu.
Tak więc mamy następujące instrukcje:
zwiększ p (p++)
zmniejsz p (p--)
zwiększ q (q++)
zmniejsz q (q--)
zwiększ wartość komórki pamięci wskazywanej przez p (m[p]++)
zmniejsz --//-- (m[p]--)
tak samo dla q (m[q]++)
(oraz m[q]--)
niech q skoczy do adresu wskazywanego przez p (q = m[p])
i na odwrót (p = m[q])
i niech p skoczy do adresu na który wskazuje (p = m[p])
i niech q... (q = m[q])
niech p i q zamienią się miejscami (temp = p; p = q; q = temp)
rezerwacja,
rezerwacja.
czyli jest ich 16 (14 używane). kolejne 8, to wariacje poprzednich, mianowicie te same arytmetyczne instrukcje, tylko że zamiast przesuwać wskaźniki lub wartości o 1 zrobią to o 8 (wysoce prawdopodobne że wywalę ten mały zestawik jak sobie przypomnę czy da się tak robić podstawowym zestawem jakoś szybciej).
następnie przychodzi czas na conditionale.
jeżeli wartość pod p jest 0, przeskocz do odpowiadającej instrukcji kończącej, w przeciwnym wypadku nie rób nic.
jeżeli wartość pod p nie jest 0, wróć do odpowiadającej instrukcji rozpoczynającej (aka 'while' w 'do...while')
czyli powyższe jest czymś w rodzaju
loop:
if (m[p] != 0) {...} else goto end;
if (m[p] != 0) goto loop;
end:
wiem że goto jest złe, ale tak to niestety działa na tym poziomie ;]
analogicznie q.
to kolejne cztery instrukcje, i już mamy zgodność z turingiem. teraz potrzeba nam tylko kontroli urządzeń, i tutaj wysiadam. kombinowałem coś w stylu:
"wyślij do urządzenia wskazywanego przez m[p] sekwencję zaczynającą się na m[p+1] a kończącą się na pierwszym napotkanym zerze, a zwrócony przez urządzenie wynik..."
"...pobieraj z urządzenia wynik i zapisz go pod m[q]"
tym sposobem można by najpierw przygotować tablicę poleceń, które trzeba przesłać do urządzenia, a nastpnie użyć pętli przesuwającej wskaźnik q dopóki urządzenie nie prześle 0. nie jestem pewien jak to będzie...
na razie DMA się nie martwię. to się przyda mniej więcej jak będziemy chcieli odtwarzać na tym muzykę.
===
jeśli nikt nie zasugeruje żadnej poprawki przez 24 godziny, uznaję wszystkie instrukcje (poza dwoma ostatnimi) za wersję ostateczną i zaczynam implementować. do końca tygodnia postaram się rozwiązać sprawę dostępu do urządzeń (obecne rozwiązanie wydaje mi się logiczne, ale nie wiem jak to będzie... co by było gdyby urządzenie zwróciło więcej danych niż jest pamięci, i na przykład nadpisało wykonywalny kod?)
gdy emulator będzie gotowy (zapewne "urządzenia" będzie można dodawać jako samodzielne pliki *.o, po prostu linkując je w całość) trzeba będzie napisać na niego asemblera oraz kompilator C, i jeśli to się uda...
portujemy Debiana na ANARCH.
dobry plan? ;]
===
aha, jeszcze kilka szczegółów technicznych. ANARCH: długość słowa 32 bity, big-endian. anarch: emulator implementuję w C++ ale staram się raczej używać funkcji bardziej w stylu C (malloc&free, struktury danych, wpistu wskaźników, zamiast np klas i obiektów, accessorów, referencji, wektorów, auto_ptrów itd). gdy wszystko już będzie działać, będę powoli przekształcał kod do "czystego" C i może nawet zacznę dodawać wstawki w asemblerze (żeby szybciej śmigało) albo nawet robić dynamiczną rekompilację z ANARCH na x86, ale to daleeekaa przyszłość ;]
Offline
a ja Cię harry666t podziwiam :) - masz facet speeda
Offline
Matthew, po co? Z tego samego powodu, dla którego powstał Linux: FOR FUN! :D
Granie w gry, słuchanie muzyki, oglądanie filmów, czytanie książek - to też strata czasu? ;]
Offline
Matthew, po co? Z tego samego powodu, dla którego powstał Linux: FOR FUN! :D
[/quote]
Popieram! :-))
Poza tym sporo nauk można z takiej zabawy wyciągnąć ;-).
Zostałeś zarejestrowany jako użytkownik #416423 przez.. :mrgreen:
##
[url=http://fluxboxpl.org]FluxboxPL[/url] | [url=http://zielony.fluxboxpl.org/blog/]Mój Lepszy Świat[/url] | [url=http://www.unixy.pl/]UnixyPL[/url] | [url=www.adescom.pl]Telenia VOIP dla ISP[/url]
JID: zielony@jabster.pl
Offline
Nie mówię że sama idea jest zła. Tylko jak coś robić to porządnie i z sensem. Jest wiele projektów OpenSource tworzących emulatory. Niech tam się harry wykaże. Na pewno więcej się nauczy i przyniesie mu to większą cześć i chwałę niż to.
Offline
Jak myślisz, łatwiej jest zbudować samochód z części, czy samemu wszystko zaprojektować od zera?
Jak myślisz, dlaczego wolę trudniejszą drogę?
I dlaczego ciągle krytykujesz moje pomysły? ;]
Poza tym sporo nauk można z takiej zabawy wyciągnąć ;-).[/quote]
Najważniejszy cel tego projektu.
===
Status prac: oficjalnie ANARCH ma 29 instrukcji, z czego wiele to takie hacki żeby było "na skróty", w tej chwili wszystkie od 0x00 do 0x19 są już zaimplementowane (pozostały najciekawsze: kontrola przepływu oraz obsługa urządzeń zewnętrznych), czyli zapewne jeszcze dziś zadziała procesor. Wtedy pozostanie tylko zaimplementowanie I/O oraz ładowania ROMów, i emulator gotowy. Góra trzy dni, i przy dobrych wiatrach będą działały już jakieś proste programy w stylu znajdowanie liczb pierwszych itp.
158 linii kodu.
[ /\/\/\ o_0 ----->>> Ascii Art Userbar User ]
"steal and steal and steal some more and give it to all your friends and keep on stealin'"
- Reznor
Offline
I dlaczego ciągle krytykujesz moje pomysły? ;][/quote]
Tam odrazu ciągle... tylko 2/3 skrytykowałem. WM bardzo mi sie podoba i gdyby nie to, że chwilowo jestem zamieszany w coś innego to z chęcią bym się przyłączył. A jeżeli chcesz się czegoś nauczyć to proponuję napisać własnego OS'a. Tak for fun... jak zawsze ;]
Offline
Heh, gdy skończę anarcha to myślisz że co będę musiał robić? Gry na niego powstaną same? :D
Offline
Hehe, ja tam pozostaje przy budowie jednostek ALU :P Przynajmniej jedno jest pewne, że w 90% przy[adków przeniedienia się szybciej wygenreuja niż wynik zostanie ustabilizowany :D
Jak juz sie wypowiadałem na ten temat, to nie jest Turing do końca wogóle trzeba by sprawdzić czy będzie w pełni detrministyczny. I jak juz mówiłem w "konstrukcji" Turinga nie ma skoków, czyli tym samym pętli, a generuje najoptymalnijesze algorytmy. :>
A tutaj trochę bardziej zformalizowana reprezentacja maszyny Turinga :)
MT = < Q, Σ, δ, Γ, q0, B, F >
A jak tak patrze na specyfikacje to ona dotyczy maszyny nbitowej :/ A taka nie jest w stanie na razie powstać. Musisz sprecyzować szerokość lini danych i adresowych. Po drugie brakuje sprecyzowania typów adresowania ( bezpośrednie, pośrednie, przez parametr, itd. ).
Offline
Time (s) | Query |
---|---|
0.00009 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00101 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.147.75.46' WHERE u.id=1 |
0.00062 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.147.75.46', 1733048155) |
0.00040 | SELECT * FROM punbb_online WHERE logged<1733047855 |
0.00068 | SELECT topic_id FROM punbb_posts WHERE id=58954 |
0.00121 | SELECT id FROM punbb_posts WHERE topic_id=7775 ORDER BY posted |
0.00058 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=7775 AND t.moved_to IS NULL |
0.00012 | SELECT search_for, replace_with FROM punbb_censoring |
0.00088 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=7775 ORDER BY p.id LIMIT 0,25 |
0.00079 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=7775 |
Total query time: 0.00642 s |