Редактирование:
ACCEPT
(раздел)
Перейти к навигации
Перейти к поиску
Внимание:
Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы
войдёте
или
создадите учётную запись
, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.
Анти-спам проверка.
Не
заполняйте это!
== Реализация == <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 ( в стеке адрес ввода и максимальное число вводимых символов) 0 DO ( начало цикла, в стеке только адрес ввода) KEY ↑ 13 = ( введённый символ <ВК> ? ) IF ( если да, то ) LEAVE DROP 0 ( уход из цикла, если нажата клавиша <ВК>) THEN OVER C! ( запись очередного символа в буфер) 1+ ( в стеке адрес, куда будет введён следующий байт) LOOP ( конец цикла) 2 ERASE ; ( запись нулей в два последних байта) Определение слова EXPECT в ядре ФОРТ-ЕС использует примитив (EXPECT) Вот их опубликованные описания и определения: <PRE> (EXPECT) * А,+N1->А,+N2 ВВЕСТИ С ТЕРМИНАЛА 6 +N1 ЛИТЕР ПО АДРЕСУ А ДО ПЕРЕВОДА СТРОКИ; +N2 - ФАКТИЧЕСКОЕ ЧИСЛО ВВЕДЕННЫХ ЛИТЕР EXPECT A,+N-> ВВЕСТИ С ТЕРМИНАЛА +N ЛИТЕР ПО 40 АДРЕСУ A,В ПЕРЕМЕННУЯ "SPAN" ЗАСЛАТЬ ФАКТИЧЕСКОЕ ЧИСЛО ВВЕДЕННЫХ ЛИТЕР) ЛИТЕРЫ НАПЕЧАТАТЬ НИ ТЕРМИНАЛЕ Экран номер 6 ( 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>
Описание изменений:
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см.
Pmkwiki:Авторские права
).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!
В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:
Отменить
Справка по редактированию
(в новом окне)
Навигация
Персональные инструменты
Вы не представились системе
Обсуждение
Вклад
Создать учётную запись
Войти
Пространства имён
Статья
Обсуждение
русский
Просмотры
Читать
Править
История
Ещё
Поиск
Навигация
Заглавная страница
Свежие правки
Случайная страница
Справка по MediaWiki
Инструменты
Ссылки сюда
Связанные правки
Служебные страницы
Сведения о странице