source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Device/Idepack.asm @ 542

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

Changes to XTIDE Universal BIOS:

  • Fixed a bug that allowed EBIOS functions for user defined CHS.
  • Simplified user defined CHS and LBA setup a little.
File size: 5.5 KB
RevLine 
[150]1; Project name  :   XTIDE Universal BIOS
2; Description   :   Functions for managing IDEPACK struct.
3
[376]4;
[526]5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[376]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.
[526]12;
[376]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.
[526]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
[376]19
[150]20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; Idepack_FakeToSSBP
25;   Parameters:
26;       Nothing
27;   Returns:
28;       SS:BP:  Ptr to IDEPACK
29;   Corrupts registers:
30;       AX
31;--------------------------------------------------------------------
32Idepack_FakeToSSBP:
33    pop     ax
[443]34    sub     sp, BYTE SIZE_OF_IDEPACK_WITHOUT_INTPACK
[150]35    mov     bp, sp
36    jmp     ax
37
[181]38
[150]39;--------------------------------------------------------------------
[165]40; Idepack_ConvertDapToIdepackAndIssueCommandFromAH
41;   Parameters:
42;       AH:     IDE command to issue
43;       BH:     Timeout ticks
44;       BL:     IDE Status Register flag to wait after command
45;       DS:DI:  Ptr to DPT (in RAMVARS segment)
46;       ES:SI:  Ptr to DAP (EBIOS Disk Address Packet)
47;       SS:BP:  Ptr to IDEPACK
48;   Returns:
49;       AH:     INT 13h Error Code
[249]50;       CX:     Number of successfully transferred sectors (for transfer commands)
[165]51;       CF:     Cleared if success, Set if error
52;   Corrupts registers:
[249]53;       AL, BX, (CX), DX, SI, ES
[165]54;--------------------------------------------------------------------
[181]55%ifdef MODULE_EBIOS
[165]56ALIGN JUMP_ALIGN
57Idepack_ConvertDapToIdepackAndIssueCommandFromAH:
[224]58    mov     al, [es:si+DAP.wSectorCount]
[221]59    mov     [bp+IDEPACK.bSectorCount], al
[165]60    mov     [bp+IDEPACK.bCommand], ah
61
62    mov     al, [es:si+DAP.qwLBA]       ; LBA byte 0
63    mov     [bp+IDEPACK.bLbaLow], al
64    mov     ax, [es:si+DAP.qwLBA+1]     ; LBA bytes 1 and 2
65    mov     [bp+IDEPACK.wLbaMiddleAndHigh], ax
66    mov     ah, [es:si+DAP.qwLBA+3]     ; LBA byte 3, LBA28 bits 24...27
67    mov     [bp+IDEPACK.bLbaLowExt], ah
68    mov     cx, [es:si+DAP.qwLBA+4]     ; LBA bytes 4 and 5
69    mov     [bp+IDEPACK.wLbaMiddleAndHighExt], cx
70
71    and     ah, 0Fh                     ; Limit bits for LBA28
[542]72    call    AccessDPT_GetDriveSelectByteToAL
[165]73    or      al, ah
74    mov     [bp+IDEPACK.bDrvAndHead], al
[221]75
[480]76    ; Load data buffer pointer to ES:SI
[477]77    les     si, [es:si+DAP.dwMemoryAddress]
78    jmp     SHORT GetDeviceControlByteToIdepackAndStartTransfer
[421]79%endif ; MODULE_EBIOS
[165]80
[181]81
[165]82;--------------------------------------------------------------------
[150]83; Idepack_TranslateOldInt13hAddressAndIssueCommandFromAH
84;   Parameters:
85;       AH:     IDE command to issue
[221]86;       AL:     Number of sectors to transfer (for xfer commands)
[150]87;       BH:     Timeout ticks
88;       BL:     IDE Status Register flag to wait after command
89;       CH:     Cylinder number, bits 7...0
90;       CL:     Bits 7...6: Cylinder number bits 9 and 8
91;               Bits 5...0: Starting sector number (1...63)
92;       DH:     Starting head number (0...255)
93;       DS:DI:  Ptr to DPT (in RAMVARS segment)
[221]94;       ES:SI:  Ptr to normalized data buffer (for xfer commands)
[218]95;       SS:BP:  Ptr to IDEPACK (containing INTPACK)
[150]96;   Returns:
97;       AH:     INT 13h Error Code
[249]98;       CX:     Number of successfully transferred sectors (for transfer commands)
[150]99;       CF:     Cleared if success, Set if error
100;   Corrupts registers:
[249]101;       AL, BX, (CX), DX
[150]102;--------------------------------------------------------------------
103ALIGN JUMP_ALIGN
104Idepack_TranslateOldInt13hAddressAndIssueCommandFromAH:
[218]105    mov     [bp+IDEPACK.bSectorCount], al
[169]106    mov     [bp+IDEPACK.bCommand], ah
[181]107
[150]108    push    bx
[155]109    call    Address_OldInt13hAddressToIdeAddress
[542]110    call    AccessDPT_GetDriveSelectByteToAL
[150]111    or      al, bh          ; AL now has Drive and Head Select Byte
112    mov     [bp+IDEPACK.bDrvAndHead], al
113    mov     [bp+IDEPACK.bLbaLow], bl
114    mov     [bp+IDEPACK.wLbaMiddleAndHigh], cx
115    pop     bx
116
[165]117GetDeviceControlByteToIdepackAndStartTransfer:
[150]118    call    AccessDPT_GetDeviceControlByteToAL
119    mov     [bp+IDEPACK.bDeviceControl], al
[181]120    jmp     Device_OutputCommandWithParameters
[150]121
122
123;--------------------------------------------------------------------
124; Idepack_StoreNonExtParametersAndIssueCommandFromAL
125;   Parameters:
126;       BH:     Timeout ticks
127;       BL:     IDE Status Register flag to wait after command
128;       AL:     IDE command to issue
129;       AH:     Parameter to Drive and Head Select Register (Head bits only)
130;       DL:     Parameter to Sector Count Register
131;       DH:     Parameter to LBA Low / Sector Number Register
132;       CL:     Parameter to LBA Middle / Cylinder Low Register
133;       CH:     Parameter to LBA High / Cylinder High Register
134;       SI:     Parameter to Features Register
135;       DS:DI:  Ptr to DPT (in RAMVARS segment)
136;       SS:BP:  Ptr to IDEPACK
137;   Returns:
138;       AH:     INT 13h Error Code
139;       CF:     Cleared if success, Set if error
140;   Corrupts registers:
141;       AL, BX, CX, DX
142;--------------------------------------------------------------------
143ALIGN JUMP_ALIGN
144Idepack_StoreNonExtParametersAndIssueCommandFromAL:
145    mov     [bp+IDEPACK.bFeatures], si
146    mov     [bp+IDEPACK.bCommand], al
147    mov     [bp+IDEPACK.wSectorCountAndLbaLow], dx
148    mov     [bp+IDEPACK.wLbaMiddleAndHigh], cx
149
150    ; Drive and Head select byte
151    and     ah, MASK_DRVNHEAD_HEAD      ; Keep head bits only
[542]152    call    AccessDPT_GetDriveSelectByteToAL
[150]153    or      al, ah
154    mov     [bp+IDEPACK.bDrvAndHead], al
155
156    ; Device Control byte with interrupts disabled
[443]157    mov     BYTE [bp+IDEPACK.bDeviceControl], FLG_DEVCONTROL_nIEN
[150]158
159    jmp     Device_OutputCommandWithParameters
Note: See TracBrowser for help on using the repository browser.