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

Last change on this file since 376 was 376, checked in by gregli@…, 12 years ago

WIDE checkin... Added copyright and license information to sorce files, as per the GPL instructions for usage.

File size: 7.5 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    ; Fall to .InitializeHardwareIrqHandlers
66
67;--------------------------------------------------------------------
68; .InitializeHardwareIrqHandlers
69;   Parameters:
70;       ES:     BDA and Interrupt Vector segment (zero)
71;   Returns:
72;       Nothing
73;   Corrupts registers:
74;       BX, CX, DX, SI, DI, AX
75;--------------------------------------------------------------------
76.InitializeHardwareIrqHandlers:
77    call    RamVars_GetIdeControllerCountToCX
78    mov     di, ROMVARS.ideVars0            ; CS:SI points to first IDEVARS
79.IdeControllerLoop:
80    mov     al, [cs:di+IDEVARS.bIRQ]
81    add     di, BYTE IDEVARS_size           ; Increment to next controller
82    call    .InstallLowOrHighIrqHandler
83    loop    .IdeControllerLoop
84.Return:
85    ret     ; This ret is shared with .InstallLowOrHighIrqHandler
86
87;--------------------------------------------------------------------
88; .InstallLowOrHighIrqHandler
89;   Parameters:
90;       AL:     IRQ number, 0 if IRQ disabled
91;       ES:     BDA and Interrupt Vector segment (zero)
92;   Returns:
93;       Nothing
94;   Corrupts registers:
95;       BX, SI
96;--------------------------------------------------------------------
97.InstallLowOrHighIrqHandler:
98    test    al, al
99    jz      SHORT .Return   ; IRQ not used
100    cmp     al, 8
101    jb      SHORT .InstallLowIrqHandler
102    ; Fall to .InstallHighIrqHandler
103
104;--------------------------------------------------------------------
105; .InstallHighIrqHandler
106;   Parameters:
107;       BX:     IRQ number (8...15)
108;       ES:     BDA and Interrupt Vector segment (zero)
109;   Returns:
110;       Nothing
111;   Corrupts registers:
112;       AL, BX, SI
113;--------------------------------------------------------------------
114.InstallHighIrqHandler:
115    add     al, BYTE HARDWARE_IRQ_8_INTERRUPT_70h - 8   ; Interrupt vector number
116    mov     si, IdeIrq_InterruptServiceRoutineForIrqs8to15
117    jmp     SHORT Interrupts_InstallHandlerToVectorInALFromCSSI
118
119;--------------------------------------------------------------------
120; .InstallLowIrqHandler
121;   Parameters:
122;       AL:     IRQ number (0...7)
123;       ES:     BDA and Interrupt Vector segment (zero)
124;   Returns:
125;       Nothing
126;   Corrupts registers:
127;       AL, BX, SI
128;--------------------------------------------------------------------
129.InstallLowIrqHandler:
130    add     al, BYTE HARDWARE_IRQ_0_INTERRUPT_08h       ; Interrupt vector number
131    mov     si, IdeIrq_InterruptServiceRoutineForIrqs2to7
132    ; Fall to Interrupts_InstallHandlerToVectorInALFromCSSI
133
134
135;--------------------------------------------------------------------
136; Interrupts_InstallHandlerToVectorInALFromCSSI
137;   Parameters:
138;       AL:     Interrupt vector number (for example 13h)
139;       ES:     BDA and Interrupt Vector segment (zero)
140;       CS:SI:  Ptr to interrupt handler
141;   Returns:
142;       Nothing
143;   Corrupts registers:
144;       AX, BX
145;--------------------------------------------------------------------
146Interrupts_InstallHandlerToVectorInALFromCSSI:
147    mov     bl, 4                   ; Shift for DWORD offset, MUL smaller than other alternatives
148    mul     bl
149    xchg    ax, bx
150    mov     [es:bx], si             ; Store offset
151    mov     [es:bx+2], cs           ; Store segment
152    ret
153
154
155;--------------------------------------------------------------------
156; Interrupts_UnmaskInterruptControllerForDriveInDSDI
157;   Parameters:
158;       DS:DI:  Ptr to DPT
159;   Returns:
160;       Nothing
161;   Corrupts registers:
162;       AX, BX, DX
163;--------------------------------------------------------------------
164Interrupts_UnmaskInterruptControllerForDriveInDSDI:
165    eMOVZX  bx, [di+DPT.bIdevarsOffset]
166    mov     al, [cs:bx+IDEVARS.bIRQ]
167    test    al, al
168    jz      SHORT .Return   ; Interrupts disabled
169    cmp     al, 8
170    jb      SHORT .UnmaskLowIrqController
171    ; Fall to .UnmaskHighIrqController
172
173;--------------------------------------------------------------------
174; .UnmaskHighIrqController
175;   Parameters:
176;       AL:     IRQ number (8...15)
177;   Returns:
178;       Nothing
179;   Corrupts registers:
180;       AX, DX
181;--------------------------------------------------------------------
182.UnmaskHighIrqController:
183    sub     al, 8               ; Slave interrupt number
184    mov     dx, SLAVE_8259_IMR
185    call    .ClearBitFrom8259MaskRegister
186    mov     al, 2               ; Master IRQ 2 to allow slave IRQs
187    ; Fall to .UnmaskLowIrqController
188
189;--------------------------------------------------------------------
190; .UnmaskLowIrqController
191;   Parameters:
192;       AL:     IRQ number (0...7)
193;   Returns:
194;       Nothing
195;   Corrupts registers:
196;       AX, DX
197;--------------------------------------------------------------------
198.UnmaskLowIrqController:
199    mov     dx, MASTER_8259_IMR
200    ; Fall to .ClearBitFrom8259MaskRegister
201
202;--------------------------------------------------------------------
203; .ClearBitFrom8259MaskRegister
204;   Parameters:
205;       AL:     8259 interrupt index (0...7)
206;       DX:     Port address to Interrupt Mask Register
207;   Returns:
208;       Nothing
209;   Corrupts registers:
210;       AX
211;--------------------------------------------------------------------
212.ClearBitFrom8259MaskRegister:
213    push    cx
214    xchg    ax, cx              ; IRQ index to CL
215    mov     ch, 1               ; Load 1 to be shifted
216    shl     ch, cl              ; Shift bit to correct position
217    not     ch                  ; Invert to create bit mask for clearing
218    in      al, dx              ; Read Interrupt Mask Register
219    and     al, ch              ; Clear wanted bit
220    out     dx, al              ; Write modified Interrupt Mask Register
221    pop     cx
222.Return:
223    ret
Note: See TracBrowser for help on using the repository browser.