[<>] ~~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}}