Changeset 150 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs
- Timestamp:
- Apr 29, 2011, 7:04:13 PM (14 years ago)
- google:author:
- aitotat
- Location:
- trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/AccessDPT.asm
r99 r150 6 6 7 7 ;-------------------------------------------------------------------- 8 ; Returns L-CHS values from DPT. 9 ; 8 ; AccessDPT_GetDriveSelectByteToAL 9 ; Parameters: 10 ; DS:DI: Ptr to Disk Parameter Table 11 ; Returns: 12 ; AL: Drive Select Byte 13 ; Corrupts registers: 14 ; Nothing 15 ;-------------------------------------------------------------------- 16 ALIGN JUMP_ALIGN 17 AccessDPT_GetDriveSelectByteToAL: 18 mov al, [di+DPT.wFlags] 19 and al, FLG_DRVNHEAD_LBA | FLG_DRVNHEAD_DRV 20 or al, MASK_DRVNHEAD_SET ; Bits set to 1 for old drives 21 ret 22 23 24 ;-------------------------------------------------------------------- 25 ; AccessDPT_GetDeviceControlByteToAL 26 ; Parameters: 27 ; DS:DI: Ptr to Disk Parameter Table 28 ; Returns: 29 ; AL: Device Control Byte 30 ; Corrupts registers: 31 ; Nothing 32 ;-------------------------------------------------------------------- 33 ALIGN JUMP_ALIGN 34 AccessDPT_GetDeviceControlByteToAL: 35 xor al, al 36 test BYTE [di+DPT.wFlags], FLG_DPT_ENABLE_IRQ 37 jnz SHORT .EnableDeviceIrq 38 or al, FLG_DEVCONTROL_nIEN ; Disable IRQ 39 .EnableDeviceIrq: 40 ret 41 42 43 ;-------------------------------------------------------------------- 44 ; AccessDPT_GetAddressingModeForWordLookToBX 45 ; Parameters: 46 ; DS:DI: Ptr to Disk Parameter Table 47 ; Returns: 48 ; BX: Addressing Mode (L-CHS, P-CHS, LBA28, LBA48) shifted for WORD lookup 49 ; Corrupts registers: 50 ; Nothing 51 ;-------------------------------------------------------------------- 52 ALIGN JUMP_ALIGN 53 AccessDPT_GetAddressingModeForWordLookToBX: 54 mov bl, [di+DPT.wFlags] 55 and bx, BYTE MASK_DPT_ADDRESSING_MODE 56 eSHR_IM bx, ADDRESSING_MODE_FIELD_POSITION-1 57 ret 58 59 60 ;-------------------------------------------------------------------- 10 61 ; AccessDPT_GetLCHSfromPCHS 11 62 ; Parameters: … … 21 72 AccessDPT_GetLCHSfromPCHS: 22 73 xchg ax, cx 23 mov cl, [di+DPT.bShLtoP] ; Load shift count 24 mov bx, [di+DPT.wPCyls] ; Load P-CHS cylinders 25 shr bx, cl ; Shift to L-CHS cylinders 74 mov cl, [di+DPT.wFlags] 75 and cl, MASK_DPT_CHS_SHIFT_COUNT ; Load shift count 76 mov bx, [di+DPT.wPchsCylinders] ; Load P-CHS cylinders 77 shr bx, cl ; Shift to L-CHS cylinders 26 78 xchg cx, ax 27 mov dx, [di+DPT.wLHeads]; Load L-CHS heads28 eMOVZX ax, BYTE [di+DPT.bP Sect] ; Load Sectors per track79 eMOVZX dx, BYTE [di+DPT.bLchsHeads] ; Load L-CHS heads 80 eMOVZX ax, BYTE [di+DPT.bPchsSectors] ; Load Sectors per track 29 81 ret 30 82 31 83 32 84 ;-------------------------------------------------------------------- 33 ; Tests IDEVARS flags for master or slave drive.34 ;35 85 ; AccessDPT_TestIdeVarsFlagsForMasterOrSlaveDrive 36 86 ; Parameters: … … 63 113 ALIGN JUMP_ALIGN 64 114 AccessDPT_GetPointerToDRVPARAMStoCSBX: 65 eMOVZX bx, [di+DPT.bIdeOff] ; CS:BX points to IDEVARS 66 test BYTE [di+DPT.bDrvSel], FLG_IDE_DRVHD_DRV 67 jnz SHORT .ReturnPointerToSlaveDRVPARAMS 68 add bx, BYTE IDEVARS.drvParamsMaster 115 eMOVZX bx, [di+DPT.bIdevarsOffset] ; CS:BX points to IDEVARS 116 add bx, BYTE IDEVARS.drvParamsMaster ; CS:BX points to Master Drive DRVPARAMS 117 test BYTE [di+DPT.wFlags], FLG_DPT_SLAVE 118 jz SHORT .ReturnPointerToDRVPARAMS 119 add bx, BYTE DRVPARAMS_size ; CS:BX points to Slave Drive DRVPARAMS 120 .ReturnPointerToDRVPARAMS: 69 121 ret 70 ALIGN JUMP_ALIGN71 .ReturnPointerToSlaveDRVPARAMS:72 add bx, BYTE IDEVARS.drvParamsSlave73 ret -
trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/CreateDPT.asm
r128 r150 25 25 ;-------------------------------------------------------------------- 26 26 CreateDPT_FromAtaInformation: 27 call FindDPT_ForNewDrive ; Get new DPT to DS:DI27 call FindDPT_ForNewDriveToDSDI 28 28 ; Fall to .InitializeDPT 29 29 … … 35 35 ; CS:BP: Ptr to IDEVARS for the controller 36 36 ; Returns: 37 ; AX: Zero38 ; Corrupts registers: 39 ; Nothing37 ; Nothing 38 ; Corrupts registers: 39 ; AX 40 40 ;-------------------------------------------------------------------- 41 41 .InitializeDPT: 42 xor ax, ax 43 mov BYTE [di+DPT.bSize], DPT_size 44 mov [di+DPT.wDrvNumAndFlags], ax 45 mov BYTE [di+DPT.bReset], MASK_RESET_ALL 46 mov [di+DPT.bIdeOff], bp 47 mov [di+DPT.bDrvSel], bh 48 ; Fall to .StoreDriveControlByte 49 50 ;-------------------------------------------------------------------- 51 ; .StoreDriveControlByte 52 ; Parameters: 53 ; AX: Zero 42 mov [di+DPT.bIdevarsOffset], bp ; IDEVARS must start in first 256 bytes of ROM 43 ; Fall to .StoreDriveSelectAndDriveControlByte 44 45 ;-------------------------------------------------------------------- 46 ; .StoreDriveSelectAndDriveControlByte 47 ; Parameters: 54 48 ; BH: Drive Select byte for Drive and Head Register 55 49 ; DS:DI: Ptr to Disk Parameter Table … … 61 55 ; AX 62 56 ;-------------------------------------------------------------------- 63 .StoreDriveControlByte: 64 cmp BYTE [cs:bp+IDEVARS.bIRQ], al ; Interrupts enabled? 65 jne SHORT .CheckHeadCount 66 or al, FLG_IDE_CTRL_nIEN ; Disable interrupts 67 .CheckHeadCount: 68 cmp BYTE [es:si+ATA1.wHeadCnt], 8 ; 1...8 heads? 69 jbe SHORT .StoreDrvCtrlByteToDPT 70 or al, FLG_IDE_CTRL_O8H ; Over 8 heads (pre-ATA) 71 .StoreDrvCtrlByteToDPT: 72 mov [di+DPT.bDrvCtrl], al 57 .StoreDriveSelectAndDriveControlByte: 58 mov al, bh 59 and ax, BYTE FLG_DRVNHEAD_DRV ; AL now has Master/Slave bit 60 cmp [cs:bp+IDEVARS.bIRQ], ah ; Interrupts enabled? 61 jz SHORT .StoreFlags ; If not, do not set interrupt flag 62 or al, FLG_DPT_ENABLE_IRQ 63 .StoreFlags: 64 mov [di+DPT.wFlags], ax 73 65 ; Fall to .StorePCHS 74 66 … … 76 68 ; .StorePCHS 77 69 ; Parameters: 78 ; AH: Zero79 70 ; BH: Drive Select byte for Drive and Head Register 80 71 ; DS:DI: Ptr to Disk Parameter Table … … 99 90 mov ax, [cs:bx+DRVPARAMS.wCylinders] 100 91 mov bx, [cs:bx+DRVPARAMS.wHeadsAndSectors] 101 or BYTE [di+DPT.bFlags], FLG_DPT_USERCHS102 92 103 93 .StorePCHStoDPT: 104 mov [di+DPT.wP Cyls], ax105 mov [di+DPT.w HeadsAndSectors], bx94 mov [di+DPT.wPchsCylinders], ax 95 mov [di+DPT.wPchsHeadsAndSectors], bx 106 96 ; Fall to .StoreLCHS 107 97 … … 129 119 jmp SHORT .ShiftLoop 130 120 131 .LimitHeadsTo255: 132 test bh, bh ; 256 heads? 133 jz SHORT .StoreLCHStoDPT ; If less, no correction needed 134 dec bx ; Limit to 255 heads since DOS does not support 256 heads 135 .StoreLCHStoDPT: 136 mov [di+DPT.bShLtoP], cl 137 mov [di+DPT.wLHeads], bx 121 .LimitHeadsTo255: ; DOS does not support drives with 256 heads 122 rcr bh, 1 ; Set CF if 256 heads 123 sbb bl, 0 ; Decrement to 255 if 256 heads 124 or [di+DPT.wFlags], cl 125 mov [di+DPT.bLchsHeads], bl 138 126 ; Fall to .StoreAddressing 139 127 … … 146 134 ; Nothing 147 135 ; Corrupts registers: 148 ; Nothing136 ; AX, BX 149 137 ;-------------------------------------------------------------------- 150 138 .StoreAddressing: 151 cmp WORD [di+DPT.wPCyls], 1024 ; L-CHS possible? (no translation needed) 152 jbe SHORT .StoreBlockMode ; If so, nothing needs to be changed 153 test BYTE [di+DPT.bFlags], FLG_DPT_USERCHS 154 jnz SHORT .StorePCHSaddressing ; Use user defined P-CHS 139 ; Check if L-CHS addressing should be used 140 cmp WORD [di+DPT.wPchsCylinders], 1024 ; L-CHS possible? (no translation needed) 141 jbe SHORT .StoreBlockMode ; If so, nothing needs to be changed 142 143 ; Check if P-CHS addressing should be used 144 mov al, FLG_DRVPARAMS_USERCHS ; User specified CHS? 145 call AccessDPT_TestIdeVarsFlagsForMasterOrSlaveDrive 146 jnz SHORT .StorePCHSaddressing 155 147 test WORD [es:si+ATA1.wCaps], A2_wCaps_LBA 156 jz SHORT .StorePCHSaddressing ; Use P-CHS since LBA not supported 148 jz SHORT .StorePCHSaddressing ; Use P-CHS since LBA not supported 149 150 ; LBA needs to be used. Check if 48-bit LBA is supported 157 151 test WORD [es:si+ATA6.wSetSup83], A6_wSetSup83_LBA48 158 jz SHORT .StoreLBA28addressing ; Use LBA-28 since LBA-48 not supported159 or BYTE [di+DPT. bFlags], ADDR_DPT_LBA48<<1152 jz SHORT .StoreLBA28addressing ; Use LBA-28 since LBA-48 not supported 153 or BYTE [di+DPT.wFlags], ADDRESSING_MODE_LBA48<<ADDRESSING_MODE_FIELD_POSITION 160 154 .StoreLBA28addressing: 161 or BYTE [di+DPT.bFlags], ADDR_DPT_LBA28<<1 162 or BYTE [di+DPT.bDrvSel], FLG_IDE_DRVHD_LBA 155 or BYTE [di+DPT.wFlags], ADDRESSING_MODE_LBA28<<ADDRESSING_MODE_FIELD_POSITION 163 156 jmp SHORT .StoreBlockMode 164 157 .StorePCHSaddressing: 165 or BYTE [di+DPT. bFlags], ADDR_DPT_PCHS<<1158 or BYTE [di+DPT.wFlags], ADDRESSING_MODE_PCHS<<ADDRESSING_MODE_FIELD_POSITION 166 159 ; Fall to .StoreBlockMode 167 160 … … 174 167 ; Nothing 175 168 ; Corrupts registers: 176 ; AX169 ; Nothing 177 170 ;-------------------------------------------------------------------- 178 171 .StoreBlockMode: 179 mov al, 1 ; Minimum block size is 1 sector 180 mov ah, [es:si+ATA1.bBlckSize] ; Load max block size in sectors 181 mov [di+DPT.wSetAndMaxBlock], ax 182 ; Fall to .StoreEBIOSSupport 183 184 ;-------------------------------------------------------------------- 185 ; .StoreEBIOSSupport 186 ; Parameters: 187 ; DS:DI: Ptr to Disk Parameter Table 188 ; ES:SI: Ptr to 512-byte ATA information read from the drive 189 ; Returns: 190 ; Nothing 191 ; Corrupts registers: 192 ; AX, BX, DX 193 ;-------------------------------------------------------------------- 194 .StoreEBIOSSupport: 195 test BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_FULLMODE 196 jz SHORT .StoreDriveNumberAndUpdateDriveCount ; No EBIOS support since small DPTs needed 197 198 mov bl, [di+DPT.bFlags] 199 and bx, BYTE MASK_DPT_ADDR ; Addressing mode 200 jmp [cs:bx+.rgwAddrJmp] ; Jump to handle addressing mode 201 .rgwAddrJmp: 202 dw .StoreDriveNumberAndUpdateDriveCount ; ADDR_DPT_LCHS 203 dw .StoreDriveNumberAndUpdateDriveCount ; ADDR_DPT_PCHS 204 dw .SupportForLBA28 ; ADDR_DPT_LBA28 205 dw .SupportForLBA48 ; ADDR_DPT_LBA48 206 207 .SupportForLBA28: 208 sub BYTE [di+DPT.bSize], 2 ; Only 4 bytes for sector count 209 .SupportForLBA48: 210 add BYTE [di+DPT.bSize], EBDPT_size - DPT_size 211 or BYTE [di+DPT.bFlags], FLG_DPT_EBIOS 212 call AtaID_GetTotalSectorCount 213 mov [di+EBDPT.twCapacity], ax 214 mov [di+EBDPT.twCapacity+2], dx 215 mov [di+EBDPT.twCapacity+4], bx 172 cmp BYTE [es:si+ATA1.bBlckSize], 1 ; Max block size in sectors 173 jbe SHORT .BlockModeTransfersNotSupported 174 or WORD [di+DPT.wFlags], FLG_DPT_BLOCK_MODE_SUPPORTED 175 .BlockModeTransfersNotSupported: 176 ; Fall to .StoreDeviceSpecificParameters 177 178 ;-------------------------------------------------------------------- 179 ; .StoreDeviceSpecificParameters 180 ; Parameters: 181 ; DS:DI: Ptr to Disk Parameter Table 182 ; ES:SI: Ptr to 512-byte ATA information read from the drive 183 ; Returns: 184 ; Nothing 185 ; Corrupts registers: 186 ; AX, BX, CX, DX 187 ;-------------------------------------------------------------------- 188 .StoreDeviceSpecificParameters: 189 call Device_FinalizeDPT 216 190 ; Fall to .StoreDriveNumberAndUpdateDriveCount 217 191 … … 230 204 ;-------------------------------------------------------------------- 231 205 .StoreDriveNumberAndUpdateDriveCount: 232 ; Make sure that more drives can be accepted 233 mov dl, [es:BDA.bHDCount] ; Load number of hard disks 234 test dl, dl ; Hard disks at maximum? 235 stc ; Assume error 236 js SHORT .TooManyDrives ; If so, return 237 238 ; Store drive number to DPT 239 or dl, 80h ; Set bit 7 since hard disk 240 mov [di+DPT.bDrvNum], dl ; Store drive number 241 242 ; Update BDA and RAMVARS 243 inc BYTE [es:BDA.bHDCount] ; Increment drive count to BDA 244 call RamVars_IncrementHardDiskCount 206 mov dl, [es:BDA.bHDCount] 207 or dl, 80h ; Set bit 7 since hard disk 208 209 inc BYTE [RAMVARS.bDrvCnt] ; Increment drive count to RAMVARS 210 inc BYTE [es:BDA.bHDCount] ; Increment drive count to BDA 211 212 cmp BYTE [RAMVARS.bFirstDrv], 0 ; First drive set? 213 ja SHORT .AllDone ; If so, return 214 mov [RAMVARS.bFirstDrv], dl ; Store first drive number 215 .AllDone: 245 216 clc 246 .TooManyDrives:247 217 ret -
trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/FindDPT.asm
r3 r150 1 ; File name : FindDPT.asm 2 ; Project name : IDE BIOS 3 ; Created date : 14.3.2010 4 ; Last update : 12.4.2010 5 ; Author : Tomi Tilli 1 ; Project name : XTIDE Universal BIOS 6 2 ; Description : Functions for finding Disk Parameter Table. 7 3 … … 12 8 ; Finds pointer to first unused Disk Parameter Table. 13 9 ; 14 ; FindDPT_ForNewDrive 10 ; FindDPT_ForNewDriveToDSDI 15 11 ; Parameters: 16 12 ; DS: RAMVARS segment … … 18 14 ; DS:DI: Ptr to first unused DPT 19 15 ; Corrupts registers: 20 ; Nothing16 ; DL 21 17 ;-------------------------------------------------------------------- 22 18 ALIGN JUMP_ALIGN 23 FindDPT_ForNewDrive: 24 push si 25 mov si, FindDPT_ReturnWrongDPT 26 jmp SHORT FindDPT_StartIterationAndReturnAfterDone 27 28 29 ;-------------------------------------------------------------------- 30 ; Finds Disk Parameter Table for 31 ; Master or Slave drive at wanted port. 32 ; 33 ; FindDPT_ForIdeSlaveAtPort 34 ; FindDPT_ForIdeMasterAtPort 35 ; Parameters: 36 ; DX: IDE Base Port address 37 ; DS: RAMVARS segment 38 ; Returns: 39 ; DL: Drive number (if DPT found) 40 ; DS:DI: Ptr to DPT 41 ; CF: Set if wanted DPT found 42 ; Cleared if DPT not found 43 ; Corrupts registers: 44 ; Nothing 45 ;-------------------------------------------------------------------- 46 ALIGN JUMP_ALIGN 47 FindDPT_ForIdeSlaveAtPort: 48 push si 49 mov si, FindDPT_IterateToSlaveAtPortCallback 50 jmp SHORT FindDPT_StartIterationAndReturnAfterDone 51 52 ALIGN JUMP_ALIGN 53 FindDPT_ForIdeMasterAtPort: 54 push si 55 mov si, FindDPT_IterateToMasterAtPortCallback 56 jmp SHORT FindDPT_StartIterationAndReturnAfterDone 57 58 ;-------------------------------------------------------------------- 59 ; Iteration callback for finding DPT using 60 ; IDE base port for Master or Slave drive. 61 ; 62 ; FindDPT_IterateToSlaveAtPortCallback 63 ; FindDPT_IterateToMasterAtPortCallback 64 ; Parameters: 65 ; DX: IDE Base Port address 66 ; DS:DI: Ptr to DPT to examine 67 ; Returns: 68 ; DL: Drive number if correct DPT 69 ; CF: Set if wanted DPT found 70 ; Cleared if wrong DPT 71 ; Corrupts registers: 72 ; Nothing 73 ;-------------------------------------------------------------------- 74 ALIGN JUMP_ALIGN 75 FindDPT_IterateToSlaveAtPortCallback: 76 test BYTE [di+DPT.bDrvSel], FLG_IDE_DRVHD_DRV 77 jnz SHORT FindDPT_IterateToMasterOrSlaveAtPortCallback 78 jmp SHORT FindDPT_ReturnWrongDPT ; Return if master drive 79 80 ALIGN JUMP_ALIGN 81 FindDPT_IterateToMasterAtPortCallback: 82 test BYTE [di+DPT.bDrvSel], FLG_IDE_DRVHD_DRV 83 jnz SHORT FindDPT_ReturnWrongDPT ; Return if slave drive 84 85 ; If BIOS partitioned, ignore all but first partition 86 ALIGN JUMP_ALIGN 87 FindDPT_IterateToMasterOrSlaveAtPortCallback: 88 test BYTE [di+DPT.bFlags], FLG_DPT_PARTITION 89 jz SHORT .CompareBasePortAddress 90 test BYTE [di+DPT.bFlags], FLG_DPT_FIRSTPART 91 jz SHORT FindDPT_ReturnWrongDPT 92 ALIGN JUMP_ALIGN 93 .CompareBasePortAddress: 94 push bx 95 eMOVZX bx, BYTE [di+DPT.bIdeOff] ; CS:BX now points to IDEVARS 96 cmp dx, [cs:bx+IDEVARS.wPort] ; Wanted port? 97 pop bx 98 jne SHORT FindDPT_ReturnWrongDPT 99 mov dl, [di+DPT.bDrvNum] ; Load drive number 100 stc ; Set CF since wanted DPT 101 ret 19 FindDPT_ForNewDriveToDSDI: 20 mov dl, [RAMVARS.bFirstDrv] 21 add dl, [RAMVARS.bDrvCnt] 22 ; Fall to FindDPT_ForDriveNumber 102 23 103 24 … … 112 33 ; Returns: 113 34 ; DS:DI: Ptr to DPT 114 ; CF: Set if wanted DPT found115 ; Cleared if DPT not found116 35 ; Corrupts registers: 117 36 ; Nothing … … 119 38 ALIGN JUMP_ALIGN 120 39 FindDPT_ForDriveNumber: 121 push si 122 mov si, FindDPT_IterateToDriveNumberCallback 123 FindDPT_StartIterationAndReturnAfterDone: 124 call FindDPT_IterateAllDPTs 125 pop si 40 push dx 41 push ax 42 43 mov al, LARGEST_DPT_SIZE 44 sub dl, [RAMVARS.bFirstDrv] 45 mul dl 46 add ax, BYTE RAMVARS_size 47 xchg di, ax 48 49 pop ax 50 pop dx 126 51 ret 127 52 53 128 54 ;-------------------------------------------------------------------- 129 ; Iteration callback for finding DPT for drive number. 55 ; Finds Disk Parameter Table for 56 ; Master or Slave drive at wanted port. 130 57 ; 131 ; FindDPT_IterateToDriveNumberCallback 58 ; FindDPT_ToDSDIForIdeMasterAtPortDX 59 ; FindDPT_ToDSDIForIdeSlaveAtPortDX 132 60 ; Parameters: 133 ; DL: Drive number to search for 61 ; DX: IDE Base Port address 62 ; DS: RAMVARS segment 63 ; Returns: 64 ; DL: Drive number (if DPT found) 65 ; DS:DI: Ptr to DPT 66 ; CF: Set if wanted DPT found 67 ; Cleared if DPT not found 68 ; Corrupts registers: 69 ; SI 70 ;-------------------------------------------------------------------- 71 ALIGN JUMP_ALIGN 72 FindDPT_ToDSDIForIdeMasterAtPortDX: 73 mov si, FindDPT_IterateToMasterAtPortCallback 74 jmp SHORT IterateAllDPTs 75 76 ALIGN JUMP_ALIGN 77 FindDPT_ToDSDIForIdeSlaveAtPortDX: 78 mov si, FindDPT_IterateToSlaveAtPortCallback 79 jmp SHORT IterateAllDPTs 80 81 ;-------------------------------------------------------------------- 82 ; Iteration callback for finding DPT using 83 ; IDE base port for Master or Slave drive. 84 ; 85 ; FindDPT_IterateToSlaveAtPortCallback 86 ; FindDPT_IterateToMasterAtPortCallback 87 ; Parameters: 88 ; CH: Drive number 89 ; DX: IDE Base Port address 134 90 ; DS:DI: Ptr to DPT to examine 135 91 ; Returns: 92 ; DL: Drive number if correct DPT 136 93 ; CF: Set if wanted DPT found 137 94 ; Cleared if wrong DPT … … 140 97 ;-------------------------------------------------------------------- 141 98 ALIGN JUMP_ALIGN 142 FindDPT_IterateToDriveNumberCallback: 143 cmp dl, [di+DPT.bDrvNum] ; Wanted DPT found? 144 je SHORT FindDPT_RightDriveNumber ; If so, return 145 FindDPT_ReturnWrongDPT: 146 clc ; Clear CF since wrong DPT 99 FindDPT_IterateToSlaveAtPortCallback: 100 test BYTE [di+DPT.wFlags], FLG_DPT_SLAVE ; Clears CF 101 jnz SHORT CompareBasePortAddress 102 ret ; Wrong DPT 103 104 ALIGN JUMP_ALIGN 105 FindDPT_IterateToMasterAtPortCallback: 106 test BYTE [di+DPT.wFlags], FLG_DPT_SLAVE 107 jnz SHORT ReturnWrongDPT ; Return if slave drive 108 109 CompareBasePortAddress: 110 push bx 111 eMOVZX bx, BYTE [di+DPT.bIdevarsOffset] ; CS:BX now points to IDEVARS 112 cmp dx, [cs:bx+IDEVARS.wPort] ; Wanted port? 113 pop bx 114 jne SHORT ReturnWrongDPT 115 mov dl, ch ; Return drive number in DL 116 stc ; Set CF since wanted DPT 147 117 ret 148 ALIGN JUMP_ALIGN 149 FindDPT_RightDriveNumber: 150 push bx 151 eMOVZX bx, BYTE [di+DPT.bIdeOff] ; CS:BX now points to IDEVARS 152 mov bx, [cs:bx+IDEVARS.wPort] ; Load IDE Base Port address... 153 mov [RAMVARS.wIdeBase], bx ; ...and store it to RAMVARS 154 pop bx 155 stc 118 ReturnWrongDPT: 119 clc ; Clear CF since wrong DPT 156 120 ret 157 121 … … 160 124 ; Iterates all Disk Parameter Tables. 161 125 ; 162 ; FindDPT_IterateAllDPTs126 ; IterateAllDPTs 163 127 ; Parameters: 164 128 ; BX,DX: Parameters to callback function … … 170 134 ; Cleared if DPT not found 171 135 ; Corrupts registers: 172 ; Nothing ,unless corrupted by callback function136 ; Nothing unless corrupted by callback function 173 137 ;-------------------------------------------------------------------- 174 138 ALIGN JUMP_ALIGN 175 FindDPT_IterateAllDPTs: 176 push ax 139 IterateAllDPTs: 177 140 push cx 141 mov cx, [RAMVARS.wDrvCntAndFirst] 142 jcxz .AllDptsIterated ; Return if no drives 178 143 call FindDPT_PointToFirstDPT ; Point DS:DI to first DPT 179 eMOVZX cx, BYTE [RAMVARS.bDrvCnt] ; Load number of drives180 xor ax, ax ; Zero AX for DPT size and clear CF181 jcxz .Return ; Return if no drives182 144 ALIGN JUMP_ALIGN 183 145 .LoopWhileDPTsLeft: 184 146 call si ; Is wanted DPT? 185 jc SHORT .Return ; If so, return 186 mov al, [di+DPT.bSize] ; Load DPT size to AX 187 add di, ax ; Point to next DPT 188 loop .LoopWhileDPTsLeft ; Check next DPT 147 jc SHORT .AllDptsIterated ; If so, return 148 inc ch ; Increment drive number 149 add di, BYTE LARGEST_DPT_SIZE ; Point to next DPT 150 dec cl ; Decrement drives left 151 jnz SHORT .LoopWhileDPTsLeft 189 152 clc ; Clear CF since DPT not found 190 153 ALIGN JUMP_ALIGN 191 . Return:154 .AllDptsIterated: 192 155 pop cx 193 pop ax194 156 ret 195 157 … … 209 171 FindDPT_PointToFirstDPT: 210 172 mov di, RAMVARS_size 211 test BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_FULLMODE212 jz SHORT .Return ; RAMVARS used (top of interrupt vectors)213 add di, BYTE FULLRAMVARS_size-RAMVARS_size ; FULLRAMVARS used (top of base memory)214 ALIGN JUMP_ALIGN215 .Return:216 173 ret -
trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/RamVars.asm
r148 r150 40 40 eSHL_IM ax, 6 ; Segment to first stolen kB (*=40h) 41 41 mov ds, ax 42 mov WORD [ FULLRAMVARS.wSign], W_SIGN_FULLRAMVARS43 ; Fall to .InitializeRamvars FromDS42 mov WORD [RAMVARS.wSignature], RAMVARS_SIGNATURE 43 ; Fall to .InitializeRamvars 44 44 45 45 ;-------------------------------------------------------------------- … … 59 59 pop es 60 60 call Memory_ZeroESDIwithSizeInCX 61 mov WORD [RAMVARS.wSignature], RAMVARS_SIGNATURE 61 62 ; Fall to .InitializeDriveTranslationAndReturn 62 63 … … 92 93 test BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_FULLMODE 93 94 jnz SHORT .GetStolenSegmentToDS 94 mov di, SEGMENT_RAMVARS_TOP_OF_INTERRUPT_VECTORS95 mov di, LITE_MODE_RAMVARS_SEGMENT 95 96 mov ds, di 96 97 ret … … 105 106 mov ds, di ; EBDA segment to DS 106 107 add di, BYTE 64 ; DI to next stolen kB 107 cmp WORD [ FULLRAMVARS.wSign], W_SIGN_FULLRAMVARS108 cmp WORD [RAMVARS.wSignature], RAMVARS_SIGNATURE 108 109 jne SHORT .LoopStolenKBs ; Loop until sign found (always found eventually) 109 110 ret … … 167 168 168 169 ;-------------------------------------------------------------------- 169 ; RamVars_IncrementHardDiskCount170 ; Parameters:171 ; DL: Drive number for new drive172 ; DS: RAMVARS segment173 ; Returns:174 ; Nothing175 ; Corrupts registers:176 ; Nothing177 ;--------------------------------------------------------------------178 RamVars_IncrementHardDiskCount:179 inc BYTE [RAMVARS.bDrvCnt] ; Increment drive count to RAMVARS180 cmp BYTE [RAMVARS.bFirstDrv], 0 ; First drive set?181 ja SHORT .Return ; If so, return182 mov [RAMVARS.bFirstDrv], dl ; Store first drive number183 .Return:184 ret185 186 187 ;--------------------------------------------------------------------188 170 ; RamVars_GetHardDiskCountFromBDAtoCX 189 171 ; Parameters:
Note:
See TracChangeset
for help on using the changeset viewer.