Я пытаюсь создать программу рисования, которая отображает символ блока (ASCII 219) в текущем местоположении курсора. Клавиши вверх, вниз, влево и вправо используются для навигации по экрану. F1, F2, F3 и F4 должны менять цвет. Ключ выхода выходит из программы. При использовании функциональных клавиш цвета не меняются, как я ожидал. Мой код выглядит следующим образом:Изменить цвет текста консоли
org 100h
kol db 12
wiersz db 10
kolor db 1111b
kursor:
mov ah,3
mov bh,1
mov dh,byte [wiersz]
mov dl,byte [kol]
int 10h
mov bl,15
int 10h
petla:
; Get keystroke
mov ah,0
int 16h
; AH = BIOS scan code
cmp ah,48h
je gora
cmp ah,50h
je dol
cmp ah,4Bh
je lewo
cmp ah,4Dh
je prawo
cmp ah,3Bh
je F1
cmp ah,3Ch
je F2
cmp ah,3Dh
je F3
cmp ah,3Eh
je F4
cmp ah,3Fh
je F5
cmp ah,1
jne petla ; loop until Esc is pressed
mov ah,0x4c
int 0x21
gora:
sub byte [wiersz],1
mov ah,2
mov bh,0
mov dh,byte [wiersz]
mov dl,byte [kol]
int 10h
mov ah,09h
mov al,219
mov bx,kolor
mov cx, 1
int 10h
jmp petla
dol:
add byte [wiersz],1
mov ah,2
mov bh,0
mov dh,byte [wiersz]
mov dl,byte [kol]
int 10h
mov ah,09h
mov al,219
mov bx,kolor
mov cx, 1
int 10h
jmp petla
lewo:
sub byte [kol],1
mov ah,2
mov bh,0
mov dh,byte [wiersz]
mov dl,byte [kol]
int 10h
mov ah,09h
mov al,219
mov bx,kolor
mov cx, 1
int 10h
jmp petla
prawo:
add byte [kol],1
mov ah,2
mov bh,0
mov dh,byte [wiersz]
mov dl,byte [kol]
int 10h
mov ah,09h
mov al,219
mov bx,kolor
mov cx, 1
int 10h
jmp petla
F1:
mov byte [kolor], 0111b
int 21h
jmp petla
F2:
mov byte [kolor], 1001b
int 21h
jmp petla
F3:
mov byte [kolor], 0010b
int 21h
jmp petla
F4:
mov byte [kolor], 1011b
int 21h
jmp petla
F5:
mov byte [kolor], 1100b
int 21h
jmp petla
Когда программа запускается курсор перемещается по экрану с помощью стрелок, но блок символы не появляются, а цвета не меняются. Может ли кто-нибудь объяснить, почему эта проблема может возникнуть, и как я могу исправить этот код?
программного обеспечения дизайн подсказка: сделать справочные таблицы для отображения различных ключей к различным результатам, а не также дублирования кода, использующего ценности. Убедитесь, что сканирующий код является одним из тех, которые вы ищете, а затем вычитайте наименьшее значение (поэтому ваши массивы не начинаются с пута наложения). См. Http://stackoverflow.com/a/32356125/224132 о том, как gcc оптимизирует ад из 'switch', который проверяет значение, находящееся в наборе. Если коды сканирования недостаточно плотны, чтобы массивы были хорошими, вы все равно можете просто разветвить, чтобы установить значения, и откорректировать «int 10h» insns (вызовы BIOS?) –
Я не могу помочь вам с реальной консолью цвет текста; Я не перепутал с голосом или кодом DOS. Просто оптимизация производительности в пользовательском пространстве Linux. –