📄 interrup.asm
字号:
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
;
;Protected mode interrupt/exception handlers.
;
;-------------------------------------------------------------------------------
;
;Generate the initial entry points for the interupt handlers.
;
InterruptHandler proc near
rept 256
db 0e8h
dd offset IntHandler-($+4)
db 3 dup (-1)
endm
InterruptHandler endp
;-------------------------------------------------------------------------------
InterruptTable proc near
;
;Interupt handler entry points (Int nn and IntR).
;
IntNum = 0
rept 2fh
dd offset IntNN386Catch+IntNum
dw DpmiEmuCS
IntNum = IntNum+8
endm
dd offset Raw2FPatch
dw DpmiEmuCS
IntNum = IntNum+8
rept 30h-2fh
dd offset IntNN386Catch+IntNum
dw DpmiEmuCS
IntNum = IntNum+8
endm
dd offset RawDPMIPatch
dw DpmiEmuCS
IntNum = IntNum+8
rept 256-32h
dd offset IntNN386Catch+IntNum
dw DpmiEmuCS
IntNum = IntNum+8
endm
InterruptTable endp
;-------------------------------------------------------------------------------
IntNN386Catch proc near
rept 256
db 0e8h
dd offset IntNN386-($+4)
db 3 dup (-1)
endm
IntNN386Catch endp
;-------------------------------------------------------------------------------
ExceptionTable proc near
;
;Exception handler entry points (Processor exceptions).
;
IntNum = 0
rept 32
dd offset ExcepNN386Catch+IntNum
dw DpmiEmuCS
IntNum = IntNum+8
endm
ExceptionTable endp
;-------------------------------------------------------------------------------
ExcepNN386Catch proc near
rept 32
db 0e8h
dd offset ExcepNN386-($+4)
db 3 dup (-1)
endm
ExcepNN386Catch endp
;-------------------------------------------------------------------------------
;
;Get protected mode interupt handler address.
;
;On Entry:-
;
;BL - Interupt vector number.
;
;On Exit:-
;
;CF set on error. (no errors looked for).
;
;CX:EDX - selector:offset of current handler.
;
RawGetVector proc near
call RAWCopyCheck
;
pushm eax,ebx,esi,edi,ebp,ds,es,fs,gs
mov ax,DpmiEmuDS
mov ds,ax
movzx eax,bl
mov ebx,eax
shl ebx,1 ;*2
mov eax,ebx
shl ebx,1 ;*4
add ebx,eax ;*6
add ebx,offset InterruptTable
mov edx,[ebx] ;get offset.
mov cx,[ebx+4] ;get segment selector.
popm eax,ebx,esi,edi,ebp,ds,es,fs,gs
ret
RawGetVector endp
;-------------------------------------------------------------------------------
;
;Get real mode interupt handler address.
;
;On Entry:-
;
;BL - Interupt vector number.
;
;On Exit:-
;
;CF set on error. (no errors looked for).
;
;CX:DX - selector:offset of current handler.
;
RawGetRVector proc near
call RAWCopyCheck
;
pushm eax,ebx,esi,edi,ebp,ds,es,fs,gs
mov ax,KernalZero
mov es,ax
movzx ebx,bl
shl ebx,2
mov dx,es:[ebx]
mov cx,es:[ebx+2]
popm eax,ebx,esi,edi,ebp,ds,es,fs,gs
ret
RawGetRVector endp
;-------------------------------------------------------------------------------
;
;Get protected mode exception handler address.
;
;On Entry:-
;
;BL - Exception vector number.
;
;On Exit:-
;
;CF set on error.
;
;CX:EDX - selector:offset of current handler.
;
RawGetEVector proc near
call RAWCopyCheck
;
; pushm eax,ebx,esi,edi,ebp,ds,es,fs,gs
push ds
push es
push fs
push gs
push ebx
push esi
push edi
push ebp
push eax ; push last so is easily accessible for changing
mov ax,DpmiEmuDS
mov ds,ax
movzx eax,bl
mov edx,eax
mov ebx,eax
shl ebx,1 ;*2
mov eax,ebx
shl ebx,1 ;*4
add ebx,eax ;*6
add ebx,offset ExceptionTable
;
cmp dl,14 ;Special case for 14
; jnz @@Normal
je Special14 ; MED 01/17/96
cmp dl,20h
jc @@Normal
stc ; flag error
pop eax
mov ax,8021h ; flag invalid value
push eax
jmp @@GotVect ; don't get vector
Special14:
cmp w[OldExcep14+4],0 ;Virtual memory active?
jz @@Normal
;
;Vector 14 and VMM is installed.
;
mov edx,d[OldExcep14]
mov cx,w[OldExcep14+4]
jmp @@GotVect
@@Normal: ;
clc ; MED 01/17/96, flag no error
mov edx,[ebx] ;get offset.
mov cx,[ebx+4] ;get segment selector.
@@GotVect: ;
; popm eax,ebx,esi,edi,ebp,ds,es,fs,gs
pop eax
pop ebp
pop edi
pop esi
pop ebx
pop gs
pop fs
pop es
pop ds
ret
RawGetEVector endp
;-------------------------------------------------------------------------------
;
;Set protected mode interupt handler address.
;
;On Entry:-
;
;BL - Interupt vector number.
;CX:EDX - selector:offset of new handler.
;
;On Exit:-
;
;CF set on error.
;
RawSetVector proc near
call RAWCopyCheck
;
pushm eax,ebx,ecx,edx,esi,edi,ebp,ds,es,fs,gs
mov ax,DpmiEmuDS
mov ds,ax
test DpmiEmuSystemFlags,1
jz @@use32_add
movzx edx,dx
;
@@use32_add: ;Check if its a hardware interrupt.
;
mov ax,KernalDS
mov ds,ax
assume ds:_cwRaw
movzx ebx,bl
mov al,[ebx+Int2CallCheck]
or al,al
jz @@NotHardware
;*** MED 11/30/95
cmp bl,23h ; always allow 23h callback
je med2
cmp bl,24h ; always allow 24h callback
je med2
test NoPassFlag,0ffh ; see if not passing hardware interrupts from real to protected mode
jne @@NotHardware
;
med2:
cmp cx,DpmiEmuCS ;restoreing previous vector?
jnz @@Setting
@@Restoreing: ;
pushad
movzx cx,bl
sub bl,al
movzx bx,bl
mov ax,size CallBackStruc
mul bx
mov bx,ax
add bx,offset CallBackTable
test CallBackFlags[bx],1 ;this one in use?
jz @@DoneHardware ;not likely.
pushf
cli
push es
mov ax,KernalZero
mov es,ax
mov CallBackFlags[bx],0 ;Mark this one as un-used.
push cx
mov cx,w[CallBackReal+2+bx] ;get origional real mode vector.
mov dx,w[CallBackReal+bx]
pop bx
shl bx,2
mov es:[bx],dx
mov es:[bx+2],cx
pop es
popf
jmp @@DoneHardware
@@Setting: ;
pushad
movzx cx,bl
sub bl,al
movzx bx,bl
mov ax,size CallBackStruc
mul bx
mov dx,bx
mov bx,ax
add bx,offset CallBackTable
test CallBackFlags[bx],1 ;this one in use?
jnz @@DoneHardware
pushf
cli
push es
mov ax,KernalZero
mov es,ax
mov CallBackNum[bx],cl ;set interupt number.
mov CallBackFlags[bx],1+2 ;mark call back as used interupt.
mov ax,CallBackSize
mul dx
mov si,offset ICallBackList
add si,ax ;index list of calls.
push bx
mov bx,cx
shl bx,2
mov dx,es:[bx]
mov cx,es:[bx+2]
mov es:[bx],si
mov es:w[bx+2],seg _cwRaw
pop bx
mov w[CallBackReal+2+bx],cx ;store origional real mode vector.
mov w[CallBackReal+bx],dx
pop es
popf
@@DoneHardware: popad
@@NotHardware: mov ax,DpmiEmuDS
mov ds,ax
assume ds:_cwDPMIEMU
movzx eax,bl
mov ebx,eax
shl ebx,1 ;*2
mov eax,ebx
shl ebx,1 ;*4
add ebx,eax ;*6
add ebx,offset InterruptTable
pushf
cli
mov [ebx],edx ;set offset.
mov [ebx+4],cx ;set segment selector.
popf
popm eax,ebx,ecx,edx,esi,edi,ebp,ds,es,fs,gs
ret
RawSetVector endp
;-------------------------------------------------------------------------------
;
;Set real mode interupt handler address.
;
;On Entry:-
;
;BL - Interupt vector number.
;CX:DX - selector:offset of new handler.
;
;On Exit:-
;
;CF set on error.
;
RawSetRVector proc near
call RAWCopyCheck
;
pushm eax,ebx,ecx,edx,esi,edi,ebp,ds,es,fs,gs
mov ax,KernalZero
mov es,ax
movzx ebx,bl
shl ebx,2
pushf
cli
mov es:[ebx],dx
mov es:[ebx+2],cx
popf
popm eax,ebx,ecx,edx,esi,edi,ebp,ds,es,fs,gs
ret
RawSetRVector endp
;-------------------------------------------------------------------------------
;
;Set protected mode exception handler address.
;
;On Entry:-
;
;BL - Exception vector number.
;CX:EDX - selector:offset of new handler.
;
;On Exit:-
;
;CF set on error.
;
RawSetEVector proc near
call RAWCopyCheck
;
; pushm eax,ebx,ecx,edx,esi,edi,ebp,ds,es,fs,gs
push ds
push es
push fs
push gs
push ebx
push ecx
push edx
push esi
push edi
push ebp
push eax ; push last so is easily accessible for changing
mov ax,DpmiEmuDS
mov ds,ax
movzx eax,bl
push eax
mov ebx,eax
shl ebx,1 ;*2
mov eax,ebx
shl ebx,1 ;*4
add ebx,eax ;*6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -