1.5. Р а б о т а с д в о и ч н ы м и ф а й л а м и Истинное красноречие состоит в том, чтобы сказать все, что нужно, но не более того. Ф.Ларошфуко Опишем последовательность написания программы в машинных кодах: 1. Вначале пишется программа на языке MSX-BASIC, которая будет загру- жать машинные подпрограммы в защищенную область RAM. Предположим, что ма- шинная программа вводится таким образом по адресам с ═ по ║ . 2. Машинная программа записывается на диск в двоичном формате командой XWWWWWWWWWWWWWWWWWWWWWWWWWWWWY V BSAVE "И м я",═,║,╖ V . ZWWWWWWWWWWWWWWWWWWWWWWWWWWWW[ Отметим, что наличие последнего параметра (адреса выполнения ╖) необя- зательно. Он указывает адрес запуска, когда программа загружается с добав- лением параметра R (автоматическое выполнение). Это удобно, если в начале машинной программы имеются подпрограммы. 3. Для использования программы загрузите программу с помощью команды: XWWWWWWWWWWWWWWWWWWWWWWWWWWWWY V BLOAD "И м я",R,╚ V . ZWWWWWWWWWWWWWWWWWWWWWWWWWWWW[ Последний параметр (адрес смещения ╚) не обязателен.Он указывает интер- вал между адресом ═, который использовался для загрузки, и адресом, по ко- торому будет размещена программа. В н и м а н и е! Если программа содержит переходы по абсолютному адре- су, вызовы внутренних подпрограмм или данные, то не исключено, что ее не- возможно будет перемещать в памяти подобным образом. П р и м е р [2]. Программа устанавливает экран в режимы SCREEN 2,3 , WWWWWWWWWWWWWWW загружает форму спрайта и позволяет перемещать спрайт по горизонтали при помощи клавиш управления курсором "WW▐" и "░WW". 10 CLEAR 200,&HA000 'Программа размещается с адреса &HA000 20 A=&HA000 30 READ A$:IF A$="Z" THEN 50 40 POKE A, VAL("&H"+A$):A=A+1:GOTO 30 50 BSAVE"BSPRIT",&HA000,&HA073,&HA030 110 DATA 3E,E3 :'A000 LD A,E3 ;A=E3 ; Размер 120 DATA 32,E0,F3 :'A002 LD (F3E0),A ;A W▐F3E0 VDP(1) ; спрайта 130 DATA CD,72,00 :'AOO5 CALL 0072 ; 140 DATA 21,50,A0 :'A008 LD HL,A050 ;HL=начало данных 150 DATA 11,00,38 :'A00B LD DE,3800 ;DE=начало SGT 160 DATA 01,20,00 :'A00E LD BC,0020 ;BC=длина данных 170 DATA CD,5C,00 :'A011 CALL 005C ;пересылка RAMWW▐видеопамять 180 DATA C9 :'AO14 RET ;выход 190 DATA 00,00,00 :'A015 NOP 200 'A018 SAT 210 DATA 21,70,A0 :'A018 LD HL,A070 ;HL=начало данных 220 DATA 11,00,1B :'A01B LD DE,1B00 ;DE=начало SAT 230 DATA 01,04,00 :'A01E LD BC,0004 ;BC=длина данных 240 DATA CD,5C,00 :'A021 CALL 005C ;пересылка RAMWW▐видеопамять 250 DATA C9 :'A024 RET ;выход 260 DATA 00,00,00 :'A025 NOP 270 'A028 STICK(0) 280 DATA 3E,00 :'А028 LD A,00 ;клавиши управления курсором 290 DATA CD,D5,00 :'A02A CALL 00D5 ;A=STICK(0) 300 DATA C9 :'A02D RET ;выход 310 DATA 00,00 :'A02E NOP 320 'A030 Основная программа 330 DATA CD,00,A0 :'A030 CALL A000 ;Экран/SGT 340 DATA CD,18,A0 :'A033 CALL A018 ;SAT 350 DATA CD,28,A0 :'A036 CALL AO28 ;STICK(0) 360 DATA 21,71,A0 :'A039 LD HL,A071 ;HL=X координатный указатель 370 DATA FE,03 :'A03C CP 03 ;A=3?WWWWWWWWWY 380 DATA 20,01 :'A03E JR NZ,01 ;нетWW▐JUMP V 390 DATA 34 :'A040 INC (HL) ;(HL)=(HL)+1 V 400 DATA FE,07 :'A041 CP 07 ;A=7? ░WWWW[ 410 DATA 20,01 :'A043 JR NZ,01 ;нетWW▐JUMPWWWY 420 DATA 35 :'A045 DEC (HL) ;(HL)=(HL)-1 V 430 DATA 01,FF,00 :'A046 LD BC,FF ;счетчик=255 ░[ 440 DATA 0B :'А049 DEC BC ;BC=BC-1 450 DATA 78 :'A04A LD A,B ;BC=0? 460 DATA B1 :'A04B OR C ;нетWW▐цикл 470 DATA 20,FB :'A04C JR NZ,$-3 ;переход на A049 480 DATA 18,E3 :'A04E JR $-27 ;переход на A033 490 'A050 Начальные данные для ш а б л о н а спрайта 500 DATA FF,80,80,80,80,80,80,80 510 DATA 80,80,80,80,80,80,80,FF 520 DATA FF,01,01,01,01,01,01,01 530 DATA 01,01,01,01,01,01,01,FF 540 'A070 Начальные данные для а т р и б у т а спрайта 550 DATA 10,10,00,0F,"Z" Эта программа загружает машинную программу как двоичный файл с именем BSPRIT . Запуск программы выполняется командой: BLOAD"BSPRITE",R Отметим, что для изменения ф о р м ы спрайта достаточно изменить дан- ные в строках с 500 по 530. Для изменения с к о р о с т и перемещения спрайта измените значение счетчика по адресам A047h и A048h. В н и м а н и е! Единственный способ "выйти" из этой программы - это выключить компьютер или нажать кнопку сброса "RESET". П р и м е р. Перемещение спрайта при помощи клавиш управления курсо- WWWWWWWWWWW ром. 10 CLEAR 200,&HD000 20 DEFUSR=&HD00C 30 A=&HD000 40 READ K$:IF K$="z" THEN A=USR(0):END 50 POKE A,VAL("&h"+K$) 60 A=A+1:GOTO 40 70 DATA FF,FF,FF,FF :' ░WWWWWWWWWWWWWWWWY Образ 80 DATA FF,FF,FF,FF :' ░WWWWWWWWWWWWWWWW[ спрайта 90 DATA 64,64,00,0F :' ░WWWWWWWWWWWWWWWWW Y,X,шаблон,цвет 100 DATA CD,6F,00 :' CALL 006F SCREEN 1 110 DATA 21,00,D0 :' LD HL,D000 WY Формирование 120 DATA 11,00,38 :' LD DE,3800 V шаблона 130 DATA 01,08,00 :' LD BC,0008 V спрайта 140 DATA CD,5C,00 :' CALL 005C ░W[ 150 DATA 21,08,D0 :'XW▐LD HL,D008░WY Рисование 160 DATA 11,00,1B :'V LD DE,1B00 V спрайта 170 DATA 01,04,00 :'V LD BC,0004 V 180 DATA CD,5C,00 :'V CALL 005C ░W[ 190 DATA 3E,00 :'V LD A,00 ░WY Обращение 200 DATA CD,D5,00 :'V CALL 00D5 ░W[ к подпрограмме BIOS 210 DATA FE,01 :'V CP 01 ░WY 220 DATA CC,7E,D0 :'V CALL Z,D07E V 230 DATA FE,02 :'V CP 02 V 240 DATA CC,7E,D0 :'V CALL Z,D07E V Проверка нажатия 250 DATA FE,02 :'V CP 02 V клавиш управления 260 DATA CC,8D,D0 :'V CALL Z,D08D V курсором 270 DATA FE,03 :'V CP 03 V и переход 280 DATA CC,8D,D0 :'V CALL Z,D08D V на подпрограмму 290 DATA FE,04 :'V CP 04 V изменения X,Y 300 DATA CC,83,D0 :'V CALL Z,D083 V 310 DATA FE,04 :'V CP 04 V 320 DATA CC,8D,D0 :'V CALL Z,D08D V 330 DATA FE,05 :'V CP 05 V 340 DATA CC,83,D0 :'V CALL Z,D083 V 350 DATA FE,06 :'V CP 06 V 360 DATA CC,83,D0 :'V CALL Z,D083 V 370 DATA FE,06 :'V CP 06 V 380 DATA CC,88,D0 :'V CALL Z,D088 V 390 DATA FE,07 :'V CP 07 V 400 DATA CC,88,D0 :'V CALL Z,D088 V 410 DATA FE,08 :'V CP 08 V 420 DATA CC,88,D0 :'V CALL Z,D088 V 430 DATA FE,08 :'V CP 08 V 440 DATA CC,7E,D0 :'V CALL Z,D07E ░W[ 450 DATA CD,BA,00 :'V CALL 00BA 460 DATA 21,FF,0F :'V LD HL,0FFF ░WY 470 DATA 2B :'V DEC HL ░WWY V 480 DATA 7D :'V LD A,L V V 490 DATA FE,00 :'V CP 00 V V Задержка 500 DATA C2,6E,D0 :'V JP NZ,D06E WWS V 510 DATA 7C :'V LD A,H V V 520 DATA FE,00 :'V CP 00 V V 530 DATA C2,6E,D0 :'V JP NZ,D06E WW[░W[ 540 DATA C3,1B,D0 :'ZW JP D01B 550 DATA 21,08,D0 :' LD HL,D008░WY Подпрограмма 560 DATA 35 :' DEC (HL) V уменьшения 570 DATA C9 :' RET ░W[ координаты Y 580 DATA 21,08,D0 :' LD HL,D008░WY Подпрограмма 590 DATA 34 :' INC (HL) V увеличения 600 DATA C9 :' RET ░W[ координаты Y 610 DATA 21,09,D0 :' LD HL,D009░WY Подпрограмма 620 DATA 35 :' DEC (HL) V уменьшения 630 DATA C9 :' RET ░W[ координаты X 640 DATA 21,09,D0 :' LD HL,D009░WY Подпрограмма 650 DATA 34 :' INC (HL) V увеличения 660 DATA C9 :' RET ░W[ координаты X 670 DATA z :' К о н е ц 1.6. Р е а л и з а ц и я в е щ е с т в е н н о й а р и ф м е т и к и н а м а ш и н н о м я з ы к е Изучай все не из тщеславия, а ради практической пользы. Г.Лихтенберг. Афоризмы В системной области имеются два вещественных "регистра" - а к к у м у- л я т о р а, при помощи которых компьютер осуществляет все арифметические операции: DAC ("Decimal ACcumulator"-"десятичный аккумулятор") - F7F6h, 16 байтов, ARG ("ARGument"-"аргумент") - F847h, 16 байтов. В е щ е с т в е н н о е число в аккумуляторах размещается следующим образом: F7F6h F7F7h F7FDh XWWWWWWWWWWWWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWY VЗнак и порядокV М а н т и с с а V DAC ZWWWWWWWWWWWWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWW[ F847h F848h F84Eh XWWWWWWWWWWWWWWRWWWRWWWRWWWRWWWRWWWRWWWRWWWY VЗнак и порядокV М а н т и с с а V ARG ZWWWWWWWWWWWWWWQWWWQWWWQWWWQWWWQWWWQWWWQWWW[ Ц е л о е число в аккумуляторе располагается следующим образом: F7F6h F7F7h F7F8h F7F9h XWWWWWWWWRWWWWWWWWRWWWWWWWWWWWWWRWWWWWWWWWWWWWY V Незначащие байтыV Младший байтV Старший байтV DAC ZWWWWWWWWQWWWWWWWWQWWWWWWWWWWWWWQWWWWWWWWWWWWW[ F847h F848h F849h F84Ah XWWWWWWWWRWWWWWWWWRWWWWWWWWWWWWWRWWWWWWWWWWWWWY V Незначащие байтыV Младший байтV Старший байтV ARG ZWWWWWWWWQWWWWWWWWQWWWWWWWWWWWWWQWWWWWWWWWWWWW[ Подробнее о хранении чисел см. в разделе X.4.1. В ячейке VALTYP системной области (по адресу F663h) хранится тип числа, находящегося в аккумуляторе DAC, причем тип закодирован следующим образом: 2 - целое число; 4 - вещественное число одинарной точности; 8 - вещественное число двойной точности. В следующих табличках приведен список входных точек очень полезных под- программ ROM. 1.6.1. П е р е с ы л к и XWWWWWWWWRWWWWWWWRWWWWWWWWWWWWWWWWRWWWWWWWWRWWWWWWWWWWWWWWWWWWY V Имя V V V V V V подпро-V Адрес V Выполняемые V Т и п V Изменяемые V V граммы V V действия V V регистры V TWWWWWWWWUWWWWWWWUWWWWWWWWWWWWWWWWUWWWWWWWWUWWWWWWWWWWWWWWWWWWS V MAF V 2C4Dh V ARG := DAC V Double V A,B,D,E,H,L,ARG V V MAM V 2C50h V ARG := (HL) V Double V A,B,D,E,H,L,ARG V V MOV8DH V 2C53h V (DE):= (HL) V Double V A,B,D,E,H,L V V MFA V 2C59h V DAC := ARG V Double V A,B,D,E,H,L,DAC V V MFM V 2C5Ch V DAC := (HL) V Double V A,B,D,E,H,L,DAC V V MMF V 2C67h V (HL):= DAC V Double V A,B,D,E,H,L V V MOV8HD V 2C6Ah V (HL):= (DE) V Double V A,B,D,E,H,L V V XTF V 2C6Fh V (SP):= DAC V Double V A,B,D,E,H,L V V PHA V 2CC7h V ARG := (SP) V Double V A,B,D,E,H,L,ARG V V PHF V 2CCCh V DAC := (SP) V Double V A,B,D,E,H,L,DAC V V PPA V 2CDCh V (SP):= ARG V Double V A,B,D,E,H,L V V PPF V 2CE1h V (SP):= DAC V Double V A,B,D,E,H,L V V PUSHF V 2EB1h V DAC := (SP) V Single V D,E,DAC V V MOVFM V 2EBEh V DAC := (HL) V Single V B,C,D,E,H,L,DAC V V MOVFR V 2EC1h V DAC := (CBED) V Single V DAC,D,E V V MOVRF V 2ECCh V (CBED):= DAC V Single V B,C,D,E,H,L V V MOVRMI V 2ED6h V (CBED):= (HL) V Single V B,C,D,E,H,L V V MOVRM V 2EDFh V (BCDE):= (HL) V Single V B,C,D,E,H,L V V MOVMF V 2EE8h V (HL):= DAC V Single V B,C,D,E,H,L V V MOVE V 2EEBh V (HL):= (DE) V Single V B,C,D,E,H,L V V VMOVAM V 2EEFh V ARG := (HL) V VALTYP V B,C,D,E,H,L,ARG V V MOVVFM V 2EF2h V (DE):= (HL) V VALTYP V B,C,D,E,H,L V V VMOVE V 2EF3h V (HL):= (DE) V VALTYP V B,C,D,E,H,L V V VMOVFA V 2F05h V DAC := ARG V VALTYP V B,C,D,E,H,L,DAC V V VMOVFM V 2F08h V DAC := (HL) V VALTYP V B,C,D,E,H,L,DAC V V VMOVAF V 2F0Dh V ARG := DAC V VALTYP V B,C,D,E,H,L,ARG V V VMOVMF V 2F10h V (HL):= DAC V VALTYP V B,C,D,E,H,L V ZWWWWWWWWQWWWWWWWQWWWWWWWWWWWWWWWWQWWWWWWWWQWWWWWWWWWWWWWWWWWW[ П р и м е р 1. Записать число в аккумулятор DAC,а затем прочитать его. WWWWWWWWWWWWW 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,а затем прочитать его. WWWWWWWWWWWWW 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 1.6.2. А р и ф м е т и ч е с к и е о п е р а ц и и над ц е л ы м и ч и с л а м и Наиболее полезны те советы, которым легко следовать. Л.Вовенарг XWWWWWWWWRWWWWWWWRWWWWWWWWWWWWWWWWWWWWRWWWWWWWWWWWWWWWWWWWWWWWY V Имя V V V V V подпро-V Адрес VВыполняемые действияV Изменяемые регистры V V граммы V V V V TWWWWWWWWUWWWWWWWUWWWWWWWWWWWWWWWWWWWWUWWWWWWWWWWWWWWWWWWWWWWWS V UMULT V 314Ah V DE := BCGDE V A,B,C,D,E V V ISUB V 3167h V HL := DE-HL V A,B,C,D,E,H,L V V IADD V 3172h V HL := DE+HL V A,B,C,D,E,H,L V V IMULT V 3193h V HL := DEGHL V A,B,C,D,E,H,L V V IDIV V 31E6h V HL := DE/HL V A,B,C,D,E,H,L V V IMOD V 323Ah V HL := DE mod HL V A,B,C,D,E,H,L V ZWWWWWWWWQWWWWWWWQWWWWWWWWWWWWWWWWWWWWQWWWWWWWWWWWWWWWWWWWWWWW[ П р и м е р 3. Умножение целых чисел (операнды находятся в регистрах WWWWWWWWWWWWWW HL и DE). 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" :' 1.6.3. А р и ф м е т и ч е с к и е о п е р а ц и и н а д в е щ е с т в е н н ы м и ч и с л а м и XWWWWWWWWRWWWWWWWRWWWWWWWWWWWWWWWWWWWWRWWWWWWWWWWWWWWWWWWWWWWWY V Имя V V V V V подпро-V Адрес VВыполняемые действияV Изменяемые регистры V V граммы V V V V TWWWWWWWWUWWWWWWWUWWWWWWWWWWWWWWWWWWWWUWWWWWWWWWWWWWWWWWWWWWWWS V DECSUB V 268Ch V DAC := DAC-ARG V A,B,C,D,E,H,L,DAC V V DECADD V 269Ah V DAC := DAC+ARG V A,B,C,D,E,H,L,DAC V V DECNRM V 26FAh V Нормализовать DAC V A,B,C,D,E,H,L,DAC V V DECROU V 273Ch V Округлить DAC V A,B,C,D,E,H,L,DAC V V DECMUL V 27E6h V DAC := DACGARG V A,B,C,D,E,H,L,DAC V V DECDIV V 289Fh V DAC := DAC/ARG V A,B,C,D,E,H,L,DAC V V COS V 2993h V DAC := COS(DAC) V A,B,C,D,E,H,L,DAC,ARG V V SIN V 29ACh V DAC := SIN(DAC) V A,B,C,D,E,H,L,DAC,ARG V V TAN V 29FBh V DAC := TAN(DAC) V A,B,C,D,E,H,L,DAC,ARG V V ATN V 2A14h V DAC := ATN(DAC) V A,B,C,D,E,H,L,DAC,ARG V V LOG V 2A72h V DAC := LOG(DAC) V A,B,C,D,E,H,L,DAC,ARG V V SQR V 2AFFh V DAC := SQR(DAC) V A,B,C,D,E,H,L,DAC,ARG V V EXP V 2B4Ah V DAC := EXP(DAC) V A,B,C,D,E,H,L,DAC,ARG V V RND V 2BDFh V DAC := RND(DAC) V A,B,C,D,E,H,L,DAC,ARG V V SIGN V 2E71h V A := SIGN(DAC) V A V V ABSFN V 2E82h V DAC := ABS(DAC) V A,B,C,D,E,H,L,DAC,ARG V V NEG V 2E8Dh V DAC := - DAC V A,H,L,DAC V V SGN V 2E97h V DAC := SGN(DAC) V A,H,L,DAC V ZWWWWWWWWQWWWWWWWQWWWWWWWWWWWWWWWWWWWWQWWWWWWWWWWWWWWWWWWWWWWW[ П р и м е р 4. Сумма двух вещественных чисел. WWWWWWWWWWWWW 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. Возведение в степень. WWWWWWWWWWWWW 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. Вычисление значения функции синус вещественного аргу- WWWWWWWWWWWWWW мента. 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. Генерация псевдослучайного числа. WWWWWWWWWWWWWW 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 П р и м е р 8. Вычислить значение функции двух переменных WWWWWWWWWWWWWW 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)) 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)░WW "Прячем" результат в ; любую заранее зарезервированную ; группу ячеек памяти ; В нашем случае: 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 'Результат \page 1.6.4. В о з в е д е н и е в с т е п е н ь XWWWWWWWWRWWWWWWWRWWWWWWWWWWWWWWWWWWWWRWWWWWWWWWWWWWWWWWWWWWWWY V Имя V V V V V подпро-V Адрес VВыполняемые действияV Т и п V V граммы V V V V TWWWWWWWWUWWWWWWWUWWWWWWWWWWWWWWWWWWWWUWWWWWWWWWWWWWWWWWWWWWWWS V SNGEXP V 37C8h V DAC := DAC^ARG V Одинарная точность V V DBLEXP V 37D7h V DAC := DAC^ARG V Двойная точность V V INTEXP V 383Fh V DAC := DE^HL V Целая V ZWWWWWWWWQWWWWWWWQWWWWWWWWWWWWWWWWWWWWQWWWWWWWWWWWWWWWWWWWWWWW[ П р и м е р 9. Вычислить 3╫ . WWWWWWWWWWWWWW 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 1.6.5. С р а в н е н и е XWWWWWWWWRWWWWWWWRWWWWWWWWWRWWWWWWWRWWWWWWWRWWWWWWWWWWWWWWWWWWWWWWWY V Имя V V V Левая V ПраваяV V V подпро-V Адрес V Тип V часть V часть V Изменяемые регистры V V граммы V V VусловияVусловияV V TWWWWWWWWUWWWWWWWUWWWWWWWWWUWWWWWWWUWWWWWWWUWWWWWWWWWWWWWWWWWWWWWWWS V FCOMP V 2F21h V Single V CBED V DAC V HL V V ICOMP V 2F4Dh V Integer V DE V HL V HL V V XDCOMP V 2F5Ch V Double V ARG V DAC V A,B,C,D,E,H,L V ZWWWWWWWWQWWWWWWWQWWWWWWWWWQWWWWWWWQWWWWWWWQWWWWWWWWWWWWWWWWWWWWWWW[ Подпрограмма возвращает следующее содержимое регистра A -1, если левая часть условия < правой части условия, 0, если левая часть условия = правой части условия, 1, если левая часть условия > правой части условия. П р и м е р 10. Сравнение двух вещественных чисел. WWWWWWWWWWWWWW 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" 1.6.6. П р е о б р а з о в а н и е т и п о в XWWWWWWWWRWWWWWWWRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWY V Имя V V V V подпро-V Адрес V Выполняемые действия V V граммы V V V TWWWWWWWWUWWWWWWWUWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWS V FRCINT V 2F8Ah V Содержимое DAC преобразуется к целому типу V V FRCSNG V 2FB2h V Содержимое DAC преобразуется к типу одинарнойV V V V точности V V FRCDBL V 303Ah V Содержимое DAC преобразуется к типу двойной V V V V точности V V FIXER V 30BEh V DAC:=SGN(DAC)GINT(ABS(DAC)) V ZWWWWWWWWQWWWWWWWQWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW[ После выполнения подпрограммы в ячейке с именем VALTYP будет находить- ся код типа числа, находящегося в DAC. 1.6.7. П р е о б р а з о в а н и е ч и с е л д л я в ы в о д а на п е ч а т ь Для преобразования из с т р о к и в ч и с л о используется подпро- грамма с именем XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWY V FIN (3299h) V V А р г у м е н т ы: HL - адрес строки символов, V V WWWWWWWWWWWWWWWWW A - первый символ строки. V V Р е з у л ь т а т ы: DAC - вещественное число, V V WWWWWWWWWWWWWWWWWWW C - { 0 - была десятичная точка, V V { FFh - десятичной точки не было, V V B - количество цифр после десятичной точки, V V D - количество цифр в числе. V ZWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW[ Для в ы в о д а имеются две подпрограммы: XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWY V FOUT (3425h) - неформатный вывод, V V PUFOUT (3426h) - форматный вывод. V ZWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW[ Эти подпрограммы преобразуют число, находящееся в DAC, в строку симво- лов. Аргументы: A - формат; содержимое его битов может быть следующим: WWWWWWWWW bit7: если 1, то вывод осуществляется по формату; bit6: если 1, то через каждые 3 цифры вставляются запятые; bit5: если 1, то первые нули заменить на символ "*"; bit4: если 1, то перед числом вставить символ "$"; bit3: если 1, то число выводится всегда со знаком; bit2: если 1, то вставить знак после числа; bit1: не используется; bit0:{если 0, то число выводится с фиксированной точкой; {если 1, то число выводится с плавающей точкой; B - количество цифр перед точкой; C - количество цифр после точки + 1. Результаты: HL - начальный адрес строки символов. WWWWWWWWWW П р и м е р 11. Вычисление косинуса вещественного числа. WWWWWWWWWWWWWW 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) ░WWWY 150 DATA 23 :'INC HL V 160 DATA CD,A2,00 :'CALL 00A2h ;Вывод символа на монитор V 170 DATA 10,F9 :'DJNZ $-5 ;Конец цикла WWW[ 180 DATA C9 :'RET 190 DATA "z" Остальные подпрограммы перечислены ниже: XWWWWWWWWRWWWWWWWRWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWY V Имя V V V V подпро-V Адрес V Выполняемые действия V V граммы V V V TWWWWWWWWUWWWWWWWUWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWS V FOUTB V 371Ah V Целое число WW▐ в двоичный вид V V FOUTO V 371Eh V Целое число WW▐ в восьмеричный вид V V FOUTH V 3722h V Целое число WW▐ в шестнадцатеричный видV ZWWWWWWWWQWWWWWWWQWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW[ Для этих подпрограмм: А р г у м е н т ы: DAC - целое число, WWWWWWWWWWWWWWWWW VALTYP = 2. Р е з у л ь т а т ы: HL - начальный адрес строки. WWWWWWWWWWWWWWWWWWW