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
RevLine 
[150]1; Project name  :   XTIDE Universal BIOS
[3]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;--------------------------------------------------------------------
[363]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;--------------------------------------------------------------------
[152]28; Emulates INSW for XTIDE.
[3]29;
[152]30; XTIDE_INSW
[3]31;   Parameters:
[370]32;       BL:     Bit mask for toggling XTIDE data low/high reg
[152]33;       DX:     XTIDE Data Low Register address
[3]34;       ES:DI:  Ptr to destination buffer
35;   Returns:
36;       ES:DI:  Incremented/decremented for next word
37;   Corrupts registers:
38;       AL, FLAGS
39;--------------------------------------------------------------------
[152]40%macro XTIDE_INSW 0
[3]41%ifdef USE_186  ; INS instruction available
42    insb                        ; Load low byte from port DX to [ES:DI]
[370]43    xor     dl, bl              ; IDE Data Reg to XTIDE Data High Reg
[3]44    insb                        ; Load high byte from port DX to [ES:DI]
[370]45    xor     dl, bl              ; Restore to IDE Data Register
[3]46%else   ; If 8088/8086
47    in      al, dx              ; Load low byte from port
[370]48    xor     dl, bl              ; IDE Data Reg to XTIDE Data High Reg
[3]49    stosb                       ; Store byte to [ES:DI]
50    in      al, dx              ; Load high byte from port
[370]51    xor     dl, bl              ; Restore to IDE Data Register
[3]52    stosb                       ; Store byte to [ES:DI]
53%endif
54%endmacro
55
56
57;--------------------------------------------------------------------
[152]58; Emulates OUTSW for XTIDE.
[3]59;
[152]60; XTIDE_OUTSW
[3]61;   Parameters:
[370]62;       BL:     Bit mask for toggling XTIDE data low/high reg
[152]63;       DX:     XTIDE Data Low Register address
[3]64;       DS:SI:  Ptr to source buffer
65;   Returns:
66;       SI:     Incremented/decremented for next word
67;   Corrupts registers:
68;       AX, FLAGS
69;--------------------------------------------------------------------
[152]70%macro XTIDE_OUTSW 0
[3]71%ifdef USE_186  ; OUTS instruction available
72    lodsb                       ; Load low byte from [DS:SI] to AL
[370]73    xor     dl, bl              ; IDE Data Reg to XTIDE Data High Reg
[3]74    outsb                       ; Output high byte from [DS:SI]
[370]75    xor     dl, bl              ; XTIDE Data High Reg to Data Low Reg
[3]76    out     dx, al              ; Output low byte from AL
77%else   ; If 8088/8086
78    lodsw                       ; Load word from [DS:SI]
[370]79    xor     dl, bl              ; IDE Data Reg to XTIDE Data High Reg
[3]80    xchg    al, ah              ; => AL=high byte, AH=low byte
81    out     dx, al              ; Output high byte
[370]82    xor     dl, bl              ; XTIDE Data High Reg to Data Low Reg
[3]83    mov     al, ah              ; Copy low byte to AL
84    out     dx, al              ; Output low byte
85%endif
86%endmacro
87
88
[152]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
[3]120%endif ; IDE_8BIT_INC
Note: See TracBrowser for help on using the repository browser.