8.1.21. +plus

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 |