Текущая версия |
Ваш текст |
Строка 2: |
Строка 2: |
| ACCEPT ( a u1 −− u2 ) Ввести с клавиатуры строку в буфер с адресом a длиной u1. | | ACCEPT ( a u1 −− u2 ) Ввести с клавиатуры строку в буфер с адресом a длиной u1. |
| u2 −− число введённых литер. | | u2 −− число введённых литер. |
| Слово '''ACCEPT''' осуществляет такой же ввод строки, как вы вводите команды при диалоге [[Каллисто]]. Для редактирования служит [[Клавиша Сx|клавиша {{Красная клавиша|BS}}]] (удалить последний введённый символ) и комбинация клавиш [[Клавиша F|{{Оранжевая клавиша|F}}]] [[Клавиша Сx|{{Красная клавиша|BS}}]] (удалить все введённые символы). | | Слово ACCEPT осуществляет такой же ввод строки, как вы вводите команды при диалоге [[Каллисто]]. Для редактирования служит [[Клавиша Сx|клавиша {{Красная клавиша|BS}}]] (удалить последний введённый символ) и комбинация клавиш [[Клавиша F|{{Оранжевая клавиша|F}}]] [[Клавиша Сx|{{Красная клавиша|BS}}]] (удалить все введённые символы). |
|
| |
|
| Ввод завершается [[Клавиша Ввод|клавишей {{Синяя клавиша|Ввод}}]]. Курсор уберётся с индикатора, оставшись сразу после последнего введённого символа. При этом введённая строка располагается в памяти, начиная с [[Единое адресное пространство|адреса]] a. В [[Стек данных|стек]] заносится u2 — число реально введённых символов. Слово '''ACCEPT''' не позволит ввести больше символов, чем u1. | | Ввод завершается [[Клавиша Ввод|клавишей {{Синяя клавиша|Ввод}}]]. Курсор уберётся с индикатора, оставшись сразу после последнего введённого символа. При этом введённая строка располагается в памяти, начиная с [[Единое адресное пространство|адреса]] a. В [[Стек данных|стек]] заносится u2 — число реально введённых символов. Слово ACCEPT не даст ввести большее символов, чем u1. |
|
| |
|
| == Ввод слова ACCEPT == | | == Ввод слова ACCEPT == |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши {{ШГ←}} [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша 6|{{Серая клавиша|6}}]] [[Клавиша 2|{{Серая клавиша|2}}]] | | В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша ШГ влево|{{Чёрная клавиша|ШГ←}}]] [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша 6|{{Серая клавиша|6}}]] [[Клавиша 2|{{Серая клавиша|2}}]] |
|
| |
|
| == ACCEPT в стандарте ANS Forth == | | == ACCEPT в стандарте ANS Forth == |
Строка 93: |
Строка 93: |
| Это новое слово ACCEPT и вошло в первую версию [[Каллисто]]. | | Это новое слово ACCEPT и вошло в первую версию [[Каллисто]]. |
|
| |
|
| == Реализация == | | == Реализация EXPECT == |
| <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 через цикл DO (стр. 65-66): | | Юрий Семёнов приводит следующее описание слова EXPECT через цикл DO (стр. 65-66): |
| : EXPECT ( в стеке адрес ввода и максимальное число | | : EXPECT ( в стеке адрес ввода и максимальное число |
Строка 221: |
Строка 136: |
| </PRE> | | </PRE> |
|
| |
|
| В FORTH ИТЭФ слово EXPECT также было [[примитив]]ом, обёрткой вокруг соответствующей функции DOS. Вот его определение: | | В FORTH ИТЭФ слово EXPECT также было [[примитив]]ом, вот его определение: |
| <PRE> | | <PRE> |
|
| |
|
Строка 255: |
Строка 170: |
| [[Категория:Стандартные слова]] | | [[Категория:Стандартные слова]] |
| [[Категория:1994 CORE]] | | [[Категория:1994 CORE]] |
| [[Категория:2012 CORE]]
| |