++@

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

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

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

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

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

Ввод слова ++@[править]

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

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

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

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

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

2196 CAT0:           MA KRMA PKM03  KGOTO9
…
2198 CAT2:           KPRGM PKM03  KGOTO9
2199 
2200 ;#PlusPlusFetch
2201 ; ++@              ( a −− x )                           Косвенное чтение по указателю в a с предварительным автоувеличением (аналог КИП4..КИП6).
2202 ; 1. Добавить единицу к содержимому ячейки с адресом a
2203 ; 2. Положить на стек x, расположенный по адресу, содержащемуся в этой ячейке (в байтовой области это адрес байта, а не ячейки)
2204 ; Подразумевается, что ячейка не пересекает границ областей памяти.
2205 ; Указателем может быть десятичный регистр, но не регистр функций.
2206 LPPAT:          .DB     3
2207                 .TEXT   "++@"                   ; ( адрес −− x )
2208                 .DW     LCAT
2209 PPAT:           .DW     JPPAT
2210 JPPAT:          PKRM03 1 EE 4 −  KX>=09  MA     ; Защита от "указателей" в памяти программ
2211                 1000 −  PX>=0 PPAT1
2212                 1                               ; 1+
2213 PPAT0:          RMA 1 + MB <−>
2214                 KRMA RME ∗ KRMB +               ; @
2215                 + ENT                           ; 1+ или 1−
2216                 ENT RME / KINT KMA              ; Старший байт
2217                 RME ∗ − KMB                     ; Младший байт
2218                 Cx  GOTO PPAT00
…
2221 PPAT1:          1                               ; автоинкремент десятичного регистра
2222 PPAT1A:         KRMA KINT + KMA
2223                 1
2224 PPAT00:         EE 4 −  PX<0 CAT0
2225                 FANS +  PGOTO CAT2

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


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


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