From 5b91dd3b42d3b771cc53633149364b50d2c00498 Mon Sep 17 00:00:00 2001 From: nmlgc Date: Mon, 1 Sep 2014 06:52:28 +0200 Subject: [PATCH] [Reduction] #423: grcg_polygon_c --- libs/master.lib/grcg_polygon_c.asm | 393 +++++++++++++++++++++++++++++ th02_op.asm | 273 +------------------- th03_op.asm | 274 +------------------- th04_op.asm | 273 +------------------- th05_op.asm | 274 +------------------- 5 files changed, 401 insertions(+), 1086 deletions(-) create mode 100644 libs/master.lib/grcg_polygon_c.asm diff --git a/libs/master.lib/grcg_polygon_c.asm b/libs/master.lib/grcg_polygon_c.asm new file mode 100644 index 00000000..3fe8d8b7 --- /dev/null +++ b/libs/master.lib/grcg_polygon_c.asm @@ -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座標の点は1つ以下にしか + ; ならない。従って、頂上を共有する点は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 diff --git a/th02_op.asm b/th02_op.asm index c5b04e3e..84ff93e0 100644 --- a/th02_op.asm +++ b/th02_op.asm @@ -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: diff --git a/th03_op.asm b/th03_op.asm index 4635f1b3..7299fabf 100644 --- a/th03_op.asm +++ b/th03_op.asm @@ -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: diff --git a/th04_op.asm b/th04_op.asm index 974451fc..b2dc7ad3 100644 --- a/th04_op.asm +++ b/th04_op.asm @@ -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: diff --git a/th05_op.asm b/th05_op.asm index 4601a2e2..3b389962 100644 --- a/th05_op.asm +++ b/th05_op.asm @@ -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: