FILL: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показаны 33 промежуточные версии этого же участника)
Строка 1: Строка 1:
'''FILL''' — стандартное слово [[Каллисто]].
'''FILL''' (заполнить) — стандартное слово [[Каллисто]].
FILL          ( a u c −− )                        Заполнить. Записать u байтов c, начиная с адреса a.
Слово FILL записывает u байт c в память, начиная с адреса a. Универсальный оператор для заполнения массивов памяти идентичными символами. На основе слова FILL реализованы специализированные слова [[ERASE]] и [[BLANK]], заполняющие области памяти нулями и пробелами.
 
== Ввод слова FILL ==
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите четыре клавиши [[Клавиша П|{{Чёрная клавиша|П}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша -|{{Серая клавиша|−}}]] [[Клавиша -|{{Серая клавиша|−}}]]
 
== FILL в стандарте ANS Forth ==
6.1.1540  FILL                                                            CORE
            ( c-addr u char -- )
            Если u больше чем нуль, сохраняет char в каждом из u
            последовательных символов в памяти, начинающейся с c-addr.
 
== История ==
Слово FILL пришло в [[Каллисто]] из Форта, где оно является древним и стабильным. В существующем ныне виде слово FILL известно с 1979 года и входит во все стандарты.
 
=== FILL в предыдущем стандарте Forth-83 (англ.) ===
      FILL        addr u 8b --                  83
          u bytes of memory beginning at addr are set to 8b.  No
          action is taken if u is zero.
 
=== FILL в стандарте Forth-79 (англ.) ===
FILL          addr n byte --                234
    Fill  memory beginning at address with a sequence of n  copies
    of  byte.  If the quantity n is less than or equal  to  zero,
    take no action.
 
=== FILL в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
FILL addr quan 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>


== Ссылки ==
== Ссылки ==
* [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1540 Слово FILL (two-star) в стандарте ANS Forth] ''(англ.)''
* {{Исходник|FILL|FILL}}
* См. также слова [[ERASE]] и [[BLANK]]
* Слово [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.forth.com/starting-forth/sf8/sf8.html Variables, Constants, and Arrays] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''




Строка 8: Строка 127:
{{заготовка}}
{{заготовка}}
[[Категория:Слова Каллисто]]
[[Категория:Слова Каллисто]]
[[Категория:Примитивы]]
[[Категория:Работа с памятью Каллисто]]
[[Категория:Работа с памятью Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]

Текущая версия от 17:11, 10 ноября 2017

FILL (заполнить) — стандартное слово Каллисто.

FILL           ( a u c −− )                         Заполнить. Записать u байтов c, начиная с адреса a.

Слово FILL записывает u байт c в память, начиная с адреса a. Универсальный оператор для заполнения массивов памяти идентичными символами. На основе слова FILL реализованы специализированные слова ERASE и BLANK, заполняющие области памяти нулями и пробелами.

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

В режиме ЛАТ последовательно нажмите четыре клавиши  П   7       

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

6.1.1540   FILL                                                            CORE
           ( c-addr u char -- )
           Если u больше чем нуль, сохраняет char в каждом из u 
           последовательных символов в памяти, начинающейся с c-addr.

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

Слово FILL пришло в Каллисто из Форта, где оно является древним и стабильным. В существующем ныне виде слово FILL известно с 1979 года и входит во все стандарты.

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

     FILL         addr u 8b --                  83
          u bytes of memory beginning at addr are set to 8b.  No
          action is taken if u is zero.

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

FILL           addr n byte --                234
    Fill  memory beginning at address with a sequence of n  copies
    of  byte.   If the quantity n is less than or equal  to  zero,
    take no action.

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

FILL addr quan b --
       Fill memory at the address with the specified quantity of bytes b.

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

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

Реализация из SP-Forth 4.20:

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

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

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

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 ;

В FORTH ИТЭФ слово FILL было примитивом, который частично опирался на код примитива DROP, вот их определения:

            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

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


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


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