🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: alt.msdos.programmer
1 messages
1 total messages Started by Russ Nelson Thu, 18 Jan 1990 12:54
Trident VGA mode 60: write a pixel, .ASM
#444
Author: Russ Nelson
Date: Thu, 18 Jan 1990 12:54
119 lines
3470 bytes
The following code will write a single pixel to a Trident VGA in mode 60,
that's 1024 x 768.  It's a disassembly of the same function from the VGA bios.
It should be usable to write general-purpose access functions.
-russ

comment \

INT 10 - VIDEO - WRITE DOT ON SCREEN
        AH = 0Ch
        AL = color of dot (0/1 in mode 6, 0-3 in modes 4 and 5)
             if bit 7 set, new color will be XORed with current pixel
        BH = display page (ignored if mode only supports one page)
        CX = column
        DX = row
Note:   only valid in graphics modes
SeeAlso: AH=0Dh
---------------------------------------------
\

;write a dot in video mode 60h (Trident)

write_dot_mode_60:

	CALL	l082A			;clear sequencer register b.
	MOV	BL,AL			;get the color.
	CALL	l26BC			;map the color.
	MOV	SI,AX			;save it in si for a while.
	CALL	l2681
	MOV	AL,08			;output the mask register.
	OUT	DX,AX
	XCHG	BX,SI			;get si into bx, and our memory
					;  address into si.
	MOV	AX,0205h		;select write mode 2.
	OUT	DX,AX
	OR	BL,BL			;is the color signed?  (should we
	JNS	25BA			;  xor the existing bit?)  go if not.
	MOV	AX,1803h		;set the function to XOR.
	OUT	DX,AX
25ba:
	MOV	AL,[SI]			;load the latches
	MOV	AL,BL
	MOV	[SI],AL			;store the new pixel's value.
	MOV	AX,0FF08h		;reset graphics controller bit mask
	OUT	DX,AX
	MOV	AX,0005h		;reset to mode zero.
	OUT	DX,AX
	CALL	l2344
	JMP	2525

l2344:
	MOV	AX,0003			;reset function and rotate.
	MOV	DX,03CEh
	OUT	DX,AX
	MOV	AX,0F02h			;store F into CRT controller reg. 2.
	MOV	DL,0C4h
	OUT	DX,AX
	RET

;this video mode puts odd bytes on odd pages, even bytes on even pages.

graphics_addr	dw	0a000h

l2681:
;enter with cx = x, dx = y.
;exit with dx pointing to the graphics controller,
;	ds -> screen memory,
;	ah = bit of byte in memory.
	MOV	BX,CX			;Isolate the X byte.
	SHR	BX,1
	SHR	BX,1
	SHR	BX,1
	SHR	BX,1
	MOV	AX,DX
	MOV	DX,[044Ah]		;get the screen width in bytes.
	SHR	DX,1
	MUL	DX			;multiply the Y by the width.
	ADD	BX,AX			;accumulate the address.

	AND	CL,0Fh			;get the X position
	MOV	AX,8000h		;shift the bit over.
	SHR	AX,CL
	OR	AH,AH			;Did we shift it off?
	MOV	CH,AH			;assume no -- put bit in ch,
	MOV	AH,5			;  and page value.
	JNZ	26AB
	MOV	AH,10			;yes, get page value,
	MOV	CH,AL			;  and put bit in ch.
26ab:
	MOV	DX,3C4h			;set CRT controller register 2.
	MOV	AL,2
	OUT	DX,AX
	MOV	AH,CH			;get the bit into ah.
	MOV	DS,CS:graphics_addr	;get the screen address into ds
	MOV	DX,3CEh			;get the graphics controller into dx.
	RET

l26C0	db	0, 3, 12, 15

;map colors 0 through 3 into 0, 3, 12, and 15.
l26bc:
	PUSH	BX
	AND	BL,3
	XOR	BH,BH
	MOV	AL,CS:l26c0[BX]
	POP	BX
	RET

l082a:
	PUSH	AX	;clear sequencer register b.
	PUSH	DX
	MOV	DX,3C4h
	MOV	AX,000Bh
	OUT	DX,AX
	POP	DX
	POP	AX
	RET
-- 
--russ (nelson@clutx [.bitnet | .clarkson.edu])  Russ.Nelson@$315.268.6667
Violence never solves problems, it just changes them into more subtle problems
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads