misc/include/misc.mac
	.nlist
  .ifndef __misc_mac__
__misc_mac__	equ	1

	.include	doscall.mac
	.nlist
	.include	dosconst.equ
	.nlist
	.include	sysport.equ
	.nlist

;----------------------------------------------------------------
;
;	いろいろ
;
;----------------------------------------------------------------

;----------------------------------------------------------------
;68000か
;	スケールファクタが無視されたら68010以下、さもなくば68020以上
;	MOVEM.wl <list>,-(Ar)で<list>にArが含まれるとき実行前のArが書き込まれたら68010以下、さもなくば68020以上
;>dn.l:(dnを指定したとき)0=68010以下,1=68020以上
;>z:eq=68010以下,ne=68020以上
is68000	.macro	dn
	.sizem	sz,cn
  .if cn				;is68000 dn
	.cpu	68020
@base:
	moveq.l	#1,dn
	and.b	(@base-1,pc,dn.l*2),dn
	.cpu	68000
  .else					;is68000
	movem.l	sp,-(sp)
	cmpa.l	(sp)+,sp
  .endif
	.endm

;----------------------------------------------------------------
;SASI内蔵機か
;	$00E9602Dが$FFならばSASI内蔵機、さもなくばSCSI内蔵機
;	SASI内蔵機の$00E9602DはSASIリセットポート$00E96005のゴースト。ライトオンリーでリードは常に$FF
;	SCSI内蔵機の$00E9602DはSPCステータスポート。フルとエンプティは同時にセットされないので$FFにならない
;	どちらの場合もSASIバス、SCSIバスに影響を与えずリードできる
;	スーパーバイザモードで用いること
;	追加
;	X68000_MiSTerはSASI内蔵機だが$00E9602Dが$00なので$00もSASI内蔵機と見なす
;	SPCステータスポートのビジーとエンプティは同時にクリアされないので$00にならない
;>z:eq=SASI内蔵機,ne=SCSI内蔵機
isSASI	.macro
	cmpi.b	#$FF,$00E9602D		;$FF=SASI内蔵機,その他=SCSI内蔵機
  .if 1
	beq	@sasi
	tst.b	$00E9602D
@sasi:
  .endif
	.endm

;----------------------------------------------------------------
;X68030か
;	$00E8E00Bが$DCならばX68030、さもなくばX68000
;	スーパーバイザモードで用いること
;>z:eq=X68030,ne=X68000
isX68030	.macro
	cmpi.b	#$DC,SYSPORT_MODEL
	.endm

;----------------------------------------------------------------
;スーパーバイザモードとユーザモード
;	supervisormodeとusermodeを対で使うこと
;	ネストできる
;?d0.l
supervisormode	.macro
	clr.l	-(sp)
	DOS	_SUPER
	move.l	d0,(sp)
	.endm
usermode	.macro
	cmpi.l	#ALREADY_SUPERVISOR,(sp)
	beq	@nested
	DOS	_SUPER
@nested:
	addq.l	#4,sp
	.endm

;----------------------------------------------------------------
;割り込み禁止と割り込み許可
;	diとeiを対で使うこと
;	ネストできる
di	.macro
	move.w	sr,-(sp)
	ori.w	#$0700,sr
	.endm
ei	.macro
	move.w	(sp)+,sr
	.endm

;----------------------------------------------------------------
;SRAM書き込み許可とSRAM書き込み禁止
;	unlocksramとlocksramを対で使うこと
;	ネストさせないこと
unlocksram	.macro
	move.b	#$31,SYSPORT_SRAM	;SRAM書き込み制御。$31=許可,その他=禁止
	.endm
locksram	.macro
	clr.b	SYSPORT_SRAM		;SRAM書き込み制御。$31=許可,その他=禁止
	.endm

;----------------------------------------------------------------
;lea.l <ea>,dn
leadn	.macro	ea,dn
	exg.l	dn,a0
	lea.l	ea,a0
	exg.l	dn,a0
	.endm

;----------------------------------------------------------------
;文字列
leastr	.macro	str,an
	lea.l	@str(pc),an
	bra	@next
@str:
	.dc.b	str,0
	.even
@next:
	.endm

peastr	.macro	str
	pea.l	@str(pc)
	bra	@next
@str:
	.dc.b	str,0
	.even
@next:
	.endm

;----------------------------------------------------------------
;movestr <'str'>,dst
movestr	.macro	str,dst
	bsr	@pop
	.dc.b	str,0
	.even
@pop:
	move.l	(sp)+,dst
	.endm

;pushstr <'str'>
pushstr	.macro	str
	bsr	@pop
	.dc.b	str,0
	.even
@pop:
	.endm

;----------------------------------------------------------------
;データセクション文字列
leastrdata	.macro	str,an
	.data
@str:
	.dc.b	str,0
	.text
	lea.l	@str,an
	.endm

peastrdata	.macro	str
	.data
@str:
	.dc.b	str,0
	.text
	pea.l	@str
	.endm

;----------------------------------------------------------------
;bsccとbsncc
;	ccまたはnccがtrueのときbset、falseのときbclr
  .irp %cc,hi,ls,cc,hs,cs,lo,ne,nz,eq,ze,vc,vs,pl,mi,ge,lt,gt,le
bs%cc	.macro	src,dst
	.sizem	sz
	b%cc	@set
	bclr&&sz	src,dst
	bra	@end

@set:
	bset&&sz	src,dst
@end:
	.endm
bsn%cc	.macro	src,dst
	.sizem	sz
	bn%cc	@set
	bclr&&sz	src,dst
	bra	@end

@set:
	bset&&sz	src,dst
@end:
	.endm
  .endm

;----------------------------------------------------------------
;movejmpとmovejsr
movejmp	.macro	ea
	move.l	ea,-(sp)
	rts
	.endm
movejsr	.macro	ea
	pea.l	@ret
	move.l	ea,-(sp)		;eaがd16(sp)のとき4+d16(sp)と書かなければならない
	rts
@ret:
	.endm

;----------------------------------------------------------------
;色

setrgb	.macro	sym,rr,gg,bb
sym = (gg)<<11|(rr)<<6|(bb)<<1
	.endm

;	h	色相	0~31		赤~黄
;			32~63		黄~緑
;			64~95		緑~水
;			96~127		水~青
;			128~159	青~紫
;			160~191	紫~赤
;	s	彩度	0~31		白~原色
;	v	明度	0~31		黒~原色
sethsv	.macro	sym,hh,ss,vv
@hh = (hh)
@ss = (ss)
@vv = (vv)
@ii = @hh>>5
@ff = @hh.and.31
  .if	@ss=0
	setrgb	sym,@vv,@vv,@vv
  .else
@ww = @vv*(31-@ss)/31
@xx = @vv*(31*31-@ss*@ff)/(31*31)
@yy = @vv*(31*31-@ss*(31-@ff))/(31*31)
    .if @ii=0
	setrgb	sym,@vv,@yy,@ww
    .elif @ii=1
	setrgb	sym,@xx,@vv,@ww
    .elif @ii=2
	setrgb	sym,@ww,@vv,@yy
    .elif @ii=3
	setrgb	sym,@ww,@xx,@vv
    .elif @ii=4
	setrgb	sym,@yy,@ww,@vv
    .else
	setrgb	sym,@vv,@ww,@xx
    .endif
  .endif
	.endm

dcrgb	.macro	rr,gg,bb
	setrgb	@rgb,rr,gg,bb
	.dc.w	@rgb
	.endm

dchsv	.macro	hh,ss,vv
	sethsv	@rgb,hh,ss,vv
	.dc.w	@rgb
	.endm

movergb	.macro	rr,gg,bb,dst
	setrgb	@rgb,rr,gg,bb
	move.w	#@rgb,dst
	.endm

movehsv	.macro	hh,ss,vv,dst
	sethsv	@rgb,hh,ss,vv
	move.w	#@rgb,dst
	.endm

;----------------------------------------------------------------
;ビットマップシンボル
;	________	equ	0
;	_______M	equ	1
;	______M_	equ	2
;	______MM	equ	3
;	    :
;	MMMMMM__	equ	252
;	MMMMMM_M	equ	253
;	MMMMMMM_	equ	254
;	MMMMMMMM	equ	255
~defbm	.macro	m,n,a
  .if m<256
	~defbm	m*2,n,_&a
	~defbm	m*2,m+n,M&a
  .else
a	equ	n
  .endif
	.endm
	~defbm	1,0

;----------------------------------------------------------------

  .endif  ;__misc_mac__
	.list