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.lo
Stav 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.hi
V 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 ; next
Ná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 |