Fr3m3n napisał(a):Interesuje mnie i/o. Klawiatura rozumiem że tak; grafika/tekst?
Jako że samo w sobie compo jest dość hmm złożone, to nie chce utrudniać. Stan klawiatury będzie odzwierciedlony jako tablica stanów poszczególnych klawiszy, 1 jeśli wciśnięte, 0 jeśli nie wciśnięte.
Analogicznie mysz, jeden DWORD X, drugi Y, trzeci będzie miał flagi stanu klawiszy.
Wyświetlaczem będzie okno 640x480x32 (bez alpha, 24 + padding), bez wsparcia dla trybu tekstowego. Pamięć obrazu będzie zamapowana na pewne adresy pamięci (przy czym przeniesienie tej pamięci na ekran będzie wywoływane dodatkową instrukcją - ot tak żeby nie rysować po pixelu ;>).
Jako że prototyp VM (serio prototyp) mam zrobiony, to mogę podać trochę szczegółów odnośnie architektury.
Na początek powiem że celem dla mnie była maksymalna prostota tworzenia instrukcji, żadnych skomplikowanych cudów typu Intel x86.
Instrukcji będzie około 20, wszystkie będą operować na zmiennych 32 bitowych (nie będzie wsparcia dla 16 i 8 bitów, ale to łatwo samemu zrobić). Dodatkowo, nie będzie rejestrów. Wszystko będzie odbywało się od razu na pamięci.
Instrukcje będą następujące (podam ich mnemoniki i zapis w C.. ofc przypominam że nic wam po mnemonikach, bo i tak będzie się pisać opkodami ;>)
MOV [mem], imm - czyli *mem = imm;
MOV [mem1], [mem2] - czyli *mem1 = *mem2;
wszystkie pozostałe instrukcje arytmetyczno logiczne mają warianty jak wyżej, czyli mem,imm i mem,mem:
ADD - czyli a+=b
AND - czyli a&=b
OR - czyli a|=b
XOR - czyli a^=b
SHL, SHR
GOTO (aka JMP)
GOTO_IF_EQUAL
GOTO_IF_LESS
HALT
MOVE_TO [[mem1]], [mem2] - czyli **mem1 = *mem2
MOVE_FROM [mem1], [[mem2]] - czyli *mem1 = **mem2
i może jeszcze coś..
jak widzicie nie ma na przykład mnożenia, dzielenia czy odejmowania, ale to można powyższymi opkodami spokojnie zapisać (dzielenia specjalnie nie daje bo to jest imho ciekawe do oprogramowania.. w razie czego jest SHR ;>>)
Dodam że format instrukcji to:
BYTE_Opcode [DWORD_Arg1 [DWORD_Arg2 ... [DWORD_ArgN]]]
Teraz tak... Pamięć ma adresowanie 32 bitową, z tym że tak na prawdę są 4ry obszary:
0x00XXXXXX - ROM
0x01XXXXXX - RAM
0x02XXXXXX - Special
0x03XXXXXX - HDD
Egzekucja rozpocznie się od ROM:000000. I tam też będzie załadowany program napisany przez uczestnika compo.
RAM - tam ma się nieograniczony dostęp (jak widać to jest 16MB).
Special - tutaj będą różne cuda, jak na przykład stan klawiatury, pamięć obrazu, stan myszki, tablice wektorów, etc...
HDD - zamapowany plik pamięci trwałej, read-write...
czyli np instrukcja MOV będzie służyła za równo do zabawy w RAMie, przestawianiu cudów w Special, jak i zapisu i odczytu z dysku. Ot taki KISS.
Dodatkowe ficzery to będą:
- Timer (milisekundowy)
- Timer (wywoływany co N instrukcji)
- Możliwość zdefiniowana własnych funkcji (zapisanych powyższymi opkodami) dla opkodów 0x80-0xFF
- Bezpośredni dostęp do Instruction Pointera
- Możliwość zdefiniowania własnych funkcji dla nielicznych exceptionów które będą (chyba 2 będą tylko)
Dodam że kod będzie mógł być wykonywany z dowolnego adresu, czyli ramu, romu, czy hdd... a nawet speciala (vm to będzie dopuszczać).
OK w sumie tyle...