ZX-Ревю 1996 №3 1996 г.

Этюды - Хочу поддержать конкурс, предложенный Сергеем Колотовым и предлагаю свою программу печати символа во весь экран.


ЭТЮДЫ

ЭТЮДЫ

© Павел Старков, г. Красноярск

Хочу поддержать конкурс, предложенный Сергеем Колотовым из г. Шардинска (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

PRINT

PR1 PR2

PR3

PR4

Второй вариант немного проще и короче. Перед вызовом процедуры в A задаётся код символа, а в C - атрибут, которым будет напечатан символ. "Фон" всегда будет чёрным. Длина программы 47 байтов.

PRINT

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

PR1 PR2

PR3

PR4 PR5

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 раза.

;Опрос клавиши SPACE

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 байт, зато медленнее на

ZX-РЕВЮ 96/3 ЭТЮДЫ

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

JR RET

ЭТЮДЫ

Длина 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

T1

T2

M2

T3

M1

JUMP ;

FORM

F0 F11

F1 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

TAB

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

NXTLIN

GA MO

M2

AMI

YES

OK

END

КОРР: Программа располагается по адресу 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 раз в секунду. Поэтому хочу предложить другой вариант.

LOOP

ORG

23296

CALL

51000

HALT

CALL

51006

CALL

50000

XOR

A

IN

A, (254)

CPL

AND

31

JR

Z , M1

JP

51000

M1

Эта программа работает также до нажатия любой клавиши, но времени между прерываниями остается очень много.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Софт - описание новшеств и доработок музыкального редактора Pro Tracker 3.31
Поэма - про вампира.
Интервью - Интервью с Деннисом Ричи (Dennis M. Ritchie) создателем языка программирования "С".
Обратная связь - контакты редакции.
Интервью - интервью у Борисова Миши, известного как, BOGO или BARMALEY.

В этот день...   21 ноября