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
Ссылки[править]
- Исходный текст слова BLOCK в Каллисто Классик 1.0
- См. слова BUFFER, UPDATE
- Слово BLOCK в стандарте ANS Forth (англ.)
- Слово BLOCK в черновике Forth 200x (англ.)
- ВВОД-ВЫВОД в книге Л.Броуди «Начальный курс программирования на языке Форт»
- The Editor (and Staff) в книге Leo Brodie Starting Forth (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |