Beschrijving Mon68K
Citation for published version (APA):
Tiesinga, J. (1987). Beschrijving Mon68K. (IPO-Rapport; Vol. 617). Instituut voor Perceptie Onderzoek (IPO).
Document status and date:
Gepubliceerd: 18/11/1987
Document Version:
Uitgevers PDF, ook bekend als Version of Record
Please check the document version of this publication:
• A submitted manuscript is the version of the article upon submission and before peer-review. There can be
important differences between the submitted version and the official published version of record. People
interested in the research are advised to contact the author for the final version of the publication, or visit the
DOI to the publisher's website.
• The final author version and the galley proof are versions of the publication after peer review.
• The final published version features the final layout of the paper including the volume, issue and page
numbers.
Link to publication
General rights
Copyright and moral rights for the publications made accessible in the public portal are retained by the authors and/or other copyright owners and it is a condition of accessing publications that users recognise and abide by the legal requirements associated with these rights. • Users may download and print one copy of any publication from the public portal for the purpose of private study or research. • You may not further distribute the material or use it for any profit-making activity or commercial gain
• You may freely distribute the URL identifying the publication in the public portal.
If the publication is distributed under the terms of Article 25fa of the Dutch Copyright Act, indicated by the “Taverne” license above, please follow below link for the End User Agreement:
www.tue.nl/taverne
Take down policy
If you believe that this document breaches copyright please contact us at:
openaccess@tue.nl
providing details and we will investigate your claim.
Instituut voor Perceptie Onderzoek
Postbus 513, 5600 MB
EINDHOVEN
Rapport no. 617
Beschrijving Mon68K
J. Tiesinga
JT/jt 87/05
18.11.1987
Contents
1 Inleiding
2 Gebruikte afkortingen en wetenswaardigheden
2.1 Afkortingen . . .
2.2 Wetenswaardigheden
3 Initialisatie
3.1
Aanmaak van de monitor
3.2
Programmaexecutie
4 Conunando's
4.1 Alternate prompt .
4.2 Enable interrupts .
4.3
Findram
4.4 Go . . . .
4.5 Help . . . .
4.6
Initialize memory
4.7 Load 82 records .
4.8 Modify . . . .
4.8.1
Data .. .
4.8.2
Commando's
4.9 Print . . . .
2
3
3
3
4
4
4
5
5
6
6
6
7
7
7
8
8
9
9
4.10 Reset vectoren 0-5 en 7
9
4.11 reset vectoren 0-7 . .
10
4.12 Stackpointer waarde
10
4.13
Trace functie . . . .
10
4.14 Vector defin.tie . . .
11
4.15 Zoek de onbekende: X
12
5 Systeemfoutenafhandeling
13
5.1 adres_error at or near $adres . . . .
13
5.2 bus_error /memory _privilege ... error at or near $adres
13
5.3
instruction_privilege_ violation_error at or $adres
13
5.4 illegal_instruction_error at or near $adres .
14
6 Praktijkervaringen
15
7 Literatuur
16
1
Inleiding
De mon68k is een assemblerprogramma voor 68000-georiënteerde
applika-ties op basis van de LABBUS-CP U /MMU-68k kaart. Het programma is
een stuk gereedschap, waarmee interactief hardware en software getest kan
worden. De monitor zelf maakt voor de communicatie met de buitenwereld
gebruik van een aciapoort: als daarop een terminal aangesloten wordt
kun-nen de commando's met het toetsenbord ingegeven worden, verzonden data
verschijnt dan op het beeldscherm.
2
Gebruikte afkortingen en wetenswaardigheden
2.1 Afkortingen
De volgende tabel bevat een aantal gebruikte afkortingen en hun betekenis:
Afkorting Betekenis
adres
hexadecimaal getal in de range $000000 - $FFFFFF
adresl
hexadecimaal getal in de range $000000 - $FFFFFF
adres2
hexadecimaal getal in de range $000000 - $FFFFFF
byte
hexadecimaal getal in de range $00 - $FF
word
hexadecimaal getal in de range $0000 - $FFFF
longword
hexadecimaal getal in de range $00000000 - $FFFFFFFF
CR
carriage return (wagenterugloop, ascii 'char' $0D}
CRLF
carriage return linefeed sequence ascii $0DOA}
spatie
spatie (ascii 'char' $20)
MMU
memory management unit : geheugenverdeler
2.2
Wetenswaardigheden
In te geven adressen zijn beperkt tot 3 bytes omdat de 68000 maar 24
adres-lijnen naar buiten brengt. Dit geldt ook binnen de commandoroutines. Het
commando 'Print $FFFFFF $000000' geeft dus van twee geheugenplaatsen
de inhoud.
Binnen het tracecommando is het mogelijk de registers volledig te vullen,
echter de PC-waarde wordt roodulo $1000000 genomen.
3
Initialisatie
3.1 Aanmaak van de monitor
Het assemblerfile
1dat de monitor beschrijft kan met op de PMDS-11
aan-wezige assembler gemaakt worden. De inhoud van het outputfile van de
assembler dient dan nog in twee prommen van het type 2732A geladen te
worden, een prom voor de even adressen en de ander voor de de oneven
adressen. (Wordt aangegeven metHen L).
3.2 Programmaexecutie
Wat gebeurt er nu wanneer een prom met de de monitor geïnstaleerd is en
de spanning staat aan e.d.?
Nou, het volgende: Aannemende dat alle hardware correct functioneert en
de acia
inderd~·ad
op het gegeven adres geselecteerd wordt beginnen we
bij powerup ('PWRUP') met het plaatsen van ram op de ondertse bank
geheugen (schrijfactie naar de prom). Vervolgens wordt de MMU
geïnitiali-seerd en wel zodanig dat al het geheugen toegewezen wordt aan de
super-visor. Na wat gerommel in de marge verschijnt de mededeling 'type H for
help' en de prompt' mon68k: '. De gebruiker kan nu commando's intoetsen.
Welke dat kunnen zijn staat in het volgende hoofdstuk.
1PMDS: mon68k.s
4
Commando's
Het programma kent een aantal commando's. Het zijn:
Commando
I
Betekenis / Naam
A
Alternate prompt
E
Enable interrupts voor niveau x
F
Find ram in system
G
Go: start programma op adres
H
Help functie
I
Initialize memory
L
Load motorola
S2
records
M
Modify memory.
P
Print geheugeninhoud in hexadecimale en ascii
notatie
R
Reset vectoren 0-5 en 7 naar in de
moni-tor gedefiniëerde interruptroutines: 6 wordt
ge-bruikt voor 'system-time'
r
Reset vectoren 0-7 naar in de monitor
gedefiniëerde interruptroutines
S
Stackpointer waarde
T
Trace functie
V
Vector definitie voor interrupt routines
X
Zoek
byte
X
in geheugen
De commando's en parameters dienen in hoofdletters achter de prompt
inge-toetst te worden. Wanneer een fout gemaakt wordt in het commando of
een van de parameters verschijnt de foutmelding
'?' achter de fout op het
scherm. De gegeven karakters worden genegeerd en de prompt verschijnt
weer. Het commando moet nu opnieuw in zijn geheel gegeven worden. Er is
geen herstelmogelijkheid van eenmaal gegeven commando's, niet anders dan
opzettelijk een fout veroorzaken in een van de parameters, zo het gegeven
commando deze heeft. Na het correct uitvoeren van een commando wordt
weer een prompt gegeven.
4.1 Alternate prompt
Het commando 'Alterna te prompt' geeft de gebruiker de keuze uit twee
prompts. De ene is ' mon68k: ', de andere de tijd die verlopen is na
de laatste reset van het systeem in uren, minuten en seconden. (formaat:
' hh:mm:ss
> ')
De laatste wijzigt dus steeds. Het is een aardigheidje dat
gebruikt kan worden om de duur van bepaalde routines meten.
2Voorwaarde
is dat interruptniveau 6 de interrupts van de 50Hz ticker afhandelt (Wat ook
inhoud dat een bepaalde jumper goed moet staan). Houdt in gedachten dat
de klok zelf ook iets van de 'gemeten' tijd gebruikt.
4.2 Enable interrupts
Na het intoetsen van de 'E' wordt het huidige interruptmaskeringsniveau
getoond, waarna het nieuwe niveau gegeven kan worden.
lnterruptmasker-ingsniveau x betekent dat alle interrupts op een niveau lager dan of gelijk
aan x gemaskeerd worden. Interrupts op niveau 7 kunnen niet gemaskeerd
worden: dit is de z.g. non rnaskabie interrupt. Bij opstarten is de waarde
gelijk aan 5: de klok is op interrupt niveau 6 aangesloten.
4.3 Findram
De routine 'Find ram' zoekt ram-geheugen in het systeem in de
adres-range $0-$1FFFFF. Van een gevonden gebied worden de eerste en de laatste
geheugenplaats afgedrukt. Soms kan het wezen dat deze routine ram
ont-dekt op plaatsten waar men dit niet zou verwachten. Dit is dan meestal te
danken aan een hardwarefout, waardoor ram geselecteerd wordt op plaatsen
waar dat niet zou moeten. Ook kan het voorkomen dat de routine in een
lus geraakt. De enige redding is dan nog de resetknop. De ramtest is niet
destructief voor de informatie, welke in het geheugen staat.
4.4 Go
Het commando Go start de executie van een routine door deze als subroutine
aan te roepen. Daartoe wordt eerst het adres gevraagd waarop de uitvoering
moet beginnen. Is het ingegevene correct dan wordt een
CRLF verzonden
ten teken dan de executie begonnen is. Wanneer het programma afgesloten
wordt met de instructie RTS ($4E75) komt men na executie van de routine
automatisch weer terug in de monitor. Loopt een programma echt 'vast'
dan helpt alleen de resetknop.
2Bijv.: hoe lang duurt een memory printout etc.
4.5 Help
Het Helpcommando geeft een lijstje van de commando's die gekend worden.
Intcesten van de eerste letter van het commando activeert deze. Het
com-mando vraagt daarna zelf wel om de waarden van benodigde parameters (als
die er zijn).
4.6 Initialize memory
De routine welke het geheugen kan initialiseren met een een bepaalde waarde
start met de vraag op welk adres moet worden begonnen. Daarna dient het
laatste adres gegeven te worden en het byte data dat weggeschreven moet
worden. Alle geheugenplaatsen worden nu met het byte als data beschreven.
Wanneer dit commando los gelaten wordt op het geheugengebied $0-$500
worden vectoren, stack en andere door het programma gebruikte data
over-schreven.
4. 7
Load 82 records
Dit commando geeft de mogelijkheid een programma of data 'down te loaden'
(om maar eens een goede Nederlandse uitdrukking te gebruiken) in het
geheugen van het systeem. De te laden data dient het volgende formaat
te hebben:
data-record format: S2bcaaaaaaddddddddcc<crlf>
end-of-file-record: S9bcaaaaaacc<crlf>
S2/S9
bc
aaaaaa
dd
cc
<crlf>
he ader
bytecount
address
data
(address inclusive
I
(6
hex)
(2 hex)
2
hex)
checksurn over bytecount, data and address
ascii carriage return, linefeed sequence
Voor 'per ongeluk' activeren van het commando wordt de argeloze gebruiker
hulp geboden: Een 89-record, dat het laden zonder gevaar afsluit wordt
direct na aanroep van het commando getoond. Het laden van data stopt
wanneer een fout in een record ontdekt wordt, dit record wordt dan niet
verder verwerkt. Het programma wacht daarna op een record va.n het juiste
formaat om nieuwe data te laden danwel het laden te beeindigen. Wanneer
het adres uit het S9-record niet gelijk is aan 0 wordt het geladen programma
direct gestart op dit adres. Tydens het laden wordt geen
'?'
verzonden bij
een foutdetectie. Alle ontvangen karakters worden ge-echo'd.
4.8
Modify
Het Modifycommando handelt als volgt: Na aanroep wordt een adres van
een geheugenplaats gevraagd, daarna wordt de gevraagde geheugenplaats
afgedrukt met daarachter de waarde, welke gelezen is uit die geheugenplaats
(in HEX formaat). De lengte van de data is afhankelijk van de gegeven
adreswaarde: bij een even waarde is dit 2 bytes, een oneven adreswaarde 1
byte. Achter de afgedrukte waarde heeft de gebruiker nu de mogelijkheid
nieuwe data of een commando in te voeren.
4.8.1 Data
Data dient het formaat van een byte, een word of een longword te hebben,
afhankelijk van de datalengte, welke weer afhankelijk is van de huidige
adreswaarde. Is de data correct dan wordt deze naar de geheugenplaats
geschreven. Vervolgens wordt dezelfde geheugenplaats weer gelezen, om
te controleren of de inhoud overeenkomt met de opgegeven data. Is dit
het geval, dan wordt een spatie geschreven en op het volgende commando
gewacht. Komen gelezen en geschreven data niet overeen, dan wordt achter
de gegeven data een
'?'
geschreven waarna op een volgende regel het adres
van de geheugenplaats en de gelezen data getoond worden.
4.8.2
Commando's
De volgende commando's worden binnen Modify herkend:
Commando
I
Betekenis
"
gebruik de ascii waarde van het volgende karakter als
data, van deze data is het msb gelijk aan 1
gebruik de ascii waarde van het volgende karakter als
data, van deze data is het msb gelijk aan 0
lees volgende geheugenplaats
lees vorige geheugenplaats
lees deze geheugenplaats nogmaals
B
zet datalengte op byteformaat, lees deze
geheugen-plaats nogmaals
G
start een programma
L
zet datalengte op longwordformaat als het huidige
adres even is en lees deze geheugenplaats nogmaals
W
zet datalengte op wordformaat als het huidige adres
even is en lees deze geheugenplaats nogmaals
spatie
adres lees geheugeninhoud van adres
CR
verlaat modify commando
De commando's ' en " zijn alleen geldig bij een datalengte gelijk aan 'byte'.
4.9 Print
Het printcommando vraagt een start en een stopadres. De inhoud van de
geheugenadressen wordt in een tabel getoond: een kolom met een
adres-waarde, daarnaast de inhoud van een aantal adressen (in byte formaat),
waarachter de inhoud van dezelfde adressen, maar nu als ascii-karakter
afge-drukt, als de data een afdrukbaar karakter oplevert. Het commando kan
afgebroken worden door control-C. Control- W stopt alleen de uitvoer. Een
andere toetsaanslag laat deze weer verder gaan.
4.10 Reset vectoren 0-5 en
'T
De 68000 processor heeft acht interruptniveau's waarop interrupts kunnen
binnenkomen. Niveau 6 wordt nu door de klok gebruikt. De andere
inter-ruptvectoren worden door de deze routine geïnitialiseerd met een vector naar
een routine, welke een boodschap afdrukt met het interruptniveau van de
ontvangen interrupt. Tevens worden, als een neveneffect, alle vectoren welke
voor het afhandelen van adres-errors e.d. gebruikt worden ook opnieuw van
hun waarde voorzien. Op deze manier is het mogelijk 'per ongeluk
over-schrijven' van deze vectoren te herstellen als dit nog niet tot een crash heeft
geleid.
4.11
reset vectoren 0-7
Alle interruptvectoren worden door de deze routine geïnitialiseerd met een
vector naar een routine, welke een boodschap afdrukt met het
interrupt-niveau van de ontvangen interrupt. Tevens worden, als een neveneffect, alle
vectoren welke voor het afhandelen van adres-errors e.d. gebruikt worden
ook opnieuw van hun waarde voorzien. Op deze manier is het mogelijk 'per
ongeluk overschrijven' van deze vectoren te herstellen als dit nog niet tot
een crash heeft geleid.
4.12
Stackpointer waarde
De huidige waarde van de stackpointer wordt afgedrukt. Dit kan handig zijn
als men wil controleren of een geschreven routine de stack wel in goede orde
achter laat. (De waarde moet dan voor en na de routineaanroep hetzelfde
zijn.)
4.13
Trace functie
Met de tracefunctie kan een programma instructie voor instructie
door-lopen worden. Men kan per instructiesimulatie alle registers van de
pro-cessor bekijken en wijzigen. Wanneer een instructie uitgevoerd is wordt ook
aangegeven wat de eerstvolgende operatiecode zal zijn die uitgevoerd zal
worden. Dit maakt het mogelijk programma's op hun code te traceren,
zon-der dat direct voor iezon-dere veranzon-dering een nieuwe assemblerlisting gemaakt
hoeft te worden. Wanneer het commando trace gegeven wordt verschijnt:
'Trace function, type 'H' for help', met daarna de prompt' trace
> '.
Achter
de laatste kunnen de commando's uit de volgende tabel gegeven worden:
COMMANDO BETEKENIS
AO
Verander inhoud van adresregister AO
Al
Verander inhoud van adresregister Al
A2
Verander inhoud van adresregister A2
A3
Verander inhoud van adresregister A3
A4
Verander inhoud van adresregister A4
A5
Verander inhoud van adresregister A5
A6
Verander inhoud van adresregister A6
A7
Verander inhoud van adresregister A7
DO
Verander inhoud van dataregister DO
Dl
Verander inhoud van dataregister Dl
D2
Verander inhoud van dataregister D2
D3
Verander inhoud van dataregister D3
D4
Verander inhoud van dataregister D4
D5
Verander inhoud van dataregister D5
D6
Verander inhoud van dataregister D6
D7
Verander inhoud van dataregister D7
SP
Verander inhoud van de stackpoiner
SR
Verander inhoud van het statusregister
cc
Verander inhoud van het conditioncoderegister
PC
Verander inhoud van de programcounter
US
Verander inhoud van de userstackpointer
G
Go: voer de intructie waar de PC naar wijst uit
H
Help: geef een lijstje met beschikbare tracecommando's
M
Modifycommando aanroep
R
Display alle registers
Volgende PC waarde (geeft alleen even adressen)
'
Vorige PC waarde (geeft alleen even adressen)
CR
verlaat tracecommando
Wanneer binnen de tracefunctie een instructie uitgevoerd moet worden dient
de processor in suprvisor mode te staan, anders volgt er een foutmelding,
waarna de monitor opnieuw opstart.
4.14
Vector definitie
In de Vectordefinitieroutine kan de gebruiker vectoren naar eigen
interrupt-routines definiëren. Deze dienen vooralsnog afgesloten de worden met de
instructie RTS($4E75) om correct te werken. Wanneer interruptniveau 6
gebruikt moet worden wordt apart de vraag gesteld of men zeker is van zijn
zaak, daar op deze interrupt 50 keer per seconde een interrupt komt van de
systeemklok. Is men dit niet, dan wordt interruptniveau 6 voor systeemtijd
geïnitialiseerd en het interruptmaskeerniveau op 5 gezet wanneer dit een
grotere waarde dan 5 had.
4.15
Zoek de onbekende: X
De grote onbekende laat zich vinden met dit commando (hopelijk). Er
worden een begin en eindadres en een bytewaarde gevraagd. Alle
geheugen-plaatsen tussen begin en eind (grenzen inclusief) waar het byte als data
gevonden wordt, worden afgedrukt. De routine is gebruikt om uit te vinden
waar de 'gaten' in de selectiehardware zaten: sommige plekken waar volgens
de adresmap geen geheugen zou mogen zitten hadden dat in de praktijk daar
wél. Wanneer je dan eerst het geheugen initialiseert met een bekende waarde
en vervolgens op zo'n rare plek een byte verandert, dan kun je dit
veran-derde byte nu ook weer vinden op de plek waar die werkelijk thuishoort.
Ook dubbele verwijzingen van de MMU zijn op deze manier te vinden.
5
Systeemfoutenafhandeling
Een aantal fouten die in het systeem op kunnen treden worden door de
monitor met een foutboodschap gemeld. De monitor komt daarna weer met
de prompt ' mon68k: '. Deze functies zijn toegevoegd om te voorkomen dat
het systeem in de 'halt-mode' terecht komt: de processor doet dan helemaal
niets meer en daar wordt je als gebruiker ook niet wijzer van.
5.1 adres_error at or near
$adres
Wanneer een adresfout ontdekt wordt, verschijnt de boodschap
'address-error at or near $adres' op het scherm. De getoonde adreswaarde is het
adres waar de fout gevonden is. Omstandigheden waaronder deze op kan
treden zijn o.a.: starten van een programma op een oneven adres; een
sub-routineaanroep op het moment dat de stack oneven is; een 'word of
longword
adressering op een oneven adres.
5.2 bus_error/memory_privilege ... error at or near
$adres
De gehele titel luidt: 'bus_error/memory __ privilege_violation _error at or near
address $adres'. Hij wordt gegenereerd onder de omstandigheden die de
foutmelding aangeeft: indien een busfout of privilegefout ontdekt wordt. De
adreswaarde is het adres waar de fout ontdekt is. De busfout komt binnen
de labbushardware niet voor: alle timing van de componenten gebeurt 'op
tijd'. Vandaar dat de ontwerpers van de hardware deze interrupt 'over'
had-den. Ze hebben hem gebruikt om privilegefouten aan te geven. Voor meer
informatie zie het manual van de CPU /MMU kaart. Wanneer binnen het
tracecommando het gocommando gebruikt wordt en het statusregister niet
in supervisermode staat wordt deze foutmelding gegeven. Onder normale
omstandigheden mag deze fout niet optreden.
5.3
instruction_privilege_ violation_error at or
$adres
Deze fout verschijnt als men oner user-mode een instructie wenst uit te
voe-ren welke alleen onder supervisor-mode uitgevoerd mag wovoe-ren. Aangezien
de monitor continu in superviser mode staat zal dit onder normale
om-standigheden niet voorkomen.
5.4 illegaljnstruction_error at or near $ adres
Wanneer een niet gekende instructie wordt gevonden verschijnt deze melding
op het beeld. Verbeter de fout en probeer het opnieuw zou ik zo zeggen.
6
Praktijkervaringen
Het is natuurlijk niet te verwachten dan de maker over zijn produkt een
objectief oordeel zal geven dus de lezer is gewaarschuwd! Ik heb de
mo-nitor bij een applikatie (de eerste met een 68000!, jawel) toegepast. Het
volgende vond ik handig: Omdat de monitor standaard messages afdrukt
bij ontvangst van een interrupt kun je makkelijk ontdekken of een interrupt
aankomt en of een bron op de juiste interrupt aangesloten is (commando's
Een r). Ook aparte hardware is makkelijk te testen.
Daar staat tegenover dat deze epu-kaart niet met de PMDS-debugger bedr0ven
kan worden. Dit houdt in de praktijk in dat de te testen routines naast de
monitor in de prom geplaatst moeten worden om daarna onder controle van
de monitor de werking van de routines te kunnen testen. Dit gaat nog als
de routines niet al te groot zijn. Daarna moeten stukken monitor ingeruild
worden tegen applikatieruimte. Komt men nu in de problemen dan is een
logic-analyzer een onmisbaar hulpmiddel. Het is al met al een lange weg:
even vlot iets veranderen is er niet bij.
7
Literatuur
Het volgende boek is erg handig bij het programmeren in 68000 assembler:
'SC 68000 MICROPROCESSOR USERS MANUAL', fourth edition,
uit-gegeven door de firma PHILIPS,
met twaalfcijferig codenummer: 9499 060 22911.
tinas de routine echonan schoont > "· van het mogelijkheid ie:
.define rx8hx, rx8hx, rx4hx, eot, txatr, txep, error, pcrlf, prtime .define crlf, txnwl, tx2hx
I
teatmonitor voor 68000 applikatie• eer a te versie.
copyright IPD 1986 auteur : J.Tiesinga mon68k_old:
Binnen de monitor worden de registers dO,d1,aO,a1 en a7 gebruikt voor het doorgeven van data van en naar de verschillende routinee. De data wordt etaede doorgegeven in de volgende registers:
dO karakt ere ; d1 div.; aO pointer naar a1 pointer naar a7 syateematack een string een uit te (= ap) van karakters;
lezen I te beschrijven geheugenplaats;
De gabruiker dient ervoor te zorgen dat bij gabruik van de rou-juiste data bij aanroep van de routines in de regietera staat. Zie de betreffende routinas voor nadere specificatie.
6,12 november 1986. mon68k:
binnen de monitor wordan alle gegevene via de etack doorgegeven. Het meehenieme ia ale volgt:
Invoer : de aanroepende routine dient op etack ruimte te creeeren waar de data geplaatst kan worden. De aanroepanda heeft de verantwoordelijkheid de etack ook weer te voordat daze definitief varlaten wordt.
Uitvoer: De data wordt op de atack gezet, waarna de uitvoerende routine aangaroepan wordt. De aanroepende routine de stack.
18 november 1986.
De monitor heeft twee prompts: 'mon68k: ' en "'eyateem_up_time' De laatste maakt gebruik van interrupt level 6. Bij opatarten systeem wordt de aarsta prompt gebruikt. De gabruiker heeft de middels een commando (A) van prompt te veranderen.
2 decamber 1986.
m1111ory map : nparviur mode: UIU mode:
$000000- $1f:ff:ff ev mappad ram uaar mappad ram
$200000-$3fffff futura axt. r1111 future axt. ram
$400000-$6fffff w: MNU fault
$600000-$7fffff w: future axt. IIDIIU fault
$800000-$gfffff (future axt ram) fault
$aOOOOO-$bfffff FFP 32081 fault
$cOOOOO-$c007ff VMA fault
$c00800-$c00fff VPA fault
$c01000-$dfffff do not uaall fault
OOFFEOOO 00000400 OOCOOA09 OOCOOA09 OOCOOAOB 00000003 00000002 00000020 00000040 00000010 00000001 00000001 00000040 00000001 00000000 00000001 00000003 00000004 OOOOOOOA OOOOOOOD 00000017 00000020 00000022 00000027 0000002C 0000002E 00000032 00000038 0000003A 00000030 00000042 00000043 00000045 00000047 0000004C 00000060 00000052 00000063 00000067 00000069 OOOOODOA
r: raad, w: write, av: auperviser mode, uaer: uaer mode
aantal algemene equatee: r - = OxffeOOO
ram = Ox000400
I
rom base addren ram ban addreaa acia = Oxc00a09 I I acia : type 6860
'
aciac aciad I acia acia + 2 aciar = 0x03 tdra= Ob00000010
ovrn Ob00100000 pa=
Ob01000000 fa Ob00010000 rdrf=
Ob00000001 ckc Ob00000001 rteb=
Ob01000000 tdre_bitno 1 rdrf_bitno=
0 I general equates: I as ei i: I cntrlc eot lf er cntrlw epch dquote aquote c -period two eight 3 4 Oxa "" Oxd Ox17 Ox20 Ox22= Ox27
Ox2c Ox2e Ox32 Ox38 emcolon= Ox3a equate Ox3d chrb=
Ox42 chrc Ox43 chre Ox46 chrg Ox47 chrl Ox4c chrp Ox60 chrr Ox52 chra Ox63 chrw = Ox57 chry Ox69 crlf= OxOdOaI acia baae addraas
lacia reset command
ltranamit data ragiatar empty bit loverrun bit
lparity error bit !framing error bit
lreceive data register full bit
feloek div 16, 7bit data, even par, 2stopbita lrts bit
lvalue for booleans
Icontrol C (abort function) land of text 'char' llinefeed
lcarriaga return
Icontrol W (auapend output)
lapace 'char' lchar """ lchar lchar
...
• n.
lchar • • lchar "2" lchar "8" lchar •·• lchar "=" lchar "B" lchar•c•
lchar "E" lchar "G" I char "L" lchar "P" I char "R" lchar•s•
I char•w•
lchar "Y"00000400 00000404 00000408 0000040C 00000410 00000414 • 00000418 0000041C 00000420 00000424 00000428 00000420 00000430 00000434 00000438 0000043C 00000440 00000444 00000448 0000044A 0000044E 00000460 00000464 00000468 0000046C 00000480 00000464 00000468 0000046C 00000470 00000472 00000474 00000400 OOFFEOOO 00000400 OOFFE004 OOFFE008 OOFFE008 .18ct .bn .base rem
l 1oma •pace for regiater_contanta for trace_function
I aav_dO: Bav_dl: aav_d2: Bav_d3: nv_d4: nv_d6: nv_d6: Bav_d7: Bav_aO: aav_a1: Bav_a2: Bav_a3:
.apace 4 ltraca memory .apace 4 .apace 4 .Bpaca 4 .apace 4 .apace 4 .apace 4 .space 4 .space 4 .Bpace 4 .apace 4 .apace 4 . a pace 4 .apace 4 .Bpace 4 .apace 4 .apace 4 .Bpace 2 .apace 4 .apace 4 Bav_a4: aav_a6: aav_a6: aav_a7: aav_uep: aav_er aav_pc IIBV_Bp
aavar: .apace 2 !Bava atatue_regiater during trace mode
vect1: .Bpace 4 vect2: .apace 4 vact3: .Bpace 4 vect4: .apace 4 vect6: .apace 4 vect6: .apace 4 vect7: .Bpace 4
timarcnt: .apace 4 l counter for timerh: I prompt:
timerprompt: .apace 2 lboclean for prompt:
tcnt1: .apace 2 ! hulpcounter for time
Bavpc: .Bpace 4 laave pc_value for exeptionhandlera
68000 definitiona: av_atackpointer OX0400 I .aect . text .base rom ! vectoren: .data4 av_atackpointar . data4 pvrup I
! start van programma
I
pwrup
I
!initiale waarde
clear interrupt from timer:
OOFFE008 4~3DOOE00001 00001000 00400000 0040000~ 00400004 00400006 clr.b timer_dev.l initialiu BIIIU pagaize = 40D6 I ldo 10. lpagae of 4k bytes base of firat map register:
sv_base Ox400000 up_base Ox400002 udrbaae
=
Ox400004 udwbase=
Ox400006 I tauperviaar !uaer program luaer data raad luaer data writeOOFFEOOE ~07C00400000 mapnorm: move.l #sv_baaa,aO !aO points to map registers
OOFFE014 4~40 clr.w dO leetup to ~66 registers
OOFFE016 3080 OOFFE018 DlFCOOOOlOOO OOFFEOlE 6~00 OOFFE020 66F4 OOFFE0~2 610006BA OOFFE0~8 4~B8046C OOFFEO~A 4~380470 OOFFEO~E 61000DE6 OOFFE032 4E66FFFC
do _map: move. w dO, (ao)
add.l #pagaize,aO add.b #l,dO bne do_map
laat page number in register !point to next map register ladvance page number
!do all ~66 registers
all memory mappad to aupervieer.
initialize indirect and direct--interrupt-veetora
bar mrBBvq laat veetora
clr.l timerent !clear timer_counter
clr.b timerprompt !time not as prompt
bar intcp linitialize COBII!unication port
print 'type H for help'
link a6,#-4 lcreate soma room
OOFFE036 2D7COOFFF4CBFFFC \ OOFFE03E 61000CF8 OOFFE042 61000CE2 OOFFE046 4E6E OOFFE048 46FC2600 OOFFE04C 61000C28 OOFFEo6o 4E66FFFE OOFFE064 61000096 OOFFE068 10~EFFFF OOFFE06C 4E6E OOFFE06E ~o7CooFFE080 OOFFE064 4A10 move.l #mamhelp,-4(a6)
bar txatr !eend text
bar pcrlf unlk a6 init_ar:
notrace, auperviser mode interrupt level maak
= 6
(eyatam time enabled), all flaga claarad. init_ar: move.w #Ob0010010100000000,sr
re-enter point for commanda:
mrntr: bar prompt !print monitor prompt
link a6,#-2 !create room for eh ar
bar rxchr !get char
move.b -1(a6),do lget char in do unlk a6
move.l #cmtbl,aO lget base of command_table in aO
OOFFE066 6606 OOFFE068 61000006 OOFFE06C 60DE OOFFE06E 80280001 OOFFE072 6704 OOFFE074 6C88 OOFFE076 60EC mrntr1: mrntr2: bne mrntr1 bar arror bra mrntr cmp ob 1 (aO) , dO beq mrntr2 addol 16,a0 bra mrntrO moveol 2(aO).aO lne => no !print
'?'
I and try again ldid command match? leq => match : execute lnext pointer in tabla !try the othera ! gat addren of routine
routine
OOFFE078 20680002 OOFFE07C 4E90 OOFFE07E 60CC
jar (aO) lexacute routine, aftar rta back in monitor
• OOFFE080 OOFFE080 2041 OOFFE082 OOFFEODC OOFFE086 2046 OOFFE088 OOFFEOF6 OOFFE08C 2046 OOFFE08E OOFFE16E OOFFE092 2047 OOFFE094 OOFFE1FO OOFFE098 2048 OOFFE09A OOFFE226 OOFFE09E 2049 OOFFEOAO OOFFE23A OOFFEOA4 204C OOFFEOA6 OOFFE29E OOFFEOAA 204D OOFFEOAC OOFFE364 OOFFEOBO 2060 OOFFEOB2 OOFFE4F6 OOFFEOB6 2062 OOFFEOB8 OOFFE6CC OOFFEOBC 2072 ayatem time) OOFFEOBE OOFFE678 OOFFEOC2 2063 OOFFEOC4 OOFFE696 OOFFEOC8 2064 OOFFEOCA OOFFE6B2 OOFFEOCE 2066 OOFFEODO OOFFEADA OOFFEOD4 2068 OOFFEOD6 OOFFEBBC OOFFEODA 0000 bra mrntr cmtbl oaacii
.
,
..
odata4 malter oucii • E" odllta4 men a oucii • F" odata4 mfind oaacii• a••
odata4 mgo oa&cii• H"
odata4 mhelp oucii • l" odata4 minit oaacii • L" odata4 mlo ad oa&cii• N••
odata4 JIIIIOd oucii" P"
odata4 mprint o&scii • R" odata4 mresv oaacii • r" odata4 mresva oa&cii • S" odata4 matack oaacii " T" odata4 mtrace o aacii• v•
odata4 mvect oaacii nx••
odata4 mx odata2 0 oalign 2 I I mal ter: toggle prompt!gat other command
I command table
lalter prompt
lenable interrupt• for level x lfind ram in the ayatam
I 'go' : a tart at uaer defined
I help routine
linit memory with a pattarn lload a program
lmodify memory
!print memory contenta lreaet veetora for normal u se Iraset all veetors for monitor
!stackpointer value ltrace function
laat veetora for uaer routines lfind pattarn x in sy1tem land of tabla marker
OOFFEODC 4E66FFFC malter: link a6,t-4
OOFFEOEO 2D7COOFFF213FFFC \ OOFFEOEB 61000C4E OOFFEOEC 4E6E OOFFEOEE OA3800010470 OOFFEOF4 4E76 moveol lmaalter,-4(a6) bar txatr unlk at!
eorob 11,timerprompt ltoggle bit rts
place
OOFFEOF6 48E78080 OOFFEOFA 4E66FFFC
mana:
enable interrupts at level x in : none
out: none u1ee: dO,aO,ar,a7
calla: txchr,cx1hx,txstr,rx1hx
mena: movem.l d0/a0,-(a7) !save
link a6,1-4 lget
regietera aome spaca OOFFEOFE 2D7COOFFF223FFFC \ OOFFE106 61000C30 OOFFE10A 40CO OOFFE10C E048 OOFFE10E 02000007 OOFFE112 1D40FFFF OOFFE116 61000010 OOFFE11A 61000CE6 OOFFE11E 2D7COOFFF249FFFC \ menaO: menal:
move.l lmeena,-4(a6)laet up pointer
bar txatr !aend string
mova.w ar,dO !gat current level
lsr.w IB,dO
and.b 17,d0 !maak out interrupt
move.b d0,-1(a6) !
bar cxlhx lconvert to aacii
bar txchr laend level
move.l lmaena1,-4(a6) la1k new level
bar txatr I bar rxlhx bcc manal bar error bra mena2 cmp.b 17,-1(a6) bhi menaO move.b -1(a6),d0 lal. w 18, dO move. w ar, -2 (a6)
!gat anawer tea => error I leave
!check upper bound lhi => error I get value in dO
I
and.w 10xf0ff,-2(a6)1remove old level
or. w dO, -2 (a6) I calculate new ar
level OOFFE126 61000C10 OOFFE12A 61000DEO OOFFE12E 11406 OOFFE130 111000C3E OOFFE134 11020 OOFFE136 OC2E0007FFFF OOFFE13C 62F2 OOFFE13E 102EFFFF OOFFE142 E148 OOFFE144 40EEFFFE OOFFE148 026EFOFFFFFE OOFFE14E 816EFFFE OOFFE162 46EEFFFE OOFFE166 4E6E OOFFE168 4CDF0101 OOFFE16C 4E76
move.w -2(a6),ar lput it in it'• place
001FFFFF
mena2:
mfind: unlk a6
movem.l (a7)+,d0/a0 Irastore regieters rta
find ram in area $0-$1fffff
ramend
=
Ox'.fffff'
OOFFE16E 48E7C080 mfind: movem.l d0-d1/a0,-(a7) !save registers
link a6,1-4 OOFFE162 4E66FFFC OOFFE166 2D7COOFFF263FFFC \ OOFFE16E 61000BC8 OOFFE172 207COOOOOOOO OOFFE178 B1FC001FFFFF OOFFE17E 62000068 OOFFE182 1210 OOFFE184 4601 OOFFE186 4610 OOFFE188 B218 OOFFE18A 66EC OOFFE18C 41101 OOFFE18E 1141FFFF
move.l lmafind,-4(a6) laat up pointer bar txatr move.l IO,aO mfind1: cmp.l tramend,aO bhi mfind6 move.b (aO),d1 not. b dl not.b (aO) cmp.b (aO)+,dl bne mfindl not.b d1 move. b dl, -l(aO) ! start at bottom !all done? !eq => leave I get content a !na => no ram
OOFFE1D2 B228FFFF OOFFE1D6 68C6 OOFFE11J8 6388 cmp.b -1(a0) ,dl bne mfind begin found aub.l 1!1,a0
!na => reatora failed
!adjuat pointer value OOFFE11JA 2D7COOFFF27AFFFC \ OOFFE1A2 61000894 OOFFE1A6 2D48FFFC OOFFE1AA 61000CE4 OOFFEUE 6288 mova.l l!mefb,-4(a6) bar txstr move.l a0,-4(a8) bar tx8hx add.l U,ao !~end valua tnext byte pleasa OOFFE1BO 2D7COOFFF289FFFC \ OOFFE1B8 61000B7E OOFFE1BC B1FC00200000 OOFFE1C2 6224 OOFFE1C4 1210 OOFFE1C6 4801 OOFFE1C8 4810 OOFFElCA B218 OOFFElCC 880C OOFFE1CE 4801 OOFFE1DO 4828FFFF OOFFE1D4 B228FFFF OOFFE1D8 67E2 OOFFE1DA 6688 OOFFE1DC 2D48FFFC OOFFE1EO 61000CAE OOFFE1E4 6288 OOFFE1E6 8090 OOFFE1E8 4E6E OOFFE1EA 4CDF0103 OOFFE1EE 4E76 mova.l l!mafa,-4(a6) bar txstr find end mfind2: cmp.l l!ramand+l,aO bhi mfind6 move. b (aO) ,dl not.b dl not.b (aO) cmp.b (aO)+,dl bne mfind3 not.b dl not.b -1(a0) cmp.b -1(aO) ,dl beq mfind2 end found
mfind3: aub.l 1!2,a0 move.l a0,-4(a8) bar tx8hx add.l 1!1,a0 bra mfindl mfind6: unlk a8 ldone? leq => y88
tne c> end found lrBitore data
lt81t if fail
ladjust end pointer lnnd value !try the othera
movem..l (a7)+,d0-d1/a0 Irastore registers rta
~~~go:
f
aak the user for an addreas, if he (or aha) entars ons, jump to that location. in : none
out: none uaea: dO,aO,a7 calle: rx8hx
OOFFE1FO 48E70080 mgo: movem.l aO, -(a7)
link a6,11-4 leava registers OOFFE1F4 4E68FFFC OOFFE1F8 2D7COOFFF26FFFFC \ OOFFE200 61000838 OOFFE204 61000BBE OOFFE208 61000D74 move.l tmego,-4(a6) bar txatr bar t:xmaatad bar rx8hx
lcreate room for pointer data !put pointer on stack !print string
!eend 'enter atartaddreaa' !gat atartaddrass on atack
OOFFE20C 6406 OOFFE20E 61000860 OOFFE212 600A OOFFE214 206EFFFC OOFFE218 6100080C OOFFE21C 4Ego OOFFE21E 4E6E OOFFE220 4CDF0100 OOFFE224 4E76 mgo2: mgo1: mhelp: bcc mgo2 bar error bra mgo1 move.l -4(a6),a0 bar pcrlf j ar (aO) unlk a6 movam.l (a7)+,a0 rta in: none out:none uaea: none calla: txatr
OOFFE226 4E56FFFC mhelp: link a6,#-4
OOFFE22A 2D7COOFFF2g7FFFC \ OOFFE232 61000804 OOFFE236 4E6E OOFFE238 4E76 move.l #mahalp,-4(a6) bar txatr unlk a6 rta minit: initialize mamory in : none out: none ueea: dO,d1,aO,ar,a7 calla: rx6hx,rx2hx,txatr
Ion error return
!print '?' land leava lget addraea in aO !print crlf u ackn. lexacute routine I
minit: movem.l d0-d1/a0,-(a7) leave regietera OOFFE2SA 48E7C080
OOFFE2SE 4E66FFFC link a6,#-4 lcreate room tor pointer
OOFFE242 2D7COOFFFSE6FFFC \
move.l #mein1,-4(a6) !put pointer on etack
OOFFE24A 61000AEC bar txetr lnnd string
OOFFE24E 61000874 bsr txmaatad I
OOFFE262 61000D2A bar rx6hx !gat etartaddreea
OOFFE266 6406 bcc minit2 I ca => arro·
OOFFE258 61000B16 minitO: bar error !print
'?'
OOFFE26C 6038 bra minit1 land leave
OOFFE26E 2F2EFFFC minit2: move.l -4(a6),-(a7) la ave atartadrr.
OOFFE262 61000AC2 bsr pcrlf
OOFFE266 61000870 bar txmaenad
OOFFE26A 61000D12 bar rx6hx I get end addreaa
OOFFE26E 66E8 bca minitO les => error
OOFFE270 2F2EFFFC move.l -4(a6),-(a7) laave aecond addreaa on
OOFFE274 2D7COOFFFSFSFFFC \
move.l lmainS,-4(a6) !pointer to data text
OOFFE27C 61000ABA bar txstr laend text
OOFFE280 61ooocg2 bar rx2hx !gat anawar
OOFFE284 66D2 bce minitO !ca => wrong anawer
OOFFE286 102EFFFF move.b -1(a6),d0 !gat answer in dO
OOFFE28A 221F move.l (a7)+,d1 lget endaddress
OOFFE28C 206F move.l (a7)+,a0 lget startaddrass
OOFFE28E 1080 OOFFE290 8288 OOFFE292 6288 OOFFE294 86F8 OOFFE298 4E6E OOFFE298 4CDF0103 OOFFE29C 4E76 OOFFE29E 48E7E080 OOFFE2A2 4E66FFFC
lllinit4: move.b dO,(aO) cmp.l aO,d1 add.l 11,a0 bne lllinit4 mini t1 : unlk a6 I in i t ram !end reached! I next m1111ory location lne => continue movem.l (a7)+,d0-d1/a0 Irastore regi•tera rta
mload:
load s2 records
data_record format: S2bcaaaaaaddddddddcc<crlf> end_of_file_racord: S8bcaaaaaacc<crlf>
S2/S8 headar
bc bytacount (addraas incluaiva/ 2 hex)
aaaaaa addreaa (6 hex)
cc checkaum over bytacount, data and addraas
if addreaa in and_of_fila_record ia unequal to 0 tha routine will autostart at the given addrees
mload: movem.l d0-d2/a0,-(a7) link a6,1-4
!save registers lget aome room on •tack OOFFE2A6 2D7COOFFF416FFFC \ OOFFE2AE 81000A88 OOFFE282 81000838 OOFFE286 OC2E0063FFFF OOFFE2BC 66F4 OOFFE2BE 81000B2C OOFFE2C2 OC2E0032FFFF OOFFE2C8 8726 OOFFE2CA OC2E0038FFFF OOFFE2DO 66E4 OOFFE2D2 OOFFE2D2 614C OOFFE2D4 6612 OOFFE2D6 8122 OOFFE2D8 660E OOFFE2DA 61000B10 OOFFE2DE B1FCOOOOOOOO OOFFE2E4 6702 OOFFE2E6 4E90 in monitor OOFFE2E8 4E6E OOFFE2EA 4CDF0107 OOFFE2EE 4E76 OOFFE2FO 612E OOFFE2F2 86F4 OOFFE2F4 6104 OOFFE2F6 66FO OOFFE2F8 6088 OOFFE2FA 61000C18 OOFFE2FE 6641
move.l lmaload,-4(a6) !eend text bar txstr mlod1: bar rxchr mlod2: cmp.b lchra,-1(a6) bne mlod1 mlodaB bar rxchr cmp.b ltwo,-1(a6) beq mloda2 cmp.b leight,-1(a6) bne mlod2 bar load21 bes load33 bar load11 bes load33 bar rxchr cmp.l IO,aO beq load33 jar (aO) !gat char lis it an 'S'! !no => wait for it I gat aecond eh ar lis it an '2'! !eq => load S2-record
!ia it an '8'!
!no => wait for right aequence
I get run address
!es => error
I
abort load!es => checksum error
!receive l echo
·z
for lildos file tranaport!eq => no auto_execute
lexacute routine, aftar 'rta' back
load33:unlk a6 !(do not change a7)
movam.l (a7)+,d0-d2/a0 Irastore registers
rta mloda2:bar load21 bes load33 bar load11 bes load33 bra mlod1 load11:bsr rx2hx bes load31 !gat data !ca => not hax
OOFFE304 102EFFFF OOFFE308 6301 OOFFE30A 670A OOFFE30C 1080 OOFFE30E 8010 OOFFE310 6638 OOFFE312 6288 OOFFE314 60E4 OOFFE316 6202 OOFFE318 6630 OOFFE31A 023COOFE OOFFE31E 4E76 OOFFE320 61000BF2 OOFFE324 6624 OOFFE326 122EFFFF OOFFE32A 1401 OOFFE32C 6701 OOFFE32E 61000C4E OOFFE332 6616 OOFFE334 D42EFFFF OOFFE338 D42EFFFE OOFFE33C D42EFFFD OOFFE340 206EFFFC OOFFE344 023COOFE niet!) move.b -1(a6),d0 eub.b 11,d1 beq load16 move. b dO, (aO) c:mp. b (aO), dO bne load31 add.l tl,ao bra load11 load16:add.b 11,d2 bne load31 and IOxfe, eer rta load21:bar rx2hx bca load31 move.b -1(a6),d1 move.b d1,d2 aub.b 13,d1 bar rx6hx bca load31 add.b -1(a6) ,d2 add.b -2(a6),d2 add.b -3(a6),d2 move.l ~4(a6),a0 ud IOxf •, eer !gat data Ideerement bytecount leq => done l1tore data ldid data store? !na = no => leava I next addreaa
!na => wrong check1um I clear carry
!gat numbar of bytes to receive !ca => not hax
I gat value in d1 lchackaum in d2
lnumber of bytes in record I gat addren
I ca => not hex
ladjuat chackaum
!in aO : pointer to addreaa
lelaar carry (move -> ax doet dit
OOFFE348 4E76 rta
OOFFE34A 61000!24 OOFFE34E 003C0001 OOFFE362 4E76 OOFFE364 OOFFE364 48E7COCO OOFFE368 4E66FFFC error : exit load31: bar error
~d:
or 11,ccr laat carry rta
110dify routine
anablaa uaar to change the contante of a memory location
in : none out: none
uaaa: dO,d1,aO,a1,ar,a7 (het hela zootje)
calla: rx6hx,rx4hx,rx2hx,rx1hx,tx6hx,tx4hx,tx2hx,txap,rxchr,txatr,pcrlf
aaod
=
movam.l d0-d1/a0-a1,-(a7) !save regietera
link a6,1-4 lcraate room
OOFFE36C 2D7COOFFF44AFFFC \
mova.l lmamod,-4(a6) linit pointer
OOFFE364 61000902 bsr txatr !print taxt
OOFFE368 61000C14 ~0: bar rx6hx !gat atartaddraaa
OOFFE36C 66000178 bel Dlllod8 !ca => error : exit
OOFFE370 226EFFFC mova.l -4(a6),a1 lal : pointer to memory
OOFFE374 2D49FFFC ~Oa: move.l a1,-4(a6) I
OOFFE378 7201 move.l 11,d1 Jinerament for naxt addreaa
OOFFE37A 082EOOOOFFFF btat I0,-1(a6) !tast if memory addraaa ia odd or
even
OOFFE380 6602 bna 111111odl lne => odd : in eremant ia
OOFFE384 D3C1 OOFFE386 D3C1 OOFFE388 61000DDC OOFFE38C 2D49FFFC OOFFE3DO 61000AFE OOFFE394 610009C8 OOFFE398 OC8100000001 OOFFE39E 671C OOFFE3AO OC8100000002 OOFFE3A6 670A • OOFFE3A8 2D61FFFC OOFFE3AC 61000806 OOFFE3BO 6012 OOFFE3B2 3D61FFFE OOFFE3B6 61000AB4 OOFFE3BA 6008 OOFFE3BC 1D61FFFF OOFFE3CO 61000A7A OOFFE3C4 610001198 OOFFE3C8 61000A22 OOFFE3CC 102EFFFF OOFFE3DO OCOOOOOD OOFFE3D4 67000114 OOFFE3D8 OC00002E OOFFE3DC 67 A8 OOFFE3DE OC00002C OOFFE3E2 6604 OOFFE3E4 93C1 OOFFE3E6 609C OOFFE3E8 OC00003D OOFFE3EC 6796 OOFFE3EE OC000020 OOFFE3F2 6700FF74 OOFFE3F6 OC8100000001 OOFFE3FC 6622 OOFFE3FE OC000022 OOFFE402 660E OOFFE404 610009E6 OOFFE408 002E0080FFFF OOFFE40E 6000007C OOFFE412 OC000027 OOFFE416 6608 OOFFE418 610009D2 OOFFE41C 6000006E OOFFE420 OC000047 OOFFE424 6608 OOFFE426 6100FDC8 OOFFE42A 6000FF68
mmod1: eub.l d1,a1
mmod2: add.l d1,a1
bar pcrlf
move .1 a1, -4 (a6)
bar tx6hx bar txap cmp.l 11,d1 beq mmod2b cmp.l 12,d1 beq Dlllod2a Idaeramant addreaa finerement addreaa !print crl:f
!gat addraas at -4(a6) I print addreu fund spaca I of:faet ia 1? leq => print it
! of:faet is 21
!eq => print data
gat me111ory contente I offset ia 4
move.l (a1),-4(a6) bar tx8hx
bra Dlllod3
!gat memory contente fund it
gat me111ory contente I offset is 2
mmod2a: move.w (a1),-2(a6) bar tx4hx
bra Jlllllod3
!gat memory content• laand it
gat mamory contant& I offset ia 1
mmod2b: move.b (a1),-1(a6) bar tx2hx
mmod3: bar txap
bar rxchr move.b -1(a6),d0 cmp. b Ier, dO baq Dlllod9 cmp.b lperiod,dO baq Dlllod2 cmp. b lcoDII!a, dO bne mmod4 IUb.l d1,a1 bra Dlllodl Jlllllod4: cmp.b lequate,dO beq Dlllodl cmp. b ,.pch, dO baq 1111110dO
!gat memory contant• !print it
fund •pace
lwait for cammand or data !gat char in dO I end of coDII!and 1 laq => quit lnaxt location1 I !previoua location1 I Idaeramant addreaa land open thia location lopen same location again1 lopen anothar location? !enter new addreaa • and ' CODIIIand only valid for byte_acceaa
cmp.l U,dl bna Dlllod6a cmp.b ldquota,dO bne Dlllod6 bar rxchr or.b 10x80,-1(a6) bra Dlllod7a mmod6: cmp.b laquote,dO bne Dlllod6a bar rxchr bra Jlllllod7a mmod6a: cmp.b lchrg,dO bna DDilod6c bar mgo bra 111111od1 lofaaet =1 1 I byta_acceaa1 lne => no
lanter ascii valua? lget char
Int msb
!save data
!enter ascii valua? !gat char
!save data I 'go' co!IIIIIAnd? faxacute coDIIIand. land return
OOFFE42E OC000057 OOFFE432 8700FF40 OOFFE436 OC000042 OOFFE431 6606 OOFFE43C 7201 OOFFE43E 6000FF44 OOFFE442 OC00004C OOFFE446 6614 OOFFE448 2D49FFFC OOFFE44C 082EOOOOFFFF OOFFE452 6600FF30 OOFFE466 7204 OOFFE468 8000FF2A OOFFE46C 1D40FFFF. OOFFE460 61000A78 OOFFE464 6408 OOFFE466 61000908 OOFFE461 6000FF18 OOFFE46E 102EFFFF OOFFE472 E908 OOFFE474 810001116 OOFFE478 66EC OOFFE47A 022EOOOFFFFF OOFFE480 812EFFFF OOFFE484 OC8100000001 OOFFE481 6610 OOFFE48C 12AEFFFF OOFFE490 102EFFFF OOFFE494 8011 OOFFE496 66CE OOFFE498 6000FF2A OOFFE49C OC8100000002 OOFFE4A2 6624 OOFFE4A4 102EFFFF OOFFE4A8 61000A6A OOFFE4AC 65B8 OOFFE4AE E148 OOFFE4BO 48178000 OOFFE4B4 102EFFFF OOFFE4B8 024000FF OOFFE4BC 806F OOFFE4BE 3280 OOFFE4CO B061 OOFFE4C2 66A2 OOFFE4C4 6000FEFE OOFFE4C8 102EFFFF OOFFE4CC 61000ABO OOFFE4DO 6694 OOFFE4D2 E188 OOFFE4D4 E188 OOFFE4D6 E188 OOFFE4D8 80AEFFFC OOFFE4DC 2280 OOFFE4DE B091 OOFFE4EO 6684 OOFFE4E2 6000FEEO IIDDd6c: cmp. b lchrw, dO ldata_word ?
beq IIDOd0a !t .. t if addre88 ia even, ut offaet
to wordaize if ID.
cmp . b lchrb , dO !data_ byte?
bna DDod6b
move.l 11,d1 Int ofhat to 1
bra DDOd1 I
IIDOd6b: cmp.b lchrl,dO I data_1ongword?
bne DDOd6 I
move.l a1,-4(a6) leava current addreaa
btat 10,-1 (a6) !teat bit 0 (addreaa muet be even!)
bne DDOdl lodd => open thie 1oeation again
move.1 l4,d1 leven => set offset to 4
bra IIDOdl land open thiB loeation again
lno valid eODDand; input cou1d be data.
I mmod6; mmod6a: mmod7: move.b d0,-1(a6) bar exchr bec DDod7 bar error bra DDodl move.b -1(a6),d0 lal. b 14,d0 bsr rx1hx bea DDod6a and.b 10xf,-1(a6) or.b d0,-1(a6) cmp.1 11,d1 bna 11Dod7b DDod7a: move.b -1(a6), (al)
move.b -1(a6),d0 cmp. b (al) , dO bne DDod6a bra DDod3 mmod7b: cmp.l 12,d1 bne mmod7e move.b -1(a6),d0 bar rx2hx bes DDod6a lal.w 18,d0 movem.w d0,-(a7) move.b -1(a6),d0 and. w IOxff ,dO or.w (a7)+,d0 mova.w dO, (a1) cmp.w (a1),d0 bne 11Dod6a bra DDod3 mmod7c: move.b -1(a6),d0
bar rx6hx bes DDod6a 111.1 #8,d0 111.1 #8,d0 la1.1 #8,d0 or.1 -4(a6),d0 move .1 dO, (al) cmp.l (al) ,dO bne DDIIOd6a bra DDod3 I c1ear carry lconvert input lee => no error ! report error land re_open loeation lget reault in dO
I
lget the other half !ca •> not hex !maak out reault lget va1ue at -1(a6)
lofhet =1 ?
lne => jump I atore value I gat data in dO
!check if va1ua did store I report error
lwait for other command
I offset is 2?
!na => muat ba 4 lget value in dO land gat tha other two !ca => error I re_open laave va1ue on atack !gat byte
!gat mabita zero !gat reau1t in dO !save new va1ue
!check if va1ue did etore
!report error I re_open
lwait for other command lget value in dO land gat the other aix !ca => error
I
re_open!shift mabyte to right poaition lca1culate raau1t in dO !store reault
!check if data did store !report error lre_open !wait for other command
OOFFE4E6 61000888 OOFFE4EA 023COOFE OOFFE4EE 4E6E OOFFE4FO 4CDF0303 OOFFE4F4 4E76 OOFFE4F6 48E7C080 OOFFE4FA 4E66FFFC 11111od8: JllllOd9: ber error and IOxfa, eer unlk a6
!wrong input I clear carry
movam.l (a7)+,d0-d1/a0-a1 Irastore ragietara
rta !exit
mprint:
print memory content& in : none
out: none
uaaa: dO,d1,aO,a1,a7,ar
calla: rx6hx,tx6hx,tx2hx,txep,txnwl,txetr mprint: movam.l d0-d1/a0,-(a7) I aava ragiatara
link a6,1-4 I OOFFE4FE 2D7COOFFF47BFFFC \ OOFFE606 61000830 OOFFE60A 610008B8 OOFFE60E 61000A6E OOFFE612 660000B2 OOFFE616 2F2EFFFC OOFFE61A 6100080A OOFFE61E 610008B8 OOFFE622 61000A6A OOFFE626 6600009E OOFFE62A 221F OOFFE62C 2F2EFFFC OOFFE630 2F01 OOFFE632 61000862 OOFFE636 66000082 OOFFE63A 2D67FFFC OOFFE63E 61000960 OOFFE642 6100081A OOFFE646 2067 OOFFE648 123COOOO OOFFE64C 1D60FFFF OOFFE660 610008EA OOFFES64 61000808 OOFFES68 5201 OOFFE6SA B1EF0004 OOFFES6E 6712 OOFFES60 6288 OOFFE662 2008 OOFFE664 028000FFFFFF OOFFE66A 2040 OOFFE66C OC010010 OOFFES70 66DA OOFFES72 2067 OOFFES74 1018 OOFFES76 0200007F OOFFES7A OC000020 OOFFES7E 6D06
move.l lmaprint1,-4(a6) lload pointer to taxt
bar txatr laand text
bar txmaatad I bar rx6hx bc• mprint9 move.l -4(a6),-(a7) bar pcrlf bar txmaanad bar rx6hx bca mprint9a mova.l (a7)+,d1 mova.l -4(a6),-(a7) move.l d1,-(a7) mprntO: ber txnwl !gat atartaddraea lee => error : laava leava etartaddraaa
I gat andaddreea lee &) error : laava
!gat atartaddraaa I a ave andaddran
laava currant line_addraee llay_out
bes mprnt7 les => abort wantad : exit
mova.l (a7),-4(a6) lget currant_lina addraea
bar tx6hx laand it to comm. port.
bar txap llayout
mova.l (a7),a0 !gat addraaa_pointar in aO
mova.b IO,d1 !addraae count par lina
mprnt1: mova.b (aO) ,-1(a6) I gat data
mprnta: mprnt2:
bar tx2hx !print data
bar txap !print apace
add.b 11,d1 tineremant counter
cmp.l 4(a7),a0 !eompare with andaddraaa
baq mprnta !aq => dona
add.l 11,a0 Jineramant pointer
move. 1 aO, dO I
and.l IOxOOffffff,dO !maak addraaa mova.l dO,aO
cmp. b 116, d1 bna mprnt1
!max. numbar of bytaa par lina lna => go for more
mova.l (a7),a0 lraload addraaapointar
mova.b (aO)+,dO !gat data again
and.b IOx7t,dO lelaar bit 7 I aaeii data
emp.b lapeh,dO
OOFFE680 OC00007F OOFFE684 6D04 OOFFE686 103C002E OOFFE68A 1D40FFFF OOFFE68E 61000872 OOFFE692 6301 OOFFE694 66DE OOFFE696 6388 OOFFE698 2008 OOFFE69A 028000FFFFFF OOFFE6AO 2040 OOFFE6A2 B1EF0004 OOFFE6A6 6712 OOFFE6A8 6288 OOFFE6AA 2008 OOFFE6AC 028000FFFFFF OOFFE682 2040 OOFFE684 2E88 OOFFE686 6000FF7A mprnt3: mprnt4: cmp.b tOx7f,dO blt mprnt4 llt o:> readable !print I
' '
move.b tperiod,dO move. b dO, -1(a6) bar txchr aub.b tl,d1I print character Ideerament counter
bne mprnt2 lne => go for more
sub.l 11,a0 Ideerement pointer
move . 1 aO, dO I
and.l IOxOOffffff,dO !maak address
move.l dO,aO I
cmp.l 4(a7),a0 !all done?
beq mprnt7 leq => exit
add.l t1,a0 lincrament pointer
move .1 aO ,dO !
and.l tOxOOffffff,dO !maak address
move . 1 dO, aO I
move.l a0,(a7) !save new lina_addreaa
bra mprntO !gat the rest
OOFFE6BA 4E6E OOFFE6BC 4CDF0103 OOFFE6CO 023COOFE OOFFE6C4 4E75
mprnt7: unlk a6 ladd.l 116,a7 lelaar atack
OOFFE6C6
OOFFE6C6 610007A8 OOFFE6CA 60EE
movem.l (a7)+,d0-d1/a0 Irastore regieters
and tOxfe,ccr lelaar carry
rts mprir..tll11 ,. . I add.l t8,a7 mprint9:bar error bra mprnt7 mresv: lmove.l (a7)+,d0 !print "?" I rts
reset the direct and indirect interrupt veetors
lclear atack
let them point to the monitor routines and syst-._time handler
OOFFE6CC 4E56FFFC mresv:
OOFFE6DO 2D7COOFFF489FFFC \ OOFFE6D8 6100076E OOFFE6DC 4E6E OOFFE6DE 21FCOOFFF19A0464 \ link aB,t-4 move.l tmsresv,-4(a6) bar txatr unlk a6
mresvq: move.l ttimerh,vact6
!
! initialize direct interrupt veetors
OOFFE6E6 mresv1
OOFFE6E6 21FCOOFFF1340008 \
move.l tbuserr, Ox8 lbus_error vector
OOFFE6EE 21FCOOFFF102000C \
move.l taddresserr, Oxc !addresa_error vector
OOFFE6F6 21FCOOFFF16C0010 \
mova.l tillinstrerr,Ox10 !illagal_instruction_error
vector
OOFFE6FE 21FCOOFFF1620020 \
move.l tprivvarr, Ox20 lprivilege_violation_arror
vector
OOFFE606 21FCOOFFEA6C0024 \
mova.l ltraceh, Ox24 !trace vector
~
move.l linterrO_~,Ox064 !vector ~6
OOFFEe16 21FCOOFFF03A0068 \
move.l linterr3, Ox068 !vector ~6
OOFFE81E 21FCOOFFF044006C \
move.l Unterr4, Ox06c: !vector ~7
OOFFE826 21FCOOFFF04E0070 \
move.l lintprr6, Ox070 !vector 28
OOFFE82E 21FCOOFFF0680074 \
move.l linterr6, Ox074 !vector ~9
OOFFE836 21FCOOFFF0620078 \
move.l linterr7, Ox078 !vector 30
OOFFE63E 21FCOOFFF06C007C \
move.l lnmi, Ox07c: !vector 31
initialize indirect vac:tora:
~OFFE846 21FCOOFFF0760460 \
mova.l lintarrl1h, vact1
OOFFE64E 21FCOOFFF08A0464 \
mova.l linterrl2h, vec:t2
OOFFE666 21FCOOFFF09E0468 \
move.l linterrl3h, vect3 OOFFE66E 21FCOOFFFOB2046C \
mova.l Untarrl4h, vact4
OOFFE666 21FCOOFFFOC60460 \
aove.l linterrl5h, vec:t6
OOFFE66E 21FCOOFFFOEE0468 \
aova.l linterrl7h, vec:t7
OOFFE676 4E76 rts
mreava:
reaet all interrupt veetora to monitor routines
OOFFE878 4E66FFFC mreava: link a6,1-4
OOFFE67C 2D7COOFFF49DFFFC \ OOFFE684 61000682 OOFFE888 4E6E OOFFE68A 21FCOOFFFODA0464 \ OOFFE692 6000FF62 move.l lmlraava,-4(a6) ber txstr unlk a6
mova.l lintarrl6h, vect6 bra mr1Bv1
JDBtac:k:
print value of etac:kpointar
OOFFE696 4E66FFFC matac:k:link a6,1-4
OOFFE69A 2D7COOFFF4ADFFFC \ OOFFE6A2 61000694 OOFFE6A6 2D4FFFFC OOFFE6AA 610007E4 OOFFE6AE 4E6E OOFFE6BO 4E76 mova.l IJDBatac:k,-4(a6) bar txatr mova.l a7,-4(a6) bar tx6hx unlk a6 rts mtrac:a:
OOFFE6B2 48E78080 OOFFE6B6 40F8044E OOFFE6BA 4E66FFFC trace a progrillil in : none out: none uaes: dO,aO,atc calla: rxchr,rx6hx,txstr
mtraca: movem.l d0/a0,-(a7) !save registers
move.w ar,aavar laave etatuaragiatar content&
link a6,t-4 lcraata eome room
OOFFE6BE 2D7COOFFF4BDFFFC \ OOFFE6C6 61000670 OOFFE6CA 6100022E OOFFE6CE 610003F6 OOFFE6D2 61000718 OOFFE6D6 102EFFFF OOFFE6DA OCOOOOOD OOFFE6DE 6722 OOFFE6EO 207COOFFE70E OOFFE6E6 4A10 OOFFE6E8 6606 OOFFE6EA 61000684 OOFFE6EE 60DE OOFFE6FO B0280001 OOFFE6F4 6704 OOFFE6F6 6C88 OOFFE6F8 60EC OOFFE6FA 20680002 OOFFE6FE 4E90 ooFFE7ob 6occ OOFFE702 4E6E OOFFE704 46F8044E OOFFE708 4CDF0101 OOFFE70C 4E76 OOFFE70E OOFFE70E 2041 OOFFE710 OOFFE768 OOFFE714 2044 OOFFE716 OOFFE7AC OOFFE71A 2063 OOFFE71C OOFFE7CA OOFFE720 2066 OOFFE722 OOFFE834 OOFFE726 2060 OOFFE728 OOFFE86A OOFFE72C 2043 OOFFE72E OOFFE878 OOFFE732 2047 OOFFE734 OOFFE8C8 OOFFE738 2048 OOFFE73A OOFFEA28 OOFFE73E 2062 OOFFE740 OOFFEBFA OOFFE744 204D OOFFE746 OOFFE364 OOFFE74A 202E OOFFE74C OOFFEA3C move.l tm&trace1,-4(a6) bar txatr bar trdr mtrac1: bar trprompt
bar rxchr move.b -1(a6),d0 cmp.b tcr,dO beq mtrac6 move.l ttracmd,aO mtrac2: tat.b (aO)
bne mtrac3 bar error bra mtrac1 mtrac3: cmp.b 1i(aO),d0 beq mtrac4 add.l t6,a0 bra mtrac2 mtrac4: mova.l 2(aO),aO
j er (aO) bra mtrac1 mtrac6: unlk a6 ! tracmd move. w aavsr, ar movem.l (a7)+,d0/a0 rta .aacii
'
A' .data4 trad .aacii , D' .data4 trda .aacii' s•
.data4 traap .aacii ' U' .data4 truep .aacii ' P' .data4 trpc .aacii'
C' .data4 tree .aacii ' G' .data4 trat .aacii ' H' .data4 trhlp .aacii , R' .data4 trdr .aacii , M' .data4 mmod .aacii'
.data4 trnxtpc laand text!show register contenta !aend prompt
lget anawar !in dO
labort collllll&nd? laq => leave
!gat baae of trace commanda in aO land of tabla?
!na => go ahaad !print '?'
land gat other collllll&nd ldid collillAnd match? leq => executa lnaxt poa. in tabla
I
!gat atartaddreaa in aO
lexacute routine: aftar rta back hare. !gat other cammand
Irastore atatuaregiatar. IAddraaa register !Data regiltar IStackPointer/Statua Regieter IUaar-atackpointar lprogrlllll_countar lcond. code register !Stap ona inatruction !help tunetion !display all registers lmodify memory
OOFFE760 :Z02C OOFFE76:Z OOFFEA66 OOFFE766 0000 OOFFE768 48E78080 OOFFE76C 4E66FFFC OOFFE780 610007AA OOFFE764 6406 OOFFE788 61000608 OOFFE76A 6038 OOFFE78C OC2E0007FFFF OOFFE772 62F2 OOFFE774 :Z07C00000420 OOFFE77A 610006E2 OOFFE77E 10:ZEFFFF OOFFE78:Z 028000000007 OOFFE788 E688 OOFFE78A :ZD700000FFFC OOFFE790 61000722 OOFFE794 610006C8 OOFFE798 61000822 OOFFE79C 66C8 OOFFE79E 21AEFFFCOOOO OOFFE7l4 4E6E OOFFE7l6 4CDF0101 OOFFE7AA 4E76 OOFFE7AC 48E78080 OOFFE7BO 4E66FFFC OOFFE7B4 61000766 OOFFE7B8 66AC OOFFE7BA OC2E0007FFFF OOFFE7CO 62A4 OOFFE7C:Z :Z07C00000400 OOFFE7C8 6080 OOFFE7CA 48E78080 OOFFE7CE 4E66FFFC OOFFE7D2 61000618 OOFFE7D6 OC2E0060FFFF OOFFE7DC 6622 OOFFE7DE 207C0000043C OOFFE7E4 :ZD60FFFC OOFFE7E8 61000671 OOFFE7EC 610006C6 OOFFE7FO 6100066C OOFFE7F4 610007C6 OOFFE7F8 662E OOFFE7FA :ZOAEFFFC OOFFE7FE 602C OOFFE800 OC2E0062FFFF OOFFE806 6620 OOFFE808 61000664 OOFFE80C 3D780444FFFE OOFFE812 61000668 OOFFE816 61000646 OOFFE81A 6100072C OOFFE81E 6608 OOFFE820 31EEFFFE0444 OOFFE8:Z6 6004 trad: .aacii ' .data4 trprvpc .data:Z 0 movem.l dO/aO,-(a7) link a6,1!-4 bar rx1hx bcc tradl
tradO: bar error
bra trad3
tradl: cmp.b t7,-1(a6)
lprevious pc valua
laava registers
!gat aacond command char
I ca => error
bhi tradO lhi => error
mova.l taav_aO,aO !get base of aava_area
trad2: bar txsp
mova.b -1(a6),d0
and.l t7,d0 !maak data
l.al.l t:Z, dO lmultiply by 4
move.l O(aO,d0),-4(a6) lget data
bar txBhx !sand data
bar txsp ! eend a pace
bar rx8hx !gat naw data
bes tradO les => error
mova.l -4(a6),0(aO,dO) !save new data
trad3: unlk a6
movem.l (a7)+,d0/a0 lreatora registers
rts
trda: movem.l d0/a0,-(a7)
link a6,1!-4 bar rxlhx bes tradO cmp . b 1!7 , -1 (a6) bhi tradO move.l taav_dO,aO bra trad2
traap: movem.l d0/a0,-(a7) link a6,11-4 bar rxchr
cmp.b tchrp,-1(a6) bna trnp1 mova.l l!sav_a7,a0 traapO: mova.l (a0),-4(a6)
bar txap bar txBhx bar txsp bar rx8hx bes trup2 mova.l -4(a6),(a0) bra traap3 traspl: cmp.b tchrr,-1(a6) bna trasp2 bar txap mova.w sav_sr,-2(a6) bar tx4hx bar txsp bar rx4hx bes trasp2 move.w -2(a6),aav_sr bra trsap3 laava
!gat aecond command les "'> error lhi => error
lget base of aava_araa
laava
!gat aecond command char I'P' (atackpointar) lne => jump lget old data lnnd value lget new data les => error
! save new val u a
land leave
OOFFE8FE 4E66FFFC OOFFE902 61000422 OOFFE906 123COODO OOFFE90A 143COOOO OOFFE90E 7600 OOFFE910 207C00000400 OOFFE916 1D41FFFF OOFFE91A 61000620 OOFFE91E 1D7C003AFFFF OOFFE924 610004DC OOFFE928 61000434 OOFFE92C 2D703000FFFC OOFFE932 61000680 OOFFE936 61000426 OOFFE93A 61000422 OOFFE93E 6100041E OOFFE942 6883 OOFFE944 6201 OOFFE946 6202 OOFFE948 OC020008 OOFFE94C 670C OOFFE94E OC020004 OOFFE962 66C2 OOFFE964 61000300 OOFFE968 60BC OOFFE96A 610003CA OOFFE96E 207C00000420 OOFFE964 143COOOO OOFFE968 7600 OOFFE96A 123COOAO OOFFE96E 1D41FFFF OOFFE972 610004C8 OOFFE976 1D7C003AFFFF OOFFE97C 61000484 OOFFE980 610003DC OOFFE984 2D703000FFFC OOFFE98A 61000628 OOFFE98E 610003CE OOFFE992 610003CA OOFFE996 610003C6 OOFFE99A 6202 OOFFE99C 6883 OOFFE99E 6201 OOFFE9AO OC020008 OOFFE9A4 670C OOFFE9A6 OC020004 OOFFE9AA 66C2 OOFFE9AC 61000378 OOFFE9BO 60BC trdr1: trdr2: trdr3: trdr4: OOFFE9B2 2D7COOFFF4E9FFFC \ OOFFE9BA 6100037C OOFFE9BE 2D78043CFFFC OOFFE9C4 610004EE OOFFE9C8 2D7COOFFF4EOFFFC \ OOFFE9DO 61000366 link a6,1-4 bar pcrlf mova.b 10xd0,d1 move.b IO,d2 mova.l IO,d3 mova.l laav_dO,aO move. b d1, -1(a6) bar tx2hx move.b lamcolon,-1(a6) bar txchr bar txap !gat "Dx" in d1 !regiatar counter !regiater ofhat
!base addrass of dataragiatere !aend data regieter number
'
I Bind
move.l O(aO,d3),-4(a6) !gat content& bar tx8hx bar txap bar txap bar txap add.l 14,d3 add.b 11,d1 add.b 11,d2 cmp.b 18,d2 beq trdr2 cmp.b 14,d2 bne trdr1 bar pcrlf bra trdr1 bar pcrlf move.l taav_aO,aO move.b IO,d2 move.l IO,d3 move. b IOxaO, d1 move. b d1, -1 (a6) bar tx2hx move.b lamcolon,-1(a6) bar txchr bar txap !next offset I next :·.,,iater
!eq => dataregisters done
I ne => do next
!base addreaa of addreaa_regiatere
!counter
= 0
loffut
=
0laddreaa regiater number 'Ax•
mova.l O(aO,d3),-4(a6) !gat data bar tx8hx bar txap bar txsp bar txsp add.b 11,d2 add.l 14,d3 add.b 11,d1 cmp.b 18,d2 beq trdr4 cmp.b 14,d2 bne trdr3 bar pcrlf bra trdr3 move.l lmatr3,-4(a6) bar txatr move.l aav_a7,-4(a6) bar txBhx move.l lmatr2,-4(a6) bar txatr !next register I next offaet !next registernumber leq => dona l"<crlf>SP: " I" USP: "