What is the purpose of this program?

  • Thread starter Thread starter michael1978
  • Start date Start date
  • Tags Tags
    Language
AI Thread Summary
The discussion revolves around a program that demonstrates the use of write mode 2 for VGA and EGA graphics by drawing colored lines in various patterns. The code, which is compatible with TASM 4.0 and TLINK 6.10, sets up a graphics mode and utilizes a series of procedures to draw radial lines in different quadrants of the screen based on predefined color patterns. Key components include the setup of the graphics segment, the definition of patterns, and the implementation of line-drawing routines that handle horizontal, vertical, and diagonal lines. The program concludes by waiting for a key press before reverting to text mode. Participants express curiosity about the relevance of this older code, with suggestions for further reading on VGA graphics programming to enhance understanding.
michael1978
Messages
434
Reaction score
19
Code:
;
; *** Listing 5.2 ***
;
; Program to illustrate one use of write mode 2 of the VGA and EGA by
; drawing lines in color patterns.
;
; Assembled with TASM 4.0, linked with TLINK 6.10
; Checked by Jim Mischel 11/21/94
;
Stack  segment para stack 'STACK'
  db  512 dup(0)
Stack  ends

SCREEN_WIDTH_IN_BYTES  equ  80
GRAPHICS_SEGMENT  equ  0a000h  ;mode 10 bit-map segment
SC_INDEX  equ  3c4h  ;Sequence Controller Index register
MAP_MASK  equ  2  ;index of Map Mask register
GC_INDEX  equ  03ceh  ;Graphics Controller Index reg
GRAPHICS_MODE  equ  5  ;index of Graphics Mode reg
BIT_MASK  equ  8  ;index of Bit Mask reg

Data  segment para common 'DATA'
Pattern0  db  16
  db  0, 1, 2, 3, 4, 5, 6, 7, 8
  db  9, 10, 11, 12, 13, 14, 15
Pattern1  db  6
  db  2, 2, 2, 10, 10, 10
Pattern2  db  8
  db  15, 15, 15, 0, 0, 15, 0, 0
Pattern3  db  9
  db  1, 1, 1, 2, 2, 2, 4, 4, 4
  string db "hello",0,'$'
  Data  ends

Code  segment para public 'CODE'
  assume  cs:Code, ds:Data
Start  proc  near
  mov  ax,Data
  mov  ds,ax
  mov  ax,10h
  int  10h  ;select video mode 10h (640x350)
;
; Draw 8 radial lines in upper left quadrant in pattern 0.
;
  mov  bx,0
  mov  cx,0
  mov  si,offset Pattern0
  call  QuadrantUp
;
; Draw 8 radial lines in upper right quadrant in pattern 1.
;
  mov  bx,320
  mov  cx,0
  mov  si,offset Pattern1
  call  QuadrantUp
;
; Draw 8 radial lines in lower left quadrant in pattern 2.
;
  mov  bx,0
  mov  cx,175
  mov  si,offset Pattern2
  call  QuadrantUp
;
; Draw 8 radial lines in lower right quadrant in pattern 3.
;
  mov  bx,320
  mov  cx,175
  mov  si,offset Pattern3
  call  QuadrantUp
;
; Wait for a key before returning to text mode and ending.
;
  mov  ah,01h
  int  21h
  mov  ax,03h
  int  10h
  mov  ah,4ch
  int  21h
;
; Draws 8 radial lines with specified pattern in specified mode 10h
; quadrant.
;
; Input:
;  BX = X coordinate of upper left corner of quadrant
;  CX = Y coordinate of upper left corner of quadrant
;  SI = pointer to pattern, in following form:
;  Byte 0: Length of pattern
;  Byte 1: Start of pattern, one color per byte
;
; AX, BX, CX, DX destroyed
;
QuadrantUp  proc  near
  add  bx,160
  add  cx,87  ;point to the center of the quadrant
  mov  ax,0
  mov  dx,160
  call  LineUp  ;draw horizontal line to right edge
  mov  ax,1
  mov  dx,88
  call  LineUp  ;draw diagonal line to upper right
  mov  ax,2
  mov  dx,88
  call  LineUp  ;draw vertical line to top edge
  mov  ax,3
  mov  dx,88
  call  LineUp  ;draw diagonal line to upper left
  mov  ax,4
  mov  dx,161
  call  LineUp  ;draw horizontal line to left edge
  mov  ax,5
  mov  dx,88
  call  LineUp  ;draw diagonal line to lower left
  mov  ax,6
  mov  dx,88
  call  LineUp  ;draw vertical line to bottom edge
  mov  ax,7
  mov  dx,88
  call  LineUp  ;draw diagonal line to bottom right
  ret
QuadrantUp  endp
;
; Draws a horizontal, vertical, or diagonal line (one of the eight
; possible radial lines) of the specified length from the specified
; starting point.
;
; Input:
;  AX = line direction, as follows:
;  3  2  1
;  4  *  0
;  5  6  7
;  BX = X coordinate of starting point
;  CX = Y coordinate of starting point
;  DX = length of line (number of pixels drawn)
;
; All registers preserved.
;
; Table of vectors to routines for each of the 8 possible lines.
;
LineUpVectors  label  word
  dw  LineUp0, LineUp1, LineUp2, LineUp3
  dw  LineUp4, LineUp5, LineUp6, LineUp7

;
; Macro to draw horizontal, vertical, or diagonal line.
;
; Input:
;  XParm = 1 to draw right, -1 to draw left, 0 to not move horz.
;  YParm = 1 to draw up, -1 to draw down, 0 to not move vert.
;  BX = X start location
;  CX = Y start location
;  DX = number of pixels to draw
;  DS:SI = line pattern
;
MLineUp macro  XParm, YParm
  local  LineUpLoop, CheckMoreLine
  mov  di,si  ;set aside start offset of pattern
  lodsb  ;get length of pattern
  mov  ah,al

LineUpLoop:
  lodsb  ;get color of this pixel...
  call  DotUpInColor  ;...and draw it
if XParm EQ 1
  inc  bx
  mov ah, 09
  mov dx, offset string
  int 21h
  endif
if XParm EQ -1
  dec  bx
endif
if YParm EQ 1
  inc  cx
endif
if YParm EQ -1
  dec  cx
endif
  dec  ah  ;at end of pattern?
  jnz  CheckMoreLine
  mov  si,di  ;get back start of pattern
  lodsb
  mov  ah,al  ;reset pattern count

CheckMoreLine:
  dec  dx
  jnz  LineUpLoop
  jmp  LineUpEnd
  endm

LineUp  proc  near
  push  ax
  push  bx
  push  cx
  push  dx
  push  si
  push  di
  push  es

  mov  di,ax

  mov  ax,GRAPHICS_SEGMENT
  mov  es,ax

  push  dx  ;save line length
;
; Enable writes to all planes.
;
  mov  dx,SC_INDEX
  mov  al,MAP_MASK
  out  dx,al
  inc  dx
  mov  al,0fh
  out  dx,al
;
; Select write mode 2.
;
  mov  dx,GC_INDEX
  mov  al,GRAPHICS_MODE
  out  dx,al
  inc  dx
  mov  al,02h
  out  dx,al
;
; Vector to proper routine.
;
  pop  dx  ;get back line length

  shl  di,1
  jmp  cs:[LineUpVectors+di]
;
; Horizontal line to right.
;
LineUp0:
  MLineUp 1, 0
;
; Diagonal line to upper right.
;
LineUp1:
  MLineUp 1, -1
;
; Vertical line to top.
;
LineUp2:
  MLineUp 0, -1
;
; Diagonal line to upper left.
;
LineUp3:
  MLineUp -1, -1
;
; Horizontal line to left.
;
LineUp4:
  MLineUp -1, 0
;
; Diagonal line to bottom left.
;
LineUp5:
  MLineUp -1, 1
;
; Vertical line to bottom.
;
LineUp6:
  MLineUp 0, 1
;
; Diagonal line to bottom right.
;
LineUp7:
  MLineUp 1, 1

LineUpEnd:
  pop  es
  pop  di
  pop  si
  pop  dx
  pop  cx
  pop  bx
  pop  ax
  ret
LineUp  endp
;
; Draws a dot in the specified color at the specified location.
; Assumes that the VGA is in write mode 2 with writes to all planes
; enabled and that ES points to display memory.
;
; Input:
;  AL = dot color
;  BX = X coordinate of dot
;  CX = Y coordinate of dot
;  ES = display memory segment
;
; All registers preserved.
;
DotUpInColor  proc  near
  push  bx
  push  cx
  push  dx
  push  di
;
; Point ES:DI to the display memory byte in which the pixel goes, with
; the bit mask set up to access that pixel within the addressed byte.
;
  push  ax  ;preserve dot color
  mov  ax,SCREEN_WIDTH_IN_BYTES
  mul  cx  ;offset of start of top scan line
  mov  di,ax
  mov  cl,bl
  and  cl,111b
  mov  dx,GC_INDEX
  mov  al,BIT_MASK
  out  dx,al
  inc  dx
  mov  al,80h
  shr  al,cl
  out  dx,al  ;set the bit mask for the pixel
  shr  bx,1
  shr  bx,1
  shr  bx,1  ;X in bytes
  add  di,bx  ;offset of byte pixel is in
  mov  al,es:[di]  ;load latches
  pop  ax  ;get back dot color
  stosb  ;write dot in desired color

  pop  di
  pop  dx
  pop  cx
  pop  bx
  ret
DotUpInColor  endp
Start  endp
Code  ends
  end  Start
 
Last edited by a moderator:
Technology news on Phys.org
i make it in red text, which i don't understand please somebody can help me
 
michael1978 said:
i make it in red text, which i don't understand please somebody can help me
What don't you understand?
 
The comments say that this code works with EGA and VGA graphics cards using write mode 2 so I found this reference on VGA graphics programming reference:

http://www.wagemakers.be/english/doc/vga

It may give you some insight into what the code is actually doing.

(Also I see you've posted this same question on another forum dreamincode.net)

What is your interest in this code as its pretty old stuff?
 
Last edited:
Even 20 years ago when this was written, it has kind of dated. I doubt there is much in here anyone today really designed to understand.
michael1978 said:
Code:
;
; *** Listing 5.2 ***
;
; Program to illustrate one use of write mode 2 of the VGA and EGA by
; drawing lines in color patterns.
  end  Start
 
Thread 'Is this public key encryption?'
I've tried to intuit public key encryption but never quite managed. But this seems to wrap it up in a bow. This seems to be a very elegant way of transmitting a message publicly that only the sender and receiver can decipher. Is this how PKE works? No, it cant be. In the above case, the requester knows the target's "secret" key - because they have his ID, and therefore knows his birthdate.
Thread 'Project Documentation'
Trying to package up a small bank account manager project that I have been tempering on for a while. One that is certainly worth something to me. Although I have created methods to whip up quick documents with all fields and properties. I would like something better to reference in order to express the mechanical functions. It is unclear to me about any standardized format for code documentation that exists. I have tried object orientated diagrams with shapes to try and express the...
Back
Top