source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeIrq.asm @ 238

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

Changes to XTIDE Universal BIOS:

  • Makefile now builds small (8k) and large versions.
  • Completely untested support for JR-IDE/ISA.
File size: 3.5 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Interrupt handling related functions.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; IdeIrq_WaitForIRQ
9;   Parameters:
10;       DS:DI:  Ptr to DPT (in RAMVARS segment)
11;   Returns:
12;       CF:     Set if wait done by operating system
13;               Cleared if BIOS must perform task flag polling
14;   Corrupts registers:
15;       AX
16;--------------------------------------------------------------------
17ALIGN JUMP_ALIGN
18IdeIrq_WaitForIRQ:
19
20;--------------------------------------------------------------------
21; .NotifyOperatingSystemAboutWaitingForIRQ
22;   Parameters:
23;       Nothing
24;   Returns:
25;       CF:     Set if wait done by operating system
26;               Cleared if BIOS must perform task flag polling
27;   Corrupts registers:
28;       AX
29;--------------------------------------------------------------------
30.NotifyOperatingSystemAboutWaitingForIRQ:
31    push    ds
32
33    LOAD_BDA_SEGMENT_TO ds, ax, !       ; Zero AX
34    mov     ah, OS_HOOK_DEVICE_BUSY     ; Hard disk busy (AX=9000h)
35    cli                                 ; Disable interrupts
36    cmp     al, [BDA.bHDTaskFlg]        ; Task flag already set?
37    jc      SHORT .ReturnFromWaitNotify ;  If so, skip OS notification
38    int     BIOS_SYSTEM_INTERRUPT_15h   ; OS hook, device busy
39    jnc     SHORT .ReturnFromWaitNotify ; CF cleared, BIOS handles waiting
40
41    ; Make sure that OS hooks are supported, otherwise the CF means unsupported function
42    test    ah, ah                      ; OS hook supported? (clears CF)
43    jnz     SHORT .ReturnFromWaitNotify ; AH has error, BIOS must do the wait
44    stc                                 ; Set CF since wait done by OS
45.ReturnFromWaitNotify:
46    sti                                 ; Enable interrupts
47    pop     ds
48    ret
49
50
51;--------------------------------------------------------------------
52; IDE Interrupt Service Routines.
53;
54; IdeIrq_InterruptServiceRoutineForIrqs2to7
55; IdeIrq_InterruptServiceRoutineForIrqs8to15
56;   Parameters:
57;       Nothing
58;   Returns:
59;       Nothing
60;   Corrupts registers:
61;       Nothing
62;--------------------------------------------------------------------
63ALIGN JUMP_ALIGN
64IdeIrq_InterruptServiceRoutineForIrqs2to7:
65    push    di
66    push    ax
67    call    AcknowledgeIdeInterruptAndSetTaskFlag
68
69    mov     al, COMMAND_END_OF_INTERRUPT
70    jmp     SHORT AcknowledgeMasterInterruptController
71
72
73ALIGN JUMP_ALIGN
74IdeIrq_InterruptServiceRoutineForIrqs8to15:
75    push    di
76    push    ax
77    call    AcknowledgeIdeInterruptAndSetTaskFlag
78
79    mov     al, COMMAND_END_OF_INTERRUPT
80    out     SLAVE_8259_COMMAND_out, al  ; Acknowledge Slave 8259
81AcknowledgeMasterInterruptController:
82    out     MASTER_8259_COMMAND_out, al ; Acknowledge Master 8259
83
84    ; Issue Int 15h, function AX=9100h (Interrupt ready)
85    mov     ax, OS_HOOK_DEVICE_POST<<8  ; Interrupt ready, device 0 (HD)
86    int     BIOS_SYSTEM_INTERRUPT_15h
87
88    pop     ax
89    pop     di
90    iret
91
92
93;--------------------------------------------------------------------
94; AcknowledgeIdeInterruptAndSetTaskFlag
95;   Parameters:
96;       Nothing
97;   Returns:
98;       Nothing
99;   Corrupts registers:
100;       AX
101;--------------------------------------------------------------------
102ALIGN JUMP_ALIGN
103AcknowledgeIdeInterruptAndSetTaskFlag:
104    push    ds
105    push    si
106    push    dx
107    push    bx
108
109    ; Reading Status Register acknowledges IDE interrupt
110    call    RamVars_GetSegmentToDS
111    mov     bl, FLGH_DPT_INTERRUPT_IN_SERVICE
112    call    FindDPT_ToDSDIforFlagsHighInBL
113    INPUT_TO_AL_FROM_IDE_REGISTER STATUS_REGISTER_in
114
115    ; Clear Interrupt In-Service Flag from DPT
116    and     BYTE [di+DPT.bFlagsHigh], ~FLGH_DPT_INTERRUPT_IN_SERVICE
117
118    ; Set Task Flag
119    LOAD_BDA_SEGMENT_TO ds, ax
120    mov     BYTE [BDA.bHDTaskFlg], 0FFh     ; Set task flag
121
122    pop     bx
123    pop     dx
124    pop     si
125    pop     ds
126    ret
Note: See TracBrowser for help on using the repository browser.