1. Introduktion - 3 -

Relevanta dokument
LABORATION DATORTEKNIK Y. DATORTEKNIK D DATORTEKNIK M/1/C 1.1. TUTOR M68008 SYSTEM OCH ASSEMBLER

F8: Undantagshantering

F2: Motorola Arkitektur. Assembler vs. Maskinkod Exekvering av instruktioner i Instruktionsformat MOVE instruktionen

Övningsuppgifter i Mikrodatorteknik 4p/5p

Laboration Datorteknik TSIU02 2. I/O-programmering

Digital- och datorteknik

LABORATION DATORTEKNIK Y DATORTEKNIK D

Lösningsförslag till Tenta i Mikrodator

Digital- och datorteknik

Laboration A TSEA57 Datorteknik I

TENTAMEN Datorteknik (DO2005) D1/E1/Mek1/Ö1

Lösningsförslag till Tenta i Mikrodator

DBG11 Användarbeskrivning - Utgåva 2

Digital och Datorteknik EDA /2011. EDA 451 Digital och datorteknik 2010/2011. Uppbyggnad_och_funktion.pdf

En Von Neumann-arkitektur ( Von Neumann-principen i föreläsning 1) innebär:

7) Beskriv tre sätt att överföra parametrar mellan huvudprogram och subrutin.

General Purpose registers ALU I T H S V N Z C SREG. Antag att vi behöver skriva in talet 25 till register R18

Datormodell. Datorns uppgifter -Utföra program (instruktioner) Göra beräkningar på data Flytta data Interagera med omvärlden

Digital- och datorteknik

DAT 015 Maskinorienterad programmering 2010/2011. Uppbyggnad_och_funktion.pdf

F5: Högnivåprogrammering

F5: Högnivåprogrammering

Grundläggande datavetenskap, 4p

DBG identifierar därefter sig genom utskrift av namn och version. Se även "Disposition av adressrum" nedan. Följande kommandon accepteras av DBG

Övning1 Datorteknik, HH vt12 - Talsystem, logik, minne, instruktioner, assembler

Digital- och datorteknik

Digitala System: Datorteknik ERIK LARSSON

Till assemblersystemet Zuper 80 Assembler krävs en SPECTRAVIDEO 328/318+minst 16K ram extra.

Digital- och datorteknik

Digital- och datorteknik

Föreläsningsanteckningar 3. Mikroprogrammering II

Övningsuppgifterna i kapitel F avser FLIS-processorn, vars instruktioner och motsvarande koder definieras i INSTRUKTIONSLISTA FÖR FLISP.

LABORATION. Datorteknik Y

Övning1 Datorteknik, HH vt12 - Talsystem, logik, minne, instruktioner, assembler

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik

Datorsystemteknik Föreläsning 7DAVA14

Digital- och datorteknik

DBG identifierar därefter sig genom utskrift av namn och version. Följande kommandon accepteras av DBG. Hantera brytpunkter i användarprogram

F7: I/O hantering. Asynkron och synkron busscykel Bussfördelning. Periferikretsar

Adressavkodning - busskommunikation

HF0010. Introduktionskurs i datateknik 1,5 hp

2 UPPBYGGNAD OCH FUNKTION

Tentamen. Datorteknik Y, TSEA28

Maskinorienterad programmering. Mekatronikingenjör åk 2/ lp 3. Lars-Eric Arebrink. Av institutionen utgiven. Lars-Eric Arebrink

Avbrottshantering. Övningsuppgifter

Polling (cyklisk avfrågning) Avbrott

CPU. Carry/Borrow IX. Programräknare

Digital- och datorteknik

MIKRODATORTEKNIK 2012 INNEHÅLLSFÖRTECKNING

Periferikretsar. ADC/DAC Räknare Realtidsklocka Timer Interrupthanterare UART (Universal Asynchronous Reciever and Transmitter) Seriell dataöverföring

Tentamen den 12 januari 2017 Datorarkitektur med operativsystem, EDT621

Uppgift 1: a) u= a c + a bc+ ab d +b cd

3. Mikroprogrammering II

TENTAMEN. Datorteknik. D1/E1/Mek1/Ö Hjälpmedel: Häfte "ARM-instruktioner", A4-format, 17 sidor. Maxpoäng:

Facit till övningsuppgifter Kapitel 13 Anslutning av minnes- och I/O-moduler till buss 13-1

Tentamen i EIT070 Datorteknik

Assemblerprogrammering del 1

LEU240 Mikrodatorsystem

Läsminne Read Only Memory ROM

DBG identifierar därefter sig genom utskrift av namn och version. Se även "Disposition av adressrum" nedan. Följande kommandon accepteras av DBG

LABORATION. Datorteknik Y

Det finns en hemsida. Adressen är

Styrenheten 9/17/2011. Styrenheten - forts Arb s 120. LV4 Fo10. Aktivera Kursens mål: Kap 7 Blå

Labyrintspelet EDI021 Grupp 5

BDM12 Användarbeskrivning. Introduktion

Högskolan i Halmstad Digital- och Mikrodatorteknik 7.5p. Lista på registeruppsättningen i PIC16F877A Datablad TTL-kretsar 74-serien

LABORATION. Datorteknik Y

I DAG fo 4. Printerport v3 med READY o DAV. Avbrott. Hur bra blev det egentligen????

Digitalteknik EIT020. Lecture 15: Design av digitala kretsar

F6: I/O hantering. Typer av I/O i ett datorsystem. Protokoll för synkronisering. Drivrutiner. Memory mapped Port mapped. Polling Timed Interrupt DMA

Programräknaren visar alltid på nästa instruktion som skall utföras. Så fort en instruktion har hämtats så visar programräknaren på nästa instruktion.

Datorarkitekturer med operativsystem ERIK LARSSON

SVAR TILL TENTAMEN I DATORSYSTEM, VT2013

Tentamen. Datorteknik Y, TSEA28

Ansvarig lärare: Olof Andersson, Telefon (besöker skrivsalen)

Tentamen Datorteknik D del 2, TSEA49

TSEA28 Datorteknik Y (och U)

Institutionen för elektro- och informationsteknologi, LTH

Datorteknik. Föreläsning 5. Realtidssystem och realtidsprogrammering. Institutionen för elektro- och informationsteknologi, LTH.

Minnet. Minne. Minns Man Minnet? Aktivera Kursens mål: LV3 Fo7. RAM-minnen: ROM PROM FLASH RWM. Primärminnen Sekundärminne Blockminne. Ext 15.

Föreläsningsanteckningar 2. Mikroprogrammering I

Föreläsning 2. Operativsystem och programmering

Lösningar till tentamen i EIT070 Datorteknik

Tentamen. Datorteknik Y, TSEA28

En något mer detaljerad bild av en processor. De tre delarna i processorn är: Nere 3ll vänster finns e' antal register som används för a' lagra data.

En något mer detaljerad bild av en processor. De tre delarna i processorn är: Nere 3ll vänster finns e' antal register som används för a' lagra data.

CE_O3. Nios II. Inför lab nios2time

Föreläsningsanteckningar till Konstruktionsmetoder

Laboration nr 3 behandlar

Per Holm Lågnivåprogrammering 2014/15 24 / 177. int och double = = 2, 147, 483, 647

Program som ska exekveras ligger i primärminnet. Processorn hämtar instruk7on för instruk7on. Varje instruk7on, som är e= antal 1:or och 0:or, tolkas

Kontrollskrivning Mikrodatorteknik CDT S2-704

Datorteknik. Tomas Nordström. Föreläsning 2. För utveckling av verksamhet, produkter och livskvalitet.

Maskinorienterad programmering

Tentamen. Datorteknik Y, TSEA28

Närliggande allokering Datorteknik

Assemblerprogrammering del 2

Minneselement,. Styrteknik grundkurs. Digitala kursmoment. SR-latch med logiska grindar. Funktionstabell för SR-latchen R S Q Q ?

LV6 LV7. Aktivera Kursens mål:

Maskinorienterad programmering

Transkript:

1. Introduktion 1.1. Historia Den amerikanska halvledartillverkaren Motorolas första och mycket framgångsrika mikroprocessor M6800 kom ut på marknaden 1974. Processorn var en klassisk 8-bitars ackumulatormaskin där varje register hade sin speciella funktion, t.ex ackumulator, indexregister och stackpekare. 1976 kom en förbättrad variant kallad M6809. Denna hade några fler interna register som gav programmeraren litet större friheter att utnyttja registren för mellanlagring av data. Dessutom tillkom några extra adresseringssätt. 1984 presenerade Motorola den första processorn i sin nästa generation processorer: M68000. Processorerna i M68000-familjen är 16-bitars eller 32-bitars processorer med 16 generella register, alla med bredden 32 bitar. Programmeraren kan själv bestämma om registren skall fungera som ackumulator, indexregister, räknare eller stackpekare. Den interna databehandlingen i processorn kan ske med ordlängden 8, 16 eller 32 bitar. M68000 hade 24 bitars adressbuss och 16 bitars databuss. Bland annat Commodore Amiga och de första modellerna av Apple Macintosh var uppbyggda kring M68000. Processorn har nu slutat tillverkas, men den har modernare efterföljare. M68008 är en enklare variant av M68000. Internt är de två processorerna identiska. Båda har samma instruktionsuppsättning och kan köra samma programkod. Skillnaden är att M68008 kommunicerar med omvärlden med hjälp av en 8 bitar bred asynkron databuss och att adressbussen bara är 20 bitar bred. Detta gör att processorn får plats i en billigare 48-bens kapsel. I många enklare tillämpningar ger inte den smalare databussen någon större prestandasänkning, och de billiga periferikretsar som utvecklats för 8 bitars processorer kan enkelt anslutas till M68008. 1.2. Nutid M68000-familjen har sedermera utvecklats betydligt, med bland annat processorerna M68010, M68020, M68030 och M68040, flyttalsprocessorerna M68881 och M68882 och diverse andra kringkretsar. Alla modeller har samma grundarkitektur, men de har på senare år blivit betydligt snabbare och försetts med bredare adress- och databussar samt stöd för flyttalsprocessor, cacheminne och virtuell minneshantering. Instruktionsuppsättningen har också utökats något med tiden. Den senaste generationen mikroprocessorer från Motorola är PowerPC, som utvecklats tillsammans med IBM. PowerPC sitter i moderna Apple Macintosh, i vissa arbetsstationer och stordatorer från IBM samt i några av de allra senaste nya persondatorerna, till exempel BeBox. PowerPC är en så kallad RISC-processor, vilket innebär ännu ett genomgripande byte av grundarkitektur, och PowerPC-processorer är inte på något sätt kompatibla med M68000- processorerna. 1.3. Framtid M68000-arkitekturen utvecklas inte vidare av Motorola och är alltså egentligen ett avslutat kapitel i datorteknikens historia, även om processorerna kommer att fortsätta att användas för mindre krävande tillämpningar i många år framöver. Anledningen till att vi fortfarande väljer att använda M68000 i denna kurs är att det är en förhållandevis enkel och lättbegriplig mikroprocessor med en ren, väl genomtänkt och modern grundarkitektur. M68000 fungerar alldeles utmärkt som ett allmänt exempel, och den har mycket gemensamt med de flesta moderna mikroprocessorer som sitter i bland annat persondatorer, arbetsstationer, hushållsapparater och industriella mät-, styr- och reglersystem. M68000-arkitekturen är helt enkelt en lagom utgångspunkt för en inledande kurs i datorteknik och mikroprocessorarkitektur, och det är rakt inte bortkastad tid att lära sig mer specifika detaljer om den. Har man förstått en processors arkitektur är det tämligen lätt att sedan sätta sig in i en annan. De allra flesta moderna processorer är i själva verket mycket lika, även om de skiljer sig åt i fråga om pris och prestanda. - 3 -

- 4 -

2. M68008 ur programmerarens synvinkel 2.1. Programmerarmodell Programmerarens bild av processorn M68008 visas i figur 1. Processorn innehåller 8 dataregister, D0 - D7. Dataregistren är vardera 32 bitar breda och kan bearbeta data om 8 bitar (byte), 16 bitar (word) eller 32 bitar (long word). Dataregistren är generella och kan användas som ackumulatorer, indexregister eller räknare. Processorn innehåller dessutom 8 adressregister, A0 - A7. Adressregistren är 32 bitar breda och arbetar med datalängden 16 eller 32 bitar. Adressregistren kan inte arbeta med datalängden 8 bitar. Av namnet adressregister framgår att de främst är avsedda för att lagra adresser. Adressregister A7 är litet speciellt i det att det dessutom används som systemstackpekare. 1 Programräknaren PC har bredden 32 bitar, men i M68008 används endast 20 bitar. Med dessa 20 bitar kan en linjär adressrymd om 1 Mbyte (2 20 bytes) utpekas. Processorn inehåller slutligen ett 16 bitar brett statusregister, SR. 31 16 15 8 7 0 31 16 15 0 D0 D1 D2 D3 D4 D5 D6 D7 A0 A1 A2 A3 A4 A5 A6 A7 Dataregister Adressregister Stackpekare (USP/SSP) PC Programräknare SR Statusregister Figur 1: Programmerarmodell M68008 Statusregistret är uppdelat på två 8-bitarsgrupper. Den ena gruppen, user byte, innehåller villkorsregistren (flaggorna), vilka ändras av de flesta instruktioner. Den andra gruppen, system 1. Register A7 består i verkligheten av två register. Processorn kan arbeta i två lägen, Supervisor mode och User mode. Varje läge har sin speciella stackpekare. Detta är emellertid inget vi behandlar närmare i denna kurs. - 5 -

byte, innehåller bitar som styr processorns funktion och kan bara ändras av så kallade privilegierade instruktioner. Egentligen används bara 5 bitar i vardera gruppen. Statusregistrets bitar beskrivs närmare i figur 2. 15 13 10 9 8 4 3 2 1 0 T S I2 I1 I0 X N Z V C Trace mode Supervisor mode 2.2. Adresseringsmoder Assemblerkoden talar om för processorn vilken typ av operation som ska utföras. Koden ger också information om adresser till den operand eller de operander som påverkas av operationen. Det finns många olika sätt att ange dessa adresser. M68008 har 14 olika adresseringsmoder. Här följer en kort beskrivning av de olika huvudmoderna. En närmare beskrivning kommer senare i kapitel 6. Underförstådd (implied) Operationskoden innehåller underförstådd information om var data skall hämtas eller lagras. Register (register direct) Operanden (data) finns i ett av de interna data- eller adressregistren. Omedelbar (immediate) Operanden lagras med själva instruktionen och följer omedelbart efter operationskoden i minnet. Absolut (e) Adressen till operanden följer omedelbart efter operationskoden i minnet. Indexering (indexed) Den effektiva adressen beräknas som summan av en basadress och en förskjutning. Indirekt (indirect) Den effektiva adressen finns i ett internt register. Innehållet i registret talar om för processorn var någonstans i minnet operanden finns lagrad. Relativ (relative) Operandens läge anges i förhållande till programräknarens aktuella innehåll. Genom kombinationer av ovanstående moder kan totalt 14 olika adresseringsmoder bildas. Vi återkommer till närmare detaljer om de olika adresseringsmoderna i kapitel 6. 2.3. Minnesmodell System byte Interrupt mask User byte Extend Negative Zero Overflow Carry Figur 2: Statusregistret Adressbussen hos M68008 är 20 bitar bred, och databussen är 8 bitar bred. Minnet är således organiserat i 2 20 ord om 8 bitar (totalt 1 Mbyte), som visas i figur 3. Senare processorer i M68000- familjen har stöd för virtuellt minne och cacheminne, men M68008 har en enkel och lättbegriplig linjär adressrymd där varje adress motsvaras av exakt en fysisk minnesposition. - 6 -

Adress 8 bitar $00000 Byte nr 0 Totalt $00001 Byte nr 1 2 20 bytes $00002 Byte nr 2 (1 Mbyte)......... $FFFF E Byte nr 2 20-2 $FFFFF Byte nr 2 20-1 Figur 3: Minnesorganisation för M68008 2.4. Instruktionsformat Instruktionsorden för maskinspråksinstruktioner är alltid 16 bitar långa, och upptar alltså två bytes i primärminnet. En instruktion måste alltid börja på jämn adress. Instruktionslängden varierar från 2 bytes (endast instruktionsordet) till som mest 10 bytes (instruktionsordet plus 8 bytes operandinformation). Instruktionsordet specificerar alltid operationskod och adresseringsmod. Eventuella efterföljande ord innehåller omedelbara data eller adressinformation på 16 eller 32 bitars format. En grafisk framställning av detta återfinns i figur 4. Instruktioner utan operander Instruktion med operander Adress Adress N Instruktion 1 M Instruktion N+1 M+1 N+2 Instruktion 2 M+2 Operanddata N+3 M+3 M+4 M+5 (2-8 bytes) Instruktionsformatet är mycket varierande och flexibelt, och det är krångligt att manuellt översätta från assemblerkod till maskinkod ( göra en handassemblering ). Instruktionen MOVE kan till exempel kodas på 12288 olika sätt. Assembleringen överlåter man således helst till en dator. 2.5. Dataformat Operander som hämtas och lagras i minnet kan vara antingen 8, 16 eller 32 bitar breda. 8 bitars operander kan lagras på godtycklig adress, men 16- och 32-bitars operander, och därmed också instruktioner, måste börja på en jämn adress. Detta är en konsekvens av att M68008 är internt identisk med M68000, som har en 16-bitars databuss. 16- och 32-bitars operander lagras med sin mest signifikanta byte (Most significant byte, MSB) på den lägsta adressen och den minst signifikanta byten (Least significant byte, LSB) på den högsta adressen. Motorola använder denna ordning i alla sina processorer, liksom många andra tillverkare. Det är åtminstone i vissa avseenden en naturlig ordning. Tyvärr gör flera andra processortillverkare, däribland den största tillverkaren Intel, tvärtom och lägger den minst signifikanta byten på den lägsta adressen. Detta är en ständig källa till förtret när man överför data mellan olika datorsystem, men det verkar som om det är ett problem vi får leva med för överskådlig tid framöver. 2.6. Instruktionslista Figur 4: Instruktionsformatet för M68008 Vi går inte här närmare in på vilka instruktioner som finns i instruktionslistan till M68008. Detta behandlas i stället utförligt i kapitel 6. - 7 -

- 8 -

3. M68008 ur hårdvarukonstruktörens synvinkel 3.1. Processorns signaler Processorn M68008 sitter i en 48-bens kapsel. De olika in- och utsignalerna kan sammanföras till grupper enligt figur 5. M68008 Matningsbusskontroll spänning Klocksignal Statusinformation Synkron Systemkontroll +5V GND CLK FC0 FC1 FC2 E VPA BERR RESET HALT D0-D7 A0-A19 AS R/W DS DTACK BR BG IPL0/2 IPL1 Databuss Adressbuss Asynkron busskontroll Bussväljare Avbrottssignaler 3.2. Adressbuss Den enkelriktade databussen är 20 bitar bred och innehåller adressinformation vid alla bussöverföringar. En linjär adressrymd om 1 Mbyte kan utpekas. 3.3. Databuss Databussen är 8 bitar bred och dubbelriktad. All dataöverföring till och från processorn sker över databussen. D7 är mest signifikant bit, D0 är minst signifikant. 3.4. Asynkron busskontroll Figur 5: Signaler till och från M68008 M68008 har som de flesta moderna processorer en asynkron databuss. Förutom adress- och databussarna är fyra signaler inblandade i en asynkron dataöverföring: Address strobe, AS AS idikerar med låg nivå (0) när det ligger en stabil adress på adressbussen. Read/Write, R/W Denna signal visar åt vilket håll överföringen skall ske genom att tala om huruvida det är en läscykel (R/W=1) eller skrivcykel (R/W=0) som skall utföras. Data strobe, DS DS kontrollerar tillsammans med R/W dataflödet på databussen enligt följande: DS R/W Innebörd 1 - Inga giltiga data på bussen 0 1 Läscykel 0 0 Skrivcykel - 9 -

Data transfer acknowledge, DTACK Detta är till skillnad från de tre andra busskontrollsignalerna en insignal till processorn. Den skickas av den yttre enhet som sänt eller tagit emot data för att tala om för processorn att läs- eller skrivcykeln skall avslutas. 3.5. Synkron busskontroll Motorolas 8-bitars mikroprocessorer hade synkron bussöverföring. I en synkron överföring styr processorn själv hela busscykeln. M68008 kan överföra data på databussen även med synkron busskontroll för att kunna anslutas till de periferikretsar som utvecklats för de äldre 8-bitars processorerna. Två signaler (eller tre) är inblandade i en synkron bussöverföring. Valid peripheral address, VPA När denna insignal sätts till 0 instrueras processorn att göra en synkron bussöverföring. Signalen genereras av yttre adressavkodare för att tala om för processorn var någonstans i minnet det sitter kretsar som måste sända och ta emot data med synkrona bussöverföringar. Enable, E Detta är en klocksignal från processorn som talar om när dataöverföring skall ske. Klockfrekvensen för E är en tiondel av processorns klockfrekvens på 8 MHz, alltså 800 khz. Valid memory address, VMA M68000 har en signal VMA som talar om för synkrona kringkretsar att det finns en stabil adress på adressbussen och att processorn under nästa klockintervall för E kommer att göra en synkron bussöverföring. M68008 saknar denna utsignal, men den kan enkelt genereras av yttre logik. (Signalen Gate i TUTOR har denna funktion. Studera gärna kopplingsschemat i figur 11 för att se hur den genereras!) 3.6. Val av bussägare Signalerna Bus Request, BR, och Bus grant, BG, används för att välja ägare till bussen. I ett datorsystem kan det finnas flera ägare till bussen, till exempel DMA-enheter och andra processorer. I det enkla TUTOR-systemet finns dock endast en bussägare, och dessa signaler används inte. 3.7. Systemkontroll Signalerna BERR (Bus error), HALT och RESET används vid diverse extraordinära tillfällen. HALT och RESET är trådbara ingångar som också kan fungera som utgångar. Antingen processorn själv eller en yttre enhet kan sätta dessa ingångar till 0. Den röda nollställningsknappen på TUTOR-kortet påverkar signalerna HALT och RESET så att systemet startar om. Om processorn får signalen BERR=0 genereras ett avbrott till en speciell avbrottsvektor. Denna signal genereras i TUTOR-systemet när adressbussen pekar ut en minnesposition som inte har något minne anslutet. - 10 -

3.8. Avbrottssignaler M68000 har tre avbrottssignaler, IPL2, IPL1 och IPL0. Prioritering sker enligt följande: IPL2 IPL1 IPL0 Begärd avbrottsnivå 1 1 1 0 (inget avbrott begärs) 1 1 0 1 (lägsta prioritet) 1 0 1 2 1 0 0 3 0 1 1 4 0 1 0 5 0 0 1 6 0 0 0 7 (högsta prioritet) På processorn M68008 har man sparat in ett ben genom att koppla ihop signalerna IPL2 och IPL0. Detta resulterar i följande prioritetstabell: IPL2/0 IPL1 Avbrottsnivå 1 1 0 (inget avbrott) 1 0 2 0 1 5 0 0 7 För en beskrivning av vad som sker i processorn vid en avbrottsbegäran, se avsnitt 4.8. 3.9. Statussignaler Statussignalerna FC2, FC1 och FC0 informerar omvärlden om processorns interna tillstånd enligt följande: FC2 FC1 FC0 Cycle type 0 0 0 Undefined 0 0 1 User data 0 1 0 User program 0 1 1 Undefined 1 0 0 Undefined 1 0 1 Supervisor data 1 1 0 Supervisor program 1 1 1 Interrupt acknowledge - 11 -

- 12 -

4. TUTOR-systemet: maskinvara 4.1. Översikt Vid laborationerna har du tillgång till ett komplett enkelt mikrodatorsystem kallat TUTOR, konstruerat vid ISY av Lennart Asperud. Systemet är uppbyggt kring processorn M68008. Vid labplatsen finner du följande: Kraftaggregat +5V Processorkort TUTOR Kopplingsplatta för parallellporten Korthållare Terminal Kontroll av systemet och programmering sker med hjälp av terminalen. Program skrivs in i assemblerkod. Du kommer under laborationerna att använda en enkel resident assembler som finns lagrad i ROM i monitorprogrammet till TUTOR. För mera avancerade programmeringsuppgifter kan man använda en korsassembler på en mer avancerad värddator. Värddatorn sköter då assembleringen och sänder maskinkod direkt till TUTOR-systemet. 4.2. Processorkortet Processorkortet innehåller: Mikroprocessor M68008, klockfrekvens 8 MHz RAM 32 Kbyte ROM 32 Kbyte Serieport (ACIA M6850) för kommunikation med terminal Parallellport (PIA M6821) med två programmerbara 8-bitars portar Programmerbar logikkrets (PAL) för adressavkodning mm Klockkretsar för CPU och ACIA Drivkrets för terminalkommunikationen Diverse analoga komponenter 4.3. Indelning av adressrymd Processorn har 20 adressledningar och kan därmed adressera 1 Mbyte. På kortet finns 32 Kbyte RAM och 32 Kbyte ROM. Några ytterligare adresser används av I/O-kretsarna. Adressrymden i systemet är disponerad enligt följande: Adress (hex) Beskrivning $00000 - $008FF 2304 byte RAM för system och monitor $00900 - $01FFF 6158 byte RAM för användare $02000 - $07FFF 24 Kbyte RAM för användare $08000 - $0BFFF 16 Kbyte EPROM med monitorprogrammet TUTOR $0C000 - $0FFFF 16 Kbyte EPROM med diverse hjälpprogram (ganska tomt) $10000 - $107FF 2 Kbyte synkron area för I/O-kretsar $10800 - $FFFFF 958 Kbyte, används ej - 13 -

4.4. Serieport Processorkortet inehåller en serieportsadapter av typ M6850 (Asynchronous Communications Interface Adapter, ACIA). Porten används av systemets terminal. Serieportsadaptern tar upp två adresser i primärminnet. $10040 Control register (write only) $10040 Status register (read only) $10042 Transmit data register (write only) $10042 Recieve data register (read only) Avbrott kan inte genereras från serieporten. Programstyrd in- och utmatning används för seriekommunikationen. Överföringshastigheten som används är 4800 bps (bits per sekund). Du kan om du så önskar skriva program som läser eller skriver tecken via serieporten. Monitorprogrammet TUTOR innehåller också ett antal subrutiner för in- och utmatning till serieporten. De program du kommer att skriva i laborationskursen arbetar dock inte med serieporten, utan med parallellporten. Vi går därför inte närmare in på funktionen hos M6850. För vidare information hänvisas till Motorolas datablad för kretsen. 4.5. Parallellport Processorkortet innehåller en parallellport M6821 (Peripheral Interface Adapter, PIA). Porten är avsedd för användaren och används inte för andra uppgifter. Portens in- och utsignaler är anslutna till ett 26-poligt kontaktdon. Till detta kontaktdon kan man ansluta en bandkabel som avslutas med en kopplingsplatta märkt enligt följande: PA PB U 0 1 2 3 4 5 6 7 GND 0 1 2 3 4 5 6 7 CA1 CA2 CB1 CB2 Figur 6: Kopplingsplatta för anslutning till parallellporten - 14 -

4.6. Programmering av parallellporten PIA M6821 innehåller sex programmerbara register. Fyra av registren delar dock på två adresser, så porten tar bara upp fyra adresser i primärminnet. $10080 DDRA, Data direction register A $10080 PIAA, Peripheral register A A-del $10084 CRA, Control register A $10082 DDRB, Data direction register B $10082 PIAB, Peripheral register B B-del $10086 CRB, Control register B Registren ligger som synes inte på konsekutiva adresser. Detta är en något obekväm bieffekt av att processorn M68008 inte är en äkta 8-bitars processor, utan är internt identisk med M68000 som har en 16 bitars databuss och därför adresserar 8-bitars periferikretsar på detta sätt. Porten består av två delar, en A-del och en B-del. Det finns vissa små skillnader mellan de båda halvorna, men de är funktionsmässigt i stort sett identiska. I fortsättningen behandlas endast A- delen. Allt som sägs gäller även för B-delen. Registerbeteckningar: PIAA dataregister A DDRA riktningsregister A CRA kontrollregister A A-delen innehåller tre register, men upptar endast två adresser i primärminnet. Detta kommer sig av att PIAA och DDRA adresseras med samma adress. När denna adress utpekas görs valet mellan PIAA och DDRA av parallellportsadaptern själv baserat på bit nr 2 i kontrollregistret, CRA-2. CRA-2 = 0 CRA-2 = 1 DDRA utpekas PIAA utpekas Programmering av DDRA Innehållet i riktningsregistret DDRA bestämmer datariktningen för varje bit i PIAA. En 1:a i en bit i DDRA gör motsvarande bit i PIAA till utgång. En 0:a gör motsvarande bit till ingång. Programmering av CRA Kontrollregistrets bitar kan delas in i följande grupper: 7 6 5 4 3 2 1 0 CRA Styr CA2 Signalflaggor för avbrott Styr CA1 0: DDRA utpekas 1: PIAA utpekas Figur 7: Kontrollregistrets bitar Flaggan CRA-7 1-ställs av den yttre signalen CA1, och flaggan CRA-6 1-ställs av den yttre signalen CA2. Dessa bitar kan inte skrivas, bara läsas. Flaggorna CRA-7 och CRA-6 nollställs indirekt genom läsning i dataregistret PIAA. Mer om detta senare. - 15 -

Yttre signalen CA-1: bitarna CRA-1 och CRA-0 CRA-1 = 0 CRA-7 1-ställs när CA1 växlar från 1 till 0 CRA-1 = 1 CRA-7 1-ställs när CA1 växlar från 0 till 1 CRA-0 = 0 IRQA aktiveras ej när CRA-7 1-ställs. Avbrott spärras. CRA-0 = 1 IRQA aktiveras när CRA-7 1-ställs. Avbrott matas vidare till processorn. Yttre signalen CA2: bitarna CRA-5, CRA-4 och CRA-3 Till skillnad från CA1, som bara kan användas som ingång, kan CA2 användas antingen som ingång eller som utgång. CRA-5 = 0 gör CA2 till ingång. CRA-4 och CRA-3 påverkar CA2:s funktion som ingång på följande sätt: CRA-4 = 0 CRA-6 1-ställs när CA2 växlar från 1 till 0 CRA-4 = 1 CRA-6 1-ställs när CA2 växlar från 0 till 1 CRA-3 = 0 IRQA aktiveras ej när CRA-6 1-ställs. Avbrott spärras. CRA-3 = 1 IRQA aktiveras när CRA-6 1-ställs. Avbrott matas vidare till processorn. CRA-5 = 1 gör CA2 till utgång. Utgångens värde styrs då med CRA-4 och CRA-3. CRA-4 CRA-3 Resultat 1 0 Utgången CA2 = 0 1 1 Utgången CA2 = 1 Återstående kombinationer av CRA-4 och CRA-3 har tämligen speciella funktioner som vi inte går närmare in på. För närmare detaljer hänvisas till Motorolas datablad. Exempel på startprogram för PIA Programmeringen av varje del (A eller B) görs typiskt i tre steg. 1. Nollställ kontrollregistret. Detta görs för att först komma åt riktningsregistret. 2. Programmera riktningsregistret. 3. Programmera kontrollregistret. Bit 2 sätts till 1 för att i fortsättningen peka ut dataregistret. Antag att vi vill programmera PA0 till PB7 samt PB4 till PB7 som utgångar och PB0 till PB3 som ingångar. Vi vill att CA1 skall ettställa CRA-7 på positiv flank (växling från noll till 1), men vi vill inte att avbrott skall signaleras. CA2, CB1 och CB2 skall inte användas, så vi väljer att programmera dem som ingångar och spärra avbrottsbegäran från dem. Vi skall alltså programmera DDRA med endast ettor och DDRB med ettor i bit 7 till 4 och nollor i bit 3 till 0. Vad vi skall skriva in i CRA får vi bena ut bit för bit. CRA-7 och CRA-6 kan vi inte skriva i, så vi väljer bit 7 och bit 6 till noll för enkelhets skull. CA2 sätts till ingång och avbrott spärras genom att sätta bitarna CRA-5 till CRA-3 till 000. Bit 2 skall sättas till 1 för att i fortsättningen läsa och skriva i dataregistret och inte riktningsregistret. CA-1 sätts till ingång med känslighet för positiv flank genom att sätta bitarna CRA-1 och CRA-0 till 10. Till CRA skall alltså skrivas det binära innehållet 00000110. På samma sätt kommer vi fram till att CRB skall ha innehållet 00000100. Följande program programmerar PIA enligt ovan: CLR.B $10084 ; CRA nollställs MOVE.B #$FF, $10080 ; DDRA = $FF MOVE.B #$06, $10084 ; CRA slutvärde CLR.B $10086 ; CRB nollställs MOVE.B #$F0, $10082 ; DDRB = $F0 MOVE.B #$04, $10086 ; CRB slutvärde - 16 -

4.7. Avbrottshantering i parallellportsadaptern Parallellporten kan signalera avbrott med hjälp av signalflaggorna CA-7 och CA-6 i kontrollregistren. CRA-7 påverkas av kontrollsignalen CA1, och CRA-6 påverkas av signalen CA2. När någon av signalflaggorna är 1-ställd (eller om båda är 1-ställda) och kontrollregistret CRA är programmerat för att släppa igenom motsvarande avbrott signaleras ett avbrott på den yttre signalen IRQA (interrupt request A) på M6821. IRQA är ansluten (via en del styrlogik) till IPL2/ 0 på processorn. Parallellportens B-del signalerar avbrott med signalflaggorna CRB-7 och CRB- 6. Dessa signalflaggor aktiverar IRQB. IRQB är ansluten (via en del styrlogik) till processorns avbrottsingång IPL1. A-delens båda signalflaggor nollställs genom läsning i dataregister PIAA, B-delens genom läsning i PIAB. Detta kan vid en första anblick tyckas något underligt, men vid närmare eftertanke är det mycket praktiskt. Vid en typisk verklig användning av parallellportsadaptern signaleras avbrott när ett dataord kommit in och behöver tas om hand. När processorn läst dataordet har orsaken till avbrottet åtgärdats, och avbrottsflaggan kan (och bör) nollställas omedelbart. Observera att om både CA1 och CA2 programmeras till att kunna begära avbrott måste man först i avbrottsrutinen läsa i kontrollregistret CRA för att ta reda på vilken ingång som begärt avbrott. 4.8. Händelser i processorn vid avbrott När en yttre enhet begär avbrott kan avbrottsbegäran ske på olika prioritetsnivåer. M68000 har tre avbrottsingångar IPL0, IPL1 och IPL2 som när de aktiveras i olika kombinationer kan signalera avbrott på 7 olika nivåer. M68008 har IPL0 och IPL2 sammankopplade till en enda signal och kan därför endast ta emot avbrott på nivåerna 2, 5 eller 7 (IPL1 ger nivå 2, IPL0/2 ger nivå 5, och båda samtidigt ger nivå 7). Avbrottsbegäran sker genom att aktivera signalerna IRQA, IRQB eller ABORT på processorkortet. ABORT har högsta prioriet (prioritet 7) och kan inte spärras. Denna signal aktiveras av den svarta knappen (Abort) på processorkortet. IRQA och IRQB är avsedda att utnyttjas av användaren. För att ett avbrott skall accepteras av processorn krävs att det begärande avbrottet har högre nivå än den nivå som indikeras av bitarna I2, I1, I0 i statusregistret. IRQ7 särbehandlas dock och slår alltid igenom. När ett avbrott slår igenom sker ett autovektoriserat avbrott, vilket innebär att processorn hämtar en så kallad avbrottsvektor som anger adressen till avbrottsprogrammet som skall utföras. Vid avbrottsbegäran på nivå 2 hämtas avbrottsvektorn på adress $68. Vid avbrottsbegäran på nivå 5 hämtas avbrottsvektorn från adress $74. Vid avbrottsbegäran på nivå 7 hämtas vektorn på adress $7C. En fullständig förteckning över de olika avbrottsvektorerna i M68008 återfinns i figur 8. Avbrottsnivå 7 är reserverad för den svarta Abort-knappen på processorkortet. Avbrottsvektorn för denna avbrottsnivå pekar på en avbrottsrutin i ROM i monitorprogrammet. Denna avbrottsrutin presenterar vid avbrottstillfället innehållet i samtliga interna register, återställer stackpekaren till att peka på TUTOR-programmets interna stack samt matar ut prompten TUTOR 1.3>. Programexekveringen kan återupptas med TUTOR-kommandot G. Ändra inte avbrottsvektorn på adress $7C. Då kommer inte Abort-knappen att fungera längre! (Den röda Reset-knappen fungerar dock alltid.) Däremot skall du i laborationen Avbrott lägga in startadresserna till dina egna avbrottsrutiner på adresserna $68 och $74. - 17 -

Vector Decimal address Hex address Assignment 0 0 000 Reset initial SSP 1 4 004 Reset initial PC 2 8 008 Bus error 3 12 00C Address error 4 16 010 Illegal instruction 5 20 014 Zero divide 6 24 018 CHK instruction 7 28 01C TRAPV instruction 8 32 020 Privilege violation 9 36 024 Trace 10 40 028 Line 1010 emulator 11 44 02C Line 1111 emulator 12-23 48-92 030-05C Reserved 24 96 060 Spurious interrupt 25 100 064 Level 1 interrupt autovector 26 104 068 Level 2 interrupt autovector 27 108 06C Level 3 interrupt autovector 28 112 070 Level 4 interrupt autovector 29 116 074 Level 5 interrupt autovector 30 120 078 Level 6 interrupt autovector 31 124 07C Level 7 interrupt autovector 32 128 080 TRAP #0 33 132 084 TRAP #1 34 136 088 TRAP #2............ 45 180 0B4 TRAP #13 46 184 0B8 TRAP #14 47 188 0BC TRAP #15 48-63 192-252 0C0-0FC Reserved 64-255 256-1020 100-3FF User interrupt vectors Figur 8: Avbrottsvektorerna i början av minnesområdet i M68008 Avbrottsnivån kan i vissa fall behöva ändras explicit av ett program. Detta kan göras med någon av de privilegierade instruktioner som ändrar innehållet i SR: AND.W #data,sr OR.W #data,sr EOR.W #data,sr MOVE.W #data,sr Bitarna 10, 9 och 8 i SR anger den aktuella avbrottsnivån som ett trebitars binärt tal. Under normal programkörning är avbrottsnivån noll. Observera att bitarma T och S i SR inte bör ändras. Var särskilt försiktig med instruktionen MOVE.W #data,sr! När ett avbrott accepteras händer följande: 1. Det föregående innehållet i PC och SR sparas på stacken (supervisor-stacken). 2. SR uppdateras genom att bit S 1-ställs, bit T 0-ställs, och I2, I1, I0 sätts till ett tre bitars binärt tal lika med den begärande avbrottsnivån. När S=1 arbetar processorn i Supervisor mode. Med T=0 förhindras stegvis exekvering av instruktioner. 3. PC laddas med en avbrottsvektor (startadressen till avbrottsprogrammet). Olika vektorer väljs beroende på nivån på avbrottet. 4. Avbrottsprogrammet exekveras. - 18 -

När återhopp görs från avbrottsprogrammet med instruktionen RTE (Return from exception) återställs de gamla innehållen i SR och PC från stacken. Före avbrott: Avbrott accepteras: Efter RTE: SP-> Gamla SR Gamla PC SP -> SP-> 4.9. Uppstart av systemet Vid spänningstillslag händer följande: 1. Processorn ställs i Supervisor mode 2. Stackpekaren får värdet SSP = $00786 3. Statusregistret får värdet SR = $2700 4. Programräknaren laddas med startadressen för monitorprogrammet TUTOR. 5. Monitorprogrammet startar och utför en startsekvens, som bland annat programmerar serieporten till att kommunicera med den anslutna terminalen och laddar avbrottsvektorn för avbrottsnivå 7. Därefter matar monitorn ut prompten: TUTOR 1.3 > Sedan väntar systemet på ett TUTOR-kommando. Ovanstående sekvens erhålls även vid intryckning av den röda Reset-knappen på processorkortet. Reset-knappen påverkar även de yttre kretsar som är anslutna till bussignalen RESET. Efter spänningstillslag (eller Reset) befinner sig således processorn i Supervisor mode med stackpekaren SSP = $00786 (stack för TUTOR-programmet) och den interna avbrottsnivån lika med 7. Det är ingenting som hindrar att processorn får fortsätta att arbeta i Supervisor mode hela tiden under alla de laborationer du kommer att genomföra. Däremot är det viktigt att användarprogram har en stack som är skild från TUTOR-programmets stack. Om du skall använda subrutiner eller avbrott i dina program (och det skall du) är det viktigt att du först i ditt program sätter stackpekaren till att peka på ett lämpligt ställe i RAM som inte används till annat. Ett lämpligt ställe är adressen $08000, som ligger högst upp i det tillgängliga RAM-minnet. Stackpekaren sätts till detta värde med instruktionen: LEA $08000,A7 (eller MOVE.L #$00008000,A7 om man så vill) Observera att instruktionen LEA $8000,A7 tolkas som en kort adress och fylls ut till $FFFF8000, vilket ger felaktigt resultat. Genom att ange adressen som $00008000, eller bara $08000, undviker du att den misstolkas av assemblern som en kort adress och fylls ut felaktigt till en lång adress. 4.10. Kopplingsschema Figur 9: Stackens förändring vid avbrott TUTOR-systemets kopplingsschema visas i figur 10. Det ekvivalenta innehållet i PAL-kretsen visas i figur 11. - 19 -

Figur 10: Kopplingsschema för mikrodatorkortet TUTOR - 20 -

Figur 11: Ekvivalent innehåll i PAL-kretsen EP900-21 -

- 22 -

5. TUTOR-systemet: programvara Med hjälp av olika kommandon i TUTOR kan ditt program felsökas och exekveras. Vid spänningstillslag till systemet svarar TUTOR med prompten: TUTOR 1.3 > TUTOR väntar därefter på ett kommando. När du trycker på RETURN sänds kommandoraden till systemet. 5.1. Kommandon i TUTOR Visa/ändra minnesinnehåll MD Visa minnesinnehåll MM Visa/ändra minnesinnehåll MS Ändra minnesinnehåll BF Ändra innehållet i ett minnesblock Visa/ändra registerinnehåll DF Visa innehållet i alla interna register.a0 -.A7 Visa/ändra adressregister.d0 -.D7 Visa/ändra dataregister.pc Visa/ändra programräknare.sr Visa/ändra statusregister.ss Visa/ändra Supervisor stackpekare.us Visa/ändra User stackpekare Exekvering av program BR Visa/sätt brytpunkt NOBR Tag bort brytpunkt GO Exekvera till brytpunkt GT Exekvera till temporär brytpunkt GD Exekvera utan brytpunkt TR Trace, utför en instruktion TT Trace till temporär brytpunkt Hjälp HE Visa hjälp Monitorprogrammet TUTOR accepterar endast stora bokstäver (använd Caps Lock-tangenten på terminalen). Alla tal som matas in antas vara hexadecimala tal. Vill du att ett tal ska tolkas som ett decimalt tal måste talet föregås av &. 5.2. Visa minnesinnehåll Kommandot MD (Memory Display) används för att visa minnesinnehåll. TUTOR 1.3 > MD adress (antal) (;option) Med början från den angivna adressen adress visas det antal byte som anges av antal. Om inget antal anges visas 16 byte. Adressen och antal anges som hexadecimala tal. - 23 -

Anges ingen option visas minnesinnehållet i hexkod och motsvarande ASCII-kod. Data visas alltid i grupper om 16 byte. Är antal inte en multipel av 16 visas ändå alltid ett helt antal grupper om 16 byte. TUTOR 1.3 > MD 2000 002000 CB 21 00 65 44 80 00 06 F7 40 06 B8 82 58 00 00 K!.eD...w@.8.X.. TUTOR 1.3 > 002010 FF 00 00 80 04 04 00 00 FF 00 20 13 A1 20 04 00....!.. 002020 15 78 00 E9 6A 8E 10 46 CB B8 08 A9 40 92 00 00.x.ij..FK8.)@...... 0020F0 09 BD C9 FF FE CD 00 00 E4 41 64 6D F5 12 00 00.=I.~M..dAdmu... 002100 05 11 00 F9 38 08 00 04 A0 48 00 1D A4 C8 00 00...y8... H..$H.. TUTOR 1.3 > Efter det att kommandot utförts väntar systemet på ett nytt kommando. Om du bara trycker Return (Carriage Return, CR, Enter, radmatning, radslut - kärt barn har många namn) visas automatiskt 16 nya grupper om 16 byte. Anges ett nytt kommando avbryts MD och TUTOR övergår till att utföra det nya kommandot. Anges option ;DI aktiveras disassemblerfunktionen. Minnesinnehållet visas nu som assemblerkod. Varje tryckning på Return visar 16 nya disassemblerade rader. TUTOR 1.3 > MD 800C;DI 00800C 41F8044C LEA.L $0000044C,A0 TUTOR 1.3 > 008010 203C0000020E MOVE.L #526,D0 008016 4281 CLR.L D1 008018 10C1 MOVE.B D1,(A0)+ 00801A 5380 SUBQ.L #1,D0 00801C 66FA BNE.S $008018 00801E 487A0010 PEA.L $00008030(PC) 008022 21DF0008 MOVE.L (A7)+,$00000008 008026 487A0012 PEA.L $0000803A(PC) 00802A 21DF000C MOVE.L (A7)+,$0000000C 00802E 4E75 RTS 008030 21FC425553200030 MOVE.L #1112888096,$00000030 008038 6008 BRA.S $008042 00803A 21FC414444520030 MOVE.L #1094992978,$00000030 008042 21DF04CA MOVE.L (A7)+,$000004CA 008046 21DF04CE MOVE.L (A7)+,$000004CE 00804A 21CF0444 MOVE.L A7,$00000444 TUTOR 1.3 > 5.3. Ändring av minnesinnehåll För att ändra minnesinnehållet använder du kommandona MM (Memory Modify), MS (Memory Set) och BF (Block Fill). MM (Memory modify): Visa/ändra minnesinnehåll TUTOR 1.3 > MM adress (;option) Kommandot visar innehållet på angiven adress. TUTOR 1.3 > MM 2000 002000 CB? 002001 21? 002002 00? 002003 65?A0 002004 44?. TUTOR 1.3 > - 24 -

Innehållet kan ändras genom att ange nya data efter frågetecknet, följt av Return. MM har ett antal underkommandon som kan ges med ett extra tecken efter data: data data^ data= data. Uppdaterar minnesinnehållet och stegar framåt. Uppdaterar minnesinnehållet och stegar bakåt. Uppdaterar minnesinnehållet, ändrar inte adress. Uppdaterar minnesinnehållet och avbryter MM-kommandot. Om data inte anges (lämnas blankt) ändras inte data på minnesadressen ifråga. Du kan alltså trycka på endast Return för att stega dig fram till lämplig adress, endast ^ och Return för att stega bakåt, och endast punkt och Return för att bara avbryta kommandot. Datalängden anges av ;option enligt: option datalängd ingen byte ;W ord (16 bitar) ;L långt ord (32 bitar) Option ;DI används vid assemblering. Nya data skrivs då in som assemblerkod. Mer om detta i avsnitt 5.9. TUTOR 1.3 > MM 2000;L 002000 CB2100A0? 002004 44800006? 002008 F74006B8? 00200C 82580000?^ 002008 F74006B8?A0000000= 002008 A0000000?. TUTOR 1.3 > MS (Memory set): Ändra minnesinnehåll Kommandot MS ändrar minnesinnehåll genom att skriva in data på angiven adress. TUTOR 1.3 > MS adress data För detta kommando kan du ange data som en sträng innehållande ASCII-kod eller en sträng med hexkod. Flera strängar kan anges. Mellanslag används som skiljetecken mellan strängar. Anges flera strängar kan varje sträng högst innehålla 8 tecken. ASCII-strängar anges inom apostroftecken. TUTOR 1.3 > MS 2000 01 02 03 1234 ABC TUTOR 1.3 > MD 2000 002000 01 02 03 12 34 41 42 43 A0 00 00 00 82 58 00 00...4ABC...X.. TUTOR 1.3 > BF (Block of memory fill): Ändra innehållet i ett minnesblock TUTOR 1.3 > BF adress1 adress2 dataord Kommandot BF fyller minnet med data med början i adress1 och slut i adress2. Data utgörs av hexkod och måste vara ett ord (16 bitar). Båda adresserna måste vara jämna tal. TUTOR 1.3 > BF 2000 2008 BADA PHYSICAL ADDRESS=00002000 00002008 TUTOR 1.3 > MD 2000 002000 BA DA BA DA BA DA BA DA BA DA 00 00 82 58 00 00 :Z:Z:Z:Z:Z...X.. TUTOR 1.3 > - 25 -

5.4. Visa/ändra registerinnehåll För att visa och ändra i registerinnehåll finns kommandona DF och.rr. DF (Display formatted registers): Visa innehållet i samtliga interna register TUTOR 1.3 > DF Kommandot visar innehållet i registren i hexadecimal form. Dessutom visas den instruktion som utpekas av PC i disassemblerad form. TUTOR 1.3 > DF PC=00009FA6 SR=2704=.S7..Z.. US=FFFFFFFF SS=0000075A D0=0000FF00 D1=00000000 D2=FED01210 D3=00000000 D4=FFFF0031 D5=FFFFFF2C D6=00000002 D7=00000000 A0=00010040 A1=000000C0 A2=00000414 A3=00000554 A4=00009FA8 A5=00000540 A6=00000540 A7=0000075A --------------------009FA6 1210 MOVE.B (A0),D1 TUTOR 1.3 >.RR (Individual register display/change): Visa/ändra innehållet i ett utvalt register TUTOR 1.3 >.RR data RR är registernamnet och kan väljas bland D0 - D7, A0 - A7, PC, SR, US, SS. Anges inte data visas innehållet i det utvalda registret. Anges data ändras dess innehåll till detta. TUTOR 1.3 >.D4.D4=FFFF0031 TUTOR 1.3 >.PC 2000 TUTOR 1.3 >.PC.PC=00002000 TUTOR 1.3 > 5.5. Brytpunkter TUTOR kan sätta så kallade brytpunkter på valfria ställen i dina program. När programmet exekveras och når fram till en brytpunkt stoppas exekveringen och innehållet i processorns interna register visas. Exekveringen kan återupptas med något av kommandona GO, GD, GT, TR, eller TT. Brytpunkter sätts med kommandot BR. Kommandona GT och TT sätter temporära brytpunkter som tas bort när de stoppat programexekveringen en gång, medan brytpunkter som satts med kommandot BR måste tas bort med kommandot NOBR. BR (Breakpoint): Visa/sätt brytpunkt TUTOR 1.3 > BR (adress (;antal))... Kommandot BR sätter en eller flera brytpunkter i en brytpunktstabell. Anges BR utan adress visas samtliga aktuella brytpunkter. Tabellen kan innehålla upp till 8 brytpunkter. Brytpunkterna som finns i tabellen sätts in fysiskt i programmet när du kör något av kommandona GO, GT eller TT. Rent praktiskt går detta till så att TUTOR sätter in det illegala instruktionsordet $4ABF på de adresser som bestäms av brytpunktstabellen. Om ditt program spårar ur helt skall du återta kontrollen genom att trycka på ABORT (den svarta kanppen på processorkortet). ABORT anropar en avbrottsrutin som bland annat tar bort dessa illegala instruktioner ur ditt program och återställer minnesinnehållet. Trycker du på RESET (den röda knappen) kan den illegala instruktionen $4ABF lämnas kvar i minnet på de ställen där du hade brytpunkter satta. När programmet når en brytpunkt stoppas exekveringen och innehållet i interna register visas. Därefter övergår kontrollen till TUTOR. Har brytpunkten satts med angivande av antal räknas antal ned med 1 varje gång programmet passerar brytpunktsadressen. Först när antal är lika - 26 -

med noll stoppar programmet. Därefter stoppar programmet varje gång vid denna adress. Exekvering återupptas med något av kommandona GO, GD, GT, TR eller TT. TUTOR 1.3 > BR 2020 BREAKPOINTS 002020 002020 TUTOR 1.3 > BR 2040;4 BREAKPOINTS 002020 002020 002040 002040;4 TUTOR 1.3 > NOBR (Remove breakpoint): Tag bort brytpunkter TUTOR 1.3 > NOBR (adress adress...) Kommandot NOBR tar bort angivna brytpunkter från brytpunktstabellen. Anges ingen adress töms hela tabellen. TUTOR 1.3 > NOBR 2020 BREAKPOINTS 002040 002040;4 TUTOR 1.3 > NOBR BREAKPOINTS TUTOR 1.3 > 5.6. Exekvering och felsökning av program Programexekvering startas med något av kommandona GO, GD, GT, TR eller TT. GO (Go execute program): Starta exekvering TUTOR 1.3 > GO (adress) Kommandot GO (eller bara G) startar exekvering på angiven adress. Anges ingen adress tas innehållet i PC som startadress. Brytpunkter sätts in från brytpunktstabellen. TUTOR 1.3 >GO 2000 PHYSICAL ADDRESS=00002000 TUTOR 1.3 > GD (Go direct execute program): Starta exekvering utan brytpunkter TUTOR 1.3 > GD (adress) Kommandot GD startar exekvering från angiven adress. Anges ingen adress bestämmer innehållet i PC startadressen. GD sätter inte in några brytpunkter från brytpunktstabellen. GT (Go until temporary breakpoint): Exekvera till temporär brytpunkt TUTOR 1.3 > GT brytpunktsadress Kommandot GT utför i detalj följande: 1. Sätter en temporär brytpunkt på angiven adress. 2. Sätter brytpunkter från brytpunktstabellen. 3. Startar exekveringen från den adress som anges av PC. PC:s innehåll kan ändras med kommandot.pc data. - 27 -

När programmet når en brytpunkt tas den temporära brytpunkten bort. TUTOR 1.3 > GT 2008 PHYSICAL ADDRESS=00002008 PHYSICAL ADDRESS=00002000 AT BREAKPOINT PC=00002008 SR=2700=.S7... US=FFFFFFFF SS=00000786 D0=0A0A0A0A D1=00000000 D2=FED01210 D3=00000000 D4=FFFF0031 D5=FFFFFF2C D6=0000FFFF D7=00000000 A0=00010014 A1=000000C0 A2=00000414 A3=00000554 A4=00009FA8 A5=00000540 A6=00000540 A7=00000786 --------------------002008 60FE BRA.S $002008 TUTOR 1.3 > Sammanfaller den temporära brytpunktens adress med någon adress i brytpunktstabellen erhålls ett felmeddelande. TUTOR 1.3 > BR 2008 BREAKPOINTS 002008 002008 TUTOR 1.3 > GT 2008 PHYSICAL ADDRESS=00002008 ERROR 002008 002008 TUTOR 1.3 > TR (Trace): Utför en instruktion i taget TUTOR 1.3 > TR (antal) Kommandot TR (eller bara T) startar exekvering på den adress dom anges av PC. En instruktion utförs, varefter exekveringen stoppas och innehållet i de interna registren visas. Den instruktion som står i tur att utföras visas i disassemblerad form. Anges antal (hexkod) utförs det antal instruktioner som angivits, annars utförs en instruktion. I Trace-moden innehåller prompten ett kolontecken. TUTOR 1.3 :> Efter denna prompt kan du använda samtliga TUTOR-kommandon. Return utför nästa instruktion. Alla andra kommandon avbryter TR-kommandot. TUTOR 1.3 :>.PC 2000 TUTOR 1.3 > TR PHYSICAL ADDRESS=00002000 PC=00002002 SR=2700=.S7... US=FFFFFFFF SS=00000786 D0=00000F20 D1=42284C01 D2=000320C8 D3=00000000 D4=00000000 D5=00000000 D6=00000002 D7=000001FF A0=00010040 A1=00008348 A2=00000414 A3=00010041 A4=00000782 A5=00000540 A6=00000540 A7=00000786 --------------------002002 4E71 NOP TUTOR 1.3 :> PHYSICAL ADDRESS=00002002 PC=00002004 SR=2700=.S7... US=FFFFFFFF SS=00000786 D0=00000F20 D1=42284C01 D2=000320C8 D3=00000000 D4=00000000 D5=00000000 D6=00000002 D7=000001FF A0=00010040 A1=00008348 A2=00000414 A3=00010041 A4=00000782 A5=00000540 A6=00000540 A7=00000786 --------------------002004 4E71 NOP TUTOR 1.3 :>.PC.PC=00002004 TUTOR 1.3 > - 28 -

TT: (Trace to temporary breakpoint): Trace till temporär brytpunkt TUTOR 1.3 > TT brytpunktsadress Kommandot TT utför följande: 1. Sätter en temporär brytpunkt på angiven adress. 2. Sätter brytpunkter från brytpunktstabellen. 3. Startar exekvering i Trace-mode från den adress som anges av PC. När programmet når en brytpunkt bortfaller den temporära brytpunkten. 5.7. Hjälp Det finns inte precis någon utförlig hjälp att få av TUTOR själv, men en lista på tillgängliga kommandon visas om du skriver kommandot HE (Help). TUTOR 1.3 > HE.PC.SR.US.SS.D0.D1.D2.D3.D4.D5.D6.D7.A0.A1.A2.A3.A4.A5.A6.A7.R0.R1.R2.R3.R4.R5.R6 BF BM BR NOBR BS BT DC DF DU G GD GO GT HE LO M MD MM MS OF PA NOPA PF T TM TR TT VE TUTOR 1.3 > 5.8. Felmeddelanden När du exekverar program som du skrivit själv kan två typer av avbrott med felutskrift erhållas. Försöker du göra en läsning eller skrivning på en adress där det inte finns något minne anslutet erhåller du Bus trap error. TUTOR 1.3 > MD 20000 1015 00020000 1018 BUS TRAP ERROR PC=00009206 SR=2700=.S7... US=FFFFFFFF SS=00000782 D0=00320030 D1=1CFC4D44 D2=0C030000 D3=00000010 D4=00004CDC D5=0000002C D6=FFFFFFFF D7=00000000 A0=00020001 A1=00008350 A2=00000549 A3=00000000 A4=00020000 A5=00000540 A6=0000054A A7=00000782 --------------------009206 610007B0 BSR.L $0099B8 TUTOR 1.3 > Alla ord (16 bitar), långa ord (32 bitar) och instruktioner måste börja på en jämn adress i minnet. Försöker du adressera någon av dessa datatyper på en udda adress erhålls address trap error. TUTOR 1.3 >.PC 2001 TUTOR 1.3 > GO PHYSICAL ADDRESS=00002001 3015 00002001 3012 ADDR TRAP ERROR PC=00008D68 SR=2700=.S7... US=FFFFFFFF SS=00000782 D0=00302031 D1=1CFC2001 D2=0C032001 D3=00000000 D4=00002001 D5=00000000 D6=00000002 D7=000015FA A0=0000861A A1=FFFFFFFF A2=00002001 A3=00000000 A4=00000400 A5=0000055B A6=0000055B A7=00000782 --------------------008D68 22780444 MOVE.L $00000444,A1 TUTOR 1.3 > - 29 -

Felutskrift kan även förekomma när du arbetar i TUTOR. Eftersom TUTOR är ett mycket litet och enkelt program inskränker sig felutskriften oftast till ett par ord. TUTOR 1.3 > MD 2000;W SYNTAX ERROR TUTOR 1.3 > GO 2001 INVALID ADDRESS=00002001 TUTOR 1.3 > PC WHAT TUTOR 1.3 > 5.9. Radassembler Monitorprogrammet TUTOR innehåller en assembler som gör översättningen av assemblerkod till maskinkod (assemblering) samt av maskinkod till assemblerkod (disassemblering). Med hjälp av denna assembler kan du skriva korta program i TUTOR. Assemblern är en primitiv så kallad radassembler, vilket betyder att den endast kan hantera en programrad i taget. När du avslutar inmatningen av en rad med Return görs omedelbart en översättning till maskinkod som lagras i primärminnet. Källtexten som du matar in sparas inte. Eftersom radassemblern inte vet någonting om kommande eller föregående rader i programmet kan du inte använda symboliska namn varken för operander eller adresser. Radassemblern är trots detta fullt tillräcklig för genomförandet av laborationerna i kursen. Du kommer inte att behöva skriva några längre program. Radformat Varje rad du skriver in i assemblerläget innehåller endera ett assemblerdirektiv eller en exekverbar instruktion. Instruktionen består av en operationskod, oftast åtföljd av en eller flera operander. En exekverbar instruktion matas in enligt notationen i kapitel 6. OBS! En tämligen irriterande egenhet i TUTOR är att du måste börja inmatningen av en instruktion med minst ett mellanslag. Om du glömmer det inledande mellanslaget kommer TUTOR inte att begripa vad du menar. Detta är återigen en konsekvens av att TUTOR är ett mycket litet och enkelt program. Alltså: kom ihåg att inleda med ett mellanslag när du matar in assemblerinstruktioner! Det skall vara minst ett mellanslag även mellan operationskoden och operandfältet. Om det är flera operander i operandfältet skall det vara kommatecken mellan dem. Mellanslag behövs inte mellan operander. Förutom exekverbara instruktioner enligt instruktionslistan i kapitel 6 och 7 kan radassemblern tolka ett speciellt så kallat assemblerdirektiv: DC.W (Define constant word). Direktivet lägger ett specificerat ord (16 bitar) i primärminnet. Du kommer förmodligen inte att behöva använda detta direktiv själv, men när TUTOR försöker disassemblera på en adress där det inte finns någon giltig instruktion kommer det att stå DC.W i programlistningen, följt av det ord som inte kunde tolkas. Det finns dock många 16-bitars tal som är giltiga instruktionsord, och sannolikheten är därför ganska hög för att ett slumpmässigt tal tolkas som en formellt korrekt men helt vettlös instruktion. Du kommer att se mycket dumheter från en vilsen disassembler när du matar in program. TUTOR 1.3 > MD 4000 16 ;DI 004000 866A40E3 OR.W 16611(A2),D3 004004 48EA00018864 MOVEM.L D0,-30620(A2) 00400A 85FD DC.W $85FD 00400C 28D8 MOVE.L (A0)+,(A4)+ 00400E 0C00 DC.W $0C00 004010 ED95 ROXL.L #6,D5 004012 02586888 AND.W #26760,(A0)+ TUTOR 1.3 > - 30 -

När det gäller operationskoden kan de flesta instruktioner arbeta på flera datalängder. Datalängden markeras med suffixen.b,.w eller.l, helt enligt instruktionslistan i nästa kapitel. Utelämnas markeringen av datalängd tolkas detta av assemblern som längden.w. Numeriskt format Om ingenting annat anges tolkas alla inmatade tal som decimala tal. Detta skiljer sig olyckligt nog från hur resten av TUTOR beter sig. Hexadecimala tal måste föregås av ett dollartecken. Data kan även anges som binära tal med förtecknet % eller som ASCII-tecken omgivna av apostrofer. Om man önskar understryka att ett tal skall tolkas som ett decimalt tal kan man använda förtecknet &. MOVE.B #30,D0 får som resultat att D0 får värdet $1E (30 decimalt). MOVE.B #$30,D0 får som resultat att D0 får värdet $30 (48 decimalt). MOVE.B #'A',D0 får som resultat att D0 får värdet $41 (65 decimalt), ASCII-koden för A. Följande tecken är tillåtna i assemblerkod som skrivs in i TUTOR: Stora bokstäver (A till och med Z) Siffror (0 till och med 9) Tecknen + och - Parenteser: ( ) Speciella förtecken: # markerar omedelbar adresseringsmod, $ markerar ett hexadecimalt tal, & markerar ett decimalt tal, % markerar ett binärt tal, apostrofer omsluter ASCII-strängar Skiljetecken: komma, punkt, /, - En asterisk (*) kan anges som adress för att markera adressen till den instruktion man just håller på att skriva in. Detta är praktiskt när man till exempel skriver in en hoppinstruktion som man ännu inte vet hoppadressen för. Anropande av assembler/disassembler Assemblern startas med kommandot: TUTOR 1.3 > MM adress ;DI Genom att trycka på Return disassembleras och visas nästa rad utan att den aktuella raden ändras. Om du trycker på punkt (. ) följt av Return avbryts kommandot och prompten TUTOR 1.3 > visas. TUTOR 1.3 > MM 2000;DI 002000 1E3C0010 MOVE.B #16,D7? 002004 4E71 NOP? 002006 4E71 NOP?. TUTOR 1.3 > Det som visas av assemblern är adressen och maskinkoden i hexadecimal notation, samt motsvarande assemblerkod. Den disassemblerade raden skiljer sig förmodligen något från den rad du matade in. Disassemblern presenterar alla adresser (eller förväntade adresser) som hexadecimala tal. Alla andra tal presenteras som decimaltal. Eftersom källtexten du matar in inte sparas finns det inget sätt för assemblern att veta på vilken form du matade in talen. Det den presenterar är i de flesta fall en god gissning, men en del överraskningar kan förekomma. Det är alltid bra att disassemblera sitt program när man matat in det klart, för att hitta skrivfel och för att se att inget missuppfattades av assemblern. När du matar in assemblerkod knappar du in den efter fågetecknet. Glöm inte att du måste börja med ett mellanslag! När du trycker på Return suddas raden, den tolkning som assemblern gjort skrivs ut i stället, och nästa rad disassembleras och visas. Om assemblern inte kan tolka din inmatade rad gör den ingen assemblering, utan skriver ut X? under det felaktiga tecknet. Tecknet X skrivs ut under det som assemblern inte förstod. Om du gör - 31 -