Virtuální procesor

Z ZděchovNET
Skočit na navigaci Skočit na vyhledávání

Koncept

  • Je použit lineárně adresovatelný paměťový prostor, každý buňka je velikosti Bajt
  • U všech operací, kde je to žádoucí, jsou podporovány blokové operace
  • Instrukce mají až dva parametry a každý z nich může být definován jako blok (adresa + délka) nebo hodnota
  • U každého bloku může být definováno zda inkrementovat vzestupně nebo sestupně

Adresování

  • n - konstanta n
  • (n) - proměnná, hodnota na adrese n. lze použít jako registry v paměti
  • ((n)) - proměnný ukazatel na proměnnou, hodnota na adrese určené hodnotou na adrese n

Registry

  • PC (Program Counter) - určuje aktuální pozici vykonávané instrukce. Automaticky se inkrementuje vzestupně.
  • SP (Stack Pointer) - Ukazatel vrcholu zásobníku. Je využíván zásobníkovými instrukcemi.
  • C (Carry) - pomocný bitový příznak určuje přetečení rozsahu poslední operace
  • Z (Zero) - pomocný bitový příznak určuje zda výsledek poslední operace byl nulový

Instrukční sada

Kód Název Parametry Popis
Aritmetické
10 ADD DEST, OP1, OP2
1 SUB DEST, OP1, OP2
2 MUL DEST, OP1, OP2
3 DIV DEST, OP1, OP2
4 MOD DEST, OP1, OP2
Logické
Bitové
5 SHL DEST, SOURCE
6 SHR DEST, SOURCE
7 OR DEST, OP1, OP2
8 AND DEST, OP1, OP2
9 XOR DEST, OP1, OP2
Řízení běhu
0 NOP žádná operace
11 JP FLAG, ADDR přímý skok
12 JR FLAG, RELADDR relativní skok
Zásobník
13 PUSH SOURCE vloží data na zásobník
14 POP DEST načte data ze zásobníku
15 CALL ADDR uloží návratovou adresu na zásobník a skočí na zadanou adresu
16 RET návrat z podprogramu, zpětná adresa je načtena ze zásobníku
Obecné
17 COPY DEST, SOURCE kopíruje data
18 EX OP1, OP2 prohodí data
19 CMP OP1, OP2 porovnání bloků
Vnější zařízení
20 IN PORT, DEST načte data ze vstupu
21 OUT PORT, SOURCE zapíše data na výstup

Příklady

Kód Popis
COPY (DEST), (SOURCE) Kopie bajtu z adresy SOURCE na DEST
COPY (DEST), 0 Nastavení bajtu na adrese SOURCE na hodnotu 0
COPY ((DEST)), 0 Nastavení bajtu na adrese SOURCE na hodnotu 0
COPY (DEST):10, (SOURCE):10 Kopie bloku 10 bajtů vzestupně
COPY (DEST):10-, (SOURCE):10- Kopie bloku 10 bajtů sestupně.
COPY (DEST):10+, (SOURCE):10- Kopie bloku 10 bajtů s převrácením pořadí
COPY (DEST):10, (SOURCE):2 Kopie bloku 2 bajtů do bloku 10 bajtů, blok 2 bajtů se opakuje
COPY (DEST):10, 1 Nastavení bloku 10 bajtů na hodnotu 1
COPY 0, 1 Kopírování dat do konstanty nic neprovede
ADD (DEST):10, 1 Přičtení hodnoty 1 do jednotlivých bajtů v bloku 10 bajtů
ADD (DEST):10, 1:10 Přičtení hodnoty 1 do prvního bajtu v cílovém bloku
SHR (DEST):10, (SOURCE):10 Bitový posun bloku SOURCE doprava a zápis výsledku do bloku DEST

Inspirace

Inspirováno instrukční sadou CPU Z80 a blokovými instrukcemi LDIR, LDDR, INIR, INDR, OTID, OTDR, CPIR, CPDR. Tyto instrukce umožňovaly efektivnější vykonávání blokových operací.

Například instrukci LDIR lze zapsat jako:

LOOP:  LDI
       DEC  BC
       JR   NC, LOOP

nebo

LOOP:  LD   A, (HL)
       LD   (DE), A
       INC  HL
       INC  DE
       DEC  BC
       JR   NC, LOOP

Tento systém lze rozšířit mimo LD, IN, OUT, CP i na další instrukce jako AND, OR, XOR, EX, SHL, SHR, INC, DEC, ADD, SUB, aj.

Na příkladu instrukcí LDIR, LDDR lze pozorovat možné úpravy:

  • Zdroj může být také konstantní hodnota což lze použít jako instrukci SET
  • Lze parametricky měnit směr inkrementace/dekrementace zdroje a cíle. Pak mohou vzniknout čtyři kombinace:
    • SOURCE+ DEST+: přímá kopie, nutno použít při posunu překrývajícího se bloku směrem nahoru
    • SOURCE+ DEST-: převrácená kopie, nelze použít pro převrácení překrývajícího se bloku
    • SOURCE- DEST+: převrácená kopie, nelze použít pro převrácení překrývajícího se bloku
    • SOURCE- DEST-: přímá kopie, nutno použít při posunu překrývajícího se bloku směrem dolů
  • Incrementaci/dekrementaci lze nahradit přičtením/odečtením a tedy umožnit větší krok než 1
  • Pokud umožníme zdroji a cíli odlišné délky, pak mohou nastat tři kombinace
    • SOURCE > DEST: ze zdroje se zkopíruje jen část odpovídající délce cíle
    • SOURCE = DEST: cílový blok je přesnou kopií zdrojového
    • SOURCE < DEST: zdrojový blok je do cílového zkopírován vícekrát za sebou