Metropoli BBS
VIEWER: dblscrl.asm MODE: TEXT (ASCII)
;=============================================================================
; dblscrl.asm - Double Horizontal Scroller.
;                                                   File created: 11/21/93
; Copyright (c) 1993, Carlos Hasan                 Last modified: 11/21/93
;
; Description:
;  Another Horizontal Scroller using a Logo Picture of 256x128x256.
;
; Dependency:
;  Requires Turbo Assembler 3.2 or later to be assembled.
;  Dependant on the IBM PC 286 or better processor.
;=============================================================================

        ideal
        model   small,pascal
        jumps
        p286

        dosseg
        stack   1024
	ends

        global  LogoRAW:byte            ; LOGO.RAW linked file.
        global  LogoPAL:byte            ; LOGO.PAL linked file.

;=========================== Data Segment ====================================

        dataseg

SCREENWIDTH     equ  (2*320)            ; Logical Screen Width
                                        ; Enough Space for Double-Window
LOGOWIDTH       equ  256                ; Logo Piccy Dimensions.
LOGOHEIGHT      equ  128
SCROLLSPEED     equ  2                  ; Scrollers Speed.

;=========================== Code Segment ====================================

        codeseg

;-----------------------------------------------------------------------------
; SetModeX - Sets the VGA in Tweaked ModeX 320x400x256.
;-----------------------------------------------------------------------------

proc    SetModeX
        mov     ax,0013h                ; Sets VGA linear 320x200x256
        int     10h
        mov     dx,3C4h                 ; Disable Chain-Four
        mov     ax,0604h
        out     dx,ax
        mov     dx,3C4h                 ; Enable Write to All Four Planes
        mov     ax,0F02h
        out     dx,ax
        mov     ax,0A000h               ; Clear Display Memory
        mov     es,ax
        xor     di,di
        xor     ax,ax
        mov     cx,8000h
        cld
        rep     stosw
        mov     dx,3D4h                 ; Reprogram CRT Controller:
        mov     ax,00014h               ; turn off dword mode
        out     dx,ax
        mov     ax,0e317h               ; turn on byte mode
        out     dx,ax
        mov     ax,00009h               ; cell height
        out     dx,ax
        mov     dx,3D4h                 ; Sets Logical Screen Width
        mov     al,13h
        mov     ah,SCREENWIDTH/8
        out     dx,ax
        ret
endp    SetModeX

;-----------------------------------------------------------------------------
; SetStartAddr - Sets the VGA Start Address Register.
; In:
;  BX = Start Address.
;-----------------------------------------------------------------------------

proc    SetStartAddr
        mov     dx,3D4h                 ; Sets VGA Start Address
        mov     al,0Dh
        mov     ah,bl
        out     dx,ax
        dec     al
        mov     ah,bh
        out     dx,ax
        ret
endp    SetStartAddr

;-----------------------------------------------------------------------------
; WaitVR - Waits the Next VGA Vertical Retrace Ending.
;-----------------------------------------------------------------------------

proc    WaitVR
        mov     dx,3DAh
WaitStartVR:
        in      al,dx
        test    al,8
        je      WaitStartVR
WaitEndVR:
        in      al,dx
        test    al,8
        jne     WaitEndVR
        ret
endp    WaitVR

;-----------------------------------------------------------------------------
; DrawLogo - Writes on Screen the Logo Picture.
;-----------------------------------------------------------------------------

proc    DrawLogo
        pusha
        push    ds
        push    es
        call    WaitVR
        mov     ax,SEG LogoPAL          ; Sets the Logo Palette
        mov     ds,ax
        mov     si,OFFSET LogoPAL
        mov     cx,768
        mov     dx,3C8h
        xor     al,al
        out     dx,al
        inc     dx
        rep     outsb
        mov     ax,SEG LogoRAW          ; Load LogoRAW Address
        mov     ds,ax
        mov     si,OFFSET LogoRAW
        mov     ax,0A000h               ; Load Display Memory Segment
        mov     es,ax
        mov     ax,1102h
DrawPlanes:
        push    ax
        push    si
        mov     dx,3C4h                 ; Select Write Plane
        out     dx,ax
        mov     di,(320+SCREENWIDTH*220)/4
        mov     bx,LOGOHEIGHT           ; Write Pixels
DrawLoop:
        mov     cx,LOGOWIDTH/4
DrawRow:
        mov     al,[ds:si]
        mov     [es:di],al
        add     si,4
        inc     di
        loop    DrawRow
        add     di,(SCREENWIDTH-LOGOWIDTH)/4
        dec     bx
        jne     DrawLoop
        pop     si
        pop     ax
        inc     si
        add     ah,ah                   ; Next Plane.
        jnc     DrawPlanes
        pop     es
        pop     ds
        popa
        ret
endp    DrawLogo

;-----------------------------------------------------------------------------
; Start - Start the Demostration. Called from DOS.
;-----------------------------------------------------------------------------

proc    Start
        mov     ax,@Data                ; Sets Data Segment.
        mov     ds,ax
        mov     bx,sp                   ; Shrink Program Memory Block.
        shr     bx,4
        inc     bx
        mov     ax,ss
        mov     dx,es
        sub     ax,dx
        add     bx,ax
        mov     ah,4Ah
        int     21h
        call    SetModeX                ; Sets VGA ModeX.
        call    DrawLogo                ; Draw Logo.
        mov     cx,35                   ; Sleep about 0.5 sec
SleepEntry:
        call    WaitVR
        loop    SleepEntry
        mov     si,0                    ; Starting Scrollers
        mov     di,SCREENWIDTH*164/4    ; Address Offsets.
DemoLoop:
        call    WaitVR                  ; Waits Vertical Retrace.
        mov     bx,si                   ; Show Upper Scroller.
        call    SetStartAddr
        call    WaitVR                  ; Waits Vertical Retrace.
        mov     bx,di                   ; Show Bottom Scroller
        call    SetStartAddr
        add     si,SCROLLSPEED          ; Move Scrollers to the Left&Right.
        sub     di,SCROLLSPEED
        cmp     si,SCREENWIDTH/4        ; Enough Frames?
        jbe     DemoLoop
DemoExit:
        mov     cx,35                   ; Sleep about 0.5 sec
SleepExit:
        call    WaitVR
        loop    SleepExit
        mov     ax,0003h                ; Set Text Mode.
        int     10h
        mov     ax,4C00h                ; Exit to DOS.
        int     21h
endp    Start

        end     Start
[ RETURN TO DIRECTORY ]