mirror of https://github.com/nmlgc/ReC98.git
196 lines
3.0 KiB
NASM
196 lines
3.0 KiB
NASM
PAGE 98,120
|
|
; graphics - grcg - round - boxfill - PC98V
|
|
;
|
|
; DESCRIPTION:
|
|
; 角の丸い四角形塗りつぶし (level 2)
|
|
;
|
|
; FUNCTION:
|
|
; void far _pascal grcg_round_boxfill( int x1, int y1, int x2, int y2, unsigned r ) ;
|
|
|
|
; PARAMETERS:
|
|
; int x1,y1 左上角の座標
|
|
; int x2,y2 右下角の座標
|
|
; unsigned r 四隅の円の半径
|
|
;
|
|
; BINDING TARGET:
|
|
; Microsoft-C / Turbo-C
|
|
;
|
|
; RUNNING TARGET:
|
|
; NEC PC-9801 Normal mode
|
|
;
|
|
; REQUIRING RESOURCES:
|
|
; CPU: V30
|
|
; GRAPHICS ACCELARATOR: GRAPHIC CHARGER
|
|
;
|
|
; COMPILER/ASSEMBLER:
|
|
; TASM 3.0
|
|
; OPTASM 1.6
|
|
;
|
|
; NOTES:
|
|
; ・描画規則はgrcg_hline, grcg_boxfillに依存しています。
|
|
; ・色をつけるには、グラフィックチャージャーを利用してください。
|
|
; ・grc_setclip()によるクリッピングに対応しています。
|
|
;
|
|
; AUTHOR:
|
|
; 恋塚昭彦
|
|
;
|
|
; 関連関数:
|
|
; grc_setclip()
|
|
; grcg_hline(), grcg_boxfill()
|
|
;
|
|
; HISTORY:
|
|
; 93/ 3/ 1 Initial
|
|
|
|
MRETURN macro
|
|
pop DI
|
|
pop SI
|
|
leave
|
|
ret 10
|
|
endm
|
|
|
|
; 引数
|
|
x1 = (RETSIZE+5)*2
|
|
y1 = (RETSIZE+4)*2
|
|
x2 = (RETSIZE+3)*2
|
|
y2 = (RETSIZE+2)*2
|
|
|
|
retfunc GC_RBOXF_BOXFILL
|
|
push word ptr [BP+x1]
|
|
push word ptr [BP+y1]
|
|
push word ptr [BP+x2]
|
|
push word ptr [BP+y2]
|
|
call GRCG_BOXFILL
|
|
|
|
MRETURN
|
|
endfunc
|
|
|
|
func GRCG_ROUND_BOXFILL ; {
|
|
enter 2,0
|
|
push SI
|
|
push DI
|
|
; 変数
|
|
s = -2
|
|
@@r = (RETSIZE+1)*2
|
|
|
|
mov AX,[BP+@@r]
|
|
|
|
mov BX,[BP+x1]
|
|
mov SI,[BP+x2]
|
|
cmp BX,SI
|
|
jle short @@SKIP1
|
|
xchg BX,SI
|
|
mov [BP+x1],BX
|
|
mov [BP+x2],SI
|
|
@@SKIP1:
|
|
sub SI,BX
|
|
shr SI,1 ; SI = abs(x2 - x1) / 2
|
|
|
|
sub AX,SI ; AX = min(AX,SI)
|
|
sbb DX,DX
|
|
and AX,DX
|
|
add AX,SI
|
|
|
|
mov CX,[BP+y1]
|
|
mov DI,[BP+y2]
|
|
cmp CX,DI
|
|
jle short @@SKIP2
|
|
xchg CX,DI
|
|
@@SKIP2:
|
|
mov BX,DI ; BX = max(y1,y2)
|
|
sub DI,CX
|
|
shr DI,1 ; DI = abs(y2 - y1) / 2
|
|
|
|
sub AX,DI ; AX = min(AX,DI)
|
|
sbb DX,DX
|
|
and AX,DX
|
|
add AX,DI
|
|
jz short GC_RBOXF_BOXFILL ; 半径が 0 になったら長方形になる
|
|
mov [BP+s],AX
|
|
|
|
add CX,AX ; y1,y2を内側へずらす
|
|
sub BX,AX
|
|
mov [BP+y1],CX
|
|
mov [BP+y2],BX
|
|
|
|
mov SI,AX ; SI = wx
|
|
|
|
inc CX
|
|
dec BX
|
|
cmp BX,CX
|
|
jl short @@SKIP_BOXFILL
|
|
|
|
push word ptr [BP+x1]
|
|
push CX
|
|
push word ptr [BP+x2]
|
|
push BX
|
|
call GRCG_BOXFILL
|
|
@@SKIP_BOXFILL:
|
|
|
|
add [BP+x1],SI
|
|
sub [BP+x2],SI
|
|
mov DI,0 ; DI = wy
|
|
@@LOOP_8:
|
|
mov AX,[BP+x1]
|
|
sub AX,SI
|
|
push AX ; x1 - wx
|
|
mov AX,[BP+x2]
|
|
add AX,SI
|
|
push AX ; x2 + wx
|
|
mov AX,[BP+y1]
|
|
sub AX,DI ; y1 - wy
|
|
push AX
|
|
call GRCG_HLINE
|
|
|
|
mov AX,[BP+x1]
|
|
sub AX,SI
|
|
push AX ; x1 - wx
|
|
mov AX,[BP+x2]
|
|
add AX,SI
|
|
push AX ; x2 + wx
|
|
mov AX,[BP+y2]
|
|
add AX,DI ; y1 + wy
|
|
push AX
|
|
call GRCG_HLINE
|
|
|
|
mov AX,DI
|
|
stc
|
|
rcl AX,1 ; (wy << 1) + 1
|
|
sub [BP+s],AX
|
|
jns short @@LOOP_8E
|
|
|
|
mov AX,[BP+x1]
|
|
sub AX,DI
|
|
push AX ; x1 - wy
|
|
mov AX,[BP+x2]
|
|
add AX,DI
|
|
push AX ; x2 + wy
|
|
mov AX,[BP+y1]
|
|
sub AX,SI ; y1 - wx
|
|
push AX
|
|
call GRCG_HLINE
|
|
|
|
mov AX,[BP+x1]
|
|
sub AX,DI
|
|
push AX ; x1 - wy
|
|
mov AX,[BP+x2]
|
|
add AX,DI
|
|
push AX ; x2 + wy
|
|
mov AX,[BP+y2]
|
|
add AX,SI ; y1 + wx
|
|
push AX
|
|
call GRCG_HLINE
|
|
|
|
dec SI ; s += --wx << 1 ;
|
|
mov AX,SI
|
|
shl AX,1
|
|
add [BP+s],AX
|
|
|
|
@@LOOP_8E:
|
|
inc DI
|
|
cmp SI,DI
|
|
jae short @@LOOP_8
|
|
|
|
MRETURN
|
|
|
|
endfunc ; }
|