mirror of https://github.com/nmlgc/ReC98.git
124 lines
2.3 KiB
NASM
124 lines
2.3 KiB
NASM
PAGE 98,120
|
|
; graphics - cutline
|
|
;
|
|
; DESCRIPTION:
|
|
; 直線のクリッピング
|
|
;
|
|
; Function/Procedure:
|
|
; curline : near
|
|
|
|
; Parameters:
|
|
; BL : o1
|
|
; CX : x1
|
|
; DI : y1 - ClipYT
|
|
; BH : o2
|
|
; SI : x2
|
|
; BP : y2 - ClipYT
|
|
; Returns:
|
|
; BL,CX,DI ( o1,x1,y1 )はクリッピングにより変化する場合がある
|
|
; BH,SI,BP ( o2,x2,y2 )は変化しない。
|
|
; AX,DX は破壊
|
|
;
|
|
; Binding Target:
|
|
; MASM 5.0 / OPTASM / TASM
|
|
;
|
|
; Running Target:
|
|
; 80186/V30/80286...
|
|
;
|
|
; REQUIRING RESOURCES:
|
|
; CPU: V30
|
|
;
|
|
; COMPILER/ASSEMBLER:
|
|
; TASM 3.0
|
|
; OPTASM 1.6
|
|
;
|
|
; NOTES:
|
|
; ・grc_setclip()によるクリッピングに対応しています。
|
|
;
|
|
; AUTHOR:
|
|
; 恋塚昭彦
|
|
;
|
|
; 関連関数:
|
|
; grc_setclip()
|
|
;
|
|
; HISTORY:
|
|
; 92/7/27 Initial: gc_line.asmから分離
|
|
|
|
clipasm equ 1
|
|
|
|
; カットカット〜〜〜(x1,y1)を切断により変更する
|
|
; in: BH:o2, BL:o1
|
|
; out: BH:o2, BL:o1, o1がzeroならば zflag=1
|
|
public cutline
|
|
cutline proc near
|
|
; +-----+-----+-----+-----+-----+-----+-----+
|
|
; !AH AL!DH DL!BH BL!CH CL! SI ! DI ! BP !
|
|
; ! ! !o2:o1! x1 ! x2 ! y1 ! y2 !
|
|
; +-----+-----+-----+-----+-----+-----+-----+
|
|
|
|
or BL,BL
|
|
jz short @@CUTRET
|
|
test BL,YOKO_OUT
|
|
jz short @@CUTTATE
|
|
test BL,LEFT_OUT
|
|
jz short @@CUTAR
|
|
mov AX,ClipXL
|
|
jmp short @@CUTAE
|
|
EVEN
|
|
@@CUTAR:
|
|
mov AX,ClipXR
|
|
@@CUTAE:
|
|
sub CX,SI ; CX=x1-x2
|
|
jz short @@CUTRET
|
|
mov DX,DI ; DX=y1-y2
|
|
sub DX,BP ;
|
|
mov DI,AX ; DI=x1'
|
|
sub AX,SI ; AX = (x1'-x2)
|
|
imul DX ; * dy
|
|
idiv CX ; / dx
|
|
add AX,BP ; + y2
|
|
mov CX,DI ; CX=x1'
|
|
mov DI,AX ; DI=y1'
|
|
|
|
xor AX,AX
|
|
|
|
or DI,DI
|
|
js short @@CUTBE
|
|
mov AX,ClipYH
|
|
cmp DI,AX
|
|
jg short @@CUTBE
|
|
@@CUTIN: xor BL,BL ; この点は中に入ったぜ
|
|
@@CUTRET: or BX,BX ; もう完全に中にはいったかどうかをz flagで返す
|
|
ret
|
|
EVEN
|
|
|
|
@@CUTTATE:
|
|
xor AX,AX
|
|
test BL,BOTTOM_OUT
|
|
jz short @@CUTBE
|
|
mov AX,ClipYH
|
|
@@CUTBE:
|
|
sub DI,BP ; DI=y1-y2
|
|
jz short @@CUTRET
|
|
mov DX,CX ; DX=x1-x2
|
|
sub DX,SI ;
|
|
mov CX,AX ; CX=y1'
|
|
sub AX,BP ; AX = (y1'-y2)
|
|
imul DX ; * dx
|
|
idiv DI ; / dy
|
|
add AX,SI ; + x2
|
|
mov DI,CX ; DI=y1'
|
|
mov CX,AX ; CX=x1'
|
|
|
|
cmp ClipXL,CX
|
|
jle short @@CUTBE1
|
|
mov BL,LEFT_OUT ; 上ではじいてるから, zflagは 0 だよ
|
|
ret ; ここにもリターンが!!
|
|
EVEN
|
|
@@CUTBE1: cmp CX,ClipXR
|
|
jle short @@CUTIN
|
|
mov BL,RIGHT_OUT ; ここも zflag=0
|
|
ret ; ここにもリターンが!!
|
|
EVEN
|
|
cutline endp
|