PLOUFF%MIT-MC@sri-unix.UUCP (06/23/83)
From: Robert L. Plouffe <PLOUFF @ MIT-MC>
In response to Darrell Plank's msg of 2 Jun 83: The method below moves
one byte at a time to video memory. You could move one word at a time,
but this seems to produce a small amount of screen noise.
No Noise On The Screen
Bob Lamb - Planning Research Corporation, McLean Virginia
To eliminate the noise caused by writing to the color/graphics screen
buffer, the writing must be carefully synchronized with the horizontal
retrace interval.
Checking (and, if necessary, waiting for) the display enable bit (bit
0 = 1) of the status byte will reduce, but not totally remove, the
noise from the screen.
To synchronize properly, wait until the display is NOT ready (bit 0 =
0), then disable interrupts, THEN wait until the display is ready (bit
0 = 1). Now write a byte or word (char and attribute) to the regen
buffer, and enable the interrupts.
My guess is that this method guarantees that you are writing at the
beginning of a horizontal retrace interval.
The following code should make the above method clearer:
MOV ES,B800H ;POINT TO VIDEO MEMORY SEGMENT
MOV DI,00H ;DESTINATION = TOP OF VIDEO MEMORY
MOV SI,OFFSET DATA ; SOURCE = SOME DATA AREA
MOV CX,16D ;TRANSFER 8 WORDS TO VIDEO MEMORY
; 1 WORD = 2 BYTES = CHAR + ATTRIBUTE
RETRACE:MOV DX,3DAH ;STATUS BYTE PORT ADDRESS
UNREADY:IN AL,DX ;GET STATUS BYTE OF REGEN BUFFER
TEST AL,01H ;TEST BIT 0 (0 = NOT READY)
JNZ UNREADY ;WAIT UNTIL BUFFER NOT READY
CLI ;NEXT PART CAN'T BE INTERRUPTED
READY: IN AL,DX ;GET STATUS BYTE OF REGEN BUFFER
TEST AL,01H ;TEST BIT 0 (1 = READY)
JZ READY ;WAIT UNTIL BUFFER IS READY
MOVSB ;MOVE ONE WORD TO VIDEO MEMORY
STI ;NOW INTERRUPTS CAN BE TURNED BACK ON
LOOP RETRACE ;DO FOR ALL 16 BYTES