+ All Categories
Home > Documents > Assembler Kurs C64

Assembler Kurs C64

Date post: 06-Apr-2018
Category:
Upload: cstroeh
View: 286 times
Download: 8 times
Share this document with a friend

of 66

Transcript
  • 8/3/2019 Assembler Kurs C64

    1/66

    D ie m e is t e n L e s e rh a b e n a u f d e n M i t m a c h K a r t e n d e nW u n s c h n a c h e i n e m M a s c h in e n s p ra c h k u rs u sg e a u B e r l V o i l a , h i e r i s t e r . D ie s e r K u r s k a n n k e i nB u c h u b e r M a s c h i n e n s p r a c h e e r s e t z e n , e r w i r d I h n e nj e d o c h h e U e n , d i e s e S p r a c h e w e s e n t i c h l e i c h t e r z uv e r s t e h e n . S o w o h l d e r 6 5 0 2 P ro z e s s o r im V C 2 0 a l sls t k e in e A l c h im ia u c h d e r 6 5 1 0 P m z e s s o r im , C 6 4w e r d e n b e h a n d e l t

    V ermutlieh 'hat es Ihnen auchsehon ab und zu in den Fingemgejucld, wenn Sie von Wunder-dinqen geles~n naben, die marrperMasohinenspraehe m it dem C o m -puter machen Kan n o Vielleicht ha-ben Sie soqarschonmalnichtsah-nend ancefanoen einzutippen, wasSie a ls Assemblerlisting sahen .Doth schon Flach,dem ersten I ) C O ' O ' OLDA # $00 und RETURN weiqertesich der Computer mit einem lapi-daren )1S YN TA X E RR OR . Wie'so,werden Sie sich gefragt 'habea, dasist doeh nun die Spr:ache unsezerMaschine, namlich Maschinenspra-ehe, wa s habe ich fa1seh gemacht?Dann sind Sie sicherlieh mal .aufdiese msrkwurdiaen Basic-Pre-gramme gestdBen, in denen einlen-ger Wurm von DATA-Zeilen mit - e i -nem kleinen FOR ..NEX 'l ' ..POKE -Kopf verne und einem SYS-SchWilnzhinten enmPilten i st, . und die manBasic-Ladernennt. Siehaben fieiBigZahlen eingetippt _. des game hof-fentlich sofort abgespeichert'j vor-sGhriftsmaBig m it dem SY&Befehlgestartet und aufeinen scheintotenComputer geschaut, der nur nochdurch Aus- linct'Emsehalten wieder-zubeleben war. Wenn Sie.dann nachlancer Fehlersuche den irrturnlichemqetippten Punkt dureh ei n Kom-rna ersetzen, (oftfinden Sie auch kei-nen Fehler, denn bei Ianqen DATASequenzen schlaot de! Druckfeh-lerteufel m it Vorliebe zu), werdenSie sich gefragt haben, warum inal-ler Welt dieses .kleine M,iBgeschickden ganzen Computer absturzenIMt. sie merken vermutlich schon,daB mir das alles und noch rnehr(woruber ieh schamhaft schweige}passiert ist. 'Die Konsequenz war,daB ich los ging, urn ein schlaues

    Buch zuerwezben. Aper rnerkwur-dig, d am a ls t a uc n te der Begriff Ma -schinenspraehes in keinem Titei auf.lrgend wa n n begriIf i oh, daB Assem-bler und Maschinensprache irgendetwas miteinander zu tun haben.Aber dafin@''das,ganze Elend. erstrichtig an: Da gab es 6502-, Z80-,8080-,8~85-,68GO-Assembler, da wa-ren irgEmdwelehe -Schaltlane, an-scheinend, wie man wo wa s hiffiotet-fU r rn icb a ls N ieh telektro n iker ein e-Art modemer Kuns t - da W81' V0nCPU, BUssen, necativen Flq,nken,Zweiphasentakten die R ede ..Ich habe mich furchtbar geargerttiber die Geheimsprache, die esdern Un,eingeweihten verwehrt, e,t-'w a s z u v ers te he n, Seither hat sich ei-niges verandert, Die Geheilnnissesind ke'ihe mehr und ieh werde Ih-nen in dieser S'erie ohne verschlus-selte Sprache die maqischen Zirkelder Assembler-Alchimisten offen-baren. Heute gibt es auch Buchertiber Maschinensprache auf demCommodore 64((undes sei Ihnen an-@eraten, ruhig auch das eine ederandere durchzuarbeiten. S ie wer--den allerdings feststellen, daB diemeisten davon gerade dart aufho-ren, woes.anfanct, spannend zuwer-den: Bei der Benutzunq V0I/. .Routi-nen des Betriebssystems und des In-terpreters. Deswegen sell derSchwerpunkt dieser Sede andersHegen:Wir werden das netwendiceGrundwissen uber die Hardwarenur ganz knapp behandeln, danndas Vokabular des 65x:x-Assemblerksnnenlemen. Den Hauptteil derSerie verbrineen w ir aber mit Din-genl tiber die es kaum Literatur gibt,narnlieh wie man fUr eine U n za hl vo nProgrammieraufgabetl nicht noch-

    . .. , : " . 1 1 1. t . ; , : : . : : . _ 4 < . .

  • 8/3/2019 Assembler Kurs C64

    2/66

    C 64 IVC 20 A s s e m b l e r - K u r sdere, Nun wissen Sie abe! immernoch nicht, was Assembler eicsnt-lich ist. Das englische Wort assem-ble heiBt auf deutsch etwa montie-ren, zusammenstellen. Es handeltsich also urn eine Programmierspra-che und weil sie sehr eng am Com-puter orientiert ist, spricht man voneiner maschinenorientierten Pro-grammsprache, im Gegensatz zuproblernorientiertene Programm-sprachen wie Basic, Pasca l , Coboletc, die - so sollta es jedenfallssein- auf jedem Computertyp gleichaussehen.Ein Assembler ist aber noch etwasanderes, namlichein Software-In-strument.cdaseinen in Assemblergeschriebenen Befehl in die Ma-schinensprache ubersetzr. Manspricht vom Vor-gang des Assem-blierens. Das umgekehrte IeistereinDisassembler, weleher uns Maschi-nensprache durch Ruckuber-setzung lesen hilft. Urn die Verwir-runq noch etwas zu steigem, sageich Ihnen auch noch, was ein Moni-tor ist. In diesern Zusammenhangistkein Bildschirmcerat < ; i, a m i t g~-meint, sondern ebenfaI~s: einSoftware-Instrument, das den Ein,blick in die Register und Speioherdes Computers geWahrt ,Damit Sie nun den Ubsrbliek nochvbllig verlieren, sei abschlie.l5end zudiesem $prachenwlrrwarr nodi er-

    zahlt, daB Software-Pakete, die so;.wohl Assembler als.auch Disassem-bler als auch Monitor enthalten undnoch eine Menqe anderer bzauen-barer Dinge, oft als llAssembleran:-geboten werden. Das ist' ein alterTrick der Alehimisten, verschiede-nen Ding-en den gleiGhen Namen zugeben!

    Urn das Nachfolqende deutlich zumachen, schalten Sie bitfe IhrenComputer an und tippericiie beldenfblg-enden Preeramme ein, clie bei-de gemau dasselbe tun: Das obereViertel unseres Bildsehirmes m itdem Buchstaben A zu fU!l.len(beiinVC 20 ist es die obere Halfte). Zu-nachst einmalln Bask:10FOR 1=1024+ 255 TO 1024STEF-l20POK E l,1 :POK E I+5421 '2,14 .30 N EX T IFUr den 'IIC20,(Grundversion und3-KByte-Etweiterung) ist zu setzen:Anstelle 110+1 1024 jetzt 7680, statt54272 jetzt 30208 und statt 14 tiie 6,Wenn Sie mehr alsdie 6 ,5 KBYle imVC 20 haben, dann setienSie statt1024jetzt 4Q96 , stat! 64272 jetzt 3,4304Ausgabc 9{Saptember i 9 S 4

    und ebenfalls start 14die 6. DesPro-grarnm braucht 6SByte + 7 Byte filldie Variable I, macht zusamrnen ,62Byte Speicherplatz, Es getit 'gamsohnell unci wenn Sie .es schaffen,konnen S ie ja mal mitstopjaen, wielange ' E ; l S von RuN bis READYbraucht: Zirka 4 - Sekurrden.[etzt dasselbe in Asssmbler. WE:li lwir aber noch nicht sowe.it sind, erstmal elsBssicladcr; der uns das Fro-g r a m m in den Speicher briflgt (wirkommen dazu gleich noeh), GabenSie also NEW E r i n un dann:10 FO R 1=7000 TO 7000 + 1620 READ APC)KE I,A:NEXT I :gND30 DATA160,26l,l62,14,l69ihl53,2S5i8;138I63,286,215,l@6,'208,m4'4,96.Beirn V O 20 :~ben Sie bitte stattder 14 (Zelle aO,4,Zah}) eine 6 ein,Starten Sie den Basiclader mit RUNund nach dem READY g'el;ien, SjeNEW und CLR lin:wir brauchen funden Basicleder nicht rnehr, Ab'Spei-eherstelle 10~Qsteht j,etztunser $--semblerprografnfn als Maschinen-code. DaB es wirklich dssseibe tutwie das B:asi~progr:arnm ertahrsn81'edurca SY s ~ Q O O . Da hatten Sjeverrnutlich gar keine Zeit mehr, aufdie Stoppuhr zu druckanl '(5,4 Milli-sekunden etwa dauert das ohne dieZeit, die Gier ~a~icinterlDreter furden Befeli!.l SYS ,benotiQt), AuBer-dem braucht das P:rogramm 17ByteSpeicherpla:tz.Genau das ist es, was. die Assem-blerpro~alP.IPl~rung '. so reizvollmacht: Der Speicher faSt mehr anProgramm. uno sis Ausftihrung d e sPrograrhmes geht fast lOOGmal ,S0sohnelll Dazu kernmen natuniohnoch einig~ andere Kriterien, dennviele'Probleme sind zum Beispiel inBasic nieht losban sondern nur mitdem vielseitigeren ASsembler,Unser Computer istdarauf:vqrpe-reitet, daB wir ihnin Basic anspre-Chen, Er enthalt ini Normalfall sofertnachdem Einschalten ein stets pra~

    sentes Ubersetzung-s!1)rogramm,den Interpreter, welcher unsereBa-sicanwers,ungen fUr ihn verstandliehinterprenerf :Auc::hdss is t ein Unter-schiedzu Assemblerproerammen:Ist em solches Proqramrn erst ein-mal assembliert (also als Masehi-nensprache im Speicher .yorhan-den), braucht man kein Uberset-zurrgsprogramm mshr. Basicpro-gramme dage~en rnussen bej je-dem Durchlauf von verne bis hintenstandig ubersetzt werden, ~ie laufennicb:tehne vorhandenen Interpre-ter.Wie so ein Interpreter im Ptinzjparbeitet und wa s ibn von 'einem S.0-genannten Compiler unterscheiqet,sQUtenSi9'mal in der April"Ausgabe

    der Zeitschrift 64'er im Artikel abSeite .nO von M. Tork tiber seinenStrubs-Precornpiler nachlesen.Dart sehen.Sia dann auch, daB einCompiler zwar ein Basicprocremmenorm beschleuniqen kann, aberbei weifern nieht an die Gesdhwin-digkeit reiner Assemblerprogram-roe heranreteht, vern Speieherplatz-bedarf ganz zu schweigElu.

    Leider haben weder der C64noch der VC 20 einen Assembler im-plentefi1iert. (Sie merken, d , a . ! ? jetztVQn dem Bof tware-Paket die F.edeist!). Es gibt einen etwas miihseligenWeg, dieses Handicap Z1l umgehen:Den Basiclader. Wie ist also derWeg, m it einem solchen.Lader 9'ige-ne Maschinenproqramme in denComputer zu bekommen? .a ) Erstellen des Assemblerpro-gra.riui1.es, Das zu Iernen ist dieHauptauIgabe in dsr Serie. Das Er-ge}:miswird eine Kette von Befehlensein,zu den en zurn Beispiel der Be-fehl RTS gehOrt.b}[edem Befehl in Assembler ent-sprichtin Mascaiaerrsprache ein Bi-narcode in einer Speicherstelle,Diese Codes sind in Listen nach-schlagbar: i t T ' S entspricht dem Bi-n s rco de -DUO00 00 "c)D.erCode mus in .eine Speicher-stelle einceceben werden, Das g~-schieht von Basic aus mit demPOKE~Flefehl. Weil aber Basic keineBinarzahlen kennt, muB der Codeins Dezimalsystem umeerecnnetwerden, Glucklicherweise sind in'den 'rabellen meist sehon die Codesals Dezimal-oder weniqstens alsHexadezimalzahlen enthalten, RTSist deziroal96 Coder hex.SO,dss aueh$60 @estz.htieben werden karin)..Man POKEt nun an die richtigeAdresse den Wert 96, also zum Bei-spiel POKE 7016,96 "d) Al1f diese Weise :wire Byte flirByte in. der Procramrnabfolce ver-fahren. Das reine POKEn geschiehtdanneben inder Form me im obengezeigten Basicladef MUhsaID,rnuhsaml Auch kann man lsider mrrm it dem PEEK~Kommanda naehse-hen , wa s denn nun imSpeicher steht(PEEK ('lOIS), gibt uns den Wert 9.6,entsprechend RTS),Ein anderer Weg 1st der Kauf ei-nes Assembler-Moduls o d e r einererttsprechenden Prbgramm-Kasset-te oder Diskette. Sehr preiswert istes siGherlioh, in Fachz-eitschriftenUmschau zu halten nach abge-,

    mailto:@estz.htiebenmailto:@estz.htieben
  • 8/3/2019 Assembler Kurs C64

    3/66

    A s s e m b l e r - K u r s C 64 /VC 20druckten Assemblem" Sehr gut fin-de ich beispielsweise den von U .Roller in .Chip Nummer 1(1984),aberauchim 64'erwird wahrenddes Ver-laufs dieser Serie ein .gut verwend-bates Prooramm vorgestellt:Assembler (das Software-Pakengibt es in den unterschiedlichstenAusfiihnmgen. Es gj,bt beispielswei-se Direkt-Assembler, die jede Pro-grammzeile sofort nach dem RE-TURN assemblieren, aber auch2"Pass-Assembler, bei denen daserst naoh AbschluB des Programmsinscssarnt durch einen Befehl (zurnBeispiel ASSEMBLE) geschieht. Beieinigen kann map (ahnlich wie beiBasic mit REM) Kommentareanfu-gen, bestimmten ProgrammstellenNarnen geben '(sogenannte LA-BELS), ,ganze Progranunabschnitttemit einem Merknamen aufrufen (so-genannte MAK~OS). und so . weiter.Was Sie fur sich bevorzugen, bleibtIhnen naturlich uberlassen. DIe indieser Serie geschiiebenen Pro-gramme werden auf diese sehonenErleichter-ungen verzichten, es Wirdsozusagen der nackte Assemblerverwendet und solanoe in dieserZeitschrift noch kein Sofrware-Paketdafur veroffentlieht ist. werde ich je-des Programm, das wir zusammen-entwickeln, als Basiclader anqeben.Was Sie aber auBer dem reinen As-sembler noch brauchen, ist ein Dis-assembler und ein Monitor (ieh ha-be schon erklart, welchen ieh mei-ne), damit wir unseren Computer(fast) imrner irn Griff haben.

    Weil das Programrhieren in !As-sembler sin en viel engeren K-ontaktzu technischenEinzelheiten unserssComputers erfordert, istes notwen-dig, -ein wenig uber diese Innereienund ihre Funktion zu wissen. SehenSie sich daau bitte dasBild 1an,Da sehen wirzunachst unserenMikroprozessor, der meist eineMenge Funktionen in sich vereinigt(dazu kornmen wir noch). Im Prinzipis t das unsere CPU (Zentraler Ar-.beitsbaustein). Der Prozessor stehttiber eine Helie von Leitungen: mitdem Rest des Computers in Verbin-dung, Diese Lei_lungen werden iinFachjq:rgon B'(JSSE genadnt Da is!zun.achst einmal der sogenannteAdreBbus, auf dem 16-Bit-Adressentransportiert werden, -die der Pro-zessor erzeugt, und die die Herkunftoder auch das Ziel von Daten festle-gen, die '(iber den Datenbus laufen,140.::tJ~~

    Diesel' kann 8-Bit~Datentransportie-ren, und zwarschreibend oder le-send, also zurn Beispiel vern Prozes-sor zum RAM (schreibend), vomRAM zum Prozessor (lesend) undsowe iter. AuBerdem gj.bt es da nocheinen Steuerous, der verschiedeneSynchronisatkmsaufgaben durch-fuhren hilft. Links vom Prozessor istein Taktgeber ancedeutet, Demitnichts durcheinander kommt, l a u nalles im Computer sozusaeen iinGleiehschritt. Diese Uhr is t ge~viffil-sermafsen der Tromrnler, den Sievielleicht von den alten RUQ:~r~Galeeren kennen. bann sehen Sierechts einen. ROM-Bereich, also ei-nen Nur-Lese-Speicher (Read OnJ.yMemory). DaB man hier nur heraus-lesen kann; ist durch den Pfeil zumDatenbus gekennzeichnet. Dop-pelpfeile finden wir aber beim RAMCRandom Access, Memory), einernSpeicher fU t belielDigert Zugriff, also'lesend und sehreibend, und bei denEin- und Ausgabebausteinen, dieden Kontakt des Computers mit dsrubrigen Welt erlauben, alsoauchmit uns, Dieses Aufbauprinzip fin-de n wir bei allen 8-Bit-Computexn,

    Urn es gleiGh nochmal zu saqen:WaS hier 9rzahlt wird, ist nicnt dazugeeignet, Elektrenik-Freaks den to;-talen Durchb1ick zu geben. WennSie das aber geme mcchten, dannsehen Sie sich zum Beispiel dieBlockschaltbilder an im Program-mer's Reference Guide~ :fi.ir denCommodore 64 auf Seite 404 ,eclerim "MOS-Hardware-Handbuch aufSeite 34. Auch Rodney Zaks ill demantancs schon erwahnten BuchProqrarnmierung des 6502 ist zuempfehlen. Er hatsich viel Muh,e ge-geben, sioh verstandlich auszu-drucken. Mix kornmt 'es nur auf denalkremeinen Uberblick an. Den sol-len Sie bekomrnen, wsnn. W IT unsjetzt.zusammen Bild 2 betrachten.D a sehen Sie zunachst als Herz-stuck des Prozessors , die AGU(Arithmstik Logical Unit), also denarithmetisch-Ioqischen Baustein.Die ALU hatdie Fahigkeit, Rechen-operationep. auszufifuren mit Daten.die sie liber den Datenbus, unci !,!or-tnalerweise vom Akkumulator: er-halt. Das Ergebnis wild ebenfalls ,imAkkumulatot abgelegt (daher auchde! Name: vonakk\lmulier .e:n, etwaansarnmeln). Der Akkumulator i f ; l tdas Register. das uns als 'Prograrn-miers! am haufigsten beschaftigi:=m

    wird. Br ist.die Samrnel- aber auchdie Verteilerstelle furfast alleDaten,die wir hin- und herschieben wollen.S-owbhl.der Akku (so werde icn, mitder Hoffnung auf Ihr wohlwollendesVe rs ta nd nis , k un ftig b ez eic hn en l a lsauch alle anderen Register, dasheiBt, die hochste Zahl, die.darin be-arbeitet werden kann, ist 2S5 (biner1ll11111) .Nahezu ebense oftwie denAkku worden wir die beiden sbge:-nannten Inde_x-Register X und Y be-nutzeri. Warom man sie index-Regi-ster nennt, .sehen Sie noch im Ver-lauf der Berie, Als, nachstes zurnProzessor -Statusflaggen-Register@"lierP genannt), Man findet hier an-gezeig1, ob eine Rechenoperationein negatives Ergebnis hatte oderob eine Null aufgetaut::ht ist oder obein Ubertrao stattgefu:odR:n hat.Aueh dieses Register wird uns nochtiawig 'begegTIen. Das Stapelreqi-ster, auch Stackpointer (Stapel.zei-ge'r) ~hannt, gibt u ns A u s ku nf t u be rden Fullungsgrad eines 266 BytegroBen spE?ziE;!ll~nSpeichers, dervern Prozessor direkt :verwaltetwiId. Auch- damit werden wit noaheft zu tun haben. Schliefslich kom-men wir zur vorhin erw ahn ten Aus -nahme, zum Proqrammzahler (peL,PCH), Das is t ~ ' i T I l6-Bit-Register, dassich aus wei 8-Bit-Registem (PCLfur das,LSB und PCB fU r das MSB)zusammensefz tund daber aIle65835 Spekherpla:tze ansprechenkann, Hier .ist imrner die Adressedes nachsten abzuarbeitenden. Be-fehls enthalten.Ich will an dieser Stelle niehtin dieEinzelheiten der Befehlsabarbei-tung einsteiqen (das konnen -Sieaueh bei Rodney 'Zaks naohlesen,wenn Sie's gemm wissen wollenj Essell nur gesagt sein, daB sich dieVerarbeitung in drei Schritte unter-teilen laBt:a) den nachsten Befehl holen

    l ; : l ) den Befehl decodierenc) den Befehl ausfuhrenZu G ) is t noch zu sagen, daBes Be-fehle gibt, die der Prozesser ehneweitere Angaben ausfiihren kann,Fur andere rnussen .erst noch weite-re Datep aus dem Speicher geholtoder dart abg,elegt werden, Deswe-gen brauchen die, Befehle unter-schiedliche Zeiten zur Ausfuhrunq:D ie Zeit Wird al s Anzahl V0n soge-nannten Tq,ktzyklen in den Be.fehbtabellen angege,ben. Unser: C0IIlPU>ter hat eine Taktfrequenz von rund 1MHz, Was bedeutet, daB.ein (Thktzy-klus etwa eine Mikrosekunde C l O : _ : _ eSekund.en) dallett. A u f dies,e Weisewurde die Zeitdauer fUr unse'r klei-nes Detnonstmtionsprogramm z P ~., -Ul;(!aJ:;eS/~;ember 198~_,J-

  • 8/3/2019 Assembler Kurs C64

    4/66

    A ssem b le rK u rs C 64 /VC 20Anfang berechnet Auch das wer- T a be lle 1. B as ic,S la rl u nd En da dre ss en b eim VC20milverse hied enern Speieherausbauden Sie noch lernen.

    Grundv,ersiQn :Basic-start 4096 Basic-End.e 7679+ 3-K-Erweiterung " 1024 , -- 7 6 7 9+B-K-E~eiter :ung : " 460.8 , -- 1 S 3 8 3+ 16-K-Erwe,iteIU,n_g : " 4608 , -- 2 4 S 7 5+e4-X'Erwei lerung 4608 , -.- 3eTSTDiese Serie ist fU r den VC 20 und.den C 64 geschlieben, Den Spei-cheraufbau des Commodore 64 f in-den Sie in der April-Ausgabe dieserZeitschrift ab Seite llS, Deswegensoll hier nur der des VC 20 gezeigt

    werden, Man muB beirn VC '20zweiKonficurationen unterscheiden-sehr zum Leidwesen der Benutzer ,In Bild 3 ist die Atiftejlung gezeigt,die inder Grund-und der urn 3 I S : B y -

    te erweiterten Version vorliegt\~In Bild 4 sehen Sie die Speicher-aufteilunq, die bei mehr a l s,6 ,S KEy -teeinqesteckterrr Speicher giiltig ist.Werm Sie die VC 20 Speicherar-Blld t, Aufbaupr il lz ip e ines 8 -B lt -Computer s

    Stromversorqunq

    Mikro-proz,ess0r Ein- undAusgabe,-Busse65 02bzw.6510

    Steuerleitungen

    Bild 2, Auf ba us chema e tn es 6510Prozessors

    Stapel-register"

    Regis ter XRegister ALU

    142~ A U Sgab< 3 9 /S eptem DeI 1 984.'

  • 8/3/2019 Assembler Kurs C64

    5/66

    C 6 4 /V C 2 0 ' A s s e m b l e r ~ K u r sBlld 3 . v e 20 Spe lche r (G rundver sl on oder m il 3 K ,By1eErwe it elung )

    S.H"BAStCRAM

    Bild 4 . V C 2 0S peicher (V ersio n mit m ehr a ls 6 ,5 K Byle S peicherpla tz)

    LEER

    WIC3-X-RAM-ErYfeSterui:t9oder LEER

    chitekturen.mit der des C 64vergl~i-chen, werden Sie eine Reihe vo n U I 1 -tarsehistien feststellen. Genau ba-sehen Qlbtes an den wichfigenPlmkteh abet eine Menge Gemein-samkeitenl D er VC 20 kennt nu rSpeieher-Ha:u::?er mit ErdgesGh0E,im Ge.gensatz zum C 64, wo maneheBereiche sagar -zwei Etacen haben(soll heiBen: mehrfach beIegf sind) .Durch diej::igenart .des R ; : 6,4.aber, .im No r rn alf all d as . B a sit ~-ROM , dieE in -I1 1id 'A us ga b eb a us te in e u n d da sB etrieb ss ys ta m ein ges ch aitet eu ha -b:en, kann man ihn eigent1ich'@ ,e.nau-so beha n deln w ie ein en V G 20 .,beidem die-genannten ROM-Baus1eme f.: u nd zw ar.d as 'B asic-R OM :....:.,.m 8KByte verschoben sind, Die Unter-schisda der ROM-Inha:lte sin d f as tvernachlassigbat. Wit werden imEinzelfall daraufzu spreenenkom-m en . Bei den E in - und Ausgabebau~steinen liegen allsrdinqs groBereUritersohiede,D ie Seiten P ,b is 3 (~i,neSeite oderauch page enthalt 266 Byte unc imanzahlt o f t auch indiesen Seiten, wennvom.Speioherdie Rede ist)Jsind sichebenfalls sehrahnlica unci die weni-gen Unterschiede werdsn unsebe!J:tall~noch bescMflige;n. DerBildsonirm Itegt bei der ,Grundver~s i a n undder mit der 3-KBi[te-Etvvei-tsruna von, 7680 bis 81 91 ,in der Ver-sion mit melt! als 6 ,$ KByte vo n 4 09 6bis 4607und beirn C 6 4 von 1024bis2047. Der Bildschirmfarbspeicher1ie91- Dei gleicher Reilienfol.ge.---von 37888 b is 38 :399 ,bezi ehunqswe i-s even 3C l40 0 bi s 3S '9 1 1'L i nd s ch lieB --lien von SSZ96 bi s S629B. D e r B as ic -RAM-Bereichbeginrit beirn t'84 imNormalfall bei: 20.48und endet bel40959, Beim ve 20 istdas naturlichw iede r vl ,B "de r j ewe ilig e n , Erweite-ru ng a1 3h an gig .(Tabelle 1)..Dies gilt ~ wie Sis leicht auch ausB ild 4 ' sehen k on ne n ---, au ch dann,wenn v z u den 8 KBytel16 KBy-tel24-KByte-ErweiterungenMChdie .3.KJlyte-Erweiterung und die'KByte~Erweiterung illhohen Spei-cherbereich (40960 bis 49181)ver-wendet werden. Diese letztgen'atm-ten A dressenb'ereiche sind danngut alsgeschtitzte RAM-B'ereichefllr Maschinenspracheeu verwen-den F ebenso wie beirnG 64der Spei-cherabschnitt vo n 49152 bis 83247.Dami t s c h 1 i . e B : e n w ir zunachst malden Hardware-Uberbliek ab o In dernachsten Folge stelle ich Ihnen danndie ersten Assembler-Befehle vor,und wir beqinnen zu proqrammie-reno S ie gehbten nun zum 1 . Graadar AssemblercAIc: t: 1 imis ten ,(Heimo Ponna th /a a ), ,

  • 8/3/2019 Assembler Kurs C64

    6/66

    A s s e m b l e r - K u r sS ollten Sie einen Assembler ha-ben, dann schalten Sie fun jetztbitte ein. Falls Sie keinen haben,schaffen wir Abhilfe. Wir werden inden nachsten Ausgaben ein kern-pl.ettes Software-Paket; Assembler,DIsassembler und Monitor verof-fentlichen. Dieser Assembler wirduns dann den ganzen Kurs hindurchbegleiten. Meistens meldet der As-sembler sich mit einer Registeran-zeige. Sollte Ihrer das nieht tun, dannrnussen Sie wohl noch den Monitoranschalten oder speziell einen Be-fehl fur die Reg:isteranzeige einge-ben (haufig ist das ein R). Jedenfallswird nun auf dem Bildschirm der In-halt der Register angezeigt, (B ild 1 ).Die angezeigten Werte sind Bei-spiele, wie sie beim C 64 auftretenkonnen, PC ist der Prcorammzahler,der immer auf den nachstsn zu ho-lenden Befehl zeigt. (Der Wert $E147ruhrt vom SYS-Aufruf, mit dem ichmeinen Assembler starte). IRQ zeigtuns an, auf welche Adresse der so-genannte InterrupWektor gesteiltist. Das ist das Byte-Paar 78 8 (LSE)und 789 (MSB). Auf den Wert $EA31zeigt es im Normalfall.Die nachsten acht Angaben bezie-hen sich auf das Prozessorstatusre-gister, das wir in der letzten Folge Pgenannt haben. Die Bedeutung dereinzelnen )iFiaggen zeigt Ihnen(Bild 2) .AC is t der aktuelle Inhalt des Ak-kus.XR zeigt an, was im X-Register undYR was im Y-Register enthalten ist.SP (von Stack-pointer =Stapeizeiger)gibt uns Auskunft tiber den freienPlatz im Stapelregister. Damit wis-sen wir genau, was in diesem Mo-ment in unserem Computer voroeht,So fremd Ihnen das alles im Augen-blick noch vorkommt, bald werdenSie mit dieser Registeranzeige aufvertrautem FuB stehen.

    W i e s i e h l e i n Assembler~p ro g r a m m a u s ?Das menschliche Gehirn hat demdes Computers vieles voraus. Dazugehbrt es beispielsweise, daB einMensch allerlei Dinge gleichzeitigtun kann: gehen, sprechen, Musikhbren, lacheln, Handbewegungenvollfuhren, wom6glich dabei auchnoch etwas kauen und so weiter. EinComputer ist dazu nicht imstande. Ererledigt eine kleine Aufgabe nachder anderen. Weil er das so schnell

    macht, hat es fur uns den Anschein,es geschahe alles gleichzeitig. DasMaschi ist eine Kette

    160 02J&

    2 .Te i l C 64 /VC 20B is h e r h a b e n w i r u n s m i t d e m In n e n l e b e n u n s e r e r

    C o m p u t e r a u s e i n a n d e rg e s e l z t u n d d ie w i c h t i g s t e n T e i l ed e r H a r d w a r e k e n n e n g e l e r n t. J e t z t k o m m e n w i r w i ev e r s p r o c h e n z u r S o ft w a r e , n a m l i c h z u m A s s e m b le r .solcher kleiner Aufgaben. Das ersteGlied daraus, das wir kenneniernenwollen ist der BefehlLOA.Das bedeutet: Lade den Akkumu-lator. Alle Assembler-Befehlswortebestehen aus drei Buchstaben wiedieser hier auch. Wir haben in derersten Foige schon gesagt, daB ei~nem solchen Befehl eine 8-Bit-Codezahl entspricht, Das ist hier$A9 oder binar 1 010 1001 oderschlieBlich dezimal 169. Die Code-Zahl muB in einem Speicherplatzstehen, zum Beispiel in $1500 (ent-spricht dez. 5376). Assembler-listings sehen dann so aus:1500 LDAHier tritt also cUe Speicherplatz-nummer mit einem nachfolgendenBefehl anstelle der vom Basic ge-wohnten Zeilennummer.Hier fehlt noch etwas Entschei-dendes: Was soil den in den Akkugeladen werden? Genauso wie es inBasic Befehle qibt, die fur sich allei-ne stehen konnen wie CLR oderLIST, gibt es auch irn Assembler sol-che Befehle. Weitaus haufiqer abersind hier Befehle, die ein Argumenterfordem (in Basic zum BeispielPEEK(lOO)). Dabei ist 100 das Argu-ment), In Assembler gibt es zweiSorten von Argumenten. Solche, diein einem Speicherplatz unterzubrin-gen sind und andere, die zwei Bytesbrauchen. Mit dem Befehlswort(hier also LDA) zusammen qezahlt,existieren in Assembler also l-Byte-Befehle, 2-Byte-Befehle und 3-Byte-Be fehl e.Das Argument von LDA ist alsodas, was in den Akku sell. Laden wiralso mal eine 1 in den Akku:1500 LDA #$01Wir haben jetzt einen 2-Byte-Befehl erzeugt. Was aber bedeuten# und $ dabei? $ ist leicht zu erkla-reno Die groBe Mehrzahl der AB -sembler nimmt bei ZahlenangabenHexadezimaizahlen an. Bei einigenmuJ3 man das durch das $-Zeichenkennzeichnen. Manche Assemblerlassen auch Binarzahlen, Dezimal-zahlen und soqar ASCIl-Zeichen alsArgumente zu. FUr jede Eingabealisteht dann vor dem

    Zeichen, das die Art des Argumen-tes angibt, zum Beispiel haufig !( furDezimalzahlen oder % flir Binarzah-len. Nun zum #-Zeichen. Es gibt vie-le Arten, den Akku zu laden. Direktmit einer Zahl - wie wir hier -, aberzum Beispiel auch mit dem Inhalt ei-nes anderen Speichers und so wei-ter. Man spricht von der sogenann-ten Adressierung.Es gibt eine ganze Menge davonund jede wird auf eindeutige Weisegekennzeichnet. Wenn wir in unse-ren Akku eine Zahlladen, dann istdas die unmittelbare Adressie-rung, und die kennzeichnet man mitdem #-Zeichen.Wenn in Speicherstelle $1500 dieCodezahl fu r LOA steht, dann mufsdie 1 in der Speicherstelle S1501s te-hen, w:ie es sich fUr einen 2-Byte-Be-fehl gehbrt. Wenn Sie nun die As -sernblerzeile eingegeben habenund (RETURN) dIiicken, danntaucht auf dem Bildschirrn ... eineFehlermeldung auf (bei vielen A s-sembl ern). Wir mussen vorher nam-lich noch unserem Software-Instru-ment sagen, jetzt zu assemblieren.Wie das geschieht, ist auch wiedervon Assembler zu Assembler ver-schieden. Die meisten erwarten,daB man vor der Zeile noch ein Aeingibt:A 1500 LD A #$ 01Wenn Sie jetzt (RETURN) drucken,zeigt der Bildschirm:A 1500 LOA #$01 A 1502und meistens einen blinkendenCursor, der auf die nachste Eingabewartet. $ 1502 ist die nachste freieSpeicherstelle, und wenn beirn Pro-grammablauf der Proqrarnrnzahlernach dem LDA #$01 auf $1502 deu-tet, dann erwartet er dort den nach-sten Befehl. Wenn dort Unsinn steht,dann stiirzt der Computer im allge-meinen ab, je nachdem, welcherCode dann hier zufallig enthalten ist.Wir haben ja 256 Moglichkeiten da-fiir: $00 bis $FF. Im Gegensatz zu Ba-sic, wo man durch den Interpreterdie M6glichkeit hat, Zeilennum-mem zu bauen wie man will, muBhier das Progamm eine ununterbro-chene Perlenschnur von Befehlen insein. Durch

    Ausgabe l{)!lDktober 1984

  • 8/3/2019 Assembler Kurs C64

    7/66

    C 6 4 /V C 2 0Befehle laBt sich dieses Prinzip al-lerdings durchbrechen.Damit wir die Wirkung von Befeh-len sehen konnen, greife ich auf ei-nen Befehl vor, der ahnlich demSTOP in Basic einen Programmab-bruch bewirkt: BRK. Die genaueFunktion soll erst spater erklart wer-den, aber wir sehen jedenfallsdann, wenn ein Maschinenpro-gramm auf einen BRK-Befehl lauft,die Registerinhalte angezeigt. Dasis t in den meisten .Assemblem ein-gebaut. Wir erqanzen jetzt:A 1502BR KDami t erstmal genug. Steigen Sieaus dem Assembler aus, und startenSie das Programm. In den meistenAssemblern geht das mitG 1500oder sonst von Basic aus mit SYS5376 . Jetz t werden wieder die Regi-ster angezeigt. Der Proorammzah-ler steht auf 1503,.im Akku steht 01,alle Flaggen auBer der Breakflaggesind Null (die unbenutzte Plaggesteht immer auf I). J etzt andern wirdas Argument:A 1500LOA#$00A 1502BR KWir starten wieder und sehen unsdie Register an: Procrammzahler1503, Akku jetzt 00, aber bei denFlaggen hat sieh etwas verandert:Die Zero-Flagge ist auf 1 gesetzt.Wir sehen also: Diese Flagge bleibtsolance unqesetzt, solanqe nieht ei-ne Null imAkku auftaucht, erst dannwird sie 1 .Noch einmal andern wir das Pro-gramm:A 1500LDA #$FFA 1502BRKNach erneutem Start steht das Er-wartete in den Registem, nur beiden Flaggen ist etwas Merkwi.irdi-ges passiert: Die Vorzeichenfia.ggesteht auf 1 . Das bedeutet. im AkkusolI eine negative Zahl stehen! Nunwissen wir aber, daB $FF =dez. 255ist. D ieses R atsel w ird uns noch eineWeile begleiten. Es sei hier nur be-merkt, daB kein Fehler vorliegt: Im -mer wenn in einer Zahl das Bit 7gleich 1 ist, geht die Vorzeichenflag-ge auf 1 . Die L6sung des Ratse Is wer-den wir bei den negativen Binarzah-len finden.Wir schlie Ben aus alledem: DerLDA-Befehl beeinfluBt die Vor-zeichen- und die Zeroflagge

    D e r z w e i t e A s s e m b le r -b e fe h l: S T ASTAheiBt store accumulators, al-solegeAkkuinhaltab. WieSiesichdenken konnen, muB auch hier ein

    Ausgabe lO/Olahnlich wie bei END in Basic - dasProgramm auf irgendeine Weisebeendet werden. Das kann durchBRK geschehen. Wir wollen aberden dritten Assembler-Befehl ken-nenlernen:RT SDas heiSt return from subrouti-ne , also Rlickkehr a us Unterpro-gramm. In unserern Fall bewirktdas eine Riickkehr zum Basic. WieSie sehen, ist des ein l-Byte-Befehl,also ohne Argument. Auch hierspricht man von einer Adressie-rungsart, namlich der impliziten-Adressierung. Man erkennt sie amFehlen des Argumentes. Die Adres-se ist implizit, das heiBt im Befehlselbst enthalten. Dies ist namlich einBefehl, der irnmer an den Pro-grammz8.hler gerichtet ist. DerComputer holt sich vom Stapel-Speicher die dort zuoberst liegendeAdresse, das ist die, bei der derComputer in ein Unterprogrammgesprungen is t oder aber die. beider der Computer Basic verlassenhat. Wir erqanzen also noch:A 150A RTS

    XRg o SPFa

    GGdeHEX DE ,Z ini f a . k r --zylclenSlUlgvonFlaggeTj.

    16 91 7 3i 6 &1 7 4 -1 6 ' 01 1 2 '1 4 ' 11 4 2 .14 09 I l

    N;:IllN , 2 1N , ZN,.ZN iZN " Zli

  • 8/3/2019 Assembler Kurs C64

    8/66

    A s s e m b l e r - K ' u r s C , 6 4 / V C 2 0und starten das Programm, zum Bei-spiel von Basic aus mit SYS 5376, Na-turlich taucht dann in der linken obe-ren Eeke des Bildschirrnes einschwarzes A auf Hier noch derBasic-Lader:10 FOR I",,5376 TO 6386:REAOA PO KE I,A :NEXT I:END20 DATA 169,1,141,0,4*,169,0,141,0,216*,96 .Die mit * markierten Zahlen rnus-sen Iur den VC 20 verandert wer-den: Grundversion: 30 und 148Erweiterung: 16 und 150.Eine Kombination von LDA mitSTA ist vergleichbar mit dem POKE -Befehl in Basic, Man kann in Assem-bler nieht direkt eine Zahl in einenSpeicher einschreiben, sand ernmul?>den Umweg uber den Akkumachen. AuBer dem Akku eignensich dazu aber auch das X-Registerund das Y-Register, Hierfur gibt esdie Befehle LDX (lade X-Register),STX (lege X-Register-Inhalt ab), LOYlade Y-Register) und schlieBlich STY(lege Y-Register-Inhalt ab). Sie kon-nen das i.ibungshalber an unserenkleinen Procramm ausprobieren,An dem folgenden Programm se-hen Sie noch eine Eigenart der dreiRegister (Akku, X-Register, Y -Register):A 1500 LDA #$01A 1602 LDX #$00A 1504 LO Y #$02

    I A 1506 STA $0400. A 1609 STX $D800A 150C STY $0401A lSOFSTX .$0801A 1512 STA $0402A 1515 STX $D802A 1518RTSFur den VC 20 werden die ent-sprechenden Speicherstellen fUrBildschirm- und Bildschinnfarb-speicher eingesetzt. Dieses Pro-gramm druckt - wie erwartet -))ABAin die linke obere Eeke desBildschirrns, Debei ist das X-Register dreimal ausgelesen wor-den und der Akku zweimaL Sie se-hen also, daB die Registerinhaltedurch die STA- , STX-, STY-Befehlen ie ht v er an de rt werden.Wir wollen noch etwas ausprobie-ren. Bisher haben wir denLDA-Befehl nur mit der unmittelbarenAdressierung kennengelernt. LDA,LOX , LDY konnen auch absolutsadressiert warden,A 1518LOA $0800Damit laden wir den Inhalt derSpeicherstelle $ 0800 (beim VC 20die anderen Adressen des Bild-schirmfarbspeichers) in den Akku.Der Inhalt ist seit $1509 eine Null.Jetzt weiter:

    A 1518 STA $0403A 151E S TX $0803A 1521 RTSDas miiBte beim Ablauf des Pro-gramms nooh einen Klammeraffen(@mitBiidschirmcode 0) an die vier-te Stelle plazieren, was Sie durchSYS 5376 leicht nachprufen konnen.Sie sehen, daB man mit diesen sie-ben Befehlen schon eine Menge an-fancen kann,Wir kommen noch einmal zurAdressierung. Ich harte Ihnen ge-8a91, daB LOA #$01 ein 2-Byte-Befehl mit unmittelbarer Adressie-rung is t (ein Byte fu r LDA und einesfur 01), LDA $0800 ist ein 3-Byte-Befehl (ein Byte fur LDA, je eines furdas LSB und das MSB von $0800) mitabsoluter Adressierung. Oa werdenSie sich doch sicher schon gefragthaben, wo bleibt die Adressienmg!Wenn aber kein Byte fur die Adres-senmarkierung (zum Beispiel #) re -serviert 1 S t , muE die Kermzeichnungirgendwie anders sein: Wenn Sie ei-nen Disassembler zur Verfugunghaben, dann sehen Sie sich damitunser Programm an. Fast jeder Dis-assembler gibt neben dem Assem-blertext auch Byte fur Byte in Hexa-dezimalzahlen die Codes an, WennSie nun die beiden Befehle LDA#$0 1 und LDA $d800 von den Codesher untersuchen, sehen Sie folgen-des:1500 A 9 01 LOA #$01und1518AD 00 D8 LDA $D800Offensichtlich gehbrt jeweils daserste angezeigte Byte zu LOA Siesind aber verschieden! Wir sehendaraus, daB die Codezah1 Iur einenBefehl gleich zwei Inforrnationenenthalt: Oas Befehlswort selbst(LDA) und die Adressierungsart.Genauso wie man LDA sowohl un-mittelbar als auch absolut ausfuhrenkann, ist das auch mit LOX und LDYmoclich. Bei den Befehlen STA, STX,STY ist eine unmittelbare Adressie-rung sinnlos, Fur RTS kennt man nureine implizite Adressierung. Wirfassen das aUeszusammen in Bild 3,In den letzten Spalten von Bild 3 is tnoch angegeben, inwieweit durchdiese BefeMe das Prozessorstatus-register beeinfluBt wird, so wie wires fUrden Befehl LDA schon auspro-biert haben. In der vorletzten Spaltesehen Sie, wie lange die Ausfiihrungeines Befehls dauert. Wenn sie fureinen Taktzyklus etwa eine Mikro-sekunde rechnen, dann miiBten Sie

    jetzt ausrechnen konnsn, wie langeunser ietztes Programm zur Bear-beitung braucht: 48 Mikrosekun-

    den. Ein vergleichbares Basic-Programm braucht dazu etwa hun-dertrnal so lange: zirka 0,06 Sekun-den.Ein bifschen von Assembler-Alchimie verstehen Sie ietzt schonmit diesen sieben Befehlen. Wirwollen uns nun die Zahlen ansehen.die hier Verwendung fmden: Oas Bi-narsystern und das Hexadezimalsy- Istem. .~Oie einzigen Ziffern, die unserComputer kennt, sind und 1 . Siestehen fu r Stro rn an', oder Stromaus oder fur keins magnetischeErregung oder magnetische Erre-gung. Deswegen ist es fur uns alsangehende Assembler-Alchimistenvon groBer Bedeutung - wir arbei-ten ja ganz eng an der Hardware -dieses binare Zahlensystem hand-

    haben zu konnen, Das Hexadezimal-system kennt der Computer eigent-lich gar nicht: Wir verwenden es,weil es in einem besonders engenZusammenhang mit Binarzahlenund dem Autbau unseres Compu-ters steht: Die grbBte einstelliqeHex-Zahl ist SF , das entsprieht genaullll im Binarsystern, also dem maxi-malen FUUungsgrad eines halbenBytes, das Nibble genannt wird. Eingames Byte karin maximal $FF ent-halten (binar Illl llll) und der ge-samte Speicheradressenbereichunseres Computers geht bis $FFFF(dezimal 65535). Eine einstelligeHex-Zahl paBt also in ein Nibble, ei-ne zweistellige in ein Byte und einedreistellige oder vierstellige in zweiBytes, weshalb man solche Hex-Adressen auch recht leicht in dasLSB und das MSB aufteilen kann:$ D8 00MSB LSBRechnen werden wir mit Hexade-zirnalzahlen nicht, dazu benutzenwir dann das Dezirnalsystem oder-wenn es sich urn computerinterneVorgange handelt - das Binarsy-stem.Das Rechnen mit Binarzahlenfunktioniert genauso wie das mit De- .zimalzahlen. Es gilt also0+0",,00+1,....11+0=11+1=10wobei binar 10gleich dezimal 2 ist.Als Beispiel kbnnen wir mal 2+ 1=3im Binarsystem rechnen:10 entspricht dez. 2+ 01 entspricht dez, 111, was ja dezirnal 3 ergibt.Die Addition erfolgt also spalten-weise wie beim gewohnten dezirna-

    Fo rt se tz un c S e il e 1 7 9

    152~~

  • 8/3/2019 Assembler Kurs C64

    9/66

    C 64 /VC 20

    .

    ' Fortsetzung von Selte 152len Addieren. Auch mit demUbertrag lauft es wie imdezi-malen. Beispiel: 2+2=4:10entspricht dez. 2+10entspricht dez. 2l O a , was dezimal eine 4 er-gibt.In der zweiten Spalte wur-de nach der Regel verfah-ren: 1+ 1=10. Rechnen wirnoch 3+3=61 1 entspncht dez. 3+ 1 1 entspricht dez. 3llO, was dezimal sine 6 er-gibt.In der ersten Spalte wurdegerechnet 1+ 1 = 10 , wobeinach dem allen Motto: 0 hin,1 im Sinn die a unter denStrich gesetzt wurde. In derzweiten Spalte wird dann soverfahren: 1+ 1+ 1(das is! dieI, die wir im Sinn hat-ten) =11 leh meine, daB Sieohne Probleme die folqen-den Ubunqsaufqaben losenund dann jeweils dezimal Idas Ergebnis nachprufenkonnsn 10+5, 7+1, 16+16, I240 + 16, 62 +65.In der nachsten Folce wer-den wir eine Anzahl neuerAssembler-Befehle kennen-lernen und erfehren, wie derComputer Zahlen voneinan-der abzieht. Bei der Gele-genheit lemen Sie dannaoch einige flaggen ken-nen, und wir werden das Rat -sel, warum bei LDA #: !i FF e i-::e negative Zahl angezeig1xird, losen, Und vor allen,S:e erhalten einen komiorta-eien Assembler, Disassem-::l er und einen Monitor.(Heimo Ponnath/aa)

    },usgabe lO/O!ctobei 1S.84

    - ::-_-_ --_=lnserentenveneiehnis-- - _ . .~--

    A.e0mp IS 4ArieJa 18~

    ~Glmm0q0te 3 @6G1J:1'lP1!1teilusSl.f1 128< C:);l'f:l1lE lute ro a .m p 1 29Data:Elftker 2,HIlS.51,

    52,53;,165Glal!lmeleti'!;lnrc 124

    Fer tp Sy sfe rt U: i 13 9FI;~ a 136Gorlitz 121Ha'P1D ?{S o ftwaTe 4 2, 47 ,6 6 ,

    1-41HL C0rnguter 13 9Inte.g~areQSystems 127Interf$:ce AG. 116lti Dalen:teel\nik 11BI\!IlT 119Jese)lke 123Kingsofr 131Lucius ComputerIhog-ramme 122M&,]Bud'IveIiag l 1B .121 ,

    142-14S12 7auIieitM~6:rQ @Jill

    Mtikta

    Rat + TatFhe_g.e!i~RQJ3tiJCiillerS or S S -G i f i1 l ; iM ' . e . SSyex 63$ystem%ausResooke 1& 8

    12 71 8l i B13 31 3 81211 3 8

    13411$

    -

    ImpressumH9 ! '3u sg 'ebe r: Car l -F ' tanz von.00'Olo. l ,0 tm ar W eberChelredakteur: Mf~hael M~ P au l" (,'O Y )Stellv. Che lr ed akt eu r .- M l ch a e1 S c ha r fe J :J b e, rg e .r (sc)R&daklaure: aa ~ 1Jb.nt lU>srne i~r. le i ,tEmd'er Eeda! ( te_\1~.( l3Q)iev~ ) / o . l k e , T E' de:'re-'~lle!len Be.it rage: M:indEi?-grQ!5eW~teAnze_!g.en tm Bi'Iloald&MegaZln: D :e enruiBiqlen Preise im E i rl lC a uf sMag a zi n g el -:e:! !!ll!'~~gesclllossenen A . nZ eig en le l! =\ d e. OM " radaktionalla Bel,tt'age tst. ~..e SioV: liM 5'WO.,Farb"~ag: er~e,und zwei\eZ!JSd-tzf~be ! IUSE!:I! 'o~}e O M ~O OO - \ j fe_";~bZusChlag DM 30 00 " An::e_lga!\ln der Fundgru ,be: Ptfvata KleJna-nz"lgen i l l I " t mal

  • 8/3/2019 Assembler Kurs C64

    10/66

    C '6 4 I V C 2 0 A s s e m b l e r - K u r , s--,J I 'leri.t;hi,..II,ehi_ieI n d e n e r s t e n b e i d e n F o i g e n u n s e r e s A s s e m b l e r - K u r s e sm u 6 t e n S i e n o c h m i t B a s i c - L a d e r n a r b e i t e n .J e t z t s te h t I h n e n e in l e is tu n g s fa h i g e r M o n i t o r z u r V e r f i i g u n g " d e r S M O N .8 : o m i t k o n n e n 8 i e a il e B e is p i e le d ir e k t e in g e b e n u n d a u s p r o b i e r e n .Inder letzten Faige haben wirdieersten Assembler-Befehle ken-.nengelemt und wissen, wis mansie benutzt und was sieh im C O I 1 1 I P U -ter dabei tut. Die Zahlen derAssembler-Alchimisten haben unseinige Geheimnisse enthtillt, ob-

    wohl sie filr die Zweifingerlinge unddie SechzefuJ:fingerlinge gedachtsind, Die' Binarzahlen konnen wirschon zusamrnenzahlen. Heute wer-den Sie eine Reihe weitererAssembler-Befshle kennenlernenmid nocb ein weiteres Zahlonsy-stem Wit ergrundem .das Geheim-nis der neqativen Zahlen und rna-chen uns die Funktion der Flaggenzunutze.

    kann INX hellit einfach incrernentX-RegisteH, also Inhalt des X-Registers urn 1 erhohsn, E s w iid Ih-nen sieher einieuchten: daB INYdasselbe mit dem Y-Register tut. Et-was wentger deutlich ist das beiINC . Das bedeutet increment me-rnory, also zahle zum Inhalt einerSpsieherstslle ems dazu, INX undINY enthslten alles, was dem Com-puter zu saoen ist, sind also offen-sichtlich l-Byte-Befehle mit der inder letzten Folge schon kennenge-lemten impliziten Aclressierung. BeiINC muB dem Computer nocnae-sagt'werden, welehe Speieherstelleer urn 1 erhohen SO ILE s gehOrt alsonoch sine Adresse dazu. Das !aBt

    0800 00 G C I o s OA I 00 41 25 BZo s o c D O D A A % =Koppeladresse Zeilennr.lO Thken

    0808 AD 31 32 00 12 08 14 00- I 2 Zeilen- 0812 0 0 1 4Token ende Koppeladresse Zeilennr.20

    0810 80 00 00 00 FF I FF IT ITEND Zeilen- Proqramm- Leerer SpeicherToken ende ende I

    BUd 1 . D er MOllilo r ze lg t ua s n a ekt e P ro gramm 1 m S p e i cl l e rWit haben nun auch einen sehrbrauchbaren Assembler fu r den C64: Den SMON, dessert 1 . Teil'in die-ser Ausgabe abgedfuckt i st . K i in ft igwird in dieser Serie die SMON-Syntax verwendet und kern Basic-Lader mehr angegeben, AuBerdE;lmhat inAusgabe 9 die Serie Der gla~seme V:C20((begonnen, sodafs sichder Schwerpunkt hier mehr.auf denC64 verlage'i:t, Das sollte aber dieVC 20-Fans nicht davon .abhalten,diesen K urs weiter zu verfolqen,denn bis auf gelegentliche 'AdreB-anderuncen ist fastalles fur sie ver-wendbar,Eine Zauber10rmel der AssemblerAlct limislen:I N X . I N Y , I N C, D E X , D E Y , D E C ?Wir wissen ja sehon, daB man die-se Zauberformeln entzaubernAusgabe l L'November JSHI4

    diesen Befehl im allgemeinen zuei-nem 3"Byte~Bef.ehl werden.B e f e h le z u m Z a h le n

    Das umgekehrte Ieisten die Be-fehie DEX, DEY und DEe Sie be-deuten nam1ich decrement x -RegisteH, a ls o za hle das X-Registerum eins herunter, beziehunqsweiseda s Y-RegiS te,r o der - bei DEC -die angegeoene Speicherstelle, FUrdie Adtessierungsart und die An-zahl Bytes pro Befehl gilt hier dasgleiche wie fUr die IN X . .,-Befehle.Sehsn win uns das an einem kleinenBeispiel an: B it te lesen Sie sich dazudie Bedienuncshinweise zumSMONdUrch,

    1&00 LDA #0015Q2 LD% #011S04 S TA D 8001 8 , O ! l S TX 0 '4 00lSO A IN XH3B STA D 80 J15.013 STJ ';: ,04Gl1511 DEX1512 STA D8'0215i6 ST X 04i:il21512 BRK

    Weno :Sis das kleine ProgrammrnitG 15GO'starten, dann sollten 8ie inder linken oberen Ecke des Bild-schirms ABA in sehwarzer Schriftstehen haben, Was ist fJeschehen?Wir haben den InhaltdesAkku (= 0 ,also Farbcode fur soh1JlTc3.LZ)n GasBildschirm-Farbrecister geschrie-ben (#D 8 00 ); d ann den InhsJt desX-Registers (1 = POKE-Code furden Buchstaben A) in die srsteBildsehirm-Speicherzelle ( #. 0400).Anschliezend wurde ciasX-Registerum 1 el'h6ht (2 = peKE-Code fU rden Buohstaben B)und dieser Inhaltin die zweite Bildsehirrnzelle ge-schrieben. AuBerdem mu13tenatiir-lich auch dieser Bildschirrn-Farbspeieherplats mit :der:n,Farbco-de- 0' beLegt werden, Durch DEXwurde das X-Register wieder he run-ter gezahlt,soffiit wieder einA er-zeugt und in die dritte Bildschirm-stelle gedruekt .Sie habensicher schonbemerkt,daB man auf diese Weise Ablaufemitzahlen kann: Sollcum Beispiel einVor:gang 20mal wiederholt werden ..dennpackt man ins X-Register Coder:ins Y-Register oder ineine andereSpeicherstelle) den Anfanqswert 0 ,laBt den Computer erne. Al)beit aus-fuhren.erhcht das entsptechendeRegister oder die Speicherzelle urn1mit lN X , IN Y oder IN C, pruft dann,ob dieser Inhalt schon 20gewordenistund soweiter. Wie man diese Pru-fung .vornimmt, dszu kommen W iTerst seater bei den BRANCH-Befeh-len. Das ist also ahnlich wie im Basicbei den FOR. ..NEXT-Schleifen: Dart

    ~121

  • 8/3/2019 Assembler Kurs C64

    11/66

    A s s e m b l e r - K u r s C 64 /VC 20,'chi_i. -

    .~~mpiette Idioten wie Computerrstehen das, obw.ohlmali ihnen 81haarklein verkauen mull . , . - - - - - -Speic:hers1~1le O f I l 4 O & t S 01[Byte 1 2 -

    CI 80 r - ; ;IX\halt 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 ~

    K~lU1bitsT fU r Ihteer 1 M : :0100 0001 O O O Q 0000, ; ! , I ? SCode fUrA -

    ~

    wird line Variable a ls Zahler Vei'-wendet, hier linRegister (oder eineSpeicherstelle), Ebenso, 'me im Ba-sic bei diesen Schleifen kann manauch hier ruckwarts zahlen mit DEX,DEY oder DEC. Das ha t 0ft gewiSs~Vorziige, was uns aber noah niehtkumrnern soll.Wenn wir diese Befehle also Zahlerverwenden, sollten wirirn Auge be-halten, daB eine Speicherstelle(auch ein X - oder YReQister)Zahlennur von 0 bis 255 enthalten kann. Diehochste .8~Eit-Zablst ja: _dez ..2~S = bin.Ll l l 1111+1 1----+ergil5t: (1 ) 0000 0000WenR wit also tiber 255 hinauszah-len, ereibt sich wieder 0und so wei-ter, weil ein Uberlauf stattqefundenhat. Das 9.Bi t paSt n icht mehr in da sByte hlnein. Urn nochmal genau se-hen zukonnen, \NaS unser Computerda tut, probieren Sie einmal aus:1500LDA #011502 BRK ..Das soll uns die Register zunachstmal ir n Ausganszu.stand zeigen.Nach G 1500werdsn sie-anqezeiqt:AC XR YR . N V- BD I.ZC .01 00 00 0 0 1 1 0 0 0 0Im A1\:ku steht jetzt die dor t einge-ladens 1 . Nun wollen wir das X-Register laden m it .2-55(also$U') Da-zu andern wir das Prograrrim:1502LDX #FF15 04 BRKNach emeutem.G 1500 28igeo dieRegister:AC XR Y R N V - BD I ZG01 f'F 00 1 0 1 1.0 000Im X-Register steht nun die Zahl$FF.Beiden Flaggen hat sieh.die N-Flagge (die negative Zahlen anzei-gen soll) auf 1 geschaltet!Nun 'Wollen wir das X-Registertiber 255 hinauszahlen.Wir vsran-dern das Proqrarnm noehmal:l S , 0 4 H 1 X150S,BRKDer Star! mit G ! S a o liefert uns diefolgende Registeranzeige:AC XR YR N V-Em zc01 00 00 0 .0 110 0 ,10Wie erwartet, isrder Uberlauf desX-Registers eineetreten: Es ist ietztNull. Die N-Flagge hat ihren ge-wohnten Wert OJ,v1eder anqenom-

    men 'unci dte Z-Flagge, die tins an-zeigt, ob die letzte Operation eineNull.erzeugt hat, is t jetzt gesetzt, Bei122~

    weiterem Hochzahlen verschwindet kodie Z-F1agge'wieder:1505INX1506 BR KG 1500liefert den RegisteririhaltlAC XR YR N "1 - srxzc0 '1 01 0000,110000Das gleiche passiert bei Verwen-dung des Y-Registers al s Zahler, wieSie leicht durch Austauscheh allarauf X bezocenen B.efehle feststellenkonnen. Sehr nett ist es, diesel" Be-fehlsablauf einmal fU r den INC-Befehl auf die Speicherstelle ' $0400(Bildschirmspeichsr linkseben) be-zoqen ablaufen zu lassen. Wennman daraul aohtet, daB kern HOGhscrollen des Bildschirms :eintr,itl,kann man das Ergebnis auBer inden Registerh auch noah als 2ei-chenauf dem Bildschirmverfolgen,Der Beginn der Befehlsequenz istdann sinnvollerweise:1500 LDA #FF .1 50 2 S TA 0 40 01508BR KIrn folqenden -setzt man dann an-stelle von INX immer IN C 0400ein.Was passiert beim Herunterz~h-len unter Null? Sie konnen das mitder gezeigten Befehlskette lei.chtverfolcen, indem Sie immer startINX jetzt DEX setzen und die; Regi-ster nioht mit $FF,sondsrn mit 011a-den, Es zeigt.-sich,daBbeim Herab-zahlsn nach der Null wieder 265(=$FF) irn Register zu linden ist. DieReaktion der N- und der ZFlaggeauf den jeweiligen Registerinhalt k ; ; tdie gleiche wie beim Hcchzahlen.Es ist uns nun deutlioh,daB diesesechs Befehle d~eN-TIagge und dieZ-Flagge beein flus sen ko n ne n: Die"se 'Iatsache wild spater noch einegroBe Rollespielen, wenn es urn dieberettserwahnte Schleifenkontrollegeht.Noch e in a lch lm lst ischsr Zah len tr ickDieAsserahler-Alchirnisten habennoch viel mehr Arten der Zahlen-und Zeichenderstellunc. auf Lager.Eine davon 1st die CodierunculsBCb-Zahlen. BCDkommt vemenqli-schen binary coded dezimals, wasbedeutet: Binar codierte Dezimal-zahlen. ".Zwischendurch mochte ich nocheine Bemerkuns loswerden, die Sieals Trost .auffassen sollen: Auchwenn wir spater andere Zahlendar-stellungen kennerilernen werden,es wird nicht so schwierig! Sogar so

    \leles

    Bild 2. So wenlen IntegerVariable aus Basic-PrograllWenden wir uns nun wieder denlacherlich einfaehen BCD-Zahlenzu. A lie Z anlen von 0 bts'91assensiohl 5 i nar mit nu r 4 Bits ausdrucken:Binar Dezimal0000 00001 10010 20011 30100 40101 S0110 6o m 21 00 0 81001 9Dii3 weiteren Werte 1 .0 .1 0b is I lllwerden.in der BCD-CoGiierungnichtbenutzt. Liegt nun eine Dezimalzahl(zumBeispiel Blvor, dann wild jedeStelle disser Zahl (also die 1und die2)gettentlt binar .codiert. In unse-rem Beispiel mit der 12 ware dasdannOOOl ftir die 1 und 001& fiiI die2.'Somifist die 12im HCDCoode QOOI0010 . ] em .e 'Z if f er erhalt so.i hr N i bble .Eine Zahl imBCD~Fonnathat deswe-geo keine .feste AnzaJ : ll von Bytes,scnderridie Byte-Zahl ha,ngt von derAnzahl der Stellen aboDie Zahl 1984beispielsweise brau:cht 2Bytes: 00011001 1000QlOO,Sohwierig gestaitet sieh das Reeh-nen mit diesen Zahlen weger'! dersechs unbenutzten Codes. 'AbeT.auchda hane ich einen 'I'rostfur Sie:Wir Werden: damit nicht rechnen.Wow das g~e dan;n, werden Siesich fragen? Der Gr~d fur dasallesist, daB BCD-Zahlen im G.eg-ensatz

    Ausgabe 11!Noy~mber1984

  • 8/3/2019 Assembler Kurs C64

    12/66

    C 6 4 / V C 2 0 A s s e m b l e r - K u r s

    zu den Zahlen mit festem Format (diesonst verwendet werden) so einqe-geben und verarbeiret werden ken-0817 0818bis o8 IA4 5-;IF4 Q O Q O 00

    11 .11 1111 0100 ~enutztbeiL S B Inleger-zalilen

    von-Ia

    VarlaDlennamel:uui -twVariable;lwerrra ~n VDm C 6 4 1mSpe ic he r eillgerie:htel

    nen, wie sie vorlieqen Das ist imkaufmannischen Bereich manchrnalnotwendio; wo 'eben 1000mal Q ,lPfennige 1 Mark ergeben und Feh-ler unzulassiq sind. 8011ten Sie alsovor dem Problem stehen, m it BCD-Z ahJ et1 rechn en zu miissen, gramenSie sieh nicht: Unser Prozessor kenntden Dezimalmodus, Er ist dann ein-gescbaltet, "'wenn die Dezimal-Flaggeauf 1 gesetzt ist.

    $FF - X-Reg, LDX #FF

    SFF - Y-Reg, LDY #FF

    B il d 3 ,F1uBrl iagramm zur Verzngerungsschlei le

    Ausgabe II/November 1984

    DEY==Y-l

    NeinBNE 1504

    DEX

    Ia

    X=X-J

    Nein BNE l502

    Ja

    BRK

    Damit sollen Sie dann auch nochgIeieh zwei neue Befehle kennen-lernen: SED und CLD. Der ersterehat nichts mit Parteienzu tun, 501\-dern ist die Abkiirzung fUr 8etdezimal-flacs, a1so setze ,die Dezi-mqlflag@e, 'So schalten Sie denDezimal-Modus em, Wie Sie sicherschon messerscharf geschlossenhahen, heiBt OLD ,Clear d~timal1agj~Jalso setze die Dezimalflag,geauf NUll , wodurch diesel' Moduswieder auszusehalten ist: .Wiehtigi We~ Sie arqwohnen,daB in einem Programm irgend~wann mal die Dezimal-Placce ge-setzt sein konnte, dann geh~n Sie aufNummer sicher und schieben vor ei-ne. Roohenoperatton, die nicht imDezirnalmodus laufen soll, em CLD.Beide Befehlesind l-Byte-Befehlemit implizierter Adressie rung , Siebeeintlussen ledighch die Dezimal-1agge,Das Geheimn is der nega t iven Bin l ir zah lenWie schon mal betcnt: Der Com-puter ist strohdumrn, Er kann nichteinmal auf norm ale Weise vene i nan -der abziehenlDeswegen geht etden kornplizierten Weg: Er addierteine negative Zahl, Nur: Wie'sehenneoative Binarzahlen aus? Wir wer-den diese Fraqein clreiEtapp~n be-antworten,a) Man ktinnte eine Flaggs' setzen,die 1ist bet neqativen imd Obei pcsi-tiven Zahlen Bei einigen FlieBkom-rnazahlen wird das aueh so ge-rnacht. Hier aber setzt man die Flag-ge direkt in die Zahl ein: Bit 7 jederZahl ist jetzt ein Vorzeichenmerk-ma l, W en n dieses Bit 0 ist, ha ndelt essieh urn eine positive, wenn es 1 ist,urn eine negative Zahl, Auf dieseWeise ist also + Iwie bisher 00000001 , wohingegen -1etzt 1 .0000001hieBe. Damit wird alle:tdings derZahlenbereich, der durch ein Byteauszudriicken lst, verschoben,2Sc6=binar llll Illl kann S0 nichtmeht verwendet werden. Die groB-te Zahl, die ietzt auscedruekt wer-den kann, ist Olll llll =dezimal127,Die kleinste Zahl ist dann llll 1111=--':127. Probieren wir mal aus, wiesich damit rechnen lalst:+ 10 OQOO1010-6 1 '000.0110------+ergibt 1001 0000 = = -16,was offensiehtlich falsch ist, dennnach Adam Riese sollte +,.4heraus-

    ~'123

  • 8/3/2019 Assembler Kurs C64

    13/66

    A s s e m b l e r - K u r s C 64 /V C 20

    kommen. So kann man also nichtrechnen!Man nennt diese Ar t der Zahlen-darstellunq, tibrigens >,signed bina-rvs-Format, also inDeutsch: rnarkier-teBinarzahlen. .b) Der nachste Schritt ist das soce-nannte Einerkornplement, Dabeitritt fur die positiven Zahlen keineAnderun9 ein . Die>negati v a n e n ts te -hen, aus den PQs.itiven durch Kern-plernentbildunq, das heiBt jedes Bitder positiven Zahl wird in seinGe-genteil verkehrt,wie es das foIgen-de Beispiel z'ejgen soll:0 00 0 110 0 ist + 12 ,dann ist das Einerkomplement1111 001 L =-12.

    K o m p le m e n t i s t n ic h tk o m p l iz i e r tInteressantervveise taucht hierauch wieder das Merkrnal der si-gned binarye-Zahlen aut die. 1 in Bit7 bei neoativsn Zahlen. Beschranktman sich auf ,den Zahlenbereich,der Iur die siqned binary-Zahlen

    giiltig war, dami hatten wir je tZJ :oef-de Darstelluncsweisen miteinaridervereint. Nun mussen wir naturlichnoch feststellen, ob man so .auchrechnen kann.+8 "0000 1000~6 ' LIII 1001in Einerkomplernentdarstellunq------+ergibt (1), o c o o 0001was 1 mit einem Ubertrag e179'8.be,

    jedenfalls nicht 2 1 wie's sich g"ehGrt"Als.o is t anch die Einerkomplement-darstellunc noch nieht das Gelbevom ELc) leh will'Sie nichtlancer aufdieFbl-ter spannen: Wedn.man rum Ehler-kornplement einer Zahl noch 1dazu-zahlt. erhaltman das Zweierkomple-msnt. Und genau so werden negati-ve 'Zahlen in unserern Computer ge"handhabt. Die positive-n Zahlen blei-ben unverandert. Von dennecativenbildet man das Zweierkomplementwie rum Beispiel hier mit der Zahl~12:12 0 0 00 nconormals Binardarstelluno(-12) 11110011 Einerkornplement+ 1 0000 060 I addieren-12 111-10100, Zweier-kornplement]etzt wollen wir auch diese Zah-lenart 'ausgiebigtesten:Wit rechnen nochmal8-6:+ 8 O O G O 1000-6 1111 1010 das ist -6 in derZweierkemplementdersteliunq.-----+ergibt(1) 0000 0010also 2mit einem Ubertrag, der igno-riert witd. Das Ergebnis ist riehtiq,Weon bei einer solchen Rechnungeine negative Zahl herauskommt, istsie nicht leieht zu erkennen. In 801-chen Fallen kehrt man das V(jrZei~chen urn, indem man das Zweier-kemplement berechnet. Das. rna-chen wir mal am Beispiel 5-6:

    Befehls- Adressie- Byte- code. Dauvar in Takt- Beein-won l'WI.Q' anZahl Hex DeJ ; zvklen fiwsaungvon Ji').ag-gan1 N X , irnpllilcit 1 E8 &32 2 N " ZIN Y irnpJizit 1 C8 2 00 2 N ,ZINC ab$olur 3 BE 3 3 8 6 N ,ZDEX iinplizit 1 Cll 2 02 2 N ,ZDEY irnpli2it 1 88 1~6 2 N,ZDEC absolut 3 CE 2 - 0 6 6 N,ZSE D il'l)JiliZlt 1 PB 24 S 2 I-DLl) irnpliiit 1 D8 21 6 2 0- DB NE relatiiv 2 :S Q 3 08 2 -""1 bel Verzwei-qung+2 bei'Ober-schreitEIIl eiheJ)

    se~teniIenzeTabelle. Die in dieser Folge,erwlihnlen Befehle

    124 B:!Jt~

    + 5 130 00 o i o i-6, 1111 1010das ist wieder unser Zweierkoffip-le-ment von 6'"a1S0-6-----+e1"@ili>t1 1.1 1 1 11das ist -1in ,detZweierkomple-mentdarstellung, ZUI Kentrelle nundie Vomeichenumkehr dureh Um-recnnen ins Zwecierkomplement:Einerkemplernent davon 0000 0000plus 1 - 0 000 ' 0 00 1---+ergibt 0000 0001also wis erwartet + 1 ..Auf ,mies.eWeise rechnst unserCompuler mitneoativen Zahlen. Ne-l;Ja;tiveianze Zahlen ~pei'cheFt er imZweierkomplement-Forrnat. Auchwenn Wir nun etwas vorgteifEm mus-sen, wollen wiruns das ansehen. Da-zu seb31te:n. Sie am basten erst sin-mal den, C'Qmputer au s und ladendann den 'SMON beziehungsweiseihren Assembler. Dann bauen witein klemes Basic-Prcararnrn:10A%=-12~PEND

    W i e V a r i a b l e imS p e ic h e r s t e h e nNosh nicht RUN eini;;l'eben! Zuerstschalten Sie den Maschinensprach-molliter ein und wir sehen uns dasProqramm so an, wie es im Speichersteht, De_rBasic-Speicher des C 64l:ileginnt im Nermalfall bei $0800.Wirgeb,?n also den MomtorbefehlM Gl800Uns genugen schon die Speicher-pla,tze ~iS'$081G N un sehen wit dasnackte Basic-Procramm im Spei-eher, so wie es uns C . Sai!J.er in sei-nem Artikel Der glaseme VC 20,Teil 1 irn 64'eI, A'usgabe 9/84 aufSeite 1 , 5 6 beschrieben hat.In Bild 1 ist unser SpeicberinbaLtkommentiert zu sehen Das Pro-gramm endet im Speicherplatz$081~'. Das Kennzeichen fur Pro.grammende sind wei aufeinander-folgerrde Bytes mit dem Wert Null.Dahinter werden elle Variablen ab-gel egt , sobald das Proqramm ge-startet wird. Wit steigen aus demMonitor dureh X aus und starten dasPros r amm m it RUN, Jetz t sehen witncohmal in den Speicher. Bis $0813hat sleh nichts verandert. Danaoh

    Ausgabe llfi:tl'9vember 1984

  • 8/3/2019 Assembler Kurs C64

    14/66

    C 64 /VC 20

    abet ist jetzt in 7 Bytes 'die Variable,A% abgelegt, Das zeigl Bild 2 , ,Zunachst einmaldie 'Bytes '$0814und $ 0 81 5:, H ier w ird .d er V aiia blEm~name und der -typ angegeben. DerTyp ist aus den.Bits 7 zu.erkennen.Sind,beide (wie hier) gleich 1 ,' di:),rmhandeltes sich urn eme Integerva~riable (also, eine game Zahl), LaBtm a n die Kennbits auBer acht, zeigtsich, daB in $0814 dsr Code fur denBuchstaben A steht und$QS15 nutden Wert 0 enthalt, N un zurr; Rest :Der C 641egt Integers innur2 Bytesab - die restlicheh3'Bytes'$0818'hlis$08lA bleiben unbenutzt: Das, istauch dann dsr Fall, W$nn d'ane-ehnoch weitere VarIable kemmen. Esbrmgt also keine.Speichererspamisfile '20-Benutzer aufgeplaBt!), wermma n mitGanzaahlvafiablen aibeifet!In$ Q& 17 steht $ P4, 'welches blnal:1a us aedruckt 11110 10 0 is t Dasken-nen w ir noch vonweiter cben-als'die-13 lin Zweierkornplement-Fcrmat.WQber kom rnt $FF ih $pekherzeUe$081B.?Wie-;ijesagt, djeI:nteg~ts wer-den in a Bytes gespeicl}ert" undwenn wrr-12 in 16Bits ausdrucken,dann sieht das so aus: .+ 1200000000''0000 1'l00Einerkcmplement: .1111 111111110-011plus 1 0 0 0 0 0 . 0 0 0 ' G O @ O @ G Q Iergibt -12: 1111 1111 1111 0100MaE- LSB-=$FF =$F4als 16 -BH-2 .weierko mp'lem en t. .'t:lie . gro J 3te po sitiv e g an ze ' Z a hl, d iman in2 Bytes ausdetreken karin, ist327.67: was binaro in u n 1 11 1 H ilergibL- Die kleinste ist1000 0000 0000"0000-also -82768. Dss istdefGrUri'd da-fUr, d~ derC 64Jntegets , ' J t9B,eral s32767 oder kleiner-als -,32767 dan-kend mit ILLEGAL QUANTITY ER-ROR ablehnt, wenn sie als ~rgu-ment verwendet werden ..(Die Zahl-32168 kann sls Ergebnis von lo-gi'schen Operatienenrarrchaus &uf tauchen.)D am it w ill ich Sie fur diesmal vo nden Zahlenspielereien erl6sen, Inder nachstenTolge rnil.ssenwir da!~auf -!')..o c hm a l Z llrU ck komme p., S iek o n nen die' Art des Abziehens VQ n.ZaWendurch Adctieren des Zweier-Ausgabe II/November 1'984

    kOn;lplemenres: bis zumnit~hstenMal an weitsren B~~spielen li:Q~n,Wenn S ie cla~mit l\3-Bit-ZahlE;n tun,werden Sie bald fsststellen, daBnooh riicht alles-so Iunktioniert wieeS3011te",'W iT ; ko nn en ietzt tibrig,ens auehdas Ratse'llbsen, weshalb bei pesiti-ven Zianlen'(zumReiSpiel LDA#Fp)die Neijativ-EHi:gge auf 1 geht: :DieFlagge wird irrirnei:" darin \1ezti.ckt',wenn e_l leZ iahl a u Jt ri fC , d ie -i n Bit 7 e i'-ne 1 aufweist . Oanz einfach, gell?E in w i r k u n g s v o H e s Z w e ig l e in : B N EVemititliGh raueht Ihnen naefi so-viel Zahlensalat der Kop i . Desha:ibs,ij'l.l-enSre'zu r En ts panT I ung noch ei~nen neuen Assembler-Befehl ken-nenlemen und auehgleich -ein n'Utz~Iiches Proqramrnbeispiel dszuBNE heiSt branch if mit 'equalzere was man ubersetzen kann m.it~verz~eige,' wenn ungleich Null.Oenau.. ,er g.esa91.: 1:8wird dann ver-zweigt - alsceueiner angeg'ebenen.Adtesse ge:spIUngen -c,went) dieZ~Flagg_! ,~Cdie-absn wit bel denXWX,D~X".,-:Befeb:len gena)1eNmtt;!r-~sueht) nieht gesetzt : i st , a : 1 0 0 0 zeigtSehen:wit u n s das ; i na l an der nach-f@lgenael ' l 'Verzog'e':t:t1ngssdileifea n , d'e'r;sn F 1 l :l .B c t ia : g r a m r : n ij'il.d 3 ,zeigt.

    E la s P rG t g ramm@nen clazti;1800LDK #FF15Q2 hDY #FF16Q4 DEY15,08 ENE 18Q4150Q i DEi::lSO'8. 8MB 150215 (;):8 . ;!;lR~

    ZUrcJ:achs t e inma l w:erden da s X-u rrd d a s Y,-RegistE?rl s Zi i:h ter initiali-B i e r i (also mit einem Ausgangswe.rtgeladEm), M it dem vo rhin behandel-' ten Befehl DB'! wird dsan das Y -Registerum.1 herunt'ergezatllt, wa sj e : t z t $FE ergibt. F U r die Nulll).agge'(2 ) bedeutet das den Inhalt 0, denneS lieg t kein G rund vo r, sie zu setzen( a L S O eine 1 dort ailzuzeigen), weilnoch keine Null aufgetreten i s J . Beider nachfolgenden prtifung durchEN E wird also eine Verzweigungna0 h 1 50 4 das Ergebnis s ein , w o ra ufdas V-Register weiterverringert unddann dIe Z-Flag:gee:meut geprtiftwird u nd s0 ,w eiter. D a s geht so lan-ge; bi s nun wir} ; li ch endl ich eiieNullimY-Register erI'eioht 1st"In diesem

    A s s e m b l e r - K u r s

    Fall zahlt D EX nuli eias, X-Re~isterherunter und der nachste BNE-Befehl .tiihrt zuni- Sprungnach 1502"w o das Y-Register wieder auf $Ff'gesetzt wird. Auf diese Weisce wirdd ie a .u Ee re St:hleif~.'2 'S 6mal u nd diein n ere 6 5 02 :5 m~ aldurchl,aufetl.K e in W id e r s p ru c h :A s s e m b l e r - P r o g r a m m el a n g s a m e r m a c h e n

    Sie haben beim Eingellien desProcrammes verrn:utlieherwas,~e~stutzt,als de'I .Assemblern?iZ,hdemBNE 16 04 a ls n achste A d resse stattdem -erWaitete~ 1 . 5 0 8 e r r \ e r 6 b ' 7 aus-gegeben bat Der Befe'lll siehtzwarwie em :}.B"le-Befehlaus, 1 S t abetnut: ein Z-B)fte~'Bef~hl!.Das 1iegt ander speziellen Art der Adressie:rmqvon solchen Branch-Anweffiungen:Der s og en aritlte n re la tiv en Atlres-sietung,Gile wiraber erstspater mitdel'! anderen Branch-Befehlen b.e~handeln werden.. Werm' S ie das Proqramm rnrt G1500s tarten, werden Sie - obwohlaUes in Maschinensprache sehnellMuft - e ine ,mer}d ic:he 'l7er zo i J er ungfeststellen, bever die. Registeranzei-ge auftaucht N och langere Verzo -gerungenlassen sich ohne weitereserreiehen, .indem manmehr B:chlei~fen ineinandsrschachtslt, Dabeiverwendet man dann .den DEd~Befehl. ..In der Tabelle sind auch .die Zy -klen angEigeben;, die ,die heute neugeler:nten Eefehle zUrAbarbeitungbe'uotigeFl. Mit solchen AngabeI'llassen sieh recht genau definierteZe i ten e in s te ll en r in denen dI'EirCo rn,puter hichts anderes tut .als durchdas P:rpgtam m zu flitzen. W c:!zu d asdient, braueht wahl kaumnoch ge-sagtwerden: Wenn S ie zum B eispieleinen Textauf dem Bildschirmlesenwollen, bevot' des Progtamm vveiter-laufti!>d.er wsrm Sie 'mit Pe;tipnetiearbeiten, die langsamer als dasPr o -9Jiammistcder .. Aller6tipgs rnusnoch gesagt wer:den, daB. is 'hochelegantere M:ethbden ZJit Verzb'ge-rungs-Prg;r ;am.mietung,gibt a . l s dasL i3 hm lE iig en ,d es 'OomRlllters, aberdazu kommenwir.erst ineinf:;:tSpat8"ren Folge. (Heima P6(inath/gk)

    ~125

  • 8/3/2019 Assembler Kurs C64

    15/66

    , A s s e m b l e r - K u r s C 6 4

    I n d i e s e r F o l g e d e s A s s e m b le r - K u r s e s l e r n e n S Ie d i e w~~htigenA r i t h m e l ik - 8 e f e h l ed e s P r o z e s s o r s k e n n e n . A n h a n d v o n i B e i s p ie l e n u n d U b u n g e n k o n n e n S ie a i l eS c h r i H e a m C o m p u t e r m i t e r l e b e n . A u B e r d e m w i l d d i e F r a g e g e k l a r l , w i eA s s e m b l e r ; . P r o g r a m m e i n B a s i c e in g e b u n d e n w e r d e n .N eun neue Befe'hleh.a:beo wi!in dar letsten Folqe kennen-gelemt und wirwissen nun, wieunser Computer game Zahlen(soqenannte Integ,el's) abspei"chert, Zur Erinnerunp: Das ge-schiebt im ZW91srkomptement-Form at, D as B it 7 einer 8-Bit-Zahlcl ient dabei als Vorzeichen"Merkmal: Wenn as Q ist lieg( si-ne positive Z ' ah J .V 0 T . Gie genausoaussisht, wie wir bislanq rmmerHinana hl en,ksnnten.Ist da s Blt"7abar eineL dannhaben ..vir esmit einer negat iven Z a 1 1 1 inderZweierkomplernent-Darstalnmazu.tun. Wenn wir - wia unserComputer - zur VeI,ax:beitllnggB.llZer Zahlen. 1 6 Bits (also 2 By''les) verwenden, dann Ist ebenBit 16anstalle von Bil 7 dasVor-zeichentil. .Wenn Sjenun am Ende dertetztenFolge eiii l'liBthen mit sol-chen Zahlen gel'echnet haben,konnten Sie siehez fe.slslel len.d a: BZ 'N a r o ft d as richtiqe ErgelJ -nis herauskarn ~ aber Ieidsrnicht immer. Warum dasso istund was man deswegen nocheeim Arbeiten mit Zahl)im tieIComputer beaohten muB. so li :ihdieser Folge' dran setn, Demit~ aber nicht nur irnvergleichs-

    weise trockeasn ,zahlendschun,gel herumirren.ecl len Sie heuteendlicaeuch die wichrigSien Be"fehle des 6502 (beziehungsweicsa 6SIO) zur A:rlthmetlk kennen-lernen, AUBerdemgibt as dazunoch zwei Flagjgen 'rn:atis un ddie BranchBefeble: (sc l ron lang,eI lbEOrfallig) sollen lhnen nun vsr-traut werden. Zuna!i

  • 8/3/2019 Assembler Kurs C64

    16/66

    C 6 4 A s s e m b l e t ' . . K u r sflo w') erkennen zu k0nnen um.ei-ne entsprechende prowammt ec n n is ch s R f3 'a k tio u zu startsn,Es' wird die, Ubedauf-F1agge V'auf laesets t , Leider istdle Sa-,c,hs abf\r nichtso :einfach, daBrue immsr gese!Zl wurde, wennvon Bil 6nach B it 7 ,ein Ubertragstatt'fmBet G'eselZt wirddlese V,Flagge nur in fo lgenden, tWaiFallen: 'I), Es Iindet em Ubertrag vonBit{! nach Bil7 stat\.. aber ~ejn ~u-:5erer 'Obert!ag ,(w:ie helmCarry) ,2)Es fillieH';ei,n interner Uber-trag vo n Bit S"nach Bit 1s1att. abe.einauBereI t ibenf,ag passiert ,Marken kann man sich das ambssten so: Immsr dann, wenn

    ~e.,~tjsserinae'n das Vorzei-chenbit i ~versehentlich~ vsran-,den wurde, witd d ie V 'P la g gea uf 1 geseti\. D as Ist e.in harterBracken! WiT sindesja g,ewehnt;daB wir uns urn dl~e Dingebaim Computer .eigentliih garnicht mehr kurnmern massen.AuJ,)erdeni wurdedss ja erfor-demo dal', mom . ' S i C D . bei allenOperationen vorher iJ.bettegenmu8, welchs Zahlan a-ufti-etef)konnsn u.nd welchs Fehlsr alsodurch wersehentliqhe$~ Varz,ei-chsnandem nassieren k6nnen!Genauso ist -es - in 'der Pro'granunl$j;prat:i!l w u & lhnenabsr das lanze, Problem riichimehr . 1 5 6 ' G l T J ;>o rk or nm en , W \ rwollen uns i: , l ieses Zusammen-spiel der U bertIag.e vo n Bit 6nach Bit 'J . u i; Jd v on B lt 7 . ilacb Bi l8 (a1so ins GRaY-Bit ) nocha .n -hand einig'er BeispiEire klarerma'ehen'. ,. - '1m ebigen Beispiel der Addi-t iot i von 6 4 und ,68haben wi! ej"nen F all scho n behandelt E sfand sin Ubenrag von Bll 6,nach})it 7 stall. aber kei:h il:liJ2;erer'Ohertrag ins Cany-Bit. Deswe-9e;n wurde danil auch die V-,Plagge gesetZl.' Das Problemla]?,1sich hier ganz einfach ltiS8IlZ um BeispieldUIc):I Vet~ve,ndurig,"on 16-RitZahlen:

    64+ 66

    D o o o M Q O O I O Q , O O d O+ 000000000 )0 00010130 0000 0'000]0000010

    B e L ' L6-Bit"Zablen ist ia BIt 15das Vorrelchenbit, welches ruerkeille Ji.nderung errant!.-cier ande'ie Fall tritlauf bEii, de r Ad -d it i. o n v on '4!"rei negat ivenZGhlen wie -!as wid -84:-125- 64 1000001111000000

    ,(1)0100 00 IIAuch das ist offimsichtHcbfalsch: Es ha t wi.ec ier l l.ersehent-lich.ein VOlzeJ_c1' \enwecpsel

    .stattgefunden, Dies ist a l so de!Fan, wo zwar si n Uberlrag insCarry-Bit stattfand aber ke'inU beIlIag von B , i t 6 naG h Bi t 7:

    Al1ch dieses Problem laBt sichdurch Verwenaung von 16'Bit-Zanlen'losen, Elne 'kleine Tim"ningsaufgabe hir Sie!Man kann also saaen: Immerdann, wenn bei 8.Bit~Rechm:m-g-en de! rnittels Zweierkornple-

    mentzahlen darstellbare Be-reich (127bis -l@) illJer- oderunterschri tten wird, fuhrwerktwan . im VDrZeicheiL-Bil herum,und vert1l1scht das Elgebnis,Dann leuehtet wie eine rdle'Ampel die Uberjauf(V)-.f1agge 'aufund sag:! uns, daB wir besser indfesen Fatlen r i l l t 15-Bit-Zahlena rb eit en . so ll te n,. Nunnoch zum 19110rLersf)deeCarry-Bits , das i1::h$leiter pbenerwahnt habe, Bei .allen8-Eit-ReChlloperatisnen mi ( Z ,v e~ i3 i :-kornplernentzahlen kann dasCar ry -B it v et n ac tHas s ig t we rden ,,Zwel Bejspii;!'I~s0Hen'daswiel$rillustrieren. Wh addieran + 4und-2:+4 ' 0 0 000 )0 0-2 III 11 110+ ++ ,2 (1 )00000010Das Gariy:Bi l"wird auBer achlgelasse'n. Anderes Beispiol, Wiracl-clie-ieil zwei negative Zahlen,-4Wld.....,6:~4

    -2+llIllOIO111111(0+

    -6 (1)11111000Aueh hier kann man '(soqar:muB m an ) dasCany-Bj t ,VSmach-lassigen ..Belde ErgebniSse siild

    rich1ig.Nuri w i . s: s e ' n Si~ a l l e s tiber c t l eArt , 'Nie unser Rechner mit -gan-oo'n, Z

  • 8/3/2019 Assembler Kurs C64

    17/66

    A s s e m b l e r " , K u r s C 6 41500 0 III 000'1Carry: INun folgt der zweits-Teil derA dditio n m it den MSBs :1301 'OODO 1000140100000011Carry: 11801 00001100Darrill staht n ,UR das Ergebnis318S (binar O OO @lO O DIll 0001)sauber.ich auIgeteilt in LSB(':;peicher 1500)unci MSB (Spei-cher 1501) fest. Des Can,y-Bilstaht auch nach vollendeierRechnUllg noch auf I, so daB esVOl. erneuter Ad:dllion wiedermit esc zu l o sc rr en ist,Demit wihe alles liber dle Ad-dition berichtet, Wie immerinProgrammiererkreisen dieErripfu;hlung: Oberi" uben, ....Wi:r wenden uris jetzt der ,ge-geniaufigen Operation zu; DerSublra,k\ian,

    N o c h m e h r R e c h n e n : S B C , S E CDaB'das Abziehen von.Zahlenim Computer durch das Hinzu-zahlen des ZW,eierkomplemen"tes geschieht, haben wir mit vislGehimschmalzverbrauch sehcnin vorangegallgenen Abschnit-ten, srfahfen. Nun sollen Sis diedszu Ilotigen Be febl sW ; o rl e d esAssemblers kenoenlemsn. Zu-nachst ainrnal ist da SSe. basheiJ3. i~sublratl with c a iJ 'Y " o derauf deutsch etwa .ziehe unterBeriickSichtigting desCarry-Bitsabc Ebsnso wie bel der Addl.tion mil ADC, wlrkt das Argu~men! des SBCBefehh auf dimAtkulnhalt ein - wobsi dasEr-gebms im Akku lendet, di.esenalso uberschreibt, t;oIDPI!.z.ienerist bier ,die Verwendung desCarry-Bits, w~taufwir aber nichtdetaill iert eingehen wollsn.(Wen e,s interessierr Nschlesenin LA Leventhal, ~650~ Progfammieren in Assernbler, 3.A'uf lage, MUnchen 1 98 3 , Seite3100), Filr U!lS s o 1 l einfach .disnicht ganz korrekts Analogie'zurn "Bbrg'en~ bei der Subtrak-liOn a~ls;rek:hei1. F . i i : r den Fall,daB ein soleMs Bc!tgen elnlrs-L en m1lB , s ou te a UG h d es d azu no,I1ge Carry B it . vorhanden sain(also auf 1ge~etzt sein) ,Vfie Siesichei:lich sqhon arrsten haben,heiBt SEC >lsetcanY~ l also "set8edes 'C arry B it. (a u[ 1 );Melke : V or i!ille r A ddiljo ~ immer lii,se he n ~e s Ca rr yB it s mil . CLC,

    VClr E ine r Sub lr a kt ia ~ immer S e l z e n desCarry,EIi1s mi t 'SECIZwei B$ ispl '8 le Rir dieSubtrak-lion sollen das bisher gesagleerlautern: Zunaehst eine 8Bil~SubtJ:aktion von ZAFLJ(in Spei,therzellle 13M)minus ZAHL2(inZelle 1400} . Os E rgebn is V o iirdnach lS00gescluieb'eo:

    1200 CLD1201 SEC1202 LOA 13001205 SBC ]409120SSTJI: 11; ;00SBC ka n n - w ie hier-vabsolutadressiert warden, aber auchunmittslbar ,(als0Zilln BeispielS B ' Q $'40),Dar Safahl istdann iniersten Fall sin 3 ", 1manderen Fall~in 2~Bytec-BefehL SEC ist eben-so wie vorher schon aLe ain im-plizit adressierbarer l-Byte-Beie"hl .Das z.weite Beispiel iSI eins16- -Bi tSub trakrion , In den Spel"chern Siehl vcrdem Aufrui,dieser kleinen Routine:1300 ZAHLlLSB1MI' ZAHLI MSB1400 Z :A HL 2 L SB1 '401 ZAHL '2' MSE'bas Eigebnis soli nach 16'00(LSE) und 15'01 (MEB ) gebrachtwerden:i s o o GLD1 2 0 . 1 SECl~fOz. L DA 13001205 SBC 14001208 ST]! . 1600. l et zi sind die beiden LSBsvon-einander a,bgezogen und ellsDifIeje,nz abgespeicheT~als LSBdes Erebnisses,130B LDA. 1301120B SBe i 4 0 11 2 1 1 STA 1501Darnit ist die Aufgabs b,een.del. Auch die MSBs sind subtra-.hiert und dae MSE des EIgebniss es s :i" hl ti l 1801 . .'SBC beeinhu$f die gleichenFla,ggenwie der Befehl !We.

    E in P r o g r a m m p r o j e k tDamit die so kennencelerntenArilhmetikBefehle nicht so.trc ck en a uf Weiler Flur stehen,wollen W IT nun e.in Programmsntwickeln, aus dem zwaierleizu lsmen ist: -. .1) Die Anwendung- bisher ge-lernter Be-fehle unci2)~inhatlfigangeW8ndeles VerIahren, Assemblerpwgrammein Basic-Programme einzueinden,Bssonders diesel' 2 . Asoektscheintnoch vielen Lese'!; un-klar:ru sein (das teigen mir Z u schI iI te.n), Es g'ibl eine 'ganzeReib e v o n M6:g,lichkeiten, 4U1DEinbau vo n Assembler~ou:tinenin Basi-r;cPtagmmme; die Wet-den wi_(ane nach und nech kellc"nanlemen. Von Ihnen sicherlichschonM.ufig' angewendel WLlr-de der SYS,Befehl (zum BeisDielr U r S'?S S8S40 undVorhEiligempm;:B2i'4'ze)le und POKE21tSpalle 'Zum Set-Z>nctesCursorsandieSti:lUe Zeile, Spalte).Damithaben Sie sin Maschinenplocgramm a:L'If

  • 8/3/2019 Assembler Kurs C64

    18/66

    A s s e m b l e r - K u r s C 6 4zum alten letzten GJied. Das ant-spricht dern Basic-Befehlk.= A + D'In einer Schleife, Diesis! eine neue I6-Bil-Addition,we- i; ha lb W it wisder CL G YOl,'gs-Den mussen:1216 OLe1217 LOA 131012lA ADC 1320121D STA 1310Das war wieder'd~sLSB: NunzumMSB:1220 LOA , 1 3U1 223 A DC 132113213 STA 1311V i l lr z ah le n n un d a s 'X - R e gis te rurn 1 heruntsr und prfl fen, ob ess ch on Nu ll geworden ist, oh alsoschon '8,j19 N-GUeder surnmiartworden sind:1229 DEX122A ENE J203W e-1m n cch n icht a lle G Heder!;i,erachne1 und summisrt sind,kehren wlran' den Schleifenan-fB.Ilg zuruck. }I,hsonslen sprln-gen wit zuruck ins Basic-AufrL\!pr6i:Hamm:122e R'I'SW enn S ie beide nogMmmeeingetippt haben, dann spat-chern Sia,sie'vorskhtshalber ab

    (das FJ;i;embletProgramm witdem S-Be!ehl des, SMON). Beimneuen Einladen branch en Siedim SMON Diehl - mehr, ,Nachodem Laden unseres Maschinen-programme'S (mit ,8,I bei Disket-t e oder ,1,1bei~asse,lt~) gebenSie NEW

  • 8/3/2019 Assembler Kurs C64

    19/66

    A s s e m b l e r - K u r s ' C 6 4 / V C 2 0 (

    l'SS(~11 )I(~{(~i1(., 1 (!I

    I n d ie s e r A l i g e d e s A s s e m b le r - K u r s e s w i r r l d i e r e la t i v e A d r e s s ie r u n g e r k la r t . O a m i tv e r b u n d e n s in d a u c h d ie w i c h t i g e n V e r g le i c h s o p e r a t i o n e n . A n h a n d e in e r s e h rh a u f i g v e rw e n d e te n B e tr i e b s s y s t e m - R o u t i n e k ii n n e n S ie I h r n e u e rw o r b e n e sW is s e n t e s t e n .Ider Ietztan Ausgabe habenwir .dia Branch-Bsfehle ken-nengelemt. Haute wollezi wirunsmit der reJativen Adressie-rungdieser Befehle und noon ei-ner anderen A rt der Adressis-rung befassen, Weiterhin wer-den Sie einlge neue Assam-bler-Worle lernen, na.mlich dieVergJeichsbefehle. WiegtmzeZahlen im Computer gespei-chert sind, wisssn wir bereits,Heuta untersuchen wir die Spei-oherung von Zeichen. Schl le8-lich werden wir unsere Nasenccn ein wenig india eingsbp.u-te Software des C 6 4 stecken,

    D i e r e la t i v e A . d re s sie r un gAI!;wir den BNE-Hefehl das sr-sternal verwandst haben, stell-ten wir Jest daB zum ileispielBNE l200 nieht - wie eigentlicb.zu 'enva:rlen war - ein 3-Eyte-Befehl, sondern ein 2-Byte-13ef~hl ist. Damals ,muBten wiruns mit der Bemerkunq zutria-den geben, es lage an der be-sonderen Art der Ach:~ierulig,namlicn der relativen Adressie-rung, Rolariv bsdeutet ja bezo-gel] aUf etwas Wenn wir alsobeispielsweise B NE i20 D schrei-ben, liegt es nut an der Be-nut-zerfreundlichkeit desSMONund vieler anderer Assembler,daB dieser die so gesch-riebeneabsolute Adressa '1200 i"n dierichtige Form, namlich die relati-ve umrechnat, In Wahrheit ver-lang! da r 65 02 (urid nali:irli.chebenso der 65]0) sine AngabedilIilbel,', ~Vie'JieleBrres nachvorne oder hinien im Prog:rammer zu r weitetenProgrammve!aI-be'Hung sprinqen (lIerzweigen)soll , Es gilt nun also, zwei Fragenzu klaren:1. Relativ wozu wil"d gesprungenu nd2 . W ie berechnet sich die Anga-be, 'urn wieviele Bytes nach v o r -ne oder hinten imProgramm derSprung voUzogen werden soil.

    Zur KUirung vsrwenden wirein hypothetisehes Pragramm-segment triiteinemSprunpbe-fehl unci sehen uns des Disas-sernbler-Listlnqan:2000 AD 00 302MFQ~2005AoS 00z0 01 8D 0 03 020 0A60

    LBA3000BE~,200AWA#OO~aoooRTS '

    Byte Inhalt Bedeutung20 07 2 8D STA2008 3 00 LSB von 300 02009 4 30 MSB von 300 020DA 5 60 RTSNeben der Byte-Nummer istnoch die Elltfetnung z l1 2 .005 geschrieben. Daraus is!deutlich zuerkennen, daB die Sprungweite,die zum Proqrammaahler ad-diert wird , O [:rsein mU, wennder Sprung zum :RTS erfolgensoli, Pu r VorwartsNerzwei-gungen gjU also': Von der Adzes-s e des B efe hls an, d l1 lr a . uf d e ll

    Branch-Befehl [olgi, zahlt mandie Byte-Anzahl bis zum Sprung-ziel. Das Erge,bnis ist dar Offset.Nun gibt es genauso hau IgR(1el0';aits-Spri.ing~, III den bis-her gezeigten Proqrarnmen sindsie mehrmals aurge-tre-ten. Wiebsreohnet man deo Offset indie-sen Fallen? Sehen wir unswieder das Disassembler-Listihg eines solchen Pro-gramrrl!~egmentes an:

    beiten des BNE -B sf eh ls .a .u f 1 0 0 5steh!, Sehen,~r uns a8~h di$esProqramm Byte fUr Byte an:

    0 15 1 ]te~mwV iina

    1000100210031005

    A200ESDOm00

    LDX #001N XENE 1002BR K

    Byte1000I D O l1002 31003 21004100S

    Inhalt BedeutungA 2 LDX #00E8DOFD00

    INXBNEOffsetBR K

    ti lO JSiIe8 1in0 1illI C

    Dieses Prooramm'Ieilchenladt den Inhalt der Speicherstel-le 3 P P O in d e n Akku, Uberprilftdann, ob dieser lnhalt null istund verzw eig t beim Vorliegende r Nul l z urn R t lc kil jJ Iu ng ,(R ' JlS )lSIder Inh alt vo n 30 00 nich] Null,dann wird 3000 auf Null gesetzt.3000 konnte zum Baisplel sineF1eg.ge sein.Der Pfad, dsm der Computerbel der Abarbeirung des Pro-gramme.sfolgt, wird dureh denPrccrammzahler verbereitet.D ieser ist dann, wenn der B,EO-Befehl an der Reihe ist, schcn ei-nen Schrit t wener , n a l )1 lic h imPrQgTammzahler staht dann dieA dres se Z 00 S,Relat iv zu .tl ,ie.ser Adresse hatdann der Sprung zu erfolgen.Z11mInhalt des' Procrammzah-leIS muE' ;:l.lsoqie Sp~u1tgv.,'eitB(auch haufig Offset genannt) ad-diert werden. Soweitzur Fraqe 1 .Zur Klarung von Fra,ge Z'hstenwir uns mal Byte Iur Byte unserPregmmhl auf:lnhalt Bedeutunig'lID LDA0 0 LS B v~n 300031 MSB VQn 3000FO BEQ08 0ffset. I t - 9 LDA:t;-O O

    Dieses Progtainrnchen ru tnichrs ancezes als das vornsraui N ull ge~etzte X-Registerho chzuza hlen , bis . es ub.er ZS Sla uf t (d anQ , tritt ja wieder 0 a u! !) .S:olallge der Inhalt -des x -Registers ungleich Null ist, er-[0191 ein Sprung zuruck bis zurINX-Anweisung in Zeile 1002,Erst wenn die Null durch denUberlauI aufget:r:eten ist, endi3tdas Programm n U t einem BEK inZ eils 1 00 5,W ir wissen seh()rl ' , ,daB de rProgrammzahler beim Verar-

    Wieder ist rreben der Byte-nummsr die !::ntle.rmingvern ak-tuellen Proqrammzahlerstandang!geben, Wir r t 1 \ i 9 s e ' n al.SrlJvom Inhal1 des Pr( ')grammzaa-lars 3 abziehen, um zurn 1 N X -B~[!3hl inBy t~ 1 0 '1 2zu ',;!elangen,Das kennan wir aber sencn susden Vergangel1en Ausgaben:Wenn der Cmputer eine Zahlabziehl.' 'dann addiert er dasZwelerkomplement dieser ZahLHier s . o n jiun ;3 sU1">tr,ahier:t w e r -den. WirberechnendasZweier-!undist unser Offset. FUr Ellckwarls-Ven:V\'eigungengilt also: Vonder Q ui die Branch-Anweisenqfo ' lgende"f. l Speihersislteariza hlt m a n d ie Bytes : ; :urUek biszuin, Sprung~ie!. Das zweier-komplernent der 'si ,; ;;h dadurch,e(ge~enden Byte-A;nzahl isrder0ffset.Bas sieht reichlieh komplizierta'us, aber zum ,sinen haben Sieja.einen ganz rreundlit!1en Assem-bler und nur in se1tenen Notle]-len mlisse.n Sie Qen ptfs'et be-rechnen. Zum anderen. gibt esnoch aine Faustregel, mit derman sicb des g.anze veFeinfa-

    wB'p ,s cWti 1st~.isillinf ils~Uleib;E~gJR lb,Sj;1 1 : ..)1'ItWAIefaE i3(

    1421~

  • 8/3/2019 Assembler Kurs C64

    20/66

    C 64 /VC 20 A s s e m b l e r ~ K u r schen kann, 'Die sell durch fo!,gendes Schema erlautert wer-den:BYte ~nha:lt, OIfset1995 , E9~996 FA1S9:] FB1998 ' :p~1999 FD'2000 ~NE FE2001 0ffset > F F2002 Prograinrn-ziliIerstand2003 01'2ao~ 022005 a sBel Vorwartssp:rung~n ist oh-nehin alles klaz, Bei einemSprung 'nacb Adresse 2005 milBte man in vorlieqsndem Fall ei-nen Offset von 03 eingeben. BeiRuckwarts-Verzwelqunqsn zanl!man einfach von $FF an ruck-w a r t s bis z u r Zieladresse. EineVerzweigung nach 1996 wfudeim voriieqenden Fall alsoeinen0.ffset von 'SFA erfordern.- Eine Elnschrankunq der rela-riven Adressierung konnen Sienunaucn scion verstehen, wenn'Sie an Zwelerkomplementzaa-ln denken; Der Offset belegt,ein Byte. Die @roBte positive Za'hlin einem Byte lstOlll llll = + 127=7Fund die kleinsle negative Zahl is.10000000 =-128""(~80)Es sind kcine g:roBeren Vor-warts,VerZV'leigungen als urn 127Bytes moglich, weil in diesemFall sin Offset grM er ills $7F , al-.so mil einem Bit 7 glek:h 1 notigware:, Wasaber wieqer als nega-tive Zweierkornplementzahl ver-siandan und einen Ruckwarts-sprung verursaohen wurdaAhnliches gilt andsrs.herum: E sis! kein waiterer Ruekspmnq alsurn 128 Bytes mogHch, weil das.im Offset zum geloschten Bit 7fUhren,wfu,d~ also zu einern Off-'s et k iemer als S S O , w a s wiedsr-umanstelle des Ri. lcksprungese in e VO 'n ,v fu ls V e tz we ig uh g h er-beifi.ihren wiirde.Dara uf so11teman achten beimErstelten aines Assembler-Pro-grammes, daB man nis weiteraRuckwartsspt\lnge als urn 128,beziehungsweise Vorwarts-splii.ne urn 127Bytes verlanqt.Auch wenn man im ASs'emblergar niehl auf relative -Adiesslerung Rilcksicht nehme11 mUJ3,weil der Assembler sich mit denAbsolutadressen begIlugt:soll.te man wissen, daE zum Beispielfolgende Zeile aufgrund dieserE,inschr-ankungnichl moglich isl:3000 BN E 1000Die me.isten AssembJ.er reagieren auf solch eineZeile mIt ei

    ner Fshlennelduno odsr so wiederSMON. der klarnmheimlichdie Proqrammstartadresse stan1000 einsetzt, Aber es ist dochfugerlich, wenn man apf dem Pa-pier,ein Programm fertighal underst beim Eintippen Ieststellt,daB der Compute~ das so nicht,haben will,Z e r o p a G e A d r e s s i e l U n GWeil wir nun @'elade mit der-Adressierung so sehsn inSchVo(ung .' lihd, stelle ieh Ihnannoch eine andere vor: DieAdr.essieruIlg del' 'Zerop,[email protected] ist die Zer0page? A u fdeutsch he.tBt das Nullseite. Ambsstan verstaht ma n das, Wennman sich in.Erinnerungruft, wieAdressen in unserem Computerverwa lts t wo rden . Da ha ben W P:dech ein LSB (Least SiqRificantByte) u n E ! ein MSB (Most Sl

  • 8/3/2019 Assembler Kurs C64

    21/66

    A s s e m b l e r - K u r s ' C 64 /VC 20rnsn I, -lsn $ 0 1 2 3 4 5 6 7

    bin. 0000 0:001 0010 0 .011 0100 0101 Q l l 0 0111$ binar0 0 000 NU L DLE , SP 0 @ p pNUL L DI,.E SP 0 @ p CHR$(9 6 ) CHR $(ll2 ,)1 0 001 SOH DCl ! l A Q a q .~SOH DCI ! 1 A Q CHR$ (97) CHR $ t1 l3)

    STX D C2 " 2 B R b r2 0 010 STX D C2 " 2 B R! CHR$ (98) CHR $(1 l4)3 0 01 1 ETX DC3 # 3 C S c sETX DC3 # 3 C s CHR$(99 ) CHR$(115)4 0 100 EDT DC4 $ 4 D T d tEO T D 04 $ 4 D T CHR $(lOO ) CHR ${U 6 )5 0 10 1 ENQ NAK % 5 E U e u

    ENQ NAX % 5 E U CHR$ (lO l) CHR $(ll7)6 0 lID ACK SYN & 6 F V f vACK SYN & 6 F V CHR$ (102) CHR $(IlB )7 0 1 1 1 BEL E'FB '1 G W g wBEL ETE I t G w CHR$(103) Cij :R,$(i19)8 1 000 BS CAN ( 8 H X h xBS CAN ( 8 H X CHR $(104) CHR $(120 )9 1 001 HT EM ) 9 I Y i yHT EM ) 9 I Y CHR$ (I05) CHR $(121 )

    L F SU B * J z j zA 1 01 0 LF SU B * J z CHR $(106 ) CHR $(122)B 1 01 1 VT ESC + I K [ k ( ,VT ESC + I K [ CHR$(107) 'CHR$023)

    FF FS . ; : : L \ 1 ,C I 100 , IFF FS , < L CHR$(108) O H R $(l 24)D 1 101 CR GS - = M I m JCR OS - = = M ] CHR$(109 ) CHR$(125)E I DO SO RS > N 1 n -SO RS > N r CHR$(I lO) CHR$(126 )F 1 III S I U S / ? 0 - 0 DELS I U S / ? 0 - CHR$(ll l) CHR$( l27 )

    i~CE(

    t~cvFc~2IISS]I

    cr :n1 ,sne.tSbsdne

    'j

    D I

    B il d 2 : ASCI IC o de Oeweil s a b en ) u n d Commod o re ASCI IC od e ( jewe il s u n te !! ) ( li is n = ma st s ig nl fic a'n t n ib bl e; t sn = l ea s t s ig n if ic a n t n ib bl e)haben, einige Zeropage-Adres-sen zu iiberschreiben. Anderewerden standig neu beschrte-ben durch das Betriebssystemoder den Interpreter, was unsa-Ten eigenen - vialleieht garadein so einerSpercherzelle qela-gerten - Z"visahenwerten denGaraus .machen vru.de. Mansollte sich also die ersten 256Speicherslellen gam ge'nau an -sehen, bevor man sie adressisrtoder aber auf das Betriebssy-stem und den Basic-Interpreterverzichten. Ersteres erleichternuns Tabellen der Speicherbele-

    gung (zum Beispie, l Babe], K-rau-se. Dripke Das Interface AgeSysternhandbuch zum Commo-dore 64-i, lnteriace .l\ge Verlag,oder,"Das Commodore 64 Bueh,Band 4 , E l nL e it fa de rr h ir System-proqrammierer, Markt und'I'echn:ik Verlag) und auch dieSerie von Dr, Helmut, HauckMernory Map mii Wandervor-scnlaqen, 'die seit Ausgabe11/84 erscheint. 'Ohne Hemmungen nutzenduifen ' N C r rurr die Speiehel.'stel-len (iedenfalls beirn c . : 64) $02und $.FBbls SFE , Weil das dcch

    recht miktig ist, hat jederAssemhler-Proqrerntnierer spe-ztelle Tips, welcha Zellen ernoch mit welchel). Vo!siohtsma8-nahm en benutzt 'W enn m an be-stimmta Routinen' aus dem Be-triebssystsm oder dem Iriterpre-ter nicht aufruft, bleiben dazuge-hOrige Zerowage-Adressei1' UJ). 'beeinflufst un'd sind darm fi1r,ei-gene Zwecke nutzbar. Maneh-mal ist as notwandi9j, den altenZus.tand einer Adresse nachBeendigung ei'genel Pl'@9j!am-rue wieder herzustellen, mancb-mal nicht, lnteressan und viel

    d~du1 1 :dVn

    be'$ch~lebe'n Inallen moghc.henZeitsGliriften, Buehem etc. ist dieMtiglichkeit, die Notizen, diesiehdas Betriebssystem oderder I nt er pr et e: r a u f der Zero 'pa-( 'je macht, zu verandern. 1mPrin-zip sel,reibt man darnit KleineTaile dieser GroJ?,pro)tarlimeurn cder vaniert Tabellenteiled a W O B . Wie schon Dr. Hauck inseiner Serie saot, ge'schilihtdasim Rahmen der .Tricks mit ir-g$ndwelcnen POKEsmeh'I oderwenig! bl'ind, weshals.a uch hle-vorzuqt AbstUJ-Ze' d~s Cernpu-ters dabei Iestzustellen sina.

    S IanChgr lXsl

    A\1~abe :l_:ljamii'lr1985 A

  • 8/3/2019 Assembler Kurs C64

    22/66

    C 64 /VC 20 A s s e m b l e r K u r s

    ~l Rkku 1 Akku 1LAGGE ~ >DATEN ' ~ . =DATEN ~ l}A~ENN 0 Q 1Z : 0 1 QG ~ I Q~- -

    Bil d1 . F !a~g en ~ei ~en VergleithsbelehlenWarum AbslUr:oe?Me, stellen Slesichmalein ven Ihnen gesC.h"Gie-benes.P.J;ograrnm vor - zum "Bei -spiel das aus der letzten Aus.acbe, zur Ber8chnung der Sammeeiner artthmetischen Reihe -und POKEn Sie dsnn anstelle ir-,endeines Be'fehlscpde;;, de!dorthin ge b i: ir t , jetzt eine 0 (alsooin BRK) hinein. Die WlrkUngdur~t'? ahnlich win. Wenn manallerdings die Funktion der be-treffenden Speicherstelle gena uk.er m t , lassen sich recht nutzli-ehe Anderung:en hervorrufen,wie zum Beispiel die SchutzPO-KEs fut den' Basic-Speicherdurch '''erandern de! Adressen$ 33, $ 34. $ 37 und $38. .WiI werden im folgenden im -mer dann, wenn wir mit2eropage-Adresslerung- arbei-ten oder Routinen des Betriebs-systems cder Interpreters.unter-suchen, spezlelle Sellen derNullsei e kennenle:rnen.vorhln hette ich noch anqa-deutet, daB man dann die Zero-page fast vollstandiq nutzen ken-ne, wenn man auf den Basic-Interpreter und das Berriebssy-stem verziehtet. Das ist tatsecb-lich mog:litb: Nur wird mandannerstaunt Ieststellen, wieviel A T-beit unsdie computerinterneSoftware abnirnmt oder andarsnerum: Yiele bis1ang selbstver-standllche Dinge we1t:d~l;1wi!dann ptptzlicb selbst program-mieren mussen, und das kannein hartes Brot seinlAls Beispiel f ii rein Ftogramm,das nicht nur die Zeropaqea-dressierunq verwendet, son-darn socar selb~t kom);}lell int ll er Zer"Opage sleh!, welden WITuns die CfrnOET-Routine anse-hell E in e .K la s se VGn BeJehlen.die dort angewendet wird. dieVergleichsbefehle, soli zuvorntJh gezeigL werden,O ie Vergleichsi!efehle: C M p , C PX , CpyVergleichen heH~ in engli-scher Sprache .to compare., w o r -aus:Sie lJnschwer erkennen kon-nen, woher ' d i < : ' l BezeiehnungeM)' u n C i die CPs inCPX bezie-hungsweise CPY kommen. Ver-glichen wi~d jeweils der Akku-Inhalt (bei CMP), der lnhalt desx- (bei CPX) oder des '{,Regi-sters (bel CPY) mit Dalen. die

    .der Comeare-Befehl adressierr.Einit"Je B~jsRiele we l' il J .en Ihnendas klarer mechen:C :IMP #FF'iergle:icht tienAkkll-InhaLt m itder Zahl $PF. Hier liegt die un-mittelbare AdressieIung vor, dieebenso fUr CPX und CPY ver-wendbar ist, AuBerdem ist dasdann ein i>,-.ByteBefeh1.CPX 3 0 0 . 0vergleichr den Inhalt des X-Registers m il dem Inhal1 derSpeicherstelle $3000 . Die abso-lute Adressiorunq ist also auchanwondbar (natilriien auch f U r ,eMP und CPY). Der Compare-Befehl besteht so aus 3 Bytes.Cpy ASvergleicht den Inhalt des y -Registers mit dem lnhalt dsr Ze-mpage-Stelle $A8 . Dlese soebenfrisch gelernte ZeropageA'dres-slsrunc is t b.eL allen drei Ver-gleichsbefehlen meglich undrnachi aus ihnen 2-Byte-Befehle.Fur C PR und GPY sind dasalleMoglichkiten .der Adressie-tung. CM P er\i2!ui;)t weitere, diewir noch kennenlemen werden.Nun inieressiert uns nattirl iehnoch, wie das. Vergleichserg,en-nis zu s rh alten isil B ei d iees n B e-fehlen geschieht merkwurdi-ges: Die Vergleichsdaten wer-den vern Inhalt des Akkus (be:;;i'ehungsweise' X- 6d~I y -Regi!;ters) cl:Qgezogen, aber:Weder wird dieser Inhalt nochw~r;Gien di~ aq:ressier:tel.n Datenvsrandertl Der Trick ist, daBdrei Fla~gen des Ergebhis an-zeigen~ Elie Negati.v-Flagge .N .die NullFlags Z und das Carry-Bh C. Diese Anzeige gesdliebtso:I)DerRegisterinhall ~ A K < k I ! l . X - , y .Register) ist,groBer als dis Ver-gleichsdalen:Dann istqas Garly:-! :Ut=> 1 ,die N-und die' Z-Flagge ~ d .2) Der Reisteiinllall lst gleich.den Vergleichsdafen:Dann sind Ca.rry- unci ZFlagge = I, diaN-FJagge =Q,3) Der Registerihh~t ist ldeinetals die Verglelchsdaten:Dis NFJagge is! dann =1,Carry-un d ZeT0cFlagg~ sind O.Demit Sie'die ti'bersichI be hal-ten k6nfien, ist in BUd 1das gem-ze als Sohema gezeigt.

    Beginn des KopfesTextbeginnTextendeUbertragung$endeAnfrag.eBestatigungKlingelZuIil.dGetzenHorizo~taltahulat0rzeilenv0rse!1ubVertikaltabulatorFormatvorsehubW'agenriicklautlZeilen-wechselRiickschahun)JDauerumsh'altungDa:tenverbindungsum-sehaltunqGeratestsu:srung .N egativBestatigung"SynohronisaIiQn~~Lee~laufEnd of trahsmisslon Enae des Ubert.ra-bloek g)lngs.b1;>c.kesCAN Cancel AnnullferenEM End Q f meQium Datentrage:r:endeSUB Substitute EisetzenESe: Escape UmschaltungFS Fil~ lparatel Dateitrennzeicb:1il11GS Gr0~p; separator 6ruppenttennzeichenRS Record separator S


Recommended