Changeset 258 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h


Ignore:
Timestamp:
Feb 22, 2012, 7:01:53 PM (12 years ago)
Author:
gregli@…
google:author:
gregli@hotmail.com
Message:

Added floppy drive emulation over the serial connection (MODULE_SERIAL_FLOPPY). Along the way, various optimizations were made to stay within the 8K ROM size target. Also, serial code now returns the number of sectors transferred.

Location:
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH0h_HReset.asm

    r152 r258  
    2222    eMOVZX  bx, dl                      ; Copy requested drive to BL, zero BH to assume no errors
    2323    call    ResetFloppyDrivesWithInt40h
    24     test    bl, bl
    25     jns     SHORT .SkipHardDiskReset
    2624    call    ResetForeignHardDisks
    2725    call    AH0h_ResetHardDisksHandledByOurBIOS
     
    6462    xor     ah, ah                      ; Disk Controller Reset
    6563    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;--------------------------------------------------------------------
     78ALIGN JUMP_ALIGN
     79BackupErrorCodeFromTheRequestedDriveToBH:
     80    cmp     dl, bl              ; Requested drive?
     81    eCMOVE  bh, ah
     82    ret
     83       
    6884
    6985;--------------------------------------------------------------------
     
    8298    mov     dl, bl
    8399    call    RamVars_IsDriveHandledByThisBIOS
    84     jnc     SHORT .Return               ; Return what was in BL unmodified
     100    jc      SHORT .Return               ; Return what was in BL unmodified
    85101    mov     dl, 80h
    86102.Return:
     
    101117ALIGN JUMP_ALIGN
    102118AH0h_ResetHardDisksHandledByOurBIOS:
    103     mov     dh, [RAMVARS.bDrvCnt]       ; Load drive count to DH
     119    mov     dx, [RAMVARS.wDrvCntAndFirst]   ; DL = drive number, DH = drive count
    104120    test    dh, dh
    105121    jz      SHORT .AllDrivesReset       ; Return if no drives
    106     mov     dl, [RAMVARS.bFirstDrv]     ; Load number of our first drive
    107122    add     dh, dl                      ; DH = one past last drive to reset
    108123ALIGN JUMP_ALIGN
     
    114129    jb      SHORT .DriveResetLoop       ;  If not, reset next drive
    115130.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       
    118154;--------------------------------------------------------------------
    119155; .BackupErrorCodeFromMasterOrSlaveToBH
     
    144180    ret
    145181
     182       
    146183;--------------------------------------------------------------------
    147184; GetBasePortToCX
     
    167204
    168205
    169 ;--------------------------------------------------------------------
    170 ; BackupErrorCodeFromTheRequestedDriveToBH
    171 ;   Parameters:
    172 ;       AH:     Error code from the last resetted drive
    173 ;       DL:     Drive last resetted
    174 ;       BL:     Requested drive (DL when entering AH=00h)
    175 ;   Returns:
    176 ;       BH:     Backuped error code
    177 ;   Corrupts registers:
    178 ;       Nothing
    179 ;--------------------------------------------------------------------
    180 ALIGN JUMP_ALIGN
    181 BackupErrorCodeFromTheRequestedDriveToBH:
    182     cmp     dl, bl              ; Requested drive?
    183     eCMOVE  bh, ah
    184     ret
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH15h_HSize.asm

    r257 r258  
    1515;   Returns with INTPACK:
    1616;       If succesfull:
    17 ;           AH:     3 (Hard disk accessible)
     17;           AH:     Hard Disk: 3 (Hard disk accessible)
     18;                   Floppy:    1 (Floppy disk, without change detection)
    1819;           CX:DX:  Total number of sectors
    1920;           CF:     0
     
    2526ALIGN JUMP_ALIGN
    2627AH15h_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       
    2736    call    AH15h_GetSectorCountToBXDXAX
    28     mov     [bp+IDEPACK.intpack+INTPACK.cx], dx ; HIWORD to CX
    29     mov     [bp+IDEPACK.intpack+INTPACK.dx], ax ; LOWORD to DX
     37    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
    3039
    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       
    3452    jmp     Int13h_ReturnFromHandlerWithoutStoringErrorCode
    3553
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH1h_HStatus.asm

    r150 r258  
    2020AH1h_HandlerForReadDiskStatus:
    2121    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       
    2231    xchg    ah, [BDA.bHDLastSt]     ; Load and clear last error
     32                                    ; Note that AH is cleared with the LOAD_BDA_SEGMENT above
     33               
     34.done:
    2335    call    Int13h_SetErrorCodeToIntpackInSSBPfromAH
    2436    jmp     Int13h_ReturnFromHandlerWithoutStoringErrorCode
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH2h_HRead.asm

    r249 r258  
    4040    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAHandTransferredSectorsFromCL
    4141%endif
     42
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH8h_HParams.asm

    r227 r258  
    1414;       SS:BP:  Ptr to IDEPACK
    1515;   Returns with INTPACK:
     16;       BL:     Drive Type (for floppies only)
    1617;       CH:     Maximum cylinder number, bits 7...0
    1718;       CL:     Bits 7...6: Cylinder number bits 9...8
     
    1920;       DH:     Maximum head number (0...255)
    2021;       DL:     Number of drives
     22;       ES:DI:  Floppy DPT (for floppies only)
    2123;       AH:     Int 13h/40h floppy return status
    2224;       CF:     0 if successfull, 1 if error
    2325;--------------------------------------------------------------------
    2426AH8h_HandlerForReadDiskDriveParameters:
     27
    2528    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:     
    2736    call    AH8h_GetDriveParameters
    28     jmp     SHORT .ReturnAfterStoringValuesToIntpack
    2937
    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       
    3561    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
    3764    xor     ah, ah
    38 .ReturnErrorFromPreviousInt13hHandler:
     65%ifdef MODULE_SERIAL_FLOPPY
     66    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH_ALHasDriveNumber           
     67%else
    3968    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
     69%endif
    4070
    4171
     
    5181;               Bits 5...0: Maximum sector number (1...63)
    5282;       DH:     Maximum head number (0...255)
    53 ;       DL:     Number of drives
    5483;   Corrupts registers:
    5584;       AX, BX
     
    73102;               Bits 5...0: Maximum sector number (1...63)
    74103;       DH:     Maximum head number (0...255)
    75 ;       DL:     Number of drives
    76104;   Corrupts registers:
    77105;       AX, BX
     
    85113    or      cl, bh                  ; CL bits 0...5 = Sectors per track
    86114    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;
     131AH8h_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  
    4343    push    cx
    4444
     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       
    4555    ; Try to select drive and wait until ready
    4656    or      BYTE [di+DPT.bFlagsHigh], MASKH_DPT_RESET       ; Everything uninitialized
Note: See TracChangeset for help on using the changeset viewer.