Changeset 152 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeTransfer.asm
- Timestamp:
- May 1, 2011, 10:42:58 AM (13 years ago)
- google:author:
- aitotat
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeTransfer.asm
r150 r152 213 213 214 214 ;-------------------------------------------------------------------- 215 ; DualByteRead Dual port 8-bit XTIDE PIO read transfer 216 ; WordRead Normal 16-bit IDE PIO read transfer 217 ; DWordRead VLB/PCI 32-bit IDE PIO read transfer 218 ; SingleByteRead Single port 8-bit PIO read transfer 215 ; DualByteReadForXtide Dual port 8-bit XTIDE PIO read transfer 216 ; SingleByteRead Single port 8-bit PIO read transfer 217 ; WordReadForXTIDEmod 8088/8086 compatible 16-bit IDE PIO read transfer 218 ; WordReadForXTplusAndAT Normal 16-bit IDE PIO read transfer 219 ; DWordRead VLB/PCI 32-bit IDE PIO read transfer 219 220 ; Parameters: 220 221 ; CX: Block size in WORDs … … 227 228 ;-------------------------------------------------------------------- 228 229 ALIGN JUMP_ALIGN 229 DualByteRead :230 times 2 shr cx, 1 231 mov bx, 8 230 DualByteReadForXtide: 231 times 2 shr cx, 1 ; Loop unrolling 232 mov bx, 8 ; Bit mask for toggling data low/high reg 232 233 ALIGN JUMP_ALIGN 233 234 .InswLoop: 234 eDUAL_BYTE_PORT_INSW235 eDUAL_BYTE_PORT_INSW236 eDUAL_BYTE_PORT_INSW237 eDUAL_BYTE_PORT_INSW235 XTIDE_INSW 236 XTIDE_INSW 237 XTIDE_INSW 238 XTIDE_INSW 238 239 loop .InswLoop 239 240 ret 240 241 241 ALIGN JUMP_ALIGN 242 WordRead: 243 rep 244 db 6Dh ; INSW 245 ret 246 247 ALIGN JUMP_ALIGN 248 DWordRead: 249 shr cx, 1 ; WORD count to DWORD count 250 rep 251 db 66h ; Override operand size to 32-bit 252 db 6Dh ; INSW/INSD 253 ret 254 242 ;---- 255 243 ALIGN JUMP_ALIGN 256 244 SingleByteRead: 257 245 %ifdef USE_186 ; INS instruction available 258 shl cx, 1 246 shl cx, 1 ; WORD count to BYTE count 259 247 rep insb 260 248 %else ; If 8088/8086 261 shr cx, 1 249 shr cx, 1 ; WORD count to DWORD count 262 250 ALIGN JUMP_ALIGN 263 251 .InsdLoop: 264 252 in al, dx 265 stosb 253 stosb ; Store to [ES:DI] 266 254 in al, dx 267 255 stosb … … 274 262 ret 275 263 276 277 ;-------------------------------------------------------------------- 278 ; DualByteWrite Dual port 8-bit XTIDE PIO write transfer 279 ; WordWrite Normal 16-bit IDE PIO write transfer 280 ; DWordWrite VLB/PCI 32-bit IDE PIO write transfer 281 ; SingleByteWrite Single port 8-bit PIO write transfer 264 ;---- 265 %ifndef USE_186 266 ALIGN JUMP_ALIGN 267 WordReadForXTIDEmod: 268 times 2 shr cx, 1 ; WORD count to QWORD count 269 ALIGN JUMP_ALIGN 270 .ReadNextQword: 271 in ax, dx ; Read 1st WORD 272 stosw ; Store 1st WORD to [ES:DI] 273 in ax, dx 274 stosw ; 2nd 275 in ax, dx 276 stosw ; 3rd 277 in ax, dx 278 stosw ; 4th 279 loop .ReadNextQword 280 ret 281 %endif 282 283 ;---- 284 ALIGN JUMP_ALIGN 285 WordReadForXTplusAndAT: 286 rep 287 db 6Dh ; INSW (we want this in XT build) 288 ret 289 290 ;---- 291 ALIGN JUMP_ALIGN 292 DWordRead: 293 shr cx, 1 ; WORD count to DWORD count 294 rep 295 db 66h ; Override operand size to 32-bit 296 db 6Dh ; INSW/INSD 297 ret 298 299 300 ;-------------------------------------------------------------------- 301 ; DualByteWriteForXtide Dual port 8-bit XTIDE PIO write transfer 302 ; SingleByteWrite Single port 8-bit PIO write transfer 303 ; WordWriteForXTIDEmod 8088/8086 compatible 16-bit IDE PIO read transfer 304 ; WordWrite Normal 16-bit IDE PIO write transfer 305 ; DWordWrite VLB/PCI 32-bit IDE PIO write transfer 282 306 ; Parameters: 283 307 ; CX: Block size in WORDs … … 290 314 ;-------------------------------------------------------------------- 291 315 ALIGN JUMP_ALIGN 292 DualByteWrite :316 DualByteWriteForXtide: 293 317 push ds 294 318 push bx 295 times 2 shr cx, 1 296 mov bx, 8 297 push es 298 pop ds 319 times 2 shr cx, 1 ; Loop unrolling 320 mov bx, 8 ; Bit mask for toggling data low/high reg 321 push es ; Copy ES... 322 pop ds ; ...to DS 299 323 ALIGN JUMP_ALIGN 300 324 .OutswLoop: 301 eDUAL_BYTE_PORT_OUTSW302 eDUAL_BYTE_PORT_OUTSW303 eDUAL_BYTE_PORT_OUTSW304 eDUAL_BYTE_PORT_OUTSW325 XTIDE_OUTSW 326 XTIDE_OUTSW 327 XTIDE_OUTSW 328 XTIDE_OUTSW 305 329 loop .OutswLoop 306 330 pop bx … … 308 332 ret 309 333 310 ALIGN JUMP_ALIGN 311 WordWrite: 312 eSEG es ; Source is ES segment 313 rep 314 db 6Fh ; OUTSW 315 ret 316 317 ALIGN JUMP_ALIGN 318 DWordWrite: 319 shr cx, 1 ; WORD count to DWORD count 320 eSEG es ; Source is ES segment 321 rep 322 db 66h ; Override operand size to 32-bit 323 db 6Fh ; OUTSW/OUTSD 324 ret 325 334 ;---- 326 335 ALIGN JUMP_ALIGN 327 336 SingleByteWrite: 328 337 %ifdef USE_186 ; OUTS instruction available 329 shl cx, 1 330 eSEG es 338 shl cx, 1 ; WORD count to BYTE count 339 eSEG es ; Source is ES segment 331 340 rep outsb 332 341 %else ; If 8088/8086 333 shr cx, 1 334 push ds 335 push es 336 pop ds 342 shr cx, 1 ; WORD count to DWORD count 343 push ds ; Store DS 344 push es ; Copy ES... 345 pop ds ; ...to DS 337 346 ALIGN JUMP_ALIGN 338 347 .OutsdLoop: 339 lodsb 348 lodsb ; Load from [DS:SI] to AL 340 349 out dx, al 341 350 lodsb … … 346 355 out dx, al 347 356 loop .OutsdLoop 348 pop ds ; Restore DS 349 %endif 350 ret 357 pop ds ; Restore DS 358 %endif 359 ret 360 361 ;--- 362 ALIGN JUMP_ALIGN 363 WordWriteForXTIDEmod: 364 push ds 365 times 2 shr cx, 1 ; Loop unrolling 366 push es ; Copy ES... 367 pop ds ; ...to DS 368 ALIGN JUMP_ALIGN 369 .WriteNextQword: 370 XTIDE_MOD_OUTSW 371 XTIDE_MOD_OUTSW 372 XTIDE_MOD_OUTSW 373 XTIDE_MOD_OUTSW 374 loop .WriteNextQword 375 pop ds 376 ret 377 378 ;---- 379 ALIGN JUMP_ALIGN 380 WordWrite: 381 eSEG es ; Source is ES segment 382 rep 383 db 6Fh ; OUTSW 384 ret 385 386 ALIGN JUMP_ALIGN 387 DWordWrite: 388 shr cx, 1 ; WORD count to DWORD count 389 eSEG es ; Source is ES segment 390 rep 391 db 66h ; Override operand size to 32-bit 392 db 6Fh ; OUTSW/OUTSD 393 ret 394 351 395 352 396 … … 354 398 ALIGN WORD_ALIGN 355 399 g_rgfnPioRead: 356 dw DualByteRead ; DEVICE_8BIT_DUAL_PORT_XTIDE 357 dw NULL ; DEVICE_XTIDE_WITH_REVERSED_A3_AND_A0 358 dw SingleByteRead ; DEVICE_8BIT_SINGLE_PORT 359 dw WordRead ; DEVICE_16BIT_ATA 360 dw DWordRead ; DEVICE_32BIT_ATA 400 dw DualByteReadForXtide ; DEVICE_8BIT_DUAL_PORT_XTIDE 401 %ifdef USE_186 402 dw WordReadForXTplusAndAT ; DEVICE_XTIDE_WITH_REVERSED_A3_AND_A0 403 %else 404 dw WordReadForXTIDEmod 405 %endif 406 dw SingleByteRead ; DEVICE_8BIT_SINGLE_PORT 407 dw WordReadForXTplusAndAT ; DEVICE_16BIT_ATA 408 dw DWordRead ; DEVICE_32BIT_ATA 409 361 410 g_rgfnPioWrite: 362 dw DualByteWrite 363 dw NULL; DEVICE_XTIDE_WITH_REVERSED_A3_AND_A0364 dw SingleByteWrite ; DEVICE_8BIT_SINGLE_PORT365 dw WordWrite ; DEVICE_16BIT_ATA366 dw DWordWrite ; DEVICE_32BIT_ATA411 dw DualByteWriteForXtide ; DEVICE_8BIT_DUAL_PORT_XTIDE 412 dw WordWriteForXTIDEmod ; DEVICE_XTIDE_WITH_REVERSED_A3_AND_A0 413 dw SingleByteWrite ; DEVICE_8BIT_SINGLE_PORT 414 dw WordWrite ; DEVICE_16BIT_ATA 415 dw DWordWrite ; DEVICE_32BIT_ATA
Note: See TracChangeset
for help on using the changeset viewer.