‗RW: различия между версиями
AtH (обсуждение | вклад) Нет описания правки |
AtH (обсуждение | вклад) |
||
(не показано 18 промежуточных версий этого же участника) | |||
Строка 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]. | |||
== R/W в fig-FORTH Release 1 glossary, май 1979 (англ.) == | Подчёркивание часто ставится в начале имён служебных или системно-зависимых библиотечных функций. Хотя слово _RW относительно стандартно, опираясь на R/W из fig-Форта, сложно придумать сценарий, в котором разработчику пришлось бы обращаться к нему напрямую. При необходимости заголовок _RW можно исключить, освободив 6 байт в [[Память программ|памяти программ]]. | ||
=== 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 | ||
Строка 12: | Строка 23: | ||
and performs any error checking. | and performs any error checking. | ||
== Пример реализации | == Реализация == | ||
<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 | HEX | ||
4000 CONSTANT LO ( начало буферной области ) | 4000 CONSTANT LO ( начало буферной области ) | ||
Строка 21: | Строка 59: | ||
R> IF ( чтение ) ↔ ENDIF | R> IF ( чтение ) ↔ ENDIF | ||
B/BUF CMOVE ; | B/BUF CMOVE ; | ||
</PRE> | |||
== | === Советская реализация === | ||
В ФОРТ-ЕС общением с диском занимались [[примитив]]ы RBLK и WBLK | |||
Вот их описания и «болванки» определений: | |||
<PRE> | |||
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 | |||
</PRE> | |||
Определение слова R/W в FORTH ИТЭФ: | |||
<PRE> | |||
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$' | |||
</PRE> | |||
== Ссылки == | |||
* {{Исходник|lowRW|_RW}} | |||
Строка 31: | Строка 167: | ||
{{заготовка}} | {{заготовка}} | ||
[[Категория:Слова Каллисто]] | [[Категория:Слова Каллисто]] | ||
[[Категория:Слова высокого уровня]] | |||
[[Категория:Низкоуровневый ввод-вывод Каллисто]] | [[Категория:Низкоуровневый ввод-вывод Каллисто]] | ||
Текущая версия от 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$'
Ссылки[править]
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |