City & Guilds Mnemonisk kod

City & Guilds Mnemonic Code och dess tillhörande City & Guilds Computer var en specifikation för ett assemblerspråk och ett virtuellt datorsystem som körde det. Den introducerades 1964 av City and Guilds of London Institute och användes som grund för ett antal datorprogrammerings- och administrationskurser. Datormodellen var medvetet mycket enkel, och operativa system implementerades som tolkar på ett antal stordatorer som ICL 1900- serien och Elliot 900- familjen. En uppdaterad version släpptes 1968.

Historia

City and Guilds of London Institute (C&G) har erbjudit ett brett utbud av yrkes- och lärlingsprogram sedan slutet av 1800-talet . I början av 1960-talet började de första datorsystemen snabbt växa fram i stora företag, och C&G beslutade sig för att introducera en serie program om datordrift och programmering.

City & Guilds Mnemonic Code åtgärdade problemet med utbredd inkompatibilitet mellan plattformar genom att introducera ett enda nytt assemblerspråk som sedan kunde tolkas i en virtuell maskin på vilken tillräckligt kraftfull plattform som helst. Systemet förenklades medvetet för att göra antalet maskiner som kunde köra det så stort som möjligt. Den lade också till ett antal funktioner som man normalt inte skulle associera med assembler, inklusive standarddataformatet är flyttal och inklusive ett antal funktioner för avancerad matematik och stränghantering som normalt skulle förväntas på ett högnivåspråk som BASIC .

Den första utgåvan var 1964 och användes i två kurser, grundläggande och avancerade certifikat för datorpersonal. Systemet uppdaterades 1968 som Revised Mnemonic Code, då grundkursen blev Certificate in Computer Programming and Information Processing.

Beskrivning

Datorn var en märklighet eftersom dess grundläggande datatyp var flyttalstalet, i motsats till majoriteten av verkliga maskiner som använde binära heltal, eller för erans affärsorienterade maskiner, binärkodad decimal . Förutom de lågnivåkommandon som finns i de flesta assemblers, som att ladda data från minnet eller bitskiftning , inkluderade C&G även multiplikation och division, såväl som ett antal mer avancerade funktioner som exponenter och trigonometriska funktioner. En minnesplats kan alternativt innehålla ett tecken.

Datorn definierades för att ha ett huvudminne på 1000 ord. De tio första adresserna kunde användas som indexregister men hade också speciella betydelser. Plats noll var permanent inställd på värdet noll, medan 1 var ackumulatorn . 4 höll returadressen under subrutinsamtal . I den reviderade utgåvan användes 5 med LOP- instruktionen och 6 och 7 användes för att specificera formatet vid konvertering från tecken till siffror med CNC -instruktionen.

Maskinen var en ackumulatorkonstruktion . De flesta instruktioner tog två operander som pekade in i huvudminnet, kallade n och m. n var normalt ett 12-bitars värde 0 till 999, medan m valde ett av registren, 0 till 9. Värdet i det registret lades till n för att skapa en fullständig adress. Till exempel ADD- instruktionen de två operanderna, adderade värdet i det valda registret m till det konstanta värdet n och fick sedan åtkomst till värdet på den resulterande minnesplatsen, kallad C.

I dokumentationen, om värdet i fråga lästes från en minnesplats angavs det i parens, så de flesta instruktioner var av formen n+(m), vilket innebär att värdet i registret/minnesplatsen m adderades till det konstanta värdet n. Addition utförde operationen A = A + (n+(m)) , vilket betyder att värdet i register m adderades till det konstanta värdet n, och sedan lades värdet i den resulterande minnesplatsen, (n+(m)), till värde redan i ackumulatorn.

Systemet skapades innan ASCII hade standardiserats och, som var typiskt för erans maskiner, använde det sin egen anpassade teckenuppsättning . Detta höll 0 till 9 på platserna 0 till 9, A till Ö i 10 till 35, och sedan ett antal symboler för totalt 64 tecken.

Systemet saknade någon möjlighet att inkludera kodkommentarer . Det saknade också symboliska etiketter, så om programmet lade till eller tog bort rader var programmeraren tvungen att manuellt uppdatera grenarnas placeringar.

Instruktioner

Instruktionerna i Mnemonic Code kan delas in i tre breda kategorier, grundläggande matematiska och logiska operationer som nära återspeglar de flesta assembler-språk, ytterligare matematiska operationer och inmatnings-/utdataoperationer . Ett konstigt tillägg är "Q", för "fråga", som kan läggas till på framsidan av vilken instruktion som helst. När Q påträffades körde tolken instruktionen och matade sedan ut felsökningsinformation till skrivaren.

Instruktionerna, beroende på version, lagrades internt i formatet:

FF [Q] nnn m

FF, "ordernumret", var den numeriska instruktionens opkod. Q angav frågefunktionen, och nnn och m var tresiffriga och ensiffriga värden för n och m. Siffror angavs i decimalformat.

Grundläggande operationer

Systemet delade upp sina grundläggande aritmetiska och logiska operationer i flera grupper för organisatoriska ändamål. Om inget annat anges är listorna från Elliot 903-dokumentationen.

Grupp 0, ackumulator-/minneoperationer:

Opcode Mnemonic Drift
00 LDA n,m Ladda data lagrade på plats n+(m) i ackumulatorn
01 ADD n,m Lägg till värdet lagrat i n+m till värdet i ackumulatorn, A = A + (n+(m))
02 SUB n,m Subtrahera värdet vid n+m från värdet i ackumulatorn, A = A - (n+(m))
03 MLT n,m Multiplicera värdet lagrat i n+m med värdet i ackumulatorn, A = A x (n+(m))
04 DIV n,m Dividera värdet vid n+m från värdet i ackumulatorn, A = A / (n+(m))

Grupp 1, ackumulator/konstantoperationer, med en enda operand som har ett heltalsvärde. I den ursprungliga specifikationen användes endast n, i 1968 års revidering kan m valfritt tillhandahållas och dess värde läggas till konstanten i n.

Opcode Mnemonic Drift
10 LDAN n Ladda konstanten 0 till 999 i ackumulatorn
11 ADDN n Lägg till värdet till ackumulatorn, A = A + n [+(m)]
12 SUBN n Subtrahera värdet vid n+m från värdet i ackumulatorn, A = A - n [+(m)]
13 MLTN n Multiplicera värdet lagrat i n+m till värdet i ackumulatorn, A = A xn [+(m)]
14 DIVN n Dividera värdet vid n+m från värdet i ackumulatorn, A = A / n [+(m)]

Grupp 2, butiksvärde:

Opcode Mnemonic Drift
20 STA n,m Lagra ackumulatorns värde på plats n+(m)

Grupp 3, test och gren:

Opcode Mnemonic Drift
30 JUN n,m Hoppa till n+m (ovillkorligt hopp)
31 JGR n,m Hoppa till n+m om ackumulatorn är > 0
32 JEQ n,m Hoppa till n+m om ackumulatorn är 0
33 JSR n,m Skriv returadressen till plats 4 och hoppa till n+(m) (hoppa till subrutin)
34 JST n,m Stoppa exekveringen, när användaren trycker på GO, plocka upp vid n+(m)

Den reviderade utgåvan ändrade några av koderna och lade till nya. Listan i detta avsnitt är från ICL-dokumentationen:

Opcode Mnemonic Drift
30 JUN n,m Hoppa till n+m (ovillkorligt hopp)
31 JEQ n,m Hoppa till n+m om ackumulatorn är 0
32 JNE n,m Hoppa till n+m om ackumulatorn inte är 0
33 JLE n,m Hoppa till n+m om ackumulatorn är <= 0
34 JGE n,m Hoppa till n+m om ackumulatorn är >= 0
35 JLT n,m Hoppa till n+m om ackumulatorn är < 0
36 JGR n,m Hoppa till n+m om ackumulatorn är >= 0
37 JSR n,m Skriv returadressen till plats 4 och hoppa till n+(m) (hoppa till subrutin)
38 JST n,m Stoppa exekveringen, när användaren trycker på GO, plocka upp vid n+(m)
39 LOP n,m Minska värdet i register 5, hoppa sedan till n+(m) om värdet > 0

LOP-instruktionen används för att implementera loopar; genom att placera antalet iterationer i register 5, kommer LOP att minska värdet varje gång och sedan hoppa tillbaka till toppen av slingan.

Utökad matematik

Grupp 4 är en uppsättning matematiska standardfunktioner:

Opcode Mnemonic Drift
40 SQT n,m Kvadratroten av värdet i A. Om n+(m) inte är noll, kommer ett fel att lämna A oförändrat och hoppa till den platsen. Om n+(m) är noll gör fel att exekveringen stoppas.
41 EXP n,m Exponent för värdet i A. Överflöden hoppar till n+(m)
42 LGN n,m Naturlig logaritm för värdet i A. Överflöden hoppar till n+(m)
43 SYND Sinus av värdet i A
44 COS Cosinus av värdet i A
45 BÅGE Arktangens för värdet i A
46 ENT Heltalsdel av värdet i A

Ingång/utgång

Grupp 5, 6 och 7 är in-/utmatningsinstruktionerna . Det finns betydande skillnader mellan de två kända versionerna, ICL och Elliot, men det är inte klart om dessa är skillnader på grund av att Elliot-versionen är den tidigare specifikationen, eller om det beror på att maskinen saknar band- och diskstöd och därför helt enkelt tar bort instruktioner relaterade till dessa enheter. Resultatet är en relativt begränsad uppsättning funktioner:

Opcode Mnemonic Drift
50 RCT n,m Läs ett enstaka tecken från hålband och lagra det på (n+(m))
51 PCT n,m Stansa tecknet vid (n+(m)) för att tejpa
52 RNT n,m Läs ett nummer från bandet i ackumulatorn
53 PNT n,m Stansa numret i ackumulatorn för att tejpa
52 PNL Slå en nyradsfigur
60 RCC n,m Läs alla tecken på ett hålkort i minnet med början på (n+(m))
61 PCC n,m Stansa tecken som börjar på (n+(m)) på ett kort
62 RNC n,m Läs nummer på kortet till (n+(m))
63 PNC n,m Stans nummer vid (n+(m)) till kortet

Däremot är ICL-versionen, som motsvarar 1968 års specifikation, mycket mer flexibel. Dess dator hade en enda ingång och en enda utgångskanal som kunde kopplas till olika enheter. Det fanns fem enheter definierade, 10 var pappersbandläsaren, 30 var kortläsaren, 50 var magnetband, 60 var ett diskpaket och 80 var en skrivare. För att använda en av enheterna anropades instruktionen ARD n, m eller AWD n, m , för läsning respektive skrivning, med önskat enhetsnummer i (n+(m)).

När de öppnats kunde enheterna läsas och skrivas med hjälp av de olika I/O-instruktionerna. Dessa inkluderade separata instruktioner för siffror och tecken, instruktioner för att konvertera mellan de två och olika andra instruktioner för särskilda operationer som att mata ut en radmatning eller spola tillbaka ett band. En nyckelfunktion var konceptet med ett "block", en grupp relaterade data som lästes på en gång. Detta användes normalt för att läsa och skriva teckensträngar i en enda instruktion. Blocket slutade med £ -tecknet, känt som blocktecknet.

Opcode Mnemonic Drift
50 ARD n,m Tilldela indata till enhetsnummer (n+(m))
51 AWD n,m Tilldela utgång till enhetsnummer (n+(m))
52 RNA n,m Läs nummer från inmatningsenheten till A, hoppa till n+(m) vid eventuella fel
53 WNA n,m Skriv numret i A till utenheten. n och m innehåller siffror som definierar formatet att skriva (se nedan)
60 RCH n,m Läs ett tecken och lagra det i n+(m)
61 WCH n,m Skriv ett tecken vid (n+(m)), detta kan vara det nya radens tecken
62 RNB n,m Läs tecken i minnet med början på n+(m), och slutar när blocktecknet ses
63 WNB n,m Skriv ett block med tecken från minnet som börjar på n+(m)
64 WNL n,m Skriv en sekvens av n+(m) nyradstecken
65 WSS n,m Skriv en sekvens av n+(m) mellanslagstecken
66 CNN n,m Konvertera strängen vid n+(m) till ett tal i A
67 CNC n,m Konvertera talet i A till en sträng vid n+(m)
70 ACB n,m Åtkomstblock nummer n+(m). Används normalt med hårddiskar , med andra enheter går det framåt n+(m) block
71 BSP n,m Backsteg för att blockera nummer n+(m). Endast lagligt på hårddiskar
72 RWD Spola tillbaka. Endast lagligt på magnetbandsenheter

Övriga instruktioner

Opcode Mnemonic Drift
99 SLUTA Stoppa avrättningen

Nummerformatering

Eftersom ett huvudmål med systemet var att läsa och skriva data till olika verkliga enheter, inkluderade koden ett formateringssystem som liknar printf-formatsträngar för att underlätta uppgiften att mata ut läsbar text. Formatet lagras som ett värde i minnet, vid n+(m) för de flesta instruktioner, eller på platserna 6 och 7 för CNC-instruktionen, som använder n+(m) för att definiera utdataplatsen. Det finns fyra grundläggande format, som alla börjar med ett inledande mellanslag och plus- eller minustecken:

typ n och m resultat
komplett n=0, m=0 skriv alla siffror i numret inklusive en punkt med decimalen
heltal n>=1, m=0 skriv n siffror i heltalsdelen, ignorera eventuell bråkdel
blandad n>=1, m<>0 skriv n siffror i heltal, en punkt, m siffror i bråk
flytpunkt n=9, m<>0 skriv en inledande period, m siffror i bråk, "E", och två siffror i exponent

Monteringsdirektiv

Förutom maskininstruktionerna innehöll språket även ett litet antal direktiv:

(TITEL)
skriver ut följande rad till utmatningsenheten
(STORE n)
ställer in startplatsen för följande kod. Flera STORE kan användas i ett enda program
(WAIT)
stoppar exekveringen och väntar på en GO-instruktion från operatören
(EXECUTE n)
indikerar slutet av programkoden och ställer in den initiala programräknarens plats när programmet körs

Driftmiljö

Förutom Mnemonic Code definierade datorn också en grundläggande driftsmiljö, som BASIC-språket. Detta inkluderade LADDA och SPARA, PÅ för att omdirigera ingångs- eller utgångsenheten och GÅ för att starta exekvering.

Exempel

Detta exempel, från Herbert, beräknar och skriver ut PI. Detta är skrivet för Elliot 903 och använder det tidigare PNT I/O-kommandot, som skriver ut till stansbandet.

(TITEL) ENKEL TEST (BUTIK 12) LDAN 1 ARC 16 MLTN 4 PNT 1,6 JST (EXEKUT 12)

När det körs, med GO- kommandot, kommer detta program att producera:

ENKEL TEST 3.141593

Anteckningar

Se även

Citat

Bibliografi

  •   Herbert, Andrew (hösten 2015). "City and Guilds Mnemonic Code" (PDF) . Computer Resurrection: The Journal of the Computer Conservation Society (71): 20–27. ISSN 0958-7403 .
  • City & Guilds Mnemonisk kod . ICL.
  • The City & Guilds Computer (PDF) . ICL.

externa länkar