‗RW: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
 
(не показано 12 промежуточных версий этого же участника)
Строка 1: Строка 1:
'''_RW''' — стандартное слово [[Каллисто]].
'''_RW''' — системное слово [[Каллисто]]. Низкоуровневый ввод/вывод [[блок]]а.
_RW            ( c1 c2 −− )                        Чтение/запись (c2=1/0) блока номер c1.
c1 − номер [[экран]]а ([[блок]]а), к которому происходит обращение
 
c2=0 запись блока: №блока 0 _RW
 
c2=1 чтение блока: №блока 1 _RW


== Ввод слова _RW ==
== Ввод слова _RW ==
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша ШГ вправо|{{Чёрная клавиша|ШГ→}}]] [[Клавиша ×|{{Серая клавиша|×}}]] [[Клавиша В↑|{{Серая клавиша|В↑}}]]
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши {{ШГ→}} [[Клавиша ×|{{Серая клавиша|×}}]] [[Клавиша В↑|{{Серая клавиша|В↑}}]]
 
== История ==
Слово _RW имеет своим прототипом слово R/W из Форт ИТЭФ и fig-Форта, но в [[Каллисто]] адрес буфера постоянен и, как параметр, не передаётся. К сожалению, имя R/W конфликтует со [http://forth.sourceforge.net/standard/dpans/dpans11.htm#11.6.1.2056 словом R/W] из стандартов ANS FORTH и [http://www.forth200x.org/documents/html3/file/RDivW.html Форт-2012].
 
Подчёркивание часто ставится в начале имён служебных или системно-зависимых библиотечных функций. Хотя слово _RW относительно стандартно, опираясь на R/W из fig-Форта, сложно придумать сценарий, в котором разработчику пришлось бы обращаться к нему напрямую. При необходимости заголовок _RW можно исключить, освободив 6 байт в [[Память программ|памяти программ]].


== R/W в fig-FORTH Release 1 glossary, май 1979 (англ.) ==
=== R/W в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
  R/W          addr blk f --
  R/W          addr blk f --
         The fig-FORTH standard disc read-write linkage. addr specifies the
         The fig-FORTH standard disc read-write linkage. addr specifies the
Строка 13: Строка 24:


== Реализация ==
== Реализация ==
<pre>
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              ; Запретить все дисковые операции
</pre>
Пример реализации R/W из fig-Форта, симулирующий блоки в ОЗУ:
<PRE>
HEX
4000 CONSTANT LO ( начало буферной области )
6800 CONSTANT HI ( эквивалент 10 экранов )
: _RW >R ( сохранить boolean )
    B/BUF × LO + ↑
    HI > 6 ?ERROR ( проверка диапазона )
    R> IF ( чтение ) ↔ ENDIF
    B/BUF CMOVE ;
</PRE>
=== Советская реализация ===
В ФОРТ-ЕС общением с диском занимались [[примитив]]ы RBLK и WBLK
В ФОРТ-ЕС общением с диском занимались [[примитив]]ы RBLK и WBLK


Строка 28: Строка 77:
</PRE>
</PRE>


Пример реализации R/W из fig-Форта, симулирующий блоки в ОЗУ:
Определение слова R/W в FORTH ИТЭФ:
HEX
<PRE>
4000 CONSTANT LO ( начало буферной области )
            HEAD    203Q,'R/',327Q,RW                    ; R/W
6800 CONSTANT HI ( эквивалент 10 экранов )
 
: _RW >R ( сохранить boolean )
  ; Открытие файла
    B/BUF × LO + ↑
    HI > 6 ?ERROR ( проверка диапазона )
    R> IF ( чтение ) ↔ ENDIF
    B/BUF CMOVE ;


== История ==
            MOV  DX, OFFSET FCB
Слово _RW взято из Форт ИТЭФ и fig-Форта. К сожалению, имя R/W  конфликтует со [http://forth.sourceforge.net/standard/dpans/dpans11.htm#11.6.1.2056 словом R/W] из стандартов ANS FORTH и [http://www.forth200x.org/documents/html3/file/RDivW.html Форт-2012].
            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$'
</PRE>


Подчёркивание часто ставится в начале имён служебных или системно-зависимых библиотечных функций.
== Ссылки ==
* {{Исходник|lowRW|_RW}}




Строка 49: Строка 169:
[[Категория:Слова высокого уровня]]
[[Категория:Слова высокого уровня]]
[[Категория:Низкоуровневый ввод-вывод Каллисто]]
[[Категория:Низкоуровневый ввод-вывод Каллисто]]
[[Категория:Слова Каллисто к переименованию]]
[[Категория:Слова Каллисто без стековых диаграмм]]

Текущая версия от 09:46, 3 февраля 2019

_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$'

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


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


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