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...
 
				

