[<>] ~~TOC wide~~ {{anchor:n106}} ====== 1.6. Реализация вещественной арифметики на машинном языке ====== \\ Изучай все не из тщеславия, а ради \\ практической пользы. —//Г.Лихтенберг. Афоризмы// В системной области имеются два вещественных "регистра" — //аккумулятора//, при помощи которых компьютер осуществляет все арифметические операции: * * DAC ("Decimal ACcumulator"-"десятичный аккумулятор") — F7F6h, 16 байтов, * ARG ("ARGument"-"аргумент") — F847h, 16 байтов. //Вещественное// число в аккумуляторах размещается следующим образом: F7F6h F7F7h F7FDh ┌──────────────┬───┬───┬───┬───┬───┬───┬───┐ │Знак и порядок│ М а н т и с с а │ DAC └──────────────┴───┴───┴───┴───┴───┴───┴───┘ F847h F848h F84Eh ┌──────────────┬───┬───┬───┬───┬───┬───┬───┐ │Знак и порядок│ М а н т и с с а │ ARG └──────────────┴───┴───┴───┴───┴───┴───┴───┘ //Целое// число в аккумуляторе располагается следующим образом: F7F6h F7F7h F7F8h F7F9h ┌────────┬────────┬─────────────┬─────────────┐ │ Незначащие байты│ Младший байт│ Старший байт│ DAC └────────┴────────┴─────────────┴─────────────┘ F847h F848h F849h F84Ah ┌────────┬────────┬─────────────┬─────────────┐ │ Незначащие байты│ Младший байт│ Старший байт│ ARG └────────┴────────┴─────────────┴─────────────┘ Подробнее о хранении чисел см. в [[010#n1041|разделе X.4.1]]. В ячейке VALTYP системной области (по адресу F663h) хранится тип числа, находящегося в аккумуляторе DAC, причем тип закодирован следующим образом: * 2 — целое число; * 4 — вещественное число одинарной точности; * 8 — вещественное число двойной точности. В следующих табличках приведен список входных точек очень полезных подпрограмм ROM. {{anchor:n1061}} ===== 1.6.1. Пересылки ===== ^ Имя \\ подпрограммы ^ Адрес ^ Выполняемые \\ действия ^ //Тип// ^ Изменяемые \\ регистры ^ |MAF|2C4Dh|ARG := DAC|Double|A,B,D,E,H,L,ARG | |AM|2C50h|ARG := (HL)| Double | A,B,D,E,H,L,ARG| |MOV8DH|2C53h|(DE):= (HL)|Double|A,B,D,E,H,L| |MFA|2C59h|DAC := ARG|Double|A,B,D,E,H,L,DAC| |MFM|2C5Ch|DAC := (HL)|Double|A,B,D,E,H,L,DAC| |MMF|2C67h|(HL):= DAC|Double|A,B,D,E,H,L| |MOV8HD|2C6Ah|(HL):= (DE)|Double|A,B,D,E,H,L| |XTF|2C6Fh|(SP):= DAC|Double|A,B,D,E,H,L| |PHA|2CC7h|ARG := (SP)|Double|A,B,D,E,H,L,ARG| |PHF|2CCCh|DAC := (SP)|Double|A,B,D,E,H,L,DAC| |PPA|2CDCh|(SP):= ARG|Double|A,B,D,E,H,L| |PPF|2CE1h|(SP):= DAC|Double|A,B,D,E,H,L| |PUSHF|2EB1h|DAC := (SP)|Single|D,E,DAC| |MOVFM|2EBEh|DAC := (HL)|Single|B,C,D,E,H,L,DAC| |MOVFR|2EC1h|DAC := (CBED)| Single |DAC,D,E| |MOVRF|2ECCh|(CBED):= DAC| Single |B,C,D,E,H,L| |MOVRMI|2ED6h|(CBED):= (HL)|Single|B,C,D,E,H,L| |MOVRM|2EDFh|(BCDE):= (HL)|Single|B,C,D,E,H,L| |MOVMF|2EE8h|(HL):= DAC|Single|B,C,D,E,H,L| |MOVE|2EEBh|(HL):= (DE)|Single|B,C,D,E,H,L| |VMOVAM|2EEFh|ARG := (HL)|VALTYP|B,C,D,E,H,L,ARG| |MOVVFM|2EF2h|(DE):= (HL)|VALTYP|B,C,D,E,H,L| |VMOVE|2EF3h|(HL):= (DE)|VALTYP|B,C,D,E,H,L| |VMOVFA|2F05h|DAC := ARG|VALTYP| B,C,D,E,H,L,DAC| |VMOVFM|2F08h|DAC := (HL)|VALTYP|B,C,D,E,H,L,DAC| |VMOVAF|2F0Dh|ARG := DAC|VALTYP|B,C,D,E,H,L,ARG| |VMOVMF|2F10h|(HL):= DAC|VALTYP|B,C,D,E,H,L| {{anchor:e1060-01}} __//Пример 1//__. Записать число в аккумулятор DAC,а затем прочитать его. \\ {{.examples:1060-01.bas|}} \\ [[+tab|wmsxbpge>1060-01.bas]] 10 CLEAR 200,&HF000:DEFUSR=&HF000 20 INPUT"Ваше число";N:A$=HEX$(VARPTR(N)) 30 POKE &HF100,VAL("&h"+RIGHT$(A$,2)):POKE&HF101,VAL("&h"+LEFT$(A$,2)) 40 DATA 2A,00,F1 :'LD HL,(F100h) 50 DATA CD,5C,2C :'CALL 2C5Ch 70 DATA 21,F6,F7 :'LD HL,F7F6h 80 DATA 11,00,F2 :'LD DE,F200h 90 DATA 01,10,00 :'LD BC,10h 100 DATA ED,B0 :'LDIR 130 DATA C9 :'RET 140 FOR T=0 TO 17:READ Z$:POKE &HF000+T,VAL("&h"+Z$):NEXT 150 X=USR(X) 160 FOR T=0 TO 15:PRINT HEX$(PEEK(VARPTR(N)+T)),HEX$(PEEK(&HF200+T)) 170 NEXT {{anchor:e1060-02}} __//Пример 2//__. Записать число в аккумулятор ARG,а затем прочитать его.\\ {{.examples:1060-02.bas|}} \\ [[+tab|wmsxbpge>1060-02.bas]] 10 CLEAR 200,&HF000:DEFUSR=&HF000 20 INPUT"Ваше число";N:A$=HEX$(VARPTR(N)) 30 POKE &HF100,VAL("&h"+RIGHT$(A$,2)):POKE&HF101,VAL("&h"+LEFT$(A$,2)) 40 DATA 2A,00,F1 :'LD HL,(F100h) 50 DATA CD,50,2C :'CALL 2C50h 70 DATA 21,47,F8 :'LD HL,F847h 80 DATA 11,00,F2 :'LD DE,F200h 90 DATA 01,10,00 :'LD BC,10h 100 DATA ED,B0 :'LDIR 130 DATA C9 :'RET 140 FOR T=0 TO 17:READ Z$:POKE &HF000+T,VAL("&h"+Z$):NEXT 150 X=USR(X) 160 FOR T=0 TO 15:PRINT HEX$(PEEK(VARPTR(N)+T)),HEX$(PEEK(&HF200+T)) 170 NEXT {{anchor:n1062}} ===== 1.6.2. Арифметические операции над целыми числами ===== \\ Наиболее полезны те советы, которым \\ легко следовать. —//Л.Вовенарг// ^ Имя \\ подпрограммы ^ Адрес ^ Выполняемые \\ действия ^ //Тип// ^ Изменяемые \\ регистры ^ |UMULT|314Ah|DE := BC·DE|A,B,C,D,E| |ISUB|3167h|HL := DE-HL|A,B,C,D,E,H,L| |IADD|3172h|HL := DE+HL|A,B,C,D,E,H,L| |IMULT|3193h|HL := DE·HL|A,B,C,D,E,H,L| |IDIV|31E6h|HL := DE/HL|A,B,C,D,E,H,L| |IMOD|323Ah|HL := DE mod HL|A,B,C,D,E,H,L| {{anchor:e1060-03}} __//Пример 3//__. Умножение целых чисел (операнды находятся в регистрах HL и DE).\\ {{.examples:1060-03.bas|}} \\ [[+tab|wmsxbpge>1060-03.bas]] 10 CLEAR 200,&HD000 20 DEFUSR=&HD000 30 I=&HD000 40 READ A$:IF A$="z" THEN A=USR(0):PRINT PEEK(&H9000):END 60 POKE I,VAL("&h"+A$):I=I+1:GOTO 40 90 DATA 21,0A,00:' LD HL,000Ah ; Загрузка регистра HL константой 100 DATA 11,04,00:' LD DE,0004h ; Загрузка регистра DE константой 110 DATA CD,93,31:' CALL 3193h ; Вызов нужной подпрограммы 120 DATA 22,00,90:' LD (9000h),HL 130 DATA C9 :' RET 140 DATA "z" :' {{anchor:n1063}} ===== 1.6.3. Арифметические операции над вещественными числами ===== ^ Имя \\ подпрограммы ^ Адрес ^ Выполняемые \\ действия ^ Изменяемые \\ регистры ^ |DECSUB|268Ch|DAC := DAC-ARG|A,B,C,D,E,H,L,DAC| |DECADD|269Ah|DAC := DAC+ARG|A,B,C,D,E,H,L,DAC| |DECNRM|26FAh|Нормализовать DAC|A,B,C,D,E,H,L,DAC| |DECROU|273Ch|Округлить DAC|A,B,C,D,E,H,L,DAC| |DECMUL|27E6h|DAC := DAC·ARG|A,B,C,D,E,H,L,DAC| |DECDIV|289Fh|DAC := DAC/ARG|A,B,C,D,E,H,L,DAC| |COS|2993h|DAC := COS(DAC)|A,B,C,D,E,H,L,DAC,ARG| |SIN|29ACh|DAC := SIN(DAC)|A,B,C,D,E,H,L,DAC,ARG| |TAN|29FBh|DAC := TAN(DAC)|A,B,C,D,E,H,L,DAC,ARG| |ATN|2A14h|DAC := ATN(DAC)|A,B,C,D,E,H,L,DAC,ARG| |LOG|2A72h|DAC := LOG(DAC)|A,B,C,D,E,H,L,DAC,ARG| |SQR|2AFFh|DAC := SQR(DAC)|A,B,C,D,E,H,L,DAC,ARG| |EXP|2B4Ah|DAC := EXP(DAC)|A,B,C,D,E,H,L,DAC,ARG| |RND|2BDFh|DAC := RND(DAC)|A,B,C,D,E,H,L,DAC,ARG| |SIGN|2E71h|A := SIGN(DAC)|A| |ABSFN|2E82h|DAC := ABS(DAC)|A,B,C,D,E,H,L,DAC,ARG| |NEG|2E8Dh|DAC := - DAC|A,H,L,DAC| |SGN|2E97h|DAC := SGN(DAC)|A,H,L,DAC| {{anchor:e1060-04}} __//Пример 4//__. Сумма двух вещественных чисел.\\ {{.examples:1060-04.bas|}} \\ [[+tab|wmsxbpge>1060-04.bas]] 10 CLEAR 200,&HF000:DEFUSR=&HF000 20 DATA 21,00,00 :'LD HL,address(N1) ;F000h 30 DATA CD,5C,2C :'LD DAC,(HL) ;F003h 40 DATA 21,00,00 :'LD HL,address(N2) ;F006h 50 DATA CD,50,2C :'LD ARG,(HL) ;F009h 60 DATA CD,9A,26 :'DAC:=DAC+ARG ;F00Ch 70 DATA 21,00,00 :'LD HL,address(N1) ;F00Fh 80 DATA CD,67,2C :'LD (HL),DAC ;F012h 90 DATA C9 :'RET ;F015h 100 FOR T=0 TO &H15:READ Z$:POKE &HF000+T,VAL("&h"+Z$):NEXT 110 INPUT"Первое слагаемое";N1:INPUT"Второе слагаемое";N2 120 A$=HEX$(VARPTR(N1)):B$=HEX$(VARPTR(N2)) 130 L1$=RIGHT$(A$,2):L2$=RIGHT$(B$,2) 140 H1$=LEFT$(A$,2):H2$=LEFT$(B$,2) 150 POKE &HF001,VAL("&h"+L1$):POKE &HF002,VAL("&h"+H1$) 160 POKE &HF007,VAL("&h"+L2$):POKE &HF008,VAL("&h"+H2$) 170 POKE &HF010,VAL("&h"+L1$):POKE &HF011,VAL("&h"+H1$) 180 H=USR(H) 190 PRINT"Сумма:";N1 {{anchor:e1060-05}} __//Пример 5//__. Возведение в степень.\\ {{.examples:1060-05.bas|}} \\ [[+tab|wmsxbpge>1060-05.bas]] 10 CLEAR 200,&HF000:DEFUSR=&HF000 20 DATA 21,00,00 :'LD HL,address(N1) ;F000h 30 DATA CD,5C,2C :'LD DAC,(HL) ;F003h 40 DATA 21,00,00 :'LD HL,address(N2) ;F006h 50 DATA CD,50,2C :'LD ARG,(HL) ;F009h 60 DATA CD,D7,37 :'DAC:=DAC^ARG ;F00Ch 70 DATA 21,00,00 :'LD HL,address(N1) ;F00Fh 80 DATA CD,67,2C :'LD (HL),DAC ;F012h 90 DATA C9 :'RET ;F015h 100 FOR T=0 TO &H15:READ Z$:POKE &HF000+T,VAL("&h"+Z$):NEXT 110 INPUT"N1";N1:INPUT"N2";N2 120 A$=HEX$(VARPTR(N1)):B$=HEX$(VARPTR(N2)) 130 L1$=RIGHT$(A$,2):L2$=RIGHT$(B$,2) 140 H1$=LEFT$(A$,2):H2$=LEFT$(B$,2) 150 POKE &HF001,VAL("&h"+L1$):POKE &HF002,VAL("&h"+H1$) 160 POKE &HF007,VAL("&h"+L2$):POKE &HF008,VAL("&h"+H2$) 170 POKE &HF010,VAL("&h"+L1$):POKE &HF011,VAL("&h"+H1$) 180 H=USR(H) 190 PRINT"N1^N2=";N1 {{anchor:e1060-05}} __//Пример 5//__. Вычисление значения функции синус вещественного аргумента.\\ {{.examples:1060-05.bas|}} \\ [[+tab|wmsxbpge>1060-05.bas]] 10 CLEAR 200,&HF000:DEFUSR=&HF000 20 DATA 21,00,00 :'LD HL,address(N1) ;F000h 30 DATA CD,5C,2C :'LD DAC,(HL) ;F003h 60 DATA CD,AC,29 :'DAC:=SIN(DAC) ;F006h 70 DATA 21,00,00 :'LD HL,address(N1) ;F009h 80 DATA CD,67,2C :'LD (HL),DAC ;F00Ch 90 DATA C9 :'RET ;F00Fh 100 FOR T=0 TO 15:READ Z$:POKE &HF000+T,VAL("&h"+Z$):NEXT 110 INPUT"Число";N1:A$=HEX$(VARPTR(N1)) 130 L1$=RIGHT$(A$,2):H1$=LEFT$(A$,2) 150 POKE &HF001,VAL("&h"+L1$):POKE &HF002,VAL("&h"+H1$) 170 POKE &HF00A,VAL("&h"+L1$):POKE &HF00B,VAL("&h"+H1$) 180 H=USR(H):PRINT"Синус:";N1 {{anchor:e1060-07}} __//Пример 7//__. Генерация псевдослучайного числа.\\ {{.examples:1060-07.bas|}} \\ [[+tab|wmsxbpge>1060-07.bas]] 10 CLEAR 200,&HF000:DEFUSR=&HF000 20 DATA 21,00,00 :'LD HL,address(N1) ;F000h 30 DATA CD,5C,2C :'LD DAC,(HL) ;F003h 60 DATA CD,DF,2B :'DAC:=RND(DAC) ;F006h 70 DATA 21,00,00 :'LD HL,address(N1) ;F009h 80 DATA CD,67,2C :'LD (HL),DAC ;F00Ch 90 DATA C9 :'RET ;F00Fh 100 FOR T=0 TO 15:READ Z$:POKE &HF000+T,VAL("&h"+Z$):NEXT 110 INPUT"Число";N1 120 A$=HEX$(VARPTR(N1)) 130 L1$=RIGHT$(A$,2) 140 H1$=LEFT$(A$,2) 150 POKE &HF001,VAL("&h"+L1$):POKE &HF002,VAL("&h"+H1$) 170 POKE &HF00A,VAL("&h"+L1$):POKE &HF00B,VAL("&h"+H1$) 180 H=USR(H):PRINT"RND(n1)=";N1 {{anchor:e1060-08}} __//Пример 8//__. Вычислить значение функции двух переменных z = cos(x)+ sin(y)\\ {{.examples:1060-08.bas|}} \\ [[+tab|wmsxbpge>1060-08.bas]] 10 CLEAR 200,&HF000:DEFUSR=&HF000:T=0 20 INPUT"X=";X:INPUT"Y=";Y:A1$=HEX$(VARPTR(X)):A2$=HEX$(VARPTR(Y)) 30 L1=VAL("&h"+RIGHT$(A1$,2)):R1=VAL("&h"+LEFT$(A1$,2)) 'Адрес числа X 40 L2=VAL("&h"+RIGHT$(A2$,2)):R2=VAL("&h"+LEFT$(A2$,2)) 'Адрес числа Y 50 POKE &HF301,L1:POKE &HF302,R1:POKE &HF303,L2:POKE &HF304,R2 60 READ Z$:IF Z$<>"RET" THEN POKE &HF000+T,VAL("&h"+Z$):T=T+1:GOTO 60 70 DATA 2A,01,F3 :'LD HL,(F301h); HL содержит адрес переменной X 75 DATA E5 :'PUSH HL ; 80 DATA CD,5C,2C :'LD DAC,(HL) ; DAC:=X 90 DATA CD,93,29 :'DAC:=COS(DAC) ; DAC:=COS(X) 95 DATA E1 :'POP HL ; 97 DATA E5 :'PUSH HL ; 100 DATA CD,67,2C :'LD (HL),DAC ; Z:=COS(X)◀── "Прячем" результат в ; любую заранее зарезервированную ; группу ячеек памяти ; В нашем случае: Z ≡ X 110 DATA 2A,03,F3 :'LD HL,(F303h); HL содержит адрес переменной Y 120 DATA CD,5C,2C :'LD DAC,(HL) ; DAC:=Y 130 DATA CD,AC,29 :'DAC:=SIN(DAC) ; DAC:=SIN(Y) 140 DATA CD,4D,2C :'LD ARG,DAC ; ARG:=SIN(Y) 145 DATA E1 :'POP HL ; 147 DATA E5 :'PUSH HL ; 150 DATA CD,5C,2C :'LD DAC,(HL) ; DAC:=Z 160 DATA CD,9A,26 :'ADD DAC,ARG ; DAC:=Z+SIN(Y) 165 DATA E1 :'POP HL ; 170 DATA CD,67,2C :'LD (HL),DAC ; X:=DAC 180 DATA C9,"RET" :'RET 190 PRINT COS(X)+SIN(Y) 200 A=USR(A):PRINT X 'Результат {{anchor:n1064}} ===== 1.6.4. Возведение в степень ===== ^ Имя подпрограммы ^ Адрес ^ Выполняемые действия ^ //Тип// ^ |SNGEXP|37C8h|%% DAC := DAC^ARG %%|Одинарная точность| |DBLEXP|37D7h|%% DAC := DAC^ARG %%|Двойная точность| |INTEXP|383Fh|%% DAC := DE^HL %%|Целая| {{anchor:e1060-09}} __//Пример 9//__. Вычислить 3².\\ {{.examples:1060-09.bas|}} \\ [[+tab|wmsxbpge>1060-09.bas]] 10 CLEAR 200,&HF000:DEFUSR=&HF000 30 DATA 11,03,00 :'LD DE,0003h 40 DATA 21,02,00 :'LD HL,0002h 50 DATA CD,3F,38 :'CALL 383Fh 60 DATA 21,F6,F7 :'LD HL,F7F6h 70 DATA 11,00,F2 :'LD DE,F200h 80 DATA 01,10,00 :'LD BC,10h 90 DATA ED,B0 :'LDIR 130 DATA C9 :'RET 140 FOR T=0 TO 19:READ Z$:POKE &HF000+T,VAL("&h"+Z$):NEXT 150 X=USR(X) 160 FOR T=0 TO 15:PRINT HEX$(PEEK(&HF200+T));" ";:NEXT {{anchor:n1065}} ===== 1.6.5. Сравнение ===== ^ Имя подпрограммы ^ Адрес ^ Тип ^ Левая часть условия ^ Правая часть условия ^ Изменяемые регистры ^ |FCOMP|2F21h|Single|CBED|DAC|HL| |ICOMP|2F4Dh|Integer|DE|HL|HL| |XDCOMP|2F5Ch|Double|ARG|DAC|A,B,C,D,E,H,L| Подпрограмма возвращает следующее содержимое регистра A * -1, если левая часть условия < правой части условия, * 0, если левая часть условия = правой части условия, * 1, если левая часть условия > правой части условия. {{anchor:e1060-10}} __//Пример 10//__. Сравнение двух вещественных чисел.\\ {{.examples:1060-10.bas|}} \\ [[+tab|wmsxbpge>1060-10.bas]] 10 CLEAR 200,&HD000:DEFUSR=&HD000 20 DATA 21,00,00 :'LD HL,address(N1) 30 DATA CD,5C,2C :'LD DAC,(HL) 40 DATA 21,00,00 :'LD HL,address(N2) 50 DATA CD,50,2C :'LD ARG,(HL) 60 DATA CD,5C,2F :'Сравнить DAC и ARG 70 DATA 32,00,F1 :'LD (F100h),A 90 DATA C9 :'RET 100 FOR T=0 TO &H12:READ Z$:POKE &HD000+T,VAL("&h"+Z$):NEXT 110 INPUT"Left";N1:INPUT"Right";N2 120 A$=HEX$(VARPTR(N1)):B$=HEX$(VARPTR(N2)) 130 L1$=RIGHT$(A$,2):L2$=RIGHT$(B$,2) 140 H1$= LEFT$(A$,2):H2$= LEFT$(B$,2) 150 POKE &HD001,VAL("&h"+L1$):POKE &HD002,VAL("&h"+H1$) 160 POKE &HD007,VAL("&h"+L2$):POKE &HD008,VAL("&h"+H2$) 180 H=USR(H):A=PEEK(&HF100) 190 IF A=255 THEN PRINT"LEFT < RIGHT" 200 IF A=1 THEN PRINT"LEFT > RIGHT" 210 IF A=0 THEN PRINT"LEFT = RIGHT" {{anchor:n1066}} ===== 1.6.6. Преобразование типов ===== ^ Имя подпрограммы ^ Адрес ^ Выполняемые действия ^ |FRCINT|2F8Ah|Содержимое DAC преобразуется к целому типу| |FRCSNG|2FB2h|Содержимое DAC преобразуется к типу одинарной точности| |FRCDBL|303Ah|Содержимое DAC преобразуется к типу двойной точности| |FIXER|30BEh|DAC:=SGN(DAC)·INT(ABS(DAC))| После выполнения подпрограммы в ячейке с именем VALTYP будет находиться код типа числа, находящегося в DAC. {{anchor:n1067}} ===== 1.6.7. Преобразование чисел для вывода на печать ===== Для преобразования из //строки// в //число// используется подпрограмма с именем FIN (3299h) * __//Аргументы//__: * HL — адрес строки символов, * A — первый символ строки. * __//Результаты//__: * DAC — вещественное число, * C — * 0 — была десятичная точка, * FFh — десятичной точки не было, * B — количество цифр после десятичной точки, * D — количество цифр в числе. Для //вывода// имеются две подпрограммы: * FOUT (3425h) — неформатный вывод, * PUFOUT (3426h) — форматный вывод. Эти подпрограммы преобразуют число, находящееся в DAC, в строку символов. __Аргументы__: * A - формат; содержимое его битов может быть следующим: * bit7: если 1, то вывод осуществляется по формату; * bit6: если 1, то через каждые 3 цифры вставляются запятые; * bit5: если 1, то первые нули заменить на символ "*"; * bit4: если 1, то перед числом вставить символ "$"; * bit3: если 1, то число выводится всегда со знаком; * bit2: если 1, то вставить знак после числа; * bit1: не используется; * bit0: * если 0, то число выводится с фиксированной точкой; * если 1, то число выводится с плавающей точкой; * B — количество цифр перед точкой; * C — количество цифр после точки + 1. __Результаты__: HL — начальный адрес строки символов. {{anchor:e1060-11}} __//Пример 11//__. Вычисление косинуса вещественного числа.\\ {{.examples:1060-11.bas|}} \\ [[+tab|wmsxbpge>1060-11.bas]] 10 CLEAR 200,&HD000:DEFUSR=&HD000:A=&HD000 20 A=A+1:READ R$:IF R$="z" THEN 40 30 POKE A,VAL("&h"+R$):GOTO 20 40 M=USR(0) 50 DATA CD,B4,00 :'CALL 00B4h ;Ввод строки с клавиатуры 60 DATA 23 :'INC HL 70 DATA 7E :'LD A,(HL) 80 DATA CD,99,32 :'CALL 3299h ;Преобразование из строки в число 90 DATA 3E,08 :'LD A,08h 100 DATA 32,63,F6 :'LD (F663h),A ;VALTYP:=8 110 DATA CD,93,29 :'CALL 2993h ;Нахождение функции COS() 120 DATA CD,25,34 :'CALL 3425h ;Преобразование числа в строку 130 DATA 06,11 :'LD B,11h 140 DATA 7E :'LD A,(HL) ◀───┐ 150 DATA 23 :'INC HL │ 160 DATA CD,A2,00 :'CALL 00A2h ;Вывод символа на монитор │ 170 DATA 10,F9 :'DJNZ $-5 ;Конец цикла ───┘ 180 DATA C9 :'RET 190 DATA "z" Остальные подпрограммы перечислены ниже: ^ Имя подпрограммы ^ Адрес ^ Выполняемые действия ^ |FOUTB|371Ah|Целое число ──▶ в двоичный вид| |FOUTO|371Eh|Целое число ──▶ в восьмеричный вид| |FOUTH|3722h|Целое число ──▶ в шестнадцатеричный вид| Для этих подпрограмм: \\ __//Аргументы//__: * DAC — целое число, * VALTYP = 2. __//Результаты//__: * HL — начальный адрес строки. ---- [<>] {{tag>msxbdpl}}