[Reduction] #423: grcg_polygon_c

This commit is contained in:
nmlgc 2014-09-01 06:52:28 +02:00
parent b2c9ba67bc
commit 5b91dd3b42
5 changed files with 401 additions and 1086 deletions

View File

@ -0,0 +1,393 @@
PAGE 98,120
; grcg - polygon - convex - Point
;
; DESCRIPTION:
; 凸多角形描画(青プレーンのみ)
;
; FUNCTION:
; void far _pascal grcg_polygon_c( Point far pts[], int npoint ) ;
;
; PARAMETERS:
; Point pts[] 座標リスト
; int npoint 座標数( 2〜 )
;
; Binding Target:
; Microsoft-C / Turbo-C / Turbo Pascal
;
; Running Target:
; NEC PC-9801 Normal mode
;
; REQUIRING RESOURCES:
; CPU: V30
; GRAPHICS ACCELARATOR: GRAPHIC CHARGER
; ・上記は、すべて draw_trapezoid に依ります。
;
; NOTES:
; ・色指定は、グラフィックチャージャーを使用してください。
; ・クリッピング枠によって描画を制限できます。( grc_setclip()参照 )
; ・左右の境界クリップは、台形描画ルーチンに依存しています。
; ・データが下記の条件に当てはまる場合、正しく描画しません。
; ○同じy座標を経由する辺が2つを超える場所がある場合。
; →条件により、ゼロ除算が発生したり、おかしな図形になります。
; (凸多角形でなくても、上記以外なら正しく描画します)
;
; COMPILER/ASSEMBLER:
; TASM 3.0
; OPTASM 1.6
;
; 関連関数:
; grc_setclip()
; make_linework
; draw_trapezoid
;
; AUTHOR:
; 恋塚昭彦
;
; HISTORY:
; 92/5/18 Initial(C版)
; 92/5/19 bugfix
; 92/5/20 とりあえず、左右と下端のクリップをやった。
; 92/5/21 左右の先判定と、上もクリップしたぞ。(あーのんびり。)
; 92/6/4 Initial(asm版 gc_4corn.asm)
; 92/6/5 gc_polyg.asm
; 92/6/6 ClipYT_seg対応
; 92/6/16 TASM対応
; 92/6/19 gc_polgc.asm
; 92/6/21 Pascal対応
IF datasize EQ 2
MOVPTS macro to, from
mov to,ES:from
endm
CMPPTS macro pts, dat
cmp ES:pts,dat
endm
SUBPTS macro reg,pts
sub reg,ES:pts
endm
LODPTS macro reg
les reg,[BP+@@pts]
endm
ELSE
MOVPTS macro to, from
mov to,from
endm
CMPPTS macro pts, dat
cmp pts,dat
endm
SUBPTS macro reg,pts
sub reg,pts
endm
LODPTS macro reg
mov reg,[BP+@@pts]
endm
ENDIF
MRETURN macro
pop SI
pop DI
leave
ret (datasize+1)*2
EVEN
endm
; void _pascal grcg_polygon_c( Point pts[], int npoint ) ;
;
func GRCG_POLYGON_C
push BP
mov BP,SP
sub SP,12 ; ローカル変数のサイズ
push DI
push SI
; パラメータ
@@pts = (RETSIZE+2)*2
@@npoint = (RETSIZE+1)*2
; ローカル変数
@@ry = -2 ; 左のy
@@ty = -4 ; 上端のy
@@ly = -6 ; 右のy
@@nl = -8 ; 左の点の添え字(byte単位)
@@nr = -10 ; 右の点の添え字(byte単位)
@@by = -12 ; 下端のy
mov AX,[BP+@@npoint]
dec AX
mov CX,AX ; CX = 本来の npoint
shl AX,2
mov [BP+@@npoint],AX ; npoint = (npoint-1)*4
; 頂上を探す〜 ----------------
LODPTS SI ; SI = pts
xor AX,AX
mov [BP+@@nl],AX ; nl = 0
mov [BP+@@nr],AX ; nr = 0
MOVPTS AX,[SI+2]
mov [BP+@@ty],AX ; ty = pts[0].y
mov [BP+@@by],AX ; by = pts[0].y
MOVPTS AX,[SI] ; AX = pts[0].x (AX=lx)
mov DI,AX ; DI = pts[0].x (DI=rx)
mov BX,4 ; BX = 1*4
@@LOOP1: ; x,y の各最大値と最小値を得るループ
MOVPTS DX,[BX+SI+2] ; pts[i].y
cmp DX,[BP+@@ty]
jge short @@S10
mov [BP+@@nl],BX ; nlは、頂上の最初にみつけた点
mov [BP+@@nr],BX ; nrは、頂上の最後に見つけた点
mov [BP+@@ty],DX
jmp short @@S30
EVEN
@@S10:
cmp [BP+@@ty],DX
jne short @@S20
mov [BP+@@nr],BX
jmp short @@S30
EVEN
@@S20:
cmp [BP+@@by],DX
jge short @@S30
mov [BP+@@by],DX
@@S30:
MOVPTS DX,[BX+SI] ; pts[].x
cmp AX,DX
jl short @@S40
mov AX,DX
jmp short @@S50
EVEN
; へんなところに潜ってるが、クリップの近場にreturn処理が
; いるのだ〜
@@RETURN1:
MRETURN
EVEN
@@S40: ; else
cmp DI,DX
jge short @@S50
mov DI,DX
@@S50:
add BX,4
loop short @@LOOP1
; ループ終り ----------------
; 範囲検査
cmp ClipXR,AX
jl short @@RETURN1 ; 完全に右に外れてる
cmp ClipXL,DI
jg short @@RETURN1 ; 完全に左に外れてる
mov AX,[BP+@@ty]
cmp ClipYB,AX
jl short @@RETURN1 ; 完全に下に外れてる
mov DX,[BP+@@by]
cmp ClipYT,DX
jg short @@RETURN1 ; 完全に上に外れてる
; **** さあ、ここに来たからには、かならず描画できるんだぞ。 ****
; (台形による最後のクリップを宛てにしてるから)
; 描画セグメント設定
IF datasize NE 2
mov ES,ClipYT_seg
ENDIF
; 下のy座標を先にクリップ枠で切断する
mov AX,ClipYB
cmp AX,DX
jge short @@S100
mov DX,AX
@@S100:
mov [BP+@@by],DX
; nlが最初、nr最後ならば、入れ換え。わかりにくい〜
; 凸多角形ならば、ある点の他に同じy座標の点はつ以下にしか
; ならない。従って、頂上を共有する点は2つ以内なので、座標列の
; 端をまたがるのはこのパターンのみとなる)
mov AX,[BP+@@npoint]
cmp WORD PTR [BP+@@nl],0
jne short @@S110
cmp [BP+@@nr],AX
jne short @@S110
mov [BP+@@nl],AX
mov WORD PTR [BP+@@nr],0
@@S110:
; 左側辺の、上にはみ出ている部分を飛ばし ***
mov BX,[BP+@@nl] ; BX = nl
mov DX,[BP+@@npoint]
mov AX,ClipYT
@@LOOPL:
mov CX,BX
sub BX,4
jns short @@SKIPL
mov BX,DX
@@SKIPL:
CMPPTS [BX+SI+2],AX
jl short @@LOOPL
MOVPTS AX,[BX+SI+2]
mov [BP+@@ly],AX ; ly = pts[nl].y
mov [BP+@@nl],BX
; 最初の左側辺データを作成
mov BX,CX ; BX = i
MOVPTS DX,[SI+BX+2] ; DX = ty = pts[i].y
MOVPTS DI,[SI+BX] ; DI = wx = pts[i].x
mov BX,[BP+@@nl]
cmp DX,ClipYT
jge short @@S200
mov AX,DX
sub AX,[BP+@@ly] ; push (ty-ly)
PUSH AX
mov AX,DI ; AX = ((DI=wx) - pts[nl].x)
SUBPTS AX,[SI+BX]
mov CX,ClipYT
sub CX,DX ; CX = (ClipYT - (DX=ty))
imul CX
POP CX
idiv CX ; DI = (wx-pts[nl].x) * (ClipYT-ty)
add DI,AX ; / (ty-ly) + wx
mov DX,ClipYT ; ty = ClipYT
@@S200:
mov [BP+@@ty],DX
xchg DI,DX
MOVPTS AX,[SI+BX] ; pts[nl].x
mov CX,[BP+@@ly]
sub CX,DI ; CX = (ly-ty)
mov BX,offset trapez_a
call make_linework
; 右側辺の、上にはみ出ている部分を飛ばし ***
mov BX,[BP+@@nr] ; BX = nr
mov CX,[BP+@@npoint]
mov AX,ClipYT
@@LOOPR:
mov DI,BX ; DI = i
add BX,4 ; BX = nr
cmp BX,CX
jle short @@SKIPR
xor BX,BX
@@SKIPR:
CMPPTS [SI+BX+2],AX
jl short @@LOOPR
MOVPTS AX,[SI+BX+2]
mov [BP+@@ry],AX
mov [BP+@@nr],BX
; 最初の右側辺データを作成
add DI,SI
MOVPTS CX,[DI+2] ; CX = pts[i].y
MOVPTS DI,[DI] ; DI = wx = pts[i].x
MOVPTS BX,[SI+BX] ; BX = pts[nr].x
cmp CX,[BP+@@ty]
jge short @@S300
mov AX,ClipYT ; (ClipYT - pts[i].y)
sub AX,CX
push CX
mov CX,DI ; (wx - pts[nr].x)
sub CX,BX
imul CX
pop CX
sub CX,[BP+@@ry] ; (pts[i].y - ry)
idiv CX
add DI,AX ; + wx
@@S300:
mov DX,DI
mov AX,BX ; pts[nr].x
mov CX,[BP+@@ry]
sub CX,[BP+@@ty]
mov BX,offset trapez_b
call make_linework
; 実際に描画していくんだ[よーん] ========================
mov SI,[BP+@@ty] ; SI = ty
@@DRAWLOOP:
mov DI,[BP+@@ly] ; DI = y2
cmp DI,[BP+@@ry]
jle short @@S400
mov DI,[BP+@@ry]
@@S400:
cmp [BP+@@by],DI ; 下クリップ
jle short @@S500
PUSH DI
lea DX,[DI-1]
sub DX,SI ; DX = y2-1 - ty
sub SI,ClipYT
mov AX,SI ; SI = ty*80
shl SI,2
add SI,AX
shl SI,4
IF datasize EQ 2
mov ES,ClipYT_seg
ENDIF
call draw_trapezoid ; **** DRAW ****
POP SI
LODPTS DI ; DI = pts
cmp SI,[BP+@@ly] ; if ( ty == ly )
jne short @@S410
mov BX,[BP+@@nl]
MOVPTS DX,[BX+DI] ; DX = pts[nl].x
sub BX,4
jns short @@S405
mov BX,[BP+@@npoint]
@@S405:
mov [BP+@@nl],BX
MOVPTS AX,[DI+BX] ; AX = pts[nl].x
MOVPTS CX,[DI+BX+2] ; CX = (ly = pts[nl].y) - ty
mov [BP+@@ly],CX
sub CX,SI
mov BX,offset trapez_a
; DX = last pts[nl].x
call make_linework
@@S410: ; if ( ty == ry )
cmp [BP+@@ry],SI
jne short @@DRAWLOOP
mov BX,[BP+@@nr] ; BX = nr
MOVPTS DX,[BX+DI]
add BX,4
cmp BX,[BP+@@npoint]
jle short @@S420
xor BX,BX
@@S420:
mov [BP+@@nr],BX
MOVPTS AX,[DI+BX] ; AX = pts[nr].x
MOVPTS CX,[DI+BX+2] ; CX = pts[nr].y
mov [BP+@@ry],CX ; ry = CX
sub CX,SI ; CX -= SI
mov BX,offset trapez_b
push offset @@DRAWLOOP
jmp make_linework ; まさか!!
EVEN
; 一番下の台形
@@S500:
IF datasize EQ 2
mov ES,ClipYT_seg
ENDIF
mov DX,[BP+@@by]
sub DX,SI ; DX = by - ty
sub SI,ClipYT
mov AX,SI ; SI = ty*80
shl SI,2
add SI,AX
shl SI,4
call draw_trapezoid
MRETURN
endfunc

View File

@ -57,276 +57,7 @@ include libs/master.lib/grcg_boxfill.asm
include libs/master.lib/grc_setclip.asm
include libs/master.lib/grcg_fill.asm
include libs/master.lib/grcg_hline.asm
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_C7C 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
push bp
mov bp, sp
sub sp, 0Ch
push di
push si
mov ax, [bp+arg_0]
dec ax
mov cx, ax
shl ax, 2
mov [bp+arg_0], ax
les si, [bp+arg_2]
xor ax, ax
mov [bp+var_8], ax
mov [bp+var_A], ax
mov ax, es:[si+2]
mov [bp+var_4], ax
mov [bp+var_C], ax
mov ax, es:[si]
mov di, ax
mov bx, 4
loc_CAD:
mov dx, es:[bx+si+2]
cmp dx, [bp+var_4]
jge short loc_CC2
mov [bp+var_8], bx
mov [bp+var_A], bx
mov [bp+var_4], dx
jmp short loc_CD4
; ---------------------------------------------------------------------------
nop
loc_CC2:
cmp [bp+var_4], dx
jnz short loc_CCC
mov [bp+var_A], bx
jmp short loc_CD4
; ---------------------------------------------------------------------------
loc_CCC:
cmp [bp+var_C], dx
jge short loc_CD4
mov [bp+var_C], dx
loc_CD4:
mov dx, es:[bx+si]
cmp ax, dx
jl short loc_CE6
mov ax, dx
jmp short loc_CEC
; ---------------------------------------------------------------------------
nop
loc_CE0:
pop si
pop di
leave
retf 6
; ---------------------------------------------------------------------------
loc_CE6:
cmp di, dx
jge short loc_CEC
mov di, dx
loc_CEC:
add bx, 4
loop loc_CAD
cmp ClipXR, ax
jl short loc_CE0
cmp ClipXL, di
jg short loc_CE0
mov ax, [bp+var_4]
cmp ClipYB, ax
jl short loc_CE0
mov dx, [bp+var_C]
cmp ClipYT, dx
jg short loc_CE0
mov ax, ClipYB
cmp ax, dx
jge short loc_D18
mov dx, ax
loc_D18:
mov [bp+var_C], dx
mov ax, [bp+arg_0]
cmp [bp+var_8], 0
jnz short loc_D31
cmp [bp+var_A], ax
jnz short loc_D31
mov [bp+var_8], ax
mov [bp+var_A], 0
loc_D31:
mov bx, [bp+var_8]
mov dx, [bp+arg_0]
mov ax, ClipYT
loc_D3A:
mov cx, bx
sub bx, 4
jns short loc_D43
mov bx, dx
loc_D43:
cmp es:[bx+si+2], ax
jl short loc_D3A
mov ax, es:[bx+si+2]
mov [bp+var_6], ax
mov [bp+var_8], bx
mov bx, cx
mov dx, es:[bx+si+2]
mov di, es:[bx+si]
mov bx, [bp+var_8]
cmp dx, ClipYT
jge short loc_D81
mov ax, dx
sub ax, [bp+var_6]
push ax
mov ax, di
sub ax, es:[bx+si]
mov cx, ClipYT
sub cx, dx
imul cx
pop cx
idiv cx
add di, ax
mov dx, ClipYT
loc_D81:
mov [bp+var_4], dx
xchg di, dx
mov ax, es:[bx+si]
mov cx, [bp+var_6]
sub cx, di
mov bx, 12D4h
call make_linework
mov bx, [bp+var_A]
mov cx, [bp+arg_0]
mov ax, ClipYT
loc_D9D:
mov di, bx
add bx, 4
cmp bx, cx
jle short loc_DA8
xor bx, bx
loc_DA8:
cmp es:[bx+si+2], ax
jl short loc_D9D
mov ax, es:[bx+si+2]
mov [bp+var_2], ax
mov [bp+var_A], bx
add di, si
mov cx, es:[di+2]
mov di, es:[di]
mov bx, es:[bx+si]
cmp cx, [bp+var_4]
jge short loc_DDD
mov ax, ClipYT
sub ax, cx
push cx
mov cx, di
sub cx, bx
imul cx
pop cx
sub cx, [bp+var_2]
idiv cx
add di, ax
loc_DDD:
mov dx, di
mov ax, bx
mov cx, [bp+var_2]
sub cx, [bp+var_4]
mov bx, 12DCh
call make_linework
mov si, [bp+var_4]
loc_DF0:
mov di, [bp+var_6]
cmp di, [bp+var_2]
jle short loc_DFB
mov di, [bp+var_2]
loc_DFB:
cmp [bp+var_C], di
jle short loc_E74
push di
lea dx, [di-1]
sub dx, si
sub si, ClipYT
mov ax, si
shl si, 2
add si, ax
shl si, 4
mov es, ClipYT_seg
call draw_trapezoid
pop si
les di, [bp+arg_2]
cmp si, [bp+var_6]
jnz short loc_E47
mov bx, [bp+var_8]
mov dx, es:[bx+di]
sub bx, 4
jns short loc_E32
mov bx, [bp+arg_0]
loc_E32:
mov [bp+var_8], bx
mov ax, es:[bx+di]
mov cx, es:[bx+di+2]
mov [bp+var_6], cx
sub cx, si
mov bx, 12D4h
call make_linework
loc_E47:
cmp [bp+var_2], si
jnz short loc_DF0
mov bx, [bp+var_A]
mov dx, es:[bx+di]
add bx, 4
cmp bx, [bp+arg_0]
jle short loc_E5C
xor bx, bx
loc_E5C:
mov [bp+var_A], bx
mov ax, es:[bx+di]
mov cx, es:[bx+di+2]
mov [bp+var_2], cx
sub cx, si
mov bx, 12DCh
push 0DF0h
jmp make_linework
; ---------------------------------------------------------------------------
loc_E74:
mov es, ClipYT_seg
mov dx, [bp+var_C]
sub dx, si
sub si, ClipYT
mov ax, si
shl si, 2
add si, ax
shl si, 4
call draw_trapezoid
pop si
pop di
leave
retf 6
sub_C7C endp
include libs/master.lib/grcg_polygon_c.asm
; ---------------------------------------------------------------------------
; START OF FUNCTION CHUNK FOR sub_EAA
@ -9166,7 +8897,7 @@ loc_C38B:
idiv bx
add ax, 3
push ax
call sub_C7C
call grcg_polygon_c
inc si
loc_C3A1:

View File

@ -58,277 +58,7 @@ include libs/master.lib/dos_close.asm
include libs/master.lib/dos_ropen.asm
include libs/master.lib/grcg_boxfill.asm
include libs/master.lib/grcg_byteboxfill_x.asm
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_C6A 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
push bp
mov bp, sp
sub sp, 0Ch
push di
push si
mov ax, [bp+arg_0]
dec ax
mov cx, ax
shl ax, 2
mov [bp+arg_0], ax
les si, [bp+arg_2]
xor ax, ax
mov [bp+var_8], ax
mov [bp+var_A], ax
mov ax, es:[si+2]
mov [bp+var_4], ax
mov [bp+var_C], ax
mov ax, es:[si]
mov di, ax
mov bx, 4
loc_C9B:
mov dx, es:[bx+si+2]
cmp dx, [bp+var_4]
jge short loc_CB0
mov [bp+var_8], bx
mov [bp+var_A], bx
mov [bp+var_4], dx
jmp short loc_CC2
; ---------------------------------------------------------------------------
nop
loc_CB0:
cmp [bp+var_4], dx
jnz short loc_CBA
mov [bp+var_A], bx
jmp short loc_CC2
; ---------------------------------------------------------------------------
loc_CBA:
cmp [bp+var_C], dx
jge short loc_CC2
mov [bp+var_C], dx
loc_CC2:
mov dx, es:[bx+si]
cmp ax, dx
jl short loc_CD4
mov ax, dx
jmp short loc_CDA
; ---------------------------------------------------------------------------
nop
loc_CCE:
pop si
pop di
leave
retf 6
; ---------------------------------------------------------------------------
loc_CD4:
cmp di, dx
jge short loc_CDA
mov di, dx
loc_CDA:
add bx, 4
loop loc_C9B
cmp ClipXR, ax
jl short loc_CCE
cmp ClipXL, di
jg short loc_CCE
mov ax, [bp+var_4]
cmp ClipYB, ax
jl short loc_CCE
mov dx, [bp+var_C]
cmp ClipYT, dx
jg short loc_CCE
mov ax, ClipYB
cmp ax, dx
jge short loc_D06
mov dx, ax
loc_D06:
mov [bp+var_C], dx
mov ax, [bp+arg_0]
cmp [bp+var_8], 0
jnz short loc_D1F
cmp [bp+var_A], ax
jnz short loc_D1F
mov [bp+var_8], ax
mov [bp+var_A], 0
loc_D1F:
mov bx, [bp+var_8]
mov dx, [bp+arg_0]
mov ax, ClipYT
loc_D28:
mov cx, bx
sub bx, 4
jns short loc_D31
mov bx, dx
loc_D31:
cmp es:[bx+si+2], ax
jl short loc_D28
mov ax, es:[bx+si+2]
mov [bp+var_6], ax
mov [bp+var_8], bx
mov bx, cx
mov dx, es:[bx+si+2]
mov di, es:[bx+si]
mov bx, [bp+var_8]
cmp dx, ClipYT
jge short loc_D6F
mov ax, dx
sub ax, [bp+var_6]
push ax
mov ax, di
sub ax, es:[bx+si]
mov cx, ClipYT
sub cx, dx
imul cx
pop cx
idiv cx
add di, ax
mov dx, ClipYT
loc_D6F:
mov [bp+var_4], dx
xchg di, dx
mov ax, es:[bx+si]
mov cx, [bp+var_6]
sub cx, di
mov bx, 1190h
call make_linework
mov bx, [bp+var_A]
mov cx, [bp+arg_0]
mov ax, ClipYT
loc_D8B:
mov di, bx
add bx, 4
cmp bx, cx
jle short loc_D96
xor bx, bx
loc_D96:
cmp es:[bx+si+2], ax
jl short loc_D8B
mov ax, es:[bx+si+2]
mov [bp+var_2], ax
mov [bp+var_A], bx
add di, si
mov cx, es:[di+2]
mov di, es:[di]
mov bx, es:[bx+si]
cmp cx, [bp+var_4]
jge short loc_DCB
mov ax, ClipYT
sub ax, cx
push cx
mov cx, di
sub cx, bx
imul cx
pop cx
sub cx, [bp+var_2]
idiv cx
add di, ax
loc_DCB:
mov dx, di
mov ax, bx
mov cx, [bp+var_2]
sub cx, [bp+var_4]
mov bx, 1198h
call make_linework
mov si, [bp+var_4]
loc_DDE:
mov di, [bp+var_6]
cmp di, [bp+var_2]
jle short loc_DE9
mov di, [bp+var_2]
loc_DE9:
cmp [bp+var_C], di
jle short loc_E62
push di
lea dx, [di-1]
sub dx, si
sub si, ClipYT
mov ax, si
shl si, 2
add si, ax
shl si, 4
mov es, ClipYT_seg
call draw_trapezoid
pop si
les di, [bp+arg_2]
cmp si, [bp+var_6]
jnz short loc_E35
mov bx, [bp+var_8]
mov dx, es:[bx+di]
sub bx, 4
jns short loc_E20
mov bx, [bp+arg_0]
loc_E20:
mov [bp+var_8], bx
mov ax, es:[bx+di]
mov cx, es:[bx+di+2]
mov [bp+var_6], cx
sub cx, si
mov bx, 1190h
call make_linework
loc_E35:
cmp [bp+var_2], si
jnz short loc_DDE
mov bx, [bp+var_A]
mov dx, es:[bx+di]
add bx, 4
cmp bx, [bp+arg_0]
jle short loc_E4A
xor bx, bx
loc_E4A:
mov [bp+var_A], bx
mov ax, es:[bx+di]
mov cx, es:[bx+di+2]
mov [bp+var_2], cx
sub cx, si
mov bx, 1198h
push 0DDEh
jmp make_linework
; ---------------------------------------------------------------------------
loc_E62:
mov es, ClipYT_seg
mov dx, [bp+var_C]
sub dx, si
sub si, ClipYT
mov ax, si
shl si, 2
add si, ax
shl si, 4
call draw_trapezoid
pop si
pop di
leave
retf 6
sub_C6A endp
include libs/master.lib/grcg_polygon_c.asm
include libs/master.lib/grcg_pset.asm
include libs/master.lib/grcg_setcolor.asm
include libs/master.lib/gaiji_backup.asm
@ -6070,7 +5800,7 @@ loc_A879:
idiv bx
add ax, 3
push ax
call sub_C6A
call grcg_polygon_c
inc si
loc_A88F:

View File

@ -62,276 +62,7 @@ include libs/master.lib/dos_ropen.asm
include libs/master.lib/grcg_boxfill.asm
include libs/master.lib/grcg_byteboxfill_x.asm
include libs/master.lib/grcg_hline.asm
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_DC2 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
push bp
mov bp, sp
sub sp, 0Ch
push di
push si
mov ax, [bp+arg_0]
dec ax
mov cx, ax
shl ax, 2
mov [bp+arg_0], ax
les si, [bp+arg_2]
xor ax, ax
mov [bp+var_8], ax
mov [bp+var_A], ax
mov ax, es:[si+2]
mov [bp+var_4], ax
mov [bp+var_C], ax
mov ax, es:[si]
mov di, ax
mov bx, 4
loc_DF3:
mov dx, es:[bx+si+2]
cmp dx, [bp+var_4]
jge short loc_E08
mov [bp+var_8], bx
mov [bp+var_A], bx
mov [bp+var_4], dx
jmp short loc_E1A
; ---------------------------------------------------------------------------
nop
loc_E08:
cmp [bp+var_4], dx
jnz short loc_E12
mov [bp+var_A], bx
jmp short loc_E1A
; ---------------------------------------------------------------------------
loc_E12:
cmp [bp+var_C], dx
jge short loc_E1A
mov [bp+var_C], dx
loc_E1A:
mov dx, es:[bx+si]
cmp ax, dx
jl short loc_E2C
mov ax, dx
jmp short loc_E32
; ---------------------------------------------------------------------------
nop
loc_E26:
pop si
pop di
leave
retf 6
; ---------------------------------------------------------------------------
loc_E2C:
cmp di, dx
jge short loc_E32
mov di, dx
loc_E32:
add bx, 4
loop loc_DF3
cmp ClipXR, ax
jl short loc_E26
cmp ClipXL, di
jg short loc_E26
mov ax, [bp+var_4]
cmp ClipYB, ax
jl short loc_E26
mov dx, [bp+var_C]
cmp ClipYT, dx
jg short loc_E26
mov ax, ClipYB
cmp ax, dx
jge short loc_E5E
mov dx, ax
loc_E5E:
mov [bp+var_C], dx
mov ax, [bp+arg_0]
cmp [bp+var_8], 0
jnz short loc_E77
cmp [bp+var_A], ax
jnz short loc_E77
mov [bp+var_8], ax
mov [bp+var_A], 0
loc_E77:
mov bx, [bp+var_8]
mov dx, [bp+arg_0]
mov ax, ClipYT
loc_E80:
mov cx, bx
sub bx, 4
jns short loc_E89
mov bx, dx
loc_E89:
cmp es:[bx+si+2], ax
jl short loc_E80
mov ax, es:[bx+si+2]
mov [bp+var_6], ax
mov [bp+var_8], bx
mov bx, cx
mov dx, es:[bx+si+2]
mov di, es:[bx+si]
mov bx, [bp+var_8]
cmp dx, ClipYT
jge short loc_EC7
mov ax, dx
sub ax, [bp+var_6]
push ax
mov ax, di
sub ax, es:[bx+si]
mov cx, ClipYT
sub cx, dx
imul cx
pop cx
idiv cx
add di, ax
mov dx, ClipYT
loc_EC7:
mov [bp+var_4], dx
xchg di, dx
mov ax, es:[bx+si]
mov cx, [bp+var_6]
sub cx, di
mov bx, 1A6Eh
call make_linework
mov bx, [bp+var_A]
mov cx, [bp+arg_0]
mov ax, ClipYT
loc_EE3:
mov di, bx
add bx, 4
cmp bx, cx
jle short loc_EEE
xor bx, bx
loc_EEE:
cmp es:[bx+si+2], ax
jl short loc_EE3
mov ax, es:[bx+si+2]
mov [bp+var_2], ax
mov [bp+var_A], bx
add di, si
mov cx, es:[di+2]
mov di, es:[di]
mov bx, es:[bx+si]
cmp cx, [bp+var_4]
jge short loc_F23
mov ax, ClipYT
sub ax, cx
push cx
mov cx, di
sub cx, bx
imul cx
pop cx
sub cx, [bp+var_2]
idiv cx
add di, ax
loc_F23:
mov dx, di
mov ax, bx
mov cx, [bp+var_2]
sub cx, [bp+var_4]
mov bx, 1A76h
call make_linework
mov si, [bp+var_4]
loc_F36:
mov di, [bp+var_6]
cmp di, [bp+var_2]
jle short loc_F41
mov di, [bp+var_2]
loc_F41:
cmp [bp+var_C], di
jle short loc_FBA
push di
lea dx, [di-1]
sub dx, si
sub si, ClipYT
mov ax, si
shl si, 2
add si, ax
shl si, 4
mov es, ClipYT_seg
call draw_trapezoid
pop si
les di, [bp+arg_2]
cmp si, [bp+var_6]
jnz short loc_F8D
mov bx, [bp+var_8]
mov dx, es:[bx+di]
sub bx, 4
jns short loc_F78
mov bx, [bp+arg_0]
loc_F78:
mov [bp+var_8], bx
mov ax, es:[bx+di]
mov cx, es:[bx+di+2]
mov [bp+var_6], cx
sub cx, si
mov bx, 1A6Eh
call make_linework
loc_F8D:
cmp [bp+var_2], si
jnz short loc_F36
mov bx, [bp+var_A]
mov dx, es:[bx+di]
add bx, 4
cmp bx, [bp+arg_0]
jle short loc_FA2
xor bx, bx
loc_FA2:
mov [bp+var_A], bx
mov ax, es:[bx+di]
mov cx, es:[bx+di+2]
mov [bp+var_2], cx
sub cx, si
mov bx, 1A76h
push 0F36h
jmp make_linework
; ---------------------------------------------------------------------------
loc_FBA:
mov es, ClipYT_seg
mov dx, [bp+var_C]
sub dx, si
sub si, ClipYT
mov ax, si
shl si, 2
add si, ax
shl si, 4
call draw_trapezoid
pop si
pop di
leave
retf 6
sub_DC2 endp
include libs/master.lib/grcg_polygon_c.asm
; ---------------------------------------------------------------------------
; START OF FUNCTION CHUNK FOR sub_FF0
@ -7363,7 +7094,7 @@ loc_C224:
idiv bx
add ax, 3
push ax
call sub_DC2
call grcg_polygon_c
inc si
loc_C23A:

View File

@ -60,277 +60,7 @@ include libs/master.lib/dos_close.asm
include libs/master.lib/dos_ropen.asm
include libs/master.lib/grcg_byteboxfill_x.asm
include libs/master.lib/grcg_hline.asm
; =============== S U B R O U T I N E =======================================
; Attributes: bp-based frame
sub_CCA 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
push bp
mov bp, sp
sub sp, 0Ch
push di
push si
mov ax, [bp+arg_0]
dec ax
mov cx, ax
shl ax, 2
mov [bp+arg_0], ax
les si, [bp+arg_2]
xor ax, ax
mov [bp+var_8], ax
mov [bp+var_A], ax
mov ax, es:[si+2]
mov [bp+var_4], ax
mov [bp+var_C], ax
mov ax, es:[si]
mov di, ax
mov bx, 4
loc_CFB:
mov dx, es:[bx+si+2]
cmp dx, [bp+var_4]
jge short loc_D10
mov [bp+var_8], bx
mov [bp+var_A], bx
mov [bp+var_4], dx
jmp short loc_D22
; ---------------------------------------------------------------------------
nop
loc_D10:
cmp [bp+var_4], dx
jnz short loc_D1A
mov [bp+var_A], bx
jmp short loc_D22
; ---------------------------------------------------------------------------
loc_D1A:
cmp [bp+var_C], dx
jge short loc_D22
mov [bp+var_C], dx
loc_D22:
mov dx, es:[bx+si]
cmp ax, dx
jl short loc_D34
mov ax, dx
jmp short loc_D3A
; ---------------------------------------------------------------------------
nop
loc_D2E:
pop si
pop di
leave
retf 6
; ---------------------------------------------------------------------------
loc_D34:
cmp di, dx
jge short loc_D3A
mov di, dx
loc_D3A:
add bx, 4
loop loc_CFB
cmp ClipXR, ax
jl short loc_D2E
cmp ClipXL, di
jg short loc_D2E
mov ax, [bp+var_4]
cmp ClipYB, ax
jl short loc_D2E
mov dx, [bp+var_C]
cmp ClipYT, dx
jg short loc_D2E
mov ax, ClipYB
cmp ax, dx
jge short loc_D66
mov dx, ax
loc_D66:
mov [bp+var_C], dx
mov ax, [bp+arg_0]
cmp [bp+var_8], 0
jnz short loc_D7F
cmp [bp+var_A], ax
jnz short loc_D7F
mov [bp+var_8], ax
mov [bp+var_A], 0
loc_D7F:
mov bx, [bp+var_8]
mov dx, [bp+arg_0]
mov ax, ClipYT
loc_D88:
mov cx, bx
sub bx, 4
jns short loc_D91
mov bx, dx
loc_D91:
cmp es:[bx+si+2], ax
jl short loc_D88
mov ax, es:[bx+si+2]
mov [bp+var_6], ax
mov [bp+var_8], bx
mov bx, cx
mov dx, es:[bx+si+2]
mov di, es:[bx+si]
mov bx, [bp+var_8]
cmp dx, ClipYT
jge short loc_DCF
mov ax, dx
sub ax, [bp+var_6]
push ax
mov ax, di
sub ax, es:[bx+si]
mov cx, ClipYT
sub cx, dx
imul cx
pop cx
idiv cx
add di, ax
mov dx, ClipYT
loc_DCF:
mov [bp+var_4], dx
xchg di, dx
mov ax, es:[bx+si]
mov cx, [bp+var_6]
sub cx, di
mov bx, 2DF6h
call make_linework
mov bx, [bp+var_A]
mov cx, [bp+arg_0]
mov ax, ClipYT
loc_DEB:
mov di, bx
add bx, 4
cmp bx, cx
jle short loc_DF6
xor bx, bx
loc_DF6:
cmp es:[bx+si+2], ax
jl short loc_DEB
mov ax, es:[bx+si+2]
mov [bp+var_2], ax
mov [bp+var_A], bx
add di, si
mov cx, es:[di+2]
mov di, es:[di]
mov bx, es:[bx+si]
cmp cx, [bp+var_4]
jge short loc_E2B
mov ax, ClipYT
sub ax, cx
push cx
mov cx, di
sub cx, bx
imul cx
pop cx
sub cx, [bp+var_2]
idiv cx
add di, ax
loc_E2B:
mov dx, di
mov ax, bx
mov cx, [bp+var_2]
sub cx, [bp+var_4]
mov bx, 2DFEh
call make_linework
mov si, [bp+var_4]
loc_E3E:
mov di, [bp+var_6]
cmp di, [bp+var_2]
jle short loc_E49
mov di, [bp+var_2]
loc_E49:
cmp [bp+var_C], di
jle short loc_EC2
push di
lea dx, [di-1]
sub dx, si
sub si, ClipYT
mov ax, si
shl si, 2
add si, ax
shl si, 4
mov es, ClipYT_seg
call draw_trapezoid
pop si
les di, [bp+arg_2]
cmp si, [bp+var_6]
jnz short loc_E95
mov bx, [bp+var_8]
mov dx, es:[bx+di]
sub bx, 4
jns short loc_E80
mov bx, [bp+arg_0]
loc_E80:
mov [bp+var_8], bx
mov ax, es:[bx+di]
mov cx, es:[bx+di+2]
mov [bp+var_6], cx
sub cx, si
mov bx, 2DF6h
call make_linework
loc_E95:
cmp [bp+var_2], si
jnz short loc_E3E
mov bx, [bp+var_A]
mov dx, es:[bx+di]
add bx, 4
cmp bx, [bp+arg_0]
jle short loc_EAA
xor bx, bx
loc_EAA:
mov [bp+var_A], bx
mov ax, es:[bx+di]
mov cx, es:[bx+di+2]
mov [bp+var_2], cx
sub cx, si
mov bx, 2DFEh
push 0E3Eh
jmp make_linework
; ---------------------------------------------------------------------------
loc_EC2:
mov es, ClipYT_seg
mov dx, [bp+var_C]
sub dx, si
sub si, ClipYT
mov ax, si
shl si, 2
add si, ax
shl si, 4
call draw_trapezoid
pop si
pop di
leave
retf 6
sub_CCA endp
include libs/master.lib/grcg_polygon_c.asm
include libs/master.lib/grcg_setcolor.asm
include libs/master.lib/grcg_vline.asm
include libs/master.lib/get_machine_98.asm
@ -7967,7 +7697,7 @@ loc_C273:
idiv bx
add ax, 3
push ax
call sub_CCA
call grcg_polygon_c
inc si
loc_C289: