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
|