;// 共通ルーチン //
*LIB_Define
numalias LIB_VARNUM,500

numalias LIB_Arg1,LIB_VARNUM
numalias LIB_Arg2,LIB_VARNUM+1
numalias LIB_Arg3,LIB_VARNUM+2
numalias LIB_Tmp,LIB_VARNUM+3

;// xyloop
numalias LIB_VARNUM_XYLOOP,LIB_VARNUM+4
; string
numalias LIB_Routine,LIB_VARNUM_XYLOOP
numalias LIB_Xyloop,LIB_VARNUM_XYLOOP+1
; int
numalias LIB_XCount,LIB_VARNUM_XYLOOP
numalias LIB_YCount,LIB_VARNUM_XYLOOP+1
numalias LIB_XEnd,LIB_VARNUM_XYLOOP+2
numalias LIB_YEnd,LIB_VARNUM_XYLOOP+3
numalias LIB_XStep,LIB_VARNUM_XYLOOP+4
numalias LIB_YStep,LIB_VARNUM_XYLOOP+5
numalias LIB_Break,LIB_VARNUM_XYLOOP+6

;// debug
numalias LIB_DEBUG,1
numalias LIB_DEBUG_OUTPUT_MESSAGEBOX,0

defsub incary
defsub decary
defsub addary
defsub subary
defsub mulary
defsub divary
defsub incary2
defsub decary2
; xyloop
defsub xyloop
defsub xyloopct
defsub xyloopbreak
; debug
defsub traceint
defsub tracexy
defsub traceary
defsub die
defsub inittimer
defsub gettimerstr
return

*incary
getparam %LIB_Arg1,%LIB_Arg2
mov ?%LIB_Arg1[%LIB_Arg2],?%LIB_Arg1[%LIB_Arg2]+1
return

*decary
getparam %LIB_Arg1,%LIB_Arg2
mov ?%LIB_Arg1[%LIB_Arg2],?%LIB_Arg1[%LIB_Arg2]-1
return

*addary
getparam %LIB_Arg1,%LIB_Arg2,%LIB_Arg3
mov ?%LIB_Arg1[%LIB_Arg2],?%LIB_Arg1[%LIB_Arg2]+%LIB_Arg3
return

*subary
getparam %LIB_Arg1,%LIB_Arg2,%LIB_Arg3
mov ?%LIB_Arg1[%LIB_Arg2],?%LIB_Arg1[%LIB_Arg2]-%LIB_Arg3
return

*mulary
getparam %LIB_Arg1,%LIB_Arg2,%LIB_Arg3
mov ?%LIB_Arg1[%LIB_Arg2],?%LIB_Arg1[%LIB_Arg2]*%LIB_Arg3
return

*divary
getparam %LIB_Arg1,%LIB_Arg2,%LIB_Arg3
mov ?%LIB_Arg1[%LIB_Arg2],?%LIB_Arg1[%LIB_Arg2]/%LIB_Arg3
return

*modary
getparam %LIB_Arg1,%LIB_Arg2,%LIB_Arg3
mov %LIB_Tmp,?%LIB_Arg1[%LIB_Arg2]
mod %LIB_Tmp,%LIB_Arg3
mov ?%LIB_Arg1[%LIB_Arg2],%LIB_Tmp
return

*incary2
getparam %LIB_Arg1,%LIB_Arg2,%LIB_Arg3
mov ?%LIB_Arg1[%LIB_Arg2][%LIB_Arg3],?%LIB_Arg1[%LIB_Arg2][%LIB_Arg3]+1
return

*decary2
getparam %LIB_Arg1,%LIB_Arg2,%LIB_Arg3
mov ?%LIB_Arg1[%LIB_Arg2][%LIB_Arg3],?%LIB_Arg1[%LIB_Arg2][%LIB_Arg3]-1
return

; 2次元ループ
; サブルーチン、X初期値、Y初期値、X終端値、Y終端値、X加算値、Y加算値
; ステートメントのため、他のライブラリルーチンと引数を分ける必要有り
*xyloop
getparam $LIB_Routine,%LIB_XCount,%LIB_YCount,%LIB_XEnd,%LIB_YEnd,%LIB_XStep,%LIB_YStep
mov %LIB_Break,0 ; 強制終了フラグ
if %LIB_XStep=0 & %LIB_YStep=0 die "xyloop - Not Indicated Step"
if %LIB_XStep>0 & %LIB_YStep=0 mov $LIB_Xyloop,"*xyloop_xloop1":goto $LIB_Xyloop
if %LIB_XStep<0 & %LIB_YStep=0 mov $LIB_Xyloop,"*xyloop_xloop2":goto $LIB_Xyloop
if %LIB_XStep=0 & %LIB_YStep>0 mov $LIB_Xyloop,"*xyloop_yloop1":goto $LIB_Xyloop
if %LIB_XStep=0 & %LIB_YStep<0 mov $LIB_Xyloop,"*xyloop_yloop2":goto $LIB_Xyloop
if %LIB_XStep>0 & %LIB_YStep>0 mov $LIB_Xyloop,"*xyloop_loop1":goto $LIB_Xyloop
if %LIB_XStep>0 & %LIB_YStep<0 mov $LIB_Xyloop,"*xyloop_loop2":goto $LIB_Xyloop
if %LIB_XStep<0 & %LIB_YStep>0 mov $LIB_Xyloop,"*xyloop_loop3":goto $LIB_Xyloop
mov $LIB_Xyloop,"*xyloop_loop4":goto $LIB_Xyloop ; if %LIB_XStep<0 & %LIB_YStep<0
*xyloop_xloop1
if %LIB_XCount>%LIB_XEnd return
goto *xyloop_main
*xyloop_xloop2
if %LIB_XCount<%LIB_XEnd return
goto *xyloop_main
*xyloop_yloop1
if %LIB_YCount>%LIB_YEnd return
goto *xyloop_main
*xyloop_yloop2
if %LIB_YCount<%LIB_YEnd return
goto *xyloop_main
*xyloop_loop1
if %LIB_XCount>%LIB_XEnd return
if %LIB_YCount>%LIB_YEnd return
goto *xyloop_main
*xyloop_loop2
if %LIB_XCount>%LIB_XEnd return
if %LIB_YCount<%LIB_YEnd return
goto *xyloop_main
*xyloop_loop3
if %LIB_XCount<%LIB_XEnd return
if %LIB_YCount>%LIB_YEnd return
goto *xyloop_main
*xyloop_loop4
if %LIB_XCount<%LIB_XEnd return
if %LIB_YCount<%LIB_YEnd return
goto *xyloop_main
*xyloop_main
gosub $LIB_Routine
if %LIB_Break=1 return
add %LIB_XCount,%LIB_XStep
add %LIB_YCount,%LIB_YStep
goto $LIB_Xyloop

; xyloopのカウンタ値取得
; こっちは単なるルーチンなので、引数は通常どおり
; xyloopによるサブルーチン内でのみ意味がある
*xyloopct
getparam i%LIB_Arg1,i%LIB_Arg2
mov %%LIB_Arg1,%LIB_XCount
mov %%LIB_Arg2,%LIB_YCount
return

; xyloopの強制離脱
; xyloopによるサブルーチン内でのみ意味がある
*xyloopbreak
mov %LIB_Break,1
return

;// debug

*traceint
getparam %LIB_Arg1
if LIB_DEBUG!=1 return
itoa $LIB_Arg1,%LIB_Arg1
mov $LIB_Arg3,"TRACE-INT"
if LIB_DEBUG_OUTPUT_MESSAGEBOX=1 mesbox $LIB_Arg1,$LIB_Arg3:return
add $LIB_Arg3,$LIB_Arg1
LogOutput $LIB_Arg3
return

*tracexy
getparam %LIB_Arg1,%LIB_Arg2
if LIB_DEBUG!=1 return
itoa $LIB_Arg1,%LIB_Arg1
itoa $LIB_Arg2,%LIB_Arg2
add $LIB_Arg1,",":add $LIB_Arg1,$LIB_Arg2
mov $LIB_Arg3,"TRACE-X,Y"
if LIB_DEBUG_OUTPUT_MESSAGEBOX=1 mesbox $LIB_Arg1,$LIB_Arg3:return
add $LIB_Arg3,$LIB_Arg1
LogOutput $LIB_Arg3
return

*traceary
getparam %LIB_Arg1,%LIB_Arg2
if LIB_DEBUG!=1 return
itoa $LIB_Arg1,?%LIB_Arg1[0]
for %LIB_Tmp=1 to %LIB_Arg2
	add $LIB_Arg1,","
	itoa $LIB_Tmp,?%LIB_Arg1[%LIB_Tmp]:add $LIB_Arg1,$LIB_Tmp
next
mov $LIB_Arg3,"TRACE-ARRAY"
if LIB_DEBUG_OUTPUT_MESSAGEBOX=1 mesbox $LIB_Arg1,$LIB_Arg3:return
add $LIB_Arg3,$LIB_Arg1
LogOutput $LIB_Arg3
return

*die
getparam $LIB_Arg1
mesbox $LIB_Arg1,"DIE-APPLICATION"
end

*inittimer
resettimer
return

*gettimerstr
getparam s%LIB_Arg1
gettimer %LIB_Arg2
itoa $%LIB_Arg1,%LIB_Arg2
return