Changeset 167 in xtideuniversalbios
- Timestamp:
- Aug 21, 2011, 3:42:15 PM (13 years ago)
- google:author:
- aitotat@gmail.com
- Location:
- trunk/XTIDE_Universal_BIOS
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Inc/EBIOS.inc
r165 r167 22 22 .qwTotalSectors resb 8 ; 16, Total number of addressable sectors 23 23 .wSectorSize resb 2 ; 24, Number of bytes per sector 24 25 24 .fpEDDparams resb 8 ; 26, Optional pointer to Enhanced Disk Drive (EDD) configuration parameters 26 25 endstruc -
trunk/XTIDE_Universal_BIOS/Inc/RamVars.inc
r155 r167 54 54 55 55 ; Parameters for 48-bit LBA 56 .wSectorCountHighAndLbaLowExt: 57 .bSectorCountHighExt resb 1 ; LBA48 Sector Count 15...8 56 resb 1 58 57 .bLbaLowExt resb 1 ; LBA48 31...24 59 58 -
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeCommand.asm
r160 r167 128 128 129 129 ; Output Sector Address High (only used by LBA48) 130 mov ax, [bp+IDEPACK.wSectorCountHighAndLbaLowExt] 130 xor ax, ax ; Sector Count High always zero since 127 sector limit 131 mov ah, BYTE [bp+IDEPACK.bLbaLowExt] 131 132 mov cx, [bp+IDEPACK.wLbaMiddleAndHighExt] 132 133 call OutputSectorCountAndAddress -
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeTransfer.asm
r161 r167 5 5 ; This struct must not be larger than IDEPACK without INTPACK. 6 6 struc PIOVARS 7 .wBlocksLeft resb 2 7 .wBlockLeftAndSectorsInLastBlock: 8 .bBlocksLeft resb 1 9 .bSectorsInLastBlock: resb 1 8 10 .wBlockSize resb 2 ; Block size in WORDs (256...32768) 9 11 .wDataPort resb 2 10 .bSectorsInLastBlock:resb 112 resb 1 11 13 resb 1 ; Offset 7 = IDEPACK.bDeviceControl 12 14 .fnXfer resb 2 ; Offset to transfer function … … 32 34 ALIGN JUMP_ALIGN 33 35 IdeTransfer_StartWithCommandInAL: 34 mov ah, [bp+IDEPACK.bSectorCountHighExt]35 36 36 ; Are we reading or writing? 37 37 test al, 16 ; Bit 4 is cleared on all the read commands but set on 3 of the 4 write commands … … 42 42 ; Prepare to read data to ESSI 43 43 mov bx, g_rgfnPioRead 44 mov al, [bp+IDEPACK.bSectorCount] 45 call InitializePiovarsInSSBPwithSectorCountInAX 44 call InitializePiovarsToSSBPfromIdepackInSSBP 46 45 xchg si, di 46 %ifdef USE_186 47 push ReadFromDriveToESDI 48 jmp Registers_NormalizeESDI 49 %else 47 50 call Registers_NormalizeESDI 48 jmp SHORT ReadFromDrive 51 jmp SHORT ReadFromDriveToESDI 52 %endif 49 53 50 54 ALIGN JUMP_ALIGN 51 55 .PrepareToWriteDataFromESSI: 52 56 mov bx, g_rgfnPioWrite 53 mov al, [bp+IDEPACK.bSectorCount] 54 call InitializePiovarsInSSBPwithSectorCountInAX 57 call InitializePiovarsToSSBPfromIdepackInSSBP 55 58 call Registers_NormalizeESSI 56 ; Fall to WriteToDrive 57 58 59 ;-------------------------------------------------------------------- 60 ; WriteToDrive 59 ; Fall to WriteToDriveFromESSI 60 61 62 ;-------------------------------------------------------------------- 63 ; WriteToDriveFromESSI 61 64 ; Parameters: 62 65 ; DS:DI: Ptr to DPT (in RAMVARS segment) … … 70 73 ; AL, BX, CX, DX, SI, ES 71 74 ;-------------------------------------------------------------------- 72 WriteToDrive :75 WriteToDriveFromESSI: 73 76 ; Always poll when writing first block (IRQs are generated for following blocks) 74 77 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ) … … 78 81 .WriteNextBlock: 79 82 mov dx, [bp+PIOVARS.wDataPort] 80 dec WORD [bp+PIOVARS.wBlocksLeft] ; Transferring last (possibly partial) block?83 dec BYTE [bp+PIOVARS.bBlocksLeft] ; Transferring last (possibly partial) block? 81 84 jz SHORT .XferLastBlock ; If so, jump to transfer 82 85 mov cx, [bp+PIOVARS.wBlockSize] ; Load block size in WORDs 83 86 call [bp+PIOVARS.fnXfer] ; Transfer full block 84 85 ; Normalize pointer when necessary86 mov ax, si87 shr ax, 1 ; WORD offset88 add ax, [bp+PIOVARS.wBlockSize]89 jns SHORT .WaitUntilReadyToTransferNextBlock90 call Registers_NormalizeESSI91 92 ALIGN JUMP_ALIGN93 .WaitUntilReadyToTransferNextBlock:94 87 %ifdef USE_186 95 88 push .WriteNextBlock … … 117 110 118 111 ;-------------------------------------------------------------------- 119 ; ReadFromDrive 112 ; ReadFromDriveToESDI 120 113 ; Parameters: 121 114 ; ES:DI: Normalized ptr to buffer to recieve data … … 131 124 ;-------------------------------------------------------------------- 132 125 ALIGN JUMP_ALIGN 133 ReadFromDrive :126 ReadFromDriveToESDI: 134 127 ; Wait until drive is ready to transfer 135 128 xchg di, si ; DS:DI now points DPT 136 129 call IdeWait_IRQorDRQ ; Wait until ready to transfer 137 jc SHORT WriteToDrive .ReturnWithTransferErrorInAH130 jc SHORT WriteToDriveFromESSI.ReturnWithTransferErrorInAH 138 131 xchg si, di ; ES:DI now points buffer 139 132 140 133 ; Transfer full or last (possible partial) block 141 134 mov dx, [bp+PIOVARS.wDataPort] 142 dec WORD [bp+PIOVARS.wBlocksLeft]135 dec BYTE [bp+PIOVARS.bBlocksLeft] 143 136 jz SHORT .XferLastBlock 144 137 mov cx, [bp+PIOVARS.wBlockSize] ; Load block size in WORDs 138 %ifdef USE_186 139 push ReadFromDriveToESDI 140 jmp [bp+PIOVARS.fnXfer] 141 %else 145 142 call [bp+PIOVARS.fnXfer] ; Transfer full block 146 147 ; Normalize pointer when necessary 148 mov ax, di 149 shr ax, 1 ; WORD offset 150 add ax, [bp+PIOVARS.wBlockSize] 151 jns SHORT ReadFromDrive 152 call Registers_NormalizeESDI 153 jmp SHORT ReadFromDrive ; Loop while blocks left 143 jmp SHORT ReadFromDriveToESDI ; Loop while blocks left 144 %endif 154 145 155 146 ALIGN JUMP_ALIGN … … 164 155 165 156 ;-------------------------------------------------------------------- 166 ; InitializePiovarsInSSBPwithSectorCountInAX 167 ; Parameters: 168 ; AX: Number of sectors to transfer (1...65535) 157 ; InitializePiovarsToSSBPfromIdepackInSSBP 158 ; Parameters: 169 159 ; BX: Offset to transfer function lookup table 170 160 ; DS:DI: Ptr to DPT (in RAMVARS segment) 161 ; SS:BP: Ptr to IDEPACK 162 ; Returns: 171 163 ; SS:BP: Ptr to PIOVARS 172 ; Returns:173 ; Nothing174 164 ; Corrupts registers: 175 165 ; AX, BX, CX, DX 176 166 ;-------------------------------------------------------------------- 177 167 ALIGN JUMP_ALIGN 178 InitializePiovars InSSBPwithSectorCountInAX:168 InitializePiovarsToSSBPfromIdepackInSSBP: 179 169 ; Store number of blocks to transfer 180 eMOVZX cx, BYTE [di+DPT_ATA.bSetBlock] ; Block size in sectors 181 xor dx, dx ; DX:AX = Sectors to transfer (1...65535) 182 div cx ; AX = Full blocks to transfer 183 test dx, dx 184 mov dh, cl ; DH = Full block size if no partial blocks to transfer 170 eMOVZX cx, BYTE [di+DPT_ATA.bSetBlock] ; Block size in sectors, zero CH 171 eMOVZX ax, BYTE [bp+IDEPACK.bSectorCount] ; AX = sectors to transfer (1...128) 172 div cl ; AL = Full blocks to transfer 173 test ah, ah ; AH = Sectors in partial block 185 174 jz SHORT .NoPartialBlocksToTransfer 186 inc ax ; Partial block187 mov dh, dl ; DH = Size of partial block in sectors175 inc ax ; Add partial block to total block count 176 SKIP2B dx ; Skip mov ah, cl 188 177 .NoPartialBlocksToTransfer: 189 mov [bp+PIOVARS.wBlocksLeft], ax190 mov [bp+PIOVARS. bSectorsInLastBlock], dh178 mov ah, cl ; Full block size if no partial blocks to transfer 179 mov [bp+PIOVARS.wBlockLeftAndSectorsInLastBlock], ax 191 180 192 181 ; Store block size in WORDs -
trunk/XTIDE_Universal_BIOS/Src/Device/Idepack.asm
r165 r167 39 39 Idepack_ConvertDapToIdepackAndIssueCommandFromAH: 40 40 mov [bp+IDEPACK.bCommand], ah 41 mov a x, [es:si+DAP.wSectorCount]41 mov al, [es:si+DAP.wSectorCount] 42 42 mov [bp+IDEPACK.bSectorCount], al 43 mov [bp+IDEPACK.bSectorCountHighExt], ah ; Always zero44 43 45 44 mov al, [es:si+DAP.qwLBA] ; LBA byte 0 … … 84 83 mov [bp+IDEPACK.bSectorCount], al 85 84 mov [bp+IDEPACK.bCommand], ah 86 mov BYTE [bp+IDEPACK.bSectorCountHighExt], 087 85 88 86 push bx … … 127 125 mov [bp+IDEPACK.wSectorCountAndLbaLow], dx 128 126 mov [bp+IDEPACK.wLbaMiddleAndHigh], cx 129 mov BYTE [bp+IDEPACK.bSectorCountHighExt], 0130 127 131 128 ; Drive and Head select byte -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h.asm
r165 r167 42 42 ALIGN JUMP_ALIGN 43 43 .JumpToEbiosFunction: 44 test BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_FULLMODE ; Full mode?45 jz SHORT Int13h_UnsupportedFunction 46 test BYTE [di+DPT.bFlagsLow], FLG_DRVNHEAD_LBA ; LBA supported?47 jz SHORT Int13h_UnsupportedFunction 48 cmp ah, 48h ; Above last valid function?44 test BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_FULLMODE 45 jz SHORT Int13h_UnsupportedFunction ; No eINT 13h in lite mode 46 test BYTE [di+DPT.bFlagsLow], FLG_DRVNHEAD_LBA 47 jz SHORT Int13h_UnsupportedFunction ; No eINT 13h for CHS drives 48 cmp ah, 48h 49 49 ja SHORT Int13h_UnsupportedFunction 50 sub bx, 41h<<1 ; BX = Offset to EBIOSjump table50 sub bx, 41h<<1 ; BX = Offset to eINT 13h jump table 51 51 jl SHORT Int13h_UnsupportedFunction 52 52 jmp [cs:bx+g_rgwEbiosFunctionJumpTable] -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH25h_HDrvID.asm
r165 r167 25 25 %ifdef USE_186 26 26 push Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH 27 ; Fall to AH25h_GetDriveInformationToBufferInESSI fromDriveInDL27 ; Fall to AH25h_GetDriveInformationToBufferInESSI 28 28 %else 29 call AH25h_GetDriveInformationToBufferInESSI fromDriveInDL29 call AH25h_GetDriveInformationToBufferInESSI 30 30 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH 31 31 %endif … … 33 33 34 34 ;-------------------------------------------------------------------- 35 ; AH25h_GetDriveInformationToBufferInESSI fromDriveInDL35 ; AH25h_GetDriveInformationToBufferInESSI 36 36 ; Parameters: 37 ; DL: Translated Drive number38 37 ; DS:DI: Ptr to DPT (in RAMVARS segment) 39 38 ; ES:SI: Ptr to buffer to receive 512-byte drive information … … 44 43 ; AL, BX, CX, DX 45 44 ;-------------------------------------------------------------------- 46 AH25h_GetDriveInformationToBufferInESSIfromDriveInDL: 45 ALIGN JUMP_ALIGN 46 AH25h_GetDriveInformationToBufferInESSI: 47 47 push es 48 48 push bp -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH2h_HRead.asm
r165 r167 28 28 ALIGN JUMP_ALIGN 29 29 AH2h_HandlerForReadDiskSectors: 30 cmp BYTE [bp+IDEPACK.intpack+INTPACK.al], 030 cmp al, 0 31 31 jle SHORT AH2h_ExitInt13hSinceSectorCountInIntpackIsZero 32 32 33 xor bx, bx 34 call CommandLookup_OrOldInt13hIndexToBL 33 call CommandLookup_GetOldInt13hIndexToBX 35 34 mov ah, [cs:bx+g_rgbReadCommandLookup] 36 35 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ) … … 55 54 mov ah, RET_HD_INVALID 56 55 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH 57 -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH3h_HWrite.asm
r165 r167 27 27 ALIGN JUMP_ALIGN 28 28 AH3h_HandlerForWriteDiskSectors: 29 cmp BYTE [bp+IDEPACK.intpack+INTPACK.al], 029 cmp al, 0 30 30 jle SHORT AH2h_ExitInt13hSinceSectorCountInIntpackIsZero 31 31 32 xor bx, bx 33 call CommandLookup_OrOldInt13hIndexToBL 32 call CommandLookup_GetOldInt13hIndexToBX 34 33 mov ah, [cs:bx+g_rgbWriteCommandLookup] 35 34 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ) -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH4h_HVerify.asm
r165 r167 26 26 ALIGN JUMP_ALIGN 27 27 AH4h_HandlerForVerifyDiskSectors: 28 cmp BYTE [bp+IDEPACK.intpack+INTPACK.al], 028 cmp al, 0 29 29 jle SHORT AH2h_ExitInt13hSinceSectorCountInIntpackIsZero 30 30 -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/EBIOS/AH41h_CheckIfExtensionsPresent.asm
r165 r167 17 17 ; Returns with INTPACK: 18 18 ; AH: Major version of EBIOS extensions 19 ; BX: 55AAh19 ; BX: AA55h 20 20 ; CX: Support bits 21 21 ; CF: 0 if succesfull, 1 if error … … 26 26 jne SHORT .EbiosNotSupported 27 27 28 mov BYTE [bp+IDEPACK.intpack+INTPACK.ah], EBIOS_VERSION 29 mov WORD [bp+IDEPACK.intpack+INTPACK.bx], 0AA55h 28 30 mov WORD [bp+IDEPACK.intpack+INTPACK.cx], ENHANCED_DRIVE_ACCESS_SUPPORT 29 mov ah, EBIOS_VERSION30 31 and BYTE [bp+IDEPACK.intpack+INTPACK.flags], ~FLG_FLAGS_CF ; Return with CF cleared 31 32 jmp Int13h_ReturnFromHandlerWithoutStoringErrorCode -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/EBIOS/AH42h_ExtendedReadSectors.asm
r165 r167 55 55 cmp BYTE [es:si+DAP.bSize], MINIMUM_DAP_SIZE 56 56 jb SHORT .DapContentsNotValid 57 cmp BYTE [es:si+DAP.bSectorCount],057 cmp WORD [es:si+DAP.wSectorCount], BYTE 0 58 58 jle SHORT .DapContentsNotValid ; Must be 1...127 59 59 ret -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/EBIOS/AH48h_GetExtendedDriveParameters.asm
r165 r167 23 23 ALIGN JUMP_ALIGN 24 24 AH48h_HandlerForGetExtendedDriveParameters: 25 ; Get ATA Drive Information and total sector count from it 25 ; Get our buffer to ES:SI 26 push di 27 call FindDPT_ForNewDriveToDSDI 28 lea si, [di+LARGEST_DPT_SIZE] ; IdeCommand.asm required fake DPT 29 pop di 26 30 push ds 27 pop es ; ES now points RAMVARS segment 28 mov si, [cs:ROMVARS.bStealSize] 29 and si, BYTE 7Fh 30 eSHL_IM si, 10 ; Kilobytes to bytes 31 sub si, 512 ; Subtract buffer size for offset in RAMVARS 32 call AH25h_GetDriveInformationToBufferInESSIfromDriveInDL 31 pop es 32 33 ; Get Drive ID and total sector count from it 34 call AH25h_GetDriveInformationToBufferInESSI 35 jc SHORT .ReturnWithError 33 36 call AtaID_GetTotalSectorCountToBXDXAXfromAtaInfoInESSI 34 xchg cx, ax 37 xchg cx, ax ; Sector count now in BX:DX:CX 35 38 36 39 ; Point ES:DI to Destination buffer 37 40 mov di, [bp+IDEPACK.intpack+INTPACK.si] 38 41 mov es, [bp+IDEPACK.intpack+INTPACK.ds] 39 cmp WORD [es:di+EDRIVE_INFO.wSize], MINIMUM_EDRIVEINFO_SIZE 42 mov ax, MINIMUM_EDRIVEINFO_SIZE 43 cmp WORD [es:di+EDRIVE_INFO.wSize], ax 40 44 jb SHORT .BufferTooSmall 45 je SHORT .SkipEddConfigurationParameters 46 47 ; We do not support EDD Configuration Parameters so set to FFFF:FFFFh 48 xor ax, ax 49 dec ax ; AX = FFFFh 50 mov [es:di+EDRIVE_INFO.fpEDDparams], ax 51 mov [es:di+EDRIVE_INFO.fpEDDparams+2], ax 52 mov ax, EDRIVE_INFO_size 41 53 42 54 ; Fill Extended Drive Information Table in ES:DI 43 mov ax, MINIMUM_EDRIVEINFO_SIZE 44 stosw 55 .SkipEddConfigurationParameters: 56 stosw ; Store Extended Drive Information Table size 45 57 mov al, FLG_DMA_BOUNDARY_ERRORS_HANDLED_BY_BIOS 46 58 stosw … … 63 75 .BufferTooSmall: 64 76 mov ah, RET_HD_INVALID 77 .ReturnWithError: 65 78 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Tools/CommandLookup.asm
r165 r167 7 7 ;-------------------------------------------------------------------- 8 8 ; CommandLookup_GetEbiosIndexToBX 9 ; CommandLookup_OrOldInt13hIndexToBL10 9 ; Parameters: 11 10 ; DS:DI: Ptr to DPT … … 14 13 ; BX: Index to command lookup table 15 14 ; Corrupts registers: 16 ; AX 15 ; AX, DX 17 16 ;-------------------------------------------------------------------- 18 17 ALIGN JUMP_ALIGN 19 18 CommandLookup_GetEbiosIndexToBX: 20 19 ; LBA28 or LBA48 command 21 xor bx, bx 22 mov ax, [es:si+DAP.qwLBA+3] ; Load LBA48 bytes 3 and 4 23 and al, ~0Fh ; Clear LBA28 bits 24...27 24 or al, [es:si+DAP.qwLBA+5] 25 cmp bx, ax ; Set CF if any of bits 28...47 set 26 rcl bx, 1 ; BX = 0 for LBA28, BX = 1 for LBA48 20 xor dx, dx 21 mov al, [es:si+DAP.qwLBA+3] ; Load LBA48 byte 3 (bits 24...31) 22 and ax, 00F0h ; Clear LBA28 bits 24...27 23 or ax, [es:si+DAP.qwLBA+4] ; Set bits from LBA bytes 4 and 5 24 cmp dx, ax ; Set CF if any of bits 28...47 set 25 rcl dx, 1 ; DX = 0 for LBA28, DX = 1 for LBA48 26 call CommandLookup_GetOldInt13hIndexToBX 27 or bx, dx ; Set block mode / single sector bit 28 ret 27 29 30 ;-------------------------------------------------------------------- 31 ; CommandLookup_GetOldInt13hIndexToBX 32 ; Parameters: 33 ; DS:DI: Ptr to DPT 34 ; Returns: 35 ; BX: Index to command lookup table 36 ; Corrupts registers: 37 ; Nothing 38 ;-------------------------------------------------------------------- 39 ALIGN JUMP_ALIGN 40 CommandLookup_GetOldInt13hIndexToBX: 28 41 ; Block mode or single sector 29 ALIGN JUMP_ALIGN 30 CommandLookup_OrOldInt13hIndexToBL: 31 mov al, FLGH_DPT_BLOCK_MODE_SUPPORTED ; Bit 1 32 and al, [di+DPT.bFlagsHigh] 33 or bl, al ; BX = index to lookup table 42 mov bl, [di+DPT.bFlagsHigh] 43 and bx, BYTE FLGH_DPT_BLOCK_MODE_SUPPORTED ; Bit 1 34 44 ret 35 45 … … 52 62 db COMMAND_VERIFY_SECTORS 53 63 db COMMAND_VERIFY_SECTORS_EXT 54
Note:
See TracChangeset
for help on using the changeset viewer.