‗RW

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

_RW — системное слово Каллисто. Низкоуровневый ввод/вывод блока.

_RW            ( c1 c2 −− )                         Чтение/запись (c2=1/0) блока номер c1.

c1 − номер экрана (блока), к которому происходит обращение

c2=0 запись блока: №блока 0 _RW

c2=1 чтение блока: №блока 1 _RW

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

В режиме ЛАТ последовательно нажмите клавиши  ШГ→   ×   В↑ 

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

Слово _RW имеет своим прототипом слово R/W из Форт ИТЭФ и fig-Форта, но в Каллисто адрес буфера постоянен и, как параметр, не передаётся. К сожалению, имя R/W конфликтует со словом R/W из стандартов ANS FORTH и Форт-2012.

Подчёркивание часто ставится в начале имён служебных или системно-зависимых библиотечных функций. Хотя слово _RW относительно стандартно, опираясь на R/W из fig-Форта, сложно придумать сценарий, в котором разработчику пришлось бы обращаться к нему напрямую. При необходимости заголовок _RW можно исключить, освободив 6 байт в памяти программ.

R/W в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

R/W           addr blk f --
       The fig-FORTH standard disc read-write linkage. addr specifies the
       source or destination block buffer, blk is the sequential number of
       the referenced block; and f is a flag for f=O write and f=l read.
       R/W determines the location on mass storage, performs the read-write
       and performs any error checking.

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

4099 ;#lowRW
4100 ; _RW              ( c1 c2 −− )                         Считать/записать (c2=1/0) блок номер c1.
4101 ; c1 − номер экрана (блока)
4102 ; c2 − флаг "чтение−запись" (c2=1 для чтения, c2=0 для записи)
4103 LRW:            .DB     3
4104                 .TEXT   "_RW"                   ; ( bl# flg −− )
4105                 .DW     LLORW
4106 RW:             .DW CALL
4107 RRW:            .DW DUP,ZEQU, ZBRAN,RW1, SAVETEXT
4108 RW1:            .DW SWAP
4109                 .DW DUP,ONEM,ABS, LITB
4110                 .DB 60
4111                 .DW SLASH,LITB
4112                 .DB 3
4113                 .DW MIN,LITB
4114                 .DB 49
4115                 .DW PLUS,KAT                    ; Выбрать нужный каталог
4116                 .DW BDIGS, DIG,DIG,DIG, LITB
4117                 .DB 66
4118                 .DW HOLD, EDIGS, DROP           ; Состряпать имя файла "Bxxx"
4119                 .DW SWAP, LORW                  ; Считать/записать
4120                 .DW DISKOFF, EXIT               ; Запретить все дисковые операции

Пример реализации R/W из fig-Форта, симулирующий блоки в ОЗУ:

 HEX
 4000 CONSTANT LO ( начало буферной области )
 6800 CONSTANT HI ( эквивалент 10 экранов )
 : _RW >R ( сохранить boolean )
     B/BUF × LO + ↑
     HI > 6 ?ERROR ( проверка диапазона )
     R> IF ( чтение ) ↔ ENDIF
     B/BUF CMOVE ;

Советская реализация[править]

В ФОРТ-ЕС общением с диском занимались примитивы RBLK и WBLK

Вот их описания и «болванки» определений:

RBLK     *   А,+N-> ПРОЧЕСТЬ ЭКРАН +N ПО АДРЕСУ A                6
WBLK     *  A,+N-> ЗАПИСАТЬ ЭКРАН +N ИЗ АДРЕСА A               6

                    Экран номер 6
( 09.09.86 KEY CR EMIT TYPE (EXPECT/ RBLK MBLK )
(  следующие определения дают только имена процедур)

CODE  RBLK  ( A,N-> ПРОЧИТАТЬ ЭКРАН N В БУФЕР  A) END-CODE
CODE  WBLK  ( A,N->  ЗАПИСАТЬ ЭКРАН N ИЗ БУФЕРА А ) END-CODE

Определение слова R/W в FORTH ИТЭФ:

             HEAD    203Q,'R/',327Q,RW                    ; R/W

   ; Открытие файла

             MOV   DX, OFFSET FCB
             MOV   AH, 0FH
             INT   21H
             CMP   AL, 0FFH
             JE    ERR0
             POP   BX  ; R/W - флаг
             POP   AX  ; Номер блока
             POP   DX  ; Адрес буфера
             DEC   AX
             MOV   CL, 3
             SAL   AX, CL  ; (BLOCK#-1)*8
             MOV   RANDREC,AX
             MOV   RANDREC+2,0
             CMP   BX, 0
             JNE   RED
   ; WRITE
             MOV   BX, DX
             MOV   CX, 8      ; Номер записи
   WR:       MOV   DX, BX
             MOV   AH,1AH     ; Запись адреса буфера
             INT   21H
             MOV   DX,OFFSET FCB
             MOV   AH, 22Н    ; Запись RECORD
             INT   21H
             CMP   AL, 0
             JNE   ERR1
             INC   RANDREC    ; Коррекция адреса буфера
             ADD   BX, 80H
             LOOP  WR
             JMP   OUT
   RED:      MOV   CX, 8
             MOV   BX, DX
   RD:       MOV   DX, BX
             MOV   AH, 1AH     ; Запись адреса буфера
             INT   21H
             MOV   DX, OFFSET  FCB
             MOV   AH, 21Н
             INT   21H
             CMP   AL, 0
             JNE   ERR3
             INC   RANDREC     ; Коррекция адреса
             ADD   BX, 80H
             LOO   RD
   OUT:      MOV   DX, OFFSET  FCB  ; Закрытие файла
             MOV   AH, 10H
             INT   21H
             CMP   AL, 0
             JNE   ERR2
   EXIT:     NEXT
   ERR0:     MOV   DX, OFFSET  ERMESO
             JMP   DONE
   ERR1:     MOV   DX, OFFSET  ERMES1
             JMP   DONE
   ERR2:     MOV   DX, OFFSET  ERMES2
             JMP   DONE
   ERR3:     MOV   DX, OFFSET  ERMES3
   DONE:     MOV   AH, 9Н
             INT   21H
             JMP   EXIT
             ...
   FCB       LABEL WORD
   DRIVE     DB    1
   FN        DB    'FORTH   '
   EXT       DB    'DAT'
   CURBLK    DW    0          ; Относительное начало файла
   RECSIZE   DW    80H
   FILESIZE  DW    5000,0
   DATE      DB    0,0
             DB    0,0,0,0,0, 0,0,0,0,0
   CURREC    DB    0
   RANDREC   DW    0,0
   ERMES0    DB    'ERR OPENING FILE$'
   ERMES1    DB    'ERR WRITING FILE$'
   ERMES2    DB    'ERR CLOSING FILE$'
   ERMES3    DB    'ERR READING FILE$'

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


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


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