DIGIT: различия между версиями
AtH (обсуждение | вклад) |
AtH (обсуждение | вклад) |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 44: | Строка 44: | ||
877 STF: Cx PKM03 KGOTO9 ; [SP] := 0; NEXT | 877 STF: Cx PKM03 KGOTO9 ; [SP] := 0; NEXT | ||
</pre> | </pre> | ||
Реализации из SP-Forth 4.20: | |||
<pre> | |||
CODE DIGIT ( char n1 -- n2 true | false ) | |||
\ n2 - значение литеры char как | |||
\ цифры в системе счисления по основанию n1 | |||
MOV ECX, EAX | |||
MOV EAX, [EBP] | |||
A; 2C C, 30 C, \ SUB AL, # 30 | |||
JC SHORT @@1 | |||
A; 3C C, A C, \ CMP AL, # A | |||
JNC SHORT @@2 | |||
@@3: CMP AL, CL | |||
JNC SHORT @@1 | |||
MOV [EBP], EAX | |||
A; B8 C, TRUE W, TRUE W, \ MOV EAX, # -1 | |||
RET | |||
@@2: A; 3C C, 11 C, \ CMP AL, # 11 | |||
JC SHORT @@1 | |||
A; 2C C, 7 C, \ SUB AL, # 7 | |||
JMP SHORT @@3 | |||
@@1: LEA EBP, 4 [EBP] | |||
XOR EAX, EAX | |||
RET | |||
END-CODE | |||
</pre> | |||
<pre> | |||
\ : DIGIT ( C, N1 -> N2, TF / FF ) | |||
\ N2 - значение литеры C как | |||
\ цифры в системе счисления по основанию N1 | |||
( SWAP | |||
DUP 58 < | |||
OVER 47 > AND | |||
IF \ within 0..9 | |||
48 - | |||
ELSE | |||
DUP 64 > | |||
IF | |||
DUP 96 > IF 87 ELSE 55 THEN - | |||
ELSE 2DROP 0 EXIT THEN | |||
THEN | |||
TUCK > DUP 0= IF NIP THEN | |||
;) | |||
</pre> | |||
=== Советская реализация === | === Советская реализация === | ||
Описание и определение слова DIGIT в ядре ФОРТ-ЕС. ЕС ЭВМ использовала кодировку [https://ru.wikipedia.org/wiki/%D0%94%D0%9A%D0%9E%D0%98-8 ДКОИ-8], в которой не все латинские буквы идут последовательно: | Описание и определение слова DIGIT в ядре ФОРТ-ЕС. ЕС ЭВМ использовала кодировку [https://ru.wikipedia.org/wiki/%D0%94%D0%9A%D0%9E%D0%98-8 ДКОИ-8], в которой не все латинские буквы идут последовательно: |
Текущая версия от 18:18, 10 ноября 2017
DIGIT (цифра) — архаичное слово Каллисто.
DIGIT ( c u1 −− u2 1 | 0 ) Цифра. Преобразовать литеру c в число u2, используя основание u1.
ASCII-DIGIT BASE => DIGIT-VALUE TRUE / FALSE
Ввод слова DIGIT[править]
В режиме ЛАТ последовательно нажмите клавиши K 7 БП 7 2
История[править]
Хотя слово DIGIT не вошло ни в один из стандартов языка Форт, оно является одним из наиболее старых слов Форта. Слово DIGIT появилось в Форте в 1965 году, когда Чак Мур подрабатывал наёмным программистом в городе Нью-Йорк. Тогда появились миникомпьютеры, а с ними и терминалы. Интерпретатор был идеален для ввода с телетайпа и вскоре стал включать код для работы с выводом.
Из-за того, что слово DIGIT очень старое, оно возвращает в качестве истины 1 — хотя стандарт Каллисто это -1. Разное количество аргументов на стеке — опасная практика, от которой тоже уже давно отказались.
DIGIT в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]
DIGIT c n1 --- n2 tf (ok) c n1 --- ff (bad) Converts the ascii character c (using base n1) to its binary equivalent n2, accompanied by a true flag. If the conversion is invalid, leaves only a false flag.
Реализация[править]
В Каллисто 1.0 слово DIGIT использует устаревшее значение 1, как истины:
795 ;#DIGIT 796 ; DIGIT ( c u1 −− u2 1 | 0 ) Цифра. Преобразовать литеру c в число u2, используя основание u1. 797 ; ASCII−DIGIT BASE => DIGIT−VALUE TRUE / FALSE 798 ; Признаёт только заглавные буквы 799 ; Здесь в качестве истины возвращается 1, хотя Каллисто перешло на стандарт −1/0 800 LDIGIT: .DB 5 801 .TEXT "DIGIT" ; ( литера основание −− значение 1 | 0 ) 802 .DW LPFIND 803 DIGIT: .DW JDIGIT … 854 JDIGIT: ; Обработчик DIGIT 855 RM3 MA ; [RA] == BASE 856 1 + M3 857 PKRM03 48 − FX>=0 STF ; Правильная цифра = ASCII − 48 858 MB 10 − FX>=0 MO9 ; Если >9 859 3 + MB 860 10 − FX>=0 STF 861 MO9: RMB KRMA − FX<0 STF ; Если не меньше BASE, то ошибка 862 RMB PKM03 ; Записать цифру в стек, "успешный" выход 863 JONE: ; Обработчик 1 864 1 KM3 KGOTO9 … 877 STF: Cx PKM03 KGOTO9 ; [SP] := 0; NEXT
Реализации из SP-Forth 4.20:
CODE DIGIT ( char n1 -- n2 true | false ) \ n2 - значение литеры char как \ цифры в системе счисления по основанию n1 MOV ECX, EAX MOV EAX, [EBP] A; 2C C, 30 C, \ SUB AL, # 30 JC SHORT @@1 A; 3C C, A C, \ CMP AL, # A JNC SHORT @@2 @@3: CMP AL, CL JNC SHORT @@1 MOV [EBP], EAX A; B8 C, TRUE W, TRUE W, \ MOV EAX, # -1 RET @@2: A; 3C C, 11 C, \ CMP AL, # 11 JC SHORT @@1 A; 2C C, 7 C, \ SUB AL, # 7 JMP SHORT @@3 @@1: LEA EBP, 4 [EBP] XOR EAX, EAX RET END-CODE
\ : DIGIT ( C, N1 -> N2, TF / FF ) \ N2 - значение литеры C как \ цифры в системе счисления по основанию N1 ( SWAP DUP 58 < OVER 47 > AND IF \ within 0..9 48 - ELSE DUP 64 > IF DUP 96 > IF 87 ELSE 55 THEN - ELSE 2DROP 0 EXIT THEN THEN TUCK > DUP 0= IF NIP THEN ;)
Советская реализация[править]
Описание и определение слова DIGIT в ядре ФОРТ-ЕС. ЕС ЭВМ использовала кодировку ДКОИ-8, в которой не все латинские буквы идут последовательно:
DIGIT * C,N1->N2,TP/FF N2 - ЗНАЧЕНИЕ ЛИТЕРЫ С КАК 39 ЦИФРЫ В СИСТЕМЕ СЧИСЛЕНИЯ ПО ОСНОВАНИЮ N1 Экран номер 39 ( 31.03.86 DIGIT CONVERT NUMBER ) : DIGIT ( C,N1->N2,TF/FF) 0 ROT ROT 0 DO I ALPHA OVER ─ IF 2DROP I -1 0 LEAVE THEN LOOP DROP ;
В FORTH ИТЭФ слово DIGIT тоже было примитивом, вот его определение:
HEAD 205Q,'DIGI',324Q,DIGIT ; DIGIT ; ASCII-DIGIT BASE=>DIGIT-VALUE TRUE (FALSE) POP AX ; AX=BASE POP CX SUB CX, 60Q ; VALID DIGIT = ASCII-60 JL FALSE CMP CX, 9 ; Если >9 JLE M09 SUB CX, 7 CMP CX, 10 JL FALSE M09: CMP CX, AX ; Если не меньше BASE, то ошибка JGE FALSE PUSH CX ; Запись цифры в стек JMP TRUE ; "Успешный" выход
Ссылки[править]
- Исходный текст слова DIGIT в Каллисто Классик 1.0
- См. слова BASE, NUMBER, UCONVERT и U#
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |