mirror of https://github.com/nmlgc/ReC98.git
[Reduction] #478: grcg_polygon_cx
This commit is contained in:
parent
9bb41bd72b
commit
0acdb448d1
|
@ -0,0 +1,304 @@
|
||||||
|
; gc_poly library - polygon - convex - nonclip
|
||||||
|
;
|
||||||
|
; Description:
|
||||||
|
; 凸多角形の描画 高速(機能削減)版
|
||||||
|
;
|
||||||
|
; Funciton/Procedures:
|
||||||
|
; void grcg_polygon_cx( const Point PTRPAT * pts, int npoint ) ;
|
||||||
|
;
|
||||||
|
; Parameters:
|
||||||
|
; Point * pts 座標リスト
|
||||||
|
; int npoint 座標数
|
||||||
|
;
|
||||||
|
; Binding Target:
|
||||||
|
; Microsoft-C / Turbo-C / Turbo Pascal
|
||||||
|
;
|
||||||
|
; Running Target:
|
||||||
|
; NEC PC-9801 Normal mode
|
||||||
|
;
|
||||||
|
; Requiring Resources:
|
||||||
|
; CPU: V30
|
||||||
|
; GRAPHICS ACCELARATOR: GRAPHIC CHARGER
|
||||||
|
;
|
||||||
|
; Notes:
|
||||||
|
; ・色指定は、グラフィックチャージャーを使用してください。
|
||||||
|
; ・クリッピングは一切行っていません。grc_clip_polygon_n()を利用して
|
||||||
|
; データのクリッピングを先に行ってから呼んで下さい。
|
||||||
|
; ・データが凸多角形になっていないと、正しく描画しません。
|
||||||
|
; ・npoint が 0 以下の場合、描画しません。
|
||||||
|
; ・npoint が 1〜2 の場合、grcg_lineを呼び出します。
|
||||||
|
;
|
||||||
|
; Compiler/Assembler:
|
||||||
|
; TASM 3.0
|
||||||
|
; OPTASM 1.6
|
||||||
|
;
|
||||||
|
; Author:
|
||||||
|
; 恋塚昭彦
|
||||||
|
;
|
||||||
|
; 関連関数:
|
||||||
|
; grc_clip_polygon_n()
|
||||||
|
;
|
||||||
|
; Revision History:
|
||||||
|
; 92/ 7/11 Initial
|
||||||
|
; 92/ 7/18 点が少ないときの処理
|
||||||
|
; 93/ 6/28 2点以下のとき、large modelでおかしかったかも
|
||||||
|
;
|
||||||
|
|
||||||
|
; make_linework - DDA LINE用構造体の作成
|
||||||
|
; IN:
|
||||||
|
; DS:BX : LINEWORK * w ; 書き込み先
|
||||||
|
; DX : int x1 ; 上点のx
|
||||||
|
; AX : int x2 ; 下の点のx
|
||||||
|
; CX : int y2 - y1 ; 上下のyの差
|
||||||
|
|
||||||
|
; draw_trapezoidx - 台形の描画 高速(機能削減)版
|
||||||
|
; IN:
|
||||||
|
; SI : unsigned yadr ; 描画する三角形の上のラインの左端のVRAMオフセット
|
||||||
|
; DX : unsigned ylen ; 描画する三角形の上下のライン差(y2-y1)
|
||||||
|
; ES : unsigned gseg ; 描画するVRAMのセグメント(ClipYT_seg)
|
||||||
|
; trapez_a ; 側辺a(必ず左)のxの初期値と傾き
|
||||||
|
; trapez_b ; 側辺b(必ず右)のxの初期値と傾き
|
||||||
|
|
||||||
|
IF datasize EQ 2
|
||||||
|
MOVPTS macro to, from
|
||||||
|
mov to,ES:from
|
||||||
|
endm
|
||||||
|
PUSHPTS macro from
|
||||||
|
push word ptr ES:from
|
||||||
|
endm
|
||||||
|
ESPTS macro
|
||||||
|
mov ES,[BP+@@pts+2]
|
||||||
|
endm
|
||||||
|
ESVRAM macro
|
||||||
|
mov ES,ClipYT_seg
|
||||||
|
endm
|
||||||
|
ELSE
|
||||||
|
MOVPTS macro to, from
|
||||||
|
mov to,from
|
||||||
|
endm
|
||||||
|
PUSHPTS macro from
|
||||||
|
push from
|
||||||
|
endm
|
||||||
|
ESPTS macro
|
||||||
|
endm
|
||||||
|
ESVRAM macro
|
||||||
|
endm
|
||||||
|
ENDIF
|
||||||
|
MRETURN macro
|
||||||
|
pop DI
|
||||||
|
pop SI
|
||||||
|
leave
|
||||||
|
ret (DATASIZE+1)*2
|
||||||
|
EVEN
|
||||||
|
endm
|
||||||
|
|
||||||
|
;---------------------------------
|
||||||
|
; void RETPAT pascal grcg_polygon_cx( const Point PTRPAT * pts, int npoint ) ;
|
||||||
|
func GRCG_POLYGON_CX
|
||||||
|
enter 12,0
|
||||||
|
push SI
|
||||||
|
push DI
|
||||||
|
|
||||||
|
; 引数
|
||||||
|
@@pts = (RETSIZE+2)*2
|
||||||
|
@@npoint = (RETSIZE+1)*2
|
||||||
|
|
||||||
|
; ローカル変数
|
||||||
|
@@nl = -10
|
||||||
|
@@nr = -12
|
||||||
|
@@ly = -4
|
||||||
|
@@ry = -2
|
||||||
|
@@ty = -6
|
||||||
|
@@by = -8
|
||||||
|
|
||||||
|
if datasize eq 1
|
||||||
|
mov ES,ClipYT_seg
|
||||||
|
mov DI,[BP+@@pts]
|
||||||
|
else
|
||||||
|
les DI,[BP+@@pts]
|
||||||
|
endif
|
||||||
|
|
||||||
|
; 頂点を探す〜
|
||||||
|
mov SI,[BP+@@npoint] ; SI=npoint-1
|
||||||
|
dec SI
|
||||||
|
js short @@RETURN
|
||||||
|
mov [BP+@@nr],SI
|
||||||
|
mov DX,SI ; DX:nl
|
||||||
|
mov AX,SI
|
||||||
|
shl AX,2
|
||||||
|
add DI,AX
|
||||||
|
MOVPTS BX,[DI+2] ; BX:ty
|
||||||
|
mov CX,BX ; CX:by
|
||||||
|
dec SI
|
||||||
|
jg short @@LOOP1 ; ...LOOP1E
|
||||||
|
|
||||||
|
; 1〜2点なら直線
|
||||||
|
PUSHPTS [DI] ; pts[npoint-1].x
|
||||||
|
push BX ; pts[npoint-1].y
|
||||||
|
mov DI,[BP+@@pts]
|
||||||
|
PUSHPTS [DI] ; pts[0].x
|
||||||
|
PUSHPTS [DI+2] ; pts[0].y
|
||||||
|
call GRCG_LINE
|
||||||
|
@@RETURN:
|
||||||
|
MRETURN
|
||||||
|
|
||||||
|
@@LOOP1:
|
||||||
|
sub DI,4
|
||||||
|
MOVPTS AX,[DI+2]
|
||||||
|
cmp AX,BX ; ty
|
||||||
|
je short @@L1_010
|
||||||
|
jg short @@L1_020
|
||||||
|
mov [BP+@@nr],SI
|
||||||
|
mov DX,SI ; nl
|
||||||
|
mov BX,AX ; ty
|
||||||
|
jmp short @@L1_030
|
||||||
|
@@L1_010:
|
||||||
|
mov DX,SI ; nl
|
||||||
|
jmp short @@L1_030
|
||||||
|
@@L1_020:
|
||||||
|
cmp CX,AX ; by
|
||||||
|
jge short @@L1_030
|
||||||
|
mov CX,AX ; by
|
||||||
|
@@L1_030:
|
||||||
|
dec SI
|
||||||
|
jns short @@LOOP1
|
||||||
|
@@LOOP1E:
|
||||||
|
or DX,DX ; nl
|
||||||
|
jne short @@L1_100
|
||||||
|
mov AX,[BP+@@npoint]
|
||||||
|
dec AX
|
||||||
|
cmp AX,[BP+@@nr]
|
||||||
|
jne short @@L1_100
|
||||||
|
mov DX,AX
|
||||||
|
mov WORD PTR [BP+@@nr],0
|
||||||
|
@@L1_100:
|
||||||
|
mov [BP+@@by],CX
|
||||||
|
mov DI,[BP+@@pts]
|
||||||
|
; 最初の左側辺データを作成
|
||||||
|
mov BX,DX ; BX=nl
|
||||||
|
dec BX
|
||||||
|
jge short @@L2_010
|
||||||
|
mov BX,[BP+@@npoint]
|
||||||
|
dec BX
|
||||||
|
@@L2_010:
|
||||||
|
mov [BP+@@nl],BX
|
||||||
|
shl BX,2
|
||||||
|
add BX,DI
|
||||||
|
mov SI,DX
|
||||||
|
shl SI,2
|
||||||
|
add SI,DI
|
||||||
|
MOVPTS CX,[BX+2]
|
||||||
|
mov [BP+@@ly],CX
|
||||||
|
MOVPTS AX,[SI+2]
|
||||||
|
mov [BP+@@ty],AX
|
||||||
|
MOVPTS DX,[SI]
|
||||||
|
sub CX,AX
|
||||||
|
MOVPTS AX,[BX]
|
||||||
|
mov BX,offset trapez_a
|
||||||
|
call make_linework
|
||||||
|
|
||||||
|
; 最初の右側辺データを作成
|
||||||
|
mov SI,[BP+@@nr]
|
||||||
|
mov DX,SI ; DX
|
||||||
|
inc SI
|
||||||
|
cmp SI,[BP+@@npoint]
|
||||||
|
jl short @@L3_010
|
||||||
|
xor SI,SI
|
||||||
|
@@L3_010:
|
||||||
|
mov BX,SI
|
||||||
|
mov [BP+@@nr],SI
|
||||||
|
shl BX,2
|
||||||
|
MOVPTS AX,[BX+DI+2]
|
||||||
|
mov [BP+@@ry],AX
|
||||||
|
mov CX,BX
|
||||||
|
mov BX,DX
|
||||||
|
shl BX,2
|
||||||
|
MOVPTS DX,[BX+DI]
|
||||||
|
mov BX,CX
|
||||||
|
|
||||||
|
; 実際に描画していくんだ[よーん]
|
||||||
|
@@L4_010:
|
||||||
|
sub AX,[BP+@@ty]
|
||||||
|
mov CX,AX
|
||||||
|
MOVPTS AX,[BX+DI]
|
||||||
|
mov BX,offset trapez_b
|
||||||
|
call make_linework
|
||||||
|
mov [BP+@@nr],SI
|
||||||
|
@@LOOP4:
|
||||||
|
mov SI,[BP+@@ly]
|
||||||
|
cmp SI,[BP+@@ry]
|
||||||
|
jle short @@L4_020
|
||||||
|
mov SI,[BP+@@ry]
|
||||||
|
@@L4_020:
|
||||||
|
cmp [BP+@@by],SI
|
||||||
|
jle short @@LAST_ZOID
|
||||||
|
push SI
|
||||||
|
push DI
|
||||||
|
lea DX,[SI-1]
|
||||||
|
xchg SI,[BP+@@ty]
|
||||||
|
sub DX,SI
|
||||||
|
sub SI,ClipYT
|
||||||
|
imul SI,SI,80
|
||||||
|
ESVRAM
|
||||||
|
call draw_trapezoidx ; 一番下でない台形
|
||||||
|
ESPTS
|
||||||
|
pop DI
|
||||||
|
pop SI
|
||||||
|
|
||||||
|
cmp SI,[BP+@@ly]
|
||||||
|
jne short @@L4_040
|
||||||
|
|
||||||
|
; 左側の側辺
|
||||||
|
mov CX,[BP+@@nl]
|
||||||
|
mov BX,CX
|
||||||
|
shl BX,2
|
||||||
|
MOVPTS DX,[BX+DI] ; DX!
|
||||||
|
dec CX
|
||||||
|
jns short @@L4_030
|
||||||
|
mov CX,[BP+@@npoint]
|
||||||
|
mov BX,CX
|
||||||
|
shl BX,2
|
||||||
|
dec CX
|
||||||
|
@@L4_030:
|
||||||
|
mov [BP+@@nl],CX
|
||||||
|
sub BX,4
|
||||||
|
add BX,DI
|
||||||
|
MOVPTS CX,[BX+2]
|
||||||
|
mov [BP+@@ly],CX
|
||||||
|
sub CX,[BP+@@ty]
|
||||||
|
MOVPTS AX,[BX]
|
||||||
|
mov BX,OFFSET trapez_a
|
||||||
|
call make_linework
|
||||||
|
|
||||||
|
@@L4_040:
|
||||||
|
mov AX,[BP+@@ry]
|
||||||
|
cmp [BP+@@ty],AX
|
||||||
|
jne short @@LOOP4
|
||||||
|
|
||||||
|
; 右側の側辺
|
||||||
|
mov SI,[BP+@@nr]
|
||||||
|
mov BX,SI
|
||||||
|
shl BX,2
|
||||||
|
MOVPTS DX,[BX+DI] ; DX!
|
||||||
|
inc SI
|
||||||
|
cmp SI,[BP+@@npoint]
|
||||||
|
jl short @@L4_050
|
||||||
|
xor SI,SI
|
||||||
|
@@L4_050:
|
||||||
|
mov BX,SI
|
||||||
|
shl BX,2
|
||||||
|
MOVPTS AX,[BX+DI+2]
|
||||||
|
mov [BP+@@ry],AX
|
||||||
|
jmp @@L4_010
|
||||||
|
|
||||||
|
@@LAST_ZOID:
|
||||||
|
; 一番下の台形
|
||||||
|
ESVRAM
|
||||||
|
mov SI,[BP+@@ty]
|
||||||
|
mov DX,[BP+@@by]
|
||||||
|
sub DX,SI
|
||||||
|
sub SI,ClipYT
|
||||||
|
imul SI,SI,80
|
||||||
|
call draw_trapezoidx
|
||||||
|
MRETURN
|
||||||
|
endfunc
|
215
th05_main.asm
215
th05_main.asm
|
@ -66,218 +66,7 @@ include libs/master.lib/grc_setclip.asm
|
||||||
include libs/master.lib/grc_clip_polygon_n.asm
|
include libs/master.lib/grc_clip_polygon_n.asm
|
||||||
include libs/master.lib/grcg_hline.asm
|
include libs/master.lib/grcg_hline.asm
|
||||||
include libs/master.lib/grcg_line.asm
|
include libs/master.lib/grcg_line.asm
|
||||||
|
include libs/master.lib/grcg_polygon_cx.asm
|
||||||
; =============== S U B R O U T I N E =======================================
|
|
||||||
|
|
||||||
; Attributes: bp-based frame
|
|
||||||
|
|
||||||
sub_18B4 proc far
|
|
||||||
|
|
||||||
var_C = word ptr -0Ch
|
|
||||||
var_A = word ptr -0Ah
|
|
||||||
var_8 = word ptr -8
|
|
||||||
var_6 = word ptr -6
|
|
||||||
var_4 = word ptr -4
|
|
||||||
var_2 = word ptr -2
|
|
||||||
arg_0 = word ptr 6
|
|
||||||
arg_2 = dword ptr 8
|
|
||||||
|
|
||||||
enter 0Ch, 0
|
|
||||||
push si
|
|
||||||
push di
|
|
||||||
les di, [bp+arg_2]
|
|
||||||
mov si, [bp+arg_0]
|
|
||||||
dec si
|
|
||||||
js short loc_18EA
|
|
||||||
mov [bp+var_C], si
|
|
||||||
mov dx, si
|
|
||||||
mov ax, si
|
|
||||||
shl ax, 2
|
|
||||||
add di, ax
|
|
||||||
mov bx, es:[di+2]
|
|
||||||
mov cx, bx
|
|
||||||
dec si
|
|
||||||
jg short loc_18F0
|
|
||||||
push word ptr es:[di]
|
|
||||||
push bx
|
|
||||||
mov di, word ptr [bp+arg_2]
|
|
||||||
push word ptr es:[di]
|
|
||||||
push word ptr es:[di+2]
|
|
||||||
call grcg_line
|
|
||||||
|
|
||||||
loc_18EA:
|
|
||||||
pop di
|
|
||||||
pop si
|
|
||||||
leave
|
|
||||||
retf 6
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_18F0:
|
|
||||||
sub di, 4
|
|
||||||
mov ax, es:[di+2]
|
|
||||||
cmp ax, bx
|
|
||||||
jz short loc_1906
|
|
||||||
jg short loc_190A
|
|
||||||
mov [bp+var_C], si
|
|
||||||
mov dx, si
|
|
||||||
mov bx, ax
|
|
||||||
jmp short loc_1910
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_1906:
|
|
||||||
mov dx, si
|
|
||||||
jmp short loc_1910
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_190A:
|
|
||||||
cmp cx, ax
|
|
||||||
jge short loc_1910
|
|
||||||
mov cx, ax
|
|
||||||
|
|
||||||
loc_1910:
|
|
||||||
dec si
|
|
||||||
jns short loc_18F0
|
|
||||||
or dx, dx
|
|
||||||
jnz short loc_1927
|
|
||||||
mov ax, [bp+arg_0]
|
|
||||||
dec ax
|
|
||||||
cmp ax, [bp+var_C]
|
|
||||||
jnz short loc_1927
|
|
||||||
mov dx, ax
|
|
||||||
mov [bp+var_C], 0
|
|
||||||
|
|
||||||
loc_1927:
|
|
||||||
mov [bp+var_8], cx
|
|
||||||
mov di, word ptr [bp+arg_2]
|
|
||||||
mov bx, dx
|
|
||||||
dec bx
|
|
||||||
jge short loc_1936
|
|
||||||
mov bx, [bp+arg_0]
|
|
||||||
dec bx
|
|
||||||
|
|
||||||
loc_1936:
|
|
||||||
mov [bp+var_A], bx
|
|
||||||
shl bx, 2
|
|
||||||
add bx, di
|
|
||||||
mov si, dx
|
|
||||||
shl si, 2
|
|
||||||
add si, di
|
|
||||||
mov cx, es:[bx+2]
|
|
||||||
mov [bp+var_4], cx
|
|
||||||
mov ax, es:[si+2]
|
|
||||||
mov [bp+var_6], ax
|
|
||||||
mov dx, es:[si]
|
|
||||||
sub cx, ax
|
|
||||||
mov ax, es:[bx]
|
|
||||||
mov bx, 2630h
|
|
||||||
call make_linework
|
|
||||||
mov si, [bp+var_C]
|
|
||||||
mov dx, si
|
|
||||||
inc si
|
|
||||||
cmp si, [bp+arg_0]
|
|
||||||
jl short loc_196E
|
|
||||||
xor si, si
|
|
||||||
|
|
||||||
loc_196E:
|
|
||||||
mov bx, si
|
|
||||||
mov [bp+var_C], si
|
|
||||||
shl bx, 2
|
|
||||||
mov ax, es:[bx+di+2]
|
|
||||||
mov [bp+var_2], ax
|
|
||||||
mov cx, bx
|
|
||||||
mov bx, dx
|
|
||||||
shl bx, 2
|
|
||||||
mov dx, es:[bx+di]
|
|
||||||
mov bx, cx
|
|
||||||
|
|
||||||
loc_1989:
|
|
||||||
sub ax, [bp+var_6]
|
|
||||||
mov cx, ax
|
|
||||||
mov ax, es:[bx+di]
|
|
||||||
mov bx, 2638h
|
|
||||||
call make_linework
|
|
||||||
mov [bp+var_C], si
|
|
||||||
|
|
||||||
loc_199A:
|
|
||||||
mov si, [bp+var_4]
|
|
||||||
cmp si, [bp+var_2]
|
|
||||||
jle short loc_19A5
|
|
||||||
mov si, [bp+var_2]
|
|
||||||
|
|
||||||
loc_19A5:
|
|
||||||
cmp [bp+var_8], si
|
|
||||||
jle short loc_1A28
|
|
||||||
push si
|
|
||||||
push di
|
|
||||||
lea dx, [si-1]
|
|
||||||
xchg si, [bp+var_6]
|
|
||||||
sub dx, si
|
|
||||||
sub si, ClipYT
|
|
||||||
imul si, 50h
|
|
||||||
mov es, ClipYT_seg
|
|
||||||
call draw_trapezoidx
|
|
||||||
mov es, word ptr [bp+arg_2+2]
|
|
||||||
pop di
|
|
||||||
pop si
|
|
||||||
cmp si, [bp+var_4]
|
|
||||||
jnz short loc_19FE
|
|
||||||
mov cx, [bp+var_A]
|
|
||||||
mov bx, cx
|
|
||||||
shl bx, 2
|
|
||||||
mov dx, es:[bx+di]
|
|
||||||
dec cx
|
|
||||||
jns short loc_19E3
|
|
||||||
mov cx, [bp+arg_0]
|
|
||||||
mov bx, cx
|
|
||||||
shl bx, 2
|
|
||||||
dec cx
|
|
||||||
|
|
||||||
loc_19E3:
|
|
||||||
mov [bp+var_A], cx
|
|
||||||
sub bx, 4
|
|
||||||
add bx, di
|
|
||||||
mov cx, es:[bx+2]
|
|
||||||
mov [bp+var_4], cx
|
|
||||||
sub cx, [bp+var_6]
|
|
||||||
mov ax, es:[bx]
|
|
||||||
mov bx, 2630h
|
|
||||||
call make_linework
|
|
||||||
|
|
||||||
loc_19FE:
|
|
||||||
mov ax, [bp+var_2]
|
|
||||||
cmp [bp+var_6], ax
|
|
||||||
jnz short loc_199A
|
|
||||||
mov si, [bp+var_C]
|
|
||||||
mov bx, si
|
|
||||||
shl bx, 2
|
|
||||||
mov dx, es:[bx+di]
|
|
||||||
inc si
|
|
||||||
cmp si, [bp+arg_0]
|
|
||||||
jl short loc_1A19
|
|
||||||
xor si, si
|
|
||||||
|
|
||||||
loc_1A19:
|
|
||||||
mov bx, si
|
|
||||||
shl bx, 2
|
|
||||||
mov ax, es:[bx+di+2]
|
|
||||||
mov [bp+var_2], ax
|
|
||||||
jmp loc_1989
|
|
||||||
; ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
loc_1A28:
|
|
||||||
mov es, ClipYT_seg
|
|
||||||
mov si, [bp+var_6]
|
|
||||||
mov dx, [bp+var_8]
|
|
||||||
sub dx, si
|
|
||||||
sub si, ClipYT
|
|
||||||
imul si, 50h
|
|
||||||
call draw_trapezoidx
|
|
||||||
pop di
|
|
||||||
pop si
|
|
||||||
leave
|
|
||||||
retf 6
|
|
||||||
sub_18B4 endp
|
|
||||||
|
|
||||||
include libs/master.lib/grcg_pset.asm
|
include libs/master.lib/grcg_pset.asm
|
||||||
include libs/master.lib/grcg_setcolor.asm
|
include libs/master.lib/grcg_setcolor.asm
|
||||||
include libs/master.lib/grcg_vline.asm
|
include libs/master.lib/grcg_vline.asm
|
||||||
|
@ -9466,7 +9255,7 @@ loc_EA61:
|
||||||
push ss
|
push ss
|
||||||
push di
|
push di
|
||||||
push ax
|
push ax
|
||||||
call sub_18B4
|
call grcg_polygon_cx
|
||||||
xor ax, ax
|
xor ax, ax
|
||||||
jmp short loc_EA70
|
jmp short loc_EA70
|
||||||
; ---------------------------------------------------------------------------
|
; ---------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue