source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Tools/Prepare.asm @ 221

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

Changes to XTIDE Universal BIOS:

  • AH=0Ch (Seek) should work properly again.
  • More than 127 sectors are no longer allowed for EBIOS functions.
  • Changed location for BOOTNFO structs.
File size: 4.9 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Functions for preparing data buffer for transfer.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Prepare_ByLoadingDapToESSIandVerifyingForTransfer
9;   Parameters:
10;       SI:     Offset to DAP
11;       DS:DI:  Ptr to DPT
12;       SS:BP:  Ptr to IDEPACK
13;   Parameters on INTPACK:
14;       DS:SI:  Ptr to Disk Address Packet
15;   Returns:
16;       BX:     Index to command lookup table
17;       ES:SI:  Ptr to Disk Address Packet (DAP)
18;       Exits from INT 13h if invalid DAP
19;   Corrupts registers:
20;       AX, DX
21;--------------------------------------------------------------------
22%ifdef MODULE_EBIOS
23ALIGN JUMP_ALIGN
24Prepare_ByLoadingDapToESSIandVerifyingForTransfer:
25    ; Load pointer to DAP to ES:SI and make sure it is valid
26    mov     es, [bp+IDEPACK.intpack+INTPACK.ds] ; ES:SI to point Disk Address Packet
27    cmp     BYTE [es:si+DAP.bSize], MINIMUM_DAP_SIZE
28    jb      SHORT InvalidDAP
29
30    ; Make sure that sector count is valid
31    mov     ax, [es:si+DAP.wSectorCount]
32    test    ax, ax
33    jz      SHORT ZeroSectorsRequestedSoNoErrors
34    cmp     ax, BYTE 127
35    ja      SHORT InvalidNumberOfSectorsRequested
36    ; Fall to GetEbiosCommandIndexToBX
37
38;--------------------------------------------------------------------
39; GetEbiosCommandIndexToBX
40;   Parameters:
41;       DS:DI:  Ptr to DPT
42;       ES:SI:  Ptr to DAP (Disk Address Packet)
43;   Returns:
44;       BX:     Index to command lookup table
45;   Corrupts registers:
46;       AX, DX
47;--------------------------------------------------------------------
48GetEbiosCommandIndexToBX:
49    ; LBA28 or LBA48 command
50    xor     dx, dx
51    mov     al, [es:si+DAP.qwLBA+3] ; Load LBA48 byte 3 (bits 24...31)
52    and     ax, 00F0h               ; Clear LBA28 bits 24...27
53    or      ax, [es:si+DAP.qwLBA+4] ; Set bits from LBA bytes 4 and 5
54    cmp     dx, ax                  ; Set CF if any of bits 28...47 set
55    rcl     dx, 1                   ; DX = 0 for LBA28, DX = 1 for LBA48
56    call    Prepare_GetOldInt13hCommandIndexToBX
57    or      bx, dx                  ; Set block mode / single sector bit
58    ret
59%endif
60
61
62;--------------------------------------------------------------------
63; Prepare_GetOldInt13hCommandIndexToBX
64;   Parameters:
65;       DS:DI:  Ptr to DPT
66;   Returns:
67;       BX:     Index to command lookup table
68;   Corrupts registers:
69;       Nothing
70;--------------------------------------------------------------------
71ALIGN JUMP_ALIGN
72Prepare_GetOldInt13hCommandIndexToBX:
73    ; Block mode or single sector
74    mov     bl, [di+DPT.bFlagsHigh]
75    and     bx, BYTE FLGH_DPT_BLOCK_MODE_SUPPORTED  ; Bit 1
76    ret
77
78
79;---------------------------------------------------------------------
80; Prepare_BufferToESSIforOldInt13hTransfer
81;   Parameters:
82;       AL:     Number of sectors to transfer
83;       SS:BP:  Ptr to IDEPACK
84;   Parameters on INTPACK:
85;       ES:BX:  Ptr to data buffer
86;   Returns:
87;       ES:SI:  Ptr to normalized data buffer
88;       Exits INT 13h if error
89;   Corrupts registers:
90;       BX
91;--------------------------------------------------------------------
92ALIGN JUMP_ALIGN
93Prepare_BufferToESSIforOldInt13hTransfer:
94    ; Normalize buffer pointer
95    mov     bx, [bp+IDEPACK.intpack+INTPACK.bx] ; Load offset
96    mov     si, bx
97    eSHR_IM bx, 4                               ; Divide offset by 16
98    add     bx, [bp+IDEPACK.intpack+INTPACK.es]
99    mov     es, bx                              ; Segment normalized
100    and     si, BYTE 0Fh                        ; Offset normalized
101    ; Fall to Prepare_ByValidatingSectorsInALforOldInt13h
102
103
104;---------------------------------------------------------------------
105; Prepare_ByValidatingSectorsInALforOldInt13h
106;   Parameters:
107;       AL:     Number of sectors to transfer
108;   Returns:
109;       Exits INT 13h if invalid number of sectors in AL
110;   Corrupts registers:
111;       Nothing
112;--------------------------------------------------------------------
113ALIGN JUMP_ALIGN
114Prepare_ByValidatingSectorsInALforOldInt13h:
115    test    al, al
116    js      SHORT .CheckZeroOffsetFor128Sectors     ; 128 or more
117    jz      SHORT InvalidNumberOfSectorsRequested   ; Zero not allowed for old INT 13h
118    ret     ; Continue with transfer
119
120ALIGN JUMP_ALIGN
121.CheckZeroOffsetFor128Sectors:
122    cmp     al, 128
123    ja      SHORT InvalidNumberOfSectorsRequested
124    mov     ah, RET_HD_BOUNDARY
125    test    si, si                              ; Offset must be zero to xfer 128 sectors
126    jnz     SHORT CannotAlignPointerProperly
127    ret     ; Continue with transfer
128
129InvalidDAP:
130InvalidNumberOfSectorsRequested:
131Prepare_ReturnFromInt13hWithInvalidFunctionError:
132    mov     ah, RET_HD_INVALID
133ZeroSectorsRequestedSoNoErrors:
134CannotAlignPointerProperly:
135    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
136
137
138
139; Command lookup tables
140g_rgbReadCommandLookup:
141    db      COMMAND_READ_SECTORS        ; 00b, CHS or LBA28 single sector
142    db      COMMAND_READ_SECTORS_EXT    ; 01b, LBA48 single sector
143    db      COMMAND_READ_MULTIPLE       ; 10b, CHS or LBA28 block mode
144    db      COMMAND_READ_MULTIPLE_EXT   ; 11b, LBA48 block mode
145
146g_rgbWriteCommandLookup:
147    db      COMMAND_WRITE_SECTORS
148    db      COMMAND_WRITE_SECTORS_EXT
149    db      COMMAND_WRITE_MULTIPLE
150    db      COMMAND_WRITE_MULTIPLE_EXT
151
152g_rgbVerifyCommandLookup:
153    db      COMMAND_VERIFY_SECTORS
154    db      COMMAND_VERIFY_SECTORS_EXT
155    db      COMMAND_VERIFY_SECTORS
156    db      COMMAND_VERIFY_SECTORS_EXT
Note: See TracBrowser for help on using the repository browser.