Редактирование: EMIT

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.

Текущая версия Ваш текст
Строка 1: Строка 1:
[[Файл:CallistoXorIdotRegQEmitHex.png|thumb|right|264px|Пример работы слова EMIT]]
'''EMIT''' (испустить, выдать) — стандартное слово [[Каллисто]].
'''EMIT''' (испустить, выдать) — стандартное слово [[Каллисто]].
EMIT          ( c −− )                            Отобразить литеру.
 
[[Файл:CallistoXorIdotRegQEmitHex.png|thumb|right|264px|Пример работы слова EMIT]]
Отобразить символ.
Отображает на [[индикатор]]е [[Знакогенератор|литеру]], код которой находится в [[Стек данных|стеке]].
 
Отображает на [[индикатор]]е [[Знакогенератор|символ]], код которого находится в [[Стек данных|стеке]].


== Ввод слова EMIT ==
== Ввод слова EMIT ==
Строка 8: Строка 10:


== EMIT в стандарте ANS Forth ==
== EMIT в стандарте ANS Forth ==
<PRE>
  6.1.1320  EMIT                                                            CORE
  6.1.1320  EMIT                                                            CORE
             ( x -- )
             ( x -- )
Строка 25: Строка 26:


         См.: 6.1.2310 TYPE.
         См.: 6.1.2310 TYPE.
</PRE>


== История ==
Слово EMIT является одним из наиболее старых и устоявшихся слов Форта.


EMIT появился в Форте в 1965 году, когда Чак Мур подрабатывал наёмным программистом в городе Нью-Йорк. Тогда появились миникомпьютеры, а с ними и терминалы. Интерпретатор был идеален для ввода с телетайпа и вскоре стал включать код для работы с выводом.
== EMIT в предыдущем стандарте Forth-83 (англ.) ==
 
[[Слово TYPE]] появилось, как цикл, вызывающий EMIT для отображения символов. В [[Каллисто]] [[Слово TYPE|TYPE]] работает быстрее, т.к [[ГРФ|обновляет экран]] после вывода всей строки, а EMIT — после каждого символа.
 
В MMSFORTH слово EMIT называлось ECHO
 
=== EMIT в предыдущем стандарте Forth-83 (англ.) ===
<PRE>
       EMIT        16b --                        M,83
       EMIT        16b --                        M,83
           The least-significant 7-bit ASCII character is displayed.
           The least-significant 7-bit ASCII character is displayed.
Строка 52: Строка 43:
       other than zero is an environmentally dependent usage.  EMIT must
       other than zero is an environmentally dependent usage.  EMIT must
       display as many bits as can be sent.
       display as many bits as can be sent.
</PRE>


=== EMIT в стандарте Forth-79 (англ.) ===
 
== EMIT в стандарте Forth-79 (англ.) ==
  EMIT          char --                      207
  EMIT          char --                      207
     Transmit character to the current output device.
     Transmit character to the current output device.


=== EMIT в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
 
== EMIT в fig-FORTH Release 1 glossary, май 1979 (англ.) ==
  EMIT          c  ---                            L0
  EMIT          c  ---                            L0
         Transmit ascii character c to the selected output device. OUT is
         Transmit ascii character c to the selected output device. OUT is
         incremented for each character output.
         incremented for each character output.


== Реализация ==
<pre>
984 ;#EMIT
985 ; EMIT            ( c −− )                            Отобразить литеру.
986 LEMIT:          .DB    4
987                .TEXT  "EMIT"
988                .DW    LEMI
989 EMIT:          .DW    JEMIT
990 JEMIT:          PKRM03  PGSB CHPUT              ; Отобразить на экране литеру, код которого находится в стеке.
991                PGOTO CHPUTC3
1000 CHPUTC3:        KGRPH
1001                PGOTO JDROP
2052 JDROP:          1                              ; Да, это обработчик DROP
2053 NDROP:          RM3 + M3                        ; А сюда сваливается 2DROP
2054                KGOTO9
</pre>
Реализация из SP-Forth 4.20:
<pre>
: EMIT ( x -- ) \ 94
\ Если x - изображаемый символ, вывести его на дисплей.
\ Программы, использующие управляющие символы, зависят от окружения.
  >R RP@ 1 TYPE
  RDROP
;
</pre>
=== Советская реализация ===
Слово EMIT в ФОРТ-ЕС и FORTH ИТЭФ также было [[примитив]]ом. Вот его описание и опубликованная часть определения из ядра ФОРТ-ЕС:
<PRE>
EMIT      С-> ВЫВЕСТИ НА ТЕРМИНАЛ ЛИТЕРУ С КОДОМ C              6
                    Экран номер 6
( 09.09.86 KEY CR EMIT TYPE (EXPECT/ RBLK MBLK )
(  следующие определения дают только имена процедур)
CODE  EMIT ( С-> ВЫВЕСТИ ЛИТЕРУ С КОДОМ С НА ТЕРМИНАЛ) END-CODE
</PRE>
Определение слова EMIT в FORTH ИТЭФ:
<PRE>
  OK:      NEXT
            HEAD    204Q,'EMI',324Q,EMIT,$EMIT          ; EMIT
  $EMIT    LABEL  FAR
            POP  AX
  ENT$:    PUSH  AX
            MOV  AH, 15
            INT  16
            POP  AX
            MOV  AH, 14
            JMP  $EM
  PRINT:    MOV  DX, 0  ; Установка номера принтера
            SUB  AH, AH
            INT  23
            TES  AH, 51Q
            JE    OK
  ERR4:    MOV  AL, AH
            ADD  AL, 60Q
            MOV  AH, 14
            INT  16
            MOV  DX, OFFSET ERMES4
            MOV  AH, 9H
            INT  21H
            JMP  TYPE$
  ERMES4:  DB  ' PRINTER ERROR $'
</PRE>
=== colorForth (cf2019.nasm 2019 Sep 14) ===
<PRE>
clip1:
    mov  edi, [ v_xy ]
    mov  ecx, edi
    test cx, cx
    jns  .forward
    xor  ecx, ecx
.forward:
    and  ecx, 0x0000FFFF
    mov  [ v_yc ], ecx
    imul ecx, ( scrnw1 * BYTES_PER_PIXEL )
    sar  edi, 16
    jns  .forward2
    xor  edi, edi
.forward2:
    mov  [ v_xc ], edi
    lea  edi, [ edi * BYTES_PER_PIXEL + ecx ]
    add  edi, [ vframe ]
    ret
bit16:                    ; write a 16 x 24 glyph to the graphic screen
    lodsw                ; load the 16 bit value pointed to by SI into  ax
    xchg al, ah            ; eax_TOS_
.back:
    shl ax, 0x01            ; eax_TOS_
    jnc  .forward
    mov  [ edi ], dx        ;
    jmp .forward2
.forward:
    ror edx, 0x10          ; use the background colour, in the high 16 bits
;    mov [ edi ], dx        ;
    ror edx, 0x10          ; return to the foreground colour, in the low 16 bits
.forward2:
    add edi, byte BYTES_PER_PIXEL
    loop .back
    ret
; write the background after the glyph
bit16Background:          ; number of pixels to write in  ecx ,  screen address in  edi , colours in edx
    ror edx, 0x10          ; use the background colour, in the high 16 bits
.back:
;    mov [ edi ], dx        ;
    add edi, byte BYTES_PER_PIXEL
    loop .back
    ror edx, 0x10          ; return to the foreground colour, in the low 16 bits
    ret
emit1:      ; ( c -- )  \ display a single width and height character
    call qcr
    push esi
    push edi
    push edx
    imul _TOS_, byte 16*24/8
    lea esi, [ _TOS_ + font16x24 ]
    call clip1
    mov edx, [ v_foregroundColour ]
    mov ecx, 0x18  ; 24 lines
.back:
    push ecx
    mov ecx, 0x10
    call bit16
    mov ecx, 0x04
    push edi
    call bit16Background
    pop edi
    pop ecx
    add edi, ( scrnw1 - 16 ) * BYTES_PER_PIXEL  ; address of the next line of the glyph
    loop .back      ; next horizontal line
    mov ecx, 0x04  ; 4 background lines
.back2:
    push ecx
    mov ecx, 0x10
    call bit16Background
    mov ecx, 0x04
    push edi
    call bit16Background
    pop edi
    pop ecx
    add edi, ( scrnw1 - 16 ) * BYTES_PER_PIXEL  ; address of the next line of the glyph
    loop .back2      ; next horizontal line
    pop edx
    pop edi
    pop esi
    _DROP_
space1:
    add dword [ v_xy ], iconw1 * 0x10000 ; 22 horizontal pixels
    ret
clip2:
    mov  edi, [ v_xy ]
    mov  ecx, edi
    test cx, cx
    jns  .forward
    xor  ecx, ecx
.forward:
    and  ecx, 0x0000FFFF
    mov  [ v_yc ], ecx
    imul ecx, ( scrnw2 * BYTES_PER_PIXEL )
    sar  edi, 16
    jns  .forward2
    xor  edi, edi
.forward2:
    mov  [ v_xc ], edi
    lea  edi, [ edi * BYTES_PER_PIXEL + ecx ]
    add  edi, [ vframe ]
    ret
emit2:      ; ( c -- )  \ display a single width and height character
    call qcr
    push esi
    push edi
    push edx
    imul _TOS_, byte 16*24/8
    lea esi, [ _TOS_ + font16x24 ]
    call clip2
    mov edx, [ v_foregroundColour ]
    mov ecx, 0x18  ; 24 lines
.back:
    push ecx
    mov ecx, 0x10
    call bit16
    mov ecx, 0x04
    push edi
    call bit16Background
    pop edi
    pop ecx
    add edi, ( scrnw2 - 16 ) * BYTES_PER_PIXEL  ; address of the next line of the glyph
    loop .back      ; next horizontal line
    mov ecx, 0x04  ; 4 background lines
.back2:
    push ecx
    mov ecx, 0x10
    call bit16Background
    mov ecx, 0x04
    push edi
    call bit16Background
    pop edi
    pop ecx
    add edi, ( scrnw2 - 16 ) * BYTES_PER_PIXEL  ; address of the next line of the glyph
    loop .back2      ; next horizontal line
    pop edx
    pop edi
    pop esi
    _DROP_
space2:
    add dword [ v_xy ], iconw2 * 0x10000 ; 22 horizontal pixels
    ret
emit_:
    cmp byte [ displayMode ], 0
    jz emit1
    jmp emit2
</PRE>


== Ссылки ==
== Ссылки ==
* {{Исходник|EMIT|EMIT}}
* См. слова [[SPACE]], [[слово ↵|↵]] и [[Слово ↖|↖]]
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1320 EMIT] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1320 EMIT] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth-standard.org/standard/core/EMIT EMIT] в черновике Forth 200x ''(англ.)''
* Слово [http://www.forth200x.org/documents/html3/core/EMIT.html EMIT] в черновике Forth 200x ''(англ.)''
* [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\01.OSNOWY%20FORTA ОСНОВЫ ФОРТА], [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\07.TISLO%20TIPOW%20TISEL ЧИСЛО ТИПОВ ЧИСЕЛ] и [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\10.WWOD-WYWOD ВВОД-ВЫВОД] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»]
* [http://www.forth.com/starting-forth/sf1/sf1.html Fundamental Forth], [http://www.forth.com/starting-forth/sf7/sf7.html A Number of Kinds of Numbers] и [http://www.forth.com/starting-forth/sf10/sf10.html I/O and You] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''




{{заготовка}}
{{заготовка}}
[[Категория:Слова Каллисто]]
[[Категория:Слова Каллисто]]
[[Категория:Примитивы]]
[[Категория:Терминальный ввод/вывод Каллисто]]
[[Категория:Терминальный ввод/вывод Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:Слова Каллисто без стековых диаграмм]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)
Источник — https://pmk.the-hacker.ru/EMIT