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