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

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

Changes to XTIDE Universal BIOS:

  • Now builds without serial module.
File size: 6.6 KB
RevLine 
[150]1; Project name  :   XTIDE Universal BIOS
[3]2; Description   :   Functions for finding Disk Parameter Table.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
[262]8; Checks if drive is handled by this BIOS, and return DPT pointer.
[3]9;
[262]10; FindDPT_ForDriveNumberInDL       
[3]11;   Parameters:
[262]12;       DL:     Drive number
[3]13;       DS:     RAMVARS segment
14;   Returns:
[262]15;       CF:     Cleared if drive is handled by this BIOS
16;               Set if drive belongs to some other BIOS
17;       DI:     DPT Pointer if drive is handled by this BIOS
18;               Zero if drive belongs to some other BIOS
[3]19;   Corrupts registers:
[262]20;       Nothing
[150]21;--------------------------------------------------------------------
22ALIGN JUMP_ALIGN
[262]23FindDPT_ForDriveNumberInDL:     
24    xchg    di, ax                              ; Save the contents of AX in DI
25
26; 
27; Check Our Hard Disks
28;
29    mov     ax, [RAMVARS.wDrvCntAndFirst]       ; Drive count to AH, First number to AL
30    add     ah, al                              ; One past last drive to AH
31
[258]32%ifdef MODULE_SERIAL_FLOPPY
[262]33    cmp     dl, ah                              ; Above last supported?
34    jae     SHORT .HardDiskNotHandledByThisBIOS
35       
36    cmp     dl, al                              ; Below first supported?
37    jae     SHORT .CalcDPTForDriveNumber
38
39ALIGN JUMP_ALIGN               
40.HardDiskNotHandledByThisBIOS: 
41;
42; Check Our Floppy Disks
43; 
44    call    RamVars_UnpackFlopCntAndFirstToAL
45    cbw                                         ; normally 0h, could be ffh if no drives present
46    adc     ah, al                              ; if no drives present, still ffh (ffh + ffh + 1 = ffh)
47    js      SHORT .DiskIsNotHandledByThisBIOS
48    cmp     ah, dl                              ; Check second drive if two, first drive if only one
49    jz      SHORT .CalcDPTForDriveNumber
50    cmp     al, dl                              ; Check first drive in all cases, redundant but OK to repeat
51    jnz     SHORT .DiskIsNotHandledByThisBIOS           
52%else
53    cmp     dl, ah                              ; Above last supported?     
54    jae     SHORT .DiskIsNotHandledByThisBIOS
55       
56    cmp     dl, al                              ; Below first supported?
57    jb      SHORT .DiskIsNotHandledByThisBIOS           
[258]58%endif
[262]59    ; fall-through to CalcDPTForDriveNumber
[150]60
61;--------------------------------------------------------------------
62; Finds Disk Parameter Table for drive number.
[262]63; Note intended to be called except by FindDPT_ForDriveNumber
[150]64;
[262]65; CalcDPTForDriveNumber
[150]66;   Parameters:
67;       DL:     Drive number
68;       DS:     RAMVARS segment
[262]69;       DI:     Saved copy of AX from entry at FindDPT_ForDriveNumber
[150]70;   Returns:
71;       DS:DI:  Ptr to DPT
[262]72;       CF:     Clear
[150]73;   Corrupts registers:
[3]74;       Nothing
75;--------------------------------------------------------------------
76ALIGN JUMP_ALIGN
[262]77.CalcDPTForDriveNumber:
[150]78    push    dx
[3]79
[258]80%ifdef MODULE_SERIAL_FLOPPY
81    mov     ax, [RAMVARS.wDrvCntAndFirst]
82       
83    test    dl, dl
84    js      .harddisk
85
86    call    RamVars_UnpackFlopCntAndFirstToAL
87    add     dl, ah                      ; add in end of hard disk DPT list, floppies start immediately after
[262]88       
89ALIGN JUMP_ALIGN               
[258]90.harddisk:
91    sub     dl, al                      ; subtract off beginning of either hard disk or floppy list (as appropriate)
92%else
93    sub     dl, [RAMVARS.bFirstDrv]     ; subtract off beginning of hard disk list
94%endif
[262]95
96.CalcDPTForNewDrive:               
[150]97    mov     al, LARGEST_DPT_SIZE
[258]98       
[150]99    mul     dl
[262]100    add     ax, BYTE RAMVARS_size       ; Clears CF (will not oveflow)
[3]101
[150]102    pop     dx
[262]103
104    xchg    di, ax                      ; Restore AX from entry at FindDPT_ForDriveNumber, put DPT pointer in DI
[150]105    ret
106
[262]107ALIGN JUMP_ALIGN       
108.DiskIsNotHandledByThisBIOS:           
[259]109;
[262]110; Drive not found...
111;
112    xor     ax, ax                              ; Clear DPT pointer
113    stc                                         ; Is not supported by our BIOS     
114       
115    xchg    di, ax                              ; Restore AX from save at top
[259]116    ret
117
118;--------------------------------------------------------------------
[262]119; Finds pointer to first unused Disk Parameter Table.
120; Should only be used before DetectDrives is complete (not valid after this time).
[3]121;
[262]122; FindDPT_ForNewDriveToDSDI
[3]123;   Parameters:
124;       DS:     RAMVARS segment
125;   Returns:
[262]126;       DS:DI:  Ptr to first unused DPT
[3]127;   Corrupts registers:
[262]128;       AX
[3]129;--------------------------------------------------------------------
[262]130ALIGN JUMP_ALIGN
131FindDPT_ForNewDriveToDSDI:
132    push    dx
[200]133       
[262]134%ifdef MODULE_SERIAL_FLOPPY
135    mov     dx, [RAMVARS.wDrvCntAndFlopCnt]
136    add     dl, dh
137%else
138    mov     dl, [RAMVARS.bDrvCnt]
139%endif
140       
141    jmp     short FindDPT_ForDriveNumberInDL.CalcDPTForNewDrive
[3]142
[152]143;--------------------------------------------------------------------
[233]144; IterateToDptWithFlagsHighInBL
[152]145;   Parameters:
146;       DS:DI:  Ptr to DPT to examine
[233]147;       BL:     Bit(s) to test in DPT.bFlagsHigh 
[152]148;   Returns:
[262]149;       CF:     Clear if wanted DPT found
150;               Set if wrong DPT
[152]151;   Corrupts registers:
152;       Nothing
153;--------------------------------------------------------------------
154ALIGN JUMP_ALIGN
[233]155IterateToDptWithFlagsHighInBL:     
[262]156    test    BYTE [di+DPT.bFlagsHigh], bl        ; Clears CF
157    jnz     SHORT .ReturnRightDPT
158    stc
159.ReturnRightDPT:       
[3]160    ret
161
162;--------------------------------------------------------------------
[233]163; FindDPT_ToDSDIforSerialDevice
[161]164;   Parameters:
165;       DS:     RAMVARS segment
166;   Returns:
167;       DS:DI:  Ptr to DPT
168;       CF:     Set if wanted DPT found
169;               Cleared if DPT not found
170;   Corrupts registers:
[203]171;       SI
[161]172;--------------------------------------------------------------------
[265]173%ifdef MODULE_SERIAL
[233]174ALIGN JUMP_ALIGN       
175FindDPT_ToDSDIforSerialDevice:         
176    mov     bl, FLGH_DPT_SERIAL_DEVICE
177; fall-through
[265]178%endif
[233]179               
180;--------------------------------------------------------------------
181; FindDPT_ToDSDIforFlagsHigh
182;   Parameters:
183;       DS:     RAMVARS segment
184;       BL:     Bit(s) to test in DPT.bFlagsHigh
185;   Returns:
186;       DS:DI:  Ptr to DPT
187;       CF:     Set if wanted DPT found
188;               Cleared if DPT not found
189;   Corrupts registers:
190;       SI
191;--------------------------------------------------------------------
[161]192ALIGN JUMP_ALIGN
[233]193FindDPT_ToDSDIforFlagsHighInBL:     
194    mov     si, IterateToDptWithFlagsHighInBL
[161]195    ; Fall to IterateAllDPTs
196
197;--------------------------------------------------------------------
[3]198; Iterates all Disk Parameter Tables.
199;
[150]200; IterateAllDPTs
[3]201;   Parameters:
[152]202;       AX,BX,DX:   Parameters to callback function
203;       CS:SI:      Ptr to callback function
[262]204;                   Callback routine should return CF=clear if found
[152]205;       DS:         RAMVARS segment
[3]206;   Returns:
[152]207;       DS:DI:      Ptr to wanted DPT (if found)
[258]208;                   If not found, points to first empty DPT
[262]209;       CF:         Clear if wanted DPT found
210;                   Set if DPT not found, or no DPTs present
[3]211;   Corrupts registers:
[150]212;       Nothing unless corrupted by callback function
[3]213;--------------------------------------------------------------------
214ALIGN JUMP_ALIGN
[150]215IterateAllDPTs:
[3]216    push    cx
[258]217
218    mov     di, RAMVARS_size            ; Point DS:DI to first DPT
219       
[259]220    mov     cl, [RAMVARS.bDrvCnt]
221    xor     ch, ch                      ; Clears CF 
[258]222       
[262]223    jcxz    .NotFound                   ; Return if no drives
[259]224       
[3]225ALIGN JUMP_ALIGN
226.LoopWhileDPTsLeft:
227    call    si                          ; Is wanted DPT?
[262]228    jnc     SHORT .Found                ;  If so, return
229    add     di, BYTE LARGEST_DPT_SIZE   ; Point to next DPT
[258]230    loop    .LoopWhileDPTsLeft
[262]231
[3]232ALIGN JUMP_ALIGN
[262]233.NotFound:
234    stc
235
236ALIGN JUMP_ALIGN
237.Found:
[3]238    pop     cx
239    ret
[259]240
Note: See TracBrowser for help on using the repository browser.