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

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


msx:assembler_programming_guide-fakhrutdinov_bocharov:13

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

Приложение 3. Листинг программы управления спрайтом

Ниже приводится листинг программы управления спрайтом при помощи джойстика. Если у Вас его нет, можно воспользоваться MSX-мышью. Для работы мыши в режиме джойстика при включении компьютера или устанавливая мышь в разьем, держите нажатой левую кнопку мыши. Программа оттранслирована ассемблером системы DUAD.

Архив с готовыми файлами

  • sprite.asm — исходный код программы на ассемблере
  • sprite.lst — листинг программы на ассемблере
  • sprite.obj — оттранслированная программа на ассемблере
'sprite ctrl'     Z80-Assembler   Page:    1
                      title   'sprite ctrl'
              ; константы
0001 =        nospr   EQU     1         ; номер активного спрайта
0001 =        step    EQU     1         ; шаг приращения координат
                      ORG     9000h     ;начальный адрес прог.
              ; вводим номер джойстика
9000 CDC000           CALL    0C0h      ;beep
9003 21AEF3           LD      HL,0F3AEh ;разм. экр. в screen 0
9006 3628             LD      (HL),40   ;width 40
9008 210F01           LD      HL,010Fh
900B 22E9F3           LD      (0F3E9h),HL;colOR 15,1
900E 21E0F3           LD      HL,0F3E0h ;vdp(1)
9011 CBCE             SET     1,(HL)    ;16*16
9013 CB86             RES     0,(HL)    ;норм. размер спрайта
9015 CD6C00           CALL    6Ch       ;screen 0
9018 CDCC00           CALL    0CCh      ;key off
901B 21F190           LD      HL,input  ;Введите номер джойс.
              ; вывод сообщения на экран
901E 7E               LD      a,(HL)
901F B7               OR      a         ;если код символа = 0,
9020 2806             JR      z,l02     ;то закончить вывод
9022 CDA200           CALL    0A2h      ;вывод символа (A)
                                        ;на экран
9025 23               INC     HL        ;адрес след. символа
9026 18F6             JR      $-8       ;повторить вывод
9028 CD9F00   l02:    CALL    9Fh       ;ввести символ с клав.
902B 0600             LD      b,0       ;номер джойстика = 0
902D D630             SUB     '0'       ;проверяем:
902F 280A             JR      z,l01     ;нажато "0", переходим
9031 04               INC     b         ;если нет, то джойс.=1
9032 3D               DEC     a         ;нажата "1"
9033 2806             JR      z,l01     ;если да, то переходим
9035 04               INC     b         ;джойстик = 2
9036 3D               DEC     a         ;если нажата "2",
9037 2802             JR      z,l01     ;переходим
9039 18ED             JR      l02       ;иначе вводим снова
              ; создаем шаблон номер NoSpr
903B CD7200   l01:    CALL    72h       ;screen 2
903E C5               PUSH    BC        ;сохр. номер джойстика
903F 3E01             LD      a,nospr   ;грузим номер спрайта
9041 CD8400           CALL    84h       ;узнаем адрес шаблона
9044 111191           LD      DE,sprdat ;грузим адрес данных
9047 012000           LD      BC,32     ;длина данных
904A EB               EX      DE,HL
904B CD5C00           CALL    5Ch       ;перепис. блок во VRAM
              ; выводим спрайт на экран
904E 3E01     putspr: LD      a,nospr   ;грузим номер спрайта
9050 CD8700           CALL    87h       ;узнаем адр.табл.атр.
9053 113191           LD      DE,y      ;адрес блока данных
9056 010400           LD      BC,4      ;длина блока
9059 EB               EX      DE,HL
905A CD5C00           CALL    5Ch       ;пересылаем блок
              ; задержка
905D 110001           LD      DE,100h   ;кол-во пустых циклов
9060 1B               DEC     DE
9061 7A               LD      a,d
9062 B3               OR      e
9063 20FB             JR      nz,$-3    ;если <> 0, то повт.
              ; вводим stick(b)
9065 C1       stick:  POP     BC        ;считыв. номер джойст.
9066 CDB700           CALL    0B7h      ;пров., не нажато ли
                                        ;ctrl+STOP
9069 D8               RET     c         ;если да, то возврат
906A 78               LD      a,b       ;A = номеру джойстика
906B C5               PUSH    BC        ;опять сохр. номер дж.
906C CDD500           CALL    0D5h      ;вводим напр. джойс.
906F B7               OR      a         ;если ничего не нажато,
9070 28F3             JR      z,stick   ;то ввод снова
9072 0E01             LD      c,step    ;загр. значение шага
              ; вверх
9074 3D               DEC     a         ;нажато вверх ?
9075 2005             JR      nz,ur     ;если нет, то следующ.
9077 CDBD90           CALL    moveUP    ;иначе - уменьшение Y
907A 18D2             JR      putspr    ;и переходим на  спр.
              ; вверх/вправо
907C 3D  ur:          DEC     a         ;то же, что и выше
907D 2008             JR      nz,right
907F CDBD90           CALL    moveUP
9082 CDC890           CALL    moveRG
9085 18C7             JR      putspr
              ; вправо
9087 3D       right:  DEC     a
9088 2005             JR      nz,rd
908A CDC890           CALL    moveRG
908D 18BF             JR      putspr
              ; вправо/вниз
908F 3D       rd:     DEC     a
9090 2008             JR      nz,down
9092 CDC890           CALL    moveRG
9095 CDD690           CALL    moveDW
9098 18B4             JR      putspr
              ; вниз
909A 3D       down:   DEC     a
909B 2005             JR      nz,dl
909D CDD690           CALL    moveDW
90A0 18AC             JR      putspr
              ; вниз/влево
90A2 3D  dl:          DEC     a
90A3 2008             JR      nz,left
90A5 CDD690           CALL    moveDW
90A8 CDE490           CALL    moveLF
90AB 18A1             JR      putspr
              ; влево
90AD 3D       left:   DEC     a
90AE 2005             JR      nz,lu
90B0 CDE490           CALL    moveLF
90B3 1899             JR      putspr
              ; влево/вверх
90B5 CDE490   lu:     CALL    moveLF
90B8 CDBD90           CALL    moveUP
90BB 1891             JR      putspr
                               
              ; уменьшение ячейки Y на значение шага (в регистре C)
90BD 3A3191   moveUP: LD      a,(y)     ;A = (Y)
90C0 91               SUB     c         ;A = A - шаг
90C1 DCEF90           CALL    c,lda0    ;если < 0, то A=0
90C4 323191           LD      (y),a     ;сохраняем A в (Y)
90C7 C9               RET
90C8 3A3291   moveRG: LD      a,(x)     ;A = (X)
90CB 81               ADD     a,c       ;A = A + шаг
90CC FEF0             CP      240       ;пров: A<240 ?
90CE 3802             JR      c,$+4     ;если нет,
90D0 3EEF             LD      a,239     ;то A=239
90D2 323291           LD      (x),a     ;сохраняем А в (X)
90D5 C9               RET
90D6 3A3191   moveDW: LD      a,(y)     ;A = (Y)
90D9 81               ADD     a,c       ;A = A + шаг
90DA FEB0             CP      176       ;пров: A<176
90DC 3802             JR      c,$+4     ;если нет,
90DE 3EAF             LD      a,175     ;то A=175
90E0 323191           LD      (y),a     ;сохраняем A в (Y)
90E3 C9               RET
90E4 3A3291   moveLF: LD      a,(x)     ;A = (X)
90E7 91               SUB     c         ;A = A - шаг
90E8 DCEF90           CALL    c,lda0    ;если < 0, то A=0
90EB 323291           LD      (x),a     ;сохраняем A в (X)
90EE C9               RET
90EF AF       lda0:   XOR     a         ;A = 0
90F0 C9               RET
90F1 F7D7C5C4 input:  DEFB  'Введите номер джойстика (0-2): ',0
90F5 C9D4C520
90F9 CECFCDC5D220C4D6
9101 CFCAD3D4C9CBC120
9109 28302D32293A2000
              ;таблица шаблона номер NOSPR
9111 F0818181 sprdat: DEFB  240,129,129,129,129,1,0,28,0,1,129
9115 8101001C
9119 000181
911C 818180F0         DEFB  129,129,128,240,0,30,2,2,2,2,0,0
9120 001E020202020000
9128 70000002         DEFB    112,0,0,2,2,2,2,30,0
912C 0202021E00
              ; таблица атрибутов спрайта номер NOSPR
9131 58       y:      DEFB    88        ;координата Y
9132 80       x:      DEFB    128       ;координата X
9133 04               DEFB    nospr*4   ;номер шаблона спрайта
9134 0F       clrspr: DEFB    15        ;цвет спрайта
                      END

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

msx/assembler_programming_guide-fakhrutdinov_bocharov/13.txt · Последние изменения: 2020-05-16 21:00 — GreyWolf