Fleranv�ndar-FORTH p� FCPU
Paul Svensson
Inge Wallin
LYSATOR, LiTH

I den h�r artikeln beskriver vi hur vi hade t�nkt oss den FORTH som
blir n�sta steg efter det som finns nu. Den nuvarande FORTHen �r bara
f�r en anv�ndare, men n�sta skall bli ett komplett fleranv�ndarsystem! 

Lysator har en unik maskin, en FCPU fr�n DataSAAB. Den �r den enda
sitt slag i v�rlden. D�rf�r existera ytterst lite mjukvara till den, t
ex s� finns det inget operativsystem. Pga detta har FCPUn st�tt mer
eller mindre stilla genom �ren. Nu har den dock b�rjat anv�ndas i och
med att Paul Svensson har hackat ihop en FORTH till den. 

Denna FORTH, som �r ganska primitiv, har varit ett test inf�r den
egentliga uppgiften: att skriva ett fler anv�ndarsystem. Att det blev
just FORTH beror p� att det spr�ket ha rykte om sig att vara extrem
l�ttimplementerat. Det skulle allts� borga f�r att det hela inte blev
�nnu ett oavslutat projekt. 

N�r Lysator omstartades 1984 d�pte FCPUn till Cecilia och planerna p�
FORTH b�rjade ta fast form. Efter som maskinen saknade vettigt I/C
besl�t vi att f�rst bygga ett terminalkort. Paul och Krister (Joas)
satte h�sten -85 ig�ng ett projekt i kursen digital konstruktion, som
skulle inneh�lla bl a �tta terminalsn�ren. Det hela drog dock ut p�
tiden (lumpen kom emellan), men i januari i �r b�rjade kortet bli
f�rdigt. N�r vi funderade p� vad vi skulle hacka ihop f�r att
demonstrera kortets funktion f�ddes iden med mikroFORTH, dvs en FORTH
som exekverar helt och h�llet i mikrokodsminnet. 

Att skriva en FORTH visade sig till] och med vara enklare �n
v�ntat. Trots n�st intill inga tidigare erfarenheter av spr�ket tog
det bara tv� veckor fr�n ide till fungerande system! Sedan dess har
mikro-FORTHen vidareutvecklats, och den inneh�ller nu drygt trehundra
ord. Ett trettiotal av dessa �r skrivna direkt i mikrokod, resten i
FORTH. Vi anv�nder ocks� en av terminalledningarna till att f�ra �ver
diskblock till och fr�n Lysators ABC1600, Ingrid, d� Cecilia saknar
egna sekund�rminnen.  

Mikro-FORTHen �r dock ganska begr�nsad, eftersom vi inte ville anv�nda
mer h�rdvara �n absolut n�dv�ndigt. Det visade sig m�jligt att skriva
systemet s� att bara CU och CS (ett halvt sk�p av fyra) beh�vde
anv�ndas. Resten av maskinen beh�ver inte ens vara str�msatt. 

N�r man skall bygga ett fleranv�ndarsystem kan man naturligtvis inte
begr�nsa sig p� det viset. Man b�r i st�llet str�va efter att utnyttja
hela maskinens kapacitet. F�r att ge en inblick i vad FCPUn klarar av
kommer h�r en kort beskrivning: 

att FCPUn best�r, som den minnesgode l�saren redan vet, av tre delar:
CU, AU och FU. CU (Control Unit) �r den styrande delen d�r
mikrokodstolken ligger. Den �r ansluten till det skrivbara
mikrokodsminnet (CS = Control Storage). I CU finns ocks� statusbitar
f�r hela maskinen, en 16-bitars ALU, n�gra register, realtidsklockor,
mm. Dessa delar, som �r skuggade i figuren ovan, �r de enda som
utnyttjas i mikro-FORTH. 

AU (Arithmetic Unit) inneh�ller ett antal register och en 64-bitars
ALU. ALUn ing�r som ett litet kuriosum en 64-bitars barrel-shifter. 

FU (Field access Unit) �r kort sagt gr�nsnittet till maskinens
internminne. Minnet uppg�r f n till 512 KByte vilket fyller tv� sk�p,
men kan bygga ut till 2 MByte. Detta v�ntas uppta ett kort. FU kan
l�sa och skriva ord av 18 bytes l�ngd i minnet, oberoende av
ordgr�nser. Den har dessutom en handfull register som kan r�knas upp
eller ner p� ett enkelt s�tt. 

En intressant detalj med FCPUn �r att dessa delar kan arbeta
parallellt. Man kan allts� ha flera mikroinstruktioner under
exekvering samtidigt (max 4). D�rf�r blir en FORTH som utnyttjar alla
delar snabbare �n den nuvarande. En annan uppsnabbande faktor �r att
de olika delarna utnyttjas till det som de �r gjorda f�r. I
mikro-FORTHen �r t ex ett h�gerskift implementerat i mikro-ALUn en bit
�t g�ngen. N�r vi kan utnyttja AUn s� f�r vi hela skiftningen gjord
med en instruktion. 

FORTHs s�tt att arbeta 
I FORTH arbetar man hela tiden mot en stack. Alla aritmetiska och
logiska funktioner tar sina argument fr�n stacken och l�gger sina
resultat d�r. Dessutom finns ett antal ord som har som sin enda
uppgift att manipulera stacken. Denna stack kallas datastacken. 

FORTH �r ju ett programmeringsspr�k. Det beh�vs allts� en plats d�r
man kan lagra returadresser som uppkommer genom proceduranrop. 

Det �r naturligtvis m�jligt att lagra dessa tillsammans med de andra
data p� datastacken; det �r s� som t ex PASCAL fungerar, men i FORTH
har man valt ett lite annorlunda s�tt att se p� saken, och har allts�
tv� stackar. Den andra stacken kallas f�r returstacken. 

B�da dessa stackar har var sin stackpekare som av tradition kallas SP
(Stack Pointer) och RP (Return stack Pointer). Ett tredje viktigt
register �r instruktionspekaren, IP.  

Ett program i FORTH best�r av ett antal FORTHord, eller kortare
ord. Alla ord finns lagrade i en ordlista. H�r finns data om hur ordet
skall anv�ndas samt definitionen av ordet. Definitionen av ett ord
best�r uteslutande av en serie adresser. P� dessa adresser finns andra
ord och n�r man k�r sitt program kommer underorden att i sin tur
exekveras. L�ngst ned finns ord skrivna i mikrokod. 

Alla ord lagras i en ordlista. I multi-FORTH �r ordlistan
implementeras som en l�nkad lista d�r huvudet till varje element ser
ut s� h�r: 

L�ng l�nk (om kort l�nk =o)     (24 bitar)
Kort l�nk till f�reg�ende ord   (8 bitar)
Statusbyte f�r ordet            (8 bitar)
immediate                       ( 1 bit)
smudge                          ( 1 bit)
reserv                          ( 1 bit)
l�ngd p� namnet                 ( 5 bitar)
Namnet                          (max 31 byte)
Kodpekare                       (8 bitar)


Efter huvudet f�ljer relevanta data f�r respektive ord.

L�nken till f�reg�ende ord �r normalt bara ett �tta bitars offset, men
eftersom detta inte r�cker om man beh�ver en l�ng l�nk, s� finns
m�jligheten att anv�nda en 24 bitarsadress som l�nk. Den korta l�nken
�r d� 0. 

Immediatebiten talar om ifall ordet skall exekveras �ven vid
kompilering. Smudgebiten �r till f�r att d�lja namnet i ordlistan. 

Kodpekaren �r ett index till en hopptabell i mikrokodsminnet d�r den
exekverbara mikrokoden finns FORTH-kod best�r allts� av adresser till
kodpekare(!). Denna kod tolkas av en stump mikrokod som liknar det h�r: 

     @IP -> WA       ;IP 24 bitars adress
     IP+24 -> IP     ; 3 byte fram�t
     JMP Tabell+@WA  ; WA 24 bitar,
                     ; 8 bitars index i Tabell

Tabellen ligger i mikrominnet och inneh�ller hoppinstruktioner.

F�r ord skrivna i FORTH, h�gniv�ord, �r relevanta data en serie
adresser (se ovan) till andra ord. Kodpekaren refererar d� till
mikrokod som sparar IP p� returstacken och l�gger in WA+8 (dvs f�rsta
adressen efter kodpekaren) i IP. Serien med adresser avslutas med ett
ord som �terst�ller TP fr�n returstacken. 

Multipla processer i multi-FORTH 
N�r en anv�ndare s�tter sig ner f�r att k�ra multi-FORTH kommer han
(vi har inga flickor i Lysator) att m�tas av en loginprompt. S� fort
han har loggat in f�r han tillg�ng till ett FORTH-system med 24 och 64
bitars ordl�ngd, fullst�ndigt flyttalspaket med 64 och 128 bitars
flyttal, tr�dorienterat filsystem, fullst�ndig sk�rmeditor, virtuellt
minne och kraftfulla primitiver f�r hantering av parallella
processer. 

Minnet p� 512 KByte delas upp i tv� delar; En del som �r gemensam f�r
alla processer och d�r grundFORTHen lagras, och en del som anv�nds av
de processer som finns. Den f�rsta delen inneh�ller ordlistan,
blockbuffertar och gemensamma variabler och semaforer. 

Den andra delen �r i sin tur uppdelad s� att varje process har plats
f�r systemvariabler, ordlistor och stackar. Naturligtvis finns inget
som hindrar processerna att skriva och l�sa varandras minnesareor. Det
�r n�mligen s� som processerna kommunicerar med varandra. 

Den h�r uppdelningen �r endast logisk och inte fysisk, alla processer
exekverar i en gemensam adressrymd. 

En viktig del av ett flerprocessystem �r hur man tilldelar processorkraft 
till processerna. I FORTH �r det vanligaste systemet att en process
f�r anv�nda CPUn s� l�nge den vill. Med ett s�rskilt ord l�ter man
andra processer f� tillg�ng till processorn. S� fungerar ocks�
multi-FORTH. En process f�r dock inte l�gga beslag p� all processorkraft 
hur l�nge som helst. Har den inte l�mnat �ver kontrollen till en annan
process inom 1 sekund s� �terst�lls processen och placeras sist i processk�n. 

Processk�n, en cirkul�r l�nkad lista, finns i mikrominnet. H�r finns
f�rutom pekaren till n�sta process i k�n en pekare till varje process
startadress i huvudminnet. I de f�rsta orden i processens arbetsarea
ligger en del information om processen. H�r finns t ex start- och
slutadress f�r processens minne, utrymme f�r att lagra stackpekare f�r
data- och returstack n�r processen �r inaktiv och startadresser f�r
stackarna och instruktionspekaren. Dessutom finns en flagga som talar
om huruvida processen �r aktiv eller inte. Det �r viktigt att m�rka
att detta inte ligger i mikrominnet eftersom det ger andra processer
m�jlighet att manipulera alla processparametrar.