++!

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

++! (читается «плюс-плюс-присвоить») — родное слово Каллисто. Косвенная запись с прединкрементом.

++!            ( y a −− )                           Косвенная запись y по указателю в a с предварительным автоувеличением
                                                    (аналог КП4..КП6).

Обозначим буквой p переменную, адрес которой лежит на стеке и равен a. Это может быть настоящая переменная, созданная словом VARIABLE или FVARIABLE. Такие переменные называются указателями, т.к. их содержимое указывает на адрес памяти, к которому будет производиться обращение.

Слово ++! сперва увеличивает p на единицу, отбросив дробную часть. Потом записывает число y по (новому) адресу, находящемуся в обновившейся переменной p. Запись происходит в адресную единицу — то есть в один десятичный или байтовый регистр.

Ввод слова ++!

В режиме NUM последовательно нажмите три клавиши  +   +   П 

История

Слово ++! является каллистянским аналогом команд ПМК КП4, КП5 и КП6 — которые производили запись по косвенной адресации с прединкрементом регистров 4, 5 и 6.

В отличии от команд КП4…КП6 слово ++! позволяет организовать косвенную адресацию с прединкрементом по любому десятичному регистру (см. слово FVARIABLE) или двум последовательным байтовым регистрам (см. слово VARIABLE).

Реализация

2086 ;#PlusPlusStore
2087 ; ++!              ( y a −− )                           Косвенная запись y по указателю в a с предварительным автоувеличением (аналог КП4..КП6).
2088 ; 1. Добавить единицу к содержимому ячейки с адресом a
2089 ; 2. Записать x по адресу, содержащемуся в этой ячейке (в байтовой области это адрес байта, а не ячейки)
2090 ; Подразумевается, что ячейка не пересекает границ областей памяти.
2091 ; Указатель может располагаться в десятичных регистрах, но не регистрах функций.
2092 LPPSTOR:        .DB     3
2093                 .TEXT   "++!"                   ; ( число адрес −− )
2094                 .DW     LPSTOR
2095 PPSTOR:         .DW     JPPSTOR
2096 JPPSTOR:        RM3 MA  1 + M8  1 + M3
2097                 KRMA 1 EE 4 −  KX>=09  MA       ; Защита от "указателей" в памяти программ
2098                 1000 −  FX>=0 PPSTOR1           ; 1000 быстрее, чем 1 ВП 3
2099                 1                               ; 1+
2100 PPSTOR0:        RMA 1 + MB <−>
2101                 KRMA RME ∗ KRMB +               ; @
2102                 +                               ; 1+ или 1−
2103                 ENT                             ; Сохранить адрес, по нему ещё x записывать
2104                 ENT RME / KINT KMA              ; Старший байт
2105                 RME ∗ − KMB                     ; Младший байт
2106                 Cx  GOTO PPSTOR2
…
2109 PPSTOR1:        1                               ; автоинкремент десятичного регистра
2110 PPSTOR1A:       KRMA KINT + KMA
2111                 1
2112 PPSTOR2:        EE 4 −  KX>=09  MA              ; Защита от обращения в память программ
2113                 1000 −  FX>=0 PPSTOR4           ; Если десятичный регистр, записываем туда любой x
2114                 KRM8  FX<0 PPSTOR5
2115                 RME + KMA KGOTO9                ; Отрицательные числа в байтовые регистры приводятся к 128..255
2116 PPSTOR4:        KRM8
2117 PPSTOR5:        KMA KGOTO9                      ; !

Ссылки


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


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