|
Echo
#02
30 ноября 1996 |
|
Маленькие хитрости - Изящная очистка экрана. Быстрое сканирование клавиатуры. Установка прерываний (IM2).

┌════════════════════════════════════════┐
│░░░░░░░░░░ Маленькие хитрости ░░░░░░░░░░│
└════════════════════════════════════════┘
У каждого программиста есть свои хит-
рости, зачастую известные только ему од-
ному. Для публикации подобных вещей и бу-
дет предназначен этот раздел.
Сегодня у нас:
1. Изящная очистка экрана:
Обычно экран чистят так:
XOR A ;1 │
OUT (#FE),A ;2 │
LD HL,#4000 ;3 └
LD DE,#4001 ;3 Размер в байтах
LD BC,#1AFF ;3 ┌
LD (HL),A ;1 │
LDIR ;2 │
Размер: 15 байт.
А мы вот так:
XOR A ;1
OUT (#FE),A ;2
LD HL,#5B00 ;3
L1 DEC HL ;1
LD (HL),A ;1
OR (HL) ;1
JR Z,L1 ;2
Размер: 11 байт. На четыре байта коро-
че. Кажется мелочь, а приятно...
2. Быстрое сканирование клавиатуры:
LD L,0
LD A,#FE
L1 LD C,A
LD B,5
IN A,(#FE)
L2 RRA
JR NC,YES_KEY
INC L
DJNZ L1
LD A,C
RLCA
JP C,L2
NO_KEY ;Ни одна клавиша не нажата. В
;L торчит #28 (40)
YES_KEY ;На что-то надавили. В L-код
;клавиши. Преобразовать в
ASCII его можно с помощью таблички:
╔═════╦═════════╗ ╔═════╦═════════╗
║ Код ║ Клавиша ║ ║ Код ║ Клавиша ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #00 ║ C.SHIFT ║ ║ #14 ║ 0 ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #01 ║ Z ║ ║ #15 ║ 9 ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #02 ║ X ║ ║ #16 ║ 8 ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #03 ║ C ║ ║ #17 ║ 7 ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #04 ║ V ║ ║ #18 ║ 6 ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #05 ║ A ║ ║ #19 ║ P ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #06 ║ S ║ ║ #1A ║ O ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #07 ║ D ║ ║ #1B ║ I ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #08 ║ F ║ ║ #1C ║ U ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #09 ║ G ║ ║ #1D ║ Y ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #0А ║ Q ║ ║ #1E ║ ENTER ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #0B ║ W ║ ║ #1F ║ L ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #0C ║ E ║ ║ #20 ║ K ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #0D ║ R ║ ║ #21 ║ J ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #0E ║ T ║ ║ #22 ║ H ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #0F ║ 1 ║ ║ #23 ║ SPACE ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #10 ║ 2 ║ ║ #24 ║ S.SHIFT ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #11 ║ 3 ║ ║ #25 ║ M ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #12 ║ 4 ║ ║ #26 ║ N ║
╠═════╬═════════╣ ╠═════╬═════════╣
║ #13 ║ 5 ║ ║ #27 ║ B ║
╚═════╩═════════╝ ╚═════╩═════════╝
Ежели вы получили значение триггерной
клавиши и, установив флаги клавиатуры, хо-
тите продолжить сканирование, то дайте
JP L2, при этом в регистрах A, BC, L долж-
ны остаться те же значения, какие были на
выходе из процедуры. В тактах сканиро-
вание занимает максимум 1432 (NO_KEY)!
3. А вот очень старая, но красивая ус-
тановка IM 2 (не мы ее придумали):
LD HL,TABLE_ADR ;ТABLE_ADR должно быть
LD A,H ;кратно 256!
LD I,A
LD B,L
INC A
L1 LD (HL),A
INC HL
DJNZ L1
LD (HL),A
LD L,H
LD (HL),#C9 ;RET
IM 2
Сформирует таблицу обработки прерываний
с TABLE_ADR и установит процедуру обработ-
ки: одну единственную команду RET. Занима-
ет всего 3+1+2+1+1+1+1+2+1+1+2+2=18 байт.
Ну и хватит пока... Шлите нам и свои
хитрости, читатели! Если кто-то сумеет ис-
хитриться лучше нас, будем только рады.
Другие статьи номера:
Похожие статьи:
В этот день... 13 ноября