Changeset 60 in xtideuniversalbios for trunk/Assembly_Library/Src/Menu/MenuTime.asm


Ignore:
Timestamp:
Nov 25, 2010, 2:17:45 PM (13 years ago)
Author:
aitotat
google:author:
aitotat
Message:

Changes to Assembly Library:

  • Timeout count down is now stopped when any key pressed.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Assembly_Library/Src/Menu/MenuTime.asm

    r47 r60  
    22; Project name  :   Assembly Library
    33; Created date  :   25.7.2010
    4 ; Last update   :   4.10.2010
     4; Last update   :   25.11.2010
    55; Author        :   Tomi Tilli
    66; Description   :   Menu timeouts other time related functions.
     
    1010
    1111;--------------------------------------------------------------------
    12 ; MenuTime_SetSelectionTimeoutValueFromAX
     12; MenuTime_StartSelectionTimeoutWithTicksInAX
    1313;   Parameters
    14 ;       AX:     Selection timeout in system timer ticks
    15 ;       SS:BP:  Ptr to MENU
    16 ;   Returns:
    17 ;       Nothing
    18 ;   Corrupts registers:
    19 ;       Nothing
    20 ;--------------------------------------------------------------------
    21 ALIGN JUMP_ALIGN
    22 MenuTime_SetSelectionTimeoutValueFromAX:
    23     mov     [bp+MENUINIT.wTimeoutTicks], ax
    24     ret
    25 
    26 
    27 ;--------------------------------------------------------------------
    28 ; MenuTime_RestartSelectionTimeout
    29 ;   Parameters
     14;       AX:     Timeout ticks
    3015;       SS:BP:  Ptr to MENU
    3116;   Returns:
     
    3520;--------------------------------------------------------------------
    3621ALIGN JUMP_ALIGN
    37 MenuTime_RestartSelectionTimeout:
     22MenuTime_StartSelectionTimeoutWithTicksInAX:
    3823    push    ds
    3924    call    PointDSBXtoTimeoutCounter
    40     mov     ax, [bp+MENUINIT.wTimeoutTicks]
    41     call    TimerTicks_InitializeTimeoutFromAX  ; End time to [DS:BX]
     25    call    TimerTicks_InitializeTimeoutFromAX
     26    or      BYTE [bp+MENU.bFlags], FLG_MENU_TIMEOUT_COUNTDOWN
    4227    pop     ds
     28    ret
     29
     30
     31;--------------------------------------------------------------------
     32; MenuTime_StopSelectionTimeout
     33;   Parameters
     34;       SS:BP:  Ptr to MENU
     35;   Returns:
     36;       Nothing
     37;   Corrupts registers:
     38;       AX, BX, DX, SI, DI
     39;--------------------------------------------------------------------
     40ALIGN JUMP_ALIGN
     41MenuTime_StopSelectionTimeout:
     42    test    BYTE [bp+MENU.bFlags], FLG_MENU_TIMEOUT_COUNTDOWN
     43    jz      SHORT .TimeoutAlreadyStopped
     44    and     BYTE [bp+MENU.bFlags], ~FLG_MENU_TIMEOUT_COUNTDOWN
     45    jmp     MenuBorders_RedrawBottomBorderLine
     46ALIGN JUMP_ALIGN
     47.TimeoutAlreadyStopped:
    4348    ret
    4449
     
    5257;               Cleared if time left
    5358;   Corrupts registers:
    54 ;       AX, BX, CX, DX, SI, DI
     59;       AX, BX, SI, DI
    5560;--------------------------------------------------------------------
    5661ALIGN JUMP_ALIGN
    5762MenuTime_UpdateSelectionTimeout:
     63    test    BYTE [bp+MENU.bFlags], FLG_MENU_TIMEOUT_COUNTDOWN
     64    jz      SHORT .ReturnSinceTimeoutDisabled
     65
    5866    push    ds
    59 
    60     call    MenuTime_DrawWithoutUpdating
    61     jnc     SHORT .TimeoutDisabled
    6267    call    PointDSBXtoTimeoutCounter
    63     call    TimerTicks_SetCarryIfTimeoutFromDSBX
     68    call    TimerTicks_GetTimeoutTicksLeftToAXfromDSBX
     69    pop     ds
     70    jnc     SHORT .RedrawSinceNoTimeout
     71    and     BYTE [bp+MENU.bFlags], ~FLG_MENU_TIMEOUT_COUNTDOWN
     72    stc
     73    ret
    6474
    6575ALIGN JUMP_ALIGN
    66 .TimeoutDisabled:
    67     pop     ds
    68     ret
    69 
    70 ;--------------------------------------------------------------------
    71 ; MenuTime_DrawWithoutUpdating
    72 ;   Parameters
    73 ;       SS:BP:  Ptr to MENU
    74 ;   Returns:
    75 ;       CF:     Set if timeout enabled
    76 ;               Cleared if timeout disabled
    77 ;   Corrupts registers:
    78 ;       AX, BX, CX, DX, SI, DI
    79 ;--------------------------------------------------------------------
     76.RedrawSinceNoTimeout:
     77    call    MenuBorders_RedrawTimeoutValue
     78    clc
    8079ALIGN JUMP_ALIGN
    81 MenuTime_DrawWithoutUpdating:
    82     cmp     WORD [bp+MENUINIT.wTimeoutTicks], BYTE 0
    83     je      SHORT .ReturnSinceTimeoutDisabled   ; Clear CF
    84 
    85     push    ds
    86     call    GetSecondsLeftUntilTimeoutToAXandCounterToDSBX
    87     call    DrawTimeoutInAXoverMenuBorders
    88     pop     ds
    89     stc
    90 ALIGN JUMP_ALIGN, ret
    9180.ReturnSinceTimeoutDisabled:
    9281    ret
     
    9483
    9584;--------------------------------------------------------------------
    96 ; GetSecondsLeftUntilTimeoutToAXandCounterToDSBX
     85; MenuTime_GetTimeoutSecondsLeftToAX
    9786;   Parameters
    9887;       SS:BP:  Ptr to MENU
    9988;   Returns:
    10089;       AX:     Seconds until timeout
    101 ;       DS:BX:  Ptr to timeout counter
    10290;   Corrupts registers:
    103 ;       AX, CX, DX
     91;       AX
    10492;--------------------------------------------------------------------
    10593ALIGN JUMP_ALIGN
    106 GetSecondsLeftUntilTimeoutToAXandCounterToDSBX:
     94MenuTime_GetTimeoutSecondsLeftToAX:
     95    push    ds
     96    push    dx
     97    push    cx
     98    push    bx
     99
    107100    call    PointDSBXtoTimeoutCounter
    108     call    TimerTicks_GetElapsedToAXfromDSBX
    109     neg     ax          ; Negate since DS:BX points to end time
    110     MAX_S   ax, 0       ; Set to zero if overflow
     101    call    TimerTicks_GetTimeoutTicksLeftToAXfromDSBX
     102    jc      SHORT .TimeoutHasOccurred
     103
    111104    xchg    dx, ax
    112     jmp     TimerTicks_GetSecondsToAXfromTicksInDX
     105    call    TimerTicks_GetSecondsToAXfromTicksInDX
     106    clc
     107    jmp     SHORT .PopRegistersAndReturn
     108.TimeoutHasOccurred:
     109    xor     ax, ax
     110    stc
     111.PopRegistersAndReturn:
     112    pop     bx
     113    pop     cx
     114    pop     dx
     115    pop     ds
     116    ret
    113117
    114118
     
    128132    lea     bx, [bp+MENU.wTimeoutCounter]
    129133    ret
    130 
    131 
    132 ;--------------------------------------------------------------------
    133 ; DrawTimeoutInAXoverMenuBorders
    134 ;   Parameters
    135 ;       AX:     Seconds to draw
    136 ;       SS:BP:  Ptr to MENU
    137 ;   Returns:
    138 ;       Nothing
    139 ;   Corrupts registers:
    140 ;       AX, CX, DX, SI, DI
    141 ;--------------------------------------------------------------------
    142 ALIGN JUMP_ALIGN
    143 DrawTimeoutInAXoverMenuBorders:
    144     xchg    cx, ax
    145     call    MenuBorders_AdjustDisplayContextForDrawingBorders
    146     call    MenuLocation_GetBottomBordersTopLeftCoordinatesToAX
    147     CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
    148     ; Fall to .PrintTimeoutStringWithSecondsInDX
    149 
    150 ;--------------------------------------------------------------------
    151 ; .PrintTimeoutStringWithSecondsInDX
    152 ;   Parameters
    153 ;       CX:     Seconds to print
    154 ;       SS:BP:  Ptr to MENU
    155 ;   Returns:
    156 ;       Nothing
    157 ;   Corrupts registers:
    158 ;       AX, DX, SI, DI
    159 ;--------------------------------------------------------------------
    160 ;ALIGN JUMP_ALIGN
    161 .PrintTimeoutStringWithSecondsInDX:
    162     push    bp
    163 
    164     mov     bp, sp
    165     call    .GetTimeoutAttributeToAXfromSecondsInCX
    166     mov     si, .szSelectionTimeout
    167     push    ax          ; Push attribute
    168     push    cx          ; Push seconds
    169     CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
    170     pop     bp
    171 
    172     ; Draw right border with normal border color
    173     mov     al, DOUBLE_RIGHT_HORIZONTAL_TO_SINGLE_VERTICAL
    174     jmp     MenuBorders_PrintSingleBorderCharacterFromAL
    175 .szSelectionTimeout:
    176     db      DOUBLE_BOTTOM_LEFT_CORNER
    177     db      DOUBLE_LEFT_HORIZONTAL_TO_SINGLE_VERTICAL
    178     db      "%AAutoselection in %2u s",NULL
    179 
    180 ;--------------------------------------------------------------------
    181 ; .GetTimeoutAttributeToAXfromSecondsInCX
    182 ;   Parameters
    183 ;       CX:     Seconds to print
    184 ;   Returns:
    185 ;       AX:     Attribute byte for seconds
    186 ;       CX:     Seconds to print
    187 ;   Corrupts registers:
    188 ;       SI, DI
    189 ;--------------------------------------------------------------------
    190 ALIGN JUMP_ALIGN
    191 .GetTimeoutAttributeToAXfromSecondsInCX:
    192     mov     si, ATTRIBUTE_CHARS.cNormalTimeout
    193     cmp     cx, BYTE 3
    194     ja      SHORT .GetAttributeToAX
    195     add     si, BYTE ATTRIBUTE_CHARS.cHurryTimeout - ATTRIBUTE_CHARS.cNormalTimeout
    196 ALIGN JUMP_ALIGN
    197 .GetAttributeToAX:
    198     jmp     MenuAttribute_GetToAXfromTypeInSI
Note: See TracChangeset for help on using the changeset viewer.