LABORATION DATORTEKNIK Y. DATORTEKNIK D DATORTEKNIK M/1/C 1.1. TUTOR M68008 SYSTEM OCH ASSEMBLER Stefan Gustav son, Olle Ro os m fl ISY-LiTH 1996
Innehåll l Introduktion 3 1.1 Historia... 3 1.2 Nutid....... 3 1.3 Framtid... 3 2 M68008 ur programmerarens synvinkel 5 2.1 Programrnerarmodell... 5 2.2 Adresseringsmoder... 6 2.3 Minnesmodell... 6 2.4 Instruktionsformat... 7 2.5 Dataformat... 7 2.6 Instruktionslista...... 7 3 M68008 ur hårdvarukonstruktörens synvinkel 9 3.1 Processoms signaler... 9 3.2 Adressbuss... 9 3.3 Databuss... 9 3.4 Asynkron busskontroll..... 9 3.5 Synkron busskontroll........ lo 3.6 Val av bussägare..... 10 3.7 Systemkontroll... 10 3.8 A v brottssignaler... 11 3.9 Statussignaler.... 11 4 TUTOR-systemet: maskinvara 13 4.1 Översikt... 13 4.2 Processorkortet... 13 4.3 Indelning av adressrymd... 13 4.4 Serieport... 14 4.5 Parallellport...... 14 4.6 Programmering av parallellporten... 15 4.7 Avbrottshantering i parallellportsadaptern...... 17 4.8 Händelser i processorn vid avbrott..... 17 4.9 Uppstart av systemet..... 19 4.10 Kopplingsschema... 19 5 TUTOR-systemet: programvara 23 5.1 Kommandon i TUTOR... 23 5.2 Visa minnesinnehåll... 23 5.3 Ändring av minnesinnehåll..... 24 5.4 Visafändra registerinnehåll... 26 5.5 Brytpunkter... 26 5.6 Exekvering och felsökning av program... 27 5.7 Hjälp..... 29 5.8 Fe1meddelanden... 29 5.9 Radassembler...... 30 6 Assemblerprogrammering på M68008 33 6.1 Förkortningar... 33 6.2 Adresseringsmoder... 33 6.3 Två operander: Source och Destination... 35 6.4 Sammanställning av instruktioner... 36 7 Instruktionslista for M68008 39
l. 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-farniljen är 16-bitars eller 32-bitars processorer med 16 generella register, alla med bredden 32 bitar. Programmeraren kan själv bestämrna 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 Arniga och de första modellerna av Apple Macintosh var uppbyggda kring M68000. Processorn har nu slutat tillverkas, men den har modemare 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 prograrnkod. 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-farniljen 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- processorema. 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 modem 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 l. Processorn innehåller 8 dataregister, DO - D7. Dataregistren är vardera 32 bitar breda och kan bearbeta data om 8 bitar (byte), 16 bitar (word) eller 32 bitar (Iong word). Dataregistren är generella och kan användas som ackumulatorer, indexregister eller räknare. Processorn innehåller dessutom 8 adressregister, AO - A 7. Adressregistren är 32 bitar breda och arbetar med datalängden 16 eller 32 bitar. Adressregistren kan inte arbeta med datalängden 8 bitar. A v namnet "adressregister" framgår att de främst är avsedda för att lagra adresser. Adressregister A 7 ä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 l Mbyte (2 20 bytes) utpekas. Processorninehåller slutligen ett 16 bitar brett statusregister, SR. 31 16 15 8 7. 31 16 15... r. o o DO 01 02 03 04 05 06 07 AO A1 A2 A3 A4 AS AG A7 PC Dataregister Adressregister stackpekare (USP/SSP) Programräknare SR statusregister Figur l: 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 l. Register A7 består i verkligheten av två register. Processorn kan arbeta i två lägen, Supervisor mode och U ser mode. Vazje 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. System byte : User byte l 10 g 8 1 Trace mode. lnterrupt ' Superv1sor ask mode m l Extend Negative Zero ----' Overflow---' Carry-----' 2.2. Adresseringsmoder Figur 2: statusregistret 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 (absolute) 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 kapitel6. 2.3. Minnesmodell 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 l 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 vru:je adress motsvaras av exakt en fysisk minnesposition. -6-
Adress $00000 $00001 $00002 8 bitar BytenrO Byte nr l Byte nr 2 Totalt 2 20 bytes (l Mbyte) $FFFF ~~ Bytenr2 20-2 ~FFFFF t=j Byte nr 2 20-1 Figur 3: Minnesorganisationfö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 lo 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 Adress N Instruktion l N+ l N+2 Instruktion 2 N+3 Figur 4: Instruktionsformatet för M68008 Instruktion med operander Adress M Instruktion M+1 M+2 Operanddata M+3 (2-8 bytes) M+4 M+5 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 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. M~tni?gs- [ spanmng Kl ocksignal Status- [ information Synkron busskontroll Systemkontroll [ [ M68008.. +5V 00-07 -..... ~ GNO.. AO-A19 - CLK FCO AS.. -... FC1 RfW... FC2 os..... E OTACK... VPA BR..... ~ BERR BG...... RESET IPL0/2... ~..... HALT IPL1... Databuss Adressbuss 3.2. Adressbuss Figur 5: Signaler till ocfz från M68008 Den enkelriktade databussen är 20 bitar bred och innehåller adressinformation vid alla bussöverföringar. En linjär adressrymd om l 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, DO är minst signifikant. 3.4. Asynkron busskontroll 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å (O) 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 (RIW=l) eller skrivcykel (RJW=O) 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 l - Inga giltiga data på bussen o l Läscykel o o skrivcykel l Asynkron busskontroll J Bussväljare J Avbrottssignaler -9-
Data transfer acknowledge, DTA CK 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 ad dress, VP A När denna insignal sätts till O 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 klacksignal från processorn som talar om när dataöverföring skall ske. Klackfrekvensen för E är en tiondel av processoms klackfrekvens 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 klackintervall 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 Signalema 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 Signalema 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 O. 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=O 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. - lo-
3.8. Avbrottssignaler M68000 har tre avbrottssignaler, IPL2, IPLl och IPLO. Prioritering sker enligt följande: IPL2 IPLl IPLO Begärd avbrottsnivå l l l O (inget avbrott begärs) l l o l (lägsta prioritet) l o l 2 l o o 3 o l l 4 o l o s o o l 6 o o o 7 (högsta prioritet) På processorn M68008 har man sparat in ett ben genom att koppla ihop signalerna IPL2 och IPLO. Detta resulterar i följande prioritetstabell IPL2/0 IPLI Avbrottsnivå l l O (inget avbrott) l o 2 o l 5 o o 7 För en beskrivning av vad som sker i processorn vid en avbrottsbegäran, se avsnitt 4.8. 3.9. statussignaler statussignalerna FC2, FC l och FCO informerar omvärlden om processoms interna tillstånd enligt följande: FC2 FCl FCO Cycle type o o o Undefined o o l User data o l o U ser program o l l Undefined l o o Undefined l o l Supervisor data l l o Supervisor program l l l 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, klackfrekvens 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 Klackkretsar 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 l 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 - $0 IFFF 6158 byte RAM för användare $02000 - $07FFF 24 Kbyte RAM för användare $08000 - $0BFFF 16 Kbyte EPROM med monitorprogrammet TUTOR $0COOO - $0FFFF 16 Kbyte EPROM med diverse hjälpprogram (ganska tomt) $10000- $107FF 2 Kbyte synkron area för l/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) A v brott 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 parallell porten. 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: 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. Register beteckningar: PIAA DDRA CRA dataregister A riktningsregister A 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 samrna 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 =O l DDRA utpekas l _ CRA-2 = l _ PIAA utpekas Programmering avddra Innehållet i riktningsregistret DDRA bestämmer datariktningen för varje bit i PIAA. En l :a i en bit i DDRA gör motsvarande bit i PIAA till utgång. En O:a gör motsvarande bit till ingång. Programmering av CRA Kontrollregistrets bitar kan delas in i följande grupper: CRA 7 6 5 4 3 2 1 o StyrCA2 y Styr CA1 -signalflaggor för avbrott 0: DDRA utpekas 1: PIAA utpekas Figur 7: Kontrollregistrets bitar Flaggan CRA-7 l-ställs av den yttre signalen CAl, och flaggan CRA-6 l-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-l: bitarna CRA-1 och CRA-0 CRA-1 = O CRA-7 l-ställs när CAl växlar från l till O CRA -l = l CRA -7 l-ställs när CA l växlar från O till l CRA-0 = O IRQA aktiveras ej när CRA-7 l-ställs. Avbrott spärras. CRA-0 =l IRQA aktiveras när CRA-7 l-ställs. Avbrott matas vidare till processorn. Yttre signalen CA2: bitarna CRA-5, CRA-4 och CRA-3 Till skillnad från CAl, som bara kan användas som ingång, kan CA2 användas antingen som ingång eller som utgång. CRA-5 =O 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 =O CRA-4 = l CRA-3 =O CRA-3 = l CRA-6 l-ställs när CA2 växlar från l till O CRA-6 l-ställs när CA2 växlar från O till l IRQA aktiveras ej när CRA-6 l-ställs. Avbrott spärras. IRQA aktiveras när CRA-6 l-ställs. Avbrott matas vidare till processorn. CRA-5 = l gör CA2 till utgång. Utgångens värde styrs då med CRA-4 och CRA-3. CRA-4 CRA-3 Resultat l o Utgången CA2 = O l l Utgången CA2 =l Å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. l. 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 l för att i fortsättningen peka ut dataregistret. Antag att vi vill programmera PAO till PB7 samt PB4 till PB7 som utgångar och PBO till PB3 som ingångar. Vi vill att CAI skall ettställa CRA-7 på positiv flank (växling från noll till l), men vi vill inte att avbrott skall signaleras. CA2, CB l 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å programmeraddra med endast ettor och DDRB med ettor i bit 7 ti114 och nollor i bit 3 till O. 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 l för att i fortsättningen läsa och skriva i dataregistret och inte riktningsregistret. CA-l 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 0000011 O. På samma sätt kommer vi fram till att CRB skall ha innehållet 00000 l 00. Följande program programmerar PIA enligt ovan: CLR.B MOVE.B MOVE.B CLR.B MOVE.B MOVE.B $10084 #$FF, $10080 #$06, $10084 $10086 #$FO, $10082 #$04, $10086 CRA nollställs DDRA = $FF CRA slutvärde CRB nollställs DDRB = $FO 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 CAl, och CRA-6 påverkas av signalen CA2. När någon av signalflaggorna är l-ställd (eller om båda är l-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/ O 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 processoms avbrottsingång IPLl. 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 CA l 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 IPLO, IPLl och IPL2 som när de aktiveras i olika kombinationer kan signalera avbrott på 7 olika nivåer. M68008 har IPLO och IPL2 sammankopplade till en enda signal och kan därför endast ta emot avbrott på nivåerna 2, 5 eller 7 (IPLl 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 12, I l, 10 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å processorkorte t. 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 o o 000 Reset initial SSP l 4 004 Reset initial PC 2 8 008 Bus error 3 12 ooc Address error 4 16 010 Illegal instruction 5 20 014 Zero divide 6 24 018 CHK instruction 7 28 O l C TRAPV instruction 8 32 020 Privilege violation 9 36 024 Trace 10 40 028 Line l O l O emulator 11 44 02C Line 1111 emulator 12-23 48-92 030-05C Reserved 24 96 060 Spurious interrupt 25 100 064 Level l 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#O 33 132 084 TRAP#l 34 136 088 TRAP#2............ 45 180 OB4 TRAP#13 46 184 OB8 TRAP#l4 47 188 OBC TRAP#l5 48-63 192-252 OCO-OFC 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 E OR. 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. V ar särskilt försiktig med instruktionen MOVE. W #data, SR! När ett avbrott accepteras händer följande: l. Det föregående innehållet i PC och SR sparas på stacken (supervisor-stacken). 2. SR uppdateras genom att bit S l-ställs, bit T O-ställs, och 12, Il, 10 sätts till ett tre bitars binärt tallika med den begärande avbrottsnivån. När S= l arbetar processorn i Supervisor mode. Med T=O förhindras stegvis exekvering av instruktioner. 3. PC laddas med en avbrottsvektor ( startadressen till avbrottsprogramrnet). 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: EfterRTE: SP-> Gamla SR Gamla PC SP-> 1------l SP-> 4.9. Uppstart av systemet Vid spänningstillslag händer följande: Figur 9: Slackens förändring vid avbrott l. 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 avbrottsvektom 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 $ O 8 O O O l A 7 (eller MOVE L # $ O O O O 8 O O O l A 7 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 assemblem som en kort adress och fylls ut felaktigt till en lång adress. 4.10. Kopplingsschema TUTOR-systemets kopplingsschema visas i figur 10. Det ekvivalenta innehållet i P AL-kretsen visas i figur 11. - 19-
~ ~ ;:..,... ~ ~ ;g - f 1'1:) ~.., 'B? ;:! ~ 2l g. s ~... ~ ~ ~ ~?l;~~. L R16 330k 41!C '3 Ha. t t.----1--.._~~ Re'5'et!L1 A13 l Al'3 R6 2k.---+--1----t~ Abort R18 lm C6 f~ 1221' ~Abort l Tk 2 IC B EXD 3 16 MHz [ B MHz l AS R12 + + lok fk! u -, Cl o (1\ 0.. w c IX w....j c.j ~ TPI?l!fi'AC"R BEr r FC O FC l FC 2 Ck l RAM \.'Men ROM Go. t t R9 2k c VJ Reiet!C3 qo 1C.6 ~ DO- 07 i! l -- K...a. 07 ~ AO CS2 ~ co o (X) \D u x är E R/0 + AO d_ Al RS "" IQ EXD 3 19,66MHz 76,BkHz l.j Al4 ;j!l RSO A6 CSI ~--=i (U RxCtk (\J ::t..o E TxCtk ~ c ::t ~ - IX :r. lli R/0 2 - 'D -- 22 DE ~ 3 4 u U > ollll (UUru:> "'W + 03 1N4004 t-j<r-----, P B O PA 4 re 10 1.. o R9 N l C7-C8 5 1 6 et F 22.ul_ ~ 2k 7 2 B 41 u '3 3 10 MPS2369 o 1.. f' ' R l lok Trl lo O p y l Cli-C15 0,1'" m 11 13 15 17 4 5 6 7 12 14 16 18 19 CBI CA! 20 21 CB2 CA2 22 23 +SVett 24 25 JORD 26 C3 MAX 5 ~16 7 8 '3 lo ~ ~l CTS ~2TxD --~3 RxD 232 +10 Linje årlvo.re 5 ritr 6 JORD \t o l t u 7 SVett 221+ B +SVolt C4 + 9 JORD 22;t I RAM + BU
,/{/.5 j!j T '- Ut o,..- K /?~S( t J Q l /J/17,/11'1 ö 1-,1118,t:}l9,.. fiib,...40 _r,/il(, & /ll 7.P/'.Q/S -4.5 '- '- & port R/l H l /L/I l /?19 fl/b 1717,41&,1)/s-,4S & ~. r-- - >I r-- 11./I T fl/9...r,1//8 /l n,17/',11/5 E " & - ~ 1?01-1 6/lTE +------l D Q l--r---l D O t-----.- C/~..;: -<) C/e4 r Figur 11: Ekvivalent innehåll i P AL-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 l. 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 Visalä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.ao-.a7 Visaländra adressregister.do-.d7 Visaländra dataregister.pc Visaländra programräknare.sr Visaländra statusregister.ss Visaländra Supervisor stackpekare.vs Visaländra User stackpekare Exekvering av program BR Visalsä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öljan 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 an tal 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 Al 20 04 00....! 002020 15 78 00 E9 6A 8E lo 46 CB B8 08 A9 40 92 00 00.x.ij.. FK8. )@ 0020FO 09 BD C9 FF FE CD 00 00 E4 41 64 6D FS 12 00 00. =I. -M.. dadmu... 002100 os 11 00 F9 38 08 00 04 AO 48 00 ld 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, DO 008016 4281 CLR.L Dl 008018 locl MOVE.B Dl, (AO)+ 00801A 5380 SUBQ.L #l,do 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): Visalä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?AO 002004 44?. TUTOR l. 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 Uppdaterar minnesinnehållet och stegar framåt. da ta A Uppdaterar minnesinnehållet och stegar bakåt. da ta= Uppdaterar minnesinnehåll et, ändrar inte adress. data. 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 tilllämplig adress, endast A 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 002000 002004 002008 00200C 002008 002008 TUTOR 1.3 > MM 2000;L CB2100AO? 44800006? F74006B8? 82580000?" F74006B8?AOOOOOOO= AOOOOOOO?. 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 da ta 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 vmje 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 AO 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 adressl adress2 dataord Kommandot BF fyller minnet med da ta med börjaniadres s l och slut i adress 2. Data utgörs av hexkod och måste vara ett ord (16 bitar). Båda adresserna måste varajämna tal. TUTOR 1.3 > BF 2000 2008 BADA PHYSICAL ADDRESS=00002000 00002008 TUTOR 1.3 > MD 2000 002000 BADABA DA BADABA DA BADA 00 00 82 58 00 00 :Z:Z:Z:Z:Z... X.. TUTOR 1.3 > -25-
5.4. Visalä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 l. 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 DO=OOOOFFOO D1=00000000 D2=FED01210 D3=00000000 D4=FFFF0031 D5=FFFFFF2C 06=00000002 07=00000000 A0=00010040 A1=000000CO A2=00000414 A3=00000554 A4=00009FA8 A5=00000540 A6=00000540 A7=0000075A --------------------009FA6 1210 MOVE.B (AO),D1 TUTOR 1.3 >.RR (lndividual register display/change): Visaländra innehållet i ett utvalt register TUTOR 1.3 >.RR data RR är registernamnet och kan väljas bland DO- D7, AO- A7, PC, SR, US, SS. Anges inte data visas innehållet i det utvalda registret. Anges da ta ändras dess innehåll till detta. TUTOR l. 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 processoms interna register visas. Exekveringen kan återupptas med något av kommandona GO, GD, GT, TR, eller TT. Brytpunkter sätts med kommandot B R. 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): Visalsä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. Brytpunktema som finns i tabellen sätts in fysiskt i programmet när du kör något av kommandona GO, GT eller IT. 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 an tal räknas an tal ned med l vruje gång programmet passerar brytpunktsadressen. Först när an tal ä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 l. 3 > NOBR (Remove breakpoint): Tag bort brytpunkter TUTOR 1.3 > NOBR (adress adress... ) Kommandot NOBR tar bort angivna brytpunkter från brytpunkts tabellen. 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 l. 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 bteakpoint): Exekvera till temporär brytpunkt TUTOR 1.3 > GT brytpunktsadress Kommandot GT utför i detalj följande: l. 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 da ta. -27-
När progranunet når en brytpunkt tas den ternporä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 DO=OAOAOAOA D1=00000000 D2=FED01210 D3=00000000 D4=FFFF0031 D5=FFFFFF2C D6=0000FFFF D7=00000000 A0=00010014 A1=000000CO A2=00000414 A3=00000554 A4=00009FA8 A5=00000540 A6=00000540 A7=00000786 --------------------002008 60FE BRA. S $002008 TUTOR l. 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 l. 3 > TR (Trace): Utför en instruktion i taget TUTOR l. 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 an tal (he:x.kod) 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 l. 3 > TR PHYSICAL ADDRESS=00002000 PC=00002002 SR=2700=.S7... US=FFFFFFFF SS=00000786 D0=00000F20 D1=42284C01 D2=000320C8 D3=00000000 D4=00000000 DS=OOOOOOOO 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 DS=OOOOOOOO D6=00000002 D7=000001FF A0=00010040 Al=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 IT utför följande: l. 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 kommandothe (Help). TUTOR 1.3 > HE. PC. SR. US. SS.DO.Dl.D2.D3.D4.DS. D6.D7.AO.Al.A2.A3.A4.AS.A6.A7.RO.Rl.R2.R3.R4. RS.R6 BF BM BR NOBR BS BT DU G GD GO GT HE MD MM MS OF PA NOPA TM TR TT VE DC LO PF DF M T TUTOR l. 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 Dl=lCFC4D44 D2=0C030000 D3=00000010 D4=00004CDC D5=0000002C D6=FFFFFFFF D7=00000000 A0=00020001 Al=00008350 A2=00000549 A3=00000000 A4=00020000 A5=00000540 A6=0000054A A7=00000782 --------------------009206 610007BO 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 l. 3 > GO PHYSICAL ADDRESS=00002001 3015 00002001 3012 ADDR TRAP ERROR PC=00008D68 SR=2700=.S7... US=FFFFFFFF SS=00000782 D0=00302031 Dl=lCFC2001 D2=0C032001 D3=00000000 D4=00002001 D5=00000000 D6=00000002 D7=000015FA A0=0000861A Al=FFFFFFFF A2=00002001 A3=00000000 A4=00000400 A5=0000055B A6=0000055B A7=00000782 ----------------- ---008D68 22780444 MOVE.L $00000444,Al 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 WHAT 1.3 > PC 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. Assemblem ä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 radassemblem 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. Radassemblem ä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 V ruje 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ölja 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 operan der. Förutom exekverbara instruktioner enligt instruktionslistan i kapitel 6 och 7 kan radassemblem tolka ett speciellt så kallat assemblerdirektiv: DC. W (Defrne eonstant 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 004000 004004 00400A 00400C 00400E 004010 004012 TUTOR 1.3 > 1.3 > MD 4000 16 866A40E3 48EA00018864 85FD 28D8 ocoo ED95 02586888 ;DI OR.W 16611(A2),D3 MOVEM.L D0,-30620(A2) DC.W MOVE.L $85FD (AO)+, (A4)+ DC.W ROXL.L $0COO #6,D5 AND.W #26760, (AO)+ -30-