section id="ff1802.plus" xreflabel="+", xref.ff1802.plus, link.ff1802.PLUS
Funkce sečte dvě hodnoty na vrcholu zásobníku (TOS a NOS), obě odstraní a místo nich uloží na zásobník výsledek. Zásobníkový efekt se dá tedy popsat takto
( a b → a+b )
Nejdříve se podíváme na hlavičku. Protože slovo + je definováno jako nízkoúrovňové a je přímo popsáno strojovým kódem, ukazuje CFA na PF.
000919 03F3 81AB .DW H'81AB ; + 000920 03F5 03E6 .DW ZLESS - 5 000921 03F7 03F9 PLUS: .DW * + 2; CFA→PF containg machine code
V první části kódu se do PSP zkopíruje do pomocného registru R8.
; PSP→R8 000922 03F9 89 GLO R9 000923 03FA A8 PLO R8 000924 03FB 99 GHI R9 000925 03FC B8 PHI R8
V této chvíli vypadá stav zásobníku a registrů PSP a R8 jak je ukázáno na obrázku 8.1 – „Stav zásobníku při vykonávání slova +“ část a). Oba dva registry PSP i R8 ukazují na stejný bajt a to horní část buňky TOS. Následuje posunití obou ukazatelů, R8 dolů a PSP nahoru tak že oba ukazují na dolní bajty NOS a TOS. Registr R8 je také nastaven jako indexový registr.
; now both PSP and R8 points to TOS, as you
; can see in figure 8.1 – „Stav zásobníku při vykonávání slova +“ part a).
000926 03FD 28 DEC R8 ; R8-=1
000927 03FE E8 SEX R8 ; R8 is index register
000928 03FF 19 INC R9 ; PSP+=1; points to TOS.loStav zásobníku nyní odpovídá obrázku 8.1 – „Stav zásobníku při vykonávání slova +“ část b). Následuje sečtení dolních bajtů TOS a NOS a jejich uložení do dolního bajtu NOS.
; PSP points to TOS.lo and R8 to NOS.lo as
; you can see in figure 8.1 – „Stav zásobníku při vykonávání slova +“ part b).
000929 0400 09 LDN R9 ; (PSP)→D ; D=TOS.lo
000930 0401 F4 ADD ; D,DF←TOS.lo+NOS.lo
000931 0402 73 STXD ; →(R8-); store to NOS.lo
000932 0403 29 DEC R9 ; PSP points to TOS.hiV tomto okamžiku ukazují PSP na TOS.hi a R8 na NOS.hi. V NOS.lo je již uložen součet dolních bajtů TOS a NOS. Následuje sečtení horních bajtů TOS a NOS a příznaku DF přetečení předchozí operace sčítání. Výsledek je uložen do NOS.hi na který ukazuje registr R8.
; PSP points to TOS.hi and R8 to NOS.hi as
; displayed in figure 8.1 – „Stav zásobníku při vykonávání slova +“ part c).
000933 0404 09 LDN R9 ; (PSP)→D ; D=TOS.hi
000934 0405 74 ADC ; D,DF←DF+TOS.hi+NOS.hi
000935 0406 58 STR R8 ; →(R8)Následuje poslední část kódu, korekce PS. Posuneme PSP o dvě pozice dolů, takže ukazuje na dřívější NOS, nynější nové TOS. Stav zásobníku v této chvíli ukazuje obrázek 8.1 – „Stav zásobníku při vykonávání slova +“ část d). Jako poslední instrukce je přepnutí na smyčku vnitřního interpretu které ukončuje kód slova +.
000936 0407 29 DEC R9 ; PSP-=2
000937 0408 29 DEC R9
; the old TOS is droped and new contains
; the sum. See figure 8.1 – „Stav zásobníku při vykonávání slova +“ part d).
000938 0409 DC SEP RC ; nextNásledující obrázek ukazuje stav zásobníku v jednotlivých fázích.
Obrázek 8.1. Stav zásobníku při vykonávání slova +
a) b) c) d)
+--------+ +--------+ +--------+ +--------+
| TOS.lo | PSP->| TOS.lo | | TOS.lo | | |
R8,PSP->| TOS.hi | | TOS.hi | PSP->| TOS.hi | |--------|
| NOS.lo | R8->| NOS.lo | | NOS.lo | | TOS.lo |
| NOS.hi | | NOS.hi | R8->| NOS.hi | PSP->| TOS.hi |
| | | | | | | NOS.lo |