9.3. XForth

$Header: /home/radek/cvs/forth-book/sec-xforth.xml,v 1.1 2003/12/28 18:21:56 radek Exp $

FIXME: obsah

Hlavička slova LIT

NFA_LIT:    BYTE $83, "LIT"
LFA_LIT:    WORD 0
CFA_LIT:    WORD PFA_LIT

Tělo, kód slova je uložen v poli PFA

PFA_LIT:    LDA (IP),Y  ; Lo-Byte der inline folgenden Zahl holen
            PHA         ; und auf den Stack retten
            INC IP      ; Instruction-Pointer inkrementieren
            BNE L30
            INC IP+1
L30:        LDA (IP), Y ; Hi-Byte der inline folgenden Zahl holen
L31:        INC IP      ; Instruction-Pointer inkrementieren
            BNE PUSH
            INC IP+1

PUSH:       DEX         ; Datenstack-Pointer dekrementieren
            DEX

PUT:        STA 1,X     ; Hi-Byte (ist in A) auf den Datenstack legen
            PLA         ; Lo-Byte vom Stack holen
            STA 0,X     ; und auf den Datenstack legen

Der Adressinterpreter NEXT holt die Adresse des naechsten Secondaries und fuehrt es aus.

NEXT:       LDY #1
            LDA (IP),Y  ; Hi-Byte der Wortadresse
            STA W+1     ; im W-Register ablegen
            DEY
            LDA (IP),Y  ; Lo-Byte der Wortadresse
            STA W       ; im W-Register ablegen
            CLC
            LDA IP      ; IP um 2 inkrementieren
            ADC #2
            STA IP
            BCC L54
            INC IP+1
L54:        JMP W-1     ; indirekten Sprung nach (W) ausfuehren

DOCOL:
            ; -(RSP)=IP
            LDA IP+1
            PHA
            LDA IP
            PHA

            ; IP=W+2
            CLC
            LDA W
            ADC #2
            STA IP
            TYA
            ADC W+1
            STA IP+1
      
            ; JUMP NEXT
            JMP NEXT

EXIT:
            ; IP=(RSP)+
            PLA
            STA IP
            PLA
            STA IP+1
            ; JUMP NEXT
            JMP NEXT