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

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показано 27 промежуточных версий этого же участника)
Строка 1: Строка 1:
'''(NEXT)''' — стандартное слово [[Каллисто]].
'''(NEXT)''' — служебное слово [[Каллисто]], лишённое заголовка. Конец цикла со счётчиком в [[Шитый код|шитом коде]].
(NEXT)        ( −− )                              Конец цикла со счётчиком в шитом коде (слово без заголовка).
Служебное слово (NEXT) компилируется в [[Шитый код|шитый код]] словом [[NEXT]]. Нет ни малейшей необходимости использовать в приложениях имя (NEXT). Для экономии [[Память программ|памяти программ]] в [[Каллисто|Каллисто 1.0]] слово (NEXT) было лишено заголовка.


Конец цикла со счётчиком в шитом коде.
== Реализация ==
На самом деле в исходном тексте [[Каллисто|Каллисто 1.0]] присутствуют два варианта слова (NEXT) — XNEXT и XNEXTD — реализующие циклы в памяти программ и данных. Слово [[NEXT]] компилирует XNEXTD, а XNEXT используется самим [[Каллисто]]. Оба варианта (NEXT) лишены заголовка.
<pre>
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
</pre>
 
=== Советская реализация ===
Для реализации цикла со счётчиком в ФОРТ-ЕС и FORTH ИТЭФ служили [[примитив]]ы (LOOP) и (+LOOP)
 
Вот их описания и определения из ФОРТ-ЕС:
<PRE>
  (+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
</PRE>
 
Определения из FORTH ИТЭФ:
<PRE>
  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
</PRE>
 
== Ссылки ==
* {{Исходник|xNEXT|(NEXT)}}
* См. слово [[(FOR)]], а также слова [[FOR]] и [[NEXT]]




Строка 7: Строка 108:
{{заготовка}}
{{заготовка}}
[[Категория:Слова Каллисто]]
[[Категория:Слова Каллисто]]
[[Категория:Примитивы]]
[[Категория:Реализация структур управления Каллисто]]
[[Категория:Реализация структур управления Каллисто]]
[[Категория:Слова Каллисто без стековых диаграмм]]
[[Категория:Слова, лишённые заголовка]]

Текущая версия от 23:35, 23 января 2018

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

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

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

Реализация[править]

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

 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

Ссылки[править]


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


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