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

Last change on this file since 589 was 589, checked in by krille_n_, 8 years ago

Changes:

  • BIOS: Fixed a purely cosmetic bug from r542 where, in builds containing MODULE_EBIOS, the boot menu would display an incorrect drive size (0.4 kB with MODULE_STRINGS_COMPRESSED or 0.5 kB without) for old drives with no support for LBA.
  • Fixed a bug from r392 where Vision_DetectAndReturnIDinAXandPortInDXifControllerPresent would return the ID in AL instead of AH (if DANGEROUS_DETECTION had been defined).
  • Fixed a bug from r587 in AdvAtaInit.asm that would prevent detection of QDI Vision controllers.
  • Also changed how the QDI Vision IDs are defined (removed the need for shifting) to avoid confusion. This fixed a potential bug from r587 in AdvAtaInit.asm where some IDs were not being shifted.
  • Fixed a bug in PDC20x30.asm from r587 where GetPdcIDtoAX would not return with the IDE base port in DX so DisablePdcProgrammingMode would fail.
  • Made some changes to ModuleDependency.inc and other files so that MODULE_ADVANCED_ATA now requires USE_386. Consequently it is no longer included in the regular AT-builds, only in the 386_8k-build.
  • Moved the UNROLL_SECTORS_IN_CX_TO_xWORDS macros from IDE_8bit.inc to IdeIO.inc which means it's now possible to build a BIOS without MODULE_8BIT_IDE.
  • XTIDECFG: Added a minimum DOS version check (since it needs DOS version 2+) to allow the program to quit gracefully in the unlikely scenario where someone tries to run it under DOS version 1.
  • Made some changes to Drive.asm to improve drive enumeration. The old method using GET_DOS_DRIVE_PARAMETER_BLOCK_FOR_SPECIFIC_DRIVE worked well in Windows XP but not in Windows 98 SE (in Windows or in DOS mode). The two problems were; 1) The function call would access the drives which on single floppy drive systems would cause Windows to swap between A: and B: (throwing a blue screen asking the user to insert a disk etc). 2) Only floppy drives and FAT16 drives would be available in the list of drives, no FAT32/optical/network drives.
  • Improved code in IdeControllerMenu.asm so that the default port addresses for all IDE interfaces are now restored when (re-)selecting the (same) type of IDE device.
  • Also made it impossible to select a device type unless the required module is included in the loaded BIOS.
  • The version check done when loading a BIOS now uses the FLASH_SIGNATURE definition from Version.inc. Any changes affecting RomVars now only requires updating that definition. This means that changes to RomVars must be implemented in both the BIOS and XTIDECFG before being committed to the repository.
  • Added a compatibility fix for 3Com 3C503 cards to the ROM checksumming code in Buffers.asm (Buffers_GenerateChecksum).
  • SerDrive: Made some minor changes to file names and paths to improve compatibility with case sensitive environments.
  • BIOSDRVS: Made a minor size optimization which as a side effect also makes it compatible with all DOS versions including DOS version 1.
  • Library: Renamed the WAIT_RETRACE_IF_NECESSARY_THEN macro to CALL_WAIT_FOR_RETRACE_IF_NECESSARY_THEN and made a tail-call-optimized version of it (JMP_WAIT_FOR_RETRACE_IF_NECESSARY_THEN).
  • A speed optimization to the eRCL_IM macro for 386 and higher. This change breaks emulation in the sense that the macro will fail when given a memory operand as the first parameter.
  • Other minor optimizations and fixes.
File size: 16.3 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Int 13h BIOS functions (Floppy and Hard disk).
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; Int 13h software interrupt handler.
25; This handler changes stack to top of stolen conventional memory
26; and then calls the actual INT 13h handler (Int13h_DiskFunctionsHandler).
27;
28; Int13h_DiskFunctionsHandlerWithStackChange
29;   Parameters:
30;       AH:     Bios function
31;       DL:     Drive number
32;       Other:  Depends on function
33;   Returns:
34;       Depends on function
35;--------------------------------------------------------------------
36%ifdef RELOCATE_INT13H_STACK
37ALIGN JUMP_ALIGN
38Int13h_DiskFunctionsHandlerWithStackChange:
39    sti         ; Enable interrupts
40    ; TODO: Maybe we need to save Flags (DF) as well?
41    push    ds  ; Save DS:DI on the original stack
42    push    di
43    call    RamVars_GetSegmentToDS
44
45    ; Store entry registers to RAMVARS
46%ifdef USE_386
47    pop     DWORD [RAMVARS.dwStackChangeDSDI]
48%else
49    pop     WORD [RAMVARS.wStackChangeDI]   ; Pop DS:DI to the top of what
50    pop     WORD [RAMVARS.wStackChangeDS]   ; is to become the new stack
51%endif
52    mov     [RAMVARS.fpInt13hEntryStack], sp
53    mov     [RAMVARS.fpInt13hEntryStack+2], ss
54
55    ; Load new stack and restore DS and DI
56    mov     di, ds      ; We can save 2 bytes by using PUSH/POP but it's slower
57    mov     ss, di      ; No need to wrap with CLI/STI since this is for AT only (286+)
58    mov     sp, RAMVARS.rgbTopOfStack-4
59    pop     di          ; DI before stack change
60    pop     ds          ; DS before stack change
61
62    ; Call INT 13h
63    pushf
64    push    cs
65    call    Int13h_DiskFunctionsHandler
66
67    ; Restore stack (we must not corrupt FLAGS!)
68%ifdef USE_386
69    lss     sp, [ss:RAMVARS.fpInt13hEntryStack]
70%else
71    cli
72    mov     sp, [ss:RAMVARS.fpInt13hEntryStack]
73    mov     ss, [ss:RAMVARS.fpInt13hEntryStack+2]
74    sti
75%endif
76    retf    2           ; Skip FLAGS from stack
77%endif ; RELOCATE_INT13H_STACK
78
79
80;--------------------------------------------------------------------
81; Int 13h software interrupt handler.
82; Jumps to specific function defined in AH.
83;
84; Note to developers: Do not make recursive INT 13h calls!
85;
86; Int13h_DiskFunctionsHandler
87;   Parameters:
88;       AH:     Bios function
89;       DL:     Drive number
90;       Other:  Depends on function
91;   Returns:
92;       Depends on function
93;--------------------------------------------------------------------
94ALIGN JUMP_ALIGN
95Int13h_DiskFunctionsHandler:
96%ifndef RELOCATE_INT13H_STACK
97    sti                                 ; Enable interrupts
98%endif
99    cld                                 ; String instructions to increment pointers
100    ePUSHA
101    push    ds
102    push    es
103%ifdef USE_386
104;   push    fs
105;   push    gs
106%endif
107    sub     sp, BYTE SIZE_OF_IDEPACK_WITHOUT_INTPACK
108    mov     bp, sp
109    call    RamVars_GetSegmentToDS
110
111%ifdef MODULE_DRIVEXLATE
112    call    DriveXlate_ToOrBack
113%endif
114    call    FindDPT_ForDriveNumberInDL  ; DS:DI points to our DPT, or NULL if not our drive
115    jc      SHORT .NotOurDrive          ; DPT not found so this is not one of our drives
116
117.OurFunction:
118    ; Jump to correct BIOS function
119    eMOVZX  bx, ah
120    eSHL_IM bx, 1
121    cmp     ah, 25h                     ; Possible EBIOS function?
122%ifndef MODULE_EBIOS
123    ja      SHORT UnsupportedFunction
124    jmp     [cs:bx+g_rgw13hFuncJump]    ; Jump to BIOS function
125
126%else ; If using MODULE_EBIOS
127    ja      SHORT .JumpToEbiosFunction
128    jmp     [cs:bx+g_rgw13hFuncJump]    ; Jump to BIOS function
129
130ALIGN JUMP_ALIGN
131.JumpToEbiosFunction:
132    test    BYTE [di+DPT.bFlagsLow], FLGL_DPT_LBA
133    jz      SHORT UnsupportedFunction   ; No eINT 13h for CHS drives
134    sub     bl, 41h<<1                  ; BX = Offset to eINT 13h jump table
135    jb      SHORT UnsupportedFunction
136    cmp     ah, 48h
137    ja      SHORT UnsupportedFunction
138    jmp     [cs:bx+g_rgwEbiosFunctionJumpTable]
139%endif  ; MODULE_EBIOS
140
141
142ALIGN JUMP_ALIGN
143.NotOurDrive:
144    test    ah, ah
145    jz      SHORT .OurFunction          ; We handle all function 0h requests (resets)
146
147%ifndef MODULE_SERIAL_FLOPPY
148; Without floppy support, we handle only hard disk traffic for function 08h.
149    test    dl, dl
150    jns     SHORT Int13h_DirectCallToAnotherBios
151%endif
152; With floppy support, we handle all traffic for function 08h, as we need to wrap both hard disk and floppy drive counts.
153    cmp     ah, GET_DRIVE_PARAMETERS
154    je      SHORT .OurFunction
155    ; Fall to Int13h_DirectCallToAnotherBios
156
157
158;--------------------------------------------------------------------
159; UnsupportedFunction
160; Int13h_DirectCallToAnotherBios
161;   Parameters:
162;       DL:     Translated drive number
163;       DS:     RAMVARS segment
164;       SS:BP:  Ptr to IDEPACK
165;       BX, DI: Corrupted on Int13h_DiskFunctionsHandler
166;       Other:  Function specific INT 13h parameters
167;   Returns:
168;       Depends on function
169;   Corrupts registers:
170;       Flags
171;--------------------------------------------------------------------
172ALIGN JUMP_ALIGN
173UnsupportedFunction:
174Int13h_DirectCallToAnotherBios:
175%ifdef MODULE_DRIVEXLATE
176    ; Disable drive number translations in case of recursive INT 13h calls
177    mov     [RAMVARS.xlateVars+XLATEVARS.bXlatedDrv], dl
178    push    WORD [RAMVARS.xlateVars+XLATEVARS.wFDandHDswap]
179    call    DriveXlate_Reset            ; No translation
180%endif
181
182    push    bp                          ; Store offset to IDEPACK (SS:SP now points it)
183
184    ; Simulate INT by pushing flags and return address
185    push    WORD [bp+IDEPACK.intpack+INTPACK.flags]
186%if 0
187    ; No standard INT 13h function uses FLAGS as parameters so no need to restore them
188    popf
189    pushf
190%endif
191    push    cs
192    ePUSH_T di, .ReturnFromAnotherBios  ; Can not corrupt flags
193
194    ; Push old INT 13h handler and restore registers
195    push    WORD [RAMVARS.fpOldI13h+2]
196    push    WORD [RAMVARS.fpOldI13h]
197    mov     bx, [bp+IDEPACK.intpack+INTPACK.bx]
198    mov     di, [bp+IDEPACK.intpack+INTPACK.di]
199    mov     ds, [bp+IDEPACK.intpack+INTPACK.ds]
200    mov     bp, [bp+IDEPACK.intpack+INTPACK.bp]
201    retf                                ; "Return" to old INT 13h
202.ReturnFromAnotherBios:
203
204%if 0
205    ; We need to restore our pointer to IDEPACK but we cannot corrupt any register
206    push    ax                          ; Dummy WORD
207    cli
208    xchg    bp, sp
209    mov     [bp], sp                    ; Replace dummy WORD with returned BP
210    mov     sp, [bp+2]                  ; Load offset to IDEPACK
211    xchg    sp, bp
212    sti                                 ; We would have set IF anyway when exiting INT 13h
213    pop     WORD [bp+IDEPACK.intpack+INTPACK.bp]
214%endif
215    ; Actually we can corrupt BP since no standard INT 13h function uses it as return
216    ; register. Above code is kept here just in case if there is some non-standard function.
217    ; POP BP below also belongs to the above code.
218    pop     bp                          ; Clean IDEPACK offset from stack
219
220    ; Store remaining returned values to INTPACK
221%ifdef USE_386
222; We do not use GS or FS at the moment
223;   mov     [bp+IDEPACK.intpack+INTPACK.gs], gs
224;   mov     [bp+IDEPACK.intpack+INTPACK.fs], fs
225%endif
226    mov     [bp+IDEPACK.intpack+INTPACK.es], es
227    mov     [bp+IDEPACK.intpack+INTPACK.ds], ds
228    mov     [bp+IDEPACK.intpack+INTPACK.di], di
229    mov     [bp+IDEPACK.intpack+INTPACK.si], si
230    mov     [bp+IDEPACK.intpack+INTPACK.bx], bx
231%ifdef MODULE_DRIVEXLATE
232    mov     [bp+IDEPACK.intpack+INTPACK.dh], dh
233%else
234    mov     [bp+IDEPACK.intpack+INTPACK.dx], dx
235%endif
236    mov     [bp+IDEPACK.intpack+INTPACK.cx], cx
237    mov     [bp+IDEPACK.intpack+INTPACK.ax], ax
238    pushf
239    pop     WORD [bp+IDEPACK.intpack+INTPACK.flags]
240    call    RamVars_GetSegmentToDS
241
242%ifdef MODULE_DRIVEXLATE
243    ; Restore drive number translation back to what it was
244    pop     WORD [RAMVARS.xlateVars+XLATEVARS.wFDandHDswap]
245    cmp     dl, [RAMVARS.xlateVars+XLATEVARS.bXlatedDrv]    ; DL is still drive number?
246    je      SHORT Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
247    mov     [bp+IDEPACK.intpack+INTPACK.dl], dl ; Something is returned in DL
248%endif
249    jmp     SHORT Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
250
251
252%ifdef MODULE_SERIAL_FLOPPY
253;--------------------------------------------------------------------
254; Int13h_ReturnSuccessForFloppy
255;
256; Some operations, such as format of a floppy disk track, should just
257; return success, while for hard disks it should be treated as unsupported.
258;--------------------------------------------------------------------
259ALIGN JUMP_ALIGN
260Int13h_ReturnSuccessForFloppy:
261    test    dl, dl
262    js      SHORT UnsupportedFunction
263    xor     ah, ah
264    jmp     SHORT Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
265%endif
266
267
268;--------------------------------------------------------------------
269; Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAHandTransferredSectorsFromCL
270;   Parameters:
271;       AH:     BIOS Error code
272;       CL:     Number of sectors actually transferred
273;       SS:BP:  Ptr to IDEPACK
274;   Returns:
275;       All registers are loaded from INTPACK
276;--------------------------------------------------------------------
277ALIGN JUMP_ALIGN
278Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAHandTransferredSectorsFromCL:
279    mov     [bp+IDEPACK.intpack+INTPACK.al], cl
280    ; Fall to Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
281
282
283;--------------------------------------------------------------------
284; Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
285; Int13h_ReturnFromHandlerWithoutStoringErrorCode
286;   Parameters:
287;       AH:     BIOS Error code
288;       SS:BP:  Ptr to IDEPACK
289;   Returns:
290;       All registers are loaded from INTPACK
291;--------------------------------------------------------------------
292ALIGN JUMP_ALIGN
293Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH:
294%ifdef MODULE_SERIAL_FLOPPY
295    mov     al, [bp+IDEPACK.intpack+INTPACK.dl]
296Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH_ALHasDriveNumber:
297    call    Int13h_SetErrorCodeToBdaAndToIntpackInSSBPfromAH_ALHasDriveNumber
298
299%else
300    call    Int13h_SetErrorCodeToBdaAndToIntpackInSSBPfromAH
301%endif
302
303Int13h_ReturnFromHandlerWithoutStoringErrorCode:
304    ; Always return with interrupts enabled since there are programs that rely
305    ; on INT 13h to enable interrupts.
306    or      BYTE [bp+IDEPACK.intpack+INTPACK.flags+1], (FLG_FLAGS_IF>>8)
307
308    lea     sp, [bp+SIZE_OF_IDEPACK_WITHOUT_INTPACK]
309%ifdef USE_386
310;   pop     gs
311;   pop     fs
312%endif
313    pop     es
314    pop     ds
315    ePOPA
316    iret
317
318
319;--------------------------------------------------------------------
320; Int13h_CallPreviousInt13hHandler
321;   Parameters:
322;       AH:     INT 13h function to call
323;       DL:     Drive number
324;       DS:     RAMVARS segment
325;   Returns:
326;       Depends on function
327;       NOTE: ES:DI needs to be returned from the previous interrupt
328;             handler, for floppy DPT in function 08h
329;   Corrupts registers:
330;       None
331;--------------------------------------------------------------------
332ALIGN JUMP_ALIGN
333Int13h_CallPreviousInt13hHandler:
334    pushf                       ; Simulate INT by pushing flags
335    call far [RAMVARS.fpOldI13h]
336    ret
337
338
339;--------------------------------------------------------------------
340; Int13h_SetErrorCodeToBdaAndToIntpackInSSBPfromAH_ALHasDriveNumber
341; Int13h_SetErrorCodeToBdaAndToIntpackInSSBPfromAH
342; Int13h_SetErrorCodeToIntpackInSSBPfromAH
343;   Parameters:
344;       AH:     BIOS error code (00h = no error)
345;       SS:BP:  Ptr to IDEPACK
346;   Returns:
347;       SS:BP:  Ptr to IDEPACK with error condition set
348;   Corrupts registers:
349;       DS, BX, DI
350;--------------------------------------------------------------------
351ALIGN JUMP_ALIGN
352%ifdef MODULE_SERIAL_FLOPPY
353Int13h_SetErrorCodeToBdaAndToIntpackInSSBPfromAH_ALHasDriveNumber:
354    ; Store error code to BDA
355    mov     bx, BDA.bHDLastSt
356    test    al, al
357    js      SHORT .HardDisk
358    mov     bl, BDA.bFDRetST & 0xff
359.HardDisk:
360    LOAD_BDA_SEGMENT_TO ds, di
361    mov     [bx], ah
362    ; Fall to Int13h_SetErrorCodeToIntpackInSSBPfromAH
363
364%else
365Int13h_SetErrorCodeToBdaAndToIntpackInSSBPfromAH:
366    ; Store error code to BDA
367    LOAD_BDA_SEGMENT_TO ds, di
368    mov     [BDA.bHDLastSt], ah
369    ; Fall to Int13h_SetErrorCodeToIntpackInSSBPfromAH
370%endif
371
372    ; Store error code to INTPACK
373Int13h_SetErrorCodeToIntpackInSSBPfromAH:
374    mov     [bp+IDEPACK.intpack+INTPACK.ah], ah
375    test    ah, ah
376    jnz     SHORT .SetCFtoIntpack
377    and     BYTE [bp+IDEPACK.intpack+INTPACK.flags], ~FLG_FLAGS_CF
378    ret
379.SetCFtoIntpack:
380    or      BYTE [bp+IDEPACK.intpack+INTPACK.flags], FLG_FLAGS_CF
381    ret
382
383
384; Jump table for correct BIOS function
385ALIGN WORD_ALIGN
386g_rgw13hFuncJump:
387    dw  AH0h_HandlerForDiskControllerReset          ; 00h, Disk Controller Reset (All)
388    dw  AH1h_HandlerForReadDiskStatus               ; 01h, Read Disk Status (All)
389    dw  AH2h_HandlerForReadDiskSectors              ; 02h, Read Disk Sectors (All)
390    dw  AH3h_HandlerForWriteDiskSectors             ; 03h, Write Disk Sectors (All)
391    dw  AH4h_HandlerForVerifyDiskSectors            ; 04h, Verify Disk Sectors (All)
392%ifdef MODULE_SERIAL_FLOPPY
393    dw  Int13h_ReturnSuccessForFloppy               ; 05h, Format Disk Track (XT, AT, EISA)
394%else
395    dw  UnsupportedFunction                         ; 05h, Format Disk Track (XT, AT, EISA)
396%endif
397    dw  UnsupportedFunction                         ; 06h, Format Disk Track with Bad Sectors (XT)
398    dw  UnsupportedFunction                         ; 07h, Format Multiple Cylinders (XT)
399    dw  AH8h_HandlerForReadDiskDriveParameters      ; 08h, Read Disk Drive Parameters (All)
400    dw  AH9h_HandlerForInitializeDriveParameters    ; 09h, Initialize Drive Parameters (All)
401    dw  UnsupportedFunction                         ; 0Ah, Read Disk Sectors with ECC (XT, AT, EISA)
402    dw  UnsupportedFunction                         ; 0Bh, Write Disk Sectors with ECC (XT, AT, EISA)
403    dw  AHCh_HandlerForSeek                         ; 0Ch, Seek (All)
404    dw  AH9h_HandlerForInitializeDriveParameters    ; 0Dh, Alternate Disk Reset (All)
405    dw  UnsupportedFunction                         ; 0Eh, Read Sector Buffer (XT, PS/1), ESDI Undocumented Diagnostic (PS/2)
406    dw  UnsupportedFunction                         ; 0Fh, Write Sector Buffer (XT, PS/1), ESDI Undocumented Diagnostic (PS/2)
407    dw  AH10h_HandlerForCheckDriveReady             ; 10h, Check Drive Ready (All)
408    dw  AH11h_HandlerForRecalibrate                 ; 11h, Recalibrate (All)
409    dw  UnsupportedFunction                         ; 12h, Controller RAM Diagnostic (XT)
410    dw  UnsupportedFunction                         ; 13h, Drive Diagnostic (XT)
411    dw  AH10h_HandlerForCheckDriveReady             ; 14h, Controller Internal Diagnostic (All)
412    dw  AH15h_HandlerForReadDiskDriveSize           ; 15h, Read Disk Drive Size (AT+)
413    dw  UnsupportedFunction                         ; 16h,
414    dw  UnsupportedFunction                         ; 17h,
415    dw  UnsupportedFunction                         ; 18h,
416    dw  UnsupportedFunction                         ; 19h, Park Heads (PS/2)
417    dw  UnsupportedFunction                         ; 1Ah, Format ESDI Drive (PS/2)
418    dw  UnsupportedFunction                         ; 1Bh, Get ESDI Manufacturing Header (PS/2)
419    dw  UnsupportedFunction                         ; 1Ch, ESDI Special Functions (PS/2)
420    dw  UnsupportedFunction                         ; 1Dh,
421%ifdef MODULE_8BIT_IDE_ADVANCED
422    dw  AH1Eh_HandlerForXTCFfeatures                ; 1Eh, Lo-tech XT-CF features (XTIDE Universal BIOS)
423%else
424    dw  UnsupportedFunction                         ; 1Eh,
425%endif
426    dw  UnsupportedFunction                         ; 1Fh,
427    dw  UnsupportedFunction                         ; 20h,
428    dw  UnsupportedFunction                         ; 21h, Read Disk Sectors, Multiple Blocks (PS/1)
429    dw  UnsupportedFunction                         ; 22h, Write Disk Sectors, Multiple Blocks (PS/1)
430    dw  AH23h_HandlerForSetControllerFeatures       ; 23h, Set Controller Features Register (PS/1)
431    dw  AH24h_HandlerForSetMultipleBlocks           ; 24h, Set Multiple Blocks (PS/1)
432    dw  AH25h_HandlerForGetDriveInformation         ; 25h, Get Drive Information (PS/1)
433
434%ifdef MODULE_EBIOS
435g_rgwEbiosFunctionJumpTable:
436    dw  AH41h_HandlerForCheckIfExtensionsPresent    ; 41h, Check if Extensions Present (EBIOS)*
437    dw  AH42h_HandlerForExtendedReadSectors         ; 42h, Extended Read Sectors (EBIOS)*
438    dw  AH43h_HandlerForExtendedWriteSectors        ; 43h, Extended Write Sectors (EBIOS)*
439    dw  AH44h_HandlerForExtendedVerifySectors       ; 44h, Extended Verify Sectors (EBIOS)*
440    dw  UnsupportedFunction                         ; 45h, Lock and Unlock Drive (EBIOS)***
441    dw  UnsupportedFunction                         ; 46h, Eject Media Request (EBIOS)***
442    dw  AH47h_HandlerForExtendedSeek                ; 47h, Extended Seek (EBIOS)*
443    dw  AH48h_HandlerForGetExtendedDriveParameters  ; 48h, Get Extended Drive Parameters (EBIOS)*
444;   dw  UnsupportedFunction                         ; 49h, Get Extended Disk Change Status (EBIOS)***
445;   dw  UnsupportedFunction                         ; 4Ah, Initiate Disk Emulation (Bootable CD-ROM)
446;   dw  UnsupportedFunction                         ; 4Bh, Terminate Disk Emulation (Bootable CD-ROM)
447;   dw  UnsupportedFunction                         ; 4Ch, Initiate Disk Emulation and Boot (Bootable CD-ROM)
448;   dw  UnsupportedFunction                         ; 4Dh, Return Boot Catalog (Bootable CD-ROM)
449;   dw  UnsupportedFunction                         ; 4Eh, Set Hardware Configuration (EBIOS)**
450;
451;   * = Enhanced Drive Access Support (minimum required EBIOS functions)
452;  ** = Enhanced Disk Drive (EDD) Support
453; *** = Drive Locking and Ejecting Support
454%endif
Note: See TracBrowser for help on using the repository browser.