RGRW

Материал из ПМК вики
Версия от 11:38, 10 ноября 2017; AtH (обсуждение | вклад) (→‎Реализация)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

RGRW — встроенное слово Каллисто. Чтение/запись файла регистров (словаря) в загруженном каталоге.

RGRW           ( a c1 c2 −− c )                     Чтение/запись (c2=1/0) десятичного/двоичного (c1=4/2) файла
                                                    с именем из 20 литер по адресу a+1.

Чтение/запись файла регистров (словаря) в загруженном каталоге. Выдаёт код ошибки дисковой операции, 0 если успех.

a — адрес имени файла, состоящего из 20 литер, минус 1

с1 — тип файла (с1=4 для десятичных регистров, с1=2 для двоичных регистров)

с2 — флаг "чтение−запись" (с2=1 для чтения, с2=0 для записи)

с — статус операции (с=0 нет ошибок, с<>0 код ошибки дисковой операции)

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

В режиме ЛАТ последовательно нажмите четыре клавиши  ×   БП   ×   В↑ 

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

Нужный каталог выбирает слово КАТ.

В регистрах хранятся служебные переменные и структуры Каллисто (включая исполняемый шитый код), повреждение которых легко приводит среду в нестабильное состояние. Поэтому слово низкого уровня RGRW вряд ли потребуется обычному разработчику, для которого разработаны удобные слова SAVE" и LOAD"

При необходимости освобождения места в памяти программ заголовок RGRW можно исключить.

3996 ; Сохранить регистры в энергонезависимую память
3997 ; R1 = 4 для десятичных регистров (0..999), всего 1000
3998 ;    = 2 для двоичных регистров (1000..5095), всего 4096
3999 SAVRGS:
4000                 RM1 4 −  FX=0 SAVBIN
4001 SAVDEC:         1 M5  998                       ; R0, R1 не сохранять
4002                 GOTO SMLM0
4003 SAVBIN:         999 M5  4096
4004 SMLM0:          M0
4005 SML:            1 PPM 9047
4006                 KRM5 PKM05
4007                 FL0 SML
4008                 RTN
4009 
4010 ;#RGRW
4011 ; RGRW             ( a c1 c2 −− c )                     Считать/записать (c2=1/0) десятичный/двоичный (c1=4/2) файл с именем из 20 литер по адресу a+1.
4012 ; Служебное слово, которое вряд ли потребуется разработчику.
4013 ; Чтение/запись файла регистров (словаря) в загруженном каталоге.
4014 ; Выдаёт код ошибки дисковой операции, 0 если успех.
4015 ; a − адрес имени файла, состоящего из 20 литер, минус 1
4016 ; c1 − тип файла (c1=4 для десятичных регистров, c1=2 для двоичных регистров)
4017 ; c2 − флаг "чтение−запись" (c2=1 для чтения, c2=0 для записи)
4018 ; c − статус операции (c=0 нет ошибок, c<>0 код ошибки дисковой операции)
4019 LRERW:          .DB     4
4020                 .TEXT   "RGRW"                  ; ( a t flg −− f )
4021                 .DW     LWYKL
4022 RERW:           .DW     JRERW
4023 JRERW:          PKRM03 MA                       ; RA := flg  ( флаг R/W)
4024                 RM3 1 + M8  1 + M7  1 + M3
4025                 KRM7 1 EE 4 − M7                ; R7 := a−1  ( адрес 20−литерного имени файла − 1)
4026                 KRM8 M1                         ; R1 := t    ( тип файла)
4027                 Cx M8  9034 MB                  ; R8 := 0    ( номер строки в каталоге) ; RB := 9034  ( чтение по индексу 1)
4028 RERWN1:         Cx  PPM 9030  PPM 9031          ; Сброс индексных регистров 0 и 1
4029                 RM8 PPM 9122                    ; Считать строчку каталога.
4030                 KRMB RM1 −  FX=0 JZRERWNXT      ; Нужный нам тип файла?
4031                 KRMB KRMB                       ; Пропустить поле 2 ( двухбайтовое)
4032                 RM7 M5  20 M0                   ; R5 := R7 ( адрес имени − 1)   ; R0 := 20  ( длина имени)
4033 RERWZ:          KRMB KRM5 −
4034 JZRERWNXT:      FX=0 RERWNXT
4035                 FL0 RERWZ                       ; Совпадает имя в каталоге с нужным?
4036                 RMA  FX!=0 RERWR1               ; R/W ?
4037                 RMC                             ; Нужно только при чтении дестичных регистров
4038                 RM8  PPM 9128  PPM 9123         ; Считать найденный файл
4039                 <−> MC                          ; Восстановить RC
4040                 256 ME
4041                 GOTO JRERWRET                   ; Выход
4042 RERWR1:         PGSB SAVRGS
4043                 RM8  PPM 9128  PPM 9126         ; Перезаписать найденный файл
4044 JRERWRET:       PGOTO RERWRET                   ; Выход
4045 RERWNXT:        RM8 1 + M8  64 −  PX=0 RERWN1   ; Следующая строчка. Она 64−я?
4046                 RMA  FX!=0 RERWR2               ; R/W ?
4047                 4                               ; Выход с кодом ошибки 40 "файл не найден".
4048 JZERO:          0 KM3  KGOTO9                   ; Обработчик FALSE
4049 RERWR2:         PPM 9030  3 PPM 9031            ; RX==0 ( инициализация индексных регистров)
4050                 RM7 M5  20 M0
4051 RERWS:          KRM5 KMB  FL0 RERWS             ; Записать имя файла в буфер.
4052                 PGSB SAVRGS
4053                 RM1  PPM 9128  PPM 9125         ; Создать файл.
4054 RERWRET:        PPRM 9129  FX!=0 RERW0          ; Выйти
4055                 40 +                            ; Преобразовать код ошибки дисковой операции в код ошибки Каллисто
4056 RERW0:          KM3 KGOTO9

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


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


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