Код:
; Программа для тестирования мыши из журнала МК 2'94
; Написана под Монитор за авторством В. Доможирова - МК 5'91, МК 8'91, МК 9'91, МК 11'91
device zxspectrum48
org 0 ; Адрес загрузки
; Стандартные подпрограммы Загрузчика
CLS equ 0xC010 ; Очистка экрана. Цвет задаётся в ячейках 8FFA и 8FFB
DELAY equ 0xC190 ; Задержка. Длительность задаётся в регистре B
; Стандартные подпрограммы Монитора
PRN_SYM equ 0xC809 ; Вывод символа на экран. C - выводимый символ
PRN_HEX equ 0xC815 ; Вывод на экран байта в шестнадцатеричном виде. A - выводимый байт
PRN_MSG equ 0xC818 ; Вывод сообщения на экран. HL - адрес начала
; Адреса ППИ
PPI_RUS equ 0xFEFF
PPI_B equ 0xFEFD
; Адрес внешней программы
EXT_PROC equ 0x8870 ; Выход в неизвестную внешнюю программу
; Ячейки Монитора В. Доможирова
MON_Y equ 0x8F84 ; Адрес курсора (9000...BFFF) первая ячейка из двух
MON_X equ 0x8F85 ; Адрес курсора (9000...BFFF) вторая ячейка из двух
startprog:
ld hl, msg_03
call PRN_MSG
ld a, 0x80
ld (PPI_RUS), a
ld a, 0xff
ld (PPI_B), a
cpl
ld (PPI_B), a
mouse_01:
ld a, 0x82
ld (PPI_RUS), a
nop
nop
ld a, (PPI_B)
ld c, a
ld a, 0x80
ld (PPI_RUS), a
ld a, 0xff
ld (PPI_B), a
cpl
ld (PPI_B), a
ld a, c
and 0x10
cp 0
jp z, EXT_PROC
ld a, c
and 0x20
cp 0
call z, CLS
ld a, c
and 1
cp 0
jp nz, mouse_02
ld a, (coord_y)
dec a
ld (coord_y), a
mouse_02:
ld a, c
and 4
cp 0
jp nz, mouse_03
ld a, (coord_y)
inc a
ld (coord_y), a
mouse_03:
ld a, c
and 2
cp 0
jp nz, mouse_04
ld a, (coord_x)
inc a
ld (coord_x), a
mouse_04:
ld a, c
and 8
cp 0
jp nz, mouse_05
ld a, (coord_x)
dec a
ld (coord_x), a
mouse_05:
ld a, (coord_x)
ld hl, msg_02
call PRN_MSG
call PRN_HEX
ld a, (coord_y)
ld hl, msg_01
call PRN_MSG
call PRN_HEX
ld a, (coord_x)
and 0xfc
rra
rra
add a, 0x90
ld (MON_X), a
ld a, (coord_y)
rla
rla
rla
ld (MON_Y), a
ld c, "+"
call PRN_SYM
ld b, 0xff
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
jp mouse_01
; ---------------------------------------------------------------------------
msg_01:
db 0x1b, "Z", 0x64, 0x0a ; ESC+Z: прямое позиционирование курсора, следом идут координаты Y и X
db "MOVE "
db 0x01, 0x12 ; 0x01 - первый символ двухбайтной передачи, 0x12 - код символа стрелки вверх-вниз
db " "
db 0x00 ; Маркер конца строки
msg_02:
db 0x1b, "Z", 0x6e, 0x0a ; ESC+Z: прямое позиционирование курсора, следом идут координаты Y
db "MOVE "
db 0x01, 0x1d ; 0x01 - первый символ двухбайтной передачи, 0x1d - код символа стрелки влево-вправо
db " "
db 0x00 ; Маркер конца строки
msg_03:
db 0x1b, "L" ; ESC+L: Установить окно во весь экран дисплея
db 0x1b, "P" ; ESC+P: Установить цвет символов светящимися точками, а цвет фона не светящимися точками
db 0x1f ; ^_: CLEAR - Очистка экрана и перевод курсора "Домой"
db 0x00 ; Маркер конца строки
coord_y:
db 0x0c
coord_x:
db 0x42
; Мусор для совпадения с журнальным дампом
db 0, 0x39, 0, 0x39, 0, 0x39, 0
endprog:
savebin "mouse.bin", startprog, endprog - startprog