source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH0h_HReset.asm@ 147

Last change on this file since 147 was 128, checked in by krille_n_@…, 13 years ago

Changes to the XTIDE Universal BIOS:

  • Size optimizations in various files.
File size: 5.4 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Int 13h function AH=0h, Disk Controller Reset.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Int 13h function AH=0h, Disk Controller Reset.
9;
10; AH0h_HandlerForDiskControllerReset
11; Parameters:
12; AH: Bios function 0h
13; DL: Drive number (ignored so all drives are reset)
14; If bit 7 is set all hard disks and floppy disks reset.
15; Parameters loaded by Int13h_Jump:
16; DS: RAMVARS segment
17; Returns:
18; AH: Int 13h return status (from drive requested in DL)
19; CF: 0 if succesfull, 1 if error
20; IF: 1
21; Corrupts registers:
22; Flags
23;--------------------------------------------------------------------
24ALIGN JUMP_ALIGN
25AH0h_HandlerForDiskControllerReset:
26 push dx
27 push cx
28 push bx
29 push ax
30
31 eMOVZX bx, dl ; Copy requested drive to BL, zero BH to assume no errors
32 call ResetFloppyDrivesWithInt40h
33 test bl, bl
34 jns SHORT .SkipHardDiskReset
35 call ResetForeignHardDisks
36 call AH0h_ResetHardDisksHandledByOurBIOS
37ALIGN JUMP_ALIGN
38.SkipHardDiskReset:
39 mov ah, bh ; Copy error code to AH
40 xor al, al ; Zero AL...
41 cmp al, bh ; ...and set CF if error
42 jmp Int13h_PopXRegsAndReturn
43
44
45;--------------------------------------------------------------------
46; ResetFloppyDrivesWithInt40h
47; Parameters:
48; BL: Requested drive (DL when entering AH=00h)
49; Returns:
50; BH: Error code from requested drive (if available)
51; Corrupts registers:
52; AX, DL, DI
53;--------------------------------------------------------------------
54ALIGN JUMP_ALIGN
55ResetFloppyDrivesWithInt40h:
56 call GetDriveNumberForForeignBiosesToDL
57 and dl, 7Fh ; Clear hard disk bit
58 xor ah, ah ; Disk Controller Reset
59 int INTV_FLOPPY_FUNC
60 jmp SHORT BackupErrorCodeFromTheRequestedDriveToBH
61
62
63;--------------------------------------------------------------------
64; ResetForeignHardDisks
65; Parameters:
66; BL: Requested drive (DL when entering AH=00h)
67; DS: RAMVARS segment
68; Returns:
69; BH: Error code from requested drive (if available)
70; Corrupts registers:
71; AX, DL, DI
72;--------------------------------------------------------------------
73ALIGN JUMP_ALIGN
74ResetForeignHardDisks:
75 call GetDriveNumberForForeignBiosesToDL
76 xor ah, ah ; Disk Controller Reset
77 call Int13h_CallPreviousInt13hHandler
78 jmp SHORT BackupErrorCodeFromTheRequestedDriveToBH
79
80
81;--------------------------------------------------------------------
82; GetDriveNumberForForeignBiosesToDL
83; Parameters:
84; BL: Requested drive (DL when entering AH=00h)
85; DS: RAMVARS segment
86; Returns:
87; DL: BL if foreign drive
88; 80h if our drive
89; Corrupts registers:
90; DI
91;--------------------------------------------------------------------
92ALIGN JUMP_ALIGN
93GetDriveNumberForForeignBiosesToDL:
94 mov dl, bl
95 call RamVars_IsDriveHandledByThisBIOS
96 jnc SHORT .Return ; Return what was in BL unmodified
97 mov dl, 80h
98ALIGN JUMP_ALIGN
99.Return:
100 ret
101
102
103;--------------------------------------------------------------------
104; ResetHardDisksHandledByOurBIOS
105; Parameters:
106; BL: Requested drive (DL when entering AH=00h)
107; DS: RAMVARS segment
108; Returns:
109; BH: Error code from requested drive (if available)
110; Corrupts registers:
111; AX, CX, DX, DI
112;--------------------------------------------------------------------
113ALIGN JUMP_ALIGN
114AH0h_ResetHardDisksHandledByOurBIOS:
115 mov dh, [RAMVARS.bDrvCnt] ; Load drive count to DH
116 test dh, dh
117 jz SHORT .AllDrivesReset ; Return if no drives
118 mov dl, [RAMVARS.bFirstDrv] ; Load number of first our drive
119 add dh, dl ; DH = one past last drive to reset
120ALIGN JUMP_ALIGN
121.DriveResetLoop:
122 call AHDh_ResetDrive
123 call .BackupErrorCodeFromMasterOrSlaveToBH
124 inc dx
125 cmp dl, dh ; All done?
126 jb SHORT .DriveResetLoop ; If not, reset next drive
127.AllDrivesReset:
128 ret
129
130;--------------------------------------------------------------------
131; .BackupErrorCodeFromMasterOrSlaveToBH
132; Parameters:
133; AH: Error code for drive DL reset
134; BL: Requested drive (DL when entering AH=00h)
135; DL: Drive just resetted
136; DS: RAMVARS segment
137; Returns:
138; BH: Backuped error code
139; DL: Incremented if next drive is slave drive
140; (=already resetted)
141; Corrupts registers:
142; CX, DI
143;--------------------------------------------------------------------
144ALIGN JUMP_ALIGN
145.BackupErrorCodeFromMasterOrSlaveToBH:
146 call BackupErrorCodeFromTheRequestedDriveToBH
147 mov cx, [RAMVARS.wIdeBase] ; Load base port for resetted drive
148
149 inc dx ; DL to next drive
150 call FindDPT_ForDriveNumber ; Get DPT to DS:DI, store port to RAMVARS
151 jnc SHORT .NoMoreDrivesOrNoSlaveDrive
152 cmp cx, [RAMVARS.wIdeBase] ; Next drive is from same controller?
153 je SHORT BackupErrorCodeFromTheRequestedDriveToBH
154.NoMoreDrivesOrNoSlaveDrive:
155 dec dx
156 ret
157
158
159;--------------------------------------------------------------------
160; BackupErrorCodeFromTheRequestedDriveToBH
161; Parameters:
162; AH: Error code from the last resetted drive
163; DL: Drive last resetted
164; BL: Requested drive (DL when entering AH=00h)
165; Returns:
166; BH: Backuped error code
167; Corrupts registers:
168; Nothing
169;--------------------------------------------------------------------
170ALIGN JUMP_ALIGN
171BackupErrorCodeFromTheRequestedDriveToBH:
172 cmp dl, bl ; Requested drive?
173 jne SHORT .Return
174 mov bh, ah
175ALIGN JUMP_ALIGN
176.Return:
177 ret
Note: See TracBrowser for help on using the repository browser.