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

Last change on this file since 406 was 398, checked in by aitotat@…, 13 years ago

Changes to XTIDE Universal BIOS:

  • IRQ related stuff is now optional MODULE_IRQ.
  • XT builds no longer include support for IDE IRQ.
File size: 7.9 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Functions for initializing the BIOS.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; Interrupts_InitializeInterruptVectors
25; Parameters:
26; DS: RAMVARS segment
27; ES: BDA and Interrupt Vector segment (zero)
28; Returns:
29; Nothing
30; Corrupts registers:
31; All except segments
32;--------------------------------------------------------------------
33Interrupts_InitializeInterruptVectors:
34 ; Fall to .InitializeInt13hAnd40h
35
36;--------------------------------------------------------------------
37; .InitializeInt13hAnd40h
38; Parameters:
39; DS: RAMVARS segment
40; ES: BDA and Interrupt Vector segment (zero)
41; Returns:
42; Nothing
43; Corrupts registers:
44; AX, BX, CX, DX, SI, DI
45;--------------------------------------------------------------------
46.InitializeInt13hAnd40h:
47 mov ax, [es:BIOS_DISK_INTERRUPT_13h*4+2]; Load old INT 13h segment
48 mov [RAMVARS.fpOldI13h+2], ax ; Store old INT 13h segment
49 xchg dx, ax
50 mov ax, [es:BIOS_DISK_INTERRUPT_13h*4] ; Load old INT 13h offset
51 mov [RAMVARS.fpOldI13h], ax ; Store old INT 13h offset
52
53 ; Only store INT 13h handler to 40h if 40h is not already installed.
54 ; At least AMI BIOS for 286 stores 40h handler by itself and calls
55 ; 40h from 13h. That system locks to infinite loop if we copy 13h to 40h.
56 call FloppyDrive_IsInt40hInstalled
57 jc SHORT .Int40hAlreadyInstalled
58 mov [es:BIOS_DISKETTE_INTERRUPT_40h*4], ax ; Store old INT 13h offset
59 mov [es:BIOS_DISKETTE_INTERRUPT_40h*4+2], dx ; Store old INT 13h segment
60.Int40hAlreadyInstalled:
61
62 mov al, BIOS_DISK_INTERRUPT_13h ; INT 13h interrupt vector offset
63 mov si, Int13h_DiskFunctionsHandler ; Interrupt handler offset
64 call Interrupts_InstallHandlerToVectorInALFromCSSI
65
66 ; Install INT 19h handler to properly reset the system
67 mov al, BIOS_BOOT_LOADER_INTERRUPT_19h ; INT 19h interrupt vector offset
68 mov si, Int19hReset_Handler ; INT 19h handler to reboot the system
69%ifndef MODULE_IRQ
70 ; Fall to Interrupts_InstallHandlerToVectorInALFromCSSI
71%else
72 call Interrupts_InstallHandlerToVectorInALFromCSSI
73 ; Fall to .InitializeHardwareIrqHandlers
74
75;--------------------------------------------------------------------
76; .InitializeHardwareIrqHandlers
77; Parameters:
78; ES: BDA and Interrupt Vector segment (zero)
79; Returns:
80; Nothing
81; Corrupts registers:
82; BX, CX, DX, SI, DI, AX
83;--------------------------------------------------------------------
84.InitializeHardwareIrqHandlers:
85 call RamVars_GetIdeControllerCountToCX
86 mov di, ROMVARS.ideVars0 ; CS:SI points to first IDEVARS
87.IdeControllerLoop:
88 mov al, [cs:di+IDEVARS.bIRQ]
89 add di, BYTE IDEVARS_size ; Increment to next controller
90 call .InstallLowOrHighIrqHandler
91 loop .IdeControllerLoop
92.Return:
93 ret ; This ret is shared with .InstallLowOrHighIrqHandler
94
95;--------------------------------------------------------------------
96; .InstallLowOrHighIrqHandler
97; Parameters:
98; AL: IRQ number, 0 if IRQ disabled
99; ES: BDA and Interrupt Vector segment (zero)
100; Returns:
101; Nothing
102; Corrupts registers:
103; BX, SI
104;--------------------------------------------------------------------
105.InstallLowOrHighIrqHandler:
106 test al, al
107 jz SHORT .Return ; IRQ not used
108 cmp al, 8
109 jb SHORT .InstallLowIrqHandler
110 ; Fall to .InstallHighIrqHandler
111
112;--------------------------------------------------------------------
113; .InstallHighIrqHandler
114; Parameters:
115; BX: IRQ number (8...15)
116; ES: BDA and Interrupt Vector segment (zero)
117; Returns:
118; Nothing
119; Corrupts registers:
120; AL, BX, SI
121;--------------------------------------------------------------------
122.InstallHighIrqHandler:
123 add al, BYTE HARDWARE_IRQ_8_INTERRUPT_70h - 8 ; Interrupt vector number
124 mov si, IdeIrq_InterruptServiceRoutineForIrqs8to15
125 jmp SHORT Interrupts_InstallHandlerToVectorInALFromCSSI
126
127;--------------------------------------------------------------------
128; .InstallLowIrqHandler
129; Parameters:
130; AL: IRQ number (0...7)
131; ES: BDA and Interrupt Vector segment (zero)
132; Returns:
133; Nothing
134; Corrupts registers:
135; AL, BX, SI
136;--------------------------------------------------------------------
137.InstallLowIrqHandler:
138 add al, BYTE HARDWARE_IRQ_0_INTERRUPT_08h ; Interrupt vector number
139 mov si, IdeIrq_InterruptServiceRoutineForIrqs2to7
140 ; Fall to Interrupts_InstallHandlerToVectorInALFromCSSI
141%endif ; MODULE_IRQ
142
143
144;--------------------------------------------------------------------
145; Interrupts_InstallHandlerToVectorInALFromCSSI
146; Parameters:
147; AL: Interrupt vector number (for example 13h)
148; ES: BDA and Interrupt Vector segment (zero)
149; CS:SI: Ptr to interrupt handler
150; Returns:
151; Nothing
152; Corrupts registers:
153; AX, BX
154;--------------------------------------------------------------------
155Interrupts_InstallHandlerToVectorInALFromCSSI:
156 mov bl, 4 ; Shift for DWORD offset, MUL smaller than other alternatives
157 mul bl
158 xchg ax, bx
159 mov [es:bx], si ; Store offset
160 mov [es:bx+2], cs ; Store segment
161 ret
162
163
164%ifdef MODULE_IRQ
165;--------------------------------------------------------------------
166; Interrupts_UnmaskInterruptControllerForDriveInDSDI
167; Parameters:
168; DS:DI: Ptr to DPT
169; Returns:
170; Nothing
171; Corrupts registers:
172; AX, BX, DX
173;--------------------------------------------------------------------
174Interrupts_UnmaskInterruptControllerForDriveInDSDI:
175 eMOVZX bx, [di+DPT.bIdevarsOffset]
176 mov al, [cs:bx+IDEVARS.bIRQ]
177 test al, al
178 jz SHORT .Return ; Interrupts disabled
179 cmp al, 8
180 jb SHORT .UnmaskLowIrqController
181 ; Fall to .UnmaskHighIrqController
182
183;--------------------------------------------------------------------
184; .UnmaskHighIrqController
185; Parameters:
186; AL: IRQ number (8...15)
187; Returns:
188; Nothing
189; Corrupts registers:
190; AX, DX
191;--------------------------------------------------------------------
192.UnmaskHighIrqController:
193 sub al, 8 ; Slave interrupt number
194 mov dx, SLAVE_8259_IMR
195 call .ClearBitFrom8259MaskRegister
196 mov al, 2 ; Master IRQ 2 to allow slave IRQs
197 ; Fall to .UnmaskLowIrqController
198
199;--------------------------------------------------------------------
200; .UnmaskLowIrqController
201; Parameters:
202; AL: IRQ number (0...7)
203; Returns:
204; Nothing
205; Corrupts registers:
206; AX, DX
207;--------------------------------------------------------------------
208.UnmaskLowIrqController:
209 mov dx, MASTER_8259_IMR
210 ; Fall to .ClearBitFrom8259MaskRegister
211
212;--------------------------------------------------------------------
213; .ClearBitFrom8259MaskRegister
214; Parameters:
215; AL: 8259 interrupt index (0...7)
216; DX: Port address to Interrupt Mask Register
217; Returns:
218; Nothing
219; Corrupts registers:
220; AX
221;--------------------------------------------------------------------
222.ClearBitFrom8259MaskRegister:
223 push cx
224 xchg ax, cx ; IRQ index to CL
225 mov ch, 1 ; Load 1 to be shifted
226 shl ch, cl ; Shift bit to correct position
227 not ch ; Invert to create bit mask for clearing
228 in al, dx ; Read Interrupt Mask Register
229 and al, ch ; Clear wanted bit
230 out dx, al ; Write modified Interrupt Mask Register
231 pop cx
232.Return:
233 ret
234
235%endif ; MODULE_IRQ
Note: See TracBrowser for help on using the repository browser.