|
|
1.1 ! root 1: ; ! 2: ; nono ! 3: ; Copyright (C) 2020 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: ; DMAC の STR をワード書き込みした時の挙動を調べる。 ! 27: ; ! 28: ; 実機での実行結果: ! 29: ; before 0008 ! 30: ; after 0508 ! 31: ; CSR|CER 9102 ! 32: ; int_occur 00ff ! 33: ; ! 34: ; SCR|CCR のワードに書き込んだ $0588 のうち SCR 部分の $05 は書き込まれる。 ! 35: ; ただしタイミングエラーになったため CCR:STR は落とされている。 ! 36: ; int_occur は上位バイトが NIV、下位バイトが EIV が起きたことを示しており ! 37: ; この場合当然エラー割り込みが起きる。 ! 38: ; 割り込み発生時の CER はタイミングエラーを示している ! 39: ; (この後 CSR.ERR に書き込むと CER もクリアされる)。 ! 40: ! 41: .include doscall.mac ! 42: .include iocscall.mac ! 43: .xref hexstr_word ! 44: ! 45: DMAC_ch2: .equ $e84080 ! 46: DMAC_CSR: .equ $00 ! 47: DMAC_DCR: .equ $04 ! 48: DMAC_OCR: .equ $05 ! 49: DMAC_SCR: .equ $06 ! 50: DMAC_CCR: .equ $07 ! 51: DMAC_MTC: .equ $0a ! 52: DMAC_MAR: .equ $0c ! 53: DMAC_DAR: .equ $14 ! 54: DMAC_NIV: .equ $25 ! 55: DMAC_EIV: .equ $27 ! 56: ! 57: PRINT .macro str ! 58: pea str ! 59: DOS _PRINT ! 60: addq.l #4,sp ! 61: .endm ! 62: ! 63: .cpu 68000 ! 64: .list ! 65: .text ! 66: .even ! 67: start: ! 68: clr.l -(sp) ! 69: DOS _SUPER ! 70: addq.l #4,sp ! 71: ! 72: movea.l #DMAC_ch2,a4 ! 73: ! 74: moveq.l #$68,d1 ; NIV 設定 ! 75: move.b d1,DMAC_NIV(a4) ! 76: lea.l niv_handler(pc),a1 ! 77: IOCS _B_INTVCS ! 78: move.l d0,niv_backup ! 79: ! 80: moveq.l #$69,d1 ; EIV 設定 ! 81: move.b d1,DMAC_EIV(a4) ! 82: lea.l eiv_handler(pc),a1 ! 83: IOCS _B_INTVCS ! 84: move.l d0,eiv_backup ! 85: ! 86: exg.l sp,sp ; ブレークポイント ! 87: ! 88: move.b #$08,DMAC_CCR(a4) ; INT enable ! 89: move.w #$0002,DMAC_MTC(a4) ! 90: lea.l start(pc),a0 ! 91: move.l a0,DMAC_MAR(a4) ! 92: lea.l buf(pc),a0 ! 93: move.l a0,DMAC_DAR(a4) ! 94: ! 95: move.b #$08,DMAC_DCR(a4) ; DCR=16bit ! 96: move.b #$11,DMAC_OCR(a4) ; OCR=MtoD,Word ! 97: move.b #$00,DMAC_SCR(a4) ; SCR=MAC=,DAC= ! 98: ! 99: move.w DMAC_SCR(a4),d4 ; Backup SCR|CCR ! 100: move.w d4,d0 ! 101: ori.w #$0580,d0 ! 102: move.w d0,DMAC_SCR(a4) ; SET STR ON WORD ACCESS!! ! 103: ! 104: move.w DMAC_SCR(a4),d5 ; Fetch SCR|CCR again ! 105: ! 106: PRINT msg_before(pc) ; 書き込み前の SCR|CCR ! 107: move.l d4,d0 ! 108: bsr putword ! 109: PRINT msg_after(pc) ; 書き込み後の SCR|CCR ! 110: move.l d5,d0 ! 111: bsr putword ! 112: PRINT msg_csr(pc) ; CSR|CER ! 113: move.w csr_after(pc),d0 ! 114: bsr putword ! 115: PRINT msg_intr(pc) ; 割り込み起きたかどうか ! 116: move.w niv_occur(pc),d0 ! 117: bsr putword ! 118: ! 119: ; 後始末 ! 120: move.b #$00,DMAC_CCR(a4) ; INT disable ! 121: moveq.l #$68,d1 ; EIV ハンドラ復元 ! 122: movea.l niv_backup,a0 ! 123: IOCS _B_INTVCS ! 124: moveq.l #$69,d1 ; NIV ハンドラ復元 ! 125: movea.l eiv_backup,a0 ! 126: IOCS _B_INTVCS ! 127: ! 128: DOS _EXIT ! 129: ! 130: niv_handler: ! 131: st niv_occur ! 132: rte ! 133: eiv_handler: ! 134: st eiv_occur ! 135: move.w DMAC_CSR(a4),d0 ; clear interrupts ! 136: move.w d0,DMAC_CSR(a4) ! 137: lea.l csr_after(pc),a0 ; save CSR|CER ! 138: move.w d0,(a0) ! 139: rte ! 140: ! 141: putword: ! 142: swap d0 ! 143: lea.l buf(pc),a0 ! 144: bsr hexstr_word ! 145: move.b #$0d,(a0)+ ! 146: move.b #$0a,(a0)+ ! 147: clr.b (a0) ! 148: pea.l buf(pc) ! 149: DOS _PRINT ! 150: addq.l #4,sp ! 151: rts ! 152: ! 153: msg_before: .dc.b "before ",0 ! 154: msg_after: .dc.b "after ",0 ! 155: msg_csr: .dc.b "CSR|CER ",0 ! 156: msg_intr: .dc.b "int_occur ",0 ! 157: ! 158: .even ! 159: niv_backup: .ds.l 1 ! 160: eiv_backup: .ds.l 1 ! 161: csr_after: .ds.w 1 ! 162: niv_occur: .dc.b 0 ! 163: eiv_occur: .dc.b 0 ! 164: buf: .ds 16 ! 165: ! 166: .end ! 167: ; vi:set ts=8:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.