mirror of https://github.com/nmlgc/ReC98.git
148 lines
3.4 KiB
NASM
148 lines
3.4 KiB
NASM
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
|