Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
msx:basic_dialogue_programming_language:106 [2023-02-18 16:48] GreyWolf [1.6.5. Сравнение] |
msx:basic_dialogue_programming_language:106 [2023-02-19 16:27] (текущий) GreyWolf |
||
---|---|---|---|
Строка 4: | Строка 4: | ||
{{anchor:n106}} | {{anchor:n106}} | ||
====== 1.6. Реализация вещественной арифметики на машинном языке ====== | ====== 1.6. Реализация вещественной арифметики на машинном языке ====== | ||
- | FIXME | ||
<WRAP group> | <WRAP group> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Изучай все не из тщеславия, а ради | Изучай все не из тщеславия, а ради | ||
\\ практической пользы. | \\ практической пользы. | ||
Строка 85: | Строка 84: | ||
|VMOVMF|2F10h|(HL):= DAC|VALTYP|B,C,D,E,H,L| | |VMOVMF|2F10h|(HL):= DAC|VALTYP|B,C,D,E,H,L| | ||
- | П р и м е р 1. Записать число в аккумулятор DAC,а затем прочитать его. | + | {{anchor:e1060-01}} __//Пример 1//__. Записать число в аккумулятор DAC,а затем прочитать его. \\ {{.examples:1060-01.bas|}} \\ [[+tab|wmsxbpge>1060-01.bas]] |
<code> | <code> | ||
10 CLEAR 200,&HF000:DEFUSR=&HF000 | 10 CLEAR 200,&HF000:DEFUSR=&HF000 | ||
Строка 103: | Строка 102: | ||
</code> | </code> | ||
- | П р и м е р 2. Записать число в аккумулятор ARG,а затем прочитать его. | + | {{anchor:e1060-02}} __//Пример 2//__. Записать число в аккумулятор ARG,а затем прочитать его.\\ {{.examples:1060-02.bas|}} \\ [[+tab|wmsxbpge>1060-02.bas]] |
<code> | <code> | ||
10 CLEAR 200,&HF000:DEFUSR=&HF000 | 10 CLEAR 200,&HF000:DEFUSR=&HF000 | ||
Строка 126: | Строка 125: | ||
<WRAP group> | <WRAP group> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Наиболее полезны те советы, которым | Наиболее полезны те советы, которым | ||
\\ легко следовать. | \\ легко следовать. | ||
Строка 143: | Строка 142: | ||
|IMOD|323Ah|HL := DE mod HL|A,B,C,D,E,H,L| | |IMOD|323Ah|HL := DE mod HL|A,B,C,D,E,H,L| | ||
- | П р и м е р 3. Умножение целых чисел (операнды находятся в регистрах HL и DE). | + | {{anchor:e1060-03}} __//Пример 3//__. Умножение целых чисел (операнды находятся в регистрах HL и DE).\\ {{.examples:1060-03.bas|}} \\ [[+tab|wmsxbpge>1060-03.bas]] |
<code> | <code> | ||
- | 10 CLEAR 200,&HD000 | + | 10 CLEAR 200,&HD000 |
- | 20 DEFUSR=&HD000 | + | 20 DEFUSR=&HD000 |
- | 30 I=&HD000 | + | 30 I=&HD000 |
- | 40 READ A$:IF A$="z" THEN A=USR(0):PRINT PEEK(&H9000):END | + | 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 | + | 60 POKE I,VAL("&h"+A$):I=I+1:GOTO 40 |
- | 90 DATA 21,0A,00:' LD HL,000Ah ; Загрузка регистра HL константой | + | 90 DATA 21,0A,00:' LD HL,000Ah ; Загрузка регистра HL константой |
- | 100 DATA 11,04,00:' LD DE,0004h ; Загрузка регистра DE константой | + | 100 DATA 11,04,00:' LD DE,0004h ; Загрузка регистра DE константой |
- | 110 DATA CD,93,31:' CALL 3193h ; Вызов нужной подпрограммы | + | 110 DATA CD,93,31:' CALL 3193h ; Вызов нужной подпрограммы |
- | 120 DATA 22,00,90:' LD (9000h),HL | + | 120 DATA 22,00,90:' LD (9000h),HL |
- | 130 DATA C9 :' RET | + | 130 DATA C9 :' RET |
- | 140 DATA "z" :' | + | 140 DATA "z" :' |
</code> | </code> | ||
Строка 161: | Строка 160: | ||
===== 1.6.3. Арифметические операции над вещественными числами ===== | ===== 1.6.3. Арифметические операции над вещественными числами ===== | ||
- | ^ Имя \\ подпрограммы ^ Адрес ^ Выполняемые \\ действия ^ //Тип// ^ Изменяемые \\ регистры ^ | + | ^ Имя \\ подпрограммы ^ Адрес ^ Выполняемые \\ действия ^ Изменяемые \\ регистры ^ |
|DECSUB|268Ch|DAC := DAC-ARG|A,B,C,D,E,H,L,DAC| | |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| | |DECADD|269Ah|DAC := DAC+ARG|A,B,C,D,E,H,L,DAC| | ||
Строка 181: | Строка 180: | ||
|SGN|2E97h|DAC := SGN(DAC)|A,H,L,DAC| | |SGN|2E97h|DAC := SGN(DAC)|A,H,L,DAC| | ||
- | П р и м е р 4. Сумма двух вещественных чисел. | + | {{anchor:e1060-04}} __//Пример 4//__. Сумма двух вещественных чисел.\\ {{.examples:1060-04.bas|}} \\ [[+tab|wmsxbpge>1060-04.bas]] |
<code> | <code> | ||
10 CLEAR 200,&HF000:DEFUSR=&HF000 | 10 CLEAR 200,&HF000:DEFUSR=&HF000 | ||
Строка 204: | Строка 203: | ||
</code> | </code> | ||
- | П р и м е р 5. Возведение в степень. | + | {{anchor:e1060-05}} __//Пример 5//__. Возведение в степень.\\ {{.examples:1060-05.bas|}} \\ [[+tab|wmsxbpge>1060-05.bas]] |
<code> | <code> | ||
10 CLEAR 200,&HF000:DEFUSR=&HF000 | 10 CLEAR 200,&HF000:DEFUSR=&HF000 | ||
Строка 227: | Строка 226: | ||
</code> | </code> | ||
- | П р и м е р 6. Вычисление значения функции синус вещественного аргумента. | + | {{anchor:e1060-05}} __//Пример 5//__. Вычисление значения функции синус вещественного аргумента.\\ {{.examples:1060-05.bas|}} \\ [[+tab|wmsxbpge>1060-05.bas]] |
<code> | <code> | ||
10 CLEAR 200,&HF000:DEFUSR=&HF000 | 10 CLEAR 200,&HF000:DEFUSR=&HF000 | ||
Строка 244: | Строка 243: | ||
</code> | </code> | ||
- | П р и м е р 7. Генерация псевдослучайного числа. | + | {{anchor:e1060-07}} __//Пример 7//__. Генерация псевдослучайного числа.\\ {{.examples:1060-07.bas|}} \\ [[+tab|wmsxbpge>1060-07.bas]] |
<code> | <code> | ||
10 CLEAR 200,&HF000:DEFUSR=&HF000 | 10 CLEAR 200,&HF000:DEFUSR=&HF000 | ||
Строка 263: | Строка 262: | ||
</code> | </code> | ||
- | П р и м е р 8. Вычислить значение функции двух переменных z = cos(x)+ sin(y) | + | {{anchor:e1060-08}} __//Пример 8//__. Вычислить значение функции двух переменных z = cos(x)+ sin(y)\\ {{.examples:1060-08.bas|}} \\ [[+tab|wmsxbpge>1060-08.bas]] |
<code> | <code> | ||
10 CLEAR 200,&HF000:DEFUSR=&HF000:T=0 | 10 CLEAR 200,&HF000:DEFUSR=&HF000:T=0 | ||
Строка 300: | Строка 299: | ||
^ Имя подпрограммы ^ Адрес ^ Выполняемые действия ^ //Тип// ^ | ^ Имя подпрограммы ^ Адрес ^ Выполняемые действия ^ //Тип// ^ | ||
- | |SNGEXP|37C8h|DAC := DAC^ARG|Одинарная точность| | + | |SNGEXP|37C8h|%% DAC := DAC^ARG %%|Одинарная точность| |
- | |DBLEXP|37D7h|DAC := DAC^ARG|Двойная точность| | + | |DBLEXP|37D7h|%% DAC := DAC^ARG %%|Двойная точность| |
- | |INTEXP|383Fh|DAC := DE^HL|Целая| | + | |INTEXP|383Fh|%% DAC := DE^HL %%|Целая| |
- | П р и м е р 9. Вычислить 3² . | + | {{anchor:e1060-09}} __//Пример 9//__. Вычислить 3².\\ {{.examples:1060-09.bas|}} \\ [[+tab|wmsxbpge>1060-09.bas]] |
<code> | <code> | ||
10 CLEAR 200,&HF000:DEFUSR=&HF000 | 10 CLEAR 200,&HF000:DEFUSR=&HF000 | ||
Строка 333: | Строка 332: | ||
* 1, если левая часть условия > правой части условия. | * 1, если левая часть условия > правой части условия. | ||
- | П р и м е р 10. Сравнение двух вещественных чисел. | + | {{anchor:e1060-10}} __//Пример 10//__. Сравнение двух вещественных чисел.\\ {{.examples:1060-10.bas|}} \\ [[+tab|wmsxbpge>1060-10.bas]] |
<code> | <code> | ||
10 CLEAR 200,&HD000:DEFUSR=&HD000 | 10 CLEAR 200,&HD000:DEFUSR=&HD000 | ||
Строка 359: | Строка 358: | ||
===== 1.6.6. Преобразование типов ===== | ===== 1.6.6. Преобразование типов ===== | ||
- | <code> | + | ^ Имя подпрограммы ^ Адрес ^ Выполняемые действия ^ |
- | ┌────────┬───────┬──────────────────────────────────────────────┐ | + | |FRCINT|2F8Ah|Содержимое DAC преобразуется к целому типу| |
- | │ Имя │ │ │ | + | |FRCSNG|2FB2h|Содержимое DAC преобразуется к типу одинарной точности| |
- | │ подпро-│ Адрес │ Выполняемые действия │ | + | |FRCDBL|303Ah|Содержимое DAC преобразуется к типу двойной точности| |
- | │ граммы │ │ │ | + | |FIXER|30BEh|DAC:=SGN(DAC)·INT(ABS(DAC))| |
- | ├────────┼───────┼──────────────────────────────────────────────┤ | + | |
- | │ FRCINT │ 2F8Ah │ Содержимое DAC преобразуется к целому типу │ | + | После выполнения подпрограммы в ячейке с именем VALTYP будет находиться код типа числа, находящегося в DAC. |
- | │ FRCSNG │ 2FB2h │ Содержимое DAC преобразуется к типу одинарной│ | + | |
- | │ │ │ точности │ | + | |
- | │ FRCDBL │ 303Ah │ Содержимое DAC преобразуется к типу двойной │ | + | |
- | │ │ │ точности │ | + | |
- | │ FIXER │ 30BEh │ DAC:=SGN(DAC)·INT(ABS(DAC)) │ | + | |
- | └────────┴───────┴──────────────────────────────────────────────┘ | + | |
- | После выполнения подпрограммы в ячейке с именем VALTYP будет находить- | + | |
- | ся код типа числа, находящегося в DAC. | + | |
- | </code> | + | |
{{anchor:n1067}} | {{anchor:n1067}} | ||
===== 1.6.7. Преобразование чисел для вывода на печать ===== | ===== 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]] | ||
<code> | <code> | ||
- | Для преобразования из с т р о к и в ч и с л о используется подпро- | + | 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 |
- | │ FIN (3299h) │ | + | 40 M=USR(0) |
- | │ А р г у м е н т ы: HL - адрес строки символов, │ | + | 50 DATA CD,B4,00 :'CALL 00B4h ;Ввод строки с клавиатуры |
- | │ ───────────────── A - первый символ строки. │ | + | 60 DATA 23 :'INC HL |
- | │ Р е з у л ь т а т ы: DAC - вещественное число, │ | + | 70 DATA 7E :'LD A,(HL) |
- | │ ─────────────────── C - { 0 - была десятичная точка, │ | + | 80 DATA CD,99,32 :'CALL 3299h ;Преобразование из строки в число |
- | │ { FFh - десятичной точки не было, │ | + | 90 DATA 3E,08 :'LD A,08h |
- | │ B - количество цифр после десятичной точки, │ | + | 100 DATA 32,63,F6 :'LD (F663h),A ;VALTYP:=8 |
- | │ D - количество цифр в числе. │ | + | 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) ◀───┐ |
- | │ FOUT (3425h) - неформатный вывод, │ | + | 150 DATA 23 :'INC HL │ |
- | │ PUFOUT (3426h) - форматный вывод. │ | + | 160 DATA CD,A2,00 :'CALL 00A2h ;Вывод символа на монитор │ |
- | └─────────────────────────────────────────────────┘ | + | 170 DATA 10,F9 :'DJNZ $-5 ;Конец цикла ───┘ |
- | Эти подпрограммы преобразуют число, находящееся в DAC, в строку симво- | + | 180 DATA C9 :'RET |
- | лов. | + | 190 DATA "z" |
- | Аргументы: A - формат; содержимое его битов может быть следующим: | + | |
- | ───────── bit7: если 1, то вывод осуществляется по формату; | + | |
- | bit6: если 1, то через каждые 3 цифры вставляются запятые; | + | |
- | bit5: если 1, то первые нули заменить на символ "*"; | + | |
- | bit4: если 1, то перед числом вставить символ "$"; | + | |
- | bit3: если 1, то число выводится всегда со знаком; | + | |
- | bit2: если 1, то вставить знак после числа; | + | |
- | bit1: не используется; | + | |
- | bit0:{если 0, то число выводится с фиксированной точкой; | + | |
- | {если 1, то число выводится с плавающей точкой; | + | |
- | B - количество цифр перед точкой; | + | |
- | C - количество цифр после точки + 1. | + | |
- | Результаты: HL - начальный адрес строки символов. | + | |
- | ────────── | + | |
- | П р и м е р 11. Вычисление косинуса вещественного числа. | + | |
- | ────────────── | + | |
- | 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 - начальный адрес строки. | + | |
- | ─────────────────── | + | |
</code> | </code> | ||
+ | |||
+ | Остальные подпрограммы перечислены ниже: | ||
+ | ^ Имя подпрограммы ^ Адрес ^ Выполняемые действия ^ | ||
+ | |FOUTB|371Ah|Целое число ──▶ в двоичный вид| | ||
+ | |FOUTO|371Eh|Целое число ──▶ в восьмеричный вид| | ||
+ | |FOUTH|3722h|Целое число ──▶ в шестнадцатеричный вид| | ||
+ | |||
+ | Для этих подпрограмм: | ||
+ | \\ __//Аргументы//__: | ||
+ | * DAC — целое число, | ||
+ | * VALTYP = 2. | ||
+ | __//Результаты//__: | ||
+ | * HL — начальный адрес строки. | ||
+ | |||
+ | |||
---- | ---- |