Язык Форт и его реализации



         

Работа с внешней памятью - часть 2


Слово 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 @ ! ;




Содержание  Назад  Вперед