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

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


msx:assembler_programming_guide-fakhrutdinov_bocharov:12

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

Приложение 2. Листинг программы "Океан"

FIXME

Ниже приводится листинг программы, рисующей заставку с надписью «Океан». Программа оттранслирована ассемблером DUAD.

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

  • ocean.asm — исходный код программы на ассемблере
  • ocean.lst — листинг программы на ассемблере
  • ocean.obj — оттранслированная программа на ассемблере
                 TITLE  Ocean
                 ORG    9000h
9000 CDC793      CALL   ocean@
9003 C9          RET
;--------------------------------------------------------------
0010 = nosprz    EQU   16  ;номера спрайтов для заставки (и +1)
;-------------------------------------------------------------
  ; Подпрограмма записи данных в регистр VDP
  ; [b] - данные, [c] - номер регистра
9004 78   wrrvdp: LD      A,B       ; грузим данные
9005 D399         OUT     (99H),A   ; выкидываем в порт VDP
9007 79           LD      A,C       ; теперь номер регистра VDP
9008 F680         OR      80H       ; устанавливаем 7 бит в 1
900A D399         OUT     (99H),A   ; выкидываем в порт VDP
900C C9           RET               ; возвращаемся
;--------------------------------------------------------------
; данные-"кирпичики" для рисования картинок типа "Океан"
900D FFFFC0C0 block1: DB 0FFh,0FFh,0C0h,0C0h,0C0h,0C0h,080h,0FFh
9011 C0C080FF
9015 91919898         DB 91h, 91H, 98h, 98h, 98h, 98h, 96h, 61h
9019 98989661
901D FFFFFFFF block2: DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
9021 FFFFFFFF
9025 91918181         DB 91h, 91h, 81h, 81h, 81h, 81h, 61h, 61h
9029 81816161
902D FFFEFCFC block3: DB 0FFh,0FEh,0FCh,0FCh,0FCh,0FCh,0FFh,0FFh
9031 FCFCFFFF
9035 91968686       DB 91h, 96h, 86h, 86h, 86h, 86h, 61h, 61h
9039 86866161
;---------------------------------------------------------------
; Подпрограмма подготовки графического режима
; данные для "Шум моря"
903D                DEFS    6
9043 1EB71000       DEFB    30,183,16,0,0,0,90,14
9047 00005A0E
904B CD2894 draw:   CALL    EXchg
                               
; -------- шум моря
904E F7             RST     30h
904F 00             DEFB    0
9050 C000           DEFW    0c0h
9052 214A90         LD      HL,draw-1 ; адрес байта данных
                                      ; для 13 регистра PSG
9055 3E0D           LD      a,13      ; кол-во регистров PSG
9057 5E             LD      e,(HL)    ; загрузить данные
9058 F7             RST     30h
9059 00             DEFB    0
905A 9300           DEFW    93h       ; записать в регистр
905C 2B             DEC     HL        ; следующий байт данных
905D 3D             DEC     a         ; след.номер регистра PSG
905E F25690         JP      p,draw+1  ; если не -1, повт.
; -------- colOR 4=040
9061 011004         LD      BC,410H   ; записать в 16 регистр VDP
9064 CD0490         CALL    wrrvdp    ; номер регистра палитры 4
9067 3E04           LD      A,4       ; переделать палитру
9069 D39A           OUT     (9AH),A   ; номер 4
906B 3E00           LD      A,0
906D D39A           OUT     (9AH),A
; -------- colOR 15,1,1
906F 210F01         LD      HL,10Fh    ; загр. номера цветов
9072 22EAF3         LD      (0F3EAH),HL; записать в сист.яч.
9075 22E9F3         LD      (0F3E9h),HL
; -------- screen 2,2
9078 21E0F3         LD      HL,0F3E0h  ; адрес регистра 1 VDP
907B CBCE           SET     1,(HL)     ; размер спрайта 16x16
907D CB86           RES     0,(HL)     ; без увеличения
907F F7             RST     30h
9080 00             DEFB    0
9081 7200           DEFW    72H        ; screen 2
; -------- clear the sprites
9083 F7             RST     30h
9084 00             DEFB    0
9085 6900           DEFW    69H
; -------- Установка начальной позиции экрана
9087 011758         LD      BC,5817H   ; начальная строка экрана
                                       ; и регистр 23
908A CD0490         CALL    wrrvdp     ; записать в 23 регистр
908D C5             PUSH    BC         ; записать данные для
                                       ; движения экрана
908E CD2894         CALL    EXchg
; ---------------------
; Подпрограмма рисования изображения из кирпичиков (напр: Океан)
; [HL] - адрес картинки, [DE] - x,y, [BC] - размер Y*X
; ---------------------
9091 ED534994       LD      (const),DE ; сохр. координаты X,Y
9095 79             LD      a,c        ; сохр. размер по X
9096 324B94         LD      (const+2),a
9099 78     l03:    LD      A,B        ; загруз.размер по Y
909A 82             ADD     A,D        ; добавить коорд. Y
909B 57             LD      D,A        ; записать в коорд. Y
909C D5     l04:    PUSH    DE         ; сохранить координаты
909D 7E             LD      a,(HL)     ; загрузить очередной байт
                                       ; (блок) картинки
909E CD2894         CALL    EXchg
90A1 D1             POP     DE         ; считать координаты
90A2 210D90         LD      HL,block1  ; загрузить адрес 1 кирп.
90A5 FE31           CP      '1'        ; надо его рисовать ?
90A7 280E           JR      z,wrvdm    ; если да, рисуем
90A9 211D90         LD      HL,block2  ; загрузить адрес 2 кирп.
90AC FE32           CP      '2'        ; надо его рисовать ?
90AE 2807           JR      z,wrvdm    ; если да, рисуем
90B0 212D90         LD      HL,block3  ; загрузить адрес 2 кирп.
90B3 FE33           CP      '3'        ; надо его рисовать ?
90B5 2010           JR      nz,ewrvdm  ; если нет, переходим
90B7 D5     wrvdm:  PUSH    DE         ; сохраняем координаты
90B8 0608           LD      b,8        ; грузим длину кирпичика
90BA CD8092         CALL    ldirvm     ; переписываем в VRAM
                                       ; по адресу [DE]
90BD D1             POP     DE         ; считываем координаты
90BE D5             PUSH    DE         ; опять сохраняем
90BF 7A             LD      A,D        ; загр.ст.байт адр.VRAM
90C0 C620           ADD     a,32       ; делаем из адреса
                                       ; шаблонов адрес цветов
90C2 57             LD      D,A        ; записыв. в адрес VRAM
90C3 CD8092         CALL    ldirvm     ; перепис.в цвета данные
90C6 D1             POP     DE         ; считываем адрес VRAM
90C7 3E08   ewrvdm: LD      a,8        ; грузим длину блока
90C9 83             ADD     A,E        ; добавл. к младшему
                                       ; байту адреса VRAM
90CA 5F             LD      E,A
90CB D5             PUSH    DE         ; сохраняем адрес VRAM
90CC CD2894         CALL    EXchg
90CF D1             POP     DE         ; т.е. передаем его
                                       ; осн. группе регистров
90D0 23             INC     HL         ; следующий адрес рисунка
90D1 0D             DEC     c          ; уменьшаем размер по X
90D2 20C8           JR      nz,l04     ; если <> 0, то повт.рисов.
90D4 ED5B4994       LD      DE,(const) ; загр. исходн.координаты
90D8 3A4B94         LD      a,(const+2); востановить размер по X
90DB 4F             LD      C,A
90DC 10BB           DJNZ    l03        ; если не все, то повт.
90DE C1             POP     BC         ; иначе счит.рег.управления
                                       ; экраном 23
;--------------------------------------------------------------
; Движение экрана [b] - текущее состояние 23 регистра VDP
; [c] - равен 23 (номер регистра)
90DF CD0490 move:   CALL    wrrvdp     ; сдвинуть экран
90E2 113001         LD      DE,130H    ; загр. размер задержки
90E5 CD2294         CALL    time       ; задержка
90E8 04             INC     b          ; след. позиция экрана
90E9 20F4           JR      nz,move    ; если не 0, то повт.
90EB CD0490         CALL    wrrvdp     ; иначе посл.раз сдвин.
  ; ----------------------
  ; рисуем кораблик
  ; ----------------------
90EE 212291  ship:  LD      HL,shipdt  ;адрес блока данных
90F1 11D010         LD      DE,10D0h   ;координаты Y и X
90F4 010628         LD      BC,2806h   ; размеры XxY
90F7 C5             PUSH    BC         ; сохранить размеры
90F8 CD5A92         CALL    draw1      ; перебр. данные в шабл.
90FB C1             POP     BC         ; считать размеры
90FC 11D030         LD      DE,30D0h   ; адрес цветов
90FF 3E71           LD      a,71h      ; цвет изображения и фона
9101 CD6492         CALL    draw2      ; заполнить цвета
  ; ----------------------
  ; пишем спрайты # Nosprz
  ; ----------------------
9104 3E10   SETspr: LD      a,nosprz   ; узнаем адрес
9106 F7             RST     30h
9107 00             DEFB    0
9108 8400           DEFW    84h        ; шаблона номер
                                       ; Nosprz
910A 111292         LD      DE,sprz    ; грузим адрес данных
                                       ; для шаблонов
910D EB             EX      DE,HL
910E 0640           LD      b,64       ; и длину 2 шаблонов
9110 CD8092         CALL    ldirvm     ; переписываем в VRAM
  ; вывод спрайтов # Nosprz
9113 3E10           LD      a,nosprz   ; узнаем адрес
9115 F7             RST     30h
9116 00             DEFB    0
9117 8700           DEFW    87h        ; таблицы атрибутов
                                       ; плоскости Nosprz
9119 115292         LD      DE,xyspr   ; грузим адрес
                                       ; блока данных
911C EB             EX      DE,HL
911D 0608           LD      b,8        ; и длину блока
911F C38092         JP      ldirvm     ; переписываем в VRAM
  ;-----
9122 00000000 shipdt: DEFB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9126 00000000                   0,0,0,0,0,0,0,0,0,0
912A 0000000000000000
9132 00000000000000000000
913C 0102060C         DEFB    1,2,6,12,28,78H
9140 1C78
9142 00000000         DEFB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9146 00000000                   0,0,0,0,0,0,0,0,0
914A 0000000000000000
9152 000000000000000000
915B 01020408         DEFB    1,2,4,8,16,32,64,248,248,56,68H,
915F 102040F8                   68H,78H,216,232
9163 F838686878D8E8
916A 00000000         DEFB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
916E 00000000                   0
9172 000000000000000000
917B 01020408         DEFB    1,2,4,8,16,48,64,81H,1,3,3,3,3,
917F 10304081                   7,7,232,98H,88H,232,98H,8,252,4
9183 01030303030707E8
918B 9888E89808FC04
9192 00000000         DEFB    0,0,0,0,0,0,0,0,0
9196 0000000000
919B 01010206         DEFB    1,1,2,6,15,0,0,80H,80H,0,0,0,0,
919F 0F000080                   192,48,6,7,7,7,7,7,7,7
91A3 8000000000C03006
91AB 07070707070707
91B2 7C82027E         DEFB    7CH,82H,2,7EH,81H,63,68,87H
91B6 813F4487
91BA 000000000000     DEFB    0,0,0,0,0,0
91C0 80C00000         DEFB    80H,192,0,0,0,0,1,0,0,0,12,2,1,
91C4 00000100                   0,255,15,2,1,0,0,0,80H,255,255,0
91C8 00000C020100FF0F
91D0 020100000080FFFF00
91D9 007C7830         DEFB    0,7CH,78H,48,32,255,255,1,242,0,
91DD 20FFFF01                   0,0,0,224,80H
91E1 F200000000E080
91E8 00000000         DEFB    0,0,0,0,0,0,0,0,0,0
91EC 000000000000
91F2 01061860         DEFB    1,6,24,96,0,0,0,0,241,16,27H
91F6 00000000F11027
91FD 0000000000       DEFB    0,0,0,0,0
9202 0C81F008         DEFB    12,81H,240,8,7,0,0,0,0,0,248
9206 070000000000F8
920D 0000000000       DEFB    0,0,0,0,0
  ;-----
  ; данные для спрайтов ДВГУ и МАТФАК
9212 89DAAA8B sprz:   DEFB    137,218,170,139,138,0,127,255,
9216 8A007FFF                   193,192,0,113,170,170,115,34
921A C1C00071AAAA7322
9222 9F4444C4         DEFB    159,68,68,196,68,0,3,131,255,
9226 44000383FFFE0091         254,0,145,82,92,210,81
922E 525CD251
9232 36555556         DEFB    54,85,85,86,85,85,85,246,0,0,0,
9236 555555F6                   48,121,255,207,134
923A 0000003079FFCF86
9242 75554545         DEFB    117,85,69,69,67,65,69,66,0,0,0,
9246 43414542                   195,231,255,60,24
924A 000000C3E7FF3C18
  ;-----
  ; координаты xy спрайтов # Nosprz
9252 6010400E xyspr:DEFB    60h,10h,nosprz*4,14,60h,0E0h,
9256 60E0440E                       (nosprz+1)*4,14
  ;-----------------------------------------------
  ; заполнение VRAM данными
  ; [HL] - откуда, [DE] - куда, [BC] - х,y
925A D5  draw1:     PUSH    DE         ; сохранить адрес VRAM
925B CD8092         CALL    ldirvm     ; переписать блок
925E D1             POP     DE         ; считать адрес VRAM
925F 14             INC     D          ; следующая строка
9260 0D             DEC     C          ; если не все,
9261 20F7           JR      NZ,draw1   ; то повторить
9263 C9             RET                ; иначе возврат
  ;-----------------------------------------------
  ; заполнение VRAM const
  ; [DE] - куда, [BC] - x,y, [a] - const
9264 D5     draw2:  PUSH    DE         ; сохранить адрес
9265 C5             PUSH    BC         ; VRAM и размеры
9266 CD7292         CALL    fillvm     ; заполнить строку
9269 C1             POP     BC         ; считать размеры
926A D1             POP     DE         ; и адрес VRAM
926B 14             INC     D          ; следующая строка
926C 0D             DEC     C          ; размер Y=Y-1
926D 20F5           JR      NZ,draw2   ; если не все,то
926F C9             RET                ; повторить
  ;-----------------------------------------------
  ; заполнение VRAM 255
9270 3EFF fvmFF:    LD      A,255
  ;-----------------------------------------------
  ; заполнение VRAM const [a], len [b], adr [DE]
9272 CD7992 fillvm: CALL    wrvram     ; записать байт во VRAM
9275 13             INC     DE
9276 10FA           DJNZ    $-4        ; повторить, если надо
9278 C9             RET
  ;-----------------------------------------------
  ; запись [a] во VRAM [DE] - adr
9279 EB     wrvram: EX      DE,HL
927A F7             RST     30h
927B 00             DEFB    0
927C 4D00           DEFW    4Dh        ;записать в VRAM
927E EB             EX      DE,HL      ; (для msx-2)
927F C9             RET
     ;-----------------------------------------------
     ; пересылка RAM в VRAM [HL] source, [DE] DEst, [b] length
9280 C5     ldirvm: PUSH    BC         ; сохранить регистровую пару
9281 7B             LD      A,E        ; выбросить младший байт
9282 D399           OUT     (99h),a    ; адреса VRAM
9284 7A             LD      A,D        ; затем старший байт
9285 F640           OR      40h        ; выставить 6 бит в 1
9287 D399           OUT     (99h),a
9289 0E98           LD      c,98h      ; загрузить номер порта VDP
928B EDB3           OTIR               ; вывести блок
928D C1             POP     BC         ; считать регистровую пару
928E C9             RET
         ;===============================================
  ; Подпрограмма 'ОКЕАН'
928F 20313232 okean:  DEFB  ' 1223  13  13 1223 13  13 13  13'
9293 33202031
9297 3320203133203132
929F 3233203133202031
92A7 3320313320203133
92AF 31332020         DEFB  '13  13 13 13  13   13  13 13  13'
92B3 31332031
92B7 3320313320203133
92BF 2020203133202031
92C7 3320313320203133
92CF 31332020         DEFB  '13  13 1223   13   122223 13  13'
92D3 31332031
92D7 3232332020203133
92DF 2020203132323232
92E7 3320313320203133
92EF 31332020         DEFB  '13  13 123    123  13  13 122223'
92F3 31332031
92F7 3233202020203132
92FF 3320203133202031
9307 3320313232323233
930F 31332020         DEFB  '13  13 1223   13   13  13 13  13'
9313 31332031
9317 3232332020203133
931F 2020203133202031
9327 3320313320203133
932F 31332020         DEFB  '13  13 13 13  13    1223  13  13'
9333 31332031
9337 3320313320203133
933F 2020202031323233
9347 2020313320203133
934F 20313232         DEFB  ' 1223  13  13 1223   13   13  13'
9353 33202031
9357 3320203133203132
935F 3233202020313320
9367 2020313320203133
  ;------
936F F7D3C5D3 pbyok:  DEFB    247,211,197,211,207,192,218,206,
9373 CFC0DACE                   217,202,32,208,201,207,206
9377 D9CA20D0
937B C9CFCE
937E C5D2D3CB         DEFB    197,210,211,203,201,202,32,204,
9382 C9CA20CC                   193,199,197,210,216,32,227,235
9386 C1C7C5D2D820E3EB
938E 20F7ECEB         DEFB    32,247,236,235,243,237,0
9392 F3ED00
9395 28632920 cfib:   DEFB    '(c) ',199,210,213,208,208,193,
9399 C7D2D5D0                   ' F&B, ',247,240,236,' "'
939D D0C12046
93A1 26422C20F7F0EC2022
93AA EFCBC5C1         DEFB    239,203,197,193,206,'", 1988',0
93AE CE222C203139383800
93B7 E2D5C8D4 emar:   DEFB    226,213,200,212,193,32,229,205,
93BB C120E5CD                   193,210,0
93BF C1D200
93C2 3139383800 year: DEFB    '1988',0
  ;---------------------------------------------
  ocean@:   ; Рисуем изображение
93C7 218F92         LD      HL,okean   ; адрес данных
93CA 012007         LD      BC,0720h   ; размер YxX
93CD 110002         LD      DE,0200h   ; начальный адрес VRAM
93D0 CD4B90         CALL    draw       ; рисуем кирпичиками
93D3 3E0F           LD      a,0Fh      ; цветом 15
93D5 116F93         LD      DE,pbyOK   ; надпись 'Всесоюзный ...'
93D8 210812         LD      HL,1208h   ; с таких координат
93DB CD0994         CALL    print2
93DE 21A261         LD      HL,61A2h   ; точно также написать
93E1 11B793         LD      DE,emar    ; 'Бухта Емар'
93E4 3E0F           LD      A,0Fh
93E6 CD0994         CALL    print2
93E9 21AC73         LD      HL,73ACh
93EC 11C293         LD      DE,year    ; и '1988'
93EF 3E0F           LD      A,0Fh
93F1 CD0994         CALL    print2
93F4 111837         LD      DE,3718h   ; зарисовать строку с
                                       ; этими координатами
93F7 06D0           LD      B,0D0h     ; такой длины
93F9 3EE4           LD      A,0E4h     ; цветом 4 (фон)
93FB CD7292         CALL    fillvm
93FE 3E0E           LD      A,14       ; установить цвет 14
9400 21B81C         LD      HL,1CB8h   ; и такие координаты
9403 119593         LD      DE,cfib    ; взять текст '(c)
                                       ; группа F&B...'
9406 C30994         JP      print2     ; и вывести его на
                                       ; экран
  ;-----------------------------------------------
  ; Подпрограмма плотной печати в режиме SCREEN 2
  ; [HL] - x,y, [DE] - адрес надписи, [a] - цвет
9409 32E9F3  print2:ld      (0F3E9h),a ; устанавливаем цвет [a]
940C D5             PUSH    DE         ; сохраняем адрес текста
940D EB             EX      DE,HL      ; заносим в DE координаты
940E 21B9FC         LD      HL,0FCB9h  ; загружаем адрес системных
                                       ; координат
9411 73             LD      (HL),E     ; записываем координату Y
9412 2B             DEC     HL         ; получаем адрес системной
                                       ; координаты X
9413 2B             DEC     HL
9414 72             LD      (HL),D     ; записываем координату X
9415 D1             POP     DE         ; считываем адрес текста
9416 1A      l08:   LD      A,(DE)     ; грузим очередной байт
                                       ; текста
9417 B7             OR      A          ; проверяем: последний ?
9418 C8             RET     Z          ; если да, то возврат
9419 F7             RST     30h
941A 00             DEFB    0
941B 8D00           DEFW    8Dh        ; иначе печатаем его
941D 35             DEC     (HL)       ; приращение X = 6,а не 8
                                       ; (как в системе)
941E 35             DEC     (HL)
941F 13             INC     DE         ; следующий символ
9420 18F4           JR      l08        ; повторить
  ;-----------------------------------------------
  ;   Подпрограмма задержки
  ; вход на TIME+3, [DE] - кол-во циклов
  ; вход на TIME, кол-во циклов = FFFF
9422 1B     time:   DEC     DE         ; уменьшить,
9423 7A             LD      A,D        ; если DE <> 0
9424 B3             OR      E
9425 20FB           JR      NZ,time    ; то повторить
9427 C9             RET                ; иначе возврат
  ;-----------------------------------------------
9428 F5     EXchg:  PUSH    AF
9429 E5             PUSH    HL
942A 214D94         LD      HL,EXxd
942D 7E             LD      A,(HL)
942E 70             LD      (HL),B
942F 47             LD      B,A
9430 23             INC     HL
9431 7E             LD      A,(HL)
9432 71             LD      (HL),C
9433 4F             LD      C,A
9434 23             INC     HL
9435 7E             LD      A,(HL)
9436 72             LD      (HL),D
9437 57             LD      D,A
9438 23             INC     HL
9439 7E             LD      A,(HL)
943A 73             LD      (HL),E
943B 5F             LD      E,A
943C E1             POP     HL
943D D5             PUSH    DE
943E ED5B5194       LD      DE,(EXxd+4)
9442 225194         LD      (EXxd+4),HL
9445 EB             EX      DE,HL
9446 D1             POP     DE
9447 F1             POP     AF
9448 C9             RET
  ;-----------------------------------------------
9449        const:  DEFS    4
944D        EXxd:   DEFS    6
                    END

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

msx/assembler_programming_guide-fakhrutdinov_bocharov/12.txt · Последние изменения: 2020-11-04 13:25 — GreyWolf