Vous êtes sur la page 1sur 137

COURS D'ASM 68000

(par le Froce Lapin)


retour au VOLUME 1

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Coursnumro1*
**
******************************************************************
Cecoursd'assembleurpourrasemblerrduitdeparsataille.Il
nel'estcependantpasparsoncontenu!L'assembleurestlelan
gageleplussimpleq uisoit,pour vuq u'ilsoitexpliq usim ple
mentceq uin'estmalheureusementpassouventlecas.C'estunpeu
leparidecescours:vousapprendreceq u'estl'assembleurenune
q uinzaine,pasplus.Detoutesfaons,par tgrossirlasauce
avecdublablainutile,jenevoispastrsbiencommentfaire
pourq uelescoursdurentplusde15jours.Evidement,vouscom
prenezbienq uelescourspayantsonteux,toutfaitintrt
fairedurerleplaisiretvousfairecroireq uec'esttrstrs
durcomprendreetq u'ilvafalloiraumoins2568478leonssi
vousvoulezvousensortir!!!
Cecoursestdestinaudbutant,ilestcomposdeplusieurspar
tiesrelativementcourtesmaisdanslesq uelles
TOUTESTIMPORTANT.
PRESENTATIONETAVERTISSEMENT
PourprogrammerenASM,plusieurshabitudessontncessaires.Au
tantlesprendredsledbutcar,trsvite,ceq uiapparaissait
commedepetitsproblmespeuttournerlacatastrophe.
Toutd'abordavoirdel'ordreauniveaudisq uette:Lessauvegardes
sonttrsnombreusesetc'estvitelapagaille.Travailleravec
soins:commentairesclairsetprcissurleslistings,viterles
soitdisant'trucs'q u'onnecomprendraplusauboutde3jours,
mettezq uelq ueslignesexplicativesaudbutdulisting...
Auniveauoutil,jeconseilleDEVPACpoursafacilitd'emploi,et
sadocq ui,bienq u'enAnglaisetsuffisammentclairepourq ue
l'onyretrouvefacilementlesinfor mations.
Sivousavezun1040(ouplus),n'hsitezpasdemanderauniveau
des'prfrences'deGENST,unchargementautomatiq uedeMONST,le
dbugger.
Pourceq uiestdeslivresdechevet(etdetravail),ilfautbien
surfaireladiffrenceentre2typesd'ouvrages:ceuxrelatifsau
68000Motorolaetceuxrelatifsl'ATARI.IlfautABSOLUMENTun
ouvragedechaq ue.Attention,pourceluirelatifau68000,ilne
doitpass'agird'unouvragedevulgarisation,maisd'unouvrage
techniq ue,q uivoussembleracertainementincom prhensibleau

dbut.
Parexem pledocumentationdufabricantdemicroprocesseur(MOTO
ROLAouTHOMSONpourlaFrance).Cherchezductdesvendeursde
composantslectroniq uespluttq uedanslesmagasinsdemicro
ordinateurs.Endsespoirorientezvousvers"Miseenoeuvredu
68000"auxditionsSYBEX.
Uneremarq ueq uidevraIMPERATIVEMENTguidervotrechoix:
Levocabulaireinfor matiq ueestcomposentrsgrandepartie
d'abrviations.Orcesontdesabrviationsdeter mesanglais.
Ilestdoncim pratifq uel'ouvragesurle68000donnelasignifi
cationdechacunedesabrviations,significationenAnglaiset
traductionenFranais.Attentiondetrsnombreuxouvragesne
donnentq uelatraductionorautantilestdifficiledesesouve
nirdelasignificationdeter mestelsq ueDATCK,BG,BGACK,MMU
ouMFP,autantleursfonctionsetclairsetsurtoutfacilementm
morisablesionconnatlasignificationdecesabrviationsdans
lalangueoriginal,latraductioncoulantdesource!
Pourl'ouvragerelatifauST,lemustconsisteseprocurerchez
ATARIlaDOCumentationofficiellepourlesDveloppeurs.Sinon,
"laBible"ou"leLivredudveloppeur"chezMicroApplication,
mmes'ilysubsisteq uelq ueserreurs,estunexcellentpalliatif.
Apar tcela,n'achetezaucunautreouvrage:"lelivreduGEM",
"GraphismesenASM","coursd'ASM"etc,neserontq uedesgouffres
pourvotreportemonnaieetnevousapporterontrien.
Si,aprscesachatsilvousresteq uelq ueargent,jenepeuxq ue
vousconseillertrsfortementl'achatd'unecalculatriceposs
dantlesoprationslogiq ues(AND,OR,XOR...)etlesconversions
entrebasesutiliseseninfor matiq ue(binaire,hexadcimal...).
JevousconseillelaTexasInstrumentTI34.C'estunecalculatrice
'solaire'(maisq uimarcheavecn'importeq uellesourcelumi
neuse),q uil'avantaged'tresimplemanipuler.Vouslatrou
verezunprixvariantde199Frs(magasinNASA)240Frs(Camif
oulaFnac).C'estunedpenseq uin'estpastropleveetq ui
s'avreratrsviterentable!
METHODEDEPENSED'UNORDINATEUR
EnFrancenousroulonsdroite.C'estsimple,entrdansles
moeurs,ettoutlemondes'ensortbien.Imaginonslaconduiteen
Angleterre...PourunFranaisilexisteenfait3solutions:
1)Onneluiditriensurcetypedeconduite:
C'estavantageuxdanslesensounotreconducteurparttout
desuitesurlaroute,maisbiensrlepremiercarrefourrisq ue
deluitrefatal.
2)OnluirapprendconduiredeAZ:
C'estlong,onal'impressiondeperdresontemps,maisonli
mitepresq uetotalementlesrisq uesd'accidents.
3)Onditsimplementauconducteur:Attention,icionroule
gauche.
Celuici,saitconduiredroite,enleprvenantilferaat
tentionets'ensortira.Avantage:c'estrapide,inconvnient:un
simplerelchementetc'estl'accident.

Programmer,c'estcommevouloirconduiregauche.Ilsuffitde
penser,maispasdepensercommenous,maiscommelamachine.
Conscientdevotrevolontd'allervite,c'estlamthode3q ue
nousallonsutiliser,maisattentionaurelchement.
Undernierconseilavantdevouslaisseraborderlepremiercours
proprementparler:l'assembleurplusq uetoutautrelangage,et
assimilableuneconstr uctionenLego.Unenor meconstructionen
Legon'estpourtantq u'unassemblagedepetitesbriq ues.Assembler
2briq uesetpasser1ou2heurespourtudiercetassemblagepeut
paratreinutile.Pourtantc'estceq uenousallonsfaire:ilya
peudechosesapprendremaisellessonttrsim portantes.Onne
lerpterajamaisassez:ceneserapasq uandnotrechteaude
Legod'unmtrecinq uantecommenceras'croulerq u'ilfaudrase
dire"merde,mes2petitesbriq uesdudbuttaientpeuttremal
fixes",carcemomentl,alorsq u'unemachineaccepteraitde
toutreprendredsledbut,ilya99%dechancespourq uevotre
exprienceenASMs'arrtel,ceq uiseraitdommage!
Demme,jevousdconseillefortementlachasseauxlistings!
Cettepratiq ueesttrscouranteentreautresurRTELetn'amne
gnralementq uedesennuis!IlestdeTRESLOINprfrablede
passerpourunconparceq u'onnesaitpasfaireunscrollingplu
ttq uedefrimeralorsq u'onajusterecopiunsourceq uenousa
donnuncopain!Acepetitjeul,ilyadesgagnantsenbasic,
enCouenPascalmaisjamaisenassembleur,carlorsq uevouscom
mencerezvouloircollerdessourcesentreeuxetq ueanemar
cherapas,vousserezTOTALEMENTincapabledecomprendrepourq uoi,
etilseratroptardpourapprendreetvousabandonnerez.Etne
ditespasnon,regarderplutt6moisenarriresurRTELetsou
venezvousdeceuxq uifaisaientalorsdel'ASM,ilsontpresq ue
tousabandonns!N'oubliezpasnonplusunediffrencefondamen
taleentreunlangageq uelq u'ilsoitetl'assembleur:Ilfauten
viron6moispourapprendreleCoulePascal.Ensuiteletemps
serapassproduiredebonsalgorithmes,ettaperlespro
grammes.
Enassembleurilenesttoutautrement.Enunmoismaximumle
68000nedevraitplusavoirdesecretpourvous,parcontretout
letempsq uisuivradevratreconsacrfairedesrecherches
plusoumoinsvidentessurdes'trucs'raliserplusvite,avec
plusdecouleursetc...UnprogrammeurenBASICouenCrecherche
dessourcespourtravailler.Pasunprogrammeurenassembleur!Le
programmeurenassembleurVAFAIRElesroutines!Typiq uementonva
demanderunprogrammeurenCdefaireunprogrammeetlepro
grammeurenCvademanderauprogrammeurenassembleurderaliser
laoulesroutinessoidisantinfaisables!Etbiensurpources
routines,pasdesourcesdedistribues!!!!Ceq uenousappren
dronsdoncici,c'estprogrammercommedesvrais!Achercher,
comprendreafindepouvoirparlasuitecherchertoutseul.
Sivousvousattendeztrouverdanscecoursdessourcesentiers
descrolling,delecturesdedigitsoudegestiondesourissans
leGEM,vousfaitesfausseroute!Retourneraubasicq uevous
n'auriezjamaisdq uitter;Vousresterezatoutjamaisceq ue
l'onappelleunlamerdanslesdmos,celuiq uirecopiemaisne
comprendrien.
Siparcontrevousvoulezsavoir,alorsaccrochezvouscarlesin
fossontraresmais...q uelplaisirlorsq u'aprsplusieursnuits
blanchesvousverrezapparatrevotrepremierscrollingdontvous
pourrezdire:"c'estmoaq uil'aifait!!!",etlceseravrai!!

Danscecoursnoustudieronsle68000maisgalementlesparticu
laritsduST:lesinterruptionsparleMFP68901,leson(digitou
non),lesmanipulationsgraphiq ues,l'interfacegraphiq ueLigneA,
etenfinungrosmorceau,souventcritiq umaistoujoursutilis,
leGEM.
Boncourage!

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Coursnumro2*
**
******************************************************************
LESCHIFFRES'MAGIQUES'
Voyonsd'abordd'unefaonsim plecommentmarcheunordinateur,en
nousplaantdanslasituationsuivante:nousdevonsfournirdes
messagesunepersonnedontnoussommesspars(parexem ple,
messagedenuitentredesgensloigns).
Nousavonsunelampedepoche,q uenouspouvonsdoncallumer,ou
teindre,c'esttout.Nouspouvonsdoncdonner2messages1)la
lampeestteinte(parex.toutvabien)2)lalampeestallume
(parex.vlalesflics!)
Approfondissonsles2tatsdelalam pe:
AllumeEteinte
q uirevient:ducourantpasdecourant
ou:Ducourant?OUINON
Valeurducourant?10
Lestestsserontdoncnotspar0ou1suivantl'allumageounon
delalampe.
Commenoussommesriches,nousachetonsune2melampe.
Nousavonsdonc4possibilitsdemessage
LAMPE1LAMPE2
teinteteinte
allumeteinte
teinteallume
allumeallume
Encomptantavec3,4,5,6...lam pes,nousnousrendonscompte
q u'ilestpossibledetrouverunerelationsim pleentrelenombre
delampesetlenombredepossibilits.

Nombredepossibilits=2lapuissancenombredelam pes.
Nousobtenonsdoncletableausuivant
Lesremarq uessontjusteslpourmettrelapucel'oreille!
LampesPossibilitsRemarq ues
12
24
38Ilyadesordinateurs8bits...
416etdes16bits...
532LeSTestun16/32bits
664AmstradCPC...64!!
7128ouCommodore128?
8256Eninfor matiq uelecodagedescaractres
(lettreschiffres..grceaucodeASCII)
per metd'avoir256caractres!
9512Un520a512Kodemmoireet
AmstradvendunPC1512
101024Lataillemmoiredemon1040!
112048Celledumga2demonfrre
124096Celled'unmga4.Aussilenbrde
couleursaffichablesavecunAmiga.
etc...
1665536DansleGFA,untableau
nepeutavoirplusde65536lments.
Simes4lampessontteintes(0000)jesuisdonclapossibilit
0.Siellessontallumes(1111)jesuisdoncla15(carde0
15afaitbien16)donc0000>0et1111>15
J'aidoncunbouq uinde16pagesdonnantlespossibilitsdes16
allumagespossibles,etmoncorrespondantalemme.Commentfaire
pourluienvoyerlemessagedelapage13?
Lechiffrelepluspetittantdroite(onnoteleschiffredans
l'ordrecentaines,dizaines,units),plaonsleslam pes.
Lampenumro:4321
a)jen'aiq u'unelam pe(la1)elleestallumedoncj'obtiensla
valeur1.(jenepeutobtenirq ue0ou1)
b)j'ai2lam pes(1et2),allumestouteslesdeux,j'obtiensla
4mepossibilit.J'aidonclavaleur3(puisq uejecompteles
valeurs0,1,2et3,ceq uienfaitbien4)Puisq uelalampe1vaut
aumaximumlavaleur1,j'endduisq uelalam pe2vautelle
seuleaumaximumlavaleur2.
Eneffetlampe1allume>valeur1
Lam pe2allume>valeur2
Doncles2allumesensemble>valeur3=4possibilits.
Lalampe2peutdoncdonnerune'augmentation'de0oude2.
Lampenumro4321
'augmentation'8421
Pourenvoyerlemessage13,ilfautdoncallumerlalam pe4
(valeurde8),lalam pe3(valeurde4)etla1(valeurde1)
Lampe4321
Etatdelalampe1101
Valeur8+4+0+1=13

Noussommesdoncentraindecompterenbinaire.
Endcimal:dcsignifie10,carunchiffrepeutprendre10va
leurs(de09).
Enbinaire:bi=deuxcarchaq uechiffrenepeutprendreq ue2va
leurs(0ou1).
L'infor matiq ueestundomaineAnglosaxon.Un'chiffrebinaire',
enAnglais,asedit'binarydigit'.Ongardelapremirelettre
etles2dernires,etonditq u'unchiffebinairec'estunBIT
!!!Unbitpeutdonctre0ou1.C'estlapluspetiteunitin
for matiq ue,
car,lecorrespondantq uinousenvoyonsdesmessages,c'esten
faitunordinateur.Aulieud'allumerdeslampes,nousmettonsdu
courantsurunfilounon.Unordinateur8bitsdonc8filsur
lesq uelsonmetounonducourant!
Pourenvoyerdesmessagesnousallonsdoncprparerdeslam pes
avecdespetitsinterrupteurspuis,q uandnoslampesserontpr
tes,onactionneral'interrupteurprincipalpourenvoyerlecou
rantetdoncallumerd'uncoupleslampesprvues.
Nousallonsdonc,parl'inter mdiairedenos'lampes',envoyerdes
messagesaucoeurdelamachine(danslecasduSTc'estunmicro
processeur68000dechezMOTOROL A)q uiatfabriq upourrpon
dred'unecertainemanireauxdiffrentsmessages.
Onprparedoncnoslampespuisonallume.Nous,nousavons16
lampes.Eneffetle68000Motorola
estunmicroprocesseur16bits.
Voicidoncun'programme'(c'estdireunesuccessiond'ordres)
telq u'ilestauniveaumiseounondecourantsurles16fils
Toutgauchec'estlavaleurdufil16etdroitecelledu1.0
=pasdecourantsurlefil,1ducourant.Lemicroprocesseurest
entourdemultiplestiroirs(lescasesmmoire)etpar milesor
dresq u'ilsaitexcuterilya'vachercherceq u'ilyadanstel
tiroir'oubien'vamettreadansteltiroir'.Chaq uetiroirest
reprparuneadresse(commechaq uemaison),c'estdireparun
numro.
Nousallonsdireaumicroprocesseur:vachercherceq u'ilyaau
numro24576,ajoutesyceq u'ilyaaunumro24578etmetsle
rsultataunumro24580.Onpourraitremplacer'aunumro'par'
l'adresse'.
Allumonsdoncles16lampesenconsq uences,celadonne:
0011000000111000
0110000000000000
1101000001111000
0110000000000010
0011000111000000
0110000000000100
Uneseulebiarq ues'im pose,c'estlamerdetotale!Commentfaire
pours'yretrouveravecunprogrammecommea,sionoublied'al
lumeruneseulelam pe,anemarcheplus,etpourreprerl'erreur
dansunlistingpareil,bonjour!
lamerde!!!!
Onadonclapossibilitdemarq ueranonpasenbinaire,maisen

dcimal.Malheureusementlaconversionn'estpascommodeetde
toutefaon,onobtientq uandmmedesgrandschiffres(visuelle
mentcarleurtailleentantq uenombrenechangepas,biensr!)
Ainsila3melignedonne53368.Onvadoncconvertirautrement,
ensparantnotrechiffresbinaireengroupede4bits.
REMARQUEDEVOCABULAIRE:
Nousneparleronsq u'Anglais.Touteslesabrviationseninfor ma
tiq uesontdesabrviationsdemotsoud'expressionsanglaises.
LeslirelaFranaiseimposed'apprendreparcoeurleursignifi
cation.Enleslisanttellesq u'ellesDOIVENTtrelues(en
Anglais),cesexpressionsdonnentd'ellesmmesleurdfinition.
UndesexemplesestT$q uiestlusystmatiq uementTdollar!Or,
$n'estpas,danslecasprsent,l'abrviationdedollarmais
celledestring.T$doitdoncselireETSEDIRETstring.String
signifiant'chane'enAnglais,Testdoncunechanedecarac
tre.Evident,alorsq uelireTdollarnesignifieabsolumentrien
!Leseulintrtc'estq ueafaitmarrerDouglas,lejoyeuxbri
tanniq ueq uiprogrammeavecmoi!
UneunitbinaireseditdoncBIT(binarydigit)
4unitsfor mentunNIBBLE
8unitsfor mentunoctet(q uenousappelleronsparsonnoman
glaisc'estdireBYTE)
16unitsfor mentunmot(WORD)
32unitsfor mentunmotlong(LONGWORD)
Revenonsdoncnotreconversionengroupantnos16lampes(donc
notreWORD)engroupesde4(doncenNIBBLE)
0011000000111000
Ces4nibblesfor mentnotrepremierword.
Comptonsdonslesvaleurpossiblespourunseulnibble.
tatdunibble0000valeur0
0001valeur1
0010valeur2
0011valeur3
0100valeur4
0101valeur5
etc..
1010valeur10
STOPavaplus!10c'est1et0oronlesadjuti
liss!
Benouimaispart0,1,2,3,4,5,6,7,8,9onn'apasgrandchose
notredisposition...Bensi,y'al'alphabet!
Onvadonccrire10avecA,11avecB,12avecC,13/D,14/Eet
15avecF.Ilyadonc16chiffresdansnotrenouveausystme(de
0F).'Dc'signifiant10et'Hex'signifiant6(unhexagone)
doncHex+Dc=16.Dcimal=q uia10chiffres(09)hexadci
mal=q uien16!!!
Notreprogrammedevientdoncenhexadcimal:
$3038
$6000
$D078

$6002
$31C0
$6004
Plusclairmaisc'estpasencorea.
NOTE:pourdiffrencierunnombrebinaired'unnombredcimalou
d'unhexadcimal,parconventionunnombrebinaireseraprcdde
%,unnombrehexadcimalde$etiln'yaurariendevantunnombre
dcimal.$11nevautdoncpas11endcimal,mais17.
Rflchissonsunpeu.Nousavonsenfaitcrit:
'Vachercherceq u'ilya'
'l'adresse$6000'
'ajouteyceq u'ilya''l'adresse$6002'
'metlersultat'
'l'adresse$6004'
Lemicroprocesseurpeutbiensrpiocherdanslesmilliersdeca
sesmmoireq u'ilyadanslamachine,maisenplusilenasur
lui(despetitespochesenq uelq uesorte,danslesq uellesil
stocketemporairementdes'trucs'dontilaurabesoinrapidement).
Ila17poches:8danslesq uellesilpeutmettredesdonnes,et9
danslesq uellesilpeutmettredesadresses.Donne=DATAet
adresse=ADRESS,cespochesserontdoncrepresparD0,D1,D2,
...D7etparA0,A1...A7etA7'(nousverronsplustardpourq uoi
c'estpasA8,etlesdiffrencesentrecestypesdepoches).
NOTE:lephnomnedecourant/pascourantetlemmepourTOUSles
ordinateursactuels.Lenombrede'poche'estpropreau68000
MOTOROLA.
Ilyadonclemmenombrede'poches'surunAmigaouunMac
Intoshpuisq u'ilsonteuxaussiun68000Motorala.SurunPCouun
CPC,lescaractristiq ues(nombredelampesallumablessimultan
ment,nombrede'poches'...)sontdiffrents,maisleprincipeest
lemme.C'estallumOUc'estteint.
Modifionsnotre'texte',q uidevientdonc.
'dplacedanstapocheD0'
'ceq uetutrouverasl'adresse$6000'
'ajouteceq uetuasdanstapocheD0'
'ceq uetutrouverasl'adresse$6002'
'metslersultatdel'opration'
'l'adresse$6004'
Lamachineesttrslimite,puisq ueparconception,lersultat
del'oprationdela3meligneiraluimmedansD0,crasant
doncceq uis'ytrouve.Pourgarderlavaleurq uis'ytrouvaitil
faudraitaupralablelarecopierparexempledanslapocheD1!!!
DplacerseditenAnglaisMOVE
AjouteseditenAnglaisADD
Notreprogrammedevientdonc
MOVEceq u'ilyaen$6000dansD0
ADDceq u'ilyaen$6002D0
MOVEceq u'ilyamaintenantdansD0$6004
C'estdire:
MOVE$6000,D0

ADD$6002,D0
MOVED0,$6004
Nousvenonsd'crireenclairunprogrammeenlangagemachine.
Ladiffrencefondamentaleavecunprogrammedansn'importeq uel
autrelangage,c'estq uel,chaq uelignenecorrespondq u'UNE
SEULEoprationdumicroprocesseur,alorsq uePRINT"BONJOUR"va
luienfairefairebeaucoup.Ilestvidentq uenotreBASIC
n'tantq u'untraducteur'mcaniq ue'satraductionatoutesles
chancesd'treapproximative,et,bienq u'ellesoitefficace,elle
utilisebeaucoupplusd'instructions(pourlemicroprocesseur)
q u'iln'enfautrellement.
Ilfautbienaussiavoirunepensemuepourlespremierspro
grammeursdu68000q uiontd'abordfaitunprogrammeavecdes1et
des0,programmeq uinefaisaitq uetraduiredeschiffreshexad
cimauxenbinairesavantdelestransmettrelamachine.Ilont
ensuiteralis,enhexadcimaldesprogrammestraduisantdesins
tructionsdugenreMOVE,ADDetc...enbinaire...
Ilsuffisaitensuitederegrouperplusieursinstructionsdece
typesousuneautreappellation(incomprisedirectementparlama
chine)etdefairelestraducteurscorrespondants,etcrerainsi
leslangages'volus'(PASCAL,C,BASIC...)
Nousallonsdoncnousintresserlaprogrammationoupluttla
transmissiond'ordreau68000Motorola.Combiend'ordrespeutil
excuter.Uniq uement56!!!!(avecdesvariantesq uandmmemais
afaitpasbeaucoup).Desrecherches(unniveaubientrophaut
pournous!)oneneffetmontresq u'iltaitplusrapided'avoir
peud'instr uctionsfaisantpeudechosechacuneetdoncexcuta
blesrapidementlesunesaprslesautres,pluttq ued'avoir
beaucoupd'instructions(lemicroprocesseurperdantsansdoutedu
tem pscherchercelleq u'onluiademanddefaire)oubiendes
instructionscomplexes.
Travailfaire:reliretoutaaumoins2foispuissereposer
l'espritavantdelirelasuite.
CONSEIL:necommencezpaslasuitetoutdesuite.
AvalezparfaitementTOUTceq uiestmarq u,carlacomprhension
dumoindredtailvousservira.
Unelampe,cen'estpasgrandchose,maisunedegrilleetvous
comprendrezlamerdeq ueaamne.
L,c'estpareil.Lapluspetitechoseincompriseetvousn'allez
riencom prendrelasuite.Parcontresitoutestcompris,la
suiteseraaussifacile,etsurtoutaussilogiq ue.

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*

**
*parLeFroceLapin(from44E)*
**
*Coursnumro3*
**
******************************************************************
Sivousavezcorrectementtudilesdeuxpremiresleons,vous
deveznor malementavoirunpeuplusd'ordreq u'audpart,etle
binaireetl'hexadcimalnedoiventplusavoirdesecretpour
vous.
Avantdecommencerjedoisvousrappelerq uelq uechosed'essen
tiel:Ilesttentantderflchirenchiffrealorsq uebiensou
ventilseraitprfrabledesesouvenirq u'unchiffren'est
q u'unesuitedebits.Ainsiimaginonsunjeudansleq uelvousde
vezcoderdesdonnesrelativesdespersonnages.Enlisantces
donnesvoussaurezdeq uelpersonnageils'agit,etcombienil
luirestedepointdevie.Admettonsq u'ilyait4personnages.
Combienfautildebitspourcompterde03(c'estdirepour
avoir4possibilits)seulement2bits.Mespersonnagespeuvent
avoir,aumaximum,63pointsdevie(de063car0ilssont
mor ts),ilmefautdonc6bitspourcodercettevitalit.Jepeux
doncavoirsurunseulbyte(octet)2chosestotalementdiffrent
es:aveclesbits0et1(lebitdedroitec'estlebit0,lebit
leplusgauchepourunbyteestdoncle7)jecodeletypede
monpersonnage,etaveclesbits27savitalit.
Ainsilechiffre210enluimmeneveutriendire.C'estlefait
delemettreenbinaire:11010010etdepenserenregroupementde
bitsq uivalerendreplusclair.Sparonsles2bitsdedroite:
10ceq uifait3endcimal,jesuisdoncenprsenced'unperson
nagedetype3.
Prlevonsmaintenantles6bitsdegauche:110100etconver
tissons.
Nousobtenons52.Noussommesdoncenprsenced'unpersonnagede
type3,avec52pointsdevitalit.
Cecidevantmaintenanttreclair,passonsuneexplication
succinteconcernantlammoire,avantd'abordernotrepremierpro
gramme.
STRUCTUREDELAMEMOIRE
Lammoire,c'estuntube,trsfinettrslong.Ilnousfaut
distinguer2choses:
1)Ceq u'ilyadansletube.
2)Ladistanceparrapportaudbutdutube.
ATTENTION,cettenotiondoittreparfaitementcom prisecarelle
estper ptuellementsourced'erreur.
Grceladistance,nouspourronsretrouverfacilementceq ue
nousavonsmisdansletube.Cettedistanceestappel'adresse'.
Letubeaundiamtrede1byte(octet).Lorsq uejevaisparlerde
l'adresse$6F00(28416endcimal),c'estunemplacement.Acet
emplacementjepeuxmettreunbyte.Siladonneq uejeveuxmet
tretienssurunword(donc2bytescar1wordc'estbien2bytes
accols),cettedonneoccuperal'adresse$6F00etl'adresse
$6F01.

Imaginonsq uejechargeuneimage(32000octets)par tirde


l'adresse$12C52.Jevaisdoncboucler32000foispourdposermon
image,enaugmentantchaq uefoismonadresse.
Imaginonsmaintenantq uejeveuillenotercetteadresse.Jevais
parexemplelanoterl'adresse$6F00.
Doncsijemepromnelelongdutubejusq u'l'adresse$6F00et
q uejeregardeceniveauldansletube,j'yvoislechiffre
$12C52codsurunlongmot(lesadressessontcodssurdeslongs
mots).Cechiffreoccupedonc4emplacementsdetubecorrespondant
$6F00,$6F01,$6F02,$6F03.Or,q uereprsentecechiffre:Une
adresse,celledemonimage!!!!J'espreq uec'estbienclair...
Unprogramme,c'estdoncpourle68000unesuitedelecturesdu
contenudutube.Ilvaytrouverdeschiffresq u'ilvainter prter
commedesordres(revoirlecours2).Grcecesordres,nousal
lonsluidireparexem pledecontinuerlalectureunautreen
droitdecetube,derevenirenarrire,deprleverlecontenudu
tubeetd'allerledposerautrepart(toujoursdanscemmetube
biensr)etc...Poursavoirq uelendroitle68000estentrain
delirelesordresq u'ilexcute,ilyauncompteur.Commece
compteursertpourleprogramme,ilestappelProgramCounter,en
abrgPC.
Le68000aunPCsur24bits,c'estdireq u'ilpeutprendredes
valeurscomprisesentre0et16777215.Commechaq uevaleurduPC
corresponduneadresseetq u'enfacedecetteadresse(doncdans
letube)onnepeutmettreq u'unoctet,unemachineq uiped'un
68000peutdonctravailleravec16777215octets,ceq uifait16
Mga.Atitreindicatif,le80286dechezIntelq uiq uipeles
'gros'com patiblesPC,necomporteq u'unPCsur20bitsceq ui
restreintsonespace1mga...
Anoterq uelammoireestdestinerecevoirdesoctetsmaisq ue
ceq uereprsentecesoctets(texte,programme,image...)n'a
strictementaucuneim portance.
PREMIERPROGRAMME
Nousallonstoutdesuiteillustrernotrepropos.Nouslanons
doncGENST.Ceuxq uiontuncrancouleurdevrontlelanceren
moyennersolution,c'estprfrablepourunmeilleurconfortde
travail.
Mmesivousavezun520,choisissezdansles'prfrences'de
GENST(danslemenu'Options')unchargementautomatiq uedeMONST
(LoadMONST'YES')mettezunTabSettingde11etautoindentsur
YES.
SiMONSTestdjchargsonoptiondanslemenu'program'doit
tredisponible,sinonelleestengris.Sic'estlecas,aprs
avoirsauvlesprfrences,q uitterGENSTetrelancezle.
Maintenant,nousallonsraliserleprogrammesuivant:
Metlechiffre$12345678dansleregistreD0
Metlechiffre$00001012dansleregistreD1
AdditionneleregistreD0avecleregistreD1
Toutd'abordilfautsavoirq uecesordresserontmisdansle
tube,etq u'ilnousfaudraparfoisreprercesendroits.Pourcela
nousutiliseronsdestiq uettes,q uenousposeronsctdutube.

Cestiq uettes(ouLabelenAnglais)sontinscriretoutgauche
dansnotrelistingalorsq uelesinstr uctions(ceq uiestmettre
DANSletube)serontinscritesaprsunespaceoumieuxpourla
lisibilit,aprsunetabulation.
Ainsinotreprogrammedevient:
MOVE.L#$12345678,D0
MOVE.L#$00001012,D1
ADD.LD0,D1
Remarq uerlesigne#avantleschiffres.Lesigne$indiq ueq ue
ceschiffressontinscritsenhexadcimal.Lesigne#indiq ueq ue
c'estlavaleur$12345678q uenousvoulonsmettredansD0.
SinousavionsfaitMOVE.L$12345678,D0,c'estlavaleurse
trouvantl'adresse$12345678q uenousaurionsmisenD0.
Pourq uoiyatil.LaprslesMOVEetleADD?Nousverronscela
dansq uelq uesminutes.
Pourlemomentassemblonsenmaintenantappuy[ALTERNATE]puisen
appuyantsurA.
Nor malement,touts'estbienpassoualorsc'estq uevousn'avez
passcrupuleusementrecopice'programme'.
Maintenant,dbuggonsnotreprogramme,enmaintenantappuy
[ALTERNATE]etenappuyantsurD.
Hop,nousnousretrouvonsdansMONSTq ui,tantappelpartirde
GENST,aautomatiq uementchargnotreprogramme.
Jetonstoutd'aborduncoupd'oeilceramassisdechiffre...
EnhautnousretrouvonsnosregistresdedonnesD0D7ainsiq ue
nosregistresd'adressesA0A7avecenprimeA7'.Souslesre
gistresdedonnes,nousvoyonsSRetendessousPC.Nouspouvons
remarq uerq uePCnousmontreuneadresseetlapremirelignede
notreprogramme.LePCindiq uedoncceq uivatreexcut.
Lafentredudessous(numro2)montrenotreprogramme.Surla
gauchedecettefentrenousvoyonslesadresses.Symboliq uement
nouspouvonsdireq uelapartiedroitedecettefentremontrenos
instructionsdansletubeetq ueleschiffresdegauchenousindi
q uel'endroit,l'adresseparrappor taudbutdutube.
Lafentrededroite(la3)donneenfaitlammechoseq uela2,
maisaveclavisiondu68000.Nousavionsvudanslecours2q ue
pourlamachinenotresuited'ordresn'taitq u'unesuitede
chiffres.
Lorsq uenousavonsassembl,l'assembleurasimplementconverti
ligneparlignenotreprogrammeenchiffres.
Nor malementdanslafentre2vousdevezvoirnotreprogrammeavec
enfacedelapremireinstruction,unepetiteflche.Regardez
l'adressedecetteinstruction(c'estdirelechiffredegauche,
q uiindiq ueaq uelendroitdansletubesetrouvecetordre).Avec
un1040sousTOS1.4,celatourneautourde$61BF0.
NOTE:Le68000per metunprogrammedeseplacern'importeo.
Surcertainsmicroprocesseurslesprogrammesdoiventim prati
vementtousseplaceraummeendroit.Pournouscen'estpasle

cas,ceq uiexpliq ueq uesimonprogrammeesten$61BF0iln'en


estpasforcementdemmepourvous:c'estnor mal.
Regardezmaintenantlafentre3etcherchezylammeadresseq ue
celleq uevousavezluedanslafentre2enfacedenotrepre
mirelignedeprogramme.Nor malementsivousn'aveztouchrien
cetteadressedoitnor malementtrelapremire.
Vousdevezyvoir203C12345678.C'estainsiq uelemicroproces
seurreoitMOVE.L#$12345678,D0!!!
Retournonssurlafentre2.Notonsl'adressedelasecondeligne
denotreprogrammeetsoustrayonscechiffrel'adressedela
premireligne.Nousobtenons6.Nousendduisonsdoncq ue:
MOVE.L#$12345678,D0occupe6octetsenmmoire.
Faisonsmaintenantavancernotreprogramme.Pourcelamaintenez
enfonc[CONTROL]etappuyezunefoissurZ.Lapetiteflchea
sautsurlasecondeligne,cettemmeligneestmaintenantindi
q ueparlePCetnotreregistreD0contientmaintenantlavaleur
$12345678.MONSTindiq uetousleschiffresenhexadcimal,vous
commencezcomprendrel'intrtdelacalculatrice...
ContinuonsenrefaisantControl+Z.C'estmaintenantlaligne3de
notreprogrammeq uiestindiq ueparlePCtandisq ueD1s'est
trouvrem plipar$00001012.
ContinuonsavecControl+Z.L'additionentreD0etD1s'esteffec
tue.Commenousl'avionsvudanslecours2,lespossibilits
sontminimescarlersultatacrasl'anciennevaleurdeD1.
PourraliserD0+D1=D2ilauraitd'abordfallutransfrerD1dans
D2puisfaireADD.LD0,D2.
Dansnotrecas,D1contientmaintenantlavaleur$1234668A.
Notreprogrammen'ayantpasvritablementdefin,q uittonsle
artificiellemententapantControl+C.
SECONDPROGRAMME
Effacerlepremierprogramme(alternateC)ettapezlesuivant:
MOVE.L#$12345678,D0
MOVE.WD0,D1
MOVE.BD1,D2
NousavonsvudansMonstq ueD0D7taientdesregistresassez
grands.Nousavonsrussimettre$12345678dansD0,ceq uidonne
q uandmme305419896endcimal!Eneffetle68000estunmicro
processeur16/32bitsceq uifaitq uecesregistresnesontpas
codssur16bitsmaissur32.
32bits,celafaitunlongmot(LongWord).Dansnotrepremier
programme,nousvoulionsq uel'instructionMOVEagissesurtoutle
registredoncsurunlongmot,c'estpourcelaq uenousavions
prcis.Laprslemove.
NOTE:Levocabulaireesttrsimportantetdemandeunpetiteffort
audbut.AinsiMOVE.Lneveutriendire.Ilconvientdelirece
mnmoniq ue(c'estainsiq uesontappellesinstructionsassem
bleurs)MOVELONG.D'ailleursl'appellationmnmoniq ue(q uia

rapportaveclammoire,q uisertaiderlammoire)estrap
procherdemnmotechniq ue(capabled'aiderlammoirepardes
moyensd'associationmentaleq uifacilitentl'acq uisitionetla
restitutiondessouvenirs/CFdictionnaireLeRobert).Autantdonc
lirelesinstructionsenAnglaisceq uifaciliteragrandementla
comprhension.
Puisq uenotreregistreD0(commelesautresd'ailleurs)etcod
surunlongmot,ilcontientdonc2wordsctecte.Pourles
distinguernousappelleronsceluidegaucheworddepoidsfortet
celuidedroiteworddepoidsfaible.Chacundeceswordsestlui
mmecomposde2bytes,celuidegauchetantdepoidsfortet
celuidedroitedepoidsfaible.Depoidsfaiblecarleschange
mentq u'ilpeutapporterlatotalitdunombresontfaiblealors
q uelesdonnesdegauche(doncdepoidsfort)yapportentdesva
riationsimportantes.
Assemblonsnotreprogrammeetdbuggons.
Excutonslapremireligne.Lersultatestlemmeq uepourle
premierprogramme:lePCindiq uelasecondeligne,tandisq ueD0
reulavaleur$12345678.
Maintenantexcutonslasecondeligne.Queditelle?
MOVE.WD0,D1
C'estdiredplacerlecontenudeD0pourlemettredansD1.
Maisattention,ledplacementdoitsefairesurunword(prcis
par.Waprslemove.CelaselitMOVEWORD).Orlesoprationsse
fonttoujourssurlepoidsfaible.LeMOVEvadoncprleverle
worddepoidsfaibledeD0pourlemettredansleworddepoids
faibledeD1.Celuicivadoncrecevoir$5678.
Continuonsenexcutantlatroisimeligne.Cellecidemande:
MOVE.BD1,D2(movebyted1d2)
Donctransfer tdubytedepoidsfaibledeD1verslebytedepoids
faibledeD2.Regarderbienlesregistresetlesvaleursq u'ils
reoivent!
QuittezmaintenantleprogrammeavecCONTROL+C
TROISIEMEPROGRAMME
MOVE.L#$12345678,D0
MOVE.L#$AAAAAAAA,D1
MOVE.WD0,D1
SWAPD0
MOVE.WD0,D2
Oneffaceleprogrammeprcdent,ontapeceluici,onassemble
puisondbugue.L'excutiondelapremireetdelasecondeligne
nedoiventplusposerdeproblme.
Nousdevonsobtenir
D0=12345678
D1=AAAAAAAA
Excutonsmaintenantlatroisimeligne.Ilyabientransfertdu
worddepoidsfaibledeD0versleworddepoidsfaibledeD1.
Nousconstatonsq ueleworddepoidsfortdeD1N'ESTPASAFFECTE

parcetransfert,etq u'ilrestetoutfaitindpendantduword
depoidsfaible.
4meligne.Cemnmoniq ue'SWAP'(Toswap=changer)vachanger
les16bitsdepoidsfaibleavecles16bitsdepoidsfort.D0va
doncdevenir56781234.
Dernireligne.TransfertduworddepoidsfaibledeD0(q ui
maintenantest1234etplus5678)versleworddepoidsfaiblede
D2.
Nousavonsvuq ueD0contenaitenfait2donnesetq uecesdon
nestaienttotalementindpendantes.Ceciper metunegrandesou
plessedetravailmaisdemandeaussiunegranderigueurcarsiau
lieudefaireMOVE.WD0,D1j'avaisjustecommisunefautede
frappeentapantMOVE.LD0,D1j'crasaisleworddepoidsfortde
D1etaprsjemeseraistonndetrouver1234dansD1l'en
droitojedevraisencoretrouverAAAA.
Nousvoyonstoutdesuitelesnor mesavantagesdecesystme.
Nousn'avonsnotredispositionq ue8'poches'dedonnes(D0
D7)maissinousnevoulonsgarderq uedeswords,nouspouvonsen
mettre2parpoche,c'estdire16entout.Demmesinotre
codagenesefaitq uesurdesbytes,c'est32bytesq uenouspou
vonsgarder(4parpoche).Celapeutparatreassezvidentmais
parexem plesurl'Archimde,cen'estpaspossible.Surcettema
chine,unregistrecontientunlongwordourien!
RESUMDEVOCABUL AIRE
MOVE.L=movelong
MOVE.W=moveword
MOVE.B=movebyte
CONSEILS
Prenezvotretemps,reliseztranq uillementcecoursetles
prcdents.Vousvoyezcen'estpasbiendurl'assembleur!

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Coursnumro4*
**
******************************************************************
Nousallonsabordermaintenantlesregistresd'adresse.Toutcomme
lesregistresdedonnes,cesregistressontcodssur32bits(un
longmot).Doncprioriaucunediffrence,puisq uelemicropro
cesseurneconnatq uedeschiffres,q ueceuxcireprsententdes
donnesoudesadresses,peuluiimporte.C'estvraiengrande

par tieetd'ailleurssurcertainsmicroprocesseurs,iln'ya
q u'unoudeuxregistres,q uipeuventcontenirindiffremment
adresseoudonnes.
Voyons,grceunexemple,lesdiffrencesenceq uiconcernele
68000MOTOROLA.
Taponsdoncleprogrammesuivant,aprsavoir,biensr,effac
l'ancien,etassemblons.
MOVE.L#$12345678,D0
MOVE.B#$AA,D0
MOVE.L#$12345678,A0
MOVE.B#$AA,A0
MOVE.L#$12345678,A1
MOVE.BA1,D1
L'assembleurnote2erreursetnouslesannoncepar'invalidsize
atline4'etlammechosepour'line6'.Puisq uec'estlataille
etnonl'oprationellemmeq uisembleposerproblme,nousen
dduisonsq ueleMOVEversoupartird'unregistred'adresse,
n'estpaspossiblesurunbyte.Rectifionsdonclaligne4etla
ligne6enremplaantlesMOVE.BpardesMOVE.Wetrassemblons.
Note:Lorsq uel'assembleurnoteuneerreur,ildonnelaligneo
sesituecelleci.Danscettenumrotationleslignesvidessont
comptes.
AinsisivousaviezpassuneligneaprsMOVE.L#$12345678,D0les
erreursauraienttannoncesligne5et7.
Celafaitdjunediffrencepuisq uesivousregardezbienle
programme,nousvoulionsraliseruneoprationavecD0:Le
rempliraumaximumdesataille,puisvrifierq ueleMOVEdela
ligne2,n'affecteraitq uelebytedepoidsfaible,puisraliser
lammeoprationsurA0.
Impossiblepriori.Tantpis,suitenotremodification,
l'oprationsedrouleradoncsurunwordaulieud'unbyte.
Dbuggonsnotreprogramme.Premireconstatation:l'assembleur,
voyantq uelesoprationsontlieuavecdesregistresd'adresseet
nonpasdesregistresdedonnes,aautomatiq uementmodifiles
MOVEversA0etA1,pourlestransfor merenMOVEA,ceq uiselit
MOVEADDRESS
Excutonsleprogrammepaspas.D0prendlavaleur$12345678,
puisseulsonbytedepoidsfaibleestmodifi,D0prenantalors
lavaleur$123456AA.EnsuiteA0prendlavaleur$12345678.Aprs
lalignesuivante,l'oprationaffectantleword,nousdevrions
avoir$123400AA.Etbienpasdutout!Nousobtenons$000000AA.
Nousvenonsdoncdevoirq u'unregistred'adresseesttotalement
influenc(doncsurunlongmot)lorsq u'ilestladestinationde
l'opration.Qu'enestildonclorsq u'ilenestlasource?
Continuonsdoncnotreprogramme,aveclerem plissagedeA1etde
D1.Nousconstatonsparlasuiteq ueseulleworddepoidsfaible
deA1vientcraserceluideD1.
NOTE:$AAestbienenchiffreenhexadcimal.Sivouspensiez
q u'ils'agissaitdesim pleslettresdel'alphabet,dor mez1ou2
jours,etreprenezlecourslapremireleon!

Detoutcecinousdduisons2dfinitions:
REGISTRESDEDONNES:Chaq ueregistrededonnesaunelongueurde
32bits.Lesoprandessousfor med'octetoccupentles8bitsde
poidsfaible,lesoprandessousfor medemot,les16bitsde
poidsfaibleetlesoprandeslongs,latotalitdes32bits.
Lebitdepoidsleplusfaibleestadresscommebit0,lebitde
poidsleplusfortestadresscommebit31.
Lorsq u'unregistrededonnesestutilissoitcommeoprande
source,soitcommeoprandedestination,seulelapartieappro
priedepoidsfaibleestchange.Lapar tierestantedepoids
fortn'estniutilise,nimodifie.
REGISTRESD'ADRESSE:Chaq ueregistreaunelongueurde32bits,et
contientuneadressesur32bits.Lesregistresd'adresse
n'acceptentpasuneoprandedontlatailleestl'octet.Par
consq uentlorsq u'unregistred'adresseestutiliscommeoprande
source,soitlemotdepoidsfaible,soitl'oprandelongdanssa
totalitestutilis,enfonctiondelatailledel'opration.
Lorsq u'unregistred'adresseestutiliscommedestination
d'oprandeleregistreentierestconcern,indpendammentdela
tailledel'opration.Sil'oprationportesurunmot,tousles
autresoprandessubissentuneextensiondesignesur32bits,
avantq uel'oprationnesoiteffectue.
DfinitionsextraitesdudocumentrfEF68000(circuitintgrs
MOSTHOMSONEFCIS),45avenuedel'Europe78140Velizy.
Danscesdfinitions,nousremarq uonsunnouveauter me:oprande.
C'estleter meq uidsignelavaleurutilisedansl'opration.
AinsidansMOVE.WD0,D1l'oprandesource,c'estleworddepoids
faibledeD0alorsq uel'oprandedestination,c'estlewordde
poidsfaibledeD1.
Noussavonsmaintenantceq u'estlePC,unregistrededonnes,un
registred'adresse,nousavonsunpeuidedeceq uenousmontre
lesfentredeMONST,continuonsdoncdcortiq uercefabuleux
outil!
PourobserverlafentredeMONST,sivousn'avezpasassemblde
programme,impossibled'utiliserAlternate+D.Ilvousserarpondu
q u'iln'yapasdeprogrammeenmmoire.TapezdoncAlternate+M,
vousvoyezMONSTapparatre,maisvousdemandantq uelfichier
charger.TapezESCetnousvoicitranq uillepouruneobservation.
Nousvoyonsbiendanslafentreduhautnosregistresdedonnes
etdroitenosregistresd'adresse.Souslesregistresdedonnes
SRpuisPC.LePC(programcounter),noussavonsceq uec'est,
maisleSR?
LESTATUSREGISTER
LeSR(prononcerStatusRegister,ceq uiveutdireenFranais
registred'tat),estunregistrecodsurunword(16bits)et
q ui,commesonnoml'indiq ue,nousrenseignesurl'tatdu
microprocesseur.
Ilestl'exemplefrappantdeceq uenousavonsvudansl'introduc

tionducours3,savoirq u'ilestbiendangereuxdetraiterun
ensembledebitscommeunsimplechiffre,plusoumoinsgrand.
Voyonsladcom positionduStatusRegister.
numrodesbits150
appellationT.S...I2I1I0...XNZVC
Toutd'abordilfautsavoirq uecertainsbitsduSRnesontpas
utiliss.Ilssonticisymbolissparunpointchacun.
Commenonsparladescriptiondesbitsdedroite,encommenant
parle0.
LebitC(CsignifieCarrydoncretenueenFranais).
Cebitestmis1lorsq u'ilyauneretenuedanslebitleplus
lev(doncdepoidsleplusfort)del'oprandeobjet,dansune
oprationarithmtiq ue.
LebitV(VsignifieoVerflowdoncdpassementenFranais).
Imaginonsuneadditionde2nombrespositifs,lorsq uelersultat
vadborderleslimitesduregistres,onobtiendraenfaitun
nombrengatifcomplmente2.Eneffetlefaitdemettrele
bitdepoidsleplusfort1indiq ueq uelenombreestngatif.
Commecen'estpas,danslecasprsent,lersultatrecherch,on
estprvenududpassementparlefaitq uelebitVestmis1.
Ilindiq uegalement,lorsdedivisions,q ueleq uotientestplus
grandq u'unwordoubienq uenousavonsundividendetropgrand.
LebitZ(ZsignifieZro).Iln'indiq uepasq uelersultatest
gal0,maispluttq uelersultatestpassdel'autrecot
de0.Eneffet,cebitest1lorsq u'aprsuneoprationlebit
depoidsleplusfortdursultatestmis1,ceq uisignifieq ue
noussommesenprsenced'unnombrengatifencomplment2.Le
bitN(NsignifieNegate)signifieq uenoussommesenprsence
d'unnombrengatif.
LebitX(XsignifieeXtenddoncextension).C'estunbitbien
spcialq uisecomporteunpeucommeuneretenue.Lesinstructions
q uiutilisentcebitleprcisentdansleurnom.ParexempleADDX
q uiselitaddwithextendestuneoprationd'additionprenanten
comptecebitX.CebitXestgnralementlerefletdubitC,
mais,contrairement,celuici,certainesinstr uctionsnelemo
difientpas.
Lorsq uenoustudieronsdeplusprslesinstructionsdu68000,le
faitq uel'instr uctionaffecteounonteloutelbitseraparfois
trsim portant.
LebitT(TsignifieTracedoncsuivreenFranais).
Lorsq uecebitest1,le68000setrouveenmodeTrace.
Alorsl,soyezbienattentif,ceq uivasuivreestprimordial
pourlasuitedescours!!!
LemodeTraceestunmodedemiseaupointpourlesprogrammes.Et
oui,c'estcarrmentDANSlemicroprocesseurq u'unetellecommande
estinsre.Achaq uefoisq uele68000excuteuneinstruction,
ilvavoirdansq ueltatsetrouvelebitT.S'iltrouvecebit
0,ilpasselaprochaineinstruction.Parcontre,sicebitest
1,le68000laissedect(tem porairement)leprogramme
principalpoursedtournerversuneroutine(un'bout'depro
gramme)q uiafficheraparexem plelavaleurdetouslesregistres
(D0D7etA0A7).Imaginonsq u'ilfailleappuyersurune

touchepoursor tirdecetteroutine:Nousavonsdonctoutletemps
deconsultercesvaleurs.Nousappuyonssurunetouche:finde
notreroutine,le68000retournedoncauprogrammeprincipal,
excutel'instructionsuivante,testelebitT,letrouvenou
veau1,sebranchedoncsurnotreroutine,etc...Nousavons
doncunmodepaspas.Or,vousavezdjutiliscettepar ti
cularitenvisualisantledroulementdesinstructionsavec
MONST!
Tapezleprogrammesuivant:
MOVE.W#$23,D0
MOVE.W#$15,D1
AssemblezetfaitesAlternate+DpourpassersousMONST.Appuyez
unefoissurControl+ZetobservezleStatusRegister.MONSTa
affichT,indiq uantainsiq uecebitest1.Noussommesdonc
bienenmodeTrace.QuittezleprogrammeparControl+C.
Nousarrivonsmaintenantnousposeruneq uestion:Le68000a
trouvlebitT1.D'accord,ilsaitoestsonStatusregister
etilsaitq uelebitTc'estle15me.Maisaprs?Le68000
s'estdtournversuneroutineq uidanslecasprsentsetrouve
treunepar tiedeMONST.
Maiscommentatiltrouvcetteroutine?MONSTesteneffetun
programmetoutfaitordinaire,q uiatchargenmmoire
par tirdeladisq uette,etq uipeuttreplacn'im porteodans
cettemmoire.
Unepremiresolutionconsisteraittoujoursplacerceprogramme
aummeendroit.MOTOROLAauraitainsipuconcevoirle68000en
prcisant:Lesprogrammesdemiseaupointq uiserontappels
grcelamise1dubitT,devrontcommencerl'adresse$5000.
Simple,maistrsgnantcarildevientpratiq uementimpossiblede
fairersiderplusieursprogrammesenmmoiresimultanment,sans
courirlerisq ueq u'ilssemarchentsurlespieds!!!
Ilyapourtantuneautresolution,unpeuplustorduemaisenre
vanchebeaucoupplussouple,q uiconsistechargerleprogramme
demiseaupointn'importeoenmmoire,denoterl'adressela
q uelleilsetrouve,etdenotercetteadresseunendroitpr
cis.Lorsq uele68000trouveralebitT1,ilfonceraceten
droitprvul'avanceparMOTOROLA,ilytrouveranonpasla
routinemaisunlongmot,adressedecetteroutine,laq uelleil
n'auraplusq u'serendre.
Cetendroitprcis,oserastockl'adressedelaroutine
excuterlorsq uelebitTseratrouv1,c'estunendroitq uise
situedanslepremierkilodemmoire(doncdansles1024premiers
bytes).Enl'occurrencepourlemodetraceils'agitdel'adresse
$24.
Rsumons:MONSTsechargeenmmoire.C'estunprogrammecomplet
dontcertainesroutinesper mettentl'affichagedesregistres.
MONSTregardel'adresselaq uellecommencentcesroutines,note
cetteadressepuisvalamettrel'adresse$24.Celongmotest
doncplacl'adresse$24,$25,$26et$27puisq uenoussavons
q uele'diamtre'du'tube'mmoiren'estq ued'unoctet(byte).
Lorsq uelemicroprocesseurtrouvelebitT1,ilval'adresse
$24,ilyprlveunlongmotq uisetrouvetrel'adressedes
routinesdeMONST,etilfoncecetteadresse.ok?
Nousallonsmaintenantraliserunpetitprogrammeetnousallons

'planter'votreATARI!
Tapezceq uisuit:
MOVE.W#$1234,D1
MOVE.W#$6789,D2
MOVE.W#$1122,D3
AssemblezpuistaperAlternate+DpourpassersousMONST.Faites
unefoisControl+Z.LebitTduStatusregisterestmis1,indi
q uantq uenoussommesenmodeTrace.Commenousavonsexcutune
instruction,D1setrouverempliavec$1234.Appuyonsmaintenant
surAlternate+3.
Nousvenonsd'activerlafentrededroite(lanumro3).
AppuyonssurAlternate+A.Unedemandes'affiche:nousdevons
indiq uerq uelleadresseseralapremirevisibledanslafentre.
Ilfauttapercetteadresseenhexadcimal.Noustaponsdonc...24.
(pasde$avant,MONSTsaitdeluimmeq uenousparlonsenhexa)
Nousvoyonss'afficherl'adresse24enhautdelafentreeten
faceunchiffreq uiestl'adressedenotreroutinedeMONST!
Pourmoic'est00027086maiscommejel'aiditprcdemmentcela
dpenddesmachines.Dansmoncaslorsq uele68000trouvelebitT
1,ilfoncedoncexcuterlaroutineq uisetrouveen$00027086.
Jevaisdoncmodifiercetteadresse!AppuyonssurAlternate+Epour
passerenmodedition.Lecurseurestplacsurlepremiernibble
del'adresse.Tapezparexem ple11112222oun'im porteq uelautre
chiffre.
Repassezmaintenantdanslafentre1entapantAlternate+1.
Maintenantrflchissons:NousallonsrefaireControl+Z.Le68000
vafonceren$24,vamaintenantytrouver$11112222,etvafoncer
cetteadressepouryexcuterceq u'ilvaytrouverc'estdire
n'im porteq uoi!Ilyatrspeudechancepourq u'ilrussissey
liredeschosescohrentesetvousindiq uerauneerreur.
Allezy,n'ayezpaspeur,vousnerisq uezpasdecasservotre
machine!
HopControl+Zet,suivantlescas,vousobtenezdiversmessages
(Illegalexception,BusErroretc...).
QuittezenfaisantControl+Coubienendernierressortfaitesun
RESET.
J'espreq ueceprincipeestTRESTRESBIENCOMPRIS.Sicelavous
semblepeuprsclair,reliseztoutcarlasuitevatrssouvent
fairerfrenceceprinciped'adressedanslepremierkilo,
contenantl'adressed'uneroutine.
Laprochainefois,nousfinironsd'tudierleStatusRegister,en
attendantjevaismeprendreunepetitevodkabienfrache.Ala
vtre!

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Coursnumro5*
**
******************************************************************
Suitedel'tudeduStatusregister,lesinterruptions.
Etantdonnq uenousavonsparfaitementcomprisceq uisepassait
danslecasole68000trouvaitlebitTduStatusRegister1,
c'estdiretoutlesystmed'adressefixelaq uelleontrouve
l'adressedelaroutine,nousallonspouvoircontinueretenfait
finirladescriptiondesautresbitsdeceStatusRegister.
LebitS/Super viseur
Le68000peutvoluerdans2modes:lemodeSuperviseuretle
modeUtilisateur.Danslemodesuper viseur,nousavonsaccs
TOUTESlesinstructionsdu68000etTOUTElammoire,alors
q u'enmodeutilisateurcertainesinstructionsnepeuventtreem
ployes,etl'accscertainespar tiesdelammoireestin
terdit.
Effectivementcelapeutsembleraupremierabordsur prenant:
Vousavezachetunemachine,c'estq uandmmepourpouvoirl'uti
liserdanssatotalit!Lencore,noustombonsdanslepigeq ui
consistemlangerATARISTet68000MOTOROLA.Grcel'nor me
puissancedecemicroprocesseur,ilesttoutfaitpossible
d'envisageruntravailmultiutilisateur.
GonflonsnotreST8Megaoctets,q uiponsled'unnor medisq ue
dur,etconnectonsleplusieurster minaux.Nousavonsdoncplu
sieursclaviers,plusieurscrans,maisenrevancheunseulmi
croprocesseur,celuidel'unitcentrale(dontlenomprendici
toutesavaleur)etuneseulemmoire,danslaq uelletoutlemonde
piochetoursdebras.L,ladiffrenciationSuper viseur/Utili
sateurprendsonsens.LeSuperviseur,c'estle'propritaire'de
l'unitcentrale,lespersonnesutilisantlester minauxn'tant
q uedes'utilisateurs'.Lefaitdeneleurautoriserq u'unepartie
desinstr uctionsetdelammoire,apourbutd'viterlesplanta
gescarsidanslecasd'unemonoutilisation,unplantagetotal
delamachineesttoujoursgnant,danslecasd'unemultiutili
sation,celarelvedelacatastrophe,caronneplanteplusle
travaild'uneseulepersonnesmaisdeplusieurs!
LebitSduStatusRegister,s'ilest0,indiq ueq uenoussommes
enmodeUtilisateur.A1,ilindiq ueq uenoussommesenSuper
viseur.
ToutcommeMONSTindiq uaitl'tatTraceenindiq uantTctdu
SR,ilindiq ueUouSsuivantlemodedansleq uelnousnous
trouvons.
Jetonsuncoupd'oeilenarriresurlechapitredcrivantlebro
chagedu68000(courssupplmentaireA).Nousretrouvonscette
distinctionauniveaudesbrochesFC0,FC1,FC2.

Avantd'tudierles3bitsrestantduSR(I2,I1,I0),ilfautsa
voirq ueleStatusRegisterestenfaitsparen2octets.L'oc
tetdepoidsfort(bit815)estappeloctetsuperviseur,alors
q uel'octetdepoidsfaibleestl'octetutilisateur.
Enmodeutilisateuronnepeutcrireq uedansl'octetutilisateur
alorsq u'enmodesuper viseurnousavonsaccsauworddanssato
talit.
L'octetutilisateurcontenantlesbitsdeconditions(bitsXNZV
C),onl'appellegalementregistredescodesconditions(Condi
tionCodeRegister),ouCCR.
LesbitsI2,I1etI0(InterruptMask)
Ces3bitsserventreprsenterlesmasq uesd'interruption.Mais
voyonstoutd'abordceq u'estuneinterruption.Nousavonstudi
prcdemmentlefonctionnementliaubitT(trace).Lorsq uece
bitestpositionn,leprogrammeprincipalestinterrompu,aupro
fitd'uneroutinespciale.C'estenq uelq uesorteleprincipede
l'interruption.
Uneroutineeninterruption,c'estunboutdeprogrammediffrent
duprogrammeprincipal.Aintervallesrguliersoucaused'un
lmentextrieur,le68000vainterrom pre(c'estbienlemot!)le
programmeprincipal,pourallerexcutercetteroutine.Lorsq ue
celleciserater mine,ilyauraretourauprogrammeprincipal.
L'exem pleleplussimpleestceluidutlphone:Jetravaille
monbureau(c'estleprogrammeprincipal)lorsq ueletlphone
sonne.Jedtectel'interruption,j'arrtemontravailetjed
croche(excutiondel'interruption).Laconversationter mine,je
raccrocheetjeretournemonoccupationpremire.
Maintenant,pluscompliq u:Interruptiondemontravailprincipal.
Jedcroche,maisencoursdeconversation,onsonnelaporte.
Linter vientleprincipedelaprioritd'interruption.Sila
ported'entreuneprioritsuprieurecelledutlphone,
j'interromptlaconversationtlphoniq uepourallerouvrir:Ily
ainterruptiondel'interruption.Unefoisclaq ulaporteau
124memarchanddebalayettesdelajournejereprendsletl
phone,jefinislaconversation,jeraccrochepuisjemeremets
matcheprincipale.
Parcontre,sil'interruption'ported'entre'aunepriorit
infrieurecelledutlphone,j'attendraid'avoirfiniavecce
luiciavantd'allerouvrir.
Les3bitsI2,I1etI0(Interruptmask)per mettentdedfinirle
niveauminid'interruptionq uiseraprisencours.Commeonne
possdeq ue3bits,onnepeutdfinirq ue7niveau,de17(on
neparlepasiciduniveau0,carc'estleniveaudetravail'nor
mal'delamachine.Sileniveauest0,c'estq u'iln'yapas
d'interruption.).Ainsi,sinousavons011pources3bits,nous
obtenons3commeniveaumini.Lesinterruptionsdeniveaux1et2
neserontdoncpasprisesencompte.Puisq ueleniveauindiq upar
les3bitsseraacceptcommeniveaud'interruption,nousend
duisonsq uesilesbitssont111,seulslesinterruptionsdeni
veau7serontprisesencompte.Ornousvoyonsbiengalement
q u'iln'estpaspossiblededfinirunniveauminimumde8par
exemple,etdoncq u'ilseraimpossibled'empcheruneinterruption
deniveau7.Ceniveauestdoncdit'nonmasq uable'.

Lesinterruptionsdeniveau7sontdoncappelesNMIc'estdire
nonmaskableinterrupt.
Anoterq u'iln'estpaspossibled'opreruneslectionprciseet
parexem pled'autoriserlesinterruptionsdeniveaux4,5et7et
pascellesdeniveau6.Silesbitssont100,lesinterruptions
deniveau4,5,6et7serontautorises.Vouspouvezjeternou
veauuncoupd'oeilsurlecoursannexeA.Vousretrouverezbien
surle68000lesbrochesI2,I1etI0.Uneremarq uecependant,ces
brochessontactivesl'tatbas,c'estdireq u'elleindiq ue
q uelq uechoselorsq u'iln'yapasdecourant,l'inversedesau
tresbroches.
ParcontreleurreprsentationauseinduStatusRegistersefait
danslebon'sens'.
Noussommesmaintenantamensnousposeruneq uestionsimilaire
celleq uenousnoussommesposelorsdel'tudedumodeTrace.
Le68000reoitunedemanded'interruption.Ilcompareleniveau
decellecilalimitefixeparlesbitsIduStatusRegister.
Sil'interruptionestacceptable,ilsauveleStatusRegisteret
metenplacedanslesbitsIleniveaudel'interruptionq u'ilva
excuterafindenepastregnparuneautredemandeplusfai
ble.Ilstoppealorsl'excutiondesonprogrammeprincipalpour
sedtournerverslaroutine.Unefoiscelleciter mine,ilre
vientauprogrammeprincipal.C'estbienjoli,maisoatil
trouvlaroutineeninterruption?Etbiensimplementenutili
santlemmeprincipeq uepourlemodeTrace.Nousavonsvuq ue
lorsq uelebitTtaitenplace,le68000allaitvoirl'adresse
$24etq u'ilytrouvaitunlongmot,celongmottantl'adresse
delaroutine.Pourlesinterruptions,leprincipeestlemme:si
c'estuneinterruptiondeniveau4,c'estl'adresse$70q uele
68000trouveraunlongmot,celongmot,commedanslecasdumode
Tracetantl'adressedelaroutineexcuter.Sil'interruption
estdeniveau1,c'estlelongmotsitul'adresse$64etc...Il
estbienvidentq uec'estauprogrammeurdeplacerceslongmots
cesadresses:Onprpareuneroutine,oncherchesonadressede
dpart,puisonnotecellecil'endroitprcisol'onsaitq ue
le68000viendralachercher.
Toutescesadressestantsituesdanslepremierkilodemmoire
denotremachine,tudionsdeplusprsces1024octets.(Vous
trouverezuntableaureprsentantcekiloenannexe)Pourlemo
mentnousn'allonsfaireq u'yreprerlesq uelq ueslmentsq ue
nousavonsdjtudis.Toutescesadressesontdesnumrosd'or
dres,etcausedeleurfonctionpropre(nefaireq uecommuniq uer
l'adressed'uneroutine),onlesappelle'vecteurs'.
Nousretrouvonsbienen$24levecteur9,correspondantaumode
Trace,de$64$7Clesvecteurscorrespondantsauxinterruptions
deniveau17.Leniveau0,tantleniveau'nor mal'detravail,
n'apasdevecteur.
Nouspouvonsdjexpliq uerd'autresvecteurs:Ainsilenumro5
(adresse$14)c'estlevecteurdedivisionpar0.Le68000nepeut
pasfairededivisionpar0.Lorsq ueleprogrammeessaye,ilse
produitlammechoseq uepourlemodeTrace:Ayantdtectune
divisionpar0,le68000foncel'adresse$14,ytrouveune
adressederoutineetvaexcutercelleci.Danslaplupartdes
cascetteroutinevaafficherq uelq uesbombesl'cranettout
bloq uer.Riennevousem pchecependantdeprparervotrepropre
routineetdemettresonadresseen$14.Ainsidansunprogramme
demath(beurkk!)cetteroutinepeutafficher"divisionpar0im

possible".Sil'utilisateurtenteunetelledivision,inutilede
fairedestestspourleprvenirdecetteimpossibilit,le68000
s'enchargeratoutseul.
Lesautresvecteurs
Erreurbus.Nousavonsvuprcdemmentq uele68000utilisece
q uenousappelonsunbuspourrecevoiroutransmettredesdonnes.
Siuneerreursur vientsurceluici,ilyasautal'adresse$8
pourtrouverl'adressedelaroutineq uiseraalorsexcute.
Erreurd'adresse.Le68000nepeutaccderq u'desadresses
paires.S'iltented'accderuneadresseimpaire,ilseproduit
uneerreurd'adresse(mmeprincipedetraitementq uel'erreur
bus,oulemodeTrace,vecteur,adresseetc...).Nousverronsplus
tardq u'ilnousserapossibled'accderdesadresseimpaires,
maisavecdesprcautions.
Instr uctionsillgales.Nousavonsvuq ueletravaildel'as
sembleurconsistaitsimplementtransfor merenchiffres,ligne
parligne,notreprogramme.Cependant,sinousmettonsenmmoire
uneimage,celleciseragalementplacedansle'tubemmoire'
sousfor medechiffres.Ladiffrencec'estq ueceschiffresl
neveulentriendirepourle68000entantq u'instruction.Si
nousordonnonsau68000d'allercetteadresse(cellede
l'image)ilessayeradedcrypterceschiffrescommedesinstruc
tions,ceq uidclencherauneerreur'instr uctionillgale'.
Violationdeprivilge.Nousavonsvuq uele68000pouvaitvo
luerenmodeutilisateurouenmodesuper viseur.Onditq uel'tat
superviseurestl'tatprivilgi(outatdeplushaut
privilge).Tenterd'accderenmodeutilisateurunezonem
moirerserveaumodesuper viseuroubiententerd'excuterune
instructionprivilgie(doncutilisableuniq uementensupervi
seur)provoq uerauneerreur'violationdeprivilge'.
Connatrecesdiffrentstypesd'erreursesttrsimportant.En
effetlaphasedemiseaupointestgnralementlongueenassem
bleur,surtoutaudbut.Detrsnombreuseserreurspeuventsurve
nir,dontlacauseestparfoisjustesousnotrenez.Letypemme
del'erreur,sicelleciestbiencomprise,peutsouventsuffire
orienterlesrecherchesplusprcismentetainsiraccourcirle
tem ps(pnible)derecherchedugraindesableq uibloq uetout!
Touslesvecteursconstituantlepremierkilodemmoireayant
pourbutdedrouterleprogrammeprincipalversuneroutineex
ceptionnelle,sontappels'vecteursd'exceptions'.
Lesvecteursrestantsseronttudisdanslessriessuivantes,au
furetmesuredesbesoins.Chaq uechoseensontemps!
Pouraujourd'huinousnousarrteronsl.Cefutcourtmaisle
prochainchapitreseraconsacrlapileetserabiengros!
Lapileestunproblmeaussisimpleq uelesautres,q uidemande
simplementdel'attention.Aprsavoirtudiceq u'estlapile,
ilnenousresteraplusq u'undemicoursavantd'abordernospre
miers'gros'programmes!
Courage!maissurtoutprenezvotretem ps!Relisezlescoursprc
dentmmesitoutvousparatcompris.Plusnousavanceronsplus
lenombredepetiteschosesaugmenteraetmoinsilyauradeplace

pourlapluspetiteincomprhension.

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Coursnumro6*
**
******************************************************************
LAPILENousavonsdjutilislanotionde'tube'enceq ui
concernelammoire.Nouspouvonsystockerdiffrenteschoses,et
sinousnousrappelonsl'adresse,nouspouvonsrevenirplustard
cetendroitpouryrcuprerceq uenousyavionsdpos.
Essayezaveccepetitprogramme:
MOVE.L#$12345678,D0
MOVE.LD0,$493E0
MOVE.L#0,D0
MOVE.L$493E0,D0
AssemblezpuispassezsousMONST.Avancezenpaspas.D0est
d'abordrem pliavec$12345678,puislecontenudeD0esttransfr
l'adresse$493E0.Notezbienq u'iln'yapasde#devant$493E0,
afind'indiq uerq u'ils'agitbiend'uneadresse.Cettelignetant
excute,activezlafentre3([Alternate+3])etplacezledbut
decellecisurl'adresse$493E0([Alternate+A]puistapez493E0)
Vousvoyezbien12345678cetendroitdansle'tube'.Sij'ai
choisitcetteadressec'estparceq u'ellesesitue300Kilodu
dbutdelammoire.Elleestdoncaccessiblemmesurun520,et
elleestsuffisammentloignepournepassetrouverdansGENST
ouMONST.Eneffetiln'yaq u'un'tube'mmoire!Noussommesdonc
entraind'criredanslammoirealorsq u'unepar tiedecelleci
estoccupeparGENSTetMONST!Ecrirel'intrieurdeszonesoc
cupesparcesprogrammesestpossible,ceq uientraneratrs
certainementq uelq uesplantagesdeceuxci!
Continuonsenpaspas,nousmettonsD00puislecontenude
l'adresse$493E0(sans#)estremisdansD0.
Lapile,c'estunepar tiedecetube,maisq uenousallonsgrer
d'unemanireunpeudiffrente.Eneffet,aulieudeplacerles
donnesdansletubeetdenoterleursadresses,nousallonscette
foiscilesempileretpourlesrcuprer,lesdpiler.L'avantage
c'estlegaindetem ps(paslapeinedesedemanderq uelle
adresseonastocklesdonnes)etungaindeplace(sic'est
pourstockertem porairementdesdonnes,inutiledeconserverune
por tionde'tube'justepoura).
Parcontrel'inconvnientc'estq uelagestiondoittrerigou
reuse.Imaginonsq uej'empileunpremierchiffrepuis10autres

pardessus.Ensuitejedpile,maiserreurdemapart,jene
dpileq ue9chiffres!Quandjedpileraiunefoisdeplus,
croyantretrouverlepremierchiffreem pil,jercupreraien
faitlepremierdelasriede10.
Nousenconcluons2choses:d'abordq uelapileestunmoyensim
plepoursauvegarderdesdonnes,maisensuiteq uec'estune
sourcededsagrmentpotentiel,telq uecertainsprogrammeursh
sites'enservir.C'estgnralementcaused'unmanq uederi
gueurceq ui,jel'esprenevousarriverapas.
Uneautreremarq ue:ledernierlmentplacsurlapileseratou
jourslepremierensortir.C'estbienlemmeprincipeq uece
luid'unepiled'assiettes:Regardezchezvous,ilyasrement
unenor mepiled'assiettes,maisparlesimplefaitq uelerange
mentaprslelavagesefaitparempilageetq uemettrelatable
sefaitpardpilage,vousmangezenfaittoujoursdanslesmmes
assiettes...(d'ol'intrtdebienfairelavaisselle!)
CettestructuredepileestappelestructureLIFO,c'estdire
LastInFirstOut,enFranais:'dernierentrpremiersor ti'.
Cettestructureestdiffrented'uneautrestructurefrq uemment
rencontreeninfor matiq ue,celledelafile,appeleaussistruc
tureFIFO(FirstInFirstOut),lafiletantsimilaireune
filed'attentedevantunguichet:lepremierdanslafileserale
premierparti.
Maisconcrtement,q uoiser tlapile?Nousallonslevoiravec
unexemple.Tapezleprogrammesuivant:

MOVE.L#$12345678,D0
MOVE.L#$BD88,D1
MOVE.L#$BD88,A0
BSRAJOUTE
MOVE.L#0,D0
MOVE.LD2,D0
AJOUTEMOVE.L#$11112222,D2
ADD.LD1,D2
RTS
Premireremarq ue:ceprogrammediffredesprcdentsparlefait
q uenousutilisonsunetiq uette,unlabelq uisenommeAJOUTE.
Cemot,'AJOUTE',doitsetrouvertoutgauche,contrelebordde
lafentredel'diteur.Cen'estpasq uelq uechoseplacerDANS
letubemaisbienunemarq ueACOTEdutube.
Autreremarq ue,leslistingsenassembleur,contrairementauxlis
tingsdanslesautreslangagessontassezlibresauniveauprsen
tation.Ilesttoutafaitpossibledepasserdeslignes,ceq ui
estfaiticipoursparerles2parties.Lessourcesassembleur
sontbiensouventtrslongs,etmmesicelafaitperdreq uelq ues
lignes,espacerlesmodulesper metdes'yretrouverplusfaci
lement.
Assemblonspuisdbuggons.AvanonspaspasavecControl+Z.Les
3premireslignesnoussontfamiliresmaispaslaq uatrime.
CelleciselitBRANCHSUBROUTINEAJOUTE,c'estdirebranche
mentunesubroutinenommeAJOUTE.Pourprciserversq uellesu

broutineondsiresediriger,sontiq uetteestprcise.Icien
l'occurrencec'estAJOUTEmaislenomim portepeu.Ilesttouta
faitpossibledemettredesnomsassezlongsetjenepeuxq ue
vousconseillerd'viterdansvoslistingslesnomsdugenreXY,
ZouencoreAX1etc...q uisontq uandmmemoinsexplicitesq ue
DEBUT_IMAGE,NEW_PALETTEoubienEND_GAME.
Maintenantsoyeztrsattentifs:lalecturedecetteinstr uction
denombreuseschosesvontsepasser.L'ordredemandedoncau68000
depoursuivrelalecturedesesinstructionsdansunsous
programmedontledbutsesituedansletube,enfacedel'ti
q uetteAJOUTE.Cependantils'agitbienicid'unsousprogramme.
Cecisupposeq u'unefoister min,le68000remonterapourexcuter
laligneq uisuitBSRAJOUTE,enl'occurrenceMOVE.L#0,D0.Ques
tion:commentle68000sauratiloremonter?Eneffetlepropre
d'unesubroutineestdepouvoirtreappeleplusieursfoisetde
plusieursendroitsdiffrentsetdepouvoirchaq uefoisrevenir
l'endroitmmeq uil'aappel.
Ehbienle68000vajustementutiliserlapilepournotercelieu
deretour.Cettepileabiensuruneadresse,osetrouvetelle
note?EnA7.Etoui,ceregistreunpeuspcialcorrespondla
pile.
MaisA7'alors?Etbienc'estaussiunepile,maisrser veau
modeSuperviseur.Ainsisinousfaisionstournerconjointement2
programmes,l'unenmodeutilisateuretl'autreensuper viseur,
chacunauraitsapile.
Avantd'excuterlaligneBSRAJOUTE,observonsattentivementles
registresd'adressesetlesregistresdedonnes.
Nousavonsvuq uelesregistres,q u'ilssoientdedonnesou
d'adresse,peuventcontenirdesnombrescodssur32bits.Nous
avonsvuaussiq u'ilexistait2sortesdenombrespourlamachine:
ceuxsetrouvantl'intrieurdu'tube'etceuxcetrouvant
l'extrieur,CONTREcetube,etindiq uantunesortededistance
parrapportaudbutdeceluici.
Cesecondtypedenombreestappeladresse.Orilesttoutfait
possibledestockerunnombrereprsentantuneadressedansun
registrededonnes(D0D7).Imaginonsmaintenantq uenousdevions
stockerlescored'unjoueurdanslejeuq uenousprogrammons.Ce
scorevaparexempletreplacdanslammoire(dansle'tube')
l'adresse$80792.
Maisq uesepasseratilsinoustransfronscetteadressepour
l'utilisergrceA1parexem ple?etbienA1vaprendrelavaleur
$80792.C'estbienjoli,maisceq uinousintresse,cen'estpas
a!Ceq uenousvoulonsmodifier,vrifieretc..c'estceq u'ily
aDANSletubecetteadresse.
Etbiennotredbuggeranticipeunpeucettedemande.Eneffet,
partantduprincipeq uelesnombresstocksenD0D7ouA0A6peu
ventreprsenterdesvaleursd'adresses,ilindiq uectdesre
gistres,ceq u'ilyadansletube,l'adresseindiq uedansle
registre.
Enceq uiconcernelesregistresdedonnes,MONSTafficheleur
droitelavaleurde8octetssetrouvantdansletubel'adresse
indiq uedansleregistre.Pourlesregistresd'adresse,cesont
10octetsq uisontindiq us.Vousremarq uezcertainementq u'en
faceduregistreD0(q uidoitcontenir$12345678sivousavezfait

correctementavancerleprogramme),MONSTn'aaffichq uedes
toiles.C'estnor malcarlenombre$12345678correspondunem
placementmmoireq uiseseraitaccessibleq u'avec305mgade
mmoire!!!MONSTindiq uedoncq u'ilnepeutpasatteindrecette
zonemmoireenaffichantdestoiles.
RegardonsmaintenantD1etA0.Lesnombressitusleurdroite
montrentlammechose,ceq uiestnor malpuisq ueles2registres
D1etA0sontremplisaveclemmenombre.Onditq u'ilspointent
surl'adresse$BD88.Allonsvoirenmmoirehistoiredevrifier
l'affichage.Activezlafentre3avecAlternate+3.Cellecinous
affichelecontenudelammoire,maisnoussommesloinde$BD88!
Demandonsdoncq uecetteadressesoitcelleduhautdelafentre
3,avecAlternate+A.Taponscetteadresse(BD88).Lafentre3se
rafficheavecenhautl'adresse$BD88.Danslacolonnededroite
nousvoyonslecontenudelammoire,dontnousavionsdjun
aperuavecl'affichagedroitedeD1etdeA0.C'estclair?
Ractivonslafentre1(alternate+1).Nor malementlapetitefl
chedoittoujourssetrouvezenfaceduBSRAJOUTE.Noterle
chiffresetrouvantdansleregistreA7(doncl'adressedela
pile)etobserverbienleschiffresdroitedeceregistre,tout
enfaisantControl+Z.
Leschiffresontchang!D'abordleregistreA7necontientplus
lemmenombre.Celuiq uis'ytrouveactuellementesteneffet
pluspetitq ueleprcdent.Notonsq uecettediffrenceestde4.
L'adressedelapileadonctdcrmentede4.Deplusdes
chiffresonttplacsdanslapile(onlesvoitdroitedu
registreA7).Or,regardezbienlenombreq uiestgauchede
l'instructionMOVE.L#0,D0denotreprogramme,c'estdire
l'adresselaq uelledevrarevenirle68000unefoislasubroutine
ter mine:c'estbiencenombreq uiatplacdanslapile.Ily
adoncem pilagedel'adressederetour,ceq uiexpliq uegalement
lechangementd'adressedelapilede4.Eneffetuneadresseest
codesur4octets!
Note:tantdonnq uenousparlonsdepile,onditplussouvent
q uelesdonnessontmisessurlapileetmoinssouventdansla
pile.
ContinuonsnotreprogrammeavecControl+Z.Noussommesmaintenant
danslasousroutine.ArrtezjusteavantRTS.C'estcetteins
tructionq uivanousfaire"remonter".ElleselitRETURNFROMSUB
ROUTINE.
ObservonsA7(savaleurmaisaussilecontenudu'tube'cette
adresse)etfaisonsunpas(Control+Z).L'adressederetourat
dpile,A7areprissonancienneadresseetnouspointonsmainte
nantsurMOVE.L#0,D0.
QuittezceprogrammeavecControl+C,effacezleettapezceluici.
MOVE.L#$12345678,D0
MOVE.L#$AAAAAAAA,D1
BSRAJOUTE
MOVE.WD2,D3
AJOUTEMOVE.W#$EEEE,D1
MOVE.W#$1111,D2
ADD.WD1,D2
RTS

Assemblezpuisdbuggez.Avancezpaspas:D0prendlavaleur
$12345678D1lavaleurAAAAAAAA,puisnouspartonsverslasubrou
tineAJOUTE.
MalheureusementcelleciutiliseD1etauretournousconstatons
q ueceluicinecontientplusAAAAAAAA.Eneffetlebranchement
unesubroutinenesauveriend'autreq uel'adressederetour,et
enassembleurlesvariableslocalesetautresbidouillesdelanga
gesvolusn'existentpas!C'estdoncnousdesauverlesregis
tres,etc'estceq uenousallonsfairemaintenant.
Note:leregistreA7contenantl'adressedusommetdelapile
(cetteadressevariantbiensravecl'empilageetledpilage),
onpeutconsidrercetteadressecommeundoigtindiq uantper p
tuellementlesommetdelapile.PourcetteraisonleregistreA7
estaussiappelpointeurdepile.Commetoujoursnousutiliserons
levocabulaireanglosaxon,etnousdironsStackPointer,enabr
gSP.Pourcetteraisonetparceq uel'usageenestainsi,nous
remplaceronsdsor maisA7parSP(q uineselitpas"ssp"mais
bienSTACKPOINTER!!!).
Imaginonsq uenousvoulionssauvegarderD0l'entredelasu
broutine:
Ilnefaudrapasoublierdelercuprerla
sor tie!DplaonsdonclecontenudeD0verslapile.Essayons
MOVE.LD0,SPetrflchissons:CecivamettrelecontenudeD0
dansA7,malheureusementcen'estpasceq uenousvoulonsfaire.
EneffetnousdsironsmettrelecontenudeD0DANSletube,
l'endroitindiq uparA7(doncSP).
CecivasefaireavecMOVE.LD0,(SP),lesparenthsesindiq uant
q uelasourcedel'oprationc'estl'intrieurdutube.
Effacezleprogrammeactuelettapezlesuivant.
MOVE.L#$12345678,D0
MOVE.LD0,(A0)
MOVE.WD0,(A1)
Assemblezpuiscommed'habitudedbuggez.D0prendlavaleur
$12345678,puisD0esttransfrdanssatotalit(causedu.L
q uiindiq ueq uel'oprationsepassesurunmotlong)l'adresse
q uiestnotedansA0,ensuitelepoidsfaibledeD0esttransfr
dansletubel'adressenoteenA1.Pourlevrifier,vous
pouvezactiverlafentre3etdemanderplacerl'adressenote
dansA0enhautdecettefentre,etvousconstaterezq u'effecti
vementlavaleurdeD0setrouvebiendansle'tube'.
Nousallonsdoncutilisercetypedetransfer tpoursauvegarderD0
Maisrflchissonsencoreunpeu.MOVE.LD0,(SP)vabienplacer
lecontenudulongmotD0dansletube,maissinousvoulonspla
ceruneautrevaleursurlapile,cellecivacrasernotrepre
mirevaleurcaravecMOVE.LD0,(SP)l'adresseindiq uparSP
(doncA7)nevapastremodifie,ceq uidevraittrelecas.
Nousallonsdoncraliserletransfertdiffremment(enfaitnous
allonsencoreamliorernotrevocabulaire,puisq uenousallons
parlermaintenantdetypeoudemoded'adressage).
Nousallonsfaire

MOVE.LD0,(SP)
C'estlemoded'adressageavecprdcrmentation.Derrirecevo
cabulairepompeuxsecachetouteunesuited'vnements.Enune
seulinstruction,nousdiminuonsl'adressedupointeurdepilede
4(puisq uedansnotreexemplenousvoulionstransfrerunlongmot
donc4octets),etnousplaonsenmmoirecetteadresselelong
motD0.
PourrcuprerD0,c'estdiredpiler,ilfaudrafaire:
MOVE.LD0,(SP)+
Commenousavionsdcrmentlepointeurdepilepourensuited
poserD0cetteadresse,nousrcupronsdoncD0sansoublieren
suitedemodifierlepointeurdepiledansl'autresens,pour
q u'ilretrouvesonancienneposition.Notonsq uedanslecaspr
sent,etsinousnouscontentonsderflchirtrssommairement,
ilauraittpossibledesauverD0parMOVE.LD0,(SP)etdele
rcuprerparMOVE.L(SP),D0.C'estcomptersanslefaitq uela
pileestunrservoircommunbeaucoupdechoses.Ilfautdoncde
prfrencejouerchaq uefoislejeud'unempilagecorrectetr
flchimaisaussid'undpilage'collant'parfaitementavecl'em
pilageprcdent.
Vrifionstoutcelaavecl'exemplesuivant:
MOVE.L#$12345678,D0valeurdansD0
MOVE.W#$AAAA,D1valeurdansD1
MOVE.LD0,(SP)sauveD0.Lsurlapile
MOVE.WD1,(SP)idemD1maisenword
MOVE.L#0,D0remetD00
MOVE.W#0,D1etD1aussi
MOVE.WD1,(SP)+rcupreD1(word)
MOVE.LD0,(SP)puisD0
AssemblezpuisfaitesdfilerceprogrammepaspassousMONST.
Notezplusieurschoses:toutd'aborddescommentairesontt
ajoutsausource.Ilsuffitq ueceuxcisoientsparsdesop
randespourq uel'assembleursacheq u'ils'agitdecommentaires.
Sivousdsireztaperunelignedecommentaires(c'estdireq ue
surcelleciiln'yaurariend'autreq uececommentaire),vous
devezlefaireprcderducaractretoileoud'unpointvirgule.
Secondechose,nousavionsem pilD0puisD1,ensuitenousavons
dpilD1puisD0.Ilfauteneffetbienfaireattentionl'ordre
etauxtaillesdeceq uenousempilons,afindepouvoirdpiler
lesmmestailles,dansl'ordreinversedel'empilage.
Voiciundernierexemple.
MOVE.L#$12345678,D0
BSRAJOUTEsautverssubroutine
MOVE.LD0,D1transfer t
AJOUTEMOVE.LD0,(SP)sauved0.lsurlapile
MOVE.W#8,D0
MOVE.W#4,D1
ADD.WD0,D1
MOVE.L(SP)+,D0
RTS
AssemblezpuissuivezledroulementsousMONSTentudiantbien
ledroulement.Vousvoyezbienq ueleBSRsauvel'adressedere
toursurlapile,puisq ueD0etmispardessuspourtreensuite

rcupr.Ensuitec'estl'adressederetourq uiestrepriseetle
programmeremonte.
Maintenant,provoq uonsuneerreur,unetoutepetiteerreurmais
q uiserafatalenotreprogramme.AulieudercuprerD0parun
MOVE.L(SP)+,D0,commettonsunefautedefrappeettaponsla
placeMOVE.W(SP)+,D0.
Assemblezetsuivezpaspas.AumomentdelasauvegardedeD0,
cesontbien4octetsq uivonttreplacssurlapile,modifiant
cellecid'autant.Malheureusementlarcuprationnevaremo
difiercettepileq uede2octets.Aumomentol'instr uctionRTS
vaessayerdercuprerl'adressederetour,lepointeurdepile
serafauxde2octetsparrapportl'endroitosetrouverelle
mentcetteadressederetour,etceluicivasefaireune
adressefausse.Enconclusion:prudenceetrigueur!!!!!!
Nousvenonsdoncdevoirq uelapiletaitutiliseparle68000
pourcertainesinstr uctions,etq u'elletaitbiencommodecomme
sauvegarde.
Ilestaussipossibledel'utiliserpourtransmettredesdonnes,
c'estceq uenousallonsvoirpourconclurecechapitre.
Problme:NotreprogrammeprincipalutiliselesregistresA0A6
etD0D6.Ilvaappelerunesubroutinedestineadditionner2
nombresetretournerlersultatdansD7.Ilfaudradoncutili
ser2registresparexempleD0etD1pourtravaillerdansnotre
routine,etdonclessauvegarderl'entredecelleci.
Voiciledbutduprogramme.
MOVE.L#$11111111,D0
MOVE.L#$22222222,D1
MOVE.L#$33333333,D2
MOVE.L#$44444444,D3
MOVE.L#$55555555,D4
MOVE.L#$66666666,D5
MOVE.L#$77777777,D6
Les7premiersregistressontrem plisavecdesvaleursbidons,
justepournousper mettredevrifierleursventuellesmodifica
tions.
Maintenantilfautplacerles2nombresq uenousdsirionsaddi
tionner,dansunendroittelq u'ilspourronttrercuprsparla
routined'addition.Plaonsdoncces2nombressurlapile.
MOVE.L#$12345678,(SP)
MOVE.L#$00023456,(SP)
BSRAJOUTEetenroute!
Rdigeonsmaintenantnotresubroutine,afindesuivrel'ordrede
travaildu68000.
Deq uoiauronsnousbesoindanscetteroutine?
DeD0etdeD1q uivontrecevoirlesnombresempilsetq ui
vontnousser viraucalcul.Ilvanousfalloirgalementunregis
tred'adresse.Eneffet,lorsq uenousallonsdpilernousallons
modifierlepointeurdepile,ornousvenonsd'effectuerunBSRle
68000adoncempill'adressederetoursurlapile,etmodifier
cellecivacompromettreleretour!Nousallonsdonccopier

l'adressedelapiledansA0,etutilisercettecopie.
Note:j'aidcidd'utiliserD0,D1etA0maisn'importeq uelau
treregistreauraittoutaussibienconvenu.
Commenonsdoncparsauvernos3registres.
Celapourraitsefairepar:
MOVE.LD0,(SP)
MOVE.LD1,(SP)
MOVE.LA0,(SP)
Note:jerappelleq uecelaselitmovelong!
Maisle68000possdeuneinstructiontrsutiledansunpareil
cas,q uiper metdetransfrerplusieursregistresd'uncoup.
Nousallonsdoncfaire:
MOVEM.LD0D1/A0,(SP)
Ceq uiselit:movemultipleregisters.
SinousdevionstransfrerdeD0D5nousaurionsfait:
MOVEM.LD0D5,(SP)
et,pourtransfrertouslesregistresd'unseulcoup:
MOVEM.LD0D7/a0A6,(SP)Compris?
Sauvonsmaintenantl'adressedelapiledansA0.Commec'est
l'adresseq u'ilfautsauveretnonpaslecontenu,celasefait
par:
MOVE.LA7,A0transfertduregistreA7versA0
Maintenantnousallonsrcuprerles2nombresq uenousavionsem
pilavantl'instructionBSR.
Imaginonsceq uis'estpass.(AceproposjevousconseilleTRES
fortementdevousaiderd'unpapieretd'uncrayon.N'hsitezpas
criresurcescours.Cesontlesvtresetjenelesrclamerai
pas!
Faireunpetitdessinoudeplacerdespicessurvotrebureau
pourvousaidercomprendreestuneexcellentechose.Biensou
ventlesmanipulationsdemmoireonttendancedevenirabstrai
tesetunpetitdessinarrangebiendeschoses!)
Nousavonsdcalde4octetsleSTACKPOINTER,puisnousyavons
dpos$12345678.Maisdansq uelsensavonsnousdcalceSP?
Versledbutdelammoire,versl'adresse0denotretubepuis
q uenousavonsfait(SP).Lepointeurdepileremontedoncle
longdutube.Nousavonsensuiterecommenclammechosepoury
dposer$23456.EnsuiteBSR,doncmmechosemaisralisautoma
tiq uementparle68000afind'ydposerl'adressederetour(4oc
tets).
Estcetout?Noncarunefoisrendudanslasubroutinenousavons
dpossurlapilelesregistresD0,D1etA0.Letransfertayant
teffectusurlefor matlongmot(MOVEM.L)nousavonstransfr

3fois4octetssoit12octets(bytes).
NotrecopiedeA7q uiestenA0nepointedoncpassurnos2nom
bresmaisbeaucoupplusloin.Lenombreq uenousavonsplacen
secondsurlapileestdonc16versledbutdutube(faitesle
calcul:1BSR,+12bytesdesauvegardecelafaitbien16bytes)et
lenombreplacenpremiersurlapilesuitsoncopainetse
trouvedonc20bytesd'ici,envertutoujoursduprincipedela
pile:ledernierentr,c'estlepremiersor ti.
Nouspouvonsdoncdireq ue$23456estA0dcalde16etq ue
$12345678estA0dcalde20.
Pourrcuprerces2nombresplusieursactionssontpossibles:
1)ajouter16l'adressedeA0puisrcuprer.
Uneadditiond'adressesefaitparADDA(addadress).
Nousfaisonsdonc
ADDA.L#16,A0
A0pointedoncmaintenantsur$23456,rcupronsdonccenombreet
profitonsdumoded'adressagepouravancerl'adresseindiq uedans
A0etainsitoutdesuitetreprtpourrcuprerl'autrenombre.
MOVE.LA0)+,D0
L'adresseayanttaugmentenouspouvonsdoncrcuprerla
suite:
MOVE.L(A0)+,D1
2)Autremthode,utilisantunautremoded'adressage:
Lamthodeprcdenteprsenteuninconvnient:aprsleADDA,A0
estmodifietsinousvoulionsgardercetteadresse,ilaurait
fallulesauvegarder.
OubiennousaurionspuajouterledcalageA0,rcuprerles
donnesetensuiteretirerledcalageA0pourq u'ilretrouve
sonttatdedpart.
Autremthodedonc,indiq uerdansl'adressageledcalageappli
q uer.Celasefaitpar:
MOVE.L16(A0),D0
MOVE.L20(A0),D1
Celaper metdepointersurle16meoctetpartirdel'adresse
donneparA0etensuitedepointersurle20meparrappor tA0.
Dansles2cas,A0n'estpasmodifi.
Voillelistingcompletdecetexem ple.
MOVE.L#$11111111,D0initialisationdeD0
MOVE.L#$22222222,D1idem
MOVE.L#$33333333,D2idem
MOVE.L#$44444444,D3idem
MOVE.L#$55555555,D4idem
MOVE.L#$66666666,D5idem
MOVE.L#$77777777,D6idem
MOVE.L#$12345678,(SP)passagenombre1danslapile
MOVE.L#$00023456,(SP)passagenombre2danslapile
BSRAJOUTEetenroute!
MOVE.LD7,D0transfer tdursultatpour

voir..
*notresubroutine
UTEMOVEM.LD0D1/A0,(SP)sauvegarde
MOVE.LA7,A0copiedeSPenA0
MOVE.L16(A0),D0rcupre23456etlemetenD0
MOVE.L20(A0),D1rcupre12345678enD1
ADD.LD0,D1addition
MOVE.LD1,D7transfertdursultat
MOVEM.L(SP)+,D0D1/A0rcupration
RTSetretour
*Note:ceprogrammen'ayantpasdefin'nor male',
lorsq uevous*serezrenduauretourdelasubroutine
c'estdireaprslaligne"MOVE.LD7,D0",q uittez
leavecControl+C,AssemblezetsuivezbienTOUTle
droulement.
Biensr,ilauraittpossibledefairecelatoutdiffremment.
ParexemplenousaurionspuviterdetravailleravecA0.Eneffet
16(A0)et20(A0)nemodifiantpasA0,ilauraittplussimplede
faire16(A7)et20(A7)aulieuderecopierd'abordA7enA0.De
mmeilauraittpossibledetransfrer$23456directementenD7
et$12345678enD1puisdefaireADD.LD1,D7afind'viterla
sauvegardedeD0(q uiauraittinutilise),etletransfertD1
versD7q uin'auraitalorspaseulieud'tre.Demmenousau
rionspuretournerlersultatparlapileaulieudelefairepar
D7.
Beaucoupdevariantespossiblesn'estcepas?
Pourter miner,unpetitexercice.Relancercepetitprogrammeet
analysezPARFAITEMENTTOUTceq uis'ypasse.Quelq uechoseneva
pas!Jevousaideendisantq u'ils'agitbiensrdelapile.
Cherchezetessayezdetrouvercommentfairepourarrangera.
Larponseseraaudbutduprochaincoursmaisessayezd'imaginer
q uec'estvotreprogrammeetq u'ilnemarchepasetcherchez!!!
Bon,lecourssurlapileseter mineici.Cefutunpeulongmais
jepense,pastropcom pliq u.Relisezle,carlapileestuntruc
dlicatdontnousallonsnousservirTRESabondammentdanslepro
chaincours.Sivousavezpeuprstoutcomprisjusq u'iciilest
encoretempsderattraperletem psperduetdetoutreprendreau
dbut,carilfautavoirPARFAITEMENTtoutcom prisetpaspeu
prs!
Afindevousremonterlemoral,jevoussignaleq uevoustespres
q uelamoitiducours...

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*

**
*parLeFroceLapin(from44E)*
**
*Coursnumro7*
**
******************************************************************
Nousabordonsmaintenantleseptimecoursdelasrie.Latotali
tducourstanten2sries(enfinl'heureojetapecesli
gnesc'estceq uiestprvu!),celuiciestledernierdelapre
mire!
Alafindeceluicietsivousaveztrsattentivementettrs
scr upuleusementsuiviles6coursprcdents,vousdevrieztre
capabled'afficherdesimages,sauverdesfichiersetc...
Maistoutd'abordrevenonsnotrepileetlaq uestionducours
prcdent.Avezvoustrouvl'erreur?
EhbienregardezlavaleurdeA7avantd'yempiler$12345678et
$23456,etcomparezlavaleurlasor tieduprogramme.Malheur!
cen'estpaslamme!Nor mal,sinouscomptonslesempilageset
lesdpilages,nousnousrendonscompteq uenousavonsempil8
octetsdeplusq uenousn'avonsdpil.Eneffet,commenousavons
rcuprnos2nombresensauvegardantaupralableA7dansA0,
nousn'avonspastouchA7aumomentdelarcupration.
Heureusementd'ailleurscarleretourdelaroutineauraittmo
difi!
Partantduprincipededpilagedansl'ordreinverse,ilnousfaut
donccorrigerlapileunefoisrevenudelasubroutine.Commenous
avonsempilenfaisant(SP)ilfautajouterpourq uelapilere
deviennecommeavant.Ayantem pil2nombresde4octetschacuns,
nousdevonsajouter8octetsl'adressedelapilepourlacorri
gercommeilfaut.Nousavonsdjvucommentaugmenterune
adresse,avecADDA.
IlconvientdoncderajouterjusteaprslaligneBSRAJOUTEune
additionsurSP,enfaisantADDA.L#8,SP(q uiselitADDADRESS
LONG8STACKPOINTER)
Unappelunesubroutineenluipassantdesparamtressurla
pileseradonctypiq uementdugenre:
MOVE.W#$1452,(SP)
MOVE.L#$54854,(SP)
MOVE.L#TRUC,(SP)
BSRBIDOUILLE
ADDA.L#10,SP
Nouspassonsleworddevaleur$1452danslapile(modifiedonc
de2octets),lelongmotdevaleur$54854danslapile(modifie
de4octets),l'adresserepreparlelabelTRUCdanslapile
(modifiede4octets)puisnouspartonsversnotresubroutine.Au
retourcorrectionde2+4+4=10octetsdustackpointerpourrevenir
l'tatd'origine.
Lapilepossdeunepetiteparticularit.Nousavonsvudansles
coursprcdentsq uele68000taitunmicroprocesseur16/32
bits.Illuiesttrsdifficiled'accderdesadressesimpaires.
Orsinouscommenonsempilerdesoctetsetnonplusuniq uement
deswordsoudeslongwords,leStackPointerpeuttrsfacilement

pointersuruneadresseimpaire,ceq uirisq uedeplanternotre


machine.
Taperleprogrammesuivante:
MOVE.L#$12345678,D0
MOVE.LD0,(SP)
MOVE.BD0,(SP)
MOVE.L#$AAAAAAAA,D1
AssemblezpuispassezsousMOnstetavancezpaspasenobservant
bienl'adresseduSP(donccellevisibleenA7).
Nousconstatonsq uelepointeurdepilesemodifiebiende4lors
q uenousfaisonsMOVE.LD0,(SP)maisq u'ilsemodifiede2
lorsq uenousfaisonsMOVE.BD0,(SP)alorsq uenouspouvions
nousattendreunemodificationde1!Leserreursprovoq uspar
desadressesimpairessontdonccartesaveclapile.Merci
MonsieurMOTOROLA!
(Note:ceciestunepar ticularitdesregistresA7etA7'.Sinous
avionstravaillavecA3parexem pleaulieudeSP,celuiciau
raiteuuneadresseim paire.C'estletyped'usageq uiestfaitde
lapileq uiaconduitlesgensdeMOTOROLAcrercettediff
rence.)
A bordonsmaintenantl'ultimechapitredecettepremiresrie:
LES'TRAP'
UneinstructionTRAPestcomparableuneinstructionBSR.Elle
agitcommeunbranchementversuneroutine.Cependant,contraire
mentl'instructionBSRq uidemandetrecompltepar
l'adresse,c'estdirelelabelper mettantdetrouverlaroutine,
l'instructionTRAPsecontented'unnumro.Cenumropeutvarier
de015.Lorsq uele68000rencontreuneinstr uctionTRAPilre
gardesonnumroetagitenconsq uence.Vousvousrappelerdes
toutpremierscours,danslesq uelsnousavionsparlduprincipe
utilisparle68000lorsq u'iltrouvaitlabitT(modetrace)du
SR(statusregister)1?Sautdanslepremierkilodemmoire
(tabledesvecteursd'exceptions),recherchedel'adresse$24,on
regardedansletubecetteadresse,onytrouveunlongmot,ce
longmotc'estl'adressedelaroutineetonfoncecetteadresse
excutercetteroutine.
Etbienregardezlafeuilleq uidonnelalistedesvecteursd'ex
ceptions,etjetezuncoupd'oeilauxvecteurs3247.Lesvoil
nosvecteursTRAP!!!Lorsq uele68000rencontreparexemple
l'instructionTRAP#8,ilfoncel'adresse$0A0pourytrouver
l'adressedelaroutineq u'ildoitexcuter.
Aprioricelasemblebiencompliq upourpasgrandchose!Eneffet
ilfautprvoirsaroutine,lamettreenmmoire,puisplacerson
adressedanslevecteur.Pluscompliq uq u'unBSR,surtoutq ueBSR
REGLAGE_CLAVIERetplusparlantq u'unTRAP#5ouunTRAP#12!!!
L,nousretournonsencoreenarrire(jevousavaisbienditq ue
TOUTtaitimportantdanscescours!!!!!)pournoussouvenirdela
notiondemodeUtilisateuretdemodeSuper viseur.LeSuper viseur
accdetoutelammoireettouteslesinstructions,pasl'Uti
lisateur.
S'ils'agitd'interdirel'Utilisateurdesinstructionsassem

bleurtellesq ueRESET,notreUtilisateurneserapastropgn
parcontrec'estenceq uiconcernelammoireq uetoutvatrs
srieusementsecom pliq uer.Voulezvousconnatrelarsolution
danslaq uellesetrouvevotremachine?C'estfacile,c'estnot
l'adresse$FF8260.
Vousvoulezchangerlapalettedecouleur?Riendeplussimple,
elleestnoteen$FF8240.Im primerunpetittexte?Al'aise,il
suffitd'employerlesregistresdecommunicationsversl'extrieur
duchipson(tonnantn'estcepas!).C'estsituen$FF8800et
$FF8802.
Pardon???Quoi???VoustesUtilisateur???Ahbon....Parceq ue
c'estgnant...Toutescesadressessontsituesdanslazonem
moireuniq uementaccessibleauSuper viseur.....
L'Utilisateursetrouvebiencoincetlespossibilitss'entrou
ventdrlementrduites.Heureusement,lesTRAPsontl!!!Grce
cesystmel'utilisateurvaavoiraccsdeszonesq uiluisont
nor malementinterdites.Pasdirectement,biensr,maisgrceau
superviseur.Lesuper viseura,eneffet,fabriq udesroutines
q u'ilaplacenmmoireetdontlesadressessontdanslesvec
teursTRAP.Cesroutinessontexcutsenmodesuperviseuretta
penttourdebrasdansleszonesmmoiresprotges.Lorsq ue
l'UtilisateurveutlesutiliserillesappelleparlesTRAP.La
protectionestdoncbienassurecarl'Utilisateurnefaitq ued
clencheruneroutinedontgnralementilneconnatq uelespara
mtresluipasseretletypedemessageq u'ilauraenrponse.
C'estdecettemanireq uenouspouvonsaccderausystmed'ex
ploitationdenotreAtari!!!
Petitrappel:q u'estceq u'unsystmed'exploitation?
Lepremierq uirpondc'estGEMseprendunepairedeclaq ues.GEM
c'estl'interfaceutilisateuretpaslesystmed'exploitation.
Lesystmed'exploitation(ouOperatingSystem)dansnotrecas
c'estTOS.LaconfusionentreinterfaceUtilisateuretsystme
d'exploitationvientdufaitq uecertainssystmesd'exploitation
intgrentgalementuninterfaceutilisateur:c'estparexemplele
cassurPCavecMSDOS.
Lesystmed'exploitationc'estunensemblederoutineper mettant
d'exploiterlamachine.Cesmultiplesroutinesper mettentpar
exempled'afficheruncaractrel'crand'ouvrirunfichier,de
for materunepistededisq uette,d'envoyerunoctetsurlaprise
MIDIetc...Enfaittousles'trucs'debase,maisjamaisdecho
sescompliq ues.Uneroutinedusystmed'exploitationneper met
trapas,parexemple,delirelecontenud'unfichiersetrouvant
surladisq uette.Eneffetcecidemandeplusieursoprationsavec
chaq uefoisdestests:
Ouverturedufichier:existetil,
ladisq uetten'estellepasabmeetc...
positionnementdupointeurdanslefichier:lepositionnement
s'estilbienpass?
Lecture:N'astonpasessaydeliretropd'octetsetc,etc....
Ilfaudradoncbiensouventplusieursappelsdesroutinesdiff
rentespourraliserceq uel'onveut.
Ilesttoujourspossibledesepasserdusystmed'exploitation,

spcialementlorsq uel'onprogrammeenassembleur.Eneffetl'en
sembledesroutinesdel'OS(abrviationdeOperatingSystem)est
destinunusagecommun,toutcommed'ailleurslesroutinesde
l'interfaceUtilisateur.
Ceciexpliq uebiensouventlarcrituredetoutespetitespar
tiesdusystmeafinden'utiliserq uelestrictncessaire.La
routinedegestionsourisduGEMparexem pledoits'occuperdela
sourismaisaussiduclavier,duMIDIetdujoystick.Pourunjeu
ilpeuttreintressantdercrirecetteroutineafindegrer
uniq uementlejoysticketdoncd'avoiruneroutineq ui'colle'
plusaubesoin.
Nousverronsbeaucoupplustardcommentregarderdanslesystme
d'exploitationafindepouvoirparlasuiteralisersoimmeses
routines.Avantcela,utilisonssimplementcesystme!
Nousallonsdoncl'appelergrceauxTRAPs.
4trapssontaccessibles'nor malement'dansleST:
TRAP#1routinesduGEMDOS
TRAP#2routinesduGEM
TRAP#13routinesduBIOS
TRAP#14routinesduBIOStendu(eXtendedBiosdoncXBIOS)
GEMDOS=Graphicenvironmentmanagerdiskoperatingsystem
GEM=Graphicenvironmentmanager(sedcoupeparlasuiteen
AES,VDIetc..Unchapitredelasecondesrieyseraconsacre)
BIOS=BasicInputOutputSystem
XBIOS=ExtendedBasicInputOutputSystem
LesautresvecteursTRAP(0,312et15)sont,bienentendu,ac
tifsmaisaucuneroutinen'yestaffecte.Nouspouvonslesutili
serpourpeuq uenousymettionsavantnosroutines,ceq uisera
l'objetdupremiercoursdelasecondesrie.
Nousconstatonsq ueleTRAP#1per metd'appelerleGEMDOS.Oril
n'yapasq u'uneroutineGEMDOSmaisunebonneq uantit.Deplus
cesroutinesdemandentparfoisdesparamtres.Commentfairepour
lestransmettre?Etbientoutsimplementparlapile!!!
Taperleprogrammesuivant:
MOVE.W#65,(SP)
MOVE.W#2,(SP)
TRAP#1
ADDQ.L#4,SP
MOVE.W#7,(SP)
TRAP#1
ADDQ.L#2,SP
MOVE.W#0,(SP)
TRAP#1
ADDQ.L#2,SP
Assemblezceprogrammemaisneledbuggezpas,lancezlepar
Alternate+X.VousvoyezapparatreunAsurl'crandevotreST.
AppuyersurunetoucheethopvousrevenezdansGENST!Analysons
ceq uenousavonsfaitcarldetrstrsnombreuseschosesse
sontpasses,etavouonsle,nousn'avonsrienvu!!!!!
Toutd'abordnousavonsappellafonctionCconout()duGemdos.
NousavonsappelleGemdosavecleTRAP#1,maiscetteinstruc

tionnousaenvoyversunensemblederoutine,toutesappartenant
auGemdos.Pourindiq uercetteroutineprincipaleversq uelle
subroutineduGemdosnousdsironsaller,nousavonspasslenu
mrodecettesubroutinedanslapile.Partanttoujoursduprin
cipedudernierentrpremiersorti,ilestbienvidentq uece
numrodoitsetrouverempilendernierafindepouvoirtred
pilenpremierparlaroutineprincipaledeGemdos,afinq u'elle
puisses'orienterverslasousroutineq uinousintresse.La
fonctionCconoutayantlenumro2,nousavonsdoncfaitMOVE.W
#2,(SP).(voirplushautpourserappelerq ue2peuttrsbien
trecodsurunoctetmais,commenoustravaillonsverslapile,
ilserapriscommeunworddetoutesfaons).
MaintenantleGemdosayanttrouv2commeparamtre,s'oriente
verscetteroutineaunombarbare,q uiapourfonctiond'afficher
uncaractresurl'cran.Unefoisrenduverscetteroutine,le
Gemdosvacherchersavoirq uelcaractreafficher.C'estpour
celaq uenousavonsplaclecodeASCIIdececaractresurla
pileavecMOVE.W#65,(SP).
Note:Pourl'assembleur,lecodeASCIIpeuttreremplacparla
lettreellemme.NousaurionsdoncpucrireMOVE.W#"A",(SP)
sansoubliertoutefoislesguillemets!
DeretourduTRAPnousdevonscorrigerlapile,afind'viterle
problmeq uiafaitl'objetdudbutdececours.Nousavionsem
pilunworddonc2octetsetensuiteunautrewordsoitautotal
4octets.Nousallonsdoncajouter4auSP.Nousprofitonsici
d'uneoprationd'additionplusrapideq ueADDA,ADDQq uiselit
addq uick.Cetteadditionestautorisejusq u'8inclus.Iln'est
paspossibleparexem pledefaireADDQ.L#12,D1
Ensuitenousrecommenonslemmegenredechose,aveclafonction
7duGEMDOS(nommeCrawcin)q uiellen'attendaucunparamtre,
c'estpourq uoinouspassonsjustesonnumrosurlapile.Cette
fonctionattendunappuisurunetouche.Ayantpassunparamtre
surunword,nouscorrigeonsauretourduTRAPlapilede2.
Leprogrammeseter mineaveclafonction0duGEMDOS(Pter mo)q ui
librelammoireoccupeparnotreprogrammeetleter minepour
debon.Cetteroutinen'attendpasdeparamtre,nousnepassons
danslapileq uesonnumrodonccorrectionde2.Note:lacorrec
tiondepilepourlafonctionPter mon'estlq ueparsoucipda
gogiq ue.Cettefonctionter minantleprogramme,notredernire
instructionADDQ.L#2,SPneserajamaisatteinte!
Plusieurschosesmaintenant.D'abordnesoyezpastonnsdesnoms
bizarresdesfonctionsduGEMDOS,duBiosouduXbios.Cesontles
vritablesnomsdecesfonctions.Enassembleurnousnelesutili
seronspasdirectementpuisq uel'appelsefaitpasunnumro,mais
enCparexemplec'estainsiq uesontappelescesfonctions.Dans
lescoursd'assembleurdeSTMAG(dontlesvertuspdagogiq ues
sontplusq uedouteuses),nouspouvonslireq uelesnomsdeces
fonctionsonttchoisisauhasardetq uelafonctionMalloc()
parexem pleauraitpus'appelerMstroum ph().C'estridicule!
Chacundesnomsest,commetoujourseninfor matiq ue,l'abrviation
d'unexpressionanglosaxonneq uiindiq ueconcrtementlebutou
lafonction.AinsiMallocsignifieMemoryAllocation,cettefonc
tionduGEMDOSper metdoncderserverunepar tiedemmoire!!!
Malheureusementdenombreuxouvragespassesurce'dtail'etne
fournissentq uel'abrviation.
Cecin'em pcheq u'ilvousfautimprativementunelistedetoutes

lesfonctionsduGEMDOS,duBIOSetduXBIOS.Cesfonctionssont
dcritesdansleLivreduDveloppeur,danslaBiblemaisgale
mentdanslesdernirespagesdeladocduGFA3.
Note:dansladocduGFA,ilmanq uelafonctionGEMDOS32q uiper
metdepasserenSuper viseur.Cemoden'tantpourlemomentq ue
d'unintrtlimitpourvous,pasdepaniq ue,nousdcrironstout
celadanslasecondesrie.
Continuonspourlemomentavecdespetitsexemples.
Affichonsunephrasesurl'cranlaplaced'unlettre.
Cecivasefaireaveclaprogrammesuivant:
MOVE.L#MESSAGE,(SP)adressedutexte
MOVE.W#9,(SP)numrodelafonction
TRAP#1appelgemdos
ADDQ.L#6,SPcorrectionpile
*attented'unappuisurunetouche
MOVE.W#7,(SP)numrodelafonction
TRAP#1appelGEMDOS
ADDQ.L#2,SPcorrectionpile
*finduprogramme
MOVE.W#0,(SP)
TRAP#1
SECTIONDATA
MESSAGEDC.B"SALUT",0
Unenouveaut,lepassaged'uneadresse.Eneffetlafonction9du
gemdosdemandecommeparamtrel'adressedelachanedecaractre
afficher.NousavonsdoncdonnMESSAGE,q uiestlelabel,
l'tiq uetteservantreprerl'emplacementdansletubeose
trouvenotrephrase,toutcommenousavionsmisunetiq uette
AJOUTEpourreprernotresubroutine,danslecoursprcdent.
Cemessageestunesuitedelettres,toutescodessurunoctets.
Pourcetteraisonnousdisonsq uecettechaneestuneconstante
constitued'octet.Nousdfinissonsdoncuneconstanteenoctets:
DefineConstantByte,enabrgDC.BAttentioncecin'estpasune
instruction68000!C'estsim plementunenotationpourl'assem
bleurafindeluidire:
n'essayepasd'assembleracommeducodenor mal,cen'estq u'une
constante.Demmenousdfinissonsunezone.
Lafonction9duGEMDOSdemandeceq uelaphraseseter minepar
0,ceq uiexpliq uesaprsencelafin.
Ralisonsmaintenantunprogrammesuivantleschmasuivant:
affichaged'untextedeprsentationeninversevido;
cetextedemandesionveutq uitterouvoirunmessage
sionchoisitq uitter,byebye
sinononaffiche'coucou'etonredemandeetc...

Dtaillonsunpeuplus,entraduisantceprogrammeenpseudocode.
C'estainsiq uel'onnommelafaondeprsenterundroulement
d'oprationenlangageclairmaisdontl'organisationserapproche
djdelaprogrammation.
AFFICHE"QUITTER(Q)OUVOIRLEMESSAGE(V)?"
SIREPONSE=Q
VAAQUITTER
SIREPONSE=V
AFFICHE"COUCOU"
RETOURNEAAFFICHE"QUITTER...."
SIREPONSEDIFFERENTERETOURNEAAFFICHE"QUITTER..."
Parcommodit,celistingsetrouvesurunefeuillespare
(listingnumro1/Coursnumro7).
Toutd'abordaffichagedelaphraseq uiser virademenu,avecla
fonctionGemdos9.Cettephrasesetrouvel'tiq uetteMENU,al
lonslavoirpourladtailler.Nousremarq uonstoutd'abordq u'
ellecommencepar27.Aprsavoirregarddansunetabledecode
ASCII,nousnotonsq u'ils'agitducodeASCIIdelatoucheEscape.
Nouscherchonsdoncd'abordafficherEscape.Mais,commevousle
savezsrement,cecaractren'estpasim primable!
Impossibledel'afficherl'cran!
C'esttoutfaitnor mal!enfaitiln'estpasq uestionicid'af
ficherrellementuncaractre,maispluttdefaireappelun
ensemblederoutines,rpondantaunomdeVT52.Pourappelerces
routines,ilfautafficherEscape.Voyantcelalesystmesedit:
"Tiens,onchercheafficherEscape,c'estdoncenfaitq uel'on
chercheappelerleVT52".
L'mulateurVT52ragitdonc,maisq uedoitilfaire?etbien
pourlesavoirilvaregarderlalettreq uisuitEscape.Enl'oc
currenceils'agiticideEmajuscule.Regardezdanslesfeuilles
annexescettesriedecours,ilyenauneconsacreauVT52.
Nousvoyonsq ueEscapesuivideEeffacel'cran,c'estdoncce
q uivasepasserici.
Ensuiteiltaitditdansle'cahierdescharges'denotrepro
gramme,q ueleMENUdevaittreafficheninversevido.
ConsultonsdonclafeuillesurleVT52.Nousytrouvons:Escapeet
'p'minuscule=passeencritureinversevido.Justeceq u'il
nousfaut!Nousremettonsdonc27,"p"dansnotrephrase.
Troisremarq ues:
toutd'abordilfautremettrechaq uefoisEscape.Faire
27,"E","p"auraiteffacl'cranpuisauraitaffichp.
Seconderemarq ue,ilfautbienfaireladiffrenceentreleslet
tresmajusculesetleslettresminuscules.Escape+Eeffacel'cran
maisEscape+eactivelecurseur!!!
Troisimeremarq ue,onpeutreprsenterdanslelistingunelettre
parson'caractre'oubienparsoncodeASCII.
AinsisionveutafficherSalut,onpeutcrirelelistingcomme
ceci:
TXTDC.BSalut",0
oubiencommecela:

TXTDC.B83,97,108,117,116,0
Ilestdemmepossibledemlangerlesdonnesendcimal,en
binaire,enhexadcimaletlescodesASCII.Parexemplececi:
TXTDC.B65,$42,%1000011,"D",0
afficheraABCDsionutilisecette"phrase"avecGemdos9.
Cecivousserabienutilelorsq uevouschercherezafficherdes
lettresdifficilestrouversurleclavier.Pourle'o'trma,il
estpossibledefaire:
TXTDC.B"Abient",147,"tlesamis.",0
Note:J'espreq uedepuisledbut,iln'yenapasunseul
avoirluDC.B"dcb"!!!!Jevousrappelleq uecelaselitDefine
ConstantByte.
Continuonsl'explorationdenotreprogramme.Notrephraseefface
doncl'cranpuispasseeninversevido.Viensensuiteletexte
luimme:
QUITTER(Q)OUVOIRLEMESSAGE(V)?
EnsuiteunenouvellecommandeVT52pourrepasserenvidonor male,
puis2codesASCIIq ui,euxnonplus,nesontpasimprimables.Ce
sontlescodesderetourchariot.Lecurseurvadoncseretrouver
toutgauchedel'cran,uneligneplusbas.Enfinle0indiq uant
lafindelaphrase.
Unefoisle'menu'affich,nousattendonsunappuisurunetouche
aveclafonctionGemdosnumro7.CettefonctionrenvoidansD0un
rsultat.Cersultatestcodsurunlongmot,commececi:
Bits07codeASCIIdelatouche
Bits815miszro
Bits1623codeclavier
Bits2431Indicationdestouchesdecommutationduclavier
(shifts..)
Dansnotrecasnousnenousintresseronsq u'aucodeASCIIdela
toucheenfonce.Nousallonsdonccom parerleworddeD0aveccha
cundescodesASCIIq uenousattendons,c'estdireQ,q,Vetv.
Cettecomparaisonvasefaireavecunenouvelleinstruction:
Compare(CMP).CommenouscomparonsunwordnousnotonsCMP.W,q ue
nouslisonsCOMPAREWORD.NouscomparonsQavecD0(nousaurions
pumarq uerCMP.W#81,D0puisq ue81estlecodeASCIIdeQ).
Cettecomparaisoneffectue,ilfautlatester.Nousabordonsici
lespossibilitsdebranchementdpendantd'unecondition,c'est
direlesbranchementsconditionnels.
ChacunedecesinstructionscommenceparlalettreB,signifiant
BRANCH.Enclair,cesinstructionspeuventtreluescomme:
Vatelendroitsi...
Maissiq uoi???
Ehbienplusieursconditionssontdisponibles,q uel'onpeutre
grouperen3catgories:
D'abordunecatgorieq uiragitl'tatd'undesbitsduStatus

Register:
BCCBranchifcarryclear(bitderetenue0)
BCSBranchifcarryset(bitderetenue1)
BNEBranchifnoteq ual(bitdezro0)
BEQBranchifeq ual(bitdezro1)
BVCBranchifoverflowclear(bitdedpassement0)
BVSBranchifoverflowset(bitdedpassement1)
BPLBranchifplus(bitngatif0)
BMIBranchifminus(bitngatif1)
Unesecondecatgorie,ragissantlacom paraisondenombressans
signe.
BHIBranchifhigher(branchesisuprieur)
BLSBranchiflowerorsame(infrieurougal)
(onpeutaussiremettreBEQetBNEdanscettecatgorie)
UNetroisimecatgorie,ragissantlacomparaisondenombres
avecsigne.
BGTBranchifgreaterthan(sisuprieur)
BGEBranchifgreateroreq ual(sisuprieurougal)
BLTBranchiflowerthan(sipluspetitq ue)
BLEBranchifloweroreq ual(sipluspetitougal)
(onpeutencoreremettreBEQetBNE!!!)
JesuisprofondmentdsolpourlesgensdeMICROAPPLICATION(Le
LangageMachinesurST,laBible,leLivreduGEMetc...)ainsi
q uepourlejournalisteq uicritlescoursd'assembleurdans
STMAG,maislesbranchementsBHSetBLO,malgrlefaitq u'ils
soientacceptspardenombreuxassembleurs,N'EXISTENTPAS!!!!!
Ilestdoncim possibledelestrouverdansunlistingassembl,
l'assembleurlesconvertissantoubienlesrejetant.
Cetensembledebranchementconditionnelconstitueunensemblede
commandedutypeBcc(branchconditionnaly)
Poursuivonsnotrelenteprogressiondanslelisting...
Lacomparaisonesteffectue,testonsla:
CMP.W#"Q",D0estcelalettre'Q'?
BEQQUITTERbranchifeq ual'q uitter'
C'estdire,sic'estgal,sauterl'tiq uetteQUITTER.
Sicen'estpasgal,leprogrammecontinuecommesiderien
n'tait,ettombesurunnouveautest:
CMP.W#"q",D0estceqminuscule?
BEQQUITTERbranchifeq ualq uitter
Nouscomparonsensuite'V'majusculeetencasd'galit,nous
sautonsAFFICHAGE.Viensensuiteletestavec'v'minuscule.L,
c'estl'inverse:Sicen'estpasgal,retouraudbutpuisq ue
touteslespossibilitsonttvues.Parcontre,sic'est'v'q ui
atappuy,leprogrammecontinuerasansremonterDEBUT,et
tomberadeluimmesurAFFICHAGE.
L'affichagesefaitclassiq uementavecGemdos9.Cetaffichage
ter min,ilfautremonteraudbut.Ici,pasbesoindetestcaril

fautabsolumentremonter.Nousutilisonsdoncunordredebranche
mentsanscondition(inconditionnel)q uiselitBRANCHALWAYS
(branchementtoujours)etq uis'critBRA.
Encasdechoix'Q'ou'q',ilyasautQUITTERetdoncla
fonctionGemdos0q uiter mineleprogramme.
N'hsitezpasmodifierceprogramme,essayerd'autrestests,
joueravecleVT52,avantdepasserausuivant.
("Quelq uesheurespassent..."In('LemanoirdeMortevielle')
acte2scneIII)
Prenonsmaintenantlelistingnumro3.Noustudieronslenumro
2enderniercausedesalongueurunpeusuprieure.
Lebutdecelistingestderaliserunaffichageunpeucompara
bleceluideshorairesdanslesgaresoulesaropor ts:chaq ue
lettren'estpasaffiched'uncoupmais'cherche'dansl'al
phabet.
D'abordeffacementdel'cranenaffichantEscapeet'E'avec
Gemdos9:rienq ueduclassiq uepourvousmaintenant!
Ensuitecelasecompliq ue.Nousplaonsl'adressedeTXT_FINAL
dansA6.Regardonsceq u'ilyacettetiq uette'TXT_FINAL':
nousytrouvonslaphraseafficher.
ObservonsmaintenantTRESattentivementceq uisetrouve
l'adresseTXT.Nousyvoyons27,"Y",42.Enregardantnotre
feuilleduVT52nousvoyonsq uecelacorrespondunefonction
plaantlecurseurunendroitprcisdel'cran.Nousconstatons
aussi2choses:
1)Lacommandeestincomplte
2)Unephraseafficheparexem pleavecgemdos9,doitseter miner
par0,ceq uiicin'estpaslecas!
Eneffet,laphraseestincom pltesionsecontentedelire
cetteligne.Jetonsuncoupd'oeilsurlalignesuivante.Nous
ytrouvons42,q uiestpeuttrelasuitedelacommande(nous
avonsdoncescape+Y+42+42),etuneligneencoreplusbasnous
trouvonsdeuxzros.Nouspouvonsremarq uergalementq uesila
phrasecommencel'tiq uetteTXT,lasecondelignepossde
galementunetiq uette('COLONE')ainsiq uelatroisimeligne
('LETTRE').
Imaginonsmaintenantq uenousayonsunelettrelaplacedupre
mierzroenfacedel'tiq uetteLETTRE.Sinousaffichonscette
phrasenousverronss'affichercettelettresurla10mecolonne
dela10meligne(rvisezlacommandeEscape+Ysurlafeuilledu
VT52).
Imaginonsensuiteq uenousajoutions1auchiffresetrouvant
l'tiq uetteCOLONNEetq uenousrecommencionsl'affichage.Nous
verrionsnotrelettretoujours10meligne,maismaintenant11me
colonne!
C'estceq uenousallonsfaire,encompliq uantd'avantage.Plaons
lecodeASCII255(c'estlecodemaximaleautorispuisq uelesco
desASCIIsontcodssurunbyte)laplacedupremierzrode
l'tiq uetteLETTRE.NousfaisonscelaparMOVE.B#255,LETTRE.
Ajoutons1ensuiteauchiffredescolonnesavecADD.B#1,COLONNE
ensuiteposonsnouslaq uestionsuivante:lalettreq uejevais
afficher(actuellementdecodeASCII255),estcelammeq ue

celledelaphrasefinale?Pourlesavoirilfautprlevercette
lettredecettephrase.Commenousavonsplacl'adressedecette
phrasedansA6,nousprlevonstoutenfaisantavancerA6pour
pointersurlasecondelettre.MOVE.B(A6)+,D6
Etsilalettreq uenousvenonsdeprlevertaitlecodeASCII0?
Celavoudraisdoncdireq uenoussommeslafindelaphraseet
doncq u'ilfauts'enaller!!!Nouscom paronsdoncD6q uicontient
lecodeASCIIdelalettre,avec0.
CMP.B#0,D6
BEQFINsic'estgal,byebye!
Ouf!Cen'estpasladernirelettre;nouspouvonsdoncafficher
notrephrase.CelasefaitavecGemdos9,enluipassantl'adresse
dudbutdelaphrasedanslapile.Cetteadressec'estTXTetle
Gemdosafficherajusq u'ceq u'ilrencontre0.Ilafficheradonc
27,"Y",42,43,255,0.Cecitantfait,comparonslalettreq uenous
venonsd'afficher,etq uisetrouveenfacedel'tiq uetteLETTRE
aveccelleq uisetrouvedansD6etq uiatprlevedansla
phrasemodle.
Sic'estlamme,nousremontonsjusq u'l'tiq uettePROCHAINE,
nouschangeonsdecolonne,nousprlevonslalettresuivantedans
laphrasemodleetnousrecommenons.Maissicen'estpasla
mmelettre?
Etbiennousdiminuonsde1lecodeASCIIde'LETTRE'(SUB.B
#1,LETTRE)etnousraffichonsnotrephraseq uiestmaintenant
27,"Y",42,43,254,0
C'estcompris?
Laaussic'estunebonnetudeq uivousper mettradevousen
sor tir.
N'abandonnerpascelistingendisant"ohavaj'aipeuprs
compris"
ilfautPARFAITEMENTCOMPRENDRE.N'hsitezpasvousser virde
MONSTpourallervoirl'adressedeLETTREceq uis'ypasse.Pour
avoirlesadressesdestiq uettes,taperLq uandvoustessous
MONST.Ilesttoutfaitpossiblededemanderceq uelafentre
mmoire(la3)pointesurunepar tievousmontrantLETTREet
COLONE,puisderevenirsurlafentre2pourfaireavancerpas
pasleprogramme.Cecivousper mettradevoirlecontenudelam
moiresemodifiertoutenregardantlesinstructionss'excuter.
Ilresteunpetitpointclaircir,concernantlemotEVENq ui
estsitudanslasectiondata.Nousavonsdjcom pris(dumoins
j'espre)q uel'assembleurnefaisaitq uetraduireenchiffresdes
instructions,afinq uecesordressoientcomprisparlamachine.
Nousavonsvugalementq uele68000n'aimaitpaslesadressesim
paires(dumoinsnousnel'avonspasencorevu,etcen'estpas
plusmal...).Lorsq uel'assembleurtraduitenchiffrelesmnmoni
q ues,iln'yapasdesoucisefaire,cellescisonttoujours
traduitesenunnombrepaird'octets.
Malheureusementcen'estpasforcmentlecasaveclesdatas.En
l'occurrenceici,lelabelCLScommenceuneadressepaire(car
avantluiiln'yaq uedesmnmoniq ues)maisl'adresseCLSonne
trouveq ue3octets.Nousendduisonsq uelelabelTXTvase
trouveruneadresseimpaire.Pourvitercela,l'assembleurmet
notredispositionuneinstructionq uiper metd'imposerune

adressepairepourlelabelsuivant,EVENsignifiantpairen
Anglais.
Note:ToutcommeSECTIONDATA,DC.B,DC.WouDC.L,EVENn'estpas
uneinstructiondu68000.C'estunordreq uiseracom prispar
l'assembleur.
Gnralementcesordressontcom prisparbeaucoupd'assembleurs
maisilexisteparfoisdesvariantes.Ainsicertainsassembleurs
demandentavoir.DATAoubienDATAetnonpasSECTIONDATA.De
mmepourcertainsassembleurs,leslabels(tiq uettes)doivent
treimprativementsuivisde2points.Ilfautchercherdansla
docdesonassembleuretfaireavec,c'estlaseulesolution!
Notezcependantq uececinechangeenrienlesmnmoniq ues!
Passonsmaintenantaudernierlistingdececours,lenumro2.
CelistingafficheuneimageDegasdontlenomestinscritensec
tiondata,l'tiq uetteNOM_FICHIER.Ilestbienvidentq uece
nomnedoitpascontenirdeccdillemaispluttunebarreobli
q ueinverse,q uemonimprimantearefused'imprimer!
Seules2ou3petiteschosesvoussontinconnues.Toutd'abord
l'instructionTST.W(justeaprsl'ouverturedufichierimage)
CetteinstructionselitTestetdoncicionlit:
TestwordD0.
CelarevienttoutsimplementfaireCMP.W#0,D0.
Secondechoseq uivousestencoreinconnue,laSECTIONBSS.
Nousavonsvudanslesprcdentsq uelesvariablesinitialises
taientmisesdansuneSECTIONDATA.Etbienlesvariablesnon
initialisessontmisesdansunesectionnommeSECTIONBSS.Cette
sectionpossdeunepar ticularitintressante:lesdonnesyfi
gurantneprennentpasdeplacesurdisq ue!
Ainsisivousavezunprogrammede3kiloctetsmaisq uedansce
programmevousdsirezrserver30kilopourpouvoirparlasuite
ychargerdiffrenteschoses,sivousrservezenfaisantTRUC
DC.B30000votreprogramme,unefoissurdisq uettefera33000oc
tets.ParcontresivousrservezparTRUCDS.B30000,votrepro
grammen'occuperaq ue3Kosurledisq ue.
CesdirectivesplacesensectionBSSsontassezdiffrentesde
cellesplacsensectiondata.
TRUCDC.W16rservedelaplacepour1wordq uiest
initialisaveclavaleur16.
TRUCDS.W16rservedelaplacepour16words.
Ilfautbienfaireattentioncela,carc'estunefauted'tour
deriepeufrq uentemaisaarrive!
SionnoteensectionBSS
TRUCDS.W0
MACHINDS.W3
Lorsq uel'onchercheralelabelTRUCetq uel'oncriradesdon
nesdedans,cesdonnesnepourrontpasallerDANStrucpuisq ue
cettetiq uettenecorrespondrien(0wordderserv)etdonc
nouscrironsdansMACHIN,encrasantparexempleceq uenousy
avionsplacauparavant.

Bon,nor malementvousdevezensavoirassezlongpourutiliserle
Gemdos,leBiosetleXbios(jevousrappelleq ueleBioss'ap
pelleparleTrap#13,exactementdelammemanireq ueleGemdos
ouleXbios).
Vousdevezdonctrecapablederaliserlesprogrammessuivants:
Demandedunomd'uneimage.Ontapelenomauclavier,puisle
programmelitl'imagesurladisq uetteetl'affiche.Prvientet
redemandeunautrenomsil'imagen'estpastrouve.SiontapeX,
c'estlafinetonq uitteleprogramme.
Lecturedupremiersecteurdelapremirepistedeladisq uette.
Silepremieroctetdecesecteurestgale$61(c'estlecode
del'instructionBRA),faireclingclingclingenaffichantle
codeASCII7(clochette),afficher"disq uetteinfecte",attendre
unappuisurunetoucheetbyebye.Sidisq uettenoninfecte,af
ficher"jeremercieleFroceLapinpoursesexcellentscours
d'assembleur,superbienfaitsq ued'abordc'estluilemeil
leur"etq uitter.
Vouspouvezaussitenterlavaccination,eneffaantcarrmentle
premieroctet(mettre0parexem ple).
Autreexem pleassezintressantprogrammer.Vousavezvudansle
listing3commentprleverdesdonnessitueslesunesaprsles
autresdansunechane:D6contientbiend'abordFpuisEpuisR
etc...Imaginezq uevousayez3chanes:lapremirecontientdes
chiffrescorrespondantlacolonned'affichage,lasecondedes
chiffrescorrespondantlaligneetlatroisimedeschiffres
correspondantlacouleurs,ces3donnesaufor matVT52.
(regardezEscape+'Y'etEscape+'b'ouEscape+'c').Onmetunre
gistred'adressepourchacunedeceslistes,onlitunchiffrede
chaq ue,onplacecechiffredansunephrase:
(27,"Y",X1,X2,27,"b",X3,"*",0)
X1tantlechiffreprlevdanslaliste1
X2tantlechiffreprlevdanslaliste2
X3tantlechiffreprlevdanslaliste3
Onaffichedoncdiffrentespositionsunetoile,decouleur
diffrentesuivantlesaffichages.
Conseil:Essayezdefairelemaximumdepetitsprogrammes,afinde
biencomprendrel'utilisationduVT52,duGemdos,duBiosetdu
Xbios.Celavousper mettragalementdevoushabituercommenter
vosprogrammes,lesordonner,chasserl'erreursournoise.
Scr utezattentivementvosprogrammesl'aidedeMONST.Pourle
momentleserreursserontencoretrsfacilestrouver,ilest
doncim pratifdetrstrsbienvousentraner!!!
Siundevosprogrammesnetournepas,prenezvotretempsetr
flchissez.C'estsouventuneerreurENORMEq uiestjustedevant
vous:notezsurpapierlesvaleursdesregistres,faitesavancer
paspasleprogrammesousMONST,repensezbienauprincipedela
pileavecsesavantagesmaisaussisesinconvnients.Utilisezle
principedessubroutinesenypassantdesparamtresafindetrs
bienmatriserceprincipe.

Vousrecevrezlasecondesriedecoursdansunmoisenviron.Cela
vouslaisseletempsdebosser.Surtoutapprofondissez,etrsis
tezlatentationdedsassemblerdesprogrammespouressayezd'y
comprendreq uelq uechose,oulatentationdeprendredegros
sourcesencroyantytrouverdeschosesfantastiq ues.Cen'estpas
dutoutlabonnesolution,aucontraire!!!
Sivraimentvousvoulezfairetoutdesuiteungrostrucs,alors
faiteuntraitementdetexte.AvecleVT52,leGemdosetleBios,
c'esttoutfaitpossible.Biensr,iln'yaurapaslasouriset
ilfaudrataperlenomdufichieraulieudecliq uerdansles
lecteur,maisimaginezlattedevotrevoisinq uifrimeavecson
scrollingencom prenant1instructionsur50q uandvousluiannon
cerez"Lescrollingc'estpourlespetits...moijefaisuntrai
tementdetexte!!"
Detoutcoeur,boncourageLeFroceLapin(from44E)
Sommaireprovisoiredelasrie2
ReprogrammerlesTraps,
Dsassemblageetcommentaired'unprogrammedontnousnesommes
paslesauteurs,
lammoirecran
lesanimations(scrollingverticaux,horizontaux,sprites,...),
lamusiq ue(avecetsansdigits,
lessoundtrackers...),
crationderoutinesn'utilisantpaslesystmed'exploitation,
leGEMetlesressourcesetc....

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

******************************************************************
**
*COURSSUPLEMENTAIRErf.A*
**
*parLeFroceLapin(from44E)*
**
**
******************************************************************
Cechapitreatrajoutalorsq uej'taisentrainderdigerle
6mecours.Ilm'asembl,eneffet,intressantdevousfournir
desdtailssupplmentairessurle68000.
Cesinfor mationsconcernentlebrochagedecemicroprocesseuret
peuventsemblersuperflues.Ellesper mettentcependantunebien
meilleurecomprhensiondesdiversphnomnes.Nevousinq uitez
passicertainster mesvousparaissentdifficilementcomprhensi
blescarnousferonsassezsouventappelcedocumentdansles
courssuivants,ceq uinousper mettrad'obtenirdesexplications
aufuretmesuredesbesoins.
Le68000estcomposd'unetoutepetite'plaq ue'desilicium,
laq uellesontconnectsdesfilseuxmmester minspardepetites
broches(les'pattes').C'estlenombredebrochesq uiconditionne
latailledubotieretnonlatailledelapastilledesilicium,
beaucouppluspetite.

Lebotierdu68000faitenviron8,2cmdelongsur2,3cmde
large,etcom porte64brochesq uenousallonsdcriresommaire
ment.Parsimplesoucipdagogiq ue,l'ordred'explicationnesuit
pasl'ordrenumriq ue.
Pourchaq uebroche,voustrouverezsonnomtelq u'ilestdonn
danslesouvragessurle68000,cemmenomenclairpuislades
criptiondelabroche.
VCCVoltageconstantcurrent.Voltageencourantcontinue.
C'estlabroched'alimentationdu68000(5volts)
GNDground.C'estlamassedu68000.
CLKClock/Horloge.Entredusignald'horloge.
Note:OnappelBUSunensembledeconducteurs(enq uelq uessorte
un'paq uet'defils),vhiculantlemmetyped'infor mation.
A1A23Address/Adresse.Cesbrochesconstituentlebus
d'adresse.Ilnefautpasconfondreces'A'avecles
registresd'adressesA0A7)q uenoustudionsdansles
autrescours.Eneffet,chacundes'A'desregistres
d'adressesestcodsur32bitsalorsq u'icichacunne
travailleq uesur1bit.Noussommesbienicienprsence
d'uneboiteavecdesfilssurlesq uelsilyaounondu
courant(revoircours2).Onpourraits'attendre
trouverunebroche0,maiscelleciestrem placepar2
brochescompltantlebusd'adresse.
UDSUpperDataStrobe/Echantillonnagehaut
LDSLowerDataStrobe/Echantillonnagebas
Al'aidedesbrochesA1A23onobtientuneadresse,tandisq ueles
brochesUDSetLDSindiq ueaumicroprocesseursicetteadresse
ildoitaccderl'octethaut,l'octetbasouauwordcom plet.
Chaq uebrocheA1A23nepouvantprendreq ue2valeurs(0ou1)
nousnousretrouvonsdanslemmecasq uenoslam pesducours2.
Nousavionsremarq uq uelenombredepossibilittaitliau
nombredelam pesparlarelation:
possibilit=2lapuissancenombredelampe.
Sinousremplaonslam peparbroche,nousobtenonscommenombrede
possibilits2puissance23,c'estdire8388608.Nouspouvons
doncavoiraccs8388608adresses,chacunecontenantnonpasun
octetmaisunword,puisq uelemicroprocesseuropreensuitela
slectionenconsultantsesbrochesUDSetLDS.Nouspouvonsdonc
atteindre8388608wordsc'estdire16777216octets,ceq uifait
bienles16mgasdontnousparlonsdanslesautrescours.
LeBusdeDonnes:Mmeremarq uesq ueprcdemment.Icinousavons
16broches(D0D15)q ui,biensr,nepeuventprendreq ue2va
leurs,savoir0ou1.Lebusdedonnesestdoncsur16bits,il
estdonccapabledevhiculerdesbytes(octets)oudeswords
(mots).Ilestpossibledeliremaisaussid'criresurcebus.Il
estdoncaccessibledanslesdeuxsens,onditq u'ilestbidirec
tionnel.
LeBusdeControl:Cetensembledebrochesfournitdesinfor ma
tionscomplmentaires.
ASAdresseStrobe/Echantillonnaged'adresse.Cettebroche

validel'adressesetrouvantsurlebusd'adresse.En
clairelleindiq ueq uetoutestOK.
R/WReadwrite/Lirecrire.Lebusdedonnetantaccessible
enlectureetencriture,cettebrocheindiq ueleq uel
des2tatsestactif.
UDS,LDSCes2brochesfontpartiesduBusdeControlmaisnous
lesavonsdjdcritesunpeuplushaut.
DTACKDataTransfer tAcknowledge/Rcpissdetransfertde
donnes.Indiq ueq ueletransfertdesdonnesestralis.
LeBusdeControlcomportegalementd'autrescommandesper mettant
unebonnerpar titiondesbussuivantlademande.
BRBusReq uest/demandedebus.Indiq ueq u'unautrecircuit
demandeserendrematredubus.
BGBusGrantSignaleq uelebusvatrelibr.
BGACKBusGrantAcknowledge.Indiq ueq u'unautrecircuitapris
lacommandedubus.
Commanded'interruptions:
IPLInterruptPendingLevel:3brochesdecetypeIPL0,IPL1
etIPL2.
Cesbroches,contrairementauxautres,sontactiveslorsq u'elles
sont0.Nousretrouveronsplustardl'tatdecesbrochesdans
lechapitretraitantdelasecondepartieduSRetdesinterrupt
(chapitre4)
Commandedusystme.
BERRBuserror/Erreurdebus.Signaleuneerreurdanslecycle
encoursd'excution.
RESETSer tinitialiserle68000.Cependant,lorsq u'un
programmeexcutel'instructionRESET,cettebrochepeut
passerl'tatbas(0),afinq u'ilyaitrinitia
lisationdescircuitsexternessanstoucherau68000.
HALTToutcommelabrocheRESET,celleciestdisponibleen
entreouensortie.Lorsq u'onl'attaq ueenentre,le
68000ter minesoncycledebusencourspuissebloq ue.
Ensortiecettebrocheindiq ueunedoublefaute
intervenuesurunbus.SeulRESETpeutalorsdbloq uerle
processeur.
Etatduprocesseur.
3broches(FC2,FC1etFC0)indiq uedansq ueltatsetrouvele
68000.
FC2FC1FC0Typedecycle
000rser v(nonutilis)
001donnesutilisateurs
010programmeutilisateur

011rser v
100rser v
101donnessuperviseur
110programmesuperviseur
111reconnaissanced'interruption
Voustrouverezdenombreusesautresinfor mationssurle68000dans
lesouvragestelsq ue"Miseenoeuvredu68000"auxditions
Sybex,oudanslesouvragespar usauxditionsRadio.Cesinfor ma
tions,mmesiellesneparaissentpasprimordiales,per mettentde
mieuxcom prendrelemodedefonctionnementdelamachine,ceq ui
nepeutapporterq uedesavantages.

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Listingnumro1/Coursnumro7*
**
******************************************************************
DEBUTMOVE.L#MENU,(SP)passeadressephrase
MOVE.W#9,(SP)numrofonction
TRAP#1appelGemdos
ADDQ.L#6,SPcorrectionpile
*attenteappuitouche
MOVE.W#7,(SP)fonctionnumro7
TRAP#1dugemdos
ADDQ.L#2,SPcorrectionpile
*testdursultat
CMP.W#"Q",D0qmajuscule?
BEQQUITTERoui,byebye
CMP.W#"q",D0qminuscule?
BEQQUITTERoui,byebye
CMP.W#"V",D0vmajuscule?
BEQAFFICHAGEoui>affichelemessage
CMP.W#"v",D0Vminuscule?
BNEDEBUTnon.Onadoncuneautrelettre
*commerponse.Cen'estpasvalabledonconrecommenceaudbut
AFFICHAGEMOVE.L#MESSAGE,(SP)adressede'coucou'
MOVE.W#9,(SP)numrofonction
TRAP#1appelGemdos
ADDQ.L#6,SPcorrectionpile
*Onattendunappuisurunetouchepourcontem pler
MOVE.W#7,(SP)
TRAP#1
ADDQ.L#2,SP

BRADEBUTretouraudbut
QUITTERMOVE.W#0,(SP)
TRAP#1
SECTIONDATA
MENUDC.B27,"E",27,"p"
DC.B"QUITTER(Q)OUVOIRLEMESSAGE(V)?"
DC.B27,"q",13,10,0
EVEN
MESSAGEDC.B"COUCOU",0

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

********************************************************************
**
*
*
*COURSD'ASSEMBLEUR68000SURATARIST
*
*
*
*parLeFroceLapin(from44E)
*
*
*
*Listingnumro2/Coursnumro7
*
*
*
********************************************************************
**
*Testrsolution,carsionestenhauteetq uel'onessayede*
*passerenbasse,paf!RESET!*
MOVE.W#4,(SP)numrofonctionGetrez()
TRAP#14appelXbios
ADDQ.L#2,SPcorrectionpile
CMP.W#2,D0haute?
BEQCHARGEoui,donconchargetoutde
suite
*Puisq u'onestpasenhaute,onforceenbassersolution
*onnoted'abordenmettant1undrapeaudesignalement
MOVE.W#1,RESOLUTION
MOVE.W#0,(SP)bassersolution
MOVE.L#1,(SP)adressecraninchange
MOVE.L#1,(SP)adressecraninchange
MOVE.W#5,(SP)fonctionSetscreen()
TRAP#14duXbios
ADDA.L#12,SPcorrection

*Ouver turedufichierimage
CHARGEMOVE.W#0,(SP)ouvertureenlecture
MOVE.0L#NOM_FICHIER,(SP)adrnomdufichier
MOVE.W#61,(SP)fonctionFopen()
TRAP#1duGEMDOS
ADDQ.L#8,SPcorrectionpile
*D0contientleHandleoubienunnumrod'erreurngatif
TST.WD0compare0
BLTERREURinfrieurdoncerreur
*Onsauvelehandledufichier
MOVE.WD0,D3
*Sauteles34octetsdudbutdefichierDEGAS
*(2octetsd'entte,32decouleurs)
MOVE.W#0,(SP)dcalepartirdudbutde
fichier
MOVE.WD3,(SP)handledufichier
MOVE.L#34,(SP)nbrd'octetssauter
MOVE.W#66,(SP)fonctionFseek()
TRAP#1duGEMDOS
ADDA.L#10,SP
TST.WD0testD0
BLTERREUR
*Dter minel'adressedel'cran
MOVE.W#2,(SP)fonctionPhysbase()
TRAP#14duxbios
ADDQ.L#2,SPcorrectionpile
MOVE.LD0,A5sauvel'adresse
*Chargel'imagedirectementdansl'cran
MOVE.LA5,(SP)adressedestination
MOVE.L#32000,(SP)nbroctetslire
MOVE.WD3,(SP)handledufichier
MOVE.W#63,(SP)fonctionFread()
TRAP#1duGEMDOS
ADDA.L#12,SP
TST.WD0
BLTERREUR
*Chargementdelapalettedansnotrebufferpalette
*D'abordrepositionnerlepointeurfichier
MOVE.W#0,(SP)dcalepartirdudbutde
fichier
MOVE.WD3,(SP)handledufichier
MOVE.L#2,(SP)nbrd'octetssauter

MOVE.W#66,(SP)fonctionFseek()
TRAP#1duGEMDOS
ADDA.L#10,SP
TST.WD0testD0
BLTERREUR
*Puischargement
MOVE.L#BUFFER_PAL,(SP)adressedestination
MOVE.L#32,(SP)nbroctetslire
MOVE.WD3,(SP)handledufichier
MOVE.W#63,(SP)fonctionFread()
TRAP#1duGEMDOS
ADDA.L#12,SP
TST.WD0
BLTERREUR
*OnplacemaintenantcettepaletteavecXbios(6)
MOVE.L#BUFFER_PAL,(SP)adressepalettenoire
MOVE.W#6,(SP)fonctionSetPalette()
TRAP#14duXBIOS
ADDQ.L#6,SP
*Onrefer melefichier
MOVE.WD3,(SP)handle
MOVE.W#62,(SP)fonctionFclose()
TRAP#1duGEMDOS
ADDQ.L#4,SP
BRAFINetonsesauve
*Encasd'erreuronvientici
ERREURMOVE.L#MESSAGE_ERREUR,(SP)prvient
MOVE.W#9,(SP)
TRAP#1
ADDQ.L#6,SP
FINMOVE.W#7,(SP)attendunappuitouche
TRAP#1
ADDQ.L#2,SP
CMP.W#0,RESOLUTION
BEQNOT_MOYENNE
*Puisq u'onestenbasse,onreforceenmoyennersolution
MOVE.W#1,(SP)moyennersolution
MOVE.L#1,(SP)adressecraninchange
MOVE.L#1,(SP)adressecraninchange
MOVE.W#5,(SP)fonctionSetscreen()
TRAP#14duXBIOS
ADDA.L#12,SPcorrection
*Puisonq uitte

NOT_MOYENNE
MOVE.W#0,(SP)
TRAP#1
**
SECTIONDATA
MESSAGE_ERREURDC.B"Dsol,erreuravec",13,10
DC.B"lefichier"
NOM_FICHIERDC.B"A:\IMAGE.PI1",0
SECTIONBSS
BUFFER_PALDS.W16
RESOLUTIONDS.W1

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

**************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Listingnumro3/Coursnumro7*
**
**************************************************************

########CRCERROR########
# Le fichier d'o est tir ce listing tait corrompu sur mes vieilles disquettes, je n'ai donc pas pu le
convertir. Si vous l'avez en entier, merci de me l'envoyer.

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

SHIZUKAaleplaisirdevousprsentercettetabledescyclesdu68000
raliseendeuxportionsdesoiresaveclesaidesapprciablesde:
craft2(stedi)
disq uedur(ouaaaahlavitesse)
"guidedesinstructionsdu68000,vol2deNACHTMANNchezPUBLITRONIC
"
mercidediffusercettetablesansmodifierl'entte
calculdel'adresseeffective
b/wl

dn00
an00
(an)48
(an)+48
(an)610
d16(an)812
d8(an,xi)1014
abs.w812
abs.l1216
d16(pc)812
d8(pc,x1)1014
imm48
move.betmove.w
dnan(an)(an)+(an)d16(an)d8(an,xi)
abs.wabs.l
dn44888121412
16
an44888121412
16
(an)88121212161816
20
(an)+88121212161816
20
(an)1010141414182018
22
d16(an)1212161616202220
24
d8(an,xi)1414181818222422
26
abs.w1212161616202220
24
abs.l1616202020242624
28
d16(pc)1212161616202220
24
d8(pc,x1)1414181818222422
26
imm88121212161816
20
move.l
dnan(an)(an)+(an)d16(an)d8(an,xi)
abs.wabs.l
dn44121212161816
20
an44121212161816
20
(an)1212202020242624
28
(an)+1212202020242624
28
(an)1414222222262826
30
d16(an)1616242424283028
32
d8(an,xi)1818262626303230
34
abs.w1616242424283028

32
abs.l2020282828323432
36
d16(pc)1616242424283028
32
d8(pc,x1)1818262626303230
34
imm1212202020242624
28

op(ea),anop(ea),dnopdn,(m)
add.b4+8+
add.w8+4+8+
add.l6+&6+&12+
and.b4+8+
and.w4+8+
and.l6+&12+
cmp.b4+
cmp.w6+4+
cmp.l6+6+
divs158+*
divu140+*
eor.b4+8+
eor.w4+8+
eor.l8+12+
muls70+*
mulu70+*
or.b4+8+
or.w4+8+
or.l6+&12+
sub.b4+8+
sub.w8+4+8+
sub.l6+&6+&12+

+=rajouterletempsdecalculdel'adresseeffective
&=raouter2priodesdhorlogepourlesmodesandnetimmdiat
*=duremax
op#,dnop#,anop#,m
addi.b812+
addi.w812+
addi.l1620+
addq.b48+
addq.w488+
addq.l8812+
andi.b812+
andi.w812+
andi.l1620+
cmpi.b88+
cmpi.w88+
cmpi.l1412+
eori.b812+
eori.w812+
eori.l1620+
moveq4
ori.b812+

ori.w812+
ori.l1620+
subi.b812+
subi.w812+
subi.l1620+
subq.b48+
subq.w488+
subq.l8812+
+=rajouterletempsdecalculdel'adresseeffective
registremmoire
clr.b48+
clr.w48+
clr.l612+
nbcd68+
neg.b48+
neg.w48+
neg.l612+
negx.b48+
negx.w48+
negx.l612+
not.b48+
not.w48+
not.l612+
scc(cc=0)48+
scc(cc=1)68+
tas410+
tst.b44+
tst.w44+
tst.l44+
+=rajouterletempsdecalculdel'adresseeffective
registresmemoire
asr.b&asl.b6+2n
asr.w&asl.w6+2n8+
asr.l&asl.l8+2n
lsr.b&lsl.b6+2n
lsr.w&lsl.w6+2n8+
lsr.l&lsl.l8+2n
ror.b&rol.b6+2n
ror.w&rol.w6+2n8+
ror.l&rol.l8+2n
roxr.b&roxl.b6+2n
roxr.w&roxl.w6+2n8+
roxr.l&roxl.l8+2n
+=rajouterletempsdecalculdel'adresseeffective
nestlenombrederotationsoudedcalagessuccessifs
dynamiq uedynamiq uestatiq uestatiq ue
registremmemoireregistrememoire
bchg.b8+12+
bchg.l8*12*
bclr.b8+12+
bclr.l10*14*

bset.b8+12+
bset.l8*12*
btst.b4+8+
btst.l610
+=rajouterletempsdecalculdel'adresseeffective
*=duremax
branchementpasde
effectubranchement
bcc.s108
bcc.l1012
bra.s10
bra.l10
bsr.s18
bsr.l18
dbcccc=112
dbcccc=01014

(an)(an)+(an)16(an)d8(an,xi)abs.wabs.ld16(pc)
d8(pc,xi)
jmp81014101210
14
jsr161822182018
22
lea48128128
12
pea121620162016
20
movem.w12+4n12+4n16+4n18+4n16+4n20+4n16+4n
18+4n
(m>r)
movem.l12+8n12+8n16+8n18+8n16+8n20+8n16+8n
18+8n
(m>r)
movem.w8+4n8+4n12+4n14+4n12+4n16+4n

(r>m)
movem.l8+8n8+8n12+8n14+8n12+8n16+8n

(r>m)
nestlenombredetransfertsderegistraeffectuer
opdn,dnopm,m
addx.b418
addx.w418
addx.l830
cmpm.b12
cmpm.w12
cmpm.l20
subx.b418
subx.w418

subx.l830
abcd618
sbcd618

6800068000
r>mm>r
movep.w1616
movep.l2424

6800068000
registremmoire
anditoccr20
anditosr20
chk(sanstrap)10
eoritoccr20
eoritosr20
exg6
ext4
link16
movetoccr1212&
movetosr1212&
movefromsr68&
moveusp4
nop4
oritoccr20
oritosr20
reset132
rte20
rtr20
rts16
stop4
swap4
trapv(sanstrap)4
unlk12
&=rajouterletempsdecalculdel'adresseeffective
68000
erreuradresse50
erreurdebus50
instructionchk44+*
instructionillegal34
interruption44#
violationdeprivilge34
trace34
trap38
trapvs34
+rajouterltempsdecalculdel'adresseeffective
*duremax
#4priodesd'horlogeinclusespourlecycled'interruption

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

***LESFONCTIONSGEMDOSPARNUMRO***
$00Pter m0Findeprocessus
$01CconinLituncaractresurl'entrestandard
$02Cconoutcrituncaractresurlasortiestandard
$03CauxinLituncaractresurl'entrestandardAUX:
$04Cauxoutcrituncaractresurlasor tiestandardAUX:
$05Cprnoutcrituncaractresurlasor tiestandardPRN:
$06CrawioLecture/criturebr utesurl'entre/sortiestandard
$07CrawcinLecturebrutesurl'entrestandard
$08CnecinLituncaractresurl'entrestandard,sanscho
$09Cconwscritunechanesurlasortiestandard
$0ACconrsLitunechanefor matesurl'entrestandard
$0BCconisTestel'tatdel'entrestandard
$0EDsetdr vFixelelecteurdedisq uepardfaut
$10CconosTestel'tatdelasortiestandard
$11CprnosTestel'tatdupriphriq uestandardPRN:
$12CauxisTestel'tatdustandardAUX:enentre
$13CauxosTestel'tatdustandardAUX:ensortie
$19Dgetdr vDemandeledisq uepardfaut
$1AFsetdtaFixel'adresseduDTA(DiskTransferAdress)
$20SuperEntre/Sort/Demandedumodesuperviseur
$2ATgetdateDemandeladate
$2BTsetdateFixeladate
$2CTgettimeDemandel'heure
$2DTsettimeFixel'heure
$2FFgetdtaDemandel'adresseduDTA(DiskTransferAdress)
$30SversionDemandelenumrodeversionduGEMDOS
$31Pter mresFinitunprogrammeq uirestersident
$36DfreeDemanded'infor mationssurundisq ue
$39DcreateCrationd'unsousrpertoire
$3ADdeleteEffaceunsousrpertoire
$3BDsetpathFixelecataloguecourant
$3CFcreateCrationd'unfichier
$3DFopenOuvreunfichier
$3EFcloseFer meunfichier
$3FFreadLitunfichier
$40Fwritecritunfichier
$41FdeleteEffaceunfichier
$42FseekPositionnementdansunfichier
$43FattribRetourne/fixelesattributsdefichier
$45FdupRecopieunidentificateurdefichierstandard
$46FforceForceunidentificateurdefichier
$47DgetpathDemandelerpertoirecourant
$48MallocDemanded'allocationmmoire
$49MfreeLibredelammoire
$4AMshrinkRtrcitunblocdemmoirealloue
$4BPexecCharge/Excuteunprogramme
$4CPter mTer mineunprogramme
$4EFsfirstRecherchelapremireoccurrenced'unfichier
$4FFnextRecherchel'occurrencesuivante
$56FrenameRenommeunfichier
$57FdatimeDemandeoufixeladatedecrationd'unfichier

***FONCTIONSGEMDOSPARNOM***
$03CauxinLituncaractresurl'entrestandardAUX:
$12CauxisTestel'tatdustandardAUX:enentre
$13CauxosTestel'tatdustandardAUX:ensortie
$04Cauxoutcrituncaractresurlasor tiestandardAUX:
$01CconinLituncaractresurl'entrestandard
$0BCconisTestel'tatdel'entrestandard
$10CconosTestel'tatdelasortiestandard
$02Cconoutcrituncaractresurlasortiestandard
$0ACconrsLitunechanefor matesurl'entrestandard
$09Cconwscritunechanesurlasortiestandard
$08CnecinLituncaractresurl'entrestandard,sanscho
$11CprnosTestel'tatdupriphriq uestandardPRN:
$05Cprnoutcrituncaractresurlasor tiestandardPRN:
$07CrawcinLecturebrutesurl'entrestandard
$06CrawioLecture/criturebr utesurl'entre/sortiestandard
$39DcreateCrationd'unsousrpertoire
$3ADdeleteEffaceunsousrpertoire
$36DfreeDemanded'infor mationssurundisq ue
$19Dgetdr vDemandeledisq uepardfaut
$47DgetpathDemandelerpertoirecourant
$0EDsetdr vFixelelecteurdedisq uepardfaut
$3BDsetpathFixelecataloguecourant
$43FattribRetourne/fixelesattributsdefichier
$3EFcloseFer meunfichier
$3CFcreateCrationd'unfichier
$57FdatimeDemandeoufixeladatedecrationd'unfichier
$41FdeleteEffaceunfichier
$45FdupRecopieunidentificateurdefichierstandard
$46FforceForceunidentificateurdefichier
$2FFgetdtaDemandel'adresseduDTA(DiskTransferAdress)
$3DFopenOuvreunfichier
$3FFreadLitunfichier
$56FrenameRenommeunfichier
$42FseekPositionnementdansunfichier
$1AFsetdtaFixel'adresseduDTA(DiskTransferAdress)
$4EFsfirstRecherchelapremireoccurrenced'unfichier
$4FFnextRecherchel'occurrencesuivante
$40Fwritecritdansunfichier
$48MallocDemanded'allocationmmoire
$49MfreeLibredelammoire
$4AMshrinkRtrcitunblocdemmoirealloue
$4BPexecCharge/Excuteunprogramme
$4CPter mTer mineunprogramme
$00Pter m0Ter mineunprogramme(codederetour0)
$31Pter mresTer mineunprogrammeq uirestersident
$20SuperEntre/Sort/Demandedumodesuperviseur
$30SversionDemandelenumrodeversionduGEMDOS
$2ATgetdateDemandeladate
$2CTgettimeDemandel'heure
$2BTsetdateFixeladate
$2DTsettimeFixel'heure
**
$00Pter m0Finitunprogramme
voidPter m0()
Ter mineunprocessus,fer manttouslesfichiersq u'ilaouvertet
librantlammoireq u'ilaalloue.Retourne$0000commecodede
sor tieauprogrammeparent.

**
$01CconinLituncaractresurl'entrestandard
LONGCconin()

Lituncaractresurl'entrestandard(identificateur0).Si
l'entrestandardestlaconsole,lelong_motretourndansD0
contientlecodeASCIIetlecodeclavierdelatoucheappuye
(codedescr utation):
________________________________________________
|31..24|23..16|15..8|7..0|
|||||
||codede|||
|$00oubits|scrutation|$00|caractre|
|deshift|ou$00||ASCII|
|_____________|___________|__________|___________|
Lestouchesdefonction(F1F10,HELP,UNDO,etc...)retournent
lecodeASCII$00,aveclecodeclavierappropri(cf.lemanuel
surleclavierintelligentpourlavaleurdescodesclavier).Le
STBIOSplacel'tatdestouchesspcialesdanslesbits2431
(voirleGuideduprogrammeurduBIOSpourplusdedtails).
ERREURS
Neretourneaucuneindicationdefindefichier.
Nereconnatpas'Control_C'
Im possibledesavoirsil'entreestunpriphriq uecarac
tresouunfichier.
Ildevraitexisterunmoyendetaperles256codespossibles
partirduclavier.
**
$02CconoutEcrituncaractresurlasortiestandard
voidCconout(c)
WORDc
critlecaractre'c'surlasortiestandard(identificateur0).
Leshuitbitslesplussignificatifsde'c'sontrser vset
doiventtrezro.Lestabulationsnesontpasinter prtes.
**
$03CauxinLituncaractresurl'entrestandardAUX:
WORDCauxin()
Lituncaractrepartirdel'identificateur1(lepor tsrieAUX:,
nor malement).
REMARQUE
LecontrledefluxdelasortieRS232nemarchepasavec
cettefonction.Lesprogrammesdevraientutiliserl'appelde
priphriq uedecaractreBIOSafind'viterdeperdredes
caractresreus.
**
$04CauxoutcrituncaractresurlasortiestandardAUX:
voidCauxout(c)
WORDc
**
$05CprnoutcrituncaractresurlasortiestandardPRN:
voidCprnout(c)
WORDc
crit'c'surl'identificateur2(leportim primantePRN:,nor ma

lement).Leshuitsbitshautsde'c'sontrservsetdoiventtre
zro.Lestabulationsnesontpasinter prtes.
**
$06CrawioLecture/criturebrutesurl'entre/sor tiestandard
LONGCrawio(w)
WORDw;
REMARQUES
Parlefaitmmedesaconceptioncettefonctionnepeut
crire'$ff'surlasortiestandard.
$00nepeuttrediffrencid'unefindefichier.
**
$07CrawcinEntrebrutesurl'entrestandard
LONGCrawcin()
REMARQUEPasd'indicationdefindefichier.
**
$08CnecinLituncaractresurl'entrestandard,sanscho
LONGCnecin()
Lituncaractresurl'entrestandard.Silepriphriq ue
d'entreest'CON:',aucunchon'estfait.Lescaractresde
contrlesontinter prts.
**
$09CconwsEcritunechanesurlasor tiestandard
voidCconws(chane)
char*chane;
critunechanedbutant'chane'etfinissantpar0,surla
sor tiestandard.
**
$0ACconrsLitunechanesurl'entrestandard
voidCconrs(buf)
char*buf;
Litunechanesurl'entrestandard.Lescaractresdecontrle
habituelssontinter prts:
____________________________________________
|Caractre|Fonction|
|||
|,^J|Findeligne|
|^H,|Effacelederniercaractre|
|^U,^X|Effacelaligneentire|
|^R|Recopielaligne|
|^C|Finileprogramme|
|______________|_____________________________|
Lepremiercaractrede'buf'contientlenombremaximumd'octets
lire(tailledutam ponmoinsdeux).Ensortie,ledeuximeoctet
contientlenombredecaractreslus.Lachanesetrouveentre
'buf+2'et'buf+2+buf[1]'.
Iln'estpasgarantiq uelachanesefinissepar0.
REMARQUEPlantesurlesfinsdefichiers.
**
$0BCconisTestel'tatdel'entrestandard
WORDCconis()
Retourne$FFFFsiuncaractreestdisponiblesurl'entre
standard,$0000sinon.
**
$0EDsetdr vFixelelecteurdedisq uepardfaut
LONGDsetdrv(drv)
WORDdrv;

Fixeledisq ue'dr v'pardfaut.Lesdisq uessontrangsde015


(A:P:).RetournedansD0.Llacartedesdisq uesactifs:
(bit0=A,bit1=B,etc..).
Un'disq ueactif'estundisq uepartirduq ueluncatalogueat
fait.
REMARQUELeGEMDOSnesupporteq ue16disq ues(bits015).Les
systmesultrieursensupporteront32.
**
$10CconosTestel'tatdelasortiestandard
WORDCconos()
Renvoie$FFFFsilaconsoleestprterecevoiruncaractre,
$0000silaconsolen'estPASprte.
**
$11CprnosTestel'tatdelasortiestandardPRN:
WORDCprnos()
Retourne$FFFFsi'PRN:'estprtrecevoiruncaractre,$0000
sinon.
**
$12CauxisTestel'tatdel'entrestandardAUX:
WORDCauxis()
Retourne$FFFFsiuncaractreestdisponiblesurl'entre'AUX:'
(identificateur1),$0000sinon.
**
$13CauxosTestel'tatdelasortiestandardAUX:
WORDCauxos()
Renvoie$FFFFsi'AUX:'(identificateur1)estprtrecevoirun
caractre,$0000sinon.
**
$19DgetdrvRecherchelelecteurdedisq uepardfaut
WORDDgetdrv()
Retournelenumrodulecteurcourant,comprisentre0et15.
**
$1AFsetdtaFixel'adresseduDTA(DiskTransferAdress)
voidFsetdta(adr)
charadr;
Fixel'adresseduDTA'adr'.Letampondestockagedesdonnes
surunfichier(DTA)neser tq uepourlesfonctionsFsfirst()et
Fsnext().
**
$20SuperChange/testelemode(UtilisateurouSuper viseur)
LONGSuper(pile)
WORD*pile;
'pile'estgal1L($FFFFFFFF):
lafonctionretourne$0000sileprocesseurestenmode
Utilisateur,$0001s'ilestenmodeSuperviseur.
'pile'estdiffrentde1L:
sileprocesseurestenmodeUtilisateur,lafonctionrevient
avecleprocesseurenmodeSuper viseur.Si'pile'estNUL
($00000000),lapilesuperviseurseralammeq uelapile
Utilisateuravantl'appel.SinonlapileSuperviseursera
place'pile'.
SileprocesseurtaitenmodeSuperviseur,ilseretrouveen
modeUtilisateurauretourdelafonction.'pile'devratre
lavaleurdelapileutilisateurq uiatretourneparle
premierappeldelafonction.
ATTENTION
LapileSuperviseuroriginaledoittrereplaceavantlafin

duprogrammesinonlesystmeplanteralasortiedu
programme.
**
$2ATgetdateDemandeladate
WORDTgetdate()
Retourneladateenfor matDOS:
15__________________9_8_________5_4_________0
|Annedepuis1980|mois|jour|
|0.....119|1...12|1...31|
|_____________________|___________|___________|
RETOUR
lesbits04contiennentlejourallantde131.
lesbits58contiennentlemoisallantde112.
lesbits915contiennentl'anne(partirde1980)
allantde0119.
**
$2BTsetdateFixeladate
WORDTsetdate(date)
WORDdate;
Fixe'date'commedatecourantedanslefor matdcritdans
Tgetdate().
RETOUR0siladateestvalide.
ERRORsilefor matdeladateestincorrect.
REMARQUES
LeGEMDOSn'estpasdifficilesurladate;parexemplele31
Fvrierneluidplatpas.
LeGEMDOSneprvientPASleBIOSq ueladateachange.
**
$2CTgettimeDemandel'heure
WORDTgettime()
Retournel'heurecourantedanslefor matDOS:
15__________11_10________5_4__________0
|heure|minute|seconde|
|0...23|0...59|0...28|
|______________|___________|____________|
RETOURLesbits:
04contiennentlessecondesdivisespar2(028)
510contiennentlesminutes(059)
1115contiennentlesheures(023)
**
$2DTsettimeFixel'heure
WORDTsettime(heure)
WORDheure;
Fixe'heure'commeheurecourantedanslefor matdcritdans
Tgettime().
RETOUR0silefor matdel'heurefournieestvalide;
ERRORsilefor matdel'heuren'estpasvalide.
REMARQUE
LeGEMDOSneprvientpasleBIOSq uel'heureachang.
**
$2FFgetdtaDemandel'adresseduDTA(DiskTransferAddress)
LONGFgetdta()
Retournel'adressecourantedutam pondestockagedesdonnessurun

fichier(DTA),employeparlesfonctionsFsfirst()etFsnext().
**
$30SversionDemandelenumrodeversionduGEMDOS
WORDSversion()
RetournelenumrodeversionduGEMDOSenfor matinvers.L'octet
leplussignificatifcontientlapartiebassedunumro,l'octetle
moinssignificatif,lapartiehaute.
REMARQUES
LaversionduGEMDOSsurdisq uettedu29/5/85etlapremire
versionenROMdu20/11/85ont$1300commenumro.

LesnumrosdeversionduGEMDOSetduTOSnesontPASles
mmes.(cf.LEMANUELDEREFERENCEDUBIOSDUSTpourlenumro
deversionduTOS).
**
$31Pter mresFinitunprogrammeq uirestersident
voidPer mres(nbrest,coderet)
LONGnbrest;
WORDcoderet;
Finitleprogrammecourant,enconservantunepar tdesammoire.
'nbrest'leestnombred'octetsappartenantauprogrammeq ui
doiventtregards,comprenantetcommenantlapagedebase.
'coderet'estlecodedesortieq uiestretournauprogramme
parent.
Lammoireq ueleprogrammeaalloue(enplusdesazoneTPA)
N'ESTPASlibre.
Ilestimpossiblederappelerleprogrammeter minparPter mres().
REMARQUE
Lesfichiersouvertssontfer mslorsdelafindeprocessus.
**
$36DfreeDemandel'espacelibresurundisq ue
voidDfree(buf,nbdisq)
LONG*buf;
WORDnbdisq;
Demandedesinfor mationssurledisq ue'nbdisq'etlesplacedans
q uatrelongs_motscommenant'buf':
__________________________________________________
|buf+0|nombredeblocslibressurledisq ue|
|||
|buf+4|nombretotaldeblocssurledisq ue|
|||
|buf+8|tailled'unsecteurenoctets|
|||
|buf+12|nombredesecteursparbloc|
|___________|______________________________________|
REMARQUEIncroyablementlentsurundisq uedur(510secondes).
**
$39DcreateCrationd'unsous_rpertoirededisq ueC
WORDDcreate(chemin)
char*chemin;
'Chemin'pointesurunechaneter minepar0spcifiantlechemin
dunouveaurpertoire.
RETOUR
0encasdesuccs;
ERRORoulenumrod'erreurappropriencasd'chec.

**
$3ADdeleteEffaceunsous_rpertoire
WORDDdelete(chemin)
char*chemin;
Effaceunrpertoireq uidoittrevide(ilpeuttoutefois
comporterlesfichiersspciaux"."et"..").'chemin'pointesur
unechaneter mineparzro,spcifiantlechemindurpertoire
effacer.
RETOUR0encasdesuccs;
ERRORoulenumrod'erreurappropriencasd'chec.
**
$3BDsetpathFixelerpertoirecourant
WORDDsetpath(chemin)
char*chemin;
Fixe'chemin',(unechaneter minepar0),commerpertoire
courant.Silechemincommenceparunelettreidentificatricede
disq uesuiviededeuxpoints,lerpertoirecourantestplacsurle
lecteurspcifi.
Lesystmeconserveunrpertoirecourantpourchaq uelecteur.
RETOUR0encasdesuccs;
ERRORoulenumrod'erreurappropriencasd'echec.
**
$3CFcreateCrationd'unfichier
WORDFcreate(nomfich,attribs)
char*nomfich;
WORDattribs;
Creunfichier'nomfich'etretournesonidentificateur,non
standard,d'critureseule.Lemotd'attributseststockdansle
rpertoire;lesbitsd'attributssont:
_________________________________________________________
|masq ue|description|
|||
|$01|fichiercrenlectureseule|
|$02|fichiertransparentaurpertoire|
|$04|fichiersystme|
|$08|fichiercontenantunnomdevolumesur11bits|
|________|_______________________________________________|
RETOUR
Unnombrepositif,l'identificateurou:
ERRORoulenumrod'erreurappropri.
REMARQUES
Silebitdelectureseuleestpositionn,unidentificateur
d'critureseuleestretourn,et,deplus,cetidentificateur
neper metpasd'crire.
Thoriq uement,unseulnumrodevolumeestper missurun
rpertoireracine.LeGEMDOSn'imposeriendetel,ceq ui
peutcauserq uelq ueconfusion.
**
$3DFopenOuver tured'unfichier
WORDFopen(nmfich,mode)
char*nmfich;
WORDmode;
Ouvrelefichier'nmfich'enmode'mode'etretournesonidentifi
cateurnonstandard.Lemoded'ouverturepeuttre:
____________________________
|mode|description|
|||

|0|lectureseule|
|1|critureseule|
|2|lectureetcriture|
|______|_____________________|
RETOUR
Unnombrepositif,l'identificateur
Unnumrod'erreurngatif.
**
$3EFcloseFer metured'unfichier
WORDFclose(idfich)
WORDidfich;
Fer melefichierdontl'identificateurest'idfich'.
RETOUR0encasdesuccs;
ERRORouunnumrod'erreurappropriencasd'chec.
**
$3FFreadLecturesurunfichier
LONGFread(idfich,nbre,buffer)
WORDidfich;
LONGnbre;
char*buffer;
Lit'nbre'octetsdanslefichierd'identificateur'idfich',et
lesplaceenmmoirepartirdel'adresse'buffer'.
RETOUR
Lenombred'octetsrellementlus,ou:
0sicodedefindefichier,
Unnumrod'erreurngatif.
**
$40Fwritecrituresurunfichier
LONGFwrite(idfich,nbre,buffer)
WORDidfich;
LONGnbre;
char*buffer;
crit'nbre'octetsdelammoirepartirdel'adresse'buffer',
danslefichierayantcommeidentificateur'idfich'.
RETOURLenombred'octetsrellementcritsencasdesuccs.
Unnumrod'erreurngatifautrement.
**
$41FdeleteEffacementd'unfichier
WORDFdelete(nomfich)
char*nomfich;
Effacelefichierayantcommenom'nomfich'.
RETOUR0encasdesuccs
Unnumrod'erreurngatifautrement.
**
$42FseekPositionnelepointeurdefichier
LONGFseek(offset,idfich,mode)
LONGoffset;
WORDidfich;
WORDmode;
Positionnelepointeurdanslefichierdfiniparl'identificateur
'idfich'.'offset'estunnombresign;unevaleurpositive
dplacelepointeurverslafindufichier,unevaleurngative,
versledbut.Le'mode'depositionnementpeuttre:
_____________________________________________
|mode|Dplacementd'offsetoctets...|
|||

|0|partirdudbutdufichier|
|1|partirdelapositioncourante|
|2|partirdelafindufichier|
|_______|____________________________________|
RETOURLapositioncourantedanslefichier.
Unnumrod'erreurngatifsierreur.
**
$43FattribFixeoudemandelesattributsd'unfichier
WORDFattrib(nmfich,drap,attribs)
char*nmfich;
WORDdrap;
WORDattribs;
'nmfich'pointesuruncheminter minpar0.Si'drap'alavaleur
1,lesattributsdefichier'attribs'sontfixs(pasdevaleurde
retour).Si'drap'est0,ilssontretourns.
Lesbitsd'attributssont:
_________________________________________________________
|masq ue|description|
|||
|$01|fichierlectureseule|
|$02|fichiertransparentaurpertoire|
|$04|fichier'systme'|
|$08|fichiercontenantunnomdevolume(11octets)|
|$10|fichiersousrpertoire|
|$20|fichiercritpuisrefer m|
|________|________________________________________________|
REMARQUELebitd'archivage,$20,nesemblepasmarchercomme
prvu.
**
$45FdupDupliq ueunidentificateurdefichier
WORDFdup(idfich)
WORDidfich;
L'identificateur'idfich'doittreunidentificateurstandard(0
5).Fdup()retourneunidentificateurnonstandard(suprieurou
gal6)q uipointelemmefichier.
RETOURUnidentificateurou:
EIHNDL'idfich'n'estpasunidentificateurstandard
ENHNDLPlusd'identificateurnonstandard
**
$46FforceForceunidentificateurdefichier
Fforce(stdh,nonstdh)
WORDstdh;
WORDnonstdh;
Forcel'identificateurstandard'stdh'pointerlemmefichier
oupriphriq ueq uel'identificateurnonstandard'nonstdh'.
RETOUR0siOK
EIHNDLidentificateurinvalide.
**
$47DgetpathDemandelerpertoirecourant
voidDgetpath(buf,driveno)
char*buf;
WORDdriveno;
Lerpertoirecourantpourlelecteur'driveno'estrecopidans
'buf'.Lenumrodelecteurcommence1pourlelecteurA:,2
pourleB:,etc...,0spcifiantledisq uepardfaut.
REMARQUE

Lataillemaximumd'uncheminn'estpaslimiteparlesys
tme.C'estl'applicationdefournirassezdeplacepourle
tampon.128octetssemblentsuffisantspour8ou9sousrper
toires.
**
$48MallocDemanded'allocationmmoire
LONGMalloc(taille)
LONGtaille;
Si'taille'est1L($FFFFFFFF)lafonctionretournelatailledu
plusgrandbloclibredusystme.Autrementsi'taille'est
diffrentde1L,lafonctionessaied'allouer'taille'octetspour
leprogrammeencours.Lafonctionretourneunpointeursurle
dbutdublocallousitouts'estbienpass,ouNULLs'iln'exis
taitpasdeblocassezgrandpoursatisfairelareq ute.
REMARQUE
Unprogrammenepeutavoir,uninstantdonnplusde20blocs
allouspar'Malloc()'.Dpassercettelimitepeutdsemparerle
GEMDOS.(Ilestcependantpossibledefairelenombrede
'Malloc()'q uel'onveutconditiondelesfairesuivrepar
l'appeldelafonctionMfree(),20tantlenombremaximumde
fragmentsq u'unprogrammepeutgnrer).
**
$49MfreeLibrationdemmoire
WORDMfree(adbloc)
LONGadbloc;
Libreleblocmmoirecommenant'adbloc'.Leblocdoittreun
deceuxallousparMalloc().
RETOUR
0silalibrations'estbienEffectue.
ERRORoulenumrod'erreurapproprisinon.
**
$4AMshrinkRtrcitlatailled'unblocallou
WORDMshrink(0,bloc,nouvtail)
WORD)0;
LONGbloc;
LONGnouvtail;
Rtrcitlatailled'unblocmmoireallou.'bloc'pointesurla
pagedebased'unprogrammeousurunblocdemmoirealloupar
Malloc(),'nouvtail'estlanouvelletailledubloc.
Lepremierargumentdublocdoittreunmotnul.
RETOUR
0sil'ajustementdetailletrussi.
EIMBAsil'adressedublocmmoiretaitinvalide.
EGSBFsilanouvelletailledemandetaitErrone.
REMARQUE
unblocnepeuttreq uertrci;lanouvelletailledubloc
doitforcmenttreinfrieurelaprcdente.
N.D.T.:Lecom pilateur'C'Alcyonrajoute,lorsdelacompilation,
lepremierparamtred'appel'0'.Ilnefautdoncpaslemettre
dansl'appeldelafonctionsil'onsesertdececom pilateur.
Appeldelafonctionavecle'C'Alcyon:Mshrink(bloc,nouvtail);
**
$4BPexecCharge/Excuteunprogramme
WORDPexec(mode,ptr1,ptr2,ptr3)
WORDmode;
char*ptr1;
char*ptr2;

char*ptr3;
Cettefonctionper metdiffrentesutilisationsselonledrapeau
'mode':
___________________________________________________________
|mode|ptr1|ptr2|ptr3|
|||||
|0:chargeet|lefichier|lejeude|lachaned'|
|excute|excuter|commandes|environnement|
|||||
|3:charge|lefichier|lejeude|lachaned'|
|sanslancer|charger|commandes|environnement|
|||||
|4:excute|l'adr.dela|(inutilis)|(inutilis)|
|uniq uement|pagedebase|||
|||||
|5:creune|(inutilis)|lejeude|lachaned'|
|pagedebase||commandes|environnement|
|______________|______________|_____________|_______________|
Lenomdufichierchargerouexcuter,'ptr1',etlachanedu
jeudecommandes,'ptr2',sontdeschemins,ter minspar0.La
chaned'environnement'ptr3',estsoitNULL(0L),soitun
pointeursurunestructuredechanedelafor me:
"chane1\0"
"chane2\0"
etc...
"chane3\0"
"\0"
Lachaned'environnementpeuttren'importeq uelnumrode
chanefinieparun0,suivieparunechanenulle(unsim ple0).
Leprogrammehrited'unecopiedelachaned'environnement
parentesi'ptr3'est'NULL'.
Lemode0(chargeetexcute)chargeralefichierspcifi,
composerasapagedebase,etl'excutera.Lavaleurretournepar
Pexec()seralecodedesortieduprocessusenfant(voirPter m0()
etPter m()).
Lemode3(chargesansexcuter)chargeralefichierspcifi,
composeralapagedebase,etretourneraunpointeursurcette
pagedebase.Leprogrammen'estpasexcut.
Lemode4(excuteseulement)reoitunpointeursurunepagede
base.Leprogrammecommencesonexcutionaudbutdelazonede
texte,commespcifidanslapagedebase.
Lemode5(crationd'unepagedebase)alloueraleplusgrand
bloclibredemmoireetcreralaplusgrandepar tiedesapage
debase.Quelq uesentrescommelatailledeszonesde
texte/donnesinitialises/donnesnoninitialisesetleur
adressedebaseNESONTPASinstalles.Leprogrammeappelantena
lacharge.
Unprogrammeenfanthritedesdescripteursdefichiersstandards
desonparent.IlemploieenfaitunappeldeFdup()etde
Fforce()surlesidentificateurs05.
Puisq uelesressourcessystmesontallouslorsdelacrationde
lapagedebase,leprocessusengendrDOITseter minerenles
librant.Ceciestpar ticulirementimportantlorsdel'emploi

d'overlays.(voir'lelivredecuisinedePexec'pourplusde
dtailssurPexec()).
**
$4CPter mTer mineunprogramme
voidPter m(retcode)
WORDretcode;
Ter mineleprogrammecourant,fer metouslesfichiersouvertset
librelammoirealloue.Retourne'retcode'auprocessusparent.
**
$4EFsfirstRecherchelapremireoccurenced'unfichier
WORDFsfirst(fspec,attribs)
char*fspec;
WORDattribs;
Recherchelapremireoccurencedufichier'fspec'.Lespcifi
cateurdefichierpeutcontenirdescaractresspciaux('?'ou
'*')danslenomdefichiermaispasdanslechemindespci
fication.'attribs'contrleletypedefichierq useraretourn
parFsfirst().Sonfor matatdcritdansladocumentationsur
'Fattrib()'.
Si'attribs'estzro,lesfichiersnor mauxserontseuls
recherchs(aucunnomdevolume,fichiercach,sousrpertoireou
fichiersystmeneseraretourn).Si'attribs'estpositionnsur
lesfichierscachsousurlesfichierssystmes,alorsceux_ci
serontprisencomptepourlarecherche.Si'attribs'estposi
tionnpourtrouverunnomdevolume,alorsseulslesnomsdevolu
meserontrecherchs.
Lorsq u'unfichieresttrouv,unestructurede44octetsest
critel'emplacementpointparleDTA.
_________________________________________________
|offset|taille|contenus|
||||
|020||(rservs)|
|21|octet|bitsd'attributs|
|22|mot|heuredecration|
|24|mot|datedecration|
|26|long|tailledufichier|
|30|14octets|nometextensiondufichier|
|________|__________|_____________________________|
Lenomdefichieretsonextensionseter minentpar0,etne
contiennentpasd'espaces.
RETOUR0silefichierattrouv
EFILNFsilefichiern'apasttrouv,oule
numrod'erreurappropri.
**
$4FFsnextRecherchedesoccurencessuivantes
WORDFsnext()
Recherchelesoccurencessuivantesd'unfichier.Lapremire
occurencedevratrerechercheparFsfirst().Lesoctetsde0
20doiventresterinchangsdepuisl'appeldeFsfirst()oudepuis
ledernierappeldeFsnext().
RETOUR0silefichierattrouv
ENMFILs'iln'yaplusdefichierstrouvs,oulenumro
d'erreurappropri.
**
$56FrenameRenommeunfichier
WORDFrename(0,ancnom,nouvnom)
WORD)0;
char*ancnom;
char*nouvnom;

Renommeunfichier'ancnom'en'nouvnom'.Lenouveaunomnedoit
pasdjexistermaispeuttredansunautrerpertoire.
Lepremierparamtredoittre0(mot).
RETOUR0siOK
EACCDNsilenouveaunomexistedj
EPTHNFsil'anciennomn'apasttrouv
ENSAMEsil'identificateurdedisq ue(A,B,..)n'est
paslemmepourlesdeuxnoms.
**
$57FdatimeFixeoudemandelemomentdecrationd'unfichier
voidFdatime(idfich,pttemp,drap)
WORDidfich;
LONGpttem p;
WORDdrap;
Lefichierestreconnuparsonidentificateur'idfich'.'pttemp'
pointesurdeuxmotscontenantl'heureetladateenfor matDOS
(l'heuresetrouvedanslepremiermot,ladatedanslesecond).
Si'drap'est1,ladateetl'heuresontplacesdanslefichier
partirde'pttemp'.
Si'drap'est0,ladateetl'heuresontluesetplacesdans
'pttemp'.
**

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

********TABLEAUDESVECTEURSD'INTERRUPTIONDU68000ETDU68901
*******

Note:surleSTlesinterruptionsdeniveaux13et5nesont
pas
cbles(unebrochedu68000n'estpasconnecte).

LesvecteurslisauMFP68901sontplacsdanslazonedes
vecteurs
d'interruptionsutilisateurs.Touteslesinterruptionsvenantdu
MFP
sontprisesencompteparle68000commetantdeniveau6.

L'ordredeprioritinterneauMFPvade15(prioritmaxi.)
0
(prioritmini.).Cetordreestgalementceluidesbitsdans
tous
registresduMFPetassuredoncunecorrespondancesimple
retenir
entrepositiondesbitsservantrgleruneinterruptionetniveau
de
prioritdecelleci.

+
+
*NiveauAdresseDescription
*

+
+
*7$7CNMI(Reset)
*
*6$78MFP68901
*
*5$74
*
*4$70VBL,retourd'image
*
*3$6C
*
*2$68HBL,retourdeligne
*
*1$64
*
*
+
*Niveau6:MFP68901
*
*
*
*15$13CDtectiondemoniteurmonochrome
*
*14$138IndicateurdesonnerieRS232
*
*13$134TimerA(disponible)
*
*12$130TamponderceptionRS232plein
*
*11$12CErreurderceptionRS232
*
*10$128Tam pond'missionRS232vide
*
*9$124Erreurd'missionRS232
*
*8$120TimerB,Compteurinterruphorizontales
*
*7$11CContrleurdedisq ueetdeDMA
*
*6$118ACIA6850(MIDIetClavier)
*
*5$114TimerC(Horlogesystme200Hz)
*
*4$110TimerD(Horlogedecadencement
RS232)*
*3$10CContrleurvido(find'opration)
*
*2$108CTSdel'E/Ssrie
*
*1$104DCDdel'E/Ssrie
*
*0$100LigneBUSYdel'interfaceparallle
*
*
*
+
+

COURS D'ASM 68000


(par le Froce Lapin)

retour au VOLUME 1

Mnemonic:S:Size:Source:Destination:Flags:Instr.for mat
:Il
...........::BWL:0123456789AB:0123456789AB:XNZVC:BBBB............:
++++++
+
ABCDS,D:v:B:04:04:*U*U*:
1100ddd10000msss:2
ADDS,Dn:^:BWL:0123456789AB:2345678:*****:1101rrroooeeeeee:
2
ADDAe,An::WL:0123456789AB:1::1101rrroooeeeeee:
2
ADDI#,e::BWL:B:02345678:*****:00000110lleeeeee:
2/6
ADDQ#,e::BWL:B:012345678:*****:0101###0lleeeeee:
2
ADDXS,Dn:v:BWL:04:04:*****:
1101ddd1ll00msss:2
ANDe,Dn:^:BWL:023456789AB:02345678:**00:1100rrroooeeeeee:
2
ANDI#,e::BWL:B:02345678:**00:00000010lleeeeee:
2/6
ANDI#,CCR::B:B::*****:
0000001000111100:4
ANDI#,SR:p:W:B::*****:
0000001001111100:4
ASwS,Dn::BWL:0B:0:*****:1110cccwlli00rrr:
2
ASwe::W::2345678:*****:1110000w11eeeeee:
2
Bcclabel::BW::::
0110CCCCDDDDDDDD:2/4
BCHGS,e::BL:0B:02345678:*:0000rrri01eeeeee:
2/6
BCLRS,e::BL:0B:02345678:*:
0000rrri10eeeeee:2/4
BRAlabel::BW::::
01100000DDDDDDDD:2/4
BSETS,e::BL:0B:02345678:*:
0000rrri11eeeeee:2/4
BSRlabel::BW::::
01100001DDDDDDDD:2/4
BTSTS,e::BL:0B:023456789AB:*:
0000rrri00eeeeee:2/4
CHKe,Dn::W:023456789AB:0:*UUU:0100rrr110eeeeee:
2
CLRe::BWL::02345678:0100:01000010lleeeeee:
2
CMPe,Dn::BWL:0123456789AB:0:****:1011rrroooeeeeee:
2
CMPAe,An::WL:0123456789AB:1:****:1011rrroooeeeeee:
2
CMPI#,e::BWL:02345678:B:****:00001100lleeeeee:
2/6
CMPMS,D::BWL:3:3:****:
1011ddd1ll001sss:2
DBccDn,lbl::W:0:8::0101CCCC11001rrr:
4
DIVSe,Dn::W:023456789AB:0:***0:1000rrr111eeeeee:

2
DIVUe,Dn::W:023456789AB:0:***0:1000rrr011eeeeee:
2
EORDn,e::BWL:02345678:02345678:**00:1011rrr100eeeeee:
2
EORI#,e::BWL:B:02345678:**00:00001010lleeeeee:
2/6
EORI#,CCR::B:B::*****:
0000101000111100:4
EORI#,SR:p:W:B::*****:
0000101001111100:4
EXGR,R::L:01:01::1100rrr1mmmmmrrr:
2
EXTDn::WL::0:**00:0100100mmm000rrr:
2
JMPe::::256789A::0100111011eeeeee:
2
JSRe::::256789A::0100111010eeeeee:
2
LEAe,An::L:256789A:1::0100rrr111eeeeee:
2
LINKAn,#:::1:B::0100111001010rrr:
4
LSwS,Dn::BWL:0B:0:***0*:1110cccwlli01rrr:
2
LSwe::W::2345678:*****:1110001w11eeeeee:
2
MOVEe,e::BWL:0123456789AB:02345678:**00:00lldeadeaseasea:
2
MOVECCR,e::W::02345678::0100001011eeeeee:
2
MOVEe,CCR::W:023456789AB::*****:0100010011eeeeee:
2
MOVEe,SR:p:W:023456789AB::*****:0100011011eeeeee:
2
MOVESR,e::W::02345678::0100000011eeeeee:
2
MOVEUSP,An:^p:L:1:1::010011100110wrrr:
2
MOVEAe,An::WL:0123456789AB:1::00llrrr001eeeeee:
2
MOVECRc,R:^p:L::01::010011100111101w:
::::::Rrrrcocococococo
:4
MOVEMRL,e::WL:01:245678::010010001leeeeee:
4
MOVEMe,RL::WL:2356789A:01::010011001leeeeee:
4
MOVEPDn,D:^:WL:0:5::
0000sssmmm001ddd:4
MOVEQ#,Dn::L:B:0:
**00:0111ddd0########:2
MOVESS,e:^p:BWL:01:2345678::00001110lleeeeee:
::::::Rrrrw00000000000
:4
MULSe,Dn::W:023456789AB:0:**00:1100rrr111eeeeee:
2
MULUe,Dn::W:023456789AB:0:**00:1100rrr011eeeeee:
2
NBCDe::B::02345678:*U*U*:0100100000eeeeee:
2
NEGe::BWL::02345678:*****:01000100lleeeeee:
2

NEGXe::BWL::02345678:*****:01000000lleeeeee:
2
NOP::::::
0100111001110001:2
NOTe::BWL::02345678:**00:01000110lleeeeee:
2
ORe,Dn:^:BWL:023456789AB:02345678:**00:1000rrroooeeeeee:
2
ORI#,e::BWL:B:02345678:
**00:00000000lleeeeee:2/6
ORI#,CCR::B:B::*****:
0000000000111100:4
ORI#,SR:p:W:B::*****:
0000000001111100:4
PEAe::L::256789A::0100100001eeeeee:
2
RESET:p:::::
0100111001110000:2
ROwS,D::BWL:0B:0:**0*:1110cccwlli11rrr:
2
ROwe::W::2345678:**0*:1110011w11eeeeee:
2
ROwXS,D::BWL:0B:0:***0*:1110cccwlli10rrr:
2
ROwXe::W::2345678:***0*:1110010w11eeeeee:
2
RTD#::W::B::
0100111001110100:4
RTE:p::::*****:
0100111001110011:2
RTR:::::*****:
0100111001110111:2
RTS::::::0100111001110101:2
SBCDS,D:v:B:04:04:*U*U*:
1000rrr10000mrrr:2
Scce::B::02345678::0101CCCC11eeeeee:
2
STOP#:p:W:B::*****:
0100111001110010:4
SUBe,Dn:^:BWL:0123456789AB:2345678:*****:1001rrroooeeeeee:
2
SUBAe,An::WL:0123456789AB:1::1001rrroooeeeeee:
2
SUBI#,e::BWL:B:02345678:*****:00000100lleeeeee:
2/6
SUBQ#,e::BWL:B:012345678:*****:0101###1lleeeeee:
2
SUBXS,D:v:BWL:04:04:*****:
1001ddd1ll00msss:2
SWAPDn::W::0:**00:0100100001000rrr:
2
TASe::B::02345678:**00:0100101011eeeeee:
2
TRAP#:::B:::010011100100####:
2
TRAPV::::::
0100111001110110:2
TSTe::BWL::02345678:**00:01001010lleeeeee:
2
UNLKAn::::1::0100111001011rrr:
2
++++++
+

QuandontravailleavecAnseuleslesoprationsenword
ouenlongwordsontpossibles.
m:Mode,0=data,1=mmoireou01000=Dn,01001=An,10001=les2
s:Sourced:Destinationp:privilgie
o:Opmode,BWLv:Eq ualaddressingmodes
000001010Dn+e=>Dn^:Operandsmaybeswapped
100101110e+Dn=>el:Taille(00=B,01=W,10=L)
e:Effectiveaddress#:Donneimmdiate
c:Countorregisterw:Direction(0=droit,
1=gauche)
i:Countwhat?0=imm,1=registerC:Condition
D:DplacementR:Typederegistre:0=data
U:Undefinedvalue
1=adresse
ll:01=B,11=W,10=L
======================================================================
====
Addr.modeModeReg.:CBin.s/uflags:CBin.s/u
flags

+
0Dn000n:CC0100sC:LS0011uc+z
1An001n:CS0101sc:LT1101sn.V
+N.v
2(An)010n:EQ0111uz:MI1011sn
3(An)+011n:F0001u0:NE0110uZ
4(An)100n:GE1100sn.v+N.V:PL1010sN
5d(An)101n:GT1110sn.v.Z+N.V.Z:T0000u1
6d(An,Xi)110n:HI0010sC.Z:VC1000uV
7A bs.W111000:LE1111sz+n.V+N.v:VS1001uv
8A bs.L111001:
9d(PC)111010:WHEREX=NOTx
Ad(PC,Xi)111011:
BImm111100:
======================================================================
====

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

*****AFFECTATIONSDESVECTEURSD'EXCEPTIONDU68000MOTOROL A
****
Dansl'ordre:Numroduvecteur,adresseendcimal,adresse
en
hexadcimal,descriptifdelazone,affectation.

00000SPRESETINITIALISATIONSSP
4004SPRESETINITIALISATIONPC
28008SDERREURBUS
31200CSDERREURD'ADRESSE
416010SDINSTRUCTIONILLEGALE
520014SDDIVISIONPARZERO
624018SDINSTRUCTIONCHK
72801CSDINSTRUCTIONTRAPV
832020SDVIOLATIONDEPRIVILEGE

936024SDTRACE
1040028SDEMULATEURLIGNE1010
114402CSDEMULATEURLIGNE1111
1248030SD(nonattribu,rserv)
1352034SD(nonattribu,rser v)
1456038SD(nonattribu,rser v)
156003CSD(noninit.vecteur)
16236404CSD(nonattribu,rserv)
9505F
2496060SDINTERRUPTIONPARASITE
25100064SDAUTOVECTEURD'INTERRUPTIONNIVEAU1
26104068SDAUTOVECTEURD'INTERRUPTIONNIVEAU2
2710806CSDAUTOVECTEURD'INTERRUPTIONNIVEAU3
28112070SDAUTOVECTEURD'INTERRUPTIONNIVEAU4
29116074SDAUTOVECTEURD'INTERRUPTIONNIVEAU5
30120078SDAUTOVECTEURD'INTERRUPTIONNIVEAU6
3112407CSDAUTOVECTEURD'INTERRUPTIONNIVEAU7
32128080SDVECTEURD'INSTRUCTIONTRAP0
33132084SDVECTEURD'INSTRUCTIONTRAP1
34136088SDVECTEURD'INSTRUCTIONTRAP2
3514008CSDVECTEURD'INSTRUCTIONTRAP3
36144090SDVECTEURD'INSTRUCTIONTRAP4
37148094SDVECTEURD'INSTRUCTIONTRAP5
38152098SDVECTEURD'INSTRUCTIONTRAP6
3915609CSDVECTEURD'INSTRUCTIONTRAP7
401600A0SDVECTEURD'INSTRUCTIONTRAP8
411640A4SDVECTEURD'INSTRUCTIONTRAP9
421680A8SDVECTEURD'INSTRUCTIONTRAP10
431720ACSDVECTEURD'INSTRUCTIONTRAP11
441760B0SDVECTEURD'INSTRUCTIONTRAP12
451800B4SDVECTEURD'INSTRUCTIONTRAP13
461840B8SDVECTEURD'INSTRUCTIONTRAP14
471880BCSDVECTEURD'INSTRUCTIONTRAP15
48631920C0SD(nonattribus,rservs)
64255256100SDVECTEURSD'INTERRUPTIONSUTILISATEURS
SD=zonededonnessuperviseur
SP=zonedeprogrammesuperviseur

Lesvecteursdenumros1223etde4863sontrser vspour
des
extensionsfutures.Aucunpriphriq uenedoitytreaffect.

Note:concernantleMFP,circuitgnrantunegrandepartie
des
interruptionsdansleST,celuiciutilise,bienvidemment,
des
vecteursd'interruptionsutilisateurs.Eneffet,lorsq u'icion
parle
d'utilisateur,cen'estpasdevousq u'ils'agit,maisdesgens
q ui
utilisele68000pourfabriq uerleursmachines,c'estdire
les
gensd'ATARI,deCOMMODOREoud'APPLE!

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 1

**********************L'EMULATEURVT52**********************
LescommandesduVT52sontappelesenaffichantlecodedelatouche
Escape(codeASCII27endcimal),suivid'unouplusieursparamtres.
Exempled'utilisationavecl'affichaged'uneligneparGEMDOS9,
fonctionCconws().
MOVE.L#MESSAGE,(SP)
MOVE.W#9,(SP)
TRAP#1
ADDQ.L#6,SP
MESSAGEDC.B27,"E",27,"p",27,"Y",42,42,"Salut",27,"q",0
Effacel'cran,passel'critureeninversevido,placelecurseur
surlaligne10,colonne10,afficheSalutetrepasseenvido
nor male.
EscapeACurseurverslehaut(s'arrtesurlebordsuprieur)
EscapeBCurseurverslebas(s'arrtesurlebordinfrieur)
EscapeCCurseurversladroite(s'arrtesurleborddroit)
EscapeDCurseurverslagauche(s'arrtesurlebordgauche)
EscapeEEffacel'cran
EscapeHPlacelecurseurdanslecoinsuprieurgauche
EscapeICurseurverslehaut(scrollingsurlebordsuprieur)
EscapeJVidel'cranpartirdelapositionducurseur
EscapeKEffacelalignepartirdelapositionducurseur
EscapeLInsreunelignevidepartirdelapositionducurseur
EscapeMEffaceunelignedansl'em placementducurseurleresteest
ramenverslehaut)
EscapeYsuivide2nombres.Placelecurseurunecertaine
position.Lepremiernombreindiq uelaligne,lesecondla
colonne.
Attention,ilfautajouter32cesnombrespourlacommande.
Escapebplusunnombrede015.Choisitcenombrecommeregistre
couleurd'criture.
Escapecplusunnombre.Idemmaispourlacouleurdefond.
EscapedVidel'cranjusq u'l'emplacementducurseur.
EscapeeActivelecurseur
EscapefDsactivelecurseur
EscapejSauvegardelapositionducurseur
EscapekRemetlecurseurlapositionsauveavecEscapej
EscapelEffacelalignedanslaq uellesetrouvelecurseur
EscapeoEffacelalignejusq u'l'emplacementducurseur
EscapepActivel'critureeninversionvido
EscapeqDsactivel'critureeninversionvido
EscapevActiveledbordementdeligneautomatiq ue
EscapewDsactiveledbordementdeligneautomatiq ue
Note:Fairebienattentionauxcommandes:certainesutilisentdes
lettresmajuscules,d'autresdesminuscules!!!

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 2

****************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Coursnumro1*
****************************************************************
Voicilasecondesriedecourssurl'assembleur68000surAtari.
Cecoursfaitsuitelapremiresrie.J'esprepourvousq ue
cettepremiresrieatparfaitementcomprise,etq ueRIENn'a
tlaissdecot.Partantdeceprincipe,nouspouvonsdireq ue
vosbasessontbiensolides,etq uenousallonspouvoirallez
beaucoupplusvite.Lapremiresrietaitdestinevous
apprendrelemcanismedefonctionnementdu68000etduSTau
niveaudesonsystmed'exploitation,lasecondesrienesera
q u'unensembledeficelles,declefsd'accsdiverschoses.Si
vousavezPARFAITEMENTtudislapremiresrie,vouspourrez
tirerdoucementsurcesficellesafindefairevenirvousles
infor mations.
Siparcontrevous'pensez'avoircom prislapremiresriemais
q uevousn'tespas'certain'detoutavoircompris,ilest
encoretempsdelarelirecard'iciq uelq uespagesvousallez
commencervoussentirperdu,ceq uiseraitbiendommage!!!Pour
vrifieruntoutpetitpeuvosconnaissances,voiciq uelq ues
q uestionstoutesbtes:
1)MOVE.L#$12345678,A0puisMOVE.W#$1234,A0
Qu'obtientondansA0?

2)MOVE.L#$12345678,A0puisMOVE.B#$12,A0
Qu'obtientondansA0?

3)Pouvezvousexpliq uerconcrtementceq uisepasselorsq ueje


faisMOVE.W#$2700,SR

4)MOVE.L#MESSAGE,(SP)Queralisecettefonction?
MOVE.W#9,(SP)
TRAP#1
ADDQ.L#4,SP
Avantdevousdonnerlesrponses,voicilaliste(non
dfinitive)deceq uiseratraitdanscettesecondesriede
cours.Lestraps(commentlesreprogrammer),laLigneA,leGEM,
lestableaux,lesprogrammesautomodifiables,lesmacros,les
inclusionsdefichiers,etc...Achaq uefois,letravail
consisteravousindiq uercommentfaireetvousfournirune
listed'ar ticles,d'ouvragesplusoumoinsprcisdansce
domaine.Ilm'asembleneffetridiculedetartinerparexemple

50pagessurleGEMalorsq uecelan'estpassusceptible
d'intressertoutlemonde.Parcontreilm'asemblnor malde
dgrossircesujetetdefournirtouteslespicesncessaires
(ou,dumoins,lespicesdontj'aiconnaissance)afinq ueceuxd'
entrevousq uidsirentraliserdesapplicationsdehautniveau
puissentlefaire.Illeurfaudrabossermaisenassembleuril
estcourantdepasserbeaucoupdetempssimplementchercherde
ladocumentation.Jevousfournisdonclalistedecelleci,
vousdevoirsivousenavezbesoin.Atitreindicatif,ladoc
q uej'utilisepourGEMsenommePROGEM,faitenviron200pages,
etesttouteenAnglais!!!!Vousvousrendezdoncbiencompteq ue
faireuncourscompletsurGEMgrossiraitdemanirestupidece
coursd'assembleur!!!!
C'estcemmeprincipeq uiserautilispourlesdiffrents
sujetsabordsdanscettesecondesrie.Voustrouverez
d'ailleurs2livrets,lepremiercomprenantlescourseuxmmes,
lesecondcomportantdecourtslistingssurlesdiffrents
sujets.Attention,ceslistingssontpourlaplupart
inutilisablessansavoirluaupralablelecourscorrespondant.
Pourfinirjevousdonnerailemmeconseilq uepourlapremire
srie:prenezvotretem ps,relisezbienchaq uechapitre,faites
despetitsprogrammesenutilisantceq uevousvenezd'apprendre!
Rsultatduconcours:Sivousavezfauxunseultruc,je
vousconseillevivementdereprendrelepremiercours!!!
1)Onobtient#$00001234dansA0.Ceuxq uiontrponduq u'on
obtenait#$12341234onttoutfaux!Eneffetonauraitobtenu
#$12341234sil'oprationavaiteulieusurunregistrede
donnes.
Surunregistred'adresseprisenoprandedestination,ilya
extensionsurlepoidsfort.L,yenadj50%q uireprennentla
srie1......
2)Onn'obtientriendutoutparceq u'onnepeutpasassembler!!!
Onnepeuttravailleravecunregistred'adressecommeoprande
destinationq uesurlefor matwordoulongwordmaispassurle
for matbyte.
3)$2700celadonneenbinaire%0010011100000000.Sionplaq uece
nombresurleStatusRegister(ceuxq uicroyaientq ueSRc'tait
lapileetq uiondoncconfonduavecSPdoiventimprativement
recommencerlasrie1enentier,ilssontjusteprtspourne
riencomprendrelasuite!),onserendcompteq uelesbitsmis
1danscenombrecorrespondentauxbitsS,I2,I1etI0.
CommeonnepeuttaperdansleSRq u'enmodesuperviseur,onen
dduitq u'unetelleoprationnepeutsefaireq uedanscemode.
NotreMOVEconservedonclebitsuperviseurdansl'tat1puis
forcelesbitsdcrivantleniveaud'interruption1.Leniveau
d'interruptionminimalprisencoursestdoncleniveau7q uiest
leniveaumaximum.Enrsum,nousvenonsdebloq uer,d'interdire
lesinterruptions.
4)Cettefonctionralise2choses.Toutd'abordl'affichagedu
textesitul'adresseMESSAGE.C'esteneffetlafonction
Cconws()dugemdos.Maiscettefonctionraliseaussiautre
chose....unejoyeuseerreur!carenpassantl'adressepuisle
numrodelafonctionnousavonsmodifilapilede6bytes(un
longwordpourl'adresseetunwordpourlenumrodefonction)
ornousnecorrigeonsq uede4!!!!!

D'aprsvosrponses,vouspouvezcontinueroualors
recommencerlasrie1avecunpeumoinsd'empressement.Ilfaut
TOUTcomprendre,c'estalesecret.Sivousavezcommisq uelq ues
erreursetq uevoulezcependantattaq uerdirectementlaseconde
srie,nesoyezpastonnd'abandonnerl'assembleurdans
q uelq uesmois,dcouragpardesmontagnesdelistingsauxq uels
vousnecomprendrezrien!
Boncourage

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 2

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Coursnumro2*
******************************************************************
Nousvoicidoncrepartispourdenouvellesaventures!Cesecond
coursaurapoursujetlesTRAPetplusprcismentcommentles
programmersoitmme.Nousavionsvu,danslapremiresrie,q ue
lestrapstaientunexcellentmoyend'accderausystmed'ex
ploitation,etplusgnralementd'accderdesespacesprotgs
(uniq uementaccessibleenmodeSuperviseur).Nousavionsgale
menttudilepassagedesparamtresparlapile,ceq uinous
avaitservipourraliserdessubroutinesavecparamtres.
Lepremierexemplevaconsisterchangerlacouleurdufondde
l'cran,avecuneroutinefabricationmaison,q uiseraappele
paruntrap.
D'abordlaroutine:
Etantdonnq u'untrapesttoujoursexcutenSuper viseur,nous
n'hsitonspasutiliserlesadressessystme.Lapalettede
couleursduSTestsituel'adresse$FF8240.Chaq uecouleur
tantcodesurunmot,lacouleur0esten$FF8240,lacouleur1
en$FF8242etc...
Nousallonsfaire2routines.Uneq uimettralefondenrouge,
l'autreq uimettralefondenvert.Lesvoici:
ROUGEMOVE.W#$700,$FF8240
RTE
VERTMOVE.W#$070,$FF8240
RTE
Unetiq uetteper metdelesreprer(ROUGEetVERT).Lescouleurs
tantcodesenRVB(rouge/ver t/bleu.OntrouveaussiRGBq uiest
latraductionanglaise:red/green/blue)etlesniveauxvarientde
07.Nousremarq uonsq uelesroutinesneseter minentpaspar

RTSmaisparRTE.CelasignifieReturnfromexception.Ils'agit
bieneneffetd'unretourd'exceptionetnonpasduretourd'une
subroutineclassiq ue.
Petitrappel:RTEselit"returnfromexception".Jevousrappelle
q u'ilfautTOUTlireenAnglaisetpassecontenterdelirel'abr
viationdontlasignificationestsouventassezvasive.
Voicileprogramme'enentier'.
MOVE.L#MESSAGE,(SP)toujourssympadeseprsenter
MOVE.W#9,(SP)
TRAP#1appelGEMDOS
ADDQ.L#6,SP
*Fixerlesvecteurd'exception
MOVE.L#ROUGE,(SP)adresse'routine'
MOVE.W#35,(SP)numrodevecteurdutrap#3
MOVE.W#5,(SP)fonctionSetexec()
TRAP#13dubios
ADDQ.L#8,SP
MOVE.L#VERT,(SP)adresse'routine'
MOVE.W#36,(SP)numrodevecteurdutrap#4
MOVE.W#5,(SP)fonctionSetexec()
TRAP#13dubios
ADDQ.L#8,SP
*Lesroutinessontdoncmaintenantaccessiblesparletrap3et
parletrap4.
BSRTOUCHE
TRAP#3
BSRTOUCHE
TRAP#4
BSRTOUCHE
TRAP#3
BSRTOUCHE

MOVE.W#0,(SP)
TRAP#1
**
ROUGEMOVE.W#$700,$FF8240
RTE

VERTMOVE.W#$070,$FF8240
RTE
**
TOUCHEMOVE.W#7,(SP)
TRAP#1
ADDQ.L#2,SP
RTS
**
SECTIONDATA
MESSAGEDC.B27,"E","LESTRAPS",0
Facilen'estcepas?Etbienmaintenantq uevoussavezmettre
vospropresroutinesenTRAPetq uevoussavezgalementpasser
desparamtresunesubroutine,ilnevousresteplusq u'
fairelammechose.J'estimeq uevoustesassezgrandpourle
fairetoutseuletc'estpourcetteraisonq uenousn'allonspas
lefaireici.Avousdetravailler!Uneseuleprcaution
prendre:Unesubroutinen'abesoinq uedel'adressederetouret

doncn'em pileq uecela.UnTRAPparcontre,dufaitq u'ilpasse


enSuperviseur,sauvegalementleStatusRegister.Ilnefaut
doncpasoublierdeleprendreencomptepourcalculerlesaut
q uivousper mettradercuprervosparamtrespassssurla
pile.L'adressederetourestbiensrcodesur4bytesetle
StatusRegistersur2.Ilyadoncempilagede6bytesparle
TRAPq uilesdpileautomatiq uementauretourafinderetrouver
d'oilvientetafingalementderemettrecommeavantleStatus
Register.Ilnefaudrapasnonplusoublierdecorrigerlapile
auretour.
Commed'habitude,prenezvotretempsetfaitesdenombreuxpetits
essaisafindeparfaitementcomprendrelasystme.
RegardezgalementattentivementlafonctionduBiosq uinousa
servimettreenplacenosdeuxroutines.Siaulieudelui
fournirlanouvelleadressepourlevecteur,nousluipassons1,
cettefonctionnousretourne,dansD0.L,l'adresseactuelle
correspondantcevecteur.Riennenousempchedoncdedemander
l'adresseutiliseparleTRAP#1(Gemdos),detransfrercette
adressedansletrap#0(parexemple)etdemettrenotrepropre
routinedansleTRAP#1.Celapeutaussivousser virpour
dtournerleTRAP.Parexemplepourgnrerautomatiq uementdes
macros.Ilestpossibled'imaginerainsiunprogrammersidenten
mmoire,q uiestplaclaplacedutrap13(Bios).Achaq ue
foisq u'ilyaunappelauBios,c'estdoncnotreroutineq uiest
dclenche.Etantdonnq uelesappelssefontavecempilage
desparamtres,ilesttoutfaitpossibledesavoirq uelle
fonctionduBiosonveutappeler.Ilestalorspossiblederagir
diffremmentpourcertainesfonctions.Celaper metparexem plede
testerdesappuissurAlternate+touchesdefonctionetdansce
cas,d'allercriredesphrasesdanslebufferclavier,ceciafin
degnrerdesmacros!
Note:Untrapnepeutfaireappeldestrapsplacs'audessous'
delui.Ainsi,dansuntrap#1,ilesttoutfaitpossible
d'appeleruntrap#13maisl'inversen'estpaspossible.
Exemplecurieuxetintressant:
MOVE.W#"A",(SP)
MOVE.W#2,(SP)
TRAP#1
ADDQ.L#4,SP
MOVE.W#0,(SP)
TRAP#1
Cecourtprogrammenedoitpasposerdeproblme.NousaffichonsA
puisnousq uittons.Assemblezle,puispassezsousMONST.
Appuyezsur[Control]+P.Vouschoisissezalorslesprfrences
deMONST.Par micellesci,ilya"followtraps",c'estdire
suivrelesTRAPsq ui,pardfaut,estsur"NO".TapezYpourYES.
Unefoislesprfrencesdfinies,faitesavancervotreprogramme
paspasaveccontrol+Z.Aladiffrencedesautresfois,
lorsq uevousarrivezsurleTRAPvousvoyezceq uisepasse.Ne
voustonnezpas,celavatreassezlongcarilsepasse
beaucoupdechosepourafficheruncaractrel'cran.Leplus
tonnantvatrel'appelautrap#13.Ehoui,pourafficherun
caractreleGEMDOSfaitappelauBios!!!!!
Uneautreexpriencetoutaussiintressante:
MOVE.W#"A",(SP)

MOVE.W#2,(SP)
MOVE.W#3,(SP)
TRAP#13
ADDQ.L#6,SP
MOVE.W#0,(SP)
TRAP#1
AffichagedeAmaiscettefoisaveclafonctionBconout()du
Bios.AssemblezpuispassezsousMONSTavecunsuividestraps.
Lorsq uevousarrivezdansleBios(doncaprslepassagesur
l'instructionTRAP#13),faitesavancerpaspasleprogramme
maisdetem psentempstapersurlalettreV.Celavousper metde
voirl'cran.PourrevenirsousMONSTtapezn'importeq uelle
touche.Avancerencoredeq uelq uesinstructionspuisretaperV
etc...Auboutd'unmomentvousverrezapparatrelalettreA.
Rflchissezlanotiond'crangraphiq ueetlanotiondefon
tesetvouscomprendrezsansmalceq uisepasse.Sur prenantnon?
Quelq uespetiteschosesencore:suivezlestrapsduBios,Xbios
GemDosetregardezceq uisepasseaudbut.Vousvousrendrez
compteq u'ilyasauvegardedesregistressurlapile.Seulement
iln'yapassauvegardedeTOUSlesregistres!SeulsD3D7/A3A6
sontsauvsetdonclecontenudeD2estpotentiellementcrasa
bleparunappelausystmed'exploitation.Lapr udenceestdonc
conseille.EnsuivantgalementlesTRAPsvousapercevrezUSP.
CelasignifieUserStackPointerc'estainsiq uel'ondsignela
pileutilisateur.
Voil,nor malementlestrapsn'ontplusdesecretpourvous.Vous
devezsavoirleurpasserdesparamtres,lesreprogrammeretc...
Vousdevezmmevousrendrecompteq u'ensuivantlesfonctionsdu
systmed'exploitation,ondoitpouvoirdcouvrircommentsefont
telleettellechoses,etainsipouvoirrcriredesmorceauxde
routines.

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 2

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Coursnumro3*
*****************************************************************
Avantdecontinuertudiercescours,jepenseq u'ilestgrand
tem pspourvousd'tudiertouteslesinstructionsdu68000.Vous
avezdjsuffisammentdebasespourraliserdepetitsprogrammes
etsurtoutvousdevezvoustrehabituaveclesystmeq ui
consistetaperseulement2ou3lignesdeprogrammespuis
visualiserleurfonctionavecMONST.

Prenezdoncl'ouvragesurle68000q uevousaveznor malementac


q uis,etfaitesletourdetouteslesinstructionsaveccettem
thode.Observezbienlesrsultatsdesoprationsdedcalages
(ASL,ASRetc..)Ilnes'agitpasicidelesconnatreparcoeur
maisaumoinsdesavoirq u'ellesexistentpourpouvoir,lecas
chant,lesretrouverfacilement,etsurtoutd'trecapablede
comprendreceq u'ellesfont.Lenombred'instr uctionsestfaible
maischacuned'elleraliseuneoprationbienprciseq u'il
convientdeconnatredanssesmoindresdtails.Ilnesuffitpas
desavoirq ueRORraliseunerotationversladroite,ilfaut
galementsavoirq uelebitjectd'uncotestremisdel'autre
et,q u'enplus,ilestrecopidanslebitCduSR.Ilfautre
marq ueraussiq ueROR#4,D0estacceptmaispasROR#9,D0.Dans
cecasilfautfaire2RORouMOVE.W#9,D1puisRORD1,D0.C'est
cegenredepetitstrucsq uivousbloq uerontplustardsivous
n'avezpaspassq uelq uesheureslesdcor tiq uer!
LESINCLUSIONSDEFICHIERS
L'undesplusgrosproblmedel'ASSEMBLEURsesitueauniveaude
latailledeslistings.SienBASICunelignesuffitpourune
oprationparfoistrscomplexe,nousavonsvuq u'enASSEMBLEURce
n'taitpaslecas.Parcontrenousavonsvugalementq ue
l'critureenASSEMBLEURconsistaittaperlebonnombred'ins
tructionmachine,alorsq uelecompilateurduBASIC,duCoudu
PASCALsedbrouillefaireunetraduction'q uimarche'etq ui
n'estdoncpasforcmentlaplusconomiq ueauniveautailleet/ou
auniveauvitesse.
Encontrepartie,nossourcesASSEMBLEURfonttrsrapidementdes
pagesetdespagesl,ounprogrammeurtravaillantavecunlan
gage'volu'n'auraitq ueq uelq uesdizainesdelignes.Ilexiste
cependantq uelq uesmthodesper mettantnonpasd'viterces
multiplespages,maisderduiresensiblementlatailledulisting
surleq uelnoustravaillons.
Deuxdirectivesvontprincipalementnousservir.Attention,cene
sontpasdesinstructionsASSEMBLEUR,maisdesordresinter prts
parl'ASSEMBLEUR.Cesontdonc,dansnotrecas,desinstructions
'Devpack'etnonpasdesinstructions'68000'.
Lapremire,INCBIN,per metd'incor porerdansleprogrammeun
fichierbinaire.Unfichierbinairecelapeuttreuneimage,de
ladigit,desspritesetc...oubienunmorceaudeprogrammeq uia
tassemblsousfor medefichierbinaire.Voiciunexempleavec
uneimage.(listing1srie2)
Toutd'abordnoustransfronsl'adressedel'imageenA6,nous
sautonsl'enttedecellecipourpointersurlescouleursq ui
sontmisesenplaceavecXbios(6),nouscherchonsensuitel'adres
sedel'cranaveclafonctionXbios(3)puis,aprsavoirsautla
palettedecouleursdenotreimage,noustransfronscetteimage
surl'cran.Uncranfait32000octets.Sinoustransfrons
longmotparlongmot,nousnedevonstransfrerq ue32000
divispar4c'estdire8000longmots.Commenousutilisons
uneboucleDBFq uicomptejusq u'0com pris(laboucles'arrte
q uandlecompteuratteint1),ilfautdoncinitialiserle
compteur7999.Ensuiteattented'appuisurunetoucheetbye
bye.
Petitexerciceducatif.Unefoisceprogrammeassembl,suivezle
sousMONST.Lorsq ueXbios(3)auradonnl'adressedel'cran,pla
cezlafentre3surcetteadressepuiscontinuezfaireavancer

paspasleprogramme,pourvoirlarecopiesefaire.Detempsen
tem pstapezsurlatoucheVafindevoirl'cranaulieudeMONST,
vouspourrezainsisuivrel'affichage'endirect'!!!
Autrepetitexercice:LeSTpossdelapar ticularitd'avoiren
q uelq uesorte2crans:l'cransurleq uelontravaille(Xbios(2))
etceluiq uel'onvoit(Xbios(3)).Danslaplupartdescasil
s'agitdummemaisilesttoutfaitpossibledelesplacer
desendroitsdiffrentsdelammoireetainsideprparerun
affichagedansxbios2toutenmontrantXbios3.Ilseraainsi
possibled'afficherrapidementXbios2enletransfrantdans
Xbios3,etainsi,defairedesanimationsrapides.Essayezdoncde
changerunpeulelistingetdemettreMOVE.W#2,(SP)la
placede3pourlarecherchedel'cran.Dbuggezleprogrammeet
constatez!
Maiscecinousloigneunpeudusujetq uitaitl'inclusion.Pour
ralisercecinousavonsjustefourniunlabeldereprageq uiest
iciIMAGEpuisl'instructionINCBINsuividucheminpourtrouver
cetteimage.Dansl'exemplec'estuneimagePI3maisriennevous
empchedemettreuneimagePI2ouPI1!Nousaurionstrsbienpu
mettre2imagesl'unelasuitedel'autre,sansmettredelabel
pourreprerlaseconde.Pourpointerdessus,sachantq u'une
imageDEGASfait32066octets,nousaurionsfait:
LEAIMAGE,A6
ADDA.L#32066,A6
Jerappelleq uecelaselit:loadeffectiveaddressIMAGEdansA6
addaddresslong...
Petitexercice:faireunprogrammeq uitourneenmoyennerso
lution,passeenbasse,afficheuneimagebassersolution,attend
unappuisurunetouchepuisrepasseenmoyenne.Sachantutiliser
lesfonctionsXbiosetlesboucles,vousdevrieztrecapablede
faireuneroutinedesauvegardedelapaletteetuneautrede
restitutiondecelleci.
Ilesttoutfaitpossibled'inclureainsidesfichierstrs
divers.Ilexistepourtantplusieursproblmes.Toutd'abordla
tailleduprogrammersultant.Eneffet,notreimageDEGAS,de
par tsataille,agrossinotreprogrammede32Ko!Biensrilya
maintenantl'avantagedepouvoirempcherlesbidouilleursde
venirymettreleurpieds!Encoreq u'uneimageDEGASfait
toujourslammetaille,maisilestpossibled'inclureuneimage
compacte(enmettantbiensruneroutinededcompactagedans
notreprogramme!).
Autreproblme,letemps!Eneffet,sil'affichageluimmeest
plusrapidedufaitq u'iln'yapasallerchercherl'imagesur
ladisq uettepuisq uecetteimageestdjenmmoireavecle
programme,c'estl'assemblageq ueapdale!!!Ilfautdoncpas
serpardesmcanismesdetravailbienordonns.Mettreenplace
undisq uevir tuel(deprfrencersistantauReset)recopierles
imagesdedansetensuitecommencertravailler.Vouscom prendrez
bienvitepourq uoilespossesseursde520onttoutintrtles
fairegonflerunmgaminimumetpourq uoiunlecteurexterneou
mieuxundisq uedurdevientviteindispensable!!!
Aprsavoirvulemcanismed'inclusiondefichiers,nousallons
nousintressermaintenantauxinclusionsdelistings.Ilesten
effetpossibledeprendreunboutdelisting,delesauversur
disq uetteetdedemanderl'assembleurdel'inclurelorsdel'as
semblage.Laussi,pertedetempsl'assemblagemaisgainde

tem pstrsapprciablelorsdelacrationdeprogramme.Par
exemplevotreroutinedesauvegardedepalette:faitesavecsoin,
ellemarchebienetenfaitvousenavezbesoindanstousvos
programmes.Ilfautdoncchaq uefoislaretaperetsurtout
consommerq uelq uesdizainesdelignesaveccetteroutine.Perte
detemps,possibilitd'erreurdefrappeetallongementbien
inutiledulisting.Lorsq uevouscommencerezcirculerdans10
ou20pagesdesourceslarecherched'unevariablevouscom
mencerezcomprendredeq uoijeparle,ensachantenplusq ue20
pages,c'estuntoutpetitsourceassembleur...
Voyonsconcrtementunexem ple,aveclasauvegardedepalette.
SAUVE_PALETTE
MOVEM.LD0D4/A0A4,(SP)
LEAANC_PAL,A4ptnsurlelieude
sauvegarde
MOVE.W#15,D416couleurs
.ICIMOVE.W#1,(SP)demandedecouleurs
MOVE.WD4,(SP)numrodelacouleur
MOVE.W#7,(SP)Setcolor()
TRAP#14Xbios
ADDQ.L#6,SP
MOVE.WD0,(A4)+sauvegardedelacouleur
DBFD4,.ICIetonpasselasuivante
MOVEM.L(SP)+,D0D4/A0A4
RTS
ANC_PALDC.L0,0,0,0,0,0,0,0
REMET_PALETTE
MOVEM.LD0D4/A0A4,(SP)
LEAANC_PAL,A4ptnsurlelieude
sauvegarde
MOVE.W#15,D416couleurs
.ICIMOVE.W(A4)+,(SP)demandedecouleurs
MOVE.WD4,(SP)numrodelacouleur
MOVE.W#7,(SP)Setcolor()
TRAP#14Xbios
ADDQ.L#6,SP
DBFD4,.ICIetonpasselasuivante
MOVEM.L(SP)+,D0D4/A0A4
RTS
Voicidonc2routines.Toutd'abordsachantq u'unappelXbios
nesauvepaslesregistresD0D3etA0A3nousutilisonsD4etA4
pourlecompteurdecouleuretl'adressedesauvegarde,ceq ui
expliq ueaussilasauvegardesurlapileaudbutdesdeux
routines.Lapremiresauvegardelapaletteetlametl'adresse
ANC_PAL.Nousconstatonsq uecetteadressesetrouveentreles2
routines.Eneffetplusieurssolutionss'offrentnous.D'abord
laplusconomiq ueentaillec'estdemettrecetterservation
pourlapalettedanslasectionBSSdenotreprogrammeenfaisant
ANC_PALDS.W16Nousavonsdjvuq uelasectionBSSn'occupait
pasdeplacesurladisq uette.Cependantnousavonsralisces
routinesavecenttel'idedelesinclure,afindegagneren
facilitdeprogrammation.Enplaantcetterservationentreles
routines,elleferapartieintgrantedufichier.Iln'est
cependantpaspossibledelamettreenDSnoussommedonc
contraintdelamettreenDC.Ledangerseraitq uenotre
programmeessayedelirecettepartie.FaireunBSRANC_PALpar
exempleseraitfatalmaisnoussommesassezsrieuxpournepasle
faire,doncpasdeproblme...

Unefoistapcepetitlisting,sauvezleparexem plesouslenom
SAUV_PAL.S.Ensuitemodifiezleprogrammedulisting1(celuiq ue
nousvenonsdevoiravecl'imageincluse).Justeaprslafindu
programmeparMOVE.W#0,(SP),TRAP#1(doncjusteavant
l'inclusiondel'image),mettez
INCLUDE"A:\SAUV_PAL.S"
Nemettezpasd'tiq uettesurlebordgauchepuisq uelapremire
tiq uettec'estSAUVE_PALETTEetq u'elleestdansnotreroutine.
Ensuiteautoutdbutduprogramme,mettezBSRSAUVE_PALETTEet
lafinjusteavantdeq uitter,mettezBSRREMET_PALETTE.Auniveau
taille,votrelistingestdoncsimplementaugmentde3lignes:
(BSRSAUVE_PALETTE,BSRREMET_PALETTEetINCLUDE"A:\SAUV_PAL.S")
etpourtantcesont24lignesq uisontajoutes!!!
Noussommesdoncentraindenouscrerunebibliothq ue.C'est
unetrsgrandepartiedutravailduprogrammeurenassembleurcar
denombreuseschosesreviennentsouvent:initialisationparsauve
gardedelapalette,passageenbassersolutionetpassageenSu
perviseur,restitutionenfaisantl'inverse,dcom pactagedes
imagesetc
Demme,sivoustesentrainderaliserungrosprogramme,en
coursdedveloppementcesontdespagesentiresq uipeuventtre
inclusesdiminuantd'autantlatailledulistingetyper mettant
desdplacementsnettementplusaiss.
Voyonstoutdesuiteunautreblocq uidevramaintenantfaire
par tiedenotrebibliothq ue.Jusq u'prsentnousavonstappas
maldepetitsprogrammes,sansnoussoucierdelaplacemmoire.
Ilesttempsd'ypenserafindecommencerprendreconsciencedu
faitq u'ilfautprogrammerproprement.Imaginonsq uenotre
programmesoitenmmoiremaisq u'enmmetempsilyaitd'autres
programmesdanscettemmoire.Ilestbienvidentq uechacunne
doits'approprierq uelaplacemmoiredontilabesoin,afin
d'enlaisserlepluspossiblepourcesvoisins.Pourcelailfaut
savoirq uelorsdel'assemblagesousfor medefichierexcutable,
ilyagnrationd'uneentte.Grcecetteentte,aulan
cementdenotreprogrammeilvayavoircrationdeceq u'onap
pellelapagedebase.Envoiciundescriptif.Sivousdsirez
obtenirunmaximumderenseignementssurlesenttesdeprogramme
oulespagesdebase,reportezvousauxchapitrescorrespondants
danslaBibleouleLivreduDveloppeur.Excellentchapitresur
cesujetdansladocofficielleATARI(documentsurlastructure
desprogrammes).
*Pagedebase
AdresseDescription
$00Adressededbutdecettepagedebase
$04Adressedefindelammoirelibre
$08AdressedudbutdelasectionTEXTE
$0CTailledelasectionTEXTE
$10AdressededbutdelasectionDATA
$14TailledelasectionDATA
$18AdressededbutdelasectionBSS
$1CTailledelasectionBSS
Nousallonsdoncpiochercesinfor mations,etendduirelataille

q uidevraitsuffirepournotreprogramme.Connaissant
l'em placementdelazoned'implantationduprogramme,nous
utiliseronslafonction74duGEMDOS(fonctionMshrink)q ui
per met,endonnantlatailledsireetl'adressedefin,de
rtrcirunezonemmoire.Eneffet,aulancementnotreprogramme
apristoutelaplacedisponible,nousdevonsdonclartrcir.
Notreprogrammeagalementbesoind'unepile.Aulieudeprendre
celleq uiestdjenplace,nousallonsluisubstituerlanotre,
dontnouspourronsrglerlatailleloisir.
*ROUTINEDEDEMARRAGEDESPROGRAMMES
MOVE.LA7,A5prlveptndepilepour
prendre
*lesparamtres
LEA.LPILE,A7imposenotrepile
MOVE.L4(A5),A5adressedelapagedebase
de
*l'anciennepile
MOVE.L12(A5),D0tailledelasectiontexte
ADD.L20(A5),D0+taillesectiondata
ADD.L28(A5),D0+taillesectionbss
ADD.L#$100,D0+longueurdelapagede
base
*(256bytes)
*AppellafonctionMShrink()duGEMDOS(MemoryShrink)
MOVE.LD0,(SP)
MOVE.LA5,(SP)
MOVE.W#0,(SP)
MOVE.W#74,(SP)M_shrink()
TRAP#1
LEA12(A7),A7
Voil,aprscetteopration,notreprogrammen'utiliseplusq ue
laplacemmoiredontilabesoin.Ilnefautpasoublierde
dfinirlapiledanslasectionBSSparceci:
DS.L256
PILEDS.L1
J'envoisq uisontsur prisparcetterservation!!!Dansles
exemplesfournisavecDEVPACKilestmarq u"stackgobackwards",
q uejetraduislibrementpar"moij'avancelapilerecule,comment
veuxtu..."Unpeudesrieux.Nousavonsvuq uel'utilisationde
lapilesefaisaitendcrmentantcelleci:
(move.w#12,(sp)parexemple).
IlfautdoncrserverdelaplaceAVANTl'tiq uette.Pourcette
raisonnousnotonslelabelet,audessus,lataillerellement
rservepourlapile.
Quelletaillechoisir?Celadpenddevous!Sivotreprogramme
estpleindesubroutiness'appelantmutuellementetsauvanttous
lesregistreschaq uefois,ilfautprvoirassezgros.
Tapezleprogrammesuivant.Ilestvidentq uevousdevezavoir
tapaupralablelaroutinededmarragedeprogrammesq uiestun
peuplushautdanscecours.Elleesticiincluseaudbut.Pasde
branchementyfaire.Si,unefoisassembl,vousdbuggezce
programme,vousverrezaudbutlaroutinedestart.Dornavant,

cetteroutineseratoujoursprsenteaudbutdenosprogrammes
maisneserajamaisintgralementrecopie,unINCLUDEestbien
pluscommode!Note:Ilsembleq ueDEVAPCKsemlangeparfoisles
pinceauxlorsq uelesinclusionssontnombreusesetfontappel
desfichierscontenusdansdesdossiers.Demmeilexistedes
problmesaveclesinclusionssurdisq ueBlorsq ueceluiciest
priscommelecteurAdansleq uelonmetledisq ueB.(jen'aipar
contrepasrencontrdeproblmeavecmonlecteurexterne).
INCLUDE"A:\START.S"
MOVE.W#$AAAA,BIDULE
BSRTRUCMUCHE
MOVE.WBIDULE,D6
MOVE.W#0,(SP)
TRAP#1
**
TRUCMUCHEMOVEM.LD0D7/A0A6,(SP)
BSRMACHIN
MOVEM.L(SP)+,D0D7/A0A6
RTS
MACHINMOVEM.LD0D7/A0A6,(SP)
MOVE.L#$12345678,D0
MOVEM.L(SP)+,D0D7/A0A6
RTS
SECTIONBSS

BIDULEDS.W1
DS.B124
PILEDS.L1
END
Ceprogrammeestbiensurbidon.J'esprecependantq uevous
l'avezscrupuleusementtap.Lancezle...paf4bombes!!!!!
Observonslelaloupeafindecom prendrepourq uoi...Lestart
estbienmisenplaceetlorsq uenousdbuggonsilesteffectu
sansincident.Onplaceensuite$AAAAdanslavariableBIDULE.
Activonslafentre3etpointonssurBIDULE(ilsuffitpourcela
defaireAlternateAetdetaperlenomdulabelenmajusculedonc
iciBIDULE).Avanonspaspas,nousvoyonsbienBIDULE
recevoirAAAA.Continuonsavancer:noussautonsdansTRUCMUCHE
avecaupassagesauvegardedanslapiledel'adressederetour(
ceproposvouspouvezfairepointerlafentre3surPILEet
regarderaudessusl'em pilagedesdonnes).Ensuitenousallons
sauterdansMACHINmaisl,stop!!!!!!!Suivezattentivementles
explications.Justeavantd'excuterleBSRMACHIN,faitesscrol
lerlafentre1aveclatouche'flcheverslebas'.Eneffet
d'aprslatailledulistingetcelledelafentrevousnedevez
pasvoirBIDULE.Descendezdoncde7lignes.Nor malement,la
premirelignedelafentredoitmaintenanttreBSRMACHINavec
lapetiteflcheenfaceindiq uantq uec'estcetteinstructionq ui
vatreexcute.EnbasdelafentrevousdevezvoirBIDULE
avecenfaceDC.W$AAAApuisq uec'estceq uenousyavonsdpos.
EndessousdesORI.B#0,D0.Eneffetnoussommesdansune
fentreq uicherchenousmontrerledsassemblagedeceq u'ily
adansletube.Orcetteendroitilya0dansletubeetcela
correspondORI.B#0,d0;ceq uiexpliq uecesinstructions.Mais
cesORI.Bcorrespondentq uoi?osontilssitus?ehbien,il
sontdansnotrepilepuisq uecelleciestconstitued'unblocde
124octetsentreBIDULEetPILE.Alorsmaintenantscruteztrs
attentivementBIDULEetavancezleprogrammed'unpas.Nousvoici

maintenantsurlaligneMOVEM.LdelasubroutineMACHIN.Excutons
cetteligne...
Stupeur,BIDULEestcras,demmeq ueleRTSdelasubroutine
MACHINq uiestjusteaudessus!!!Etmaintenant,sinous
continuons,aprslesecondMOVEMle68000nevapastombersur
leRTSpuisq ueceluicivientd'trecras,etnotreprogrammeva
planter!Pourq uoi?ehbien,parceq uenousavonsessayd'em piler
128octets(MOVEMdetrucmuche=15registresdonc15*4=60octets,
idempourleMOVEMdemachin,auq uelilfautajouterl'adressede
retourpourtrucmucheetcelledemachin,total128octets!)alors
q uenousn'avionsprvuq u'unepilede124octets.
Pourq ueceprogrammemarchesansproblme,ilfautdoncmettreau
minimumunepilede128octets.Faitestrsattentiona,carsi
nousavionsmisunepilede124octets,leprogrammenese
seraitpasplantcariln'yauraitpaseucrasementduRTSmais
ilyauraiteucrasementdeBIDULEetjesuiscertainq uevous
auriezcherchbienlongtempsenvousdisant"maisq u'estceq ui
peutbiencraserBIDULE"surtoutq uecetcrasementsurvient
unmomento,justement,onn'utilisepasBIDULE!!!
Gardezdonctoujoursprsentl'espritleprincipedutube
mmoire,sansoublierq u'ilestpleind'instructions,decontenus
devariablesetq uerienn'empchedelescraser!
Encoreunepetiteremarq uesurleStart.Ilesttoutfait
possibledetesterD0enretourduMshrink().Siceluiciest
ngatif,c'estq u'ilyaeuerreur.Sivoussavezq uesystmati
q uementvousmettezlelabelBYE_BYEenfaceduGEMDOS(0)q uiter
minevotreprogramme,vouspouvezrajouterlafindustart:
TST.WD0
BMIBYE_BYE
Unedernireprcisionsurlesinclusions.Ilexisted'autres
moyensderaliserdetelleschoses,parexempled'assemblerles
morceauxpuisdeleslieravecunLINKER.Cettesolutionest
intressantelorsq uelesprogrammescommencentprendredespro
por tionsgigantesq ues.
Sinon,ils'agitplusd'embtementsq u'autrechose!!!!Mmesi
certainspuristesprfrentlinker:
j'dite,j'assemble,jeq uitte,jelinke,jelance,aplante,je
dbugge,j'diteetc...)
jeprfre,q uantmoi,lamthodedel'"include".Elleper met
ventuellementd'avoiraccsdirectementausource.Parexemple,
sivotreroutinedesauvegardepaletteplante,placerlecurseur
deGENSTsurlaligneINCLUDE"A:\SAUV_PAL.S"puischoisissez
l'optionInsertFiledanslemenufichier.Votreroutineest
maintenantsousvosyeux.Unefoisq ueceblocestaupoint,
dlimitezleavecF1etF2puissauverleavecF3,hopletourest
jou!
Finducourssurlesinclusions!Commencezfabriq uezvotre
bibliothq ueetn'hsitezpasenfairedescopiesdescurit,
etmfiezvousdesvir us!Surcettedisq uetteilyaIMUN.PRG
VouslemettezendossierAutosurvotredisq uettedeboot,etil
vrifitouteslesdisq uettesq uevousintroduisezdansle
lecteur!

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 2

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Coursnumro4*
******************************************************************
Aprsavoirvuleprincipedesinclusions,nousallonsnous
penchersurceluidesMACROS.Cecheminementpeutvousparatre
trange,danslamesureonousn'abordonspastoutdesuitela
ligne_A(parex.)C'esttoutsim plementparceq uecesnotions
vonttreabondammentreprisesdansleschapitressuivants,q ueje
mesuisdcidlesabordermaintenant.
Pourexpliq uerceq u'estuneMACRO,nousallonspartird'un
exemplesimple,celuidel'affichagedeBONJOURl'cran.Nous
avonsdjvudepuisbienlongtempscommentlefaireavecla
fonctionGemdosnumro9.
MOVE.L#MESSAGE,(SP)
MOVE.W#9,(SP)
TRAP#1
ADDQ.L#6,SP
MESSAGEDC.B"BONJOUR",0
Leproblme(sionpeutappeleraunproblme...)c'estq u'il
fauttaper4lignesd'instructionspourraliserl'opration.
Nousallonsdonccrerunegrosseinstructionq uivalesenglober
toutesles4.Microvoulantdirepetitetmacrovoulantdire
gros,nousdsigneronscette'grosse'instructionparlenom
demacroinstructionoupluscourammentmacro.
Ilvadoncfalloirdfinirenpremierlieulamacro.Danscette
exemplenousl'appellerons.....PRINT(original,non?)Ilfaudra
luipassercommeparamtrel'adressedenotrephraseafficher.
Commentdfinircettemacro?Lseposeunproblmeimpossible
rsoudre:lamthodededfinitiond'unemacrodpendde
l'assembleur.Eneffet,lessignesetconventionsq uiper mettent
dedfinirunemacrosontpropresvotreassembleur.
Vousenvoyeztoutdesuitel'inconvnient:desmacrosdfinies
avecProfimatsontinutilisablessousDEVPACKetc...
VoyonsladfinitionssousDEVPACK,ceuxnepossdantpascet
assembleuroudsirantdfinirdesmacrosavecunautreassembleur
devrontsereporteraumoded'emploi.Leprinciperestecependant
lemme.
PRINTMACROADR_TXT

MOVE.L1,(SP)
MOVE.W#9,(SP)
TRAP#1
ADDQ.L#6,SP
ENDM
Voilnotremacrodfinie:Toutd'abordsonnomestplactout
gauche.Ensuiteonplacelalistedesparamtresq u'elledoit
recevoir,aprslemotMACRO.Danslecasprsentjel'aiappele
ADR_TXT.Pourlamacro,lefaitq uecenomsoitlepremieraprs
lemotMACROfaitq u'ilestlenumro1.Ilseradoncdsignpar
\1.Ensuitevientlecor psdemonprogrammeq uiutilise\1comme
sic'taitl'adressedemaphrase.Ladfinitiondelamacroest
ter mineparENDM(ENDMACRO).
Ladfinitiondelamacroestplaceaudbutduprogramme.Parce
q uecettedfinitioncontientMACROetENDM,l'assembleursait
trsbienq u'ilnefautpasl'assembler.Parcontre,lorsq u'il
rencontreraPRINT#MESSAGE,ilsauraq u'ils'agitd'unemacroet
irarecopiercettemacrolaplacedePRINT.
Voiciunexem ple:
(recopiericiladfinitiondelamacroprint)
VOID_INP2MACRO
MOVE.W#7,(SP)
TRAP#1
ADDQ.L#2,SP
ENDM
END_PRGMACRO
MOVE.W#0,(SP)
TRAP#1
ENDM
PRINT#MESSAGE
VOID_INP2
PRINT#MESSAGE2
VOID_INP2
END_PRG
SECTIONDATA
MESSAGEDC.BPREMIEREPHRASE",0
MESSAGE2DC.B13,10,"ETLASECONDE!!!",0
Tapezceprogramme,puisassemblezleetlancezle.Ensuite
dbuggerleetvousverrezq uelesappelsdemacroontt
remplacsparlestextesdecesmacros.Pourlemomentnous
n'avonsvuq u'unemacroavec1passagedeparamtre.Lenombrede
cesparamtres'passables'unemacroestvariableetdpendde
l'assembleur.AinsidansDEVPACKilestpossibledepasser
jusq u'36paramtresq uiserontreprspardeschiffres(09)
puispardeslettres(AZouaz).Ilestgalementpossible
d'appelerunemacropartird'uneautremacro.
Cecitant,ilexistedetrsnombreuxinconvnientsutiliser
lesmacros.Certainsprogrammeursenraffolent,j'avoueq uece
n'estpasmoncas.Eneffetl'nor meavantagedel'assembleur
rsidedanslepetitnombred'instructionsetdoncdupetit
nombredeter mesretenir.dsq uel'oncommencefaire
prolifrerlesmacros,onsetrouvecoincentre2feux:soit
donnerdesnomssimplesetsemlangerentreeux,soitdonnerdes
nomsrallongeetsetrompersouventdansleurorthographe.

Certainspoussentmmelaplaisanteriejusq u'raliserdes
macrospourlesappelsduGEMDOS,BIOSouXBIOS,enappelantles
macrosparlenomdesfonctionsouparlenumro.Jenetrouvepas
cettesolutionparticulirementvalablecarlesnomsdesfonctions
dusystmed'exploitationnesontpastrs'causant'.(unemacro
nommesetprtoucprnos.....)
Deplus,ilfautbienreconnatreq uelesappelsauBIOSXBIOS
GEMDOSsefonttousdelammemanireetq u'iln'estpas
difficiledes'enrappeler.Nousverronscependantq uel'utili
sationdesmacrosdanslecasdelaline_AouduGEMestuneex
cellentesolution.
Acesujet,l'assembleurMAD_MACestrputpoursonnor mebibli
othq uedemacros.Malheureusement,ilsubsisteundouteconcer
nantsadisponibilit.LeclubSTATIONInfor matiq ueaffir meq ue
c'estunDOMainePUBliq uealorsq u'Atarilefournitaveclepack
dedveloppement.DetoutesfaonsleclubStationlefournissait
sanssabibliothq uedemacros,ceq uienrduitconsi
drablementl'intrt.
Pourfiniraveclesmacros,sachezq u'ilestbienvidemment
possibledesedfinirunebibliothq uedemacrospuisde
l'inclureavecINCLUDEaudbutdevotreprogramme.C'estceq ue
nousferonsavecleGEM,entreautre.
Exempled'exercice:raliserunemacroq uevousnommerezpar
exemplePRINT_ATetq uevousappellerezainsi
PRINT_AT#12,#14,#MESSAGE
Les2chiffresdsignantl'emplacementauq uelvousvoulezq uele
textesoitaffich.
Uneremarq ue:ilseraittoutfaitpossibledenepasmettrele#
mais,cemomentl,ilfaudraitlemettredanslamacro.Par
exemple
printmacro1
move.w#\1
move.w#2
trap#1
addq.l#4,sp
endm
PourafficherlecaractreAdecodeASCII65ilfaudraitalors
fairePRINT65

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 2

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**

*Secondesrie*
**
*Coursnumro5*
******************************************************************
Aprscecourssurlesmacros,nousallonspasserl'usagedes
tableauxenassembleur.J'espreq u'aprschaq uecoursvous
effectuezvousmmedesrecherchesetdesexercices,etq uevous
nevousprcipitezpastoutdesuitesurlecourssuivant.Mme
silescoursvoussemblentmaintenantcour tsparrappor tceux
delapremiresrie,iln'ensoulventpasmoinslevoilesurde
nombreuxsujets.Vousavezmaintenantleniveaupourles
approfondiretj'espreq uevouslefaites!
LESTABLEAUX
L'usagedestableauxn'estpastrsrpanduenassembleurau
niveaudesprogrammeursdbutants.Eneffetlesystmepeut
semblerassezprilleuxmanipulermaiss'avreparcontretrs
puissantettrscommode!
Toutcommeleprincipedelapile,celuidestableauxestsimple
maisdemandebeaucoupdelogiq uepourpouvoirfonctionner
convenablement.Prenonstoutd'abordunexemplesimple:nous
allonsappuyersurlestouchesdefonctionsF1jusq u'F10et
chaq uefoisnousallonsafficherunelettre.Commenonsparun
exemplesanstableau.
Voirlelistingnumro2.
AudpartINCLUDEdelaroutinededmarragedeprogrammetudie
audbutdelasecondesrie.Prsentationavecunpetitmessage,
puisattented'unappuisurunetouche.Commenousvoulonstester
lestouchesdefonctionsetq uecellescin'ontpasdecode
ASCII,nousprofitonsdufaitq uelafonctionGemdos7retourne
danslepoidsfaibledeD0lecodeASCIImaisaussidanslepoids
fortlescancode.Iln'yad'ailleurspasq ueaderetourn,car
sivousconsultezlabibleSTousimplementladescriptiondes
fonctionsdanslesdernirespagesdeladocduGFA3.00,vousy
apprenezq ueGemdos7renvoidanslesbits07lecodeASCI,
1623lecodeclavieret2431l'tatdestouchesdecommutations
duclavier.
PetitrappelsurlescodesASCIIetlesscancode.Lescodes
ASCII(AmericanStandardCodeforInfor mationInterchange)sont
descodessur7bits,q uisuiventl'ordrealphabtiq ue.Ce
standardestaussiappelleCodetlgraphiq ueinternational
numro5.Le8mebitestunbitdeparitc'estdireq u'ilne
ser tq u'lavrificationdelabonnetransmissionducode.De
par tlefaitq uecesystmeestAmricain,lecodageASCIIne
prendpasencomptelesaccentsnilescaractresdutypec
cdille.Cependantnotreordinateurn'ayantpasbesoindece
huitimebitpourvrifierlestransmissions,celuiciest
utilispouraugmenterlenombredecombinaisonpossible.Retour
aucours2delasrie1,surleschiffresmagiq ues:avec7bits
nouspouvonscompterde0127,unbitdeplusnousper metde
compterde0255.ConsulteruntableaudescodesASCII(bible,
livredudveloppeur,docGFAetc...)etvousvousrendrezcompte
q uetouslessignes'bizarres'sontcodssur8bitsetontdonc
descodessuprieurs127.
CependantlescodesASCIInesuffisentpas.Imaginezq uejetape
surlatoucheAdemonclavier.EncodeASCIIjevaisrecevoir
65.MaissiunAnglaistapesurlammetouche,pourluicesera

unQetilrecevralecodeASCII81.LecodeASCIInedpenddonc
pasdelatouche,mcaniq uementparlant,maispluttdelalettre
decettetouche.Ilexisteunautrecodageq uiluicorrespondaux
touchesd'unpointdevuemcaniq ue.C'estceq uel'onappellele
scancode.
Pourlescancode,unetouchepossdeunnumro,totalement
indpendantdelalettreq uiseraaffectecettetouche.Ainsi
latoucheAdevotreclavierrenvoilescancode$10,etilen
estdemmepourtouslesSTdumonde,q uecettetouchesoit
marq ue"A",ou"Q".C'estl'emplacementsurleclavierq ui
compte.
Noustestonsdonclescancodedelatouchesurlaq uellenous
avonsappuy.Sic'estEscape,noussortonsduprogramme.
Autrement,nousallonstesters'ils'agitd'unetouchede
fonction.LatoucheF1apourscancode$3B,F2>$3C,F3>$3D
etc...jusq u'F10>$44.Lesscancodessesuivant,noustestons
doncnotrersultatparrappor tauscancodedeF1,sic'est
infrieurcen'estdoncpasvalable,demmeparrapportau
scancodedeF10:sic'estsuprieurcen'estpasvalablenon
plus.
Cesteststantfaits,noussommesdoncenprsenced'unscancode
situentre$3Bet$44,ces2nombrescom pris.$3B,celafait59
endcimal.Pouravoir65(codeASCIIdeA)ilsuffitd'ajouter
6.C'estq uenousfaisonsensuite.Nousobtenonsdonclecode
ASCIIdeA,B,Cetc...suivantlatouchedefonctionq uiat
enfonce.Ilneresteplusq u'affichercettelettre!
Imaginonsmaintenantq uenousvoulionsafficher"toucheF1"
lorsq uenousappuyonssurcettetouche,"toucheF2",etc....
Plusieurssolutionss'offrentnous.Envoiciunepremireq uime
vientl'espritetq uejevaisjustevousdvoilercarellen'a
pasderappor taveclestableaux.Pournepascom pliq uer,nous
n'afficheronspas"toucheF10",enfaitnousneprendronsen
compteq uelestouchesF1F9.Souvenezvousd'undeslistingde
lasrie1.Celuiq uiaffichaitunephraseenfaisantapparatre
leslettrescommesurlesaffichagesdesgaresoudes
aroports.Reprenezdoncunpeucelisting(c'taitle
numro3)etsouvenezvousdeceq uisepassaitpourla
phrasesituel'adresseTXT.Nousaffichionscettephrase
maisauparavantelletaitmodifiel'adressecolonneet
l'adresselettre.
Danslacasprsentilsuffitdefairepeuprslammechose.
Prparonsunephraseainsi:
TXTDC.B"TOUCHEF"
NUMERODC.B"",13,10,0
Achaq ueappuisurunetouchedefonction,nousretirons10(en
dcimal)auscancode,etnousmettonslersultatl'adresse
NUMERO.AinsilescancodedelatoucheF1($3Bdonc59en
dcimal)deviendra49q uiestlecodeASCIIdelalettre'1'.
Nousverronsdoncs'afficher'TOUCHEF1'.
Ralisezceprogrammeavantdepasserlasuite,celavousfera
unexcellentexercice!!!!
Passonsmaintenantautableau,enmodifiantunpeul'affichage.
Unappuisur:affichera:

F1A
F2Z
F2E
F4R
F5T
F6Y
F7U
F8I
F9O
F10P
Premireconstatation:silesscancodedestouchessesuivent
toujours,onpeutdireq uelelienlogiq ueentreleslettres
affichesestunpeulger...
Prenezlelistingnumro3,etcommenonsl'tudier.Toutle
dbut,jusq u'aucommentaire'latoucheestvalable',est
strictementidentiq ueaulistingprcdent.Ensuitenousattaq uons
lapartieutilisantletableau.L'adressedeceluiciestpasse
enA0(LoadEffectiveAdress),ensuiteonretire$3BD0afin
q ueceluiciaitunevaleurde09.Letableauq uenous
utilisonsestcomposdeWords.Or,unwordc'est2bytes,
etlammoireestcomposdebytes.Poursedplacerdansun
tableauenwordalorsq uenotreunitc'estlebyte,ilfautdonc
sedplacerde2en2.Ilnefautdoncpasq uenotre'compteur',
q uiesticiD0,prenneunevaleurdutype0,1,2,3,4etc...
maispluttunevaleurtelleq ue0,2,4,6,8...
Puisq u'lasuitedenosoprationsnousavonsD0avecunevaleur
dutype0,1,2,3,4...ilfautmaintenantlemultiplierpar2.Cela
sefaitparl'oprationMULUq uiselitMultiplyUnsigned.En
effetc'estunemultiplicationnonsigne,c'estdireq u'elle
neprendpasencomptelesignedeceq uiestmultipli,
contrairementl'oprationMULS(Multiplysigned).
Maintenant,observonsbiencetteinstr uction:
MOVE.W0(A0,D0.W),D0
Ils'agitd'unMOVEdoncd'undplacement.Ilsefaitsurunword
puisq uenousavons.WCeMOVEvaprendreleD0imeworddeA0
pourlemettredansD1.Ainsi,sinousappuyonssurF3,nous
obtenons$3D.Nousretirons$3Betnousobtenons2,nous
multiplionspar2,etdoncD0vautmaintenant4.Nousallonsdonc
pointersurle4mebytedeA0etprleverunwordpartirde
cetendroit.Ledplacementesteneffettoujourscomptavecun
nombredebytes,q ueletableausoitenbyte,enwordouenlong.
C'estunpeucommesivousvousdplaciezdansunerueavecdes
petitesmaisons,desmoyennesoudesgrandes,ledplacementse
compteratoujoursenmtres.
Maisq uesignifiele0devantlaparenthse?Etbienc'estla
valeurd'undplacementfixeajouter.Prenonsunexem ple:Nous
avonsuntableaudansleq uelon'tape'suivantunchiffreq ui
nousestfourniparunappuisurunetouche.Seulementondoit
prleverdeschosesdiffrentessilatoucheestappuyealors
q ueSHIFTestenfonce.Ilestalorspossibledesedire:si
shiftn'estpasenfoncalorssesontlespremierslmentsdu
tableauq uiserontprisencompte,maisavecshiftceserontles
lmentsdelafin.Onpourraalorsfaire:
MOVE.W0(A0,D0.W),D1oubiensishiftestappuy,
MOVE.W18(A0,D0.W),D1.CecirevientprendreleD0imeword
deA0,encommenantcompter18bytesdudbutdeA0.

Ilfautcependantsemfierdeplusieurschosesconcernantles
tableaux.Toutd'abordbienfaireattentionautypededonnesdu
tableauafindebienmodifierle'compteur'enconsq uence.
Ensuitebienfaireattentionaufaitq uelepremierlmentc'est
l'lment0etnonpasle1.Nousavionsdjvudanslestous
premierscoursdelasrie1lesproblmespouvantsurvenir
lorsq uel'oncompte,enoubliantparfoisle0.Ceproblmeest
d'autantplusgnantaveclestableauxq ue,siaulieuderetirer
$3Bdansmonexem plepouravoirunchiffrede09,jen'avais
retirq ue$3Aetainsiobtenu110,monprogrammeaurait
parfaitementfonctionn.Ilauraitsim plementaffichn'importe
q uoilasuited'unappuisurF10.Orsivousavezuntableaude
200lmentsq uevousappelezaveclestouches,lestouches+
shifts,+controletc...lavrificationtouchepartouchesera
peuttrelaissedecot...Dansnotreexemple,nousavons
utilisdeswordsdansnotretableau.Ilauraittoutfaitt
possibled'utiliserdesbytes.
Modifiezunpeuleprogramme:supprimerlaligneavecMULU,et
modifiezlesdatas.AulieudemettreDC.Wl'adresseTABLEAU,
mettezDC.B.Pourter miner,puisq uenotretableauestmaintenant
enbytesetnonplusenwords,ilfautmodifierl'adressage
per mettantdepiocherdedans.AulieudeMOVE.W0(A0,D0.W),D1il
fautmettremaintenantMOVE.B0(A0,D0.W),D1
Attentioncependantcarnousavionsparldel'impossibilitdese
servirdesadressesim paires.Pourtant,danscederniercas,
commenotretableauestenbytes,siD0vaut3,nousnousretrou
vonsavecuneadresseimpaire,etpourtantamarche!Eneffet
celamarcheparceq uenousprlevonsunbyte.Enfait,le68000
peuttrsbienprleverunbyteuneadresseimpaire,en
revanche,ceq u'ilnepeutpasfairec'estprleverunedonne
plusgrande(wordoulong)q uicommencesuruneadresseimpaireet
q uidoncchevauchelesem placements'nor maux'.Modifionsencore
unefoisleprogramme.Remettezletableauenword,etremettez
l'adressageenword(MOVE.W0(A0,D0.W),D1).L'erreurvadonc
venirdufaitq uenousavonsoublileMULU,etdoncq uenotre
compteurvatreparfoisimpairealorsq uenotretableauetnotre
moded'adressagedemandeuncompteurpaire.
Assemblezetlancez.AppuyezsurF1:toutcepassebien!Nor mal,
D0aprsretraitde$3B,vaut0q uiestdoncpair.Appuyezsur
F3:mmechosecarD0vaut2.Parcontre,unappuisurF2sesolde
par3bombesetleretourDEVPACK.Dbuggonsdoncnotrepro
gramme:alternate+D,etdescendonsjusq u'laligne:
MOVE.W0(A0,D0.W),D1
Plaonscetteligneenhautdelafentre1ettaponscontrol+B
Unbreakpoints'ymet.Lanonsaveccontrol+R,ettaponssurla
toucheF2.Breakpoint,nousrevoicisousMONST.Enregardantla
valeurdeA0nousconnaissonsl'adressedenotretableau,adresse
paireenl'occurrence.Parcontre,sivousavezappuyezsurF2,
vousdevezavoir1commevaleurdeD0,doncunevaleurimpaire.
Avancezd'unpassurMOVE.W0(A0,D0.W),D1l'aideControl+Z.
Erreurd'adresse!Ilnevousresteplusq u'q uitterpar
Control+C.
Bon,nousavonsvucommentprleverunwordouunbytedansun
tableau.Avecuntoutpetitpeud'intelligencevousdeveztre
capabledeprleverunlongmot(aulieudefaireunMULUpar2
onenfaitunpar4).Prenonsunpeudereculetrappelonsnous
descoursprcdents:nousyavonstudileprincipedece

'tube',decettemmoireq uenouscommenonsutiliser
abondamment.Sivousavezunpeudemmoirejustement,vousdevez
vousrappelerd'uneremarq uefaiteautoutdbut,disantq u'il
fallaitbiensemfierdeconfondrecontenudutubeetadressede
cecontenu.Ilesteneffettoutfaitpossibled'avoir
IMAGEincbinA:\MAISON.PI1"
PTN_IMAGEDC.LIMAGE
Al'adresseIMAGE,noustrouvonsdansletubel'imageellemme,
maisl'adressePTN_IMAGE,noustrouvonsunlongmot,q uise
trouvetrel'adressedel'image.Avecunpeud'imagination,nous
pouvonsdoncimagineruntableaucomposdelongmot,ceslongs
motstantdesadressesd'images,detextes,maisaussi(pourq uoi
pas!)deroutines!!!!!!
Voicilesq ueletted'unprogrammeralisantunetellechose:Au
dpart,mmechoseq ueprcdemment,attented'unappuitouche,
vrificationdelavaliditdelatouche,ontrafiq uepouravoir
uncodedutype0,1,2,3,4...puisonlemulupar4puisq uenotre
tableauvatrecomposdelongmot.
LEATABLEAU,A0
MOVE.L0(A0,D0.W),A0
JSR(A0)
BRADEBUTetonrecommence
NousfaisonsunJSR(jumpsubroutine)aulieud'unBSR.Pourq uoi?
essayez,etregardezl'annexesurlesinstructionspourvoirles
diffrencesentreles2instructions!!!
Maisdeq uoiestcomposnotretableau?ehbien,parexem ple
TABLEAUDC.LTOUT_VERT
DC.LTOUT_BLEU
DC.LQUITTER
DC.LDRING
DC.LCOUCOU
etc....
Toutescesentrestantlesadressesdesroutines.Parexemple
COUCOUmove.l#message,(sp)
move.w#9,(sp)
trap#1
addq.l#6,sp
rts
LaroutineTOUT_VERTmettoutelapaletteenvertetc....
Ilestdemmepossibledemettreentableaudesadressesde
phrasesetdepasserl'adresse"pioche"uneroutineq uiaffiche
avecgemdos(9)parexemple.
Unedernirechose,q uiestplusprochedusystmedelisteq uede
celuidetableau,maisq uiestaussibienutile.Nousavonstudi
icidespossibilitsmananttoujoursd'unemmevidence:
lesdonnesq uinousserventpointerdansletableau,se
suivent!Malheureusementdansdenombreuxcas,cellescinese
suiventpas...
Voicidoncuneautremthode:Imaginonslecasd'unditeurde

texte,avecplusieursactionspossibles(effacerletexte,sauver
letexte,l'imprimer,charger,craser,scrolleretc...)appeles
pardescombinaisonsdetouches.Pourtrelanor meWordstart
(c'estlanor meclavierutiliseparDevack:ALT+W=im primerpar
exemple),j'aid'abordrelevavecuntoutpetitprogramme,les
codesrenvoysparlescombinaisonsdetouchesEnsuitej'ai
ralisunelistedecescodes,listeenwordcarlescodesASCII
nesuffisentplusdanslecasdecombinaisonsdetouches(ilest
possiblebiensrdeconstruirelacombinaisontoucheenfonce/
touchedecontrol).
TAB_CODEdc.w$1519,$1615,$1312,$2e03,$FFFF
Ensuitej'airalisunelisteaveclesadressesdemesroutines.
Commeaudpartjen'enavaisaucunedefaite,j'enairalisune
'bidon',nommeJRTSetq uinefait....q u'RTS!
TAB_ROUTINEdc.lJRTS,JRTS,JRTS,JRTS
Ensuitej'aifaitunebouclepourlireTAB_CODE,encomparant,
chaq uefois,lavaleurtrouvedansletableauaveccelledela
touche.EnmmetempsjeparcoursTAB_ROUTINEafinq u'aumomento
jelisle3melmentdeTAB_CODE,jesoisenfacedu3mel
mentdeTAB_ROUTINE.
Voicilemodule.D7contientlewordcorrespondantlatoucheou
lacombinaisondetouche.
LEATAB_CODE,A0
LEATAB_ROUTINE,A1
.ICIMOVE.W(A0)+,D0
CMP.W#$FFFF,D0
BEQDEBUT
MOVE.L(A1)+,A2
CMP.WD0,D7
BNE.ICI
JSR(A2)
BRADEBUT
L'adressedelalistedescodesestmiseenA0etcelledes
adressesderoutinesenA1.Onprlveunworddecode.
C'est$FFFF?sic'estlecas,c'estdoncq uenoussommesenfinde
listedonconsesauvepuisq uelatouchechoisitn'estpas
valable.Sinononprlvel'adressedansletableaudesadresses
deroutines.Lecodedutableauestillemmeq ueceluidela
touche?Non,onboucle(notezicilepointdevantlelabel.Cela
indiq ueq uelelabelestlocal.L'assembleurlerapporteraau
labelleplusprocheportantcenom.Ilestainsipossibled'avoir
plusieurslabel.ICIdansunprogramme,outoutautrenom
pour vuq u'ilsoitprcdd'unpoint.Danslecasdepetites
bouclesparexem ple,celavitedechercherdesnomsdelabels
tordus!!!).
Puisq uelecodeestidentiq ueceluidelatouche,onsautevers
laroutine,etauretour,onrecommence.
Lesavantagesdecettemthodesontmultiples.Toutd'abordla
petitetailledelaroutinedetest:s'ilavaitfalluraliserdes
testsdugenre:
cmp.w#$1519,d7
bne.s.ici1
bsrtruc

bradbut
.ici1cmp.w#$1615,d7
bne.s.ici2
bsrtruc2
bradbut
.ici2
etc....latailleauraittsuprieure,surtoutq uedansl'exem
pleiln'yaq ue4codes...Imaginezavecunetrentaine!!!L'autre
avantageconcernelamiseaupointduprogramme.Eneffetrien
n'em pchedeprvoirpleinderoutinesmaisdesim plementmettre
l'adressed'unRTS,etprogressivementdeconstruirecesroutines.
Rienn'em pcherapourautantleprogrammedemarcher.Demme,le
systmeduflagdefin($FFFF)per metderajoutertrsfacilement
descodesetdoncdesroutines.
Voilapourleslistesettableaux!!lesapplicationssontinnom
brablesetper mettentsouventenpeudelignesdestests,des
recherches,descalculs,desconversionsoudesbranchements
ralisablesautrementmaisauprixdedifficultsimmenses!
Voicidesidesd'applications:
codagedetexte(utilisationducodeASCIIpourpointerdansun
tableaudonnantlavaleursubstituer)
animation(tableauparcour usq uentiellementdonnantlesadresses
desimagesafficher)
gestiondetouches
gestiondesouris(tableauaveclescoordonnesdeszonescran)
menudroulant
etc...

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 2

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Coursnumro6*
******************************************************************
LESAUTOMODIFICATIONS
Autrechosesim pleutiliseretq uifacilitebeaucouplaprogram
mation:lesprogrammesautomodifiables.Commetouslessujets
abordsjusq u'ici,celuin'estpascompliq umaisdemandeunpeu
d'attention.Jedoiscependantavouerq uelepremirefoisq ue

j'airencontrunetellechosedansunlisting,denombreusesheu
resm'onttncessairesavantdecom prendre!Laprincipaledif
ficultrsidantnonpasdanslacomprhensiondusujetluimme
maispluttdanslechoixdelamthoded'explication,j'espre
q uecellecivousdonnerasatisfaction!
Ilesttoutfaitpossibled'imagineruneadditionavecdesva
riables.ParexempleA=1,B=2pouruneoprationdugenreA+B=C
Nousimaginonsgalementsansmalq uelesvaleursdeAetBpuis
sentchangerencoursdeprogrammepourdevenirparexempleA=2et
B=3ceq uilaissenotreoprationA+B=Ctoujoursaussivalable.
Mais,commentfairepourq uecetteoprationA+B=Cdeviennetout
coupAB=CouencoreA/B=C?
Lsefaittouteladiffrenceentreunlangagevoluetl'assem
bleur.Nousavonsvu,danslespremierscours,q uel'assembleurne
faisaitq uetraduireenchiffreslesinstr uctions.Aladiffrence
descom pilateursq ui'arrangent'lesinstructions,l'assembleurne
raliseq u'unetraduction,instructionparinstr uction.Nousnous
retrouvonsdoncavecunesuitedechiffres,ceschiffrestant
dansle'tube'.Toutcommenousavonscritdansletubepour
modifierdesvaleursdonnesdesvariables,ilestdonctouta
faitpossibled'criredansletubepourmodifierleschiffresq ui
sontenfaitdesinstructions.Ilestvidentq uelaprudence
s'im posecarleschiffresq uenousallonscriredoiventtre
reconnusparle68000commeunenouvelleinstr uctionetnonpas
commen'importeq uoi,ceq uiconduiraituneerreur.Voyons
concrtementunexemplesimple.Nousavonsunelistedelettresco
deenword,etnousvoulonsafficherceslettreslesunesaprs
lesautres.
Voiciunprogrammeralisantcetteopration.
INCLUDE"B:\START.S"
LEATABLEAU,A6dansA6carGEMDOSn'ytouchepas
DEBUTMOVE.W(A6)+,D0prlveleword
CMP.W#$FFFF,D0c'estleflagdefin?
BEQFINoui,byebye
MOVE.WD0,(SP)non,donclepassesurlapile
MOVE.W#2,(SP)pourl'afficher
TRAP#1
ADDQ.L#4,SP
MOVE.W#7,(SP)attendunappuitouche
TRAP#1
ADDQ.L#2,SP
BRADEBUTetonrecommence
FINMOVE.W#0,(SP)
TRAP#1
**
SECTIONDATA
TABLEAUDC.W65,66,67,68,69,70,$FFFF
SECTIONBSS
DS.L100
PILEDS.L1
END
Imaginonsmaintenantq uecetaffichagesoitdansunesubroutine,
etq uenousvoulionsafficherunelettrechaq ueappeldecette
subroutine:Onattendunappuisurunetouche,sic'est'espace',
alorsons'enva,sinononsautelaroutineq uiafficheunca
ractrepuisrevient.Voiciunpremieressai:

INCLUDE"B:\START.S"
DEBUTMOVE.W#7,(SP)
TRAP#1
ADDQ.L#2,SP
CMP.W#"",D0
BEQFIN
BSRAFFICHE
BRADEBUT
FINMOVE.W#0,(SP)
TRAP#1
**
AFFICHELEATABLEAU,A6adressedutableau
MOVE.WA6)+,D0prlveleword
MOVE.WD0,(SP)lepassesurlapile
MOVE.W#2,(SP)pourl'afficher
TRAP#1
ADDQ.L#4,SP
RTSpuisonremonte
**
SECTIONDATA
TABLEAUDC.W65,66,67,68,69,70,$FFFF
SECTIONBSS
DS.L100
PILEDS.L1
END
Assemblezetlancezleprogramme.Constatation:chaq ueappuisur
unetouche,onobtientun'A'maispaslesautreslettres!!!
Evidemment,puisq u'chaq uefoisq uenoussautonsdansnotresu
broutineAFFICHE,cellecirechargel'adressedutableau.Leca
ractreprlevestdonctoujourslepremier.Pourvitercela,il
fautdonccrerunpointeurq uiavanceradanscetableau.Dansno
treexem ple,ilsuffisaitenfaitdeplacerleLEATABLEAU,A6au
dbutduprogramme.A6n'tantmodifiparpersonne,celaaurait
fonctionn....jusq u'au7meappuisurunetouche,A6pointant
alorshorsdutableau!Deplus,noussommesicipourapprendreet
nousenvisageonsdonclecaso,endehorsdelaroutine,tousles
registressontmodifis!Im possibledoncdegarderA6commepoin
teur.VoicidonclaroutineAFFICHEmodifie:
AFFICHEMOVEA.LPTN_TAB,A0
MOVE.W(A0)+,D0
CMP.W#$FFFF,D0
BNE.ICI
LEATABLEAU,A0
MOVE.LA0,PTN_TAB
BRAAFFICHE
.ICIMOVE.LA0,PTN_TAB
MOVE.WD0,(SP)
MOVE.W#2,(SP)
TRAP#1
ADDQ.L#4,SP
RTS
DeplusilfautrajouteraprsleINCLUDE(doncavantlelabel
dbut)
LEATABLEAU,A0
MOVE.LA0,PTN_TAB
etensectionBSS
PTN_TABDS.L1

Unpeud'analyseaprsceschangements!Toutd'abordnousconsta
tonsavecbonheurq ueamarche!Audbutnousmettonsenplaceun
pointeur.
LEATABLEAU,A0metl'adressedutableauenA0
MOVE.LA0,PTN_TABetlasauvedansPTN_TAB
Nousavonsdoncmaintenantdansletubeenfacedel'tiq uette
PTN_TABunlongmot,celongmottantl'adressedudbutduta
bleau.Ensuitedanslaroutine,nousprlevonscetteadresse.Ici
unepetiteremarq ues'imposecarlaconfusionestfrq uente:Si
nousavons:
IMAGEINCBIN"A:\MAISON.PI1"
etq uenousvoulonstravailleraveccetteimage,nousferons
LEAIMAGE,A0
A0pointeraalorssurl'image.Parcontresinousavons:
PTN_IMAGDC.LIMAGE
C'estdireunetiq uettepourunlongmotsetrouvanttre
l'adressedel'image,enfaisantLEAPTN_IMAGE,A0nousnercup
ronspasenA0l'adressedel'imagemaisenfaitl'adressede
l'adressedel'image!Pourrcuprerdirectementunpointeursur
l'imageilfautfaire:
MOVEA.LPTN_IMAGE,A0
Cependant,pourrcuprerl'adressedutableauilauraitgalement
tpossibledefaire:
MOVEA.L#TABLEAU,A0
Cecidit,continuonsnotreexploration:DansPTN_TABnousavons
doncl'adressedudbutdutableau.Attented'unappuitouche,hop
onsautedanslaroutine.Transfertl'adressecontenuedans
PTN_TABdansA0puisonprlvelewordcontenudansletube
cetteadresseetonlemetenD0.Commenousavonsraliscette
oprationavec(A0)+,A0pointdoncmaintenantsurleprochain
worddutableau.Testonssilewordprlevest$FFFF,ceq uiin
diq ueraitlafindutableau.Sicen'estpaslecas,onsaute
.ICIetonsauvelanouvellevaleurdeA0dansPTN_TAB.
Silewordprlevest$FFFF,onrechargePTN_TABavecl'adresse
duhautdutableau,etc'estreparticommeen14!!!
Cesystmedepointeur,trsfrq uemmentutilis,estsimpled'em
ploietbiencommode!Voyonscependantuneautremthode,plus
tordue!Supprimonstoutd'abordlaroutineAFFICHEetrem plaons
laparlasuivante:
AFFICHEMOVEA.L#TABLEAU,A0
MOVE.W(A0)+,D0
MOVE.WD0,(SP)
MOVE.W#2,(SP)
TRAP#1
ADDQ.L#4,SP
RTS

Rassemblonsetlanons.Ilestbienvidentq uecelanemarche
pluspuisq u'chaq ueappeldelaroutine,nousrechargeonsA0avec
l'adresseduTABLEAU,donclewordprlevseratoujourslepre
mierdutableau.PassonssousMONSTavecAlt+D.Descendonssurle
labelAFFICHE.NoustrouvonsenfaceMOVEA.L#TABLEAU,A0etc....
Quittonsaveccontrol+Cpuisrassemblons,maisattentionavantde
cliq uersur'assembler',jetonsuncoupd'oeilsurlesoptions.
NousavonspardfautDEBUGINFOindiq uantExtend.Celasignifie
q uelesnomsdeslabelsvonttreincor porsdansleprogramme.
Celanousper metderetrouverlesnomsdeceslabelslorsq uenous
sommessousMONST.Choisissonsl'optionNONEpourDEBUGINFOas
semblonsetrepassonssousMONST.
Sur prise,lesnomsdeslabelsontdisparuetsontrem placspar
deschiffres.C'estlogiq uepuisq ue,detoutefaon,l'assembleur
traduitnotresourceenchiffres.CherchonsnotreroutineAFFI
CHAGE.C'estunpeuplusdurpuisq uesontiq uetten'estplusvi
sible!Poursereprer,onpeutchercheraudbut(aprslestart)
CMP.W#$20,D0q uiestlacomparaisonaveclatoucheespaceaprs
l'appuitouche.Ensuite,unBEQverslafinetleBSRversnotre
routine.Relevonsl'adressesitueenfaceduBSRetallonsy.La
premirelignedenotreroutinec'estMOVEA.L#$XXXXXXX,A0XXXXXXX
tantl'adressedutableau.Jerappelleq uesurun68000lepro
grammepeutsetrouvern'importeoenmmoire,cetteadressesera
doncdiffrentesuivantlesmachines.Pourmapar tc'est$924C6.
J'activelafentre3avecAlt+3puisavecalt+ajedemandela
fentredesepositionnersurcetteadresse.MONSTm'afficheau
centrelescodesASCIIdeslettresdemontableau($41,$42etc...)
etdroiteceslettresen'texte'.
Enavanantdanscetteroutined'affichage,jevaisdoncmettre
(pourmoi)$924C6enA0,cetteadressetantcellepointantsur
le'A'dutableau.Ceq uim'intresserait,c'estq ue,laprochaine
fois,celameper mettedepointersurle'B'.Pourcelail
faudraitavoir:
MOVEA.L#$924C6,A0pourle'A'
etensuite
MOVEA.L#$924C8,A0pourle'B'.
Leslettrestantsousfor medeworddansmontableauilfautune
avancede2!
Retournonsdanslafentre2,enfacedeceMOVEA.L,regardons
l'adresselaq uelleilsetrouve(colonnedegauche),notons
cetteadresse,etnotonsgalementl'adressedel'instr uctionsui
vante(MOVE.W(A0)+,D0).Activonslafentre3,etplaonsnous
l'adresseduMOVEA.L.
Dansmoncas,etpuisq uej'avais:
MOVEA.L#$924C6,A0jetrouve207C000924C6
J'endduisq ueces3wordsconstituentlareprsentationdemon
instructionMOVEA.L,puisq uel'adresseduwordsuivantcorrespond
celledel'instr uctionsuivante.Or,jeretrouvedanscecodage,
l'adressedemontableau.Avecunpeud'imagination,jeconois
aismentq u'ilestpossibled'criredirectementdansle'tube'et
parexem pledemodifierlewordq uiapourvaleuractuelle24C6.
Sijeluiajoute2,moninstructiondeviendra207C000924C8ce
q uireviendraMOVEA.L#$924C8,A0etq uimeferapointersurle
secondworddutableau!!!!!!!!
VoicidonclaversionautomodifiabledelaroutineAFFICHE.

AFFICHEMOVEA.L#TABLEAU,A0
MOVE.WA0),D0
CMP.W#$FFFF,D0
BNEICI
MOVE.L#TABLEAU,AFFICHE+2
BRAAFFICHE
.ICIADD.W#2,AFFICHE+4
MOVE.WD0,(SP)
MOVE.W#2,(SP)
TRAP#1
ADDQ.L#4,SP
RTS
Note:PTN_TABnenoussertplus,etdemmeleLEAtableaudu
dbut.
AssemblezavecNONEenDEBUGINFO,puispassezsousMONST,faites
avancerpaspasetregardezlaligne
MOVEA.L#TABLEAU,A0semodifier!
Expliq uonsbienclairementceq uisepasse.
NousplaonsTABLEAUenA0puisnousprlevonsleword.Admettons
toutd'abordq u'ilnes'agissepasde$FFFF,noussautonsdonc
.ICI.Ilfautdoncajouter2pouraugmenterl'adresseetpointer
laprochainefoissurlasecondelettredutableau.Nousavonsvu
q u'entantcodelaligneMOVEA.Letc...tientsur3wordsdonc6
bytes.L'ajoutde2doitdoncportersurle3meword.Ledbutde
cewordc'estlebyte4.Pourcetteraisonnousdonnonscommedes
tinationdel'additionAFFICHE+4.
Sinousavionsprlev$FFFF,ilauraitfallurinitialisernotre
ligneMOVEA.Lavec
MOVE.L#TABLEAU,AFFICHE+2.
Pourq uoi+2?Parceq uel'adressedetableauestunlongmotet
q ue,danslecodagedel'instruction,celacommencesurlesecond
word.Ilfautdoncsauterunseulwordc'estdire2bytes.
Danslemmeordredechose,ilesttoutfaitpossibledemodi
fierplusprofondmentunprogramme.Envoiciunexempleflagrant.
(voirlistingnumro4)
Sachantq uel'instructionRTS(Returnfromsubroutine)estcode
avec$4E75etq uel'instr uctionNOP(Nooperation)estcodepar
$4E71,enplaantunNOPouunRTS,onchangeenfaitlafindela
routine.NOPnefaitriendutout.C'estuneoprationq uiestbi
dondanslesensoriennechange,maiscetteinstruction
consommeunpeudetemps.Ellenousserviradoncpourraliserdes
petitesattentes(bienutilepourdeseffetsgraphiq uesparexem
ple).
SuivezbienledroulementdeceprogrammesousMONSTafindevoir
lesmodificationssefaire.Uncaspluscomplexe:
MOVE.W#23,D0
MOVE.W#25,D1
VARIANTEADD.WD0,D1
MULU.W#3,D1
SUB.W#6,D1

MOVE.WD1,D5
Aprsassemblagedecepetitmorceaudeprogramme,passezsous
MONSTetjetezuncoupd'oeillafentre3.Enpointantsur
VARIANTEetenregardantlesadressesenfacedesinstr uctions,on
endduitq ue:
ADD.WD0,D1estconvertien$D240
MULU.W#3,D1estconvertien$C2FC$0003
SUB.W#6,D1estconvertien$0441$0006
Sinousprenonsmaintenant:
MOVE.W#23,D0
MOVE.W#25,D1
VARIANTEMULU.WD0,D1
SUB.W#8,D1
ADD.W#4,D0
MOVE.WD1,D5
Nousassemblons,passonssousMONST:
MULU.WD0,D1estconvertien$C2C0
SUB.W#8,D1estconvertien$0441$0008
ADD.W#4,D0estconvertien$0640$0004
Donc,sidansunprogrammeutilisantcette'routine'jefais
LEAVARIANTE,A0
MOVE.W#$D240,(A0)+
MOVE.L#$C2FC0003,(A0)+
MOVE.L#$04410006,(A0)+
J'obtiendrailapremireversion:
ADD.WD0,D1;
MULU.W#3,D1;
SUB.W#6,D1
alorsq uesijefais:
LEAVARIANTE,A0
MOVE.W#$C2C0,(A0)+
MOVE.L#$04410008,(A0)+
MOVE.L#$06400004,(A0)+
j'obtiendrailasecondeversion!
Essayezavecleprogrammeciaprs,enlesuivantsousMONST:
Note:ceprogrammen'apasdefindoncq uitteravecControl+C:
LEAVARIANTE,A0
MOVE.W#$D240,(A0)+
MOVE.L#$C2FC0003,(A0)+
MOVE.L#$04410006,(A0)+
LEAVARIANTE,A0
MOVE.W#$C2C0,(A0)+
MOVE.L#$04410008,(A0)+
MOVE.L#$06400004,(A0)+
MOVE.W#23,D0
MOVE.W#25,D1
VARIANTEMULU.WD0,D1

SUB.W#8,D1
ADD.W#4,D0
MOVE.WD1,D5
END
Remarq ues:Ilesttoutfaitpossibled'envisagerplusde2ver
sionsd'unemmepartiedeprogramme.Silestaillesdecesdiff
rentesversionsdiffrent,cen'estpasgravecarilesttoujours
possibledecombleravecdesNOP.Lesapplicationsdecegenrede
'ruse'peuventtreasseznombreuses:raccourcissementdeprogram
mes,rapidit(uneroutinedevanttreappele15000foisaura
toutintrttremodifieavant,aulieud'yincor porerdes
tests,parexemple),modificationsalatoiresdesroutinesdepro
tection(uncoup,j'enmetsuneenplacelaprochainefois,j'en
mettraiuneautre...)....
Faitescependantbienattention,caruneerreurd'unchiffreetle
nouveaucodemisenplacenevoudraplusriendiredutout!Faites
galementattentionvoscommentairescarl,ilsdeviennent
hyperimportants,tantdonnq uelelistingq uevousavezsous
lesyeuxneserapasforcmentceluiq uiseraexcut!!!!!!!

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 2

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Coursnumro7*
******************************************************************
Inutiledevouscomplimenterinutilement,maissivousavezsuivi
bientranq uillementlescoursdepuisledbut,sivousavezpris
soindevousexerceravecdespetitesapplications,vousdevez
djavoirunniveaucorrectenassembleur!N'oubliezdoncpasles
commandementsprincipaux:biencommenterlesprogrammes,rflchir
simplement,utiliserpapieretcrayonetc...Plusvousavancerez
etplusvoslistingsserontlongs,etplusuneprogrammation
propreseraindispensable!!!Demmecherchezparvousmmeavant
deposerdsq uestions,celaviterabiensouventdedemander
n'im porteq uoi...
Danscecoursainsiq uedansles2suivants,nousaborderons2
sujetstabous:laLigneAetleGEM.
Concernantces2sujets,lescritiq uesvontbontrain:laligneA
c'estpascommode,c'estnuletleGEM,pouah!!!Aprspasmalde
tem pspassdiscuteretcouterlesopinionsdeplusieurs
personnes,jesuisarrivlaconclusionsuivante:Toutd'abord
lescritiq ueurssontrarementlesprogrammeursLigneAouGEM.
Ensuite,imaginonsuncoursinstantnotreSTsansGEMetprparons
nousfaireuneffort,GEMnouslerendbien!Endernierlieuje

diraisq uecescourssontdestinsfairedevousdes
programmeursetpasdesbidouilleurs.Vousdevezdoncavoir
connaissancesdespossibilitsdelaligneAetdecellesduGEM.
Nepensezpascependanttrouverdanscescourslatotalitdes
commandesGEM.Cescourssontdestinslevezuncoinduvoile,
etsipossiblevousdonnezdeq uoicontinuervosrecherches.
Entoutcasjepeuxvousassurerq uelaligneAetleGEMnesont
pasplusdurq u'autrechoses(D'ailleursyatilq uelq ueschose
dedurenassembleur?????).Ilyagalementunavantage
nonngligeableconcernantlaligneAetsurtoutGEM:Jusq u'
maintenant,nousavonsutilisdesinstructionsassembleur68000,
etilsemblaitvidentq uedansunouvragesurlePASCAL,leBASIC
GFAouleC,nousaurionseudumaltrouverdesprcisionssur
l'instructionMOVEM.Lparexemple!ConcernantlaligneA,mais
surtoutGEM,nousallonsutiliserprincipalementdesmacros(vous
voyezpourq uoicesujetatabordavant!).Orcesmacrosont
chacuneunnom,etcenomestunnom'GEM'etnonpasrelatif
teloutelassembleur!!Ainsiouvrirunefentrepourlafaire
apparatresurl'cran,seferaavecunemacronommeWIND_OPEN.
L'avantagec'estq uecettefonctionGEMestutiliseenPascal,en
Cetc...Pourcetteraison,vouspouvezchercherdeladocumen
tationsurGEMq uelq uesoitlelangageutilisdanscette
documentation.Dans99%descasceseraleC.
Pourmapar tmesconnaissancesenCsontrduitesetpourtant,une
grandepar tiedesdocumentsGEMaveclesq uelsjetravaille,fait
rfrencecelangage.Surtoutnevouscontentezpasdesouvrages
traitantduGEMenassembleurcarvousserezbienvitedgot!!
IdempourlaligneA,lesparamtresncessairesnedpendentpas
dulangage!!
Unautreavantagetrsimportant,surtoutpourleGEM,concerne
lesfor matsdedonnes.Ayantlachancedepouvoirtravaillersur
desMacs,denombreuseschosesyrendentlamanipulationdespro
grammesplusaiseq uesurST.Parexempleonchargeunlogiciel
dedessin,onfaitunpetitgribouillis,ensuiteoncharge
n'im porteq ueltraitementdetexteethoponycollenotre
gribouillis.SurSTilya99%dechanceq uelefor matdel'unne
soitpasreconnuparl'autre!Sionjetteuncoupd'oeilversle
mondePC,onserendcompteq u'iln'existepasdefor matnor malis
pourcetypedemachine,etq uec'estl'anarchieceniveau.De
telsfor matsnor malissexistentsurMac,ilssontrespects,et
lesraressoftsnesepliantpascettenor mesontvousun
for matagerapidedeladisq uette!!!Lecomblec'estq uesurSTde
tellesnor mesdefor matsexistent,maisellesnesontpas
respectes....
Enfaitl'utilisationdelaligneAetsurtoutcelleduGEM,
doiventnousamenerunerflexionplusglobalesurceq u'estla
programmation.RaymondLoewy(18931986),q uel'onpeutconsidrer
commelepredudesignindustriel,aeubeaucoupderflexions
surceq u'ilfautdonnerauconsommateur.Dansnotrelangagenous
parlonsd'utilisateurdesoftsmaisc'estenfaitdelamme
personneq u'ils'agit.ComparonsunsoftMacetunsoftST.
L'cranestallum,lesoftestcharg,etlaseulechoseq uenous
faisons,c'estpromenernotreoeilsurlesicnesetlasouris
danslabarredemenu.Difficiledejugerdesq ualitsrespectives
des2softssansallerplusloin.Pourtant,lasim pledisposition
desentresdanslesmenus,lepositionnementdesicnes,le
faiblenombredecellescimaisenmmetempsleurimpressionde
clartdonnedans99%descasl'avantageauMacIntosh.SurleST,

lesmenusdgueulentdepartout(surtoutdanslessoftsrcents),
etlesicnesrecouvrentunbureauq uin'endemandepastant!Ceci
estrapprocherd'unerflexiondeRaymondLoewyq uejevous
demandedemditer:"Unvhiculearodynamiq uebiendessindonne
uneimpressiondevitesse,mmeq uandilestarrt".Inutiledonc
d'enrajouterlapelle,les14524874fonctionsdusoftsSTsont
simplementdesdliresdeprogrammeursalorsq ueles20fonctions
dusoftsMaconttpensespourl'utilisateur.Lorsq ueRaymond
Loewyatdemandpourfairelenouveaulogodelasocit
Shell,ainsiq uetoutledesigndesstationsser vices,ila
simplementditsesemployeurs:"Vosclients,cenesontpasles
automobiles,cesontlesautomobilistes".Evident,saufq u'
l'poq uelaShellvendaitpourlesautomobiles,sanss'enrendre
compte!
Ehbien,surSTlesprogrammeursprogrammentpourleST(oupour
eux!)maistrsrarementpourlesutilisateurs...
Toutcecitantdit,nousallonsabordermaintenantlaligneA,en
esprantcependantq uecelavousferarflchirlorsq uevous
concevrezvosprogrammes!
LALIGNEA
DocofficielleAtari,ChapitreLigneA:Bondescriptifdes
diffrentesfonctions,assezbrutmaisefficace.
BibleST:BondescriptifdesfonctionsLivredudveloppeur:idem
maisenplusdescriptifdesdonnesdontonpeutdduirel'em pla
cementaveclaligneA.
DocduGFA3.00:Asseztrange.SilesfonctionsligneAduGFA
sontappelesdelammemanireq u'enassembleur,leconcepteur
decelangagearussi'inventer'desfonctionsenclamantbien
hautq u'ils'agitdefonctionLigneA!!!Peuttrepourq uele
GFAsoitencoremoinscom patible...Acepropos,ilsembleraitq ue
laligneAnesoitplusofficiellementsupporteparleTT....A
voir...
Danslepremierkilodemmoiredenotremachine,nousavonsun
bonpaq uetd'adressesutilisesparlemicroprocesseur.Nousavons
passpasmaldetempsplucherleprincipedefonctionnementde
cekilo,q uisertau68000de'relais'afinq u'iltrouvel'adresse
delaroutineq u'ildoitexcuterpourtelleoutelleraison.
J'espredetoutcoeurq uevousavezparfaitementassimilce
principecarpourlaligneA,leGEM,lesinterruptionsetc...
c'estencoreettoujourscemmeprincipeq uiestappliq u!
Prenezlafeuilleq uivousatfournieaveclescoursdela
srie1,etq uimontrecepremierkilo.Levecteur10(adresse40
endcimalet$28enhexa.)possdecomme'description':mulateur
ligne1010.Convertissons1010enhexadcimal,nousobtenons....
$A!Premireconstatation,sicevecteurestdanslepremierkilo
demmoire,c'estdoncq uel'mulateurligneAn'estpasune
par ticularitduSTmaisbiendu68000.Cesvecteursvontdonc
nousdonneraccsuneoudesroutines,enutilisanttoujoursle
mmeprincipe:
Ordreau68000,celuicianalysel'ordre,sautedanslepremier
kilodemmoirel'adressecorrespondantcetordre,ytrouve
l'adressedelaroutineexcuter,ilneluiresteplusq u'
sautercelleci.
Commentdoncappelerlesroutinesaccessiblesparl'inter mdiaire

del'mulateurligneA,q uefontcesroutines,etcomment'discu
ter'avecelles,c'estdirecommentleurpasserd'ventuelspa
ramtres?
Danslecasdel'AtariST,lesroutinesaccessiblesparlebiais
del'mulateurligneAsontdesroutinesgraphiq ues.Cesroutines
sontlesroutinesgraphiq uesdebasedenotremachine.Ellessont
utilisesparleGEM.Leuraccsestrustiq ueetmalcommodemais
lacommoditn'estpaslebutrecherch.Gnralementenassem
bleuronrecherchesouventfairesoitmmesesroutines(c'est
toujoursmieuxq uecellesdescopains)Ilfautcependantnoterq ue
dansbeaucoupdecas,unebonneutilisationdelaLigneAoudu
Gemestamplementsuffisante.Deplus,c'estbiensouventune
bonneconnaissancedecesinterfacesq uivousper mettrad'am
liorervosroutines.Uneraisonsupplmentairersidedansla
facilitdemiseenoeuvreetdanslafacilitd'amlioration.Il
esttoutafaitpossibleq uelasocitpourlaq uellevousavez
ralisunsoft,vousdemandelaversion2.00plusieursannes
aprslaversion1.00.Lesinfmesbidouillespourgagner3cycles
d'horlogesvoussembleronsalorsbienmoinsclairesq u'unappel
classiq uelaligneA,peuttreunpeupluslent.Maisl
encore,ilfautpenserensemettantlaplacedel'utilisateur!
AinsiSPECTRUM512estunexcellentsoftpensavecunesprit
programmeuretlersultatc'estq uetoutlemondeutilise
DEGAS...
LesroutinesligneAsontdoncdesroutinesgraphiq uesdebase.
Ellessontaunombrede16,etsontnumrotsde015.Voici
leurfonctionsparnumro:
0=initialisation
1=placerunpixelunecouleurdonne
2=demanderlacouleurd'unpixel
3=tracd'uneligneq uelconq ue
4=tracd'unlignehorizontale
5=tracd'unrectanglerempli
6=remplissaged'uneligned'unpolygone
7=transfertd'unblocdebit
8=transfertdematricedecaractre
9=visualisationdelasouris
10=nonvisualisationdelasouris
11=transfor mationdelafor medelasouris
12=effacementdesprite
13=affichagedesprite
14=copiedezone(FDB)
15=rem plissagedezone
Nousavonsrpondulapremireq uestion:"q u'estceq uea
fait?"Nouspouvonspasserlasuivante:"commentl'appelleton
?"UnappelligneAsefaitl'aided'unword.Lepoidsfaiblede
cewordcontientlenumrodelafonction,etlepoidsfortest
q uivalent$A(d'olenomligneA).Ainsipourappelerla
fonction3,onutiliseraleword$A003.Maisoleplacer?Etbien
toutsimplementdansnotreprogramme!Pourpouvoirlenotertel
q uelnousleferonsprcderdeDC.Wdefaonceq ueDEVPACKne
cherchepastransfor merceciencode68000puisq u'aucune
mnmoniq uenecorrespondcenombre!Pourappelerlafonction1
delaligneAnousmettronsdoncdansnotreprogramme:
DC.W$A001
Note:sicelavousintresse,vouspouvezsuivrelesappels
ligneAdelammemanireq uelesappelsTrap,sousMONST,en

toutcassivousavezunedesderniresversionsdeMONST.
Questionsuivante:commentpasserdesparamtres.Eneffetsinous
voulonsutiliserparexemplelafonction2pourconnatrela
couleurd'unpixel,ilfaudrabienfournirlescoordonnesde
celuici.NousavonsvuavecGemdos,BiosetXbiosq ueles
paramtrestaientpasssparlapile.Nousavonsgalement
utilisceprincipedansnospropresroutines.Empilage,sautla
routine(parBSRouTRAP)puiscorrectiondelapile.Concernant
laligneAetleGEM,lapilen'estpasutilise.Eneffet,la
ligneAetleGEMutilisentunsystmedetableau.Nousavons
tudilestableauxetnousavonsvucommentliredansceuxci.Et
bienc'estunpeuceprincipeq uivatreutilis.Lesparamtres,
parfoistrsnombreux,vonttreplacsdansunouplusieurs
tableaux,desendroitsprcis,avantl'appeldelafonction
choisie.Celleciirachercherlesparamtresncessaireset
retourneraensuitesesrsultatsgalementdansdestableaux.
L'avantagedusystmedesmacrosdevientvident:sipourdes
appelsgemdos,biosetxbiosilsuffitd'empiler(lenombrede
paramtresn'estpasnor meetleprincipeettoujourslemme),
ilfautenrevancheunesacrdosedemmoirepourserappeler
dansq ueltableauetsurtoutodanscetableaudoiventtre
dposslesparamtresdechaq uefonction.Malheureusementdansla
bibliothq uedeDevpack,iln'yapasdemacrospourlaligneA.
Nousallonsdoncdtaillerq uelq uesfonctions'lamain'.Etant
donnq uevousavezsouslamainlecourssurlesmacros,jene
peuxq uevousconseillerderaliserlesmacroscorrespondantes
cesfonctions.Nousallonstoutd'abordtracerunrectanglesur
l'cran.Voirlistingnumro5.
Toutd'abordinclusiondelaroutinededmarragedesprogrammes,
petitmessagedeprsentationeneffaantl'cranaupassage.
EnsuiteinitialisationdelaligneA.Enretour,nousavonsenA0
l'adressedutableauq uenousallonsrempliraveclesparamtres.
Ceuxcisontasseznombreuxetdoiventtrepasssdesendroits
bienprcis.Certainsdemandentunepetiteexplication:Le
clipping.C'estunsystmebienutile,q uenousretrouveronsdans
leGEM.Parexem plenousvoulonsaffichersurl'cranuneimage,
maiscellecinedoitapparatreq uedansunpetitrectangle.Il
vadoncfalloirsecompliq uersrieusementlatacheafinedene
pasaffichertoutel'image.Aulieudecelanouspouvonsutiliser
leclipping.Celaconsisteradonnerlescoordonnesdurectangle
dansleq uelnousvoulonsq uel'imageapparaisse,etdireq ue
c'estlerectangledeclipping.Ensuiteilresteafficher
l'imagesurtoutl'cranetellen'apparatraq uedansle
rectangle,lerestedel'crantant'clipp'.Laencore,ilest
bienvidentq uecelaralentil'affichage,nousavonseneffet
affichtoutuneimagepourn'envoirq u'unbout,etdeplusle
systmeatobligdetestersansarrtpoursavoirs'ildevait
nousmontrercepixel,puisl'autreetc...Cettemthodeest
pourtanthyperutileetnousverronsceladenombreusesfois.
Letyped'affichage.C'estundescripteurper mettantdesavoir
commentvasefairel'affichage.0=moderemplacement,1=mode
transparent,2=modeXOR,3=transparentinverse.Essayerdefaire
2erectangleq uiserecouvreetobservezlersultatenfaisant
varierlesmodes.
Nousallonsmaintenantutiliseruneautrefonction,q uidemandela
couleurd'unpixel.Danslecasdutraaged'unrectanglenous
avonsutilislatableaudontl'adressetaitenA0pourpasser
lesparamtres.Pourlademandedecouleurd'unpixeletpourle
coloriaged'unpixel,nousallonsutiliserd'autrestableaux.Alors

l,suivezbienparceq uelestableauxq uenousallonsdcrire


maintenantsontgalementutilisspasleGEM?nousallonsdonc
faired'unepierredeuxcoups!!!!!
ToutcommeleGEMdonc,laligneAutilisedestableaux,destins
chacunrecevoirourendredeschosesdiffrentes.Lepremier
tableau,c'estletableauCONTRL(Control)Ilreoitlenumrode
lafonctionetq uelq uesautresparamtres.Lesecondc'estle
tableauINT_IN.CelasignifieIntegerIn,c'estdoncuntableau
q uivarecevoirdesentiers(unnombreentierc'estenAnglaisun
integer)Letroisimetableauc'estPTSIN(PointsIn).C'estun
tableaudestinrecevoirlescoordonnesdespointsoubiendes
dimensions.Disonsq uecetableauvarecevoirparexempleles
coordonnesXetYpourlecentred'uncercle,maisaussison
rayon.Ilrgneunecertaineconfusiondanslesexplicationssur
cetableau.Eneffetilreoitentreautredescoordonnes,q ui
vontsouventparcouple(XetobligatoirementY),ceq uifaitq ue
biensouventonditparexem ple"ilfautmettre1donnedans
PTSIN"alorsq u'enfaitilfautmettreuncouplededonnes!Le
q uatrimetableauc'estINTOUT.C'estlammechoseq ueINT_IN
saufq uec'estensortie,pourlesrsultats.Vousvousendoutez
maintenant,lederniertableau,c'estPTSOUT!!!!
Jetonsmaintenantuncoupd'oeilsurlelistingnumro6.Unpeude
rflexionetcelanedoitpasvousposerdeproblme.Essayez
cependantderefairecelistingavecdesbouclesparceq u'avecle
coloriaged'unseulpixel,c'estbiensurunpeulimit...Juste
unechose,essayerdebienimaginerceq uisepasseavecles
tableauxContrl,Int_in,Ptsin,IntoutetPtsoutparcedansle
chapitresuivantilvayenavoirbeaucoup.....
Bonmaintenantq uevoussaveztracerunrectangle,vouspouvez
galementtracerdeslignes,demanderlacouleurd'unpixeletc...
Lafonctionlaplusdlicateestmonaviscelleq uisertpour
l'affichagedetexte.Elleper metcependantdeseffetsassez
intressants(critureavecdiffrentsstyles).
PourutilisermaintenantlaligneA,reportezvousauxdescriptifs
donnsdanslaBibleetessayez!2eremarq uecependant:avecle
GEMetlaligneAnousabordonsenq uelq uesorteleconceptdu
multiutilisateur/multimachines.EneffetleGEMutilisebeaucoup
laligneAetpartagedoncavecluilestableaux.Or,votre
programmepeuttrsbientreentraindetracerdejolis
rectangleslorsq u'ilvientl'utilisateurl'idedepromenersa
sourisdanslemenudroulant...AppelGEM,modificationdes
tableauxcommunsauGEMetlaligneA,etauretouradieules
rectangles...
Lencoreprudenceetrflexionpoursemettrelaplacede
l'utilisateur...
Seconderemarq ue,lesadressesfourniesparlaligneA.
Nouspouvonsprendrecommeexemplelesfontes.Osetrouvent
elles?AvecMONST,enseballadantenmmoire,ilseratoujours
possibledelestrouver.Malheureusementellesnesontpasaumme
endroitdanstouteslesmachines.Cen'estpasgrave,ilsuffitde
passerparlaligneA.Eneffetlafonction$A000per met
d'initialisermaisengrandepartiecelanefaitq uenousfournir
desadresses.Grcecellescinouspouvonsendduiredetrs
nombreuseschoses(emplacementdesfontesentreautre).Lencore,
ilestprfrabledepasserparDC.W$A000puisdefairedes
dcalagepourtrouverceq uinousintresse.Lepetitrigoloq ui
sevanted'avoirtrouvl'adressecacheq uidonnelesfontesse

rendrabienvitecompteq uecelanemarchepastoutletempsalors
q u'aveclaligneA,c'estmoinsfrimemaisc'estsr!
Pourl'utilisationdelaligneA,ledescriptifdesfonctionsdans
labibleestsuffisant.Commencezparlesrectangles,leslignes,
placezdespointsodemanderleurcouleursetc...Voiciun
exempleq uiatdanslespremiersq uej'airalisaveclaligne
A:Affichaged'unpetittexteenhautgauche(environ5lignes
de20caractres).Al'aided'unboucle,ondemandelacouleurdes
pixels,etonrecolorielespixelssurladroitedel'cranetde
faonceq ueletexteapparaissentverticalement.
Pourceq uiestdedter minerl'emplacementdecertainesdonnes
grceunsautdanslesadressesd'initialisationligneA,la
bibleestunpeusilencieuseldessusalorsq ueleLivredu
DveloppeurchezMicroAppestplusfourni.
Conseildedernireminute:faitesbeaucoupd'exercicesavecla
ligneAetsurtoutfaitesvousunebibliothq uedeMacropourses
fonctions.

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 2

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Coursnumro8*
******************************************************************
J'espreq uevousn'abordezpascecoursimmdiatementaprsavoir
finidelireleprcdent,mais,q u'aucontraire,vousvoustes
plongdanslaligneAavecbonheur!
Nousallonsmaintenantaborderunsujetq ui,jedoisl'avouer,
m'effrayaitunpeuaudbut:leGEM.
Enfait,enprogrammationcommedansbeaucoupd'autressujets,on
semetbossersimplementlorsq u'onyestoblig.Ainsije
n'avaisralisq uedetoutpetitstrucsavecleGEMen
assembleur,destr ucsdugenreACCessoiredebureauq uiper metde
mettrel'craneninversevido,avecunchoixdansunebote
d'alerte,avantdemetrouverfaceaudescriptifdusoftq ueme
proposaituneboteParisienne.Jedoisavouerq uelespremiers
joursonttunpeudurs,maisq u'lalonguej'aidcouvertq ue
leGEMestvraimentunechosefabuleuse,pastrsdurmatriser
etq uelespossibilitssontlargementsuffisantespourcomblerde
bonheurtoutprogrammeurdignedecenom!!!J'espredoncq uevous
prendrezautantdeplaisirq uemoiprogrammersousGEMunefois
q uevousaurezlucechapitre.
Toutd'abordlesremarq uesq uisetrouventaudbutduchapitre

surlaligneA,mritentd'trerelus.Chercherdoncdeladocu
mentationsansvoussoucierdulangage.Voustrouverezdansle
derniercoursdecettesrieunebibliographiedanslaq uellej'ai
essayderecenserdiversarticlesbiensympas.
LeGEMestaccessibleparleTRAP#2,maisenfaitgrcecetrap
nousavonsaccsplusieurspartiesduGEM,unpeucommesile
trap#1dbouchaitenmmetempssurGEMDOSetBIOS.LeGEMest,
eneffet,composprincipalementde2par ties:
l'AESetleVDI.
LesroutinesduVDIVIRTUALDEVICEINTERFACE
s'occupentdesgraphismes;
traagedecercles,
ellipse,
traits,
rectangles
etc...
Parcontre,l'affichagedesobjetstypiq uesduGEM:
fentres,
botesd'alertes
estralisparl'AESAPPLICATIONENVIRONMENTSYSTEM.
Aufuretmesureq uevousdcouvrirezlesfonctionsVDIetAES
vousvousrendrezcomptedel'interactiondes2.
Legrosavantagedecesystmepeuts'expliq uersimplement:il
semblevidenttoutlemondeq uesortirundessinsuruncran,
unedisq uetteouuneim primante,cen'estpaslammechose.
ERREUR!PourleGEMc'estpareil!
Enfait,onpeutdireq uevousavezprparervotredessinet
dire"jel'envoie".O?Ahl,c'estcommevousvoulezparceq ue
pourleVDI
l'cran,
latabletraante,
ledisq ue,
l'imprimante
etc..
nesontq uedespriphriq ues.Ilsuffitdeluidsignerlepri
phriq uedenotrechoixetilfaitleboulottoutseul!!!!
Leseulproblme:
lesroutinesvritablementindpendantesdespriphriq uesse
trouventdansGDOScenomvousfaitsrementfrmird'effroi...
Plusieursprogrammesenmmetemps?
LeprincipeduGEMesttrsattirantmaisdoitnousamenerr
flchirunpetitpeusurlemlangepotentieldesdonnes.Enef
fetleGEM,mmes'iln'estpasrellementmultitche(tremulti
tcheconsistepouvoirfairetournerdesapplicationsexactement
enmmetemps,ceq uiestdetoutefaonimpossibleavecun68000)
leGEMdonc,per metd'avoirplusieursprogrammesactifsenmme
tem ps,enl'occurrenceunprogrammeprincipalet6accessoires.
PourleGEMiln'yafondamentalementpasdediffrenceentreun

PRGetunACCet,pourcetteraison,danslevocabulaireGEMon
lesnomme"applications".LeGEMpeutdoncseretrouveravec7ap
plicationsgrer,chacuneayantpotentiellementplusieursfen
tres.Onimaginefacilementlebazardanslammoire!!!
CommentleGEMs'yretrouvetil?
Audmarraged'uneapplication,celleciappellelafonctionAP
PL_INIT(Application_Init).CettefonctionprvientleGEMq ueno
treapplicationdsiredeveniractive,etleGEMrpondennous
fournissantunnumro,l'APP_ID(Application_Identificator)q ui
nousserviramaintenantderfrence.Notreapplicationseradonc
parexem plela3,etserareconnuecommetelleparleGEM.Atten
tion,l'APP_IDn'estdonnl'applicationq uepourladurede
prsenceenmmoiredecelleci.SijelanceunACClelundi,il
peuthriterdel'APP_ID4maissijelerelancelemardidansdes
conditionsdiffrentes,ilpeutobtenirl'APP_ID5.Seulementil
garderacetAPP_IDpendanttoutesonactivit.
Lorsq uel'onouvreunefentre,c'estlemmeprincipe.LeGEM
fournitceq uel'onnommeunHANDLE,c'estdireunnumrocor
respondantlafentre.EnfaitleHANDLEc'estlenumrod'iden
tificationd'unefentremaispotentiellementaussid'unpriph
riq ue.
Multitraitement?
UnedespartieslesplusimportantesduGEMconcernelagestion
desvnements.Unvnementsc'estuneactiondel'utilisateurde
lamachine:clicsouris,appuisurunetoucheetc...Enfait,sous
GEMlesapplicationspassentlaplusgrandepar tiedeleurtemps
attendre.ImaginonsunPRGavecunefentreouverteetunmenu
droulant,etenmmetempsenmmoire3accessoires.Jevaisdans
lemenudesaccessoires.Lemenusedrouleetlestitrespassent
eninversevidolorsq uelasourispassedessus.Toutceciest
faitparleGEM,toutseulcommeungrand.Jecliq uesurletitre
del'accessoire2.
LeGEMdtecteleclic,saitq uejesuisdanslesaccessoires,re
gardesurq uelleentrej'aicliq u.Commec'estleGEMq uiaat
tribulesentresauxACC,ilenvoieunmessagel'accessoire2
pourluidire"ilfautq uetut'ouvres".Celuicis'ouvredonc,et
afficheunefentrel'cran.Nousavonsdonc2fentresenmme
tem ps.Jecliq uesurcelleduPRG,leGEMregardeq uiappartient
cettefentreetenvoiauPRGunmessagepourluidire"onaacti
vtafentrenumroXX"etc...Nousallonsdoncconstr uiredans
nosprogrammessousGEM,unnoyaudesurveillancedesactions,et
nousragironsenfonctiondecellesci.
PourappelerlesfonctionsduGEM.
Lesappelssefontavecdesparamtresq uenouspassonsdansdes
tableaux.CommenousutilisonsDEVPACK,nousutiliseronssabi
bliothq ue.Eneffet,pourlesappelsauGEM,lesparamtressont
nombreuxetplacerdesendroitsbienprcisdanslestableaux.
Pourcesraisons,lesmacrostrouventicitoutleurintrt.Nous
appelleronsdonclesfonctionsduGEMaveclesmacroscontenues
danslabibliothq uedeDEVPACK.Cependantilconvientdeconna
tregalementlestableaux,afindepouvoirparfaitementcompren
dreleprincipedefonctionnement.

Pourl'AES,ilfaut6tableaux:
CONTROL,
GLOBAL,
INT_IN,
INT_OUT,
ADDR_IN,
ADDR_OUT.
PourleVDIilenfaut5:
CONTRL,
INTIN,
INTOUT,
PTSIN,
PTSOUT.
Attentionlalgrediffrenced'orthographeentreINT_INet
INTIN!Pourindiq uer,lorsdel'appelauGEM,l'em placementoil
trouveracestableaux,leursadressessontplacesdans2listes:
Unepourl'AES:
aes_paramsdc.lcontrol,global,int_in,int_out,addr_in,addr_out
etunepourleVDI:
vdi_paramsdc.lcontrl,intin,ptsin,intout,ptsout
Voicilestableauxtelsq u'ilssontdfinisdanslabibliothq ue
GEMdeDEVPACK:
controlds.w5
globalds.w14
int_inds.w16
int_outds.w7
addr_inds.l3
addr_outds.l1
contrlds.w1
contrl1ds.w1
contrl2ds.w1
contrl3ds.w1
contrl4ds.w1
contrl5ds.w1
contrl6ds.w1
contrl7ds.w1
contrl8ds.w1
contrl9ds.w1
contrl10ds.w1
contrl11ds.w1
intinds.w128min30
intoutds.w128min45
ptsinds.w128min30
ptsoutds.w128min12
Vousremarq uezl'trangemiseenplacedutableauCONTRL(tableau
pourleVDI).Eneffetilfautassezsouventpasserdesparamtres
'lamain'danscetableau.Aveccesystme,ilserapossiblede
raliseruneoprationdugenreMOVE.W#10,CONTRL2
AttentioncettenumrotationdesCONTRLcorrespondaunombrede
wordscarchacunedesentresestdfinieparDS.Wetnonpaspar
DS.B!!!Cecis'expliq ueparlefaitq ue99%desdocumentsrelatifs
auGEMsontpourle'C'etq uec'estcetypedecommandeq uiest

faiteen'C'.Ainsivoustrouverezsouvent;"mettre10en
contrl(2)";ilvoussuffiradefaireMOVE.W#10,CONTRL2etletour
estjou.
Pourq uoitantdetableaux?Parceq uechacundecestableauxest
destinrecevoirourenvoyeruncertaintypededonnes.
Voyonsundescriptifrapidedecestableaux.
TableauxAES
**control
Destincontenir,dansl'ordre:
numrodelafonction(.W),
nombred'octetsdeINT_IN(.W),
nombred'octetsdeINT_OUT(.W),
nombredelongsmotsdeADDR_IN(.W)
nombredelongsmotsdeADDR_OUT
**global
Cetableauestunpeuspcial,etlesexplicationsleconcernant
nesontd'aucuneutilitdanslecadredecescours.Unefoisbien
ingurgitlereste,vouspourreztoujoursvouspencherdessusmais
actuellementcelaneferaitq uevousembrouiller!(Voirlabiblio
graphiepourensavoirplus)
**int_in
Cetableauestdestinrecevoirdesvaleursentires(Integer
In)dontl'AESaurabesoin.
Parexempleunnumrodefentre.
**int_out
Al'inverseduprcdentcetableaurenvoidesrsultatsparexem
plesivousdemanderlasurfacedisponiblepourunefentre,vous
aurezicilesdimensions.
**addr_in
Listedanslaq uellevouspourrezplacerdesadresses
**addr_outetl,vouspourrezenlire!Enfaitilsuffit,comme
toujours,delirelenomdutableaupourendduireceq u'il
contient!
TableauxVDI
**contrl
Danscontrl0nousplaonsl'opcodedelafonction,c'estainsiq ue
l'onappellesonnumro.
Danscontrl1nousplaonslenombrededonnesq uiserontmise
dansletableauintin
Danscontrl2nousplaonslenombredepoints(doncdecouplesde
donnes)q uiserontplacsdansletableauptsin

Danscontrl3nousplaceronsl'identificateurdelasousfonction.
Parexem pleletraagedescercles,ellipse,rectangleetc...ce
faitaveclafonction11.Ilfautdoncunsouscodeper mettantde
dfinirq uelmoduledanslafonction11ondsireutiliser.
Danscontrl6nousplaonslehandledupriphriq ue.(voirplus
haut)
Apar tirdecontrl7ilyaparfoisdesinfor mationspasser,
suivantlafonction.
**intinetptsin
NousremplironsensuiteletableauINTINaveclesparamtresen
tiersdemandsparlafonctionetletableauPTSINaveclescoor
donnesdemandesparlafonction.Unefoislafonctionappele,
nousrcuprerons:
encontrl2lenombredecouplesdecoordonnesdeptsoutet
encontrl4lenombredemotsdeintout.
VoiciunappelauGEM.Cettefonctionafficheunephraseol'on
veutsurl'cran,contrairementGemdos(9)q uiestlimitsur
leslignesetlescolonnesdetexte.Depluscettefonctionper met
d'afficherdutexteavecdeseffets(gras,soulignetc...)avec
lafontedenotrechoix:
LEAMESSAGE,A1adressedelaphrase
LEAINTIN,A0tableauderception
MOVEQ.L#0,D2initlecompteurdelettres
ICI3CLR.WD0
MOVE.B(A1)+,D0prlveenbytes
BEQGO_ONfindutexte
ADDQ.B#1,D2oncompteleslettres
MOVE.WD0,(A0)+transfredansINTIN(en
words)
BRAICI
GO_ONMOVE.W#100,PTSINpositionX
MOVE.W#150,PTSIN+2positionY
MOVE.WD2,CONTRL3nombredelettres
MOVE.W#1,CONTRL1
MOVE.WCURRENT_HANDLE,CONTRL6
MOVE.W#8,CONTRLopcode
MOVE.L#VDI_PARAMS,D1
MOVE.W#$73,D0
TRAP#2
AAAAAAAAAARRRRRRGGGLLL!!!!!!C'estl'horreurn'estcepas!
Ilfautvousmunirdepatienceetdcortiq uerlesmultiplesappels
auGEM.
Pourvousaiderdansvosessais,voustrouverezcijointundos
sierintitulGEM.Ilcontientlesourced'unACCq uiafficheune
boted'alerte,d'unPRGq uigreuneressource(listingissude
WERCS)etd'unaccessoiregrantunefentre.Pourceq uiestdes
diteursderessources,jetravailleavecKRessourceq uiestbien
sympaetq uineplantepas,contrairementWercs!
Essayezdebiencom prendreleprincipe:affichezunebote
d'alerteavecunseulbouton,puisavecplusieurs,faitesdes
petitesressourcestoutessim ples,puisdeplusenpluscompli
q uesetc...Leprinciperesteratoujourslemmeq uelleq uesoit
latailledevotreapplication.Essayezdefairedepetitsacces

soiresdugenrefor mateurdedisq uettes,avecunpetitfor mulaire


q uidemandesil'onveutfor materledisq ueAouleB,ensimple
ouendoublefaceetc...
Al'aidedecesexemples,vousdevriezrussirvousdbrouiller.
C'estavecaq uej'aicommenc!Jetezgalementuncoupd'oeil
surlabibliographie,ilyaq uelq uestr ucsintressants!

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 2

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Coursnumro9*
******************************************************************
Cepetitcoursvatreunpeuspcial,carilvafournirdesindi
cationssurlafaonderaliserdesprogrammesGEMq uifonction
nentcorrectement.
Ilyaeneffetq uelq ues"trucs"respecter.SurMAC,lespro
grammeursontleurdispositiondesbouq uinstraitantdel'ergo
nomiedeslogiciels.Qu'estceq uec'est?Etbienc'estsimple
mentunensemblederglesrespecterafinq uel'utilisateurne
soitpasperdud'unprogrammel'autre.Ilfauteneffetbiense
souvenirq uevoustesprogrammeuretq uevotreouvrageserauti
lispardesutilisateurs!Rflchissonsunpeu:q u'estceq ue
l'utilisateurrecherchedansunprogrammededessin:
1)avoirunesauvegardedefichiercompressavecunalgorithme
spcial,q uicom presseplusq uelescopains.
2)avoirlapossibilitdercuprerleplusfacilementpossible
cesdessinsdansd'autressofts.
Ilparatvidentq uec'estlasecondesolutionq uiestlabonne!
Pourtantnousassistonsuneprolifrationdefor matsdefi
chiers,tousplusdbileslesunsq uelesautres!Ahbiensr,le
fichiercom pressaveclelogicieldedessinBidulmucheestplus
petitq uelefichierissudeDegas,maisiln'estreconnuparper
sonne!Pourq uoichercherpaterlagalerieavecdesnouveaux
for mats?Pourq uoinepaschargeretsauverenPI1,PI2,PI3,PC1,
PC2,PC3etc'esttout?Premirergle:ilfautdoncpenser
l'utilisateuretnepaschercherdetr ucstordus!Lepremiermenu
c'estceluiducopyright,lesecondceluidesfichiersavectout
enbasl'optionQuitter.Quellemerdededevoirchercherl'option
Quittertoutauboutd'unmenuparceq ueleprogrammeuravouluse
distinguer!
Deplus,parconvention,lesentresdemenusq uidbouchentsur
undialogueserontsuivisde3points.

PensezauxgrandscransetauTT!!!!!Lorsq uevoustapezdans
desadressessystmedocumentes,prvoyezunadressagesur32
bits.Parexem ple$FF8800marcherasurSTmaisplanterasurTT.
C'esteneffetuneadresseinvalidesioncherches'enserviren
32bits(avecle68030).Ilfautdoncutiliser$FFFF8800q uimar
cherasurtouteslesmachines.
NetestezpaslarsolutionavecXbios4!C'estprilleuxcar,en
casdegrandcran,vousrecevrezn'importeq uoi!Pourl'ouverture
maxid'unfentre,demandezauGEMlatailledelastationdetra
vail(voirlesourceaveclafentre).Unecopiedeblocsfaire
?UtilisezlafonctionVro_cpy,maissic'estunecopieavec
l'cran,ilyaunesolutionsimple:vousserezobligerdefabri
q uerunestructureFDB(For mDefinitionBlock).C'estunestruc
tureq uiindiq uelalargeurdelasurfacedetravail,salongueur,
lenombredeplansetc...AulieudedemanderauGEMtoutesles
donnes,remplissezlade0,etleGEMsauradeluimmeq uevous
voulezparlerdel'cran,etsedbrouilleratoutseul!
Pourvosaccessoires,testezvosressourcesenbassersolution!
Unaccessoire,commesonnoml'indiq uedoittreaccessoire,
c'estdirefonctionnersansgnerlerestedelamachine:Pe
titetaille(unaccessoiredefor matagede100Kohum!!!).
Unseulfichierressource.Celaimpliq uedenepasutiliserde
dessinsetdeconstruiresaressourceavecl'optionSNAPactive
dansK_Ressource.Cetteoptionper metd'avoirlesboutonsbien
placsq uelleq uesoitlarsolutiond'utilisationdelares
source.Sipossibleplacezlaressourcel'intrieurdel'acces
soireenlarelogeant(voirlistingderelocationcijoint)cela
vited'avoirplusieursfichiersmanierq uandondplacelesac
cessoires.
N'hsitezpasmettredesraccourcisclavierdansvosressources.
SivousutilisezKRessourcesvousverrezq u'ilyaunaccsdes
bitsinutilisspourlesobjets.Eneffet,sil'onprend,par
exemple,lesbitsdfinissantlesflagsdel'objet,onserend
compteq ueseullesbits08sontutiliss.Orlecodageest
faitsurunword,ilnousrestedonc7bitsdelibres.Cesbits
sontlaisssauprogrammeurpourystockerceq u'ilveut.Atitre
indicatifvoiciceq uej'ymets:
Extended_typescancodedelatouchederaccourcipour
cetobjet.
Extended_flagTouche(s)devanttreenfoncesimultanmentpour
rendreceraccourcivalide.
Bit15>Alternate
Bit14>Control
Bit13>Shiftgauche
Bit12>Shiftdroit
Bit11et10>positiondusoulignement.
(0=pasdesoulignement,1=onsoulignelapremire
lettreetc...)
Extended_stateIndicationdelamusiq uesurunoctet
associlaslectiondecetobjet
0pasdemusiq ue
1clochette
263digits
64127Xbios(32)
128190sonaufor matGist

191255musiq uefor matMadMaxouMusexx


Toutcecimeper metd'avoirdesraccourcisclavierinscritsDANS
laressourceceq uiper metdesmodificationsultrarapide.Pour
lesraccourcis,ilfaututiliserdeprfrencelatoucheAlter
nate,carsonutilisationavecunautretouchenegnreaucunca
ractre.Cependant,6raccourcisclaviersutilisentControl.Ils
sontissusduMACetonttendancesegnraliser.Cesraccourcis
sontutilissdanslesfor mulairesavecchampsditables(entre
autreschoses)afindefaireducouper/collerentreceschamps.
CONTROLX|pourcouper(placeenbufferenl'effaant
|aupralable)
SHIFTCONTROLX|pourcouper(mettrelasuitedanslebuffer);
CONTROLCet|CommeavecXsaufq ue,danslecasdeX,le
SHIFTCONTRLC|champditableesteffac,alorsq u'avecC,il
|conservesoncontenu.
CONTROLV|collelecontenudubuffereneffaantau
|pralablelechampditable.
SHIFTCONTROLV|idemmaissanseffacementducham pditable.
Uneautreremarq ueconcernantlesfor mulairesavecplusieursen
tresditables:j'airemarq uq ueparhabitudel'utilisateur
tapaitRETURNq uandilavaitfinideremplirunchamp,etq ue,
souvent,leboutonANNULERestmisendfaut:l'appuisurRETURN
donc,faitsor tirdufor mulaire!
J'aidoncdciddesupprimerlesboutonsdfautlorsq u'ilyades
entresditablesetdegrerdiffremmentRETURNq uiper metalors
depasseraucham pditablesuivant(commeTAB).
J'aigalementrajoutq uelq uesautrestouches.Alorsq u'avecTAB,
ilestpossibledepasserd'uncham pditableausuivant,j'ai
ajoutShift+TABpourremonterauchampditableprcdent.
CLRHOMEper mettantdereveniraupremierchampditabledufor mu
laire.Ilseraitpossibled'ajouterUNDO.
Rcrireunegestiontotaledefor mulaire(enprenantcommebase
dedpar tunarticledeSTMagq uifaisaitaenGFAparexemple)
n'estpastrsdur.Ceq uiestsym pagalementc'estderajouter
unpetitcarrenhautdroite,afindedplacerlefor mulaire.
Pourtoutescesoptions,vouspouvezbiensrfaireavotre
propresauce,maislesraccourcisclavierdontjeparlesontdj
unpeuutiliss.Autantcontinuerafinq uelesystmese
gnralise,pluttq uedecherchersedistinguerpardestrucs
malcommodes.
Jeter mineraicechapitresurleGEMenvousinvitantdcouvrir
leProtocoledeCommunicationGEM.Pouryavoiraccs,dcompactez
lefichierPROTOCOL.ARavecARCHIVE.PRG.Vousplacezcefichieren
ram_disq ue(parexempleD).Vousprparezunedisq uettevierge,
vouslancezArchivevouschoisissezUnpackavecD:\PROTOCOL.ARet
commedestinationA:\*.*etvousattendez.
Ilyatouslessources,labiblio,ladoc,lesexemplesetc...
Tousvossoftsdoiventtrecompatiblesaveccesystmes'ilsveu
lenttredanslecoup!!!C'estfacileetcelaper metdesdlires
assezfabuleux!

BonsprogrammesGEM!!!!!

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 2

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Coursnumro10*
******************************************************************
Avantdevousfournirlabibliographietantattendue,jevaisvous
parlertrssuccinctementdesinterruptions.Leprincipeestnor
malementconnu(sinonreportezvousaucoursnumro5delapre
miresrie!).Ilyapourtantunsujetq uimriteunpeuplus
d'attention:leMFP68901.Ils'agitd'uncircuitreconnuparle
68000commeayantunniveaud'interruptionde6(voirfeuille
fournieaveclecours1etintitule"TABLEAUDESVECTEURSD'INTER
RUPTIONSDU68000ETDU68901").Eninternececircuitestcapable
degrer16niveauxd'interruption,avecpourchaq ueniveauune
adresseassocie($100$13CpourleST).Voiciunpetitboutde
listingdestinvousmontrercommentplacersapropreroutine
dansleTimerA.Ilfautd'abordbloq uerlesinterruptionsen
plaantleSR$2700,sauverlesregistresduMFP,placersa
routineetensuiteredescendreleniveaud'interruptionsonni
veauhabituelsurleST,c'estdire$2300.Cecisefaitbien
videmmentenmodeSuper viseur,modeauq uelonaccdeavecGemdos
$20.
*Pourmettreenplace....
MOVE.W#$2700,SRitinterdites
MOVE.B$FFFFFA07,ANC_IERAsauveles
MOVE.B$FFFFFA09,ANC_IERBvaleursdu
MOVE.B$FFFFFA13,ANC_IMRAMFP68901
MOVE.B$FFFFFA15,ANC_IMRB
MOVE.B$FFFFFA17,ANC_VR
MOVE.L$134,ANC_TIMEAsauveTimerA
MOVE.L#MY_TIMEA,$134placenouvelleroutine
CLR.B$FFFFFA09empcheinterrupt07
CLR.B$FFFFFA15masq ueinterrupt07
MOVE.B#%00100000,$FFFA07OKinterrupt13(timerA)
MOVE.B#%00100000,$FFFA13OKaussipoursonmasq ue
MOVE.B#7,$FFFFFA19rgleTACR
MOVE.B#12,$FFFFFA1FetTADR(1khz)
BCLR#3,$FFFFFA17automaticendofinter upt
MOVE.W#$2300,SRautoriseinterruptions
*Etmaintenant,lorsq uenousq uittonsleprogramme...

MOVE.W#$2700,SRitinterdites
MOVE.BANC_IERA,$FFFFFA07restitution
MOVE.BANC_IERB,$FFFFFA09
MOVE.BANC_IMRA,$FFFFFA13
MOVE.BANC_IMRB,$FFFFFA15
MOVE.BANC_VR,$FFFFFA17
MOVE.LANC_TIMEA,$134
MOVE.W#$2300,SRautoriselesinterruptions
*MaroutineTimerA
*Nepasoublierdesauverlesregistresq uisontutiliss
*etdeter minerparunRTE.
MY_TIMEA:movem.ld0a6,(sp)
'
'
'
BCLR#5,ISRAsuivantVR!!!
MOVEM.Lsp)+,d0a6
RTE
**
SECTIONBSS
ANC_TIMEADS.L1
ANC_IERADS.B1sauvegardepourleMFP
ANC_IERBDS.B1"
ANC_IMRADS.B1"
ANC_IMRBDS.B1"
ANC_VRDS.B1"
JevaissimplementvousdcrirelesregistresIERA,IMRA,IPRA
etc...duMFP.Pourdeplusam plesdtails,consultezlaBibleST,
leLivreduDveloppeurouladocofficielleATARI(l'idal!),le
butdecescoursn'tantpasd'treunerecopiedesinfosq uevous
pouveztrouverautrepart.
Toutd'abordles16niveauxduMFPsontclasssen2groupes.LeA
concernelesniveaux158etleBlesniveaux70.Attention,
iciAetBn'ontrienvoiraveclesTimersAetB!!!Pourchaq ue
groupe(AouB)ontrouveunesriederegistres.Danschacunde
cesregistreslesinterruptionssontreprsentesparunbit.
Voyonscesregistres:
IERA($FFFFFA07)etIERB($FFFFFA09)
InterruptEnableRegisterA(ouB)
Enplaant0lebitcorrespondantuneinterruption,on
interditcelleci.Elleneseraaucunementpriseencompteparle
MFP.
IPRA($FFFFFA0B)etIPRB($FFFFFA0D)
InterruptPendingRegisterA(ouB)
Lorsq u'uneinterruptionarrive,leMFPmet1lebitcorrespon
dantcellecidansIPRA(ouIPRB).Celasignaleq u'uneinterrup
tionestenattente.Eneffetcausedusystmedepriorit,il
estpossibleq u'uneinterruptiondehautniveausoitencourset
q uependantcetempsuneinterruptionplusfaiblesedclenche.Il
fautdoncnotercettevolontdesedclencher,afinq u'unefois
finiletraitementdel'interruptionprioritaire,letraitementde
laplusfaiblepuisses'effectuer.
IlestbiensrpossibledelireIPRAetIPRBafindedter miner
siuneinterruptionestenattente.Ilestaussipossibledemet

tre0lebitd'uneinterruptionenattente,afinq uecellecine
sedclenchepas.Parcontre,lefaitdemettreunbit1dansce
registren'aaucuneffet.Onserendainsicompteq ueles
possiblitsdeviennentdjasseznombreuses.Uneinterruption
peutainsienscruteruneautredefaonobteniruncycle
irrgulierd'interruption.
Ilestenpluspossibledelaisseruneinterruptionsedclencher
juste'pourvoir'.cecipeutsefaireenlalaissantvalidepar
IERAmaisenlamasq uantavecIMRA.
IMRA($FFFFFA13)etIMRB($FFFFFA15)
InterruptMaskRegisterA(etB)
Lemasq uageem pcheuneinterruptiondesedclencherbienq u'elle
soitautoriseparIERAouIERB.Cecipeutper mettreparexemple
uneinterruptiondeniveau4denepastregneparuneinter
ruptiondeniveau6.Pourcela,illuisuffitdemasq uercelleci
durantsonexcution.
VR($FFFFFA17)
VectorRegister
Cetoctetestunpeuspcial.Dansnotrecasseullebit3nous
intresse,lesautresser vantauMFPcoderlenumrodevecteur
q uicorrespondlasourced'interruption.Lebit3ser tindi
q uerauMFPs'ilestenmodeSoftwareEndofInterruptouenmode
AutomaticEndofInterrupt(modepardfaut).Voyonslesexplica
tionsaveclesregistressuivants:
ISRA($FFFFFA0F)etISRB($FFFFFA11)
InterruptinServiceRegisterA(ouB)
Unbit1indiq ueq uel'interruptionestencoursdetraitement.
SinoussommesenmodeSoftwareEndofInterrupt,c'estlafin
denotreroutineeninterruptionq uenousdevonsindiq uer,nous
mmeq uenotreroutineestfinie.Pourcelailfautmettre0le
bitcorrespondantnotreinterruption,dansISRA(ouISRB).Tant
q uecebitest1,lesinterruptionsmoinsprioritairesnepeu
ventpasvenirnousdranger.Parcontre,dsq ueletraitementde
notreinterruptioncommence,sonbitIPRAestremisautomatiq ue
ment0,etpendantletraitementdecetteinterruption,uneau
tredemmeniveaupeuttrsbienintervenir.Lebitd'IPRAsera
doncremis1,maiscettenouvelleinterruptionneseratraite
q uelorsq uelapremireauraremiselebitISRA0.
D'unautrect,sinoussommesenmodeAutomaticEndofInter
rupt,dsq uenotreroutines'excute,leMFPmet,biensr,son
bitd'IPRA0(puisq uel'interruptn'estplusenattente),mais
metgalementsonbitISRA0!Ilestalorspossibleq ued'au
tresinterruptionsplusfaiblesviennentinterromprelapremire,
mmesiellen'estpaster mine.
Vousvoyezq u'avectoutceci,ilestpossibledejonglerallgre
mentenenvisageantlescaslesplustordus!!!Concernantlesti
mersA,B,CetD,voicijustelesadressesper mettantdeles
adresser,lesinfor mationsfourniesdanslabibleoulelivredu
dveloppeurtantlargementsuffisante.Siparhasardvoustiez
avidesd'infor mationssurcecircuit,prcipitezvouschezunli
brairespcialisdansla"littrature"lectroniq ueetdemandez

unouvragesurleMK68901.Passezaussichezlephar macienprendre
q uelq uestubesd'aspirine....
Pourter minercescoursd'assembleur,voiciunepetitebibliogra
phieafinq uevouspuissiezdirigervosrecherchesverslessujets
q uivousintressent.
LeLangageMachinesurST(Ed.MicroApp).Assezinutilecomme
bouq uin!Trstrspeud'infor mations,nonvraiment,cen'estpas
unbonachat.
LabibleST(Ed.MicroApp).Devenueassezintrouvable,dommage!
Pasmaldebonneinfos,biensuffisantdanslaplupartdescas.A
trem placparleLivreduDveloppeur.
TrucsetAstuces(Ed.MicroApp).Aviterabsolument!Lespro
grammesralissensuivantcesconseilsserontsrementincompa
tiblesdsq u'ilyaurachangementdeTOS.
LeLivreduDveloppeur(Tome1et2)(Ed.MicroApp)Sivous
n'avezpasaccsladoc.pourlesdveloppeursayantl'agrment
Atari,c'estlebouq uinq u'ilvousfaut.Onpeutregretterlesdi
zainesdepagescontenantlelistingduBIOSdesSTFetlesautres
dizainesdepagescontenantleBIOSduMgaST.Celafaitunpeu
remplissage:soitonaleniveauenassembleurpourycomprendre
q uelq uechoseetalorsonaleniveaupoursuivreleBIOSavec
MONST,soit,detoutefaon,onn'ycom prendrienetcen'estpas
parceq u'onalelistingsouslesyeuxq uecelavachangerq uelq ue
chose.Enfin,c'estmonavis,etcomme,enplus,lelistingn'est
valableq uepourlesmodlescits,sivousvousyfiezpour
"dcouvrir"denouvellesadressesvousrisq uezfortd'tresur pris
aveclesmachinesplusrcentes...
LelivreduGEMsurAtariST(Ed.MicroApp).Sivouspensezap
prendreprogrammerGEMaveca,vouscourrezlacatastrophe.
LeproblmeduGEMc'estq u'ilestutilisableenassembleur
conditiondeseser virdesmacros,sinonc'estbeaucouptrop
lourd.Ordansunlivrecommercialis,ilestim possibledese
bornerunseulassembleur.Cecifaitq uelesauteursonttout
dcortiq uaveclesappelsdirectsauTRAP#2,etq ueceladevient
totalementincomprhensiblepourledbutant.Parcontre,les
fonctionsysontrelativementbiendtailles,et,sivoussavez
djceq uevouscherchez,celivreseraunbonoutil.Onpeut,
simplement,regretterq uelq uesabsencecommelesfonctionsEscape
duGEMetq uelq uesfonctionsdel'AES.Anoterq uecelivreest
repris99%dansleLivreduDveloppeur.
DocGFA3.00.L,c'estlebontruc!Eneffetdanslesdernires
pagesdeladocdeceBASIC,voustrouverezlalistedetoutesles
fonctionsGEMDOS,BIOSetXBIOS(ilmanq uelafonctionGEMDOS$20
per mettantdepasserenSuperviseur,tantdonnq u'elleest
inaccessibleenGFA),lescodesASCII,lescodesclavieretq uel
q uespagesavant,unebonnelistedesfonctionsAES.Jedois
avouerq uej'aiphotocopicesq uelq uespagesetq u'ellesmeser
ventbiensouvent:lesinfor mationssontsuffisantesdansleplu
par tdescas,etsurtouttrsfacilestrouver,ceq uin'estpas
lecasparexempleduLivreduGEMq uinecomprendmmepasd'in
dexdesfonctions!!!
Anoterq uecertainesfonctionsduGEMexistentdanslabiblioth
q ueinterneduGFAmaisnesontpasdisponiblesdanscelledeDEV
PACK.C'estlecasdeFor m_ButtonetFor m_Keybd.Etc'estgnant!
EneffetaudbutFor m_don'existaitpas.LesgensdeDigitalRe

searchontdoncdciddefabriq uerdetoutespicescettefonc
tionpar tirdeFor m_KeybdetFomr_button,etontdiffusle
sourceenC.Auboutd'unmoment,lesprogrammeursn'ontplusuti
lisq ueFor m_Doetnoussommestombsdanslaroutinedegestion
defor mulairesq uenousconnaissonsactuellement.
SivousvoulezfairevotrepropreFor m_do,plusvoluil"suffit"
dereprendreFor m_KeybdetFor m_buttonpourrecrerFor m_do.Mal
heureusementcesdeuxfonctionssonttombesdanslesoubliettes
etpourlesavoirpffuuuuuttt!!!
Vousvoulezconnatreleuropcodeetlesparamtres?Facilecomme
tout!Sivousavezbiensuivicescours,voussavezpleindechose
surleGEM(oseplacel'opcoded'unefonction,oestinscritle
nombredeparamtresetc...etbienvouslancezAMonst,puisvous
faitesunpetitboutdeGFAq uiappelleFor m_keybdenaffichantau
pralablesurl'cranl'adressedutableauAES,etq uiattenden
suiteunappuisurunetouche.Toutcecisepassesousl'inter pr
teurduGFAbiensr!Dsq uevoustessurl'attented'unappui
touche,vousdclenchezAMONST(shift+alternate+help)ethop,la
granderecherchecommence.VousfaitesdemmeavecFor m_button,
etletourestjou.Courage,cen'estpasbiendur,etcelafait
unexcellentexercice!
Miseenoeuvredu68000(Ed.Sybex)Excellentbouq uin,traitantdu
68000engnral.Nevousattendezpasytrouverdesadresses
systmepourvotreST.Onparle,ici,cyclesd'horloges,modes
d'adressageetc...
Implantationdesfonctionsusuellesen68000(Ed.Masson,par
FranoisBRET).Commentfairedessinus,descosinus,destrans
for mesdeFourieretc...N'estpasvenduavecl'aspirinenile
caf,maiss'avreindispensable,sivousvousattaq uezauxpro
blmesdetrigoenASM.Seulement191Frs,unemisre!(Merci
Shizukadem'avoirfournilarfrencedecetouvrage!!!!!)
STATIONINFORMATIQUE2ruePimontsi75018PARIS
tl:(1)42.55.14.26
ExcellentcataloguedeDomPubs.Avantdechercherpiraterdes
softsdiverssansenavoirladoc,jetezuncoupd'oeilsurleur
catalogue.Denombreusespetiteschosessontydcouvrir(sour
cesdiversenASM,utilitairesdedbuggageetc...)Sivoustes
unadeptedel'mulationMac,danslesdompubdecettemachinese
trouvelepackCyclan,unassembleurMacavecsonditeuretc...
Biensympapourdcouvrircetteautremachine,q uipeelleaussi
d'un68000.
LesSTMagsfour millaientgalementdetrucsdivers,entoutcas
surtoutdanslesanciensnumrosmonavis...
Voiciunepetitelistenonlimitative...
Intgrationd'uneressourceenGFA(46)
For mExdo(46)
EchantillonssurST(27,28,29,30,31,35)(EnGFAavecdel'assem
bleur,maisleGFAonnelesentq u'untoutpetitpeu...)
ScrollingenGFA(3145saufnumro37et44)Mmeremarq ueq ue
pourlesdigits!!!
Gestiondesdisq uettesenGFA(13,14,15,16)
ProgrammerGEM(630environ)Super!ToutenCmaislesappels

sontlesmmesetlasyntaxeidentiq uecelledelabiblioDEV
PACK!FaitesviteunerecherchedevosvieuxnumrosdeSTMagcar
pourapprendreleGEMc'estextra!!!
Animationen3D(45,46,49)Pourlemomentledernierarticlen'est
passorti...Espronsq uecelaneferapascommelelistingper
mettantdebootersurunecartouche....Bienclair,sympa,idal
pourcommencerla3D.
Pourlescoprocesseurs,2articlesdanslesnumros31et32.
DansledfuntFirst(1ST)ilyavaitq uelq uestrucssym pasurle
MIDI,ledcompactagedesimagesDEGAS,lacrationderamdisq ue
etdespoolerd'imprimante.
AtariMagrevientenforceencemoment.
Trsbonarticlessurlaprogrammationgraphiq ueduSTE.Celaper
metdesefaireuneidesurleBLITTER,les4096couleursetc...
C'estenBASICmaislatraductionestfacile.(21,22).
Etantdanslaconfidence,jepeuxvousinfor mergalementq uedans
lesprochainsnumrosd'AtariMagvoustrouverezdesarticlessur
diffrentssujetsavecsourcesenASMetenGFAetq uecetype
d'articledevraitdurerpasmaldetemps.
Bon,enrsum,acheteztouslesmoisSTMagetAtariMag.Sibe
soinest,achetezlesplusieurs,maisfaireungrostasdetou
tescesrevuescarc'estunemined'infor mationimportante.Bien
souventlesq uestionsq uisontposessurRTELparexempletrou
ventleurrponsedansunelecturedesvieuxnumros!Quelq ues
bonsclasseurs,desintercalairesetvousaurezunedocumentation
nor mepourpastrscher.
Jeter mineraicescoursenrenouvelantl'avertissementconcernant
lachasseauxlistings!Ilestprfrabled'avoirq uelq uesbou
q uinsetdesnotessurpapierpluttq ue10mgasdesourcesau
q uelonnecomprendpasgrandchose,etq uide,toutefaon,sont
assezmalcommodesconsulterparrapportdesinfor mations
crites!
Pourceq uiestdesprogrammesassezgros,prparezq uelq ues
feuillesctdevous,pourynoterlesnomsdesroutines,des
labels,desvariablesetc...vousvousrendrezvitecompteq uela
principaledifficultdel'assembleurrsidedanslefaitq ueles
listingssonttrstrslongsetq u'ilestdifficiledes'ydpla
cerpourchercherq uelq uechose.Programmezproprement,soyez
clairsetvitezsipossiblelesbidouilles.Commentezabondamment
vossourcescardans6moislorsq u'ilfaudrafaireunepetitemo
dification,vousverrezladiffrenceentrelessourcesclairset
lesautres!
Allez,jevousq uitteenesprantq uecescoursvousaurontint
resssetq u'ilsvousaurontdonngotl'assembleur!N'oubliez
pasq uevouspouveztoujoursmecontactersurle3614RTEL1(ou
RTEL2)enbalFEROCELAPIN,etq u'ilyasurceserveurunerubri
q uepourl'assembleur68000surST,MACouAMIGA.Pouraccder
cetterubriq ue,tapez*MOTetENVOI.Abientt!

COURS D'ASM 68000


(par le Froce Lapin)

retour au VOLUME 2

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Listingnumro1/Cours3*
**
******************************************************************
*Affichaged'uneimageinclusedansleprogramme.
LEAIMAGE,A6adresseimage
ADDA.L#2,A6sautel'entteDEGAS
MOVE.LA6,(SP)onestdoncsurlescouleurs
MOVE.W#6,(SP)miseenplaceparXBIOS(6)
TRAP#14
ADDQ.L#6,SP
MOVE.W#3,(SP)cherchel'adressedel'cran
TRAP#14
ADDQ.L#2,SP
MOVE.LD0,A5lasauveenA5
ADDA.L#32,A6sautelescouleurs(16words)
MOVE.W#7999,D0initlecompteur
COPIEMOVE.L(A6)+,(A5)+transfreimageversl'cran
DBFD0,COPIE
MOVE.W#7,(SP)attendunappuisurunetouche
TRAP#1
ADDQ.L#2,SP
MOVE.W#0,(SP)etbyebye
TRAP#1
IMAGEINCBIN"A:\TRUC.PI1"l'image

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 2

******************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Listingnumro2/Cours5*
**
******************************************************************

INCLUDE"D:\START.S"
MOVE.L#MESSAGE,(SP)messagedeprsentation
MOVE.W#9,(SP)
TRAP#1
ADDQ.L#6,SP
TOUCHEMOVE.W#7,(SP)attenteappuisurunetouche
TRAP#1
ADDQ.L#2,SP
SWAPD0pouravoirlescancode
CMP.W#1,D0escape?
BEQFINouidoncbyebye
CMP.W#$3B,D0parrappor tF1
BCSTOUCHEendessousdoncpasvalable
CMP.W#$44,D0parrapportF10
BHITOUCHEendessusdoncpasvalable
*Latoucheestvalable
ADD.W#6,D0pouravoirascideA,B,C...
MOVE.WD0,(SP)affiche
MOVE.W#2,(SP)
TRAP#1
ADDQ.L#4,SP
BRATOUCHEetonrecommence

FINCLR.W(SP)
TRAP#1
**
SECTIONDATA
MESSAGEDC.B27,"E","TAPEZSURUNETOUCHEDEFONCTION",13,10
DC.B"ESCAPEPOURSORTIR",13,10,0
SECTIONBSS
DS.L256
PILEDS.L1
END

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 2

**********************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Listingnumro3/Cours3*
**
**********************************************************************
INCLUDE"B:\START.S"
MOVE.L#MESSAGE,(SP)messagedeprsentation
MOVE.W#9,(SP)
TRAP#1

ADDQ.L#6,SP
TOUCHEMOVE.W#7,(SP)attenteappuisurunetouche
TRAP#1
ADDQ.L#2,SP
SWAPD0pouravoirlescancode
CMP.W#1,D0escape?
BEQFINouidoncbyebye
CMP.W#$3B,D0parrapportF1
BLOTOUCHEendessousdoncpasvalable
CMP.W#$44,D0parrappor tF10
BHITOUCHEendessusdoncpasvalable
*Latoucheestvalable
LEATABLEAU,A0
SUB.W#$3B,D0pouravoirunchiffrede09
*MULU.W#2,D0ATTENTION!pourq uoil'toiledbut??
MOVE.W0(A0,D0.W),D1
MOVE.WD1,(SP)
MOVE.W#2,(SP)
TRAP#1
ADDQ.L#6,SP
BRATOUCHE
FINCLR.W(SP)
TRAP#1
**
SECTIONDATA
MESSAGEDC.B27,"E","TAPEZSURUNETOUCHEDEFONCTION",13,10
DC.B"ESCAPEPOURSORTIR",13,10,0
EVEN
TABLEAUDC.W"A","Z","E","R","T","Y","U","I","O","P"
SECTIONBSS
DS.L256
PILEDS.L1
END

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 2

**********************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Listingnumro4/Cours6*
**********************************************************************
*Automodificationdeprogramme
INCLUDE"B:\START.S"routinededmarrage
MOVE.L#MESSAGE1,(SP)onprsente
MOVE.W#9,(SP)leprogramme
TRAP#1
ADDQ.L#6,SP

DEBUTMOVE.W#7,(SP)attendunappuitouche
TRAP#1
ADDQ.L#2,SP
CMP.W#"",D0espace?
BEQFINouidoncbyebye
MOVE.W#$4E71,VARIANTEplaceunNOP(pardfaut)
CMP.W#"A",D0appuisur'A'?
BNEICInon
BSRROUTINEouidoncsubroutinelongue
BRADEBUTetonrecommence
ICIMOVE.W#$4E75,VARIANTEplaceunRTSlaplace
BSRROUTINEduNOPetvasubroutine
BRADEBUTpuisrecommence
FINMOVE.W#0,(SP)
TRAP#1
**
ROUTINEMOVE.L#MESSAGE2,(SP)
MOVE.W#9,(SP)
TRAP#1
ADDQ.L#6,SP
VARIANTENOP
MOVE.L#MESSAGE3,(SP)
MOVE.W#9,(SP)
TRAP#1
ADDQ.L#6,SP
RTS
**
SECTIONDATA
MESSAGE1DC.B27,"E","Apourungrandmessage,",13,10
DC.B"espacepoursortir,autretouche",13,10
DC.B"pourunmessagepluscourt",13,10,0
EVEN
MESSAGE2DC.B13,10,"Voilalepetitmessage...",0
EVEN
MESSAGE3DC.B"Oups,non,c'estlelong!!!",0
EVEN
SECTIONBSS
DS.L100
PILEDS.L1
END

COURS D'ASM 68000


(par le Froce Lapin)
retour au VOLUME 2

**********************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Listingnumro5/Cours7*
**********************************************************************
INCLUDE"B:\START.S"

MOVE.L#MESSAGE,(SP)coucoueteffacecran
MOVE.W#9,(SP)
TRAP#1
ADDQ.L#6,SP
DC.W$A000initialisationligneA
MOVE.W#1,24(A0)couleurdupremierplan
CLR.W26(A0)couleurdusecond
MOVE.W#2,36(A0)typed'affichage
MOVE.W#50,38(A0)X1
MOVE.W#50,40(A0)Y1
MOVE.W#200,42(A0)X2
MOVE.W#300,44(A0)Y2
MOVE.L#MOTIF,46(A0)adressedumotif
MOVE.W#3,50(A0)nombredemotsdumotif(1)
CLR.W54(A0)pasdeclipping
DC.W$A005appellafonction
MOVE.W#7,(SP)attenteappuitouche
TRAP#1
ADDQ.L#4,SP
MOVE.W#0,(SP)etbyebye
TRAP#1
**
SECTIONDATA
MESSAGEDC.B27,"E","TracagederectangleavecligneA",0
EVEN
*Motif,en.WJel'aicritenbinairepourmieuxvoirledessin.*
MOTIFDC.W%1100110011001100
DC.W%1100110011001100
DC.W%0011001100110011
DC.W%0011001100110011
SECTIONBSS
DS.L100
PILEDS.L1
END

**********************************************************************
**
*COURSD'ASSEMBLEUR68000SURATARIST*
**
*parLeFroceLapin(from44E)*
**
*Secondesrie*
**
*Listingnumro6/Cours7*
**********************************************************************
INCLUDE"B:\START.S"

MOVE.L#MESSAGE,(SP)coucoueteffacecran
MOVE.W#9,(SP)
TRAP#1
ADDQ.L#6,SP
DC.W$A000initialisationligneA

*Al'aidedeA0(retourdelafonction$A000nousobtenons
*l'adressedesdiffrentstableaux
*4(A0)donnel'adressedutableauContrl
*8(A0)donnel'adressedutableauInt_in
*12(A0)donnel'adressedutableauPtsin
*16(A0)donnel'adressedutableauIntout
*20(A0)donnel'adressedutableauPtsout
MOVE.L8(A0),A3sauveadressedeInt_in
MOVE.L12(A0),A4sauveadressedePtsin
*Onpasselescoordonnesdupointdontonveutlacouleur
*OnpassebiensurcescoordonnesdansPtsin.
MOVE.W#100,(A4)
MOVE.W#122,2(A4)
DC.W$A002demandecouleurd'unpixel
*Lafonction$A002renvoielacouleurdupixelenD0,onrecolorie
*unautrepixelaveclacouleurdupremier
MOVE.W#100,(A4)
MOVE.W#123,(A4)
MOVE.WD0,(A3)couleurbiensrdansINT_IN
DC.W$A001coloriaged'unpixel
MOVE.W#7,(SP)attenteappuitouche
TRAP#1
ADDQ.L#4,SP
MOVE.W#0,(SP)etbyebye
TRAP#1
**
SECTIONDATA
MESSAGEDC.B"ColoriagedepixelavecligneA",0
SECTIONBSS
DS.L100
PILEDS.L1
END

Vous aimerez peut-être aussi