home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-06-08 | 54.8 KB | 1,586 lines |
-
- ****************************** GRAPHICS *************************************
-
- ASMLIB Graphics (C) Copyright 1991, 1992 Douglas Herr
- All rights reserved
-
- ASMLIB recognizes and automatically supports several graphics modes,
- including several which are not recognized by IBM's BIOS. You should
- assume that all ASMLIB graphics subroutines write directly to the video
- hardware. IMPORTANT: ALL ASMLIB GRAPHICS SUBROUTINES ASSUME DS:@DATA.
-
- Locations on Graphics screens are defined by coordinate pairs such as (x,y).
- X-coordinates are the horizontal dimensions of the screen, and Y-coordinates
- are the vertical coordinates. X = 0 is the at the left edge of the screen,
- and X = 719 is the right edge of a Hercules screen, while Y = 0 is the top
- edge of the screen and Y = 347 is the bottom (Hercules). Thus, the
- coordinate specified by (719,0) is the extreme upper right corner of a
- Hercules screen.
-
- Graphics subroutines as powerful and flexible as ASMLIB's can be quite
- large. If you have licenced ASMLIB source code, you can use several
- pre-defined conditional assembly directives to eliminate code from
- ASMLIB object files if you do not want or need to support all graphics
- modes:
-
- NOHERC eliminates all Hercules and InColor code
- NOINCOLOR eliminates code for the InColor card
- (InColor works with Hercules monochrome code in 2 colors)
- NO256 eliminates code for the three 256-color modes
- NOCGA eliminates code for CGA graphics modes
- NOMCGA elimiates code for MCGA mode 11h
- NOLPATTERN elimiates code for non-solid lines (in DRAWLINE.ASM)
-
- for example, if you want line drawing programs to use only EGA/VGA-type
- 16-color modes, assemble DRAWLINE.ASM like this:
-
- C:\MASM\>masm /dnoherc /dnocga /dnovga256 /dnomcga drawline;
-
- this reduces the size of drawline.obj significantly and speeds its
- operation somewhat.
-
- BitBlock subroutines in ASMHUGE.LIB work with huge data blocks (larger
- than 64k). This permits entire EGA, VGA or InColor screens to be saved
- in one block if sufficient RAM is available.
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- Graphics modes and pages supported are:
-
- Mode Maximum x Maximum y Colors Pages (1) Equipment
- ("xmax") ("ymax")
-
- HGraph 719 347 2 0, 1 HGC, HGC+ (2)
- HGraph 719 347 16 0, 1 InColor (2)
- 04h, 05h 319 199 4 0 CGA, EGA, MCGA, VGA
- 06h 639 199 2 0 CGA, EGA, MCGA, VGA
- 0Dh 319 199 16 0 - 7 EGA, VGA (3)
- 0Eh 639 199 16 0 - 3 EGA, VGA (3)
- 0Fh 639 349 4 0 EGA, VGA (4)
- 10h 639 349 16 0, 1 EGA, VGA (3,5)
- 11h 639 479 2 0 MCGA, VGA
- 12h 639 479 16 0 VGA
- 13h 319 199 256 0 MCGA, VGA
- 40h 639 399 2 0 ATT 6300 (6)
- 6Ah 799 599 16 0 VESA (7)
- XMode16 up to 799 up to 599 16 0 Super EGA/VGA
- Super13 319 399 256 0, 1 VGA
- Super13a 359 479 256 0 VGA
- SVGA16 799 or 1023 599 or 767 16 0 Super VGA (8)
- SVGA256 639 to 1023 399 to 767 256 0 Super VGA (8)
-
- (1) page numbering begins with page 0. Several modes have sufficient
- memory available for additional page(s).
- (2) page 1 available after calling Use64k
- (3) EGA pages assumes 256k EGA memory
- (4) monochrome monitor only
- (5) EGA with 128k or more memory
- (6) I have not tested this yet. Feedback please!
- (7) VESA6A is supported by many Super VGA cards with multi-frequency
- monitors
- (8) requires VGAKIT-compatible Super VGA and multi-frequency monitor. See
- WhichVGA in SYSTEM.DOC and SVGA16 and SVGA256 in MODE.DOC.
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- BITBLOCKBYTES: calculate bytes required to save a bit block
- Source: bbbytes.asm ($graph.asm)
-
- Call with: DS:[BX] pointing to x- and y-coordinate data (see example)
- Returns: DX:AX = bytes required to save the bit block
- small or medium model:
- if CF = 0, bytes required is less than 64k segment
- => no problem
- if CF = 1, bit block is too big for a 64k segment
- small or medium model BitBlock subroutines will
- not work properly
- Uses: AX, DX, flags
- Supports: all ASMLIB graphics modes; call BitBlockBytes while
- the system is in the mode you intend to use. Otherwise,
- an incorrect byte size may be returned, leading to either
- wasted memory or memory allocation errors.
- Example:
-
- include asm.inc
-
- extrn bitblockbytes:proc
-
- .data
- x0 dw 100,43 ; first corner at (100,43)
- x1 dw 175,143 ; second corner at (175,143)
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- .
- lea bx,x0 ; DS:[BX] points to bit block corner data
- call bitblockbytes ; returns AX = byte size of buffer required
- jc too_big ; bit block is too big if CF = 1 (small or med)
-
- ; note that when the huge model is used, memory greater than 64k must be
- ; allocated with DOS function 48h. See STARTUP.ASM to release unused
- ; memory to allow DOS memory allocation.
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- BITPLANEBYTES: calculate bytes to save one plane of a bit block
- alternate entry to BitBlockBytes; calculates bytes
- required to save one plane of multi-plane modes
- Source: bbbytes.asm ($graph.asm)
- Call with: DS:[BX] pointing to x- and y-coordinate data
- Returns: DX:AX = bytes required to save the bit plane
- small or medium model:
- if CF = 0, bytes required is less than 64k
- => no problem
- if CF = 1, bit plane is too big for a 64k segment
- small or medium model BitPlane subroutines will
- not work properly
- Uses: AX, DX, flags
- Supports: all ASMLIB graphics modes; call BitPlaneBytes while
- the system is in the mode you intend to use. If the
- system is is not in a multi-plane mode, BitPlaneBytes
- will give you the same results as BitBlockBytes.
- Graphics modes with multiple planes are mode 0Fh (2 planes)
- and all 16-color modes (4 planes).
- Example:
-
- include asm.inc
-
- extrn bitplanebytes:proc
-
- .data
- x0 dw 100,43 ; first corner at (100,43)
- x1 dw 175,143 ; second corner at (175,143)
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- .
- lea bx,x0 ; DS:[BX] points to bit block corner data
- call bitplanebytes ; returns AX = byte size of buffer required
- jc too_big ; unlikely
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- CIRCLEASPECT: modifies aspect ratio of circle
- Source: drawcirc.asm ($graph.asm)
-
- Call with: AH = numerator of aspect ratio
- AL = denominator of aspect ratio
- AH <> 0, AL <> 0
-
- CircleAspect is used with DrawCircle to draw an ellipse.
- An aspect ratio less than one makes a flat ellipse and an
- aspect ratio greater than one makes a tall ellipse.
- Aspect ratios greater than 5 or less than 1/5 may cause
- unpredictable results.
-
- Returns: nothing
- Uses: nothing; all registers and flags are saved
- Supports: all ASMLIB graphics modes
- Example: see DrawCircle
-
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- DEFGMODE: restore ASMLIB's internal flags to use system graphics
- mode (see ForceGMode)
- Source: defgmode.asm
-
- Call with: no parameters
- Returns: nothing
- Uses: nothing
- Supports: all ASMLIB graphics modes
- Example: see ForceGMode
-
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- DRAWCIRCLE: draw a circle
- Source: drawcirc.asm ($graph.asm, $putdot.asm)
-
- Call with: DS:[BX] pointing to circle center coordinates and x-radius
- Drawmodes supported are:
- 4 = AND the foreground color with the screen
- 3 = OR the foreground color with the screen
- 1, 2 = use foreground color
- 0 = XOR circle with existing screen
- -1, -2 = use background color
- -3 = OR the background color with the screen
- -4 = AND the background color with the screen
- See DrawMode for more information
- See also CircleAspect
- Returns: nothing
- Uses: nothing
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
- extrn drawcircle:proc, circleaspect:proc
-
- .data
- xcenter dw 100 ; DrawCircle data must be words
- ycenter dw 100 ; the circle is centered at (100,100)
- xradius dw 50 ; x-dimension radius in pixels (>0)
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- .
- mov ah,5
- mov al,1 ; a tall ellipse
- call circleaspect
-
- lea bx,xcenter ; DS:[BX] points to circle data
- call drawcircle ; draw the circle
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- DRAWBOX: draw a rectangle on a graphics screen
- Source: drawbox.asm ($graph.asm, $vert.asm, $horiz.asm, several others)
-
- Call with: DS:[BX] pointing to box corner data
- Drawmodes supported are:
- 4 = AND the foreground color with the screen; color modes
- 3 = OR the foreground color with the screen
- 1, 2 = use foreground color: all modes
- 0 = XOR foreground color with existing pixels
- -1, -2 = use background color: all modes
- -3 = OR the background color with the screen
- -4 = AND the background color with the screen; color modes
- See DrawMode for more information; see also LinePattern
- Returns: nothing
- Uses: nothing
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- extrn drawbox:proc
-
- .data
- x0 dw 25,10 ; first corner at (25,10); data is word size
- x1 dw 301,97 ; opposite corner at (301,97)
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- lea bx,x0 ; DS:[BX] points to box corner data
- call drawbox
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- DRAWLINE: draw a line on a graphics screen
- Source: drawline.asm ($graph.asm, $vert.asm, $horiz.asm,
- $loslope.asm, $hislope.asm, many others)
-
- Call with: DS:[BX] pointing to line endpoint data
- Drawmodes supported are:
- 4 = AND the foreground color with the screen; color modes
- 3 = OR the foreground color with the screen
- 1, 2 = use foreground color: all modes
- 0 = XOR foreground color with existing pixels
- -1, -2 = use background color: all modes
- -3 = OR the background color with the screen
- -4 = AND the background color with the screen; color modes
- See DrawMode for more information; see also LinePattern
- Returns: nothing
- Uses: nothing
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- extrn drawline:proc
-
- .data
- x0 dw 25,10 ; first endpoint at (25,10); data is word size
- x1 dw 301,97 ; other end of line at (301,97)
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- lea bx,x0 ; DS:[BX] points to line coordinate data
- call drawline
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- DRAWMODE: control ASMLIB graphics drawing mode
- Source: $graph.asm
-
- DrawMode is a public byte in DGROUP used to control the
- operation of many ASMLIB subroutines. ASMLIB's default
- drawmode is 1.
-
- Typically, drawmodes have the following effects:
- 2 = use foreground color only; text is printed without
- background, foreground only of line patterns or
- fill patterns is used
- 1 = use foreground and background; text is printed with
- background, line patterns and fill patterns update
- both foreground and background
- 0 = foreground color is XORed with the existing screen
- (not supported in 256-color or CGA 4-color modes)
- -1 = characters or fill pattern drawn with foreground
- and background reversed
- -2 = character or line drawn with background color only
-
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- .data
- extrn drawmode:byte
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- mov drawmode,2 ; print text with foreground color only
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- FILLAREA: fills an irregular area on a graphics screen
- Source: fillarea.asm ($graph.asm, $horiz.asm, $getdot.asm,
- several others)
-
- Call with: DS:[BX] pointing to seed pixel coordinates
-
- Fills many irregularly-shaped areas with color and/or
- pattern, beginning at (x,y). FillArea may not work
- properly with regions which have concave boundaries
- crossing horizontal lines. The area's boundary is
- defined by a solid line of non-zero pixels.
- DrawModes supported are:
- 2 = fill with foreground color only (if fill pattern
- has been defined): 16-color modes
- 1 = fill with foreground (and background, if fillpattern
- defined): all modes
- See also FillPattern.
- Returns: nothing
- Uses: nothing
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- extrn fillarea:proc
-
- .data
- x dw 10,15 ; start fill operation at x=10, y=15
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- lea bx,x
- call fillpattern
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- FILLBOX: draw a filled rectangle on a graphics screen
- Source: fillbox.asm ($graph.asm, $horiz.asm, several others)
-
- Call with: DS:[BX] pointing to box corner data
- Drawmodes supported are:
- 4 = AND the box with the pre-existing screen
- 3 = OR the foreground color with the screen
- 1, 2 = use foreground color
- 0 = XOR foreground color with existing pixels
- -1, -2 = use background color
- -3 = OR the background color with the screen
- -4 = AND the background color with pre-existing screen
- See DrawMode for more information; also see FillPattern.
- Returns: nothing
- Uses: nothing
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- extrn fillbox:proc
-
- .data
- x0 dw 25,10 ; first corner at (25,10); data is word size
- x1 dw 301,97 ; opposite corner at (301,97)
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- lea bx,x0 ; DS:[BX] points to box corner data
- call fillbox
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- FILLPATTERN: define an optional pattern for FillArea & FillBox
- Source: fpattern.asm
-
- Call with: DS:[BX] pointing to ASCIIZ pattern string.
- Up to 8 characters in the string will be used.
- The pattern must be re-defined before each call to a line
- drawing subroutine (FillArea, FillBox).
- Returns: nothing
- Uses: nothing
- Supports: all ASMLIB graphics modes except 256-color modes
- Example:
-
- include asm.inc
-
- extrn fillbox:proc
- extrn fillpattern:proc
-
- .data
- x0 dw 25,10 ; first corner at (25,10); data is word size
- x1 dw 301,97 ; opposite corner at (301,97)
- pattern db 8 dup(10101010b),0
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- lea bx,pattern ; DS:[BX] points to pattern string
- call fillpattern ; define the pattern
- sub bx,8 ; DS:[BX] points to box corner data
- call fillbox ; draw a patterned box
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- FORCEGMODE: force ASMLIB to use one particular graphics mode
- this is handy for two-monitor systems
- Source: defgmode.asm
-
- Call with: AL = graphics mode to use
- forcegmode does not change the actual screen mode; what
- it does is to force ASMLIB's central graphics control
- to ignore the system mode. Call defgmode to restore
- ASMLIB's internal flags to the default state.
- Returns: nothing
- Uses: nothing
- Supports: all ASMLIB graphics modes (256-color modes not tested)
- Example:
-
- include asm.inc
-
- extrn modecolor:proc, modemono:proc
- extrn forcegmode:proc, gcolor:proc, defgmode:proc
-
- .data
- gtext db 'Graphics mode',0
- gpos dd 0 ; 2 words of zeros to position text
- ttext db 'Text mode',0
-
- .code
- ; program fragment assumes DS:@data
- ; I want text on the monochrome screen and 16-color graphics on the EGA
- call modecolor ; switch to color monitor
- mov ax,10h ; set up graphics mode
- int 10h
- mov al,10h ; tell ASMLIB to use mode 10h
- ; use AL = 13h for VGA 256-color modes
- ; use AL = 8 for Hercules (including InColor)
- call forcegmode ; best to do this after the mode change
- call modemono ; switch back to the monochrome monitor
- mov ax,010Ch ; blue background, red foreground
- call gcolor
- lea si,gtext ; point to graphics message
- lea dx,gpos ; positioned at upper left corner
- call gprint ; prints on EGA in graphics mode
-
- lea si,ttext ; point to text message
- xor dx,dx ; upper left corner of text screen
- mov ah,7 ; normal color
- call tprint ; display message on monochrome monitor
- .
- .
- ; sometime later, all done with this setup
- call defgmode ; clear ASMLIB's internal graphics flags
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GBASESEG: change ASMLIB graphics base segment
- Source: gbaseseg.asm ($graph.asm)
-
- Call with: AX = base segment address for alternate buffer
- if AX = 0, default base segment is restored
- GBaseSeg may be used to create and update off-screen graph
- images, thus simulating multiple screen pages.
- Returns: nothing
- Uses: nothing
- Supports: mode 04h, 05h, HGraph (monochrome only), 40h, 11h, 13h
-
- buffer size requirements:
-
- mode 04h, 05h 16384 bytes
- HGraph, 40h 32768 bytes
- mode 11h 38400 bytes
- mode 13h 64000 bytes
-
- GBaseSeg may also work with planar or bank-switched
- modes in a windowing multi-tasking enviornment, such
- as DesqView. Feedback, please!!
- You must call GBaseseg AFTER switching the system to graphics
- mode, or it will not work; you must also call GBaseSeg with
- AX = 0 before changing from one graphics mode to another, or
- the default base segment may get messed up.
- Example:
-
- .model medium
-
- public myprog
- extrn gbaseseg:proc, drawbox:proc
-
- .data
- boxdata dw 0,0,319,199
-
- .fardata
- screen1 db 64000 dup (0) ; second screen for mode 13h
-
- .code
- myprog proc
- ; program fragment assumes DS:@DATA
- ; mode 13h, 320x200x256 colors
- mov ax,13h
- int 10h
- ; use alternate buffer
- mov ax,seg screen1
- call gbaseseg
- lea bx,linedata
- call drawbox
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GCENTER: centers a string on a graphics screen
- Source: gcenter.asm (gprint.asm, $graph.asm, strlen.asm, f8x14.asm)
-
- GCENTERX: centers a double-width string on a graphics screen
- Source: gcenterx.asm (gprintx.asm, $graph.asm, strlen.asm, f8x14.asm)
-
- Call with: DS:[SI] pointing to the string to print
- DS:[DX] pointing to x- and y-coordinates
- the x-coordinate is a placeholder; GCenter calculates the
- correct x value before calling GPrint.
-
- Colors, drawmodes and character sizes are the same as
- for GPrint or GPrintX.
- Returns: x = calculated x-coordinate
- Uses: nothing; all registers and flags are saved.
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- extrn gcenter:proc
-
- .data
- x dw ?
- y dw 2 ; print graph title 2 pixels down from the top
- title db 'Graph title',0
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- lea si,title ; DS:[SI] points to string
- lea dx,x ; point to coordinates
- call gcenter ; print the string, centered horizontally
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GCLEAR: clears the active portion of a graphics screen
- uses background color
- Source: gclear.asm ($graph.asm, $horiz.asm, others)
-
- Call with: no parameters
- Returns: nothing
- Uses: nothing
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- extrn gclear:proc
-
- .code
- .
- .
- .
- call gclear
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GCOLOR: update color used by ASMLIB graphics
- Source: gcolor.asm ($graph.asm)
-
- Call with: AL = foreground color
- AH = background color
-
- for 4-color modes, colors may be 0-3
- for 16-color modes, colors may be 0-15
- for 256-color modes, colors may be 0-255
-
- Returns: nothing
- Uses: nothing
- Supports: all color graphics modes and mode 0Fh
- GColor is ignored by 2-color modes
- Example:
-
- include asm.inc
-
- extrn gcolor:proc
-
- .code
- .
- .
- .
- mov ah,bcolor ; background color
- mov al,fcolor ; foreground color
- call gcolor
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GCOPY: copies one page of graphics memory to another
- Source: gcopy.asm ($graph.asm)
-
- Call with: BH = frompage
- BL = topage
- Returns: CF = error flag
- if CF = 0, no error
- if CF = 1, bad page number or frompage = topage
- Uses: AX, CF
- Supports: Hercules and InColor (with Use64k)
- EGA/VGA modes 0Dh, 0Eh, 0Fh, 10h
- Super13
- Example:
-
- include asm.inc
-
- extrn gcopy:proc
-
- .code
- .
- .
- .
- mov bx,0001h ; copy from page 0 to page 1
- call gcopy
- jc bad_page ; uh oh, pages not supported
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GCURSOR: simulate text-mode cursor on graphics screen
- GUCURSOR: simulate underscore cursor on graphics screen
- Source: gcursor.asm ($graph.asm)
-
- Call with: DS:[DX] pointing to x- and y-coordinate word data
- x and y are the coordinates of the UPPER LEFT corner of
- a character block. Note that text characters are
- 8 x-pixels wide and from 8 to 16 y-pixels high.
-
- GCursor and GUCursor maintain the simulated cursor while
- the keyboard type-ahead buffer is empty. GCursor shape
- is an underscore when INSERT is off and a larger block
- when INSERT is on. GUCursor is an underscore regardless
- of the state of the INSERT toggle.
- Returns: nothing
- Uses: AX, CX
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- extrn gcursor:proc, getkey:proc
-
- .data
- x dw 10,20 ; put the cursor in the character block at (10,20)
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- .
- lea dx,x
- call gcursor
- call getkey ; retrieve the key that was pressed
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GETBITBLOCK: saves a portion of a graphics screen in memory
- Source: small & medium: bitblock.asm ($graph.asm, bb02.asm, bb04.asm
- bb06.asm, bb08.asm, bb10.asm, bb12.asm,
- bb14.asm)
- huge: same as small & medium, + lowES2hi.asm & lowDS2hi.asm
-
- Call with: ES:[DI] pointing to memory buffer for the bit block
- DS:[BX] pointing to x & y coordinate data
-
- Note that a bit block copied from a 4-plane mode may
- only be restored to a 4-plane mode; likewise, a bit
- block saved from a 2-color mode should be restored to
- a 2-color mode or to a single bit plane of a 16-color
- mode.
- Returns: nothing
- Uses: nothing
- Supports: all ASMLIB graphics modes
- memory models: small medium, huge
-
- Example on next page
-
-
- ; example of GetBitBlock use
-
- include asm.inc
-
- extrn bitblockbytes:proc, getbitblock:proc, putbitblock:proc
- extrn halloc:proc
-
- .data
- ptr dw ? ; use this to save pointer to bit block
- x0 dw 100,43,175,143 ; save from (100,43) to (175,143)
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- lea bx,x0 ; point to block corners
- call bitblockbytes ; calculate byte requirement
- jc too_big ; error control
- call halloc ; this example allocate the buffer from heap
- ; can't do this w/ huge bit blocks
- jc no_memory ; more error control
- mov ptr,bx ; save near address of bit block
- push ds
- pop es ; ES = DS
- mov di,bx ; ES:[DI] points to buffer
- lea bx,x0 ; DS:[BX] points to coordinate data
- call getbitblock
- .
- .
-
- ; later . . .
- lea bx,x0 ; put the bit block back where you found it
- push ds
- pop es ; ES = DS
- mov di,ptr ; ES:[DI] points to buffer
- call putbitblock
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GETBITPLANE: saves one plane of a bit block in memory
- Source: small & medium: bitplane.asm ($graph.asm, bb02.asm, bb04.asm
- bb06.asm, bb08.asm, bb10.asm, bb12.asm,
- bb14.asm)
- huge: same as small & medium, + lowES2hi.asm & lowDS2hi.asm
-
- Call with: ES:[DI] pointing to memory buffer for the bit block
- DS:[BX] pointing to x & y coordinate data
- AL = plane number to save
- valid plane numbers are 0 - 3 in 16-color modes
- 0 & 2 in EGA monochrome mode
-
- In 16-color modes, EGA/VGA and InColor planes are:
- 0 = blue, 1 = green, 2 = red, 3 = gray (or intensity)
- In EGA monochrome mode, plane 0 = normal, plane 2 = blink
- or intensity
- The actual colors each plane represents may change
- depending on the values in the pallete registers.
-
- Supports: all 16-color modes plus EGA monochrome
- other modes: GetBitPlane works like GetBitBlock
- memory models: small, medium, huge
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GETVIEW: returns a pointer to the current view coordinates for
- the active page
- Source: getview.asm ($graph.asm)
-
- Call with: no parameters
- most ASMLIB subroutines, except the GPrint series, Gload,
- GCopy and GSave, limit their activity to the view region.
- You may use the returned pointer to change the active
- portion of the screen; be careful not to exceed the maximum
- x1 and y1 values permitted by the current mode. Also, x0
- must always be less than x1 and y0 must always be less than
- y1.
- ASMLIB's defaults are:
- x0 = 0
- y0 = 0
- x1 = xmax
- y1 = ymax
-
- See also ResetView
-
- Returns: ES:[BX] pointing to the current view coordinates
- Uses: ES, BX; all other registers and flags are saved
- Supports: all ASMLIB graphics modes and pages
- Example:
-
- include asm.inc
-
- extrn getview:proc
-
- x0 EQU word ptr ES:[BX]
- y0 EQU word ptr ES:2[BX]
- x1 EQU word ptr ES:4[BX]
- y1 EQU word ptr ES:6[BX]
-
- .code
- .
- .
- .
- call getview
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GLOAD: loads a graphics screen saved as a disk file by GSave
- Source: gsave.asm ($graph.asm)
-
- Call with: DS:[DX] pointing to the name of the file to load
- the filename must be an ASCIIZ string
- Returns: AX = MS-DOS error code
- Uses: AX, BX, CX, flags
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- extrn gload:proc
-
- .data
- filename db 'graph.bin',0
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- lea dx,filename
- call gload
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GPAGE: changes active and displayed graphics page
- GPage changes ASMLIB's default graphics page and displays
- the page. See also UseGPage and ShowGPage.
- Source: gpage1.asm ($graph.asm, $herc.asm, gpage.asm)
-
- Call with: BL = page number. See table at start of this GRAPHICS.DOC
- file.
- Returns: if CF = 0, no problem
- if CF = 1, bad page number requested
- Uses: CF
- Supports: EGA, VGA, Hercules, InColor: modes with more than one page
- Example:
-
- include asm.inc
-
- extrn gpage:proc
-
- .code
- .
- .
- mov bl,1 ; use and show page 1
- call gpage
- jc oops ; uh oh, wrong mode
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GPRINT: prints ASCIIZ string on a graphics screen
- Source: gprint.asm ($graph.asm, f8x14.asm, $gp00.asm, $gp02.asm,
- $gp06.asm, $gp08.asm, $gp10.asm, others)
-
- Call with: DS:[SI] pointing to the ASCIIZ string
- DS:[DX] pointing to x- and y-coordinate data
- drawmodes supported by GPrint are:
- 2 = foreground only; background pixels left alone
- 1 = foreground and background pixels updated with
- current gcolor
- 0 = foreground color is XORed with the existing screen
- -1 = like drawmode 1, but foreground and background reversed
- -2 = like drawmode 2, but uses background color
- Any pixel position may be specified; does not wrap around
- from right side of screen to left. Default character size
- is 8x8 for CGA modes and modes 0Dh, 0Eh and 13h, 8x14 for
- others.
- High ASCII characters are undefined in 8x8 pixel modes
- unless you call SmallText sometime earlier in the program.
- Returns: nothing
- Uses: CX; all other registers and flags are saved
- Supports: all ASMLIB graphics modes
- not all drawmodes supported with CGA modes 04h and 05h
- Example:
-
- include asm.inc
-
- extrn gprint:proc
-
- .data
- string db 'print this, if you will',0
- gpos dw 0,0 ; print at upper left corner
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- .
- lea si,string
- lea dx,gpos
- call gprint
-
- additional GPRINT information on next page
-
- GPRINT will work with user-defined fonts up to 16 pixel rows high in all
- modes except CGA modes and modes 0Dh, 0Eh and 13h. GPRINT reads a public
- data area in ASMSEG to determine the SEGMENT:OFFSET address of the font
- data, the number of pixel rows per character and the byte increment
- between sucessive character definitions. Characters must be 8 pixels wide.
-
- FONTDATA.ASM has the required font data:
-
- public fontseg
- fontseg dw SEG f8x14 ; segment address of user-loaded font (8x14 default)
- dw OFFSET f8x14 ; offset address of user-loaded font (8x14 default)
- db 14 ; byte size of character
- db 14 ; bytes from start of one char to start of next
-
- Example:
-
- include asm.inc
-
- ASMSEG segment byte public
- extrn fontseg:word
- ASMSEG ends
-
- .data
- fname db 'c:\ramfont\italics.fnt',0 ; 8x14 characters
- fbuffer db 4096 dup (0) ; all RAMFont fonts are 4096 bytes
- ; the fonts supplied by Hercules with the Graphics Card Plus and InColor
- ; card are a variety of sizes, but in each font file the byte increment
- ; is always 16 bytes
-
- .code
- .
- .
- mov ax,@data
- mov ds,ax
- lea dx,fname
- mov ax,3D00h ; open file for read
- int 21h
- mov bx,ax ; copy file handle to BX
- lea dx,fbuffer ; DS:[DX] points to buffer
- mov cx,4096
- mov ah,3Fh ; read file
- int 21h
- mov ah,3Eh ; close file
- int 21h
- mov ax,ASMSEG
- mov es,ax
- assume es:ASMSEG
- mov es:fontseg,ds ; update segment address of new font
- mov es:fontseg+2,dx ; update offset address of new font
- mov es:fontseg+4,(16 shl 8) OR 14
- ; 14-pixel row character
- ; 16 bytes between character definitions
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GPRINTDOWN: prints ASCIIZ string vertically on graph screen
- GPRINTUP: prints ASCIIZ string vertically on graph screen
- Source: gprint.asm ($graph.asm, f8x14.asm, $gp00.asm, $gp02.asm,
- $gp06.asm, $gp08.asm, $gp10.asm, others)
-
- Call with: same as GPrint
- rotates each character 90 degrees and prints from top
- downward or from bottom upward. Character size 8x8.
-
- Returned data and registers used same as GPrint
- Example: see GPrint.
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GPRINTX: print string on a graphics screen, double width
- GPRINT2X: print string on a graphics screen, double size
- GPRINTDOWNX: print string vertically on graph screen, 2x width
- GPRINTDOWN2X: print string vertically on graph screen, 2x size
- GPRINTUPX: print string vertically on graph screen, 2x width
- GPRINTUP2X: print string vertically on graph screen, 2x size
- Source: gprintx.asm ($graph.asm, f8x14.asm, $gp00.asm, $gp02.asm,
- $gp06.asm, $gp08.asm, $gp10.asm, others)
-
-
- Variations of GPrint and GPrintDOWN/GPrintUP;
- GPrintx, GPrintDOWNx and GPrintUPx print characters
- which are twice as wide as normal; 2x subroutines
- print the characters twice as wide and twice as high
- as normal.
-
- Parameters, supported modes and drawmodes are same as
- GPrint. GPrintx and GPrint2x also work with user-defined
- fonts. See GPrint.
- Example: see GPrint.
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GSAVE: saves a graphics screen as a disk file
- does not compress image
- Source: gsave.asm ($graph.asm)
-
- Call with: DS:[DX] pointing to ASCIIZ filename
- disk space requirements vary depending on graphics mode:
-
- HGraph (mono) 32,768 bytes
- HGraph (InColor) 131,072 bytes
- Super13 128,000 bytes
- Super13a 172,800 bytes
- VESA6Ah 240,000 bytes
- XMode16 varies; up to 240,000 bytes
- 04h/05h/06h 16,384 bytes
- 0Dh 32,000 bytes
- 0Eh 64,000 bytes
- 0Fh 56,000 bytes
- 10h 112,000 bytes
- 11h 38,400 bytes
- 12h 153,600 bytes
- 13h 64,000 bytes
-
- Returns: if AX <> 0, AX = MS-DOS error code
- if AX = 0, no error
- Uses: AX, BX, CX, flags
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- extrn gsave:proc
-
- .data
- filename db 'graph.bin',0
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- .
- lea dx,filename ; point to ASCIIZ filename
- call gsave ; save graph
- or ax,ax ; was there a problem?
- jnz oops ; do some error control if so
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- LINEPATTERN: defines an optional pattern for DrawLine and DrawBox
- Source: lpattern.asm ($graph.asm)
-
- Call with: DS:[BX] pointing to an ASCIIZ string of up to 8 characters.
- The bit patterns in each character are used to make dashed
- or dotted lines. For drawmodes > 0, each pixel in the line
- is updated with the foreground color if the corresponding
- bit in the bit pattern is 1. If the bit in the bit pattern
- is 0, the corresponding pixel in the line is treated as a
- background pixel. LinePattern must be called before each
- call to a subroutine in drawline.obj if you want the line
- pattern to be used.
-
- drawmodes supported are:
- (monochrome modes)
- 2 = update foreground pixels only
- 1 = update foreground and background pixels
- 0 = XOR the foreground color with the existing image
- -1 = like drawmode 1, but foreground and background colors
- are reversed
- -2 = like drawmode 2, but foreground and background colors
- are reversed
- (color modes)
- same as monochrome, plus:
- 3 = OR the foreground pixels with the pre-existing screen
- -3 = OR the background pixels with the pre-existing screen
- 4 = AND the foreground pixels with the pre-existing screen
- -4 = AND the background pixels with the pre-existing screen
-
- Returns: nothing
- Uses: nothing
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- extrn linepattern:proc, drawline:proc
-
- .data
- x0 dw 25,10,301,97 ; line endpoints at (25,10) & (301,97)
- pattern db 4 dup(32,64),0 ; 8 bytes past x0
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- lea bx,pattern ; DS:[BX] points to bit pattern
- call linepattern ; let drawline know what pattern to use
- sub bx,8 ; point to line endpoint data
- call drawline ; draw a patterned line
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- PUTBITBLOCK: restores bit block saved by GetBitBlock
- PUTBITPLANE: restores bit plane saved by GetBitPlane
- Source: same as GetBitBlock or GetBitPlane
-
- Call with: DS:[BX] pointing to upper left corner coordinates
- ES:[DI] pointing to buffer with stored bit block
- PutBitPlane: AL = plane number
- valid plane numbers for 16-color modes are 0 - 3
- for EGA mode 11h 0 & 2
-
- Drawmodes supported are:
- mode 13h, super13, super13a:
- 1 = replace existing screen area with bit block
- 2 = replace existing screen with non-zero pixels
- in bit block
-
- HGraph (InColor):
- 4 = AND the bit block with the existing screen
- 3 = OR the bit block with the existing screen
- 1,2 = replace existing screen area with bit block
- 0 = XOR the bit block with the existing image
- -1,-2 = replace existing screen area with inverse bit block
-
- 16-color EGA/VGA-type modes and mode 0Fh:
- same as InColor, plus:
- -3 = OR the inverse bit block with the existing screen
- -4 = AND the inverse bit block with the existing screen
-
- mode 04h, 05h, 06h, HGraph (mono), 11h:
- 4, 1, 0, -1 same as InColor
- 2, 3 = combine non-zero pixels in the bit block with the
- pre-existing image
- -2 = combine non-zero pixel in the inverse bit block with
- the pre-existing screen image
-
- Returns: nothing
- Uses: nothing
- Supports: all ASMLIB graphics modes
- Example: see GetBitBlock
-
-
- bit block formats explained on following pages
-
-
- ; BIT BLOCK FORMATS
-
- ; mode 04h, 05h, 06h Hercules monochrome, 11h, and bit planes
- ;
- ; the first word in the buffer is the number of pixel rows (vertical)
- ; in the bit block; the second word is the number of bytes per screen row;
- ; the fifth byte is a bit mask for the last byte of each pixel row.
- ; The bit mask = 0FFh for byte-aligned bit blocks.
-
- bblock dw 15,5 ; 15 rows, 5 bytes per row
- db 11111110b ; bit mask for right end of pixel row
- ; bit block data follows:
- ; 15 rows, 5 bytes per row
- db 00000000b,10000000b,00000000b,10000000b,00000010b
- db 00000001b,11000000b,00000001b,11000000b,00000110b
- db 00000011b,11100000b,00000011b,11100000b,00001100b
- db 00000111b,01110000b,00000111b,01110000b,00011000b
- db 00001110b,00111000b,00001110b,00111000b,00110000b
- db 00011100b,00011100b,00011100b,00011100b,01100000b
- db 00000001b,11000000b,00000001b,11000000b,11000000b
- db 00000001b,11000000b,00000001b,11000000b,01100000b
- db 00000001b,11000000b,00000001b,11000000b,00110000b
- db 00000001b,11000000b,00000001b,11000000b,00011000b
- db 00000001b,11000000b,00000001b,11000000b,00001100b
- db 00000001b,11000000b,00000001b,11000000b,00000110b
- db 00000001b,11000000b,00000001b,11000000b,00000010b
- db 00000001b,11000000b,00000001b,11000000b,00000000b
- db 00000001b,11000000b,00000001b,11000000b,00000000b
-
- ; 16-color modes: 0Dh, 0Eh, 10h, 12h, 6Ah, xmode16, InColor:
- ; same as above, except there are 4 planes of bit block data
- ; i. e., 4 groups of 15-row, 5-byte data; plane 3 is the first
- ; block, followed by planes 2, 1, and 0.
-
- ; EGA monochrome mode: 0Fh
- ; similar to 16-color modes, but there are only 2 groups of bit
- ; block data instead of 4
-
-
- ; 256-color modes on next page
-
-
- ; BIT BLOCK FORMATS
-
- ; mode 13h: no bit mask in the bit block header
-
- red equ 12 ; bright red
- blue equ 1 ; blue
-
- bblock dw 12,5 ; 12 rows, 5 bytes per row
- db red, red, blue,red, red
- db red, blue,red, blue,red
- db blue,red, red, red, blue
- db red, red, blue,red, red
- db red, blue,red, blue,red
- db blue,red, red, red, blue
- db red, red, blue,red, red
- db red, blue,red, blue,red
- db blue,red, red, red, blue
- db red, red, blue,red, red
- db red, blue,red, blue,red
- db blue,red, red, red, blue
-
- ; super13, super13a: no bit mask in the bit block header, x & y
- ; orienation of data is reversed for speed
- ; this example is the same pattern shown for mode 13h, above
-
- red equ 12 ; bright red
- blue equ 1 ; blue
-
- bblock dw 12,5 ; 12 rows, 5 bytes per row
- db red, red, blue,red, red, blue,red, red, blue,red, red, blue
- db red, blue,red, red, blue,red, red, blue,red, red, blue,red
- db blue,red, red, blue,red, red, blue,red, red, blue,red, red
- db red, blue,red, red, blue,red, red, blue,red, red, blue,red
- db red, red, blue,red, red, blue,red, red, blue,red, red, blue
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- PUTDOT: change a pixel on a graphics screen
- Source: putdot.asm ($graph.asm, $putdot.asm, others)
-
- Call with: DS:[BX] pointing to x & y coordinates
- Drawmodes supported are:
- (monochrome)
- 1 = set pixel
- 0 = toggle pixel
- -1 = erase pixel
-
- (color modes)
- 3 = OR foreground color with pre-existing pixel
- 1, 2 = replace pixel with foreground color
- 0 = XOR foreground color with pre-existing pixel
- -1, -2 = replace pixel with background color
- -3 = OR background color with pre-existing pixel
- Returns: if CF = 0, no error
- if CF = 1, pixel coordinates outside active view area
- Uses: CF; all other registers and flags are saved
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- extrn putdot:proc
-
- .data
- extrn drawmode:byte
- x dw 100,117 ; pixel at x = 100, y = 117
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- .
- mov drawmode,1 ; use foreground color
- lea bx,x ; point to pixel coordinates
- call putdot
-
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- GETDOT: determine pixel value on graphics screen
- Source: getdot.asm ($graph.asm, $getdot.asm, others)
-
- Call with: DS:[BX] pointing to pixel coordinate data
- Returns: if CF = 0, AX = pixel value
- if CF = 1, pixel coordinates outside active view area
- Uses: AX, CF
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- extrn getdot:proc
-
- .data
- x dw 10,10 ; pixel at (10,10)
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- .
- lea bx,x ; point to pixel coordinates
- call getdot ; get pixel value
- jc out_of_bounds ; oops
-
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- RESETVIEW: restores default view area on active graphics page and
- returns a pointer to the view data
- Source: view.asm ($graph.asm)
-
- Call with: no parameters
- ResetView restores the default full screen view area.
- The far pointer returned points to ASMLIB's data area in
- $graph.obj for the active graphics page's view coordinates.
- Returns: ES:[BX] pointing to the active page's view data.
- Uses: ES, BX; all other registers and flags are saved
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- extrn resetview:proc
-
- x0 EQU word ptr ES:[BX]
- y0 EQU word ptr ES:2[BX]
- x1 EQU word ptr ES:4[BX]
- y1 EQU word ptr ES:6[BX]
-
- .code
- .
- .
- .
- call resetview
-
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- SHOWGPAGE: change graphics page displayed on screen
- See also UseGPage and GPage.
- Source: gpage1.asm ($graph.asm, $herc.asm)
-
- Call with: BL = page number
- Returns: Carry Flag = error code
- if CF = 0, no error
- if CF = 1, bad page number
- Uses: CF
- Supports: HGraph (mono and InColor), modes 0Dh, 0Eh, 0Fh, 10h, Super13
- Example:
-
- include asm.inc
-
- extrn showgpage:proc
-
- .code
- .
- .
- .
- mov bl,1 ; show page 1
- call showgpage
- jc no_page_1 ; no page 1 for this mode
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- SHOWGPLANE: show one or more planes of multi-plane EGA/VGA screen
- Source: gplane.asm ($graph.asm)
-
- Call with: AL = plane mask
- Bits set in the plane mask correspond to the plane displayed.
- ASMLIB's default mask is 00001111b, enabling all 4 planes.
- Returns: CF = error flag
- if CF = 0, no error
- if CF = 1, bad plane mask or graphics mode
- Uses: CF
- Supports: EGA & VGA 16-color modes, including VESA 6Ah, xmode16
- and SVGA16
- EGA monochrome: planes 0 and 2
- (mask = 00000101b for both planes)
- Hercules InColor
- Example:
-
- include asm.inc
-
- extrn showgplane:proc
-
- .code
- .
- .
- .
- mov al,00000101b ; show planes 0 and 2
- call showgplane
- jc error ; error control
-
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- SMALLTEXT: change GPrint, GPrintX and GPrint2X default to 8x8 characters
- in Hercules and modes 10h, 11h, 12h; makes 8x8-size
- high ASCII characters available to GPrint in all modes
- STDTEXT: restore GPrint default characters (see GPrint)
- Source: smalltxt.asm (f8x8.asm, $graph.asm)
-
- Call with: no parameters
- Returns: nothing
- Uses: nothing; all registers and flags are saved
- Example:
-
- include asm.inc
-
- extrn smalltext:proc, stdtext:proc
-
- .code
- .
- .
- .
- ; make GPrint use the small 8x8 characters
- ; make sure high ASCII characters are available
- call smalltext
- .
- .
-
- ; sometime later, I want to use larger 8x14 characters
- call stdtext
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- UC2SYS: convert user-defined coordinates to system coordinates
- Source: uc2sys.asm ($graph.asm)
-
- Call with: DS:[BX] pointing to (x0,y0,x1,y1) coordinates in
- user-defined format
- assumes DS:@data
- Returns: DS:[BX] pointing to (x0,y0,x1,y1) coordinates in system
- format
- UCINIT and UC2SYS allow the programmer to define a
- graph coordinate system to fit the data, and converts
- the system's y-orientation from top-to-bottom to the more
- familiar bottom-to-top
- US2SYS maintains a separate data area for converted
- coordinates; the input coordinates are not changed
- Uses: BX
- Supports: all ASMLIB graphics modes; user-defined coordinates
- from -32767 to +32767; see also UCINIT
- Example: see UCINIT
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- UCINIT: specify user-defined coordinates
- Source: uc2sys.asm ($graph.asm)
-
- Call with: DS:[BX] pointing to desired xmin, ymin, xmax, ymax
- coordinates (xmax-xmin < 32767, ymax-ymin < 32767)
- assumes DS:@data
- ASMLIB's default user coordinates are (0,0,1000,1000)
- Returns: nothing
- Uses: nothing
- Example:
-
- ; I'm plotting a graph on the screen with x-axis data from 1983 to 2007
- ; and y-axis data from -72 to 140
- ; I'll leave some space on each side for titles, etc.
-
- extrn ucinit:proc, uc2sys:proc
- extrn drawbox:proc
-
- .data
- x0 dw 1975 ; xmin
- y0 dw -80 ; ymin
- x1 dw 2014 ; xmax
- y1 dw 148 ; ymax
-
- .code
- ; program fragment assumes DS:@data
- .
- .
- .
- ; establish coordinates
- lea bx,x0
- call ucinit
-
- ; draw a box arouund the graph
- mov x0,1983
- mov y0,-72
- mov x1,2007
- mov y1,140
- lea bx,x0
- call uc2sys
- call drawbox
-
- ; SEE ALSO BARGRAPH.ASM EXAMPLE PROGRAM
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- USEGPAGE: changes active graphics page used by ASMLIB
- does not change page displayed (see GPage and ShowGPage)
- Source: gpage.asm ($graph.asm, $herc.asm)
-
- Call with: BL = page number
- Returns: if CF = 0, no error
- if CF = 1, bad page number
- Uses: CF
- Supports: HGraph (mono and InColor) with Use64k
- EGA and VGA: modes with more than one page
- Example:
-
- include asm.inc
-
- extrn usegpage:proc
-
- .code
- .
- .
- mov bl,1
- call usegpage
- jc oops
-
-
-
- ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
-
- VIEWLIMIT: determine current mode's maximum dimensions
- Source: view.asm ($graph.asm)
-
- Call with: no parameters
- Returns: ES:[BX] pointing to xmax
- ES:2[BX] pointing to ymax
- Uses: ES, BX
- Supports: all ASMLIB graphics modes
- Example:
-
- include asm.inc
-
- extrn viewlimit:proc
-
- .code
- .
- .
- call viewlimit
-