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

Last change on this file since 150 was 150, checked in by aitotat, 13 years ago

Changes to XTIDE Universal BIOS:

  • Redesigned Disk Parameter Tables.
  • Code generalizations for supporting non-IDE devices in the future.
File size: 4.7 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    push    ax
42
43    mov     al, LARGEST_DPT_SIZE
44    sub     dl, [RAMVARS.bFirstDrv]
45    mul     dl
46    add     ax, BYTE RAMVARS_size
47    xchg    di, ax
48
49    pop     ax
50    pop     dx
51    ret
52
53
54;--------------------------------------------------------------------
55; Finds Disk Parameter Table for
56; Master or Slave drive at wanted port.
57;
58; FindDPT_ToDSDIForIdeMasterAtPortDX
59; FindDPT_ToDSDIForIdeSlaveAtPortDX
60;   Parameters:
61;       DX:     IDE Base Port address
62;       DS:     RAMVARS segment
63;   Returns:
64;       DL:     Drive number (if DPT found)
65;       DS:DI:  Ptr to DPT
66;       CF:     Set if wanted DPT found
67;               Cleared if DPT not found
68;   Corrupts registers:
69;       SI
70;--------------------------------------------------------------------
71ALIGN JUMP_ALIGN
72FindDPT_ToDSDIForIdeMasterAtPortDX:
73    mov     si, FindDPT_IterateToMasterAtPortCallback
74    jmp     SHORT IterateAllDPTs
75
76ALIGN JUMP_ALIGN
77FindDPT_ToDSDIForIdeSlaveAtPortDX:
78    mov     si, FindDPT_IterateToSlaveAtPortCallback
79    jmp     SHORT IterateAllDPTs
80
81;--------------------------------------------------------------------
82; Iteration callback for finding DPT using
83; IDE base port for Master or Slave drive.
84;
85; FindDPT_IterateToSlaveAtPortCallback
86; FindDPT_IterateToMasterAtPortCallback
87;   Parameters:
88;       CH:     Drive number
89;       DX:     IDE Base Port address
90;       DS:DI:  Ptr to DPT to examine
91;   Returns:
92;       DL:     Drive number if correct DPT
93;       CF:     Set if wanted DPT found
94;               Cleared if wrong DPT
95;   Corrupts registers:
96;       Nothing
97;--------------------------------------------------------------------
98ALIGN JUMP_ALIGN
99FindDPT_IterateToSlaveAtPortCallback:
100    test    BYTE [di+DPT.wFlags], FLG_DPT_SLAVE ; Clears CF
101    jnz     SHORT CompareBasePortAddress
102    ret     ; Wrong DPT
103
104ALIGN JUMP_ALIGN
105FindDPT_IterateToMasterAtPortCallback:
106    test    BYTE [di+DPT.wFlags], FLG_DPT_SLAVE
107    jnz     SHORT ReturnWrongDPT                ; Return if slave drive
108
109CompareBasePortAddress:
110    push    bx
111    eMOVZX  bx, BYTE [di+DPT.bIdevarsOffset]    ; CS:BX now points to IDEVARS
112    cmp     dx, [cs:bx+IDEVARS.wPort]           ; Wanted port?
113    pop     bx
114    jne     SHORT ReturnWrongDPT
115    mov     dl, ch                              ; Return drive number in DL
116    stc                                         ; Set CF since wanted DPT
117    ret
118ReturnWrongDPT:
119    clc                                         ; Clear CF since wrong DPT
120    ret
121
122
123;--------------------------------------------------------------------
124; Iterates all Disk Parameter Tables.
125;
126; IterateAllDPTs
127;   Parameters:
128;       BX,DX:  Parameters to callback function
129;       CS:SI:  Ptr to callback function
130;       DS:     RAMVARS segment
131;   Returns:
132;       DS:DI:  Ptr to wanted DPT (if found)
133;       CF:     Set if wanted DPT found
134;               Cleared if DPT not found
135;   Corrupts registers:
136;       Nothing unless corrupted by callback function
137;--------------------------------------------------------------------
138ALIGN JUMP_ALIGN
139IterateAllDPTs:
140    push    cx
141    mov     cx, [RAMVARS.wDrvCntAndFirst]
142    jcxz    .AllDptsIterated            ; Return if no drives
143    call    FindDPT_PointToFirstDPT     ; Point DS:DI to first DPT
144ALIGN JUMP_ALIGN
145.LoopWhileDPTsLeft:
146    call    si                          ; Is wanted DPT?
147    jc      SHORT .AllDptsIterated      ;  If so, return
148    inc     ch                          ; Increment drive number
149    add     di, BYTE LARGEST_DPT_SIZE   ; Point to next DPT
150    dec     cl                          ; Decrement drives left
151    jnz     SHORT .LoopWhileDPTsLeft
152    clc                                 ; Clear CF since DPT not found
153ALIGN JUMP_ALIGN
154.AllDptsIterated:
155    pop     cx
156    ret
157
158
159;--------------------------------------------------------------------
160; Sets DI to point to first Disk Parameter Table.
161;
162; FindDPT_PointToFirstDPT
163;   Parameters:
164;       Nothing
165;   Returns:
166;       DI:     Offset to first DPT (even if unused)
167;   Corrupts registers:
168;       Nothing
169;--------------------------------------------------------------------
170ALIGN JUMP_ALIGN
171FindDPT_PointToFirstDPT:
172    mov     di, RAMVARS_size
173    ret
Note: See TracBrowser for help on using the repository browser.