ReC98/libs/master.lib/draw_trapezoidx.asm

162 lines
3.9 KiB
NASM

PAGE 98,120
; gc_poly library - graphics - grcg - trapezoid - noclip - PC98V
;
; Subroutines:
; draw_trapezoidx
;
; Variables:
; trapez_a, trapez_b 台形描画作業変数
;
; Description:
; 台形塗りつぶし(ES:〜が対象)
;
; Binding Target:
; asm routine
;
; Running Target:
; NEC PC-9801 Normal mode
;
; Requiring Resources:
; CPU: V30
; GRAPHICS ACCELARATOR: GRAPHIC CHARGER
;
; Assembler:
; TASM 3.0
; OPTASM 1.6
;
; Notes:
; ・グラフィック画面の青プレーンにのみ描画します。
; ・色をつけるには、グラフィックチャージャーを利用してください。
; ・クリッピングは一切しません。
; ・側辺同士が交差していると、交差した描画をします。
;
; 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/4 grcg_trapezoid()関数をgc_zoid.asmに分割。
; 92/6/5 bugfix(make_lineworkのCXが0の時のdiv 0回避)
; 92/6/5 下端クリップ対応
; 92/6/12 加速〜
; 92/6/16 TASMに対応
; 92/7/10 クリッピング無し&側辺交差無し版(koizoidx.asm)
; 92/7/14 加速
; 92/7/17 最初の点が同じxだと変になってたbugをfix...減速(;_;)
; 今度は、横幅 1dotの並行な図形はすごく遅いぞ
; 93/3/2 あう(>_<)<-意味なし
; 93/ 5/29 [M0.18] .CONST->.DATA
; 94/ 2/23 [M0.23] make_lineworkのEXTRNを削除(それだけ(^^;)
; LINEWORK構造体の各メンバの定義
; 名称 - オフセット - 説明
x = 0 ; 現在のx座標
dlx = 2 ; 誤差変数への加算値
s = 4 ; 誤差変数
d = 6 ; 最小横移動量(符号付き)
;-------------------------------------------------------------------------
; draw_trapezoidx - 台形の描画 高速(機能削減)版
; IN:
; SI : unsigned yadr ; 描画する三角形の上のラインの左端のVRAMオフセット
; DX : unsigned ylen ; 描画する三角形の上下のライン差(y2-y1)
; ES : unsigned gseg ; 描画するVRAMのセグメント(ClipYT_seg)
; trapez_a ; 側辺aのxの初期値と傾き
; trapez_b ; 側辺bのxの初期値と傾き
; BREAKS:
; AX,BX,CX,DX,SI,DI,flags
;
public draw_trapezoidx
draw_trapezoidx PROC NEAR
mov AX,[trapez_a+d]
mov CS:[koizoidx_trapez_a_d],AX
mov AX,[trapez_b+d]
mov CS:[koizoidx_trapez_b_d],AX
mov AX,[trapez_a+dlx]
mov CS:[koizoidx_trapez_a_dlx],AX
mov AX,[trapez_b+dlx]
mov CS:[koizoidx_trapez_b_dlx],AX
out 64h,AL ; 'out anywhere' for CPU cache clear
; 64h: PC-9801の CRTV割り込みリセット
push BP
mov BP,[trapez_a+x]
mov CX,[trapez_b+x]
EVEN
@@YLOOP:
; 水平線 (without clipping) start ===================================
; IN: SI... x=0の時のVRAM ADDR(y*80) BP,CX... 二つのx座標
mov BX,BP
sub CX,BX ; CX := bitlen
; BX := left-x
sbb AX,AX
xor CX,AX
sub CX,AX
and AX,CX
sub BX,AX
mov DI,BX ; addr := yaddr + xl div $10 * 2
shr DI,4
shl DI,1
add DI,SI
and BX,0Fh ; BX := xl and $0F
add CX,BX
shl BX,1
mov AX,[EDGES+BX] ; 左エッジ
not AX
mov BX,CX ;
and BX,0Fh
shl BX,1
shr CX,4
jz short @@LASTW
dec CX
stosw
mov AX,0FFFFh
rep stosw
@@LASTW: and AX,[EDGES+2+BX] ; 右エッジ
stosw
; 水平線 (without clipping) end ===================================
add [trapez_b+s],1234h
org $-2
koizoidx_trapez_b_dlx dw ?
mov CX,[trapez_b+x]
adc CX,1234h
org $-2
koizoidx_trapez_b_d dw ?
mov [trapez_b+x],CX
add [trapez_a+s],1234h
org $-2
koizoidx_trapez_a_dlx dw ?
adc BP,1234h
org $-2
koizoidx_trapez_a_d dw ?
add SI,80 ; yadr
dec DX ; ylen
jns short @@YLOOP
mov [trapez_a+x],BP
pop BP
ret
EVEN
draw_trapezoidx ENDP