ZX-Ревю 1995 №1 1994 г.

Этюды - несколько слов по поводу запуска прерываний 2 рода.


ЭТЮДЫ

Параметры измененного кодов будут следующими:

00451 PUSH AF

00452 RLA

00453 OR С

00454 LD С,A

00455 POP AF

Следует сказать несколько слов по поводу запуска прерываний 2 рода. В строках 80 и 150 задается старший байт адреса, то есть при прерывании произойдет переход по адресу, заданному в &30FF. Там (в ПЗУ) будет считан адрес ФЕВЗО, то есть 60208. В связи с таким способом запуска, эта программа не пойдет на компьютерах, в которых некорректно обрабатываются прерывания 2 рода - для них придется организовывать 257-байтовый буфер в свободной области памяти так, как это обычно делается для обеспечения совместимости (см. например, гХ-РЕВЮ-94, N4, стр.52).

Кроме того, при тестировании неудобен тот факт, что программа состоит фактически из четырех кусков (с адресов 40000, 41000, 42000 и 60208). Последний блок, кстати, совпадает с кодами широко распространенного ассемблера ZEUS, из-за чего становится затруднительно его использование. С целью создания компактного блока кодов можем порекомендовать следующие изменения:

00020 ORG

00080 LD

00150 LD

00130 ;

00140 CONT DX

00200 ;

00210 STOP DI

00250 ;

В ячейке f03FF ПЗУ будет считан адрес Ф986С, а адрес в единственной директиве ORG в 20 строке рассчитан таким образом, что

38986 А,#03 А,#03

Start of object: #984А (38986) Length : #009Е (00158)

Executes : #984А (38986)

Шестнадцатиричный дамп блока для тестирования б/с:

984А

F3

ЗЕ

80

32

С8

98

СВ

9852

98

22

С9

98

ЗЕ

03

ED

47

985А

ED

FB

С9

F3

ЗЕ

03

ED

22

9862

47

ED

FB

С9

F3

ED

46

76

986А

FB

С9

F5

С5

D5

Е5

С9

2D

9872

98

26

00

29

29

29

ED

987А

36

19

ЕВ

01

08

20

9882

21

1F

40

ЗА

С8

98

F5

С5

ЕЕ

988А

Е5

4F

F5

17

В1

4F

F1

6D

9892

А1

2F

FE

FF

СВ

16

10

13

989А

FB

Е1

С1

F1

24

13

0D

20

24

98А2

Е5

0F

32

С8

98

FE

80

СС

98АА

ВЗ

98

Е1

D1

С1

F1

СЗ

38

ЕС

98В2

00

С9

98

23

В7

28

55

98ВА

04

22

С9

98

С9

СВ

98

2F

98С2

22

С9

98

Е1

18

Е4

80

CD

07

98СА

98

CD

98

42

79

20

4F

F5

98D2

65

67

20

59

61

6F

58

98DA

76

73

69

79

20

31

39

32

98Е2

39

34

20

20

20

00

00

00

47

(С) Сергей Каминский,

г.Минск, 1995.

Предлагаю программу, выполняющую спрайтовый скроллинг для спрайтов размером 2x2 знакоместа. По существу это бегущая строка с символами повышенного качества. Такая строка смотрится гораздо приятнее, чем предложенная в ZX-PEBI0-94, N1, стр.48. Правда, для нее нужен специально сформированный символьный набор в спрайтовом формате, но, я думаю, что у каждого пользователя, который немного разбирается с кодами, найдется спрайт-editor, в котором можно нарисовать все буквы и составить из них символьный набор. Последний будет иметь длину 76Р*4«3072 байта.

ЭТЮДЫ

00001

; SPRITE SCROLL

00560

JR

NZ,NEXTA

00002

; (с)

MASTSOFT * 1994

00570

LD

HL„TEXT

00010

ORG

40000

00580.

LD

(TEXTP),HL

00020

ENT

00590

JR

NEXTB

00030

CALL

INIT

00600 NEXTA

INC

HL

00040

CALL

SCROLL

00610

LD

(TEXTP),HL

00050

RET

00620 NEXTB

SUB

32

00060

INIT

LD

HL,BUF1

00630

LD

H,0

00070

LD

DE,BUF1+1

00640

LD

L,A

00080

LD

ВС,31

00650

ADD

HL,HL

00090

LD

(HL),0

00660

ADD

HL,HL

00100

LDIR

00670

ADD

HL,HL

00110

LD

HL,TEXT

00680

ADD

HL,HL

00120

LD

(TEXTP),HL

00690

ADD

HL,HL

00130

LD

HL,41000

00700

LD

DE,(FONT)

00140

LD

(FONT),HL

00710

ADD

HL,DE

00150

LD

A,16

00720

LD

DE,BUF1

00160

LD

(COL),A

00730

LD

ВС, 32

00170

RET

00740

LDIR

00180

SCROLL

LD

A,(COL)

00750

RET

00190

CP

0

00760 COL

DEFB

16

00200

JR

Z,LDCOL

00770 TEXTP

DEFW

TEXT

00210

DEC

A

00780 FONT

DEFW

41000

00220

LD

(COL),A

00790 BUF1

DEFS

32

00230

JR

NEXT

00800 TEXT

DEFM

"Copyright"

00240

LDCOL

CALL

LDIRB

00810

DEFM

H by H

00250

LD

A, 16

00820

DEFM

"MASTSOFT "

00260

LD

(COL),A

00830

DEFM

"1994"

00270

NEXT

LD

HL,#50DF

00840

DEFB

255

00280

LD

IX,BUF1+1

00290

LD

B, 2

Start of object: #9C40 (40000)

00300

LOOP

PUSH

ВС

Length

: #00D7 (00215)

00310

PUSH

HL

Executes

: #9C40 (40000)

00320

LD

B, 8

00330

LOOPl

PUSH

ВС

Остается только добавить, как

00340

PUSH

HL

запускать этот

блок

из Бейсика

00350

RL

(IX+0)

(подсказка для

начинающих):

00360

RL

(IX-1)

00370

LD

B, 32

10 RANDOMIZE

USR 40000:

00380

LOOP 2

RL

(HL)

REM Инициализация переменных

00390

DEC

HL

20 RANDOMIZE

USR 40003:

00400

DJNZ

LOOP 2

REM Скроллинг' на 1 пиксел

00410

POP

HL

30 PAUSE 1:

GO TO

20

00420

POP

ВС

00430

INC

IX

Да, кстати,

не забудьте загру-

00440

INC

IX

зить Ваш символьный

набор по ад-

00450

INC

H

ресу 41000 или

по тому, который

00460

DJNZ

LOOPl

будет установлен в переменной

00470

POP

HL

FONT.

00480

POP

ВС

00490

LD

DE,#20

Несколько слое хотим добавить

00500

ADD

HL,DE

все же по поводу символьного на

00510

DJNZ

LOOP

бора. Конструирование его при по

00520

RET

мощи редактора спрайтов по нашему

00530

LDIRB

LD

HL,(TEXTP)

мнению неудобно. Поэтому можно

00540

LD

A,(HL)

поступить проще

. Сначала, при по-

00550

CP

#FF

мощи ARTSTUDIO>

изображаем все

этюды

символы символьного набора в масштабе 2x1, начиная с левого верхнего угла экрана так, как это показано на рисунке (в меню Text включены опции: Double height, Double width, Snap hrz., Snap urt):

01234-56789: ; < = >? 0flBCDEFGHIJKLMNO PORSTUUUXYZ Z1 +_ £abcdefghi J кimno pqrStUVWXyZ-C I У

Этот рисунок берем за основу. Телерь можно редактировать каждый символ на экране, пользуясь лупой. Надо только следить за соблюдением границ символов, чтобы не выйти ненароком за 16x16 пикселов. Уместно, по-видимому, будет включение сетки (Grid) размером 2x2. После того, как все символы, благодаря Вашим стараниям, приобретут желаемый вид, сохраните рисунок под именем, скажем, »fnt.scr

Теперь потребуется несложный перекодировщик для преобразования экранного файла в символьный набор спрайтового формата. Вот он:

2 BORDER 7: PAPER 7: INK 0: С LEAR 40999: GO TO 100

20 FOR c=d TO d+31 STEP 2 22 FOR b=»c TO d+31*2 STEP 32 24 FOR a»b TO b+7*256 STEP 256 26 LET x«PEEK a: POKE e,x: LET e-e+1: LET x«PEEK (a+1): POKE e ,x: LET e-e+1: POKE a,0: POKE (a +1),0

28 NEXT a: NEXT b: NEXT c: RET URN

100 LET e=41000 200 LOAD "fnt.scr"CODE 16384 1000 FOR d=16384 TO 16576 STEP 6 4: GO SUB 20: NEXT d

1010 FOR d=18432 TO 18528 STEP 6

4: GO SUB 20: NEXT d

2000 SAVE "fnt"CODE 41000,768*4

После старта загружается карг тинка "fnt.scr", затем начинается процесс формирования из нее символьного набора в спрайтовом формате. После чего готовый символьный набор будет сохранен в файле "fnt" CODE 41000,3072.

И, в заключение, как обычно, шестнадцатиричный дамп блока кодов.

9С40

CD

47

CD

66

9C

C9

21

45

9С48

DC

11

DD

9C

01

IF

00

06

9С50

36

00

ED

ВО

21

FC

9C

22

9A

9С58

D8

21

28

AO

22

DA

9C

E9

9С60

ЗЕ

10

32

D7

9C

C9

ЗА

D7

C9

9С68

FE

00

28

06

3D

32

D7

12

9С70

18

08

CD

AB

9C

ЗЕ

10

2A

9С78

32

D7

21

DF

50

DD

21

07

9С80

DD

06

02

C5

E5

06

08

55

9С88

С5

Е5

DD

СВ

00

16

DD

CB

34

9С90

FF

16

06

20

CB

16

2B

10

83

9С98

FB

Е1

С1

DD

23

DD

23

24

F5

9СА0

10

Еб

Е1

CI

11

20

00

19

IE

9СА8

10

DA

С9

D8

9C

7E

FE

11

9СВ0

FF

20

08

21

FC

9C

22

D8

26

9СВ8

18

04

23

22

D8

9C

D6

9B

9СС0

20

26

00

6F

29

29

29

29

B5

9СС8

29

ED

DA

9C

19

11

DC j 51

9CD0

01

20

00

ED

BO

C9

10

9F

9CD8

FC

28

AO

00

00

00

00

D4

9СЕ0

00

00

00

00

00

00

00

00

9СЕ8

00

00

00

00

00

00

00

00.

84

9CF0

00

00

00

00

00

00

00

00

8C

9CF8

00

00

00

00

43

6F

70

79

2F

9D00

72

69

67

68

74

20

62

79

B6

9D08

20

4D

41

53

54

53

4F

46

E2

9D10

54

20

31

39

39

34

FF

00

F7

(С) Юрий Алехин,

г.Запорожье, 1995.

Предлагаю пятиканальный генератор звука.

С адреса NUS-31000 должен находиться блок данных. Группы по 5 байтов: значение частоты для 1 канала, затем для 2 и т.д.

Выход из программы происходит, если в 1 канале встретился код 255.

ЭТЮДЫ

00010

ORG

40000

00590

OUT

(254),A

00020

ENT

00600

ET3

DEC

(IX+3)

00030

MUS

EQU

31000

00610

LD

A,(IX+3)

00040

LD

HL,MUS

00620

OR

NZ,ET4

00050

CALL

NEXT

00630

LD

A,24

00060

RET

00640

OUT

(254),A

00070

;

00650

LD

A,(V4)

00080

NEXT

LD

A,(HL)

00660

LD

(IX+3),A

00090

CP

255

00670

XOR

A

00100

RET

Z

00680

OUT

(254),A

00110

LD

(VI),A

00690

ET4

DEC

(IX+4)

00120

INC

HL

00700

LD

A,(IX+4)

00130

LD

A,(HL)

00710

OR

NZ,ET5

00140

LD

(V2),A

00720

LD

A,24

00150

INC

HL

00730

OUT

(254),A

00160

LD

A,(HL)

00740

LD

A,(V5)

00170

LD

(V3),A

00750

LD

(IX+4),A

00180

INC

HL

00760

XOR

A

00190

LD

A,(HL)

00770

OUT

(254),A

00200

LD

(V4),A

00780

ET5

DEC

HL

00210

INC

HL

00790

LD

A,H

00220

LD

A,(HL)

00800

OR

L

00230

LD

(V5),A

00810

OR

NZ,LOOP

00240

INC

HL

00820

EI

00250

PUSH

HL

00830

RET

00260

CALL

BEEP

00840

>

00270

POP

HL

00850

VI

DEFB

0

00280

OP

NEXT

00860

V2

DEFB

0

00290

*

00870

V3

DEFB

0

00300

BEEP

DI

00880

V4

DEFB

0

00310

LD

IX,COUNT

00890

V5

DEFB

0

00320

LD

HL,(TIME)

00900

TIME

DEFB

9

00330

LOOP

DEC

(IX+0)

00910

DEFB

9

00340

LD

A,(IX+0)

00920

COUNT

DEFB

0

00350

JR

NZ,ET1

00930

DEFB

0

00360

LD

A,24

00940

DEFB

0

00370

OUT

(254),A

00950

DEFB

0

00380

LD

A,(VI)

00960

DEFB

0

00390

LD

(IX+0),A

00400

XOR

A

Start

of object: #9C40 (40000)

00410

OUT

(254),A

Length

: #OOAF (00175)

00420

ET1

DEC

(IX+1)

Executes

: #9C40 (40000)

00430

LD

A,(IX+1)

00440

OR

NZ,ET2

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

дамп блока:

00450

LD

A,24

00460

OUT

(254),A

9C40

21

18 79

CD 47

9C C9 7E

85

00470

LD

A,(V2)

9C48

FE

FF C8

32 E3

9C 23 7E

FB

00480

LD

(IX+1),A

9C50

32

E4 9C

23 7E

32 E5 9C

F2

00490

XOR

A

9C58

23

7E 32

E6 9C

23 7E 32

00500

OUT

(254),A

9C60

E7

9C 23

E5 CD

6B 9C El

3C

00510

ET2

DEC

(IX+2)

9C68

C3

47 9C

F3 DD

21 EA 9C

21

00520

LD

A,(IX+2)

9C70

2A

E8 9C

DD 35

00 DD 7"E

27

00530

OR

NZ,ET3

9C78

00

20 OD

3E 18

D3 FE ЗА

A2

00540

LD

A,24

9C80

E3

9C DD

77 00

AF D3 FE

6F

00550

OUT

(254),A

9C88

DD

35 01

DD 7E

01 20 OD

CO

00560

LD

A,(V3)

9C90

3E

18 D3

FE ЗА

E4 9C DD

EA

00570

LD

(IX+2),A

9C98

77

01 AF

D3 FE

DD 35 02

40

00580

XOR

A

9CA0

DD

7E 02

20 OD

3E 18 D3

EF

ЭТЮДЫ

полнить, загрузив по адресу 31000 произвольный блок кодов (или еще проще: обнулить второй и третий байты блока кодов, то есть задать MUS-0). При этом, правда, вместо мелодии будет нечто неопределенное, но можно примерно оценить генерируемый «звук.

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

9СА8:

FE

ЗА

Е5

DD

77

02

AF

:02

одной ноты и вызывать ее, исполь

9СВ0:

D3

FE

DD

35

03

DD

03

: 90

зуя счетчик прерываний. Если пой

9СВ8:

20

0D

ЗЕ

18

D3

FE

ЗА

Еб

:С8

ти еще дальше, то стоит подумать

9СС0:

DD

77

03

AF

D3

FE

DD

:АС

о том, как кодировать мелодию -

9СС8:

35

04

DD

04

20

0D

ЗЕ

: 67

это уже отдельная проблема, но в

9CD0:

18

D3

FE

ЗА

Е7

DD

77

:бб

результате может получиться пяти-

9CD8:

04

AF

D3

FE

В5

20

: 74

канальный музыкальный редактор...

9СЕ0:

92

FB

С9

00

00

00

00

00

:D2

В общем, Вы видите, что процесс

9СЕ8:

09

09

00

00

00

00

00

00

: 96

совершенствования бесконечен. А в основе его все же останется блок

Кстати, тестирование

можно

вы—

кодов, который предложил Юрий.

Следующее письмо мы адресуем владельцам 128К компьютеров.

(С) М.Л.Плетнев (UGL SOFT LTD),

г.Великие Луки, Псковская обл.

Предлагаю Вашему вниманию доработанную процедуру м3анавесм, опубликованную в ZX-PEBD-94, N4, стр.38. Доработанная версия, мне кажется, больше похожа на занавес. Сначала штора опускается, затем за шторой "рисуется" картинка, штора поднимается и - картинка на экране. Скорость шторы можно регулировать в широких пределах, изменяя число в строке 70. Чем больше число, тем больше скорость . Цвет шторы задается в строках 80 и 90.

00010

ORG

40000

00020

ENT

00030

PORT

EQU

#7FFD

Порт управления страницами

00040

SCR

EQU

#4000

Видео-ОЗУ.

00050

SCR 2

EQU

#C000

Второе видео-ОЗУ.

00060

PIC

EQU

# E000

Адрес картинки.

00070

TIM

EQU

30

Скорость шторы.

00080

COLORP

EQU

9

Цвет шторы (PAPER).

00090

COLORB

EQU

1

Цвет шторы (BORDER).

00100

DI

00110

LD

HL,SCR

Делаем экран черным.

00120

LD

DE,SCR+1

00130

LD

ВС,#1AFF

00140

LD

(HL),L

00150

LDIR

00160

XOR

A

00170

OUT

(#FE),A

00180

LD

ВС,PORT

00190

LD

A,#17

00200

OUT

<C),A

00210

LD

HL,SCR2

Штора - синяя..

00220

LD

DE,SCR2+1

00230

LD

BC,#1AFF

00240

LD

(HL),COLORP

ЭТЮДЫ

00250

LDIR

00260

*

++++++++++++ Закрываем штору ++++++++++++

00270

LD

ВС,PORT

00280

LD

A,#10

00290

OUT

(C),A

00300

LD

HL, 1

00310

LI

EI

Ждем кадровый импульс.

00320

HALT

00330

DI

00340

LD

A,COLORB

Рисуем штору.

00350

OUT

(#FE),A

00369

LD

A,#18

00370

OUT

(C),A

00380

PUSH

HL

Ждем

00390

POP

DE

(в HL - время).

00400

L2

DEC

DE

00410

LD

A,D

00420

OR

E

00430

JR

NZ,L2

00440

XOR

A

Рисуем пустоту.

00150

OUT

(#FE), A

00460

LD

A,#10

00470

OUT

(C),A

00480

LD

DE,TIM

Увеличиваем время.

00490

ADD

HL,DE

005Q0

LD

A,H

005'10

CP

9

Если штора не закрыта,

00520

JR

HZ, LI

то повтор.

00530

LD

A,COLORB

00540

OUT

(#FE),A

00550

LD

A,#18

00560

OUT

(C),A

00570

LD

HL,PIC

"Кидаем" картинку

00580

LD

DE,SCR

под штору.

00590

LD

BC,#1B00

00600

LDIR

00610

++++++++++++ Открываем

штору ++++++++++++

00620

LD

ВС,PORT

00630

LD

HL,#900

00640

L3

EI

Ждем кадровый импульс.

00650

HALT

00660

DI

00670

LD

A,COLORB

Рисуем штору.

00680

OUT

(#FE),A

00690

LD

A,#18

00700

OUT

(C),A

00710

PUSH

HL

Ждем

00720

POP

DE

(в HL - время).

00730

L4

DEC

DE

00740

LD

A,D

00750

OR

E

00760

JR

NZ ,L4

00770

XOR

A

Рисуем картинку.

00780

OUT

(#FE),A

00790

LD

A,#10

00800

OUT

(C),A

00810

LD

DE,TIM

Уменьшаем время.

00820

OR

A

ЭТЮДЫ

Start of object: #9C40 (40000) Length : #0093 (00147)

Executes : #9C40 (40000)

Шестнадцатиричный данп прог-

ранпы,

9С40:

F3

21

00

40

11

01

40

01

: 83

9С48:

FF

75

ED

ВО

AF

D3

FE

: 8F

9С50:

01

FD

7F

ЗЕ

17

ED

79

21

: 45

9С58:

00

СО

11

01

СО

01

FF

: АО

9С60:

36

09

ED

ВО

01

FD

7F

ЗЕ

: 93

9С68:

10

ED

79

21

01

00

FB

76

: 0D

9С70:

F3

ЗЕ

01

D3

FE

ЗЕ

18

ED

: 52

9С78:

79

Е5

D1

ВЗ

20

FB

:А6

9С80:

AF

D3

FE

ЗЕ

10

ED

79

11

: 61

9С88:

00

19

FE

09

20

DE

:DC

ЗЕ

01

D3

FE

ЗЕ

18

ED

79

:F8

21

00

Е0

11

00

40

01

00

: 87

ED

ВО

01

FD

7F

21

00

: 92

09

FB

76

F3

ЗЕ

01

D3

FE

:С1

ЗЕ

18

ED

79

Е5

D1

: 53

ВЗ

20

FB

AF

D3

FE

ЗЕ

10

: F0

ED

79

11

00

В7

ED

52

:Е7

В5

28

05

FE

FF

20

:5В

D8

FB

С9

00

00

00

00

00

: 08

M.Л.Плетнев просит напечатать его телефон и надеется, Что у него появятся новые друзья:

(53) 3-03-90 г.Великие Луки, Псковская обл.

00830

SBC

HL,DE

00840

LD

A,H

00850

OR

L

Если штора открыта,

00860

OR

Z,L5

то переход.

00870

LD

A,H

Иначе - повторяем.

00880

CP

#FF

00890

OR

NZ,L3

00900 L5

EI

Выход из процедуры.

00910

RET




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Мы выбираем - О компьютере "Compact-128".
Hints - секреты, читы и хитрости в играх: Super Cars, Net Walk.
Сетевые новости - о действующих на текущий момент BBS.
Black Metal - Для фанатов Black Metal, лучшая десятка.
Сладкие - одиночество.

В этот день...   16 апреля