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

📄 llcga.asm

📁 Microsoft MS-DOS6.0 完整源代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	TITLE		LLCGA - CGA screen mode support
;***
;LLCGA - CGA screen mode support
;
;	Copyright <C> 1986, Microsoft Corporation
;
;Purpose:
;	Support for CGA graphics screen modes (BIOS 4,5,6).
;	Note that this module module contains support
;	code for all adapters capable of handling these
;	screen modes and also attempts to compensate for
;	the subtle differences in their treatment.
;
;	This module sets hooks in the mode-independent
;	modules to routines here for mode-dependent
;	graphics support.  See the mode-independent
;	modules for more precise descriptions of the
;	purposes and interfaces of these routines.
;
;	The following table summarizes the information for
;	the modes and configurations covered:
;
;    C		  |	A			     B
;    O		  |  B	T			     I
;    L		  |  I	T		 P	     T
;    O	     A	M |  O	R		 A    C      S
;  S R	     D	O |  S	I    C		 G    H      / P
;  C B	     A	N |	B    O		 E    A   P  P L
;  R U	C  R P	I |  M	U    L	 X   Y	 S    R   A  I A
;  E R	O  O T	T |  O	T    O	 R   R	 I    B   G  X N
;  E S	L  W E	O |  D	E    R	 E   E	 Z    O   E  E E
;  N T	S  S R	R |  E	S    S	 S   S	 E    X   S  L S
; -- - -- -- - -- | -- --- ---- --- --- --- ---- --- - -
;  1 0 40 25 C	x |  4	 4  N/A 320 200  16 8x8   1  2 1
;  1 0 40 25 E	x |  "   "  16	 "   "	  "  "	  "  " "
;  1 1 40 25 C	x |  5	 "  N/A  "   "    "  "    "  " "
;  1 x 40 25 I	x |  "   "   "   "   "    "  "    "  " "
;  1 1 40 25 E	x |  "   "  16	 "   "	  "  "	  "  " "
;  1 x 40 25 S	x |  "   "   "   "   "    "  "    "  " "
;
;  2 x 80 25 C	x |  6	 2  N/A 640 200  16 8x8   1  1 1
;  2 x 80 25 I	x |  "   "   "   "   "    "  "    "  " "
;  2 x 80 25 E	x |  "   "  16	 "   "	  "  "	  "  " "
;  2 x 80 25 S	x |  "   "   "   "   "    "  "    "  " "
;
; Discussion of CGA odd/even line archtecture:
;	CGA video memory is organized into two banks.  The first bank,
;	starting at B800, contains all the even scan lines.  The second
;	bank, starting at B800+8K, contains all the odd scan lines:
;
;	Scan	Offset
;	Line	from B800
;	----	---------
;	0	0
;	1	8K
;	2	80
;	3	8K+80
;	.	.
;	.	.
;	.	.
;
;	To move UP   from odd  scan line to even, add -8K    to current address
;	To move UP   from even scan line to odd,  add +8K-80 to current address
;	To move DOWN from odd  scan line to even, add -8K+80 to current address
;	To move DOWN from even scan line to odd,  add +8K    to current address
;
;******************************************************************************

	INCLUDE switch.inc	;feature switches
	INCLUDE rmacros.inc

	USESEG	_DATA
	USESEG	_BSS
	USESEG	GR_TEXT
	USESEG	CN_TEXT
	USESEG	XIB		
	USESEG	XI		
	USESEG	XIE		

	INCLUDE seg.inc
	INCLUDE ibmunv.inc
	INCLUDE llgrp.inc	; Constant definitions
	INCLUDE idmac.inc
	INCLUDE grmac.inc	;ModeData macros

	INITIALIZER B$xINITCGA	;Put B$xINITCGA in initializer list


sBegin	_BSS
;
; ***************************************************************************
; Local variables
; ***************************************************************************
;
staticB BackColor,,1		;save background color for COLOR stmt
				;__bBackColor is actually an attribute,
				;and should stay 0 in graphics modes
;
; ***************************************************************************
; External function vectors
; ***************************************************************************
;
externW b$PalPut
;
; ***************************************************************************
; External variables
; ***************************************************************************
;
externW b$CurPages		; current active and visual page
externB b$BiosMode
externB b$Adapter
externB b$Monitor
externW b$ModeBurst
externB b$ScreenMode
externW b$VideoBase
externB b$MaskC
externB b$AttrC
externW b$OffC
externW b$SegC
externB b$MaxAttr
externB b$EgaPalSup		
externW B$VTOFST
externW B$VBOFST
externW B$VLOFST
externW B$VROFST
externW B$LEOFST
externW B$REOFST
externB b$NullColor
externB b$BitsPerPixel
externW b$BytesPerRow

externW b$UpSub 		
externW b$DnSub 		
externW b$UpDnAdd		
externW b$ScreenTab		
sEnd	_BSS

assumes CS,GR_TEXT
sBegin	GR_TEXT

externNP B$SCNIO 		;used in SCNIO macro

externNP B$InitModeData
externNP B$GetParm
externNP B$EgaPalReset
externNP B$EgaPalPut
externNP B$EgaPalTrans
externNP B$EgaPalSet
externNP B$ErrorReturn
externNP B$CgaSetAttr
externNP B$CgaLeftC1		
externNP B$CgaLeftC2		
externNP B$CgaChkUpC		
externNP B$CgaUpC		
externNP B$CgaChkDownC		
externNP B$CgaDownC		
externNP B$CgaPaintBound	
externNP B$CgaReadC
externNP B$CgaSetC
externNP B$CgaSetPixC
externNP B$CgaSetPixFirstC
externNP B$CgaSetPixLastC
externNP B$CgaPutAction
externNP B$CgaNReadL
externNP B$CgaNWriteL
externNP B$CgaNSetC
externNP B$CgaSetTile
externNP B$CgaScanL
externNP B$CgaScanR
externNP B$CgaLineX
externNP B$CgaLineY
externNP B$CgaLineV


;===========================================================================
mModeData	Mode1Data
;
; SCREEN 1, BIOS modes 4 & 5
;
; Mode-dependent data follows to initialize the the "b$ModeData" table
; in LLCGRP.
;
;===========================================================================
mScreenMode	1
mBiosMode	4		;BIOS mode and burst may be adjusted later
mBurst		0
mScrWidth	40
mScrHeight	25
mHorzRes	320
mVertRes	200
mVideoBase	0B800H
mMaxAttr	3
mMaxColor	15
mPageSize	16		    ;page size in K
mCurrPSize	<(16*1024) shr 4>   ;page size in paragraphs (1 plane)
mMaxPage	0
mNullColor	0
mForeColor	3
mBackColor	0
mEgaWrMd	0
mInitPalette	Mode1Palette
mInitVgaPal	Mode1VgaPal
mAlphaDim	AlphaDim1
mSetMode	SetMode
mSetPages	B$CgaSetPages		
mPalReset	B$EgaPalReset
mPalPut 	PalPut1
mPalTrans	B$EgaPalTrans
mPalSet 	B$EgaPalSet
mSetColor	SetColor1
mForeMapped	3
mBitsPerPixel	2
mPlanes 	1
mMapXYC 	MapXYC1
mLeftC		B$CgaLeftC2	
mChkUpC 	B$CgaChkUpC	
mUpC		B$CgaUpC	
mChkDownC	B$CgaChkDownC	
mDownC		B$CgaDownC	
mSetAttr	SetAttr1
mReadC		B$CgaReadC
mSetC		B$CgaSetC
mSetPixC	B$CgaSetPixC
mSetPixFirstC	B$CgaSetPixFirstC
mSetPixLastC	B$CgaSetPixLastC
mLineX		B$CgaLineX
mLineY		B$CgaLineY
mLineV		B$CgaLineV
mPutAction	B$CgaPutAction
mNReadL 	B$CgaNReadL
mNWriteL	B$CgaNWriteL
mNSetC		B$CgaNSetC
mPaintBound	B$CgaPaintBound 
mSetTile	B$CgaSetTile
mScanL		B$CgaScanL
mScanR		B$CgaScanR
mEnd		GraphDataLen
;===========================================================================

;===========================================================================
mModeData	Mode2Data
;
; SCREEN 2, BIOS mode 6
;
; Mode-dependent data follows to initialize the the "b$ModeData" table
; in LLCGRP.
;
;===========================================================================
mScreenMode	2
mBiosMode	6
mBurst		0
mScrWidth	80
mScrHeight	25
mHorzRes	640
mVertRes	200
mVideoBase	0B800H
mMaxAttr	1
mMaxColor	15
mPageSize	16		    ;page size in K
mCurrPSize	<(16*1024) shr 4>   ;page size in paragraphs (1 plane)
mMaxPage	0
mNullColor	0
mForeColor	1
mBackColor	0
mEgaWrMd	0
mInitPalette	b$Mode2Palette		
mInitVgaPal	b$Mode2VgaPal		
mAlphaDim	AlphaDim2
mSetMode	SetMode
mSetPages	B$CgaSetPages		
mPalReset	B$EgaPalReset
mPalPut 	B$EgaPalPut
mPalTrans	B$EgaPalTrans
mPalSet 	B$EgaPalSet
mSetColor	B$ErrorReturn
mForeMapped	1
mBitsPerPixel	1
mPlanes 	1
mMapXYC 	MapXYC2
mLeftC		B$CgaLeftC1	
mChkUpC 	B$CgaChkUpC	
mUpC		B$CgaUpC	
mChkDownC	B$CgaChkDownC	
mDownC		B$CgaDownC	
mSetAttr	B$CgaSetAttr
mReadC		B$CgaReadC
mSetC		B$CgaSetC
mSetPixC	B$CgaSetPixC
mSetPixFirstC	B$CgaSetPixFirstC
mSetPixLastC	B$CgaSetPixLastC
mLineX		B$CgaLineX
mLineY		B$CgaLineY
mLineV		B$CgaLineV
mPutAction	B$CgaPutAction
mNReadL 	B$CgaNReadL
mNWriteL	B$CgaNWriteL
mNSetC		B$CgaNSetC
mPaintBound	B$CgaPaintBound 
mSetTile	B$CgaSetTile
mScanL		B$CgaScanL
mScanR		B$CgaScanR
mEnd		GraphDataLen
;===========================================================================

;
; Mode1Palette - used to initialize the EGA palette for SCREEN 1
;		 (BIOS mode 4 or 5).
;
labelB	Mode1Palette
	;	RGBrgb
	DB	000000B 	;black
	DB	111011B 	;bright cyan
	DB	111101B 	;bright magenta
	DB	111111B 	;bright white
	;DB	    12 DUP (0)
;
; Mode2Palette - used to initialize the EGA palette for SCREEN 2
;		 (BIOS mode 6).
;
PUBLIC	b$Mode2Palette		
labelB	b$Mode2Palette		
	;	RGBrgb
	DB	000000B 	;black
	DB	111111B 	;bright white
	;DB	    14 DUP (0)



labelNP <PUBLIC, B$CGAUSED>	


;*** 
; B$Screen1
;
;Purpose:
;	Establish all relevent mode dependent data values and function
;	vectors for BASIC screen mode 1.
;Entry:
;	AL = screen mode (1)
;	AH = burst (0 or 1)
;	CL = alpha columns
;Exit:
;	PSW.C = set indicates error
;Uses:
;	per conv.
;Exceptions:
;******************************************************************************
cProc	B$Screen1,<PUBLIC,NEAR>
cBegin
	test	b$Adapter,VGA + MCGA + EGA + CGA ;check for adapter support
	je	ScrErr		;exit w/error if not supported
	test	b$Monitor,AnalogColor + EnhColor + StdColor
				;check for monitor support
	je	ScrErr		;exit w/error if not supported
	mov	al,ah		;new BIOS mode = 4 if no burst
	add	al,4		;		 5 if burst
	mov	bx,GR_TEXTOFFSET Mode1Data  ;mode-specific data
	mov	cx,GraphDataLen 
	push	ax
	call	B$InitModeData ;initialize table data
	pop	ax
	mov	b$ModeBurst,ax ;save new mode and burst
	jmp	short ScrCommon ;common exit
ScrErr:
	stc
ScrExit:
JustReturn:
cEnd

;*** 
; B$Screen2
;
;Purpose:
;	Establish all relevent mode dependent data values and function
;	vectors for BASIC screen mode 2.
;Entry:
;	AL = screen mode (2)
;	AH = burst (0 or 1)
;	CL = alpha columns
;Exit:
;	PSW.C = set indicates error
;Uses:
;	per conv.
;Exceptions:
;	can exit through B$Screen1's error exit.
;******************************************************************************
cProc	B$Screen2,<PUBLIC,NEAR>
cBegin
	test	b$Adapter,VGA + MCGA + EGA + CGA ;check for adapter support
	je	ScrErr		;exit w/error if not supported
	test	b$Monitor,AnalogColor + EnhColor + StdColor
				;check for monitor support
	je	ScrErr		;exit w/error if not supported
	mov	bx,GR_TEXTOFFSET Mode2Data  ;mode-specific data
	mov	cx,GraphDataLen 
	call	B$InitModeData ;initialize table data
ScrCommon:				
	mov	b$UpSub,8192		
	mov	b$DnSub,8192-80 	
	mov	b$UpDnAdd,8192-80+8192	
	clc			;indicate no error
cEnd

;***
; AlphaDim1

⌨️ 快捷键说明

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