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