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 байт. Ну и хватит пока... Шлите нам и свои хитрости, читатели! Если кто-то сумеет ис- хитриться лучше нас, будем только рады.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября