PDA

View Full Version : حرفه ای: جایگزینی وقفه 09h



j_naroogha@yahoo.com
سه شنبه 13 دی 1390, 18:49 عصر
سلام دوستان
میخام وقفه ی 09h رو جایگزین کنم.
یا ساده تر اینکه مثلا وقتی ctrl + alt + delete رو میزنم سیستم Reset نشود(البته در Dos) ویا اینکه Lshift+ f رو زدم یه پیغام نشون بده ویا .... .
یه نمونه هم براش پیدا کردم(استادم برای راهنمایی بهم داده) .
ممکنه یه خورده براش توضیح بدین؟
برنامه شو نمیخام .فقط میخام مسءله برام باز بشه.
چیکار باید بکنم.؟
استادم میگه باید برای پردازنده "نمیدونم چی چی" (دقیقا حرف خودش بود...) ACK بفرستی و... .

j_naroogha@yahoo.com
سه شنبه 13 دی 1390, 18:52 عصر
اینم نمونه برنامه اش
; "KEYBORD.ASM" PC-9801UV11 make by R.H 1990/01/13
; modify 1991/06/22 PS55Z/S14 by R.H
;
; KEYBORD I/O.
;
;
; public subroutine.

IN_8259 MACRO NUM
JMP $+2
IN AL,NUM
JMP $+2
ENDM

OUT8259 MACRO NUM
JMP $+2
OUT NUM,AL
JMP $+2
ENDM

IN_8255 MACRO NUM
JMP $+2
IN AL,NUM
JMP $+2
ENDM

OUT8255 MACRO NUM
JMP $+2
OUT NUM,AL
JMP $+2
ENDM

CODE SEGMENT PUBLIC 'CODE'
ASSUME CS:CODE,DS:DATA

PUBLIC KYBSRT ; keybord start.
PUBLIC KYBEND ; keybord end.
PUBLIC KYBSTP ; keybord stop.
PUBLIC KYBCNT ; keybord cont.

PUBLIC KYBONS ; keybord STOP key on.
PUBLIC KYBOFS ; keybord STOP key off.

EXTRN XSTOPX:FAR ; ‚r‚s‚n‚oƒL[I—¹ˆ—
; ƒfƒoƒbƒNŽž‚É‚r‚s‚n‚oƒL[‚ð‰Ÿ‚·‚Æ‚±‚±‚É”ò‚эž ñ‚Å‚­‚é


; keybord start.

KYBSRT PROC NEAR
CALL VECSET_KEYBORD_SAVE ; vector save.

CALL VECSET_KEYBORD ; keybord int vector.

CLI
IN_8259 21H ; IMR save.
MOV SAVE_IMR,AX ;

AND AL,11111101B ; unmask.(IR1)
OUT8259 21H ; IMR set.
STI

RET
KYBSRT ENDP


; keybord end.

KYBEND PROC NEAR

CALL VECSET_KEYBORD_STOP ; keybord stop vector.

CLI
MOV AX,SAVE_IMR ;
OUT8259 21H ; IMR load.
STI

CALL VECSET_KEYBORD_LOAD ; vector load.

RET
KYBEND ENDP


; keybord stop.

KYBSTP PROC NEAR

CALL VECSET_KEYBORD_STOP ; keybord stop vector.

JMP KYBSTP2 ; JUMP (cpu cue buffer clear.)
KYBSTP2: ;

TEST BYTE PTR SAVE_IMR,00000010B ; return mask. (IR1)
JZ KYBSTP1 ; set mask ?

CLI
IN_8259 21H ; IMR read.
OR AL,00000010B ; mask.(IR1)
OUT8259 21H ; IMR write.
STI
KYBSTP1:
CALL VECSET_KEYBORD_LOAD ; vector load.

RET
KYBSTP ENDP


; keybord cont.

KYBCNT PROC NEAR
CALL VECSET_KEYBORD ; keybord int vector.

CLI
IN_8259 21H ; IMR read.
AND AL,11111101B ; unmask.(IR1)
OUT8259 21H ; IMR write.
STI

RET
KYBCNT ENDP


; keybord STOP key on.

KYBONS PROC NEAR
MOV STOPKEY_FLAG,1 ; 1=STOP key on.
RET
KYBONS ENDP


; keybord STOP key off.

KYBOFS PROC NEAR
MOV STOPKEY_FLAG,0 ; 0=STOP key off.
RET
KYBOFS ENDP



VEC_KEY_OFST EQU 24H ; int 09h
VEC_KEY_SEG EQU 26H ;

; common subroutine.

VECSET_KEYBORD PROC NEAR
CLI

MOV AX,0 ; 0 base.
MOV ES,AX ;

MOV WORD PTR ES:[VEC_KEY_OFST],OFFSET KEYINT

MOV WORD PTR ES:[VEC_KEY_SEG],SEG KYICOD

STI
RET
VECSET_KEYBORD ENDP

VECSET_KEYBORD_STOP PROC NEAR
CLI

MOV AX,0 ; 0 base.
MOV ES,AX ;

MOV WORD PTR ES:[VEC_KEY_OFST],OFFSET KEYINT_STOP

MOV WORD PTR ES:[VEC_KEY_SEG],SEG KYICOD

STI
RET
VECSET_KEYBORD_STOP ENDP

VECSET_KEYBORD_SAVE PROC NEAR
CLI

MOV AX,0 ; 0 base.
MOV ES,AX ;

MOV AX,WORD PTR ES:[VEC_KEY_OFST]
MOV SAVE_VEC_KEY_OFST,AX

MOV AX,WORD PTR ES:[VEC_KEY_SEG]
MOV SAVE_VEC_KEY_SEG,AX

STI
RET
VECSET_KEYBORD_SAVE ENDP

VECSET_KEYBORD_LOAD PROC NEAR
CLI

MOV AX,0 ; 0 base.
MOV ES,AX ;

MOV AX,SAVE_VEC_KEY_OFST
MOV WORD PTR ES:[VEC_KEY_OFST],AX

MOV AX,SAVE_VEC_KEY_SEG
MOV WORD PTR ES:[VEC_KEY_SEG],AX

STI
RET
VECSET_KEYBORD_LOAD ENDP

CODE ENDS



; keybord interrapt routine.

PORT_A EQU 60H ; data read/command write.

KYCMDW EQU 43H ; mode/command write.
KYDATR EQU 41H ; data read.
KYSTRD EQU 43H ; status read.

KRETRY_MAX EQU 3 ; keybord retry counter max.


KYICOD SEGMENT PUBLIC 'KYICOD'
ASSUME CS:KYICOD,DS:DATA



KEYINT PROC FAR
PUSH DS
PUSH AX
PUSH BX
PUSH CX

;*DBG*;
;*DBG*; MOV AX,0A000H ; ƒeƒLƒXƒgƒ}[ƒN‚Ì–¾–Å
;*DBG*; MOV DS,AX ; text segment
;*DBG*; MOV AX,'%' ;
;*DBG*; CMP AX,DS:[4] ; text offset
;*DBG*; JNZ KEYINT00 ;
;*DBG*; MOV AX,' ' ;
;*DBG*;KEYINT00: ;
;*DBG*; MOV DS:[4],AX ;
;*DBG*;

MOV CX,5 ;
KEYINT_WT: ;
NOP ;
LOOP KEYINT_WT ; JUMP (cpu cue buffer clear.)

MOV AX,SEG DATA ; DS=data segment.
MOV DS,AX ;

IN_8255 PORT_A ; data read/command write.
KEYINT_SET:
MOV KYCODE,AL
CALL KEY_CODE_SET ; key code set.

CALL KEY_LOCATE ; key locate.
KEYINT_EXIT:
MOV AL,20H ; EOI send.
OUT8259 20H ;

;*; CMP DOSACS,1 ; DOS access flag. 0=nomal,1=now access.
;*; JE KEYINT_EXIT3 ; (DISKRD.ASM)

;*; CMP BYTE PTR DS:KYTBLS[14],1 ; key codeuBSv
;*; JNE KEYINT_EXIT2 ;
;*; CMP BYTE PTR DS:KYTBLS[11],1000B ; [F1] key on?
;*; JE KEYINT_EXIT_STOP_KEY ;

;*NON*; TEST KYTBLS[1],1000000B ; [COPY] key on?
;*NON*; JNZ KEYINT_EXIT_STOP_KEY ;

KEYINT_EXIT2:
CMP BYTE PTR DS:KYTBLS[13],10B ; key codeuCtrlv
JNE KEYINT_EXIT3 ;
CMP BYTE PTR DS:KYTBLS[8],1000B ; key codeuAltv
JNE KEYINT_EXIT3 ;
;*; CMP BYTE PTR DS:KYTBLS[10],100B ; key codeuDeletev
;*; JNE KEYINT_EXIT3 ;
CMP BYTE PTR DS:KYTBLS[3],100000B ; key codeuDeletev
JNE KEYINT_EXIT3 ;

JMP KEYINT_EXIT_STOP_KEY ;

KEYINT_EXIT3:
POP CX
POP BX
POP AX
POP DS

IRET

KEYINT_EXIT_STOP_KEY:
CMP STOPKEY_FLAG,0 ; 1=STOP key on / 0=STOP key off.
JE KEYINT_EXIT2 ;

POP CX
POP BX
POP AX
POP DS

MOV BP,SP ;
MOV AX,OFFSET XSTOPX ; ‚r‚s‚n‚oƒL[I—¹ˆ—
MOV [BP],AX ; ‚h‚o
MOV AX,SEG CODE ;
MOV [BP][2],AX ; ‚b‚r
; SS:SP [ I P ] +0
; [ C S ] +2
; [ flags ] +4
IRET
KEYINT ENDP


; wait.

KEYINT_WAIT PROC NEAR
MOV CX,60 ;
KEYINT_WAIT3: ;
NOP ;
LOOP KEYINT_WAIT3 ; JUMP (cpu cue buffer clear.)
RET
KEYINT_WAIT ENDP



; key code set.
; -I- AL : read data.
; -I/O- DS:[KYTBLS] : key code table.

KEY_CODE_SET PROC NEAR
TEST AL,80H ; break?
JNZ KEY_CODE_SET_BREAK ;

KEY_CODE_SET_MAKE:
MOV BL,AL ;
AND BX,1111B ; key group num.

MOV CL,AL ;
AND CL,7FH ;
SHR CL,1 ; 1 nibl shift.
SHR CL,1 ;
SHR CL,1 ;
SHR CL,1 ;
MOV AH,1 ;
SHL AH,CL ; bitset
OR DS:KYTBLS[BX],AH ;
RET

KEY_CODE_SET_BREAK:
MOV BL,AL ;
AND BX,1111B ; key group num.

MOV CL,AL ;
AND CL,7FH ;
SHR CL,1 ; 1 nibl shift.
SHR CL,1 ;
SHR CL,1 ;
SHR CL,1 ;
MOV AH,11111110B ;
ROL AH,CL ; bitset
AND DS:KYTBLS[BX],AH ;
RET
KEY_CODE_SET ENDP



; key locate.
; -I- DS:KYTBLS : key code table.
; -O- DS:KYDRX : key locate direction x(+-)
; DS:KYDRY : key locate direction y(+-)
; DS:KYONL : key left bottan.(0=ON)
; DS:KYONR : key right bottan.(0=ON)

KEY_LOCATE PROC NEAR
MOV BX,0 ; key locate direction x(+-)
MOV CX,0 ; key locate direction y(+-)

TEST BYTE PTR DS:KYTBLS[11],10000B ; left.
JZ KEY_LOCATE1 ;
DEC BX ; x--
KEY_LOCATE1:
TEST BYTE PTR DS:KYTBLS[13],10000B ; right.
JZ KEY_LOCATE11 ;
INC BX ; x++
KEY_LOCATE11:
TEST BYTE PTR DS:KYTBLS[8],10000B ; upper.
JZ KEY_LOCATE2 ;
DEC CX ; y--
KEY_LOCATE2:
TEST BYTE PTR DS:KYTBLS[0],100000B ; under.
JZ KEY_LOCATE22 ;
INC CX ; y++
KEY_LOCATE22:
MOV DS:KYDRX,BX ; key locate direction x(+-)
MOV DS:KYDRY,CX ; key locate direction y(+-)

MOV KYONL,1 ; key left bottan.(0=ON)
TEST BYTE PTR DS:KYTBLS[12],100B ; 'Z'
JNZ KEY_LOCATE52 ;
TEST BYTE PTR DS:KYTBLS[9],1000B ; [SPACE]
JNZ KEY_LOCATE52 ;
TEST BYTE PTR DS:KYTBLS[12],10B ; extension key [ENTER]
JNZ KEY_LOCATE52 ;
TEST BYTE PTR DS:KYTBLS[10],100B ; extension key.
JZ KEY_LOCATE54 ;
TEST BYTE PTR DS:KYTBLS[3],100000B ; extension key [DEL]
JNZ KEY_LOCATE52 ;
JMP KEY_LOCATE54 ;
KEY_LOCATE52: ;
MOV KYONL,0 ; key left bottan.(0=ON)
KEY_LOCATE54: ;

MOV KYONR,1 ; key right bottan.(0=ON)
TEST BYTE PTR DS:KYTBLS[13],100B ; 'X'
JNZ KEY_LOCATE55 ;
TEST BYTE PTR DS:KYTBLS[10],100B ; extension key.
JZ KEY_LOCATE59 ;
TEST BYTE PTR DS:KYTBLS[1],100000B ; extension key [PAGE DOWN]
JNZ KEY_LOCATE55 ;
JMP KEY_LOCATE59 ;
KEY_LOCATE55: ;
MOV KYONR,0 ; key right bottan.(0=ON)
KEY_LOCATE59:
RET
KEY_LOCATE ENDP



KEYINT_STOP PROC FAR
PUSH AX
MOV AL,20H ; EOI send.
OUT8259 20H ;
POP AX
IRET
KEYINT_STOP ENDP


KYICOD ENDS




DATA SEGMENT PUBLIC 'DATA'

;*;EXTRN DOSACS:WORD ; DOS access flag. 0=nomal,1=now access.
;*; ; (DISKIO.ASM)

SAVE_IMR DW 0 ; IMR save area.

SAVE_VEC_KEY_OFST DW 0 ; keybord vector offset.
SAVE_VEC_KEY_SEG DW 0 ; keybord vector segment.

KRETRY DW 0 ; keybord retry counter.

; key direction.

PUBLIC KYDRX ; key locate direction x(+-)
PUBLIC KYDRY ; key locate direction y(+-)
PUBLIC KYONL ; key left bottan.(0=ON)
PUBLIC KYONR ; key right bottan.(0=ON)
KYDRX DW 0 ; key locate direction x(+-)
KYDRY DW 0 ; key locate direction y(+-)
KYONL DW 1 ; key left bottan.(0=ON)
KYONR DW 1 ; key right bottan.(0=ON)


; [STOP] key intarapt flag.

STOPKEY_FLAG DW 1 ; 1=STOP key on / 0=STOP key off.



PUBLIC KYCODE ; key code.
KYCODE DB 0

PUBLIC KYTBLS ; key code table.
KYTBLS LABEL BYTE
DB 0 ;0
DB 0 ;1
DB 0 ;2
DB 0 ;3
DB 0 ;4
DB 0 ;5
DB 0 ;6
DB 0 ;7
DB 0 ;8
DB 0 ;9
DB 0 ;A
DB 0 ;B
DB 0 ;C
DB 0 ;D
DB 0 ;E
DB 0 ;F

DATA ENDS

END
;
; end of "KEYBORD.ASM"
;
</PRE></BODY></HTML>

j_naroogha@yahoo.com
جمعه 16 دی 1390, 02:13 صبح
سلام دوستان
دوستان کسی نیست کمکم کنه؟

xman_1365_x
جمعه 16 دی 1390, 17:08 عصر
میخام وقفه ی 09h رو جایگزین کنم.

برنامه رو که دادن شما بررسی کنید !
سورس نمونه در emu8086 برای تغییر وقفه "custom_interrupt.asm"

یا ساده تر اینکه مثلا وقتی ctrl + alt + delete رو میزنم سیستم Reset نشود(البته در Dos) ویا اینکه Lshift+ f رو زدم یه پیغام نشون بده ویا .... .
روش دیگه اینکه میتونید tsr هم بنویسید وقفه و ورودی هارو چک کنید و تغییر بدین

موفق باشی