[<>]
~~TOC wide~~
====== 1.5. Работа с двоичными файлами ======
\\
Истинное красноречие состоит в том, чтобы
\\ сказать все, что нужно, но не более того.
—//Ф.Ларошфуко//
Опишем последовательность написания программы в машинных кодах:
- Вначале пишется программа на языке [[msx:basic:|]], которая будет загружать машинные подпрограммы в защищенную область RAM. Предположим, что машинная программа вводится таким образом по адресам с α по β .
- Машинная программа записывается на диск в двоичном формате командой
BSAVE "Имя",α,β,γ
.
Отметим, что наличие последнего параметра (адреса выполнения γ) необязательно. Он указывает адрес запуска, когда программа загружается с добавлением параметра R (автоматическое выполнение). Это удобно, если в начале машинной программы имеются подпрограммы.
- Для использования программы загрузите программу с помощью команды:
BLOAD "Имя",R,δ
.
Последний параметр (адрес смещения δ) не обязателен.Он указывает интервал между адресом α, который использовался для загрузки, и адресом, по которому будет размещена программа.
//Внимание//! \\ Если программа содержит переходы по абсолютному адресу, вызовы внутренних подпрограмм или данные, то не исключено, что ее невозможно будет перемещать в памяти подобным образом.
{{anchor:e1050-01}} __//Пример//__ [[bibliography#b2|[2]]]. Программа устанавливает экран в режимы ''SCREEN 2,3'', загружает форму спрайта и позволяет перемещать спрайт по горизонтали при помощи клавиш управления курсором → и ←.
\\ {{.examples:1050-01.bas|}} \\ [[+tab|wmsxbpge>1050-01.bas]]
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 ─▶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 ;пересылка RAM──▶видеопамять
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 ;пересылка RAM──▶видеопамять
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?─────────┐
380 DATA 20,01 :'A03E JR NZ,01 ;нет──▶JUMP │
390 DATA 34 :'A040 INC (HL) ;(HL)=(HL)+1 │
400 DATA FE,07 :'A041 CP 07 ;A=7? ◀────┘
410 DATA 20,01 :'A043 JR NZ,01 ;нет──▶JUMP───┐
420 DATA 35 :'A045 DEC (HL) ;(HL)=(HL)-1 │
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 ;нет──▶цикл
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".
{{anchor:e1050-02}} __//Пример//__. Перемещение спрайта при помощи клавиш управления курсором. \\ {{.examples:1050-02.bas|}} \\ [[+tab|wmsxbpge>1050-02.bas]]
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 :' ◀────────────────┐ Образ
80 DATA FF,FF,FF,FF :' ◀────────────────┘ спрайта
90 DATA 64,64,00,0F :' ◀───────────────── Y,X,шаблон,цвет
100 DATA CD,6F,00 :' CALL 006F SCREEN 1
110 DATA 21,00,D0 :' LD HL,D000 ─┐ Формирование
120 DATA 11,00,38 :' LD DE,3800 │ шаблона
130 DATA 01,08,00 :' LD BC,0008 │ спрайта
140 DATA CD,5C,00 :' CALL 005C ◀─┘
150 DATA 21,08,D0 :'┌─▶LD HL,D008◀─┐ Рисование
160 DATA 11,00,1B :'│ LD DE,1B00 │ спрайта
170 DATA 01,04,00 :'│ LD BC,0004 │
180 DATA CD,5C,00 :'│ CALL 005C ◀─┘
190 DATA 3E,00 :'│ LD A,00 ◀─┐ Обращение
200 DATA CD,D5,00 :'│ CALL 00D5 ◀─┘ к подпрограмме BIOS
210 DATA FE,01 :'│ CP 01 ◀─┐
220 DATA CC,7E,D0 :'│ CALL Z,D07E │
230 DATA FE,02 :'│ CP 02 │
240 DATA CC,7E,D0 :'│ CALL Z,D07E │ Проверка нажатия
250 DATA FE,02 :'│ CP 02 │ клавиш управления
260 DATA CC,8D,D0 :'│ CALL Z,D08D │ курсором
270 DATA FE,03 :'│ CP 03 │ и переход
280 DATA CC,8D,D0 :'│ CALL Z,D08D │ на подпрограмму
290 DATA FE,04 :'│ CP 04 │ изменения X,Y
300 DATA CC,83,D0 :'│ CALL Z,D083 │
310 DATA FE,04 :'│ CP 04 │
320 DATA CC,8D,D0 :'│ CALL Z,D08D │
330 DATA FE,05 :'│ CP 05 │
340 DATA CC,83,D0 :'│ CALL Z,D083 │
350 DATA FE,06 :'│ CP 06 │
360 DATA CC,83,D0 :'│ CALL Z,D083 │
370 DATA FE,06 :'│ CP 06 │
380 DATA CC,88,D0 :'│ CALL Z,D088 │
390 DATA FE,07 :'│ CP 07 │
400 DATA CC,88,D0 :'│ CALL Z,D088 │
410 DATA FE,08 :'│ CP 08 │
420 DATA CC,88,D0 :'│ CALL Z,D088 │
430 DATA FE,08 :'│ CP 08 │
440 DATA CC,7E,D0 :'│ CALL Z,D07E ◀─┘
450 DATA CD,BA,00 :'│ CALL 00BA
460 DATA 21,FF,0F :'│ LD HL,0FFF ◀─┐
470 DATA 2B :'│ DEC HL ◀──┐ │
480 DATA 7D :'│ LD A,L │ │
490 DATA FE,00 :'│ CP 00 │ │ Задержка
500 DATA C2,6E,D0 :'│ JP NZ,D06E ──┤ │
510 DATA 7C :'│ LD A,H │ │
520 DATA FE,00 :'│ CP 00 │ │
530 DATA C2,6E,D0 :'│ JP NZ,D06E ──┘◀─┘
540 DATA C3,1B,D0 :'└─ JP D01B
550 DATA 21,08,D0 :' LD HL,D008◀─┐ Подпрограмма
560 DATA 35 :' DEC (HL) │ уменьшения
570 DATA C9 :' RET ◀─┘ координаты Y
580 DATA 21,08,D0 :' LD HL,D008◀─┐ Подпрограмма
590 DATA 34 :' INC (HL) │ увеличения
600 DATA C9 :' RET ◀─┘ координаты Y
610 DATA 21,09,D0 :' LD HL,D009◀─┐ Подпрограмма
620 DATA 35 :' DEC (HL) │ уменьшения
630 DATA C9 :' RET ◀─┘ координаты X
640 DATA 21,09,D0 :' LD HL,D009◀─┐ Подпрограмма
650 DATA 34 :' INC (HL) │ увеличения
660 DATA C9 :' RET ◀─┘ координаты X
670 DATA z :' К о н е ц
----
[<>]
{{tag>msxbdpl}}