Changeset 567 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src
- Timestamp:
- May 26, 2014, 1:25:15 PM (10 years ago)
- google:author:
- krille_n_@hotmail.com
- Location:
- trunk/XTIDE_Universal_BIOS/Src
- Files:
-
- 33 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeDPT.asm
r564 r567 34 34 IdeDPT_Finalize: 35 35 36 %ifdef MODULE_ FEATURE_SETS36 %ifdef MODULE_POWER_MANAGEMENT 37 37 ;-------------------------------------------------------------------- 38 38 ; .DetectPowerManagementSupport … … 43 43 ; Nothing 44 44 ; Corrupts registers: 45 ; Nothing45 ; AL 46 46 ;-------------------------------------------------------------------- 47 47 .DetectPowerManagementSupport: 48 test BYTE [es:si+ATA6.wSetSup82], A6_wSetSup82_POWERMAN 49 jz SHORT .NoPowerManagementSupport 50 or BYTE [di+DPT.bFlagsHigh], FLGH_DPT_POWER_MANAGEMENT_SUPPORTED 51 .NoPowerManagementSupport: 52 %endif ; MODULE_FEATURE_SETS 48 mov al, [es:si+ATA6.wSetSup82] 49 and al, A6_wSetSup82_POWERMAN ; A6_wSetSup82_POWERMAN (bit 3) is the same 50 or [di+DPT.bFlagsHigh], al ; bit as FLGH_DPT_POWER_MANAGEMENT_SUPPORTED 51 %endif ; MODULE_POWER_MANAGEMENT 53 52 54 53 -
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeDmaBlock.asm
r558 r567 2 2 ; Description : IDE Read/Write functions for transferring block using DMA. 3 3 ; These functions should only be called from IdeTransfer.asm. 4 5 ; Modified JJP 05-Jun-136 4 7 5 ; … … 91 89 ; Calculate bytes for first page 92 90 mov ax, di 93 neg ax ; 2s compl iment91 neg ax ; 2s complement 94 92 95 93 ; If DI was zero carry flag will be cleared (and set otherwise) … … 187 185 jz SHORT .TransferNextBlock ; All bytes transferred? 188 186 %else ; Fast DMA code - perform computed number of transfers, then check DMA status register to be sure 189 add cx, BYTE 15 ; We'll divide transfers in 16-byte atomic transfers, 190 eSHR_IM cx, 4 ; so include any partial block, which will be terminated 191 ALIGN JUMP_ALIGN ; by the DMA controller raising T/C 187 ; We'll divide transfers in 16-byte atomic transfers, so include any partial block, which will be terminated by the DMA controller raising T/C 188 add cx, BYTE 15 189 190 %ifdef USE_186 191 shr cx, 4 192 %else 193 xchg cx, ax 194 mov cl, 4 195 shr ax, cl 196 xchg cx, ax 197 %endif 198 199 ALIGN JUMP_ALIGN 192 200 .TransferNextDmaBlock: 193 201 out dx, al ; Transfer up to 16 bytes to/from XT-CF card -
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeError.asm
r566 r567 20 20 ; Section containing code 21 21 SECTION .text 22 23 %ifndef CHECK_FOR_UNUSED_ENTRYPOINTS 24 %if $ <> PollBsyOnly.End 25 %error "IdeError.asm must come immediately after IdeWait.asm (PollBsyOnly falls into IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL)!" 26 %endif 27 %endif 22 28 23 29 ;-------------------------------------------------------------------- -
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdePioBlock.asm
r558 r567 18 18 ; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 19 19 ; 20 21 ; Modified by JJP for XT-CFv3 support, Mar-1322 20 23 21 ; Section containing code -
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeTransfer.asm
r558 r567 228 228 229 229 ; Get transfer function based on bus type 230 xchg ax, bx ; Lookup table offset to AX231 mov bl, [di+DPT_ATA.bDevice]230 mov al, [di+DPT_ATA.bDevice] 231 add bx, ax 232 232 %ifdef MODULE_8BIT_IDE_ADVANCED 233 mov dl, bl 234 %endif 235 add bx, ax 233 cmp al, DEVICE_8BIT_XTCF_DMA 234 %endif 236 235 mov ax, [cs:bx] ; Load offset to transfer function 237 236 mov [bp+PIOVARS.fnXfer], ax … … 239 238 ; Normalize pointer for PIO-transfers and convert to physical address for DMA transfers 240 239 %ifdef MODULE_8BIT_IDE_ADVANCED 241 cmp dl, DEVICE_8BIT_XTCF_DMA242 240 jb SHORT IdeTransfer_NormalizePointerInESSI 243 241 244 242 ; Convert ES:SI to physical address 245 %ifdef USE_186 ; Bytes EU Cycles(286) 243 %ifdef USE_186 244 ; Bytes EU Cycles(286) 246 245 mov ax, es ; 2 2 247 246 rol ax, 4 ; 3 9 … … 255 254 ; 18 24 256 255 %else ; 808x 257 258 %if 0259 256 ; Bytes EU Cycles(808x) 260 257 mov al, 4 ; 2 4 … … 279 276 ; In other words, we could use a real world test here. 280 277 ; 281 % endif ;0278 %if 0 282 279 ; Bytes EU Cycles(808x/286) 283 280 xor dx, dx ; 2 3/2 … … 291 288 mov es, dx ; 2 2/2 292 289 ;------------------------------------ 293 %endif ; 26 29/26 294 clc 295 ret 290 ; 26 29/26 291 %endif ; 0 292 %endif 293 294 ret ; With CF cleared (taken care of by the physical address conversion) 296 295 %endif ; MODULE_8BIT_IDE_ADVANCED 297 296 ; Fall to IdeTransfer_NormalizePointerInESSI if no MODULE_8BIT_IDE_ADVANCED -
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeWait.asm
r532 r567 130 130 call Timer_SetCFifTimeout ; Update timeout counter 131 131 jnc SHORT .PollLoop ; Loop if time left (sets CF on timeout) 132 jmp SHORT IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL 132 .End: ; Label used for sanity check during assembly 133 ; Fall to IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL 134 -
trunk/XTIDE_Universal_BIOS/Src/Device/Serial/SerialCommand.asm
r558 r567 28 28 ; Parameters: 29 29 ; BH: Non-zero if 48-bit addressing used 30 ; 30 ; (ignored at present as 48-bit addressing is not supported) 31 31 ; BL: IDE Status Register bit to poll after command 32 ; 32 ; (ignored at present, since there is no IDE status register to poll) 33 33 ; ES:SI: Ptr to buffer (for data transfer commands) 34 34 ; DS:DI: Ptr to DPT (in RAMVARS segment) … … 122 122 ; wSerialPortAndBaud Non-Zero: -> Continue with wSerialPortAndBaud (1) 123 123 ; wSerialPortAndBaud Zero: 124 ; 125 ; 124 ; previous serial drive not found: -> Scan (2) 125 ; previous serial drive found: -> Continue with previous serial drive info (3) 126 126 ; 127 127 ; Slave: 128 128 ; wSerialPortAndBaud Non-Zero: 129 ; 129 ; previous serial drive not found: -> Error - Not Found (4) 130 130 ; previous serial drive found: -> Continue with wSerialPackedAndBaud (5) 131 ; 132 ; 131 ; wSerialPortAndBaud Zero: 132 ; previous serial drive not found: -> Error - Not Found (4) 133 133 ; previous serial drive found: -> Continue with previous serial drive info (6) 134 134 ; -
trunk/XTIDE_Universal_BIOS/Src/Device/Serial/SerialDPT.asm
r547 r567 28 28 ; Returns: 29 29 ; CF: Set, indicates that this is a floppy disk 30 ; 30 ; Clear, indicates that this is a hard disk 31 31 ; Corrupts registers: 32 32 ; AX … … 49 49 %ifndef CHECK_FOR_UNUSED_ENTRYPOINTS 50 50 %ifdef MODULE_SERIAL_FLOPPY 51 %if FLGH_DPT_SERIAL_DEVICE != 0x4 || FLGH_DPT_SERIAL_FLOPPY != 0x10 || FLGH_DPT_SERIAL_FLOPPY_TYPE_ MASK != 0xe0 || FLGH_DPT_SERIAL_FLOPPY_TYPE_FIELD_POSITION != 551 %if FLGH_DPT_SERIAL_DEVICE != 0x4 || FLGH_DPT_SERIAL_FLOPPY != 0x10 || FLGH_DPT_SERIAL_FLOPPY_TYPE_FIELD_POSITION != 5 52 52 %error "The serial server passes FLGH values into SerialDPT_Finalize directly. If the flag positions are changed, corresponding changes will need to be made in the serial server, and likely a version check put in to deal with servers talking to incompatible clients" 53 53 %endif -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h.asm
r561 r567 309 309 ; Returns: 310 310 ; Depends on function 311 ; 312 ; 311 ; NOTE: ES:DI needs to be returned from the previous interrupt 312 ; handler, for floppy DPT in function 08h 313 313 ; Corrupts registers: 314 314 ; None -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH0h_HReset.asm
r555 r567 119 119 mov dl, ROMVARS.ideVars0 ; starting Idevars offset 120 120 121 122 121 ; Get count of ALL Idevars structures, not just the ones that are configured. This may seem odd, 122 ; but it catches the .ideVarsSerialAuto structure, which would not be scanned if the count from 123 123 ; RamVars_GetIdeControllerCountToCX was used. Unused controllers won't make a difference, since no DPT 124 124 ; will point to them. Performance isn't an issue, as this is a reset operation. 125 125 ; 126 126 mov cx, NUMBER_OF_IDEVARS 127 127 -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH15h_HSize.asm
r547 r567 37 37 ; If successful: 38 38 ; AH: Hard Disk: 3 (Hard disk accessible) 39 ; 39 ; Floppy: 1 (Floppy disk, without change detection) 40 40 ; CX:DX: Total number of sectors 41 41 ; CF: 0 -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH1Eh_XTCF.asm
r558 r567 19 19 ; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 20 20 ; 21 22 ; Modified by JJP for XT-CFv3 support, Mar-1323 21 24 22 ; Section containing code -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH8h_HParams.asm
r545 r567 31 31 ; SS:BP: Ptr to IDEPACK 32 32 ; Returns with INTPACK: 33 ; BL: Drive Type (forfloppies only)33 ; BL: Drive Type (for serial floppies only) 34 34 ; CH: Maximum cylinder number, bits 7...0 35 35 ; CL: Bits 7...6: Cylinder number bits 9...8 … … 37 37 ; DH: Maximum head number (0...254) 38 38 ; DL: Number of drives!!! 39 ; ES:DI: Floppy DPT (forfloppies only)39 ; ES:DI: Floppy DPT (for serial floppies only) 40 40 ; AH: Int 13h/40h floppy return status 41 41 ; CF: 0 if successful, 1 if error … … 57 57 call RamVars_GetCountOfKnownDrivesToAX ; assume hard disk for now, will discard if for floppies 58 58 59 test byte [bp+IDEPACK.intpack+INTPACK.dl], 080h59 test BYTE [bp+IDEPACK.intpack+INTPACK.dl], 80h 60 60 jnz SHORT .CalledForHardDrive 61 61 … … 93 93 ; DS:DI: Ptr to DPT (in RAMVARS segment) 94 94 ; Returns: 95 ; BL: Drive Type (for serial floppies only) 95 96 ; CH: Maximum cylinder number, bits 7...0 96 97 ; CL: Bits 7...6: Cylinder number bits 9...8 … … 98 99 ; DH: Maximum head number (0...254) 99 100 ; Corrupts registers: 100 ; AX, B X101 ; AX, BH 101 102 ;-------------------------------------------------------------------- 102 103 AH8h_GetDriveParameters: … … 115 116 ; DS: RAMVARS segment 116 117 ; Returns: 118 ; BL: Drive Type (for serial floppies only) 117 119 ; CH: Maximum cylinder number, bits 7...0 118 120 ; CL: Bits 7...6: Cylinder number bits 9...8 … … 120 122 ; DH: Maximum head number (0...254) 121 123 ; Corrupts registers: 122 ; AX, B X124 ; AX, BH 123 125 ;-------------------------------------------------------------------- 124 126 .PackReturnValues: … … 172 174 173 175 db 1h << 1 | 0 ; Offset 1: Typical values of 1 for head load time 174 ; 176 ; DMA used (although it actually is not, but is more restrictive) 175 177 db 25h ; Offset 2: Inactivity motor turn-off delay, 176 178 ; Typical value of 25h for 2 second delay -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH9h_HInit.asm
r566 r567 194 194 195 195 196 %ifdef MODULE_ FEATURE_SETS196 %ifdef MODULE_POWER_MANAGEMENT 197 197 ;;; InitStandbyTimer 198 198 ; Initialize the standby timer (if supported) … … 206 206 STORE_ERROR_FLAG_TO_DPT FLG_INITERROR_FAILED_TO_INITIALIZE_STANDBY_TIMER 207 207 .NoPowerManagementSupport: 208 %endif ; MODULE_ FEATURE_SETS208 %endif ; MODULE_POWER_MANAGEMENT 209 209 210 210 -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/EBIOS/AH41h_CheckIfExtensionsPresent.asm
r550 r567 39 39 AH41h_HandlerForCheckIfExtensionsPresent: 40 40 cmp WORD [bp+IDEPACK.intpack+INTPACK.bx], 55AAh 41 %ifdef USE_386 42 jne Int13h_DirectCallToAnotherBios 43 %else 41 44 jne SHORT .EbiosNotSupported 45 %endif 42 46 43 47 mov BYTE [bp+IDEPACK.intpack+INTPACK.ah], EBIOS_VERSION … … 53 57 and BYTE [bp+IDEPACK.intpack+INTPACK.flags], ~FLG_FLAGS_CF ; Return with CF cleared 54 58 jmp Int13h_ReturnFromHandlerWithoutStoringErrorCode 59 60 %ifndef USE_386 55 61 .EbiosNotSupported: 56 62 jmp Int13h_DirectCallToAnotherBios 63 %endif 57 64 58 65 -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Tools/Prepare.asm
r558 r567 113 113 ; Prepare_ByValidatingSectorsInALforOldInt13h 114 114 ; Parameters: 115 ; AL: Number of sectors to transfer 115 ; AL: Number of sectors to transfer (1...128 is valid) 116 116 ; Returns: 117 117 ; Exits INT 13h if invalid number of sectors in AL … … 120 120 ;-------------------------------------------------------------------- 121 121 Prepare_ByValidatingSectorsInALforOldInt13h: 122 test al, al 123 js SHORT .CheckZeroOffsetFor128Sectors ; 128 or more 124 jz SHORT InvalidNumberOfSectorsRequested ; Zero not allowed for old INT 13h 122 test al, al ; Check if 0 < AL < 128 (Clears OF) 123 jle SHORT .CheckIf128Sectors ; Jump if not 125 124 ret ; Continue with transfer 126 125 127 126 ALIGN JUMP_ALIGN 128 .Check ZeroOffsetFor128Sectors:127 .CheckIf128Sectors: 129 128 cmp al, 128 130 j aSHORT InvalidNumberOfSectorsRequested129 jne SHORT InvalidNumberOfSectorsRequested 131 130 test si, si ; Offset must be zero to xfer 128 sectors 132 131 jnz SHORT CannotAlignPointerProperly -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int19h.asm
r561 r567 31 31 sti ; Enable interrupts 32 32 cld ; String instructions to increment pointers 33 %ifdef MODULE_VERY_LATE_INIT IALIZATION33 %ifdef MODULE_VERY_LATE_INIT 34 34 LOAD_BDA_SEGMENT_TO ds, ax ; Load BDA segment (zero) to DS 35 35 les ax, [TEMPORARY_VECTOR_FOR_SYSTEM_INT13h*4] … … 214 214 ; Parameters: 215 215 ; DL: Drive to boot from (translated, 00h or 80h) 216 ; CF:Set for Boot Sector Boot217 ; 218 ; 216 ; CF: Set for Boot Sector Boot 217 ; Clear for ROM Boot 218 ; ES:BX: (if CF set) Ptr to boot sector 219 219 ; 220 220 ; Returns: -
trunk/XTIDE_Universal_BIOS/Src/Initialization/AdvancedAta/AdvAtaInit.asm
r564 r567 88 88 call AdvAtaInit_LoadMasterDPTtoDSSIifSlaveInDSDI 89 89 call Vision_InitializeWithIDinAHandConfigInAL 90 xor ax, ax ; Success 90 91 91 92 pop si … … 93 94 94 95 .NoAdvancedController: 95 xor ax, ax ; Success96 96 ret 97 97 -
trunk/XTIDE_Universal_BIOS/Src/Initialization/AtaID.asm
r550 r567 27 27 ; ES:SI: Ptr to 512-byte ATA information read from the drive 28 28 ; Returns: 29 ; CF: Set if failed to verify ATA-ID30 ; Cleared if ATA-ID verified successfully29 ; ZF: Set if ATA-ID verified successfully 30 ; Cleared if failed to verify ATA-ID 31 31 ; Corrupts registers: 32 32 ; AX, BX, CX … … 41 41 ; Verify P-CHS cylinders 42 42 mov bx, ATA1.wCylCnt 43 mov cx, MAX_VALID_PCHS_CYLINDERS44 call .CompareCHorSfromOffsetBXtoMaxValueIn CX43 mov ax, MAX_VALID_PCHS_CYLINDERS 44 call .CompareCHorSfromOffsetBXtoMaxValueInAX 45 45 46 46 mov bl, ATA1.wHeadCnt & 0FFh 47 mov cx, MAX_VALID_PCHS_HEADS48 call .CompareCHorSfromOffsetBXtoMaxValueIn CX47 mov ax, MAX_VALID_PCHS_HEADS 48 call .CompareCHorSfromOffsetBXtoMaxValueInAX 49 49 50 50 mov bl, ATA1.wSPT & 0FFh 51 mov cl, MAX_VALID_PCHS_SECTORS_PER_TRACK52 call .CompareCHorSfromOffsetBXtoMaxValueIn CX51 mov al, MAX_VALID_PCHS_SECTORS_PER_TRACK 52 call .CompareCHorSfromOffsetBXtoMaxValueInAX 53 53 54 54 ; Check signature byte. It is only found on ATA-5 and later. It should be zero on … … 62 62 ; Check checksum byte since signature was present 63 63 mov cx, ATA6_size 64 call Memory_SumCXbytesFromESSItoAL ; Returns with ZF set according to result 65 jnz SHORT .FailedToVerifyAtaID 66 67 ; ATA-ID is now verified to be valid 68 .AtaIDverifiedSuccessfully: 69 clc 70 ret 71 72 ;-------------------------------------------------------------------- 73 ; .CompareCHorSfromOffsetBXtoMaxValueInCX 74 ; Parameters: 64 jmp Memory_SumCXbytesFromESSItoAL ; Returns with ZF set according to result 65 66 ;-------------------------------------------------------------------- 67 ; .CompareCHorSfromOffsetBXtoMaxValueInAX 68 ; Parameters: 69 ; AX: Maximum valid C, H or S value 75 70 ; BX: C, H or S offset to ATA-ID 76 ; CX: Maximum valid C, H or S value 77 ; ES:SI: Ptr to 512-byte ATA information read from the drive 78 ; Returns: 79 ; Exits from AtaID_VerifyFromESSI with CF set if invalid value 80 ; Corrupts registers: 81 ; AX 82 ;-------------------------------------------------------------------- 83 .CompareCHorSfromOffsetBXtoMaxValueInCX: 84 mov ax, [es:bx+si] 85 test ax, ax 86 jz SHORT .InvalidPCHorSinOffsetBX 87 cmp ax, cx ; Compare to max valid value 71 ; ES:SI: Ptr to 512-byte ATA information read from the drive 72 ; Returns: 73 ; Exits from AtaID_VerifyFromESSI with ZF cleared if invalid value 74 ; Corrupts registers: 75 ; CX 76 ;-------------------------------------------------------------------- 77 .CompareCHorSfromOffsetBXtoMaxValueInAX: 78 mov cx, [es:bx+si] 79 jcxz .InvalidPCHorSinOffsetBX 80 cmp cx, ax ; Compare to max valid value 88 81 jbe SHORT .ValidPCHorSinOffsetBX 89 82 .InvalidPCHorSinOffsetBX: 90 add sp, BYTE 2 ; Clear return address for this function 83 pop cx ; Clear return address for this function 84 inc cx ; Clear ZF to indicate invalid ATA-ID (safe to do since return address in CX will never be FFFFh) 85 .AtaIDverifiedSuccessfully: 91 86 .FailedToVerifyAtaID: 92 stc ; Set carry to indicate invalid ATA-ID93 87 .ValidPCHorSinOffsetBX: 94 88 ret … … 97 91 ;-------------------------------------------------------------------- 98 92 ; Writes user defined limits from ROMVARS to ATA ID read from the drive. 99 ; Modifying the ATA ID reduces code and possibilit es for bugs since100 ; only little fur her checks are needed elsewhere.93 ; Modifying the ATA ID reduces code and possibilities for bugs since 94 ; only little further checks are needed elsewhere. 101 95 ; 102 96 ; AtaID_ModifyESSIforUserDefinedLimitsAndReturnTranslateModeInDX -
trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectDrives.asm
r558 r567 62 62 ; if serial drive detected, do not scan (avoids duplicate drives and isn't needed - we already have a connection) 63 63 ; 64 call FindDPT_ToDSDIforSerialDevice ; does not modify AX64 call FindDPT_ToDSDIforSerialDevice ; Does not modify AX 65 65 jnc .AddHardDisks 66 66 … … 68 68 69 69 %ifdef MODULE_HOTKEYS 70 cmp al, COM_DETECT_HOTKEY_SCANCODE 70 cmp al, COM_DETECT_HOTKEY_SCANCODE ; Set by last call to HotkeyBar_UpdateDuringDriveDetection above 71 71 je .DriveDetectLoop 72 72 %endif … … 134 134 mov [RAMVARS.xlateVars+XLATEVARS.bFlopCntAndFirst], al 135 135 %endif 136 137 %ifdef MODULE_8BIT_IDE_ADVANCED138 NoSlaveDriveAvailable:139 %endif140 136 ret 141 137 … … 156 152 ; ES: Zero (BDA segment) 157 153 ; Returns: 158 ; 154 ; Nothing 159 155 ; Corrupts registers: 160 156 ; AX, BL, CX, DX, SI, DI 161 157 ;-------------------------------------------------------------------- 162 158 StartDetectionWithDriveSelectByteInBHandStringInCX: 163 %ifdef MODULE_8BIT_IDE_ADVANCED164 mov al, [cs:bp+IDEVARS.bDevice]165 cmp al, DEVICE_8BIT_XTCF_PIO8166 jb SHORT .DoNotSkipSlaveDriveDetection167 cmp al, DEVICE_8BIT_XTCF_DMA168 ja SHORT .DoNotSkipSlaveDriveDetection169 170 ; XT-CF do not support slave drives so skip detection171 test bh, FLG_DRVNHEAD_DRV172 jnz SHORT NoSlaveDriveAvailable173 .DoNotSkipSlaveDriveDetection:174 %endif ; MODULE_8BIT_IDE_ADVANCED175 176 159 call DetectPrint_StartDetectWithMasterOrSlaveStringInCXandIdeVarsInCSBP 177 160 … … 221 204 ; Nothing 222 205 ; Returns: 223 ; CF: 206 ; CF: Set (from DetectPrint_NullTerminatedStringFromCSSIandSetCF) 224 207 ; Corrupts registers: 225 208 ; AX, SI … … 248 231 call AtaID_VerifyFromESSI 249 232 pop bx 250 j cSHORT DetectDrives_DriveNotFound233 jnz SHORT DetectDrives_DriveNotFound 251 234 call CreateDPT_FromAtaInformation 252 235 jc SHORT DetectDrives_DriveNotFound -
trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectPrint.asm
r547 r567 60 60 ;-------------------------------------------------------------------- 61 61 DetectPrint_StartDetectWithMasterOrSlaveStringInCXandIdeVarsInCSBP: 62 mov ax, [cs:bp+IDEVARS.wBasePort] ; for IDE: AX=port address, DH=.bDevice63 ; fall throughto DetectPrint_StartDetectWithAutodetectedBasePortInAXandIdeVarsInCSBP62 mov ax, [cs:bp+IDEVARS.wBasePort] ; For IDE: AX=port address, DH=.bDevice 63 ; Fall to DetectPrint_StartDetectWithAutodetectedBasePortInAXandIdeVarsInCSBP 64 64 65 65 ;-------------------------------------------------------------------- … … 75 75 ;-------------------------------------------------------------------- 76 76 DetectPrint_StartDetectWithAutodetectedBasePortInAXandIdeVarsInCSBP: 77 mov dx, [cs:bp+IDEVARS.bDevice-1] ; for Serial: AL=port address>>2, AH=baud rate77 mov dx, [cs:bp+IDEVARS.bDevice-1] ; For Serial: AL=port address>>2, AH=baud rate 78 78 ; DL=COM number character, DH=.bDevice 79 push bp ; setup stack for call to79 push bp ; Setup stack for call to 80 80 mov bp, sp ; BootMenuPrint_FormatCSSIfromParamsInSSBP 81 81 … … 89 89 90 90 %ifdef MODULE_SERIAL 91 cmp dh, DEVICE_SERIAL_PORT 91 cmp dh, DEVICE_SERIAL_PORT ; Check if this is a serial device 92 92 93 93 jnz .pushAndPrint ; CX = string to print, AX = port address, DX won't be used -
trunk/XTIDE_Universal_BIOS/Src/Initialization/FloppyDrive.asm
r551 r567 161 161 ;-------------------------------------------------------------------- 162 162 FloppyDrive_GetCountFromBIOS_or_BDA: 163 push es 164 163 %ifdef USE_AT 165 164 ; Reads Floppy Drive Count from BIOS. 166 165 ; Does not work on most XT systems. Call .GetCountFromBDA 167 166 ; if this function fails. 168 %ifdef USE_AT 167 168 push es 169 169 push di 170 170 push bx … … 181 181 pop bx 182 182 pop di 183 183 pop es 184 185 %else ; ifndef USE_AT 184 186 ; Reads Floppy Drive Count (0...4) from BIOS Data Area. 185 187 ; This function should be used only if .GetCountFromBIOS fails. 186 %else ; ifndef USE_AT 187 LOAD_BDA_SEGMENT_TO es, ax 188 mov al, [es:BDA.wEquipment] ; Load Equipment WORD low byte 188 189 push ds 190 LOAD_BDA_SEGMENT_TO ds, ax 191 mov al, [BDA.wEquipment] ; Load Equipment WORD low byte 192 pop ds 189 193 190 194 %ifdef USE_UNDOC_INTEL … … 200 204 %endif ; USE_AT 201 205 202 pop es 203 ret 206 ret -
trunk/XTIDE_Universal_BIOS/Src/Initialization/Initialize.asm
r561 r567 47 47 mov [BIOS_BOOT_LOADER_INTERRUPT_19h*4+2], cs 48 48 49 %ifdef MODULE_VERY_LATE_INIT IALIZATION49 %ifdef MODULE_VERY_LATE_INIT 50 50 push es 51 ; Install special INT 13h hand er that initializes XTIDE Universal BIOS51 ; Install special INT 13h handler that initializes XTIDE Universal BIOS 52 52 ; when our INT 19h is not called 53 53 les ax, [BIOS_DISK_INTERRUPT_13h*4] ; Load system INT 13h handler … … 95 95 ; Nothing 96 96 ; Corrupts registers: 97 ; AX, CX, DX, SI, DI97 ; AX, BX, CX, DX, SI, DI 98 98 ;-------------------------------------------------------------------- 99 99 %ifdef MODULE_COMPATIBLE_TABLES … … 101 101 %ifndef USE_AT 102 102 test BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_FULLMODE 103 jz SHORT . CompatibleDPTsCreated; Only Full operating mode has extra RAM to spare103 jz SHORT .SkipToReturn ; Only Full operating mode has extra RAM to spare 104 104 %endif 105 105 106 mov bx, HD0_DPT_POINTER_41h * 4 106 107 mov dl, 80h 107 call FindDPT_ForDriveNumberInDL ; DPT to DS:DI 108 jc SHORT .FindForDrive81h ; Store nothing if not our drive 108 .FindForNextDrive: 109 call FindDPT_ForDriveNumberInDL ; DPT to DS:DI 110 jc SHORT .NextDrive ; Store nothing if not our drive 109 111 112 push dx 110 113 call CompatibleDPT_CreateToAXSIforDriveDL 111 mov [es:HD0_DPT_POINTER_41h*4], si 112 mov [es:HD0_DPT_POINTER_41h*4+2], ax 114 pop dx 113 115 114 .FindForDrive81h: 115 mov dl, 81h 116 call FindDPT_ForDriveNumberInDL 117 jc SHORT .CompatibleDPTsCreated 116 mov [es:bx], si 117 mov [es:bx+2], ax 118 118 119 call CompatibleDPT_CreateToAXSIforDriveDL 120 mov [es:HD1_DPT_POINTER_46h*4], si 121 mov [es:HD1_DPT_POINTER_46h*4+2], ax 122 .CompatibleDPTsCreated: 119 .NextDrive: 120 inc dx 121 add bx, (HD1_DPT_POINTER_46h - HD0_DPT_POINTER_41h) * 4 122 cmp dl, 82h 123 jb SHORT .FindForNextDrive 124 125 .SkipToReturn: 123 126 %endif ; MODULE_COMPATIBLE_TABLES 124 127 ret -
trunk/XTIDE_Universal_BIOS/Src/Main.asm
r560 r567 34 34 %define EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS ; Exclude unused library functions 35 35 %ifdef MODULE_BOOT_MENU 36 %define MENUEVENT_INLINE_OFFSETS 36 %define MENUEVENT_INLINE_OFFSETS ; Only one menu required, save space and inline offsets 37 37 %define INCLUDE_MENU_LIBRARY 38 %define MENU_NO_ESC 38 %define MENU_NO_ESC ; User cannot 'esc' out of the menu 39 39 %else ; If no boot menu included 40 40 %define INCLUDE_DISPLAY_LIBRARY … … 128 128 at ROMVARS.wBootTimeout, dw BOOT_MENU_DEFAULT_TIMEOUT 129 129 %endif 130 at 130 at ROMVARS.bIdeCnt, db 1 131 131 at ROMVARS.bBootDrv, db 80h ; Boot Menu default drive 132 132 at ROMVARS.bMinFddCnt, db 0 ; Do not force minimum number of floppy drives … … 218 218 219 219 ; Boot loader 220 %ifdef MODULE_VERY_LATE_INIT IALIZATION220 %ifdef MODULE_VERY_LATE_INIT 221 221 %include "Int13hBiosInit.asm" 222 222 %endif -
trunk/XTIDE_Universal_BIOS/Src/Menus/BootMenu/BootMenu.asm
r526 r567 55 55 ; Returns: 56 56 ; DX: Drive number to be used for booting 57 ; CF:Set: There is a selected menu item, DL is valid58 ; 57 ; CF: Set: There is a selected menu item, DL is valid 58 ; Clear: The item selected is Rom Boot, DL is not valid 59 59 ; Corrupts registers: 60 60 ; AX, BX -
trunk/XTIDE_Universal_BIOS/Src/Menus/BootMenu/BootMenuEvent.asm
r562 r567 66 66 ret 67 67 68 MENUEVENT_InitializeMenuinitFromDSSI equ (EventInitializeMenuinitFromSSBP- FirstEvent)69 MENUEVENT_ExitMenu equ (BootMenuEvent_Completed- FirstEvent)70 MENUEVENT_ItemHighlightedFromCX equ (EventItemHighlightedFromCX- FirstEvent)71 MENUEVENT_KeyStrokeInAX equ (EventKeyStrokeInAX- FirstEvent)72 MENUEVENT_ItemSelectedFromCX equ (EventItemSelectedFromCX- FirstEvent)73 MENUEVENT_RefreshTitle equ (BootMenuPrint_TitleStrings- FirstEvent)74 MENUEVENT_RefreshInformation equ (BootMenuPrint_RefreshInformation- FirstEvent)75 MENUEVENT_RefreshItemFromCX equ (BootMenuPrint_RefreshItem- FirstEvent)68 MENUEVENT_InitializeMenuinitFromDSSI equ (EventInitializeMenuinitFromSSBP - FirstEvent) 69 MENUEVENT_ExitMenu equ (BootMenuEvent_Completed - FirstEvent) 70 MENUEVENT_ItemHighlightedFromCX equ (EventItemHighlightedFromCX - FirstEvent) 71 MENUEVENT_KeyStrokeInAX equ (EventKeyStrokeInAX - FirstEvent) 72 MENUEVENT_ItemSelectedFromCX equ (EventItemSelectedFromCX - FirstEvent) 73 MENUEVENT_RefreshTitle equ (BootMenuPrint_TitleStrings - FirstEvent) 74 MENUEVENT_RefreshInformation equ (BootMenuPrint_RefreshInformation - FirstEvent) 75 MENUEVENT_RefreshItemFromCX equ (BootMenuPrint_RefreshItem - FirstEvent) 76 76 ; 77 77 ; Note that there is no entry for MENUEVENT_IdleProcessing. If MENUEVENT_IDLEPROCESSING_ENABLE is not %defined, … … 95 95 dw EventNotHandled ; MENUEVENT.IdleProcessing 96 96 dw EventItemHighlightedFromCX ; MENUEVENT.ItemHighlightedFromCX 97 97 98 98 dw EventItemSelectedFromCX ; MENUEVENT.ItemSelectedFromCX 99 99 dw EventKeyStrokeInAX ; MENUEVENT.KeyStrokeInAX -
trunk/XTIDE_Universal_BIOS/Src/Menus/BootMenu/BootMenuPrint.asm
r526 r567 125 125 .around: 126 126 127 mov ax, g_szFddSizeOr 127 mov ax, g_szFddSizeOr ; .PrintXTFloppyType 128 128 test bl, bl ; Two possibilities? (FLOPPY_TYPE_525_OR_35_DD) 129 129 jz SHORT .PushAXAndOutput 130 130 131 mov al, (g_szFddUnknown - $$) & 0xff 131 mov al, (g_szFddUnknown - $$) & 0xff ; .PrintUnknownFloppyType 132 132 cmp bl, FLOPPY_TYPE_35_ED 133 133 ja SHORT .PushAXAndOutput … … 146 146 ; Floppy Drive Types: 147 147 ; 148 ; 149 ; 1 FLOPPY_TYPE_525_DD5 1/4 360K150 ; 2 FLOPPY_TYPE_525_HD5 1/4 1.2M151 ; 3 FLOPPY_TYPE_35_DD3 1/2 720K152 ; 4 FLOPPY_TYPE_35_HD3 1/2 1.44M153 ; 5 3.5" ED on some BIOSes3 1/2 2.88M154 ; 155 ; 148 ; 0 Handled above 149 ; 1 FLOPPY_TYPE_525_DD 5 1/4 360K 150 ; 2 FLOPPY_TYPE_525_HD 5 1/4 1.2M 151 ; 3 FLOPPY_TYPE_35_DD 3 1/2 720K 152 ; 4 FLOPPY_TYPE_35_HD 3 1/2 1.44M 153 ; 5 3.5" ED on some BIOSes 3 1/2 2.88M 154 ; 6 FLOPPY_TYPE_35_ED 3 1/2 2.88M 155 ; >6 Unknown, handled above 156 156 ; 157 157 ;-------------------------------------------------------------------- … … 169 169 xor bh, bh 170 170 mov al,FloppyTypes.rgbCapacityMultiplier 171 mul BYTE [cs:bx+FloppyTypes.rgbCapacity - 1] 171 mul BYTE [cs:bx+FloppyTypes.rgbCapacity - 1] ; -1 since 0 is handled above and not in the table 172 172 173 173 .PushAXAndOutput: -
trunk/XTIDE_Universal_BIOS/Src/Menus/HotkeyBar.asm
r547 r567 372 372 ; ES: BDA segment (zero) 373 373 ; Returns: 374 ; AL:Last scancode seen374 ; AL: Last scancode seen 375 375 ; CF: Set if valid hotkey in AL 376 376 ; Clear if scancode in AL is not for any hotkey -
trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/AccessDPT.asm
r545 r567 173 173 ; Returns: 174 174 ; AX: Translate Mode (TRANSLATEMODE_NORMAL, TRANSLATEMODE_LARGE or TRANSLATEMODE_ASSISTED_LBA) 175 ; 176 ; ZF:Set based on value in AL175 ; unshifted (still shifted where it is in bFlagsLow) 176 ; ZF: Set based on value in AL 177 177 ; Corrupts registers: 178 178 ; Nothing -
trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/AtaGeometry.asm
r549 r567 199 199 dec cx ; CX = 15 200 200 div cx ; AX = (Cylinders * 16) / 15 201 ; Fall to ConvertPCHfromAXB XtoEnhancedCHinAXBX201 ; Fall to ConvertPCHfromAXBLtoEnhancedCHinAXBL 202 202 203 203 -
trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/CreateDPT.asm
r558 r567 109 109 call AtaGeometry_GetPCHStoAXBLBHfromAtaInfoInESSI 110 110 dec dl ; Set ZF if TRANSLATEMODE_LARGE, SF if TRANSLATEMODE_NORMAL 111 js SHORT .NothingToChange 112 jz SHORT .LimitHeadsForLargeAddressingMode 111 jle SHORT .JumpOverSetBitForAssistedLBA 113 112 114 113 ; Set LBA bit for Assisted LBA 115 114 or cl, FLGL_DPT_LBA 116 jmp SHORT .NothingToChange 115 .JumpOverSetBitForAssistedLBA: 116 jnz SHORT .NothingToChange 117 117 118 118 .LimitHeadsForLargeAddressingMode: … … 218 218 ; Since the floppy DPT's come after the hard disk DPT's, without expensive (code size) code to relocate a DPT, 219 219 ; this was necessary. Now, this situation shouldn't happen in normal operation, for a couple of reasons: 220 ; 221 ; 222 ; 220 ; A. xtidecfg always puts configured serial ports at the end of the IDEVARS list 221 ; B. the auto serial code is always executed last 222 ; C. the serial server always returns floppy drives last 223 223 ; 224 224 adc byte [RAMVARS.xlateVars+XLATEVARS.bFlopCreateCnt], 0 -
trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/FindDPT.asm
r526 r567 75 75 jb SHORT .DiskIsNotHandledByThisBIOS 76 76 %endif 77 ; fall-through toCalcDPTForDriveNumber77 ; Fall to .CalcDPTForDriveNumber 78 78 79 79 ;-------------------------------------------------------------------- … … 81 81 ; Not intended to be called except by FindDPT_ForDriveNumberInDL 82 82 ; 83 ; CalcDPTForDriveNumber83 ; .CalcDPTForDriveNumber 84 84 ; Parameters: 85 85 ; DL: Drive number 86 86 ; DS: RAMVARS segment 87 ; DI:Saved copy of AX from entry at FindDPT_ForDriveNumberInDL87 ; DI: Saved copy of AX from entry at FindDPT_ForDriveNumberInDL 88 88 ; Returns: 89 89 ; DS:DI: Ptr to DPT 90 ; CF:Clear90 ; CF: Clear 91 91 ; Corrupts registers: 92 92 ; Nothing … … 136 136 137 137 ;-------------------------------------------------------------------- 138 ; FindDPT_MasterOrSingleForIdevarsOffsetInDL139 ; Parameters:140 ; DL: Offset to IDEVARS to search for141 ; DS: RAMVARS segment142 ; Returns:143 ; DS:DI: Ptr to first DPT with same IDEVARS as in DL144 ; CF: Clear if wanted DPT found145 ; Set if DPT not found, or no DPTs present146 ; Corrupts registers:147 ; SI148 ;--------------------------------------------------------------------149 FindDPT_MasterOrSingleForIdevarsOffsetInDL:150 mov si, IterateFindFirstDPTforIdevars ; iteration routine (see below)151 jmp SHORT FindDPT_IterateAllDPTs ; look for the first drive on this controller, if any152 153 ;--------------------------------------------------------------------154 ; FindDPT_SlaveForIdevarsOffsetInDL155 ; Parameters:156 ; DL: Offset to IDEVARS to search for157 ; DS: RAMVARS segment158 ; Returns:159 ; DS:DI: Ptr to second DPT with same IDEVARS as in DL160 ; CF: Clear if wanted DPT found161 ; Set if DPT not found, or no DPTs present162 ; Corrupts registers:163 ; SI164 ;--------------------------------------------------------------------165 FindDPT_SlaveForIdevarsOffsetInDL:166 mov si, IterateFindSecondDPTforIdevars ; iteration routine (see below)167 jmp SHORT FindDPT_IterateAllDPTs ; look for the second drive on this controller, if any168 169 ;--------------------------------------------------------------------170 138 ; Iteration routines for FindDPT_MasterOrSingleForIdevarsOffsetInDL and 171 139 ; FindDPT_SlaveForIdevarsOffsetInDL, for use with IterateAllDPTs … … 175 143 ; IterateFindSecondDPTforIdevars 176 144 ; IterateFindFirstDPTforIdevars 177 ; 145 ; DL: Offset to IDEVARS to search from DPTs 178 146 ; SI: Offset to this callback function 179 147 ; DS:DI: Ptr to DPT to examine 180 148 ; Returns: 181 ; CF: Clear if wanted DPT found149 ; CF: Cleared if wanted DPT found 182 150 ; Set if wrong DPT 183 151 ;-------------------------------------------------------------------- … … 192 160 IterateFindFirstDPTforIdevars: 193 161 cmp dl, [di+DPT.bIdevarsOffset] ; Clears CF if matched 194 je . done162 je .Done 195 163 stc ; Set CF for not found 196 . done:164 .Done: 197 165 ret 198 166 … … 221 189 %endif 222 190 223 jmp shortFindDPT_ForDriveNumberInDL.CalcDPTForNewDrive191 jmp SHORT FindDPT_ForDriveNumberInDL.CalcDPTForNewDrive 224 192 225 193 ;-------------------------------------------------------------------- … … 227 195 ; Parameters: 228 196 ; DS:DI: Ptr to DPT to examine 229 ; 230 ; Returns: 231 ; CF: Clear if wanted DPT found197 ; BL: Bit(s) to test in DPT.bFlagsHigh 198 ; Returns: 199 ; CF: Cleared if wanted DPT found 232 200 ; Set if wrong DPT 233 201 ; Corrupts registers: 234 202 ; Nothing 235 203 ;-------------------------------------------------------------------- 204 %ifdef MODULE_SERIAL 236 205 ALIGN JUMP_ALIGN 237 206 IterateToDptWithFlagsHighInBL: … … 241 210 .ReturnRightDPT: 242 211 ret 212 %endif 243 213 244 214 ;-------------------------------------------------------------------- … … 248 218 ; Returns: 249 219 ; DS:DI: Ptr to DPT 250 ; CF: Setif wanted DPT found251 ; Cleared if DPT not found220 ; CF: Cleared if wanted DPT found 221 ; Set if DPT not found, or no DPTs present 252 222 ; Corrupts registers: 253 223 ; SI … … 257 227 FindDPT_ToDSDIforSerialDevice: 258 228 mov bl, FLGH_DPT_SERIAL_DEVICE 259 ; fall-through 260 %endif 261 262 ;-------------------------------------------------------------------- 263 ; FindDPT_ToDSDIforFlagsHigh 264 ; Parameters: 265 ; DS: RAMVARS segment 266 ; 229 ; Fall to FindDPT_ToDSDIforFlagsHighInBL 230 %endif 231 232 ;-------------------------------------------------------------------- 233 ; FindDPT_ToDSDIforFlagsHighInBL 234 ; Parameters: 235 ; DS: RAMVARS segment 236 ; BL: Bit(s) to test in DPT.bFlagsHigh 267 237 ; Returns: 268 238 ; DS:DI: Ptr to DPT 269 ; CF: Setif wanted DPT found270 ; Cleared if DPT not found239 ; CF: Cleared if wanted DPT found 240 ; Set if DPT not found, or no DPTs present 271 241 ; Corrupts registers: 272 242 ; SI 273 243 ;-------------------------------------------------------------------- 274 %ifdef MODULE_IRQ 275 ALIGN JUMP_ALIGN 276 FindDPT_ToDSDIforFlagsHighInBL: 277 %endif 244 %ifdef MODULE_SERIAL 245 ;%ifdef MODULE_IRQ 246 ;ALIGN JUMP_ALIGN 247 ;FindDPT_ToDSDIforFlagsHighInBL: ; This label is unused 248 ;%endif 278 249 mov si, IterateToDptWithFlagsHighInBL 279 ; Fall to IterateAllDPTs 250 jmp SHORT FindDPT_IterateAllDPTs 251 %endif 252 253 ;-------------------------------------------------------------------- 254 ; FindDPT_MasterOrSingleForIdevarsOffsetInDL 255 ; Parameters: 256 ; DL: Offset to IDEVARS to search for 257 ; DS: RAMVARS segment 258 ; Returns: 259 ; DS:DI: Ptr to first DPT with same IDEVARS as in DL 260 ; CF: Cleared if wanted DPT found 261 ; Set if DPT not found, or no DPTs present 262 ; Corrupts registers: 263 ; SI 264 ;-------------------------------------------------------------------- 265 FindDPT_MasterOrSingleForIdevarsOffsetInDL: 266 mov si, IterateFindFirstDPTforIdevars 267 jmp SHORT FindDPT_IterateAllDPTs 268 269 ;-------------------------------------------------------------------- 270 ; FindDPT_SlaveForIdevarsOffsetInDL 271 ; Parameters: 272 ; DL: Offset to IDEVARS to search for 273 ; DS: RAMVARS segment 274 ; Returns: 275 ; DS:DI: Ptr to second DPT with same IDEVARS as in DL 276 ; CF: Cleared if wanted DPT found 277 ; Set if DPT not found, or no DPTs present 278 ; Corrupts registers: 279 ; SI 280 ;-------------------------------------------------------------------- 281 FindDPT_SlaveForIdevarsOffsetInDL: 282 mov si, IterateFindSecondDPTforIdevars 283 ; Fall to FindDPT_IterateAllDPTs 280 284 281 285 ;-------------------------------------------------------------------- … … 286 290 ; AX,BX,DX: Parameters to callback function 287 291 ; CS:SI: Ptr to callback function 288 ; 292 ; Callback routine should return CF=clear if found 289 293 ; DS: RAMVARS segment 290 294 ; Returns: 291 295 ; DS:DI: Ptr to wanted DPT (if found) 292 296 ; If not found, points to first empty DPT 293 ; CF: Clear if wanted DPT found297 ; CF: Cleared if wanted DPT found 294 298 ; Set if DPT not found, or no DPTs present 295 299 ; Corrupts registers: -
trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/RamVars.asm
r556 r567 44 44 ; DS: RAMVARS segment 45 45 ; Corrupts registers: 46 ; AX 46 ; AX, CL 47 47 ;-------------------------------------------------------------------- 48 48 .StealMemoryForRAMVARS: … … 56 56 mov al, [cs:ROMVARS.bStealSize] 57 57 sub [BDA.wBaseMem], ax 58 mov ax, [BDA.wBaseMem] ; We can save a byte here by using INT 12h instead 59 eSHL_IM ax, 6 ; Segment to first stolen kB (*=40h) 58 mov ax, [BDA.wBaseMem] 59 %ifdef USE_186 60 shl ax, 6 ; Segment to first stolen kB (*=40h) 61 %else 62 mov cl, 6 63 shl ax, cl 64 %endif 60 65 ; Fall to .InitializeRamvars 61 66 … … 186 191 ; Returns: 187 192 ; AL: First floppy drive number supported 188 ; 193 ; CF: Number of floppy drives supported (clear = 1, set = 2) 189 194 ; SF: Emulating drives (clear = yes, set = no) 190 195 ; Corrupts registers:
Note:
See TracChangeset
for help on using the changeset viewer.