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

Читатель-читателю - нестандартный загрузчик со счётчиком.


ЧИТАТЕЛЬ-ЧИТАТЕЛЮ

A

(#FC1A),A IX,#FC21 DE,#0011 A

#FC8A NC,#FE81 #FE0F A,#01 (#FC1A),A IX,(#FC2E) DE,(#FC2C) A, #FF

#FE81

XOR

LD

LD

LD

XOR

SCF

CALL

JR

CALL

LD

LD

LD

LD

LD

SCF

CALL

JR

EI

RET

3P

#FC8A NC,#FEAC

#FEAC

#053F

Загрузка блока кодов без заголовка осуществляется нестандартной процедурой по адресу #FC8A. При первом ее вызове считывается хэдер в адрес #FC21. При следующем - загружается массив кодов. Эта процедура (#FC8A) похожа на процедуру загрузки ПЗУ LDJBYTES, (#0556 или 01366), но есть определенные различия.

LD-BYTES

INC D

EX AF,AF'

FC8A FC8B FC8C FC8D

DEC D DI

FC8E FC8F FC91

FC92 FC94 FC96 FC98 FC99 FC9B FC9D FC9E FC9F FCA0 FCA3 FCA5 FCA8 FCAA FCAB FCAC FCAD'

Далее, для того, чтобы при загрузке хэдера не включался счетчик, введены строки:

Далее опять

LD-BREAK LD-START

LD-WAIT

EXX

LD

c,#oo

EXX

аналогично ПЗУ:

LD

A, #0A

OUT

(#FE),A

IN

A,(#FE)

RRA

AND

#20

OR

#00

LD

C,A

CP

A

RET

NZ

CALL

LD-EDGE-1

OR

NC,LD-BREAK

LD

HL-, #0415

DJNZ

LD-WAIT

DEC

HL

LD

A,H

OR

L

aR

NZ,LD-WAIT

FCAF

CALL

LD-EDGE-2

FD09

CP

В

FCB2

JR

NC,LD-BREAK

FDOA

RL

L

FCB4

LD-LEADER

LD

B,#9C

FDOC

LD

в,#во

FCB6

CALL

LD-EDGE-2

FDOE

JP

NC,LD-8-BITS

FCB9

JR

NC,LD-BREAK

FD11

LD

А,Н

FCBB

LD

A,#C6

FD12

XOR

L

FCBD

CP

В

FD13

LD

Н,А

FCBE

JR

NC,LD-START

FD14

LD

A,D

FCCO

INC

H

FD15

OR

Е

FCC1

JR

NZ,LD-LEADER

FD16

JR

NZ,LD-LOOP

FCC3

LD-SYNC

LD

B,#C9

FD18

LD

A,H

FCC5

CALL

LD-EDGE-1

FD19

CP

#01

FCC8

JR

NC,LD-BREAK

FD1B

RET

FCCA

LD

А,В

FCCB

CP

#D4

Программы LD-EDGE-

-2 И LD-ED-

FCCD

JR

NC,LD-SYNC

GE-1

изменены следующим образом:

FCCF CALL LD-EDGE-1

FCD2

RET

NC

FD1C LD-EDGE-

2 CALL LD-EDGE-1

FD1F

RET

NC

Опять.

, ДЛЯ

того

, чтобы при

FD20 LD-EDGE-

1 JP

PICTO

загрузке

хэдера не включался

FD23

INC

B

счетчик,

поставлен выключатель:

FD24

RET

z

FD25

LD-

A, #7F

FCD3

EXX

FD27

IN

A,(#FE)

FCD4

LD

A,(#FC1A)

FD29

RRA

FCD7

LD

С,A

FD2A

RET

NC

FCD8

LD

(#FC1F),A

FD2B

XOR

С

FCDB

EXX

FD2C FD2E

AND JR

#20

Z,LD-SAMPLE

Далее

- аналогично ПЗУ:

Описание работы LD-SAMPLE так

FCDC

LD

H,#00

же можно найти

в указанном ZX-PE-

FCDE

LD

B,#B0

ВЮ. Отличия:

FCEO

JR

LD-MARKER

FCE2

LD-

-LOOP

EX

AF,AF'

FD30

LD

А,С

FCE3

JR

NZ,LD-FLAG

FD31

CPL

FCE5

JR

NC,LD-VERIFY

FD32

LD

С,A

FCE7

LD

(IX+0),L

FD33

LD

(#5AFE),A

FCEA

JR

LD-NEXT

FD36

LD

(#5AFF),A

FCEC

LD-

-FLAG

RL

С

FCEE

XOR

L

- если в отведенное время фронт

FCEF

RET

NZ

импульса найден,

инвертируются

FCFO

LD

А,С

все биты на противоположные и вы

FCF1

RRA

дается значение аккумулятора в

FCF2

LD

С,A

две последние

ячейки атрибутов.

FCF3

INC

DE

Это приводит к

тому,

что при заг-

FCF4

JR

LD-DEC

руэке в двух '

последних знакомее-

FCF6

LD-

•VERIFY

LD

A, (IX+0)

тах можно наблюдать

полосы, ана-

FCF9

XOR

L

логичные бордюрным

(сам бордюр

FCFA

RET

NZ

при загрузке остается черным).

FCFB

LD-NEXT

INC

IX

Далее:

FCFD

LD-

•DEC

DEC

DE

FCFE

EX

AF,AF'

FD39

SCF

FCFF

LD

B,#B2

FD3A

RET

FD01

LD-

•MARKER

LD

L, #01

FD3B PICTO

EXX

FD03

LD-

•8-BITS

CALL

LD-EDGE-2

FD3C

LD

А,С

FD06

RET

NC

FD3D

OR

А

FD07

LD

A,#CB

FD3E

JR

Z,LD-DELAY

ЧИТАТЕЛЬ-ЧИТАТЕЛЮ

- если в С ноль, то счетчик не включать. Иначе - проверка положения счетчика:

LD HL,#FC1F

DEC (HL)

LD A,(HL)

JR Z,SHET

FD47 FD49 FD4B

СР OR LD

Далее происходит включение атрибутов счетчика, а в HL - адрес счетчика в таблице:

#05

NC,ATT-R HL,#FC1B

FD70 FD71 FD72 FD73 FD74 FD75 FD76 FD77 FD78 FD79 FD7A FD7B FD7C FD7D

INC

INC

LD

LD

INC

INC

LD

LD

INC

INC

LD

LD

EXX

JP

FD40 FD43 FD44 FD45

E H

A,(DE) (HL),A E H

A,(DE) (HL),A E H

A,(DE) (HL),A

LD-SAMPLE

Далее - фрагмент осуществляю-

Теперь

переход

на адреса в

сора:

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

FD80

LD-DELAY

LD

B, #17

FD4E

INC

(HL)

FD82

WAIT-1

DJNZ

WAIT-1

FD4F

INC

L

FD84

LD

A,#00

FD50

INC

L

FD86

NEG

FD51

DEC

(HL)

FD88

AND

A

FD52

LD

HL,(#FC1B)

FD89 FD8A

EXX JP

LD-SAMPLE

Дальнейшая часть вычисляет адрес печатаемой цифры:

Затем - установка атрибутов знакоместах счетчика:

FD55

LD A,(HL)

FD56

ADD

A,#32

FD8D

ATT-R

LD

A,#47

FD58

LD

E,A

FD8F

LD

(#5AFA),A

FD59

LD

D,#FC

FD92

LD

(#5AFB),A

FD95

LD

(#5AFC),A

Следующий фрагмент рисует шаб

FD98

LD

(*5AFD),A

лон, лежащий в

таблице по адресам

FD9B

INC

HL

#FC32 - #FC89:

FD9C

INC

HL

FD9D

LD

B,#0D

FD5B

LD

HL,(#FC1D)

FD9F

JP

WAIT-1

FD5E

LD

A,(DE)

FD5F

LD

(HL),A

Далее следует процедура SHET

FD60

INC

E

FD61

INC

H

FDA2

SHET

LD

B,#4F

FD62

LD

A,(DE)

FDA4

LD

DE,(#FC16)

FD63

LD

(HL),A

FDA8

LD

HL,(#FC18)

FD64

INC

E

FDAB

DEC

E

FD65

INC

H

FDAC

JP

P,DES

FD66

LD

A,(DE)

FDAF

LD

E,B

FD67

LD

(HL),A

FDBO

DEC

D

FD68

INC

E

FDB1

LD

B, #05

FD69

INC

H

FDB3

WAIT-2

DJNZ

WAIT-2

FD6A

LD

A,(DE)

FDB5

LD

A,(HL)

FD6B

LD

(HL),A

FDB6

JP

END

FD6C

INC

E

FDB9

DES

LD

A,D

FD6D

INC

H

FDBA

AND

#07

FD6E

LD

A,(DE)

FDBC

JP

Z,SOT-l

FD6F

LD

(HL),A

FDBF

DEC

D

ЧИТАТЕЛЬ-ЧИТАТЕЛЮ

1

Алгоритм работы процедуры SHBT.

FDCO

JP

P,SOT-2

Регистр DE

также

загружается

FDC3

LD

D,B

из таблицы,

а, в ВС - заносится

FDC4

DEC

L

число, соответствующее Десятично

FDC5

LD

А,(#8000)

му 1000:

FDC8

LD

А,(#8000)

FDCB

LD

А,(#8000)

FE1A

LD

DE,#FC19

FDCE

OP

END

FE1D LOOP-2

LD

A, #FF

FDD1

SOT-1

LD

A,(HL)

FE1F

LD

ВС,#03Е8

FD02

LD

A,(HL)

FDD3

SOT-2

LD

A,L

Повтором получаем

В А 0, 1,2

FDD 4

AND

#07

и т.д.:

FDD6

JP

Z,HANDR-1

FDD9

DEC

L

FE22 LOOP-1

INC

А

FDDA

JP

P,HANDR-2

FE23

OR

А

FDDD

LD

L,B

FE24

SBC

HL,BC

FDDE

DEC

H

FE26

JR

NC,LOOP-1

FDDF

NEG

FDE1

JP

END

После сложения и

умножения на

FDfi4

HANDR-

1 LD

A,(HL)

8, кладем это

значение в таблицу:

FDE5

LD

A,(HL)

FDE6

HANDR-

2 LD

A,H

FE28

ADD

HL,BC

FDE7

AND

#07

FE29

ADD

А,А

FDE9

JR

Z,END

FE2A

ADD

А,А

FDEB

DEC

H

FE2B

ADD

А,А

FDEC

END

LD

(#FC16), DE

FE2C

LD

(DE),А

FDFO

LD

(#FC18),HL

FDF3

LD

HL,#FC15

Умножаем HL на 10:

FDF6

LD

(#FC1B),HL

FDF9

LD

HL,#50FE

FE2D

LD

C,L

FDFC

LD

(#FC1D),HL

FE2E

LD

В,Н

FDFF

LD

A, #40

FE2F

ADD

HL,ftL

FE01

LD

(#FC1F),A

FE30

ADD

HL,HL

FE04

NEG

FE31

ADD

HL,BC

FE06

NEG

FE32

ADD

HL,HL

FE08

NEG

FEOA

AND

A

Переход к

следующей ячейке и

FEOB

EXX

повтор, если не конец:

FEOC

JP

LD-SAMPLE

FE33

DEC

DE

В приведенной процедуре SHET

FE34

LD

A, E

настолько точно просчитаны такты

FE35

CP

#15

выполнения,

что она работает не

FE37

JR

NZ,LOOP-2

хуже

процедуры ПЗУ.

Если просчи-

FE39

RET

тать

все ветви выхода программы,

то будет 358

тактов.

Чтобы сменить цифру в счетчи

Расчет значений счетчика про

ке , обозначающую 1

байт, надо

изводится следующим образом. Дли

сделать 32 вызова процедуры рас

на программы

в HL

берется из

чета значения

счетчика.

считанного в

таблицу хэдера, за-

С началом

загрузки программой

тем это значение делится на 32:

блока кодов включаются атрибуты в

правом нижнем

углу,

затем с каж-

FE0F

LD

HL,(#FC2C)

дым вызовом

процедуры LD-EDGE

FE12

WAIT-3

LD

В,#05

происходит смена положения счет

FE14

SRL

Н

чика. Так происходит

до тех пор,

FE16

RR

L

пока блок кодов не загрузится и в

FE18

DJNZ

WAIT-3

счетчике не будет "0000".

ЧИТАТЕЛЬ-ЧИТАТЕЛЮ

Коменщцрий ЦЦфОЮОШ.

Загрузчик со счетчиком, который привел Сергей Штурхолев иногда встречается в западных программах, правда, при внимательном анализе листинга видны некоторые изиенения, однако они непринципиальны. Нам, в частности, при подготовке материала к печати, попалась под руку игра "GUN RUNNER", снабженная таким загрузчикои.

Теория - дело хорошее, но пос-мотрии, как же можно использовать такой загрузчик на практике. Основная процедура загрузчика расположена с адреса #FE81. Мы же для получения более компактного блока расположин эту процедуру с адреса #FE3A. Эту процедуру с успехом можно использовать вместо LOAD ""CODE, выполняя вместо него RANDOMIZE USR ADR и придавая, таким образом, "определенный вес" своей програнне. Правда при этой необходимо соблюсти некоторые моменты, о которых мы и хотим рассказать. Прежде всего - сама основная процедура #FE3A (сравните с листингои в начале статьи):

FE3A

XOR

A

FE3B

LD

(#FC1A),A

FE3E

LD

IX,#FC21

FE42

LD

DE,#0011

FE45

XOR

A

FE46

SCF

FE47

CALL

#FC8A

FE4A

JR

NC,#FE66

FE4C

CALL

#FE0F

FE4F

LD

A,#01

FE51

LD

(#FC1A),A

FE54

LD

IX,(#FC2E)

FE58

LD

DE,(#FC2C)

FE5C

LD

A, #FF

FE5E

SCF

FE5F

CALL

#FC8A

FE62

JR

NC,#FE66

FE64

EI

FE65

RET

FE66

JP

#0806

После первого вызова подпрограмма #FC8A (считывания хэдера) в случае неудачи програнна переходит на процедуру ПЗУ, вызывающую печать сообщения "Таре loading error". Это происходит через адрес #FE66. В тон варианте, который приведен в статье, управление передается на начало программы, из-за этого блокировалась остановка загрузки нажатием BREAK. Если Ван все же необходиио заблокировать клавишу BREAK при загрузке как хэдера, так и основного блока кодов, можете сделать замену соответственно:

FE4A

JR NC,#FE3A JR NC,#FE3A

FE62

принципиальным моментом является введение перед коиандой RET коианды EI - без нее программа "виснет" при возврате в Бейсик.

Следующий не менее принципиальный иомент - это сохранение на стеке значения регистра HL альтернативного набора перед вызовом процедуры #FE3A. Иначе возврат в Бейсик будет невозиожен. Выполнено это может быть так:

FE69 FE6A FE6B FE6C FE6F FE70 FE71 FE72

ЕХХ

PUSH HL EXX

CALL #FE3A EXX

POP HL

EXX

RET

FC13

JP

Теперь для порядка в начале программы (перед таблицей) поставим:

#FE69

и можно считать, что дело сделано.

Ниже приведен полный даип блока кодов загрузчика со всеии необходимыми подпрограммами, таблицами и прочими вещами. Он начинается с адреса 64531 и имеет длину 608 байт. Вы можете убедиться в той, что он практически не отличается от того варианта, о котором рассказал наш корреспондент.

Теперь в Бейсик-загрузчике любой Вашей программы Вы сможете первой строкой поставить: LOAD ""CODE - загрузится код приведенного загрузчика, а затем каждую следующую команду LOAD ""CODE можно заменить на RANDOMIZE USR 64531. Теперь при загрузке блоков кодов бордюр будет черным, а на экране будет изображение счетчика, показывающего, сколько осталось до конца загрузки. На рисунке приведено изображение экрана в момент загрузки на него картинки (счетчик - внизу справа):

ЧИТАТЕЛЬ-ЧИТАТЕЛЮ

Итак, полный дамп блока кодов загрузчика с контрольными суммами в конце каждой строки. Как его использовать - Вы уже знаете.

FC13

СЗ

69

FE

48

48

48

48

00

59

FC1B

00

00

00

00

00

00

00

00

17

FC23

00

00

00

00

00

00

00

00

IF

FC2B

00

00

00

00

00

00

00

FE

25

FC33

Сб

ВА

ВА

ВА

ВА

Сб

FE

FE

9F

FC3B

ЕЕ

СЕ

ЕЕ

ЕЕ

ЕЕ

82

FE

FE

3B

FC43

С6

ВА

F6

ЕЕ

DE

82

FE

FE

FF

FC4B

82

F6

Еб

FA

ВА

Сб

FE

FE

IB

FC53

F6

Еб

D6

В6

82

F6

FE

FE

2B

FC5B

82

BE

86

FA

ВА

Сб

FE

FB

93

FC63

Е6

DE

86

ВА

ВА

Сб

FE

FE

DF

FC6B

82

FA

F6

F6

ЕЕ

ЕЕ

FE

FE

A7

FC73

С6

ВА

С6

ВА

ВА

Сб

FE

FE

EB

FC7B

С6

ВА

ВА

С2

FA

Сб

FE

FE

2F

FC83

С6

ВА

ВА

ВА

ВА

Сб

FE

14

05

FC8B

08

15

F3

D9

00

D9

3E

95

FC93

D3

FE

DB

FE

1F

Еб

20

68

FC9B

F6

00

4F

BF

СО

CD

20

FD

45

FCA3

30

FA

21

15

04

10

FE

2B

3C

FCAB

В5

20

F9

CD

1С FD

30

07

FCB3

ЕВ

06

CD

FD

30

E4

36

FCBB

ЗЕ

С6

В8

30

Е0

24

20

F1

B8

FCC3

06

C9

CD

20

FD

30

D5

78

F5

FCCB

FE

D4

30

F4

CD

20

FD

DO

77

FCD3

D9

ЗА

1A

FC

4F

32

IF

FC

94

FCDB

D9

26

00

06

BO

18

IF

08

CB

FCE3

20

07

30

OF

DD

75

00

18

AF

FCEB

OF

CB

11

AD

CO

79

IF

4F

26

FCF3

13

18

07

DD

7E

00

AD

CO

E9

FCFB

DD

23

IB

08

06

B2

2E

01

01

FD03

CD

FD

DO

3E

CB

B8

CB

42

FD0B

15

06

BO

D2

03

FD

7C

AD

CE

FD13

67

7A

B3

20

CA

7C

FE

01

09

FD1B

C9

CD

20

FD

DO

C3

3B

FD

96

FD23

04

C8

3E

7F

DB

FE

IF

DO

71

FD2B

A9

E6

20

28

F3

79

2F

4F

E9

FD33

32

FE

5A

32

FF

5A

37

C9

45

FD3B

D9

79

B7

28

40

21

IF

FC

E5

FD43

35

7E

28

5B

FE

05

30

42

EB

FD4B

21

IB

FC

34

2C

2C

35

2A

6B

FD53

IB

FC

7E

Сб

32

5F

16

FC

4E

FD5B

2A

ID

FC

1A

77

24

1A

86

FD63

77

24

1A

77

24

1A

02

FD6B

77

24

1A

77

24

1A

OA

FD73

77

24

1A

77

24

1A

12

FD7B

77

D9

C3

23

FD

06

17

10

D8

FD83

FE

3E

00

ED

44

A7

D9

C3

30

FD8B

23

FD

3E

47

32

FA

5A

32

E5

FD93

FB

5A

32

FC

5A

32

FD

5A

F6

FD9B

23

23

06

OD

C3

82

FD

06

39

FDA3

4F

ED

5B

16

FC

2A

18

FC

87

FDAB

ID

F2

B9

FD

58

15

06

05

E5

FDB3

10

FE

7E

C3

EC

FD

7A

E6

48

FDBB

07

CA

D1

FD

15

F2

D3

FD

2E

FDC3

50

2D

ЗА

00

80

ЗА

00

80

B1

FDCB

ЗА

00

80

C3

EC

FD

7E

7E

2A

FDD3

7D

Еб

07

CA

E4

FD

2D

F2

04

FDDB

Еб

FD

68

25

ED

44

C3

EC

28

FDE3

FD

7E

7E

7C

E6

07

28

01

6B

FDEB

25

ED

53

16

FC

22

18

FC

95

FDF3

21

15

FC

22

IB

FC

21

FE

7A

FDFB

50

22

ID

FC

3E

40

32

IF

52

FE03

FC

ED

44

ED

44

ED

44

A7

37

FE0B

D9

C3

23

FD

2A

2C

FC

06

ID

FE13

05

CB

3C

CB

ID

10

FA

11

20

FE1B

19

FC

3E

FF

01

E8

03

3C

93

FE23

B7

ED

42

30

FA

09

87

87

48

FE2B

87

12

4D

44

29

29

09

29

D7

FE33

IB

7B

FE

15

20

E4

C9

AF

56

FE3B

32

1A

FC

DD

21

21

FC

11

AD

FE43

11

00

AF

37

CD

8A

FC

30

BB

FE4B

1A

CD

OF

FE

3E

01

32

1A

C8

FE53

FC

DD

2A

2E

FC

ED

5B

2C

F2

FE5B

FC

3E

FF

37

CD

8A

FC

30

4C

FE63

02

FB

C9

C3

06

08

D9

E5

B6

FE6B

D9

CD

ЗА

FE

D9

El

D9

C9

A3

*

*

(С) Александр Исаков,

г.Нарва, 1995.

1 -о(,51

В. Толстой из г. Петрозаводска спрашивает, почему на его компьютере не работает DCU 2.02, 2.12, 2.31 (ZX-PEBI0-94, N4, стр.22). У меня тоже не работали все версии DCU выше 2.01. Мне кажется, что я знаю, в чем дело и могу помочь ему и некоторым другим синклерис-там.

Дело в том, что для вызова подпрограмм TR-DOS есть специальная точка входа по адресу 15663 (#3D2F). При обращении через нее сначала помещают на стек адрес нужной подпрограммы, а затем делают переход по адресу 15663. По этому адресу находится команда NOP, а за ней RET. Переключение на ПЗУ TR-DOS требует некоторого времени, причем это время различно для разных экземпляров компьютеров даже одного типа, так как время задержки распространения у применяемых в них микросхемах имеет некоторый разброс. Между прочим, если бы этот параметр у них не был, как правило, значительно лучше указанного в справочниках, то большинство наших самоделок не работало бы вообще. Команда NOP нужна для обеспечения задержки работы программы на это время.

В DCU же версий 2.02 и выше (а также и в некоторых других программах) используется переход по адресу 15664 (#3030), то есть непосредственно на команду RE?. Большинство компьютеров при этом нормально работают, но не все. Если Ваша машина оказалась именно такой, то возьмите M0NS4 или что-нибудь подобное, найдите в программе все ЗР и CALL по адресу 15664 и уменьшите адрес на единицу - скорее всего, после этого Ваши неприятности исчезнут.

Например, в программе DCU 2.31 вызов подпрограмм TR-00S данный способом используется в двух местах:

ЧИТАТЕЛЬ-Ч1

i Т А Т 1

г л ю




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Железо - АТМ TURBO 2+ как стандарт.
Системки - Оберон и ассемблер: Сопряжение с ассемблером (часть 2).
Доска почета - Отрывки из разговоров на втором дне Fun Top-98: Alex(R), Kano, Boss, Mitchell, Daniel, Serzh.

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