Code: Select all
IF flag -- C,I,79
-- sys (compiling)
Used in the form:
flag IF ... ELSE ... THEN
or
flag IF ... THEN
If flag is true, the words following IF are executed and the
words following ELSE until just after THEN are skipped. The
ELSE part is optional.
If flag is false, the words from IF through ELSE , or from
IF through THEN (when no ELSE is used), are skipped. sys is
balanced with its corresponding ELSE or THEN .
See: "9.9 Control Structures"
Code: Select all
MOVF INDF,W ; read lower byte from stack
INCF FSR,F
IORWF INDF,W ; bitwise OR with higher byte from stack
INCF FSR,F
IORLW 0 ; set Z flag based on result
BTFSC STATUS,2 ; skip if Z=0
GOTO 0 ; goto if Z=1
Далее компилируем как обычно и при нахождении ELSE пишем:
Code: Select all
GOTO 0 ; goto to the end
ELSE_LABEL:
Потом добираясь таки до THEN (по русски говоря ENDIF), просто вытаскиваем из системного стека адрес GOTO и корректируем его, прописывая в нём текущий адрес компиляции. Такой подход позволяет обработать оба случая - и с ELSE, и без.
P.S. Так как адреса у нас короче 64K, то старшие биты сохраняемых на стеке адресов (которых при 13-битном адресе имеется целых 3) можно использовать для тегирования сохраняемого, чтобы вылавливать случаи, когда юзер запутавшись пишет LOOP после IF или THEN без IF...