за исключением того, что перепись
Слово
BLOCK (блок) аналогично по использованию слову
BUFFER за исключением того, что перепись данных из внешней памяти производится в приписанный данному блоку буфер. Разумеется, если данный блок уже находится в буферном пуле, то переписи данных не происходит, и слово
BLOCK возвращает адрес этого буфера.
Наконец, слово
UPDATE (изменить) устанавливает признак измененности последнего блока, к которому было адресовано обращение через слово
BLOCK или
BUFFER. Таким образом, впоследствии этот блок будет автоматически переписан во внешнюю память.
При реализации обмена с внешней памятью в качестве буферного пула обычно используется связный участок оперативный памяти. Пусть его начало задается константой
FIRST, а конец — адрес байта, следующего за последним, — константой
LIMIT. (Если пул располагается вплотную к концу адресного пространства, то этот следующий адрес равен нулю!) Буфера в пуле располагаются подряд, каждый начинается двухбайтной ячейкой, в которой записывается номер приписанного блока, причем старший разряд используется под признак измененности. Далее идет буферная память для блока размером 1024 байта, завершается буфер еще одной служебной ячейкой, в которой записан ноль (ее назначение указано в ). Пусть переменные
PREV и
USE указывают на текущий используемый буфер и следующий, который будет выдан при запросе на свободный буфер. Определим слово
+BUF, которое вычисляет адрес буфера, следующего в пуле за переданным, и возвращает признак несовпадения его с текущим:
: +BUF ( A1 ---> A2,F ) 1024 + 4 + DUP LIMIT - IF DROP FIRST THEN DUP PREV @ - ;
Пусть служебные слова
RBLK A,N --> и
WBLK A,N --> выполняют чтение блока с указанным номером в заданную область оперативной памяти и запись из нее. Тогда с учетом принятых условий слова, выполняющие работу с внешней памятью, можно задать так:
: BUFFER ( N ---> A ПРИПИСАТЬ БЛОКУ N БУФЕР) USE @ DUP >R ( ВЕРНЕМ ЭТОТ БУФЕР) BEGIN +BUF UNTIL USE ! ( УСТАНАВЛ.СЛЕДУЮЩИЙ) R@ @ 0< ( ПРИЗНАК ИЗМЕНЕННОСТИ?) IF R@ 2+ R@ @ 32767 AND WBLK THEN R@ ! ( ПРИПИСАЛИ НОВОМУ БЛОКУ) R@ PREV ! R> 2+ ; : BLOCK ( N ---> A:АДРЕС БУФЕРА С ДАННЫМИ БЛОКА) >R PREV @ DUP R@ - DUP + ( ТЕКУЩИЙ - ТОТ ЖЕ?) IF ( НЕТ) BEGIN +BUF 0= IF DROP R@ BUFFER DUP R@ RBLK 2- THEN DUP @ R@ - DUP + 0= UNTIL DUP PREV ! THEN R> DROP 2+ ; : UPDATE ( ---> ) PREV @ @ 32768 OR PREV @ ! ;
Содержание Назад Вперед