This page (revision-16) was last changed on 03-Feb-2023 15:21 by Carsten Strotmann 

This page was created on 25-Apr-2010 09:12 by Carsten Strotmann

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
16 03-Feb-2023 15:21 10 KB Carsten Strotmann to previous
15 25-Apr-2010 10:56 8 KB Carsten Strotmann to previous | to last
14 25-Apr-2010 10:45 6 KB Carsten Strotmann to previous | to last
13 25-Apr-2010 10:37 5 KB Carsten Strotmann to previous | to last
12 25-Apr-2010 10:29 3 KB Carsten Strotmann to previous | to last
11 25-Apr-2010 10:29 3 KB Carsten Strotmann to previous | to last
10 25-Apr-2010 10:26 3 KB Carsten Strotmann to previous | to last
9 25-Apr-2010 10:19 2 KB Carsten Strotmann to previous | to last
8 25-Apr-2010 10:17 2 KB Carsten Strotmann to previous | to last
7 25-Apr-2010 09:49 1 KB Carsten Strotmann to previous | to last
6 25-Apr-2010 09:48 1 KB Carsten Strotmann to previous | to last
5 25-Apr-2010 09:48 1 KB Carsten Strotmann to previous | to last
4 25-Apr-2010 09:22 9 KB Carsten Strotmann to previous | to last
3 25-Apr-2010 09:20 9 KB Carsten Strotmann to previous | to last
2 25-Apr-2010 09:20 9 KB Carsten Strotmann to previous | to last
1 25-Apr-2010 09:12 9 KB Carsten Strotmann to last

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 3 added 6 lines
(work in progress, translation pending)
Source: [6502 Assembler]
See also: [6502 Assembler in Forth]
At line 14 added one line
[{TableOfContents }] \\
At line 13 changed 3 lines
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
Die Funktionsweise des Adressinterpreters sowie der Routine NEXT wird in [Kapitel 2 des VolksForth Handbuch|VFHandbuchKapitel2] dargestellt. Der 6502-Assembler gestattet strukturierte Programmierung. Die Strukturelemente sind analog zu den Kontrollstrukturen des Forth aufgebaut, tragen jedoch andere Namen, um die Verwechselungsgefahr zu verringern und die Übersichtlichkeit zu erhöhen.
Ein Beispiel:
{{{
cc ?[ <ausdruck1> ][ <ausdruck2> ]?
}}}
cc steht fur "condition code" . <ausdruck1> wird ausgeführt, wenn cc zutrifft, andernfalls <ausdruck2>. Der Teil
{{{
At line 17 changed 9 lines
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
}}}
kann auch weggelassen werden. Das Analogon in Forth ist IF ELSE ... THEN
At line 27 changed 17 lines
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 iyt~ Jeden 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 ]?
Beachten Sie bitte, das vor {{{?[}}} immer(!) ein conditioncode stehen muß. Außerdem findet keine Prüfung auf korrekte Verschachtelung der Kontrollstrukturen statt.
At line 45 changed 13 lines
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.
Weitere Kontrollstrukturen sind:
{{{
[[ <ausdruck1> cc ?[[ <ausdruck2> ]]?
[[ <ausdruck1> cc ?]
[[ <ausdruck1> ]]
}}}
At line 59 changed 24 lines
PushA
lushea
-- addr E inc„constants, di g di~ ed 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~v~ pga~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
Die analogen Ausdrucke in Forth sind:
{{{
BEGIN <ausdruck1> WHILE <ausdruck2> REPEAT
BEGIN <ausdruckl> UNTIL
BEGIN <ausdruck1> REPEAT
}}}
Auch hier darf bei den Assemblerworten cc nicht weggelassen werden. Außerdem ist nur genau ein {{{?[[}}} zwischen {{{[[}}} und {{{]]?}}} zulässig. Beachten Sie bitte auch den Unterschied zwischen {{{]]}}} und {{{]]?}}} !
At line 84 changed 20 lines
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
Als condition code sind zulässig:
{{{
0= 0<> 0< 0>= CS CC VS VC
}}}
Sie konnen den Prozessor-Flags Z N C und V zugeordnet werden. Im ersten Beispiel wird also <ausdruck1> ausgeführt , wenn cc durch 0= ersetzt wird und das Z-Flag gesetzt ist. Jeden der condition codes kann man durch ein folgendes NOT erweitern, also z.B.:
{{{
0= NOT ?[ 0 # lda ]?
}}}
Neben allen anderen Opcodes mit ihren Adressierungsarten gibt es auch die Sprünge BCC, BCS usw. Sie sind nur in der Adressierungsart "Absolut" zulässig, d.h. auf dem Stack befindet sich die Adresse des Sprungzieles. Liegt diese Adresse außerhalb des moglichen Bereiches, so wird die Fehlermeldung "out of range" ausgegeben.
Für die anderen Opcodes sind, je nach Befehl, die folgenden Adressierungsarten zulassig:
{{{
.A
#
.X
,Y
X)
)Y
)
}}}
Die Adressierungsart "Absolut" wird verwendet, wenn keine andere angegeben wurde. Wird mit einem Mnemonic eine nicht erlaubte Adressierungsart verwendet, so wird die Fehlermeldung "invalid" ausgegeben.
Beispiele für die Verwendung des 6502-Assemblers (zur Erläuterung wird die herkömmliche Notation hinzugefügt):
{{{
.a rol -> rol a
1 # ldy -> ldy #1
data ,X sta -> sta data,x
$6 x) adc -> adc ($6,x)
vector )y lda -> lda (vector),y
vector ) jmp -> jmp (vector)
}}}
Zusatzlich enthalt das System noch mehrere Macros, die alle nur "Absolut" adressieren konnen:
!winc
Inkrementiert einen 16-Bit-Zeiger um 1. wdec dekrementiert analog.
!2inc
Inkrementiert einen 16-Bit-Zeiger um 2. 2dec dekrementiert analog.
!;c:
Schaltet den Assembler ab und den Forth-Compiler an Damit ist es möglich, von Maschinencode in Forth überzuwechseln. Ein Gegenstuck ist nicht vorhanden.
Ein Beispiel für die Verwendung von {{{;C:}}} ist:
{{{
... 0< ?[ ;c: ." Fehler" ; Assembler ]? ...
}}}
Ist irgendwas kleiner als Null, so wird "Fehler" ausgedruckt und die Ausführung des Wortes abgebrochen, sonst geht es weiter im Code.
! >LABEL und LABEL
Schließlich 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
}}}
! NEXT
Ein Codewort muß letztendlich immer auf {{{NEXT JMP}}} führen, damit der Adressinterpreter weiter arbeitet. Im folgenden Glossar werden Konstanten angegeben, auf die gesprungen werden kann und die Werte auf den Stack bringen bzw. von ihm entfernen. Wichtig ist insbesondere die Routine SETUP. Sie kopiert die Anzahl von Werten, die im Akkumulator angegeben wird, in den Speicherbereich ab N.
! Zugriff auf den Stack
Für den Zugriff auf den Stack wird, so weit das möglich ist, die Benutzung der Worte {{{SETUP}}} und {{{PUSH ...}}} empfohlen. Das reicht allerdings häufig nicht aus. In diesem Fall kann man die Werte auf dem Stack folgendermaßen zugreifen:
{{{
SP x) 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 NEXT verlangt wird, daß das X-Register den Inhalt $00 und das Y-Register den Inhalt $01 hat. Das wurde im obigen Beispiel ausgenutzt.
Beispiele fur Assemblercode in Forth, den wir als gut empfinden, sind unter Anderem die Worte {{{FILL}}} und {{{-TRAILING}}} (im VolksForth Kernel). Wollen Sie Assembler programmieren, so sollten Sie sich diese Worte und noch einige andere ansehen.
! ROM Zugriff auf Commodore Maschinen
Beim Assemblerprogrammieren muß beachtetwerden, daß VolksForth das ROM abschaltet (bei Commodore Maschinen). Daher müssen Lesezugriffe ins ROM etwas anders organisiert warden. Beispiel fur den C16:
{{{
ffd2 jsr \ springt eine RAM-Routine an.
ff3e sta ffd2 jsr ff3f sta \ springt eine ROM-Routine an.
}}}
Sie funktioniert nur , wenn sie im unteren RAM-Bereich (<$8000) steht . Sonst folgen undefinierte Reaktionen.
Beim C64 ist eine Bankumschaltung nur für Lesezugriffe in das BASIC-ROM erforderlich. Hierbei ist zusätzlich zu beachten, daß eine Bankumschaltung mit {{{SEI}}} vorbereitet werden muß, da andernfalls der periodische Tastaturinterrupt zu einem Absturz führen wurde.
Auf dem C16 ist kein {{{SEI}}} erforderlich, da im RAM der Vektor $FFFE auf eine eigene Interruptroutine zeigt (sie benotigt ca. 1 Promille der Rechenzeit). Aus dem gleichen Grund fuhrt eine BRK-Instruktion zwar weiterhin in den Monitor, allerdings mit falschem Registerdump, da der Monitor auf dam Stack die Daten der Interruptroutine statt der Register vorfindet.
!! Glossar
! PushA ( -- addr )
Eine Konstante, welche die Adresse einer Maschinencode-Sequenz enthält, die den Inhalt des Akku vorzeichenbehaftet auf den Datenstack legt und dann zu NEXT springt. Wird als letzter Sprungbefehl in Code-Worten benutzt.
! Push0A ( -- addr )
Eine Konstante, welche die Adresse einer Maschinencade-Sequenz enthät, die den Inhalt des Akku auf das Low-Byte des Datenstacks ablegt. Das High-Byte wird grundsätzlich auf 0 gesetzt. Anschliessend wird zu NEXT gesprungen. Wird als letzter Sprungbefehl in Code-Worten benutzt.
! Push ( -- addr )
Eine Konstante, welche die Adresse einer Maschinencode-Sequenz enthält, die den Inhalt des Akku als High-Byte auf den Datenstack legt. Das Low-Byte wird vom Prozessorstack geholt und muß vorher dort abgelegt worden sein. Anschliessend wird zu NEXT gesprungen. Wird als letzter Sprungbefehl in Code-Worten benutzt.
! Next ( -- addr )
Eine Konstante, die die Adresse von NEXT auf den Datenstack legt. Wird als letzter Befehl in Code-Worten benutzt.
! xyNext ( -- addr )
Wie NEXT, jedoch werden vorher das X-Register mit 0 und das Y-Register mit 1 geladen. Das System erwartet grundsätzlich bei Aufruf von NEXT diese Werte in den Registern. Ansonsten reagiert es mit Absturz.
! PutA ( -- addr )
Eine Konstante, welche die Adresse einer Maschinencode-Sequenz enthält, die den Akku als Low-Byte auf den Datenstack ablegt. Das High-Byte wird nicht verändert, ebenso wird im Gegensatz zu PUSH kein Platz auf dem Datenstack geschaffen. Anschliessend wird NEXT durchlaufen. Wird als letzter Befehl in Code-Worten benutzt.
! Pop ( -- addr )
Eine Konstante, welche die Adresse einer Maschinencode-Sequenz enthält, die das oberste Element vom Datenstack entfernt. Anschliessend wird zu NEXT gesprungen.Wird als letzter Sprungbefehl in Code-Worten benutzt.
! PopTwo ( -- addr )
Einc Kanstante, welche die Adressee einer Maschinencade-Sequenz enthält, welche die obersten beiden Elemente vom Datenstack entfernt. Anschliessend wird zu NEXT gesprungen. Wird als letzter Sprungbefehl in Code-Worten benutzt.
! RP ( -- addr )
Eine Konstante, welche die Adresse des Returnstackpointers enthält.
! UP ( -- addr )
Eine Konstante, welche die Adresse des Userpointers, also des Offset zu ORIGIN enthält.
! SP ( -- addr )
Eine Konstante, welche die Adresse des Datenstackpointers enthält.
! IP ( -- addr )
Eine Konstante, welche die Adresse des Instruktionspointer der Forth-Maschine enthält. Dieser zeigt auf das jeweils nächste abzuarbeitende Wort.
! W ( -- addr )
Eine Konstante, welche die Adresse des Wort-Pointers der Forth­-Maschine enthält. Dieser zeigt auf das jeweils gerade bearbeitete Wort.
! N ( -- addr )
Eine Konstante, welche die Adresse eines Speicherbereichs in der Zeropage enthält, der dem Anwender zur Verfügung steht.
! setup ( -- addr )
Eine Konstante, welche die Adresse einer Maschinencode-Sequenz enthält, die n Eleaente vom Datenstack abbaut und bei N ablegt. Die Anzahl n muß im Akku stehen, wenn SETUP als Subroutine angesprungen wird. Das oberste Element des Datenstacks liegt bei N, das zweite bei N+2 etc. Zum Schluß werden X- und Y-Register auf 0 bzw. 1 gesetzt.
! wcmp ( addr1 addr2 -- )
Dieses Assemblermakro assembliert eine Sequenz, die bei Ausfuhrung den Inhalt des Wortes an addr1 mit dem Inhalt des Wortes an addr2 vergleicht. Anschließend ist das Carry-Flag high, wenn der Inhalt von addr1 größer oder gleich dem Inhalt von addr2 ist. Es werden der Akku sowie die Statusregisterflags C Z O N verändert.
! ram ( -- )
__Commodore__
Makro. Schaltet bei Ausführung auf eine andere Speicherbank. Die genaue Wirkungsweise ist Maschinenabhängig.
! rom ( -- )
__Commodore__
Makro. Schaltet bei Ausführung auf eine andere Speicherbank. Die genaue Wirkungsweise ist Maschinenabhängig.
! sys ( addr -- )
__Commodore__
Makro. Schaltet bei Ausführung auf eine Speicherbank mit Systemroutinen und führt einen Sprung zu addr aus. Die genaue Wirkungsweise ist Maschinenabhängig.