|
|
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.