Datamaskinen Putte

Putte, en svensk dator, 1961.

Datamaskinen Putte var en svensk dator som färdigställdes i början av 1961 vid FOA 3, efter ett utvecklingsarbete som startade två år tidigare. Målet med maskinen var att vinna erfarenhet av arbete med datamaskiner, ett fenomen som då åtminstone i Sverige var något nytt. Det gällde beräkningar i realtid (inför det separata STRIL 60-projektet), vilket har intresse inom områden såsom processkontroll, trafikövervakning med mera och har sin givna plats i militära sammanhang.

Uppbyggnad

Putte var en binär, parallell enadressmaskin för beräkningar med fast binärkomma i realtid. Ordlängden var 16 bitar (inklusive tecken), och dess minne innehöll 1 024 celler. Instruktionslistan upptog 41 instruktioner, vilket innebar att utrymme fanns för en framtida utvidgning.

För Puttes uppbyggnad användes konventionella kretsar innehållande relativt billiga komponenter. De olika kretsarna byggdes upp på drygt 200 kort med tryckt ledningsdragning. Korten har därefter sammanförts i ett antal ramar monterade i två standardmässiga 19-tumsstativ. Dessa stativ täcktes framtill av dörrar, på vilka de nödvändiga manöver- och övervakningsdonen placerats.

Maskinen innehöll ungefärligen 3 000 transistorer och 1 900 dioder. Den färdigbyggdes i början av 1961, och efter en tids inkörning (innefattande vissa kretstekniska förbättringar) kunde den tas i aktiv drift. Efter vad laborator Olof Carlstedt meddelade, var drifterfarenheterna goda. Putte användes dagligen för beräkningar i samband med vissa experimentella systemundersökningar, och planer fanns på ett utnyttjande av maskinen i samverkan med andra system under fältmässiga förhållanden.

Puttes olika enheter beskrivs nedan: räkneenhet, minne, styrenhet, programvalsenhet, transferenhet och manöverbord.

Beräkningar i verklig tid

Till de speciella problemen vid beräkningar i realtid hör till exempel kravet att datorn måste förses med särskilda in- och utorgan, som ger direkt kommunikation med den fysikaliska processen. Eftersom de flesta processerna till sin natur är analoga, måste i regel omvandlingar mellan signaler i analog och digital form ske i båda riktningarna. För att datorn ska kunna sköta sina uppgifter tillfredsställande, måste ofta ett stort antal variabler kontinuerligt mätas och bearbetas. Som resultat av bearbetningen erhålls ett antal kontrollsignaler, som återförs till processen och som ytterligare ökar det totala antalet in- och utkanaler. Detta antal kan i vissa fall nå tresiffriga värden.

In- och utorganen är däremot ofta tämligen rudimentära, något som kanske speciellt gäller inorganen.

En komplikation är den bundenhet i tiden, som man alltid har för datorns arbete vid beräkningar i realtid. Denna bundenhet har flera orsaker. Tiden mellan två på varandra följande mätningar av samma variabel måste till exempel stå i en viss relation till den fysikaliska processens tidskonstanter, vilket innebär att en viss mängd databehandling måste ske under en bestämd tid. Vidare är det vanligt att data i processen uppstår och finns tillgängliga endast under begränsade tidsperioder. Sådana data måste givetvis tas om hand medan de är presenteras. Av olika skäl vill man också att vissa saker ska ske på bestämda klockslag, och en klocka brukar därför ingå i kontrollsystemet.

Det kan hända att processens tillstånd plötsligt ändras och att ändringen kräver en ny typ av bearbetning i datorn, det vill säga ett byte av program. Sådana programbyten brukar initieras av brytsignaler från processen, och under inverkan av en sådan brytsignal ska datorn snabbt bryta det pågående programmet till förmån för ett nytt. Ofta krävs dessutom att det avbrutna programmet ska kunna återupptas som om ingenting hade hänt, när det nya programmet blivit klart med sin uppgift.

Representation av data och instruktioner

För att förenkla räkneenhetens konstruktion, valde man för Putte en binär talrepresentation med negativa tal i form av tvåkomplement. Registren hade i regel 16 positioner med den mest signifikanta använd för att ange talens tecken; övriga positioner användes i vanlig ordning för att ange talstorleken.

Instruktionerna representerades inom maskinen av en sifferkombination, vilken indelades i två grupper: en operationsdel och en adressdel. Sifferkombinationen innehöll 16 binära siffror. De första sex utgjorde operationsdelen och de återstående tio adressdelen. Den första biten i operationsdelen hade dessutom en speciell funktion, i det att den var en indexmärkning.

Ett manuellt hanterande av de binära talen ställer sig tämligen opraktiskt, och därför övergick man till hexadecimala tal, tidigare även kallade sedecimala. För att undvika en sammanblandning av operationsdel och adressdel i samma hexadecimala siffra, lät man för Putte operationsdelen bilda två och adressdelen tre hexadecimala siffror. Alla program inlästes i Putte i denna form, och inläsningsprogrammet skötte automatiskt omvandlingen av de fem hexadecimala siffrorna till 16 bitar.

Räkneenhet

Räkneenheten innehöll tre olika register: ett ackumulatorregister, ett multiplikandregister och ett multiplikatorregister. Dessutom fanns en adderare med vars hjälp man kunde addera (eller subtrahera) innehållet i multiplikandregistret till innehållet i ackumulatorregistret.

Varje aritmetisk operation berör samtidigt två tal, av vilka det ena ska finnas tillgängligt i ackumulatorregistret före operationens början. Det andra hämtas automatiskt från minnet och placeras i multiplikandregistret, vilket sköter all kommunikation med maskinens minne. Alla resultat erhålles i ackumulatorregistret och kan därför direkt ingå i en ny operation.

Alla vid beräkningarna förekommande tal x skulle ligga i intervallet –1 < x < + 1. Erhölls vid någon operation ett resultat som inte uppfyllde detta villkor, indikerades automatiskt spill. Manuellt kunde man välja mellan tre alternativa åtgärder vid spill. Man kunde låta maskinen automatiskt stanna eller hoppa till en undersekvens i programmet, alternativt fortsätta beräkningarna och överlåta åtgärderna till programmeraren. I samtliga fall erhölls en spillindikation på en speciell kontrollampa.

Ett spill upptäcks med hjälp av en speciell position i räkneenhetens ackumulator- och multiplikandregister. Denna position hade skjutits in mellan teckenpositionen och positionen närmast till höger om denna. Ett spill upptäcks därigenom, att den extra positionen skiljer sig från teckensiffran. Spill indikerades vid addition, subtraktion och division, men inte vid vänsterskift. Spill vid multiplikation inträffar inte, eftersom samtliga tal förutsätts ha beloppet mindre än ett före multiplikationernas utförande.

Utöver de fyra räknesätten kunde man i räkneenheten bilda absolutbelopp, byta tecken samt addera och subtrahera absolut. Dessutom kunde skiftoperationer utföras.

Operationstidernas längd varierade. Följande tider ges som exempel. Siffervärdena innefattar också tiden för respektive instruktions uthämtande.

OperationTid
µs
Addition och subtraktion60
Multiplikation210
Division320
Skift n steg45 + 10 n
Ovillkorligt hopp50

Minne

Minnet utgjordes av ett ferritminne av koincidenstyp. Det innehöll 1 024 celler om vardera 16 bitar. Tiden för en komplett lässkrivcykel var 12 µs, och denna cykel kunde om man ville avbrytas mellan utläsningen och den efterföljande inläsningen.

Styrenhet

Styrenheten innehöll ett antal delar med olika funktioner:

Styrpulsgenereringen var enkel. Den bestod av en samling grindar, som ombesörjer den tid-rumuppdelning, som fordras för de olika mikroprogrammen. Grindarna är då styrda av de avkodade innehållen i ett operationsregister (där den från minnet uthämtade operationsdelen av en instruktion placeras) och en räknare (vilken kontinuerligt tillförs räknepulser under en instruktion). Arrangemanget kunde knappast sägas vara ekonomiskt, men den enkla uppbyggnaden medgav vid behov lätt ändringar i instruktionslistan.

Varvräkning

En varvräkning med hjälp av räkneenheten resulterar i en sänkning av räknehastigheten. För att undvika detta var Putte försedd med automatiska anordningar för detta ändamål, ett indexregister.

Totalt fanns två sådana register för varvräkning. Användningen av det ena var dock förenat med vissa restriktioner, eftersom registret även nyttjades till att hålla reda på antalet utförda skift vid skiftinstruktionerna. Därför användes benämningen indexregister enbart för det register som oinskränkt kunde utnyttjas. Det andra registret kan vi kalla binärräknaren, eftersom det väsentligen har samma funktion som en sådan.

Antag att en viss programsekvens ska genomlöpas n varv. Varvräkningen kan då utföras med hjälp av indexregistret (eller binärräknaren) på följande sätt. Innan sekvensens beräkningar inleds, placeras heltalet n i indexregistret. Det sista momentet för varje varv som sekvensen genomlöps får sedan vara att minska innehållet i indexregistret med en enhet och hoppa, om innehållet är annat än noll. Den aktuella sekvensen kommer med detta arrangemang att genomlöpas tills innehållet i indexregistret blir noll, det vill säga n varv.

Ofta behöver man på en och samma gång räkna varv i flera programsekvenser. En fullt utförd varvräkning enligt nämnda principer kräver därför ett stort antal indexregister. Putte har, som sagt, endast ett egentligt sådant register, men en samtidig varvräkning i flera sekvenser kunde ändå utföras utan att räkneenheten behövde tas i anspråk. Instruktionslistan innehöll nämligen instruktioner, vars mikroprogram utförde följande moment.

Först uthämtas och insätts i indexregistret ett tal från den minnescell, som instruktionens adressdel angivit. Därefter minskas detta tal med en enhet, varefter återläsning till samma minnescell sker. Med hjälp av en efterföljande hoppinstruktion är det nu möjligt att pröva om det önskade antalet instruktioner utförts eller ej. Det blir på sätt och vis den nämnda minnescellen som kommer att tjänstgöra som ett slags indexregister, och antalet "indexregister" i Putte kan därför sägas vara mycket stort.

Adressmodifiering

Minnet i Putte adresserades inte direkt från en instruktions adressdel (införd i ett adressregister), utan i stället bildades en "effektiv adress" i en speciell indexadderare. Denna effektiva adress bestod av skillnaden mellan instruktionens adressdel och innehållet i indexregistret. Den nödvändiga subtraktionen sker emellertid inte obetingat; en förutsättning var att indexmärkningen i instruktionens operationsdel innehöll en etta; instruktion måste vara märkt. Skulle detta inte vara fallet (att instruktionen var omärkt), uppfattas indexregistrets innehåll som noll oberoende av det verkliga innehållet, i så fall överensstämmer den effektiva adressen givetvis med instruktionens adressdel.

Liksom vid varvräkning kunde det hända, att adressmodifiering önskades samtidigt i flera sekvenser, vilket återigen bäst ordnades med flera indexregister. Puttes ordlängd tillät emellertid endast ett sådant, och därför tvingades man att utnyttja celler i minnet i kombination med det indexregister som fanns, på liknande sätt som skedde vid varvräkningen.

Det tal som placerat i indexregistret användes för att bilda den effektiva adressen vid automatisk adressmodifiering, kunde givetvis samtidigt användas för varvräkning.

Programvalsenhet

Programvalsenheten var den del av Putte, som främst svarade för möjligheten till beräkningar i verklig tid. Uppgiften var att initiera och leda programhopp föranledda av brytsignaler, det vill säga att avbryta pågående uppgifter till förmån för andra beräkningar samt att återuppta det avbrutna arbetet, sedan de nya uppgifterna färdigbehandlats.

Programvalsanordningen fungerar på följande sätt. Normalt utförs beräkningarna efter ett huvudprogram. (Huvudprogrammet behöver inte utgöras av ett program i egentlig mening, det kan till exempel bestå endast av ett väntetillstånd.) Innan varje ny instruktion i huvudprogrammet uthämtas, avkänns ett speciellt register i programvalsenheten, där inkommande brytsignaler lagras. Om denna avkänning ger till resultat att registret innehåller talet noll, det vill säga att inga brytsignaler är för handen, uthämtas i vanlig ordning nästa instruktion i huvudprogrammet. Skulle däremot avkänningen visa, att (en eller flera) brytsignaler inkommit, uthämtas inte nästa instruktion i huvudprogrammet. I stället sker ett automatiskt hopp till ett bestämt brytprogram, vilket är associerat till den aktuella brytsignalen.

Vid själva hoppet sker likaledes automatiskt en lagring i brytprogrammet av nästföljande instruktions adress i huvudprogrammet samt av innehållet i vissa register. Tack vare detta kunde maskinen återställas till det tillstånd den hade före avbrottet, sedan brytprogrammets beräkningar utförts, det vill säga huvudprogrammets beräkningar kunde återupptas som om ingenting hade hänt.

För att förhindra att avbrott begärs samtidigt av mer än en brytsignal, ordnades dessa efter en viss prioritet. Programvalsenheten innehöll särskilda kopplingskretsar som höll reda på denna prioritet. Pågick ett visst brytprogram, tilläts inga avbrott initierade av brytsignaler med lägre prioritet än det pågående programmets. Inkommer däremot en brytsignal med högre prioritet, sker nytt avbrott. Återgång till huvudprogrammet sker sedan efter fallande prioritetsordning. Huvudprogrammet har således den lägsta prioriteten, vilket innebär att samtliga beordrade avbrott genomförs innan huvudprogrammets beräkningar återupptas.

Brytsignalerna används, vilket redan påpekats, för att synkronisera Puttes arbete med arbetet hos yttre processer. De medgav även ett enkelt sätt för manuell kontroll av beräkningarna. Man kunde till exempel genom ett manuellt införande av en brytsignal till Putte efterfråga innehållet i en minnescell, beordra en viss inläsning eller en viss beräkning, etc. Sådana möjligheter är nödvändiga när datorn ingår i system som ska övervakas av mänskliga operatörer.

En intressant tillämpning av brytsignalerna får man, om man låter Putte generera brytsignaler till sig själv. På så sätt får man i viss mån nya möjligheter till flexibilitet i beräkningsarbetet.

Transferenhet och yttre enheter

All kommunikation mellan Putte och omvärlden skedde via transferenheten, som kan uppfattas som en växel, där beordrad yttre enhet väljs. För att detta ska kunna ske, har varje sådan enhet tillordnats en adress, som till formatet överensstämmer med en minnesadress.

För in- och utmatning finns i instruktionslistan två instruktioner, vilka överför innehållet i ackumulatorregistret till eller från den yttre enhet som har adressen sammanfallande med instruktionens adressdel.

De yttre enheterna kan vara av olika slag, men de måste i sig innehålla eller kunna uppfattas som register med upp till 16 positioner. Eventuella synkroniseringsproblem bemästras enklast med hjälp av brytsignalerna. Vill man låta Putte utgöra en del av ett i övrigt analogt system, måste det finnas en omvandlare till och från signaler i analog form.

Putte innehöll ett antal register, som från maskinens synpunkt i övrigt hör till de yttre enheterna. Till dessa register kunde apparater av olika slag anslutas, eftersom registrens in- och utgångar anslutits till ett kopplingsfält. De yttre apparaterna kunde i sin tur anslutas till kopplingsfältet med vanliga kopplingssladdar.

Manöverbord

Manöverbordet innehöll alla anordningar som fordrades för manuell manövrering och övervakning av maskinen. Därifrån kunde godtyckliga tal placeras i godtyckliga register eller minnesceller. Lamptablåer fanns, på vilka innehållen i de olika registren kan avläsas. Där finns även omkopplare, med vars hjälp man kunde bestämma åtgärderna vid spill, underlätta felsökning etc.

Instruktionslistan

Många av instruktionslistans instruktioner har redan nämnts. Det återstår emellertid några instruktioner, som bör nämnas för att framställningen ska bli fullständig.

Det fanns i Puttes instruktionslista nio hoppinstruktioner, av vilka fem var villkorliga.

Hoppinstruktionerna kan indelas i tre olika grupper: enkla hopp, Wheeler-hopp och programvalshopp. Instruktioner i den första gruppen används, då ett visst avgränsat beräkningsmoment avslutats och ett nytt ska inledas. Wheeler-hopp används för ingång i standardprogram och utfördes i Putte med hjälp av en speciell instruktion, vars mikroprogram innefattade delvis automatisk administration av återhoppsadressen.

I samband med standardprogram har man för övrigt en svårighet, orsakad av brytsignalprincipen. Vill man nämligen använda ett och samma standardprogram för flera brytprogram, uppstår konflikter. Ett bemästrande av dessa förutsätter, att instruktionslistan upptar instruktioner för ändring eller upphävande av brytsignalernas prioritet. Sådana instruktioner saknades i Puttes instruktionslista, och ville man använda ett och samma standardprogram i flera brytprogram, måste man duplicera standardprogrammets instruktioner i samtliga brytprogram.

Den sista gruppen, programvalshopp, innehåller två speciella instruktioner för in- och uthopp i ett brytprogram. Dessa instruktioner innefattar all den administration som är nödvändig för ett senare återupptagande av det vid avbrottet uppskjutna arbetet. Inhoppsinstruktionen placeras i en speciell minnescell, som är direkt associerad till en bestämd brytsignal. Därigenom kan nämnda brytsignal användas för automatiskt hopp till en godtycklig cell i minnet.

En speciell stoppinstruktion användes för att mer eller mindre definitivt avbryta beräkningarna. I många fall vill man emellertid avbryta beräkningarna endast temporärt, för att återuppta dem så snart en brytsignal inkommer, det vill säga man vill initiera alla beräkningar med hjälp av brytsignaler samt ha perioder av väntan mellan olika beräkningsavsnitt. Detta ordnades i Putte programmeringsvägen på så sätt att maskinen försattes i ett svängningstillstånd med uthämtande av samma instruktion ideligen.

Referenser

(Denna artikeln om datamaskinen Putte är hämtad från Teknisk tidskrift 1962.Texten har lätt friserats. Ursprungstexten hittas i angiven källa nedan.)

Noter

  1. 1 2 ”Tidslinje Elektronikvecklingen 1945 - 1990”. www.aef.se. https://www.aef.se/Elektronikutveckling/Artiklar/Tidslinje_teknikutv.htm. Läst 17 augusti 2025.
  2. ↑ Omvandlare för siffermaskiner i Teknisk Tidskrift