ReC98/libs/master.lib/grc_setclip.asm

149 lines
2.9 KiB
NASM

; graphics - clipping
;
; DESCRIPTION:
; 描画クリップ枠の設定処理
;
; FUNCTION(in C):
; int far _pascal grc_setclip( int xl, int yt, int xr, int yb ) ;
;
; FUNCTION(in Pascal):
; function grc_setclip( xl,yt,xr,yb : integer ) : integer ;
;
; PARAMETERS:
; int xl 左端のx座標
; int yt 上端のy座標
; int xr 右端のx座標
; int yb 下端のy座標
;
; RETURNS:
; 0 = 失敗。実画面(640x400)の外にクリップ領域を設定しようとした
; 1 = 成功。
;
; NOTES:
; ・入力は、まず画面枠(0,0)-(639,399)でクリップしている。
; ・入力の対は、大小関係が逆でも揃えてから処理している。
;
; GLOBAL VARIABLES:
; int ClipXL, ClipXW, ClipXR 左端x, 枠の横幅(xr-xl), 右端x
; int ClipYT, ClipYH, ClipYB 上端y, 枠の高さ(yb-yt), 下端y
; unsigned ClipYB_adr 下端の左端のVRAMオフセット
; unsigned ClipYT_seg 上端のVRAMセグメント(青プレーン)
;
; REFER:
; ・対応関数
; grcg_polygon_convex()
; grcg_trapezoid()
;
; COMPILER/ASSEMBLER:
; TASM 3.0
; OPTASM 1.6
;
; AUTHOR:
; 恋塚昭彦
;
; HISTORY:
; 92/5/20 Initial
; 92/6/5 _pascal化したが、バグ出た。ひー。直した。ぶう
; 92/6/5 ClipYB_adr追加。
; 92/6/6 ClipYT_seg, GRamStart追加。
; 92/6/16 データ部分をclip.asmに分離
; 93/3/27 master.libに合併
; 93/12/28 [M0.22] 横の制限はgraph_VramWidth*8ドットにした
;
; int far _pascal grc_setclip( int xl, int yt, int xr, int yb ) ;
func GRC_SETCLIP
push BP
mov BP,SP
; 引数
@@xl = (RETSIZE+4)*2
@@yt = (RETSIZE+3)*2
@@xr = (RETSIZE+2)*2
@@yb = (RETSIZE+1)*2
;------------------------- X座標
mov AX,[BP+@@xl]
mov BX,[BP+@@xr]
test AX,BX ; AX < 0 && BX < 0 ならエラー
js short @@ERROR
cmp AX,BX
jl short @@A
xchg AX,BX ; AX <= BXにする
@@A:
cmp AX,8000h ;
sbb DX,DX ;
and AX,DX ; AXが負数ならゼロにする
mov CX,graph_VramWidth
shl CX,3
dec CX
sub BX,CX ;
sbb DX,DX ;
and BX,DX ;
add BX,CX ; BXが639以上なら639にする
sub BX,AX
jl short @@ERROR
mov ClipXL,AX
mov ClipXW,BX
add AX,BX
mov ClipXR,AX
;------------------------- Y座標
mov AX,[BP+@@yt]
mov BX,[BP+@@yb]
test AX,BX ; AX < 0 && BX < 0 ならエラー
js short @@ERROR
cmp AX,BX
jl short @@B
xchg AX,BX ; AX <= BXにする
@@B:
cmp AX,8000h ;
sbb DX,DX ;
and AX,DX ; AXが負数ならゼロにする
mov CX,graph_VramLines
dec CX
sub BX,CX ;
sbb DX,DX ;
and BX,DX ;
add BX,CX ; BXが399以上なら399にする
sub BX,AX
jl short @@ERROR
mov ClipYT,AX
mov CX,AX
mov ClipYH,BX
add AX,BX
mov ClipYB,AX
mov AX,graph_VramWidth
xchg AX,BX
mul BX
mov ClipYB_adr,AX ; 下端yの左端のVRAMオフセット
; (ClipYT_segセグメント上)
mov AX,BX
shr AX,4
mul CX
add AX,graph_VramSeg ; 開始セグメント = graph_VramSeg
mov ClipYT_seg,AX ; + yt * graph_VramWidth/16
mov AX,1
pop BP
ret 8
@@ERROR:
xor AX,AX
pop BP
ret 8
endfunc