我想自己用INT 9(书上说键盘上的按键按下和松开都会引发INT 9中断) 编个能用方向键移动的点(别给我代码,我要自己写)
我现在脑袋好乱啊,汇编的键盘输入太复杂了啊~~~~(>_<)~~~~
不用系统和BIOS的中断怎么就这么囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧啊
5 个解决方案
#1
http://topic.csdn.net/u/20081002/13/2daf5cfb-a496-4c0e-99d8-e7cb050c865e.html
hmm,是code,但不是实现你要功能的code.
hmm,是code,但不是实现你要功能的code.
#2
BIOS有一个键盘缓冲区,INT 9触发时,从60H端口读入键盘扫描码,保存到键盘缓冲区。INT 16H从键盘缓冲区取扫描,并转换ASCII码返回。等待输入就是当缓冲区为空时循环一直检查,直到有数据为止。
#3
谁回答怎么挂起CPU,分给谁
#4
其实只要接管一下int 9就可以了,
以前收藏的一个,供参考:
1.接管INT 9 终端服务程序替换为发声程序.
2.退出并驻留内存,等待触发中断.
3.当有中断产生(如按键盘),进入新的中断服务程序Music.
4.检查按键是否是ALT+F6,or ALT+F7,如果不是就直接调用原本的INT9 中断服务程序处理.
如果是ALT+F6,就调用speaker发出声音,最后调用原本的INT9 中断服务程序处理.
如果是ALT+F7,就调用draw清屏,然后画图[黄色小矩形],调用原本的INT9 中断服务程序处理.
以前收藏的一个,供参考:
1.接管INT 9 终端服务程序替换为发声程序.
2.退出并驻留内存,等待触发中断.
3.当有中断产生(如按键盘),进入新的中断服务程序Music.
4.检查按键是否是ALT+F6,or ALT+F7,如果不是就直接调用原本的INT9 中断服务程序处理.
如果是ALT+F6,就调用speaker发出声音,最后调用原本的INT9 中断服务程序处理.
如果是ALT+F7,就调用draw清屏,然后画图[黄色小矩形],调用原本的INT9 中断服务程序处理.
drawup MACRO;clear screen
MOV AH,07H
MOV CH,0
MOV CL,0
MOV DH,79
MOV DL,79
MOV BH,00000010B
MOV AL,0
int 10h
ENDM
draw MACRO S1,S2,S3,S4,S5
MOV AH,07H
MOV CH,S2
MOV CL,S1
MOV DH,S4
MOV DL,S3
MOV BH,S5
MOV AL,0
int 10h
ENDM
speaker MACRO time,freq;make a sound as the time and frequency
local Dur,SpkrOn
MOV BX,time
MOV AX,0B6H
OUT 43H,AL ;Timer 2 Control
MOV DX,14H
MOV AX,4F38H
DIV freq
OUT 42H,AL ;LowByte(Quo)
MOV AL,AH
OUT 42H,AL ;HighByte(Quo)
IN AL,61H
MOV AH,AL
OR AL,03H ;SpeakOn
OUT 61H,AL ;Timer 2 On
Dur:
MOV CX,14546
SpkrOn:
LOOP SpkrOn
DEC BX
JNZ Dur
MOV AL,AH
OUT 61H,AL
ENDM
StSeg SEGMENT STACK
DB 64 dup (?)
StSeg ENDS
CodeSg SEGMENT
ASSUME CS: CodeSg
ORG 0100H
Main:
JMP Load
CARD DD ? ;存放原来的int 9 handle
A3 DW 440 ;設定音樂符號語頻率
AU3 DW 467
B3 DW 494
C4 DW 523
CU4 DW 555
D4 DW 587
DU4 DW 623
MUSIC PROC ;音樂
PUSH AX
MOV AH,02H ;Get KBD
INT 16H ;Status
TEST AL,00001000B;Alt
JZ Over
IN AL,60H
CMP AL,40H ;F6 Key
JNE Over
speaker 16000,D4
speaker 16000,D4
speaker 16000,CU4
Over:
IN AL,60H
CMP AL,41H ;F7 Key
JNE final
drawup
draw 37,3,45,3,11100110B
final:
POP AX
JMP CS:CARD
MUSIC ENDP
ASSUME CS:CodeSg,DS:CodeSg
Load PROC NEAR
push CS
pop DS
MOV AH,35H ;Get Interrupt Vector
MOV AL,09H
INT 21H
MOV WORD PTR CARD,BX
MOV AX,ES
MOV WORD PTR CARD+2,AX
MOV AH,25H ;Set Interrupt Vector
MOV AL,09H
MOV DX,OFFSET MUSIC
INT 21H
MOV DX,(OFFSET Load-OFFSET CodeSg)
ADD DX,15
MOV CL,4
SHR DX,CL
MOV AH,31H;程序退出并驻留内存
INT 21H
Load ENDP
CodeSg ENDS
END Main
#5
不想要分,不回答。
#1
http://topic.csdn.net/u/20081002/13/2daf5cfb-a496-4c0e-99d8-e7cb050c865e.html
hmm,是code,但不是实现你要功能的code.
hmm,是code,但不是实现你要功能的code.
#2
BIOS有一个键盘缓冲区,INT 9触发时,从60H端口读入键盘扫描码,保存到键盘缓冲区。INT 16H从键盘缓冲区取扫描,并转换ASCII码返回。等待输入就是当缓冲区为空时循环一直检查,直到有数据为止。
#3
谁回答怎么挂起CPU,分给谁
#4
其实只要接管一下int 9就可以了,
以前收藏的一个,供参考:
1.接管INT 9 终端服务程序替换为发声程序.
2.退出并驻留内存,等待触发中断.
3.当有中断产生(如按键盘),进入新的中断服务程序Music.
4.检查按键是否是ALT+F6,or ALT+F7,如果不是就直接调用原本的INT9 中断服务程序处理.
如果是ALT+F6,就调用speaker发出声音,最后调用原本的INT9 中断服务程序处理.
如果是ALT+F7,就调用draw清屏,然后画图[黄色小矩形],调用原本的INT9 中断服务程序处理.
以前收藏的一个,供参考:
1.接管INT 9 终端服务程序替换为发声程序.
2.退出并驻留内存,等待触发中断.
3.当有中断产生(如按键盘),进入新的中断服务程序Music.
4.检查按键是否是ALT+F6,or ALT+F7,如果不是就直接调用原本的INT9 中断服务程序处理.
如果是ALT+F6,就调用speaker发出声音,最后调用原本的INT9 中断服务程序处理.
如果是ALT+F7,就调用draw清屏,然后画图[黄色小矩形],调用原本的INT9 中断服务程序处理.
drawup MACRO;clear screen
MOV AH,07H
MOV CH,0
MOV CL,0
MOV DH,79
MOV DL,79
MOV BH,00000010B
MOV AL,0
int 10h
ENDM
draw MACRO S1,S2,S3,S4,S5
MOV AH,07H
MOV CH,S2
MOV CL,S1
MOV DH,S4
MOV DL,S3
MOV BH,S5
MOV AL,0
int 10h
ENDM
speaker MACRO time,freq;make a sound as the time and frequency
local Dur,SpkrOn
MOV BX,time
MOV AX,0B6H
OUT 43H,AL ;Timer 2 Control
MOV DX,14H
MOV AX,4F38H
DIV freq
OUT 42H,AL ;LowByte(Quo)
MOV AL,AH
OUT 42H,AL ;HighByte(Quo)
IN AL,61H
MOV AH,AL
OR AL,03H ;SpeakOn
OUT 61H,AL ;Timer 2 On
Dur:
MOV CX,14546
SpkrOn:
LOOP SpkrOn
DEC BX
JNZ Dur
MOV AL,AH
OUT 61H,AL
ENDM
StSeg SEGMENT STACK
DB 64 dup (?)
StSeg ENDS
CodeSg SEGMENT
ASSUME CS: CodeSg
ORG 0100H
Main:
JMP Load
CARD DD ? ;存放原来的int 9 handle
A3 DW 440 ;設定音樂符號語頻率
AU3 DW 467
B3 DW 494
C4 DW 523
CU4 DW 555
D4 DW 587
DU4 DW 623
MUSIC PROC ;音樂
PUSH AX
MOV AH,02H ;Get KBD
INT 16H ;Status
TEST AL,00001000B;Alt
JZ Over
IN AL,60H
CMP AL,40H ;F6 Key
JNE Over
speaker 16000,D4
speaker 16000,D4
speaker 16000,CU4
Over:
IN AL,60H
CMP AL,41H ;F7 Key
JNE final
drawup
draw 37,3,45,3,11100110B
final:
POP AX
JMP CS:CARD
MUSIC ENDP
ASSUME CS:CodeSg,DS:CodeSg
Load PROC NEAR
push CS
pop DS
MOV AH,35H ;Get Interrupt Vector
MOV AL,09H
INT 21H
MOV WORD PTR CARD,BX
MOV AX,ES
MOV WORD PTR CARD+2,AX
MOV AH,25H ;Set Interrupt Vector
MOV AL,09H
MOV DX,OFFSET MUSIC
INT 21H
MOV DX,(OFFSET Load-OFFSET CodeSg)
ADD DX,15
MOV CL,4
SHR DX,CL
MOV AH,31H;程序退出并驻留内存
INT 21H
Load ENDP
CodeSg ENDS
END Main
#5
不想要分,不回答。