Changeset 48 in xtideuniversalbios for trunk/Assembly_Library/Src/Display/DisplayCharOut.asm


Ignore:
Timestamp:
Oct 8, 2010, 3:44:05 PM (14 years ago)
Author:
aitotat
google:author:
aitotat
Message:

Changes to Assembly Library:
Added functions to clear Menu Title and Information areas.
Implemented automatic line change when writing Menu Title and Information areas.
CGA snow related functions have been moved to CgaSnow.asm.
Keyboard input functions no longer produce beep for backspace.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Assembly_Library/Src/Display/DisplayCharOut.asm

    r47 r48  
    22; Project name  :   Assembly Library
    33; Created date  :   26.6.2010
    4 ; Last update   :   4.10.2010
     4; Last update   :   8.10.2010
    55; Author        :   Tomi Tilli
    66; Description   :   Functions for outputting characters to video memory.
     
    1111; Section containing code
    1212SECTION .text
    13 
    14 ;--------------------------------------------------------------------
    15 ; WAIT_RETRACE_IF_NECESSARY_THEN
    16 ;   Parameters:
    17 ;       AL:     Character to output
    18 ;       AH:     Attribute to output (stosw only)
    19 ;       DS:     BDA segment (zero)
    20 ;       ES:DI:  Ptr to video memory where to output
    21 ;   Returns:
    22 ;       DI:     Incremented for next character
    23 ;   Corrupts registers:
    24 ;       AX, DX
    25 ;--------------------------------------------------------------------
    26 %macro WAIT_RETRACE_IF_NECESSARY_THEN 1
    27 %ifdef ELIMINATE_CGA_SNOW
    28     %ifidn %1, stosb
    29         call    StosbWithoutCgaSnow
    30     %else
    31         call    StoswWithoutCgaSnow
    32     %endif
    33 %else
    34     %1          ; STOSB or STOSW
    35 %endif
    36 %endmacro
    37 
    3813
    3914;--------------------------------------------------------------------
     
    155130.BufferFull:
    156131    ret
    157 
    158 
    159 ; STOSB and STOSW replacement functions to prevent CGA snow. These will slow
    160 ; drawing a lot so use them only if it is necessary to eliminate CGA snow.
    161 %ifdef ELIMINATE_CGA_SNOW
    162 
    163 OFFSET_TO_CGA_STATUS_REGISTER   EQU     6       ; Base port 3D4h + 6 = 3DAh
    164 CGA_STATUS_REGISTER             EQU     3DAh
    165 
    166 ;--------------------------------------------------------------------
    167 ; WAIT_UNTIL_SAFE_CGA_WRITE
    168 ;   Parameters:
    169 ;       DX:     CGA Status Register Address (3DAh)
    170 ;   Returns:
    171 ;       Nothing
    172 ;   Corrupts registers:
    173 ;       AL
    174 ;--------------------------------------------------------------------
    175 %macro WAIT_UNTIL_SAFE_CGA_WRITE 0
    176 %%WaitUntilNotInRetrace:
    177     in      al, dx
    178     shr     al, 1   ; 1 = Bit 0: A 1 indicates that regen-buffer memory access can be
    179                     ; made without interfering with the display. (H or V retrace)
    180     jc      SHORT %%WaitUntilNotInRetrace
    181 %%WaitUntilNextRetraceStarts:
    182     in      al, dx
    183     shr     al, 1
    184     jnc     SHORT %%WaitUntilNextRetraceStarts
    185 %endmacro
    186 
    187 ;--------------------------------------------------------------------
    188 ; StosbWithoutCgaSnow
    189 ; StoswWithoutCgaSnow
    190 ;   Parameters:
    191 ;       AL:     Character to output
    192 ;       AH:     Attribute to output (StoswWithoutCgaSnow only)
    193 ;       DS:     BDA segment (zero)
    194 ;       ES:DI:  Ptr to video memory where to output
    195 ;   Returns:
    196 ;       DI:     Incremented for next character
    197 ;   Corrupts registers:
    198 ;       AX, DX
    199 ;--------------------------------------------------------------------
    200 ALIGN JUMP_ALIGN
    201 StosbWithoutCgaSnow:
    202     call    DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA
    203     jne     SHORT .StosbWithoutWaitSinceUnknownPort
    204 
    205     mov     ah, al
    206     cli             ; Interrupt request would mess up timing
    207     WAIT_UNTIL_SAFE_CGA_WRITE
    208     mov     al, ah
    209 .StosbWithoutWaitSinceUnknownPort:
    210     stosb
    211     sti
    212     ret
    213 
    214 ALIGN JUMP_ALIGN
    215 StoswWithoutCgaSnow:
    216     push    bx
    217     call    DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA
    218     jne     SHORT .StoswWithoutWaitSinceUnknownPort
    219 
    220     xchg    bx, ax
    221     cli             ; Interrupt request would mess up timing
    222     WAIT_UNTIL_SAFE_CGA_WRITE
    223     xchg    ax, bx
    224 .StoswWithoutWaitSinceUnknownPort:
    225     stosw
    226     pop     bx
    227     sti
    228     ret
    229 
    230 
    231 ;--------------------------------------------------------------------
    232 ; DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA
    233 ;   Parameters:
    234 ;       DS:     BDA segment (zero)
    235 ;   Returns:
    236 ;       DX:     CGA Status Register Address
    237 ;       ZF:     Set if CGA Base Port found in BDA
    238 ;   Corrupts registers:
    239 ;       Nothing
    240 ;--------------------------------------------------------------------
    241 ALIGN JUMP_ALIGN
    242 DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA:
    243     mov     dx, [BDA.wVidPort]
    244     add     dl, OFFSET_TO_CGA_STATUS_REGISTER
    245     cmp     dx, CGA_STATUS_REGISTER
    246     ret
    247 
    248 %endif ; ELIMINATE_CGA_SNOW
Note: See TracChangeset for help on using the changeset viewer.