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