|
|
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: ;
27: ; m68030 PTEST 命令のテスト
28: ;
29:
30: ; How to build
31: ; > has ptest1.has
32: ; > hlk ptest1.o si_util.o
33:
34: .include doscall.mac
35: .include iocscall.mac
36: .xref hexstr_word
37: .xref hexstr_long
38: .xref decstr
39:
40: MMUSR_B .equ 0x8000
41: MMUSR_L .equ 0x4000
42: MMUSR_S .equ 0x2000
43: MMUSR_W .equ 0x0800
44: MMUSR_I .equ 0x0400
45: MMUSR_M .equ 0x0200
46: MMUSR_T .equ 0x0040
47: MMUSR_N .equ 0x0007
48:
49: PRINT .macro str
50: movem.l a1,-(sp)
51: lea.l str,a1
52: IOCS _B_PRINT
53: movem.l (sp)+,a1
54: .endm
55:
56: .cpu 68030
57: .list
58: .text
59: .even
60: start:
61: clr.l -(sp)
62: DOS _SUPER
63: addq.l #4,sp
64:
65: ; F ライン例外ハンドラを差し替える
66: movec vbr,a0
67: move.l 44(a0),fline_backup
68: lea.l fline_handler,a1
69: move.l a1,44(a0)
70:
71: ; MMU テーブルを作成。
72: ;
73: ; $00'000000 +
74: ; | Pass through (1:1 mapping)
75: ; $ed0000 .. $ed7fff | TIB で WP をセット。ここは SRAM。
76: ; $f00000 .. $ffffff | TIA で WP をセット。ここは ROM。
77: ; $01'000000 +
78: ; | Invalid
79: ; $02'000000 +
80: ; | TT0 アクセス用に使う
81: ; $03'000000 +
82: ; :
83: ;
84: ; 3 2 1 0
85: ; 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
86: ; +-------------+---------+---------+-----------------------------+
87: ; |I I I I I I I|A A A A A|B B B B B|P P P P P P P P P P P P P P P|
88: ; +-------------+---------+---------+-----------------------------+
89: ; IS=7 TIA=5 TIB=5 PS=15
90: ; 32MB 1MB 32KB
91: ;
92: ; 1段目 = 32 [entry] * 4 [byte] = 128 [byte]
93: ; 2段目 = 32 [entry] * 4 [byte] = 128 [byte] / 1段目エントリ
94: NUM_A .equ 32
95: NUM_B .equ 32
96:
97: ; Table A を作成。
98: ; 前半 16 エントリ(16MB) が X68k 全空間に相当し tableB を指す。
99: ; 後半 16 エントリ(16MB) は Invalid にする。
100: lea.l tableB,a0
101: move.l a0,d0
102: lea.l tableA,a0
103: addq.l #2,d0 ; DT=Short
104: moveq.l #(NUM_A/2-1),d2 ; First half
105: @@:
106: move.l d0,(a0)+
107: addi.l #(NUM_B*4),d0
108: dbra d2,@b
109:
110: moveq.l #0,d0 ; DT=Invalid
111: moveq.l #(NUM_A/2-1),d2 ; Second half
112: @@:
113: move.l d0,(a0)+
114: dbra d2,@b
115:
116: ; Table B を作成。16MB 全域を 1:1 マッピング。
117: lea.l tableB,a0
118: moveq.l #1,d0 ; PageAddr=0, DT=Page
119: move.l #0x8000,d1 ; 32KB
120: move.l #(NUM_A/2*NUM_B-1),d2
121: @@:
122: move.l d0,(a0)+
123: add.l d1,d0
124: dbra d2,@b
125:
126: ; Table A のうち最後の1エントリ、$00'f00000(1MB) を WP にしておく。
127: lea.l tableA,a0
128: moveq.l #15,d0
129: ori.l #4,(a0,d0.w*4) ; 4=WP
130: ; Table B のうち $00'ed0000(32KB) を WP にしておく。
131: ; これは TIA 14番の中の TIB 26番目のエントリ。
132: lea.l tableB+(14*32*4),a0
133: moveq.l #26,d0
134: ori.l #4,(a0,d0.w*4) ; 4=WP
135:
136: pmove.q srp_data,srp ; Set SRP
137: pflusha
138: pmove.l tc_data,tc ; ここで MMU Enable!!
139:
140: nop ; For debugger
141:
142: ; 引数なしのテストを実行するマクロ
143: TEST .macro F
144: pea F ; 2nd arg = func
145: pea msg_&F ; 1st arg = message
146: bsr test
147: addq.l #8,sp
148: .endm
149:
150: ; アドレスの引数を1つ持つテストを実行するマクロ
151: TEST1 .macro func, arg1
152: lea.l arg1,a1
153: TEST func
154: .endm
155:
156: ;
157: ; ここからテストエントリ。
158: ;
159: TEST ptestr0_an
160: TEST ptestw0_an
161: ;TEST ptest_dt1 ; not yet
162:
163: TEST1 ptestr0, set_r0_1
164: TEST1 ptestr0, set_r0_2
165: TEST1 ptestr0, set_r0_3
166: TEST1 ptestr0, set_r0_4
167: TEST1 ptestr0, set_r0_5
168: TEST1 ptestr0, set_r0_6
169: TEST1 ptestr0, set_r0_7
170: TEST1 ptestr0, set_r0_8
171: TEST1 ptestr0, set_r0_9
172: TEST1 ptestr0, set_r0_a
173: TEST1 ptestw0, set_w0_1
174: TEST1 ptestw0, set_w0_2
175: TEST1 ptestw0, set_w0_3
176: TEST1 ptestw0, set_w0_4
177: TEST1 ptestw0, set_w0_5
178: TEST1 ptestw0, set_w0_6
179: TEST1 ptestw0, set_w0_7
180: TEST1 ptestw0, set_w0_8
181: TEST1 ptestw0, set_w0_9
182: TEST1 ptestw0, set_w0_a
183:
184: TEST1 ptestr1, set_r1_1
185: TEST1 ptestr1, set_r1_2
186: TEST1 ptestr1, set_r1_3
187: TEST1 ptestr1, set_r1_4
188: TEST1 ptestr1, set_r1_5
189: TEST1 ptestr1, set_r1_6
190: TEST1 ptestr1, set_r1_7
191: TEST1 ptestr1, set_r1_8
192: TEST1 ptestw1, set_w1_1
193: TEST1 ptestw1, set_w1_2
194: TEST1 ptestw1, set_w1_3
195: TEST1 ptestw1, set_w1_4
196: TEST1 ptestw1, set_w1_5
197: TEST1 ptestw1, set_w1_6
198: TEST1 ptestr1, set_w1_7
199: TEST1 ptestr1, set_w1_8
200:
201: TEST1 ptestr7, set_r7_1
202: TEST1 ptestr7, set_r7_2
203: TEST1 ptestr7, set_r7_3
204: TEST1 ptestr7, set_r7_4
205: TEST1 ptestr7, set_r7_5
206: TEST1 ptestr7, set_r7_6
207: TEST1 ptestr7, set_r7_7
208: TEST1 ptestr7, set_r7_8
209: TEST1 ptestw7, set_w7_1
210: TEST1 ptestw7, set_w7_2
211: TEST1 ptestw7, set_w7_3
212: TEST1 ptestw7, set_w7_4
213: TEST1 ptestw7, set_w7_5
214: TEST1 ptestw7, set_w7_6
215: TEST1 ptestw7, set_w7_7
216: TEST1 ptestw7, set_w7_8
217: done:
218: ; テスト終了
219: pmove.l tc_restore,tc ; MMU 変換オフ
220: movec vbr,a0
221: move.l fline_backup,44(a0) ; F ライン例外ハンドラを戻す
222: ; 結果発表
223: lea.l buf(pc),a0
224: move.l testcount(pc),d0
225: bsr decstr
226: move.l #((' '<<24)|('t'<<16)|('e'<<8)|'s'),(a0)+
227: move.l #(('t'<<24)|('s'<<16)|(','<<8)|' '),(a0)+
228: move.l failcount(pc),d0
229: bne @f
230: move.l #(('a'<<24)|('l'<<16)|('l'<<8)|' '),(a0)+
231: move.l #(('p'<<24)|('a'<<16)|('s'<<8)|'s'),(a0)+
232: move.l #0x0d0a0000,(a0)
233: bra exit
234: @@:
235: bsr decstr
236: move.l #((' '<<24)|('F'<<16)|('A'<<8)|'I'),(a0)+
237: move.l #(('L'<<24)|('E'<<16)|('D'<<8)|'!'),(a0)+
238: move.l #0x0d0a0000,(a0)
239: exit:
240: lea.l buf(pc),a1
241: IOCS _B_PRINT
242: DOS _EXIT
243:
244: ; テスト実行
245: ; 8(a6): テスト名
246: ; 12(a6): テスト関数
247: test:
248: link a6,#0
249: movem.l a1,-(sp)
250: move.l 8(a6),a1
251: IOCS _B_PRINT
252: movem.l (sp)+,a1
253: addi.l #1,testcount
254: move.l 12(a6),a0
255: jsr (a0)
256: add.l d0,failcount
257: tst.l d0
258: bne @f ; エラーなら呼出先で何か表示してある
259: PRINT msg_ok(pc)
260: @@:
261: unlk a6
262: rts
263:
264: error:
265: PRINT msg_fail(pc)
266: moveq.l #1,d0
267: rts
268:
269: ;
270: ; ここから個別テスト。
271: ;
272:
273: ptestr0_an:
274: ; PTESTR <fc>,<ea>,#0,An 形式は F ライン例外になる。
275: lea.l done,a0 ; アドレスは何でもいい
276: clr.b fline_trap_occured
277: ptestr #1,(a0),#0,a0
278: tst.b fline_trap_occured
279: beq error
280: moveq.l #0,d0
281: rts
282:
283: ptestw0_an:
284: ; PTESTW <fc>,<ea>,#0,An 形式は F ライン例外になる。
285: lea.l done,a0 ; アドレスは何でもいい
286: clr.b fline_trap_occured
287: ptestw #1,(a0),#0,a0
288: tst.b fline_trap_occured
289: beq error
290: moveq.l #0,d0
291: rts
292:
293: ; XXX PTEST on xRP.DT==$1(Page).
294: ; 日本語 68030 本によると、この場合アドレスレジスタに $0 が返ってくるらしいが
295: ; 実機だとそうはなってないようなので、ちょっと保留。
296: ptest_dt1:
297: move.l #0x00_010000,d0 ; tableA[1]
298: movea.l d0,a0
299: pmove.q crp_dt1,crp ; CRP を DT=1 で有効にする
300: clr.b fline_trap_occured
301: ptestr #5,(a0),#1,a0
302: pmove.q crp_disable,crp ; CRP を戻す
303: tst.b fline_trap_occured
304: bne error
305: tst.l a0 ; ??? a0 is not zero?
306: bne @f
307: moveq.l #0,d0
308: rts
309: @@:
310: move.l a0,d0
311: lea.l buf(pc),a0
312: move.b #':',(a0)+
313: bsr hexstr_long
314: move.b #0,(a0)
315: PRINT buf(pc)
316: moveq.l #1,d0
317: rts
318:
319: ; PTEST<R/W> <fc>,<ea>,#0 形式のテストマクロ (Lv0 は An オペランドなし)。
320: ; マクロの引数は ptestr か ptestw 命令。
321: ;
322: ; 入力パラメータは (a1) 渡し。
323: ; (a1)+$0.l: <fc>
324: ; (a1)+$4.l: <ea>
325: ; (a1)+$8.l: TT0
326: ; (a1)+$c.l: mmusr の期待値
327: PTEST_LV0 .macro ptestRW
328: moveq.l #0,d0
329: bsr print_ptest
330: move.l 0(a1),d1
331: movea.l 4(a1),a0
332: pmovefd 8(a1),tt0 ; ATC をフラッシュせず TT0 を設定
333: pflush #6,#7
334: nop
335: clr.b fline_trap_occured
336: ptestRW d1,(a0),#0
337: pmove.l tt_disable,tt0 ; TT0 無効
338: tst.b fline_trap_occured
339: bne error
340: move.l 12(a1),d1
341: bsr cmp_mmusr
342: bne error
343: moveq.l #0,d0
344: rts
345: .endm
346:
347: ; PTEST<R/W> <fc>,<ea>,#<lv>,An 形式のテストマクロ (Lv1-7 用)。
348: ; マクロの引数は ptestRW が ptestr か ptestw 命令、LV がレベル。
349: ;
350: ; 入力パラメータは (a1) 渡し。
351: ; (a1)+$0.l: <fc>
352: ; (a1)+$4.l: <ea>
353: ; (a1)+$8.l: TT0
354: ; (a1)+$c.l: mmusr の期待値
355: ; (a1)+$10.l: 期待する An (を tableA 先頭からのインデックスで表したもの)。
356: ; 例えば $c00000 を期待する場合これは TIA[12] なので $c になる。
357: ; TIB は TIA (32エントリ)の直後から始まっている。
358: PTEST_LV .macro ptestRW, LV
359: moveq.l #LV,d0
360: bsr print_ptest
361: move.l 0(a1),d1
362: movea.l 4(a1),a0
363: pmovefd 8(a1),tt0 ; ATC をフラッシュせず TT0 を設定
364: pflush #6,#7
365: nop
366: clr.b fline_trap_occured
367: ptestRW d1,(a0),#LV,a2
368: pmove.l tt_disable,tt0 ; TT0 無効
369: tst.b fline_trap_occured
370: bne error
371: move.l 12(a1),d1
372: bsr cmp_mmusr
373: bne error
374: bsr cmp_addr
375: bne error
376: moveq.l #0,d0
377: rts
378: .endm
379:
380: ptestr0:
381: PTEST_LV0 ptestr
382: ptestw0:
383: PTEST_LV0 ptestw
384: ptestr1:
385: PTEST_LV ptestr, 1
386: ptestw1:
387: PTEST_LV ptestw, 1
388: ptestr7:
389: PTEST_LV ptestr, 7
390: ptestw7:
391: PTEST_LV ptestw, 7
392:
393: ; TT 設定値のショートカット
394: TT00 .equ 0x0000_0000 ; $00'000000(16MB)
395: TT01 .equ 0x0100_0000 ; $01'000000(16MB)
396: TT02 .equ 0x0200_0000 ; $02'000000(16MB)
397: TT_R .equ 0x8607 ; Read のみ透過変換
398: TT_W .equ 0x8407 ; Write のみ透過変換
399: TT_RW .equ 0x8507 ; RD/WR とも透過変換
400:
401: ; PTESTR Lv0
402: ;
403: ; 1 TTx 無効、ATC にないアドレス
404: ; 2 TTx 無効、ATC にあるアドレス
405: ; 3 TTx 有効、TTx に(アドレスが)ヒットせず、ATC にないアドレス
406: ; 4 TTx 有効、TTx にヒットし、ATC にないアドレス
407: ; 5 TTx 有効、TTx に(R/W属性で) ヒットせず。ATC にないアドレス
408: ; 6 TTx 有効、TTx に(アドレスが)ヒットせず、ATC にあるアドレス
409: ; 7 TTx 有効、TTx にヒットし、ATC にあるアドレス
410: ; 8 TTx 有効、TTx に(R/W属性で) ヒットせず、ATC にあるアドレス
411: ; 9 TTx 無効、TIA が WProtect で ATC にあるアドレス
412: ; a TTx 無効、TIB が WProtect で ATC にあるアドレス
413: ;
414: ; - ATC に載ってるはずのエントリとして <ea>=ptestr0 を使っている。
415: ; - TT02|TT_RW は論理 $02'000000(16MB) を物理 $02'000000(16MB) に透過変換で
416: ; あり、素の X68030 実機では A31-A24 が非接続のため、この状態での $02'c00000
417: ; へのアクセスは $c00000 (GVRAM) へのアクセスになる。
418: ; - $00'c00000 は GVRAM を指しており FC=6 は命令スペースなので ATC にはない。
419: ;
420: ; fc ea tt result
421: set_r0_1: .dc.l 6, 0x00_c00000, 0, MMUSR_I
422: set_r0_2: .dc.l 6, ptestr0, 0, MMUSR_M
423: set_r0_3: .dc.l 6, 0x00_c00000, TT02|TT_RW, MMUSR_I
424: set_r0_4: .dc.l 6, 0x02_c00000, TT02|TT_R, MMUSR_I|MMUSR_T
425: set_r0_5: .dc.l 6, 0x02_c00000, TT02|TT_W, MMUSR_I
426: set_r0_6: .dc.l 6, ptestr0, TT02|TT_RW, MMUSR_M
427: ; XXX 実機だと I+T が返るようだ。なぜ?
428: set_r0_7: .dc.l 6, ptestr0, TT00|TT_R, MMUSR_I|MMUSR_T
429: set_r0_8: .dc.l 6, ptestr0, TT00|TT_W, MMUSR_M
430: set_r0_9: .dc.l 5, 0x00_f00000, 0, MMUSR_W
431: set_r0_a: .dc.l 5, 0x00_ed3000, 0, MMUSR_W
432:
433: ; PTESTW Lv0
434: ;
435: ; 1 TTx 無効、ATC にないアドレス
436: ; 2 TTx 無効、ATC にあるアドレス
437: ; 3 TTx 有効、TTx に(アドレスが)ヒットせず、ATC にないアドレス
438: ; 4 TTx 有効、TTx に(R/W属性で) ヒットせず。ATC にないアドレス
439: ; 5 TTx 有効、TTx にヒットし、ATC にないアドレス
440: ; 6 TTx 有効、TTx に(アドレスが)ヒットせず、ATC にあるアドレス
441: ; 7 TTx 有効、TTx に(R/W属性で) ヒットせず、ATC にあるアドレス
442: ; 8 TTx 有効、TTx にヒットし、ATC にあるアドレス
443: ; 9 TTx 無効、TIA が WProtect で ATC にあるアドレス
444: ; a TTx 無効、TIB が WProtect で ATC にあるアドレス
445: ;
446: ; fc ea tt result
447: set_w0_1: .dc.l 6, 0x00_c00000, 0, MMUSR_I
448: set_w0_2: .dc.l 6, ptestw0, 0, MMUSR_M
449: set_w0_3: .dc.l 6, 0x00_c00000, TT02|TT_RW, MMUSR_I
450: set_w0_4: .dc.l 6, 0x02_c00000, TT02|TT_R, MMUSR_I
451: set_w0_5: .dc.l 6, 0x02_c00000, TT02|TT_W, MMUSR_I|MMUSR_T
452: set_w0_6: .dc.l 6, ptestw0, TT02|TT_RW, MMUSR_M
453: set_w0_7: .dc.l 6, ptestw0, TT00|TT_R, MMUSR_I
454: set_w0_8: .dc.l 6, ptestw0, TT00|TT_W, MMUSR_M|MMUSR_T
455: set_w0_9: .dc.l 5, 0x00_f00000, 0, MMUSR_W
456: set_w0_a: .dc.l 5, 0x00_ed3000, 0, MMUSR_W
457:
458: ; PTESTR Lv1
459: ;
460: ; 1 TTx 無効、ea はサーチ中に見付かる
461: ; 2 TTx 無効、ea はサーチ中に Invalid になる
462: ; 3 TTx 有効、ea はサーチ中に見付かる
463: ; 4 TTx 有効、ea はサーチ中に Invalid になる
464: ; 5 TTx 有効、ea は TT とマッチして有効
465: ; 6 TTx 有効、ea は TT とマッチするが Invalid
466: ; 7 ea は TIA でライトプロテクトされているので Lv1 サーチでは W が見付かる
467: ; 8 ea は TIB でライトプロテクトされているので Lv1 サーチではまだ W にならない
468: ;
469: ; fc ea tt result addr(index)
470: set_r1_1: .dc.l 6, 0x00_c00000, 0, 1, 0x0c
471: set_r1_2: .dc.l 6, 0x01_000000, 0, 1|MMUSR_I, 0x10
472: set_r1_3: .dc.l 6, 0x00_c00000, TT02|TT_RW, 1, 0x0c
473: set_r1_4: .dc.l 6, 0x01_000000, TT02|TT_RW, 1|MMUSR_I, 0x10
474: set_r1_5: .dc.l 6, 0x00_c00000, TT00|TT_RW, 1, 0x0c
475: set_r1_6: .dc.l 6, 0x01_000000, TT01|TT_RW, 1|MMUSR_I, 0x10
476: set_r1_7: .dc.l 5, 0x00_f00000, 0, 1|MMUSR_W, 0x0f
477: set_r1_8: .dc.l 5, 0x00_ed3000, 0, 1, 0x0e
478:
479: ; PTESTW Lv1
480: ; fc ea tt result addr(index)
481: set_w1_1: .dc.l 6, 0x00_c00000, 0, 1, 0x0c
482: set_w1_2: .dc.l 6, 0x01_000000, 0, 1|MMUSR_I, 0x10
483: set_w1_3: .dc.l 6, 0x00_c00000, TT02|TT_RW, 1, 0x0c
484: set_w1_4: .dc.l 6, 0x01_000000, TT02|TT_RW, 1|MMUSR_I, 0x10
485: set_w1_5: .dc.l 6, 0x00_c00000, TT00|TT_RW, 1, 0x0c
486: set_w1_6: .dc.l 6, 0x01_000000, TT01|TT_RW, 1|MMUSR_I, 0x10
487: set_w1_7: .dc.l 5, 0x00_f00000, 0, 1|MMUSR_W, 0x0f
488: set_w1_8: .dc.l 5, 0x00_ed3000, 0, 1, 0x0e
489:
490: ; PTESTR Lv7
491: ; fc ea tt result addr(index)
492: set_r7_1: .dc.l 6, 0x00_c00000, 0, 2, NUM_A+0x0c00/8
493: set_r7_2: .dc.l 6, 0x01_000000, 0, 1|MMUSR_I, 0x10
494: set_r7_3: .dc.l 6, 0x00_c00000, TT02|TT_RW, 2, NUM_A+0x0c00/8
495: set_r7_4: .dc.l 6, 0x01_000000, TT02|TT_RW, 1|MMUSR_I, 0x10
496: set_r7_5: .dc.l 6, 0x00_c00000, TT00|TT_RW, 2, NUM_A+0x0c00/8
497: set_r7_6: .dc.l 6, 0x01_000000, TT01|TT_RW, 1|MMUSR_I, 0x10
498: set_r7_7: .dc.l 5, 0x00_f00000, 0, 2|MMUSR_W, NUM_A+0x0f00/8
499: set_r7_8: .dc.l 5, 0x00_ed3000, 0, 2|MMUSR_W, NUM_A+0x0ed3/8
500:
501: ; PTESTW Lv7
502: ; fc ea tt result addr(index)
503: set_w7_1: .dc.l 6, 0x00_c00000, 0, 2, NUM_A+0x0c00/8
504: set_w7_2: .dc.l 6, 0x01_000000, 0, 1|MMUSR_I, 0x10
505: set_w7_3: .dc.l 6, 0x00_c00000, TT02|TT_RW, 2, NUM_A+0x0c00/8
506: set_w7_4: .dc.l 6, 0x01_000000, TT02|TT_RW, 1|MMUSR_I, 0x10
507: set_w7_5: .dc.l 6, 0x00_c00000, TT00|TT_RW, 2, NUM_A+0x0c00/8
508: set_w7_6: .dc.l 6, 0x01_000000, TT01|TT_RW, 1|MMUSR_I, 0x10
509: set_w7_7: .dc.l 5, 0x00_f00000, 0, 2|MMUSR_W, NUM_A+0x0f00/8
510: set_w7_8: .dc.l 5, 0x00_ed3000, 0, 2|MMUSR_W, NUM_A+0x0ed3/8
511:
512: ; テストパラメータを表示する。
513: ; in: d0 レベル
514: ; a1 パラメータセットの先頭アドレス
515: ; use: -
516: print_ptest:
517: movem.l d0-d2/a0-a1,-(sp)
518: move.l d0,d2 ; level を退避
519: lea.l buf(pc),a0
520: move.l 0(a1),d0 ; fc
521: add.b #'0',d0
522: move.b d0,(a0)+
523: move.b #',',(a0)+
524: move.l 4(a1),d0 ; ea
525: bsr hexstr_long
526: move.w #((','<<8)|'#'),(a0)+
527: addi.b #'0',d2 ; level
528: move.b d2,(a0)+
529: move.l #((' '<<24)|('t'<<16)|('t'<<8)|' '),(a0)+
530: move.l 8(a1),d0 ; tt
531: bsr hexstr_long
532: move.b #0,(a0)
533: lea.l buf(pc),a1
534: IOCS _B_PRINT
535:
536: ; 表示ではないけどついでにここで
537: ; $f0'0000 と $ed'0000 を ATC#5 に載せておく。
538: move.l #$f00000,d0
539: movea.l d0,a0
540: move.b (a0),d0
541: move.l #$ed3000,d0
542: movea.l d0,a0
543: move.b (a0),d0
544:
545: movem.l (sp)+,d0-d2/a0-a1
546: rts
547:
548:
549: ; MMUSR とその期待値(d1)を比較する。
550: ; in d1: 期待値
551: ; out d0: 一致すれば 0、そうでなければ 1 を返す
552: ; use --
553: cmp_mmusr:
554: movem.l d2/a0,-(sp)
555: moveq.l #0,d0
556: lea.l mmusr_buf(pc),a0
557: pmove mmusr,(a0)
558: move.w (a0),d2
559: cmp.w d1,d2
560: beq cmp_mmusr_done
561: ; fail
562: PRINT msg_mmusr1(pc)
563: lea.l buf(pc),a0
564: move.w d1,d0
565: swap d0
566: bsr hexstr_word
567: move.l #((' '<<24)|('b'<<16)|('u'<<8)|'t'),(a0)+
568: move.b #' ',(a0)+
569: move.w d2,d0
570: swap d0
571: bsr hexstr_word
572: move.b #0,(a0)
573: PRINT buf(pc)
574: moveq.l #1,d0
575: cmp_mmusr_done:
576: movem.l (sp)+,d2/a0
577: rts
578:
579: ; アドレスをパラメータセットのアドレスインデックスと比較する。
580: ; a2 が実際の結果、16(a1) に期待するアドレスインデックス。
581: ; アドレスインデックスは TableA の先頭からのインデックス。
582: ; in a1: パラメータセットの先頭アドレス
583: ; a2: 実際の結果
584: ; out d0: 一致すれば 0、そうでなければ 1 を返す
585: ; use --
586: cmp_addr:
587: movem.l d2/a0,-(sp)
588: moveq.l #0,d0
589: move.l 16(a1),d2
590: lsl.l #2,d2
591: addi.l #tableA,d2
592: cmp.l a2,d2
593: beq cmp_addr_done
594: ; fail
595: PRINT msg_an(pc)
596: lea.l buf(pc),a0
597: move.l d2,d0
598: bsr hexstr_long
599: move.l #((' '<<24)|('b'<<16)|('u'<<8)|'t'),(a0)+
600: move.b #' ',(a0)+
601: move.l a2,d0
602: bsr hexstr_long
603: move.b #0,(a0)
604: PRINT buf(pc)
605: moveq.l #1,d0
606: cmp_addr_done:
607: movem.l (sp)+,d2/a0
608: rts
609:
610: ; F ライン例外ハンドラ。
611: ; F ライン例外が起きるのは PTEST 命令だけと仮定してハードコードしてある。
612: fline_handler:
613: st fline_trap_occured
614: addi.l #4,2(sp) ; 戻りアドレスは PTEST 命令の次
615: rte
616:
617: srp_data:
618: .dc.l 0x8000_0002, tableA
619: tc_data:
620: .dc.l 0x82f75500
621: tc_restore:
622: .dc.l 0x00000000
623: tt_disable:
624: .dc.l 0x00000000
625: crp_disable:
626: .dc.l 0x0000_0001, 0x0000_0000
627: crp_dt1:
628: .dc.l 0x8000_0001, tableA
629:
630: msg_ptestr0_an:
631: .dc.b "PTESTR fc,ea,#0,An",0
632: msg_ptestw0_an:
633: .dc.b "PTESTW fc,ea,#0,An",0
634: msg_ptest_dt1:
635: .dc.b "PTEST on xRP.DT=1",0
636: msg_ptestr0:
637: msg_ptestr1:
638: msg_ptestr7:
639: .dc.b "PTESTR #",0
640: msg_ptestw0:
641: msg_ptestw1:
642: msg_ptestw7:
643: .dc.b "PTESTW #",0
644: msg_fail:
645: .dc.b ": FAILED!",$d,$a,0
646: msg_ok:
647: .dc.b ": ok"
648: msg_crlf:
649: .dc.b $d,$a,0
650: msg_mmusr1:
651: .dc.b ": MMUSR expects ",0
652: msg_an:
653: .dc.b ": An expects ",0
654:
655: .bss
656: .even
657: fline_backup:
658: .ds.l 1
659: fline_trap_occured:
660: .ds.l 1
661: testcount:
662: .ds.l 1
663: failcount:
664: .ds.l 1
665: buf:
666: .ds.b 128
667: mmusr_buf:
668: .ds.l 1
669:
670: .align 16
671: tableA: .ds.l NUM_A
672:
673: tableB: .ds.l NUM_A * NUM_B
674:
675: .end
676: ; vi:set ts=8:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.