What is the purpose of this program?

  • Thread starter michael1978
  • Start date
  • Tags
    Language
In summary: LineUpLoop: mov ax,XParm mov bx,YParm cmp bx,DX je LineUpLoop ;if line too long, go back to loop cmpl cx,CX je LineUpLoop ;if line too short, go back to loop add dx,DX je LineUpLoop ;if line length correct, go to output routineLineUp proc near mov ax, LineUpLoop mov bx,0 mov cx,DX mov si,Offset LineUp0 call
  • #1
michael1978
434
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
  • #2
i make it in red text, which i don't understand please somebody can help me
 
  • #3
michael1978 said:
i make it in red text, which i don't understand please somebody can help me
What don't you understand?
 
  • #4
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:
  • #5
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
 

What is Assembler language?

Assembler language is a low-level programming language that is used to write computer programs. It is a symbolic representation of machine code, which is the binary code that the computer can directly execute.

What are the benefits of using Assembler language?

Assembler language allows for direct control over the hardware resources of a computer, making it highly efficient for tasks that require low-level access to the system. It also allows for maximum optimization, as the programmer has full control over the code and can make it as efficient as possible.

Is Assembler language still relevant in modern programming?

Yes, Assembler language is still used in some specialized areas such as embedded systems, device drivers, and operating systems. It is also used in reverse engineering and low-level security research.

What are some common uses for Assembler language?

Assembler language is commonly used for tasks that require low-level control over hardware resources, such as creating bootloaders, device drivers, and operating systems. It is also used for optimizing critical sections of code in high-performance applications.

What are some resources for learning Assembler language?

There are many online tutorials, forums, and communities dedicated to learning Assembler language. Some popular resources include the official documentation for the specific processor or hardware architecture, as well as books and video tutorials on the subject.

Similar threads

  • Engineering and Comp Sci Homework Help
Replies
1
Views
1K
  • Engineering and Comp Sci Homework Help
Replies
20
Views
3K
  • Programming and Computer Science
Replies
2
Views
2K
  • Programming and Computer Science
Replies
7
Views
6K
  • Computing and Technology
Replies
11
Views
2K
  • Engineering and Comp Sci Homework Help
Replies
1
Views
1K
  • Engineering and Comp Sci Homework Help
Replies
9
Views
3K
  • Engineering and Comp Sci Homework Help
Replies
1
Views
2K
  • Engineering and Comp Sci Homework Help
Replies
5
Views
3K
  • Engineering and Comp Sci Homework Help
Replies
2
Views
1K
Back
Top