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.