Changeset 242 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Device


Ignore:
Timestamp:
Feb 10, 2012, 3:12:40 AM (13 years ago)
Author:
krille_n_@…
google:author:
krille_n_@hotmail.com
Message:

Changes:

  • Optimizations (both for size and speed) in IdeTransfer.asm and MemIdeTransfer.asm
  • Fixed a bug where the SingleByteRead/Write functions in IdeTransfer.asm would fail on 128 sector transfers.
  • Fixed some typos and errors in general, comments etc.
Location:
trunk/XTIDE_Universal_BIOS/Src/Device
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeDPT.asm

    r160 r242  
    1414;       Nothing
    1515;   Corrupts registers:
    16 ;       AX, BX, CX, DX
     16;       AX
    1717;--------------------------------------------------------------------
    1818IdeDPT_Finalize:
     
    2828;       Nothing
    2929;   Corrupts registers:
    30 ;       Nothing
     30;       AX
    3131;--------------------------------------------------------------------
    3232.StoreBlockMode:
  • trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeTransfer.asm

    r238 r242  
    3535ALIGN JUMP_ALIGN
    3636IdeTransfer_StartWithCommandInAL:
    37     mov     ah, [bp+IDEPACK.bSectorCount]
    38 
    3937    ; Are we reading or writing?
    4038    test    al, 16  ; Bit 4 is cleared on all the read commands but set on 3 of the 4 write commands
    41     jnz     SHORT .PrepareToWriteDataFromESSI
     39    mov     ah, [bp+IDEPACK.bSectorCount]
     40    jnz     SHORT WriteToDrive
    4241    cmp     al, COMMAND_WRITE_MULTIPLE
    43     je      SHORT .PrepareToWriteDataFromESSI
    44 
    45     ; Prepare to read data to ESSI
    46     mov     bx, g_rgfnPioRead
    47     call    InitializePiovarsInSSBPwithSectorCountInAH
    48     xchg    si, di
    49     jmp     SHORT ReadFromDrive
    50 
    51 ALIGN JUMP_ALIGN
    52 .PrepareToWriteDataFromESSI:
    53     mov     bx, g_rgfnPioWrite
    54     call    InitializePiovarsInSSBPwithSectorCountInAH
    55     ; Fall to WriteToDrive
    56 
    57 
    58 ;--------------------------------------------------------------------
    59 ; WriteToDrive
    60 ;   Parameters:
     42    je      SHORT WriteToDrive
     43    ; Fall to ReadFromDrive
     44
     45;--------------------------------------------------------------------
     46; ReadFromDrive
     47;   Parameters:
     48;       AH:     Number of sectors to transfer (1...128)
     49;       ES:SI:  Normalized ptr to buffer to receive data
    6150;       DS:DI:  Ptr to DPT (in RAMVARS segment)
    62 ;       ES:SI:  Normalized ptr to buffer containing data
    6351;       SS:BP:  Ptr to PIOVARS
    6452;   Returns:
     53;       DS:DI:  Ptr to DPT (in RAMVARS segment)
    6554;       AH:     BIOS Error code
    6655;       CX:     Number of successfully transferred sectors
     
    7059;       AL, BX, DX, SI, ES
    7160;--------------------------------------------------------------------
     61ReadFromDrive:
     62    ; Prepare to read data to ESSI
     63    mov     bx, g_rgfnPioRead
     64    call    InitializePiovarsInSSBPwithSectorCountInAH
     65
     66    ; Wait until drive is ready to transfer
     67    call    IdeWait_IRQorDRQ                    ; Wait until ready to transfer
     68    jc      SHORT ReturnWithTransferErrorInAH
     69    xchg    si, di                              ; ES:DI now points buffer
     70
     71    mov     cx, [bp+PIOVARS.wWordsInBlock]
     72
     73ALIGN JUMP_ALIGN
     74.ReadNextBlockFromDrive:
     75    mov     dx, [bp+PIOVARS.wDataPort]
     76    cmp     [bp+PIOVARS.wWordsLeft], cx
     77    jbe     SHORT .ReadLastBlockFromDrive
     78    call    [bp+PIOVARS.fnXfer]
     79
     80    ; Wait until ready for next block and check for errors
     81    xchg    di, si                              ; DS:DI now points DPT
     82    call    IdeWait_IRQorDRQ                    ; Wait until ready to transfer
     83    jc      SHORT ReturnWithTransferErrorInAH
     84    xchg    si, di                              ; ES:DI now points buffer
     85
     86    ; Increment number of successfully read WORDs
     87    mov     cx, [bp+PIOVARS.wWordsInBlock]
     88    sub     [bp+PIOVARS.wWordsLeft], cx
     89    add     [bp+PIOVARS.wWordsDone], cx
     90    jmp     SHORT .ReadNextBlockFromDrive
     91
     92ALIGN JUMP_ALIGN
     93.ReadLastBlockFromDrive:
     94    mov     cx, [bp+PIOVARS.wWordsLeft]
     95    call    [bp+PIOVARS.fnXfer]                 ; Transfer possibly partial block
     96
     97    ; Check for errors in last block
     98    mov     di, si                              ; DS:DI now points DPT
     99CheckErrorsAfterTransferringLastBlock:
     100    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRDY)
     101    call    IdeWait_PollStatusFlagInBLwithTimeoutInBH
     102
     103    ; Return number of successfully read sectors
     104ReturnWithTransferErrorInAH:
     105    mov     cx, [bp+PIOVARS.wWordsDone]
     106    jc      SHORT .ConvertTransferredWordsInCXtoSectors
     107    add     cx, [bp+PIOVARS.wWordsLeft]         ; Never sets CF
     108.ConvertTransferredWordsInCXtoSectors:
     109    xchg    cl, ch
     110    ret
     111
     112
     113;--------------------------------------------------------------------
     114; WriteToDrive
     115;   Parameters:
     116;       AH:     Number of sectors to transfer (1...128)
     117;       DS:DI:  Ptr to DPT (in RAMVARS segment)
     118;       ES:SI:  Normalized ptr to buffer containing data
     119;       SS:BP:  Ptr to PIOVARS
     120;   Returns:
     121;       AH:     BIOS Error code
     122;       CX:     Number of successfully transferred sectors
     123;       CF:     0 if transfer succesfull
     124;               1 if any error
     125;   Corrupts registers:
     126;       AL, BX, DX, SI, ES
     127;--------------------------------------------------------------------
     128ALIGN JUMP_ALIGN
    72129WriteToDrive:
     130    ; Prepare to write data from ESSI
     131    mov     bx, g_rgfnPioWrite
     132    call    InitializePiovarsInSSBPwithSectorCountInAH
     133
    73134    ; Always poll when writing first block (IRQs are generated for following blocks)
    74135    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ)
     
    76137    jc      SHORT ReturnWithTransferErrorInAH
    77138
     139    mov     cx, [bp+PIOVARS.wWordsInBlock]
     140
    78141ALIGN JUMP_ALIGN
    79142.WriteNextBlockToDrive:
    80     mov     cx, [bp+PIOVARS.wWordsInBlock]
    81143    mov     dx, [bp+PIOVARS.wDataPort]
    82144    cmp     [bp+PIOVARS.wWordsLeft], cx
     
    89151
    90152    ; Increment number of successfully written WORDs
    91     mov     ax, [bp+PIOVARS.wWordsInBlock]
    92     sub     [bp+PIOVARS.wWordsLeft], ax
    93     add     [bp+PIOVARS.wWordsDone], ax
     153    mov     cx, [bp+PIOVARS.wWordsInBlock]
     154    sub     [bp+PIOVARS.wWordsLeft], cx
     155    add     [bp+PIOVARS.wWordsDone], cx
    94156    jmp     SHORT .WriteNextBlockToDrive
    95157
     
    107169
    108170;--------------------------------------------------------------------
    109 ; ReadFromDrive
    110 ;   Parameters:
    111 ;       ES:DI:  Normalized ptr to buffer to recieve data
    112 ;       DS:SI:  Ptr to DPT (in RAMVARS segment)
    113 ;       SS:BP:  Ptr to PIOVARS
    114 ;   Returns:
    115 ;       DS:DI:  Ptr to DPT (in RAMVARS segment)
    116 ;       AH:     BIOS Error code
    117 ;       CX:     Number of successfully transferred sectors
    118 ;       CF:     0 if transfer succesfull
    119 ;               1 if any error
    120 ;   Corrupts registers:
    121 ;       AL, BX, DX, SI, ES
    122 ;--------------------------------------------------------------------
    123 ALIGN JUMP_ALIGN
    124 ReadFromDrive:
    125     ; Wait until drive is ready to transfer
    126     xchg    di, si                              ; DS:DI now points DPT
    127     call    IdeWait_IRQorDRQ                    ; Wait until ready to transfer
    128     jc      SHORT ReturnWithTransferErrorInAH
    129     xchg    si, di                              ; ES:DI now points buffer
    130 
    131 ALIGN JUMP_ALIGN
    132 .ReadNextBlockFromDrive:
    133     mov     cx, [bp+PIOVARS.wWordsInBlock]
    134     mov     dx, [bp+PIOVARS.wDataPort]
    135     cmp     [bp+PIOVARS.wWordsLeft], cx
    136     jbe     SHORT .ReadLastBlockFromDrive
    137     call    [bp+PIOVARS.fnXfer]
    138 
    139     ; Wait until ready for next block and check for errors
    140     xchg    di, si                              ; DS:DI now points DPT
    141     call    IdeWait_IRQorDRQ                    ; Wait until ready to transfer
    142     jc      SHORT ReturnWithTransferErrorInAH
    143     xchg    si, di                              ; ES:DI now points buffer
    144 
    145     ; Increment number of successfully read WORDs
    146     mov     ax, [bp+PIOVARS.wWordsInBlock]
    147     sub     [bp+PIOVARS.wWordsLeft], ax
    148     add     [bp+PIOVARS.wWordsDone], ax
    149     jmp     SHORT .ReadNextBlockFromDrive
    150 
    151 ALIGN JUMP_ALIGN
    152 .ReadLastBlockFromDrive:
    153     mov     cx, [bp+PIOVARS.wWordsLeft]
    154     call    [bp+PIOVARS.fnXfer]                 ; Transfer possibly partial block
    155 
    156     ; Check for errors in last block
    157     mov     di, si                              ; DS:DI now points DPT
    158 CheckErrorsAfterTransferringLastBlock:
    159     mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRDY)
    160     call    IdeWait_PollStatusFlagInBLwithTimeoutInBH
    161 
    162     ; Return number of successfully read sectors
    163 ReturnWithTransferErrorInAH:
    164     mov     cx, [bp+PIOVARS.wWordsDone]
    165     jc      SHORT .ConvertTransferredWordsInCXtoSectors
    166     add     cx, [bp+PIOVARS.wWordsLeft]         ; Never sets CF
    167 .ConvertTransferredWordsInCXtoSectors:
    168     xchg    cl, ch
    169     ret
    170 
    171 
    172 ;--------------------------------------------------------------------
    173171; InitializePiovarsInSSBPwithSectorCountInAH
    174172;   Parameters:
     
    180178;       Nothing
    181179;   Corrupts registers:
    182 ;       AX, BX, CX, DX
     180;       AX, BX, DX
    183181;--------------------------------------------------------------------
    184182ALIGN JUMP_ALIGN
     
    187185    xor     al, al
    188186    mov     [bp+PIOVARS.wWordsLeft], ax
     187    mov     ah, [di+DPT_ATA.bSetBlock]
     188    mov     [bp+PIOVARS.wWordsInBlock], ax
    189189    cbw
    190190    mov     [bp+PIOVARS.wWordsDone], ax         ; Zero
    191     mov     ah, [di+DPT_ATA.bSetBlock]
    192     mov     [bp+PIOVARS.wWordsInBlock], ax
    193191
    194192    ; Get transfer function based on bus type
    195193    xchg    ax, bx                              ; Lookup table offset to AX
    196     eMOVZX  bx, BYTE [di+DPT.bIdevarsOffset]    ; CS:BX now points to IDEVARS
     194    mov     bl, [di+DPT.bIdevarsOffset]         ; CS:BX now points to IDEVARS
    197195    mov     dx, [cs:bx+IDEVARS.wPort]           ; Load IDE Data port address
    198196    mov     bl, [cs:bx+IDEVARS.bDevice]         ; Load device type to BX
    199197    add     bx, ax
     198    mov     [bp+PIOVARS.wDataPort], dx
    200199    mov     ax, [cs:bx]                         ; Load offset to transfer function
    201     mov     [bp+PIOVARS.wDataPort], dx
    202200    mov     [bp+PIOVARS.fnXfer], ax
    203201    ret
     
    213211;       CX:     Block size in WORDs
    214212;       DX:     IDE Data port address
    215 ;       ES:DI:  Normalized ptr to buffer to recieve data
     213;       ES:DI:  Normalized ptr to buffer to receive data
    216214;   Returns:
    217215;       Nothing
     
    236234SingleByteRead:
    237235%ifdef USE_186  ; INS instruction available
     236    dec     cx          ; Avoid overflowing CX on a 128 sector transfer
    238237    shl     cx, 1       ; WORD count to BYTE count
     238    inc     cx
    239239    rep insb
     240    insb
    240241%else           ; If 8088/8086
    241242    shr     cx, 1       ; WORD count to DWORD count
     
    328329SingleByteWrite:
    329330%ifdef USE_186  ; OUTS instruction available
     331    dec     cx          ; Avoid overflowing CX on a 128 sector transfer
    330332    shl     cx, 1       ; WORD count to BYTE count
     333    inc     cx
    331334    es                  ; Source is ES segment
    332335    rep outsb
     336    es outsb
    333337%else           ; If 8088/8086
    334338    shr     cx, 1       ; WORD count to DWORD count
     
    386390
    387391
    388 
    389392; Lookup tables to get transfer function based on bus type
    390393ALIGN WORD_ALIGN
  • trunk/XTIDE_Universal_BIOS/Src/Device/MemoryMappedIDE/MemIdeTransfer.asm

    r238 r242  
    88    .wWordsLeft             resb    2   ; 2, WORDs left to transfer
    99    .wWordsDone             resb    2   ; 4, Number of sectors xferred
    10                             resb    1   ; 6,
     10    ; TODO: The above word vars could just as well be byte vars?
     11                            resb    1   ; 6,
    1112                            resb    1   ; 7, IDEPACK.bDeviceControl
    1213    .fpDPT                  resb    4   ; 8, Far pointer to DPT
     
    3435ALIGN JUMP_ALIGN
    3536MemIdeTransfer_StartWithCommandInAL:
     37    push    cs  ; We push CS here (segment of SAW) and later pop it to DS (reads) or ES (writes)
     38
    3639    ; Initialize MEMPIOVARS
    37     xchg    cx, ax                              ; IDE command to CL
    38     xor     al, al
    39     mov     ah, [bp+IDEPACK.bSectorCount]
    40     mov     [bp+MEMPIOVARS.wWordsLeft], ax
    41     cbw
    42     mov     [bp+MEMPIOVARS.wWordsDone], ax      ; Zero
    43     mov     ah, [di+DPT_ATA.bSetBlock]
    44     mov     [bp+MEMPIOVARS.wWordsInBlock], ax
     40    xor     cx, cx
     41    mov     [bp+MEMPIOVARS.wWordsDone], cx
     42    mov     ch, [bp+IDEPACK.bSectorCount]
     43    mov     [bp+MEMPIOVARS.wWordsLeft], cx
     44    mov     ch, [di+DPT_ATA.bSetBlock]
     45    mov     [bp+MEMPIOVARS.wWordsInBlock], cx
    4546    mov     [bp+MEMPIOVARS.fpDPT], di
    4647    mov     [bp+MEMPIOVARS.fpDPT+2], ds
    4748
    4849    ; Are we reading or writing?
    49     test    cl, 16  ; Bit 4 is cleared on all the read commands but set on 3 of the 4 write commands
    50     jnz     SHORT .PrepareToWriteDataFromESSI
    51     cmp     cl, COMMAND_WRITE_MULTIPLE
    52     je      SHORT .PrepareToWriteDataFromESSI
    53 
    54     ; Prepare to read data to ES:DI
    55     mov     di, si
    56     push    cs
    57     pop     ds
    58     mov     si, JRIDE_SECTOR_ACCESS_WINDOW_OFFSET
    59     jmp     SHORT ReadFromSectorAccessWindowInDSSItoESDI
    60 
    61 ALIGN JUMP_ALIGN
    62 .PrepareToWriteDataFromESSI:
    63     push    es
    64     pop     ds
    65     push    cs
    66     pop     es
    67     mov     di, JRIDE_SECTOR_ACCESS_WINDOW_OFFSET
    68     ; Fall to WriteToSectorAccessWindowInESDIfromDSSI
    69 
    70 
    71 ;--------------------------------------------------------------------
    72 ; WriteToSectorAccessWindowInESDIfromDSSI
    73 ;   Parameters:
    74 ;       DS:SI:  Normalized ptr to buffer containing data
    75 ;       ES:DI:  Ptr to Sector Access Window
     50    test    al, 16  ; Bit 4 is cleared on all the read commands but set on 3 of the 4 write commands
     51    jnz     SHORT WriteToSectorAccessWindow
     52    cmp     al, COMMAND_WRITE_MULTIPLE
     53    je      SHORT WriteToSectorAccessWindow
     54    ; Fall to ReadFromSectorAccessWindow
     55
     56;--------------------------------------------------------------------
     57; ReadFromSectorAccessWindow
     58;   Parameters:
     59;       Stack:  Segment part of ptr to Sector Access Window
     60;       ES:SI:  Normalized ptr to buffer to receive data
    7661;       SS:BP:  Ptr to MEMPIOVARS
    7762;   Returns:
     
    8469;       AL, BX, DX, SI, ES
    8570;--------------------------------------------------------------------
    86 WriteToSectorAccessWindowInESDIfromDSSI:
    87     ; Always poll when writing first block (IRQs are generated for following blocks)
    88     call    WaitUntilReadyToTransferNextBlock
    89     jc      SHORT ReturnWithMemoryIOtransferErrorInAH
    90 
    91 ALIGN JUMP_ALIGN
    92 .WriteNextBlockToDrive:
    93     mov     cx, [bp+PIOVARS.wWordsInBlock]
    94     cmp     [bp+PIOVARS.wWordsLeft], cx
    95     jbe     SHORT .WriteLastBlockToDrive
    96     eMOVZX  dx, ch                              ; DX = Sectors in block
    97     call    WriteSingleBlockFromDSSIToSectorAccessWindowInESDI
    98     call    WaitUntilReadyToTransferNextBlock
    99     jc      SHORT ReturnWithMemoryIOtransferErrorInAH
    100 
    101     ; Increment number of successfully written WORDs
    102     mov     ax, [bp+PIOVARS.wWordsInBlock]
    103     sub     [bp+PIOVARS.wWordsLeft], ax
    104     add     [bp+PIOVARS.wWordsDone], ax
    105     jmp     SHORT .WriteNextBlockToDrive
    106 
    107 ALIGN JUMP_ALIGN
    108 .WriteLastBlockToDrive:
    109     eMOVZX  dx, BYTE [bp+PIOVARS.wWordsLeft+1]  ; Sectors left
    110 %ifdef USE_186
    111     push    CheckErrorsAfterTransferringLastMemoryMappedBlock
    112     jmp     WriteSingleBlockFromDSSIToSectorAccessWindowInESDI
    113 %else
    114     call    WriteSingleBlockFromDSSIToSectorAccessWindowInESDI
    115     jmp     SHORT CheckErrorsAfterTransferringLastMemoryMappedBlock
    116 %endif
    117 
    118 
    119 ;--------------------------------------------------------------------
    120 ; WriteSingleBlockFromDSSIToSectorAccessWindowInESDI
    121 ;   Parameters:
    122 ;       DX:     Number of sectors in block
    123 ;       DS:SI:  Normalized ptr to source buffer
    124 ;       ES:DI:  Ptr to Sector Access Window
    125 ;   Returns:
    126 ;       CX, DX: Zero
    127 ;       SI:     Updated
    128 ;   Corrupts registers:
    129 ;       Nothing
    130 ;--------------------------------------------------------------------
    131 ALIGN JUMP_ALIGN
    132 WriteSingleBlockFromDSSIToSectorAccessWindowInESDI:
    133     mov     cx, JRIDE_SECTOR_ACCESS_WINDOW_SIZE / 2
    134     rep movsw
    135     sub     di, JRIDE_SECTOR_ACCESS_WINDOW_SIZE ; Reset for next sector
    136     dec     dx
    137     jnz     SHORT WriteSingleBlockFromDSSIToSectorAccessWindowInESDI
    138     ret
    139 
    140 
    141 ;--------------------------------------------------------------------
    142 ; ReadFromSectorAccessWindowInDSSItoESDI
    143 ;   Parameters:
    144 ;       ES:DI:  Normalized ptr to buffer to recieve data
    145 ;       DS:SI:  Ptr to Sector Access Window
    146 ;       SS:BP:  Ptr to MEMPIOVARS
    147 ;   Returns:
    148 ;       DS:DI:  Ptr to DPT (in RAMVARS segment)
    149 ;       AH:     BIOS Error code
    150 ;       CX:     Number of successfully transferred sectors
    151 ;       CF:     0 if transfer succesfull
    152 ;               1 if any error
    153 ;   Corrupts registers:
    154 ;       AL, BX, DX, SI, ES
    155 ;--------------------------------------------------------------------
    156 ALIGN JUMP_ALIGN
    157 ReadFromSectorAccessWindowInDSSItoESDI:
    158     call    WaitUntilReadyToTransferNextBlock
    159     jc      SHORT ReturnWithMemoryIOtransferErrorInAH
     71ReadFromSectorAccessWindow:
     72    pop     ds  ; CS -> DS
     73    mov     di, si
     74    mov     si, JRIDE_SECTOR_ACCESS_WINDOW_OFFSET
     75
     76    call    WaitUntilReadyToTransferNextBlock
     77    jc      SHORT ReturnWithMemoryIOtransferErrorInAH
     78
     79    mov     cx, [bp+PIOVARS.wWordsInBlock]
    16080
    16181ALIGN JUMP_ALIGN
    16282.ReadNextBlockFromDrive:
    163     mov     cx, [bp+PIOVARS.wWordsInBlock]
    16483    cmp     [bp+PIOVARS.wWordsLeft], cx
    16584    jbe     SHORT .ReadLastBlockFromDrive
    166     eMOVZX  dx, ch                              ; DX = Sectors in block
    16785    call    ReadSingleBlockFromSectorAccessWindowInDSSItoESDI
    16886    call    WaitUntilReadyToTransferNextBlock
     
    17088
    17189    ; Increment number of successfully read WORDs
    172     mov     ax, [bp+PIOVARS.wWordsInBlock]
    173     sub     [bp+PIOVARS.wWordsLeft], ax
    174     add     [bp+PIOVARS.wWordsDone], ax
     90    mov     cx, [bp+PIOVARS.wWordsInBlock]
     91    sub     [bp+PIOVARS.wWordsLeft], cx
     92    add     [bp+PIOVARS.wWordsDone], cx
    17593    jmp     SHORT .ReadNextBlockFromDrive
    17694
    17795ALIGN JUMP_ALIGN
    17896.ReadLastBlockFromDrive:
    179     eMOVZX  dx, BYTE [bp+PIOVARS.wWordsLeft+1]  ; Sectors left
     97    mov     ch, [bp+PIOVARS.wWordsLeft+1]       ; Sectors left
    18098    call    ReadSingleBlockFromSectorAccessWindowInDSSItoESDI
    18199
     
    186104    call    IDEDEVICE%+Wait_PollStatusFlagInBLwithTimeoutInBH
    187105
    188     ; Return number of successfully read sectors
     106    ; Return number of successfully transferred sectors
    189107ReturnWithMemoryIOtransferErrorInAH:
    190108    lds     di, [bp+MEMPIOVARS.fpDPT]           ; DPT now in DS:DI
     
    198116
    199117;--------------------------------------------------------------------
     118; WriteToSectorAccessWindow
     119;   Parameters:
     120;       Stack:  Segment part of ptr to Sector Access Window
     121;       ES:SI:  Normalized ptr to buffer containing data
     122;       SS:BP:  Ptr to MEMPIOVARS
     123;   Returns:
     124;       DS:DI:  Ptr to DPT (in RAMVARS segment)
     125;       AH:     BIOS Error code
     126;       CX:     Number of successfully transferred sectors
     127;       CF:     0 if transfer succesfull
     128;               1 if any error
     129;   Corrupts registers:
     130;       AL, BX, DX, SI, ES
     131;--------------------------------------------------------------------
     132ALIGN JUMP_ALIGN
     133WriteToSectorAccessWindow:
     134    push    es
     135    pop     ds
     136    pop     es  ; CS -> ES
     137    mov     di, JRIDE_SECTOR_ACCESS_WINDOW_OFFSET
     138
     139    ; Always poll when writing first block (IRQs are generated for following blocks)
     140    call    WaitUntilReadyToTransferNextBlock
     141    jc      SHORT ReturnWithMemoryIOtransferErrorInAH
     142
     143    mov     cx, [bp+PIOVARS.wWordsInBlock]
     144
     145ALIGN JUMP_ALIGN
     146.WriteNextBlockToDrive:
     147    cmp     [bp+PIOVARS.wWordsLeft], cx
     148    jbe     SHORT .WriteLastBlockToDrive
     149    call    WriteSingleBlockFromDSSIToSectorAccessWindowInESDI
     150    call    WaitUntilReadyToTransferNextBlock
     151    jc      SHORT ReturnWithMemoryIOtransferErrorInAH
     152
     153    ; Increment number of successfully written WORDs
     154    mov     cx, [bp+PIOVARS.wWordsInBlock]
     155    sub     [bp+PIOVARS.wWordsLeft], cx
     156    add     [bp+PIOVARS.wWordsDone], cx
     157    jmp     SHORT .WriteNextBlockToDrive
     158
     159ALIGN JUMP_ALIGN
     160.WriteLastBlockToDrive:
     161    mov     ch, [bp+PIOVARS.wWordsLeft+1]       ; Sectors left
     162%ifndef USE_186
     163    mov     bx, CheckErrorsAfterTransferringLastMemoryMappedBlock
     164    push    bx
     165%else
     166    push    CheckErrorsAfterTransferringLastMemoryMappedBlock
     167%endif
     168    ; Fall to WriteSingleBlockFromDSSIToSectorAccessWindowInESDI
     169
     170;--------------------------------------------------------------------
     171; WriteSingleBlockFromDSSIToSectorAccessWindowInESDI
     172;   Parameters:
     173;       CH:     Number of sectors in block
     174;       DS:SI:  Normalized ptr to source buffer
     175;       ES:DI:  Ptr to Sector Access Window
     176;   Returns:
     177;       CX, DX: Zero
     178;       SI:     Updated
     179;   Corrupts registers:
     180;       BX
     181;--------------------------------------------------------------------
     182ALIGN JUMP_ALIGN
     183WriteSingleBlockFromDSSIToSectorAccessWindowInESDI:
     184    mov     bx, di
     185    eMOVZX  dx, ch
     186    xor     cl, cl
     187ALIGN JUMP_ALIGN
     188.WriteBlock:
     189    mov     ch, JRIDE_SECTOR_ACCESS_WINDOW_SIZE >> 9
     190    rep movsw
     191    mov     di, bx  ; Reset for next sector
     192    dec     dx
     193    jnz     SHORT .WriteBlock
     194    ret
     195
     196
     197;--------------------------------------------------------------------
    200198; ReadSingleBlockFromSectorAccessWindowInDSSItoESDI
    201199;   Parameters:
    202 ;       DX:     Number of sectors in block
    203 ;       ES:DI:  Normalized ptr to buffer to recieve data (destination)
     200;       CH:     Number of sectors in block
     201;       ES:DI:  Normalized ptr to buffer to receive data (destination)
    204202;       DS:SI:  Ptr to Sector Access Window (source)
    205203;   Returns:
     
    207205;       DI:     Updated
    208206;   Corrupts registers:
    209 ;       Nothing
     207;       BX
    210208;--------------------------------------------------------------------
    211209ALIGN JUMP_ALIGN
    212210ReadSingleBlockFromSectorAccessWindowInDSSItoESDI:
    213     mov     cx, JRIDE_SECTOR_ACCESS_WINDOW_SIZE / 2
     211    mov     bx, si
     212    eMOVZX  dx, ch
     213    xor     cl, cl
     214ALIGN JUMP_ALIGN
     215.ReadBlock:
     216    mov     ch, JRIDE_SECTOR_ACCESS_WINDOW_SIZE >> 9
    214217    rep movsw
    215     sub     si, JRIDE_SECTOR_ACCESS_WINDOW_SIZE ; Reset for next sector
     218    mov     si, bx  ; Reset for next sector
    216219    dec     dx
    217     jnz     SHORT ReadSingleBlockFromSectorAccessWindowInDSSItoESDI
     220    jnz     SHORT .ReadBlock
    218221    ret
    219222
     
    238241    pop     ds
    239242    ret
     243
     244
     245%if JRIDE_SECTOR_ACCESS_WINDOW_SIZE <> 512
     246    %error "JRIDE_SECTOR_ACCESS_WINDOW_SIZE is no longer equal to 512. MemIdeTransfer.asm needs changes."
     247%endif
     248
  • trunk/XTIDE_Universal_BIOS/Src/Device/Serial/SerialCommand.asm

    r234 r242  
    112112        mov     ch,dh
    113113        xor     dh,dh
    114         eSHL_IM dx, 2           ; shift from one byte to two       
    115        
     114        eSHL_IM dx, 2           ; shift from one byte to two
     115
    116116        mov     al,[bp+IDEPACK.bSectorCount]
    117117
     
    599599;          wSerialPortAndBaud Non-Zero:
    600600;              previous serial drive not found:   -> Error - Not Found (4)
    601 ;              previosu serial drive found:       -> Continue with wSerialPackedAndBaud (5)
     601;              previous serial drive found:       -> Continue with wSerialPackedAndBaud (5)
    602602;          wSerialPortAndBaud Zero:
    603603;              previous serial drive not found:   -> Error - Not Found (4)
     
    608608;     And as with the int13h/25h case, we just go off and get the needed information using the user's setting.
    609609; (2) We are using the special .ideVarsSerialAuto structure.  During drive detection, we would only be here
    610 ;     if we hand't already seen a serial drive (since we only scan if no explicit drives are set),
     610;     if we hadn't already seen a serial drive (since we only scan if no explicit drives are set),
    611611;     so we go off to scan.
    612612; (3) We are using the special .ideVarsSerialAuto structure.  We won't get here during drive detection, but
     
    633633        pop     si
    634634        jnc     .notfounddpt
    635         mov     ax,[ds:di+DPT_SERIAL.wSerialPortAndBaud]
    636 .notfounddpt:   
     635        mov     ax, [di+DPT_SERIAL.wSerialPortAndBaud]
     636.notfounddpt:
    637637
    638638        test    bh, FLG_DRVNHEAD_DRV
     
    647647        jnz     .identifyDeviceInDX
    648648
    649         or      dx,ax           ; Since DX is zero, this effectively moves the previously found serial drive 
     649        or      dx,ax           ; Since DX is zero, this effectively moves the previously found serial drive
    650650                                ; information to dx, as well as test for zero
    651651        jz      .scanSerial
     
    672672        pop     cx
    673673        pop     dx
    674        
     674
    675675        pop     bp
    676676;
    677 ; place port and baud word in to the return sector, in a vendor specific area, 
     677; place port and baud word in to the return sector, in a vendor specific area,
    678678; which is read by FinalizeDPT and DetectDrives
    679679;
     
    732732; Begin baud rate scan on this port...
    733733;
    734 ; On a scan, we support 6 baud rates, starting here and going higher by a factor of two each step, with a 
     734; On a scan, we support 6 baud rates, starting here and going higher by a factor of two each step, with a
    735735; small jump between 9600 and 38800.  These 6 were selected since we wanted to support 9600 baud and 115200,
    736 ; *on the server side* if the client side had a 4x clock multiplier, a 2x clock multiplier, or no clock multiplier. 
     736; *on the server side* if the client side had a 4x clock multiplier, a 2x clock multiplier, or no clock multiplier.
    737737;
    738738; Starting with 30h, that means 30h (2400 baud), 18h (4800 baud), 0ch (9600 baud), and
     
    747747        shr     dh,1
    748748        jz      .nextPort
    749         cmp     dh,6            ; skip from 6 to 4, to move from the top of the 9600 baud range 
     749        cmp     dh,6            ; skip from 6 to 4, to move from the top of the 9600 baud range
    750750        jnz     .testBaud       ; to the bottom of the 115200 baud range
    751751        mov     dh,4
  • trunk/XTIDE_Universal_BIOS/Src/Device/Serial/SerialDPT.asm

    r233 r242  
    1313;       Nothing
    1414;   Corrupts registers:
    15 ;       AX, BX, CX, DX
     15;       AX
    1616;--------------------------------------------------------------------
    1717SerialDPT_Finalize:
    1818        or      byte [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE
    1919        mov     ax, [es:si+ATA6.wVendor]
    20         mov     word [di+DPT_SERIAL.wSerialPortAndBaud], ax
     20        mov     [di+DPT_SERIAL.wSerialPortAndBaud], ax
    2121        ret
    2222
Note: See TracChangeset for help on using the changeset viewer.