📄 debtable.asm
字号:
;**************************************************************************
;*
;* DEBTABLE.ASM
;*
;* Copyright (c) 1999-2001 National Semiconductor Corporation.
;* All Rights Reserved.
;*
;* Function:
;* Set up a generic handler for every interrupt. The handlers
;* output their number on I/O port 80h.
;*
;* $Revision:: 1 $
;**************************************************************************
.486P
INCLUDE MACROS.INC
INCLUDE DEF.INC
INCLUDE PORT80.INC
INCLUDE strings.inc
INCLUDE OPTIONS.INC
INCLUDE NVRAMTOK.INC
_TEXT SEGMENT PUBLIC use16 'CODE'
EXTERN genericInt15:NEAR
;**************************************************************************
;*
;* set_timer
;*
;* pulse count = 1193180/(desired # of ticks per second)
;* standard 18.2 ticks/sec = 1193180/18.2 = 65535 -> so set pulse
;* count to 0 for 10000 ticks/sec, 1193180/10000 = 119.3 or
;* approx. 0077h
;*
;* Entry:
;* AX = pulse count value
;*
;* Exit:
;* Destroys:
;*
;**************************************************************************
set_timer PROC NEAR
cli
push ax
mov al, RW_CMD
out CMD_REG, al
pop ax
out CHAN_0, al
mov al,ah
IOPAUSE
out CHAN_0, al
IOPAUSE
sti
ret
set_timer ENDP
;**************************************************************************
;*
;* intTable
;*
;* Entry:
;* Exit:
;* Destroys:
;*
;**************************************************************************
intTable PROC NEAR PUBLIC
push bx
push ax
push ds
push ds
mov ax, 40h
mov ds, ax
mov ax, 000h
mov ds:[10h], ax
pop ds
push 0
pop ds
mov bx, 0
mov si, OFFSET ITABLE
goHere:
mov ax, cs:[si]
mov ds:[bx], ax
add bx, 2
add si, 2
mov ax, 0f000h
mov ds:[bx], ax
add bx, 2
cmp bx, 0400h ; 256 int's
jne goHere
mov bx, 9h
shl bx, 2
mov ax, OFFSET intRTC
mov ds:[bx], ax
add bx, 2
mov ax, 0f000h
mov ds:[bx], ax
mov bx, 15h
shl bx, 2
mov ax, OFFSET genericInt15
mov ds:[bx], ax
add bx, 2
mov ax, 0f000h
mov ds:[bx], ax
mov bx, 8
shl bx, 2
mov ax, OFFSET int8_handler
mov ds:[bx], ax
add bx, 2
mov ax, 0f000h
mov ds:[bx], ax
mov al, 011h ; Enable PIC for PC usage
out PIC_MASTER_PORT0, al ; icw1
out PIC_SLAVE_PORT0, al
mov al, 08h ; icw2
out PIC_MASTER_PORT1, al
mov al, 070h
out PIC_SLAVE_PORT1, al
mov al, 04h ; icw3
out PIC_MASTER_PORT1, al
mov al, 02h
out PIC_SLAVE_PORT1, al
mov al, 01h ; icw4
out PIC_MASTER_PORT1, al
out PIC_SLAVE_PORT1, al
;;; in a WBT system this is not needed, QNX etc... would probably like this.
call set_timer
mov dx,21h
in al,dx
mov al, 10111000b
IOPAUSE
out dx,al
mov dx,0A1h
in al,dx
mov al, 11111111b
IOPAUSE
out dx,al
sti
pop ds
pop ax
pop bx
jmp bx
intTable ENDP
ITABLE LABEL WORD
dw OFFSET int00p
dw OFFSET int01p
dw OFFSET int02p
dw OFFSET int03p
dw OFFSET int04p
dw OFFSET int05p
dw OFFSET int06p
dw OFFSET int07p
dw OFFSET int08p
dw OFFSET int09p
dw OFFSET int0ap
dw OFFSET int0bp
dw OFFSET int0cp
dw OFFSET int0dp
dw OFFSET int0ep
dw OFFSET int0fp
dw OFFSET int10p
dw OFFSET int11p
dw OFFSET int12p
dw OFFSET int13p
dw OFFSET INT14ENTRY
dw OFFSET int15p
dw OFFSET int16p
dw OFFSET INT17ENTRY
dw OFFSET int18p
dw OFFSET int19p
dw OFFSET int1Axx
dw OFFSET int1bp
dw OFFSET int1cp
dw OFFSET int1dp
dw OFFSET int1ep
dw OFFSET int1fp
dw OFFSET int20p
dw OFFSET int21p
dw OFFSET int22p
dw OFFSET int23p
dw OFFSET int24p
dw OFFSET int25p
dw OFFSET int26p
dw OFFSET int27p
dw OFFSET int28p
dw OFFSET int29p
dw OFFSET int2ap
dw OFFSET int2bp
dw OFFSET int2cp
dw OFFSET int2dp
dw OFFSET int2ep
dw OFFSET int2fp
dw OFFSET int30p
dw OFFSET int31p
dw OFFSET int32p
dw OFFSET int33p
dw OFFSET int34p
dw OFFSET int35p
dw OFFSET int36p
dw OFFSET int37p
dw OFFSET int38p
dw OFFSET int39p
dw OFFSET int3ap
dw OFFSET int3bp
dw OFFSET int3cp
dw OFFSET int3dp
dw OFFSET int3ep
dw OFFSET int3fp
dw OFFSET int40p
dw OFFSET int41p
dw OFFSET int42p
dw OFFSET int43p
dw OFFSET int44p
dw OFFSET int45p
dw OFFSET int46p
dw OFFSET int47p
dw OFFSET int48p
dw OFFSET int49p
dw OFFSET int4ap
dw OFFSET int4bp
dw OFFSET int4cp
dw OFFSET int4dp
dw OFFSET int4ep
dw OFFSET int4fp
dw OFFSET int50p
dw OFFSET int51p
dw OFFSET int52p
dw OFFSET int53p
dw OFFSET int54p
dw OFFSET int55p
dw OFFSET int56p
dw OFFSET int57p
dw OFFSET int58p
dw OFFSET int59p
dw OFFSET int5ap
dw OFFSET int5bp
dw OFFSET int5cp
dw OFFSET int5dp
dw OFFSET int5ep
dw OFFSET int5fp
dw OFFSET int60p
dw OFFSET int61p
dw OFFSET int62p
dw OFFSET int63p
dw OFFSET int64p
dw OFFSET int65p
dw OFFSET int66p
dw OFFSET int67p
dw OFFSET int68p
dw OFFSET int69p
dw OFFSET int6ap
dw OFFSET int6bp
dw OFFSET int6cp
dw OFFSET int6dp
dw OFFSET int6ep
dw OFFSET int6fp
dw OFFSET int70p
dw OFFSET int71p
dw OFFSET int72p
dw OFFSET int73p
dw OFFSET int74p
dw OFFSET int75p
dw OFFSET int76p
dw OFFSET int77p
dw OFFSET int78p
dw OFFSET int79p
dw OFFSET int7ap
dw OFFSET int7bp
dw OFFSET int7cp
dw OFFSET int7dp
dw OFFSET int7ep
dw OFFSET int7fp
dw OFFSET int80p
dw OFFSET int81p
dw OFFSET int82p
dw OFFSET int83p
dw OFFSET int84p
dw OFFSET int85p
dw OFFSET int86p
dw OFFSET int87p
dw OFFSET int88p
dw OFFSET int89p
dw OFFSET int8ap
dw OFFSET int8bp
dw OFFSET int8cp
dw OFFSET int8dp
dw OFFSET int8ep
dw OFFSET int8fp
dw OFFSET int90p
dw OFFSET int91p
dw OFFSET int92p
dw OFFSET int93p
dw OFFSET int94p
dw OFFSET int95p
dw OFFSET int96p
dw OFFSET int97p
dw OFFSET int98p
dw OFFSET int99p
dw OFFSET int9ap
dw OFFSET int9bp
dw OFFSET int9cp
dw OFFSET int9dp
dw OFFSET int9ep
dw OFFSET int9fp
dw OFFSET inta0p
dw OFFSET inta1p
dw OFFSET inta2p
dw OFFSET inta3p
dw OFFSET inta4p
dw OFFSET inta5p
dw OFFSET inta6p
dw OFFSET inta7p
dw OFFSET inta8p
dw OFFSET inta9p
dw OFFSET intaap
dw OFFSET intabp
dw OFFSET intacp
dw OFFSET intadp
dw OFFSET intaep
dw OFFSET intafp
dw OFFSET intb0p
dw OFFSET intb1p
dw OFFSET intb2p
dw OFFSET intb3p
dw OFFSET intb4p
dw OFFSET intb5p
dw OFFSET intb6p
dw OFFSET intb7p
dw OFFSET intb8p
dw OFFSET intb9p
dw OFFSET intbap
dw OFFSET intbbp
dw OFFSET intbcp
dw OFFSET intbdp
dw OFFSET intbep
dw OFFSET intbfp
dw OFFSET intc0p
dw OFFSET intc1p
dw OFFSET intc2p
dw OFFSET intc3p
dw OFFSET intc4p
dw OFFSET intc5p
dw OFFSET intc6p
dw OFFSET intc7p
dw OFFSET intc8p
dw OFFSET intc9p
dw OFFSET intcap
dw OFFSET intcbp
dw OFFSET intccp
dw OFFSET intcdp
dw OFFSET intcep
dw OFFSET intcfp
dw OFFSET intd0p
dw OFFSET intd1p
dw OFFSET intd2p
dw OFFSET intd3p
dw OFFSET intd4p
dw OFFSET intd5p
dw OFFSET intd6p
dw OFFSET intd7p
dw OFFSET intd8p
dw OFFSET intd9p
dw OFFSET intdap
dw OFFSET intdbp
dw OFFSET intdcp
dw OFFSET intddp
dw OFFSET intdep
dw OFFSET intdfp
dw OFFSET inte0p
dw OFFSET inte1p
dw OFFSET inte2p
dw OFFSET inte3p
dw OFFSET inte4p
dw OFFSET inte5p
dw OFFSET inte6p
dw OFFSET inte7p
dw OFFSET inte8p
dw OFFSET inte9p
dw OFFSET inteap
dw OFFSET intebp
dw OFFSET intecp
dw OFFSET intedp
dw OFFSET inteep
dw OFFSET intefp
dw OFFSET intf0p
dw OFFSET intf1p
dw OFFSET intf2p
dw OFFSET intf3p
dw OFFSET intf4p
dw OFFSET intf5p
dw OFFSET intf6p
dw OFFSET intf7p
dw OFFSET intf8p
dw OFFSET intf9p
dw OFFSET intfap
dw OFFSET intfbp
dw OFFSET intfcp
dw OFFSET intfdp
dw OFFSET intfep
dw OFFSET intffp
;**************************************************************************
;*
;* genericInterrupt
;*
;* Entry:
;* Exit:
;* Destroys:
;*
;**************************************************************************
genericInterrupt PROC FAR PUBLIC
push ds
push ax
push dx ; Save callers registers
push ecx
pop ecx
pop dx ; Restore callers registers
pop ax
pop ds
iret
genericInterrupt ENDP
;**************************************************************************
;*
;* intRTC
;*
;* Entry:
;* Exit:
;* Destroys:
;*
;**************************************************************************
intRTC PROC FAR PUBLIC
cli
push ds
push ax
push dx ; Save callers registers
push cx
mov ax,40h
mov ds,ax
ASSUME ds:nothing
mov al, 0ch
out 070h, al
in al, 071h
mov al, 020h
out 0A0h, al ; End of Int
out 020h, al ; End of Int
pop cx
pop dx ; Restore callers registers
pop ax
pop ds
sti
iret
intRTC ENDP
;**************************************************************************
;*
;* intxxp
;*
;* Entry:
;* Exit:
;* Destroys:
;*
;**************************************************************************
int00p PROC NEAR
push ax
mov al, 000h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int00p ENDP
int01p PROC NEAR
push ax
mov al, 001h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int01p ENDP
int02p PROC NEAR public
push ax
mov al, 002h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int02p ENDP
int03p PROC NEAR
push ax
mov al, 003h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int03p ENDP
int04p PROC NEAR
push ax
mov al, 004h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int04p ENDP
int05p PROC NEAR public
push ax
mov al, 005h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int05p ENDP
int06p PROC NEAR public
push ax
mov al, 006h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp $
jmp genericInterrupt
int06p ENDP
int07p PROC NEAR
push ax
mov al, 007h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int07p ENDP
int08p PROC NEAR public
push ax
mov al, 008h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int08p ENDP
int09p PROC NEAR
public hardwareInt1
hardwareInt1::
push ax
mov al, 009h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int09p ENDP
int0ap PROC NEAR
push ax
mov al, 00ah
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int0ap ENDP
int0bp PROC NEAR
push ax
mov al, 00bh
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int0bp ENDP
int0cp PROC NEAR
push ax
mov al, 00ch
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int0cp ENDP
int0dp PROC NEAR
push ax
mov al, 00dh
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int0dp ENDP
int0ep PROC NEAR
public hardwareInt6
hardwareInt6::
push ax
mov al, 00eh
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int0ep ENDP
int0fp PROC NEAR
push ax
mov al, 00fh
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int0fp ENDP
int10p PROC NEAR
push ax
mov al, 010h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int10p ENDP
int11p PROC NEAR public
push ds
sti
mov ax, 40h
mov ds, ax
xor eax,eax
mov ax, WORD PTR ds:[10h]
pop ds
clc
retf 02
int11p ENDP
int12p PROC NEAR public
sti
; push ds
; mov ax, 40h
; mov ds, ax
; mov ax, ds:[13h]
; pop ds
mov ax, 0280h
clc
retf 02
int12p ENDP
int13p PROC NEAR public
push ax
mov al, 013h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
; dummy floppy in case any disk code is not installed
mov ah,01h ; not installed
sti ; re-enable ints
stc
retf 2
int13p ENDP
int14p PROC NEAR
push ax
mov al, 014h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int14p ENDP
int15p PROC NEAR
push ax
mov al, 015h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int15p ENDP
int16p PROC NEAR
sti
cmp ah, 01h
jne NotCheckKey
xor ax, ax
cmp al, 0 ; Set ZF
retf 02
NotCheckKey:
cmp ah, 00h
jne NotReadKey
mov ax, 0
clc
retf 02
NotReadKey:
cmp ah, 02h
jne DontKnowKey
mov al, 0 ; indicate no keys being pressed
retf 02
DontKnowKey:
stc
retf 02
int16p ENDP
int17p PROC NEAR
push ax
mov al, 017h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int17p ENDP
int18p PROC NEAR
msg 'No boot device present, halting.'
crlf
PORT80 POST_BootFailed ;post_1fh
Finished:
hlt
jmp Finished
int18p ENDP
int19p PROC NEAR
push ax
mov al, 019h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int19p ENDP
INT14ENTRY PROC NEAR
push ax
mov al, 014h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
INT14ENTRY ENDP
INT17ENTRY PROC NEAR
push ax
mov al, 017h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
INT17ENTRY ENDP
;**************************************************************************
;*
;* int8_handler
;*
;* Entry:
;* Exit:
;* Destroys:
;*
;**************************************************************************
int8_handler PROC FAR
push eax
push ecx
push ds
push dx
push bx
mov ax, 40h
mov ds, ax
ASSUME ds:nothing
inc WORD PTR ds:[6Ch]
jnz check_rollover
inc WORD PTR ds:[6Eh]
check_rollover:
cmp WORD PTR ds:[6Eh], 018h
jnz time_flop
cmp WORD PTR ds:[6Ch], 0b0h
jnz time_flop
mov WORD PTR ds:[6Eh], 0
mov WORD PTR ds:[6Ch], 0
mov BYTE PTR ds:[70h], 1
time_flop: cmp BYTE PTR ds:[40h], 0
je time_flop_done
dec BYTE PTR ds:[40h]
jnz time_flop_done
mov dx, 3f2h
mov al, 0
out dx, al
and BYTE PTR ds:[3fh], 0f0h
time_flop_done:
int 1ch
mov al, 20h
out 20h, al
pop bx
pop dx
pop ds
pop ecx
pop eax
iret
int8_handler ENDP
int1AXX PROC NEAR
push ax
mov al, 01ah
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int1AXX ENDP
int1bp PROC NEAR
push ax
mov al, 01bh
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int1bp ENDP
int1cp PROC NEAR
; push ax
; mov al, 01ch
; out 080h,al
; nop
; pop ax
; out 080h,al
; xchg al, ah
; out 080h, al
; xchg al, ah
jmp genericInterrupt
int1cp ENDP
int1dp PROC NEAR
push ax
mov al, 01dh
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int1dp ENDP
int1ep PROC NEAR
push ax
mov al, 01eh
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int1ep ENDP
int1fp PROC NEAR
push ax
mov al, 01fh
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int1fp ENDP
int20p PROC NEAR
push ax
mov al, 020h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int20p ENDP
int21p PROC NEAR
push ax
mov al, 021h
out 080h,al
nop
pop ax
cmp ah, 030h
jne not30
mov ax, 0807h
jmp genericInterrupt
not30:
cmp ah, 4ah
jne not4a
not4a:
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int21p ENDP
int22p PROC NEAR
push ax
mov al, 022h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int22p ENDP
int23p PROC NEAR
push ax
mov al, 023h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int23p ENDP
int24p PROC NEAR
push ax
mov al, 024h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int24p ENDP
int25p PROC NEAR
push ax
mov al, 025h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int25p ENDP
int26p PROC NEAR
push ax
mov al, 026h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
jmp genericInterrupt
int26p ENDP
int27p PROC NEAR
push ax
mov al, 027h
out 080h,al
nop
pop ax
out 080h,al
xchg al, ah
out 080h, al
xchg al, ah
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -