−−@

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

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

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

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

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

Ввод слова −−@

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

История

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

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

Реализация

2196 CAT0:           MA KRMA PKM03  KGOTO9
…
2198 CAT2:           KPRGM PKM03  KGOTO9
…
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
2219 MMAT1:          1 +/−                           ; автодекремент десятичного регистра
2220                 .DB 5cH                         ; FX<0 aka пропустить 1 байт
2221 PPAT1:          1                               ; автоинкремент десятичного регистра
2222 PPAT1A:         KRMA KINT + KMA
2223                 1
2224 PPAT00:         EE 4 −  PX<0 CAT0
2225                 FANS +  PGOTO CAT2
2226 
2227 ;#MinusMinusFetch
2228 ; −−@              ( a −− x )                           Косвенное чтение по указателю в a с предварительным автоуменьшением (аналог КИП0..КИП3).
2229 ; 1. Вычесть единицу из содержимого ячейки с адресом a
2230 ; 2. Положить на стек x, расположенное по адресу, содержащемуся в этой ячейке (в байтовой области это адрес байта, а не ячейки)
2231 ; Подразумевается, что ячейка не пересекает границ областей памяти.
2232 ; Указателем может быть десятичный регистр, но не регистр функций.
2233 LMMAT:          .DB     3
2234                 .TEXT   "−−@"                   ; ( адрес −− x )
2235                 .DW     LPPAT
2236 MMAT:           .DW     JMMAT
2237 JMMAT:          PKRM03 1 EE 4 −  KX>=09  MA     ; Защита от "указателей" в памяти программ
2238                 1000 −  FX>=0 MMAT1             ; 1000 быстрее, чем 1 ВП 3
2239                 1 +/−                           ; 1−
2240                 PGOTO PPAT0

Ссылки


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


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