[net.micro] Zenith Z100 hint #101

kfl@5941ux.UUCP (09/20/83)

A friend of mine recently was having trouble getting
his Heath H100 to light one pixel using the
bit-mapped graphics under ZDOS (MS-DOS), so he
called the consulting folks at Zenith and got this
reply.  I am posting it because I think it may be of
general interest to Heath H100/Zenith Z100 owners.

Ken Lee
5941ux!kfl
______________________________________
Dear Customer:

In response to your request, we are sending the
attached information.

If we can be of any further assistance, please call
(616) 982-3860 for operating systems/languages
questions or (616) 982-3884 for applications
programs, or write to: Zenith Data Systems, Software
Consultation, Hilltop Road, St. Joseph, MI 49085.

Sincerely,
The Software Consultation Group
Zenith Data Systems

_______________________________________

Attachment 1

Question:  Given an X, Y coordinate, how can I
access a single pixel on the Z100 video screen
within an assembly language program?

Answer:  The first thing that must be done is to
enable access to video memory.  This is done by
reading port 0D8H, ANDing the value read with 07FH,
and then writing the result back to port 0D8H.

The next step is to form the address of the byte
containing the desired pixel from the X, Y
coordinate.  The video disply is organized as 640
pixels or 80 bytes horizontally, by 225 pixels
vertically.  The 225 vertical lines are organized
into 25 rows of 9 scan lines each.  Assuming that
the X coordinate is in the range 0 to 639 and the Y
coordinate 0 to 224, the 16 bit address can be
formed by first dividing the X ordinate by 8, saving
the remainder and storeing the result in bit
positions 0 through 6 of the address.  Next, the Y
ordinate should be divided by 9, the remainder
placed in bit positions 7 through 10, and the result
in positions 11 through 15 or the address.  this
resulting address will point to the byte within a
particular color plane containing the pixel.  The
remainder from the X divide by 8 operation performed
above can be used to obtain the bit position of the
pixel within that byte.  The color planes are 64K
each, with green being at segment E000H, red ad
D000H, and blue at C000H.  The diagram below shows
the different fields and their positions within the
address.

       15      11 10      7 6           0
       __________________________________
       |   Row   |   Line  |  Column    |
       |  0 - 24 |   0 - 8 |  0 - 79    |
       __________________________________

	   Sixteen bit address

The code fragment given below will accomplish the
task of "turning on" a pixel in the color plane
pointed to be register ES.  The X ordinate of the
pixel is passed in register BX, and the Y ordinate
in register AX.

	MOV	DL,0111B
	AND	DL,BL		; DL = Remainder of X/8
	MOV	CL,3
	SHR	BX,CL		; BX = X/8
	MOV	DI,BX		; Save result (bits 0-6)
	MOV	BL,9
	DIV	BL		; Divide Y by 9
	XCHG	AL,AH		; AH=result, AL=remainder
	MOV	BX,AX
	AND	BX,0FH		; Isolate line number
	MOV	CL,7
	SHL	BX,CL		; Move it into position
	AND	AX,1F00H	; Isolate row number
	MOV	CL,3
	SHL	AX,CL		; Move it into position
	OR	AX,BX
	OR	DI,AX		; DI = complete address
	MOV	AL,80H
	MOV	CL,DL		; CL = remainder from X/8
	SHR	AL,CL		; AL = pixel mask
	OR	ES:[DI],AL	; Turn pixel on

________________________________________________

That's it.  It works.  The Zenith people were very helpful.
We also did the same thing using the CI C86 compiler under 
ZDOS.  Works fine.  The assembly language code given in the letter
is, of course, for the 8088.