16. Logický posuv operandu

Jehož délka ve slovech (1 slovo=16b=2B) je uložena v registru L a jehož počáteční adresa je uložena v registru D. Posuv je o jedno místo doprava. Do příznaku CF se vloží bit, který při posuvu vypadne.

Upřesnění: Operand je uložen v paměti způsobem little-endian. Oprace může/musí změnit puvodní obsah registrů D,W a PSW

Bližší specifkace:

Jelikož by bylo vhodné komparovat ne v ALU ale v L, připusťme nulovou hodnotu registru L na konci operace. V registru W, bude posunutá část (bity 0-15), jakožto ostatní vlajky kromě IF budou změněny podle hodnoty posledního W. Hodnota registru D zůstane zachována. Interně je používán registr U. Jeho původní hodnota buď zatracena.

Operační kód:

OP je jednoduše OZ 0x00h neboť nejsou třeba žádné uživatelm specifikované operandy, které by byly součástí instrukce. Vím, že 0x00 není nejsťastnější volba, ale pro simulator, kde musíte při novém zpuštění vše znovu zadat, asi nejvhodnější.

SHR:		{
    		OEW ECW, 6, 0, ; 	XOR W+B děláme nulu v W
    		ECF CFS1 OEPSW,0,0,; 	nastavíme CF na 0
    		OED ECW,2,0,;		D->W
    		OEL ECW,10,0,; 		EMULATOR BUG 16:8 OF BUS IS NOT ZERO
    		OEL ECW,10,0, ; 	D+L+L,;
    		OEW ECD,0,0,SHR_KONEC;	W->D
    		}

SHR_KONEC: 	{
                UDD ECD,0,0,DO_SHR; 	D--
                ,0,0,INTCHECK;		máme hotovo...
        	}
DO_SHR: 	{
                OED OEAB PEU,0,0, ; 	D->BUS & U
                OED OEAB MRD,0,0,SHR_MEM_WAIT1; Adresa na BUS
    		}
SHR_MEM_WAIT1: 	{
                OED OEAB MRD ECINH , 0 , 10 , SHR_MEM_WAIT1;    Čekáme na pamět
                UDD ECD,0,0,; 		D-1
                OED OEAB,0,0,; 		D->BUS Adresa na BUS 
                OED OEAB MRD , 0 , 0 ,SHR_MEM_WAIT2;   Čekáme na paměť
                }
SHR_MEM_WAIT2: 	{ 
                OED OEAB MRD ECINL , 0 , 10 , SHR_MEM_WAIT2;
                OEINLH ECW,2,0,; 		čteme připravená data do W
                OEU ECD ECF ECW,1,0,; 		ROTACE vpravo & U->D
                OEW ECOUTWR,0,0,SHR_WRITE1;	příprava zapisu dat
                }
SHR_WRITE1:     { 	
                OED OEAB MWR LH OEWR,0,10,SHR_WRITE1; 	zapis
                ECL UDD ECD,0,0,;   			D-- L--
                OEW ECOUTWR,0,0,SHR_WRITE2; 		Nutny ? (asi ano)
                }
SHR_WRITE2:     {
                OED OEAB MWR OEWR,0,10,SHR_WRITE2;		zapis 
                ,0,14,SHR_KONEC; 				L zero ?
                }

Vývojový diagram

Závěr:

Po překonání počátečních obtížích se vším (simulátor i překladač) se mi semestrální práci podařilo odladit. Na začátku(tj před odečtením) není testován L na 0 takže stejně jako na PC lze provést 256 posuvů wordů. Pokud jsem dobře počítal je celkový počet taktů (bez decode) mé nové mikroinstrukce 22*L+6. Registr L je po provedení instrukce nulový (sloužil jako čítač posuvů). Instrukci jsem odlďoval tak že jsem na PC v td.exe nasimuloval nějaký posuv 32bit registru a podíval se na výsledek a CF. Stejné dvojslovo jsem uložil do oper. paměti DOPu a provedl posun o 2 wordy. Výsledky se beze zbytku shodovali s provedenou operací na PC. Jen doufám, že se daná instrukce bude chovat stejně i na nové verzi simulátoru DOP.
BaCK