ReC98/libs/master.lib/grcg_trapezoid.asm

148 lines
3.4 KiB
NASM
Raw Normal View History

2014-09-01 06:45:00 +00:00
PAGE 98,120
; koichan library - graphics - grcg - trapezoid - PC98V
;
; Function:
; void far _pascal grcg_trapezoid( int y1, int x11, int x12, int y2, int x21, int x22 ) ;
;
; Description:
; 台形塗りつぶし(青プレーンのみ)
;
; Parameters:
; int y1 1つ目の水平線のy座標
; int x11, x12 1つ目の水平線の両端のx座標
; int y2 2つ目の水平線のy座標
; int x21, x22 2つ目の水平線の両端のx座標
;
; Binding Target:
; Microsoft-C / Turbo-C ( Small Model )
;
; Running Target:
; NEC PC-9801 Normal mode
;
; Requiring Resources:
; CPU: V30
; GRAPHICS ACCELARATOR: GRAPHIC CHARGER
;
; Assembler:
; TASM 3.0
; OPTASM 1.6
;
; Notes:
; ・グラフィック画面の青プレーンにのみ描画します。
; ・色をつけるには、グラフィックチャージャーを利用してください。
; ・クリッピングを行っています。
;  左右方向は、grc_setclip()によるクリッピングに対応していますが、
;  上下方向は、画面枠でクリップします。呼び出し側で対応して(ヒー)
;  y座標が上境界にかかっていると遅くなります。
;  (上境界との交点を計算せずに、上から順に調べているため)
; ・位置関係は上下、左右とも自由ですが、ねじれている場合
;  ねじれた台形(2つの三角形が頂点で接している状態)を描画します。
;
; Author:
; 恋塚昭彦
;
; Revision History:
; 92/3/21 Initial
; 92/3/29 bug fix, 台形に側辺の交差を認めるようにした
; 92/4/2 少々加速
; 92/4/18 三角形ルーチンから分離。クリッピング付加。
; 92/4/19 少々加速
; 92/5/7 自己書き換えにより加速
; 92/5/20 任意クリッピングの横にだけ対応。:-)
; 92/5/22 ↑これも自己書き換え〜
; 92/6/6 bug fix
; 92/6/13 bug fix
; 92/6/16 TASM対応
; 95/ 3/25 [M0.22k] BUGFIX ClipYT=0を仮定していた
;=========================================================================
; void _pascal grcg_trapezoid( int y1, int x11, int x12, int y2, int x21, int x22 )
FUNC GRCG_TRAPEZOID
push BP
mov BP,SP
push DI
push SI
mov ES,ClipYT_seg
mov AX,ClipYT
mov CX,ClipYH
; 引数
@@y1 = (RETSIZE+6)*2
@@x11 = (RETSIZE+5)*2
@@x12 = (RETSIZE+4)*2
@@y2 = (RETSIZE+3)*2
@@x21 = (RETSIZE+2)*2
@@x22 = (RETSIZE+1)*2
mov SI,[BP+@@y1]
sub SI,AX
js short @@Lno_draw
mov DI,[BP+@@y2]
sub DI,AX
js short @@Lno_draw
cmp SI,DI
jg short @@Lgyaku
or DI,DI
js short @@Lno_draw
cmp SI,CX
jg short @@Lno_draw
sub DI,CX ; if ( y2 >= Ymax )
sbb AX,AX ; y2 = Ymax ;
and DI,AX
add DI,CX
sub DI,SI ; DI = y2 - y1
jl short @@Lno_draw
mov AX,[BP+@@x21]
mov CX,DI ; y2-y1
mov BX,offset trapez_a ;a
mov DX,[BP+@@x11]
call make_linework
mov AX,[BP+@@x22]
mov CX,DI ; y2-y1
mov BX,offset trapez_b ;b
mov DX,[BP+@@x12]
push offset @@Ldraw
jmp make_linework
@@Lgyaku:
xchg SI,DI ; y2<->y1
or DI,DI
js short @@Lno_draw
cmp SI,CX
jg short @@Lno_draw
sub DI,CX ; if ( y2 >= Ymax )
sbb AX,AX ; y2 = Ymax ;
and DI,AX
add DI,CX
sub DI,SI ; DI = y2 - y1
jl short @@Lno_draw
mov AX,[BP+@@x11]
mov CX,DI ; y2-y1
mov BX,offset trapez_a ;a
mov DX,[BP+@@x21]
call make_linework
mov AX,[BP+@@x12]
mov CX,DI ; y2-y1
mov BX,offset trapez_b ;b
mov DX,[BP+@@x22]
call make_linework
@@Ldraw:
imul SI,SI,80
mov DX,DI
call draw_trapezoid
@@Lno_draw:
pop SI
pop DI
leave
ret 12
ENDFUNC