BBS: Inland Empire Archive Date: 11-21-92 (23:08) Number: 346 From: RICH GELDREICH Refer#: NONE To: ALL Recvd: NO Subj: Asm Fader/fix 1 Conf: (2) Quik_Bas
Ooops! After looking back at the ASM fader I posted a few days ago, I discovered that I posted the wrong one! Duh! Well, here is the one I originally wanted to post. The ASM code follows. Next message has OBJ and test program. ;Noiseless VGA DAC fading routines for QB4.5/PDS(works on 286's and up) ;By Rich Geldreich 1992 ;Assembled with TASM v2.0 .286 IDEAL MODEL SMALL DATASEG Palette db 768 dup (?) NewPalette 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] ;0-128 Start EQU [ss:bp+08] ;0-255 Num EQU [ss:bp+06] ;1-256 Parameters = 3 Push bp ;set us up a stack frame Mov bp, sp Push es ds si di ;lets not get QB mad now Mov ax, @data ;get access to palette buffers Mov ds, ax Mov es, ax Xor ax, ax Mov al, Start ;get start color Mov dx, 03C7h ;tell the VGA some DAC values will Out dx, al ;be coming Inc dx Out dx, al Inc dx ;dh=3 Mov si, ax ;add start*3 to the palette offset Shl si, 1 Add si, ax Add si, offset Palette Mov bl, Brightness Cmp bl, 128 ;limit brightness if too high Jna @@Ok1 Mov bl, 128 @@Ok1: 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 Sub ax, 256 ;if too many then limit Jna @@OK2 Sub cx, ax @@OK2: Mov di, offset NewPalette Mov bp, cx ;save cx for later EVEN ;color precalculation loop @@10: REPT 3 ;repeat 3 times(for Red, Green, & Blue) Lodsb ; Mul bl ;new=old*brightness Shl ax, 1 ;new=(new*2)\256 or new=new\128 Mov al, ah Stosb ENDM Loop @@10 Mov cx, bp ;multiply number of colors by 3 Shl cx, 1 Add cx, bp Mov si, offset NewPalette Mov dl, 0DAh ;wait for vertical retrace @@15: In al, dx ;wait for end of vertical retrace Test al, 8 ;(for very fast machines) Jnz @@15 @@20: In al, dx ;now wait for start of vertical Test al, 8 ;retrace Jz @@20 Mov dl, 0C9h ;dx=03C9h Rep Outsb ;output the new colors @@Done: Pop di si ds es bp Retf Parameters*2 ;bye bye ENDP SetPalette PROC GetPalette ;Must call this routine before ;DECLARE SUB GetPalette () ;SetPalette! 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 --- MsgToss 2.0b * Origin: Computer Co-Op - Voorhees, NJ | Ted Hare (1:266/29)
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