source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Inc/IDE_8bit.inc@ 420

Last change on this file since 420 was 376, checked in by gregli@…, 13 years ago

WIDE checkin... Added copyright and license information to sorce files, as per the GPL instructions for usage.

File size: 4.4 KB
RevLine 
[150]1; Project name : XTIDE Universal BIOS
[3]2; Description : Macros for accessing data port(s) on 8-bit
3; IDE controllers.
[376]4
5;
6; XTIDE Universal BIOS and Associated Tools
7; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 by XTIDE Universal BIOS Team.
8;
9; This program is free software; you can redistribute it and/or modify
10; it under the terms of the GNU General Public License as published by
11; the Free Software Foundation; either version 2 of the License, or
12; (at your option) any later version.
13;
14; This program is distributed in the hope that it will be useful,
15; but WITHOUT ANY WARRANTY; without even the implied warranty of
16; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17; GNU General Public License for more details.
18; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19;
20
[3]21%ifndef IDE_8BIT_INC
22%define IDE_8BIT_INC
23
24;--------------------------------------------------------------------
[363]25; UNROLL_SECTORS_IN_CX_TO_QWORDS
26; Parameters:
27; CX: Number of sectors in block
28; Returns:
29; CX: Number of QWORDs in block
30; Corrupts registers:
31; Nothing
32;--------------------------------------------------------------------
33%macro UNROLL_SECTORS_IN_CX_TO_QWORDS 0
34%ifdef USE_186
35 shl cx, 6
36%else
37 xchg cl, ch ; Sectors to WORDs (SHL CX, 8)
38 shr cx, 1
39 shr cx, 1
40%endif
41%endmacro
42
43
44;--------------------------------------------------------------------
[152]45; Emulates INSW for XTIDE.
[3]46;
[152]47; XTIDE_INSW
[3]48; Parameters:
[370]49; BL: Bit mask for toggling XTIDE data low/high reg
[152]50; DX: XTIDE Data Low Register address
[3]51; ES:DI: Ptr to destination buffer
52; Returns:
53; ES:DI: Incremented/decremented for next word
54; Corrupts registers:
55; AL, FLAGS
56;--------------------------------------------------------------------
[152]57%macro XTIDE_INSW 0
[3]58%ifdef USE_186 ; INS instruction available
59 insb ; Load low byte from port DX to [ES:DI]
[370]60 xor dl, bl ; IDE Data Reg to XTIDE Data High Reg
[3]61 insb ; Load high byte from port DX to [ES:DI]
[370]62 xor dl, bl ; Restore to IDE Data Register
[3]63%else ; If 8088/8086
64 in al, dx ; Load low byte from port
[370]65 xor dl, bl ; IDE Data Reg to XTIDE Data High Reg
[3]66 stosb ; Store byte to [ES:DI]
67 in al, dx ; Load high byte from port
[370]68 xor dl, bl ; Restore to IDE Data Register
[3]69 stosb ; Store byte to [ES:DI]
70%endif
71%endmacro
72
73
74;--------------------------------------------------------------------
[152]75; Emulates OUTSW for XTIDE.
[3]76;
[152]77; XTIDE_OUTSW
[3]78; Parameters:
[370]79; BL: Bit mask for toggling XTIDE data low/high reg
[152]80; DX: XTIDE Data Low Register address
[3]81; DS:SI: Ptr to source buffer
82; Returns:
83; SI: Incremented/decremented for next word
84; Corrupts registers:
85; AX, FLAGS
86;--------------------------------------------------------------------
[152]87%macro XTIDE_OUTSW 0
[3]88%ifdef USE_186 ; OUTS instruction available
89 lodsb ; Load low byte from [DS:SI] to AL
[370]90 xor dl, bl ; IDE Data Reg to XTIDE Data High Reg
[3]91 outsb ; Output high byte from [DS:SI]
[370]92 xor dl, bl ; XTIDE Data High Reg to Data Low Reg
[3]93 out dx, al ; Output low byte from AL
94%else ; If 8088/8086
95 lodsw ; Load word from [DS:SI]
[370]96 xor dl, bl ; IDE Data Reg to XTIDE Data High Reg
[3]97 xchg al, ah ; => AL=high byte, AH=low byte
98 out dx, al ; Output high byte
[370]99 xor dl, bl ; XTIDE Data High Reg to Data Low Reg
[3]100 mov al, ah ; Copy low byte to AL
101 out dx, al ; Output low byte
102%endif
103%endmacro
104
105
[152]106;--------------------------------------------------------------------
107; Emulates OUTSW for modified XTIDE.
108;
109; XTIDE_MOD_OUTSW
110; Parameters:
111; DX: XTIDE Data Low Register address
112; DS:SI: Ptr to source buffer
113; Returns:
114; SI: Incremented/decremented for next word
115; Corrupts registers:
116; AX, FLAGS
117;--------------------------------------------------------------------
118%macro XTIDE_MOD_OUTSW 0
119%ifdef USE_186 ; OUTS instruction available
120 lodsb ; Load low byte from [DS:SI] to AL
121 inc dx ; IDE Data Reg to XTIDE MOD Data High Reg
122 outsb ; Output high byte from [DS:SI]
123 dec dx ; XTIDE Data High Reg to Data Low Reg
124 out dx, al ; Output low byte from AL
125%else ; If 8088/8086
126 lodsw ; Load word from [DS:SI]
127 inc dx ; IDE Data Reg to XTIDE MOD Data High Reg
128 xchg al, ah ; => AL=high byte, AH=low byte
129 out dx, al ; Output high byte
130 dec dx ; XTIDE Data High Reg to Data Low Reg
131 mov al, ah ; Copy low byte to AL
132 out dx, al ; Output low byte
133%endif
134%endmacro
135
136
[3]137%endif ; IDE_8BIT_INC
Note: See TracBrowser for help on using the repository browser.