问题描述
我创建了一个虚拟钢琴,能够弹奏一个完整的八度音程(可以选择使用 + 和 - 将八度音程提高两次),但我的问题不在于音频,而在于图形。我的程序正在运行一个图形程序,它基本上绘制白色方块,绘制黑色线条以分隔音符,然后打印小字母以帮助用户知道哪个字母激活哪个键,以及黑色音符本身。完成纯图形部分后,我开始研究 RecieveKey proc,我完成了 proc 的编写,一切正常,你可以用字母 SL 激活所有 8 个白色音符,用 E、R、Y、U 激活所有黑色音符,一世。但我遇到了一个非常烦人的“错误”。按下键盘上的键后,音符变为灰色,0.746 秒后变回白色。但是有一个我似乎无法解决的闪烁/毛刺奇怪的问题。我将在这里粘贴完整的代码,有人可以帮助我理解为什么会这样吗?
; Play white keys with S,D,F,G,H,J,K,Left
; Play black keys with E,R,Y,U,I
; Go up octave with +
; Go down octave with -
; Press ESC to end
IDEAL
MODEL small
STACK 100h
DATASEG
; --------------------------
; Your variables here
x dw 0; position of X
y dw 0; position of Y
color1 dw 00007h ; Gray
color3 dw 0000h; Black Color
CorrentOctave db 31h; Starts at Octave n1:
Linex dw 0; position of X of line
Column db 0; Position of Column
Row db 0; Position of Row
Letter db 0; Letter
; --------------------------
CODESEG
; ------------------------------------------------------------------------------------------------------------------------------------------
proc Graphic
xor ax,ax
xor dx,dx
xor cx,cx
mov ax,13h
int 10h ;Moving to graphic mode
call PrintWhite
call PrintBlackLines
call PrintLetterNotes
call PrintBlackKeys
call PrintFix
call PrintCorrentOctave
ret
endp Graphic
; --------------------------
proc PrintPixel ;This procedure Receives parameters of x and y and a colour and prints a pixel on the screen
push bp
mov bp,sp
push cx
mov ax,[bp+4] ;Colour of the pixel
mov dx,[bp+6] ;Y parameter of the pixel
mov cx,[bp+8] ;X parameter of the pixel
mov bh,0h ;Page,should be 0
mov ah,0ch
int 10h ;Pixel draw interrupt
pop cx
pop bp
ret 6
endp PrintPixel
; --------------------------
proc PrintWhite ;This procedure prints a 120x320 white rectangle
mov [x],0
mov [y],50
PrintLine1:
push [x]
push [y]
push 0000Fh; White Color
call PrintPixel
cmp [x],320
jne PrintLine2
cmp [y],170
jne PrintLine3
ret
PrintLine2:
inc [x]
jmp PrintLine1
PrintLine3:
mov [x],0
inc [y]
jmp PrintLine1
endp PrintWhite
; --------------------------
proc PrintBlackLines ;This procedure will print the black lines seperating the white keys every 20 pixels.
mov [Linex],40
call PrintBlackLine1
mov [Linex],80
call PrintBlackLine1
mov [Linex],120
call PrintBlackLine1
mov [Linex],160
call PrintBlackLine1
mov [Linex],200
call PrintBlackLine1
mov [Linex],240
call PrintBlackLine1
mov [Linex],280
call PrintBlackLine1
endp PrintBlackLines
proc PrintBlackLine1 ; this procedure will print the first black line seperating keys.
mov ax,[Linex]
mov [x],ax
mov [y],50
FirstBlack1:
push [x]
push [y]
push 0000h; Black Color
call PrintPixel
cmp [y],170
jne FirstBlack2
ret
FirstBlack2:
inc [y]
jmp FirstBlack1
endp PrintBlackLine1
; --------------------------
; --------------------------
proc PrintBlackKeys; this procedure will print all the 6 black keys on the piano
call PrintBlackKey1
call PrintBlackKey2
call PrintBlackKey3
call PrintBlackKey4
call PrintBlackKey5
endp PrintBlackKeys
proc PrintBlackKey1; this procedure will print the first black key.
mov [x],30
mov [y],50
FirstBlackKey1:
push [x]
push [y]
push [color3]; Black Color
call PrintPixel
cmp [x],45
jne FirstBlackKey2
cmp [y],110
jne FirstBlackKey3
ret
FirstBlackKey2:
inc [x]
jmp FirstBlackKey1
FirstBlackKey3:
mov [x],30
inc [y]
jmp FirstBlackKey1
endp PrintBlackKey1
proc PrintBlackKey2; this procedure will print the Second black key.
mov [x],70
mov [y],50
SecondBlackKey1:
push [x]
push [y]
push [color3]; Black Color
call PrintPixel
cmp [x],85
jne SecondBlackKey2
cmp [y],110
jne SecondBlackKey3
ret
SecondBlackKey2:
inc [x]
jmp SecondBlackKey1
SecondBlackKey3:
mov [x],70
inc [y]
jmp SecondBlackKey1
endp PrintBlackKey2
proc PrintBlackKey3; this procedure will print the third black key.
mov [x],150
mov [y],50
ThirdBlackKey1:
push [x]
push [y]
push [color3]; Black Color
call PrintPixel
cmp [x],165
jne ThirdBlackKey2
cmp [y],110
jne ThirdBlackKey3
ret
ThirdBlackKey2:
inc [x]
jmp ThirdBlackKey1
ThirdBlackKey3:
mov [x],150
inc [y]
jmp ThirdBlackKey1
endp PrintBlackKey3
proc PrintBlackKey4; this procedure will print the Fourth black key.
mov [x],190
mov [y],50
ForthBlackKey1:
push [x]
push [y]
push [color3]; Black Color
call PrintPixel
cmp [x],205
jne ForthBlackKey2
cmp [y],110
jne ForthBlackKey3
ret
ForthBlackKey2:
inc [x]
jmp ForthBlackKey1
ForthBlackKey3:
mov [x],190
inc [y]
jmp ForthBlackKey1
endp PrintBlackKey4
proc PrintBlackKey5; this procedure will print the Fifth black key.
mov [x],230
mov [y],50
FifthBlackKey1:
push [x]
push [y]
push [color3]; Black Color
call PrintPixel
cmp [x],245
jne FifthBlackKey2
cmp [y],110
jne FifthBlackKey3
ret
FifthBlackKey2:
inc [x]
jmp FifthBlackKey1
FifthBlackKey3:
mov [x],230
inc [y]
jmp FifthBlackKey1
endp PrintBlackKey5
; -------------------------
proc PrintFix
mov [x],171
PrintFix1:
push [x]
push [y]
push 0000h; Black Color
call PrintPixel
ret
endp PrintFix
; --------------------------
proc PrintLetterNotes ; this procedure will print a letter on each note so the user can kNow which key in the keyboard activates each note
mov [Column],2
mov [Row],22
mov [Letter],53h
call PrintLetter ; Letter S
mov [Column],7
mov [Row],44h ; Letter D
call PrintLetter
mov [Column],12
mov [Row],46h ; Letter F
call PrintLetter
mov [Column],17
mov [Row],47h ; Letter G
call PrintLetter
mov [Column],22
mov [Row],48h ; Letter H
call PrintLetter
mov [Column],27
mov [Row],4Ah ; Letter J
call PrintLetter
mov [Column],32
mov [Row],4Bh ; Letter K
call PrintLetter
mov [Column],37
mov [Row],4Ch ; Letter L
call PrintLetter
mov [Column],4
mov [Row],5
mov [Letter],45h ; Letter E
call PrintLetter
mov [Column],9
mov [Row],52h ; Letter R
call PrintLetter
mov [Column],19
mov [Row],59h ; Letter Y
call PrintLetter
mov [Column],24
mov [Row],55h ; Letter U
call PrintLetter
mov [Column],29
mov [Row],49h ; Letter I
call PrintLetter
mov [Column],2
mov [Letter],4Fh ; Letter O
call PrintLetter
mov [Column],3
mov [Row],63h ; Letter c
call PrintLetter
mov [Column],74h ; Letter t
call PrintLetter
mov [Column],5
mov [Row],61h ; Letter a
call PrintLetter
mov [Column],6
mov [Row],76h ; Letter v
call PrintLetter
mov [Column],65h ; Letter e
call PrintLetter
mov [Column],8
mov [Row],3Ah ; Char :
call PrintLetter
ret
endp PrintLetterNotes
; --------------------------
proc PrintLetter ; prints letter
mov dl,[Column] ;Column
mov dh,[Row] ;Row
mov bh,0 ;display page
mov ah,02h ;SetCursorPosition
int 10h
mov al,[Letter]
mov bl,000Fh ;Color is White
mov bh,0Eh ;Teletype
int 10h
ret
endp PrintLetter
; ------------------------
proc PrintCorrentOctave
mov dl,9 ;Column
mov dh,2 ;Row
mov bh,[CorrentOctave]
mov bl,0Eh ;Teletype
int 10h
ret
endp PrintCorrentOctave
; ----------------------------------------------------------------------------------------------
proc ReceiveKey ;This procedure Receives a key from the keyboard and matches it to a note
ReceiveKey:
mov ah,0
Int 16h
cmp al,73h ;S on the keyboard (WHITE)
je FirstWhiteKey
cmp al,64h ;D on the keyboard (WHITE)
je SecondWhiteKey
cmp al,66h ;F on the keyboard (WHITE)
je ThirdWhiteKey
cmp al,67h ;G on the keyboard (WHITE)
je FourthWhiteKey
cmp al,68h ;H on the keyboard (WHITE)
je FifthWhiteKey
cmp al,6Ah ;J on the keyboard (WHITE)
je SixthWhiteKey
cmp al,6Bh ;K on the keyboard (WHITE)
je SeventhWhiteKey
cmp al,6Ch ;L on the keyboard (WHITE)
je EighthWhiteKey
cmp al,65h ;E on the keyboard (BLACK)
je FirstBlackKey
cmp al,72h ;R on the keyboard (BLACK)
je SecondBlackKey
cmp al,79h ;Y on the keyboard (BLACK)
je ThirdBlackKey
cmp al,75h ;U on the keyboard (BLACK)
je FourthBlackKey
cmp al,69h ;I on the keyboard (BLACK)
je FifthBlackKey
cmp al,2Dh ;Arrow Left on the keyboard (octave Dec)
je OctaveDec
cmp al,3Dh ;Arrow Right on the keyboard (octave inc)
je OctaveInc
cmp al,1Bh ;ESC on the keyboard (CLOSE)
je EndOfProc
jmp ReceiveKey
FirstWhiteKey:
;call FirstWhiteKeyMusic
call FirstWhiteKeyPaint
jmp ReceiveKey
SecondWhiteKey:
;call SecondWhiteKeyMusic
call SecondWhiteKeyPaint
jmp ReceiveKey
ThirdWhiteKey:
;call SecondWhiteKeyMusic
call ThirdWhiteKeyPaint
jmp ReceiveKey
FourthWhiteKey:
;call FourthWhiteKeyMusic
call FourthWhiteKeyPaint
jmp ReceiveKey
FifthWhiteKey:
;call FourthWhiteKeyMusic
call FifthWhiteKeyPaint
jmp ReceiveKey
SixthWhiteKey:
;call FourthWhiteKeyMusic
call SixthWhiteKeyPaint
jmp ReceiveKey
SeventhWhiteKey:
;call FourthWhiteKeyMusic
call SeventhWhiteKeyPaint
jmp ReceiveKey
EighthWhiteKey:
;call FourthWhiteKeyMusic
call EighthWhiteKeyPaint
jmp ReceiveKey
FirstBlackKey:
;call FirstWhiteKeyMusic
call FirstBlackKeyPaint
jmp ReceiveKey
SecondBlackKey:
;call FirstWhiteKeyMusic
call SecondBlackKeyPaint
jmp ReceiveKey
ThirdBlackKey:
;call FirstWhiteKeyMusic
call ThirdBlackKeyPaint
jmp ReceiveKey
FourthBlackKey:
;call FirstWhiteKeyMusic
call FourthBlackKeyPaint
jmp ReceiveKey
FifthBlackKey:
;call FirstWhiteKeyMusic
call FifthBlackKeyPaint
jmp ReceiveKey
EndOfProc:
jmp exit
endp ReceiveKey
; --------------------------
proc OctaveInc
cmp [CorrentOctave],33h
jne OctaveInc1
jmp ReceiveKey
OctaveInc1:
inc [CorrentOctave]
call PrintCorrentOctave
jmp ReceiveKey
endp OctaveInc
proc OctaveDec
cmp [CorrentOctave],31h
jne OctaveDec1
jmp ReceiveKey
OctaveDec1:
dec [CorrentOctave]
call PrintCorrentOctave
jmp ReceiveKey
endp OctaveDec
; --------------------------
proc FirstWhiteKeyPaint ; paints the first white key in gray
mov [x],50
FirstWhiteKeyPaintBig: ;paints the big rectangle on the first white key in gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],29
jne FirstWhiteBig1
cmp [y],170
jne FirstWhiteBig2
mov [x],111
jmp FirstWhiteKeyPaintSmall
FirstWhiteBig1:
inc [x]
jmp FirstWhiteKeyPaintBig
FirstWhiteBig2:
inc [y]
mov [x],0
jmp FirstWhiteKeyPaintBig
FirstWhiteKeyPaintSmall: ;Paints the small rectangle on the first white key gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],39
jne FirstWhiteSmall1
cmp [y],170
jne FirstWhiteSmall2
mov cx,6h
mov dx,4240h
mov ah,86h
int 15h
cmp [color1],00007h
je ChangetoWhite1
mov [color1],00007h
call ReceiveKey
ChangetoWhite1:
mov [color1],0000Fh
call FirstWhiteKeyPaint
FirstWhiteSmall1:
inc [x]
jmp FirstWhiteKeyPaintSmall
FirstWhiteSmall2:
inc [y]
mov [x],30
jmp FirstWhiteKeyPaintSmall
endp FirstWhiteKeyPaint
; --------------------------
proc SecondWhiteKeyPaint ; paints the Second white key in gray
mov [x],41
mov [y],111
SecondWhiteKeyPaintBig: ;paints the big rectangle on the Second white key in gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],79
jne SecondWhiteBig1
cmp [y],170
jne SecondWhiteBig2
mov [x],46
mov [y],50
jmp SecondWhiteKeyPaintSmall
SecondWhiteBig1:
inc [x]
jmp SecondWhiteKeyPaintBig
SecondWhiteBig2:
inc [y]
mov [x],41
jmp SecondWhiteKeyPaintBig
SecondWhiteKeyPaintSmall: ;Paints the small rectangle on the Second white key gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],69
jne SecondWhiteSmall1
cmp [y],111
jne SecondWhiteSmall2
mov cx,00007h
je ChangetoWhite2
mov [color1],00007h
call ReceiveKey
ChangetoWhite2:
mov [color1],0000Fh
call SecondWhiteKeyPaint
SecondWhiteSmall1:
inc [x]
jmp SecondWhiteKeyPaintSmall
SecondWhiteSmall2:
inc [y]
mov [x],46
jmp SecondWhiteKeyPaintSmall
endp SecondWhiteKeyPaint
; --------------------------
proc ThirdWhiteKeyPaint ; paints the Third white key in gray
mov [x],81
mov [y],111
ThirdWhiteKeyPaintBig: ;paints the big rectangle on the Third white key in gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],119
jne ThirdWhiteBig1
cmp [y],170
jne ThirdWhiteBig2
mov [x],86
mov [y],50
jmp ThirdWhiteKeyPaintSmall
ThirdWhiteBig1:
inc [x]
jmp ThirdWhiteKeyPaintBig
ThirdWhiteBig2:
inc [y]
mov [x],81
jmp ThirdWhiteKeyPaintBig
ThirdWhiteKeyPaintSmall: ;Paints the small rectangle on the Third white key gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],119
jne ThirdWhiteSmall1
cmp [y],110
jne ThirdWhiteSmall2
mov cx,00007h
je ChangetoWhite3
mov [color1],00007h
call ReceiveKey
ChangetoWhite3:
mov [color1],0000Fh
call ThirdWhiteKeyPaint
ThirdWhiteSmall1:
inc [x]
jmp ThirdWhiteKeyPaintSmall
ThirdWhiteSmall2:
inc [y]
mov [x],86
jmp ThirdWhiteKeyPaintSmall
endp ThirdWhiteKeyPaint;
; -------------------------
proc FourthWhiteKeyPaint ; paints the Fourth white key in gray
mov [x],121
mov [y],50
FourthWhiteKeyPaintBig: ;paints the big rectangle on the Fourth white key in gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],149
jne FourthWhiteBig1
cmp [y],170
jne FourthWhiteBig2
mov [x],149
mov [y],111
jmp FourthWhiteKeyPaintSmall
FourthWhiteBig1:
inc [x]
jmp FourthWhiteKeyPaintBig
FourthWhiteBig2:
inc [y]
mov [x],121
jmp FourthWhiteKeyPaintBig
FourthWhiteKeyPaintSmall: ;Paints the small rectangle on the Fourth white key gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],159
jne FourthWhiteSmall1
cmp [y],170
jne FourthWhiteSmall2
mov cx,00007h
je ChangetoWhite4
mov [color1],00007h
call ReceiveKey
ChangetoWhite4:
mov [color1],0000Fh
call FourthWhiteKeyPaint
FourthWhiteSmall1:
inc [x]
jmp FourthWhiteKeyPaintSmall
FourthWhiteSmall2:
inc [y]
mov [x],121
jmp FourthWhiteKeyPaintSmall
endp FourthWhiteKeyPaint
; --------------------------
proc FifthWhiteKeyPaint ; paints the Fifth white key in gray
mov [x],161
mov [y],111
FifthWhiteKeyPaintBig: ;paints the big rectangle on the Fifth white key in gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],199
jne FifthWhiteBig1
cmp [y],170
jne FifthWhiteBig2
mov [x],166
mov [y],50
jmp FifthWhiteKeyPaintSmall
FifthWhiteBig1:
inc [x]
jmp FifthWhiteKeyPaintBig
FifthWhiteBig2:
inc [y]
mov [x],161
jmp FifthWhiteKeyPaintBig
FifthWhiteKeyPaintSmall: ;Paints the small rectangle on the Fifth white key gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],189
jne FifthWhiteSmall1
cmp [y],111
jne FifthWhiteSmall2
mov cx,00007h
je ChangetoWhite5
mov [color1],00007h
call ReceiveKey
ChangetoWhite5:
mov [color1],0000Fh
call FifthWhiteKeyPaint
FifthWhiteSmall1:
inc [x]
jmp FifthWhiteKeyPaintSmall
FifthWhiteSmall2:
inc [y]
mov [x],166
jmp FifthWhiteKeyPaintSmall
endp FifthWhiteKeyPaint
; --------------------------
proc SixthWhiteKeyPaint ; paints the Sixth white key in gray
mov [x],201
mov [y],111
SixthWhiteKeyPaintBig: ;paints the big rectangle on the Sixth white key in gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],239
jne SixthWhiteBig1
cmp [y],170
jne SixthWhiteBig2
mov [x],206
mov [y],50
jmp SixthWhiteKeyPaintSmall
SixthWhiteBig1:
inc [x]
jmp SixthWhiteKeyPaintBig
SixthWhiteBig2:
inc [y]
mov [x],201
jmp SixthWhiteKeyPaintBig
SixthWhiteKeyPaintSmall: ;Paints the small rectangle on the Sixth white key gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],229
jne SixthWhiteSmall1
cmp [y],111
jne SixthWhiteSmall2
mov cx,00007h
je ChangetoWhite6
mov [color1],00007h
call ReceiveKey
ChangetoWhite6:
mov [color1],0000Fh
call SixthWhiteKeyPaint
SixthWhiteSmall1:
inc [x]
jmp SixthWhiteKeyPaintSmall
SixthWhiteSmall2:
inc [y]
mov [x],206
jmp SixthWhiteKeyPaintSmall
endp SixthWhiteKeyPaint
; --------------------------
proc SeventhWhiteKeyPaint ; paints the Seventh white key in gray
mov [x],246
mov [y],50
SeventhWhiteKeyPaintBig: ;paints the big rectangle on the Seventh white key in gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],279
jne SeventhWhiteBig1
cmp [y],170
jne SeventhWhiteBig2
mov [x],241
mov [y],111
jmp SeventhWhiteKeyPaintSmall
SeventhWhiteBig1:
inc [x]
jmp SeventhWhiteKeyPaintBig
SeventhWhiteBig2:
inc [y]
mov [x],246
jmp SeventhWhiteKeyPaintBig
SeventhWhiteKeyPaintSmall: ;Paints the small rectangle on the Seventh white key gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],246
jne SeventhWhiteSmall1
cmp [y],170
jne SeventhWhiteSmall2
mov cx,00007h
je ChangetoWhite7
mov [color1],00007h
call ReceiveKey
ChangetoWhite7:
mov [color1],0000Fh
call SeventhWhiteKeyPaint
SeventhWhiteSmall1:
inc [x]
jmp SeventhWhiteKeyPaintSmall
SeventhWhiteSmall2:
inc [y]
mov [x],241
jmp SeventhWhiteKeyPaintSmall
endp SeventhWhiteKeyPaint;
; --------------------------
proc EighthWhiteKeyPaint ; paints the Eighth white key in gray
mov [x],281
mov [y],50
EighthWhiteKeyPaintBig: ;paints the big rectangle on the Seventh white key in gray
push [x]
push [y]
push [color1]
call PrintPixel
cmp [x],319
jne EighthWhite1
cmp [y],170
jne EighthWhite2
mov cx,00007h
je ChangetoWhite8
mov [color1],00007h
call ReceiveKey
ChangetoWhite8:
mov [color1],0000Fh
call EighthWhiteKeyPaint
EighthWhite1:
inc [x]
jmp EighthWhiteKeyPaintBig
EighthWhite2:
inc [y]
mov [x],281
jmp EighthWhiteKeyPaintBig
endp EighthWhiteKeyPaint
; --------------------------------------------------------------------------------------------
proc FirstBlackKeyPaint
mov [color3],00008h; Dark Gray Color
FirstBlackKeyPaint1:
call PrintBlackKey1
mov cx,86h
int 15h
cmp [color3],00008h
je ChangetoBlack1
mov [color3],00008h
call ReceiveKey
ChangetoBlack1:
mov [color3],0000h
call FirstBlackKeyPaint1
endp FirstBlackKeyPaint
; --------------------------
proc SecondBlackKeyPaint
mov [color3],00008h; Dark Gray Color
SecondBlackKeyPaint1:
call PrintBlackKey2
mov cx,00008h
je ChangetoBlack2
mov [color3],00008h
call ReceiveKey
ChangetoBlack2:
mov [color3],0000h
call SecondBlackKeyPaint1
endp SecondBlackKeyPaint
; --------------------------
proc ThirdBlackKeyPaint
mov [color3],00008h; Dark Gray Color
ThirdBlackKeyPaint1:
call PrintBlackKey3
mov cx,00008h
je ChangetoBlack3
mov [color3],00008h
call ReceiveKey
ChangetoBlack3:
mov [color3],0000h
call ThirdBlackKeyPaint1
endp ThirdBlackKeyPaint
; --------------------------
proc FourthBlackKeyPaint
mov [color3],00008h; Dark Gray Color
FourthBlackKeyPaint1:
call PrintBlackKey4
mov cx,00008h
je ChangetoBlack4
mov [color3],00008h
call ReceiveKey
ChangetoBlack4:
mov [color3],0000h
call FourthBlackKeyPaint1
endp FourthBlackKeyPaint
; --------------------------
proc FifthBlackKeyPaint
mov [color3],00008h; Dark Gray Color
FifthBlackKeyPaint1:
call PrintBlackKey5
mov cx,00008h
je ChangetoBlack5
mov [color3],00008h
call ReceiveKey
ChangetoBlack5:
mov [color3],0000h
call FifthBlackKeyPaint1
endp FifthBlackKeyPaint
; --------------------------------------------------------------------------------------------
start:
mov ax,@data
mov ds,ax
; --------------------------
; Your code here
call graphic
call ReceiveKey
; --------------------------
exit:
mov ax,4c00h
int 21h
END start
解决方法
按下键盘上的键后,音符变为灰色,并在 0.746 秒后变回白色。
它完全按照您在 proc FirstBlackKeyPaint
中使用 Int 15/AH=86h
长时间按下某个键时会出现闪烁/毛刺。然后,键码以键入速率重复存储到键盘缓冲区,并在 proc ReceiveKey
中通过 Int 16/AH=00h 多次检索,尽管键盘键已经释放。
您可以在每个 ReceiveKey
之前使用 DOS 服务 Int 21/AH=0Ch 刷新缓冲区:
ReceiveKey:
; mov ah,0
; Int 16h
MOV AH,0Ch ; FLUSH BUFFER AND READ STANDARD INPUT
MOV AL,01h ; CHECK FOR KEYSTROKE
INT 21h
但是,您可能希望生成长度可变的音调,在这种情况下,您将需要一种不同的输入方法:从键盘端口 60h 直接输入而不是 BIOS service Int 16h。我的 DOS 实用程序 OPIN Keys 可用于了解按下和释放键时从键盘端口读取的代码。