Annotation of nono/exp/ptest1.has, revision 1.1.1.1

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:

unix.superglobalmegacorp.com

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