ReC98/libs/master.lib/grcg_vline.asm

136 lines
2.2 KiB
NASM

PAGE 98,120
; graphics - grcg - vline - PC98V
;
; DESCRIPTION:
; 垂直線の描画(青プレーンのみ)
;
; FUNCTION:
; void grcg_vline( int x, int y1, int y2 ) ;
; PARAMETERS:
; int x x座標
; int y1 上のy座標
; int y2 下のy座標
;
; BINDING TARGET:
; Microsoft-C / Turbo-C
;
; RUNNING TARGET:
; NEC PC-9801 Normal mode
;
; REQUIRING RESOURCES:
; CPU: V30
; GRAPHICS ACCELARATOR: GRAPHIC CHARGER
;
; COMPILER/ASSEMBLER:
; TASM 3.0
; OPTASM 1.6
;
; NOTES:
; ・グラフィック画面の青プレーンにのみ描画します。
; ・色をつけるには、グラフィックチャージャーを利用してください。
; ・grc_setclip()によるクリッピングに対応しています。
; ・y1,y2の上下関係は逆でも(速度も)全く変わりなく動作します。
;
; AUTHOR:
; 恋塚昭彦
;
; 関連関数:
; grc_setclip()
;
; HISTORY:
; 92/10/5 Initial
; 93/10/15 [M0.21] 縦クリッピングのbugfix (iR氏報告)
; 93/11/26 [M0.22] ↑さらに(;_;) yの小さいほうが負だと…
; 94/ 3/12 [M0.23] 無駄なことやってたので縮小
MRETURN macro
pop DI
pop BP
ret 6
EVEN
endm
func GRCG_VLINE
push BP
mov BP,SP
push DI
; PARAMETERS
x = (RETSIZE+3)*2
y1 = (RETSIZE+2)*2
y2 = (RETSIZE+1)*2
mov AX,ClipYT
mov CX,ClipYH
mov BX,[BP+y1]
mov DX,[BP+y2]
cmp BX,DX
jl short @@GO
xchg BX,DX
@@GO:
; yの変換とクリップ
sub DX,AX
jl short @@RETURN
sub BX,AX
cmp BH,80h
sbb DI,DI
and BX,DI
cmp BX,CX
jg short @@RETURN
sub DX,CX ; DXは負になりえない(Clip枠が正である前提)
sbb DI,DI
and DX,DI
add DX,CX
mov AX,[BP+x] ; xのクリップ
cmp AX,ClipXL
jl short @@RETURN
cmp AX,ClipXR
jg short @@RETURN
mov CX,AX
and CL,07h
shr AX,3
mov DI,AX
mov AL,80h
shr AL,CL
mov CX,DX ; 増分の計算
mov DX,80-1 ; DXが増分(stosbで増える1をあらかじめ減らす)
sub CX,BX ; CXは長さ
imul BX,BX,80
add DI,BX
mov ES,ClipYT_seg ; セグメント設定
inc CX ; 長さを出す(abs(y2-y1)+1)
shr CX,1
jnb short @@S1
stosb
add DI,DX
@@S1:
shr CX,1
jnb short @@S2
stosb
add DI,DX
stosb
add DI,DX
@@S2: jcxz short @@RETURN
EVEN
@@L: stosb
add DI,DX
stosb
add DI,DX
stosb
add DI,DX
stosb
add DI,DX
loop short @@L
@@RETURN:
MRETURN
endfunc