ReC98/libs/master.lib/grcg_circle_x.asm

190 lines
2.5 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; master library - gc_poly - grcg - circle
;
; Description:
; 円描画(クリッピングなし)
;
; Function/Procedures:
; void grcg_circle_x( int x, int y, int r ) ;
;
; Parameters:
; x,y 中心座標
; r 半径 (1以上)
;
; Returns:
; none
;
; Binding Target:
; Microsoft-C / Turbo-C / Turbo Pascal
;
; Running Target:
; PC-9801V
;
; Requiring Resources:
; CPU: V30
; GRCG
;
; Notes:
; 半径が 0 ならば描画しません。
;
; Assembly Language Note:
;
;
; Compiler/Assembler:
; TASM 3.0
; OPTASM 1.6
;
; Author:
; 恋塚昭彦
;
; Revision History:
; 93/ 5/12 Initial:gc_circl.asm/master.lib 0.16
; 93/ 5/14 加速
; 95/ 2/20 縦倍モード対応
func GRCG_CIRCLE_X ; grcg_circle_x() {
push BP
mov BP,SP
push SI
push DI
push DS
; 引数
@@x = (RETSIZE+3)*2
@@y = (RETSIZE+2)*2
@@r = (RETSIZE+1)*2
mov DX,[BP+@@r] ; DX = 半径
; 半径が 0 なら描画しない
test DX,DX
jz short @@RETURN
mov AL,byte ptr graph_VramZoom
mov CS:GC_CIRCX_VRAMSHIFT1,AL
mov CS:GC_CIRCX_VRAMSHIFT2,AL
mov AX,[BP+@@y]
sub AX,ClipYT
mov BX,[BP+@@x]
mov DS,ClipYT_seg
mov CS:gc_circx_cx_,BX
mov CS:gc_circx_cy_1,AX
mov CS:gc_circx_cy_2,AX
xor AX,AX
mov BP,DX
jmp short @@LOOPSTART
EVEN
@@RETURN:
pop DS
pop DI
pop SI
pop BP
ret 6
EVEN
@@LOOPTOP:
stc ; BP -= AX*2+1;
sbb BP,AX ;
sub BP,AX ;
jns short @@LOOPCHECK
dec DX ; --DX;
add BP,DX ; BP += DX*2;
add BP,DX ;
@@LOOPCHECK:
inc AX ; ++AX;
cmp DX,AX
jl short @@RETURN
; DX == AX の場合も 2度描画してるう
; xor描画すると個の弧にきれるぞ
@@LOOPSTART:
push BP
JMOV BP,gc_circx_cx_
; in: DX = dx
; AX = dy
mov DI,AX
shr DI,9
org $-1
GC_CIRCX_VRAMSHIFT1 db ?
JMOV BX,gc_circx_cy_1
mov SI,BX
sub SI,DI
add DI,BX
mov BX,SI
shl SI,2
add SI,BX
shl SI,4
mov BX,DI
shl DI,2
add DI,BX
shl DI,4
mov BX,BP
sub BX,DX
mov CX,BX
shr BX,3
and CL,7
mov CH,80h
shr CH,CL
mov [BX+DI],CH
mov [BX+SI],CH
mov BX,BP
add BX,DX
mov CX,BX
shr BX,3
and CL,7
mov CH,80h
shr CH,CL
mov [BX+DI],CH
mov [BX+SI],CH
; in: AX = dx
; DX = dy
mov DI,DX
shr DI,9
org $-1
GC_CIRCX_VRAMSHIFT2 db ?
JMOV BX,gc_circx_cy_2
mov SI,BX
sub SI,DI
add DI,BX
mov BX,SI
shl SI,2
add SI,BX
shl SI,4
mov BX,DI
shl DI,2
add DI,BX
shl DI,4
mov BX,BP
sub BX,AX
mov CX,BX
shr BX,3
and CL,7
mov CH,80h
shr CH,CL
mov [BX+DI],CH
mov [BX+SI],CH
mov BX,BP
add BX,AX
mov CX,BX
shr BX,3
and CL,7
mov CH,80h
shr CH,CL
mov [BX+DI],CH
mov [BX+SI],CH
pop BP
jmp @@LOOPTOP
endfunc ; }