Jump to content

Archived

This topic is now archived and is closed to further replies.

Toster

Gluton

Recommended Posts

Witam,

Jak to na switea bywa, duzo czasu, malo do roboty itd itp. W ramach nudzenia sie postanowilem napisac Glutona. Gluton jak sama nazwa wskazuje to virtualny procesor. Potrafi wszystko co powinien potrafic takowy procesor. Obecnie jest w fazie baaaardzo wczesnej i jego intuicyjnosc obslugi jest niczym vim. Testowanie tez jest w fazie niezwykle wczesnej wiec jak ktos kiedys bedzie chcial sie pobawic to jestem dzwieczny za wszelakie kody ktore zle na nim dzialaja.

 

Krotka charakterystyka:

Pamiec: 1 MB (da sie dowolnie konfigurowac z poziomu zrodel :D)

Liczba rdzeni: 1 (ale arch. przewiduje wiele)

Cache L1: 16 bajtow (mmooooooccc)

znane rozkazy:

 

add r*,r* - dodaj do pierwszego rejestru wartosc drugiego

sub r*,r* - odejmij od pierwszego rejestru wartosc drugiego

mul r*,r* - pomnoz wartoscpierwszego rejestru przez wartosc drugiego

div r*,r* - podziel wartoscpierwszego rejestru przez wartosc drugiego

not r* - zaneguj wartosc rejestru

clr r* - wyzeruj wartosc rejestru

xor r*,r* - wykonaj operacje xor rej. nr 1 z rej nr 2

shl r*,A - przeshiftuj w lewo rejestr o zadana wartosc

shr r*,A - przeshiftuj w prawo rejestr o zadana wartosc

rol r*,A - przewin w lewo rejestr o zadana wartosc

ror r*,A - przewin w prawo rejestr o zadana wartosc

add r*,m - dodaj do rejestru wartosc spod adresu pamieci m (32b)

sub r*,m - odejmij od rejestru wartosc spod adresu pamieci m (32b)

mul r*,m - przemnoz wartosc rejestru przez wartosc spod adresu pamieci m (32b)

div r*,m - podziel wartosc rejestru przez wartosc spod adresu pamieci m (32b)

add r*,a - dodaj do rejestru 32 b argument

sub r*,a - odejmij od rejestru 32 b argument

mul r*,a - przemnoz wartosc rejestru przez 32 b argument

div r*,a - podziel wartosc rejestru przez 32 b argument

inc r* - zwieksz rejestr o 1

dec r* - zmniejsz rejestr o 1

jmp l - skok bezwarunkowy pod wskazany label

jz l - skok pod label gdy ustawiony jest bit kontrolny ZERO

jnz l - skok pod label gdy nie jest ustawiony bit kontrolny ZERO

jg l - skok pod label gdy nie jest ustawiony bit kontrolny NEGATIVE

jl l - skok pod label gdy jest ustawiony bit kontrolny NEGATIVE

jsr l - odloz aktualy adres licznika programu na stos i skocz do wskazanego labela

ret - pobierz adres licznika programu ze stosu

move.s r*,r* - skopiuj zawartosc 2 giego rej, do pierwszego

move.s r*,m - skopiuj do rej. zawartosc pamieci z podanego adresu

move.s m,r* - skopiuj do pamieci zawartosc rej.

movem.s r*,r* - przenies pamiec spod adresu rej.2 do adresu rej.1 (rejestry wskazuja

 

adresy)

move.s a,m - przenies argument pod wskazany adres pam.

move.s a,r* - przenies argument do rejestru

swap r*,r* - zamien wartosciami 2 rejestry

cmp.s r*,r* - porownaj ze soba 2 rejestry

cmp.s m,r* - porownaj adres pamieci z rejestrem

cmp.s a,r* - porownaj z argumentem wartosc rejestru

tst.s r* - ustaw bity kontrolne na podstawie podanego rejestu

 

.s oznacza rozmiar operacji, dopuszczalne sa nastepujace:

.b - 1 bajt

.w - 2 bajty (slowo)

.l lub .d - 4 bajty (dlugie slowo)

 

ledenda:

r* - rejestr, dostepne rejestry r0-r15

a - 32 bitowy argument np #1000, lub #$100

A - 8 bitowy argument, np %$10

m - 32 bitowy, adres

l - label zaczyna sie @, konczy sie :

 

stos: defaultowo wskazywany przez rejestr r15, nie jest ustawiany ! wiec trza go sobie

 

samemtu gdzie ustawic

 

do tej pory testowalem jeden program i dziala dobrze, wyglada on tak:

move.l#1,r0

move.l#4,r1

addr0,r1

 

po wykonaniu w rejestrze r0 bedzie wartosc 5

 

link do pobrania projektu (lazarus) + exeka tutaj:

http://thetosters.pl/gluton

 

PS.

Parser jest prosty niczym cep bojowy wiec prosze pisac prosto bez zbednych spacji itp itd ;)

Share this post


Link to post
Share on other sites

No wiesz, to powinieneś FSL-a rozwijać :P

Ogólnie:

- widzę pewną niekonsekwencję - czasami gdy instrukcja ma dwa argumenty to wynik zapisuje w lewym, ale zdarza się, że w prawym, głównie chodzi mi o move.

- mógłbyś zrobić tak, że zamiast móc jako drugi argument mieć tylko rejestr to mieć opcję: liczba expilicite jako 4567, albo wartość spod adresu wtedy zaczynałoby się od $ i wartość szesnastkowa oraz przy skoku oprócz przymusu etykiety dać, że można podać liczbę, wiem, że mało kto to by używał, ale jakiś feature jest

- długość komend mogłaby być różna w zależności od argumentów, np. pierwszy bit określa ile bajtów jest na okreslenie komendy, jak 0 to kolejne 7 bitów to komenda, jak 1 to 15, następnie po 2 bity na opisanie każdego argumentu (czy rejestr,liczba,adres, oraz opcja, że podany jest indeks, że wartość jest pod adresem r2[operand], 4 bity puste(chyab, że robisz r0x,r0l itp.) no i w zależności jakiego typu jest operand to tyle bajtów na niego.

- mieć np. r0h,r0l,r0x

nic nie narzucam, ale wydaje mi się, że te pomysły byłybe dobre ;) kto wie, może kiedyś FSL będzie się kompilował do glutona :P

- {$Mode Delphi} daj w IFDEF FPC i wogóle zobacz jak to w TD wygląda;) bo kompilacja wali się

Share this post


Link to post
Share on other sites

Troche czasu minelo a tym czasem mamy nowszego glutona. Wersja 0.2 dostepna jest tutaj:

http://thetosters.pl/gluton/

 

Chwilowo wersja rozwojowa dla kompilatora, w archiwum jest opis skladni i przyklad.

Narazie mozna zrobic tylko kompilacje do bytecodu jeszcze nie ma uruchamiania programu, nad tym jeszcze pracuje.

Jak się komus nudzi to zachecam do testow.

 

Na obecna chwile program musi byc w pliku src.txt, po uruchomieniu kompilatora wyskocza rozne mniejsze pliki opisujace co sie stalo i czy zadzialalo. Pojawi sie tez plik ze skompilowanym programem. I to chwilowo tyle.

 

Calosc zostala zaprojektowana od zera i przepisana na nowszy bardziej elastyczny system.

Share this post


Link to post
Share on other sites

Wg mnei to błąd, gdy nei można dać etykiety przed komendą, tylko linijkę przed komendą

test: sub.w r0, r1 nie przeszło

tak samo jak zrobie linijkę test: (spacja)

odnośnie grafu, jakbys wrzucił stan minusa, że jest wczytywany w którejś z liczb masz spore uproszczenie. Tak samo zamiast rozdzielać na 3 stany w zależności od typu liczby zrobić stan liczba i dla niego zrobić graf

bez interpretera trudno powiedzieć czy działa

Share this post


Link to post
Share on other sites

pisze w opisie ze label musi byc w osobnej lini :)

co do spacji na koncu to ciekawe, powinno wyciac, sparawdzimy

Share this post


Link to post
Share on other sites

może musi być w osobnej, ale mogłaby być opcja, że też może w jednej, mniej linijek trza pisać w glutonie

Share this post


Link to post
Share on other sites

moglo by byc, nie przecze ale narazie nie ma, wiec nie jest to blad bo jest zaznaczone zeby tak nie robic ;)

Share this post


Link to post
Share on other sites

Kolejna wersja Glutona na serwerze:

 

- pojawil sie Debuger (jeszcze nie dziala uruchamianie programu ale mozna testowac dissassembler)

- pojawil sie poprawiony kompilator

- zaimplementowano 80% funkcjonalnosci processora ale jeszcze nie jest podlaczona :D

 

Dla ludzi znudzonych: http://thetosters.pl/gluton/Gluton.zip

Share this post


Link to post
Share on other sites

Fajne! Toster, dodaj jeszcze pobieranie klawisza z klawiatury i wyświetlanie znaku to będzie można normalny program w tym napisać :)

Zrobimy potyczki algorytmiczne :D

 

Ps.

Połącz projekt z systemem plików który wcześniej napisałeś i będzie emulator nieistniejącej maszyny. Hehe. Nie wiem czy kojarzysz NoSense autorstwa Regedita (napisał właśnie coś takiego) Dam link: http://regedit.gamedev.pl/nosense/

Share this post


Link to post
Share on other sites

Heh nie korzystam, ale glutona pisze w chwilach wolnego czasu w planach jest:

1) baaaardzo proste GPU (z okienkiem na ktorym bedzie to widac)

2) "interfejs" do ktorego da sie podlaczyc inne maszyny cos jak port RS-232

3) jakies inne maszynki (nie wiem jeszcze jakie :)) ktore da sie podlaczyc do wspomnianego interfejsu

4) obsluga klawiry (tak jak mowiles)

 

ale mysle ze nie za szybko to bedzie, bo obecnie musze potestowac sam procesor (nie wszystkie rozkazy jeszcze sa oprogramowane) teraz bede pisal obsluge rozkazow uzywajacych stosu.

 

Ooo widze ze nosense to chyba dokladnie to samo co gluton :)

Share this post


Link to post
Share on other sites

Nom projekt kielkuje....

Link do projektu: http://www.assembla.com/wiki/show/Gluton

Exec tam gdzie zawsze: http://thetosters.pl/gluton/

 

co nowego:

1. Pojawily sie breakpointy w debugerze

2. male poprawki stabilnosci

3. pojawila sie tablica IRQ dla procesora i szkielet jej zarzadzania na poziomie Cora

4. Pojawil sie szkielet South Bridge dla procesora

5. Pojawil sie nowy bit kontrolny w rejestrze stanu

 

Poszukiwany ludzik ktory moglby popracowac nad portem kompilatora na Lazarusa bo ja tego na pewno nie zrobie a nie wydaje sie duzo pracy z tym.

 

Niebawem bedzie wiecej...

Share this post


Link to post
Share on other sites
Taki sobie program który z zadania ma obliczyć NWD z r0 i r1. (czyli z 123 i 43)KODmove.l #123, r0
move.l #42, r1
START:
cmp.l r0, r1
jz NWD
jn DRUGAWIEKSZA
sub.l r0, r1
jmp START
DRUGAWIEKSZA:
cmp.l r1, r0
jmp START
NWD:
jmp NWD
Meritum. Chciałem debuggować i...
Assertion Failure SimpleCore.pas : 1011 a potem Assertion Failure SimpleCore.pas : 427. Nie wiem czy ja jestem debilem czy co biggrin.gif
Jak sie kompiluje to pokazuje:
KODLoading file:nwd.txt
Parser:
Done.
Compiler:
Done.
Writting output file:nwd.gcf Więc chyba jest ok.

Poradź coś Toster smile.gif

Share this post


Link to post
Share on other sites

Pojawila sie wersja 0.0.2.44

 

co nowego:

- przebudowano przerwania, pojawil sie kontroler przerwan w procsorze

- pojwily sie nowe komendy zwiazane z obsluga przerwan

- pojawila sie komenda pozwalajaca zmieniac rejestr stosu

- 100% komend jest w pelni zaimplementowana, wciaz trwaja testy stabilnosci

- poprawiono krokowa prace debugera

- zmiana typu rejestrow na Cardinal z int

 

Edit:

Spoko w07 wezme na tapete i zobacze co tez sie posypalo, ale jak sa asercje widac nie wierzylem sam sobie :>

 

 

Edit2:

Skopiowalem ten program, kompilacja poszla bez problemu, wielkosc pliku po kompilacji: 58 bajtow

wrzucilem do debugera i dalem F9, program sie wykonal bez rzadnych exceptionw czy asersji, to samo przez F8.

Wynik w r1: $51 (nie sprawdzalem czy dobry)

Mozesz rzucic wiecej info co jak robiles krok po kroku ?

Share this post


Link to post
Share on other sites

Dziwna sprawa... Na prawdę dziwna bo dzisiaj działa. Nie wiem jak to możliwe. Nic nie zmieniałem w kodzie, nawet nie rekompilowałem. Po prostu uruchomiłem wszystko dokładnie tak jak zostawiłem wczoraj i śmiga. Pewnie jak zwykle wystarczyło wysiąść i wsiąść. Dodam, że wczoraj próbowałem kilka razy trochę modyfikować kod i kompilować od nowa, restartować debugger itp i to wszystko nie działało. Toster, piszesz genialne programy - same się leczą przez noc :P

Share this post


Link to post
Share on other sites

;)

Jak zauwazysz jakies anomalie to dawaj znac. Musze rozszerzyc opisy coby bylo wiadomo jakie flagi w jakich sytuacjach sa ustawiane.

Zauwazylem tez blad w komendach j** postaram sie dzisiaj naprawic.

no i musze kompiler rozszerzyc aby dalo sie ladowac dane w rozane bloki pamieci a nie zawsze na zero

+ poprawic okno debugera do mnie wk*** jak nie widze co bylo wczesniej po F8

 

Edit:

Na stronie projektu pojawila sie lista TODO na najblizszy czas, jak ktos ma jakis pomysl co by sie jeszcze przydalo to dajcie znac, bede uzupelnial

Share this post


Link to post
Share on other sites

Pamięć trzeba jakoś sobie rezerwować czy jest wolnoamerykanka i możemy pisać po czym nam się podoba? Jak to wygląda? Opisałeś komendy które w parametrze mają adres pamięci. Jest coś od alokacji czy cuś?

Share this post


Link to post
Share on other sites

Obecnie procesor dziala w trybie real mode, cala pamiec jest dostepna do operowania. Chwilowo nie ma konfigow i debuger tworzy srodowisko defaultowe czyli:

Procesor: 1 rdzien, 16 rejestrow, defaultowo 15 rejestr jako wskaznik stosu

Pamiec: 1MB dostepna przestrzen adresowa : 0 - $100000, predkosc zapis/odczyt: 50kB/Tick, 50kB/tick

Przerwania: 255 dostepnych przerwan

 

nie ma czegos takiego jak alokacja, co widzi procesor tam moze wepchnac palce ale uwaga:

 

Nie ma obecnie pelnej synchronizacji cache procesora z pamiecia, wiec po zaladowaniu cache z pamieci i zmianie zawartosci pamieci nie nastapi resynchronizacja z cachem. Cache dla rdzenia obecnie to 44Bajty. Czyli mowiac wprost jesli procesor startuje od adresu 0, to wczytuje 44 bajty, zmiana obszaru pamieci 0-44 w tym czasie nie bedzie widziana przez rdzen ktory wykonuje program z tego zakresu, ale operacje typu dostep do pamieci zawsze beda mialy "prawdziwe dane"

 

Edit: Ostatnie 3 dni poświęciłem na redagowanie dokumentacji w LaTeXie, może nie jest jeszcze kompletna ale powinna rzucac troche wiecej swiatla na niektore aspekty. W miare potrzeb (i prac) bedzie rozwijana. Zla wiadomosc jest taka ze zobaczy ona swiatlo dzienne razem z nowym buildem czyli w okolicach srody/czwartku. Licze Wo7 ze do tego momentu nie popelnisz samobojstwa.

 

Edit:

Doszlem do realokoacji kodu i tutaj pojawia sie ciekawe pytanie, czy skoki warunkowe powinny byc ofsetowe czy absolutne ?

Narazie mam absolutne, co w polaczeniu z adresem zaladowania daje stabilny kod, jednakze wiem ze wiekszosc skokow warunkowych na rzeczywistych procesorach jest offsetowa. I zastanawiam sie czy zmieniac obecne podejscie czy zostawic po mojemu. Jakie jest wasze zdanie w tej kwestji ?

Share this post


Link to post
Share on other sites

Jak mnie nie zgnębią za bardzo na sesji to raczej nie będę skakał pod pociąg ;)

 

(od razu powiem ze nie wiem co to jest realokacja kodu. samo slowo znam ale nie wiem jak sie ono ma do takich maszyn)

 

Co do skoków... To coś zmienia od strony programisty, który ma asm'a do dyspozycji?

absolutne+adresem zaladowania = stabilny kod

 

..ale za to jest mniej elastyczny bo wczytując jakiś dodatkowy kod (będzie to w ogóle w Glutonie? :D ) do programu będzie on w innym miejscu i wszystko może się posypać. Jak dla mnie to możesz dać offsetowe skoki. Chyba nie jest to aż tak duży nakład pracy, a nie będziesz musiał potem przerabiać (albo patrząc z innej perspektywy: przerobisz na offsetowe gdy to będzie potrzebne).

 

Czy na tym etapie są jakieś konsekwencje stosowania absolutnych albo offsetowych skoków? ;)

Share this post


Link to post
Share on other sites

Skoki są zawsze wzgledem początku kodu, ale procesor wraz z systemem ten początek offsetuje gdy kod ładuje się do pamięci gdzie są też inne kody, dlatego w każdym naszym programie gdy przypisujemy coś do property nila to zawsze daje AVL z adresem 00000000

Share this post


Link to post
Share on other sites

"Skoki są zawsze wzgledem początku kodu" - blad

skoki inne niz jmp sa zawsze offsetowe, dlatego bylo segmentowanie na obszary 64kb, bo mozliwy skok warunkowy byl maksymalnie na 64kb i dlatego ograniczenie plikow typu .com bylo do jednego segmentu.

 

W trybie real mode dawalo to pewne ciekawe mozliwosci, bo plik com musial byc napisany w sposob dajacy calkowita realokacje. czyli mowiac wprost mozna bylo wziasc ten dane, wrzucic w dowolny obszar pamieci i skoczyc na jego poczatek, nie potrzebne bylo linkowanie ani inne cuda bo kod zawsze dzialal poprawnie. Co wiecej mogl sie skopiowac w dowolny inny obszar pamieci i dalej dziala dobrze.

 

Skok ofsetowy to taki ktory przesuwa licznik procesora o zadany ofset, przy czym przesuniecie jest zawsze wzgledem aktualnej warotsci licznika co powoduje ze kod z takim opisem mozna przemieszczac dowolnie po pamieci (polceam gre core wars).

 

Narazie z lenistwa zostawilem skoki absolutne. Jak kiedys przyjdzie potrzeba zmiany tego to rozszerze rdzen o nowe polecenia. Tymczasem dopisze tworzenie srodowiska uruchomieniowego na bazie xml'a i wypuszcze builda, ale to dopiero w tygodniu. sory za opoznienia, pisze glutona jak nie mam innych rzeczy na glowie...

Share this post


Link to post
Share on other sites

Potem napiszemy na to system operacyjny :D

 

A za opóźnienia nie musisz przepraszać bo my się nim bawimy jak nie mamy innych rzeczy na głowie :P

 

Ps.

Zaliczyłem pierwszy egzamin! (nawet w pierwszym terminie :D)

Share this post


Link to post
Share on other sites

I tak oto swiatlo dzienne zobaczyl Gluton 0.0.3.47

chwilowy adres tutaj: http://hostuje.net/file.php?id=7b8989c58db...c070fa4b88759f3

Nie ma uzupelnienia repa na svn'ie zrobie w weekend.

 

a co nowego:

- poprawiono metody skoków (j***) teraz wyznaczaja poprawnie adress docelowy

- zmiany w dzialaniu polecen sub, div teraz odpowiednio dst = dst - src i dst = dst / src wczesniej bylo na odwrot

- rozszerzono kompilator: dodano sekcje Code, Data, Binary w kodzie zrodlowym

- rozszerzono kompilator: rozne sekcje moga byc defaultowo ladowane pod rozne adresy w debugerze

- pojawila sie dokumentacja w formacie LateX'a

- rozszerzono loader plikow skompilowanych

- pojawila sie konfigurowalna maszyna virtualna

- wyseparowane podstawowe interfejsy/klasy bazowe dla urzadzenia dzialajacego jak zegar i manager pamieci

 

wersja jest jeszcze mocno testowa, wiec czasami moze byc krnabrna, ale jestem dobrej mysli ;)

Share this post


Link to post
Share on other sites

×
×
  • Create New...