File:  [Isaki's NoNo m68k/m88k emulator] / nono / exp / rtldma1.has
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Wed Apr 29 17:05:20 2026 UTC (2 months, 3 weeks ago) by root
Branches: MAIN, Isaki
CVS tags: v027, v026, v025, v024, v023, v022, v021, v020, v019, v018, HEAD
nono 0.6.0

;
; nono
; Copyright (C) 2022 nono project
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions
; are met:
; 1. Redistributions of source code must retain the above copyright
;    notice, this list of conditions and the following disclaimer.
; 2. Redistributions in binary form must reproduce the above copyright
;    notice, this list of conditions and the following disclaimer in the
;    documentation and/or other materials provided with the distribution.
;
; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
; BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
; AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
; SUCH DAMAGE.

; RTL8019AS の DMA 転送の挙動を調べる。
; DCR.WTS (転送サイズ) と実際の DMA ポートのアクセス幅が異なる場合や
; RSAR が奇数アドレスから始まる場合にどうなるかとか。
; PROM 領域と RAM 領域ではサイズによる挙動が違うのでそれぞれ調べる。
; ただしその境界 ($3fff-$4001) で奇数だったら、については調べてない。
;
; WTS はアクセス後の、アドレスのインクリメントと残り転送バイト数の
; デクリメントを1回やるか2回やるかの切り替えのようだ。
; ここには書いてないが、ワード転送で RBCR=7 (奇数) にしても 8バイト
; (4ワード) 読み込める。
;
; これ実行後はネットワークが使えなくなるので Human68k を再起動すること。

		.include	doscall.mac
		.include	iocscall.mac
		.xref	hexstr_word
		.xref	hexstr_byte

RTL_BASE	.equ	0xece300
CR		.equ	0x00
RSAR0		.equ	0x10
RSAR1		.equ	0x12
RBCR0		.equ	0x14
RBCR1		.equ	0x16
DCR		.equ	0x1c
DMA		.equ	0x20

CR_RD		.equ	0x09
CR_WR		.equ	0x11

DCR_B		.equ	0x08
DCR_W		.equ	0x09

DMA_B		.equ	0
DMA_W		.equ	1

PRINT		.macro	str
		pea		str
		DOS		_PRINT
		addq.l	#4,sp
		.endm

		.cpu	68030
		.list
		.text
		.even
start:
		clr.l	-(sp)
		DOS	_SUPER
		addq.l	#4,sp

		clr.l	a4
		lea.l	RTL_BASE(a4),a4

		bsr	read_macaddr

		lea.l	testdata(pc),a2
mainloop:
		move.w	(a2)+,d3	; d3: start addr
		bmi	done		; If addr < 0, goto done.

		lea.l	dmabuf(pc),a0	; Clear dmabuf
		moveq.l	#0,d0
		move.l	d0,(a0)+
		move.l	d0,(a0)+
		move.l	d0,(a0)+
		move.l	d0,(a0)+

		lea.l	buf(pc),a0	; Display test parameters
		move.w	d3,d0
		swap	d0
		bsr	hexstr_word
		move.b	#'/',(a0)+

		move.w	(a2)+,d2	; d2: DCR
		move.w	d2,d0
		ror.l	#8,d0
		bsr	hexstr_byte
		move.b	#'/',(a0)+

		move.l	#(('D'<<24)|('M'<<16)|('A'<<8)|'_'),(a0)+
		move.w	(a2)+,d1	; d1: DMASizeIndex
		bne	@f
		move.b	#'B',(a0)+
		bra	@@f
@@:
		move.b	#'W',(a0)+
@@:
		clr.b	(a0)

		PRINT	buf(pc)

		move.w	d3,d0
		lsr.w	#8,d0		; if (start_addr >> 8 == 00)
		beq	@f		;  src is PROM, skip init_ram.
		bsr	init_ram
@@:
		lea.l	dmabuf(pc),a0
		move.b	d3,RSAR0(a4)	; Set registers
		move.b	d0,RSAR1(a4)
		move.b	#$10,RBCR0(a4)
		move.b	#$00,RBCR1(a4)
		move.b	d2,DCR(a4)
		move.b	#CR_RD,CR(a4)	; Issue Read command

		tst.b	d1		; DMASizeIndex
		bne	dma_word
dma_byte:
		moveq.l	#$10-1,d3
@@:
		move.b	DMA(a4),(a0)+
		dbra	d3,@b
		bra	verify

dma_word:
		moveq.l	#8-1,d3
@@:
		move.w	DMA(a4),(a0)+
		dbra	d3,@b

verify:
		lea.l	expected(pc),a1
		bsr	read_expected

		lea.l	dmabuf(pc),a0
		moveq.l	#16-1,d3
verify_byte:
		move.b	(a1)+,d0
		cmpi.b	#$fe,d0		; If expected==$fe, no check this byte
		beq	@f
		cmp.b	(a0),d0
		bne	fail
@@:
		adda.l	#1,a0
		dbra	d3,verify_byte

		; success
		PRINT	msg_ok(pc)
		bra	mainloop

fail:
		; At this point, a2 points begin of next testdata.
		PRINT	msg_fail(pc)
		lea.l	buf(pc),a0
		lea.l	expected(pc),a1
		moveq.l	#16-1,d3
@@:
		move.b	(a1)+,d0
		ror.l	#8,d0
		bsr	hexstr_byte
		dbra	d3,@b
		clr.b	(a0)
		PRINT	buf(pc)

		PRINT	msg_actual
		lea.l	buf(pc),a0
		lea.l	dmabuf(pc),a1
		moveq.l	#16-1,d3
@@:
		move.b	(a1)+,d0
		ror.l	#8,d0
		bsr	hexstr_byte
		dbra	d3,@b
		clr.b	(a0)
		PRINT	buf(pc)

		PRINT	msg_crlf
		bra	mainloop

done:
		DOS	_EXIT


read_macaddr:
		; Read MAC addr using correct way.
		moveq.l	#0,d0
		move.b	d0,RSAR0(a4)
		move.b	d0,RSAR1(a4)
		move.b	#12,RBCR0(a4)
		move.b	d0,RBCR1(a4)
		move.b	#DCR_W,DCR(a4)
		move.b	#CR_RD,CR(a4)

		moveq.l	#6-1,d3
		lea.l	macaddr(pc),a0
@@:
		move.w	DMA(a4),d0
		ror.w	#8,d0
		move.b	d0,(a0)+
		dbra	d3,@b
		rts

init_ram:
		movem.l	d0/d3,-(sp)
		move.b	#$00,RSAR0(a4)
		move.b	#$40,RSAR1(a4)
		move.b	#$20,RBCR0(a4)
		move.b	#$00,RBCR1(a4)
		move.b	#DCR_W,DCR(a4)
		move.b	#CR_WR,CR(a4)
		move.w	#$1011,d0
		moveq.l	#16-1,d3
@@:
		move.w	d0,DMA(a4)
		addi.w	#$0202,d0
		dbra	d3,@b
		movem.l	(sp)+,d0/d3
		rts

; IN a1: destination buffer (expected), don't change a1
;    a2: source buffer, don't save a2
read_expected:
		movem.l	d0/d3/a0-a1/a3,-(sp)
		lea.l	macaddr(pc),a3
		moveq.l	#0,d0
		moveq.l	#16-1,d3
@@:
		move.b	(a2)+,d0
		cmpi.w	#$fe,d0
		bge	@f
		cmpi.w	#$f0,d0
		blt	@f
		; If $f0 <= d0 < $fe, replace them to mac addr
		subi.b	#$f0,d0
		;move.b	0(a3,d0.b*1),d0
		movea.l	a3,a0
		add.l	d0,a0
		move.b	(a0),d0
@@:
		move.b	d0,(a1)+
		dbra	d3,@@b
		movem.l	(sp)+,d0/d3/a0-a1/a3
		rts


testdata:
 ;	RSAR   DCR    DMA    Expected($f0-$f5: MACaddr, $fe: ignore)
 .dc.w	$0000, DCR_W, DMA_W, $f0ff,$f1ff,$f2ff,$f3ff, $f4ff,$f5ff,$ffff,$ffff
 .dc.w	$0001, DCR_W, DMA_W, $f0ff,$f1ff,$f2ff,$f3ff, $f4ff,$f5ff,$ffff,$ffff
 .dc.w	$4000, DCR_W, DMA_W, $1011,$1213,$1415,$1617, $1819,$1a1b,$1c1d,$1e1f
 .dc.w	$4001, DCR_W, DMA_W, $1011,$1213,$1415,$1617, $1819,$1a1b,$1c1d,$1e1f

 .dc.w	$0000, DCR_B, DMA_W, $f0ff,$f0ff,$f1ff,$f1ff, $f2ff,$f2ff,$f3ff,$f3ff
 .dc.w	$0001, DCR_B, DMA_W, $f0ff,$f1ff,$f1ff,$f2ff, $f2ff,$f3ff,$f3ff,$f4ff
 .dc.w	$4000, DCR_B, DMA_W, $1011,$fefe,$1213,$fefe, $1415,$fefe,$1617,$fefe
 .dc.w	$4001, DCR_B, DMA_W, $fefe,$1213,$fefe,$1415, $fefe,$1617,$fefe,$1819

 ; XXX +7バイト目から不定($22 が読める)になるのが謎
 .dc.w	$0000, DCR_W, DMA_B, $f0f1,$f2f3,$f4f5,$fffe, $fefe,$fefe,$fefe,$fefe
 .dc.w	$0001, DCR_W, DMA_B, $f0f1,$f2f3,$f4f5,$ffff, $fefe,$fefe,$fefe,$fefe
 .dc.w	$4000, DCR_W, DMA_B, $1012,$1416,$181a,$1c1e, $2020,$2020,$2020,$2020
 .dc.w	$4001, DCR_W, DMA_B, $1012,$1416,$181a,$1c1e, $2020,$2020,$2020,$2020

 .dc.w	$0000, DCR_B, DMA_B, $f0f0,$f1f1,$f2f2,$f3f3, $f4f4,$f5f5,$ffff,$ffff
 .dc.w	$0001, DCR_B, DMA_B, $f0f1,$f1f2,$f2f3,$f3f4, $f4f5,$f5ff,$ffff,$ffff
 .dc.w	$4000, DCR_B, DMA_B, $10fe,$12fe,$14fe,$16fe, $18fe,$1afe,$1cfe,$1efe
 .dc.w	$4001, DCR_B, DMA_B, $fe12,$fe14,$fe16,$fe18, $fe1a,$fe1c,$fe1e,$fe20

 .dc.w	$ffff	; Sentinel

msg_fail:	.dc.b	" failed",$d,$a
		.dc.b	" Expected ",0
msg_actual:	.dc.b	$d,$a," Actual   ",0
msg_ok:		.dc.b	" OK",$d,$a,0
msg_crlf:	.dc.b	$d,$a,0

		.even
macaddr:	.ds.b	6
		.align	4
expected:	.ds.b	16
dmabuf:		.ds.b	32

buf:		.ds.b	64

		.end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.