Разбор программ в машинных кодах - управление программой от Кемпстон-джойстика.
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
PRINT
Вызов процедуры печати символа
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
PRINT
Вызов подпрограммы печати
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
PRINT
подпрограмму печати
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 Третий замедляющий цикл