Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''ACCEPT''' (принять) — стандартное слово [[Каллисто]]. Ввод строки с клавиатуры. | | '''ACCEPT''' (принять) — стандартное слово [[Каллисто]]. |
| ACCEPT ( a u1 −− u2 ) Ввести с клавиатуры строку в буфер с адресом a длиной u1.
| |
| u2 −− число введённых литер.
| |
| Слово '''ACCEPT''' осуществляет такой же ввод строки, как вы вводите команды при диалоге [[Каллисто]]. Для редактирования служит [[Клавиша Сx|клавиша {{Красная клавиша|BS}}]] (удалить последний введённый символ) и комбинация клавиш [[Клавиша F|{{Оранжевая клавиша|F}}]] [[Клавиша Сx|{{Красная клавиша|BS}}]] (удалить все введённые символы).
| |
| | |
| Ввод завершается [[Клавиша Ввод|клавишей {{Синяя клавиша|Ввод}}]]. Курсор уберётся с индикатора, оставшись сразу после последнего введённого символа. При этом введённая строка располагается в памяти, начиная с [[Единое адресное пространство|адреса]] a. В [[Стек данных|стек]] заносится u2 — число реально введённых символов. Слово '''ACCEPT''' не позволит ввести больше символов, чем u1.
| |
|
| |
|
| == Ввод слова ACCEPT == | | == Ввод слова ACCEPT == |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши {{ШГ←}} [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша 6|{{Серая клавиша|6}}]] [[Клавиша 2|{{Серая клавиша|2}}]] | | В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша ШГ влево|{{Чёрная клавиша|ШГ←}}]] [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша 6|{{Серая клавиша|6}}]] [[Клавиша 2|{{Серая клавиша|2}}]] |
|
| |
|
| == ACCEPT в стандарте ANS Forth == | | == ACCEPT в стандарте ANS Forth == |
| <PRE>
| |
| 6.1.0695 ACCEPT CORE | | 6.1.0695 ACCEPT CORE |
| ( c-addr +n1 -- +n2 ) | | ( c-addr +n1 -- +n2 ) |
Строка 82: |
Строка 76: |
| курсор остался немедленно после введенного текста после получения признака | | курсор остался немедленно после введенного текста после получения признака |
| конца строки. | | конца строки. |
| </PRE>
| |
|
| |
| == История ==
| |
| Слово EXPECT появилось в Форте в 1965 году, когда Чак Мур подрабатывал наёмным программистом в городе Нью-Йорк. Тогда появились миникомпьютеры, а с ними и терминалы. Интерпретатор был идеален для ввода с телетайпа.
| |
|
| |
| В то время EXPECT был циклом, вызывающим [[KEY]] для чтения нажатий на клавиши.
| |
|
| |
| В 1994 году стандарт ANS рекомендовал использовать улучшенное слово ACCEPT вместо устаревшего слова EXPECT
| |
|
| |
| Это новое слово ACCEPT и вошло в первую версию [[Каллисто]].
| |
|
| |
| == Реализация ==
| |
| <pre>
| |
| 1210 ;#ACCEPT
| |
| 1211 ; ACCEPT ( a c1 −− c2 ) Ввести с клавиатуры строку в буфер с адресом a длиной c1. c2 −− число введённых литер.
| |
| 1212 ; В конце два нуля не добавляются, теперь это обязанность вызывающей стороны.
| |
| 1213 LACCE: .DB 6
| |
| 1214 .TEXT "ACCEPT" ; ( a n1 −− n2 )
| |
| 1215 .DW LINKEY
| |
| 1216 ACCE: .DW JACCE
| |
| 1217 JACCE: RM3 MA 1 + MB M3
| |
| 1218 KRMB 4 F10^X − MB ; RB − адрес, куда записываются литеры
| |
| 1219 KRMA M7 ; R7 − максимальное количество литер
| |
| 1220 PPRM rrSCRLN ; Заранее подготовить данные для прокрутки
| |
| 1221 8 ∗ M4 ; R4 − на сколько линий корректируем y при прокрутке
| |
| 1222 RM2 M1 ; R1 − буфер в стеке возвратов, хранящий "откат"
| |
| 1223 ACCST: CX M0 ; R0 − количество введённых литер
| |
| 1224 EXPE0: PGSB CHGET
| |
| 1225 MA 8 − FX=0 EXPE1 ; Введён код BS?
| |
| 1226 RM0 FX!=0 EXPE0 ; Если ничего не введено, игнорировать
| |
| 1227 1 − M0 PGSB ACCBS ; Удалить последнюю литеру
| |
| 1228 JEXPE0: GOTO EXPE0
| |
| 1229 EXPE1: 5 − FX=0 EXPE2 ; ENTER?
| |
| 1230 RM0 PKM03 KGOTO9 ; Возвратить длину строки
| |
| 1231 EXPE2: 114 − FX=0 ACCECH ; F CX?
| |
| 1232 RM0 FX!=0 EXPE0 ; Если ничего не введено, игнорировать
| |
| 1233 ACCLP: PGSB ACCBS
| |
| 1234 FL0 ACCLP
| |
| 1235 GOTO ACCST
| |
| 1236 ACCECH:
| |
| 1237 RM0 RM7 − FX<0 EXPE0 ; Введены все литеры?
| |
| 1238 RM0 1 + M0 ; Увеличить счётчик литер
| |
| 1239 RMA KMB RMB 1 + MB ; Добавить литеру к строке
| |
| 1240 PPRM9000 ; Взять координаты курсора
| |
| 1241 129 PPRM rrCHW − ; Предельная координата по горизонтали
| |
| 1242 − FX>=0 EXPE3 ; В конце экранной строки?
| |
| 1243 <−> PPRM rrCHH + ; Увеличить на высоту данного шрифта
| |
| 1244 65 FANS − − FX<0 EXPE4 ; На последней строке?
| |
| 1245 FANS + 0 PPM9000 ; Просто опуститься на строчку вниз, в начало
| |
| 1246 GOTO EXPE3
| |
| 1247 EXPE4: PGSB CHPUTCR ; Курсор в начало строки
| |
| 1248 PGSB CHPUTSCROLL ; Прокрутка экрана нужным цветом на нужное число строк
| |
| 1249 RM1 ; Начало буфера откатов
| |
| 1250 EXPE5: M8 RM2 − FX<0 EXPE3 ; Всё скорректировали?
| |
| 1251 KRM8 RM4 − 0 KMAX KM8 ; y −= 8 ∗ кол−во линий прокрутки или 0
| |
| 1252 RM8 3 + GOTO EXPE5
| |
| 1253 EXPE3: ; Вывод обычной литеры на экран
| |
| 1254 RM1 3 − M1 1 − M5 ; Новый элемент в буфере откатов
| |
| 1255 PPRM9000 <−> KM5 FANS KM5 ; Записать Y, X; X в RX1
| |
| 1256 RMA PPM9020 ; Вывести литеру на индикатор
| |
| 1257 PPRM9000 FANS − KM5 ; Записать dX
| |
| 1258 PGOTO EXPE0
| |
| 1259 ACCBS: ; Клавиша Cx, сделать "пробел назад" (BS)
| |
| 1260 RMB 1 − MB ; Укоротить введённую строку
| |
| 1261 RM1 3 + M1 4 − M5 ; Укоротить буфер откатов на 3 байта
| |
| 1262 KRM5 KRM5 PPM9000 ; Считать y, x; Установить курсор на предыдущую литеру
| |
| 1263 4 PPRM9001 KXOR ; Сохранить атрибуты вывода в RX1
| |
| 1264 PPM9001 ; Установить атрибут 4 для DARK и 0 для LIGHT
| |
| 1265 PPRM rrCHH KRM5 PPM9013 ; Шрифтовой dy; Считать dX; Вывод прямоугольника (dX может быть равен нулю)
| |
| 1266 FANS PPM9001 ; Восстановить атрибуты вывода из X1
| |
| 1267 RTN
| |
| </pre>
| |
| Реализация из SP-Forth 4.20:
| |
| <pre>
| |
| VECT ACCEPT
| |
|
| |
| : ACCEPT1 ( c-addr +n1 -- +n2 ) \ 94
| |
| \ Ввести строку максимальной длины до +n1 символов.
| |
| \ Исключительная ситуация возникает, если +n1 0 или больше 32767.
| |
| \ Отображать символы по мере ввода.
| |
| \ Ввод прерывается, когда получен символ "конец строки".
| |
| \ Ничего не добавляется в строку.
| |
| \ +n2 - длина строки, записанной по адресу c-addr.
| |
| OVER SWAP
| |
| H-STDIN READ-LINE
| |
|
| |
| DUP 109 = IF DROP -1002 THEN THROW ( ~ruv)
| |
| 0= IF -1002 THROW THEN ( ~ac)
| |
|
| |
| TUCK TO-LOG
| |
| EOLN TO-LOG \ Если ввод с user-device записать cr в лог, то есть нажали Enter
| |
| ;
| |
|
| |
| ' ACCEPT1 ' ACCEPT TC-VECT!
| |
| </pre>
| |
|
| |
|
| === Советская реализация EXPECT === | | == Реализация EXPECT == |
| Юрий Семёнов приводит следующее описание слова EXPECT через цикл DO (стр. 65-66): | | Юрий Семёнов приводит следующее описание слова EXPECT через цикл DO (стр. 65-66): |
| : EXPECT ( в стеке адрес ввода и максимальное число | | : EXPECT ( в стеке адрес ввода и максимальное число |
Строка 193: |
Строка 92: |
| 2 ERASE ; ( запись нулей в два последних байта) | | 2 ERASE ; ( запись нулей в два последних байта) |
|
| |
|
| Определение слова EXPECT в ядре ФОРТ-ЕС использует примитив (EXPECT)
| | == История == |
| | Слово EXPECT появилось в Форте в 1965 году, когда Чак Мур подрабатывал наёмным программистом в городе Нью-Йорк. Тогда появились миникомпьютеры, а с ними и терминалы. Интерпретатор был идеален для ввода с телетайпа. |
|
| |
|
| Вот их опубликованные описания и определения:
| | В то время EXPECT был циклом, вызывающим [[KEY]] для чтения нажатий на клавиши. |
| <PRE>
| |
| (EXPECT) * А,+N1->А,+N2 ВВЕСТИ С ТЕРМИНАЛА 6
| |
| +N1 ЛИТЕР ПО АДРЕСУ А ДО ПЕРЕВОДА СТРОКИ;
| |
| +N2 - ФАКТИЧЕСКОЕ ЧИСЛО ВВЕДЕННЫХ ЛИТЕР
| |
|
| |
|
| EXPECT A,+N-> ВВЕСТИ С ТЕРМИНАЛА +N ЛИТЕР ПО 40 | | В 1994 году стандарт ANS рекомендовал использовать улучшенное слово ACCEPT вместо устаревшего слова EXPECT |
| АДРЕСУ A,В ПЕРЕМЕННУЯ "SPAN" ЗАСЛАТЬ
| |
| ФАКТИЧЕСКОЕ ЧИСЛО ВВЕДЕННЫХ ЛИТЕР)
| |
| ЛИТЕРЫ НАПЕЧАТАТЬ НИ ТЕРМИНАЛЕ
| |
|
| |
|
| Экран номер 6
| | Это новое слово ACCEPT и вошло в первую версию [[Каллисто]]. |
| ( 09.09.86 KEY CR EMIT TYPE (EXPECT/ RBLK MBLK )
| |
| ( следующие определения дают только имена процедур)
| |
| | |
| CODE (EXPECT) ( A,N1->A,N2 ВВЕСТИ С ТЕРМИНАЛА НЕ БОЛЕЕ
| |
| N1 ЛИТЕР /ДО ПЕРЕВОДА СТРОКИ/ В БУФЕР ПО АДРЕСУ А;
| |
| N2 - ФАКТИЧЕСКОЕ ЧИСЛО ВВЕДЕННЫХ ЛИТЕР) END-CODE
| |
| | |
| Экран номер 40
| |
| ( 31.03.84 EXPECT OUERY INTERPRET ФОРТ-СИСТЕМА X )
| |
| | |
| : EXPECT ( A,+N->) DUP >R (EXPECT) DUP SPAN !
| |
| TYPE R> SPAN @ - IF SPACE THEN ;
| |
| </PRE>
| |
| | |
| В FORTH ИТЭФ слово EXPECT также было [[примитив]]ом, обёрткой вокруг соответствующей функции DOS. Вот его определение:
| |
| <PRE>
| |
| | |
| HEAD 206Q,'EXPEC',324Q,EXPE ; EXPECT
| |
| MOV AH, 0AH
| |
| POP CX ; Число символов
| |
| POP BX ; Адрес буфера SS
| |
| MOV BYTE PTR [BX], CL ; Засылка ожидаемого числа
| |
| MOV DX, BX
| |
| INT 21H
| |
| | |
| MOV AL, BYTE PTR [BX+1]
| |
| SUB AH, AH
| |
| ADD BX, AX
| |
| MOV WORD PTR [BX+2],0
| |
| NEXT
| |
| </PRE>
| |
|
| |
|
| == Ссылки == | | == Ссылки == |
| * {{Исходник|ACCEPT|ACCEPT}}
| | * См. слова [[KEY]], [[TIB]], [[QUERY]] и [[TYPE]] |
| * См. слова [[KEY]], [[TIB]], [[QUERY]] и [[Слово TYPE|TYPE]] | | * См. также слово EXPECT в [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 Л.Броуди «Начальный курс программирования на языке Форт»] |
| * См. также слово EXPECT в главе [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 Л.Броуди «Начальный курс программирования на языке Форт»] | |
| * См. также слово ACCEPT в главе [http://www.forth.com/starting-forth/sf10/sf10.html I/O and You] книги [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''
| |
| * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0695 ACCEPT] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.0695 комментарий к нему] в стандарте ANS Forth ''(англ.)'' | | * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0695 ACCEPT] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.0695 комментарий к нему] в стандарте ANS Forth ''(англ.)'' |
| * Слово [http://forth-standard.org/standard/core/ACCEPT ACCEPT] и [http://forth-standard.org/standard/rationale#rat:core:ACCEPT комментарий к нему] в черновике Forth 200x ''(англ.)'' | | * Слово [http://www.forth200x.org/documents/html3/core/ACCEPT.html ACCEPT] и [http://www.forth200x.org/documents/html3/rationale.html#rat:core:ACCEPT комментарий к нему] в черновике Forth 200x ''(англ.)'' |
| | * [http://www.forth.com/starting-forth/sf10/sf10.html I/O and You] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)'' |
|
| |
|
|
| |
|
Строка 253: |
Строка 114: |
| [[Категория:Примитивы]] | | [[Категория:Примитивы]] |
| [[Категория:Терминальный ввод/вывод Каллисто]] | | [[Категория:Терминальный ввод/вывод Каллисто]] |
| [[Категория:Стандартные слова]] | | [[Категория:Слова Каллисто без стековых диаграмм]] |
| [[Категория:1994 CORE]]
| |
| [[Категория:2012 CORE]]
| |