***************************************¢* *¢* ASSEMBLER KURS III TEIL II *¢* *¢* (c) 1987 by Action! User Group *¢* *¢***************************************¢¢¢Heute wollen wir nocheinmal Ver-¢zweigungen behandeln¢¢Aus der Befehlstabelle koennen wir nun¢herausfinden, welches Flag auf welchem¢Wert stehen muss, damit ein Verzweig-¢ungs befehl zu einem anderen Befehl¢verzweigt.¢¢Wir haben im letzten Teil gelernt,dass¢Verzweigungsbefehle maximal 128 Bytes¢vor oder zurueck springen koennen.¢¢Wie wird das nun in Zahlen ausge-¢drueckt? Oder : Wie erkennt der¢Computer , dass er vor oder zurueck¢springen soll?¢¢Dazu muss man sich ansehen, wie Zahlen¢im Computer gespeichert werden:¢¢8 Bits werden wie bekanntlich zu einem¢Byte zusammengefasst. Die einzelnen¢Bits haben folgende Wertigkeiten:¢¢Bit Wertigkeit¢¢1 1¢2 2¢3 4¢4 8¢5 16¢6 32¢7 64¢8 128¢¢Man kann so Zahlen von 0 bis 255 dar-¢stellen. Wie werden aber negative¢Zahlen dargestellt ?¢¢Das 8. Bit wird einfach als Vorzeichen¢benutzt. Daraus resultiert aber, dass¢wir dann nur noch 7 Bits fuer die¢Betragsdarstellung zur Verfuegung¢haben. Und mit 7 Bits kann man Werte¢von 0 bis 127 darstellen.¢¢Also muss bei Rueckwaertsspruengen¢das 8. Bit auf 1 stehen.¢¢Dieses sollte nur den Hintergrund der¢Verzweigungsbefehle erlaeutern.¢Da wir ja mit einem Assembler arbeiten,¢braucht uns dies nicht weiter zu inter-¢essieren. Sollte die Sprungweite von¢128 Bytes ueberschritten werden, so ¢wird der Assembler einen Fehler aus-¢geben.¢¢---------------------------------------¢¢Wie beeinflussen Vergleichsbefehle die¢Flags in der 6502 ?¢¢Vergleiche gibt es immer nur zwischen¢den Registern (A,X,Y) und einer¢Speicheradresse. Bei Vergleichen werden¢die Flags N,Z,C beeinflusst:¢Folgende Tabelle zeigt dies:¢¢Vergleich N Z C¢¢A,X,Y <M 1 0 0¢A,X,Y =M 0 1 1 ¢A,X,Y >M 0 0 1¢¢Das N Flag bezieht sich immer auf das¢Zweier Komplement(also Zahlen von¢-128 bis +127) Wird spaeter noch er-¢klaert.¢¢Hier nun die verschiedenen Moeglich-¢keiten fuer Verzweigungen:¢¢A < M BCC Label¢A <=M BCC Label¢ BEQ Label¢A = M BEQ Label¢A >=M BCS Label¢A > M BEQ Nicht Label¢ (darf ja nicht gleich sein)¢A BCS Label¢¢¢Bei <= stehen 2 Verzweigungsbefehle,¢weil ja auch abgefragt werden muss,ob¢die beiden verglichenen Zahlen gleich¢sind. Es koennte aber so besser sein:¢(Basic Beispiel:)¢¢nicht : If A<=10 then ...¢sondern: if A<11 then ...¢¢¢---------------------------------------¢¢Spruegne:¢¢JMP = JuMP ¢¢Man schreib einfach JMP Label im Pro-¢gramm.(oder JMP adresse)¢Dies ist ein 3-Byte Befehl.¢¢Es gibt aber noch den indirekten Sprung¢¢Im Quelltext steht : JMP (Label) oder¢JMP (adresse).¢Label bezieht sich dann auf eine ¢Adresse, in der wiederum das eigent-¢liche Sprungziel steht.¢¢Nehmen wir an , in Adresse 1536 steht¢die Zahl 30000 (natuerlich hier als¢2-Byte Zahl).¢Schreibt man JMP(1536) dann springt¢der Computer nach adresse 30000 und ¢versucht den dort stehenden Befehl aus-¢zufuehren.¢¢---------------------------------------¢¢Unterprogramme:¢¢Unterprogramme sollten vom Basic her¢bekannt sein. Wir schreiben im¢Assembler nun nicht GOSUB Zeilennr.,¢sondern JSR Label oder Adresse.¢Das Unterprogramm muss mit RTS enden.¢(was einem 'RETURN' gleich kommt)¢¢Beispiel: (ohne Zeilennummern)¢¢ JSR UPRG¢ . ; hier geht's nach dem¢ . ; RTS weiter¢ .¢ und so weiter...¢¢¢ UPRG LDA #0¢ .¢ .¢ .¢ RTS¢¢Der 6502 speichert bei einem JSR die¢Adresse, wo der naechste Befehl ist,¢der nach dem RTS vom Unterprogramm aus-¢gefuehrt werden soll, auf dem Stack.¢¢Bei einem RTS wird diese Adresse vom¢Stack wieder runtergeholt und der ¢Programmzaehler mit diesen neuen Werten¢geladen.¢¢Bei Basic wuerde der Computer bei einem¢RETURN Befehl, vor dem aber kein GOSUB¢ausgefuert wurde,einen Fehler ausgeben.¢¢In Maschinensprache wird ein RTS immer¢ausgefuert. Deshalb kann es sein, dass,¢wenn man vorher NICHT mit JSR ge-¢sprungen ist , der Computer falsche ¢Werte vom Stack holt und somit an einer¢ganz falschen Adresse weiterarbeiten¢will. Dort koennen natuerlich total¢ungueltige Befehle stehen und das ¢System koennte abstuerzen !!!!!!¢¢Natuerlich koennen Unterprogramme auch¢oberhalb(im Speicher) des JSR Kommandos¢stehen. Auch koennen natuerlich ¢mehrere Unterprogramme ineinander ver-¢schachtelt werden. (soweit der Stack¢reicht).¢¢Wichtig ist , dass bei JSR und RTS¢die Register NICHT gerettet werden.¢¢Wenn mann die Registerwerte nach einem¢JSR noch braucht, und weis, dass bei¢dem angesprungenen Unterprogramm die¢Register veraendert werden, dann sollte¢man A,X,Y vorher speichern. Dazu bietet¢sich ebenfalls der Stack an:¢¢Vor dem JSR: ¢ PHA¢ TXA¢ PHA¢ TYA¢ PHA¢¢ nun sind alle Register auf dem Stack¢ gespeichert.¢ Dann kann der JSR folgen.¢¢vor dem RTS:¢ PLA¢ TAY¢ PLA¢ TAX¢ PLA¢¢ nun sind alle alten Registerwerte¢ wieder in den Registern.Der RTS kann¢ folgen.¢¢---------------------------------------¢¢