svgautil.asm
来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 1,062 行 · 第 1/3 页
ASM
1,062 行
;*****************************************************************************
;*
;* Open Watcom Project
;*
;* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
;*
;* ========================================================================
;*
;* This file contains Original Code and/or Modifications of Original
;* Code as defined in and that are subject to the Sybase Open Watcom
;* Public License version 1.0 (the 'License'). You may not use this file
;* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
;* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
;* provided with the Original Code and Modifications, and is also
;* available at www.sybase.com/developer/opensource.
;*
;* The Original Code and all software distributed under the License are
;* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
;* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
;* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
;* NON-INFRINGEMENT. Please see the License for the specific language
;* governing rights and limitations under the License.
;*
;* ========================================================================
;*
;* Description: Utility routines for SuperVGA modes.
;*
;*****************************************************************************
include graph.inc
xref _Zap19_
xref _Fill19_
xref _PixCopy19_
xref _PixRead19_
extrn __PlotAct : word
extrn __Transparent : word
extrn __VGAPage : byte
extrn __VGAStride : word
extrn __VGAGran : byte
extptr __SetVGAPage
modstart svgautil,WORD
xdefp _MoveUp100_
xdefp _MoveDown100_
xdefp _MoveUp128_
xdefp _MoveDown128_
xdefp _MoveLeft256_
xdefp _MoveRight256_
xdefp _MoveUp640_
xdefp _MoveDown640_
xdefp _MoveUp800_
xdefp _MoveDown800_
xdefp _MoveUp1024_
xdefp _MoveDown1024_
;; xdefp _MoveUp1280_ ; this mode is untested
;; xdefp _MoveDown1280_
;; xdefp _MoveLeftWord_
;; xdefp _MoveRightWord_
;; xdefp _RepWord_
;; xdefp _XorWord_
;; xdefp _AndWord_
;; xdefp _OrWord_
;; xdefp _GetDotWord_
;; xdefp _ZapWord_
;; xdefp _FillWord_
;; xdefp _PixCopyWord_
;; xdefp _PixReadWord_
;; xdefp _ScanLeftWord_
;; xdefp _ScanRightWord_
xdefp _Zap256_
xdefp _Fill256_
xdefp _PixCopy256_
xdefp _PixRead256_
xdefp _ScanLeft256_
xdefp _ScanRight256_
xdefp _PageVESA_
xdefp _PageVideo7_
xdefp _PageParadise_
xdefp _PageATI_
xdefp _PageTseng3_
xdefp _PageTseng4_
xdefp _PageOak_
xdefp _PageTrident_
xdefp _PageChips_
xdefp _PageGenoa_
xdefp _PageS3_
xdefp _PageCirrus_
xdefp _PageViper_
;=========================================================================
;
; SuperVGA page setting functions
;
; Input AL page number
;
; (see the book 'Advanced Programmer's Guide to Super VGAs'
; for description of these routines.
;
;=========================================================================
_PageVESA_:
cmp al,ss:__VGAPage ; if page already selected
_if ne ; then
mov ss:__VGAPage,al ; remember new page
push _ebx
push _ecx
push _edx
mov cl,ss:__VGAGran
shl al,cl
xor ah,ah
mov dx,ax
mov ax,4f05h
xor bx,bx
int 10h ; Page window a (write)
mov ax,4f05h
mov bl,1
int 10h ; Page window b (read)
pop _edx
pop _ecx
pop _ebx
_endif
_retf
_PageVideo7_:
cmp al,ss:__VGAPage ; if page already selected
_if ne ; then
mov ss:__VGAPage,al ; remember new page
mov ah,al
push _edx
cmp byte ptr ss:__VGAGran,16
_if e ; different paging mechanism for 16/256 cols
mov dx,3c4h
mov al,0f6h
out dx,al
inc dx
in al,dx
and al,0f0h
or al,ah
shl ah,1
shl ah,1
or al,ah
out dx,al
_else
mov dx,3cch
in al,dx
and al,not 20h
and ah,2
shl ah,1
shl ah,1
shl ah,1
shl ah,1
or al,ah
mov dx,3c2h
out dx,al
mov dx,3c4h
mov al,0f9h
mov ah,ss:__VGAPage
and ah,1
out dx,ax
mov al,0f6h
out dx,al
inc dx
in al,dx
and al,0f0h
mov ah,ss:__VGAPage
and ah,0ch
or al,ah
shr ah,1
shr ah,1
or al,ah
out dx,al
_endif
pop _edx
_endif
_retf
_PageParadise_:
_PageCirrus_:
cmp al,ss:__VGAPage ; if page already selected
_if ne ; then
mov ss:__VGAPage,al ; remember new page
mov ah,al
shl ah,1
shl ah,1
shl ah,1
shl ah,1
mov al,9
push _edx
mov dx,3ceH
out dx,ax
pop _edx
_endif
_retf
_PageATI_:
cmp al,ss:__VGAPage ; if page already selected
_if ne ; then
mov ss:__VGAPage,al ; remember new page
mov ah,al
cli
push _edx
mov _edx,1ceH
mov al,0b2H
out dx,al
inc dl
in al,dx
and al,0e1h
shl ah,1
or ah,al
mov al,0b2H
dec dl
out dx,ax
pop _edx
sti
_endif
_retf
_PageTseng3_:
cmp al,ss:__VGAPage ; if page already selected
_if ne ; then
mov ss:__VGAPage,al ; remember new page
mov ah,al
shl ah,1
shl ah,1
shl ah,1
or al,ah
or al,40h
push _edx
mov dx,3CDh
out dx,al
pop _edx
_endif
_retf
_PageViper_:
_PageTseng4_:
cmp al,ss:__VGAPage ; if page already selected
_if ne ; then
mov ss:__VGAPage,al ; remember new page
mov ah,al
shl ah,1
shl ah,1
shl ah,1
shl ah,1
or al,ah
push _edx
mov dx,3CDh
out dx,al
pop _edx
_endif
_retf
_PageOak_:
cmp al,ss:__VGAPage ; if page already selected
_if ne ; then
mov ss:__VGAPage,al ; remember new page
mov ah,al
shl ah,1
shl ah,1
shl ah,1
shl ah,1
or al,ah
push _edx
mov dx,3dfh
out dx,al
pop _edx
_endif
_retf
_PageTrident_:
cmp al,ss:__VGAPage ; if page already selected
_if ne ; then
mov ss:__VGAPage,al ; remember new page
mov ah,al
xor ah,02h
push _edx
mov dx,3c4h
mov al,0eh
out dx,al
inc dx
in al,dx
and al,0f0h
or al,ah
out dx,al
pop _edx
_endif
_retf
_PageChips_:
cmp al,ss:__VGAPage ; if page already selected
_if ne ; then
mov ss:__VGAPage,al ; remember new page
push _ecx
mov cl,ss:__VGAGran
shl al,cl
mov ah,al
push _edx
mov dx,03d6h
mov al,10h
out dx,al
inc dx
in al,dx
and al,0c0h
or al,ah
out dx,al
pop _edx
pop _ecx
_endif
_retf
_PageGenoa_:
cmp al,ss:__VGAPage ; if page already selected
_if ne ; then
mov ss:__VGAPage,al ; remember new page
mov ah,al
shl al,1
shl al,1
shl al,1
or ah,al
push _edx
mov dx,03c4h
mov al,6
out dx,al
inc dx
in al,dx
and al,80h
or al,40h
or al,ah
out dx,al
pop _edx
_endif
_retf
_PageS3_:
cmp al,ss:__VGAPage ; if page already selected
_if ne ; then
mov ss:__VGAPage,al ; remember new page
mov ah,al
cmp byte ptr ss:__VGAGran,16 ; shift page in 16 colour mode
_if e
shl ah, 1
shl ah, 1
_endif
mov al,35h
push _edx
mov dx,03d4h
out dx,al
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?