source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Initialization/Interrupts.asm@ 87

Last change on this file since 87 was 86, checked in by krille_n_@…, 14 years ago

Size optimizations in various files in the XTIDE BIOS.
Also added a new include file for generic macros (macros.inc).

File size: 8.2 KB
RevLine 
[33]1; Project name : IDE BIOS
2; Description : Functions for initializing the BIOS.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Interrupts_InitializeInterruptVectors
9; Parameters:
10; DS: RAMVARS segment
11; ES: BDA and Interrupt Vector segment (zero)
12; Returns:
13; Nothing
14; Corrupts registers:
15; All except segments
[86]16;--------------------------------------------------------------------
[33]17ALIGN JUMP_ALIGN
18Interrupts_InitializeInterruptVectors:
19 call Interrupts_InitializeInt13hAnd40h
20 call Interrupts_InitializeInt19h
21 jmp SHORT Interrupts_InitializeHardwareIrqHandlers
[86]22 ; Maybe all this should be inlined?
[33]23
24
25;--------------------------------------------------------------------
26; Interrupts_Int13hAnd40h
27; Parameters:
28; DS: RAMVARS segment
29; ES: BDA and Interrupt Vector segment (zero)
30; Returns:
31; Nothing
32; Corrupts registers:
33; AX, BX, CX, DX, SI, DI
[86]34;--------------------------------------------------------------------
[33]35ALIGN JUMP_ALIGN
36Interrupts_InitializeInt13hAnd40h:
37 mov ax, [es:INTV_DISK_FUNC*4] ; Load old INT 13h offset
38 mov dx, [es:INTV_DISK_FUNC*4+2] ; Load old INT 13h segment
39 mov [RAMVARS.fpOldI13h], ax ; Store old INT 13h offset
40 mov [RAMVARS.fpOldI13h+2], dx ; Store old INT 13h segment
41 mov bx, INTV_DISK_FUNC ; INT 13h interrupt vector offset
42 mov si, Int13h_DiskFunctions ; Interrupt handler offset
43 call Interrupts_InstallHandlerToVectorInBXFromCSSI
44
45 ; Only store INT 13h handler to 40h if 40h is not already installed.
46 ; At least AMI BIOS for 286 stores 40h handler by itself and calls
47 ; 40h from 13h. That system locks to infinite loop if we copy 13h to 40h.
48 call FloppyDrive_IsInt40hInstalled
[86]49 jc SHORT .Return
[33]50 mov [es:INTV_FLOPPY_FUNC*4], ax ; Store offset
51 mov [es:INTV_FLOPPY_FUNC*4+2], dx ; Store segment
[86]52.Return:
[33]53 ret
54
55
56;--------------------------------------------------------------------
57; Interrupts_InitializeInt19h
58; Parameters:
59; DS: RAMVARS segment
60; ES: BDA and Interrupt Vector segment (zero)
61; Returns:
62; Nothing
63; Corrupts registers:
64; BX, SI
[86]65;--------------------------------------------------------------------
[33]66ALIGN JUMP_ALIGN
67Interrupts_InitializeInt19h:
68 eMOVZX bx, [cs:ROMVARS.bBootLdrType] ; Load boot loader type
69 mov si, INTV_BOOTSTRAP ; 19h
70 xchg bx, si ; SI=Loader type, BX=19h
71 jmp [cs:si+.rgwSetupBootLoader] ; Jump to install selected loader
72ALIGN WORD_ALIGN
73.rgwSetupBootLoader:
74 dw .SetupBootMenuLoader ; BOOTLOADER_TYPE_MENU
75 dw .SetupSimpleLoader ; BOOTLOADER_TYPE_SIMPLE
76 dw .SetupBootMenuLoader ; reserved
77 dw .NoBootLoader ; BOOTLOADER_TYPE_NONE
78
79ALIGN JUMP_ALIGN
80.NoBootLoader:
81 test BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_LATE
82 jnz SHORT .SetupSimpleLoader ; Boot loader required for late initialization
83 ret
84ALIGN JUMP_ALIGN
85.SetupSimpleLoader:
86 mov si, Int19h_SimpleBootLoader
87 jmp Interrupts_InstallHandlerToVectorInBXFromCSSI
88ALIGN JUMP_ALIGN
89.SetupBootMenuLoader:
90 mov si, Int19hMenu_BootLoader
91 jmp Interrupts_InstallHandlerToVectorInBXFromCSSI
92
93
94;--------------------------------------------------------------------
95; Interrupts_InitializeHardwareIrqHandlers
96; Parameters:
97; ES: BDA and Interrupt Vector segment (zero)
98; Returns:
99; Nothing
100; Corrupts registers:
101; BX, CX, DX, SI, DI
[86]102;--------------------------------------------------------------------
[33]103ALIGN JUMP_ALIGN
104Interrupts_InitializeHardwareIrqHandlers:
105 call RamVars_GetIdeControllerCountToCX
106 mov di, ROMVARS.ideVars0 ; CS:SI points to first IDEVARS
107ALIGN JUMP_ALIGN
108.IdeControllerLoop:
109 eMOVZX bx, BYTE [cs:di+IDEVARS.bIRQ]
110 add di, BYTE IDEVARS_size ; Increment to next controller
111 call .InstallLowOrHighIrqHandler
112 loop .IdeControllerLoop
[86]113.Return:
114 ret ; This ret is shared with .InstallLowOrHighIrqHandler
[33]115
116;--------------------------------------------------------------------
117; .InstallLowOrHighIrqHandler
118; Parameters:
119; BX: IRQ number, 0 if IRQ disabled
120; ES: BDA and Interrupt Vector segment (zero)
121; Returns:
122; Nothing
123; Corrupts registers:
124; BX, SI
[86]125;--------------------------------------------------------------------
[33]126ALIGN JUMP_ALIGN
127.InstallLowOrHighIrqHandler:
[86]128 test bl, bl
129 jz SHORT .Return ; IRQ not used
[33]130 cmp bl, 8
[86]131 jb SHORT .InstallLowIrqHandler
132 ; Fall through to .InstallHighIrqHandler
[33]133
134;--------------------------------------------------------------------
135; .InstallHighIrqHandler
136; Parameters:
137; BX: IRQ number (8...15)
138; ES: BDA and Interrupt Vector segment (zero)
139; Returns:
140; Nothing
141; Corrupts registers:
142; BX, SI
[86]143;--------------------------------------------------------------------
144;ALIGN JUMP_ALIGN
145;.InstallHighIrqHandler:
[33]146 add bx, BYTE INTV_IRQ8 - 8 ; Interrupt vector number
147 mov si, HIRQ_InterruptServiceRoutineForIrqs8to15
148 jmp SHORT Interrupts_InstallHandlerToVectorInBXFromCSSI
149
150;--------------------------------------------------------------------
151; .InstallLowIrqHandler
152; Parameters:
153; BX: IRQ number (0...7)
154; ES: BDA and Interrupt Vector segment (zero)
155; Returns:
156; Nothing
157; Corrupts registers:
158; BX, SI
[86]159;--------------------------------------------------------------------
[33]160ALIGN JUMP_ALIGN
161.InstallLowIrqHandler:
162 add bx, BYTE INTV_IRQ0 ; Interrupt vector number
163 mov si, HIRQ_InterruptServiceRoutineForIrqs2to7
164 ; Fall to Interrupts_InstallHandlerToVectorInBXFromCSSI
165
166
167;--------------------------------------------------------------------
168; Interrupts_InstallHandlerToVectorInBXFromCSSI
169; Parameters:
170; BX: Interrupt vector number (for example 13h)
171; ES: BDA and Interrupt Vector segment (zero)
172; CS:SI: Ptr to interrupt handler
173; Returns:
174; Nothing
175; Corrupts registers:
176; BX
[86]177;--------------------------------------------------------------------
[33]178ALIGN JUMP_ALIGN
179Interrupts_InstallHandlerToVectorInBXFromCSSI:
180 eSHL_IM bx, 2 ; Shift for DWORD offset
181 mov [es:bx], si ; Store offset
182 mov [es:bx+2], cs ; Store segment
183 ret
184
185
186;--------------------------------------------------------------------
187; Interrupts_UnmaskInterruptControllerForDriveInDSDI
188; Parameters:
189; DS:DI: Ptr to DPT
190; Returns:
191; Nothing
192; Corrupts registers:
193; AX, BX, DX
194;--------------------------------------------------------------------
195ALIGN JUMP_ALIGN
196Interrupts_UnmaskInterruptControllerForDriveInDSDI:
197 eMOVZX bx, BYTE [di+DPT.bIdeOff]
198 mov al, [cs:bx+IDEVARS.bIRQ]
[86]199 test al, al
200 jz SHORT .Return ; Interrupts disabled
[33]201 cmp al, 8
[86]202 jb SHORT .UnmaskLowIrqController
203 ; Fall through to .UnmaskHighIrqController
[33]204
205;--------------------------------------------------------------------
206; .UnmaskHighIrqController
207; Parameters:
208; AL: IRQ number (8...15)
209; Returns:
210; Nothing
211; Corrupts registers:
212; AX, DX
213;--------------------------------------------------------------------
[86]214;ALIGN JUMP_ALIGN
215;.UnmaskHighIrqController:
[33]216 sub al, 8 ; Slave interrupt number
217 mov dx, PORT_8259SL_IMR ; Load Slave Mask Register address
218 call .ClearBitFrom8259MaskRegister
219 mov al, 2 ; Master IRQ 2 to allow slave IRQs
220 ; Fall to .UnmaskLowIrqController
221
222;--------------------------------------------------------------------
223; .UnmaskLowIrqController
224; Parameters:
225; AL: IRQ number (0...7)
226; Returns:
227; Nothing
228; Corrupts registers:
229; AX, DX
230;--------------------------------------------------------------------
231ALIGN JUMP_ALIGN
232.UnmaskLowIrqController:
233 mov dx, PORT_8259MA_IMR ; Load Mask Register address
234 ; Fall to .ClearBitFrom8259MaskRegister
235
236;--------------------------------------------------------------------
237; .ClearBitFrom8259MaskRegister
238; Parameters:
239; AL: 8259 interrupt index (0...7)
240; DX: Port address to Interrupt Mask Register
241; Returns:
242; Nothing
243; Corrupts registers:
244; AX
245;--------------------------------------------------------------------
246;ALIGN JUMP_ALIGN
247.ClearBitFrom8259MaskRegister:
248 push cx
249 xchg ax, cx ; IRQ index to CL
250 mov ch, 1 ; Load 1 to be shifted
251 shl ch, cl ; Shift bit to correct position
252 not ch ; Invert to create bit mask for clearing
253 in al, dx ; Read Interrupt Mask Register
254 and al, ch ; Clear wanted bit
255 out dx, al ; Write modified Interrupt Mask Register
256 pop cx
[86]257.Return:
[33]258 ret
Note: See TracBrowser for help on using the repository browser.