Metropoli BBS
VIEWER: demo1.asm MODE: TEXT (ASCII)
Comment *

        Purpose:
            demos "flashing" text under attribute control mode 0.

        Required external modules:
            flash0.obj

        Prep:
            masm demo0;     (tested under MASM 5.1, OPTASM 1.5)
            link demo0+flash0;
            exe2bin demo0 demo0.com

        Run:
            demo0

        Copyright:
            none

        Author:
            C.J. Dunford [CompuServe 76703,2002]
            301/992-9371

        Revision history:
            1.00 10/03/89

*


code segment word public 'code'
assume cs:code,ds:code,es:code

extrn flash_init:near,flash_term:near
extrn pulse_color:near,pulse_color_partial:near
extrn grade_color_partial:near,grade_color:near
extrn blinker:near
extrn load_palettes:near,reset_palettes:near
extrn set_color:near,set_color_partial:near
extrn set_flash_rate:near,set_delta:near
extrn flash_enabled:byte

org 100h

; ===================================================================
;                                MAINLINE CODE
; ===================================================================

demo0:
; Initialize the VGA for controlled flashing
        call flash_init
        jnc demo1                       ; NC = VGA OK
            mov dx,offset no_VGA$       ; No VGA, terminate with message
            mov ah,9
            int 21h
            mov ax,4C01h
            int 21h

; Pulse reds and greens by slowly augmenting color intensity
demo1:
        mov ax,0202H                    ; AL=color 2 (green), AH=2 (incr/pal)
        call pulse_color                ; Create pulsed attribute
        mov ax,0204H                    ; AL=color 4 (red)
        call pulse_color
        mov ax,020AH                    ; AL=color 10 (brt green)
        call pulse_color
        mov ax,020CH                    ; AL=color 12 (brt red)
        call pulse_color                ; Create pulsed attribute
        call load_palettes              ; Load new palettes into VGA
                                        ; After this call, anything red or
                                        ; green will flash.  Nothing to it.
        mov si,offset rg_aug$           ; Display the demo
        call scrn

; Pulse all 16 attributes, using the same augmented intensity effect
        mov cx,16                       ; 16 attributes
        mov ax,0200H                    ; Start with attr 0
p16:        push ax
            call pulse_color
            pop ax
            inc al                      ; Next attribute
            loop p16
        call load_palettes
        mov si,offset all_aug$
        call scrn

; Instant color change: green to bright red
        call reset_palettes             ; Clear all special effects
        mov al,2
        mov si,offset max_red
        mov cx,0F08h
        call set_color_partial
        call load_palettes
        mov si,offset g2R$              ; Display the demo
        call scrn

; Graded color change: green to bright red
        call reset_palettes             ; Clear all special effects
        mov al,2
        mov si,offset max_red
        call grade_color
        call load_palettes
        mov si,offset grd_g2R$          ; Display the demo
        call scrn

; Blink red to bright red--periodic intensification
        call reset_palettes
        mov al,2
        call set_delta
        mov al,0C4H                     ; Set up blinking on bright red
        call blinker
        call load_palettes
        mov si,offset r2R$              ; Display the demo
        call scrn

; Demo simulated 'real' flashing
        call reset_palettes             ; Reset the green/red flashing
        mov al,2                        ; Flash a little faster
        call set_delta
        mov al,12                       ; Set up blinking on bright red
        call blinker
        call load_palettes
        mov si,offset flash$            ; Display the demo
        call scrn

; Demonstrate "softened blinking": instead of just blinking
; on and off, we reduce the intensity of the color in palettes 0-7
; and then set 8-15 to the BG color (black, in this case)
        call reset_palettes             ; Clear all special effect
        mov al,3                        ; Cyan attribute
        mov si,offset black
        mov cl,0
        mov ch,8
        call grade_color_partial        ; Grade cyan to black in 0->7
        mov al,3                        ; Black BG, cyan FG
        call blinker                    ; Makes cyan black in 8-15
        call load_palettes
        mov si,offset soft$
        call scrn

; Demo 'fading'.  Just grade the color to black (or whatever BG)
        call reset_palettes
        mov al,3
        mov si,offset black
        call grade_color
        call load_palettes
        mov si,offset fade$
        call scrn

; Demo "strobe" and "beacon" effects
        call reset_palettes
        mov al,1
        call set_delta
        mov al,14                       ; Set attr 14 to black, pals 0-14
        mov si,offset black
        mov cx,0E00h
        call set_color_partial          ; And to bright yellow for pal 15
        mov al,14
        mov si,offset max_yellow
        mov cx,0F0FH
        call set_color_partial

        mov al,1                        ; Set blue to max blue in pal 15
        mov si,offset max_blue
        mov cx,0F0FH
        call set_color_partial
        call load_palettes
        mov si,offset strobe$
        call scrn

; Demonstrate that the blink rate can be adjusted.  We make
; green and bright red flash bright green, very fast (~18/sec).
; The red/green flash is particularly psychedelic.
        call reset_palettes
        mov al,2
        mov si,offset max_grn
        call grade_color
        mov al,12
        mov si,offset max_grn
        call grade_color
        call load_palettes
        mov al,15
        call set_delta
        mov si,offset fast$
        call scrn

; ...and then very slowly.
        mov al,1
        call set_delta
        mov ax,9
        call set_flash_rate
        mov si,offset slow$
        call scrn
        mov ax,1
        call set_flash_rate
        mov al,2
        call set_delta

; Show that all this can be done with BG colors too.  We'll set blue
; to flash to bright blue and use it as a background.  Just for grins,
; we'll set attribute 2 (green) to display as blue, to show that you can
; have a plain blue and a flashing blue on the same screen (but there
; won't be any green).
        call reset_palettes
        mov al,1
        mov si,offset max_blue
        mov cx,0F08h
        call set_color_partial
        mov al,2
        mov si,offset blue
        call set_color
        call load_palettes
        mov si,offset back$
        mov al,20h
        call scrn9

; Demo shows that we can use bright backgrounds but still flash.
; We CLS with a bright BG, then flash cyan text to light cyan
        call hw_blink_off               ; Disable hardware blinking
        call reset_palettes
        mov al,93H                      ; Brt blue BG, cyan FG
        call blinker
        call load_palettes
        mov si,offset brightback$
        mov al,90h                      ; CLS with attrib 90 (bright blue)
        call scrn9
        call hw_blink_on                ; Re-enable hardware blink

; The grand finale.  Show that all effects can be mixed on one screen.
finale:
        mov al,1
        call set_delta

        ; "Beacon" in 1
        mov al,1                        ; Set blue to max blue in pal 15
        mov si,offset max_blue
        mov cx,0F0FH
        call set_color_partial

        ; Quick shift green to red in 2
        mov al,2
        mov si,offset max_red
        mov cx,0F08h
        call set_color_partial

        ; Graded green-to-red on attribute 3
        mov al,3                        ; Make attr 3 base green
        mov si,offset green
        call set_color
        mov al,3
        mov si,offset max_red
        call grade_color

        ; Blink red to bright red (periodic intensification) in 4
        mov al,0C4H                     ; Set up blinking on bright red
        call blinker

        ; Flash 5 on an off
        mov al,5
        call blinker

        ; "Softened blinking" in 6
        mov al,6
        mov si,offset black
        mov cx,0800h
        call grade_color_partial
        mov al,6
        call blinker

        ; "Fading" in 7
        mov al,7
        mov si,offset black
        call grade_color

        ; "Pulse" in 10
        mov al,10
        mov si,offset green
        call set_color
        mov ax,020AH
        mov cx,0F00H
        call pulse_color

        ; Blacken every other palette in 11 (we haven't seen this one yet)
        mov si,offset black
        mov cx,0000
GF10:       mov al,11
            call set_color_partial
            add cx,0202h
            cmp ch,0FH
            jbe GF10

        ; "Strobe" in 14
        mov al,14
        mov si,offset black
        mov cx,0E00h
        call set_color_partial
        mov al,14
        mov si,offset max_yellow
        mov cx,0F0FH
        call set_color_partial

        ; Load all those into VGA and display
        call load_palettes
        mov si,offset mixed$            ; Display the demo
        call scrn

; Demos done, clean up for return to DOS
        call flash_term

; Exit
        mov al,7
        call cls
        mov ax,4C00h
        int 21h

; No VGA found by flash_init, exit with message
no_VGA:
        mov dx,offset no_VGA$
        mov ah,9
        int 21h
        mov ax,4C01h
        int 21h

; ----- hw_blink_off -----------------------------------------------
; Function disables hardware blink, which enables bright BG.
; AX,BX destroyed.
;
hw_blink_off:
        mov ax,1003h
        xor bl,bl
        int 10h
        ret

; ----- hw_blink_on -----------------------------------------------
; Function enables hardware blink, which disables bright BG.
; AX,BX destroyed.
;
hw_blink_on:
        mov ax,1003h
        mov bl,1
        int 10h
        ret

; ----- scrn -------------------------------------------------------------
; This function clears the screen, displays the text at DS:SI, and waits
; for a keystroke.  Note that the text is flashing in background while
; we're in BIOS, waiting for a key.  In other words, once you've set
; up flashing, all you have to do is display text with the proper attributes
; (i.e., any attribute whose colors differ between palettes 1 and 2), then
; you can go on about your business.
;
; SCRN2 is similar but doesn't display the color chart and uses a
; background color of AL
;
scrn:
        mov al,7                        ; CLS with attrib 7 (B/W)
        call cls
        call display                    ; Display text at SI
        call colors                     ; Display the color chart
scrn50: mov si,offset prompt            ; And the "any key" prompt
        call display
        mov ah,1                        ; Wait for a keystroke
        int 21h
        ret

scrn9:
        call cls
        call display                    ; Display the message
        jmp scrn50

; ========================================================================
;                           FUNCTIONS FOR DEMO ONLY
; ========================================================================


; ----- colors -------------------------------------------------
; This subroutine display the chart of all 16 attributes.
;
show macro strings
        irp s,<strings>
          mov si,offset &s
          call display
        endm
endm

colors:
        show <Atr0,Atr1,Atr2,Atr3,Atr4,Atr5,Atr6,Atr7,Atr8,Atr9,AtrA,AtrB,AtrC,AtrD,AtrE,AtrF>
        ret


; ----- display -----------------------------------------------------
; Clears the screen and displays some text with various attributes.
; Text taken from DS:SI in this format:
;    Byte   Start row
;    Byte   Start col
;    Word   Number of char/attr pairs in string
;    Words  Char/attr pairs
;
display:
        lodsb                           ; Get row
        mov dh,al
        lodsb                           ; Get col
        mov dl,al
        lodsw                           ; Get length
        mov cx,ax
        mov bh,0                        ; Display page 0
        mov bp,si                       ; DS:BP -> char/attr string
        mov ax,1303h                    ; Display
        int 10h
        ret

; ----- cls ---------------------------------------------------------
; Clear the screen, attribute 7 (normally white over black).
; AX,BX,CX,DX destroyed.
;
cls:
        push si
        push ax

; Get last row number to DH
        push bp                         ; Function destroys ES:BP
        push es
        mov ax,1130h                    ; Char gen interface function
        xor bh,bh                       ; Any valid subfn is OK
        int 10h                         ; DL = last row #
        pop es
        pop bp
        mov dh,dl

; Get last column # to DL
        mov ah,0FH                      ; Video GETMODE
        int 10h
        dec ah                          ; AH = last col #
        mov dl,ah

; Clear screen from (0,0) to (DH,DL)
        pop ax                          ; Recover CLS attribute
        mov bh,al                       ; Attribute to BH
        mov cx,0                        ; From 0,0
        mov ax,0700H                    ; Scroll up, clear entire window
        int 10h

        pop si
        ret

; ========================================================================
;                                DATA FOR DEMO
; ========================================================================

; These are some color definitions that we'll use for some of the demos.
; Each definition is three bytes long (one each for red, green, and blue).
; Valid values for each byte are 0-63.
max_red     db 3FH,   0,   0
green       db   0, 2AH,   0
max_grn     db   0, 3FH,   0
max_cyan    db   0, 3FH, 3FH
black       db   0,   0,   0
max_yellow  db 3FH, 3FH,   0
blue        db   0,   0, 2AH
brt_blue    db   0,   0, 33H
max_blue    db   0,   0, 3FH


; Macro to define char/attr pairs for the demo display strings.
; Call: atext attrib,<text>
atext macro attr,dat
        irpc x,<dat>
            db "&x",attr
        endm
endm

; Text/attribute strings for the demo displays.  See DISPLAY routine.
rg_aug$ label byte
        db 0,0
        dw rg_aug$L
        atext 15,<This 'pulses' >
        atext 4,<REDS>
        atext 15,< and >
        atext 2,<GREENS>
        atext 15,<; high intensity >
        atext 10,<colors>
        atext 15,< pulse less dramatically>
rg_aug$L equ ($-rg_aug$-4)/2

all_aug$  label byte
        db 0,0
        dw all_aug$L
        atext 15,<This palette pulses all 16 attributes...>
all_aug$L equ ($-all_aug$-4)/2

g2R$  label byte
        db 0,0
        dw g2r$L
        atext 15,<Here we make green flash bright red...>
g2R$L equ ($-g2r$-4)/2

grd_g2R$  label byte
        db 0,0
        dw grd_g2R$L
        atext 15,<And this is a slow green-to-red 'grade'...>
grd_g2R$L equ ($-grd_g2R$-4)/2

flash$ label byte
        db 0,0
        dw flash$L
        atext 15,<We can also simulate blinking...>
flash$L equ ($-flash$-4)/2

strobe$ label byte
        db 0,0
        dw strobe$L
        atext 15,<This demonstrates strobes (E) and beacons (1)...>
strobe$L equ ($-strobe$-4)/2

r2R$ label byte
        db 0,0
        dw r2R$L
        atext 15,<Blinking by periodic intensification...>
r2R$L equ ($-r2R$-4)/2

mixed$ label byte
        db 0,0
        dw mixed$L
        atext 15,<All types of special effects can be mixed on one screen...>
mixed$L equ ($-mixed$-4)/2

fast$ label byte
        db 0,0
        dw fast$L
        atext 15,<You can make flashing very rapid...>
fast$L equ ($-fast$-4)/2

slow$ label byte
        db 0,0
        dw slow$L
        atext 15,<...or almost too slow to detect (C is obvious, but watch 2)...>
slow$L equ ($-slow$-4)/2

soft$ label byte
        db 0,0
        dw soft$L
        atext 15,<Here we demonstrate 'softened' blinking...>
soft$L equ ($-soft$-4)/2

fade$ label byte
        db 0,0
        dw fade$L
        atext 15,<And this is 'fading', which is even softer...>
fade$L equ ($-fade$-4)/2

back$ label byte
        db 10,16
        dw back$L
        atext 1EH,< All these effects work on background, too... >
back$L equ ($-back$-4)/2

brightback$ label byte
        db 10,0
        dw brightback$L
        atext 9Eh,<With hardware blink off, you can use bright BG but still >
        atext 93h,<flash>
        atext 9Eh,< your text>
brightback$L equ ($-brightback$-4)/2

prompt label byte
        db 24,0
        dw promptL
        atext 15,<Strike any key to continue...>
promptL equ ($-prompt-4)/2

; Macro generates the data definitions for the attribute chart
a = 0   ; Start with attribute 0
r = 2   ; At screen row 2
        irp x,<0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F>
Atr&x label byte
        db r,25
        dw 10
        REPT 10
            db "&x",a
        endm
        a = a+1
        r = r+1
        endm

; Error message for non-VGA systems
no_VGA$ db 'Sorry, flash demo requires VGA',13,10,10,'$'

code ends
end demo0
[ RETURN TO DIRECTORY ]