Asm Fader

 BBS: Inland Empire Archive
Date: 11-16-92 (03:58)             Number: 266
From: RICH GELDREICH               Refer#: NONE
  To: ALL                           Recvd: NO  
Subj: Asm Fader                      Conf: (2) Quik_Bas
Here is a noiseless fader written in assembly. It can fade both up and
down this time:

;Some noiseless VGA DAC fading routines for QB4.5/PDS
;By Rich Geldreich 1992
;Assembled with TASM v2.0
IDEAL
MODEL SMALL
DATASEG
Palette db 768 dup (?)
CODESEG
PUBLIC GetPalette, SetPalette
EVEN
PROC    SetPalette              ;Sets the pallette retrieved by
GetPalette
                                ;to a specified brightness
;DECLARE SUB SetPalette (BYVAL Brigtness, BYVAL Start, BYVAL Num)
Brightness EQU [ss:bp+10]
Start      EQU [ss:bp+08]
Num        EQU [ss:bp+06]
Parameters = 3

        Push    bp              ;set us up a stack frame
        Mov     bp, sp
        Push    ds si di        ;lets not get QB mad now

        Mov     ax, @data       ;get start of palette buffer
        Mov     ds, ax
        Mov     si, offset Palette

        Mov     ax, Start       ;get start color
        Mov     dx, 03C7h       ;get ready to start changing colors
        Out     dx, al
        Inc     dx
        Out     dx, al
        Inc     dx              ;dx=03C9h

        Mov     di, 03DAh       ;di=VGA status register

        Mov     bl, Brightness  ;limit brigtness to an 8 bit value

        Mov     cx, Num         ;CX=# of registers to change
        Jcxz    @@Done          ;if no registers to change then exit

        Add     ax, cx          ;calculate the last register to change
        Cmp     ax, 256         ;if too much then exit
        Ja      @@Done

        EVEN                    ;color alteration loop
@@10:   REPT    2               ;change Red & Green colors
        Lodsb
        Mul     bl              ;calculate (Color*brightness)\256
        Mov     al, ah
        Out     dx, al          ;do it
        ENDM

        Lodsb                   ;precalculate the last register
        Mul     bl
        Mov     bh, ah

        Xchg    dx, di          ;dx=status port
        EVEN
@@20:   In      al, dx          ;wait for horizontal retrace
        Test    al, 1
        Jz      @@20
        Xchg    dx, di
        Mov     al, bh
        Out     dx, al          ;let the change take affect where it's
safe
        Loop    @@10            ;'till done
@@Done:
        Pop     di si ds bp     ;pop us some regs
        Retf    Parameters*2    ;bye bye
ENDP    SetPalette
PROC    GetPalette              ;Must call this routine before
SetPalette!
;DECLARE SUB GetPalette ()
        Push    es
        Mov     ax, @data
        Mov     es, ax
        Mov     dx, offset Palette ;es:dx addresses palette
        Mov     cx, 256
        Xor     bx, bx
        Mov     ax, 01017h
        Int     010h
        Pop     es
        Retf    0
ENDP    GetPalette
END

The OBJ file(for those poor guys without TASM) and a small demo
follows this message.

--- MsgToss 2.0b
 * Origin: Computer Co-Op - Voorhees, NJ | Ted Hare (1:266/29)
Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET