BLOCK

Материал из ПМК вики
Перейти к: навигация, поиск

BLOCK (блок) — стандартное слово Каллисто. Считать блок с электронного диска в буфер.

BLOCK          ( c −− a )                           Убедиться, что в буфере блок c. Дать адрес буфера.

Записывает в стек адрес первого байта в буфере с блоком, номер которого c. Этот адрес a фиксирован и в Каллисто 1.0 всегда равен 15096.

Если блок c не находится в памяти, он переносится с электронного диска в буфер. Если блок, занимавший буфер, был ранее изменён, то этот блок сначала записывается на диск, и только затем на его место будет занесён новый блок.

Ввод слова BLOCK[править]

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

BLOCK в стандарте ANS Forth[править]

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

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

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

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

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

История[править]

В 1968 году Чак Мур работал в Mohasco Industries, Inc (Amsterdam NY, англ.). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт).

Когда Чак Мур понял, что основанная на Форте среда для кросс-программирования терминала IBM 2250 на миникомпьютере IBM 1130 превосходит Фортрановскую среду разработки на IBM 1130, он превратил свою среду в компилятор для IBM 1130. Это добавило команды цикла, концепцию хранения исходного текста в 1024-байтных блоках, инструменты для управления ими и множество особенностей компилятора, вошедших в Форт надолго.

Первый FORTH для IBM 1130 знал слово BLOCK под именем GET

Слово BLOCK использовалось для управления несколькими буферами, чтобы минимизировать обращение к диску.

BLOCK в предыдущем стандарте Forth-83 (англ.)[править]

     BLOCK        u -- addr                     M,83
          addr is the address of the assigned buffer of the first byte
          of block u.  If the block occupying that buffer is not block
          u and has been UPDATEed it is transferred to mass storage
          before assigning the buffer.  If block u is not already in
          memory, it is transferred from mass storage into an assigned
          block buffer.  A block may not be assigned to more than one
          buffer.  If u is not an available block number, an error
          condition exists.  Only data within the last buffer
          referenced by BLOCK or BUFFER is valid.  The contents of a
          block buffer must not be changed unless the change may be
          transferred to mass storage.

BLOCK в стандарте Forth-79 (англ.)[править]

BLOCK          n -- addr                     191
    Leave the address of the first byte in block n.   If the block
    is not already in memory,  it is transferred from mass storage
    into whichever memory buffer has been least recently accessed.
    If  the  block occupying that buffer has  been  UPDATEd  (i.e.
    modified), it is rewritten onto mass storage before block n is
    read  into the buffer.   n is an unsigned number.   If correct
    mass storage read or write is not possible, an error condition
    exists.  Only data within the latest block referenced by BLOCK
    is valid by byte address, due to sharing of the block buffers.

BLOCK в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

BLOCK         n  ---  addr                     L0
       Leave the memory address of the block buffer containing block n. If
       the block is not already in memory, it is transferred from disc to
       which ever buffer Was least recently written. If the block occupying
       that buffer has been marked as updated, it is rewritten to disc
       before block n is read into the buffer. See also BUFFER, R/W UPDATE
       FLUSH

Реализация[править]

3498 ;#BLOCK
3499 ; BLOCK            ( c −− a )                           Убедиться, что в буфере блок c. Дать адрес буфера.
3500 ; Положить на стек адрес первого байта в буфере с блоком, номером которого u.
3501 ; Если блок не находится в памяти, перенести его с диска в буфер.
3502 ; Если блок, занимавший буфер, был ранее изменён (UPDATE), то этот блок сначала записывается на диск,
3503 ; и только затем на его место будет занесён новый блок.
3504 LBLOCK:         .DB     5
3505                 .TEXT   "BLOCK"                 ; ( №блока −− 15096 )
3506                 .DW     LBUFFE
3507 BLOCK:          .DW CALL, TOR                   ; Сохранить номер запрошенного блока на вершине стека возвратов
3508                 .DW BUFN,ONEP,CAT               ; Какой у нас сейчас блок в буфере?
3509                 .DW I,SUB, ZBRAN,BLC            ; Блок уже считан? Вернуть адрес буфера.
3510                 .DW I, BUFN                     ; rrBUFBLK  15094 = 3af6
3511                 .DW DUP,AT,ZLESS, ZBRAN,BL1     ; Блок изменялся?
3512                 .DW BUFN,ONEP,CAT, ZERO,RW      ; Записать старый блок
3513 BL1:            .DW I,ONE,RW                    ; Считать запрошенный блок
3514                 .DW STORE                       ; Сохранить новый номер блока, заодно сбросив флаг UPDATE
3515 BLC:            .DW LEV                         ; Удалить номер блока со стека возвратов
3516                 .DW BRAN,BR3                    ; Вернуть наш фиксированный адрес

Советская реализация[править]

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

BLOCK     +N->A ДАТЬ АДРЕС А БУФЕРА С БЛОКОМ +N                 25

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

: BLOCK ( +N->A) OFFSET @ + >R PREV @ DUP @ R@ - DUP + IF
   BEGIN +BUF 0= IF DROP R@ OFFSET @ - BUFFER DUP R@ RBLK
       2- THEN  DUP @ R@ - DUP +  0=  UNTIL DUP PREV ! THEN  RDROP 2+ ;

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

             HEAD    205Q,'BLOC',313Q,BLOCK,$COL          ; BLOCK
             DW  OFSET,AT,PLUS,TOR
             DW  PREV,AT,DUBL,X,I,SUB,ZBRAN,BLC-$
   BLO:      DW  PBUF,ZEQU,ZBRAN,BCK-$
             DW  DROP,I,BUFFE,DUBL,I,ONE,RW,CFA
   BCK:      DW  DUBL,X,I,SUB,ZEQU
             DW  ZBRAN,BLO-$,DUBL,PREV,STORE
   BLC:      DW  FROMR,DROP,TWOP,SEMI

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


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


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