source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/FindDPT.asm @ 203

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

Reworked the 'skip detecting the slave if there was no master' code to be more complete (includes configurator drives) and to take into account int13h/25h calls. Some of the changes in my last checkin have been rolled back as a result (they are no longer needed). I did take a byte out of RAMVARS, but there was an alignment byte available for the taking. I also added a perl script for padding and adding the checksum byte to a binary image, which can be invoked manually or with 'make checksum'.

File size: 5.5 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Functions for finding Disk Parameter Table.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Finds pointer to first unused Disk Parameter Table.
9;
10; FindDPT_ForNewDriveToDSDI
11;   Parameters:
12;       DS:     RAMVARS segment
13;   Returns:
14;       DS:DI:  Ptr to first unused DPT
15;   Corrupts registers:
16;       DL
17;--------------------------------------------------------------------
18ALIGN JUMP_ALIGN
19FindDPT_ForNewDriveToDSDI:
20    mov     dl, [RAMVARS.bFirstDrv]
21    add     dl, [RAMVARS.bDrvCnt]
22    ; Fall to FindDPT_ForDriveNumber
23
24
25;--------------------------------------------------------------------
26; Finds Disk Parameter Table for drive number.
27; IDE Base Port address will be stored to RAMVARS if correct DPT is found.
28;
29; FindDPT_ForDriveNumber
30;   Parameters:
31;       DL:     Drive number
32;       DS:     RAMVARS segment
33;   Returns:
34;       DS:DI:  Ptr to DPT
35;   Corrupts registers:
36;       Nothing
37;--------------------------------------------------------------------
38ALIGN JUMP_ALIGN
39FindDPT_ForDriveNumber:
40    push    dx
41    xchg    di, ax  ; Save the contents of AX in DI
42
43    mov     al, LARGEST_DPT_SIZE
44    sub     dl, [RAMVARS.bFirstDrv]
45    mul     dl
46    add     ax, BYTE RAMVARS_size
47
48    xchg    di, ax  ; Restore AX and put result in DI
49    pop     dx
50    ret
51
52;--------------------------------------------------------------------
53; Finds Disk Parameter Table for
54; Master or Slave drive at wanted port.
55;
56; FindDPT_ToDSDIForIdeMasterAtPortDX
57; FindDPT_ToDSDIForIdeSlaveAtPortDX
58;   Parameters:
59;       DX:     IDE Base Port address
60;       DS:     RAMVARS segment
61;   Returns:
62;       DL:     Drive number (if DPT found)
63;       DS:DI:  Ptr to DPT
64;       CF:     Set if wanted DPT found
65;               Cleared if DPT not found
66;   Corrupts registers:
67;       SI
68;
69; Converted to macros since there is only once call site for each of these
70;
71;--------------------------------------------------------------------
72   
73%macro FindDPT_ToDSDIForIdeMasterAtPortDX 0
74    mov     si, IterateToMasterAtPortCallback
75    call    IterateAllDPTs
76%endmacro
77
78%macro FindDPT_ToDSDIForIdeSlaveAtPortDX 0
79    mov     si, IterateToSlaveAtPortCallback
80    call    IterateAllDPTs
81%endmacro
82
83       
84;--------------------------------------------------------------------
85; Iteration callback for finding DPT using
86; IDE base port for Master or Slave drive.
87;
88; IterateToSlaveAtPortCallback
89; IterateToMasterAtPortCallback
90;   Parameters:
91;       CH:     Drive number
92;       DX:     IDE Base Port address
93;       DS:DI:  Ptr to DPT to examine
94;   Returns:
95;       DL:     Drive number if correct DPT
96;       CF:     Set if wanted DPT found
97;               Cleared if wrong DPT
98;   Corrupts registers:
99;       Nothing
100;--------------------------------------------------------------------
101ALIGN JUMP_ALIGN
102IterateToSlaveAtPortCallback:
103    test    BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE ; Clears CF
104    jnz     SHORT CompareBasePortAddress
105    ret     ; Wrong DPT
106
107ALIGN JUMP_ALIGN
108IterateToMasterAtPortCallback:
109    test    BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE
110    jnz     SHORT ReturnWrongDPT                ; Return if slave drive
111
112CompareBasePortAddress:
113    push    bx
114    eMOVZX  bx, BYTE [di+DPT.bIdevarsOffset]    ; CS:BX now points to IDEVARS
115    cmp     dx, [cs:bx+IDEVARS.wPort]           ; Wanted port?
116    pop     bx
117    jne     SHORT ReturnWrongDPT
118    mov     dl, ch                              ; Return drive number in DL
119
120ReturnRightDPT:
121    stc                                         ; Set CF since wanted DPT
122    ret
123
124
125;--------------------------------------------------------------------
126; IterateToDptWithInterruptInServiceFlagSet
127;   Parameters:
128;       DS:DI:  Ptr to DPT to examine
129;   Returns:
130;       CF:     Set if wanted DPT found
131;               Cleared if wrong DPT
132;   Corrupts registers:
133;       Nothing
134;--------------------------------------------------------------------
135ALIGN JUMP_ALIGN
136IterateToDptWithInterruptInServiceFlagSet:
137    test    BYTE [di+DPT.bFlagsHigh], FLGH_DPT_INTERRUPT_IN_SERVICE     ; Clears CF (but we need the clc
138                                                                        ; below anyway for callers above)
139    jnz     SHORT ReturnRightDPT
140
141ReturnWrongDPT:
142    clc                                     ; Clear CF since wrong DPT
143    ret
144
145;--------------------------------------------------------------------
146; FindDPT_ToDSDIforInterruptInService
147;   Parameters:
148;       DS:     RAMVARS segment
149;   Returns:
150;       DS:DI:  Ptr to DPT
151;       CF:     Set if wanted DPT found
152;               Cleared if DPT not found
153;   Corrupts registers:
154;       SI
155;--------------------------------------------------------------------
156ALIGN JUMP_ALIGN
157FindDPT_ToDSDIforInterruptInService:
158    mov     si, IterateToDptWithInterruptInServiceFlagSet
159    ; Fall to IterateAllDPTs
160
161;--------------------------------------------------------------------
162; Iterates all Disk Parameter Tables.
163;
164; IterateAllDPTs
165;   Parameters:
166;       AX,BX,DX:   Parameters to callback function
167;       CS:SI:      Ptr to callback function
168;       DS:         RAMVARS segment
169;   Returns:
170;       DS:DI:      Ptr to wanted DPT (if found)
171;       CF:         Set if wanted DPT found
172;                   Cleared if DPT not found, or no DPTs present
173;   Corrupts registers:
174;       Nothing unless corrupted by callback function
175;--------------------------------------------------------------------
176ALIGN JUMP_ALIGN
177IterateAllDPTs:
178    push    cx
179    mov     cx, [RAMVARS.wDrvCntAndFirst]
180    jcxz    .NotFound                   ; Return if no drives
181    mov     di, RAMVARS_size            ; Point DS:DI to first DPT
182ALIGN JUMP_ALIGN
183.LoopWhileDPTsLeft:
184    call    si                          ; Is wanted DPT?
185    jc      SHORT .AllDptsIterated      ;  If so, return
186    inc     ch                          ; Increment drive number
187    add     di, BYTE LARGEST_DPT_SIZE   ; Point to next DPT
188    dec     cl                          ; Decrement drives left
189    jnz     SHORT .LoopWhileDPTsLeft
190.NotFound:     
191    clc                                 ; Clear CF since DPT not found
192ALIGN JUMP_ALIGN
193.AllDptsIterated:
194    pop     cx
195    ret
Note: See TracBrowser for help on using the repository browser.