Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
msx:basic_dialogue_programming_language:106 [2023-02-18 16:20] GreyWolf [1.6. Реализация вещественной арифметики на машинном языке] |
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> |
Изучай все не из тщеславия, а ради | Изучай все не из тщеславия, а ради | ||
\\ практической пользы. | \\ практической пользы. | ||
Строка 55: | Строка 54: | ||
{{anchor:n1061}} | {{anchor:n1061}} | ||
===== 1.6.1. Пересылки ===== | ===== 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]] | ||
<code> | <code> | ||
- | ┌────────┬───────┬────────────────┬────────┬──────────────────┐ | + | 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 |
- | │ MAF │ 2C4Dh │ ARG := DAC │ Double │ A,B,D,E,H,L,ARG │ | + | 70 DATA 21,F6,F7 :'LD HL,F7F6h |
- | │ MAM │ 2C50h │ ARG := (HL) │ Double │ A,B,D,E,H,L,ARG │ | + | 80 DATA 11,00,F2 :'LD DE,F200h |
- | │ MOV8DH │ 2C53h │ (DE):= (HL) │ Double │ A,B,D,E,H,L │ | + | 90 DATA 01,10,00 :'LD BC,10h |
- | │ MFA │ 2C59h │ DAC := ARG │ Double │ A,B,D,E,H,L,DAC │ | + | 100 DATA ED,B0 :'LDIR |
- | │ MFM │ 2C5Ch │ DAC := (HL) │ Double │ A,B,D,E,H,L,DAC │ | + | 130 DATA C9 :'RET |
- | │ MMF │ 2C67h │ (HL):= DAC │ Double │ A,B,D,E,H,L │ | + | 140 FOR T=0 TO 17:READ Z$:POKE &HF000+T,VAL("&h"+Z$):NEXT |
- | │ MOV8HD │ 2C6Ah │ (HL):= (DE) │ Double │ A,B,D,E,H,L │ | + | 150 X=USR(X) |
- | │ XTF │ 2C6Fh │ (SP):= DAC │ Double │ A,B,D,E,H,L │ | + | 160 FOR T=0 TO 15:PRINT HEX$(PEEK(VARPTR(N)+T)),HEX$(PEEK(&HF200+T)) |
- | │ PHA │ 2CC7h │ ARG := (SP) │ Double │ A,B,D,E,H,L,ARG │ | + | 170 NEXT |
- | │ PHF │ 2CCCh │ DAC := (SP) │ Double │ A,B,D,E,H,L,DAC │ | + | </code> |
- | │ 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 │ | + | |
- | └────────┴───────┴────────────────┴────────┴──────────────────┘ | + | |
- | П р и м е р 1. Записать число в аккумулятор DAC,а затем прочитать его. | + | |
- | ───────────── | + | |
- | 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 | + | |
- | + | ||
- | П р и м е р 2. Записать число в аккумулятор ARG,а затем прочитать его. | + | |
- | ───────────── | + | |
- | 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:e1060-02}} __//Пример 2//__. Записать число в аккумулятор ARG,а затем прочитать его.\\ {{.examples:1060-02.bas|}} \\ [[+tab|wmsxbpge>1060-02.bas]] | ||
+ | <code> | ||
+ | 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 | ||
</code> | </code> | ||
{{anchor:n1062}} | {{anchor:n1062}} | ||
===== 1.6.2. Арифметические операции над целыми числами ===== | ===== 1.6.2. Арифметические операции над целыми числами ===== | ||
- | <code> | ||
- | Наиболее полезны те советы, которым | + | <WRAP group> |
- | легко следовать. | + | <WRAP half column> \\ </WRAP> |
- | Л.Вовенарг | + | <WRAP half column><WRAP right> |
- | ┌────────┬───────┬────────────────────┬───────────────────────┐ | + | Наиболее полезны те советы, которым |
- | │ Имя │ │ │ │ | + | \\ легко следовать. |
- | │ подпро-│ Адрес │Выполняемые действия│ Изменяемые регистры │ | + | <WRAP rightalign> |
- | │ граммы │ │ │ │ | + | —//Л.Вовенарг// |
- | ├────────┼───────┼────────────────────┼───────────────────────┤ | + | </WRAP></WRAP> |
- | │ UMULT │ 314Ah │ DE := BC·DE │ A,B,C,D,E │ | + | |
- | │ ISUB │ 3167h │ HL := DE-HL │ A,B,C,D,E,H,L │ | + | </WRAP></WRAP> |
- | │ 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 │ | + | |UMULT|314Ah|DE := BC·DE|A,B,C,D,E| |
- | │ IMOD │ 323Ah │ HL := DE mod HL │ A,B,C,D,E,H,L │ | + | |ISUB|3167h|HL := DE-HL|A,B,C,D,E,H,L| |
- | └────────┴───────┴────────────────────┴───────────────────────┘ | + | |IADD|3172h|HL := DE+HL|A,B,C,D,E,H,L| |
- | П р и м е р 3. Умножение целых чисел (операнды находятся в регистрах | + | |IMULT|3193h|HL := DE·HL|A,B,C,D,E,H,L| |
- | ────────────── HL и DE). | + | |IDIV|31E6h|HL := DE/HL|A,B,C,D,E,H,L| |
- | 10 CLEAR 200,&HD000 | + | |IMOD|323Ah|HL := DE mod HL|A,B,C,D,E,H,L| |
- | 20 DEFUSR=&HD000 | + | |
- | 30 I=&HD000 | + | {{anchor:e1060-03}} __//Пример 3//__. Умножение целых чисел (операнды находятся в регистрах HL и DE).\\ {{.examples:1060-03.bas|}} \\ [[+tab|wmsxbpge>1060-03.bas]] |
- | 40 READ A$:IF A$="z" THEN A=USR(0):PRINT PEEK(&H9000):END | + | <code> |
- | 60 POKE I,VAL("&h"+A$):I=I+1:GOTO 40 | + | 10 CLEAR 200,&HD000 |
- | 90 DATA 21,0A,00:' LD HL,000Ah ; Загрузка регистра HL константой | + | 20 DEFUSR=&HD000 |
- | 100 DATA 11,04,00:' LD DE,0004h ; Загрузка регистра DE константой | + | 30 I=&HD000 |
- | 110 DATA CD,93,31:' CALL 3193h ; Вызов нужной подпрограммы | + | 40 READ A$:IF A$="z" THEN A=USR(0):PRINT PEEK(&H9000):END |
- | 120 DATA 22,00,90:' LD (9000h),HL | + | 60 POKE I,VAL("&h"+A$):I=I+1:GOTO 40 |
- | 130 DATA C9 :' RET | + | 90 DATA 21,0A,00:' LD HL,000Ah ; Загрузка регистра HL константой |
- | 140 DATA "z" :' | + | 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" :' | ||
</code> | </code> | ||
Строка 162: | Строка 160: | ||
===== 1.6.3. Арифметические операции над вещественными числами ===== | ===== 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]] | ||
<code> | <code> | ||
- | ┌────────┬───────┬────────────────────┬───────────────────────┐ | + | 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 |
- | │ DECSUB │ 268Ch │ DAC := DAC-ARG │ A,B,C,D,E,H,L,DAC │ | + | 60 DATA CD,9A,26 :'DAC:=DAC+ARG ;F00Ch |
- | │ DECADD │ 269Ah │ DAC := DAC+ARG │ A,B,C,D,E,H,L,DAC │ | + | 70 DATA 21,00,00 :'LD HL,address(N1) ;F00Fh |
- | │ DECNRM │ 26FAh │ Нормализовать DAC │ A,B,C,D,E,H,L,DAC │ | + | 80 DATA CD,67,2C :'LD (HL),DAC ;F012h |
- | │ DECROU │ 273Ch │ Округлить DAC │ A,B,C,D,E,H,L,DAC │ | + | 90 DATA C9 :'RET ;F015h |
- | │ DECMUL │ 27E6h │ DAC := DAC·ARG │ A,B,C,D,E,H,L,DAC │ | + | 100 FOR T=0 TO &H15:READ Z$:POKE &HF000+T,VAL("&h"+Z$):NEXT |
- | │ DECDIV │ 289Fh │ DAC := DAC/ARG │ A,B,C,D,E,H,L,DAC │ | + | 110 INPUT"Первое слагаемое";N1:INPUT"Второе слагаемое";N2 |
- | │ COS │ 2993h │ DAC := COS(DAC) │ A,B,C,D,E,H,L,DAC,ARG │ | + | 120 A$=HEX$(VARPTR(N1)):B$=HEX$(VARPTR(N2)) |
- | │ SIN │ 29ACh │ DAC := SIN(DAC) │ A,B,C,D,E,H,L,DAC,ARG │ | + | 130 L1$=RIGHT$(A$,2):L2$=RIGHT$(B$,2) |
- | │ TAN │ 29FBh │ DAC := TAN(DAC) │ A,B,C,D,E,H,L,DAC,ARG │ | + | 140 H1$=LEFT$(A$,2):H2$=LEFT$(B$,2) |
- | │ ATN │ 2A14h │ DAC := ATN(DAC) │ A,B,C,D,E,H,L,DAC,ARG │ | + | 150 POKE &HF001,VAL("&h"+L1$):POKE &HF002,VAL("&h"+H1$) |
- | │ LOG │ 2A72h │ DAC := LOG(DAC) │ A,B,C,D,E,H,L,DAC,ARG │ | + | 160 POKE &HF007,VAL("&h"+L2$):POKE &HF008,VAL("&h"+H2$) |
- | │ SQR │ 2AFFh │ DAC := SQR(DAC) │ A,B,C,D,E,H,L,DAC,ARG │ | + | 170 POKE &HF010,VAL("&h"+L1$):POKE &HF011,VAL("&h"+H1$) |
- | │ EXP │ 2B4Ah │ DAC := EXP(DAC) │ A,B,C,D,E,H,L,DAC,ARG │ | + | 180 H=USR(H) |
- | │ RND │ 2BDFh │ DAC := RND(DAC) │ A,B,C,D,E,H,L,DAC,ARG │ | + | 190 PRINT"Сумма:";N1 |
- | │ SIGN │ 2E71h │ A := SIGN(DAC) │ A │ | + | </code> |
- | │ 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 │ | + | |
- | └────────┴───────┴────────────────────┴───────────────────────┘ | + | |
- | П р и м е р 4. Сумма двух вещественных чисел. | + | |
- | ───────────── | + | |
- | 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 | + | |
- | П р и м е р 5. Возведение в степень. | + | |
- | ───────────── | + | |
- | 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 | + | |
- | П р и м е р 6. Вычисление значения функции синус вещественного аргу- | + | |
- | ────────────── мента. | + | |
- | 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 | + | |
- | П р и м е р 7. Генерация псевдослучайного числа. | + | {{anchor:e1060-05}} __//Пример 5//__. Возведение в степень.\\ {{.examples:1060-05.bas|}} \\ [[+tab|wmsxbpge>1060-05.bas]] |
- | ────────────── | + | <code> |
+ | 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 | ||
+ | </code> | ||
- | 10 CLEAR 200,&HF000:DEFUSR=&HF000 | + | {{anchor:e1060-05}} __//Пример 5//__. Вычисление значения функции синус вещественного аргумента.\\ {{.examples:1060-05.bas|}} \\ [[+tab|wmsxbpge>1060-05.bas]] |
- | 20 DATA 21,00,00 :'LD HL,address(N1) ;F000h | + | <code> |
- | 30 DATA CD,5C,2C :'LD DAC,(HL) ;F003h | + | 10 CLEAR 200,&HF000:DEFUSR=&HF000 |
- | 60 DATA CD,DF,2B :'DAC:=RND(DAC) ;F006h | + | 20 DATA 21,00,00 :'LD HL,address(N1) ;F000h |
- | 70 DATA 21,00,00 :'LD HL,address(N1) ;F009h | + | 30 DATA CD,5C,2C :'LD DAC,(HL) ;F003h |
- | 80 DATA CD,67,2C :'LD (HL),DAC ;F00Ch | + | 60 DATA CD,AC,29 :'DAC:=SIN(DAC) ;F006h |
- | 90 DATA C9 :'RET ;F00Fh | + | 70 DATA 21,00,00 :'LD HL,address(N1) ;F009h |
- | 100 FOR T=0 TO 15:READ Z$:POKE &HF000+T,VAL("&h"+Z$):NEXT | + | 80 DATA CD,67,2C :'LD (HL),DAC ;F00Ch |
- | 110 INPUT"Число";N1 | + | 90 DATA C9 :'RET ;F00Fh |
- | 120 A$=HEX$(VARPTR(N1)) | + | 100 FOR T=0 TO 15:READ Z$:POKE &HF000+T,VAL("&h"+Z$):NEXT |
- | 130 L1$=RIGHT$(A$,2) | + | 110 INPUT"Число";N1:A$=HEX$(VARPTR(N1)) |
- | 140 H1$=LEFT$(A$,2) | + | 130 L1$=RIGHT$(A$,2):H1$=LEFT$(A$,2) |
- | 150 POKE &HF001,VAL("&h"+L1$):POKE &HF002,VAL("&h"+H1$) | + | 150 POKE &HF001,VAL("&h"+L1$):POKE &HF002,VAL("&h"+H1$) |
- | 170 POKE &HF00A,VAL("&h"+L1$):POKE &HF00B,VAL("&h"+H1$) | + | 170 POKE &HF00A,VAL("&h"+L1$):POKE &HF00B,VAL("&h"+H1$) |
- | 180 H=USR(H):PRINT"RND(n1)=";N1 | + | 180 H=USR(H):PRINT"Синус:";N1 |
+ | </code> | ||
+ | {{anchor:e1060-07}} __//Пример 7//__. Генерация псевдослучайного числа.\\ {{.examples:1060-07.bas|}} \\ [[+tab|wmsxbpge>1060-07.bas]] | ||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
- | + | {{anchor:e1060-08}} __//Пример 8//__. Вычислить значение функции двух переменных z = cos(x)+ sin(y)\\ {{.examples:1060-08.bas|}} \\ [[+tab|wmsxbpge>1060-08.bas]] | |
- | П р и м е р 8. Вычислить значение функции двух переменных | + | <code> |
- | ────────────── z = cos(x)+ sin(y) | + | 10 CLEAR 200,&HF000:DEFUSR=&HF000:T=0 |
- | + | 20 INPUT"X=";X:INPUT"Y=";Y:A1$=HEX$(VARPTR(X)):A2$=HEX$(VARPTR(Y)) | |
- | 10 CLEAR 200,&HF000:DEFUSR=&HF000:T=0 | + | 30 L1=VAL("&h"+RIGHT$(A1$,2)):R1=VAL("&h"+LEFT$(A1$,2)) 'Адрес числа X |
- | 20 INPUT"X=";X:INPUT"Y=";Y:A1$=HEX$(VARPTR(X)):A2$=HEX$(VARPTR(Y)) | + | 40 L2=VAL("&h"+RIGHT$(A2$,2)):R2=VAL("&h"+LEFT$(A2$,2)) 'Адрес числа Y |
- | 30 L1=VAL("&h"+RIGHT$(A1$,2)):R1=VAL("&h"+LEFT$(A1$,2)) 'Адрес числа X | + | 50 POKE &HF301,L1:POKE &HF302,R1:POKE &HF303,L2:POKE &HF304,R2 |
- | 40 L2=VAL("&h"+RIGHT$(A2$,2)):R2=VAL("&h"+LEFT$(A2$,2)) 'Адрес числа Y | + | 60 READ Z$:IF Z$<>"RET" THEN POKE &HF000+T,VAL("&h"+Z$):T=T+1:GOTO 60 |
- | 50 POKE &HF301,L1:POKE &HF302,R1:POKE &HF303,L2:POKE &HF304,R2 | + | 70 DATA 2A,01,F3 :'LD HL,(F301h); HL содержит адрес переменной X |
- | 60 READ Z$:IF Z$<>"RET" THEN POKE &HF000+T,VAL("&h"+Z$):T=T+1:GOTO 60 | + | 75 DATA E5 :'PUSH HL ; |
- | 70 DATA 2A,01,F3 :'LD HL,(F301h); HL содержит адрес переменной X | + | 80 DATA CD,5C,2C :'LD DAC,(HL) ; DAC:=X |
- | 75 DATA E5 :'PUSH HL ; | + | 90 DATA CD,93,29 :'DAC:=COS(DAC) ; DAC:=COS(X) |
- | 80 DATA CD,5C,2C :'LD DAC,(HL) ; DAC:=X | + | 95 DATA E1 :'POP HL ; |
- | 90 DATA CD,93,29 :'DAC:=COS(DAC) ; DAC:=COS(X) | + | 97 DATA E5 :'PUSH HL ; |
- | 95 DATA E1 :'POP HL ; | + | 100 DATA CD,67,2C :'LD (HL),DAC ; Z:=COS(X)◀── "Прячем" результат в |
- | 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 |
- | ; В нашем случае: Z ≡ X | + | 120 DATA CD,5C,2C :'LD DAC,(HL) ; DAC:=Y |
- | 110 DATA 2A,03,F3 :'LD HL,(F303h); HL содержит адрес переменной Y | + | 130 DATA CD,AC,29 :'DAC:=SIN(DAC) ; DAC:=SIN(Y) |
- | 120 DATA CD,5C,2C :'LD DAC,(HL) ; DAC:=Y | + | 140 DATA CD,4D,2C :'LD ARG,DAC ; ARG:=SIN(Y) |
- | 130 DATA CD,AC,29 :'DAC:=SIN(DAC) ; DAC:=SIN(Y) | + | 145 DATA E1 :'POP HL ; |
- | 140 DATA CD,4D,2C :'LD ARG,DAC ; ARG:=SIN(Y) | + | 147 DATA E5 :'PUSH HL ; |
- | 145 DATA E1 :'POP HL ; | + | 150 DATA CD,5C,2C :'LD DAC,(HL) ; DAC:=Z |
- | 147 DATA E5 :'PUSH HL ; | + | 160 DATA CD,9A,26 :'ADD DAC,ARG ; DAC:=Z+SIN(Y) |
- | 150 DATA CD,5C,2C :'LD DAC,(HL) ; DAC:=Z | + | 165 DATA E1 :'POP HL ; |
- | 160 DATA CD,9A,26 :'ADD DAC,ARG ; DAC:=Z+SIN(Y) | + | 170 DATA CD,67,2C :'LD (HL),DAC ; X:=DAC |
- | 165 DATA E1 :'POP HL ; | + | 180 DATA C9,"RET" :'RET |
- | 170 DATA CD,67,2C :'LD (HL),DAC ; X:=DAC | + | 190 PRINT COS(X)+SIN(Y) |
- | 180 DATA C9,"RET" :'RET | + | 200 A=USR(A):PRINT X 'Результат |
- | 190 PRINT COS(X)+SIN(Y) | + | |
- | 200 A=USR(A):PRINT X 'Результат | + | |
</code> | </code> | ||
Строка 304: | Строка 298: | ||
===== 1.6.4. Возведение в степень ===== | ===== 1.6.4. Возведение в степень ===== | ||
- | <code> | + | ^ Имя подпрограммы ^ Адрес ^ Выполняемые действия ^ //Тип// ^ |
- | ┌────────┬───────┬────────────────────┬───────────────────────┐ | + | |SNGEXP|37C8h|%% DAC := DAC^ARG %%|Одинарная точность| |
- | │ Имя │ │ │ │ | + | |DBLEXP|37D7h|%% DAC := DAC^ARG %%|Двойная точность| |
- | │ подпро-│ Адрес │Выполняемые действия│ Т и п │ | + | |INTEXP|383Fh|%% DAC := DE^HL %%|Целая| |
- | │ граммы │ │ │ │ | + | |
- | ├────────┼───────┼────────────────────┼───────────────────────┤ | + | |
- | │ SNGEXP │ 37C8h │ DAC := DAC^ARG │ Одинарная точность │ | + | |
- | │ DBLEXP │ 37D7h │ DAC := DAC^ARG │ Двойная точность │ | + | |
- | │ INTEXP │ 383Fh │ DAC := DE^HL │ Целая │ | + | |
- | └────────┴───────┴────────────────────┴───────────────────────┘ | + | |
- | П р и м е р 9. Вычислить 3² . | + | |
- | ────────────── | + | |
- | 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:e1060-09}} __//Пример 9//__. Вычислить 3².\\ {{.examples:1060-09.bas|}} \\ [[+tab|wmsxbpge>1060-09.bas]] | ||
+ | <code> | ||
+ | 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 | ||
</code> | </code> | ||
Строка 334: | Строка 322: | ||
===== 1.6.5. Сравнение ===== | ===== 1.6.5. Сравнение ===== | ||
- | <code> | + | ^ Имя подпрограммы ^ Адрес ^ Тип ^ Левая часть условия ^ Правая часть условия ^ Изменяемые регистры ^ |
- | ┌────────┬───────┬─────────┬───────┬───────┬───────────────────────┐ | + | |FCOMP|2F21h|Single|CBED|DAC|HL| |
- | │ Имя │ │ │ Левая │ Правая│ │ | + | |ICOMP|2F4Dh|Integer|DE|HL|HL| |
- | │ подпро-│ Адрес │ Тип │ часть │ часть │ Изменяемые регистры │ | + | |XDCOMP|2F5Ch|Double|ARG|DAC|A,B,C,D,E,H,L| |
- | │ граммы │ │ │условия│условия│ │ | + | |
- | ├────────┼───────┼─────────┼───────┼───────┼───────────────────────┤ | + | |
- | │ 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, если левая часть условия > правой части условия. | + | |
- | П р и м е р 10. Сравнение двух вещественных чисел. | + | Подпрограмма возвращает следующее содержимое регистра A |
- | ────────────── | + | * -1, если левая часть условия < правой части условия, |
- | 10 CLEAR 200,&HD000:DEFUSR=&HD000 | + | * 0, если левая часть условия = правой части условия, |
- | 20 DATA 21,00,00 :'LD HL,address(N1) | + | * 1, если левая часть условия > правой части условия. |
- | 30 DATA CD,5C,2C :'LD DAC,(HL) | + | |
- | 40 DATA 21,00,00 :'LD HL,address(N2) | + | {{anchor:e1060-10}} __//Пример 10//__. Сравнение двух вещественных чисел.\\ {{.examples:1060-10.bas|}} \\ [[+tab|wmsxbpge>1060-10.bas]] |
- | 50 DATA CD,50,2C :'LD ARG,(HL) | + | <code> |
- | 60 DATA CD,5C,2F :'Сравнить DAC и ARG | + | 10 CLEAR 200,&HD000:DEFUSR=&HD000 |
- | 70 DATA 32,00,F1 :'LD (F100h),A | + | 20 DATA 21,00,00 :'LD HL,address(N1) |
- | 90 DATA C9 :'RET | + | 30 DATA CD,5C,2C :'LD DAC,(HL) |
- | 100 FOR T=0 TO &H12:READ Z$:POKE &HD000+T,VAL("&h"+Z$):NEXT | + | 40 DATA 21,00,00 :'LD HL,address(N2) |
- | 110 INPUT"Left";N1:INPUT"Right";N2 | + | 50 DATA CD,50,2C :'LD ARG,(HL) |
- | 120 A$=HEX$(VARPTR(N1)):B$=HEX$(VARPTR(N2)) | + | 60 DATA CD,5C,2F :'Сравнить DAC и ARG |
- | 130 L1$=RIGHT$(A$,2):L2$=RIGHT$(B$,2) | + | 70 DATA 32,00,F1 :'LD (F100h),A |
- | 140 H1$= LEFT$(A$,2):H2$= LEFT$(B$,2) | + | 90 DATA C9 :'RET |
- | 150 POKE &HD001,VAL("&h"+L1$):POKE &HD002,VAL("&h"+H1$) | + | 100 FOR T=0 TO &H12:READ Z$:POKE &HD000+T,VAL("&h"+Z$):NEXT |
- | 160 POKE &HD007,VAL("&h"+L2$):POKE &HD008,VAL("&h"+H2$) | + | 110 INPUT"Left";N1:INPUT"Right";N2 |
- | 180 H=USR(H):A=PEEK(&HF100) | + | 120 A$=HEX$(VARPTR(N1)):B$=HEX$(VARPTR(N2)) |
- | 190 IF A=255 THEN PRINT"LEFT < RIGHT" | + | 130 L1$=RIGHT$(A$,2):L2$=RIGHT$(B$,2) |
- | 200 IF A=1 THEN PRINT"LEFT > RIGHT" | + | 140 H1$= LEFT$(A$,2):H2$= LEFT$(B$,2) |
- | 210 IF A=0 THEN PRINT"LEFT = RIGHT" | + | 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" | ||
</code> | </code> | ||
Строка 375: | Строка 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 — начальный адрес строки. | ||
+ | |||
+ | |||
---- | ---- |