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


Ignore:
Timestamp:
Sep 18, 2010, 6:04:31 PM (14 years ago)
Author:
aitotat
google:author:
aitotat
Message:

Display Library no more produces CGA snow.

File:
1 edited

Legend:

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

    r41 r42  
    22; Project name  :   Assembly Library
    33; Created date  :   26.6.2010
    4 ; Last update   :   13.8.2010
     4; Last update   :   18.9.2010
    55; Author        :   Tomi Tilli
    66; Description   :   Functions for outputting characters to video memory.
     
    1313
    1414;--------------------------------------------------------------------
     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
     38
     39;--------------------------------------------------------------------
    1540; DisplayCharOut_TeletypeOutputWithAttribute
    1641; DisplayCharOut_TeletypeOutput
     
    2954    cmp     al, ' '                         ; Printable character?
    3055    jb      SHORT DisplayCharOut_BiosTeletypeOutput
    31     stosw
     56    WAIT_RETRACE_IF_NECESSARY_THEN stosw
    3257    ret
    3358
     
    85110;       AL:     Character to output
    86111;       AH:     Attribute to output
    87 ;       ES:DI:  Ptr to video memory where to output
    88 ;   Returns:
    89 ;       DI:     Incremented for next character
    90 ;   Corrupts registers:
    91 ;       AX
     112;       DS:     BDA segment (zero)
     113;       ES:DI:  Ptr to video memory where to output
     114;   Returns:
     115;       DI:     Incremented for next character
     116;   Corrupts registers:
     117;       AX, DX
    92118;--------------------------------------------------------------------
    93119ALIGN JUMP_ALIGN
     
    95121    xchg    al, ah              ; Swap character and attribute
    96122    inc     di                  ; Skip character
    97     stosb
     123    WAIT_RETRACE_IF_NECESSARY_THEN stosb
    98124    ret
    99125
    100126ALIGN JUMP_ALIGN
    101127DisplayCharOut_Character:
    102     stosb
     128    WAIT_RETRACE_IF_NECESSARY_THEN stosb
    103129    inc     di                  ; Skip attribute
    104130    ret
     
    106132ALIGN JUMP_ALIGN
    107133DisplayCharOut_CharacterWithAttribute:
    108     stosw
     134    WAIT_RETRACE_IF_NECESSARY_THEN stosw
    109135    ret
    110136
     
    129155.BufferFull:
    130156    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
     163OFFSET_TO_CGA_STATUS_REGISTER   EQU     6       ; Base port 3D4h + 6 = 3DAh
     164CGA_STATUS_REGISTER             EQU     3DAh
     165
     166;--------------------------------------------------------------------
     167; WAIT_UNTIL_SAFE_CGA_WRITE
     168;   Parameters:
     169;       DX:     CGA Status Register Address (3DAh)
     170;   Returns:
     171;       Interrupts disabled
     172;   Corrupts registers:
     173;       AL
     174;--------------------------------------------------------------------
     175%macro WAIT_UNTIL_SAFE_CGA_WRITE 0
     176    cli             ; Interrupt request would mess up timing
     177%%WaitUntilNotInRetrace:
     178    in      al, dx
     179    shr     al, 1   ; 1 = Bit 0: A 1 indicates that regen-buffer memory access can be
     180                    ; made without interfering with the display. (H or V retrace)
     181    jc      SHORT %%WaitUntilNotInRetrace
     182    sti
     183    nop             ; Should have time to serve IRQ here
     184    cli
     185%%WaitUntilNextRetraceStarts:
     186    in      al, dx
     187    shr     al, 1
     188    jnc     SHORT %%WaitUntilNextRetraceStarts
     189%endmacro
     190
     191;--------------------------------------------------------------------
     192; StosbWithoutCgaSnow
     193; StoswWithoutCgaSnow
     194;   Parameters:
     195;       AL:     Character to output
     196;       AH:     Attribute to output (StoswWithoutCgaSnow only)
     197;       DS:     BDA segment (zero)
     198;       ES:DI:  Ptr to video memory where to output
     199;   Returns:
     200;       DI:     Incremented for next character
     201;   Corrupts registers:
     202;       AX, DX
     203;--------------------------------------------------------------------
     204ALIGN JUMP_ALIGN
     205StosbWithoutCgaSnow:
     206    call    LoadAndVerifyStatusRegisterFromBDA
     207    jne     SHORT .StosbWithoutWaitSinceUnknownPort
     208
     209    mov     ah, al
     210    WAIT_UNTIL_SAFE_CGA_WRITE
     211    mov     al, ah
     212    stosb
     213    sti
     214    ret
     215ALIGN JUMP_ALIGN
     216.StosbWithoutWaitSinceUnknownPort:
     217    stosb
     218    ret
     219
     220ALIGN JUMP_ALIGN
     221StoswWithoutCgaSnow:
     222    call    LoadAndVerifyStatusRegisterFromBDA
     223    jne     SHORT .StoswWithoutWaitSinceUnknownPort
     224
     225    push    bx
     226    xchg    bx, ax
     227    WAIT_UNTIL_SAFE_CGA_WRITE
     228    xchg    ax, bx
     229    stosw
     230    pop     bx
     231    sti
     232    ret
     233ALIGN JUMP_ALIGN
     234.StoswWithoutWaitSinceUnknownPort:
     235    stosw
     236    ret
     237
     238;--------------------------------------------------------------------
     239; LoadAndVerifyStatusRegisterFromBDA
     240;   Parameters:
     241;       DS:     BDA segment (zero)
     242;   Returns:
     243;       DX:     CGA Status Register Address
     244;       ZF:     Set if CGA Base Port found in BDA
     245;   Corrupts registers:
     246;       Nothing
     247;--------------------------------------------------------------------
     248ALIGN JUMP_ALIGN
     249LoadAndVerifyStatusRegisterFromBDA:
     250    mov     dx, [BDA.wVidPort]
     251    add     dl, OFFSET_TO_CGA_STATUS_REGISTER
     252    cmp     dx, CGA_STATUS_REGISTER
     253    ret
     254
     255%endif ; ELIMINATE_CGA_SNOW
Note: See TracChangeset for help on using the changeset viewer.