mirror of https://github.com/nmlgc/ReC98.git
186 lines
3.4 KiB
NASM
186 lines
3.4 KiB
NASM
|
PAGE 98,120
|
||
|
; graphics - grcg - boxfill - PC98V
|
||
|
;
|
||
|
; Function:
|
||
|
; void far _pascal grcg_boxfill( int x1, int y1, int x2, int y2 ) ;
|
||
|
;
|
||
|
; Description:
|
||
|
; 箱塗り(青プレーンのみ)
|
||
|
;
|
||
|
; Parameters:
|
||
|
; int x1,y2 第1点
|
||
|
; int x2,y2 第2点
|
||
|
;
|
||
|
; Binding Target:
|
||
|
; Microsoft-C / Turbo-C
|
||
|
;
|
||
|
; 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/10 Initial
|
||
|
; 92/6/10 些細な(害の無い)バグ取り
|
||
|
; 92/6/16 TASM対応
|
||
|
|
||
|
MRETURN macro
|
||
|
pop DI
|
||
|
pop SI
|
||
|
pop BP
|
||
|
ret 8
|
||
|
EVEN
|
||
|
endm
|
||
|
|
||
|
; void far _pascal grcg_boxfill( int x1, int y1, int x2, int y2 ) ;
|
||
|
retfunc GRCG_BOXFILL_RETURN
|
||
|
MRETURN ; ひー、こんなところに!!
|
||
|
endfunc
|
||
|
|
||
|
func GRCG_BOXFILL
|
||
|
push BP
|
||
|
push SI
|
||
|
push DI
|
||
|
|
||
|
CLI
|
||
|
add SP,(RETSIZE+3)*2
|
||
|
pop DI ; y2
|
||
|
pop SI ; x2
|
||
|
pop AX ; y1
|
||
|
pop BX ; x1
|
||
|
sub SP,(RETSIZE+3+4)*2
|
||
|
STI
|
||
|
|
||
|
; まず、クリッピングだよん ==========
|
||
|
|
||
|
cmp BX,SI ; BX <= SI にする。
|
||
|
jle short @@L1 ;
|
||
|
xchg BX,SI ;
|
||
|
@@L1: ;
|
||
|
mov BP,ClipXL
|
||
|
mov DX,ClipXW
|
||
|
sub SI,BP ; SI < ClipXL なら、範囲外
|
||
|
jl short GRCG_BOXFILL_RETURN ;
|
||
|
sub BX,BP
|
||
|
cmp BX,8000h ; BX < 0 なら、 BX = 0
|
||
|
sbb CX,CX ;
|
||
|
and BX,CX ;
|
||
|
sub SI,DX ; SI >= ClipXW なら、 SI = ClipXW
|
||
|
sbb CX,CX ;
|
||
|
and SI,CX ;
|
||
|
add SI,DX ;
|
||
|
sub SI,BX ; BX > SI なら、範囲外
|
||
|
jl short GRCG_BOXFILL_RETURN ;
|
||
|
add BX,BP ;
|
||
|
|
||
|
cmp AX,DI ; y1 > y2 ならば、
|
||
|
jle short @@L2 ; y1 <-> y2
|
||
|
xchg AX,DI ;
|
||
|
@@L2: ;
|
||
|
mov DX,ClipYT
|
||
|
mov BP,ClipYH
|
||
|
sub DI,DX ; y2 < ClipYTならば範囲外
|
||
|
js short GRCG_BOXFILL_RETURN ;
|
||
|
sub AX,DX ; (y1-=ClipYT) < 0 ならば、
|
||
|
cmp AX,8000h ;
|
||
|
sbb CX,CX ; y1 = 0
|
||
|
and AX,CX ;
|
||
|
sub DI,BP ; y2 >= YMAX ならば、
|
||
|
sbb CX,CX ; y2 = YMAX
|
||
|
and DI,CX
|
||
|
add DI,BP
|
||
|
sub DI,AX ; y1 > y2ならば、
|
||
|
jl short GRCG_BOXFILL_RETURN ; 範囲外
|
||
|
|
||
|
; BX = x1(left)
|
||
|
; SI = abs(x2-x1)
|
||
|
; AX = y1(upper) - ClipYT
|
||
|
; DI = abs(y2-y1)
|
||
|
|
||
|
; 次に、データ作成って感じ。 =========
|
||
|
|
||
|
mov DX,AX ; ES = GramSeg + y1 * 5
|
||
|
shl AX,2 ;
|
||
|
add AX,DX ;
|
||
|
add AX,ClipYT_seg ;
|
||
|
mov ES,AX ;
|
||
|
|
||
|
mov DX,DI ; DI = (y2-y1) * 80
|
||
|
shl DI,2 ;
|
||
|
add DI,DX ;
|
||
|
shl DI,4 ;
|
||
|
mov DX,BX ; DI += xl / 16 * 2
|
||
|
shr DX,4 ;
|
||
|
shl DX,1 ;
|
||
|
add DI,DX ;
|
||
|
|
||
|
and BX,0Fh
|
||
|
add SI,BX
|
||
|
sub SI,10h
|
||
|
shl BX,1
|
||
|
mov DX,[EDGES+BX]
|
||
|
not DX ; DX = first word
|
||
|
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
|