|
Этюды - Хочу поддержать конкурс, предложенный Сергеем Колотовым и предлагаю свою программу печати символа во весь экран.
|
ЭТЮДЫ
ЭТЮДЫ
© Павел Старков, г. Красноярск
Хочу поддержать конкурс, предложенный Сергеем Колотовым из г. Шардинска (ZX РЕВЮ 95/4) и предлагаю в раздел "Этюды" свою программу печати символа во весь экран.
Для первого варианта перед вызовом процедуры в регистре A должен быть задан код символа, в D - атрибут "фона", а в E -атрибут "тона". Сама процедура занимает 60 байтов.
|
ORG |
40000 |
|
LD |
A, 127 |
|
LD |
DE,#0878 |
|
CALL |
PRINT |
|
RET |
|
|
LD |
L, A |
|
LD |
H, 0 |
|
ADD |
HL, HL |
|
ADD |
HL, HL |
|
ADD |
HL, HL |
|
LD |
BC, (23606) |
|
ADD |
HL, BC |
|
LD |
IX,22528 |
|
LD |
B, 8 |
|
LD |
C, 3 |
|
PUSH |
BC |
|
LD |
A, (HL) |
|
LD |
C,128 |
|
RLA |
|
|
LD |
B, D |
|
JR |
NC, PR4 |
|
LD |
B, E |
|
LD |
(IX+0),B |
|
LD |
(IX+1),B |
|
LD |
(IX+2),B |
|
LD |
(IX+3),B |
|
INC |
IX |
|
INC |
IX |
|
INC |
IX |
|
INC |
IX |
|
RR |
C |
|
JR |
NC,PR3 |
|
POP |
BC |
|
DEC |
C |
|
JR |
NZ,PR2 |
|
INC |
HL |
|
DJNZ |
PR1 |
|
RET |
|
Второй вариант немного проще и короче. Перед вызовом процедуры в A задаётся код символа, а в C - атрибут, которым будет напечатан символ. "Фон" всегда будет чёрным. Длина программы 47 байтов.
|
ORG |
40000 |
|
LD |
A, 127 |
|
LD |
C, #7B |
|
CALL |
PRINT |
|
RET |
|
|
LD |
L, A |
|
LD |
H, 0 |
|
ADD |
HL, HL |
|
ADD |
HL, HL |
|
ADD |
HL, HL |
|
LD |
DE, (23606) |
ЭТЮДЫ
ADD HL, DE
LD DE,22528
EX DE, HL
LD B, 8
PUSH BC
LD B, 3
PUSH BC
LD A, (DE)
LD B, 8
PUSH BC RLA
JR C,PR4
LD C, 0
LD B, 4
LD (HL), C
INC HL
DJNZ PR5
POP BC
DJNZ PR3
POP BC
DJNZ PR2
POP BC
INC DE
DJNZ PR1 RET
Далее. Процедура перемножения регистров B и C и перенесение результата в HL:
LD HL,0
L1 PUSH BC
LD B, 0
ADD HL, BC
POP BC
DJNZ L1 RET
Эта процедура не портит никаких регистров, кроме B, C, H и L и занимает 11 байт. Другой вариант дополнительно использует регистровую пару DE, но длина этой подпрограммы короче - 9 байтов:
LD HL,0
LD D, H
LD E, C
L1 ADD HL, DE
DJNZ L1 RET
© Евгений Куликаев, р.п. Муромцево, Омская область, 1996
Идея написания этих двух процедур возникла при разламывании игры "DEFENDERS OF THE CROWN". В ней после загрузки и появления меню, по бордюру пробегают три цветные полосы снизу вверх. Эта подпрограмма располагается с адреса 48520 и занимает 145 байт! Так усложнить программу может только "профессиональный программист". В моей программе можно менять число полос, их ширину и скорость движения при простом алгоритме работы. В строке 40 число подбирается опытным путём и зависит от количества полос и ваших требований. В строках 180-190 задаются цвета полос и их очередность. Цифра 8 в строке 200 является маркером конца. 1; (C) Hacker John, 1996
|
2; |
The |
Border Effect N1 |
|
10 |
|
ORG |
50000 |
|
20 |
|
ENT |
$ |
|
30 |
L3 |
LD |
HL,DATA |
|
40 |
L2 |
LD |
B,93 |
|
50 |
L1 |
LD |
A,(HL) |
|
60 |
|
OUT |
(#FE),A |
|
70 |
|
DJNZ |
L1 |
|
80 |
|
INC |
HL |
ЭТЮДЫ
|
90 |
LD |
A, (HL) |
|
100 |
CP |
8 |
|
110 |
JR |
NZ, L2 |
|
120 |
LD |
HL,DATA |
|
130 |
LD |
A, #7F |
|
140 |
IN |
A,(#FE) |
|
150 |
RRA |
|
|
160 |
JR |
C, L3 |
|
170 |
RET |
|
|
18 0 DATA |
DEFB |
6,5,4,3 |
|
190 |
DEFB |
7,3,4,5 |
|
200 |
DEFB |
8 |
;Маркер конца
Чтобы полосы стояли на одном месте, необходимо добавить строку 115 HALT. В строке 40 число подбирается экспериментально. Ширина полос зависит от их количества в строках 180-190.
Вторая программа создаёт на бордюре цветные движущиеся прямоугольники и позволяет получать интересные эффекты путём изменения числа в строке 40.
|
10; (C) |
Hacker John |
, 1996 |
|
20; The |
Border Effect N2 |
|
30 |
ORG |
50000 |
|
40 |
ENT |
$ |
|
50 L3 |
LD |
C,0 |
|
60 L2 |
LD |
B,22 6 |
|
70 L1 |
LD |
A,B |
|
80 |
OUT |
(#FE),A |
|
90 |
DJNZ |
L1 |
|
100 |
DEC |
C |
|
110 |
JR |
NZ, L2 |
|
120 |
LD |
A, #7F |
|
130 |
IN |
A,(#FE) |
|
140 |
RRA |
|
|
150 |
JR |
C, L3 |
|
160 |
RET |
|
У меня есть вопрос к читателям ZX РЕВЮ. Как в скрытой части INSULT MEGADEMO на бордюре получаются такие эффекты? (ИФК: читайте в следующем номере большую статью про MULTICOLOR)
© Дмитрий Булавин, Самара, 1995
Предложенная Дмитрием программа сжимает экран по горизонтали в 2 раза.
|
1; (C) |
Дмитрий Булавин, 19 95 |
|
2 |
ORG |
40000 |
|
3 |
ENT |
$ |
|
4 |
LD |
HL,16384 |
|
5 |
LD |
DE,16384 |
|
6 |
LD |
BC,6144 |
|
7 LOOP |
PUSH |
BC |
|
8 |
LD |
A, (DE) |
|
9 |
LD |
B, A |
|
10 |
RLCA |
|
|
11 |
OR |
B |
|
12 |
RLCA |
|
|
13 |
RL |
(HL) |
|
14 |
RLCA |
|
|
15 |
RLCA |
|
|
16 |
RL |
(HL) |
|
17 |
RLCA |
|
|
18 |
RLCA |
|
|
19 |
RL |
(HL) |
|
20 |
RLCA |
|
|
21 |
RLCA |
|
|
22 |
RL |
(HL) |
|
23 |
POP |
BC |
ZX-РЕВЮ 96/3 ЭТЮДЫ
|
24 |
DEC |
BC |
|
25 |
LD |
A, B |
|
26 |
OR |
C |
|
27 |
RET |
Z |
|
28 |
LD |
A, C |
|
29 |
AND |
31 |
|
30 |
CP |
0 |
|
31 |
JR |
NZ,NEXT |
|
32 |
LD |
H, D |
|
33 |
LD |
L, E |
|
34 NEXT |
INC |
DE |
|
35 |
BIT |
0, C |
|
36 |
JR |
NZ,LOOP |
|
37 |
INC |
HL |
|
38 |
JR |
LOOP |
Эта программа имеет один маленький недостаток. После сжатия изображения в правой части экрана остается часть несжатого изображения. Для исключения этого недостатка необходимо после строки 8 записать дополнительно операторы:
PUSH AF XOR A LD (DE),A
POP AF
Данные операторы стирают старое изображение с экрана.
Следующая программа также сжимает изображение, однако, на этот раз по вертикали.
|
10; |
(C) |
Дмитрий : |
Булавин, 1995 |
|
20 |
|
|
ORG |
41000 |
|
30 |
|
|
ENT |
$ |
|
40 |
|
|
LD |
HL,16384 |
|
50 |
|
|
LD |
DE,16384 |
|
60 |
|
|
LD |
C,96 |
|
70 NEXT_ |
L |
PUSH |
HL |
|
80 |
|
|
PUSH |
DE |
|
90 |
|
|
LD |
B, 32 |
|
100 |
LOOP |
LD |
A,(HL) |
|
110 |
|
|
INC |
H |
|
120 |
|
|
OR |
(HL) |
|
130 |
|
|
LD |
(DE) , A |
|
140 |
|
|
DEC |
H |
|
150 |
|
|
INC |
HL |
|
160 |
|
|
INC |
DE |
|
170 |
|
|
DJNZ |
LOOP |
|
180 |
|
|
POP |
DE |
|
190 |
|
|
POP |
HL |
|
200 |
|
|
INC |
D |
|
210 |
|
|
INC |
H |
|
220 |
|
|
INC |
H |
|
230 |
|
|
DEC |
C |
|
240 |
|
|
RET |
Z |
|
250 |
|
|
LD |
A, C |
|
260 |
|
|
AND |
3 |
|
270 |
|
|
CP |
0 |
|
280 |
|
|
JR |
NZ,NEXT L |
|
290 |
|
|
PUSH |
DE |
|
300 |
|
|
LD |
DE,63520 |
|
310 |
|
|
ADD |
HL, DE |
|
320 |
|
|
POP |
DE |
|
330 |
|
|
LD |
A, C |
|
340 |
|
|
AND |
7 |
|
350 |
|
|
CP |
0 |
|
360 |
|
|
JR |
NZ,NEXT L |
|
370 |
|
|
PUSH |
HL |
|
380 |
|
|
LD |
HL,63520 |
ЭТЮДЫ
|
390 |
ADD |
HL, DE |
|
|
400 |
EX |
DE, HL |
|
|
410 |
POP |
HL |
|
|
420 |
LD |
A, C |
|
|
430 |
AND |
31 |
|
|
440 |
CP |
0 |
|
|
450 |
JR |
NZ,NEXT |
L |
|
460 |
LD |
A, H |
|
|
470 |
ADD |
A, 7 |
|
|
480 |
LD |
H, A |
|
|
490 |
LD |
A, C |
|
|
500 |
CP |
32 |
|
|
510 |
JR |
NZ,NEXT |
L |
|
520 |
LD |
A, D |
|
|
530 |
ADD |
A, 7 |
|
|
540 |
LD |
D, A |
|
|
550 |
JR |
NEXT L |
|
Для стирания старого изображения в программу можно добавить следующие строки:
|
101 |
PUSH |
AF |
|
|
102 |
XOR |
A |
|
|
103 |
LD |
(HL) |
,A |
|
104 |
POP |
AF |
|
|
121 |
PUSH |
AF |
|
|
122 |
XOR |
A |
|
|
123 |
LD |
(HL) |
,A |
|
124 |
POP |
AF |
|
Следующие две программы посвящены системе TR-DOS. Впрочем, предоставим слово нашему корреспонденту:
© Гайнутдинов Рустам (GREEN VALLEY GROUP), Татарстан, 1995
В последнее время стало появляться много программ, которые контролируют наличие диска (например, Jemmini Commander). Меня это заинтересовало, и через некоторое время я "вытащил" данную процедуру. Вот её листинг:
1 ORG 30000
2 CALL 3435
3 LD A, 2
4 CALL 5633
5 CALL DISKPR
6 CALL TEST
7 LD (TT + 1) , A
8 AGAIN LD C,3
9 LD A, 1
10 CALL #3D13
11 CALL TEST
12 LD (SS+1),A
13 TT LD A,0
14 SS CP 0
15 JR NZ,NODISK
16 JR AGAIN
17 TEST LD A,195
18 LD (23746),A
19 LD HL,ERR
20 LD (23747),HL
21 LD IX,#2FC1
22 CALL DOS 2 3 LD A, 8
24 LD C,31
25 LD IX,#2A53
26 CALL DOS
27 LD (ERR+1),SP
28 LD DE,0
ZX-РЕВЮ 96/3 ЭТЮДЫ
|
29 |
|
LD |
IX,#2740 |
|
30 |
|
CALL |
DOS |
|
31 |
ERR |
LD |
SP,0 |
|
32 |
|
LD |
IX,#1FF3 |
|
33 |
|
CALL |
DOS |
|
34 |
|
LD |
IX,#1FEB |
|
35 |
|
CALL |
DOS |
|
36 |
|
LD |
IX,#2 FC1 |
|
37 |
|
CALL |
DOS |
|
38 |
|
LD |
A,201 |
|
39 |
|
LD |
(23746),A |
|
40 |
|
LD |
A,(23757) |
|
41 |
|
AND |
64 |
|
42 |
|
RET |
|
|
43 |
DOS |
PUSH |
IX |
|
44 |
|
JP |
#3D2F |
|
45 |
NODISK |
LD |
HL,TXT1 |
|
46 |
|
CALL |
PRINT |
|
47 |
|
RET |
|
|
48 |
DISKPR |
LD |
HL,TXT |
|
49 |
|
CALL |
PRINT |
|
50 |
|
RET |
|
|
51 |
PRINT |
LD |
A,(HL) |
|
52 |
|
CP |
255 |
|
53 |
|
RET |
Z |
|
54 |
|
RST |
16 |
|
55 |
|
INC |
HL |
|
56 |
|
JR |
PRINT |
|
57 |
TXT |
DEFB |
22,10,8 |
|
58 |
|
DEFM |
" DISK PRESENT " |
|
59 |
|
DEFB |
255 |
|
60 |
TXT1 |
DEFB |
22,10,8 |
|
61 |
|
DEFM |
"DISK NOT PRESENT" |
|
62 |
|
DEFB |
255 |
После того как наберёте программу:
1). Вставьте диск и запустите программу, появится сообщение "DISK PRESENT";
2). Выньте диск - появится сообщение "DISK NOT PRESENT" после чего произойдёт возврат в BASIC.
Теперь о том, как прочесть содержание регистра состояния. Идею я взял из книги А. Ларченко и Н. Родионова "ZX-Spectrum & TR-DOS для пользователей и программистов. (ИФК: Для более точного понимания принципа работы этой программы приведём выдержку из книги:
"Программа чтения регистра состояний микроконтроллера находится по адресу 16179 (16169). Однако прежде чем её использовать, необходимо выполнить ряд действий: в регистр дорожки микроконтроллера записать 0, в регистр сектора - #0A, а в регистр D микропроцессора записать 1. Считанный регистр состояний возвращается в регистре B микропроцессора. Ниже показан алгоритм считывания регистра состояний:
1. Записать 0 в регистр дорожки;
2. Записать #0A в регистр сектора;
3. Записать 1 в регистр D;
4. Вызвать подпрограмму по адресу 16179 (16169);
5. Взять из регистра B значение регистра состояний;
6. Восстановить в регистрах дорожки и сектора исходные значения.")
А теперь программа предложенная Рустамом:
10 ORG 50000
20 LD C,#3F
3 0 XOR A
40 LD IX,#2A53
50 CALL DOS
ZX-РЕВЮ 96/3 ЭТЮДЫ
|
60 |
LD |
C, #5F |
|
70 |
LD |
A, 10 |
|
80 |
LD |
IX,#2A53 |
|
90 |
CALL |
DOS |
|
100 |
LD |
D,1 |
|
110 |
LD |
IX,#3F33 |
|
120 |
CALL |
DOS |
|
130 |
LD |
A, B |
|
140 |
RET |
|
|
150 DOS |
PUSH |
IX |
|
160 |
JP |
#3D2 F |
После выполнения данной программы в регистре A будет значение регистра состояния.
© Куликов Вадим, Сарань, 1995
Эти процедуры обеспечивают сдвиг содержимого экранной области на один пиксель вверх (SRL_UP) или вниз (SRL_DN).
1; (C) Куликов Вадим, 19 95
|
10 |
ORG |
#A0 0 0 |
|
20 SRL UP |
LD |
DE,#4000 |
|
30 |
LD |
H, D |
|
40 |
LD |
L, E |
|
50 |
INC |
H |
|
60 |
LD |
BC,#2 0C0 |
|
70 UP S1 |
PUSH |
BC |
|
80 |
PUSH |
HL |
|
90 UP S2 |
LD |
A,(HL) |
|
100 |
LD |
(DE) , A |
|
110 |
INC |
HL |
|
120 |
INC |
DE |
|
130 |
DJNZ |
UP S2 |
|
140 |
POP |
DE |
|
150 |
LD |
H, D |
|
160 |
LD |
L, E |
|
170 |
INC |
H |
|
180 |
LD |
A, H |
|
190 |
AND |
#7 |
|
200 |
JR |
NZ,NXT U |
|
210 |
LD |
BC,#00E0 |
|
220 |
SBC |
HL, BC |
|
230 |
LD |
A, H |
|
240 |
AND |
#7 |
|
250 |
JR |
Z , NXT_U |
|
260 |
LD |
BC,#0700 |
|
270 |
SBC |
HL, BC |
|
280 NXT U |
POP |
BC |
|
290 |
DEC |
C |
|
300 |
RET |
Z |
|
310 |
JR |
UP S1 |
|
1; (C) Куликов Вадим, 1995 |
|
10 |
ORG |
#A0 0 0 |
|
20 |
LD |
DE,#57E0 |
|
30 |
LD |
H, D |
|
40 |
LD |
L, E |
|
50 |
DEC |
H |
|
60 |
LD |
BC,#2 0C0 |
|
7 0 DN S1 |
PUSH |
BC |
|
80 |
PUSH |
HL |
|
90 DN S2 |
LD |
A,(HL) |
|
100 |
LD |
(DE) , A |
|
110 |
INC |
HL |
|
120 |
INC |
DE |
|
130 |
DJNZ |
DN_S2 |
|
140 |
POP |
DE |
|
150 |
LD |
H, D |
|
160 |
LD |
L, E |
|
170 |
LD |
A, H |
|
180 |
DEC |
H |
|
190 |
AND |
#7 |
|
200 |
JR |
NZ,NXT D |
|
210 |
LD |
BC,#00E0 |
|
220 |
ADD |
HL, BC |
|
230 |
LD |
A, H |
|
240 |
AND |
#7 |
|
250 |
JR |
NZ,NXT D |
|
260 |
LD |
BC,#0700 |
|
270 |
ADD |
HL, BC |
|
280 NXT D |
POP |
BC |
|
290 |
DEC |
C |
|
300 |
RET |
Z |
|
310 |
JR |
DN_S1 |
В строке,20 в обеих процедурах, в регистровую пару DE загружается адрес верхнего левого или нижнего левого, соответственно, угла экрана. В строке 60 в BC загружается размер экранной области. Причем в регистр B загружается размер экрана по "Х",в знакоместах, а в регистр C, размер экрана по "Y" в пикселях. В строках 190,200 и 240,250 анализируется переход через треть экрана и через знакоместо соответственно.
© Жильцов Алексей, Углич, 1995
Хочу предложить несколько своих программ в раздел "Этюды". Это короткие процедуры вычисления произведения HL=B*C.
Mul_1 LD L, B
LD B, 8
XOR A RR L
L1 JR NC, L2
ADD A, C L2 RRA
RR L
DJNZ L1 LD H, A
RET
Длина 16 байт, максимальная длительность выполнения Тм=328 м.т.
Mul_2 LD L, B
LD B, 9
XOR A L1 RR L
DEC B
RET Z
JR NC,L2
ADD A, C L2 RRA
LD H, A
JR L1
Длина 15 байт, Тм=430 м.т. Короче предыдущей процедуры на 1 байт, зато медленнее на
25%.
|
Mul_3 |
LD |
L, 0 |
|
|
LD |
H, B |
|
|
LD |
B, L |
|
|
LD |
A, 8 |
|
L1 |
ADD |
HL, HL |
|
|
JR |
NC, L2 |
|
|
ADD |
HL, BC |
|
L2 |
DEC |
A |
NZ, L1
Длина 14 байт, Тм=387 м.т. Реализован другой алгоритм по сравнению с Mul_1 и Mul_2. И, наконец, самая короткая процедура, занимающая всего 11 байт:
|
Mul 4 |
XOR |
A |
|
|
SBC |
HL, HL |
|
|
LD |
D, A |
|
|
OR |
B |
|
|
RET |
Z |
|
|
LD |
E, C |
|
L1 |
ADD |
HL, DE |
|
|
DJNZ |
L1 |
|
|
RET |
|
Длина 11 байт, Тм=6161 м.т.
Очевидно, что последнюю процедуру не стоит использовать для активных математических вычислений вследствие её низкого быстродействия. В некоторых же случаях (при гарантии, что B <=8-10) скорость процедуры сравнима с тремя другими. При пониженных требованиях к быстродействию, эта процедура даже предпочтительней других по причине своей крайней примитивной простоты.
ИФК: Дмитрий Крапивин (Goblin Graphics) из г. Арзамас прислал свой вариант процедуры, увиденной им в "Boot Cobra".
|
ORG |
40000 |
|
ENT |
|
|
CALL |
FORM |
|
HALT |
|
|
XOR |
A |
|
OUT |
(254),A |
|
LD |
HL,#4800 |
|
CALL |
JUMP |
|
LD |
HL,#5000 |
|
CALL |
JUMP |
|
LD |
HL,#5800 |
|
CALL |
JUMP |
|
LD |
HL, TAB |
|
LD |
(T3+1),SP |
|
LD |
SP, TAB1 |
|
LD |
A, 16 |
|
POP |
DE |
|
LDI |
|
|
LDI |
|
|
POP |
DE |
|
LDI |
|
|
LDI |
|
|
DEC |
A |
|
JR |
NZ, M2 |
|
LD |
SP, 0 |
|
LD |
B, 8 |
|
LD |
HL, TAB |
|
LD |
A, (HL) |
|
OR |
A |
|
RRCA |
|
|
LD |
(HL),A |
|
INC |
HL |
|
LD |
(HL),A |
|
INC |
HL |
|
LD |
A,(HL) |
|
OR |
A |
|
RLCA |
|
|
LD |
(HL),A |
|
INC |
HL |
|
LD |
(HL),A |
|
INC |
HL |
|
LD |
A,(HL) |
|
OR |
A |
|
RRCA |
|
|
LD |
(HL),A |
|
INC |
HL |
|
LD |
(HL),A |
|
INC |
HL |
|
LD |
A, (HL) |
|
OR |
A |
|
RLCA |
|
|
LD |
(HL),A |
|
INC |
HL |
|
LD |
(HL),A |
|
INC |
HL |
|
DJNZ |
M1 |
|
LD |
A, 1 |
|
OUT |
(254) ,A |
|
LD |
A, 127 |
|
IN |
A, (254) |
|
RRA |
|
|
JR |
C, T1 |
|
RET |
|
|
LD |
( 0) , SP |
|
LD |
SP, HL |
|
JP |
25000 |
---FORMER---
|
LD |
IX,TAB1 |
|
LD |
HL,25000 |
|
LD |
B, 8 |
|
|
LD |
C,4 |
|
|
LD |
A, 2 |
|
|
LD |
(HL) |
, #D9 |
|
INC |
HL |
|
|
LD |
(HL) |
,1 |
|
INC |
HL |
|
|
LD |
(IX) |
,L |
|
INC |
IX |
|
|
LD |
(IX) |
,H |
|
INC |
IX |
|
|
LD |
(HL) |
,0 |
|
INC |
HL |
|
|
LD |
(HL) |
,0 |
|
INC |
HL |
|
|
LD |
(HL) |
,17 |
|
INC |
HL |
|
|
LD |
(IX) |
,L |
|
INC |
IX |
|
|
LD |
(IX) |
,H |
|
INC |
IX |
|
|
LD |
(HL) |
,0 |
|
INC |
HL |
|
|
LD |
(HL) |
,0 |
|
INC |
HL |
|
|
DEC |
A |
|
|
JR |
NZ,F11 |
|
LD |
A, 16 |
|
|
LD |
(HL) |
, #C5 |
|
INC |
HL |
|
|
LD |
(HL) |
, #D5 |
|
INC |
HL |
|
|
DEC |
A |
|
|
JR |
NZ, F2 |
ЭТЮДЫ
|
LD |
(HL),#D9 |
|
INC |
HL |
|
DEC |
C |
|
JR |
NZ, F1 |
|
DJNZ |
F0 |
|
LD |
(HL),#31 |
|
INC |
HL |
|
LD |
(JUMP+2),HL |
|
LD |
(HL),0 |
|
INC |
HL |
|
LD |
(HL),0 |
|
INC |
HL |
|
LD |
(HL),#C9 |
|
RET |
|
|
DEFW |
#8080,#0101 |
|
DEFW |
#0101,#8080 |
|
DEFW |
#4040,#0202 |
|
DEFW |
#0202,#4040 |
|
DEFW |
#2020,#0404 |
|
DEFW |
#0404,#2020 |
|
DEFW |
#1010,#0808 |
|
DEFW |
#0808,#1010 |
|
DEFW |
#0808,#1010 |
|
DEFW |
#1010,#0808 |
|
DEFW |
#0404,#2020 |
|
DEFW |
#2020,#0404 |
|
DEFW |
#0202,#4040 |
|
DEFW |
#4040,#0202 |
|
DEFW |
#0101,#8080 |
|
DEFW |
#8080,#0101 |
|
DEFB |
0 |
TAB1
Программа использует адреса 25000-26172. В программе отражено много интересных идей, таких как манипуляции со стеком для перестроения экрана, а также, сдвиг большей части экрана за одно прерывание.
КОРР: Теперь по поводу других программ. Есть такая версия ZX WORD-v2.5, в которой проверяется наличие кемпстона, но при его отсутствии ничего не делается. Для исправления этой ошибки делаем следующее:
•S определяем начальную дорожку/сектор
•S считываем со следующего сектора в память 45 секторов по адресу #6834
^ исправляем байты F3 C3 01 98 на FB C9 00 00
•S пишем, новый загрузчик в кодах и размещаем его в бейсик-строке
LD HL,#6834
LD DE,(#5CD4)
LD BC,#2D05
CALL #3D13 CALL #6834 LD HL,#003E
LD (#699F),HL
JP #9801
•f записываем новый бейсик и за ним кодовый файл (старт #6834, длина #2D00). ИФК: Дмитрий также прислал несколько доработок ассемблера "ZEUS".
1. Программа для создания команды Ь"МЕТКА (кавычка обязательна).
; L"LABEL ; REALIZATION ; BY GG
|
ORG |
#E3BC |
|
CALL |
40000 |
|
ORG |
40000 |
|
LD |
A, (#FD5 0) |
|
OR |
A |
|
JP |
Z,#E345 |
|
LD |
HL, (#FD0 0) |
|
DEC |
HL |
|
INC |
HL |
|
LD |
C, (HL) |
|
INC |
HL |
|
LD |
B,(HL) |
|
LD |
A, B |
|
AND |
C |
|
CP |
#FF |
|
JP |
Z, END |
|
LD |
DE,#FD5 0 |
|
INC |
HL |
|
LD |
A,(HL) |
|
OR |
A |
|
JR |
Z,NXTLIN |
|
LD |
A, (DE) |
|
CP |
(HL) |
|
JR |
NZ, MO |
|
PUSH |
HL |
|
INC |
HL |
|
INC |
DE |
|
LD |
A, (DE) |
|
OR |
A |
|
JR |
Z, YES |
|
LD |
A, (HL) |
|
OR |
A |
|
JR |
Z , AMI |
|
LD |
A, (DE) |
|
CP |
(HL) |
|
JR |
Z , M2 |
|
POP |
HL |
|
JR |
Z, GA |
|
LD |
A, (HL) |
|
INC |
HL |
|
EX |
AF,AF' |
|
LD |
A, (HL) |
|
EX |
AF,AF' |
|
POP |
HL |
|
CP |
#20 |
|
JP |
NZ, GA |
|
EX |
AF,AF' |
|
AND |
128 |
|
JP |
Z, GA |
|
LD |
H, B |
|
LD |
L, C |
|
LD |
(#FD19) , HL |
|
JP |
#E345 |
|
POP |
AF |
|
OR |
A |
|
RET |
|
КОРР: Программа располагается по адресу 40000, однако это не лучший адрес процедуры. В оригинальной версии ZEUS^ свободна область #F87A-#FCFF и #FF00-#FFFF. 2. Другой вид курсора.
|
ORG |
#F60D |
|
LD |
B, 8 |
|
LD |
(HL),#FF |
|
INC |
H |
|
DJNZ |
#F60F |
|
RET |
|
|
ORG |
#F71D |
|
JP |
#F60D |
|
ORG |
#F4F4 |
|
PUSH |
HL |
ЭТЮДЫ
|
PUSH |
AF |
|
LD |
B, 8 |
|
LD |
A, (HL) |
|
CPL |
|
|
LD |
(HL),A |
|
INC |
H |
|
DJNZ |
LOOP |
|
POP |
AF |
|
POP |
HL |
|
RET |
|
3. Вывод значений меток.
ORG #E49C CALL #E571 PUSH DE CALL #E59E POP DE
4. Ошибка со шрифтом.
ORG #F63C LD DE,#3C00
NOP
КОРР: В ZX РЕВЮ 95/5 приведена программа на бейсике, воспроизводящая мелодию из SoundTracker^ с voicemetr'ами (извините за жаргон). Так вот, я думаю, что мелодия будет подвывать из-за того, что бейсик работает медленно, и вызовы процедуры происходят реже, чем 50 раз в секунду. Поэтому хочу предложить другой вариант.
|
ORG |
23296 |
|
CALL |
51000 |
|
HALT |
|
|
CALL |
51006 |
|
CALL |
50000 |
|
XOR |
A |
|
IN |
A, (254) |
|
CPL |
|
|
AND |
31 |
|
JR |
Z , M1 |
|
JP |
51000 |
M1
Эта программа работает также до нажатия любой клавиши, но времени между прерываниями остается очень много.
|
|