251 lines
5.7 KiB
PHP
251 lines
5.7 KiB
PHP
;/*
|
|
;++
|
|
;
|
|
; Copyright (c) 1989 Microsoft Corporation
|
|
;
|
|
; Module Name:
|
|
;
|
|
; ix8259.inc
|
|
;
|
|
; Abstract:
|
|
;
|
|
; This module contains the definitions used by HAL to manipulate
|
|
; 8259 interrupt controller and 8259-specific constants.
|
|
;
|
|
; WARNING: This file is included by both ASM and C files.
|
|
;
|
|
; Author:
|
|
;
|
|
; John Vert (jvert) 31-Dec-1991
|
|
;
|
|
; (Moved from ke\i386\kimacro.inc)
|
|
;
|
|
;--
|
|
if 0 ; Begin C only code */
|
|
|
|
//
|
|
// 8259 defines for C code
|
|
// BE SURE TO CHANGE THESE VALUES IN BOTH TABLES!
|
|
//
|
|
|
|
#define HIGHEST_LEVEL_FOR_8259 27 // Highest level for standard 8259
|
|
#define PRIMARY_VECTOR_BASE 0x30 // Vector base for standard 8259
|
|
#if defined(NEC_98)
|
|
#if defined(NT_UP_98)
|
|
#define PROFILE_VECTOR (PRIMARY_VECTOR_BASE + 0) // standard profile
|
|
#else
|
|
#define PROFILE_VECTOR (PRIMARY_VECTOR_BASE + 15) // standard profile
|
|
#endif
|
|
#else // defined(NEC_98)
|
|
#define PROFILE_VECTOR (PRIMARY_VECTOR_BASE + 8) // standard profile
|
|
#endif // defined(NEC_98)
|
|
#define CLOCK_VECTOR (PRIMARY_VECTOR_BASE + 0) // standard clock
|
|
#define I386_80387_IRQ 0x0d // standard npx
|
|
#define I386_80387_IRQL (HIGHEST_LEVEL_FOR_8259 - I386_80387_IRQ)
|
|
#define I386_80387_VECTOR (PRIMARY_VECTOR_BASE + I386_80387_IRQ)
|
|
#define PIC_VECTORS 16
|
|
#define V2I(a) (a-PRIMARY_VECTOR_BASE) // Vector to interrupt macro
|
|
#define I386_80387_BUSY_PORT (PUCHAR)0xF0
|
|
|
|
#ifndef NEC_98
|
|
#define PIC_SLAVE_IRQ 2
|
|
#define PIC_SLAVE_REDIRECT 9
|
|
#else
|
|
#define PIC_SLAVE_IRQ 7
|
|
#define PIC_SLAVE_REDIRECT 8
|
|
#endif
|
|
|
|
|
|
#define EISA_EDGE_LEVEL0 0x4D0
|
|
#define EISA_EDGE_LEVEL1 0x4D1
|
|
|
|
|
|
/*
|
|
endif
|
|
|
|
;
|
|
; Same 8259 defines for assemble code
|
|
; BE SURE TO CHANGE THESE VALUES IN BOTH TABLES!
|
|
;
|
|
|
|
HIGHEST_LEVEL_FOR_8259 equ 27
|
|
PRIMARY_VECTOR_BASE equ 30h
|
|
ifdef NEC_98
|
|
ifdef NT_UP_98
|
|
PROFILE_VECTOR equ (PRIMARY_VECTOR_BASE + 0)
|
|
else
|
|
PROFILE_VECTOR equ (PRIMARY_VECTOR_BASE + 15)
|
|
endif
|
|
else ; NEC_98
|
|
PROFILE_VECTOR equ (PRIMARY_VECTOR_BASE + 8)
|
|
endif ; NEC_98
|
|
CLOCK_VECTOR equ (PRIMARY_VECTOR_BASE + 0)
|
|
I386_80387_IRQ equ 0dh
|
|
I386_80387_IRQL equ (HIGHEST_LEVEL_FOR_8259 - I386_80387_IRQ)
|
|
I386_80387_VECTOR equ (PRIMARY_VECTOR_BASE + I386_80387_IRQ)
|
|
I386_80387_BUSY_PORT equ 0f0h ; port to dismiss busy error line
|
|
|
|
ifdef NEC_98
|
|
PIC_SLAVE_IRQ equ 7
|
|
else
|
|
PIC_SLAVE_IRQ equ 2
|
|
endif
|
|
|
|
;
|
|
; The rest of the file are macros used in assemble only.
|
|
;
|
|
|
|
;++
|
|
;
|
|
; SET_8259_MASK
|
|
;
|
|
; Macro Description:
|
|
;
|
|
; This macro sets 8259 interrupt mask register with the mask
|
|
; passed from eax register.
|
|
;
|
|
; Note: Currently, only two 8259s are support. As a result,
|
|
; only ax contains valid mask.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; (eax) = mask for setting 8259 interrupt mask register
|
|
;
|
|
;--
|
|
|
|
SET_8259_MASK macro
|
|
local a ; define local labels
|
|
|
|
out PIC1_PORT1, al ; set master 8259 mask
|
|
shr eax, 8 ; shift slave 8259 mask to al
|
|
out PIC2_PORT1, al ; set slave 8259 mask
|
|
a:
|
|
endm
|
|
|
|
;
|
|
; Interrupt controller register addresses
|
|
;
|
|
|
|
ifdef NEC_98
|
|
PIC1_PORT0 equ 00H
|
|
PIC1_PORT1 equ 02H
|
|
PIC2_PORT0 equ 08H
|
|
PIC2_PORT1 equ 0AH
|
|
else ; NEC_98
|
|
PIC1_PORT0 equ 020H
|
|
PIC1_PORT1 equ 021H
|
|
PIC2_PORT0 equ 0A0H
|
|
PIC2_PORT1 equ 0A1H
|
|
endif ; NEC_98
|
|
|
|
EISA_EDGE_LEVEL0 EQU 4D0h
|
|
EISA_EDGE_LEVEL1 EQU 4D1h
|
|
|
|
;
|
|
; Commands for Interrupt controller
|
|
;
|
|
|
|
PIC1_EOI_MASK equ 060H
|
|
ifdef NEC_98
|
|
PIC2_EOI equ 067H ; special EOI
|
|
else ; NEC_98
|
|
PIC2_EOI equ 062H
|
|
endif ; NEC_98
|
|
OCW2_NON_SPECIFIC_EOI equ 020H
|
|
OCW2_SPECIFIC_EOI equ 060H
|
|
OCW3_READ_ISR equ 0BH
|
|
OCW3_READ_IRR equ 0AH
|
|
|
|
|
|
;++
|
|
;
|
|
; IODELAY
|
|
;
|
|
; Macro Description:
|
|
;
|
|
; This macro simply does a jmp to next instruction to synchronize
|
|
; IO port access.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; None
|
|
;
|
|
;--
|
|
|
|
IODELAY macro
|
|
ifdef NEC_98
|
|
out 5fh,al ; same effect with "stdcall IODelay8259"
|
|
else ; NEC_98
|
|
jmp $+2
|
|
endif ; NEC_98
|
|
endm
|
|
|
|
|
|
;++
|
|
;
|
|
; PICDELAY
|
|
;
|
|
; Macro Description:
|
|
;
|
|
; This macro does an inb on interrupt mask register to provide the
|
|
; time for 8259 to get stabled.
|
|
;
|
|
; Why do we need this?
|
|
;
|
|
; This is because:
|
|
; . The 80386 has a delayed write to memory and delayed output to IO
|
|
; capability and
|
|
; . 8259 needs some time to settle
|
|
;
|
|
; It is possible for the actual output cycle to 8259 to occur after
|
|
; the completion of instructions following the out instruction. For
|
|
; example, the STI instruction after SET_MASK and dismiss interrupt
|
|
; macros may complete before 8259 actually drops the interrupt. We don't
|
|
; want this happen in MCA system.
|
|
;
|
|
; You may argue that most OEMS add about 450ns delay to solve the
|
|
; back-to-back IO (delay) problem. But, remember that STI is not an IO
|
|
; instruction.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; None
|
|
;
|
|
; NOTE: * The content of AL will be destroyed on return.
|
|
;
|
|
;--
|
|
|
|
PIC1DELAY macro
|
|
in al, PIC1_PORT1
|
|
endm
|
|
|
|
PIC2DELAY macro
|
|
in al, PIC2_PORT1
|
|
endm
|
|
|
|
;++
|
|
;
|
|
; SOFT_INTERRUPT_EXIT
|
|
;
|
|
; Macro Description:
|
|
;
|
|
; This macro is executed on return from the soft interrupt
|
|
; service routine. Its function is to restore privileged processor
|
|
; state, and continue thread execution.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; (TOS) = previous irql
|
|
; (TOS+4 ...) = machine_state frame
|
|
;
|
|
;--
|
|
|
|
SOFT_INTERRUPT_EXIT macro
|
|
|
|
EXTRNP _HalpEndSoftwareInterrupt,1
|
|
cli
|
|
call _HalpEndSoftwareInterrupt@4 ; restore irql
|
|
SPURIOUS_INTERRUPT_EXIT ; exit interrupt without EOI
|
|
endm
|
|
;*/
|