words/doplusloop.asm

Jump to Vocabulary

; ( n1 -- )
; R(llimit counter -- limit counter+n1|)
; runtime of +loop
;VE_DOPLUSLOOP:
;    .db 7, "(+loop)"
;    .dw VE_HEAD
;    .set VE_HEAD = VE_DOPLUSLOOP
XT_DOPLUSLOOP:
    .dw PFA_DOPLUSLOOP
PFA_DOPLUSLOOP:
    pop zl
    pop zh
    add zl, tosl
    adc zh, tosh
    loadtos
PFA_DOPLUSLOOP4:   ; entry point for (loop)
    pop temp2
    pop temp3
    cp zl, temp2
    cpc zh, temp3
    sbrs tosh, 7 ; if msb is set, increment is negative. in that case skip the next instruction
    rjmp PFA_DOPLUSLOOP2 ; jump to test for positive overflow
    brlt PFA_DOPLUSLOOP1 ; exit if underflow
    rjmp PFA_DOPLUSLOOP3
PFA_DOPLUSLOOP2:
    brge PFA_DOPLUSLOOP1 ; exit if overflow
PFA_DOPLUSLOOP3:
    ; next iteration
    push temp3
    push temp2
    push zh
    push zl
    rjmp PFA_DOBRANCH ; read next cell from dictionary and jump to its destination
PFA_DOPLUSLOOP1:
    pop  temp0
    pop  temp1  ; remove leave destination
    adiw xl, 1  ; skip branch-back address
    rjmp DO_NEXT

Jump to Vocabulary