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

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


msx:assembler_programming_guide-fakhrutdinov_bocharov:12

Это старая версия документа!


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

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

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

               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) ; размер спрайта 16×16 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 '© ',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 ; взять текст '©

                                     ; группа 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.1589200866.txt.gz · Последние изменения: 2020-05-11 15:41 — GreyWolf