misc/cir.s
;========================================================================================
;  cir.s
;  Copyright (C) 2003-2019 Makoto Kamada
;
;  This file is part of the XEiJ (X68000 Emulator in Java).
;  You can use, modify and redistribute the XEiJ if the conditions are met.
;  Read the XEiJ License for more details.
;  https://stdkmd.net/xeij/
;========================================================================================

;----------------------------------------------------------------
;
;	マザーボードコプロセッサのCIRを読み書きする簡易ツール
;
;	> cir オフセット .またはデータ …
;
;	実行例はCIRのソースコードの注釈を参照
;
;----------------------------------------------------------------

	.include	doscall.mac

	.text

	clr.l	-(sp)
	DOS	_SUPER
	move.l	d0,(sp)

	cmpi.b	#6,$0CBC.w
	bne	9f			;not MC68060

	lea.l	1(a2),a0

	bsr	stoh			;offset
	bcs	9f
	cmp.l	#31,d0
	bhi	9f

;read word
;	$00(response)
;	$04(save)
;	$06(restore)
;	$08(operation word)
;	$14(register select)
;read long
;	$10(operand)
;	$1C(operand address)
;write word
;	$02(control)
;	$06(restore)
;	$08(operation word)
;	$0A(command)
;	$0E(condition)
;write long
;	$10(operand)
;	$18(instruction address)
;	$1C(operand address)

;		  00000000000000001111111111111111
;		  0123456789ABCDEF0123456789ABCDEF
	move.l	#%10101010101000101000100010001000,d1
	lsl.l	d0,d1
	bpl	9f			;cannot access

;		  00000000000000001111111111111111
;		  0123456789ABCDEF0123456789ABCDEF
	move.l	#%10001010100000001000100000001000,d1
	lsl.l	d0,d1
	smi.b	d2			;can read

;		  00000000000000001111111111111111
;		  0123456789ABCDEF0123456789ABCDEF
	move.l	#%00100010101000101000000010001000,d1
	lsl.l	d0,d1
	smi.b	d3			;can write

;		  00000000000000001111111111111111
;		  0123456789ABCDEF0123456789ABCDEF
	move.l	#%00000000000000001000000010001000,d1
	lsl.l	d0,d1
	smi.b	d4			;long

	.cpu	68060

	movea.l	a0,a2
	lea.l	$00022000,a1
	adda.l	d0,a1

	moveq.l	#7,d0
	movec.l	d0,sfc
	movec.l	d0,dfc

1:	move.b	(a2)+,d1
	beq	8f
	cmp.b	#' ',d1
	beq	1b
	cmp.b	#9,d1
	beq	1b
	cmp.b	#'.',d1
	bne	4f
;read
	tst.b	d2
	beq	8f			;cannot read
	tst.b	d4
	bne	2f			;read long
;read word
	moves.w	(a1),d0
	lea.l	buffer(pc),a0
	bsr	htos4
	bra	3f

;read long
2:	moves.l	(a1),d0
	lea.l	buffer(pc),a0
	bsr	htos8
3:	move.b	#' ',(a0)+
	sf.b	(a0)
	pea.l	buffer(pc)
	DOS	_PRINT
	addq.l	#4,sp
	bra	1b

;write
4:	subq.l	#1,a2
	movea.l	a2,a0
	bsr	stoh			;data
	bcs	8f
	movea.l	a0,a2
	tst.b	d3
	beq	8f			;cannot write
	tst.b	d4
	bne	5f			;write long
;write word
	moves.w	d0,(a1)
	bra	1b

;write long
5:	moves.l	d0,(a1)
	bra	1b

8:	pea.l	crlf
	DOS	_PRINT
	addq.l	#4,sp

	.cpu	68000

9:	DOS	_SUPER
	addq.l	#4,sp

	DOS	_EXIT

crlf:
	.dc.b	13,10,0
	.even

	.bss

buffer:
	.ds.b	1024

	.text

htos4:
	movem.l	d1-d2,-(sp)
	moveq.l	#4-1,d2
1:	rol.w	#4,d0
	moveq.l	#$0F,d1
	and.b	d0,d1
	move.b	2f(pc,d1.w),(a0)+
	dbra	d2,1b
	sf.b	(a0)
	movem.l	(sp)+,d1-d2
	rts

htos8:
	movem.l	d1-d2,-(sp)
	moveq.l	#8-1,d2
1:	rol.l	#4,d0
	moveq.l	#$0F,d1
	and.b	d0,d1
	move.b	2f(pc,d1.w),(a0)+
	dbra	d2,1b
	sf.b	(a0)
	movem.l	(sp)+,d1-d2
	rts

2:	.dc.b	'0123456789ABCDEF'

stoh:
	movem.l	d1,-(sp)
	moveq.l	#0,d0
1:	move.b	(a0)+,d1
	cmp.b	#' ',d1
	beq	1b
	cmp.b	#9,d1
	beq	1b
	tst.b	d1
	beq	2f
	cmp.b	#'0',d1
	blo	2f
	cmp.b	#'9',d1
	bls	4f
	and.b	#$DF,d1
	cmp.b	#'A',d1
	blo	2f
	cmp.b	#'F',d1
	bls	3f
2:	move.w	#1,ccr
	bra	7f

3:	subq.b	#'A'-('9'+1),d1
4:	sub.b	#'0',d1
	cmp.l	#$0FFFFFFF,d0
	bhi	2b
	lsl.l	#4,d0
	or.b	d1,d0
5:	move.b	(a0)+,d1
	cmp.b	#'0',d1
	blo	6f
	cmp.b	#'9',d1
	bls	4b
	and.b	#$DF,d1
	cmp.b	#'A',d1
	blo	6f
	cmp.b	#'F',d1
	bls	3b
6:	tst.l	d0
7:	subq.l	#1,a0
	movem.l	(sp)+,d1
	rts