programmers resources
  http://www.intel-assembler.it/  (c)2017 intel-assembler.it   info@intel-assembler.it
 
Search :  
Lingua Italiana    English Language   
Index
 
just an empty assembly space
just an arrow Intel Platform
just an arrow Article & Guides
just an arrow Download Software


23/01/2009 Featured Article: How to remove Buzus Virus (permalink)




:::3140733:::
Bottone Scambio Directory Pubblicitaonline.it
Home Page | Articles & Guides | Download | Intel Platform | Contacts

Google
 


Bookmark and Share
Download 
Tell a friend



Simple Horizontal Scroller

Asm code for scrolling text in vga

(by carlos hasan)

A well commented code which implements a VGA text scroller. The code is quite simple, it: - Sets the VGA - Waits the Next VGA Vertical Retrace Ending - Initializes the Scroller Variables - Loads a New VGA Font - Polls the Horizontal Scroller -
This article is online from 2592 days and has been seen 9141 times





;=============================================================================
; scrl.asm - Simple Horizontal Scroller.
;                                                   File created: 11/21/93
; Copyright (c) 1993, Carlos Hasan                 Last modified: 11/21/93
;
; Description:
;  Just a simple scroller in VGA ModeX and an external proportional
; font file in VLA chars format. Mainly based on VLA scrollers.
;
; 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

IFDEF LinkFont
        global  FontFAR:byte            ; SCRL.FNT linked file.
ENDIF

;=========================== VLA Font Header =================================

struc   FontHeader
  Magic   db   "VGACH"                  ; Font Signature
  First   db   ?                        ; First Char
  Width   db   ?                        ; Font Width
  Height  db   ?                        ; Font Height
  Total   db   ?                        ; Number of Chars
ends    FontHeader

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

        dataseg

SCREENWIDTH     equ  (2*320+8)          ; Logical Screen Width
                                        ; Enough Space for Double-Window
                                        ; and the working hidden area
SCROLLROW       equ  180                ; Scroller Window Start Row.

WinOffs         dw   ?                  ; Window Offset
CharOffs        dw   ?                  ; Char BitMap Offset
MesgOffs        dw   ?                  ; Ascii-Message Offset
FontHead        FontHeader ?            ; Font Header
CharColumn      db   ?                  ; Cur Char Column
FontFirst       db   ?                  ; Font First Char
FontWidth       db   ?                  ; Font Max Width
FontHeight      db   ?                  ; Font Height
FontDataOfs     dw   ?                  ; Font Data Offset
FontDataSeg     dw   ?                  ; Font Data Segment
FontWidths      db   256 dup(?)         ; Font Width Table
FontSize        dw   ?                  ; Font Char Size (Width*Height)

IFNDEF LinkFont
FontFileName    db   "SCRL.FNT",0       ; Font File Name
ENDIF

TheMessage      db   " ... Hello out there ... "
db   "                        "
db   " ... I am PELUSA from Chile ... "
db   "                        "
db   " ... Just a simple scroller... "
db   "                        "
db   " ... only useful to say that it's the FAKE demo ... "
db   "                        "
db   " ... you probably could have guessed that ... "
db   "                        "
db   " ... I hate scrollers because i have nothing to say..."
db   "                        "
db   " ... now enjoy the rest of this LAME thing ... "
db   "                                    ",0

        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

;-----------------------------------------------------------------------------
; 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

;-----------------------------------------------------------------------------
; InitScroll - Initializes the Scroller Variables.
; Out:
;  CF=1 if function was not successful.
;  CF=0 if function was successful.
;-----------------------------------------------------------------------------

proc    InitScroll
        mov     [WinOffs],0             ; Start Window Column
        mov     [CharColumn],0          ; Start with a ZeroWidth Char
        mov     [CharOffs],0            ; ZeroWidth Char BitMap Address
        lea     ax,[TheMessage]         ; Sets Message Address
        mov     [MesgOffs],ax
        call    LoadFont                ; Load Font Data
        ret
endp    InitScroll

;-----------------------------------------------------------------------------
; DoneScroll - Done Scroller Variables.
;-----------------------------------------------------------------------------

proc    DoneScroll
IFNDEF LinkFont
        mov     es,[FontDataSeg]        ; Free Font Data Segment
        mov     ah,49h
        int     21h
ENDIF
        ret
endp    DoneScroll

;-----------------------------------------------------------------------------
; LoadFont - Loads a New VGA Font.
; Out:
;  CF=1 if function was not successful.
;  CF=0 if function was successful.
;-----------------------------------------------------------------------------

proc    LoadFont

IFDEF LinkFont
        mov     ax,SEG FontFAR          ; Load Font File Address
        mov     es,ax
        mov     [FontDataSeg],ax
        mov     [FontDataOfs],Size FontHeader
        mov     al,[es:FontHeader.First] ; Get Font First Char
        mov     [FontFirst],al
        mov     al,[es:FontHeader.Width] ; Get Font Data Size
        mov     ah,[es:FontHeader.Height]
        mov     [FontWidth],al
        mov     [FontHeight],ah
        mul     ah
        mov     [FontSize],ax
        mov     dl,[es:FontHeader.Total]
        xor     dh,dh
        mul     dx
        add     ax,Size FontHeader      ; Copy Font Widths.
        mov     si,ax
        xor     di,di
        mov     cl,[es:FontHeader.Total]
        xor     ch,ch
CopyWidths:
        mov     al,[es:si]
        mov     [FontWidths+di],al
        inc     si
        inc     di
        loop    CopyWidths
ELSE
        mov     [FontDataSeg],0
        mov     ax,3D00h                ; Open Font File
        lea     dx,[FontFileName]
        int     21h
        jc      LoadFontExit
        mov     bx,ax
        mov     ah,3Fh                  ; Read Font Header
        lea     dx,[FontHead]
        mov     cx,Size FontHeader
        int     21h
        jc      LoadFontExit
        mov     al,[FontHead.First]     ; Get Font First Char
        mov     [FontFirst],al
        mov     al,[FontHead.Width]     ; Get Font Data Size
        mov     ah,[FontHead.Height]
        mov     [FontWidth],al
        mov     [FontHeight],ah
        mul     ah
        mov     [FontSize],ax
        mov     dl,[FontHead.Total]
        xor     dh,dh
        mul     dx
        push    ax
        push    bx                      ; Alloc Space for Font Data
        mov     bx,ax
        shr     bx,4
        inc     bx
        mov     ah,48h
        int     21h
        pop     bx
        pop     cx
        jc      LoadFontExit
        push    ds                      ; Read Font Data
        mov     [FontDataSeg],ax
        mov     [FontDataOfs],0
        mov     ds,ax
        xor     dx,dx
        mov     ah,3Fh
        int     21h
        pop     ds
        jc      LoadFontExit
        lea     dx,[FontWidths]         ; Read Font Widths
        mov     cl,[FontHead.Total]
        xor     ch,ch
        mov     ah,3Fh
        int     21h
        jc      LoadFontExit
        mov     ah,3Eh                  ; Close Font File
        int     21h
ENDIF
LoadFontExit:
        ret
endp    LoadFont

;-----------------------------------------------------------------------------
; DrawScroll - Polls the Horizontal Scroller.
; Out:
;  CF=1 If no more scroll message.
;  CF=0 If more scroll message.
;-----------------------------------------------------------------------------

proc    DrawScroll
        mov     bx,[WinOffs]            ; Loads Window Offset
        add     bx,2
        mov     dx,3D4h                 ; Sets VGA Start Address
        mov     al,0Dh
        mov     ah,bl
        out     dx,ax
        dec     al
        mov     ah,bh
        out     dx,ax
        sub     [CharColumn],4          ; Advance 4 pixels
        jg      NoNewChar               ; Need a New Char?
        call    GetsNewChar             ; Yes, Draw a New Char
        jc      DrawScrollExit
NoNewChar:
        mov     ax,0A000h               ; Loads Display Memory Segment
        mov     es,ax
        mov     bl,[FontWidth]          ; Loads Font Width and Height
        mov     cl,[FontHeight]
        xor     bh,bh
        xor     ch,ch
        mov     bp,SCREENWIDTH/4        ; Loads Logical Screen Width

        mov     dx,3C4h                 ; Enable Write to Plane 1
        mov     ax,0102h
        out     dx,ax
        mov     si,[CharOffs]           ; Loads Char BitMap Address
        mov     di,[WinOffs]            ; Loads VGA Window Dest Address
        add     di,SCROLLROW*SCREENWIDTH/4
        push    cx
        push    ds
        mov     ds,[FontDataSeg]
DrawCharColumn1:
        mov     al,[ds:si]
        mov     [es:di],al
        mov     [es:di+SCREENWIDTH/8],al
        add     si,bx
        add     di,bp
        loop    DrawCharColumn1
        pop     ds
        pop     cx

        mov     dx,3C4h                 ; Enable Write to Plane 2
        mov     ax,0202h
        out     dx,ax
        mov     si,[CharOffs]           ; Loads Char BitMap Address
        mov     di,[WinOffs]            ; Loads VGA Window Dest Address
        inc     si
        add     di,SCROLLROW*SCREENWIDTH/4
        push    cx
        push    ds
        mov     ds,[FontDataSeg]
DrawCharColumn2:
        mov     al,[ds:si]
        mov     [es:di],al
        mov     [es:di+SCREENWIDTH/8],al
        add     si,bx
        add     di,bp
        loop    DrawCharColumn2
        pop     ds
        pop     cx

        mov     dx,3C4h                 ; Enable Write to Plane 3
        mov     ax,0402h
        out     dx,ax
        mov     si,[CharOffs]           ; Loads Char BitMap Address
        mov     di,[WinOffs]            ; Loads VGA Window Dest Address
        add     si,2
        add     di,SCROLLROW*SCREENWIDTH/4
        push    cx
        push    ds
        mov     ds,[FontDataSeg]
DrawCharColumn3:
        mov     al,[ds:si]
        mov     [es:di],al
        mov     [es:di+SCREENWIDTH/8],al
        add     si,bx
        add     di,bp
        loop    DrawCharColumn3
        pop     ds
        pop     cx

        mov     dx,3C4h                 ; Enable Write to Plane 4
        mov     ax,0802h
        out     dx,ax
        mov     si,[CharOffs]           ; Loads Char BitMap Address
        mov     di,[WinOffs]            ; Loads VGA Window Dest Address
        add     si,3
        add     di,SCROLLROW*SCREENWIDTH/4
        push    cx
        push    ds
        mov     ds,[FontDataSeg]
DrawCharColumn4:
        mov     al,[ds:si]
        mov     [es:di],al
        mov     [es:di+SCREENWIDTH/8],al
        add     si,bx
        add     di,bp
        loop    DrawCharColumn4
        pop     ds
        pop     cx

        inc     [WinOffs]               ; Advance Window by 4 pixels
        cmp     [WinOffs],SCREENWIDTH/8
        jb      DontWrapWindow
        mov     [WinOffs],0
DontWrapWindow:
        add     [CharOffs],4            ; Advance Char Column by 4
        clc
DrawScrollExit:
        ret
endp    DrawScroll

;-----------------------------------------------------------------------------
; GetsNewChar - Gets the next message Character.
; Out:
;  CF=1 If no more characters
;  CF=0 If more characters
;-----------------------------------------------------------------------------

proc    GetsNewChar
        mov     si,[MesgOffs]           ; Loads the Message Offset
GetCharLoop:
        lodsb                           ; Gets the Character
        test    al,al                   ; if End of Message ReStart
        jne     DrawCharNow
        stc
        jmp     GetsNewCharExit
DrawCharNow:
        mov     [MesgOffs],si           ; Save Message Offset
        sub     al,[FontFirst]          ; Compute the Char BitMap Address
        xor     ah,ah
        mov     bx,ax
        mov     dx,[FontSize]
        mul     dx
        add     ax,[FontDataOfs]
        mov     [CharOffs],ax
        mov     al,[FontWidths+bx]      ; Set the Char Width
        mov     [CharColumn],al
        clc
GetsNewCharExit:
        ret
endp    GetsNewChar


;-----------------------------------------------------------------------------
; 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    InitScroll              ; Init Scroller.
        jc      DemoExit
        cld
DemoLoop:
        call    WaitVR                  ; Waits Vertical Retrace.
        call    DrawScroll              ; Draw the Scroller.
        jc      DemoBreak
        mov     ah,1                    ; Any Key Pressed?
        int     16h                     ; No, Loop.
        je      DemoLoop
DemoBreak:
        call    DoneScroll              ; Done Scroller.
DemoExit:
        mov     ax,0003h                ; Set Text Mode.
        int     10h
        mov     ax,4C00h                ; Exit to DOS.
        int     21h
endp    Start

        end     Start




Top
Download 
Tell a friend
Bookmark and Share



Similar Articles

Accessing 256 kB of memory on a standard VGA-card
How to access unchained memory using bitplanes
(by Vulture)

An asm source code for Linux. Hello World
A 59 byte
(by Brian Raiter)

CPUID3 an Intel CPU detection program
Interesting src code for detecting different Cpus
(by Intel Corporation)

ELYSiUM's VGA Graphics & Sound Blaster Coding
Beginner VGA Graphics & Sound Blaster Programming
(by ELYSiUM)

Fastclock source code C / Asm
Coding on 8259 timer for high precision clock
(by unknown)

Leggi e Scrivi in Console
Esempio di codice per leggere e scrivere in consol
(by JES)

Linear Frame Buffer (LFB) Emulator
An LFB emulator for VESA with Asm source code
(by Alexei A. Frounze)

Make sound from the speaker using assembly
8253, 8255, 8284 program example in asm
(by William Cravener)

Sorgente ASM true.asm
An asm source code for Linux
(by Brian Raiter http://www.muppetlabs.com/~)

SVGA PutPixel
Programming the SVGA card in asm and C
(by ABE)

The PC GAMES PROGRAMMERS ENCYCLOPEDIA 1.0
A collection of 85 asm programming documents
(by various)

TIMING CODE MODULE (80x86 specific code)
Setting pc timer 8259 - Commented source code
(by Ethan Rohrer)

Uso rapido del CPUID
Esempio di codice per l'istruzione MMX CPUID
(by JES)

VGA Programmers Master Reference Manual
Complete VGA programming manual
(by Andrew Scott)

VGA Trainer Program
A course for graphic programming in Pascal/ASM
(by Grant Smith Denthor of ASPHYXIA)

x86 chksum.asm source code
8 bit Checksum (CRC) Calculation Utility/Sample
(by Erdogan Tan)

 Tags: vga, easy source


webmaster jes
writers rguru, tech-g, aiguru, drAx

site optimized for IE/Firefox/Chrome with 1024x768 resolution

Valid HTML 4.01 Transitional


ALL TRADEMARKS ® ARE PROPERTY OF LEGITTIMATE OWNERS.
© ALL RIGHTS RESERVED.

hosting&web - www.accademia3.it

grossocactus
find rguru on
http://www.twitter.com/sicurezza3/
... send an email ...
Your name

Destination email

Message

captcha! Code