Changeset 258 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src
- Timestamp:
- Feb 22, 2012, 7:01:53 PM (13 years ago)
- google:author:
- gregli@hotmail.com
- Location:
- trunk/XTIDE_Universal_BIOS/Src
- Files:
-
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenu.asm
r248 r258 37 37 ; Clear: There is no selected menu item, DL is not valid 38 38 ; Corrupts registers: 39 ; CX, DI39 ; AX, DI 40 40 ;-------------------------------------------------------------------- 41 41 ALIGN JUMP_ALIGN … … 50 50 51 51 mov dl, cl ; Copy menuitem index to DX 52 call FloppyDrive_GetCountTo CX53 cmp dl, cl ; Floppy drive?52 call FloppyDrive_GetCountToAX 53 cmp dl, al ; Floppy drive? 54 54 jb SHORT .ReturnFloppyDriveInDX ; Set CF if branch taken 55 or cl, 80h ; Or 80h into CL before the sub55 or al, 80h ; Or 80h into AL before the sub 56 56 ; to cause CF to be set after 57 57 ; and result has high order bit set 58 sub dl, cl ; Remove floppy drives from index58 sub dl, al ; Remove floppy drives from index 59 59 60 60 .ReturnFloppyDriveInDX: … … 94 94 ALIGN JUMP_ALIGN 95 95 BootMenu_GetMenuitemCountToAX: 96 call RamVars_GetHardDiskCountFromBDAto CX96 call RamVars_GetHardDiskCountFromBDAtoAX 97 97 xchg ax, cx 98 call FloppyDrive_GetCountTo CX98 call FloppyDrive_GetCountToAX 99 99 add ax, cx 100 100 ret … … 136 136 BootMenu_GetMenuitemToAXforAsciiHotkeyInAL: 137 137 call Char_ALtoUpperCaseLetter 138 call BootMenu_GetLetterForFirstHardDiskToCL139 138 xor ah, ah 140 cmp al, cl ; Letter is for Hard Disk? 139 xchg ax, cx 140 call BootMenu_GetLetterForFirstHardDiskToAL 141 cmp cl, al ; Letter is for Hard Disk? 141 142 jae SHORT .StartFromHardDiskLetter 143 xchg ax, cx 142 144 sub al, 'A' ; Letter to Floppy Drive menuitem 143 145 ret 144 146 ALIGN JUMP_ALIGN 145 147 .StartFromHardDiskLetter: 146 sub al, cl ; Hard Disk index147 call FloppyDrive_GetCountTo CX148 sub cl, al ; Hard Disk index 149 call FloppyDrive_GetCountToAX 148 150 add ax, cx ; Menuitem index 151 ; Note: no need to xchg ax, cx as above, since adding with result to ax 149 152 ret 150 153 … … 160 163 ; CL: Upper case letter for first hard disk 161 164 ; Corrupts registers: 162 ; CH163 ;-------------------------------------------------------------------- 164 ALIGN JUMP_ALIGN 165 BootMenu_GetLetterForFirstHardDiskTo CL:166 call FloppyDrive_GetCountTo CX167 add cl, 'A'168 cmp cl, 'C'165 ; AX 166 ;-------------------------------------------------------------------- 167 ALIGN JUMP_ALIGN 168 BootMenu_GetLetterForFirstHardDiskToAL: 169 call FloppyDrive_GetCountToAX 170 add al, 'A' 171 cmp al, 'C' 169 172 ja .Return 170 mov cl, 'C'173 mov al, 'C' 171 174 ALIGN JUMP_ALIGN, ret 172 175 .Return: … … 181 184 ; DX: Menuitem index (assuming drive is available) 182 185 ; Corrupts registers: 183 ; Nothing186 ; AX 184 187 ;-------------------------------------------------------------------- 185 188 ALIGN JUMP_ALIGN … … 188 191 test dl, dl 189 192 jns SHORT .ReturnItemIndexInDX ; Return if floppy drive (HD bit not set) 190 call FloppyDrive_GetCountTo CX193 call FloppyDrive_GetCountToAX 191 194 and dl, ~80h ; Clear HD bit 192 add dx, cx195 add dx, ax 193 196 .ReturnItemIndexInDX: 194 197 ret … … 212 215 test dl, dl ; Floppy drive? 213 216 jns SHORT .IsFloppyDriveInSystem 214 call RamVars_GetHardDiskCountFromBDAto CX ; Hard Disk count to CX215 or cl, 80h ; Set Hard Disk bit to CX217 call RamVars_GetHardDiskCountFromBDAtoAX ; Hard Disk count to AX 218 or al, 80h ; Set Hard Disk bit to AX 216 219 jmp SHORT .CompareDriveNumberToDriveCount 217 220 .IsFloppyDriveInSystem: 218 call FloppyDrive_GetCountTo CX221 call FloppyDrive_GetCountToAX 219 222 .CompareDriveNumberToDriveCount: 220 cmp dl, cl ; Set CF when DL is smaller221 ret 223 cmp dl, al ; Set CF when DL is smaller 224 ret -
trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenuEvent.asm
r248 r258 21 21 %ifdef MENUEVENT_INLINE_OFFSETS 22 22 23 add bx, BootMenuEvent_Handler 23 add bx, BootMenuEvent_Handler.FirstEvent 24 24 jmp bx 25 25 26 MENUEVENT_InitializeMenuinitFromDSSI equ (BootMenuEvent_Handler.InitializeMenuinitFromDSSI - BootMenuEvent_Handler )27 MENUEVENT_ExitMenu equ (BootMenuEvent_EventCompleted - BootMenuEvent_Handler )28 MENUEVENT_ItemHighlightedFromCX equ (BootMenuEvent_Handler.ItemHighlightedFromCX - BootMenuEvent_Handler )29 MENUEVENT_ItemSelectedFromCX equ (BootMenuEvent_Handler.ItemSelectedFromCX - BootMenuEvent_Handler )30 MENUEVENT_KeyStrokeInAX equ (BootMenuEvent_Handler.KeyStrokeInAX - BootMenuEvent_Handler )31 MENUEVENT_RefreshTitle equ (BootMenuPrint_TitleStrings - BootMenuEvent_Handler )32 MENUEVENT_RefreshInformation equ (BootMenuPrint_RefreshInformation - BootMenuEvent_Handler )33 MENUEVENT_RefreshItemFromCX equ (BootMenuPrint_RefreshItem - BootMenuEvent_Handler )26 MENUEVENT_InitializeMenuinitFromDSSI equ (BootMenuEvent_Handler.InitializeMenuinitFromDSSI - BootMenuEvent_Handler.FirstEvent) 27 MENUEVENT_ExitMenu equ (BootMenuEvent_EventCompleted - BootMenuEvent_Handler.FirstEvent) 28 MENUEVENT_ItemHighlightedFromCX equ (BootMenuEvent_Handler.ItemHighlightedFromCX - BootMenuEvent_Handler.FirstEvent) 29 MENUEVENT_ItemSelectedFromCX equ (BootMenuEvent_Handler.ItemSelectedFromCX - BootMenuEvent_Handler.FirstEvent) 30 MENUEVENT_KeyStrokeInAX equ (BootMenuEvent_Handler.KeyStrokeInAX - BootMenuEvent_Handler.FirstEvent) 31 MENUEVENT_RefreshTitle equ (BootMenuPrint_TitleStrings - BootMenuEvent_Handler.FirstEvent) 32 MENUEVENT_RefreshInformation equ (BootMenuPrint_RefreshInformation - BootMenuEvent_Handler.FirstEvent) 33 MENUEVENT_RefreshItemFromCX equ (BootMenuPrint_RefreshItem - BootMenuEvent_Handler.FirstEvent) 34 34 ; 35 35 ; Note that there is no entry for MENUEVENT_IdleProcessing. If MENUEVENT_IDLEPROCESSING_ENABLE is not %defined, … … 67 67 ; DS:SI: Ptr to initialized MENUINIT struct 68 68 ALIGN JUMP_ALIGN 69 .FirstEvent: 69 70 .InitializeMenuinitFromDSSI: 70 71 push ds -
trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenuPrint.asm
r255 r258 24 24 25 25 call RamVars_IsDriveHandledByThisBIOS 26 j nc .notOurs26 jc .notOurs 27 27 28 28 call FindDPT_ForDriveNumber ; if it is one of ours, print the string in bootnfo … … 47 47 push ax ; the hard disks don't ever use it, but it does no harm) 48 48 49 jmp short BootMenuPrint_ FormatCSSIfromParamsInSSBP49 jmp short BootMenuPrint_RefreshInformation.FormatRelay 50 50 51 51 ;-------------------------------------------------------------------- … … 87 87 push bp 88 88 mov bp,sp 89 jmp short BootMenuPrint_ FormatCSSIfromParamsInSSBP89 jmp short BootMenuPrint_RefreshInformation.FormatRelay 90 90 91 91 … … 110 110 mov bp, sp 111 111 112 mov si, g_szCapacity ; Setup print string now, carries through to print call 113 114 xor di, di 115 call RamVars_IsDriveHandledByThisBIOS 116 jc SHORT .notours 117 call FindDPT_ForDriveNumber ; DS:DI to point DPT 118 .notours: 119 112 120 test dl, dl ; are we a hard disk? 113 121 js BootMenuPrint_HardDiskRefreshInformation 114 122 123 test di,di 124 jnz .ours 115 125 call FloppyDrive_GetType ; Get Floppy Drive type to BX 126 jmp .around 127 .ours: 128 call AH8h_GetDriveParameters 129 .around: 116 130 117 131 mov ax, g_szFddSizeOr ; .PrintXTFloppyType 118 test b x, bx; Two possibilities? (FLOPPY_TYPE_525_OR_35_DD)132 test bl, bl ; Two possibilities? (FLOPPY_TYPE_525_OR_35_DD) 119 133 jz SHORT .PushAXAndOutput 120 134 … … 158 172 159 173 mov al,FloppyTypes.rgbCapacityMultiplier 174 mov bh, 0 160 175 mul byte [cs:bx+FloppyTypes.rgbCapacity - 1] ; -1 since 0 is handled above and not in the table 161 176 … … 163 178 push ax 164 179 165 jmp short BootMenuPrint_HardDiskRefreshInformation.output 180 .FormatRelay: 181 jmp short BootMenuPrint_FormatCSSIfromParamsInSSBP 166 182 167 183 … … 180 196 ALIGN JUMP_ALIGN 181 197 BootMenuPrint_HardDiskRefreshInformation: 182 call RamVars_IsDriveHandledByThisBIOS 183 jnc SHORT .HardDiskMenuitemInfoForForeignDrive 184 call FindDPT_ForDriveNumber ; DS:DI to point DPT 185 ; Fall to .HardDiskMenuitemInfoForOurDrive 186 187 ;-------------------------------------------------------------------- 188 ; .HardDiskMenuitemInfoForOurDrive 189 ; Parameters: 190 ; DL: Untranslated Hard Disk number 191 ; DS:DI: Ptr to DPT 192 ; Returns: 193 ; Nothing 194 ; Corrupts registers: 195 ; AX, BX, CX, DX, SI, DI, ES 196 ;-------------------------------------------------------------------- 198 test di,di 199 jz .HardDiskMenuitemInfoForForeignDrive 200 197 201 .HardDiskMenuitemInfoForOurDrive: 198 202 ePUSH_T ax, g_szInformation … … 200 204 ; Get and push total LBA size 201 205 call BootMenuInfo_GetTotalSectorCount 202 call ConvertSectorCountInBXDXAXtoSizeAndPushForFormat 203 jmp BootMenuPrintCfg_ForOurDrive 204 205 ;-------------------------------------------------------------------- 206 ; .HardDiskMenuitemInfoForForeignDrive 207 ; Parameters: 208 ; DL: Untranslated Hard Disk number 209 ; DS: RAMVARS segment 210 ; Returns: 211 ; CF: Set since menu event was handled successfully 212 ; Corrupts registers: 213 ; AX, BX, CX, DX, SI, DI 214 ;-------------------------------------------------------------------- 215 ALIGN JUMP_ALIGN 206 jmp .ConvertSectorCountInBXDXAXtoSizeAndPushForFormat 207 216 208 .HardDiskMenuitemInfoForForeignDrive: 217 209 call DriveXlate_ToOrBack 218 210 call AH15h_GetSectorCountFromForeignDriveToDXAX 219 call ConvertSectorCountInBXDXAXtoSizeAndPushForFormat 220 221 ALIGN JUMP_ALIGN 222 .output: 223 mov si, g_szCapacity 224 ;;; fall-through 211 212 .ConvertSectorCountInBXDXAXtoSizeAndPushForFormat: 213 ePUSH_T cx, g_szCapacityNum ; Push format substring 214 call Size_ConvertSectorCountInBXDXAXtoKiB 215 mov cx, BYTE_MULTIPLES.kiB 216 call Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX 217 push ax ; Size in magnitude 218 push cx ; Tenths 219 push dx ; Magnitude character 220 221 test di,di 222 jz short BootMenuPrint_FormatCSSIfromParamsInSSBP 223 224 %include "BootMenuPrintCfg.asm" ; inline of code to fill out remainder of information string 225 226 ;;; fall-through to BootMenuPrint_FormatCSSIfromParamsInSSBP 227 225 228 226 229 ;-------------------------------------------------------------------- … … 273 276 ALIGN JUMP_ALIGN 274 277 BootMenuPrint_TheBottomOfScreen: 275 call FloppyDrive_GetCountTo CX276 mov bl, cl; Floppy Drive count to BL277 call RamVars_GetHardDiskCountFromBDAto CX278 mov bh, cl ; Hard Disk count to BH278 call FloppyDrive_GetCountToAX 279 xchg bx, ax ; Floppy Drive count to BL 280 call RamVars_GetHardDiskCountFromBDAtoAX 281 mov bh, al ; Hard Disk count to BH 279 282 ; Fall to .MoveCursorToHotkeyStrings 280 283 … … 321 324 test bh, bh ; Any Hard Drives? 322 325 jz SHORT .SkipHardDriveHotkeys 323 xchg ax, cx ; Store Key Attribute 324 call BootMenu_GetLetterForFirstHardDiskToCL 325 mov ch, ANGLE_QUOTE_RIGHT 326 xchg ax, cx 326 call BootMenu_GetLetterForFirstHardDiskToAL 327 mov ah, ANGLE_QUOTE_RIGHT 327 328 mov si, g_szHDD 328 329 call PushHotkeyParamsAndFormat … … 390 391 CALL_DISPLAY_LIBRARY InitializeDisplayContext 391 392 ret 392 393 394 ;--------------------------------------------------------------------395 ; ConvertSectorCountInBXDXAXtoSizeAndPushForFormat396 ; Parameters:397 ; BX:DX:AX: Sector count398 ; Returns:399 ; Size in stack400 ; Corrupts registers:401 ; AX, BX, CX, DX, SI402 ;--------------------------------------------------------------------403 ALIGN JUMP_ALIGN404 ConvertSectorCountInBXDXAXtoSizeAndPushForFormat:405 pop si ; Pop return address406 ePUSH_T cx, g_szCapacityNum ; Push format substring407 call Size_ConvertSectorCountInBXDXAXtoKiB408 mov cx, BYTE_MULTIPLES.kiB409 call Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX410 push ax ; Size in magnitude411 push cx ; Tenths412 push dx ; Magnitude character413 jmp si414 393 415 394 -
trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenuPrintCfg.asm
r241 r258 2 2 ; Description : Functions for printing drive configuration 3 3 ; information on Boot Menu. 4 4 ; 5 ; Included by BootMenuPrint.asm, this routine is to be inserted into 6 ; BootMenuPrint_HardDiskRefreshInformation. 7 ; 5 8 ; Section containing code 6 9 SECTION .text 10 11 ;;; fall-into from BootMenuPrint_HardDiskRefreshInformation. 7 12 8 13 ;-------------------------------------------------------------------- … … 16 21 ; Nothing 17 22 ; Corrupts registers: 18 ; AX, BX, CX, DX , SI, DI23 ; AX, BX, CX, DX 19 24 ;-------------------------------------------------------------------- 20 ALIGN JUMP_ALIGN 21 BootMenuPrintCfg_ForOurDrive: 25 .BootMenuPrintCfg_ForOurDrive: 22 26 eMOVZX ax, BYTE [di+DPT.bIdevarsOffset] 23 xchg si, ax ; CS:SInow points to IDEVARS27 xchg bx, ax ; CS:BX now points to IDEVARS 24 28 ; Fall to .PushAndFormatCfgString 25 29 … … 28 32 ; Parameters: 29 33 ; DS:DI: Ptr to DPT 30 ; CS: SI: Ptr to IDEVARS34 ; CS:BX: Ptr to IDEVARS 31 35 ; Returns: 32 36 ; Nothing (jumps to next push below) 33 37 ; Corrupts registers: 34 ; AX, BX38 ; AX, CX 35 39 ;-------------------------------------------------------------------- 36 40 .PushAddressingMode: … … 41 45 ;; with AL clear, and so we exchange AL and AH after the multiply for the final result. 42 46 ;; 43 mov bl,(1<<(8-ADDRESSING_MODE_FIELD_POSITION)) * g_szAddressingModes_Displacement44 mul bl47 mov cl,(1<<(8-ADDRESSING_MODE_FIELD_POSITION)) * g_szAddressingModes_Displacement 48 mul cl 45 49 xchg al,ah 46 50 add ax,g_szAddressingModes … … 51 55 ; Parameters: 52 56 ; DS:DI: Ptr to DPT 53 ; CS: SI: Ptr to IDEVARS57 ; CS:BX: Ptr to IDEVARS 54 58 ; Returns: 55 59 ; Nothing (falls to next push below) … … 69 73 ; Parameters: 70 74 ; DS:DI: Ptr to DPT 71 ; CS: SI: Ptr to IDEVARS75 ; CS:BX: Ptr to IDEVARS 72 76 ; Returns: 73 77 ; Nothing (jumps to next push below) … … 77 81 .PushBusType: 78 82 mov al,g_szBusTypeValues_Displacement 79 mul BYTE [cs: si+IDEVARS.bDevice]83 mul BYTE [cs:bx+IDEVARS.bDevice] 80 84 81 85 shr ax,1 ; divide by 2 since IDEVARS.bDevice is multiplied by 2 … … 88 92 ; Parameters: 89 93 ; DS:DI: Ptr to DPT 90 ; CS: SI: Ptr to IDEVARS94 ; CS:BX: Ptr to IDEVARS 91 95 ; Returns: 92 96 ; Nothing (falls to next push below) … … 95 99 ;-------------------------------------------------------------------- 96 100 .PushIRQ: 97 mov al, BYTE [cs: si+IDEVARS.bIRQ]101 mov al, BYTE [cs:bx+IDEVARS.bIRQ] 98 102 cbw 99 103 push ax … … 103 107 ; Parameters: 104 108 ; DS:DI: Ptr to DPT 105 ; CS: SI: Ptr to IDEVARS109 ; CS:BX: Ptr to IDEVARS 106 110 ; Returns: 107 111 ; Nothing (falls to next push below) … … 114 118 push ax 115 119 116 ;-------------------------------------------------------------------- 117 ; PrintValuesFromStack 118 ; Parameters: 119 ; Stack: All formatting parameters 120 ; Returns: 121 ; Nothing 122 ; Corrupts registers: 123 ; AX, SI, DI 124 ;-------------------------------------------------------------------- 125 .PrintValuesFromStack: 126 jmp BootMenuPrint_HardDiskRefreshInformation.output 127 120 ;;; fall-out to BootMenuPrint_HardDiskRefreshInformation. -
trunk/XTIDE_Universal_BIOS/Src/Device/Device.asm
r249 r258 37 37 %ifdef MODULE_SERIAL 38 38 Device_FinalizeDPT: 39 TEST_USIGN_DPT_AND_JUMP_IF_SERIAL_DEVICE .FinalizeDptForSerialPortDevice 39 ; needs to check IDEVARS vs. checking the DPT as the serial bit in the DPT is set in the Finalize routine 40 CMP_USING_IDEVARS_IN_CSBP_AND_JUMP_IF DEVICE_SERIAL_PORT, .FinalizeDptForSerialPortDevice 40 41 jmp IdeDPT_Finalize 41 .FinalizeDptForSerialPortDevice: 42 .FinalizeDptForSerialPortDevice: 42 43 jmp SerialDPT_Finalize 43 44 -
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeDPT.asm
r242 r258 12 12 ; CS:BP: Ptr to IDEVARS for the controller 13 13 ; Returns: 14 ; Nothing14 ; CF: Clear, IDE interface only supports hard disks 15 15 ; Corrupts registers: 16 16 ; AX … … 42 42 ; CS:BP: Ptr to IDEVARS for the controller 43 43 ; Returns: 44 ; Nothing44 ; CF: Always clear, we don't support floppies on the IDE inteface 45 45 ; Corrupts registers: 46 46 ; Nothing … … 52 52 53 53 .EndDPT: 54 clc 54 55 ret -
trunk/XTIDE_Universal_BIOS/Src/Device/Serial/SerialCommand.asm
r242 r258 56 56 ; Returns: 57 57 ; AH: INT 13h Error Code 58 ; CX: Number of successfully transferred sectors (for transfer commands) 58 59 ; CF: Cleared if success, Set if error 59 60 ; Corrupts registers: … … 309 310 dec al ; decrement sector count 310 311 push ax ; save 311 jz SerialCommand_OutputWithParameters_ReturnCodeInAL CF ; CF=0 from "cmp ax,bp" returning Zero above312 jz SerialCommand_OutputWithParameters_ReturnCodeInAL 312 313 313 314 cli ; interrupts back off for ACK byte to host … … 409 410 410 411 .clearBufferComplete: 411 stc 412 mov al,1 413 414 ALIGN JUMP_ALIGN 415 SerialCommand_OutputWithParameters_ReturnCodeInALCF: 412 mov al, 3 ; error return code and CF (low order bit) 413 414 ALIGN JUMP_ALIGN 415 SerialCommand_OutputWithParameters_ReturnCodeInAL: 416 416 %if 0 417 417 sti ; all paths here will already have interrupts turned back on 418 418 %endif 419 mov ah, al420 421 pop b p ; recover ax (command and count) from stack, throw away419 mov ah, al ; for success, AL will already be zero 420 421 pop bx ; recover "ax" (command and count) from stack 422 422 423 423 pop bp 424 424 pop di 425 425 pop si 426 427 mov ch, 0 428 mov cl,[bp+IDEPACK.bSectorCount] 429 sub cl, bl ; subtract off the number of sectors that remained 430 431 shr ah, 1 ; shift down return code and CF 426 432 427 433 ret … … 632 638 call FindDPT_ToDSDIforSerialDevice 633 639 pop si 640 %ifdef MODULE_SERIAL_FLOPPY 641 jc .founddpt 642 ; 643 ; If not found above with FindDPT_ToDSDIforSerialDevice, DI will point to the DPT after the last hard disk DPT 644 ; 645 cmp byte [RAMVARS.xlateVars+XLATEVARS.bFlopCntAndFirst], 0 646 jz .notfounddpt 647 .founddpt: 648 %else 634 649 jnc .notfounddpt 650 %endif 635 651 mov ax, [di+DPT_SERIAL.wSerialPortAndBaud] 636 652 .notfounddpt: … … 678 694 ; which is read by FinalizeDPT and DetectDrives 679 695 ; 680 mov [es:si+ATA6.w Vendor],dx696 mov [es:si+ATA6.wSerialPortAndBaud],dx 681 697 682 698 .notFound: -
trunk/XTIDE_Universal_BIOS/Src/Device/Serial/SerialDPT.asm
r242 r258 11 11 ; ES:SI: Ptr to 512-byte ATA information read from the drive 12 12 ; Returns: 13 ; Nothing 13 ; CF: Set, indicates that this is a floppy disk 14 ; Clear, indicates that this is a hard disk 14 15 ; Corrupts registers: 15 16 ; AX 16 17 ;-------------------------------------------------------------------- 17 18 SerialDPT_Finalize: 18 or byte [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE 19 mov ax, [es:si+ATA6.wVendor] 19 mov ax, [es:si+ATA6.wSerialPortAndBaud] 20 20 mov [di+DPT_SERIAL.wSerialPortAndBaud], ax 21 22 ; 23 ; Note that this section is not under %ifdef MODULE_SERIAL_FLOPPY. It is important to 24 ; detect floppy disks presented by the server and not treat them like hard disks, even 25 ; if the floppy support is disabled. 26 ; 27 mov al, [es:si+ATA6.wSerialFloppyFlagAndType] 28 or al, FLGH_DPT_SERIAL_DEVICE 29 or byte [di+DPT.bFlagsHigh], al 30 31 test al, FLGH_DPT_SERIAL_FLOPPY ; clears CF 32 jz .notfloppy 33 stc 34 .notfloppy: 35 21 36 ret 22 37 -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h.asm
r249 r258 29 29 mov [RAMVARS.xlateVars+XLATEVARS.bXlatedDrv], dl 30 30 call RamVars_IsFunctionHandledByThisBIOS 31 jnc SHORT Int13h_DirectCallToAnotherBios 31 jc SHORT Int13h_DirectCallToAnotherBios 32 32 33 call FindDPT_ForDriveNumber ; DS:DI now points to DPT 33 34 … … 139 140 ALIGN JUMP_ALIGN 140 141 Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH: 142 %ifdef MODULE_SERIAL_FLOPPY 143 mov al, [bp+IDEPACK.intpack+INTPACK.dl] 144 Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH_ALHasDriveNumber: 145 call Int13h_SetErrorCodeToBdaAndToIntpackInSSBPfromAH_ALHasDriveNumber 146 %else 141 147 call Int13h_SetErrorCodeToBdaAndToIntpackInSSBPfromAH 148 %endif 142 149 Int13h_ReturnFromHandlerWithoutStoringErrorCode: 143 150 or WORD [bp+IDEPACK.intpack+INTPACK.flags], FLG_FLAGS_IF ; Return with interrupts enabled … … 154 161 ; Returns: 155 162 ; Depends on function 163 ; NOTE: ES:DI needs to be returned from the previous interrupt 164 ; handler, for floppy DPT in function 08h 156 165 ; Corrupts registers: 157 ; BX, DI, ES166 ; None 158 167 ;-------------------------------------------------------------------- 159 168 ALIGN JUMP_ALIGN 160 169 Int13h_CallPreviousInt13hHandler: 161 push di162 170 call ExchangeCurrentInt13hHandlerWithOldInt13hHandler 163 171 int BIOS_DISK_INTERRUPT_13h 164 call ExchangeCurrentInt13hHandlerWithOldInt13hHandler 165 pop di 166 ret 167 172 ;;; fall-through to ExchangeCurrentInt13hHandlerWithOldInt13hHandler 168 173 169 174 ;-------------------------------------------------------------------- … … 174 179 ; Nothing 175 180 ; Corrupts registers: 176 ; DI 181 ; Nothing 182 ; Note: Flags are preserved 177 183 ;-------------------------------------------------------------------- 178 184 ALIGN JUMP_ALIGN 179 185 ExchangeCurrentInt13hHandlerWithOldInt13hHandler: 180 186 push es 181 LOAD_BDA_SEGMENT_TO es, di 182 mov di, [RAMVARS.fpOldI13h] 187 push si 188 LOAD_BDA_SEGMENT_PRESERVE_FLAGS_TO es, si 189 mov si, [RAMVARS.fpOldI13h] 183 190 cli 184 xchg di, [es:BIOS_DISK_INTERRUPT_13h*4]185 mov [RAMVARS.fpOldI13h], di186 mov di, [RAMVARS.fpOldI13h+2]187 xchg di, [es:BIOS_DISK_INTERRUPT_13h*4+2]191 xchg si, [es:BIOS_DISK_INTERRUPT_13h*4] 192 mov [RAMVARS.fpOldI13h], si 193 mov si, [RAMVARS.fpOldI13h+2] 194 xchg si, [es:BIOS_DISK_INTERRUPT_13h*4+2] 188 195 sti 189 mov [RAMVARS.fpOldI13h+2], di 196 mov [RAMVARS.fpOldI13h+2], si 197 pop si 190 198 pop es 191 199 ret … … 204 212 ;-------------------------------------------------------------------- 205 213 ALIGN JUMP_ALIGN 214 %ifdef MODULE_SERIAL_FLOPPY 215 Int13h_SetErrorCodeToBdaAndToIntpackInSSBPfromAH_ALHasDriveNumber: 216 ; Store error code to BDA 217 mov bx, BDA.bHDLastSt 218 test al, al 219 js .HardDisk 220 mov bl, BDA.bFDRetST & 0xff 221 .HardDisk: 222 LOAD_BDA_SEGMENT_TO ds, di 223 mov [bx], ah 224 %else 206 225 Int13h_SetErrorCodeToBdaAndToIntpackInSSBPfromAH: 207 226 ; Store error code to BDA 208 LOAD_BDA_SEGMENT_TO ds, di 227 LOAD_BDA_SEGMENT_TO ds, di 209 228 mov [BDA.bHDLastSt], ah 229 %endif 210 230 211 231 ; Store error code to INTPACK -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH0h_HReset.asm
r152 r258 22 22 eMOVZX bx, dl ; Copy requested drive to BL, zero BH to assume no errors 23 23 call ResetFloppyDrivesWithInt40h 24 test bl, bl25 jns SHORT .SkipHardDiskReset26 24 call ResetForeignHardDisks 27 25 call AH0h_ResetHardDisksHandledByOurBIOS … … 64 62 xor ah, ah ; Disk Controller Reset 65 63 call Int13h_CallPreviousInt13hHandler 66 jmp SHORT BackupErrorCodeFromTheRequestedDriveToBH 67 64 ;;; fall-through to BackupErrorCodeFromTheRequestedDriveToBH 65 66 67 ;-------------------------------------------------------------------- 68 ; BackupErrorCodeFromTheRequestedDriveToBH 69 ; Parameters: 70 ; AH: Error code from the last resetted drive 71 ; DL: Drive last resetted 72 ; BL: Requested drive (DL when entering AH=00h) 73 ; Returns: 74 ; BH: Backuped error code 75 ; Corrupts registers: 76 ; Nothing 77 ;-------------------------------------------------------------------- 78 ALIGN JUMP_ALIGN 79 BackupErrorCodeFromTheRequestedDriveToBH: 80 cmp dl, bl ; Requested drive? 81 eCMOVE bh, ah 82 ret 83 68 84 69 85 ;-------------------------------------------------------------------- … … 82 98 mov dl, bl 83 99 call RamVars_IsDriveHandledByThisBIOS 84 j nc SHORT .Return ; Return what was in BL unmodified100 jc SHORT .Return ; Return what was in BL unmodified 85 101 mov dl, 80h 86 102 .Return: … … 101 117 ALIGN JUMP_ALIGN 102 118 AH0h_ResetHardDisksHandledByOurBIOS: 103 mov d h, [RAMVARS.bDrvCnt] ; Load drive count to DH119 mov dx, [RAMVARS.wDrvCntAndFirst] ; DL = drive number, DH = drive count 104 120 test dh, dh 105 121 jz SHORT .AllDrivesReset ; Return if no drives 106 mov dl, [RAMVARS.bFirstDrv] ; Load number of our first drive107 122 add dh, dl ; DH = one past last drive to reset 108 123 ALIGN JUMP_ALIGN … … 114 129 jb SHORT .DriveResetLoop ; If not, reset next drive 115 130 .AllDrivesReset: 116 ret 117 131 %ifdef MODULE_SERIAL_FLOPPY 132 ; 133 ; "Reset" emulatd serial floppy drives, if any. There is nothing to actually do for this reset, 134 ; but record the proper error return code if one of these floppy drives is the drive requested. 135 ; 136 call RamVars_UnpackFlopCntAndFirstToAL 137 138 cbw ; Clears AH (there are flop drives) or ffh (there are not) 139 ; Either AH has success code (flop drives are present) 140 ; or it doesn't matter because we won't match drive ffh 141 142 cwd ; clears DX (there are flop drives) or ffffh (there are not) 143 144 adc dl, al ; second drive (CF set) if present 145 ; If no drive is present, this will result in ffh which 146 ; won't match a drive 147 call BackupErrorCodeFromTheRequestedDriveToBH 148 mov dl, al ; We may end up doing the first drive twice (if there is 149 jmp BackupErrorCodeFromTheRequestedDriveToBH ; only one drive), but doing it again is not harmful. 150 %else 151 ret 152 %endif 153 118 154 ;-------------------------------------------------------------------- 119 155 ; .BackupErrorCodeFromMasterOrSlaveToBH … … 144 180 ret 145 181 182 146 183 ;-------------------------------------------------------------------- 147 184 ; GetBasePortToCX … … 167 204 168 205 169 ;--------------------------------------------------------------------170 ; BackupErrorCodeFromTheRequestedDriveToBH171 ; Parameters:172 ; AH: Error code from the last resetted drive173 ; DL: Drive last resetted174 ; BL: Requested drive (DL when entering AH=00h)175 ; Returns:176 ; BH: Backuped error code177 ; Corrupts registers:178 ; Nothing179 ;--------------------------------------------------------------------180 ALIGN JUMP_ALIGN181 BackupErrorCodeFromTheRequestedDriveToBH:182 cmp dl, bl ; Requested drive?183 eCMOVE bh, ah184 ret -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH15h_HSize.asm
r257 r258 15 15 ; Returns with INTPACK: 16 16 ; If succesfull: 17 ; AH: 3 (Hard disk accessible) 17 ; AH: Hard Disk: 3 (Hard disk accessible) 18 ; Floppy: 1 (Floppy disk, without change detection) 18 19 ; CX:DX: Total number of sectors 19 20 ; CF: 0 … … 25 26 ALIGN JUMP_ALIGN 26 27 AH15h_HandlerForReadDiskDriveSize: 28 %ifdef MODULE_SERIAL_FLOPPY 29 mov cl, 1 ; 1 = floppy disk, no change detection 30 31 test dl,dl ; DO NOT store the sector count if this is a 32 jns .FloppyDrive ; floppy disk, some OS's depend on this not 33 ; happening for floppies in order to boot. 34 %endif 35 27 36 call AH15h_GetSectorCountToBXDXAX 28 mov [bp+IDEPACK.intpack+INTPACK.cx], dx ; HIWORD to CX29 mov [bp+IDEPACK.intpack+INTPACK.dx], ax ; LOWORD to DX37 mov [bp+IDEPACK.intpack+INTPACK.cx], dx ; HIWORD to CX 38 xchg [bp+IDEPACK.intpack+INTPACK.dx], ax ; LOWORD to DX, AL gets drive number 30 39 31 xor ah, ah 32 call Int13h_SetErrorCodeToBdaAndToIntpackInSSBPfromAH ; Store success to BDA and CF 33 mov BYTE [bp+IDEPACK.intpack+INTPACK.ah], 3 ; Type code = Hard disk 40 xor ah, ah 41 %ifdef MODULE_SERIAL_FLOPPY 42 mov cl, 3 ; 3 = Hard Disk Accessible 43 .FloppyDrive: 44 45 call Int13h_SetErrorCodeToBdaAndToIntpackInSSBPfromAH_ALHasDriveNumber ; Store success to BDA and CF 46 mov BYTE [bp+IDEPACK.intpack+INTPACK.ah], cl 47 %else 48 call Int13h_SetErrorCodeToBdaAndToIntpackInSSBPfromAH ; Store success to BDA and CF 49 mov BYTE [bp+IDEPACK.intpack+INTPACK.ah], 3 50 %endif 51 34 52 jmp Int13h_ReturnFromHandlerWithoutStoringErrorCode 35 53 -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH1h_HStatus.asm
r150 r258 20 20 AH1h_HandlerForReadDiskStatus: 21 21 LOAD_BDA_SEGMENT_TO ds, ax, ! 22 23 %ifdef MODULE_SERIAL_FLOPPY 24 test dl, dl 25 jns .HardDisk 26 mov ah, [BDA.bFDRetST] ; Unlike for hard disks below, floppy version does not clear the status 27 jmp .done 28 .HardDisk: 29 %endif 30 22 31 xchg ah, [BDA.bHDLastSt] ; Load and clear last error 32 ; Note that AH is cleared with the LOAD_BDA_SEGMENT above 33 34 .done: 23 35 call Int13h_SetErrorCodeToIntpackInSSBPfromAH 24 36 jmp Int13h_ReturnFromHandlerWithoutStoringErrorCode -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH2h_HRead.asm
r249 r258 40 40 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAHandTransferredSectorsFromCL 41 41 %endif 42 -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH8h_HParams.asm
r227 r258 14 14 ; SS:BP: Ptr to IDEPACK 15 15 ; Returns with INTPACK: 16 ; BL: Drive Type (for floppies only) 16 17 ; CH: Maximum cylinder number, bits 7...0 17 18 ; CL: Bits 7...6: Cylinder number bits 9...8 … … 19 20 ; DH: Maximum head number (0...255) 20 21 ; DL: Number of drives 22 ; ES:DI: Floppy DPT (for floppies only) 21 23 ; AH: Int 13h/40h floppy return status 22 24 ; CF: 0 if successfull, 1 if error 23 25 ;-------------------------------------------------------------------- 24 26 AH8h_HandlerForReadDiskDriveParameters: 27 25 28 call RamVars_IsDriveHandledByThisBIOS 26 jnc SHORT .GetDriveParametersForForeignHardDiskInDL 29 jnc SHORT .OurDrive 30 31 call Int13h_CallPreviousInt13hHandler 32 jnc SHORT .MidGame 33 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH 34 35 .OurDrive: 27 36 call AH8h_GetDriveParameters 28 jmp SHORT .ReturnAfterStoringValuesToIntpack29 37 30 .GetDriveParametersForForeignHardDiskInDL: 31 call Int13h_CallPreviousInt13hHandler 32 jc SHORT .ReturnErrorFromPreviousInt13hHandler 33 call RamVars_GetCountOfKnownDrivesToDL 34 .ReturnAfterStoringValuesToIntpack: 38 %ifdef MODULE_SERIAL_FLOPPY 39 push cs ; setup registers if we are a floppy drive, in all cases 40 pop es ; if it is not a floppy drive, these values will not be put in INTPACK 41 mov di, AH8h_FloppyDPT 42 %endif 43 ;; fall-through 44 45 .MidGame: 46 call RamVars_GetCountOfKnownDrivesToAX ; assume hard disk for now, will discard if for floppies 47 48 test byte [bp+IDEPACK.intpack+INTPACK.dl], 080h 49 jnz .Done 50 51 mov [bp+IDEPACK.intpack+INTPACK.bl], bl 52 53 mov [bp+IDEPACK.intpack+INTPACK.es], es 54 mov [bp+IDEPACK.intpack+INTPACK.di], di 55 56 call FloppyDrive_GetCountToAX 57 58 .Done: 59 mov ah, dh 60 35 61 mov [bp+IDEPACK.intpack+INTPACK.cx], cx 36 mov [bp+IDEPACK.intpack+INTPACK.dx], dx 62 xchg [bp+IDEPACK.intpack+INTPACK.dx], ax ; recover DL for BDA last status byte determination 63 37 64 xor ah, ah 38 .ReturnErrorFromPreviousInt13hHandler: 65 %ifdef MODULE_SERIAL_FLOPPY 66 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH_ALHasDriveNumber 67 %else 39 68 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH 69 %endif 40 70 41 71 … … 51 81 ; Bits 5...0: Maximum sector number (1...63) 52 82 ; DH: Maximum head number (0...255) 53 ; DL: Number of drives54 83 ; Corrupts registers: 55 84 ; AX, BX … … 73 102 ; Bits 5...0: Maximum sector number (1...63) 74 103 ; DH: Maximum head number (0...255) 75 ; DL: Number of drives76 104 ; Corrupts registers: 77 105 ; AX, BX … … 85 113 or cl, bh ; CL bits 0...5 = Sectors per track 86 114 mov dh, bl ; DH = Maximum head number 87 jmp RamVars_GetCountOfKnownDrivesToDL 115 116 %ifdef MODULE_SERIAL_FLOPPY 117 mov bl,[di+DPT.bFlagsHigh] 118 eSHR_IM bl,FLGH_DPT_SERIAL_FLOPPY_TYPE_FIELD_POSITION 119 %endif 120 ret 121 122 %ifdef MODULE_SERIAL_FLOPPY 123 ; 124 ; Floppy Disk Parameter Table. There is no way to specify more than one of these 125 ; for any given system, so no way to make this drive or media specific. 126 ; So we return fixed values out of the ROM for callers might be expecting this information. 127 ; 128 ; On AT systems, we return the information for a 1.44 MB disk, 129 ; and on XT systems, we return the information for a 360 KB disk. 130 ; 131 AH8h_FloppyDPT: 132 %ifdef USE_AT 133 db 0ah << 4 | 0fh ; Offset 0: Drive timings, 1.44MB values 134 %else 135 db 0dh << 4 | 0fh ; Offset 0: Drive timings, 360KB values 136 %endif 137 138 db 1h << 1 | 0 ; Offset 1: Typical values of 1 for head load time 139 ; DMA used (although it actually is not, but is more restrctive) 140 db 25h ; Offset 2: Inactiviy motor turn-off delay, 141 ; Typical value of 25h for 2 second delay 142 db 02h ; Offset 3: Sector size, always 512 143 144 %ifdef USE_AT 145 db 12h ; Offset 4: Sectors per track, 1.44MB value 146 db 1bh ; Offset 5: Sector gap, 1.44MB value 147 %else 148 db 09h ; Offset 4: Sectors per track, 360KB value 149 db 2ah ; Offset 5: Sector gap, 360KB value 150 %endif 151 152 db 0ffh ; Offset 6: Data length 153 154 %ifdef USE_AT 155 db 6ch ; Offset 7: Format gap length, 1.44MB value 156 %else 157 db 50h ; Offset 7: Format gap length, 360KB value 158 %endif 159 160 db 0f6h ; Offset 8: Fill byte for format 161 db 0fh ; Offset 9: Head setting time 162 db 08h ; Offset A: Wait for motor startpu time 163 164 %ifdef USE_AT 165 db 79 ; Offset B: Maximum track number, 1.44MB value 166 db 0 ; Offset C: Data transfer rate, 1.44MB value 167 db 4 ; Offset D: Diskette CMOS drive type, 1.44MB value 168 %else 169 db 39 ; Offset B: Maximum track number, 360KB value 170 db 80h ; Offset C: Data transfer rate, 360KB value 171 db 1 ; Offset D: Diskette CMOS drive type, 360KB value 172 %endif 173 %endif -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH9h_HInit.asm
r227 r258 43 43 push cx 44 44 45 %ifdef MODULE_SERIAL 46 ; 47 ; no need to do this for serial deveices, and we use the DPT_RESET flag bits 48 ; to store the drive type for serial floppy drives (MODULE_SERIAL_FLOPPY) 49 ; 50 xor ah, ah 51 test byte [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE ; Clears CF 52 jnz .ReturnNotSuccessfull 53 %endif 54 45 55 ; Try to select drive and wait until ready 46 56 or BYTE [di+DPT.bFlagsHigh], MASKH_DPT_RESET ; Everything uninitialized -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int19h.asm
r250 r258 31 31 ; Install INT 19h handler for proper reboot 32 32 LOAD_BDA_SEGMENT_TO es, ax 33 mov bx, BIOS_BOOT_LOADER_INTERRUPT_19h ; INT 19h interrupt vector offset33 mov al, BIOS_BOOT_LOADER_INTERRUPT_19h ; INT 19h interrupt vector offset 34 34 mov si, Int19h_ResetHandler ; INT 19h handler to reboot the system 35 call Interrupts_InstallHandlerToVectorIn BXFromCSSI35 call Interrupts_InstallHandlerToVectorInALFromCSSI 36 36 call Initialize_AndDetectDrives ; Installs new boot menu loader 37 37 ; Fall to .PrepareStackAndSelectDriveFromBootMenu -
trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectDrives.asm
r254 r258 43 43 44 44 %ifdef MODULE_SERIAL 45 ;---------------------------------------------------------------------- 45 46 ; 46 47 ; if serial drive detected, do not scan (avoids duplicate drives and isn't needed - we already have a connection) … … 57 58 %endif 58 59 59 .done: 60 .done: 61 %ifdef MODULE_SERIAL_FLOPPY 62 ;---------------------------------------------------------------------- 63 ; 64 ; Add in any emulated serial floppy drives. 65 ; 66 mov al, [RAMVARS.xlateVars+XLATEVARS.bFlopCreateCnt] 67 dec al 68 mov cl, al 69 js .NoFloppies ; if no drives are present, we store 0ffh 70 71 call FloppyDrive_GetCountFromBIOS_or_BDA 72 73 push ax 74 75 add al, cl ; Add our drives to existing drive count 76 cmp al, 3 ; For BDA, max out at 4 drives (ours is zero based) 77 jl .MaxBDAFloppiesExceeded 78 mov al, 3 79 .MaxBDAFloppiesExceeded: 80 eROR_IM al, 2 ; move to bits 6-7 81 inc ax ; low order bit, indicating floppy drive exists 82 83 mov ah, [es:BDA.wEquipment] ; Load Equipment WORD low byte 84 and ah, 03eh ; Mask off drive number and drives present bit 85 or al, ah ; Or in new values 86 mov [es:BDA.wEquipment], al ; and store 87 88 mov al, 1eh ; BDA pointer to Floppy DPT 89 mov si, AH8h_FloppyDPT 90 call Interrupts_InstallHandlerToVectorInALFromCSSI 91 92 pop ax 93 94 shr cl, 1 ; number of drives, 1 or 2 only, to CF flag (clear=1, set=2) 95 rcl al, 1 ; starting drive number in upper 7 bits, number of drives in low bit 96 .NoFloppies: 97 mov [RAMVARS.xlateVars+XLATEVARS.bFlopCntAndFirst], al 98 %endif 99 60 100 ret 61 101 -
trunk/XTIDE_Universal_BIOS/Src/Initialization/FloppyDrive.asm
r181 r258 120 120 ; Returns number of Floppy Drives in system. 121 121 ; 122 ; FloppyDrive_GetCountToCX 123 ; Parameters: 124 ; Nothing 125 ; Returns: 126 ; CX: Number of Floppy Drives 127 ; Corrupts registers: 128 ; Nothing 129 ;-------------------------------------------------------------------- 130 ALIGN JUMP_ALIGN 131 FloppyDrive_GetCountToCX: 122 ; FloppyDrive_GetCountToAX 123 ; Parameters: 124 ; DS: RAMVARS Segment 125 ; Returns: 126 ; AX: Number of Floppy Drives 127 ;-------------------------------------------------------------------- 128 ALIGN JUMP_ALIGN 129 FloppyDrive_GetCountToAX: 130 %ifdef MODULE_SERIAL_FLOPPY 131 call RamVars_UnpackFlopCntAndFirstToAL 132 adc al,1 ; adds in the drive count bit, and adds 1 for count vs. 0-index, 133 ; but still won't impact SF 134 jns .UseInternalNumber ; need to clear CH on the way out, and add in additional drive numbers 135 136 %endif 137 call FloppyDrive_GetCountFromBIOS_or_BDA 138 139 .UseInternalNumber: 140 mov ah, [cs:ROMVARS.bMinFddCnt] 141 MAX_U al, ah 142 cbw 143 144 ret 145 146 ALIGN JUMP_ALIGN 147 FloppyDrive_GetCountFromBIOS_or_BDA: 132 148 push es 133 %ifdef USE_AT134 call GetCountFromBIOS135 %else136 call GetCountFromBDA137 %endif138 mov ch, [cs:ROMVARS.bMinFddCnt]139 MAX_U cl, ch140 pop es141 xor ch, ch142 ret143 144 149 145 150 ;-------------------------------------------------------------------- … … 160 165 %ifdef USE_AT 161 166 ALIGN JUMP_ALIGN 162 GetCountFromBIOS:167 .GetCountFromBIOS: 163 168 push di 164 169 push dx 165 170 push bx 166 push ax167 171 168 172 mov ah, 08h ; Get Drive Parameters 169 173 cwd ; Floppy Drive 00h 170 174 int BIOS_DISKETTE_INTERRUPT_40h 171 mov cl, dl ; Number of Floppy Drives to CL 172 173 pop ax 175 mov al, dl ; Number of Floppy Drives to AL 176 174 177 pop bx 175 178 pop dx 176 179 pop di 177 ret 178 %endif 179 180 %endif 180 181 181 182 ;-------------------------------------------------------------------- … … 193 194 %ifndef USE_AT 194 195 ALIGN JUMP_ALIGN 195 GetCountFromBDA: 196 LOAD_BDA_SEGMENT_TO es, cx 197 mov cl, [es:BDA.wEquipment] ; Load Equipment WORD low byte 198 mov ch, cl ; Copy it to CH 199 and cx, 0C001h ; Leave bits 15..14 and 0 200 eROL_IM ch, 2 ; EW low byte bits 7..6 to 1..0 201 add cl, ch ; CL = Floppy Drive count 202 ret 203 %endif 196 .GetCountFromBDA: 197 LOAD_BDA_SEGMENT_TO es, ax 198 mov al, [es:BDA.wEquipment] ; Load Equipment WORD low byte 199 mov ah, al ; Copy it to CH 200 and ax, 0C001h ; Leave bits 15..14 and 0 201 eROL_IM ah, 2 ; EW low byte bits 7..6 to 1..0 202 add al, ah ; CL = Floppy Drive count 203 %endif 204 205 pop es 206 ret 207 -
trunk/XTIDE_Universal_BIOS/Src/Initialization/Initialize.asm
r243 r258 29 29 30 30 ; Install INT 19h handler (boot loader) where drives are detected 31 mov bx, BIOS_BOOT_LOADER_INTERRUPT_19h31 mov al, BIOS_BOOT_LOADER_INTERRUPT_19h 32 32 mov si, Int19h_BootLoaderHandler 33 call Interrupts_InstallHandlerToVectorIn BXFromCSSI33 call Interrupts_InstallHandlerToVectorInALFromCSSI 34 34 35 35 .SkipRomInitialization: … … 73 73 mov dl, 80h 74 74 call RamVars_IsDriveHandledByThisBIOS 75 j nc SHORT .FindForDrive81h ; Store nothing if not our drive75 jc SHORT .FindForDrive81h ; Store nothing if not our drive 76 76 call FindDPT_ForDriveNumber ; DPT to DS:DI 77 77 mov [es:HD0_DPT_POINTER_41h*4], di … … 80 80 inc dx 81 81 call RamVars_IsDriveHandledByThisBIOS 82 j nc SHORT .ResetDetectedDrives82 jc SHORT .ResetDetectedDrives 83 83 call FindDPT_ForDriveNumber 84 84 mov [es:HD1_DPT_POINTER_46h*4], di -
trunk/XTIDE_Universal_BIOS/Src/Initialization/Interrupts.asm
r243 r258 34 34 mov ax, [es:BIOS_DISK_INTERRUPT_13h*4] ; Load old INT 13h offset 35 35 mov [RAMVARS.fpOldI13h], ax ; Store old INT 13h offset 36 37 mov bx, BIOS_DISK_INTERRUPT_13h ; INT 13h interrupt vector offset38 mov si, Int13h_DiskFunctionsHandler ; Interrupt handler offset39 call Interrupts_InstallHandlerToVectorInBXFromCSSI40 36 41 37 ; Only store INT 13h handler to 40h if 40h is not already installed. … … 47 43 mov [es:BIOS_DISKETTE_INTERRUPT_40h*4+2], dx ; Store old INT 13h segment 48 44 .Int40hAlreadyInstalled: 45 46 mov al, BIOS_DISK_INTERRUPT_13h ; INT 13h interrupt vector offset 47 mov si, Int13h_DiskFunctionsHandler ; Interrupt handler offset 48 call Interrupts_InstallHandlerToVectorInALFromCSSI 49 49 ; Fall to .InitializeHardwareIrqHandlers 50 50 … … 56 56 ; Nothing 57 57 ; Corrupts registers: 58 ; BX, CX, DX, SI, DI 58 ; BX, CX, DX, SI, DI, AX 59 59 ;-------------------------------------------------------------------- 60 60 .InitializeHardwareIrqHandlers: … … 62 62 mov di, ROMVARS.ideVars0 ; CS:SI points to first IDEVARS 63 63 .IdeControllerLoop: 64 eMOVZX bx, BYTE [cs:di+IDEVARS.bIRQ]64 mov al, BYTE [cs:di+IDEVARS.bIRQ] 65 65 add di, BYTE IDEVARS_size ; Increment to next controller 66 66 call .InstallLowOrHighIrqHandler … … 72 72 ; .InstallLowOrHighIrqHandler 73 73 ; Parameters: 74 ; BX: IRQ number, 0 if IRQ disabled74 ; AL: IRQ number, 0 if IRQ disabled 75 75 ; ES: BDA and Interrupt Vector segment (zero) 76 76 ; Returns: … … 80 80 ;-------------------------------------------------------------------- 81 81 .InstallLowOrHighIrqHandler: 82 test bl, bl82 test al, al 83 83 jz SHORT .Return ; IRQ not used 84 cmp bl, 884 cmp al, 8 85 85 jb SHORT .InstallLowIrqHandler 86 86 ; Fall to .InstallHighIrqHandler … … 94 94 ; Nothing 95 95 ; Corrupts registers: 96 ; BX, SI96 ; AL, BX, SI 97 97 ;-------------------------------------------------------------------- 98 98 .InstallHighIrqHandler: 99 add bx, BYTE HARDWARE_IRQ_8_INTERRUPT_70h - 8 ; Interrupt vector number99 add al, BYTE HARDWARE_IRQ_8_INTERRUPT_70h - 8 ; Interrupt vector number 100 100 mov si, IdeIrq_InterruptServiceRoutineForIrqs8to15 101 jmp SHORT Interrupts_InstallHandlerToVectorIn BXFromCSSI101 jmp SHORT Interrupts_InstallHandlerToVectorInALFromCSSI 102 102 103 103 ;-------------------------------------------------------------------- 104 104 ; .InstallLowIrqHandler 105 105 ; Parameters: 106 ; BX: IRQ number (0...7)107 ; ES: BDA and Interrupt Vector segment (zero) 108 ; Returns: 109 ; Nothing 110 ; Corrupts registers: 111 ; BX, SI106 ; AL: IRQ number (0...7) 107 ; ES: BDA and Interrupt Vector segment (zero) 108 ; Returns: 109 ; Nothing 110 ; Corrupts registers: 111 ; AL, BX, SI 112 112 ;-------------------------------------------------------------------- 113 113 .InstallLowIrqHandler: 114 add bx, BYTE HARDWARE_IRQ_0_INTERRUPT_08h ; Interrupt vector number114 add al, BYTE HARDWARE_IRQ_0_INTERRUPT_08h ; Interrupt vector number 115 115 mov si, IdeIrq_InterruptServiceRoutineForIrqs2to7 116 ; Fall to Interrupts_InstallHandlerToVectorIn BXFromCSSI117 118 119 ;-------------------------------------------------------------------- 120 ; Interrupts_InstallHandlerToVectorIn BXFromCSSI121 ; Parameters: 122 ; BX: Interrupt vector number (for example 13h)116 ; Fall to Interrupts_InstallHandlerToVectorInALFromCSSI 117 118 119 ;-------------------------------------------------------------------- 120 ; Interrupts_InstallHandlerToVectorInALFromCSSI 121 ; Parameters: 122 ; AL: Interrupt vector number (for example 13h) 123 123 ; ES: BDA and Interrupt Vector segment (zero) 124 124 ; CS:SI: Ptr to interrupt handler … … 126 126 ; Nothing 127 127 ; Corrupts registers: 128 ; BX 129 ;-------------------------------------------------------------------- 130 Interrupts_InstallHandlerToVectorInBXFromCSSI: 131 eSHL_IM bx, 2 ; Shift for DWORD offset 128 ; AX, BX 129 ;-------------------------------------------------------------------- 130 Interrupts_InstallHandlerToVectorInALFromCSSI: 131 mov bl, 4 ; Shift for DWORD offset, MUL smaller than other alternatives 132 mul bl 133 xchg ax, bx 132 134 mov [es:bx], si ; Store offset 133 135 mov [es:bx+2], cs ; Store segment -
trunk/XTIDE_Universal_BIOS/Src/Main.asm
r254 r258 176 176 %include "BootMenuEvent.asm" ; For menu library event handling 177 177 ; NOTE: BootMenuPrint needs to come immediately after BootMenuEvent 178 %include "BootMenuPrint.asm" ; For printing Boot Menu strings 178 ; so that jump table entries in BootMenuEvent stay within 8-bits 179 %include "BootMenuPrint.asm" ; For printing Boot Menu strings, also includes "BootMenuPrintCfg.asm" 179 180 %include "BootPrint.asm" ; For printing boot information 180 %include "BootMenuPrintCfg.asm" ; For printing hard disk configuration181 181 %include "FloppyDrive.asm" ; Floppy Drive related functions 182 182 %include "BootSector.asm" ; For loading boot sector -
trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/CreateDPT.asm
r227 r258 63 63 .StoreFlags: 64 64 mov [di+DPT.wFlags], ax 65 66 %ifdef MODULE_SERIAL67 cmp byte [cs:bp+IDEVARS.bDevice], DEVICE_SERIAL_PORT68 jnz .StoreAddressing69 or byte [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE70 %endif71 65 ; Fall to .StoreAddressing 72 66 … … 205 199 .StoreDeviceSpecificParameters: 206 200 call Device_FinalizeDPT 201 202 %ifdef MODULE_SERIAL_FLOPPY 203 ; 204 ; These two instructions serve two purposes: 205 ; 1. If the drive is a floppy drive (CF set), then we effectively increment the counter. 206 ; 2. If this is a hard disk, and there have been any floppy drives previously added, then the hard disk is 207 ; effectively discarded. This is more of a safety check then code that should ever normally be hit (see below). 208 ; Since the floppy DPT's come after the hard disk DPT's, without expensive (code size) code to relocate a DPT, 209 ; this was necessary. Now, this situation shouldn't happen in normal operation, for a couple of reasons: 210 ; A. xtidecfg always puts configured serial ports at the end fo the IDEVARS list 211 ; B. the auto serial code is always executed last 212 ; C. the serial server always returns floppy drives last 213 ; 214 adc byte [RAMVARS.xlateVars+XLATEVARS.bFlopCreateCnt], 0 215 jnz .AllDone 216 %else 217 ; 218 ; Even without floppy support enabled, we shouldn't try to mount a floppy image as a hard disk, which 219 ; could lead to unpredictable results since no MBR will be present, etc. The server doesn't know that 220 ; floppies are supported, so it is important to still fail here if a floppy is seen during the drive scan. 221 ; 222 jc .AllDone 223 %endif 224 207 225 ; Fall to .StoreDriveNumberAndUpdateDriveCount 208 226 … … 230 248 ja SHORT .AllDone ; If so, return 231 249 mov [RAMVARS.bFirstDrv], dl ; Store first drive number 250 251 .AllDone: 232 252 clc 233 .AllDone:234 253 ret 254 -
trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/FindDPT.asm
r233 r258 14 14 ; DS:DI: Ptr to first unused DPT 15 15 ; Corrupts registers: 16 ; D L16 ; DX 17 17 ;-------------------------------------------------------------------- 18 18 ALIGN JUMP_ALIGN 19 19 FindDPT_ForNewDriveToDSDI: 20 mov dl, [RAMVARS.bFirstDrv] 21 add dl, [RAMVARS.bDrvCnt] 20 mov ax, [RAMVARS.wDrvCntAndFirst] 21 add al, ah 22 %ifdef MODULE_SERIAL_FLOPPY 23 add al, [RAMVARS.xlateVars+XLATEVARS.bFlopCreateCnt] 24 %endif 25 xchg ax, dx 22 26 ; Fall to FindDPT_ForDriveNumber 23 27 … … 41 45 xchg di, ax ; Save the contents of AX in DI 42 46 47 %ifdef MODULE_SERIAL_FLOPPY 48 mov ax, [RAMVARS.wDrvCntAndFirst] 49 50 test dl, dl 51 js .harddisk 52 53 call RamVars_UnpackFlopCntAndFirstToAL 54 add dl, ah ; add in end of hard disk DPT list, floppies start immediately after 55 .harddisk: 56 sub dl, al ; subtract off beginning of either hard disk or floppy list (as appropriate) 57 %else 58 sub dl, [RAMVARS.bFirstDrv] ; subtract off beginning of hard disk list 59 %endif 60 43 61 mov al, LARGEST_DPT_SIZE 44 sub dl, [RAMVARS.bFirstDrv]62 45 63 mul dl 46 64 add ax, BYTE RAMVARS_size 47 65 48 xchg di, ax ; Restore AX and put result in DI66 xchg di, ax ; Restore AX and put result in DI 49 67 pop dx 50 68 ret … … 89 107 ; IterateToMasterAtPortCallback 90 108 ; Parameters: 91 ; CH: Drive number92 109 ; DX: IDE Base Port address 93 110 ; DS:DI: Ptr to DPT to examine 94 111 ; Returns: 95 ; DL: Drive number if correct DPT96 112 ; CF: Set if wanted DPT found 97 113 ; Cleared if wrong DPT … … 116 132 pop bx 117 133 jne SHORT ReturnWrongDPT 118 mov dl, ch ; Return drive number in DL119 134 120 135 ReturnRightDPT: … … 187 202 ; Returns: 188 203 ; DS:DI: Ptr to wanted DPT (if found) 204 ; If not found, points to first empty DPT 189 205 ; CF: Set if wanted DPT found 190 206 ; Cleared if DPT not found, or no DPTs present … … 195 211 IterateAllDPTs: 196 212 push cx 197 mov cx, [RAMVARS.wDrvCntAndFirst] 213 214 mov cl, [RAMVARS.bDrvCnt] 215 mov ch, 0 216 217 mov di, RAMVARS_size ; Point DS:DI to first DPT 218 198 219 jcxz .NotFound ; Return if no drives 199 mov di, RAMVARS_size ; Point DS:DI to first DPT220 200 221 ALIGN JUMP_ALIGN 201 222 .LoopWhileDPTsLeft: 202 223 call si ; Is wanted DPT? 203 224 jc SHORT .AllDptsIterated ; If so, return 204 inc ch ; Increment drive number205 225 add di, BYTE LARGEST_DPT_SIZE ; Point to next DPT 206 dec cl ; Decrement drives left207 jnz SHORT .LoopWhileDPTsLeft226 loop .LoopWhileDPTsLeft 227 208 228 .NotFound: 209 229 clc ; Clear CF since DPT not found 230 210 231 ALIGN JUMP_ALIGN 211 232 .AllDptsIterated: -
trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/RamVars.asm
r241 r258 123 123 ; DS: RAMVARS segment 124 124 ; Returns: 125 ; CF: Setif function is handled by this BIOS126 ; Clearedif function belongs to some other BIOS125 ; CF: Cleared if function is handled by this BIOS 126 ; Set if function belongs to some other BIOS 127 127 ; Corrupts registers: 128 128 ; Nothing … … 131 131 RamVars_IsFunctionHandledByThisBIOS: 132 132 test ah, ah ; Reset for all floppy and hard disk drives? 133 jz SHORT .FunctionIsHandledByOurBIOS134 cmp ah, 08h ; Read Disk Drive Parameters?135 jne SHORT RamVars_IsDriveHandledByThisBIOS 136 test dl, dl ; We do not handle floppy drives137 j ns SHORT .FunctionIsNotHandledByOurBIOS138 ALIGN JUMP_ALIGN 139 .FunctionIsHandledByOurBIOS: 140 stc141 .FunctionIsNotHandledByOurBIOS: 142 ret 143 133 jz SHORT RamVars_IsDriveHandledByThisBIOS.CFAlreadyClear_IsHandledByOurBIOS 134 cmp ah, 08h 135 %ifdef MODULE_SERIAL_FLOPPY 136 ; we handle all traffic for function 08h, as we need to wrap both hard disk and floppy drive counts 137 je SHORT RamVars_IsDriveHandledByThisBIOS.CFAlreadyClear_IsHandledByOurBIOS 138 %else 139 ; we handle all *hard disk* traffic for function 08h, as we need to wrap the hard disk drive count 140 je SHORT RamVars_IsDriveHandledByThisBIOS.IsDriveAHardDisk 141 %endif 142 ;;; fall-through 143 144 144 ;-------------------------------------------------------------------- 145 145 ; Checks if drive is handled by this BIOS. … … 150 150 ; DS: RAMVARS segment 151 151 ; Returns: 152 ; CF: Setif drive is handled by this BIOS153 ; Clearedif drive belongs to some other BIOS152 ; CF: Cleared if drive is handled by this BIOS 153 ; Set if drive belongs to some other BIOS 154 154 ; Corrupts registers: 155 155 ; Nothing … … 158 158 RamVars_IsDriveHandledByThisBIOS: 159 159 push ax 160 mov ax, [RAMVARS.wDrvCntAndFirst] ; Drive count to AL, First number to AH 161 add al, ah ; One past last drive to AL 162 cmp dl, al ; Above last supported? 163 jae SHORT .DriveNotHandledByThisBIOS 164 cmp ah, dl ; Below first supported? 165 ja SHORT .DriveNotHandledByThisBIOS 166 stc 167 .DriveNotHandledByThisBIOS: 160 161 mov ax, [RAMVARS.wDrvCntAndFirst] ; Drive count to AH, First number to AL 162 add ah, al ; One past last drive to AH 163 cmp dl, ah ; Above last supported? 164 jae SHORT .HardDiskIsNotHandledByThisBIOS 165 .TestLowLimit: 166 cmp dl, al ; Below first supported? 167 jae SHORT .CFAlreadyClear_IsHandledByOurBIOS_PopAX ; note that CF is clear if the branch is taken 168 169 .HardDiskIsNotHandledByThisBIOS: 170 %ifdef MODULE_SERIAL_FLOPPY 171 call RamVars_UnpackFlopCntAndFirstToAL 172 cbw ; normally 0h, could be ffh if no drives present 173 adc ah, al ; if no drives present, still ffh (ffh + ffh + 1 = ffh) 174 js SHORT .DiskIsNotHandledByThisBIOS 175 cmp ah, dl 176 jz SHORT .CFAlreadyClear_IsHandledByOurBIOS_PopAX 177 cmp al, dl 178 jz SHORT .CFAlreadyClear_IsHandledByOurBIOS_PopAX 179 .DiskIsNotHandledByThisBIOS: 180 %endif 181 182 stc ; Is not supported by our BIOS 183 184 .CFAlreadyClear_IsHandledByOurBIOS_PopAX: 168 185 pop ax 169 ret 170 171 172 ;-------------------------------------------------------------------- 173 ; RamVars_GetHardDiskCountFromBDAtoCX 174 ; Parameters: 175 ; DS: RAMVARS segment 176 ; Returns: 177 ; CX: Total hard disk count 178 ; Corrupts registers: 179 ; Nothing 180 ;-------------------------------------------------------------------- 181 ALIGN JUMP_ALIGN 182 RamVars_GetHardDiskCountFromBDAtoCX: 186 .CFAlreadyClear_IsHandledByOurBIOS: 187 ret 188 189 %ifndef MODULE_SERIAL_FLOPPY 190 ; 191 ; Note that we could have just checked for the high order bit in dl, but with the needed STC and jumps, 192 ; leveraging the code above resulted in space savings. 193 ; 194 .IsDriveAHardDisk: 195 push ax ; match stack at the top of routine 196 mov al, 80h ; to catch all hard disks, lower limit is 80h vs. bFirstDrv 197 jmp .TestLowLimit ; and there is no need to test a high limit 198 %endif 199 200 ;-------------------------------------------------------------------- 201 ; RamVars_GetHardDiskCountFromBDAtoAX 202 ; Parameters: 203 ; DS: RAMVARS segment 204 ; Returns: 205 ; AX: Total hard disk count 206 ; Corrupts registers: 207 ; CX 208 ;-------------------------------------------------------------------- 209 ALIGN JUMP_ALIGN 210 RamVars_GetHardDiskCountFromBDAtoAX: 183 211 push es 184 push dx 185 186 LOAD_BDA_SEGMENT_TO es, cx, ! ; Zero CX 187 call RamVars_GetCountOfKnownDrivesToDL 212 213 LOAD_BDA_SEGMENT_TO es, ax 214 call RamVars_GetCountOfKnownDrivesToAX 188 215 mov cl, [es:BDA.bHDCount] 189 MAX_U cl, dl 190 191 pop dx 216 MAX_U al, cl 217 192 218 pop es 193 219 ret 194 220 195 221 ;-------------------------------------------------------------------- 196 ; RamVars_GetCountOfKnownDrivesTo DL197 ; Parameters: 198 ; DS: RAMVARS segment 199 ; Returns: 200 ; DL: Total hard disk count201 ; Corrupts registers: 202 ; No thing203 ;-------------------------------------------------------------------- 204 ALIGN JUMP_ALIGN 205 RamVars_GetCountOfKnownDrivesTo DL:206 mov dl, [RAMVARS.bFirstDrv] ; Number for our first drive207 add dl, [RAMVARS.bDrvCnt] ; Our drives208 and dl, 7Fh ; Clear HD bit for drive count209 ret210 211 222 ; RamVars_GetCountOfKnownDrivesToAX 223 ; Parameters: 224 ; DS: RAMVARS segment 225 ; Returns: 226 ; AX: Total hard disk count 227 ; Corrupts registers: 228 ; None 229 ;-------------------------------------------------------------------- 230 ALIGN JUMP_ALIGN 231 RamVars_GetCountOfKnownDrivesToAX: 232 mov ax, [RAMVARS.wDrvCntAndFirst] 233 add al, ah 234 and al, 7fh 235 cbw 236 ret 237 212 238 ;-------------------------------------------------------------------- 213 239 ; RamVars_GetIdeControllerCountToCX … … 219 245 ; Nothing 220 246 ;-------------------------------------------------------------------- 247 ALIGN JUMP_ALIGN 221 248 RamVars_GetIdeControllerCountToCX: 222 249 eMOVZX cx, BYTE [cs:ROMVARS.bIdeCnt] 223 250 ret 251 252 %ifdef MODULE_SERIAL_FLOPPY 253 ;-------------------------------------------------------------------- 254 ; RamVars_UnpackFlopCntAndFirstToAL 255 ; Parameters: 256 ; Nothing 257 ; Returns: 258 ; AL: First floppy drive number supported 259 ; CF: Number of floppy drives supported (clear = 1, set = 2) 260 ; Corrupts registers: 261 ; Nothing 262 ;-------------------------------------------------------------------- 263 ALIGN JUMP_ALIGN 264 RamVars_UnpackFlopCntAndFirstToAL: 265 mov al, [RAMVARS.xlateVars+XLATEVARS.bFlopCntAndFirst] 266 sar al, 1 267 ret 268 %endif
Note:
See TracChangeset
for help on using the changeset viewer.