ZX-Ревю 1996 №1-2 1996 г.

Этюды - предлагаю вам программы, написанные лично мной.


ЭТЮДЫ

© Вадим Бодров, г. Уфа, 1995.

Предлагаю Вам программы, написанные лично мной.

1). Программа BLINK создает на экране симпатичные помехи. Такой эффект я увидел на "писишке" ещё несколько лет назад.

EFFECTS

Bodrov (C) 1995

1 ; BLINC

2 ;Vadim

3 ;

4

ORG

50000

5

ENT

$

6

LD

B, HMP

7 LOOP

CALL

RND

8

LD

(B FAD) ,HL

9

CALL

BLINK

10

LD

A, B

11

SLA

A

12

DEC

A

13

DEC

A

14

LD

D, 0

15

LD

E, A

16

LD

HL,BUFF

17

ADC

HL, DE

18

LD

DE,BFAD

19

EX

DE, HL

20

CALL

CHANG

21

DJNZ

LOOP

22

LD

B, HMP

23 LOOP2

LD

A,B

24

SLA

A

25

DEC

A

26

DEC

A

27

LD

D, 0

28

LD

E, A

29

LD

HL,BUFF

30

ADC

HL, DE

31

LD

DE,BFAD

32

CALL

CHANG

33

CALL

BLINK

34

DJNZ

LOOP2

35

RET

36 BLINK

LD

HL,(BFAD)

37

LD

A, #FF

38

XOR

(HL)

39

LD

(HL),A

40

RET

41 CHANG

LD

A,(HL)

42

INC

HL

43

EX

DE, HL

44

LD

(HL),A

45

INC

HL

46

EX

DE, HL

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

47

LD

A,(HL)

48

EX

DE, HL

49

LD

(HL),A

50

RET

51

HMP

EQU

15

52

RAND

DEFW

0

53

BUFF

DEFS

HMP

54

DEFS

HMP

55

BFAD

DEFW

0

56

RND

LD

HL,(RAND)

57

LD

A,(HL)

58

INC

HL

59

AND

127

60

OR

64

61

CP

88

62

JR

C, PASS

63

AND

#DF

64

CP

88

65

JR

C, PASS

66

AND

#CF

67

PASS

LD

D,A

68

LD

E,(HL)

69

I NC

HL

70

LD

A, H

71

CP

63

72

JR

NZ, PASS2

73

LD

HL, 0

74

PASS2

LD

(RAND),HL

75

EX

DE, HL

76

RET

Длина блока кодов 149 байт:

C350

06

0F

CD

C0

C3

22

BE

C3

1B

C358

CD

8C

C3

78

CB

27

3D

3D

1B

C360

16

00

5F

21

A0

C3

ED

5A

63

C368

11

BE

C3

EB

CD

94

C3

10

DC

C370

E1

06

0F

78

CB

27

3D

3D

0D

C378

16

00

5F

21

A0

C3

ED

5A

7B

C380

11

BE

C3

CD

94

C3

CD

8C

52

C388

C3

10

E8

C9

2A

BE

C3

3E

B8

C390

FF

AE

77

C9

7E

23

EB

77

43

C398

23

EB

7E

EB

77

C9

00

00

12

C3A0

00

00

00

00

00

00

00

00

63

C3A8

00

00

00

00

00

00

00

00

6B

C3B0

00

00

00

00

00

00

00

00

73

C3B8

00

00

00

00

00

00

00

00

7B

C3C0

2A

9E

C3

7E

23

E6

7F

F6

0A

C3C8

40

FE

58

38

08

E6

DF

FE

24

C3D0

58

38

02

E6

CF

57

5E

23

B2

C3D8

7C

FE

3F

20

03

21

00

00

98

C3E0

22

9E

C3

EB

C9

00

00

00

DA

ЭТЮДЫ

Количество линий, одновременно отображаемых на экране можно изменять. Для этого в строке 51 нужно подставить вместо 15 свое значение. Учтите, что при этом буфер координат, а следовательно и сама программа увеличится на N*2 байт.

Для демонстрации эффекта можно воспользоваться БЕИСИК-программой: 10 BORDER 0: PAPER 0: INK 7: CLEAR 49999: RANDOMIZE USR 15619: REM:

LOAD "blink" CODE 20 RANDOMIZE USR 50000: GO TO 20

2). Программа ATTR SHOW!!! создает в заданном окне экрана интересные эффекты с атрибутами. При её циклическом вызове (для этого удобно использовать прерывания второго рода) в окне с координатами (COORDS) и размерами (DX и DY) изображение будет переливаться всеми цветами радуги. Фон же в этом окне будет постоянно чёрным. Вам ничего не мешает сделать его белым или, например, синим. Для этого просто нужно изменить параметры MASK OFF и MASK ON в строках 38-39.

1 ;ATTR SHOW!!!

2 ;VADIM BODROV (C) 1995

OFF ON

3 ;

4

ORG

50000

5

ENT

$

6

LD

DE,(COORDS)

7 PASS

LD

A,(DY)

8

LD

B, A

9 LOOP1

PUSH

BC

10

LD

A, (DX)

11

LD

B, A

12

PUSH

DE

13 LOOP2

PUSH

BC

14

LD

A, E

15

AND

#18

16

RRCA

17

RRCA

18

RRCA

19

OR

#58

20

LD

H, A

21

LD

A, E

22

AND

#07

23

RRCA

24

RRCA

25

RRCA

26

ADD

A, D

27

LD

L, A

28

PUSH

HL

29

LD

HL,(RANDOM)

30

I NC

HL

31

LD

A, 64

32

CP

H

33

JR

NZ,PASS1

34

LD

H, 0

35 PASS1

LD

(RANDOM),HL

36

LD

A,(HL)

37

POP

HL

38

AND

#47

39

OR

#40

; MAS K ; MAS K

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

40

LD

(HL),A

41

I NC

E

42

POP

BC

43

DJNZ

LOOP2

44

POP

DE

45

POP

BC

46

I NC

E

47

DJNZ

LOOP1

48

EI

49

RET

50

DY

DEFB

10

51

DX

DEFB

20

52

COORDS

DEFW

#0607

53

RANDOM

DEFW

#0000

Длина блока кодов 72 байта:

C350

F3

ED

5B

94

C3

3A

92

C3

34

C358

47

C5

3A

93

C3

47

D5

C5

98

C360

7B

E6

18

0F

0F

0F

F6

58

17

C368

67

7B

E6

07

0F

0F

0F

82

A9

C370

6F

E5

2A

96

C3

23

3E

40

AB

C378

BC

20

02

26

00

22

96

C3

BA

C380

7E

E1

E6

47

F6

40

77

14

90

C388

C1

10

D4

D1

C1

1C

10

C9

77

C390

FB

C9

0A

14

07

06

00

00

42

Для демонстрации эффекта можно воспользоваться БЕЙСИК-программой (в строке 15 загружается любая картинка):

10 BORDER 0: PAPER 0: INK 7: CLEAR 49999: RANDOMIZE USR 15619: REM :

LOAD "attrshow" CODE 15 RANDOMIZE USR 15619: REM: LOAD "screen $"CODE 16384 20 RANDOMIZE USR 50000: GO TO 20

3) Программа FONT CREAT создает стилизованный символьный набор, создающий впечатление "объёмности" букв.

1 ;FONTCREAT

2 ;Vadim Bodrov (С) 1995

3 ;

4 FONT

EQU

51000

5

ORG

50000

6

ENT

$

7

LD

HL,1561

8

LD

DE, FONT

9

LD

BC,768

10

LDIR

11

LD

HL,FONT

12

LD

BC,768

13 LOOP

LD

A,(HL)

14

LD

D, A

15

SRL

A

16

OR

(HL)

17

I NC

HL

18

OR

(HL)

19

XOR

D

20

DEC

HL

ЭТЮДЫ

21

LD

(HL),A

22

INC

HL

23

DEC

BC

24

LD

A, B

25

OR

C

26

JR

NZ,LOOP

27

LD

HL,FONT-

256

28

LD

(#5C3 6) ,

HL

29

RET

Длина блока кодов 40 байт:

C350

21

00

3D

11

38

C7

01

00

82

C358

03

ED

B0

21

38

C7

01

00

DC

C360

03

7E

57

CB

3F

B6

23

B6

94

C368

AA

2B

77

23

0B

78

B1

20

EE

C370

F0

21

38

C6

22

36

5C

C9

BF

*************************************************************************************

© Игорь Л. Комаров, Иркутск, 1995.

Эта процедура может использоваться в паре с процедурой очистки экрана как в игре FREDDY HARDEST (2Х-РЕВЮ-94, № 6, стр. 29). Она так же попиксельно, случайным образом

выводит на экран картинку из буфера

1

ORG

50000

2

ENT

$

3

DI

4

CALL

CLS

5

LD

A, 1

6 L1

PUSH

AF

7

CALL

GO

8

POP

AF

9

RLCA

10

RLCA

11

RLCA

12

CP

1

13

JR

NZ, L1

14

LD

HL,BUFF+61

15

LD

DE,#5800

16

LD

BC,#0300

17

LDIR

18

EI

19

RET

2 0 ;

21 GO

LD

HL,BUFF-1

22

LD

DE,#3FFF

23 CONT

INC

HL

24

INC

DE

25

PUSH

AF

26

LD

A, E

27

CP

3

28

JR

NZ, L2

29

POP

AF

30

RET

31 ;

32 L2

POP

AF

ЭТЮДЫ

33

LD

BC,2047

34

PUSH

HL

35

PUSH

DE

36

ONE

PUSH

AF

37

AND

(HL)

38

EX

DE, HL

39

OR

(HL)

40

EX

DE, HL

41

PUSH

BC

42

LD

B, 20

43

L3

DJNZ

L3

44

POP

BC

45

LD

(DE) , A

46

DEC

BC

47

LD

A, B

48

OR

C

49

JR

Z, L4

50

POP

AF

51

RLCA

52

INC

HL

53

INC

HL

54

INC

HL

55

INC

DE

56

INC

DE

57

INC

DE

56

JR

ONE

59

;

60

L4

POP

AF

61

POP

DE

62

POP

HL

63

JR

CONT

64

;

65

CLS

XOR

A

66

OUT

(# FE) , A

67

LD

HL,#4000

68

PUSH

HL

69

POP

DE

70

INC

DE

71

LD

BC,#17FF

72

LD

(HL),A

73

LDIR

74

INC

HL

75

INC

DE

76

LD

BC, #02FF

77

LD

(HL),6

78

LDIR

79

RET

80

BUFF

DEFS

6912

81

END

Длина

без буфера экрана) = 110 байтов:

F3 CD A5 C3 3E 01 6F C3 F1 07 07 07

процедуры

C350 C358

F5 FE

3C 52

CD 01

ЭТЮДЫ

C360

20

F4

21

BE

DB

11

00

58

5A

C368

01

00

03

ED

B0

FB

C9

21

B1

C370

BD

C3

11

FF

3F

23

13

F5

2D

C378

7B

FE

03

20

02

F1

C9

F1

84

C380

01

FF

07

E5

D5

F5

A6

EB

8A

C388

B6

EB

C5

06

14

10

FE

C1

9A

C390

12

0B

78

B1

28

0A

F1

07

C3

C398

23

23

23

13

13

13

18

E5

FA

C3A0

F1

D1

E1

18

D0

AF

D3

FE

6E

C3A8

21

00

40

E5

D1

13

01

FF

95

C3B0

17

77

ED

B0

23

13

01

FF

D4

C3B8

02

36

06

ED

B0

C9

00

00

1F

*************************************************************************************

© В. Казаков, Д. Денисенко, г. Армавир, 1995.

Процедуры приводятся с непринципиальными изменениями.

Эта процедура выполняет красивую очистку экрана (эффект немного похож на действие предыдущей программы):

1

ORG

50000

2

ENT

$

3

LD

HL,#5800

4

LD

D, H

5

LD

E, L

6

INC

DE

7

LD

(HL),64+7

8

LD

BC,#02FF

9

LDIR

10

LD

B, 32

11 M0

PUSH

BC

12

LD

HL,#2BB0

13

LD

(M3+1),HL

14

LD

HL,16385

15

LD

DE,16384

16

CALL

LOOP

17

LD

HL,18433

18

LD

DE,18432

19

CALL

LOOP

20

LD

HL,20481

21

LD

DE,20480

22

CALL

LOOP

23

LD

HL,#2 3B8

24

LD

(M3+1),HL

25

LD

DE,16671

26

LD

HL,16670

27

CALL

LOOP

28

LD

DE,18719

29

LD

HL,18718

30

CALL

LOOP

31

LD

DE,20767

32

LD

HL,20766

33

CALL

LOOP

34

POP

BC

35

DJNZ

M0

(едуры

= 128 байтов:

C350

21

00

58

54

5D

13

36

47

CD

C358

01

FF

02

ED

B0

06

20

C5

A5

C360

21

B0

2B

22

B4

C3

21

01

DA

C368

40

11

00

40

CD

A6

C3

21

13

C370

01

48

11

00

48

CD

A6

C3

0B

C378

21

01

50

11

00

50

CD

A6

81

C380

C3

21

B8

23

22

B4

C3

11

AC

C388

1F

41

21

1E

41

CD

A6

C3

61

C390

11

1F

49

21

1E

49

CD

A6

C7

C398

C3

11

1F

51

21

1E

51

CD

FC

C3A0

A6

C3

C1

10

BA

C9

06

08

2E

C3A8

C5

E5

D5

06

04

C5

E5

D5

73

C3B0

01

1F

00

ED

B0

2B

36

00

91

C3B8

D1

E1

14

14

24

24

C1

10

6E

C3C0

EC

D1

E1

01

20

00

ED

4A

79

C3C8

EB

ED

4A

EB

C1

10

D9

C9

0B

Следующая процедура предназначена для прорисовки экрана в комплекте с предыдущей:

ORG 50000 ENT $ XOR A

1 2 3

ЭТЮДЫ

36

RET

37

LOOP

LD

B,8

38

Ml

PUSH

BC

39

PUSH

HL

40

PUSH

DE

41

LD

B, 4

42

M2

PUSH

BC

43

PUSH

HL

44

PUSH

DE

45

LD

BC,

31

46

M3

LDIR

47

DEC

HL

48

LD

(HL

0 , 0

49

POP

DE

50

POP

HL

51

INC

D

52

INC

D

53

INC

H

54

INC

H

55

POP

BC

56

DJNZ

M2

57

POP

DE

58

POP

HL

59

LD

BC,

32

60

ADC

HL,

BC

61

EX

DE,

HL

62

ADC

HL,

BC

63

EX

DE,

HL

64

POP

BC

65

DJNZ

M1

66

RET

4

LD

(SYSTEM),A

5

LD

B, 32

6

PRO

PUSH

BC

7

LD

A, #3C

8

LD

(M3) ,A

9

LD

A, #B0

10

LD

( M4 + 1 ) , A

11

LD

HL,BUFF

12

LD

DE,16384

13

CALL

LOOP

14

LD

HL,BUFF+2048

15

LD

DE,18432

16

CALL

LOOP

17

LD

HL,BUFF+4096

18

LD

DE,20480

19

CALL

LOOP

20

LD

A, #B8

21

LD

( M4 + 1 ) , A

22

LD

HL,BUFF+287

23

LD

DE,16671

24

CALL

LOOP

25

LD

HL,BUFF+2335

26

LD

DE,18719

27

CALL

LOOP

28

LD

HL,BUFF+4383

29

LD

DE,20767

30

CALL

LOOP

31

POP

BC

32

DJNZ

PRO

33

LD

HL,BUFF+6144

34

LD

DE,22528

35

LD

BC,768

36

LDIR

37

RET

38

LOOP

LD

B,8

39

M1

PUSH

BC

40

PUSH

DE

41

PUSH

HL

42

LD

B, 4

43

M2

PUSH

BC

44

PUSH

DE

45

PUSH

HL

46

LD

A, (SYSTEM)

47

M3

INC

A

48

LD

(SYSTEM),A

49

LD

B, 0

50

LD

C, A

51

M4

LDIR

52

XOR

A

53

LD

(M3) ,A

54

POP

HL

55

POP

DE

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

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

56

INC

H

57

INC

H

58

INC

D

59

INC

D

60

POP

BC

61

DJNZ

M2

62

POP

HL

63

POP

DE

64

LD

BC, 32

65

ADD

HL, BC

66

EX

DE, HL

67

ADD

HL, BC

68

EX

DE, HL

69

POP

BC

70

DJNZ

M1

71

RET

72 SYSTEM DEFB 0

73 BUFF DEFS 6912

Буфер экрана в этой программе находится по адресу 50140. Длина процедуры (без буфера экрана) = 140 байтов:

C350

AF

32

DB

C3

06

20

C5

3E

BB

C358

3C

32

B8

C3

3E

B0

32

C0

E4

C360

C3

21

DC

C3

11

00

40

CD

C4

C368

AB

C3

21

DC

CB

11

00

48

BA

C370

CD

AB

C3

21

DC

D3

11

00

4 F

C378

50

CD

AB

C3

3E

B8

32

C0

AE

C380

C3

21

FB

C4

11

1F

41

CD

24

C388

AB

C3

21

FB

CC

11

1F

49

1A

C390

CD

AB

C3

21

FB

D4

11

1F

AE

C398

51

CD

AB

C3

C1

10

B7

21

90

C3A0

DC

DB

11

00

58

01

00

03

87

C3A8

ED

B0

C9

06

08

C5

D5

E5

5E

C3B0

06

04

C5

D5

E5

3A

DB

C3

D4

C3B8

3C

32

DB

C3

06

00

4F

ED

C9

C3C0

B0

AF

32

B8

C3

E1

D1

24

65

C3C8

24

14

14

C1

10

E4

E1

D1

3E

C3D0

01

20

00

09

EB

09

EB

C1

5D

C3D8

10

D3

C9

00

00

00

00

00

47

И ещё одна программа для плавной прорисовки картинки, предварительно помещенной по адресу BUFF, сверку вниз по линиям:

1

ORG

50000

2

ENT

$

3

LD

HL,BUFF

4

LD

DE, 16384

5

CALL

PROG

6

LD

HL,BUFF+2048

7

LD

DE, 18432

8

CALL

PROG

9

LD

HL,BUFF+4096

10

LD

DE, 20480

11

CALL

PROG

12

LD

HL,BUFF+6144

ЭТЮДЫ

13

LD

DE,225

14

LD

BC,768

15

LDIR

16

RET

17

PROG

LD

B,8

18

M1

PUSH

BC

19

PUSH

HL

20

PUSH

DE

21

LD

B, 8

22

M2

PUSH

BC

23

PUSH

HL

24

PUSH

DE

25

LD

BC, 32

26

LDIR

27

HALT

28

POP

DE

29

POP

HL

30

INC

H

31

INC

D

32

POP

BC

33

DJNZ

M2

34

LD

BC, 32

35

POP

DE

36

POP

HL

37

ADD

HL, BC

38

EX

DE, HL

39

ADD

HL, BC

40

EX

DE, HL

41

POP

BC

42

DJNZ

M1

43

RET

44

BUFF

DEFS

6912

(едуры (

без буфера экрана)

= 75 байтов:

C350

21

9B

C3

11

00

40

CD

77

27

C358

C3

21

9B

CB

11

00

48

CD

8B

C360

77

C3

21

9B

D3

11

00

50

4D

C368

CD

77

C3

21

9B

DB

11

00

DA

C370

58

01

00

03

ED

B0

C9

06

FB

C378

08

C5

E5

D5

06

08

C5

E5

7A

C380

D5

01

20

00

ED

B0

76

D1

1D

C388

E1

24

14

C1

10

F0

01

20

46

C390

00

D1

E1

09

EB

09

EB

C1

AE

C398

10

DF

C9

00

00

00

00

00

13

Мы хотим обратить внимание читателей на не очень рациональное построение процедур: это проявляется в обилии задаваемых: конкретных адресов в дисплейном файле и буфере экрана. Например, последнюю процедуру можно было выполнить очень элегантно, используя 15-байтную подпрограмму расчёта адреса нижележащей пиксельной линии, приведенную в разделе ЭТЮДЫ в 2Х-РЕВЮ-95, № 4.

*************************************************************************************

© Николай Губин, г. Новгород, 1995.

Предлагаю две процедуры для владельцев 128К компьютеров. Они предназначены для вывода на экран картинки, предварительно помещённой в буфер (обозначен меткой BUFF).

ЭТЮДЫ

Первая процедура прорисовывает картинку от центра экрана вниз и вверх. Эта процедура используется в загрузчике DIZZY 4.

Так как в процедуре используется режим прерываний 2 рода, то она не будет работать на компьютерах, у которых этот режим некорректно обрабатывается. Впрочем, как исправить, мы думаем, Вы уже знаете - мы не раз приводили примеры в ZX-РЕВЮ.

00010

BUFF

EQU

41000

00020

ORG

40000

00030

ENT

00040

DI

00050

LD

BC,#7 FFD

00060

LD

A, #17

00070

OUT

(C) ,A

00080

LD

HL,BUFF

00090

LD

DE, #C000

00100

LD

BC,#1B00

00110

LDIR

00120

LD

HL,#A1A1

00130

LD

(#A0FF) ,:

00140

LD

A, #C3

00150

LD

( #A1 A1 ) ,

00160

LD

HL,SCR

00170

LD

( #A1 A2 ) ,

00180

LD

A, #A0

00190

LD

I,A

00200

IM

2

00210

EI

00220

LOOP

HALT

00230

LD

A, (POKE3

00240

OR

A

00250

JR

NZ,LOOP

00260

DI

00270

LD

A, #3F

00280

LD

I,A

00290

IM

1

00300

LD

A, #18

00310

LD

BC,#7 FFD

00320

OUT

(C) , A

00330

LD

HL,BUFF

00340

LD

DE, #4000

00350

LD

BC,#1B00

00360

LDIR

00370

LD

A, #10

00380

LD

BC,#7 FFD

00390

OUT

(C) , A

00400

RET

00410

SCR

PUSH

HL

00420

PUSH

DE

00430

PUSH

BC

00440

PUSH

AF

00450

LD

HL,#171F

00460

LD

BC,#7 FFD

00470

OUT

(C) , H

ЭТЮДЫ

00480

LD

DE,(POKE2)

00490

L1

DEC

DE

00500

LD

A, D

00510

OR

E

00520

JR

NZ, L1

00530

OUT

(C) , L

00540

LD

DE,(POKE2)

00550

DEC

DE

00560

DEC

DE

00570

DEC

DE

00580

DEC

DE

00590

DEC

DE

00600

DEC

DE

00610

DEC

DE

00620

DEC

DE

00630

DEC

DE

00640

LD

(POKE2),DE

00650

LD

DE,(POKE1)

00660

L2

DEC

DE

00670

LD

A, D

00680

OR

E

00690

JR

NZ, L2

00700

OUT

(C) , H

00710

LD

DE,(POKE1)

00720

LD

HL,#12

00730

ADD

HL, DE

00740

LD

(POKE1),HL

00750

POP

AF

00760

POP

BC

00770

POP

DE

00780

POP

HL

00790

EI

00800

RET

00810

POKE1

DEFB

2,0

00820

POKE2

DEFB

#5E

00830

POKE3

DEFB

#05

Start of object:

#9C4 0

(40000

)

Length:

#009B

(00155

)

Executes:

#9C40

(40000

)

9C40

F3

01

FD

7F

3E

17

ED

79

07

9C48

21

28

A0

11

00

C0

01

00

9F

9C50

1B

ED

B0

21

A1

A1

22

FF

28

9C58

A0

3E

C3

32

A1

A1

21

93

BD

9C60

9C

22

A2

A1

3E

A0

ED

47

0F

9C68

ED

5E

FB

76

3A

DA

9C

B7

27

9C70

20

F9

F3

3E

3F

ED

47

ED

B6

9C78

56

3E

18

01

FD

7F

ED

79

A3

9C80

21

28

A0

11

00

40

01

00

57

9C88

1B

ED

B0

3E

10

01

FD

7F

A7

9C90

ED

79

C9

E5

D5

C5

F5

21

F0

9C98

1F

17

01

FD

7F

ED

61

ED

22

9CA0

5B

D9

9C

1B

7A

B3

20

FB

6F

ЭТЮДЫ

9CA8 9CB0 9CB8 9CC0 9CC8 9CD0 9CD8

69 1B D9 B3 9C F1 5E

5B 1B ED FB 12 D1 00

D9 1B 5B ED 00 E1 00

9C 1B D7 61 19 FB 00

1B 1B 9C ED 22 C9 00

1B ED 1B 5B D7 02 00

8D F6 F2 3A 1C 32 D7

ED 1B 53 7A D7 9C 00

ED 1B 9C 20 21 C1 05

Следует только заметить, что

изменяется содержимое ячеек.

Вторая процедура выводит на :

00010

BUFF

EQU

32768

00020

ORG

40000

00030

ENT

00040

DI

00050

LD

HL,#4000

00060

LD

DE, #4001

00070

LD

BC,#1AFF

00080

LD

(HL),L

00090

LDIR

00100

LD

HL,BUFF

00110

LD

DE, #4000

00120

LD

BC,#1800

00130

LDIR

00140

LD

A, #01

00150

L1

LD

B,#FF

00160

PUSH

AF

00170

LOOP

LD

H,#98

00180

CALL

SCR

00190

INC

H

00200

CALL

SCR

00210

INC

H

00220

CALL

SCR

00230

DJNZ

LOOP

00240

POP

AF

00250

DEC

A

00260

OR

A

00270

JR

NZ, L1

00280

LD

HL,BUFF+61

00290

LD

DE, #5800

00300

LD

BC,#0300

00310

LDIR

00320

RET

00330

SCR

PUSH

HL

00340

LD

HL,POKE

00350

INC

(HL)

00360

BIT

0,(HL)

00370

POP

HL

00380

JR

Z, CONT

00390

RES

7, C

00400

BON

LD

A,R

00410

OR

C

00420

LD

L, A

ЭТЮДЫ

00430

PUSH

HL

00440

LD

A, H

00450

SUB

#40

00460

LD

H, A

00470

POP

DE

00480

LD

A, (DE)

00490

LD

(HL),A

00500

EX

DE, HL

00510

CALL

S1

00520

RET

00530

CONT

SET

7,C

00540

JR

BON

00550

S1

PUSH

HL

00560

PUSH

BC

00570

PUSH

DE

00580

PUSH

AF

00590

LD

HL, 0

00600

LD

DE, 0

00610

LD

BC,#123

00620

LDIR

00630

POP

AF

00640

POP

DE

00650

POP

BC

00660

POP

HL

00670

RET

Start of object:

#9C4 0

(40000

)

Length:

#0073

(00115

)

Executes:

#9C40

(40000

)

9C40

F3

21

00

40

11

01

40

01

83

9C48

FF

1A

75

ED

B0

21

00

80

B0

9C50

11

00

40

01

00

18

ED

B0

F3

9C58

3E

01

06

FF

F5

26

98

CD

B8

9C60

7D

9C

24

CD

7D

9C

24

CD

10

9C68

7D

9C

10

F1

F1

3D

B7

20

23

9C70

E9

21

00

98

11

00

58

01

18

9C78

00

03

ED

B0

C9

E5

21

B2

35

9C80

9C

34

CB

46

E1

28

13

CB

E4

9C88

B9

ED

5F

B1

6F

E5

7C

D6

80

9C90

40

67

D1

1A

77

EB

CD

9E

8B

9C98

9C

C9

CB

F9

18

EB

E5

C5

0A

9CA0

D5

F5

21

00

00

11

00

00

38

9CA8

01

23

01

ED

B0

F1

D1

C1

89

9CB0

E1

C9

00

00

00

00

00

00

F6

У этой процедуры буфер экрана обязательно (#8000).

должен располагаться по адресу 32768

ЭТЮДЫ

© Влад, г. Оленегорск, 1995.

Предлагаю программу имитации звёздного неба (как в ГБМ'овской программе WD).

00010

ORG

40000

00020

ENT

00030

CALL

INIT

00040

HALT

00050

STAR

CALL

START

00060

LD

A, 127

00070

IN

A, (254)

00080

RRA

00090

JR

C, STAR

00100

RET

00110

INIT

LD

IX,SHAB

00120

L1

LD D, (I

00130

LD

E,(IX+1)

00140

CALL

TOSCR

00150

LD

A,(IX+3)

00160

XOR

(HL)

00170

LD

(HL),A

00180

LD

DE, 4

00190

ADD

IX, DE

00200

LD

A,(IX+0)

00210

CP

255

00220

RET

Z

00230

JR

L1

00240

START

LD

IX,SHAB

00250

L5

LD

D,(IX+0)

00260

LD

E,(IX+1)

00270

CALL

TOSCR

00280

LD

A,(IX+3)

00290

XOR

(HL)

00300

LD

(HL),A

00310

LD

B,(IX+2)

00320

LD

A,(IX+3)

00330

L3

ADD

A,A

00340

OR

A

00350

JR

Z, L2

00360

DJNZ

L3

00370

LD

(IX+3),A

00380

XOR

(HL)

00390

LD

(HL),A

00400

JR

L4

00410

L2

LD

(IX+3),1

00420

LD

A, (IX+1)

00430

DEC

A

00440

AND

31

00450

LD

(IX+1),A

00460

LD

D,(IX+0)

00470

LD

E,(IX+1)

00480

CALL

TOSCR

00490

LD

A, (IX+3)

00500

XOR

(HL)

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

00510

LD

(HL),A

00520

L4

LD

DE,4

00530

ADD

IX, DE

00540

LD

A, (IX+0)

00550

CP

255

00560

JR

NZ, L5

00570

RET

00580

TOSCR

LD

H,64

00590

LD

A, D

00600

AND

192

00610

SRL

A

00620

SRL

A

00630

SRL

A

00640

ADD

A, H

00650

LD

H, A

00660

LD

A, D

00670

AND

7

00680

ADD

A, H

00690

LD

H, A

00700

LD

A, D

00710

AND

56

00720

ADD

A, A

00730

ADD

A, A

00740

ADD

A, E

00750

LD

L, A

00760

RET

00770

SHAB

DEFB

10,26,1,64

00780

DEFB

100,4,1,64

00790

DEFB

50,29,2,16

00800

DEFB

130,14,2,16

00810

DEFB

70, 30, 4, 16

00820

DEFB

170,14,1,32

00830

DEFB

20,13,4,16

00840

DEFB

30,19,2,4

00850

DEFB

40, 25, 4, 16

00860

DEFB

60,22,1,32

00870

DEFB

150,4,1,32

00880

DEFB

180,1,4,16

00890

DEFB

190, 26, 2,4

00900

DEFB

80,5,2,4

00910

DEFB

90,14,2,4

00920

DEFB

110,1,4,16

00930

DEFB

120,31,1,32

00940

DEFB

140,14,1,32

00950

DEFB

160,22,2,4

00960

DEFB

10,9,1,32

00970

DEFB

100,21,1,32

00980

DEFB

50,14,2,4

00990

DEFB

130,29,2,4

01000

DEFB

70,13,4,16

01010

DEFB

170,31,1,32

01020

DEFB

20, 30, 4, 16

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

01030

DEFB

30, 2, 2, 4

01040

DEFB

40, 8, 4, 16

01050

DEFB

60, 5, 1, 32

01060

DEFB

150, 21, 1, 32

01070

DEFB

180, 18, 4, 16

01080

DEFB

190, 11, 2, 4

01090

DEFB

80,22,2,4

01100

DEFB

90, 29, 2, 4

01110

DEFB

110, 18, 4, 16

01120

DEFB

120, 14, 1, 32

01130

DEFB

140, 31, 1, 32

01140

DEFB

160, 5, 2, 4

01150

DEFB

255

Start of object: #9C40

Length: #012E (06302)

Executes: #9C40 (40000)

Каждая звезда определяется четырьмя байтами. Первый и второй байты - это координаты звёзд в пикселях, третий байт - скорость перемещения звёзды, четвёртый байт - шаблон самой звезды.

Шестнадцатеричный дамп:

9C40

CD

4F

9C

76

CD

6E

9C

3E

1F

9C48

7 F

DB

FE

1F

38

F6

C9

DD

2 F

9C50

21

D5

9C

DD

56

00

DD

5E

EC

9C58

01

CD

BB

9C

DD

7E

03

AE

25

9C60

77

11

04

00

DD

19

DD

7E

D9

9C68

00

FE

FF

C8

18

E5

DD

21

C4

9C70

D5

9C

DD

56

00

DD

5E

01

EC

9C78

CD

BB

9C

DD

7E

03

AE

77

BB

9C80

DD

46

02

DD

7E

03

87

B7

DD

9C88

28

09

10

FA

DD

77

03

AE

64

9C90

77

18

1B

DD

36

03

01

DD

CA

9C98

7E

01

3D

E6

1F

DD

77

01

4A

9CA0

DD

56

00

DD

5E

01

CD

BB

33

9CA8

9C

DD

7E

03

AE

77

11

04

78

9CB0

00

DD

19

DD

7E

00

FE

FF

9A

9CB8

20

B8

C9

26

40

7A

E6

C0

7B

9CC0

CB

3F

CB

3F

CB

3F

84

67

65

9CC8

7A

E6

07

84

67

7A

E6

38

4E

9CD0

87

87

83

6F

C9

0A

1D

01

5D

9CD8

20

64

07

01

20

32

03

02

57

9CE0

04

82

14

02

04

46

0A

04

70

9CE8

01

AA

11

01

10

14

19

04

82

9CF0

01

1E

19

02

01

28

05

04

F8

9CF8

01

3C

19

01

10

96

07

01

99

9D00

10

B4

0D

04

01

BE

00

02

33

9D08

01

50

0B

02

01

5A

14

02

74

9D10

01

6E

0D

04

01

78

02

01

A9

9D18

10

8C

11

01

10

A0

1C

02

31

9D20

01

0A

0C

01

10

64

18

01

62

9D28

10

32

14

02

01

82

03

02

A5

9D30

01

46

19

04

01

AA

02

01

DF

9D38

10

14

0A

04

01

1E

08

02

30

ЭТЮДЫ

9D40

01

28

14

04

01

3C

08

01

64

9D48

10

96

18

01

10

B4

1E

04

8A

9D50

01

BE

11

02

01

50

1C

02

2E

9D58

01

5A

03

02

01

6E

1E

04

E 6

9D60

01

78

11

01

10

8C

02

01

27

9D68

10

A0

0B

02

01

FF

00

00

C2

************************************************************************************* © Роман Щербаков, г. Москва, 1995.

Процедура EXPLOSION

Этот графический эффект я назвал EXPLOSION - взрыв. Его действие состоит в следующем: при запуске программа "взрывает" заданную часть экрана, сопровождая зрелище соответствующими звуками. Изображение по точкам ("осколкам") начинает разлетаться от места взрыва в разные стороны, пока не исчезнет за пределами экрана. Задать для "взрыва" можно любую область экрана, причем разлетающиеся "осколки" не будут портить ничего на своем пути. В основе лежит процедура из игры STAINLESS STEEL, однако исходный вариант примерно на 90% мной переработан.

Процедура может использоваться, например, для демонстрации гибели героя в играх, но можно найти ей ещё более интересное применение.

1 ; (С) Щербаков Роман 1995.

2 ;

10

ORG

50000

;--- Программные переменные ---

20 XCRD

EQU

#60

;Х-координата взрываемого прямоугольника

3 0 YCRD

EQU

#48

;Y-координата от левого верхнего угла

40 XLEN

EQU

#48

;Длина прямоугольника в пикселях

50 YHGT

EQU

#10

;Высота прямоугольника в пикселях

60

ENT

$

;--- Инициализатор ---

70

LD

IX, DATA

;В IX помещается адрес начала буфера

;данных

80

LD

B, #FF

;B регистр B - количество "осколков" (255)

90 INIT

LD

C,XLEN

;В регистр C - макс. длину прямоугольника

100

CALL

RNDA

;Вызов генератора псевдослучайных чисел.

110

ADD

A, XCRD

; Складываем случайное число с Х-координаты

120

LD

(IX+0),A

;В соответствующее место буфера его

130

LD

C, YHGT

;Аналогичные расчёты для Y-координаты

140

CALL

RNDA

;(В регистр C помещается максимальное число

150

ADD

A, YCRD

; которое является ограничителем для

160

LD

(IX+1),A

; генератора псевдослучайных чисел)

170

LD

C, #0F

;Для определения скорости движения осколков

180 LOOP

CALL

RNDA

;генерируем число 0-15 и вычитаем 8,

190

SUB

#08

; получая число -8...+ 8; но если получаем

200

JR

Z,LOOP

;скорость=0, то повторная генерация и

210

LD

(IX+2),A

;повторная проверка.

220

LD

(KEY0+1),A

; Помещаем скорость по оси X в буфер и

230

CALL

RNDA

; флаг первого запуска (о нем позже).

240

SUB

#08

; Аналогично рассчитываем скорость по Y,

250

LD

(IX+3),A

;но без проверки на 0; засылаем в буфер

260

LD

DE,#0004

;Переход к следующему элементу буфера на

270

ADD

IX, DE

;4 байта вперед или возврат в Бейсик,

280

DJNZ

I NI T

; если весь массив проинициализирован

290

RET

;Расклад: X, Y, скорость X, скорость Y.

300 EXPL

LD

IX,DATA

;--- Основной блок ---

310

LD

BC,#FFFF

; В ВС - счётчик на "активные осколки".

78

ЭТЮДЫ

320

TYPE

LD

A,(IX+1)

;Если коорд.=255 (чего быть не может),

330

INC

A

;значит осколок улетел за край экрана,

340

JR

Z, NEXT

;поэтому переход без печати на экране

350

KEY0

LD

A,#FF

;Если флаг 1 -го запуска 7-00, то обходим

360

OR

A

;вызов гашения точек (при первом проходе

370

CALL

Z,CALC

;выключать нечего - осколков ещё нет)

380

LD

A, (IX+0)

;Вычисляем новую Х-координату осколка:

390

ADD

A, (IX+2)

; складываем текущую координату и смещение

400

CP

#08

; Если точка улетела за край экрана,

410

JR

C, STOP

; то выключаем её

420

LD

(IX+0),A

;3апоминаем новую координату в буфере.

430

LD

A, (IX+1)

;Аналогичные действия проводим и над

440

ADD

A, (IX+3)

;Y-координатой, проверяя достижение

450

CP

#B0

;"осколком" верхней или нижней

460

JR

C, CONT

; части экрана

470

STOP

LD

(IX+1),#FF

;3десь заносим в Y-координату 255, что

480

JR

NEXT

;означает выключение осколка.

490

CONT

LD

(IX+1),A

;3апоминаем новую Y-координату в буфере

500

CALL

CALC

; и выполняем печать нового осколка

510

INC

C

; корректируем число

520

NEXT

LD

DE,#0 0 04

; оставшихся точек и

530

ADD

IX, DE

; переходим к следующему

540

DJNZ

TYPE

; элементу массива

550

INC

C

; Если улетели не все осколки, то повтор

560

LD

A, D

; основного блока сначала (только

570

LD

(KEY0+1),A

; выключаем флаг первого прохода)

580

JR

NZ,EXPL

; Если точки улетели,

590

RET

; то выход в Бейсик.

600

CALC

PUSH

BC

;--- Подпрограмма печати осколков ---

610

LD

C,(IX+0)

;В С заносим из буфера Х-координату,

620

LD

A, (IX+1)

;А - Y-координату

630

CALL

#22B0

;Вызываем из ПЗУ подпрограмму

640

LD

B, A

; расчёта адреса

650

INC

B

; и формируем осколок -

660

MOVE

RRCA

;- 1, 2 или 3 точки.

670

DJNZ

MOVE

680

XOR

(HL)

; Закладываем по XOR на имеющееся

690

LD

(HL),A

;изображение.

700

AND

#10

710

OR

0

;3десь задается цвет BORDER'a во время

720

OUT

(# FE) , A

;исполнения эффекта (первоначально 0).

730

POP

BC

740

RET

750

RNDA

LD

DE,0

;--- Генератор псевдослучайных чисел ---

760

LD

H, E

; Генерирует

770

LD

L, #FD

; псевдослучайное

780

LD

A, D

; число

790

OR

D

800

SBC

HL, DE

; диапазоне

810

SBC

A, 0

; от

820

SBC

HL, DE

; нуля

830

SBC

A, 0

; до

ЭТЮДЫ

840

LD

E, A

;числа,

850

LD

D, 0

;содержащегося

860

SBC

HL, DE

870

JR

NC,RND1

;регистре

880

INC

HL

;C

890RND1

LD

(RNDA+1)

,HL ;Генератор

900

CP

C

; практически

910

JR

NC,RNDA

; не

920

RET

;изменён

93 0 DATA

DEFS

1020

;3десь будет сформирован

■ динамичной информации о координатах,

■ скорости и состоянии осколков в таком

■ формате: Х-координата (относительно левого ; верхнего угла) Y-координата скорость

■ точки по оси X скорость по оси Y (все в ^пикселях). Итого для 255 элементов по 4 мбайта = 1020 байтов

а кодов (без буфера для формирования данных) равна 183

байта

C350

DD

21

07

C4

06

FF

0E

48

37

C358

CD

E8

C3

C6

60

DD

77

00

0D

C360

0E

10

CD

E8

C3

C6

48

DD

A4

C368

77

01

0E

0F

CD

E8

C3

D6

0E

C370

08

28

F9

DD

77

02

32

97

7B

C378

C3

CD

E8

C3

D6

08

DD

77

A8

C380

03

11

04

00

DD

19

10

CE

2 F

C388

C9

DD

21

07

C4

01

FF

FF

DC

C390

DD

7E

01

3C

28

2A

3E

FF

7A

C398

B7

CC

CF

C3

DD

7E

00

DD

A8

C3A0

86

02

FE

08

38

0D

DD

77

8A

C3A8

00

DD

7E

01

DD

86

03

FE

2B

C3B0

B0

38

06

DD

36

01

FF

18

8C

C3B8

07

DD

77

01

CD

CF

C3

0C

42

C3C0

11

04

00

DD

19

10

C9

0C

73

C3C8

7A

32

97

C3

20

BB

C9

C5

FA

C3D0

DD

4E

00

DD

7E

01

CD

B0

97

C3D8

22

47

04

0F

10

FD

AE

77

49

C3E0

E 6

10

F6

00

D3

FE

C1

C9

EA

C3E8

11

00

00

63

2E

FD

7A

B2

76

C3F0

ED

52

DE

00

ED

52

DE

00

ED

C3F8

5F

16

00

ED

52

30

01

23

C3

C400

22

E9

C3

B9

30

E2

C9

00

26

Программа состоит из двух частей: инициализатора и основного исполняемого модуля. Инициализатор подготавливает буфер-ячейки памяти, определяющие поведение осколков. Они используются программой при работе основного исполняемого модуля, непосредственно воспроизводящего эффект. Обе части программы объединены в блоке двумя точками входа: для исполняемого модуля адрес будет равен ORG+57, где ORG - адрес ассемблирования.

Буфер, создаваемый инициализатором, необходим для хранения динамической информации о координатах, скорости и состоянии осколков.

Теперь о том, как использовать процедуру. Допустим, что Вы хотите "взорвать" прямоугольную часть экрана, левый верхний угол которого имеет координаты AT 10,8 (в знакоместах), длиной в 6, высотой в 2 символа. Умножьте каждое из этих чисел на 8 и при

ЭТЮДЫ

ассемблировании занесите получившиеся числа в переменные XCRD, YCRD, XLEN, YHGT. Для занесения координат в уже готовый блок, можно воспользоваться командами: POKE ORG+ 7,XLEN POKE ORG+12,XCRD POKE ORG+17,YHGT POKE ORG+22,YCRD

После передачи параметров запускайте инициализатор с адреса ORG. Далее придётся прибегнуть к маленькой хитрости: после инициализации будет необходимо удалить изображение во взрываемом прямоугольнике экрана, так как основная программа этого не сделает! Дело в том, что инициализатор подготавливает массив, используя случайные данные, поэтому нет контроля за тем, что находится в этом месте экрана (можно взорвать даже пустой прямоугольник). Но это несёт в себе и определенные преимущества, так как если взрываемый прямоугольник содержит в себе участок фона или пейзажа, который взрывать не надо, то после инициализации удалите (по XOR) только то, что собираетесь действительно взорвать (удалить с экрана). А разлетающиеся осколки не испортят основной фон.

Запуск взрывателя производится с адреса ORG+57.

Приведённая ниже Бейсик-программа предназначена для демонстрационной работы (автостарт со 2-й строки). Параметры для этого примера заданы в листинге на ассемблере.

1 GO ТО 4

2 BORDER 0: PAPER 0: INK 7: ВRIGHT 1: CLEAR 49999

3 RANDOMIZE USR 15619: REM : LOAD "expl" CODE 50000

4 FOR a=10 6 TO 160 STEP 6: CIRCLE a,96,8: NEXT a: RANDOMIZE USR 50000:

CLS : RANDOMIZE USR 50057: GO TO 4

Мне хотелось бы приобрести новых друзей по "Спекки". Если кого-то заинтересовали мои процедуры "СНЕГ" (см. ZX-РЕВЮ-95, № 2, стр. 30) и EXPLOSION, можете написать мне. О себе: мне 15 лет. Интересуюсь разработкой графических эффектов на АССЕМБЛЕРЕ.

103460, г. Москва, К-460, корп. 1202, кв. 97. _Щербакову Роману._

************************************************************************************* © Гревцев Я.В., г. Барнаул.

Процедура "Звезды-2"

Предлагаю процедуру, которая является дальнейшим развитием программ "Звезды" и "Падающий снег", ранее опубликованных в ZX-РЕВЮ. Моя процедура, а я назвал её "Звезды-2", выводит на экран вспыхивающие и затухающие, качественно выполненные звезды. Эффект поразительно похож на тот, что реализован в титульном меню программы EXOLON, а также в некоторых "музыкальных" загрузчиках. Именно из одного из них я и срисовал шаблоны звёзд. Кроме этого внимательный читатель наверняка заметит, что все подпрограммы, используемые мною в процедуре, уже "засветились" в различных изданиях ИНФОРКОМА. Смею надеяться, что именно это поможет без помех разобраться в данной процедуре даже начинающим программистам. Всё это является примером того, как из в общем-то известных вещей можно составить нечто новое.

Принцип действия процедуры несложен: сначала данные о звезде записываются в массив описаний. Каждая звезда задается тремя параметрами.

1 и 2 байты - координаты звезды в дисплейном файле.

3 байт - номер текущего спрайта.

4 байт - текущая фаза жизни звезды.

Далее все просто: организуется счётчик по количеству звёзд. За каждый проход печатается новый спрайт размером 2x2 знакоместа. Когда звезда угасает, случайным образом находятся и записываются в массив новые для неё координаты.

Всё это великолепие продолжается до тех пор, пока не будет нажата клавиша BREAK (CAPS SHIFT+SPACE). "Подвесить" процедуру на прерывания 2 рода наверняка не составит

ЭТЮДЫ

большого труда для просвещенных читателей ZX-РЕВЮ. Неплохо было бы объединить "Звезды-2" с процедурой "Падающий снег" - эффект был бы впечатляющий.

ИФК: При использовании процедуры в качестве "8сгееп-сейвера", сохраняющего ресурс монитора, необходимо добавить подпрограммы сохранения изображения с экрана в специальном буфере и очистку экрана перед вызовом "Звёзд-2", подпрограмму подсчёта количества прерываний и анализа нажатия на клавиши, а также подпрограмму восстановления изображения после первого нажатия на любую клавишу. Однако всё это Вы можете найти в предыдущих выпусках ZX-РЕВЮ.

1 2

ORG ENT

50000 $

3 ;

4

LD

IX,MASS

;Адрес массива описаний звёзд.

5

LD

B, 20

;Количество звезд.

6 S

1

CALL

INIT

;Инициализация координат звезды ;в дисплейном файле.

7

CALL

PRINT

;Печать звезды.

8

LD

DE,#0004

;Смещение до следующего

9

ADD

IX, DE

;элемента массива.

10

DJNZ

S_1

;Инициализация всего массива.

11

BEGIN

LD

IX,MASS

;

12

LD

B, 20

;Количество звёзд.

13

S 2

LD

HL,7 50

;Задержка времени. Скорость

14

S_4

DEC

HL

;вспыхивания и угасания звёзд,

15

LD

A, H

; зависит от их количества, а

16

OR

L

; также от содержимого

17

JR

NZ, S 4

; регистра HL

18

CALL

PRINT

;Напечатав звезду поверх её самой, ;мы тем самым стираем её.

19

LD

A, (IX+3)

;В аккумуляторе число, характеризующее ;фазу жизни звезды.

20

AND

A

;Сравниваем с нулем.

21

JR

Z, UGAS

;Если ноль, значит звезда угасает. ;Иначе... Звезда вспыхивает.

22

LD

A, (IX+2)

;Номер текущего спрайта.

23

INC

A

; Предыдущий уже стёрт, переходим на ;следующий.

24

CP

5

;Заодно проверяем, не был ли ;это последний спрайт.

25

JR

NZ, S 3

;Если нет, то переход на печать. Иначе ;звезда должна угасать. Значит, печатаем ;спрайты в обратной последовательности. ;Поэтому.

26

LD

(IX+3),0

;Фаза жизни теперь равна нулю.

27

DEC

A

; Становимся на один

28

DEC

A

; спрайт ниже .

29

JR

S_3

;Спокойно идём на печать. ;Звезда угасает.

30

UGAS

DEC

(IX+2)

;Уменьшили номер спрайта ни единицу.

31

JR

NZ,S 3A

; Если это был последний спрайт, то сие ;означает, что звезда сгорела. Теперь она ;должна вспыхнуть в другом месте.

32

LD

(IX+3),1

;Соответственно изменилась и фаза.

ЭТЮДЫ

33

CALL

I NI T

;Ищем новые координаты звезды.

34

LD

A, 1

;Печать новой звезды начинается

35

S

3

LD

(IX+2),A

;всегда с первого спрайта.

36

S_

3A

CALL

PRINT

;Печатаем спрайт.

37

LD

DE, #0004

; Смещение до следующего

38

ADD

IX, DE

;элемента массива.

39

PUSH

BC

;Процедура проверки клавиш.

40

LD

BC,#FEFE

;При одновременном нажатии

41

IN

A, (C)

;CAPS SHIFT и SPACE (BREAK)

42

AND

1

; происходит очистка экрана

43

LD

E, A

; от звёзд и выход

44

LD

BC,#7 FFE

;из процедуры.

45

IN

A, (C)

;

46

AND

1

;Можно организовать выход

47

OR

E

;любым другим способом.

48

JR

NZ, S 6

;

49

LD

IX,MASS

;

50

LD

B, 20

;

51

S_

5

CALL

PRINT

;

52

LD

DE, #0004

;

53

ADD

IX, DE

;

54

DJNZ

S_5

;

55

POP

BC

;

56

RET

;

57

S_

6

POP

BC

;

58

DJNZ

S_2

;Повтор для каждой звезды.

59

JR

BEGIN

;Повтор до нажатия BREAK.

; Подпрограмма инициализации одного элемента массива. ; Случайным образом находит и записывает в ячейки ; (IX+0) и (IX+1) координаты звезды в дисплейном файле.

60 INIT

LD

HL,(23670)

; Подпрограмма взята

61

LD

DE, (23672)

;из ZX-РЕВЮ-93 № 5-6, стр. 97

62

ADD

HL, DE

63

LD

(23670)

, HL

;Аналогично команде Бейсика

64

LD

A, L

;INT (RND* 32) .

65

AND

31

;B A число от 0 до 31.

66

LD

D, A

;Записали координату Х.

67

PUSH

DE

68

LD

HL, (23670)

69

LD

DE, (23672)

70

ADD

HL, DE

71

LD

(23670)

, HL

72

LD

A, H

73

AND

15

74

LD

H, A

75

LD

A, L

; Аналогично команде Бейсика

76

AND

7

;INT (RND*23).

77

ADD

A, H

;В А число от 0 до 23.

78

POP

DE

79

LD

E, A

; Записали координату Y.

; Отсюда начинается расчёт адреса в дисплейном файле. ; К этому моменту в DE - координаты звезды в знакоместах.

ЭТЮДЫ

; Эта

часть программы

взята

из ZX-РЕВЮ-93 № 3, стр. 4 4

80

AND

#18

81

ADD

A, #40

;Старший байт сформирован

82

LD

(IX+0

) , A

;и записан в массив.

83

LD

A, E

84

AND

7

85

RRCA

;

86

RRCA

;

87

RRCA

;

88

ADD

A, D

;Младший байт сформирован

89

LD

(IX+1

) , A

;и записан в массив.

90

RET

Подпрограмма печати (стирания) звезды. Взята из ZX-FORUM-1 стр. 130

91 PRINT

PUSH

BC

;Запомнили ВС для корректного ;выхода из подпрограммы.

92

LD

B,(IX+2)

;Приняли номер шаблона спрайта. ;Организовали счётчик шаблонов.

93

LD

DE,32

;Длина шаблона 32 байта.

94

LD

HL,STAR-32

;Адрес указывает на одну длину ;спрайта ниже, чем начало таблицы.

95 PR 1

ADD

HL,DE

;Смещение на длину шаблона.

96

DJNZ

PR 1

;Повторяем столько раз, каков номер ;шаблона. В результате HL указывает на ;положение искомого спрайта в таблице.

97

LD

D,(IX+0)

;DE указывает на адрес

98

LD

E, (IX+1)

;в дисплейном файле.

99

LD

B, 2

;В - счётчик строк.

100 PR 2

PUSH

BC

;

101

PUSH

DE

;

102

LD

B, 8

;

103 PR 3

PUSH

BC

;

104

PUSH

DE

105

LD

B, 2

;В - счётчик столбцов.

106 PR 4

LD

A,(DE)

; Загрузили аккумулятор ;очередным байтом экрана.

107

XOR

(HL)

;Слияние по XOR с очередным байтом шаблона.

108

LD

(DE) , A

;Печать байта на экран по XOR.

109

INC

DE

;

110

INC

HL

111

DJNZ

PR 4

112

POP

DE

113

POP

BC

;

114

INC

D

;

115

DJNZ

PR 3

;

116

POP

DE

;

117

POP

BC

;

118

LD

A, 32

119

ADD

A, E

;

120

LD

E, A

121

JR

NC,PASS

;

122

LD

A, 8

;

123

ADD

A, D

ЭТЮДЫ

124 LD D, A ;

12 5 PASS DJNZ PR_2 ;

12 6 POP BC ; Восстановили BC.

12 7 RET ;Выход.

; Массив описаний для 2 0 звёзд.

; Для описания каждой звёзды необходимо 4 байта: ; 2 байта - координаты в дисплейном файле; ; 3-й байт - номер текущего спрайта;

; 4-й байт - фаза жизни звёзды.

128

MASS

DEFB

#00,

#00,

#01,

#01,

#00,

#00,

#01,

#01

129

DEFB

#00,

#00,

#02,

#00,

#00,

#00,

#02,

#01

130

DEFB

#00,

#00,

#03,

#00,

#00,

#00,

#03,

#01

131

DEFB

#00,

#00,

#03,

#00,

#00,

#00,

#03,

#01

132

DEFB

#00,

#00,

#04,

#00,

#00,

#00,

#01,

#01

133

DEFB

#00,

#00,

#03,

#00,

#00,

#00,

#03,

#01

134

DEFB

#00,

#00,

#04,

#00,

#00,

#00,

#02,

#01

135

DEFB

#00,

#00,

#03,

#00,

#00,

#00,

#03,

#01

136

DEFB

#00,

#00,

#02,

#00,

#00,

#00,

#02,

#01

137

DEFB

#00,

#00,

#04,

#00,

#00,

#00,

#03,

#01

; Таблица

шаблонов звёзд.

; 4

шаблона размером

2x2

знакоместа .

139

STAR

DEFB

#00,

#00,

#00,

#00,

#00,

#00,

#00,

#00

140

DEFB

#00,

#00,

#00,

#00,

#00,

#00,

#00,

#80

141

DEFB

#01,

#C0,

#00,

#80,

#00,

#00,

#00,

#00

142

DEFB

#00,

#00,

#00,

#00,

#00,

#00,

#00,

#00

143

;

144

DEFB

#00,

#00,

#00,

#00,

#00,

#00,

#00,

#00

145

DEFB

#00,

#00,

#00,

#80,

#00,

#00,

#00,

#80

146

DEFB

#05,

#D0,

#00,

#80,

#00,

#00,

#00,

#80

147

1 Л Я

148

DEFB

#00,

#00,

#00,

#00,

#00,

#00,

#00,

#00

149

;

DEFB

#00,

#00,

#00,

#00,

#00,

#80,

#00,

#00

150

DEFB

#00,

#80,

#00,

#90,

#02,

#80,

#01,

#C0

151

DEFB

#2 F,

#F4,

#01,

#C0,

#00,

#A0,

#04,

#80

152

DEFB

#00,

#00,

#00,

#80,

#00,

#00,

#00,

#00

153

;

154

DEFB

#00,

#80,

#00,

#00,

#00,

#80,

#10,

#08

155

DEFB

#00,

#80,

#04,

#80,

#02,

#A0,

#01,

#C0

156

DEFB

#5F,

#FD,

#01,

#C0,

#02,

#80,

#04,

#90

157

DEFB

#00,

#88,

#10,

#80,

#00,

#00,

#00,

#80

Длина блока кодов процедуры равна 445 байт:

C350

DD

21

3D

C4

06

14

CD

CD

C6

C358

C3

CD

04

C4

11

04

00

DD

65

C360

19

10

F3

DD

21

3D

C4

06

44

C368

14

21

EE

02

2B

7C

B5

20

CC

C370

FB

CD

04

C4

DD

7E

03

A7

C8

C378

28

10

DD

7E

02

3C

FE

05

0F

C380

20

16

DD

36

03

00

3D

3D

09

C388

18

0E

DD

35

02

20

0C

DD

8E

C390

36

03

01

CD

CD

C3

3E

01

29

C398

DD

77

02

CD

04

C4

11

04

5B

C3A0

00

DD

19

C5

01

FE

FE

ED

08

ЭТЮДЫ

C3A8

78

E6

01

5F

01

FE

7F

ED

94

C3B0

78

E6

01

B3

20

12

DD

21

B5

C3B8

3D

C4

06

14

CD

04

C4

11

3C

C3C0

04

00

DD

19

10

F6

C1

C9

0D

C3C8

C1

10

9E

18

96

2A

76

5C

A4

C3D0

ED

5B

78

5C

19

22

76

5C

BC

C3D8

7D

E6

1F

57

D5

2A

76

5C

45

C3E0

ED

5B

78

5C

19

22

76

5C

CC

C3E8

7C

E6

0F

67

7D

E6

07

84

71

C3F0

D1

5F

E6

18

C6

40

DD

77

3B

C3F8

00

7B

E6

07

0F

0F

0F

82

D2

C400

DD

77

01

C9

C5

DD

46

02

CC

C408

11

20

00

21

6D

C4

19

10

78

C410

FD

DD

56

00

DD

5E

01

06

46

C418

02

C5

D5

06

08

C5

D5

06

26

C420

02

1A

AE

12

13

23

10

F9

FF

C428

D1

C1

14

10

F0

D1

C1

3E

62

C430

20

83

5F

30

04

3E

08

82

F2

C438

57

10

DE

C1

C9

00

00

01

CC

C440

01

00

00

01

01

00

00

02

09

C448

00

00

00

02

01

00

00

03

12

C450

00

00

00

03

01

00

00

03

1B

C458

00

00

00

03

01

00

00

04

24

C460

00

00

00

01

01

00

00

03

29

C468

00

00

00

03

01

00

00

04

34

C470

00

00

00

02

01

00

00

03

3A

C478

00

00

00

03

01

00

00

02

42

C480

00

00

00

02

01

00

00

04

4B

C488

00

00

00

03

01

00

00

00

50

C490

00

00

00

00

00

00

00

00

54

C498

00

00

00

00

80

01

C0

00

9D

C4A0

80

00

00

00

00

00

00

00

E4

C4A8

00

00

00

00

00

00

00

00

6C

C4B0

00

00

00

00

00

00

00

00

74

C4B8

80

00

00

00

80

05

D0

00

51

C4C0

80

00

00

00

80

00

00

00

84

C4C8

00

00

00

00

00

00

00

00

8C

C4D0

00

00

80

00

00

00

80

00

94

C4D8

90

02

80

01

C0

2F

F4

01

93

C4E0

C0

00

A0

04

80

00

00

00

88

C4E8

80

00

00

00

00

00

80

00

AC

C4F0

00

00

80

10

08

00

80

04

D0

C4F8

80

02

A0

01

C0

5F

FD

01

FC

C500

C0

02

80

04

90

00

88

10

33

C508

80

00

00

00

80

00

00

00

CD

************************************************************************************* © С. Астров, г. Чебоксары, 1995.

Процедура "Линии"

Я предлагаю программу, аналогичную программе "Звёзды" (2Х-РЕВЮ-94, № 5, стр. 5), предназначенную для сохранения ресурса видеомонитора. Во время дежурного режима на экране появляются и исчезают голубые горизонтальные линии-штрихи размером 8x1 пиксель. Полоски не

ЭТЮДЫ

так привычны, как "звёзды" в Norton Commander, но и не так круто, как "горящий" экран в DOS Navigator (IBM PC). Зато моя программа "дешевле" - всего 59 байт.

Предлагаемая процедура предназначена для монохромного экрана, так как не использует дополнительной памяти для буфера. С экрана удаляются только атрибуты, а сама картинка -остается. Например, она может использоваться в появляющихся в последнее время резидентных "расширителях" функций встроенного БЕЙСИК-редактора. Программа легко может быть переделана и для цветного экрана (об этом см. ниже).

Полоски получаются так: в каком-либо знакоместе включается атрибут (PAPER 5; INK 5) и через 18 тактов процессора выключается (PAPER 0; INK 0). За это короткое время SPECCY не успевает закрасить весь квадрат атрибутов (8x8), а успевает только прорисовать полоску 8x1 пиксель.

При выходе из процедуры восстанавливаются атрибуты из ATTR_P (23693), а цвет бордюра - из BORDER (23693).

1

ORG

50000

2 TIME

EQU

12

3 LINES

LD

A,(23673)

4

CP

TIME

5

RET

C

6

XOR

A

7

LD

(23560),A

8

OUT

(# FE) , A

9

CALL

FILL

10

LD

D, A

11 LOOP

LD

HL,22530

12

ADD

HL, DE

13

ADD

HL, DE

14

ADD

HL, DE

15

LD

(HL),45

16

INC

E

17

LD

A, (23560)

18

AND

A

19

LD

(HL),D

20

JR

Z, LOOP

21

LD

HL,255

22

LD

E, L

23

CALL

#03B5

24

LD

A, ( 23693)

25 FILL

LD

HL,22528

26

LD

DE, 22529

27

LD

BC,767

28

LD

(HL),A

29

LDIR

30

XOR

A

31

LD

(23673),A

32

RET

Вызывающая программа после каждого нажатия клавиши должна обнулять содержимое ячейки 23673 (второго байта FRAMES). Периодически вызывая подпрограмму LINES, надо проверять флаг CARRY; если он выключен - то экран в дежурном режиме, если включен - то нет.

Для демонстрационного запуска процедуры "Lines" дополните листинг, приведенный выше, следующими строками (точка входа ENT, учитывая длину процедуры LINES, будет соответствовать адресу 50059): 33 ;EXAMPLE

34

;-----

35

ENT

$

36

CALL

#0D6B

37

LD

A, 2

38

CALL

#1601

39

IIN

XOR

A

40

LD

(23673),A

41

RES

5,(IY+1)

42

WAIT

CALL

LINES

43

JR

NC,IIN

44

BIT

5,(IY+1)

45

JR

Z , WAI T

46

LD

A, (23560)

47

CP

32

48

RET

Z

49

RST

#10

50

JR

IIN

Этот фрагмент аналогичен приведённому для процедуры "Звёзды" в указанном выше номере ZX-РЕВЮ. Продемонстрировать работу процедуры поможет Бейсик-программа (автостарт со 2 строки):

1 GO ТО 10

2 BORDER 1: PAPER 1: INK 7: CLEAR 4 9999

3 RANDOMIZE USR 15619: REM : LOAD "lines1" CODE 10 BEEP .1,20: RANDOMIZE USR 50059

После старта Вы услышите звуковой сигнал. Наберите на экране что-нибудь, пользуясь цифровыми и буквенными клавишами, а также клавишей ENTER. Не трогайте клавиатуру 1 минуту - программа перейдет в дежурный режим. Теперь нажмите любую клавишу - изображение восстановится. Для завершения работы - нажмите SPACE или BREAK.

Шестнадцатеричный дамп процедуры (с демонстрационным блоком строки 33-50 - файл "lines" CODE 50000,95):

C350

3A

79

5C

FE

0C

D8

AF

32

E5

C358

08

5C

D3

FE

CD

7A

C3

57

B1

C360

21

02

58

19

19

19

36

2D

4C

C368

1C

3A

08

5C

A7

72

28

F0

16

C370

21

FF

00

5D

CD

B5

03

3A

6F

C378

8D

5C

21

00

58

11

01

58

07

C380

01

FF

02

77

ED

B0

AF

32

3A

C388

79

5C

C9

CD

6B

0D

3E

02

6E

C390

CD

01

16

AF

32

79

5C

FD

EA

C398

CB

01

AE

CD

50

C3

30

F3

D8

C3A0

FD

CB

01

6E

28

F5

3A

08

F9

C3A8

5C

FE

20

C8

D7

18

E4

00

80

Если в разных местах экрана атрибуты различны, то появляется необходимость в буфере на 768 байт для хранения атрибутов. Переброску 768 байт файла атрибутов с экрана в буфер нужно вставить вместо CALL FILL в 9 строке. А обратную переброску для восстановления - вместо строк 25-29.

************************************************************************************* © Pentagram Software, 1995.

Атрибутный скроллер

Эта программа предназначена для вывода текста крупной бегущей строкой в нижней трети экрана. Программа работает со вторым режимом прерывания и предназначена для программ-"музыкалок". Этот скроллер был впервые написан RAF (Польша, Вроцлав), затем им пользовался.

ЭТЮДЫ

ЭТЮДЫ

Bill Gilbert в программе ТОР 128'2, из которой он перекочевал в программы, которые создавали KLAV и Vasilyev Anton (в частности, MSX 1-8, Mega Sound). Я взломал программу Bill Gilbert'a и " вытащил" этот скроллер.

; Attribut IM2-scroller ; Writing by RAF

; Cracked by PENTAGRAMM SOFTWARE ; Kherson, 1995

ORG 52 000 ENT $ DI

LD HL,#4000 ; Очистка экрана.

LD DE, #4001 LD BC,#1AFF LD (HL),L LDIR XOR A OUT (# FE) ,A CALL INIT LD A, 1 ; Вектор прерывания, его можно ; менять, но тогда надо менять ; адрес во втором ORG.

LD I, A ; Включение режима IM 2. IM 2 EI

LOOP HALT

LD A,#7 F ; Опрос клавиатуры.

IN A,(#FE) RRA

JR C, LOOP IM 1 ; 3авершение программы. RET

INIT LD HL,TEXT

LD (CONLET),HL LD A, 2 LD HL,BUFF ; Очистка буфера хранения символа. LD DE, BUFF+1 LD BC,7 LD (HL),0 LDIR

LD (LAB1),A LD A,#81 LD (LAB2),A LD HL,#5000 LD DE, #5001 LD BC,#07FF LD (HL),#FF

ЭТЮДЫ

LDIR

SUB

A

LD

C, A

LD

B, #80

LD

DE,#5B0 0

PUSH

AF

PUSH

BC

CALL

#22B0

EX

DE, HL

LD

(HL),E

INC

HL

LD

(HL),D

INC

HL

EX

DE, HL

POP

BC

POP

AF

INC

A

LOOP1

RET

DEFW

0

DEFS

8

для символа.

LOOP1

DJNZ

CONLET BUFF ; Буфер

LAB1 DEFB

LAB2 DEFB

STK1 DEFW

LD A,(LAB1)

DEC A

CALL Z,SCR1

LD (LAB1),A

CALL SCR3

CALL SCR4

CALL SCR5 RET

LD HL,(CONLET)

LD A,(HL)

CP #FF

CALL Z,SCR2

INC HL

LD (CONLET),HL

LD L, A

LD H, 0

LD DE, ( #5C3 6)

SCROLL

SCR1

; Адрес

CHARS.

ADD

HL,

HL

ADD

HL,

HL

ADD

HL,

HL

ADD

HL,

DE

LD

DE,

BUFF

LD

BC,

8

LDIR

LD

8

<

RET

ЭТЮДЫ

SCR2 LD HL,TEXT

LD A,(HL) RET

SCR3 LD HL,#5A01

; Адрес в файле атрибутов, ; которого начинается ; скроллирование.

с

LD

A, 8

PUSH

HL

LD

D, H

LD

E, L

DEC

DE

LD

BC, 31

LDIR

LD

(HL),0

POP

HL

LD

DE, 32

ADD

HL, DE

DEC

A

JR

NZ,LOOP2

RET

LD

IX,BUFF

LD

DE, 32

LD

HL,#5A1F

LD

B, 8

RL

(IX+0)

PUSH

AF

SBC

A, A

OR

2

LD

(HL),A

ADD

HL, DE

DEC

HL

POP

AF

JR

NC,SKIP1

LD

A,(HL)

CP

#FF

JR

Z, SKIP1

RES

1,(HL)

INC

HL

INC

IX

DJNZ

LOOP3

RET

LD

HL,#5700

в дисплейном файле.

LD

(STK1),HL

LD

IX, LAB2

CALL

SCR6

CALL

SCR6

CALL

SCR6

RLC

(IX+0)

RLC

(IX+0)

RLC

(IX+0)

LOOP2

SCR4

LOOP3

SKIP1

SCR5 ; Адрес

ЭТЮДЫ

RLC (IX+0) RET

LD (STK2+1),SP

LD SP,(STK1)

LD B, 0

LD E, (IX+0)

LD D, E

PUSH DE

DJNZ LOOP4

LD (STK1),SP

LD SP,0 RET

DEFM "PENTAGRAM "

DEFM "SOFTWARE "

DEFM "PRESENTS "

DEFM "MEGA "

DEFM "SCROLL "

DEFB #FF ; Маркер конца текста.

ORG 52818 ; Адрес по вектору прерываний.

PUSH AF

PUSH BC

PUSH DE

PUSH HL ; Процедура обработки ; прерывания.

SCR6

LOOP4

STK2 TEXT

PUSH

IX

CALL

SCROLL

POP

IX

POP

HL

POP

DE

POP

BC

POP

AF

JP

#0038




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
События - анонс и правила предстоящего Фестиваля компьютерного творчества Hardwave Demoshow2002.
Энкицлопедия - крякология Codebusters (полный список кряков).
Презент - о приложении газеты.
Юмор - Для начала паpочку анекдотов.
От редакции - С Новым годом! Воспоминания о старых добрых временах.

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