Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''FILL''' (заполнить) — стандартное слово [[Каллисто]]. | | '''FILL''' (заполнить) — стандартное слово [[Каллисто]]. |
| FILL ( a u c −− ) Заполнить. Записать u байтов c, начиная с адреса a.
| |
| Слово FILL записывает u байт c в память, начиная с адреса a. Универсальный оператор для заполнения массивов памяти идентичными символами. На основе слова FILL реализованы специализированные слова [[ERASE]] и [[BLANK]], заполняющие области памяти нулями и пробелами.
| |
|
| |
|
| == Ввод слова FILL ==
| | Записывает u байт c в память начиная с адреса a |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите четыре клавиши [[Клавиша П|{{Чёрная клавиша|П}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша -|{{Серая клавиша|−}}]] [[Клавиша -|{{Серая клавиша|−}}]]
| | |
| | Универсальный оператор для заполнения массивов памяти идентичными символами. |
| | |
|
| |
|
| == FILL в стандарте ANS Forth == | | == FILL в стандарте ANS Forth == |
Строка 12: |
Строка 12: |
| последовательных символов в памяти, начинающейся с c-addr. | | последовательных символов в памяти, начинающейся с c-addr. |
|
| |
|
| == История ==
| |
| Слово FILL пришло в [[Каллисто]] из Форта, где оно является древним и стабильным. В существующем ныне виде слово FILL известно с 1979 года и входит во все стандарты.
| |
|
| |
|
| === FILL в предыдущем стандарте Forth-83 (англ.) ===
| | == FILL в предыдущем стандарте Forth-83 (англ.) == |
| FILL addr u 8b -- 83 | | FILL addr u 8b -- 83 |
| u bytes of memory beginning at addr are set to 8b. No | | u bytes of memory beginning at addr are set to 8b. No |
| action is taken if u is zero. | | action is taken if u is zero. |
|
| |
|
| === FILL в стандарте Forth-79 (англ.) ===
| | |
| | == FILL в стандарте Forth-79 (англ.) == |
| FILL addr n byte -- 234 | | FILL addr n byte -- 234 |
| Fill memory beginning at address with a sequence of n copies | | Fill memory beginning at address with a sequence of n copies |
Строка 26: |
Строка 25: |
| take no action. | | take no action. |
|
| |
|
| === FILL в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
| | |
| | == FILL в fig-FORTH Release 1 glossary, май 1979 (англ.) == |
| FILL addr quan b -- | | FILL addr quan b -- |
| Fill memory at the address with the specified quantity of bytes b. | | Fill memory at the address with the specified quantity of bytes b. |
|
| |
|
| == Реализация ==
| |
| <pre>
| |
| 2000 ;#FILL
| |
| 2001 ; FILL ( a U c −− ) Заполнить. Записать U байтов c, начиная с адреса a.
| |
| 2002 ; Записать U байт c в память начиная с адреса a
| |
| 2003 ; Заполнить массив памяти идентичными литерами.
| |
| 2004 ; а − адрес первого байта памяти, куда будет засылаться байт c
| |
| 2005 ; U − число заполняемых байтов
| |
| 2006 ; Подразумевается, что граница памяти программ и данных не пересекается.
| |
| 2007 LFILL: .DB 4
| |
| 2008 .TEXT "FILL" ; ( куда сколько что −− )
| |
| 2009 .DW LCMOVEG
| |
| 2010 FILL: .DW JFILL
| |
| 2011 JFILL: PKRM03 MB ; Литера
| |
| 2012 RM3 1 +
| |
| 2013 JFILL2: M8 1 + MA 1 + M3
| |
| 2014 KRM8 M0 +/− KX<09 ; Счётчик литер
| |
| 2015 KRMA 1 EE 4 − KX>=09 1 − M5 RMB
| |
| 2016 FILL1: KM5 FL0 FILL1
| |
| 2017 KGOTO9
| |
| </pre>
| |
| Реализация из SP-Forth 4.20:
| |
| <pre>
| |
| CODE FILL ( c-addr u char -- ) \ 94
| |
| \ Если u больше нуля, заслать char в u байтов по адресу c-addr.
| |
| MOV EDX, EDI
| |
| MOV ECX, [EBP]
| |
| MOV EDI, 4 [EBP]
| |
| CLD
| |
| \ можем ли заполнять DWORD?
| |
| MOV EBX, ECX
| |
| AND EBX, # 3
| |
| JNZ @@1 \ низя
| |
| \ сформируем DWORD
| |
| MOV EBX, EAX
| |
| SHL EAX, # 8
| |
| OR EAX, EBX
| |
| SHL EAX, # 8
| |
| OR EAX, EBX
| |
| SHL EAX, # 8
| |
| OR EAX, EBX
| |
| MOV EBX, ECX
| |
|
| |
| SAR ECX, # 2
| |
| REP STOS DWORD
| |
| MOV ECX, EBX
| |
| AND ECX, # 3
| |
| @@1:
| |
| REP STOS BYTE
| |
| MOV EDI, EDX
| |
| LEA EBP, 0C [EBP]
| |
| MOV EAX, -4 [EBP]
| |
| RET
| |
| END-CODE
| |
| </pre>
| |
|
| |
| === Советская реализация ===
| |
| Описание и определение слова FILL в ядре ФОРТ-ЕС:
| |
| <PRE>
| |
| FILL A,U,C-> ЗАСЛАТЬ С В U БАЙТОВ ПО АДРЕСУ А 22
| |
|
| |
| Экран номер 22
| |
| ( 31.03.86 FILL ERASE BLANK COMPILE [ ] MIN MAX HEX DECIMAL)
| |
|
| |
| : FILL ( A,U,C->) SWAP ?DUP IF >R OVER C!
| |
| DUP 1+ R> 1- CMOVE EXIT THEN 2DROP ;
| |
| </PRE>
| |
| В FORTH ИТЭФ слово FILL было [[примитив]]ом, который частично опирался на код [[примитив]]а [[DROP]], вот их определения:
| |
| <PRE>
| |
| HEAD 204Q,'DRO',320Q,DROP ; DROP
| |
| DRP: ADD SP, 2
| |
| NEXT
| |
| ...
| |
| HEAD 204Q,'FIL',314Q,FILL ; FILL
| |
| POP AX ; Символ
| |
| FLL: POP CX ; Счетчик символов
| |
| CMP CX, 0
| |
| JLE DRP ;
| |
| POP BX
| |
| $REPE: MOV BYTE PTR [BX], AL
| |
| INC BX
| |
|
| |
| LOOP $REPE
| |
| NEXT
| |
| </PRE>
| |
|
| |
|
| == Ссылки == | | == Ссылки == |
| * {{Исходник|FILL|FILL}}
| | * См. также слова [[ERASE]] [[BLANK]] |
| * См. также слова [[ERASE]] и [[BLANK]] | |
| * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1540 FILL] в стандарте ANS Forth ''(англ.)'' | | * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1540 FILL] в стандарте ANS Forth ''(англ.)'' |
| * Слово [http://forth-standard.org/standard/core/FILL FILL] в черновике Forth 200x ''(англ.)'' | | * Слово [http://www.forth200x.org/documents/html3/core/FILL.html FILL] в черновике Forth 200x ''(англ.)'' |
| * [http://www.forth.com/starting-forth/sf8/sf8.html Variables, Constants, and Arrays] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''
| |
|
| |
|
|
| |
|
Строка 127: |
Строка 40: |
| {{заготовка}} | | {{заготовка}} |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Примитивы]]
| |
| [[Категория:Работа с памятью Каллисто]] | | [[Категория:Работа с памятью Каллисто]] |
| [[Категория:Стандартные слова]] | | [[Категория:Слова Каллисто без стековых диаграмм]] |
| [[Категория:1994 CORE]]
| |
| [[Категория:2012 CORE]]
| |