NEXT (6502)

Am Beispiel des Forth für den Rockwell AIM65 wird gezeigt, wie ein NEXT auch auf dem Prozessor Typ 6502 angelegt werden kann.

Im Gegensatz zu moderneren Prozessoren können die Register des 6502 ja keine indirekten Sprünge generieren, können also den program counter PC nicht indirekt laden. Aber es gibt den Jump-Opcode C6 der Indirektion ermöglicht. Dazu muss auf der Zero-Page des RAM ein Sprungvektor aufgebaut werden - die work address W. Außerdem muss dort auch der Zeiger auf das nächste Forthwort, der interpretive pointer IP, aufgehoben werden. Die Zeropage hat also die Funktion von Registern - so gesehen sogar komfortable 128 Register.

In der Memorymap des AIM65 lagen IP und W so beieinander in der zero page:

...
09F adr-H IP = Interpretive Pointer
0A0 adr-L
0A1 C6 Opcode = JMP(adr)
0A2 adr-H W = working address for jump to next forth word
0A3 adr-L
...

So kann dann mit Hilfe von IP und W auch auf dem 6502 ein flottes NEXT gebaut werden:

LABEL NEXT
1 # LDY, 
IP )Y LDA, W 1+ STA, ( W DEY, IP )Y LDA, W STA,
CLC,
IP LDA, 2 # ADC, IP STA, (IP CS IF, IP 1+ INC, THEN,
W 1- JMP, ( JMP(W-1) )

Ich hoffe die Forth-Assembler-Notation ist all denen geläufig, die hier vorbei kommen. Für die Freunde des Assembler hier das ganze noch mal:

LDY #1
LDA (IP),Y
STA W+1
DEY
LDA (IP),Y
STA W
CLC
LDA IP
ADC #02
STA IP
BCC "JUMP"
INC IP+1
"JUMP" JMP W-1 ...
"W-1" JMP (W)

Immerhin 13 Befehle und 39 bzw. 41 Zyklen (wenn IP ueber die Seitengrenze geht). Bei einem damals gebräuchlichen Takt von 1MHz, also 1 Mikrosekunde je Takt, schon eine kleine Ewigkeit.


Übrigens wird dieser Prozessor noch heute von einer 6502-Fan-Gemeinde weiter gepflegt, insofern ist die Betrachtung nicht rein historisch zu verstehen.

Im obsolete computer museum gibts auch den AIM65 zu sehen. Dank an Rolf Schöne für den Link.