⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tvgaldh.asm

📁 DOS下的图形界面开发包
💻 ASM
字号:
;;**********************************************************************;;
;;																		;;
;; File: _drawUtl.asm													;;
;; Routines: _readDAC,_writeDAC											;;
;;																		;;
;;**********************************************************************;;

.model large
LPROG EQU 1
.code

public _read_DAC
public _write_DAC
public __selectVGABitPlane

SEQUENCER_REG		EQU 03c4h
EXTANDED_REG		EQU 03c4h
PAGE_INDEX			EQU 0EH

VIDEO_BUFFER_SEG	EQU 0a000h

VIDEO_PAGES	       	EQU 4

;;----------------------------------------------------------------------;;
;; _read_DAC. It's .CPP call declaration is								;;
;;	extern "C" far read_DAC ( int start, int count, 					;;
;;											char far * DACary );		;;
;; It read count (1..256) DAC registers from NO.start (0..255), the 	;;
;;	value is save to mem block pointed out by char far * DACary			;;
;;	with the following layout: R1, G1, B1,  R2, G2, B2,  R3, G3, B3, ...;;
;;----------------------------------------------------------------------;;
Arg_Start equ word ptr [ bp + 4 ]
Arg_Count equ word ptr [ bp + 6 ]
Arg_ArrayPtr equ dword ptr [ bp + 8 ]

ifdef LPROG		;; LPROG - large program. see "bc\ctrl\rtlinc\rules.asi"
	Arg_Start equ word ptr [ bp + 6 ]
	Arg_Count equ word ptr [ bp + 8 ]
	Arg_ArrayPtr equ dword ptr [ bp + 10 ]
endif

_read_DAC	PROC FAR
	PUSH BP
	MOV BP, SP
	PUSH ES
	PUSH DS
	PUSH DI
	PUSH SI

	LES DI, Arg_ArrayPtr
	MOV AX, Arg_Start
	MOV CX, Arg_Count
	MOV DX, 3C7H
	OUT DX, AL
	INC DX
	INC DX

DAC_In_Loop:
	IN AL, DX
	STOSB
	IN AL, DX
	STOSB
	IN AL, DX
	STOSB
	LOOP DAC_In_Loop

	POP SI
	POP DI
	POP DS
	POP ES

	MOV SP, BP
	POP BP
	RET
_read_DAC	ENDP

;;----------------------------------------------------------------------;;
;; _write_DAC. It's .CPP call declaration is							;;
;;	extern "C" far write_DAC ( int start, int count, 					;;
;;											char far * DACary );		;;
;; It write count (1..256) DAC registers from NO.start (0..255), the 	;;
;;	value is get from mem block pointed out by char far * DACary		;;
;;	with the following layout: R1, G1, B1,  R2, G2, B2,  R3, G3, B3, ...;;
;;----------------------------------------------------------------------;;
Arg_Start equ word ptr [ bp + 4 ]
Arg_Count equ word ptr [ bp + 6 ]
Arg_ArrayPtr equ dword ptr [ bp + 8 ]

ifdef LPROG
	Arg_Start equ word ptr [ bp + 6 ]
	Arg_Count equ word ptr [ bp + 8 ]
	Arg_ArrayPtr equ dword ptr [ bp + 10 ]
endif

_write_DAC	PROC FAR
	PUSH BP
	MOV BP, SP
	PUSH ES
	PUSH DS
	PUSH DI
	PUSH SI

	LDS SI, Arg_ArrayPtr
	MOV AX, Arg_Start
	MOV CX, Arg_Count
	MOV DX, 3C8H
	OUT DX, AL
	INC DX

DAC_Out_Loop:
	LODSB
	OUT DX, AL
	LODSB
	OUT DX, AL
	LODSB
	OUT DX, AL
	LOOP DAC_Out_Loop

	POP SI
	POP DI
	POP DS
	POP ES

	MOV SP, BP
	POP BP
	RET
_write_DAC	ENDP

;;----------------------------------------------------------------------;;
;; __selectVGABitPlane It's .CPP call declaration is					;;
;;	extern "C" far _selectVGABitPlane ( int planeNo, int cmd );			;;
;;																		;;
;; It select 1 VGA bit plane for the following read or write.			;;
;;  When the cmd not zero, it select a plane for write, or for read 	;;
;;----------------------------------------------------------------------;;
Arg_planeNo equ word ptr [ bp + 4 ]
Arg_cmd equ word ptr [ bp + 6 ]

ifdef LPROG
	Arg_planeNo equ word ptr [ bp + 6 ]
	Arg_cmd equ word ptr [ bp + 8 ]
endif

__selectVGABitPlane	PROC FAR
	PUSH BP
	MOV BP, SP

	MOV AX, Arg_cmd
	OR AX, AX
	JNE selectWritePlane
;;selectReadPlane
	MOV DX, 3ceH
	MOV AX, Arg_planeNo
	XCHG AL, AH
	AND AH, 3
	MOV AL, 4
	OUT DX, AX
	JMP return
selectWritePlane:
	MOV DX, 3c4H
	MOV CX, Arg_planeNo
	AND CX, 3
	MOV AX, 102H
	SHL AH, CL
	OUT DX, AX

return:
	MOV SP, BP
	POP BP
	RET
__selectVGABitPlane	ENDP
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -