ReC98/libs/master.lib/grcg_fill.asm

114 lines
1.9 KiB
NASM

PAGE 98,120
; graphics - grcg - fill - PC98V
;
; Function:
; void far _pascal grcg_fill( void ) ;
;
; Description:
; クリップ枠内を塗りつぶす(青プレーンのみ)
;
; Binding Target:
; Microsoft-C / Turbo-C / Turbo-Pascal
;
; Running Target:
; NEC PC-9801 Normal mode
;
; Requiring Resources:
; CPU: V30
; GRAPHICS ACCELARATOR: GRAPHIC CHARGER
;
; Assembler:
; TASM 3.0
; OPTASM 1.6
; for ALL memory model(SMALL以外にするときは .MODELを書き換えて下さい)
;
; Notes:
; ・グラフィック画面の青プレーンにのみ描画します。
; ・色をつけるには、グラフィックチャージャーを利用してください。
; ・grc_setclip()によるクリップ枠全面を塗りつぶします。
;
; 関連関数:
; grc_setclip()
;
; Author:
; 恋塚昭彦
;
; Revision History:
; 92/6/13 Initial
; 92/6/16 TASM対応
MRETURN macro
pop DI
pop SI
pop BP
ret
EVEN
endm
; void far _pascal grcg_fill( void ) ;
func GRCG_FILL
push BP
push SI
push DI
mov AX,ClipYT_seg ;
mov ES,AX ;
mov BX,ClipXL ; BX = x1(left)
mov DI,BX ; DI = + ClipYB_adr + xl / 16 * 2
shr DI,4 ;
shl DI,1 ;
add DI,ClipYB_adr ;
and BX,0Fh
lea SI,[BX-10h] ; SI = bitlen
shl BX,1
mov DX,[EDGES+BX]
not DX ; DX = first word
add SI,ClipXW
mov BX,SI
and BX,0Fh
shl BX,1
mov BX,[EDGES+2+BX] ; BX = last word
sar SI,4 ; SI = num words
js short @@SHORTBOX
; 現在のデータ (AX,CXはフリー)
; DX first word
; BX last word
; SI num words
; DI start address
; BP sub offset
; ES gseg...
; 横幅が2ワード以上あるとき ==============
lea BP,[2+40+SI] ; BP = (num words + 2 + 40) * 2
shl BP,1 ;
EVEN
@@YLOOP:
mov AX,DX
stosw
mov AX,0FFFFh
mov CX,SI
rep stosw
mov AX,BX
stosw
sub DI,BP
jnb short @@YLOOP
MRETURN
; 横幅が1ワードしかないとき ==============
@@SHORTBOX:
mov BP,82 ; BP = 横幅+1ワード
mov AX,DX
and AX,BX
EVEN
@@YLOOP2:
stosw
sub DI,BP
jnb short @@YLOOP2
MRETURN
endfunc