📄 llcga.asm
字号:
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 + -