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