(NEXT): различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Строка 48: Строка 48:
  734 XNEXIT:        PPRM9044 PPRM9044              ; Пропустить адрес перехода
  734 XNEXIT:        PPRM9044 PPRM9044              ; Пропустить адрес перехода
  735                GOTO JUNLOOP
  735                GOTO JUNLOOP
736 JLEV:          2  GOTO NLEV                    ; Обработчик RDROP
</pre>
</pre>



Версия от 06:29, 9 ноября 2017

(NEXT) — служебное слово Каллисто, лишённое заголовка. Конец цикла со счётчиком в шитом коде.

(NEXT)         ( −− )                               Конец цикла со счётчиком в шитом коде (слово без заголовка).

Служебное слово (NEXT) компилируется в шитый код словом NEXT. Нет ни малейшей необходимости использовать в приложениях имя (NEXT). Для экономии памяти программ в Каллисто 1.0 слово (NEXT) было лишено заголовка.

Реализация

На самом деле в исходном тексте Каллисто 1.0 присутствуют два варианта слова (NEXT) — XNEXT и XNEXTD — реализующие циклы в памяти программ и данных. Слово NEXT компилирует XNEXTD, а XNEXT используется самим Каллисто.

 672 CNTD:           KRM6 RME ∗ KRM6 + M6  KGOTO9
…
 676 CNT:
 677                 Cx PPM9210                      ; Прочесть двухбайтовое значение по номеру X=0
 678                 PPM9042                         ; RI := MEMW[RI]
 679                 KGOTO9                          ; NEXT
…
 701 ;#xNEXT
 702 ; (NEXT)           ( −− )                               Конец цикла со счётчиком в шитом коде (слово без заголовка).
 703 ; Заголовок убран, слово (NEXT) используется только словом NEXT
 704 ;LXNEXT:        .DB     6
 705 ;               .TEXT   "(NEXT)"
 706 ;               .DW     LXFOR
 707 XNEXTD:         .DW     JXNEXTD                 ; (NEXT) в памяти данных
 708 JXNEXTD:        RM2 MA  1 + MB
 709                 KRMB 1 −  FX!=0 XNEQ0D          ; Переход если мл.байт был равен 1
 710                 FX<0 KMBCNTD
 711                 KRMA  FX!=0 XNEXITD             ; Сюда перешли, если после декремента мл.байт < 0
 712                 1 −  FX>=0 XNEXITD
 713                 KMA 255
 714 KMBCNTD:        KMB  PGOTO CNTD
 715 XNEQ0D:         KRMA  FX!=0 XNEXITD             ; Переход, если счётчик == 0
 716                 Cx
 717                 GOTO KMBCNTD
 718 XNEXITD:        KRM6 KRM6                       ; Пропустить адрес перехода
 719 JUNLOOP:        4                               ; Обработчик UNLOOP
 720 NLEV:           RM2 + M2                        ; Убрать из стека возвратов два слова, счётчик и адрес
 721                 KGOTO9
 722 
 723 XNEXT:          .DW     JXNEXT                  ; (NEXT) в памяти программ
 724 JXNEXT:         RM2 MA  1 + MB
 725                 KRMB 1 −  FX!=0 XNEQ0
 726                 FX<0 KMBCNT
 727                 KRMA  FX!=0 XNEXIT
 728                 1 −  FX>=0 XNEXIT
 729                 KMA 255
 730 KMBCNT:         KMB  PGOTO CNT
 731 XNEQ0:          KRMA  FX!=0 XNEXIT
 732                 Cx
 733                 GOTO KMBCNT
 734 XNEXIT:         PPRM9044 PPRM9044               ; Пропустить адрес перехода
 735                 GOTO JUNLOOP

Советская реализация

Для реализации цикла со счётчиком в ФОРТ-ЕС и FORTH ИТЭФ служили примитивы (LOOP) и (+LOOP)

Вот их описания и определения из ФОРТ-ЕС:

  (+LOOP)   * N->                    ТЕСТ НА ЗАВЕРШЕНИЕ ЦИКЛА "DO +LOOP"   5
                                                               С ШАГОМ N
  (LOOP)    * ->                      ТЕСТ НА ЗАВЕРШЕНИЕ ЦИКЛА "DO LOOP"   5

                      Экран номер 5
( 09.09.86  BRANCH  ?BRANCH  (LOOP/  (+LOOP/ )

CODE  BRANCH  M: ВRANСН#
 RI 0 (, RI RFORTH LH,    RI RMASK  NR,      RNEXT BR,

CODE  (LOOP)  RW1 1 LA,   1 =F B,
CODE (+LOOP)  RW1 POP,
1 =H  0 RFIRST LH,   0 RSECOND SH,   0 RMASK NR,
      0 RW1 AR,      RW1 RFIRST AH,  RW1 RFIRST STH,
      0 RMASK  CLR,   BRANCH# BNH,   RRET 6 (, 0 RRET LA,
      RI RTWO AR,  RNEXT BR,   END-CODE

Определения из FORTH ИТЭФ:

   CNT:      ADD   SI,  [SI]
             NEXT
             ...
             HEAD    206Q,'(LOOP',251Q,XLOOP              ; (LOOP)
   ; Приращение индекса цикла LOOP и может быть  ветвление
             INC   WORD PTR  [BP]
   LOP:      MOV   AX,  [BP]
             CHP   AX,  2[BP]
             JL    CNT
   LV:       ADD   BP,  4
             ADD   SI,  2
             NEXT

             HEAD    207Q,'(+LOOP',251Q,XPLOO             ; (+LOOP)
             POP   AX
             ADD   [BP],   AX
             CMP   AX, 0
             JL    $LESS
             JMP   LOP
   $LESS:    MOV   CX, [BP]   ; Работа с отрицательными приращениями
             CMP   [BP]+2, CX
             JLE   LV
             JMP   CNT

Ссылки


  У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Это заготовка статьи. Вы можете помочь проекту, дополнив её.