Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ZX Spectrum для пользователей и программистов.doc
Скачиваний:
56
Добавлен:
28.09.2019
Размер:
1.92 Mб
Скачать

_______________________________Маскируемые прерывания

В ZX Spectrum на вход INT процессора постоянно подается полукадровый синхронизирующий сигнал с периодом 1/50 секунды. В операционной системе это используется для организации опроса клавиатуры и наращивания значения системного счетчика одновременно с работой интерпретатора Бейсика.

Управлять прохождением маскируемых прерываний можно командами DI и EI, которые изменяют состояние специального внутреннего триггера микропроцессора IFF. Команда DI сбрасывает этот триггер, запрещая прерывания, EI устанавливает его, разрешая прерывания.

При вызове маскируемого прерывания триггер IFF автоматически сбрасывается, запрещая повторный вызов прерываний. После обработки прерывания процессор не устанавливает триггер вновь — для разрешения прохождения последующих прерываний программист должен включить в программу команду EI.

Z80 имеет три режима обработки маскируемых прерываний, которые устанавливаются командами процессора IM О, IМ 1 и IM 2. К сожалению, программным путем практически невозможно определить, в каком режиме обработки прерываний находится процессор в конкретный момент времени.

______________________________________________Режим 0

Режим устанавливается либо командой IМ 0, либо аппаратным сбросом процессора, и ничем не отличается от режима обработки прерываний в микропроцессоре I8080. По приходу сигнала INT процессор считывает с шины данных код команды (предварительно выставленный на шину внешним прерывающим устройством) и выполняет ее. В принципе, это может быть любая команда (чаще всего используются команды RST N или CALL addr). Но ZX Spectrum устроен таким образом, что при вызове прерывания в режиме 0 с шины данных всегда считывается значение 255 (#FF) — код команды RST 56. И, следовательно, для ZX Spectrum этот режим аналогичен режиму 1.*

___________________________________________________________________

*) Строго говоря, это не совсем так, см. примечание к режиму 2.

______________________________________________Режим 1

Устанавливается командой IM 1. По прерыванию процессор передает управление на ячейку с адресом 56 (выполняется команда CALL 56). Именно в этом режиме обрабатывает прерывания операционная система ZX Spectrum.

______________________________________________Режим 2

Устанавливается командой IM 2. Режим дает возможность программисту самостоятельно обрабатывать прерывания, чем и интересен.

При поступлении сигнала на прерывание, микропроцессор считывает с шины данных байт, называемый вектором прерывания. ZX Spectrum устроен так, что вектор прерывания всегда равен 255 (#FF).* Он передается в младший байт шины адреса, а в старший байт записывается содержимое регистра вектора прерываний I. По полученному таким образом адресу Z80 считывает из памяти два последовательно расположенных байта, которые интерпретируются процессором как адрес программы обработки прерывания (сначала считывается младший байт адреса, затем старший). Следовательно, выбрав режим прерываний 2 и задав значение регистра I, можно переопределить адрес процедуры обработки прерывания.

Для задания адреса размещения программы обработки прерываний наиболее удобно использовать значения, считываемые из стандартного ПЗУ ZX Spectrum. При этом в регистр I нужно занести число в пределах от 0 до 63 (#00...#3F). Например, если в I содержится число 9, то адрес ячейки, из которой будет считан младший байт адреса программы обработки прерываний, равен 2559 (9x256+255). Старший байт, соответственно, будет считан по адресу 2560. В данном случае определить адрес, по которому необходимо разместить программу обработки прерываний, можно, выполнив строку на Бейсике:

PRINT PEEK (2559)+256*РЕЕК (2560)

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

Определить все возможные считанные из ПЗУ адреса размещения процедур обработки прерываний можно с помощью следующей программы:

10 INPUT "Interrupt vector:";I:REM вектор прерывания

20 PRINT I,PEEK (I*256+255)+256*PEEK (I*256+255+1)

Уже рассчитанные адреса занесены в табл. 3.

Возврат из маскируемых прерываний производится командой RETI. Она распознается специальными периферийными____________

*) Некоторые внешние устройства, например, AMX-mouse, могут генерировать вектор прерывания, отличный от 255.

Таблица 3. Адреса процедур обработки прерываний.

I

адрес

I

адрес

I

адрес

I

адрес

0

20430

16

51984

32

52513

48

60208

1

52818

17

08729

33

33485

49

57640

2

22269

18

52481

34

00544

50

13627

3

39020

19

49749

35

49537

51

13256

4

10419

20

25705

36

08527

52

01560

5

02294

21

51673

37

23670

53

57124

6

29149

22

51568

38

20444

54

34307

7

16039

23

12493

39

00288

55

41231

8

02088

24

15582

40

32348

56

65535

9

65129

25

23842

41

58154

57

65535

10

32802

26

13824

42

19754

58

65535

11

58888

27

07306

43

23653

59

65535

12

53183

28

49947

44

07117

60

00255

13

52503

29

02344

45

55781

61

00000

14

14367

30

26573

46

23713

62

00255

15

27928

31

03360

47

04569

63

00060

микросхемами*, что позволяет организовать многоуровневую систему прерываний. Но, поскольку в ZX Spectrum эта система не используется, то вернуться из прерывания можно и по команде RET.