BUFFER

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

BUFFER (буфер) — стандартное слово Каллисто. Приписать буфер к блоку на электронном диске.

BUFFER         ( c −− a )                           Приписать буферу блок c и дать адрес буфера.
                                                    Сам блок с диска не считывать.

Резервирует блок в памяти и приписывает ему номер u (как и BLOCK ), но сам блок с диска не считывается. Возвращаемый адрес a фиксирован и в Каллисто 1.0 всегда равен 15096.

Ввод слова BUFFER

В режиме ЛАТ последовательно нажмите клавиши  В/О   3   П   П   ИП   × 

BUFFER в стандарте ANS Forth

 7.6.1.0820   BUFFER                                                       BLOCK
            ( u -- a-addr )
            a-addr - адрес первого символа блочного буфера назначенного блоку 
            u. Содержание блока не определено. Неопределенная ситуация 
            существует, если u - не доступный номер блока.

            Если блок u - уже в блочном буфере, a-addr - адрес этого блочного 
            буфера.

            Если блок u - уже не в памяти и есть свободный буфер, a-addr - 
            адрес этого блочного буфера.

            Если блок u - уже не в памяти и нет никаких свободных блочных 
            буферов, освобождает блочный буфер. Если для блока в этом буфере 
            было выполнено UPDATE, перемещает блок в запоминающее устройство. 
            a-addr - адрес этого блочного буфера.

            При завершении операции, блочный буфер указанный a-addr - текущий 
            буфер блоков и назначен на u.

        См.: 7.6.1.0800 BLOCK.

История

Слово BUFFER появилось в 1970 году, когда Чак Мур перенёс Форт на ассемблер Univac 1108 для программирования системы ввода заказов по сети выделенных линий в Mohasco Industries, Inc (Amsterdam NY, англ.).

BUFFER избегало чтения диска, когда было известно, что желаемый блок пуст.

BUFFER в предыдущем стандарте Forth-83 (англ.)

     BUFFER       u -- addr                     M,83
          Assigns a block buffer to block u.  addr is the address of
          the first byte of the block within its buffer.  This
          function is fully specified by the definition for BLOCK
          except that if the block is not already in memory it might
          not be transferred from mass storage.  The contents of the
          block buffer assigned to block u by BUFFER are unspecified.

BUFFER в стандарте Forth-79 (англ.)

BUFFER         n -- addr                     130
    Obtain the next block buffer,  assigning it to block  n.   The
    block  is  not  read  from  mass  storage.   If  the  previous
    contents  of  the  buffer has been marked as  UPDATEd,  it  is
    written to mass storage.   If correct writing to mass  storage
    is not possible,  an error condition exists.  The address left
    is the first byte within the buffer for data storage.  n is an
    unsigned number.

BUFFER в fig-FORTH Release 1 glossary, май 1979 (англ.)

BUFFER          n --- addr
       Obtain the next memory buffer, assigning it to block n. If the
       contents of the buffer is marked as updated, it is written to the
       disc The block is not read from the disc.
       The address left is the first cell within the buffer for data
       storage.

Реализация

3483 ;#BUFFER
3484 ; BUFFER           ( c −− a )                           Приписать буферу блок c и дать адрес буфера. Сам блок с диска не считывать.
3485 ; Зарезервировать блок в памяти и приписать ему номер u (как и BLOCK ), но сам блок с диска не считывать.
3486 LBUFFE:         .DB     6
3487                 .TEXT   "BUFFER"                ; ( №блока −− 15096 )
3488                 .DW     LFLUSH
3489 BUFFE:          .DW CALL, BUFN
3490                 .DW DUP,AT,ZLESS, ZBRAN,BR2     ; Буфер был изменён?
3491                 .DW BUFN,ONEP,CAT               ; Достать номер изменённого блока
3492                 .DW ZERO,RW                     ; Записать буфер на диск
3493 BR2:            .DW STORE                       ; Сохранить новый номер блока, сбросив флаг UPDATE
3494 BR3:            .DW LITP
3495                 .DB 3aH,0f8H                    ; rrDISKBUF  15096 = 3af8
3496 REXIT:          .DW EXIT

Советская реализация

Описание и определение слова BUFFER в ядре ФОРТ-ЕС:

BUFFER    +N->A ПРИПИСАТЬ БЛОКУ +N БУФЕР                        23

                     Экран номер 25
( 31.03.86    +BUF  BUFFER  BLOCK  EMPTY-BUFFERS  UPDATE   )

: BUFFER ( +N->A)  OFFSET @ + USE @ DUP >R  ( ИЩЕМ СВОБОДНЫЙ БУФЕР)
 BEGIN +BUF UNTIL USE !
  R@ @  0< IF ( УСТАНОВЛЕН ПРИЗНАК "UPDATE")
  R@ 2+ R@ @ 32767 AND WBLK THEN  R@ ! R@ PREV ! R> 2+ ;

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

             HEAD    206Q,'BUFFE',322Q,BUFFE,$COL         ; BUFFER
             DW  USE,AT,TOR,I
   BR1:      DW  PBUF,ZBRAN,BR1-$,USE,STORE
             DW  I,AT,ZLESS,ZBRAN,BR2-$
             DW  I,TWOP,I,X,ZERO,RW
   BR2:      DW  I,STORE,I,PREV,STORE,FROMR,TWOP,SEMI

Ссылки


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


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