[<>] ~~TOC wide~~ ====== Приложение 3. Листинг программы управления спрайтом ====== Ниже приводится листинг программы управления спрайтом при помощи джойстика. Если у Вас его нет, можно воспользоваться MSX-мышью. Для работы мыши в режиме джойстика при включении компьютера или устанавливая мышь в разьем, держите нажатой левую кнопку мыши. Программа оттранслирована ассемблером системы [[msx:duad:duad|]]. {{sprite.zip|Архив с готовыми файлами}} * ''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 ---- [<>] {{tag>MSX Book_apguidefb on_github}}