Инструменты пользователя

Инструменты сайта


msx:basic_dialogue_programming_language:105

Первая страницаПредыдущая страницаНазад к обзоруСледующая страницаПоследняя страница

1.5. Работа с двоичными файлами


Истинное красноречие состоит в том, чтобы
сказать все, что нужно, но не более того.

Ф.Ларошфуко

Опишем последовательность написания программы в машинных кодах:

  1. Вначале пишется программа на языке MSX BASIC, которая будет загружать машинные подпрограммы в защищенную область RAM. Предположим, что машинная программа вводится таким образом по адресам с α по β .
  2. Машинная программа записывается на диск в двоичном формате командой

    BSAVE "Имя",α,β,γ

    .

    Отметим, что наличие последнего параметра (адреса выполнения γ) необязательно. Он указывает адрес запуска, когда программа загружается с добавлением параметра R (автоматическое выполнение). Это удобно, если в начале машинной программы имеются подпрограммы.

  3. Для использования программы загрузите программу с помощью команды:

    BLOAD "Имя",R,δ

    .

    Последний параметр (адрес смещения δ) не обязателен.Он указывает интервал между адресом α, который использовался для загрузки, и адресом, по которому будет размещена программа.

Внимание!
Если программа содержит переходы по абсолютному адресу, вызовы внутренних подпрограмм или данные, то не исключено, что ее невозможно будет перемещать в памяти подобным образом.

Пример [2]. Программа устанавливает экран в режимы SCREEN 2,3, загружает форму спрайта и позволяет перемещать спрайт по горизонтали при помощи клавиш управления курсором и .
1050-01.bas
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».

Пример. Перемещение спрайта при помощи клавиш управления курсором.
1050-02.bas
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            :'   К о н е ц

Первая страницаПредыдущая страницаНазад к обзоруСледующая страницаПоследняя страница

msx/basic_dialogue_programming_language/105.txt · Последние изменения: 2023-02-19 16:27 — GreyWolf