|
|
1.1 root 1: ;
2: ; nono
3: ; Copyright (C) 2022 nono project
4: ;
5: ; Redistribution and use in source and binary forms, with or without
6: ; modification, are permitted provided that the following conditions
7: ; are met:
8: ; 1. Redistributions of source code must retain the above copyright
9: ; notice, this list of conditions and the following disclaimer.
10: ; 2. Redistributions in binary form must reproduce the above copyright
11: ; notice, this list of conditions and the following disclaimer in the
12: ; documentation and/or other materials provided with the distribution.
13: ;
14: ; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15: ; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16: ; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17: ; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18: ; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
19: ; BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20: ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
21: ; AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22: ; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23: ; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24: ; SUCH DAMAGE.
25:
26: ; RTL8019AS の DMA 転送の挙動を調べる。
27: ; DCR.WTS (転送サイズ) と実際の DMA ポートのアクセス幅が異なる場合や
28: ; RSAR が奇数アドレスから始まる場合にどうなるかとか。
29: ; PROM 領域と RAM 領域ではサイズによる挙動が違うのでそれぞれ調べる。
30: ; ただしその境界 ($3fff-$4001) で奇数だったら、については調べてない。
31: ;
32: ; WTS はアクセス後の、アドレスのインクリメントと残り転送バイト数の
33: ; デクリメントを1回やるか2回やるかの切り替えのようだ。
34: ; ここには書いてないが、ワード転送で RBCR=7 (奇数) にしても 8バイト
35: ; (4ワード) 読み込める。
36: ;
37: ; これ実行後はネットワークが使えなくなるので Human68k を再起動すること。
38:
39: .include doscall.mac
40: .include iocscall.mac
41: .xref hexstr_word
42: .xref hexstr_byte
43:
44: RTL_BASE .equ 0xece300
45: CR .equ 0x00
46: RSAR0 .equ 0x10
47: RSAR1 .equ 0x12
48: RBCR0 .equ 0x14
49: RBCR1 .equ 0x16
50: DCR .equ 0x1c
51: DMA .equ 0x20
52:
53: CR_RD .equ 0x09
54: CR_WR .equ 0x11
55:
56: DCR_B .equ 0x08
57: DCR_W .equ 0x09
58:
59: DMA_B .equ 0
60: DMA_W .equ 1
61:
62: PRINT .macro str
63: pea str
64: DOS _PRINT
65: addq.l #4,sp
66: .endm
67:
68: .cpu 68030
69: .list
70: .text
71: .even
72: start:
73: clr.l -(sp)
74: DOS _SUPER
75: addq.l #4,sp
76:
77: clr.l a4
78: lea.l RTL_BASE(a4),a4
79:
80: bsr read_macaddr
81:
82: lea.l testdata(pc),a2
83: mainloop:
84: move.w (a2)+,d3 ; d3: start addr
85: bmi done ; If addr < 0, goto done.
86:
87: lea.l dmabuf(pc),a0 ; Clear dmabuf
88: moveq.l #0,d0
89: move.l d0,(a0)+
90: move.l d0,(a0)+
91: move.l d0,(a0)+
92: move.l d0,(a0)+
93:
94: lea.l buf(pc),a0 ; Display test parameters
95: move.w d3,d0
96: swap d0
97: bsr hexstr_word
98: move.b #'/',(a0)+
99:
100: move.w (a2)+,d2 ; d2: DCR
101: move.w d2,d0
102: ror.l #8,d0
103: bsr hexstr_byte
104: move.b #'/',(a0)+
105:
106: move.l #(('D'<<24)|('M'<<16)|('A'<<8)|'_'),(a0)+
107: move.w (a2)+,d1 ; d1: DMASizeIndex
108: bne @f
109: move.b #'B',(a0)+
110: bra @@f
111: @@:
112: move.b #'W',(a0)+
113: @@:
114: clr.b (a0)
115:
116: PRINT buf(pc)
117:
118: move.w d3,d0
119: lsr.w #8,d0 ; if (start_addr >> 8 == 00)
120: beq @f ; src is PROM, skip init_ram.
121: bsr init_ram
122: @@:
123: lea.l dmabuf(pc),a0
124: move.b d3,RSAR0(a4) ; Set registers
125: move.b d0,RSAR1(a4)
126: move.b #$10,RBCR0(a4)
127: move.b #$00,RBCR1(a4)
128: move.b d2,DCR(a4)
129: move.b #CR_RD,CR(a4) ; Issue Read command
130:
131: tst.b d1 ; DMASizeIndex
132: bne dma_word
133: dma_byte:
134: moveq.l #$10-1,d3
135: @@:
136: move.b DMA(a4),(a0)+
137: dbra d3,@b
138: bra verify
139:
140: dma_word:
141: moveq.l #8-1,d3
142: @@:
143: move.w DMA(a4),(a0)+
144: dbra d3,@b
145:
146: verify:
147: lea.l expected(pc),a1
148: bsr read_expected
149:
150: lea.l dmabuf(pc),a0
151: moveq.l #16-1,d3
152: verify_byte:
153: move.b (a1)+,d0
154: cmpi.b #$fe,d0 ; If expected==$fe, no check this byte
155: beq @f
156: cmp.b (a0),d0
157: bne fail
158: @@:
159: adda.l #1,a0
160: dbra d3,verify_byte
161:
162: ; success
163: PRINT msg_ok(pc)
164: bra mainloop
165:
166: fail:
167: ; At this point, a2 points begin of next testdata.
168: PRINT msg_fail(pc)
169: lea.l buf(pc),a0
170: lea.l expected(pc),a1
171: moveq.l #16-1,d3
172: @@:
173: move.b (a1)+,d0
174: ror.l #8,d0
175: bsr hexstr_byte
176: dbra d3,@b
177: clr.b (a0)
178: PRINT buf(pc)
179:
180: PRINT msg_actual
181: lea.l buf(pc),a0
182: lea.l dmabuf(pc),a1
183: moveq.l #16-1,d3
184: @@:
185: move.b (a1)+,d0
186: ror.l #8,d0
187: bsr hexstr_byte
188: dbra d3,@b
189: clr.b (a0)
190: PRINT buf(pc)
191:
192: PRINT msg_crlf
193: bra mainloop
194:
195: done:
196: DOS _EXIT
197:
198:
199: read_macaddr:
200: ; Read MAC addr using correct way.
201: moveq.l #0,d0
202: move.b d0,RSAR0(a4)
203: move.b d0,RSAR1(a4)
204: move.b #12,RBCR0(a4)
205: move.b d0,RBCR1(a4)
206: move.b #DCR_W,DCR(a4)
207: move.b #CR_RD,CR(a4)
208:
209: moveq.l #6-1,d3
210: lea.l macaddr(pc),a0
211: @@:
212: move.w DMA(a4),d0
213: ror.w #8,d0
214: move.b d0,(a0)+
215: dbra d3,@b
216: rts
217:
218: init_ram:
219: movem.l d0/d3,-(sp)
220: move.b #$00,RSAR0(a4)
221: move.b #$40,RSAR1(a4)
222: move.b #$20,RBCR0(a4)
223: move.b #$00,RBCR1(a4)
224: move.b #DCR_W,DCR(a4)
225: move.b #CR_WR,CR(a4)
226: move.w #$1011,d0
227: moveq.l #16-1,d3
228: @@:
229: move.w d0,DMA(a4)
230: addi.w #$0202,d0
231: dbra d3,@b
232: movem.l (sp)+,d0/d3
233: rts
234:
235: ; IN a1: destination buffer (expected), don't change a1
236: ; a2: source buffer, don't save a2
237: read_expected:
238: movem.l d0/d3/a0-a1/a3,-(sp)
239: lea.l macaddr(pc),a3
240: moveq.l #0,d0
241: moveq.l #16-1,d3
242: @@:
243: move.b (a2)+,d0
244: cmpi.w #$fe,d0
245: bge @f
246: cmpi.w #$f0,d0
247: blt @f
248: ; If $f0 <= d0 < $fe, replace them to mac addr
249: subi.b #$f0,d0
250: ;move.b 0(a3,d0.b*1),d0
251: movea.l a3,a0
252: add.l d0,a0
253: move.b (a0),d0
254: @@:
255: move.b d0,(a1)+
256: dbra d3,@@b
257: movem.l (sp)+,d0/d3/a0-a1/a3
258: rts
259:
260:
261: testdata:
262: ; RSAR DCR DMA Expected($f0-$f5: MACaddr, $fe: ignore)
263: .dc.w $0000, DCR_W, DMA_W, $f0ff,$f1ff,$f2ff,$f3ff, $f4ff,$f5ff,$ffff,$ffff
264: .dc.w $0001, DCR_W, DMA_W, $f0ff,$f1ff,$f2ff,$f3ff, $f4ff,$f5ff,$ffff,$ffff
265: .dc.w $4000, DCR_W, DMA_W, $1011,$1213,$1415,$1617, $1819,$1a1b,$1c1d,$1e1f
266: .dc.w $4001, DCR_W, DMA_W, $1011,$1213,$1415,$1617, $1819,$1a1b,$1c1d,$1e1f
267:
268: .dc.w $0000, DCR_B, DMA_W, $f0ff,$f0ff,$f1ff,$f1ff, $f2ff,$f2ff,$f3ff,$f3ff
269: .dc.w $0001, DCR_B, DMA_W, $f0ff,$f1ff,$f1ff,$f2ff, $f2ff,$f3ff,$f3ff,$f4ff
270: .dc.w $4000, DCR_B, DMA_W, $1011,$fefe,$1213,$fefe, $1415,$fefe,$1617,$fefe
271: .dc.w $4001, DCR_B, DMA_W, $fefe,$1213,$fefe,$1415, $fefe,$1617,$fefe,$1819
272:
273: ; XXX +7バイト目から不定($22 が読める)になるのが謎
274: .dc.w $0000, DCR_W, DMA_B, $f0f1,$f2f3,$f4f5,$fffe, $fefe,$fefe,$fefe,$fefe
275: .dc.w $0001, DCR_W, DMA_B, $f0f1,$f2f3,$f4f5,$ffff, $fefe,$fefe,$fefe,$fefe
276: .dc.w $4000, DCR_W, DMA_B, $1012,$1416,$181a,$1c1e, $2020,$2020,$2020,$2020
277: .dc.w $4001, DCR_W, DMA_B, $1012,$1416,$181a,$1c1e, $2020,$2020,$2020,$2020
278:
279: .dc.w $0000, DCR_B, DMA_B, $f0f0,$f1f1,$f2f2,$f3f3, $f4f4,$f5f5,$ffff,$ffff
280: .dc.w $0001, DCR_B, DMA_B, $f0f1,$f1f2,$f2f3,$f3f4, $f4f5,$f5ff,$ffff,$ffff
281: .dc.w $4000, DCR_B, DMA_B, $10fe,$12fe,$14fe,$16fe, $18fe,$1afe,$1cfe,$1efe
282: .dc.w $4001, DCR_B, DMA_B, $fe12,$fe14,$fe16,$fe18, $fe1a,$fe1c,$fe1e,$fe20
283:
284: .dc.w $ffff ; Sentinel
285:
286: msg_fail: .dc.b " failed",$d,$a
287: .dc.b " Expected ",0
288: msg_actual: .dc.b $d,$a," Actual ",0
289: msg_ok: .dc.b " OK",$d,$a,0
290: msg_crlf: .dc.b $d,$a,0
291:
292: .even
293: macaddr: .ds.b 6
294: .align 4
295: expected: .ds.b 16
296: dmabuf: .ds.b 32
297:
298: buf: .ds.b 64
299:
300: .end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.