Changeset 152 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Device/IDE
- Timestamp:
- May 1, 2011, 10:42:58 AM (14 years ago)
- google:author:
- aitotat
- Location:
- trunk/XTIDE_Universal_BIOS/Src/Device/IDE
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeCommand.asm
r150 r152 114 114 mov dl, DEVICE_CONTROL_REGISTER_out 115 115 mov al, [bp+IDEPACK.bDeviceControl] 116 test al, FLG_DEVCONTROL_nIEN 117 jnz SHORT .DoNotSetInterruptInServiceFlag 118 or WORD [di+DPT.wFlags], FLG_DPT_INTERRUPT_IN_SERVICE 119 push ds 120 LOAD_BDA_SEGMENT_TO ds, cx, ! ; Also zero CX 121 mov [BDA.bHDTaskFlg], al 122 pop ds 123 .DoNotSetInterruptInServiceFlag: 116 124 call Device_OutputALtoIdeControlBlockRegisterInDL 117 125 -
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeIrq.asm
r150 r152 50 50 51 51 ;-------------------------------------------------------------------- 52 ; IdeIrq_SetInServiceDPTandClearTaskFlag53 ; Parameters:54 ; DS:DI: Ptr to DPT (in RAMVARS segment)55 ; Returns:56 ; Nothing57 ; Corrupts registers:58 ; AX59 ;--------------------------------------------------------------------60 ALIGN JUMP_ALIGN61 IdeIrq_SetInServiceDPTandClearTaskFlag:62 mov [RAMVARS.pInServiceDPT], di63 push ds64 LOAD_BDA_SEGMENT_TO ds, ax, ! ; Also zero AX65 mov [BDA.bHDTaskFlg], al66 pop ds67 ret68 69 70 ;--------------------------------------------------------------------71 52 ; IDE Interrupt Service Routines. 72 53 ; … … 86 67 call AcknowledgeIdeInterruptAndSetTaskFlag 87 68 88 mov al, C MD_END_OF_INTERRUPT69 mov al, COMMAND_END_OF_INTERRUPT 89 70 jmp SHORT AcknowledgeMasterInterruptController 90 71 … … 96 77 call AcknowledgeIdeInterruptAndSetTaskFlag 97 78 98 mov al, C MD_END_OF_INTERRUPT ; Load EOI command to AL99 out WPORT_8259SL_COMMAND, al ; Acknowledge Slave 825979 mov al, COMMAND_END_OF_INTERRUPT 80 out SLAVE_8259_COMMAND_out, al ; Acknowledge Slave 8259 100 81 AcknowledgeMasterInterruptController: 101 out WPORT_8259MA_COMMAND, al ; Acknowledge Master 825982 out MASTER_8259_COMMAND_out, al ; Acknowledge Master 8259 102 83 103 84 ; Issue Int 15h, function AX=9100h (Interrupt ready) … … 122 103 AcknowledgeIdeInterruptAndSetTaskFlag: 123 104 push ds 105 push si 124 106 push dx 125 107 push bx … … 127 109 ; Reading Status Register acknowledges IDE interrupt 128 110 call RamVars_GetSegmentToDS 129 mov di, [RAMVARS.pInServiceDPT] ; DS:DI now points to DPT111 call FindDPT_ToDSDIforInterruptInService 130 112 mov dl, STATUS_REGISTER_in 131 113 call Device_InputToALfromIdeRegisterInDL 114 115 ; Clear Interrupt In-Service Flag from DPT 116 and WORD [di+DPT.wFlags], ~FLG_DPT_INTERRUPT_IN_SERVICE 132 117 133 118 ; Set Task Flag … … 137 122 pop bx 138 123 pop dx 124 pop si 139 125 pop ds 140 126 ret -
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.