Changeset 400 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeIO.asm
- Timestamp:
- Apr 20, 2012, 2:30:16 PM (13 years ago)
- google:author:
- aitotat@gmail.com
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeIO.asm
r376 r400 23 23 ;-------------------------------------------------------------------- 24 24 ; IdeIO_OutputALtoIdeControlBlockRegisterInDL 25 ; Parameters: 26 ; AL: Byte to output 27 ; DL: IDE Control Block Register 28 ; DS:DI: Ptr to DPT (in RAMVARS segment) 29 ; Returns: 30 ; Nothing 31 ; Corrupts registers: 32 ; BX, DX 33 ;-------------------------------------------------------------------- 34 IdeIO_OutputALtoIdeControlBlockRegisterInDL: 35 %ifdef MODULE_8BIT_IDE 36 mov dh, [di+DPT_ATA.bDevice] 37 %ifdef MODULE_JRIDE 38 test dh, dh 39 jnz SHORT .OutputToIoMappedIde 40 41 add dx, JRIDE_CONTROL_BLOCK_REGISTER_WINDOW_OFFSET 42 jmp SHORT OutputToJrIdeRegister 43 .OutputToIoMappedIde: 44 %endif 45 %endif 46 47 mov bl, IDEVARS.wPortCtrl 48 jmp SHORT OutputALtoIdeRegisterInDLwithIdevarsOffsetToBasePortInBL 49 50 51 ;-------------------------------------------------------------------- 25 52 ; IdeIO_OutputALtoIdeRegisterInDL 26 53 ; Parameters: 27 54 ; AL: Byte to output 28 ; DL: IDE Control Block Register (IdeIO_OutputALtoIdeControlBlockRegisterInDL) 29 ; IDE Register (IdeIO_OutputALtoIdeRegisterInDL) 55 ; DL: IDE Command Block Register 30 56 ; DS:DI: Ptr to DPT (in RAMVARS segment) 31 57 ; Returns: … … 35 61 ;-------------------------------------------------------------------- 36 62 ALIGN JUMP_ALIGN 37 IdeIO_OutputALtoIdeControlBlockRegisterInDL: 38 mov bl, IDEVARS.wPortCtrl 39 SKIP2B f ; cmp ax, <next instruction> 40 ; Fall to IdeIO_OutputALtoIdeRegisterInDL 63 IdeIO_OutputALtoIdeRegisterInDL: 64 %ifdef MODULE_8BIT_IDE 65 mov dh, [di+DPT_ATA.bDevice] 66 %ifdef MODULE_JRIDE 67 test dh, dh 68 jnz SHORT OutputALtoIOmappedIdeRegisterInDL 41 69 42 IdeIO_OutputALtoIdeRegisterInDL: 70 add dx, JRIDE_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET 71 OutputToJrIdeRegister: 72 mov bx, dx 73 mov [cs:bx], al 74 ret 75 ALIGN JUMP_ALIGN 76 OutputALtoIOmappedIdeRegisterInDL: 77 %endif 78 %endif 79 43 80 mov bl, IDEVARS.wPort 44 call GetPortToDXandTranslateA0andA3ifNecessary 81 OutputALtoIdeRegisterInDLwithIdevarsOffsetToBasePortInBL: 82 call GetIdePortToDX 45 83 out dx, al 46 84 ret 47 85 86 87 ;-------------------------------------------------------------------- 88 ; IdeIO_InputStatusRegisterToAL 89 ; Parameters: 90 ; DS:DI: Ptr to DPT (in RAMVARS segment) 91 ; Returns: 92 ; AL: IDE Status Register contents 93 ; Corrupts registers: 94 ; BX, DX 95 ;-------------------------------------------------------------------- 96 ALIGN JUMP_ALIGN 97 IdeIO_InputStatusRegisterToAL: 98 mov dl, STATUS_REGISTER_in 99 ; Fall to IdeIO_InputToALfromIdeRegisterInDL 48 100 49 101 ;-------------------------------------------------------------------- … … 57 109 ; BX, DX 58 110 ;-------------------------------------------------------------------- 59 ALIGN JUMP_ALIGN60 111 IdeIO_InputToALfromIdeRegisterInDL: 112 %ifdef MODULE_8BIT_IDE 113 mov dh, [di+DPT_ATA.bDevice] 114 %ifdef MODULE_JRIDE 115 test dh, dh 116 jnz SHORT .InputToALfromIOmappedIdeRegisterInDL 117 118 add dx, JRIDE_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET 119 mov bx, dx 120 mov al, [cs:bx] 121 ret 122 .InputToALfromIOmappedIdeRegisterInDL: 123 %endif 124 %endif 61 125 mov bl, IDEVARS.wPort 62 call Get PortToDXandTranslateA0andA3ifNecessary126 call GetIdePortToDX 63 127 in al, dx 64 128 ret … … 66 130 67 131 ;-------------------------------------------------------------------- 68 ; Get PortToDXandTranslateA0andA3ifNecessary132 ; GetIdePortToDX 69 133 ; Parameters: 70 134 ; BL: Offset to port in IDEVARS (IDEVARS.wPort or IDEVARS.wPortCtrl) 135 ; DH: Device Type (IDEVARS.bDevice) 71 136 ; DL: IDE Register 72 137 ; DS:DI: Ptr to DPT (in RAMVARS segment) … … 77 142 ;-------------------------------------------------------------------- 78 143 ALIGN JUMP_ALIGN 79 GetPortToDXandTranslateA0andA3ifNecessary: 144 GetIdePortToDX: 145 %ifdef MODULE_8BIT_IDE 146 ; Point CS:BX to IDEVARS 80 147 xor bh, bh 81 add bl, [di+DPT.bIdevarsOffset] ; CS:BX now points port address 82 xor dh, dh ; DX now has IDE register offset 83 add dx, [cs:bx] 84 test BYTE [di+DPT.bFlagsHigh], FLGH_DPT_REVERSED_A0_AND_A3 85 jz SHORT .ReturnPortInDX 148 add bl, [di+DPT.bIdevarsOffset] ; CS:BX now points port address 149 150 ; Load port address and check if A0 and A3 address lines need to be reversed 151 cmp dh, DEVICE_8BIT_XTIDE_REV1 152 mov dh, bh ; DX now has IDE register offset 153 jae SHORT .ReturnUntranslatedPortInDX ; No need to swap address lines 86 154 87 155 ; Exchange address lines A0 and A3 from DL 156 add dx, [cs:bx] ; DX now has port address 88 157 mov bl, dl 89 158 mov bh, MASK_A3_AND_A0_ADDRESS_LINES 90 and bh, bl ; BH = 0, 1, 8 or 9, we can ignore 0 and 991 jz SHORT .Return PortInDX; Jump out since DH is 0159 and bh, bl ; BH = 0, 1, 8 or 9, we can ignore 0 and 9 160 jz SHORT .ReturnTranslatedPortInDX ; Jump out since DH is 0 92 161 xor bh, MASK_A3_AND_A0_ADDRESS_LINES 93 jz SHORT .Return PortInDX; Jump out since DH was 9162 jz SHORT .ReturnTranslatedPortInDX ; Jump out since DH was 9 94 163 and dl, ~MASK_A3_AND_A0_ADDRESS_LINES 95 or dl, bh ; Address lines now reversed96 .Return PortInDX:164 or dl, bh ; Address lines now reversed 165 .ReturnTranslatedPortInDX: 97 166 ret 167 168 .ReturnUntranslatedPortInDX: 169 add dx, [cs:bx] 170 ret 171 172 %else ; Only standard IDE devices 173 xor bh, bh 174 xor dh, dh 175 add bl, [di+DPT.bIdevarsOffset] ; CS:BX now points port address 176 add dx, [cs:bx] ; DX now has port address 177 ret 178 %endif
Note:
See TracChangeset
for help on using the changeset viewer.