Командны Илья (ZX-MANIACS) из проявления экрана - картинка вы-
г.Калуга. езжает из-под нижней кромки.
КОРР* Предлагаю одну до- Самое любопытное в этой проце-
вольно интересную процедуру дуре то, что, изменив всего 4 стро-
60000
40000 $
HL.ADR DE, 16384 HL.DE
(DIFFER),HL (DIFF).HL B.192 HL,0
жать сверху. Но об этом позже. Вот листинг процедуры.
1 ; ZX-MANIACS'1996
2 ; SPECIAL FOR INFORCOM
ЭТЮДЫ |
|
|
t- 450 |
LD |
ВС,32 |
460 |
LDIR |
|
470 |
POP |
HL |
480 |
POP |
AF |
490 |
POP |
ВС |
500 |
DJNZ |
SCR1 |
510 |
RET |
|
520DIFFER |
DEFW |
0 |
530 DIFF |
DEFW |
0 |
10
20 addr 30 40 50 60 70 80 90
100 loop 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 260 270
280 scr
290
300
310
320
330
340
350
360 scr1
370
380
390
400
410
420
430
440
ORG
EQU
ENT
LD
LD
SBC
LD
LD
LD
LD
LD
(DIFFER),HL
PUSH ВС CALL SCR
HL.ADR DE.22496 ВС,32
HL,(DIFF) (DIFFER),HL
CALL SCR POP ВС DJNZ LOOP
HL.ADDR+6144 DE,22528 ВС,768
A,0 C,0
PUSH AF CALL 8880
AF
DE,(DIFFER) HL,DE ВС,48896
8880
DE,(DIFFER)
HL,DE
DE
PUSH ВС INC A PUSH AF PUSH HL CALL LD ADD POP
PUSH HL
Длина процедуры 107 байт.
В данной процедуре сначала выезжает монохромное изображение, а затем на него накладываются атрибуты. Чтобы все происходило наоборот (а такая потребность появляется часто) необходимо просто перенести строки 230-260 в начало процедуры.
Теперь, как обещал, расскажу о том, что нужно сделать, чтобы картинка выезжала не снизу, а сверху. Для этого, повторюсь, достаточно заменить всего 4 строки:
HL.ADDR+6112 DE, 16384 А,191 А
КОРР.: Хочу предложить вам еще одну процедуру проявления экрана: довольно медленная, но очень эффектная (картинка выезжает одновременно с двух сторон и постепенно сливается в одно целое). Подобный эффект можно наблюдать в игре HUNT FOR THE RED OCTOBER, но туда я не заглядывл, так что программа-полностью авторская.
1 (с) ZX-MANIACS'1996
2 SPECIAL FOR INFORCOM
60000
40000 $
HL.ADDR DE, 16384 HL,DE
70 |
LD |
(DIFFER),HL |
80 |
LD |
B,0 |
90 LOOP |
PUSH |
ВС |
100 |
LD |
A, 1 |
110 |
LD |
ВС,24826 |
120 SCRL1 |
PUSH |
ВС |
130 |
PUSH |
AF |
140 |
CALL |
8880 |
150 |
PUSH |
HL |
160 |
LD |
DE,(DIFFER) |
170 |
ADD |
HL,DE |
180 |
LD |
B,32 |
190 |
XOR |
A |
200 SCRL2 |
RL |
(HL) |
210 |
DEC |
HL |
220 |
DJNZ |
SCRL2 |
230 |
POP |
HL |
240 |
LD |
B,32 |
250 SCRL3 |
RL |
(HL) |
260 |
DEC |
HL |
270 |
DJNZ |
SCRL3 |
280 |
POP |
AF |
290 |
INC |
A |
300 |
INC |
A |
310 |
POP |
ВС |
320 |
DJNZ |
SCRL1 |
330 |
LD |
A,0 |
340 |
LD |
ВС,24577 |
350 SCRR1 |
PUSH |
ВС |
360 |
PUSH |
AF |
370 |
CALL |
8880 |
380 |
PUSH |
HL |
390 |
LD |
DE,(DIFFER) |
400 |
ADD |
HL.DE |
410 |
LD |
B,32 |
420 |
XOR |
A |
430 SCRR2 |
RR |
(HL) |
440 |
INC |
HL |
450 |
DJNZ |
SCRR2 |
460 |
POP |
HL |
470 |
LD |
B,32 |
480 SCRR3 |
RR |
(HL) |
490 |
INC |
HL |
500 |
DJNZ |
SCRR3 |
510 |
POP |
AF |
520 |
INC |
A |
530 |
INC |
A |
540 |
POP |
ВС |
550 |
DJNZ |
SCRR1 |
ЭТЮДЫ |
|
|
560 |
POP |
ВС |
570 |
DJNZ |
LOOP |
580 |
LD |
HL.ADDR + |
|
|
6144 |
590 |
LD |
DE,22528 |
600 |
LD |
BC.768 |
610 |
LDIR |
|
620 |
RET |
|
630 DIFFER |
DEFW |
0 |
Длина процедуры 107 байт.
Теперь расскажу немного об этих процедурах. Во-первых, у них есть один недостаток они окончательно и бесповоротно портят картинку, загруженную в ADDR. Не забывайте об этом, если захотите использовать их в своих программах. Во-вторых, надо все же немного рассказать, на каком принципе обе эти программки построении. В обеих процедурах активно используется подпрограмма ПЗУ с точкой входа 8880. Эта подпрограмма вычисляет адрес байта в видеобуфере по координатам точки, заданным в пикселях. Началом отсчета считается левый верхний угол экрана. На входе в подпрограмму в аккумулятор загружается вертикальная координата точки, а в регистр С горизонтальная. На выходе: в HL вычисленный адрес в видеобуфере, в А - величина смещения точки в пикселах от левого края вычисленного байта. Об этой подпрограмме я узнал из книги издательства "Питер" "Как написать игру на ассемблере" Советую всем приобрести эту книгу. Вместе с небезызвестной книгой "Инфоркома" она является отличным пособием и справочником для тех, кто программирует на ассемблере.
Вообще, подпрограмма 8880 довольно интересна и 'может с ус-пехом использоваться в процеду-pax, работающих с экраном. Так например, широкоизвестную процедуру "Штора" с помощью этой подпрограммы удалось сократить до 49 байтов: 1; (с) ZX-MANIACS'1996 2; SPECIAL FOR INFORCOM
10 |
org |
60000 |
20 |
ent |
$ |
30 |
ld |
hl.addr |
40 |
ld |
de, 16384 |
50 |
sbc |
hl.de |
60 |
ld |
b.h |
70 |
ld |
c,e |
80 |
ld |
a,191 |
90 loop |
push |
af |
100 |
push |
вс |
110 |
ld |
c,0 |
120 |
call |
8880 |
130 |
pop |
вс |
140 |
pop |
af |
150 |
push |
вс |
160 |
ld |
d,h |
170 |
ld |
e,l |
180 |
add |
hl.bc |
190 |
ld |
bc.32 |
200 |
ldir |
|
210 |
halt |
|
220 |
pop |
вс |
230 |
dec |
a |
240 |
cp |
255 |
250 |
jr |
nz.loop |
260 |
ld |
hl.addr + |
|
|
6144 |
270 |
ld |
de,22528 |
280 |
ld |
вс,768 |
290 |
ldir |
|
300 |
ret |
|
Вполне возможно, что можно сократить программу еще больше - я не очень старался сделать это, т.к моя основная задача была несколько иной показать преимущества подпрограммы 8880.
Также, очень даже хорошо сократилась (до 92 байтов) процедура Николая Губина (ZX РЕВЮ 96/1-2, стр. 77). Правда я сделал ее без IM2, и моя процедура отлично работает на компьютерах с ОЗУ 48К. Я надеюсь, что уважаемый автор не обвинит меня в плагиате, т.к. в наших программах общая только идея (да и то она не наша):
1; (с) ZX-MANIACS'1996 2; SPECIAL FOR INFORCOM
10 |
ORG |
60000 |
20 |
ENT |
$ |
30 |
LD |
A,95 |
40 |
LD |
(SCRUP).A |
50 |
INC |
A |
60 |
LD |
(SCRDN),A |
70 |
LD |
HL.ADDR |
80 |
LD |
DE, 16384 |
90 |
SBC |
HL,DE |
100 |
LD |
(DIFF).HL |
110 |
LD |
B,96 |
120 LOOP |
PUSH |
ВС |
130 |
LD |
A.(SCRUP) |
140 |
PUSH |
AF |
150 |
CALL |
8880 |
160 |
POP |
AF |
170 |
PUSH |
HL |
180 |
LD |
DE.(DIFF) |
190 |
ADD |
HL,DE |
200 |
POP |
DE |
210 |
LD |
ВС,32 |
220 |
LDIR |
|
230 |
DEC |
A |
240 |
LD |
(SCRUP).A |
250 |
LD |
A,(SCRDN) |
260 |
PUSH |
AF |
270 |
CALL |
8880 |
280 |
POP |
AF |
290 |
PUSH |
HL |
300 |
LD |
DE.(DIFF) |
310 |
ADD |
HL,DE |
320 |
POP |
DE |
330 |
LD |
ВС,32 |
340 |
LDIR |
|
350 |
IMC |
A |
360 |
LD |
(SCRDN),A |
370 |
HALT |
|
380 |
HALT |
|
390 |
POP |
ВС |
400 |
DJNJZ |
LOOP |
410
420 430 440 450
460 SCRUP 470 SCRDN 480 DIFF
LD
LD
LD
LDIR
RET
DEFB
DEFB
DEFW
HL.ADDR + 6144 DE.22528 BC.768
10 |
ORG |
64000 |
20 |
ENT |
$ |
30 |
LD |
HL. 16384 |
40 |
LD |
DE,(23296) |
50 |
LD |
B,32 |
60 МЗ |
PUSH |
ВС |
70 |
PUSH |
HL |
80 |
LD |
B,8 |
90 М2 |
PUSH |
ВС |
100 |
PUSH |
HL |
110 |
LD |
B,8 |
120 М1 |
LD |
A,(DE) |
130 |
LD |
(HL),A |
140 |
INC |
DE |
150 |
INC |
H |
160 |
DJNZ |
M1 |
170 |
POP |
HL |
180 |
LD |
ВС,32 |
190 |
ADD |
HL.BC |
200 |
POP |
ВС |
210 |
DJNZ |
M2 |
220 |
POP |
HL |
230 |
INC |
HL |
240 |
POP |
ВС |
250 |
DJNZ |
МЗ |
260 |
RET |
|
ЭТЮДЫ
Перед запуском процедуры надо занести в ячейки 23296/97 необходимый адрес.
(с) Колотов Сергей, SerzhSoft from Shadrinsk, Х.1996
КОРР: Добрый день! В ZX РЕВЮ 96/4-5 в ЭТЮДАХ на стр. 80 была опубликована процедура Прокопенко А.В. LOAD-MERGE (дисковый вариант). Задумка, конечно, неплохая, но во время набора и тестирования данной процедуры был обнаружен ряд досадных ошибок
1. При установке числа байт, по которому происходит поиск име>ни в каталоге вместо переменной #5D0 6 изменяется ячейка памяти по адресу #5С06. Но это ведь системная переменная KSTATE6, используемая при ОПРОСЕ КЛАВИШ!
2. Непонятно, зачем по адресу #5DA0 заносится 0. Эта ячейка памяти не является ни системной переменной, ни переменной TR DOS! Скорей всего в листинг закралась опечатка, причем, двойная и в ассемблерной команде, и в комментарии. На самом же деле, вместо #5DA0. должно быть #5D10 - адрес переменной TR DOS, которая обязательно обнуляется перед чтением В ASIC-файла (функция #0Е для точки входа в TR DOS #3D13).
3. При печати на экране сообщения O.K. после загрузки файла, выдается не номер строки автостарта (как в магнитофонном варианте), а номер последней выполненной BASIC-строки. Следовательно, строки LD HL,(#5C42): LD (#5C45),HL можно безболезненно из программы выкинуть.
Еще одна положительная особенность этой программы - она многоразовая.
Ну и на последок я отвлекусь от темы проявления экрана и предложу процедурку, которая поможет Вам в поиске символьного набора и шаблонов спрайтов. В верхней трети экрана она выводит столбцами по 8 знакомест содержимое памяти компьютера. За один раз она выводит 2048 байт. 1; (с) ZX-MANIACS' 1996 2; SPECIAL FOR INFORCOM
Номер строки автостарта узнавать довольно-таки громоздко, да и не очень-то нужно. Главное просто загрузить программу, не дав ей запуститься.
Новый вариант процедуры приведен ниже. Все указанные ошибки в нем исправлены, и вдобавок переделан алгоритм формирования имени файла. Вместо двух проходов (заполнение пробелами, перенос имени) реализован один. То есть вначале переносится имя, и только затем оставшаяся часть буфера заполняется пробелами.
Процедура релоцируема и занимает 64 байта. ld mrg
LD С,# 18 CALL #3D13 LD А, #09 LD (#5D06),A XOR A LD (#5CF9),A LD DE,(#5C5D) INC DE LD HL,#5CDD LD B,#08 LP_LM 1 INC DE
LD A.(DE) CP #0D JR NZ.GOJ.M1 LP LM2 LD (HL)," " INC HL DJNZ LP.LM2 JR GO_LM2 GO LM1 LD (HL),A INC HL DJNZ LP_LM 1 GO LM2 LD (HL),"B" LD C,#0A CALL #3D13 INC С JR Z,ER_LM1 XOR A
LD (#5D10),A LD C,#0E CALL #3D13
RST DB
ER_LM 1 RST DB