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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/XTIDE_Universal_BIOS/Src/Initialization/Interrupts.asm

    r243 r258  
    3434    mov     ax, [es:BIOS_DISK_INTERRUPT_13h*4]  ; Load old INT 13h offset
    3535    mov     [RAMVARS.fpOldI13h], ax             ; Store old INT 13h offset
    36 
    37     mov     bx, BIOS_DISK_INTERRUPT_13h         ; INT 13h interrupt vector offset
    38     mov     si, Int13h_DiskFunctionsHandler     ; Interrupt handler offset
    39     call    Interrupts_InstallHandlerToVectorInBXFromCSSI
    4036
    4137    ; Only store INT 13h handler to 40h if 40h is not already installed.
     
    4743    mov     [es:BIOS_DISKETTE_INTERRUPT_40h*4+2], dx    ; Store old INT 13h segment
    4844.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
    4949    ; Fall to .InitializeHardwareIrqHandlers
    5050
     
    5656;       Nothing
    5757;   Corrupts registers:
    58 ;       BX, CX, DX, SI, DI
     58;       BX, CX, DX, SI, DI, AX
    5959;--------------------------------------------------------------------
    6060.InitializeHardwareIrqHandlers:
     
    6262    mov     di, ROMVARS.ideVars0            ; CS:SI points to first IDEVARS
    6363.IdeControllerLoop:
    64     eMOVZX  bx, BYTE [cs:di+IDEVARS.bIRQ]
     64    mov     al, BYTE [cs:di+IDEVARS.bIRQ]
    6565    add     di, BYTE IDEVARS_size           ; Increment to next controller
    6666    call    .InstallLowOrHighIrqHandler
     
    7272; .InstallLowOrHighIrqHandler
    7373;   Parameters:
    74 ;       BX:     IRQ number, 0 if IRQ disabled
     74;       AL:     IRQ number, 0 if IRQ disabled
    7575;       ES:     BDA and Interrupt Vector segment (zero)
    7676;   Returns:
     
    8080;--------------------------------------------------------------------
    8181.InstallLowOrHighIrqHandler:
    82     test    bl, bl
     82    test    al, al
    8383    jz      SHORT .Return   ; IRQ not used
    84     cmp     bl, 8
     84    cmp     al, 8
    8585    jb      SHORT .InstallLowIrqHandler
    8686    ; Fall to .InstallHighIrqHandler
     
    9494;       Nothing
    9595;   Corrupts registers:
    96 ;       BX, SI
     96;       AL, BX, SI
    9797;--------------------------------------------------------------------
    9898.InstallHighIrqHandler:
    99     add     bx, BYTE HARDWARE_IRQ_8_INTERRUPT_70h - 8   ; Interrupt vector number
     99    add     al, BYTE HARDWARE_IRQ_8_INTERRUPT_70h - 8   ; Interrupt vector number
    100100    mov     si, IdeIrq_InterruptServiceRoutineForIrqs8to15
    101     jmp     SHORT Interrupts_InstallHandlerToVectorInBXFromCSSI
     101    jmp     SHORT Interrupts_InstallHandlerToVectorInALFromCSSI
    102102
    103103;--------------------------------------------------------------------
    104104; .InstallLowIrqHandler
    105105;   Parameters:
    106 ;       BX:     IRQ number (0...7)
    107 ;       ES:     BDA and Interrupt Vector segment (zero)
    108 ;   Returns:
    109 ;       Nothing
    110 ;   Corrupts registers:
    111 ;       BX, SI
     106;       AL:     IRQ number (0...7)
     107;       ES:     BDA and Interrupt Vector segment (zero)
     108;   Returns:
     109;       Nothing
     110;   Corrupts registers:
     111;       AL, BX, SI
    112112;--------------------------------------------------------------------
    113113.InstallLowIrqHandler:
    114     add     bx, BYTE HARDWARE_IRQ_0_INTERRUPT_08h       ; Interrupt vector number
     114    add     al, BYTE HARDWARE_IRQ_0_INTERRUPT_08h       ; Interrupt vector number
    115115    mov     si, IdeIrq_InterruptServiceRoutineForIrqs2to7
    116     ; Fall to Interrupts_InstallHandlerToVectorInBXFromCSSI
    117 
    118 
    119 ;--------------------------------------------------------------------
    120 ; Interrupts_InstallHandlerToVectorInBXFromCSSI
    121 ;   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)
    123123;       ES:     BDA and Interrupt Vector segment (zero)
    124124;       CS:SI:  Ptr to interrupt handler
     
    126126;       Nothing
    127127;   Corrupts registers:
    128 ;       BX
    129 ;--------------------------------------------------------------------
    130 Interrupts_InstallHandlerToVectorInBXFromCSSI:
    131     eSHL_IM bx, 2                   ; Shift for DWORD offset
     128;       AX, BX
     129;--------------------------------------------------------------------
     130Interrupts_InstallHandlerToVectorInALFromCSSI:
     131    mov     bl, 4                   ; Shift for DWORD offset, MUL smaller than other alternatives
     132    mul     bl
     133    xchg    ax, bx
    132134    mov     [es:bx], si             ; Store offset
    133135    mov     [es:bx+2], cs           ; Store segment
Note: See TracChangeset for help on using the changeset viewer.