- •Предисловие
- •Немного истории
- •Обзор программного обеспечения
- •Центральный процессор
- •______________________________________Другие регистры
- •Внешние устройства
- •____________________________Порт 255 (#ff, %11111111)
- •____________________________Порт 254 (#fe, %11111110)
- •_______________________________Маскируемые прерывания
- •______________________________________________Режим 0
- •_____________________________Немаскируемые прерывания
- •____________________________Организация памяти
- •_____________________________Экранная область памяти
- •__________________________________Буфер принтера
- •__________Формат хранения текста программы на Бейсике
- •___________________________Формат хранения переменных
- •Числовые переменные (numeric variables)
- •Числовой массив (numeric array)
- •Управляющая переменная цикла for...Next (index variable)
- •Методы адресации
- •Загрузка gens4
- •Программирование на ассемблере gens4
- •____________________________________Формат строки ассемблера
- •35 Start ld hl,label ;загрузка регистра
- •_________________________________________________________Метки
- •_____________________________Команды условной трансляции
- •Insert — перейти в режим «вставка». Выход из режима осуществляется нажатием Enter;
- •_______________________Работа с дисководом и магнитофоном
- •Другие команды
- •Include buffer? (Размер входного буфера?)
- •Ассемблирование программы
- •Сообщения об ошибках
- •Зарезервированные слова
- •Пример сеанса работы
- •Программа-загрузчик
- •Команды mons4
- •9C40[ss/m] установке начального значения pc
- •Использование дополнительных фонтов
- •Input "address: ";a: rem адрес нового фонта
- •Системные переменные
- •Ожидание ввода: call 5598 (#15de)
- •Изображение окружности: call 9005 (#232d)
- •Изображение линии: call 9399 (#24b7), call 9402 (#24ва)
- •Загрузка файла без заголовка: call 1366 (#0556)
- •Пояснения к таблице символов
- •Контрольные коды zx Spectrum
- •Оглавление
_______________________________Маскируемые прерывания
В 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.