Annotation of nono/exp/ptest1.has, revision 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.