Changeset 242 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Device
- Timestamp:
- Feb 10, 2012, 3:12:40 AM (13 years ago)
- google:author:
- krille_n_@hotmail.com
- Location:
- trunk/XTIDE_Universal_BIOS/Src/Device
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeDPT.asm
r160 r242 14 14 ; Nothing 15 15 ; Corrupts registers: 16 ; AX , BX, CX, DX16 ; AX 17 17 ;-------------------------------------------------------------------- 18 18 IdeDPT_Finalize: … … 28 28 ; Nothing 29 29 ; Corrupts registers: 30 ; Nothing30 ; AX 31 31 ;-------------------------------------------------------------------- 32 32 .StoreBlockMode: -
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeTransfer.asm
r238 r242 35 35 ALIGN JUMP_ALIGN 36 36 IdeTransfer_StartWithCommandInAL: 37 mov ah, [bp+IDEPACK.bSectorCount]38 39 37 ; Are we reading or writing? 40 38 test al, 16 ; Bit 4 is cleared on all the read commands but set on 3 of the 4 write commands 41 jnz SHORT .PrepareToWriteDataFromESSI 39 mov ah, [bp+IDEPACK.bSectorCount] 40 jnz SHORT WriteToDrive 42 41 cmp al, COMMAND_WRITE_MULTIPLE 43 je SHORT .PrepareToWriteDataFromESSI 44 45 ; Prepare to read data to ESSI 46 mov bx, g_rgfnPioRead 47 call InitializePiovarsInSSBPwithSectorCountInAH 48 xchg si, di 49 jmp SHORT ReadFromDrive 50 51 ALIGN JUMP_ALIGN 52 .PrepareToWriteDataFromESSI: 53 mov bx, g_rgfnPioWrite 54 call InitializePiovarsInSSBPwithSectorCountInAH 55 ; Fall to WriteToDrive 56 57 58 ;-------------------------------------------------------------------- 59 ; WriteToDrive 60 ; Parameters: 42 je SHORT WriteToDrive 43 ; Fall to ReadFromDrive 44 45 ;-------------------------------------------------------------------- 46 ; ReadFromDrive 47 ; Parameters: 48 ; AH: Number of sectors to transfer (1...128) 49 ; ES:SI: Normalized ptr to buffer to receive data 61 50 ; DS:DI: Ptr to DPT (in RAMVARS segment) 62 ; ES:SI: Normalized ptr to buffer containing data63 51 ; SS:BP: Ptr to PIOVARS 64 52 ; Returns: 53 ; DS:DI: Ptr to DPT (in RAMVARS segment) 65 54 ; AH: BIOS Error code 66 55 ; CX: Number of successfully transferred sectors … … 70 59 ; AL, BX, DX, SI, ES 71 60 ;-------------------------------------------------------------------- 61 ReadFromDrive: 62 ; Prepare to read data to ESSI 63 mov bx, g_rgfnPioRead 64 call InitializePiovarsInSSBPwithSectorCountInAH 65 66 ; Wait until drive is ready to transfer 67 call IdeWait_IRQorDRQ ; Wait until ready to transfer 68 jc SHORT ReturnWithTransferErrorInAH 69 xchg si, di ; ES:DI now points buffer 70 71 mov cx, [bp+PIOVARS.wWordsInBlock] 72 73 ALIGN JUMP_ALIGN 74 .ReadNextBlockFromDrive: 75 mov dx, [bp+PIOVARS.wDataPort] 76 cmp [bp+PIOVARS.wWordsLeft], cx 77 jbe SHORT .ReadLastBlockFromDrive 78 call [bp+PIOVARS.fnXfer] 79 80 ; Wait until ready for next block and check for errors 81 xchg di, si ; DS:DI now points DPT 82 call IdeWait_IRQorDRQ ; Wait until ready to transfer 83 jc SHORT ReturnWithTransferErrorInAH 84 xchg si, di ; ES:DI now points buffer 85 86 ; Increment number of successfully read WORDs 87 mov cx, [bp+PIOVARS.wWordsInBlock] 88 sub [bp+PIOVARS.wWordsLeft], cx 89 add [bp+PIOVARS.wWordsDone], cx 90 jmp SHORT .ReadNextBlockFromDrive 91 92 ALIGN JUMP_ALIGN 93 .ReadLastBlockFromDrive: 94 mov cx, [bp+PIOVARS.wWordsLeft] 95 call [bp+PIOVARS.fnXfer] ; Transfer possibly partial block 96 97 ; Check for errors in last block 98 mov di, si ; DS:DI now points DPT 99 CheckErrorsAfterTransferringLastBlock: 100 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRDY) 101 call IdeWait_PollStatusFlagInBLwithTimeoutInBH 102 103 ; Return number of successfully read sectors 104 ReturnWithTransferErrorInAH: 105 mov cx, [bp+PIOVARS.wWordsDone] 106 jc SHORT .ConvertTransferredWordsInCXtoSectors 107 add cx, [bp+PIOVARS.wWordsLeft] ; Never sets CF 108 .ConvertTransferredWordsInCXtoSectors: 109 xchg cl, ch 110 ret 111 112 113 ;-------------------------------------------------------------------- 114 ; WriteToDrive 115 ; Parameters: 116 ; AH: Number of sectors to transfer (1...128) 117 ; DS:DI: Ptr to DPT (in RAMVARS segment) 118 ; ES:SI: Normalized ptr to buffer containing data 119 ; SS:BP: Ptr to PIOVARS 120 ; Returns: 121 ; AH: BIOS Error code 122 ; CX: Number of successfully transferred sectors 123 ; CF: 0 if transfer succesfull 124 ; 1 if any error 125 ; Corrupts registers: 126 ; AL, BX, DX, SI, ES 127 ;-------------------------------------------------------------------- 128 ALIGN JUMP_ALIGN 72 129 WriteToDrive: 130 ; Prepare to write data from ESSI 131 mov bx, g_rgfnPioWrite 132 call InitializePiovarsInSSBPwithSectorCountInAH 133 73 134 ; Always poll when writing first block (IRQs are generated for following blocks) 74 135 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ) … … 76 137 jc SHORT ReturnWithTransferErrorInAH 77 138 139 mov cx, [bp+PIOVARS.wWordsInBlock] 140 78 141 ALIGN JUMP_ALIGN 79 142 .WriteNextBlockToDrive: 80 mov cx, [bp+PIOVARS.wWordsInBlock]81 143 mov dx, [bp+PIOVARS.wDataPort] 82 144 cmp [bp+PIOVARS.wWordsLeft], cx … … 89 151 90 152 ; Increment number of successfully written WORDs 91 mov ax, [bp+PIOVARS.wWordsInBlock]92 sub [bp+PIOVARS.wWordsLeft], ax93 add [bp+PIOVARS.wWordsDone], ax153 mov cx, [bp+PIOVARS.wWordsInBlock] 154 sub [bp+PIOVARS.wWordsLeft], cx 155 add [bp+PIOVARS.wWordsDone], cx 94 156 jmp SHORT .WriteNextBlockToDrive 95 157 … … 107 169 108 170 ;-------------------------------------------------------------------- 109 ; ReadFromDrive110 ; Parameters:111 ; ES:DI: Normalized ptr to buffer to recieve data112 ; DS:SI: Ptr to DPT (in RAMVARS segment)113 ; SS:BP: Ptr to PIOVARS114 ; Returns:115 ; DS:DI: Ptr to DPT (in RAMVARS segment)116 ; AH: BIOS Error code117 ; CX: Number of successfully transferred sectors118 ; CF: 0 if transfer succesfull119 ; 1 if any error120 ; Corrupts registers:121 ; AL, BX, DX, SI, ES122 ;--------------------------------------------------------------------123 ALIGN JUMP_ALIGN124 ReadFromDrive:125 ; Wait until drive is ready to transfer126 xchg di, si ; DS:DI now points DPT127 call IdeWait_IRQorDRQ ; Wait until ready to transfer128 jc SHORT ReturnWithTransferErrorInAH129 xchg si, di ; ES:DI now points buffer130 131 ALIGN JUMP_ALIGN132 .ReadNextBlockFromDrive:133 mov cx, [bp+PIOVARS.wWordsInBlock]134 mov dx, [bp+PIOVARS.wDataPort]135 cmp [bp+PIOVARS.wWordsLeft], cx136 jbe SHORT .ReadLastBlockFromDrive137 call [bp+PIOVARS.fnXfer]138 139 ; Wait until ready for next block and check for errors140 xchg di, si ; DS:DI now points DPT141 call IdeWait_IRQorDRQ ; Wait until ready to transfer142 jc SHORT ReturnWithTransferErrorInAH143 xchg si, di ; ES:DI now points buffer144 145 ; Increment number of successfully read WORDs146 mov ax, [bp+PIOVARS.wWordsInBlock]147 sub [bp+PIOVARS.wWordsLeft], ax148 add [bp+PIOVARS.wWordsDone], ax149 jmp SHORT .ReadNextBlockFromDrive150 151 ALIGN JUMP_ALIGN152 .ReadLastBlockFromDrive:153 mov cx, [bp+PIOVARS.wWordsLeft]154 call [bp+PIOVARS.fnXfer] ; Transfer possibly partial block155 156 ; Check for errors in last block157 mov di, si ; DS:DI now points DPT158 CheckErrorsAfterTransferringLastBlock:159 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRDY)160 call IdeWait_PollStatusFlagInBLwithTimeoutInBH161 162 ; Return number of successfully read sectors163 ReturnWithTransferErrorInAH:164 mov cx, [bp+PIOVARS.wWordsDone]165 jc SHORT .ConvertTransferredWordsInCXtoSectors166 add cx, [bp+PIOVARS.wWordsLeft] ; Never sets CF167 .ConvertTransferredWordsInCXtoSectors:168 xchg cl, ch169 ret170 171 172 ;--------------------------------------------------------------------173 171 ; InitializePiovarsInSSBPwithSectorCountInAH 174 172 ; Parameters: … … 180 178 ; Nothing 181 179 ; Corrupts registers: 182 ; AX, BX, CX,DX180 ; AX, BX, DX 183 181 ;-------------------------------------------------------------------- 184 182 ALIGN JUMP_ALIGN … … 187 185 xor al, al 188 186 mov [bp+PIOVARS.wWordsLeft], ax 187 mov ah, [di+DPT_ATA.bSetBlock] 188 mov [bp+PIOVARS.wWordsInBlock], ax 189 189 cbw 190 190 mov [bp+PIOVARS.wWordsDone], ax ; Zero 191 mov ah, [di+DPT_ATA.bSetBlock]192 mov [bp+PIOVARS.wWordsInBlock], ax193 191 194 192 ; Get transfer function based on bus type 195 193 xchg ax, bx ; Lookup table offset to AX 196 eMOVZX bx, BYTE [di+DPT.bIdevarsOffset]; CS:BX now points to IDEVARS194 mov bl, [di+DPT.bIdevarsOffset] ; CS:BX now points to IDEVARS 197 195 mov dx, [cs:bx+IDEVARS.wPort] ; Load IDE Data port address 198 196 mov bl, [cs:bx+IDEVARS.bDevice] ; Load device type to BX 199 197 add bx, ax 198 mov [bp+PIOVARS.wDataPort], dx 200 199 mov ax, [cs:bx] ; Load offset to transfer function 201 mov [bp+PIOVARS.wDataPort], dx202 200 mov [bp+PIOVARS.fnXfer], ax 203 201 ret … … 213 211 ; CX: Block size in WORDs 214 212 ; DX: IDE Data port address 215 ; ES:DI: Normalized ptr to buffer to rec ieve data213 ; ES:DI: Normalized ptr to buffer to receive data 216 214 ; Returns: 217 215 ; Nothing … … 236 234 SingleByteRead: 237 235 %ifdef USE_186 ; INS instruction available 236 dec cx ; Avoid overflowing CX on a 128 sector transfer 238 237 shl cx, 1 ; WORD count to BYTE count 238 inc cx 239 239 rep insb 240 insb 240 241 %else ; If 8088/8086 241 242 shr cx, 1 ; WORD count to DWORD count … … 328 329 SingleByteWrite: 329 330 %ifdef USE_186 ; OUTS instruction available 331 dec cx ; Avoid overflowing CX on a 128 sector transfer 330 332 shl cx, 1 ; WORD count to BYTE count 333 inc cx 331 334 es ; Source is ES segment 332 335 rep outsb 336 es outsb 333 337 %else ; If 8088/8086 334 338 shr cx, 1 ; WORD count to DWORD count … … 386 390 387 391 388 389 392 ; Lookup tables to get transfer function based on bus type 390 393 ALIGN WORD_ALIGN -
trunk/XTIDE_Universal_BIOS/Src/Device/MemoryMappedIDE/MemIdeTransfer.asm
r238 r242 8 8 .wWordsLeft resb 2 ; 2, WORDs left to transfer 9 9 .wWordsDone resb 2 ; 4, Number of sectors xferred 10 resb 1 ; 6, 10 ; TODO: The above word vars could just as well be byte vars? 11 resb 1 ; 6, 11 12 resb 1 ; 7, IDEPACK.bDeviceControl 12 13 .fpDPT resb 4 ; 8, Far pointer to DPT … … 34 35 ALIGN JUMP_ALIGN 35 36 MemIdeTransfer_StartWithCommandInAL: 37 push cs ; We push CS here (segment of SAW) and later pop it to DS (reads) or ES (writes) 38 36 39 ; Initialize MEMPIOVARS 37 xchg cx, ax ; IDE command to CL 38 xor al, al 39 mov ah, [bp+IDEPACK.bSectorCount] 40 mov [bp+MEMPIOVARS.wWordsLeft], ax 41 cbw 42 mov [bp+MEMPIOVARS.wWordsDone], ax ; Zero 43 mov ah, [di+DPT_ATA.bSetBlock] 44 mov [bp+MEMPIOVARS.wWordsInBlock], ax 40 xor cx, cx 41 mov [bp+MEMPIOVARS.wWordsDone], cx 42 mov ch, [bp+IDEPACK.bSectorCount] 43 mov [bp+MEMPIOVARS.wWordsLeft], cx 44 mov ch, [di+DPT_ATA.bSetBlock] 45 mov [bp+MEMPIOVARS.wWordsInBlock], cx 45 46 mov [bp+MEMPIOVARS.fpDPT], di 46 47 mov [bp+MEMPIOVARS.fpDPT+2], ds 47 48 48 49 ; Are we reading or writing? 49 test cl, 16 ; Bit 4 is cleared on all the read commands but set on 3 of the 4 write commands 50 jnz SHORT .PrepareToWriteDataFromESSI 51 cmp cl, COMMAND_WRITE_MULTIPLE 52 je SHORT .PrepareToWriteDataFromESSI 53 54 ; Prepare to read data to ES:DI 55 mov di, si 56 push cs 57 pop ds 58 mov si, JRIDE_SECTOR_ACCESS_WINDOW_OFFSET 59 jmp SHORT ReadFromSectorAccessWindowInDSSItoESDI 60 61 ALIGN JUMP_ALIGN 62 .PrepareToWriteDataFromESSI: 63 push es 64 pop ds 65 push cs 66 pop es 67 mov di, JRIDE_SECTOR_ACCESS_WINDOW_OFFSET 68 ; Fall to WriteToSectorAccessWindowInESDIfromDSSI 69 70 71 ;-------------------------------------------------------------------- 72 ; WriteToSectorAccessWindowInESDIfromDSSI 73 ; Parameters: 74 ; DS:SI: Normalized ptr to buffer containing data 75 ; ES:DI: Ptr to Sector Access Window 50 test al, 16 ; Bit 4 is cleared on all the read commands but set on 3 of the 4 write commands 51 jnz SHORT WriteToSectorAccessWindow 52 cmp al, COMMAND_WRITE_MULTIPLE 53 je SHORT WriteToSectorAccessWindow 54 ; Fall to ReadFromSectorAccessWindow 55 56 ;-------------------------------------------------------------------- 57 ; ReadFromSectorAccessWindow 58 ; Parameters: 59 ; Stack: Segment part of ptr to Sector Access Window 60 ; ES:SI: Normalized ptr to buffer to receive data 76 61 ; SS:BP: Ptr to MEMPIOVARS 77 62 ; Returns: … … 84 69 ; AL, BX, DX, SI, ES 85 70 ;-------------------------------------------------------------------- 86 WriteToSectorAccessWindowInESDIfromDSSI: 87 ; Always poll when writing first block (IRQs are generated for following blocks) 88 call WaitUntilReadyToTransferNextBlock 89 jc SHORT ReturnWithMemoryIOtransferErrorInAH 90 91 ALIGN JUMP_ALIGN 92 .WriteNextBlockToDrive: 93 mov cx, [bp+PIOVARS.wWordsInBlock] 94 cmp [bp+PIOVARS.wWordsLeft], cx 95 jbe SHORT .WriteLastBlockToDrive 96 eMOVZX dx, ch ; DX = Sectors in block 97 call WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 98 call WaitUntilReadyToTransferNextBlock 99 jc SHORT ReturnWithMemoryIOtransferErrorInAH 100 101 ; Increment number of successfully written WORDs 102 mov ax, [bp+PIOVARS.wWordsInBlock] 103 sub [bp+PIOVARS.wWordsLeft], ax 104 add [bp+PIOVARS.wWordsDone], ax 105 jmp SHORT .WriteNextBlockToDrive 106 107 ALIGN JUMP_ALIGN 108 .WriteLastBlockToDrive: 109 eMOVZX dx, BYTE [bp+PIOVARS.wWordsLeft+1] ; Sectors left 110 %ifdef USE_186 111 push CheckErrorsAfterTransferringLastMemoryMappedBlock 112 jmp WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 113 %else 114 call WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 115 jmp SHORT CheckErrorsAfterTransferringLastMemoryMappedBlock 116 %endif 117 118 119 ;-------------------------------------------------------------------- 120 ; WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 121 ; Parameters: 122 ; DX: Number of sectors in block 123 ; DS:SI: Normalized ptr to source buffer 124 ; ES:DI: Ptr to Sector Access Window 125 ; Returns: 126 ; CX, DX: Zero 127 ; SI: Updated 128 ; Corrupts registers: 129 ; Nothing 130 ;-------------------------------------------------------------------- 131 ALIGN JUMP_ALIGN 132 WriteSingleBlockFromDSSIToSectorAccessWindowInESDI: 133 mov cx, JRIDE_SECTOR_ACCESS_WINDOW_SIZE / 2 134 rep movsw 135 sub di, JRIDE_SECTOR_ACCESS_WINDOW_SIZE ; Reset for next sector 136 dec dx 137 jnz SHORT WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 138 ret 139 140 141 ;-------------------------------------------------------------------- 142 ; ReadFromSectorAccessWindowInDSSItoESDI 143 ; Parameters: 144 ; ES:DI: Normalized ptr to buffer to recieve data 145 ; DS:SI: Ptr to Sector Access Window 146 ; SS:BP: Ptr to MEMPIOVARS 147 ; Returns: 148 ; DS:DI: Ptr to DPT (in RAMVARS segment) 149 ; AH: BIOS Error code 150 ; CX: Number of successfully transferred sectors 151 ; CF: 0 if transfer succesfull 152 ; 1 if any error 153 ; Corrupts registers: 154 ; AL, BX, DX, SI, ES 155 ;-------------------------------------------------------------------- 156 ALIGN JUMP_ALIGN 157 ReadFromSectorAccessWindowInDSSItoESDI: 158 call WaitUntilReadyToTransferNextBlock 159 jc SHORT ReturnWithMemoryIOtransferErrorInAH 71 ReadFromSectorAccessWindow: 72 pop ds ; CS -> DS 73 mov di, si 74 mov si, JRIDE_SECTOR_ACCESS_WINDOW_OFFSET 75 76 call WaitUntilReadyToTransferNextBlock 77 jc SHORT ReturnWithMemoryIOtransferErrorInAH 78 79 mov cx, [bp+PIOVARS.wWordsInBlock] 160 80 161 81 ALIGN JUMP_ALIGN 162 82 .ReadNextBlockFromDrive: 163 mov cx, [bp+PIOVARS.wWordsInBlock]164 83 cmp [bp+PIOVARS.wWordsLeft], cx 165 84 jbe SHORT .ReadLastBlockFromDrive 166 eMOVZX dx, ch ; DX = Sectors in block167 85 call ReadSingleBlockFromSectorAccessWindowInDSSItoESDI 168 86 call WaitUntilReadyToTransferNextBlock … … 170 88 171 89 ; Increment number of successfully read WORDs 172 mov ax, [bp+PIOVARS.wWordsInBlock]173 sub [bp+PIOVARS.wWordsLeft], ax174 add [bp+PIOVARS.wWordsDone], ax90 mov cx, [bp+PIOVARS.wWordsInBlock] 91 sub [bp+PIOVARS.wWordsLeft], cx 92 add [bp+PIOVARS.wWordsDone], cx 175 93 jmp SHORT .ReadNextBlockFromDrive 176 94 177 95 ALIGN JUMP_ALIGN 178 96 .ReadLastBlockFromDrive: 179 eMOVZX dx, BYTE [bp+PIOVARS.wWordsLeft+1]; Sectors left97 mov ch, [bp+PIOVARS.wWordsLeft+1] ; Sectors left 180 98 call ReadSingleBlockFromSectorAccessWindowInDSSItoESDI 181 99 … … 186 104 call IDEDEVICE%+Wait_PollStatusFlagInBLwithTimeoutInBH 187 105 188 ; Return number of successfully read sectors106 ; Return number of successfully transferred sectors 189 107 ReturnWithMemoryIOtransferErrorInAH: 190 108 lds di, [bp+MEMPIOVARS.fpDPT] ; DPT now in DS:DI … … 198 116 199 117 ;-------------------------------------------------------------------- 118 ; WriteToSectorAccessWindow 119 ; Parameters: 120 ; Stack: Segment part of ptr to Sector Access Window 121 ; ES:SI: Normalized ptr to buffer containing data 122 ; SS:BP: Ptr to MEMPIOVARS 123 ; Returns: 124 ; DS:DI: Ptr to DPT (in RAMVARS segment) 125 ; AH: BIOS Error code 126 ; CX: Number of successfully transferred sectors 127 ; CF: 0 if transfer succesfull 128 ; 1 if any error 129 ; Corrupts registers: 130 ; AL, BX, DX, SI, ES 131 ;-------------------------------------------------------------------- 132 ALIGN JUMP_ALIGN 133 WriteToSectorAccessWindow: 134 push es 135 pop ds 136 pop es ; CS -> ES 137 mov di, JRIDE_SECTOR_ACCESS_WINDOW_OFFSET 138 139 ; Always poll when writing first block (IRQs are generated for following blocks) 140 call WaitUntilReadyToTransferNextBlock 141 jc SHORT ReturnWithMemoryIOtransferErrorInAH 142 143 mov cx, [bp+PIOVARS.wWordsInBlock] 144 145 ALIGN JUMP_ALIGN 146 .WriteNextBlockToDrive: 147 cmp [bp+PIOVARS.wWordsLeft], cx 148 jbe SHORT .WriteLastBlockToDrive 149 call WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 150 call WaitUntilReadyToTransferNextBlock 151 jc SHORT ReturnWithMemoryIOtransferErrorInAH 152 153 ; Increment number of successfully written WORDs 154 mov cx, [bp+PIOVARS.wWordsInBlock] 155 sub [bp+PIOVARS.wWordsLeft], cx 156 add [bp+PIOVARS.wWordsDone], cx 157 jmp SHORT .WriteNextBlockToDrive 158 159 ALIGN JUMP_ALIGN 160 .WriteLastBlockToDrive: 161 mov ch, [bp+PIOVARS.wWordsLeft+1] ; Sectors left 162 %ifndef USE_186 163 mov bx, CheckErrorsAfterTransferringLastMemoryMappedBlock 164 push bx 165 %else 166 push CheckErrorsAfterTransferringLastMemoryMappedBlock 167 %endif 168 ; Fall to WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 169 170 ;-------------------------------------------------------------------- 171 ; WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 172 ; Parameters: 173 ; CH: Number of sectors in block 174 ; DS:SI: Normalized ptr to source buffer 175 ; ES:DI: Ptr to Sector Access Window 176 ; Returns: 177 ; CX, DX: Zero 178 ; SI: Updated 179 ; Corrupts registers: 180 ; BX 181 ;-------------------------------------------------------------------- 182 ALIGN JUMP_ALIGN 183 WriteSingleBlockFromDSSIToSectorAccessWindowInESDI: 184 mov bx, di 185 eMOVZX dx, ch 186 xor cl, cl 187 ALIGN JUMP_ALIGN 188 .WriteBlock: 189 mov ch, JRIDE_SECTOR_ACCESS_WINDOW_SIZE >> 9 190 rep movsw 191 mov di, bx ; Reset for next sector 192 dec dx 193 jnz SHORT .WriteBlock 194 ret 195 196 197 ;-------------------------------------------------------------------- 200 198 ; ReadSingleBlockFromSectorAccessWindowInDSSItoESDI 201 199 ; Parameters: 202 ; DX: Number of sectors in block203 ; ES:DI: Normalized ptr to buffer to rec ieve data (destination)200 ; CH: Number of sectors in block 201 ; ES:DI: Normalized ptr to buffer to receive data (destination) 204 202 ; DS:SI: Ptr to Sector Access Window (source) 205 203 ; Returns: … … 207 205 ; DI: Updated 208 206 ; Corrupts registers: 209 ; Nothing207 ; BX 210 208 ;-------------------------------------------------------------------- 211 209 ALIGN JUMP_ALIGN 212 210 ReadSingleBlockFromSectorAccessWindowInDSSItoESDI: 213 mov cx, JRIDE_SECTOR_ACCESS_WINDOW_SIZE / 2 211 mov bx, si 212 eMOVZX dx, ch 213 xor cl, cl 214 ALIGN JUMP_ALIGN 215 .ReadBlock: 216 mov ch, JRIDE_SECTOR_ACCESS_WINDOW_SIZE >> 9 214 217 rep movsw 215 sub si, JRIDE_SECTOR_ACCESS_WINDOW_SIZE; Reset for next sector218 mov si, bx ; Reset for next sector 216 219 dec dx 217 jnz SHORT ReadSingleBlockFromSectorAccessWindowInDSSItoESDI220 jnz SHORT .ReadBlock 218 221 ret 219 222 … … 238 241 pop ds 239 242 ret 243 244 245 %if JRIDE_SECTOR_ACCESS_WINDOW_SIZE <> 512 246 %error "JRIDE_SECTOR_ACCESS_WINDOW_SIZE is no longer equal to 512. MemIdeTransfer.asm needs changes." 247 %endif 248 -
trunk/XTIDE_Universal_BIOS/Src/Device/Serial/SerialCommand.asm
r234 r242 112 112 mov ch,dh 113 113 xor dh,dh 114 eSHL_IM dx, 2 ; shift from one byte to two 115 114 eSHL_IM dx, 2 ; shift from one byte to two 115 116 116 mov al,[bp+IDEPACK.bSectorCount] 117 117 … … 599 599 ; wSerialPortAndBaud Non-Zero: 600 600 ; previous serial drive not found: -> Error - Not Found (4) 601 ; previo suserial drive found: -> Continue with wSerialPackedAndBaud (5)601 ; previous serial drive found: -> Continue with wSerialPackedAndBaud (5) 602 602 ; wSerialPortAndBaud Zero: 603 603 ; previous serial drive not found: -> Error - Not Found (4) … … 608 608 ; And as with the int13h/25h case, we just go off and get the needed information using the user's setting. 609 609 ; (2) We are using the special .ideVarsSerialAuto structure. During drive detection, we would only be here 610 ; if we ha nd't already seen a serial drive (since we only scan if no explicit drives are set),610 ; if we hadn't already seen a serial drive (since we only scan if no explicit drives are set), 611 611 ; so we go off to scan. 612 612 ; (3) We are using the special .ideVarsSerialAuto structure. We won't get here during drive detection, but … … 633 633 pop si 634 634 jnc .notfounddpt 635 mov ax, [ds:di+DPT_SERIAL.wSerialPortAndBaud]636 .notfounddpt: 635 mov ax, [di+DPT_SERIAL.wSerialPortAndBaud] 636 .notfounddpt: 637 637 638 638 test bh, FLG_DRVNHEAD_DRV … … 647 647 jnz .identifyDeviceInDX 648 648 649 or dx,ax ; Since DX is zero, this effectively moves the previously found serial drive 649 or dx,ax ; Since DX is zero, this effectively moves the previously found serial drive 650 650 ; information to dx, as well as test for zero 651 651 jz .scanSerial … … 672 672 pop cx 673 673 pop dx 674 674 675 675 pop bp 676 676 ; 677 ; place port and baud word in to the return sector, in a vendor specific area, 677 ; place port and baud word in to the return sector, in a vendor specific area, 678 678 ; which is read by FinalizeDPT and DetectDrives 679 679 ; … … 732 732 ; Begin baud rate scan on this port... 733 733 ; 734 ; On a scan, we support 6 baud rates, starting here and going higher by a factor of two each step, with a 734 ; On a scan, we support 6 baud rates, starting here and going higher by a factor of two each step, with a 735 735 ; small jump between 9600 and 38800. These 6 were selected since we wanted to support 9600 baud and 115200, 736 ; *on the server side* if the client side had a 4x clock multiplier, a 2x clock multiplier, or no clock multiplier. 736 ; *on the server side* if the client side had a 4x clock multiplier, a 2x clock multiplier, or no clock multiplier. 737 737 ; 738 738 ; Starting with 30h, that means 30h (2400 baud), 18h (4800 baud), 0ch (9600 baud), and … … 747 747 shr dh,1 748 748 jz .nextPort 749 cmp dh,6 ; skip from 6 to 4, to move from the top of the 9600 baud range 749 cmp dh,6 ; skip from 6 to 4, to move from the top of the 9600 baud range 750 750 jnz .testBaud ; to the bottom of the 115200 baud range 751 751 mov dh,4 -
trunk/XTIDE_Universal_BIOS/Src/Device/Serial/SerialDPT.asm
r233 r242 13 13 ; Nothing 14 14 ; Corrupts registers: 15 ; AX , BX, CX, DX15 ; AX 16 16 ;-------------------------------------------------------------------- 17 17 SerialDPT_Finalize: 18 18 or byte [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE 19 19 mov ax, [es:si+ATA6.wVendor] 20 mov word[di+DPT_SERIAL.wSerialPortAndBaud], ax20 mov [di+DPT_SERIAL.wSerialPortAndBaud], ax 21 21 ret 22 22
Note:
See TracChangeset
for help on using the changeset viewer.