Редактирование: (NEXT)

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.

Текущая версия Ваш текст
Строка 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]]




Строка 108: Строка 7:
{{заготовка}}
{{заготовка}}
[[Категория:Слова Каллисто]]
[[Категория:Слова Каллисто]]
[[Категория:Примитивы]]
[[Категория:Реализация структур управления Каллисто]]
[[Категория:Реализация структур управления Каллисто]]
[[Категория:Слова, лишённые заголовка]]
[[Категория:Слова Каллисто без стековых диаграмм]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)