Changeset 558 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Device/IDE
- Timestamp:
- Jun 23, 2013, 3:52:31 PM (11 years ago)
- google:author:
- krille_n_@hotmail.com
- Location:
- trunk/XTIDE_Universal_BIOS/Src/Device/IDE
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeDmaBlock.asm
r551 r558 1 1 ; Project name : XTIDE Universal BIOS 2 ; Description : IDE Read/Write functions for transferring 3 ; block using DMA.4 ; These functions should only be called from IdeTransfer.asm. 2 ; Description : IDE Read/Write functions for transferring block using DMA. 3 ; These functions should only be called from IdeTransfer.asm. 4 5 5 ; Modified JJP 05-Jun-13 6 6 7 ; 7 8 ; XTIDE Universal BIOS and Associated Tools … … 84 85 shl cx, 9 ; CX = Block size in BYTEs 85 86 %else 86 xchg 87 xchg cl, ch 87 88 shl cx, 1 88 89 %endif … … 92 93 neg ax ; 2s compliment 93 94 94 ; if DI was zero carry flag will be cleared (and set otherwise)95 ; If DI was zero carry flag will be cleared (and set otherwise) 95 96 ; When DI is zero only one transfer is required since we've limited the 96 97 ; XT-CFv3 block size to 32k 97 jnc .TransferLastDmaPageWithSizeInCX98 jnc SHORT .TransferLastDmaPageWithSizeInCX 98 99 99 100 ; CF was set, so DI != 0 and we might need one or two transfers 100 101 cmp cx, ax ; if we won't cross a physical page boundary... 101 jbe SHORT .TransferLastDmaPageWithSizeInCX ; ...perform the transfer in one operation102 jbe SHORT .TransferLastDmaPageWithSizeInCX ; ...perform the transfer in one operation 102 103 103 104 ; Calculate how much we can transfer on first and second rounds 104 xchg cx, ax; CX = BYTEs for first page105 sub ax, cx 106 push 105 xchg cx, ax ; CX = BYTEs for first page 106 sub ax, cx ; AX = BYTEs for second page 107 push ax ; Save bytes for second transfer on stack 107 108 108 109 ; Transfer first DMA page … … 126 127 ; ES:DI updated (CX is added) 127 128 ; Corrupts registers: 128 ; AX 129 ; AX, CX 129 130 ;-------------------------------------------------------------------- 130 131 ALIGN JUMP_ALIGN … … 161 162 sti ; Enable interrupts 162 163 164 ; Update physical address in ES:DI - since IO might need several calls through this function either from here 165 ; if crossing a physical page boundary, or from IdeTransfer.asm if requested sectors was > PIOVARS.wSectorsInBlock 166 ; We update the pointer here (before the actual transfer) to avoid having to save the byte count on the stack 167 mov ax, es ; copy physical page address to ax 168 add di, cx ; add requested bytes to di 169 adc al, 0 ; and increment physical page address, if required 170 mov es, ax ; and save it back in es 171 163 172 ; XT-CF transfers 16 bytes at a time. We need to manually start transfer for every block by writing (anything) 164 173 ; to the XT-CFv3 Control Register, which raises DRQ thereby passing system control to the 8237 DMA controller. … … 169 178 170 179 %if 0 ; Slow DMA code - works by checking 8237 status register after each 16-byte transfer, until it reports TC has been raised. 171 ;ALIGN JUMP_ALIGN 172 ;.TransferNextBlock: 173 ; cli ; We want no ISR to read DMA Status Register before we do 174 ; out dx, al ; Transfer up to 16 bytes to/from XT-CF card 175 ; in al, STATUS_REGISTER_DMA8_in 176 ; sti 177 ; test al, FLG_CH3_HAS_REACHED_TERMINAL_COUNT 178 ; jz SHORT .TransferNextBlock ; All bytes transferred? 179 %endif ; Slow DMA code 180 181 %if 1 ; Fast DMA code - perform computed number of transfers, then check DMA status register to be sure 182 push cx ; need byte count to update pointer at the end 180 ALIGN JUMP_ALIGN 181 .TransferNextBlock: 182 cli ; We want no ISR to read DMA Status Register before we do 183 out dx, al ; Transfer up to 16 bytes to/from XT-CF card 184 in al, STATUS_REGISTER_DMA8_in 185 sti 186 test al, FLG_CH3_HAS_REACHED_TERMINAL_COUNT 187 jz SHORT .TransferNextBlock ; All bytes transferred? 188 %else ; Fast DMA code - perform computed number of transfers, then check DMA status register to be sure 183 189 add cx, BYTE 15 ; We'll divide transfers in 16-byte atomic transfers, 184 190 eSHR_IM cx, 4 ; so include any partial block, which will be terminated … … 191 197 test al, FLG_CH3_HAS_REACHED_TERMINAL_COUNT ; ... for channel 3 terminal count 192 198 jz SHORT .TransferNextDmaBlock ; If not set, get more bytes 193 pop cx ; get back requested bytes 194 %endif ; Fast DMA code 195 196 ; Update physical address in ES:DI - since IO might need several calls through this function either from here 197 ; if crossing a physical page boundary, and from IdeTransfer.asm if requested sectors was > PIOVARS.wSectorsInBlock 198 mov ax, es ; copy physical page address to ax 199 add di, cx ; add requested bytes to di 200 adc al, 0 ; and increment physical page address, if required 201 mov es, ax ; and save it back in es 199 %endif 202 200 203 201 ret -
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeIO.asm
r545 r558 67 67 je SHORT .InputToALfromMemoryMappedRegisterInBX 68 68 mov bl, dl 69 mov bh, 69 mov bh, ADP50L_COMMAND_BLOCK_REGISTER_WINDOW_OFFSET >> 8 70 70 71 71 .InputToALfromMemoryMappedRegisterInBX: -
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdePioBlock.asm
r545 r558 1 1 ; Project name : XTIDE Universal BIOS 2 ; Description : IDE Read/Write functions for transferring 3 ; block using PIO modes. 2 ; Description : IDE Read/Write functions for transferring block using PIO modes. 4 3 ; These functions should only be called from IdeTransfer.asm. 5 4 … … 65 64 ; 66 65 ; Parameters: 67 ; CX: Block size in 512 byte sectors68 ; DX: IDE Data port address66 ; CX: Block size in 512 byte sectors 67 ; DX: IDE Data port address 69 68 ; ES:DI: Normalized ptr to buffer to receive data 70 69 ; Returns: … … 100 99 ; 101 100 ; Parameters: 102 ; CX: Block size in 512 byte sectors103 ; DX: IDE Data port address101 ; CX: Block size in 512 byte sectors 102 ; DX: IDE Data port address 104 103 ; ES:DI: Normalized ptr to buffer to receive data 105 104 ; Returns: … … 111 110 IdePioBlock_ReadFrom16bitDataPort: 112 111 %ifdef USE_186 113 xchg 112 xchg cl, ch ; Sectors to WORDs 114 113 rep insw 115 114 ret … … 120 119 .ReadNextOword: 121 120 %rep 8 ; WORDs 122 in ax, dx ; Read BYTE123 stosw ; Store BYTEto [ES:DI]121 in ax, dx ; Read WORD 122 stosw ; Store WORD to [ES:DI] 124 123 %endrep 125 124 loop .ReadNextOword … … 152 151 ; IdePioBlock_WriteToXtideRev1 153 152 ; Parameters: 154 ; CX: Block size in 512-byte sectors155 ; DX: IDE Data port address153 ; CX: Block size in 512-byte sectors 154 ; DX: IDE Data port address 156 155 ; ES:SI: Normalized ptr to buffer containing data 157 156 ; Returns: … … 180 179 ; IdePioBlock_WriteToXtideRev2 or rev 1 with swapped A0 and A3 (chuck-mod) 181 180 ; Parameters: 182 ; CX: Block size in 512-byte sectors183 ; DX: IDE Data port address181 ; CX: Block size in 512-byte sectors 182 ; DX: IDE Data port address 184 183 ; ES:SI: Normalized ptr to buffer containing data 185 184 ; Returns: … … 191 190 IdePioBlock_WriteToXtideRev2: 192 191 UNROLL_SECTORS_IN_CX_TO_QWORDS 193 push 194 push 195 pop 192 push ds 193 push es ; Copy ES... 194 pop ds ; ...to DS 196 195 ALIGN JUMP_ALIGN 197 196 .WriteNextQword: … … 207 206 ; IdePioBlock_WriteTo8bitDataPort 208 207 ; Parameters: 209 ; CX: Block size in 512-byte sectors210 ; DX: IDE Data port address208 ; CX: Block size in 512-byte sectors 209 ; DX: IDE Data port address 211 210 ; ES:SI: Normalized ptr to buffer containing data 212 211 ; Returns: … … 225 224 %else ; If 8088/8086 226 225 UNROLL_SECTORS_IN_CX_TO_QWORDS 227 push 228 ;mov 229 ;mov 230 push 231 pop 226 push ds 227 ;mov ax, es 228 ;mov ds, ax ; move es to ds via ax (does this run faster on 8088?) 229 push es 230 pop ds 232 231 ALIGN JUMP_ALIGN 233 232 .WriteNextQword: … … 248 247 ; IdePioBlock_WriteTo32bitDataPort VLB/PCI 32-bit IDE 249 248 ; Parameters: 250 ; CX: Block size in 512-byte sectors251 ; DX: IDE Data port address249 ; CX: Block size in 512-byte sectors 250 ; DX: IDE Data port address 252 251 ; ES:SI: Normalized ptr to buffer containing data 253 252 ; Returns: … … 274 273 .WriteNextQword: 275 274 %rep 4 ; WORDs 276 lodsw ; Load BYTEfrom [DS:SI]277 out dx, ax ; Write BYTE275 lodsw ; Load WORD from [DS:SI] 276 out dx, ax ; Write WORD 278 277 %endrep 279 278 loop .WriteNextQword -
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeTransfer.asm
r545 r558 209 209 ; ES:SI: Normalized pointer 210 210 ; AH: INT 13h Error Code (only when CF set) 211 ; CF: Set of failed to normalize pointer (segment overflow)211 ; CF: Set if failed to normalize pointer (segment overflow) 212 212 ; Cleared if success 213 213 ; Corrupts registers: … … 295 295 ret 296 296 %endif ; MODULE_8BIT_IDE_ADVANCED 297 ; Fall to IdeTransfer_NormalizePointerInESSI if no MODULE_8BIT_IDE 297 ; Fall to IdeTransfer_NormalizePointerInESSI if no MODULE_8BIT_IDE_ADVANCED 298 298 299 299 … … 305 305 ; Returns: 306 306 ; ES:SI: Normalized pointer (SI = 0...15) 307 ; AH: INT 13h Error Code ( only when CF set)308 ; CF: Set of failed to normalize pointer (segment overflow)307 ; AH: INT 13h Error Code (when USE_AT defined and normalization was attempted) 308 ; CF: Set if failed to normalize pointer (segment overflow) 309 309 ; Cleared if success 310 310 ; Corrupts registers: … … 319 319 %ifdef USE_AT 320 320 xor dl, dl 321 shldx, 1321 eSHL_IM dx, 1 322 322 dec dx ; Prevents normalization when bytes + offset will be zero 323 323 add dx, si … … 329 329 NORMALIZE_FAR_POINTER es, si, ax, dx 330 330 %ifdef USE_AT ; CF is always clear for XT builds 331 jc SHORT .SegmentOverflow 332 ret 333 .SegmentOverflow: 334 mov ah, RET_HD_INVALID 331 ; AH = RET_HD_INVALID (01) if CF set, RET_HD_SUCCESS (00) if not. CF unchanged. 332 sbb ah, ah 333 neg ah 335 334 %endif 336 335 ret
Note:
See TracChangeset
for help on using the changeset viewer.