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
- p-kodmaskin - En liknande virtuell pedagogisk maskin.
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
- Memories of a Programmer - Helen Young berättar om tidigt arbete med en C&G-tolk