VolksForth 6502 Assembler#

tab content 1

Der 6502-Assembler#

Im folgenden werden die Konzepte des 6502-Assemblers für VolksForth dargestellt. Es wird kein vollständiges Glossar angegeben, da die Mnemonics des Assemblers allen Maschinensprache-Programmierern vertraut sein dürften. Eine genaue Darstellung der Funktionsweise findet sich in den FORTH DIMENSIONS, Vol III,5 p. 143ff . Im folgenden wird eine kurze Zusammenfassung angegeben sowie Änderungen gegenüber dem Original dargestellt.

Dis Funktionsweise des Adrsssintbryreters powis'Ger Routine' NEXTwird in Kapitel 2 dargests11t. Der 6502-Assembler gi..stattst strukturis~rteProgrammer,ru>ra'.l,".Di e Strukturelements sind arialog"zu den Ko'ntrolls't'ruktureri dp, Forth aufgebaut , tragen jedoch andsrs Namsn. um <lie Verwechsslungsgefahr zu vsrringern und die Ubereich't'ai hk~eit.' zu srhohen. EinBeispiel: cc ? <ausdruckl > <ausdruck2' ~, cc steht,fgr "condit'ion cods" . < ausdruckl: w ird ausgefiihrt;, wsnn cc zutrifft , andernfalls <ausdruck2> . Dsr Teil ]No InterWiki reference defined in properties for Wiki called " <ausdruck2> kann auch wsggelagsenwerden. Das Analognn in Fo'ri;h ist I F ELSE ... THEN Beachtsn Sie bitte, da!3vor'?[i mmer(!) ein c nndi?inncode stshen mu!3. Au!3erdem findetkeine PrOfi>ng auf k orrekte V srschachtelung der Kontrollstrukt'uren statt . Weitere Kontrollstrukturen sind-' [ [ <ausdruckl > cc '?[ [ <ausdruck2"! ] ? [ <ausdruckl > cc ?] <ausdruckl> ]] Die analogen Ausdrttcke in Forth waren B EGIN <ausdruckl > WHILE <augdruck2> REPE]iT B EGIN <ausdruckl > UNTIL, BEGIN <ausdruckl> REPEAT Auch hier darf bei den Assemblerwortsn , cc nicht weggelassen wsrdsn. Aul3erdsm ist nur gsnau sin „,".f zwischpn ! f und ]'? zulgssig. Bsachten Sie bit'te such den Unt'erschied zwischnn ] ] und ]]? ! Als condition code sind zulgssig 0= 0<> 0< 0>= CS CC VS VC

Sie k6nnen den Prozessor-Flags Z N C und V ugeordnet werden. Im'ersten Beispiel wird also <ausdruckl) ausgefQhrt, warmoc durch 0= ersetzt wird und das Z-Flag gesetzt iytJeden der condition codes kann man durch ein folgendes NOT„erwjitern,' also z.B.: 0=NOT? 00lda ? Neben allen anderen Og>codes mit ihren Adressierungsarten gibt es auch die Sprunge BCC BCSukw.Sie si.ndnur"'i.nder Adressierungsart Absolut zulgssig,+ .h. auf dern Stack befindet sich die Adresse desSprungziples. Liegg 'diese Adresse au()erhalb des m6glicgen Ber ichjs, so wi'rd die Fehlermeldung "out of range" ausgegeben, FQrdie anderenOpcodessind, je nachBefehl, die folgenden Adressierungsarten zulassig: .A0.X,YX))Y Di e Adressi erungsart Absolut wi rd verwendet , wenn keine andere angegeben wurde. baird mit einemMnemonic cine nicht erlaubte Adressi erungsar t verwendet , so wi r d di e Fehl ermel dung "invalid" ausgegeben. Beispiele fQr die Verwendung des 6502-Assemblers (zur Erlauterung wird die herkommliche Notation hinzugefQgt) ,arol rola 1 0 ldy data ,X sta $6 x) adc vector )y lda vector ) jmp ldy g1 sta data,x adc ($6.x) lda (vector}.y jmp (vector) Zusgtzlich enthglt das System noch mehrere Macros',die alla nur Absolut adressieren konnen: wine — Inkrementiert' einen 16-Bit-Zeiger um 1. wdec dekrementiert analog. 2inc — Inkrementiert einen 16;Bit-Zeiger um 2; 2dec dekrementiert analog.

c
—Schaltet den Aszembler ab'und'den'Forth-Compiler an. Damit ist es mogli'ch",'"'vo'n Maschinenyode in For'th Qberzuwechseln. Ein GegenstQck 1st nicht vbrhanden.
Ein Beispiel fQr die Verwendung von ;C: ist 0<.'I' ;c:,"Fehler"; Assembler ]?

Ist irgendwas kleiner als Hull , so wird "Fehler" ausgedruckt und die Ausfghrung des Wortes abgebrochen, sonst geht es weiter im Code. Schlie(31ich gibt es noch die Worte >LABEL und LABEL >LABEL erzeugt ein Label im Heap, wobei es den Wert des Labels vom Stack nimmt . LABEL erzeugt ein Label mit dern Wert von HERE. Beispiel: Label schleife dex schleife bne Ein Codewort mu(3 letztendlich immer auf NEXT JMPfghren, damit der Adressinterpreter weiter arbeitet . Im folgenden Glossar werden Kcnstanten angegeben, auf die gesprungen werden kann und dieWerteaufdenStackbringenbzw.vonihm entfernen. Wichtig ist insbesondere die Routine SETUP. Sie kopiert die Anzahl von Werten, die im Akkumulator angegeben wird,in denSpeicherbereichabH . FGr den Zugriff auf den Stack wird, soweit das moglich ist, die Benutzung derWorte SETUPu nd P USH... empfohlen. Das reicht allerdings haufig nicht aus. In diesem Fall kann man die Werte auf dern Stack folgenderma(3en zugreifen'­ SPx) lda Das untere Byte des ersten Wertes SP )y lda Das obere Byte des ersten Wertes sowie durch Setzen des Y-Registers auch die zweiten, dritten etc. Werte. Beachten Sie bitte, das in HEXT verlangt wird, da(3 das X-Register den Inhalt $00 und das Y-Register den I nhalt $01 hat . Das wurde im obigen Beispiel ausgenutzt . Beispiele fur Assemblercode in Forth, denwir als gut empfinden, sind unter Anderem die Worte FILL und -TRAILING Wollen Sie Assembler programmieren, so sollten Sie sich diese Worte und noch einige andere ansehen. Beim Assemblerprogrammieren mug beachtet werden, da() ultraFORTH das ROM abschaltet . Daher mGssen Lesezugriffe ins ROM etwas anders organi si er t warden. Beispiel fGr den C16: ffd2 jsr springt cine RAM-Routine an. ff3e sta ffd2 jsr ff3f sta springt sine ROM-Routine an. Sie funktioniert nur , wenn sie im unteren RAM-Bereich (<68000) steht. Sonst folgen undefinierte Reaktionen. Beim C64 ist cine Bankumsehaltung nur fur Lesezugriife in das BASIC-ROM erforderlich. Hierbei ist zusatzlich zu beachten, dag cine Bankumschaltung mi t SEI vorbereitet werden mug, da andernfalls der periodische Tastaturinterrupt zu einem Absturz fuhren wGrde. AufdernC16istkein SEI erforderlich, daimRAMder Vektor SFFFE auf aine .eigene Interruptroutine zeigt (sie benotigt ca. 1 Promille der Rechenzeit). Aus dern gleichen Grund fGhrt sine BRK—Instruktion zwar weiterhin in den Monitor, allerdings mit falschemRegisterdump, da der Monitor auf dem Stack die Daten derInterruptroutine statt d er R egister v orfindet.

PushA lushea -- addr E inc„constants, di g died r eis a gj n &Naschin enlcodI sequenz enth~51t,diedenInhaltfes,/au~vszetc~p hdteCa&uden Datenstack legt und dann zu NEXT springt. Wit4 ala letzter Sprungbefehl in Cade-Worten benutzt, -- addr Eine Konstante, die die Adr esse einer Naschinencode-Sequenz enthalt,~dipdeqInh+dgs.Akp~aufdp+a wgy+Qedes,<z DatenetaCka@ablegtt~DpS High-Byte pirpggrrundSktxgiChyuf 0 gesetzt. Anschl less@4 wird zuNEXTagMej gj agan. w ird, als letzterSprungbefehll ip CoudeTWorteyb pnutzt.> t Eine Konstante, diep ie~Adrysse+n er I chittencode-sequenz enthal t, die den Inhalt des Akiku aides: '-By&a aufZen Daterrstack Iegt,Das,po@-B~p~s ei~vpga~zr spa ck gehol1 undmuB vjirhgq dor'gep+n naden~ Ansch1iessendrwirdzpNEXTgeqpy~u~e p+W+p4lais 1etxter Spr ungbef ehl i n Cade-War ten Ibenuti k ~ EtnaKonptante~diedieAprpssevs - NEXTaufdyn Datenstack legt. Wird als letiter Befehl in Code-Warten b enut z t . xyNext '44" WisNEXT1 edocljwerde@vierhergs -Reg~iUaq+t ip.un' das .Y-Registej si t „I, gplqdey g a s + e rwgrget, glundsatz1ichheiAufgufvga, +Exf i ((zapPertein Zen Registern. Ansansten t eagiert es mit~lbs+urz. P ut s Pap Popiwa. ie e '' .X: "rs N, ~v v addr Eine Konstante, die die Adressesin g Maschinencade-Sequenz enthalt, die den Akku als Low-Byte auf den Datenstack ,ablleg+rDae+ilgiV-BytelWlrd ni~ rEnder+ QbenakWir4im Segensgtztzu ~RUSHaein@EIatzzauf demkpatenstack.a geschaffen. Anschl iessend wird+PEXT durchlaufen. Nit'ti als letzter Befehl in Cade-Worten benutzt 'PaddI'+ r ! @ Eine"Kanstante;,;ddeAs sAdresse e ineyN aschilnencbde-sequenz enthhl t,dde~Aas aberste..EIeaent~ma~a tehstack W ntMr nt. Anschl iessend wird zu NExT +gespttlingenl wirtl ala 1st'zter ,Sprungbefeh1 in Cade-Warten~benutzt.,u~> l'vt re/addrr~r@rg wairrt".tA".rl eimtl@teM4. Eine Kanstante, die die Adresse einer N aschinenca4e Mg uenz ent hakt r <die d &a;aber,stenlbe idsn Elementet vaa) DaEellst'ack .-entfernt. Anschliessend"NirdazuiNEXT-'gesprungen.Adilrti,als 'letzter S prungbefehl i n..Cade-Worten benutzt".t, .'e

Einc Konstante, die die Adresse des Returnstackpointers cnthal t. addr Eine Konstante, die die Adresse des Userpointers, also des Offsets zu ORIGlN enthalt. -- addr Eine Kanstante, die die Adresse dcs Datenstackpaintcrs e nthalt . -- addr Eine Kanstantc, die die Adrcsse des lnstruktianspointers der Forth-Naschine enthalt . Dieser zeigtauf das ) swells nachste abzuarbeitende Wart. Crd dl Eine Kanstante, die die Adrcsee des Mart-Pointers der Farth­ Naschine enthalt. Dieser zeigt auf das jewel legerade bearbeitete Mort. add t' Eine Kanstante, die die Adresse since Speicherbereichs in der Zeropagc enthaltc der dern Anwendcr zur Verfuguhg steht. aclcit' Eine Kanstante, die die AdresseeinerMaschinencode-Secluenz enthalt, die n Elemente vam Datenstack abbaut und bei ablegt. Die Anzahl n mus im Akku stehen, wenn SETUP als Subrautine angesprungenccird.Dasoberste Elementdes Datenstacks1iegt Bci N , daszweite bci N+2 etc~Zum Schlug werden X- und Y-Register auf S bzw. l gesetzt. addrl addr2 -" ) D ieses Assemblermakro assembliert cine Seyuenz, di e bei Ausfuhruny den lnhalt des Wortes anaddrl mit d em Inhalt des Wortes an addr2 vergleicht. Anschlie()end ist das Carry-Slag high, wenn der Inhalt von addr1 grdperadergleichdemlnhalt vonaddr2 ist. Bs werden der Akku sowiedie Statusregisterflags C 2 0 Wverlndert. (--) lCakro. Schaltet bei AusfGhrung auf cine andere Spei­ cherbank. Di e genaue Wirkungsweiseist maschinenab­ h hngi g . (--) Nakro. Schaltet bei AusfGbrung auf sine andere Spei­ cherbank. Die genaue Wirkungsweiseist maschinenab­ h kngi g . adclr (addr-- ) Makro.Schaltet b ei A usfuhrung auf mit Systemroutinen und Mhrt jsr aus. Die genaue Wirkungsweise ist maschinenabhangig