ZX Forum
#04
19 ноября 1997 |
|
Экранные эффекты - "сворачивание" экрана из Comando Tracer.
COMANDO TRACER Здесь оригинальный эффект за- ключается в интересном "сворачи- вании" экрана после загрузки. Лучше один раз увидеть, поэтому посмотрите на рисунки. Экран, сворачиваясь, не просто с краев сдвигается к середине, но при этом происходит еще плавное из- менение его формы от прямоу- гольника до ромба, пока, нако- нец, он не уменьшится настолько, что превратится в точку в центре экрана и исчезнет совсем. Вот листинг этой процедуры. 1420. E3A1 210058 LD HL,#5800 E3A4 110158 LD DE,#5801 E3A7 01FF02 LD BC,#02FF E3AA 3647 LD (HL),#47 E3AC EDB0 LDIR E3AE CDFCE3 CALL #E3FC E3B1 0600 LD B,#00 E3B3 C5 PUSH BC E3B4 DD2132E4 LD IX,#E432 E3B8 0600 LD B,#00 E3BA 210040 LD HL,#4000 E3BD DD7E01 LD A,(IX+1) E3C0 DD8600 ADD A,(IX+0) E3C3 DD7700 LD (IX+0),A E3C6 DCDBE3 CALL C,#E3DB E3C9 CD23E4 CALL #E423 E3CC DD23 INC IX E3CE DD23 INC IX E3D0 04 INC B E3D1 78 LD A,B E3D2 FEC0 CP #C0 E3D4 C2BDE3 JP NZ,#E3BD E3D7 C1 POP BC E3D8 10D9 DJNZ #E3B3 E3DA C9 RET ------------------------------ E3DB 1E0F LD E,#0F E3DD E5 PUSH HL E3DE CB3E SRL (HL) E3E0 2C INC L E3E1 CB1E RR (HL) E3E3 2C INC L E3E4 1D DEC E E3E5 C2E1E3 JP NZ,#E3E1 E3E8 E1 POP HL E3E9 E5 PUSH HL E3EA 7D LD A,L E3EB C61F ADD A,#1F E3ED 6F LD L,A E3EE 1E0F LD E,#0F E3F0 CB26 SLA (HL) E3F2 2D DEC L E3F3 CB16 RL (HL) E3F5 2D DEC L E3F6 1D DEC E E3F7 C2F3E3 JP NZ,#E3F3 E3FA E1 POP HL E3FB C9 RET ------------------------------ E3FC DD2132E4 LD IX,#E432 E400 0660 LD B,#60 E402 2EFF LD L,#FF E404 2600 LD H,#00 E406 DD7400 LD (IX+0),H E409 DD7501 LD (IX+1),L E40C 2D DEC L E40D DD23 INC IX E40F DD23 INC IX E411 10F3 DJNZ #E406 E413 0660 LD B,#60 E415 DD7400 LD (IX+0),H E418 DD7501 LD (IX+1),L E41B 2C INC L E41C DD23 INC IX E41E DD23 INC IX E420 10F3 DJNZ #E415 E422 C9 RET ------------------------------ E423 24 INC H E424 7C LD A,H E425 E607 AND #07 E427 C0 RET NZ E428 7D LD A,L E429 C620 ADD A,#20 E42B 6F LD L,A E42C D8 RET C E42D 7C LD A,H E42E D608 SUB #08 E430 67 LD H,A E431 C9 RET 2 Так как экран будет подвер- жен довольно сложному скроллин- гу, цветовые атрибуты будут вно- сить только дополнительную не- разбериху, поэтому сразу же пос- ле старта процедуры, в первых ее командах, происходит изменение в файле атрибутов: устанавливает- ся PAPER 0: INK 7: BRIGHT 1. По- сле этого начинается собственно скроллинг (с адреса E3AEH. При работе процедура исполь- зует для вспомогательных целей область памяти с адреса E432H (58418). Длина этой области 384 байта. Это надо учитывать при встраивании процедуры в свою программу. При желании эту слу- жебную область можно перенести в другое место, изменив ее адрес в командах по адресам E3B4H и E3FCH. Процедура не релоцируема, при изменении ее адреса можно поре- комендовать заменить все абсо- лютные условные переходы - отно- сительными (JP NZ,ADDR -> JR NZ,ADDR, при этом потребуется добавить еще по команде NOP, так как на каждой такой замене выс- вобождается по одному байту). Тогда останется не так уж много команд перехода с абсолютной ад- ресацией, их можно сосчитать по пальцам и легко изменить. Ска- занное относится и с процедурам, которые будут описаны ниже. Для получения блока кодов "сворачивания" экрана можно вос- пользоваться Бейсик-программой: 1 READ ram: CLEAR ram: READ f $: READ st: READ len: FOR a=st T O st+len-1: READ b: POKE a,b: NE XT a: SAVE f$CODE st,len 10 DATA 58272,"tr1",58273,145 100 DATA 033,000,088,017,001,088,001,255, 002,054,071,237,176,205,252,227, 006,000,197,221,033,050,228,006, 000,033,000,064,221,126,001,221 110 DATA 134,000,221,119,000,220,219,227, 205,035,228,221,035,221,035,004, 120,254,192,194,189,227,193,016, 217,201,030,015,229,203,062,044 120 DATA 203,030,044,029,194,225,227,225, 229,125,198,031,111,030,015,203, 038,045,203,022,045,029,194,243, 227,225,201,221,033,050,228,006 130 DATA 096,046,255,038,000,221,116,000, 221,117,001,045,221,035,221,035, 016,243,006,096,221,116,000,221, 117,001,044,221,035,221,035,016 140 DATA 243,201,036,124,230,007,192,125, 198,032,111,216,124,214,008,103, 201 Работу блока кодов наглядно продемонстрирует такая програм- ма: 10 BORDER 0: PAPER 0: INK 7: C LEAR 58272 20 LOAD "tr1"CODE 30 LOAD "tracer $"CODE 16384 40 BEEP .1,26: BEEP .1,20: PAU SE 0 50 RANDOMIZE USR 58273 Здесь в строке 30 загружает- ся картинка-заставка из игры CO- MANDO TRACER, но это может быть любая другая картинка. Следующим оригинальным момен- том в программе COMANDO TRACER является печать титульных тек- стовых сообщений. Буквы "соби- раются" из отдельных точек, "пи- кирующих" из пространства в пра- вой нижней части экрана. "Подле- тая" и "приземляясь" на задан- ное место, они образуют текст. Это даже не "бегущая", а какая- то "слетающаяся" строка. Процедура состоит из двух частей. Вызывающая программа - релоцируемая и может распола- гаться в любом удобном месте. В самой игре она находится по ад- ресу E15CH. 1420. E15C 260E LD H,#0E E15E 2E48 LD L,#48 E160 1110E3 LD DE,#E310 E163 CDA9E1 CALL #E1A9 ---------------------------- E166 261A LD H,#1A E168 2E58 LD L,#58 E16A 1120E3 LD DE,#E320 E16D CDA9E1 CALL #E1A9 ------------------------------ E170 2613 LD H,#13 E172 2E60 LD L,#60 E174 113CE3 LD DE,#E33C E177 CDA9E1 CALL #E1A9 ------------------------------ E17A 2614 LD H,#14 E17C 2E70 LD L,#70 E17E 1151E3 LD DE,#E351 E181 CDA9E1 CALL #E1A9 ------------------------------ E184 2614 LD H,#14 E186 2E78 LD L,#78 E188 1167E3 LD DE,#E367 E18B CDA9E1 CALL #E1A9 ------------------------------ E18E C9 RET 2 Вызывающая процедура для пе- чати пяти строчек текста, приве- денная выше, состоит из из пяти одинаковых частей. Прежде чем будет вызвана собственно проце- дура печати, должны быть заданы исходные параметры. В регистре H задается пара- метр, от которого зависит колон- ка печати (по горизонтали) Pos. Она равна Pos=(32-H)/2. Отсюда содержимое регистра H=32-2*Pos. В регистре L задается место печати текстового сообщения по вертикали, причем задается дис- танция от верхней пиксельной ли- нии печатаемой строки до верхне- го края экрана в пикселах. Обра- тите на это внимание: Вы можете печатать строки текста с дис- кретностью вертикальной позиции в 1 пиксел. В регистре DE задается адрес в памяти, с которого расположе- на сама строка текста. После этого вызывается соб- ственно процедура печати E1A9H. В конце вызывающей процедуры в зависимости от конкретных требо- ваний может быть либо RET, либо JP. Листинг процедуры печати: 1420. E1A9 3E20 LD A,#20 E1AB 94 SUB H E1AC CB27 SLA A E1AE CB27 SLA A E1B0 67 LD H,A E1B1 ED73E6E2 LD (#E2E6),SP E1B5 1A LD A,(DE) E1B6 32E2E2 LD (#E2E2),A E1B9 13 INC DE E1BA 1A LD A,(DE) E1BB 32E3E2 LD (#E2E3),A E1BE ED53E4E2 LD (#E2E4),DE E1C2 3E06 LD A,#06 E1C4 32DCE2 LD (#E2DC),A E1C7 3E0C LD A,#0C E1C9 32DDE2 LD (#E2DD),A E1CC 22DEE2 LD (#E2DE),HL E1CF 7C LD A,H E1D0 C608 ADD A,#08 E1D2 67 LD H,A E1D3 22E0E2 LD (#E2E0),HL E1D6 CD63E2 CALL #E263 E1D9 CD75E2 CALL #E275 E1DC FB EI E1DD 76 HALT E1DE CDFEE1 CALL #E1FE E1E1 3ADCE2 LD A,(#E2DC) E1E4 3D DEC A E1E5 32DCE2 LD (#E2DC),A E1E8 3ADDE2 LD A,(#E2DD) E1EB 3D DEC A E1EC 32DDE2 LD (#E2DD),A E1EF CDFEE1 CALL #E1FE E1F2 01F401 LD BC,#01F4 E1F5 0B DEC BC E1F6 78 LD A,B E1F7 B1 OR C E1F8 C2F5E1 JP NZ,#E1F5 E1FB C3DCE1 JP #E1DC ------------------------------ E1FE 3ADCE2 LD A,(#E2DC) E201 47 LD B,A E202 3AE2E2 LD A,(#E2E2) E205 2ADEE2 LD HL,(#E2DE) E208 CD7FE2 CALL #E27F E20B 3ADDE2 LD A,(#E2DD) E20E 47 LD B,A E20F 3AE3E2 LD A,(#E2E3) E212 2AE0E2 LD HL,(#E2E0) E215 CD7FE2 CALL #E27F E218 3ADCE2 LD A,(#E2DC) E21B 3D DEC A E21C CA45E2 JP Z,#E245 E21F 3ADDE2 LD A,(#E2DD) E222 3D DEC A E223 C0 RET NZ E224 ED5BE4E2 LD DE,(#E2E4) E228 13 INC DE E229 ED53E4E2 LD (#E2E4),DE E22D 1A LD A,(DE) E22E A7 AND A E22F FA70E2 JP M,#E270 E232 32E3E2 LD (#E2E3),A E235 3AE1E2 LD A,(#E2E1) E238 C610 ADD A,#10 E23A 32E1E2 LD (#E2E1),A E23D 3E0C LD A,#0C E23F 32DDE2 LD (#E2DD),A E242 C375E2 JP #E275 ------------------------------ E245 ED5BE4E2 LD DE,(#E2E4) E249 13 INC DE E24A ED53E4E2 LD (#E2E4),DE E24E 1A LD A,(DE) E24F A7 AND A E250 FA70E2 JP M,#E270 E253 32E2E2 LD (#E2E2),A E256 3ADFE2 LD A,(#E2DF) E259 C610 ADD A,#10 E25B 32DFE2 LD (#E2DF),A E25E 3E0C LD A,#0C E260 32DCE2 LD (#E2DC),A E263 3ADCE2 LD A,(#E2DC) E266 47 LD B,A E267 3AE2E2 LD A,(#E2E2) E26A 2ADEE2 LD HL,(#E2DE) E26D C37FE2 JP #E27F ------------------------------ E270 ED7BE6E2 LD SP,(#E2E6) E274 C9 RET ------------------------------ E275 3ADDE2 LD A,(#E2DD) E278 47 LD B,A E279 3AE3E2 LD A,(#E2E3) E27C 2AE0E2 LD HL,(#E2E0) E27F E5 PUSH HL E280 6F LD L,A E281 2600 LD H,#00 E283 29 ADD HL,HL E284 29 ADD HL,HL E285 29 ADD HL,HL E286 1158FB LD DE,#FB58 E289 19 ADD HL,DE E28A E5 PUSH HL E28B DDE1 POP IX E28D E1 POP HL E28E 1E08 LD E,#08 E290 7D LD A,L E291 80 ADD A,B E292 6F LD L,A E293 FEB8 CP #B8 E295 D0 RET NC E296 E5 PUSH HL E297 1607 LD D,#07 E299 7C LD A,H E29A 80 ADD A,B E29B 67 LD H,A E29C DABCE2 JP C,#E2BC E29F 7A LD A,D E2A0 CB27 SLA A E2A2 CB27 SLA A E2A4 CB27 SLA A E2A6 F646 OR #46 E2A8 32B1E2 LD (#E2B1),A E2AB C5 PUSH BC E2AC D5 PUSH DE E2AD E5 PUSH HL E2AE DDCB0046 BIT 0,(IX+0) E2B2 C4CAE2 CALL NZ,#E2CA E2B5 E1 POP HL E2B6 D1 POP DE E2B7 C1 POP BC E2B8 15 DEC D E2B9 F299E2 JP P,#E299 E2BC E1 POP HL E2BD DD23 INC IX E2BF 7D LD A,L E2C0 80 ADD A,B E2C1 6F LD L,A E2C2 FEB8 CP #B8 E2C4 D0 RET NC E2C5 1D DEC E E2C6 C296E2 JP NZ,#E296 E2C9 C9 RET ------------------------------ E2CA CDF0E2 CALL #E2F0 E2CD 5D LD E,L E2CE 54 LD D,H E2CF E607 AND #07 E2D1 6F LD L,A E2D2 2600 LD H,#00 E2D4 01E8E2 LD BC,#E2E8 E2D7 09 ADD HL,BC E2D8 1A LD A,(DE) E2D9 AE XOR (HL) E2DA 12 LD (DE),A E2DB C9 RET ------------------------------ E2DC ... системные ячейки E2EF ------------------------------ E2F0 C5 PUSH BC E2F1 7D LD A,L 1420.E2F2 CB3F SRL A E2F4 37 SCF E2F5 1F RRA E2F6 CB3F SRL A E2F8 AD XOR L E2F9 E6F8 AND #F8 E2FB AD XOR L E2FC 47 LD B,A E2FD 7D LD A,L E2FE E638 AND #38 E300 07 RLCA E301 07 RLCA E302 6F LD L,A E303 7C LD A,H E304 CB3F SRL A E306 CB3F SRL A E308 CB3F SRL A E30A B5 OR L E30B 6F LD L,A E30C 7C LD A,H E30D 60 LD H,B E30E C1 POP BC E30F C9 RET 2 В работе программа использует 20 байтов для служебных целей с адреса E2DCH по адрес E2EFH включительно. С адреса E310H располагается текст сообщений. Обратите внима- ние: каждая строка текста закан- чивается двумя символами: пробе- лом и кодом FFH. Пробел нужен для того, чтобы "в воздухе" не оставалось "пикирующих" точек. Обратите внимание на команду по адресу E286H. Здесь в ре- гистр DE заносится значение сис- темной переменной CHARS того символьного набора, которым Вы хотите напечатать текстовые со- общения. Он равен 64344. Сам символьный набор располагается с адреса 64600. Следует отметить, что применение утолщенного сти- лизованного символьного набора именно в этой программе произво- дит гораздо большее впечатление (так как процесс динамический), чем использование символьного набора ПЗУ. Вообще в игре "CO- MANDO TRACER" для печати задан- ных текстовых сообщений приме- няется фрагмент символьного на- бора - только цифры и заглавные буквы, а образ символа "копи- райт" закреплен за символом с кодом 40H - "@". Вам же может потребоваться весь символьный набор, поэтому текст сообщения в примере изменен с учетом этого обстоятельства. Для получения блока кодов "слетающейся строки" можно вос- пользоваться Бейсик-программой: 1 READ ram: CLEAR ram: READ f $: READ st: READ len: FOR a=st T O st+len-1: READ b: POKE a,b: NE XT a: SAVE f$CODE st,len 10 DATA 57691,"tr2",57692,545 100 DATA 038,014,046,072,017,016,227,205, 169,225,038,026,046,088,017,032, 227,205,169,225,038,019,046,096, 017,060,227,205,169,225,038,020 110 DATA 046,112,017,081,227,205,169,225, 038,020,046,120,017,103,227,205, 169,225,201,000,000,000,000,000, 000,000,000,000,000,000,000,000 120 DATA 000,000,000,000,000,000,000,000, 000,000,000,000,000,062,032,148, 203,039,203,039,103,237,115,230, 226,026,050,226,226,019,026,050 130 DATA 227,226,237,083,228,226,062,006, 050,220,226,062,012,050,221,226, 034,222,226,124,198,008,103,034, 224,226,205,099,226,205,117,226 140 DATA 251,118,205,254,225,058,220,226, 061,050,220,226,058,221,226,061, 050,221,226,205,254,225,001,244, 001,011,120,177,194,245,225,195 150 DATA 220,225,058,220,226,071,058,226, 226,042,222,226,205,127,226,058, 221,226,071,058,227,226,042,224, 226,205,127,226,058,220,226,061 160 DATA 202,069,226,058,221,226,061,192, 237,091,228,226,019,237,083,228, 226,026,167,250,112,226,050,227, 226,058,225,226,198,016,050,225 170 DATA 226,062,012,050,221,226,195,117, 226,237,091,228,226,019,237,083, 228,226,026,167,250,112,226,050, 226,226,058,223,226,198,016,050 180 DATA 223,226,062,012,050,220,226,058, 220,226,071,058,226,226,042,222, 226,195,127,226,237,123,230,226, 201,058,221,226,071,058,227,226 190 DATA 042,224,226,229,111,038,000,041, 041,041,017,088,251,025,229,221, 225,225,030,008,125,128,111,254, 184,208,229,022,007,124,128,103 200 DATA 218,188,226,122,203,039,203,039, 203,039,246,070,050,177,226,197, 213,229,221,203,000,070,196,202, 226,225,209,193,021,242,153,226 210 DATA 225,221,035,125,128,111,254,184, 208,029,194,150,226,201,205,240, 226,093,084,230,007,111,038,000, 001,232,226,009,026,174,018,201 220 DATA 006,001,120,208,120,200,032,056, 124,227,142,097,128,064,032,016, 008,004,002,001,197,125,203,063, 055,031,203,063,173,230,248,173 230 DATA 071,125,230,056,007,007,111,124, 203,063,203,063,203,063,181,111, 124,096,193,201,067,079,077,065, 078,068,079,032,084,082,065,067 240 DATA 069,082,032,255,069,083,067,082, 073,084,079,032,080,079,082,032, 082,073,067,065,082,068,079,032, 080,085,069,082,084,079,032,255 250 DATA 071,082,065,070,073,067,079,083, 058,082,065,085,076,032,076,079, 080,069,090,032,255,127,032,090, 069,085,083,032,083,079,070,084 260 DATA 087,065,082,069,032,049,057,056, 056,032,255,127,032,068,073,078, 065,077,073,067,032,083,079,070, 084,046,032,049,057,056,056,032, 255 Ниже приведена Бейсик-прог- рамма, демонстрирующая "слетаю- щуюся строку". В строке 20 заг- ружается "утолщенный" символьный набор. 10 BORDER 0: PAPER 0: INK 7: C LEAR 24999 20 LOAD "chr"CODE 64600 30 LOAD "tr2"CODE 40 RANDOMIZE USR 57692
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября