4.3. Управление программой от Кемпстон-джойстика.
В части 1 мы уже писали о протоколе обмена Кемпстон-джойстика. Он опрашивается по внешнему порту 31 (1F) командой IN 31. Принимаемый байт анализируется так:
Бит 0 - движение вправо Бит 3 - движение вверх
Бит 1 - движение влево Бит 4 - "огонь"
Бит 2 - движение вниз Биты 5... 7 не используются
В качестве примера рассмотрим программу, которая будет рисовать на экране синие квадраты на белом поле, если кнопка не нажата. При нажатии этой кнопки производится выход из программы. Начальная позиция печати - AT (11,15) - в центре экрана.
Поскольку программа выглядит несколько громоздкой, то мы в тексте используем метки.
|
Адрес |
Метка |
Маш.код |
Мнемоника |
Комментарий | ||
|
659O |
3EO2 |
LD |
A, 02 | |||
|
6592 |
CDO116 |
CALL |
1601 |
Открываем канал для печати на экране | ||
|
6595 |
0618 |
LD |
B, 18 | |||
|
6597 |
CD4 4 OE |
CALL |
0E44 |
Очистка экрана | ||
|
65 9A |
3E0F |
LD |
A, 0F | |||
|
65 9C |
322B66 |
LD |
(XPOS) |
,A |
Установка начальной колонки печати (15) в переменной XPOS, размещенной по адресу 662B | |
|
659F |
3E0B |
LD |
A, 0B | |||
|
65A1 |
322C66 |
LD |
(YPOS) |
,A |
Установка начальной строки печати в YPOS | |
|
65A4 |
CD1266 |
CALL |
|
Вызов процедуры печати символа | ||
|
65A7 |
REP |
DB1F |
IN |
A, (1F) |
Прием байта от джойстика. | |
Адрес Метка Маш.код 65A9 E61 F
65AB 2 8 FA
65AD
DEFF
65AF HERE 0 0
65B0 06FF
65B2 PAUSE 10 FE
65B4 0D
65B5 2 0F8
65B7 CB67
65B9 C0
65BA CB47
65BC 2 0 0C
65DE CB4F
65С0 2 01A
65C2 CB57
65C4 2028
65С6 CB5F
65C8 2036
65CA RIGHT 3A2B66
FE1F
CAA7 65
322B66
CD12 66
3C
65CD 65CE
65D0
65D3
65D6
Мнемоника
AND 1F
JR Z,REP
LD C, FF
NOP
LD B,FF
DJNZ PAUSE
DEC C
JR NZ,HERE
BIT 4,A
RET NZ
BIT 0,A
JR NZ,RIGHT
BIT 1,A
JR NZ,LEFT
BIT 2,A
JR NZ,DOWN
BIT 3,A
JR NZ,UP
LD A,(XPOS)
INC A
CP 1F
JP Z,REP
LD (XPOS),A
CALL PRINT
Выделение 5 младших битов Возврат, если джойстик не был тронут
Установка параметров замедляющего цикла 1
Установка параметра замедляющего цикла 2 Второй замедляющий цикл
Первый замедляющий цикл Проверка кнопки "огонь" Выход в вызвающую программу, если нажата Проверка контакта "вправо" Переход на подпрограмму движения вправо Проверка контакта "влево" Переход на подпрограмму движения влево Проверка контакта "вниз" Переход на подпрограмму движения вниз Проверка контакта "вверх" Переход на подпрограмму движения вверх В акк-р идет последний столбец печати и увеличивается на 1 Проверка на достижение правого края
Если да, то возврат на опрос джойстика
Если нет, то запомнить новый столбец И вызвать подпрограмму печати
|
Адрес |
Метка |
Маш.код |
Мнемоника |
Комментарий | |
|
65D9 |
C3A7 65 |
JP |
REP |
Возврат на новый опрос джойстика | |
|
65DC |
LEFT |
3A2 B66 |
LD |
A,(XPOS) |
Ввод текущего столбца печати |
|
65DF |
3D |
DEC |
A |
Уменьшить номер столбца на | |
|
65E0 |
FE0 0 |
CP |
00 |
Проверка на достижение левого края | |
|
65E2 |
CAA7 65 |
JP |
Z, REP |
Если да, то возврат на опрос джойстика | |
|
65E5 |
322B66 |
LD |
(XPOS),A |
Если нет, запомнить новый столбец | |
|
65E8 |
CD12 66 |
CALL |
|
Вызов подпрограммы печати | |
|
65ED |
C3A7 65 |
JP |
REP |
Возврат на опрос джойстика | |
|
65EE |
DOWN |
3A2C6 6 |
LD |
A, (YPOS) |
В акк-р идет последняя строка печати |
|
65F1 |
3C |
INC |
A |
и увеличивается на 1 | |
|
65F2 |
FE16 |
CP |
16 |
Проверка на нижний край | |
|
65F4 |
CAA7 65 |
JP |
Z, REP |
Если да, то возврат на опрос джойстика | |
|
65F7 |
322C66 |
LD |
(YPOS),A |
Если нет, то запомнить новую строку и вызвать | |
|
65 FA |
CD12 66 |
CALL |
|
подпрограмму печати | |
|
65FD |
C3A7 65 |
JP |
REP |
Возврат на новый опрос джойстика | |
|
6600 |
UP |
3A2C66 |
LD |
A, (YPOS) |
Ввод текущей строки печати |
|
6603 |
3D |
DEC |
A |
Уменьшить номер строки на | |
|
6604 |
FE0 0 |
CP |
00 |
Проверка на достижение верхнего края | |
|
6606 |
CAA7 65 |
JP |
Z, REP |
Если да, то возврат на опрос джойстика | |
|
6609 |
322С66 |
LD |
(YPOS),A |
Если нет, запомнить новую строку | |
660С CD1266
660F C3A765
6612 PRINT 06FF
6614 WAIT 10 FE
CALL PRINT
JP REP
LD B,FF
DJNZ WAIT
Вызов подпрограммы печати Возврат на опрос джойстика Установка параметра замедляющего цикла 3 Третий замедляющий цикл
|
6616 |
3E16 |
LD |
A, 16 | |
|
6618 |
D7 |
RST |
10 | |
|
6619 |
3A2C6 6 |
LD |
A, (YPOS | |
|
661C |
D7 |
RST |
10 | |
|
661D |
3A2B6 6 |
LD |
A, (XPOS | |
|
6620 |
D7 |
RST |
10 | |
|
6621 |
3E10 |
LD |
A, 10 | |
|
6623 |
D7 |
RST |
10 | |
|
6624 |
3E01 |
LD |
A, 01 | |
|
6626 |
D7 |
RST |
10 | |
|
6627 |
3E8F |
LD | ||
|
6629 |
D7 |
RST |
10 | |
|
662A |
C9 |
RET | ||
|
662B |
XPOS |
00 |
DEFB |
00 |
|
6 62C |
YPOS |
00 |
DEFB |
00 |



