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

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

Changes:

  • Added some missing PIO mode timings to ATA_ID.inc (based on info from http://www.singlix.net/specs/cfspc4_0.pdf)
  • Updated Configuration_FullMode.txt but it may need additional changes as the Tandy info doesn't match the wiki.
  • Optimizations.
  • Excluded some unused code from XTIDECFG.
File size: 3.7 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Macros for accessing data port(s) on 8-bit
3;                   IDE controllers.
4%ifndef IDE_8BIT_INC
5%define IDE_8BIT_INC
6
7;--------------------------------------------------------------------
8; UNROLL_SECTORS_IN_CX_TO_QWORDS
9;   Parameters:
10;       CX:     Number of sectors in block
11;   Returns:
12;       CX:     Number of QWORDs in block
13;   Corrupts registers:
14;       Nothing
15;--------------------------------------------------------------------
16%macro UNROLL_SECTORS_IN_CX_TO_QWORDS 0
17%ifdef USE_186
18    shl     cx, 6
19%else
20    xchg    cl, ch      ; Sectors to WORDs (SHL CX, 8)
21    shr     cx, 1
22    shr     cx, 1
23%endif
24%endmacro
25
26
27;--------------------------------------------------------------------
28; Emulates INSW for XTIDE.
29;
30; XTIDE_INSW
31;   Parameters:
32;       BL:     Bit mask for toggling XTIDE data low/high reg
33;       DX:     XTIDE Data Low Register address
34;       ES:DI:  Ptr to destination buffer
35;   Returns:
36;       ES:DI:  Incremented/decremented for next word
37;   Corrupts registers:
38;       AL, FLAGS
39;--------------------------------------------------------------------
40%macro XTIDE_INSW 0
41%ifdef USE_186  ; INS instruction available
42    insb                        ; Load low byte from port DX to [ES:DI]
43    xor     dl, bl              ; IDE Data Reg to XTIDE Data High Reg
44    insb                        ; Load high byte from port DX to [ES:DI]
45    xor     dl, bl              ; Restore to IDE Data Register
46%else   ; If 8088/8086
47    in      al, dx              ; Load low byte from port
48    xor     dl, bl              ; IDE Data Reg to XTIDE Data High Reg
49    stosb                       ; Store byte to [ES:DI]
50    in      al, dx              ; Load high byte from port
51    xor     dl, bl              ; Restore to IDE Data Register
52    stosb                       ; Store byte to [ES:DI]
53%endif
54%endmacro
55
56
57;--------------------------------------------------------------------
58; Emulates OUTSW for XTIDE.
59;
60; XTIDE_OUTSW
61;   Parameters:
62;       BL:     Bit mask for toggling XTIDE data low/high reg
63;       DX:     XTIDE Data Low Register address
64;       DS:SI:  Ptr to source buffer
65;   Returns:
66;       SI:     Incremented/decremented for next word
67;   Corrupts registers:
68;       AX, FLAGS
69;--------------------------------------------------------------------
70%macro XTIDE_OUTSW 0
71%ifdef USE_186  ; OUTS instruction available
72    lodsb                       ; Load low byte from [DS:SI] to AL
73    xor     dl, bl              ; IDE Data Reg to XTIDE Data High Reg
74    outsb                       ; Output high byte from [DS:SI]
75    xor     dl, bl              ; XTIDE Data High Reg to Data Low Reg
76    out     dx, al              ; Output low byte from AL
77%else   ; If 8088/8086
78    lodsw                       ; Load word from [DS:SI]
79    xor     dl, bl              ; IDE Data Reg to XTIDE Data High Reg
80    xchg    al, ah              ; => AL=high byte, AH=low byte
81    out     dx, al              ; Output high byte
82    xor     dl, bl              ; XTIDE Data High Reg to Data Low Reg
83    mov     al, ah              ; Copy low byte to AL
84    out     dx, al              ; Output low byte
85%endif
86%endmacro
87
88
89;--------------------------------------------------------------------
90; Emulates OUTSW for modified XTIDE.
91;
92; XTIDE_MOD_OUTSW
93;   Parameters:
94;       DX:     XTIDE Data Low Register address
95;       DS:SI:  Ptr to source buffer
96;   Returns:
97;       SI:     Incremented/decremented for next word
98;   Corrupts registers:
99;       AX, FLAGS
100;--------------------------------------------------------------------
101%macro XTIDE_MOD_OUTSW 0
102%ifdef USE_186  ; OUTS instruction available
103    lodsb                       ; Load low byte from [DS:SI] to AL
104    inc     dx                  ; IDE Data Reg to XTIDE MOD Data High Reg
105    outsb                       ; Output high byte from [DS:SI]
106    dec     dx                  ; XTIDE Data High Reg to Data Low Reg
107    out     dx, al              ; Output low byte from AL
108%else   ; If 8088/8086
109    lodsw                       ; Load word from [DS:SI]
110    inc     dx                  ; IDE Data Reg to XTIDE MOD Data High Reg
111    xchg    al, ah              ; => AL=high byte, AH=low byte
112    out     dx, al              ; Output high byte
113    dec     dx                  ; XTIDE Data High Reg to Data Low Reg
114    mov     al, ah              ; Copy low byte to AL
115    out     dx, al              ; Output low byte
116%endif
117%endmacro
118
119
120%endif ; IDE_8BIT_INC
Note: See TracBrowser for help on using the repository browser.