−−!

Материал из ПМК вики
Перейти к навигации Перейти к поиску

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

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

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

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

Ввод слова −−![править]

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

История[править]

Слово −−! является каллистянским аналогом команд ПМК КП0, КП1, КП2 и КП3 — которые производили запись по косвенной адресации с преддекрементом регистров 0, 1, 2 и 3.

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

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

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
2107 MMSTOR1:        1 +/−                           ; автодекремент десятичного регистра
2108                 .DB 5cH                         ; FX<0 aka пропустить 1 байт
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                      ; !
2118 
2119 ;#MinusMinusStore
2120 ; −−!              ( y a −− )                           Косвенная запись y по указателю в a с предварительным автоуменьшением (аналог КП0..КП3).
2121 ; 1. Вычесть единицу из содержимого ячейки с адресом a
2122 ; 2. Записать x по адресу, содержащемуся в этой ячейке (в байтовой области это адрес байта, а не ячейки)
2123 ; Подразумевается, что ячейка не пересекает границ областей памяти.
2124 ; Указатель может располагаться в десятичных регистрах, но не регистрах функций.
2125 LMMSTOR:        .DB     3
2126                 .TEXT   "−−!"                   ; ( число адрес −− )
2127                 .DW     LPPSTOR
2128 MMSTOR:         .DW     JMMSTOR
2129 JMMSTOR:        RM3 MA  1 + M8  1 + M3
2130                 KRMA 1 EE 4 −  KX>=09  MA       ; Защита от "указателей" в памяти программ
2131                 1000 −  FX>=0 MMSTOR1           ; 1000 быстрее, чем 1 ВП 3
2132                 1 +/−                           ; 1−
2133                 GOTO PPSTOR0

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


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


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