***************************************›* *›* 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 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.››---------------------------------------››