Annotation of nono/exp/area.has, revision 1.1

1.1     ! root        1: ;
        !             2: ; nono
        !             3: ; Copyright (C) 2023 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 からアクセスしてみる
        !            27: ; テスト。だけのはずだったがついでに各 FC でアクセスしてみる。
        !            28: ;
        !            29: ; % has area.has
        !            30: ; % hlk area.o si_util.o
        !            31: ;
        !            32: ; usage:
        !            33: ;   area <address>
        !            34: 
        !            35:                .include        doscall.mac
        !            36:                .include        iocscall.mac
        !            37:                .xref           hexstr_long
        !            38: 
        !            39: DMAC_ch2:      .equ    $e84080
        !            40: DMAC_CSR:      .equ    $00
        !            41: DMAC_DCR:      .equ    $04
        !            42: DMAC_OCR:      .equ    $05
        !            43: DMAC_SCR:      .equ    $06
        !            44: DMAC_CCR:      .equ    $07
        !            45: DMAC_MTC:      .equ    $0a
        !            46: DMAC_MAR:      .equ    $0c
        !            47: DMAC_DAR:      .equ    $14
        !            48: DMAC_NIV:      .equ    $25
        !            49: DMAC_EIV:      .equ    $27
        !            50: DMAC_MFC:      .equ    $29
        !            51: DMAC_DFC:      .equ    $31
        !            52: 
        !            53: PRINT          .macro  str
        !            54:                pea     str
        !            55:                DOS     _PRINT
        !            56:                addq.l  #4,sp
        !            57:                .endm
        !            58: 
        !            59: PUTCHAR                .macro  chr
        !            60:                move.w  #chr,-(sp)
        !            61:                DOS     _PUTCHAR
        !            62:                addq.l  #2,sp
        !            63:                .endm
        !            64: 
        !            65:                .cpu    68000
        !            66:                .list
        !            67:                .text
        !            68:                .even
        !            69: start:
        !            70:                clr.l   -(sp)
        !            71:                DOS     _SUPER
        !            72:                addq.l  #4,sp
        !            73: 
        !            74:                exg.l   sp,sp                   ; ブレークポイント
        !            75:                bsr     check_arg
        !            76:                bsr     init
        !            77: 
        !            78:                move.l  addr(pc),d0             ; アドレス表示
        !            79:                lea.l   addrbuf(pc),a0
        !            80:                bsr     hexstr_long
        !            81:                move.b  #' ',(a0)+
        !            82:                move.b  #0,(a0)
        !            83:                PRINT   addrbuf(pc)
        !            84: 
        !            85:                move.l  addr(pc),a0
        !            86: 
        !            87:                moveq.l #$1,d1
        !            88:                bsr     print_rw
        !            89:                PUTCHAR ' '
        !            90:                moveq.l #$2,d1
        !            91:                bsr     print_rw
        !            92:                PUTCHAR ' '
        !            93:                moveq.l #$5,d1
        !            94:                bsr     print_rw
        !            95:                PUTCHAR ' '
        !            96:                moveq.l #$6,d1
        !            97:                bsr     print_rw
        !            98:                PRINT   msg_crlf(pc)
        !            99: 
        !           100:                ; 後始末
        !           101:                moveq.l #$68,d1
        !           102:                move.l  niv_backup(pc),a1
        !           103:                IOCS    _B_INTVCS
        !           104:                moveq.l #$69,d1
        !           105:                move.l  eiv_backup(pc),a1
        !           106:                IOCS    _B_INTVCS
        !           107: 
        !           108:                DOS     _EXIT
        !           109: 
        !           110: ; a0 (d1.B がFC) について読み書きした結果を表示する。
        !           111: ; 破壊 d2
        !           112: print_rw:
        !           113:                moveq.l #$80,d2
        !           114:                bsr     checkmem
        !           115:                bne     @f
        !           116:                PUTCHAR 'R'
        !           117:                bra     @@f
        !           118: @@:
        !           119:                PUTCHAR '-'
        !           120: @@:
        !           121: 
        !           122:                moveq.l #$00,d2
        !           123:                bsr     checkmem
        !           124:                bne     @f
        !           125:                PUTCHAR 'W'
        !           126:                bra     @@f
        !           127: @@:
        !           128:                PUTCHAR '-'
        !           129: @@:
        !           130:                rts
        !           131: 
        !           132: 
        !           133: ; DMA でアクセス出来るかチェックする。
        !           134: ; d1.B はチェックする FC。
        !           135: ; d2.B は 0 なら書き込み、0x80 なら読み込み。
        !           136: ; a1.L はチェックするアドレス。
        !           137: ; a4 は DMA#2 のベースアドレス (グローバル変数)
        !           138: ; アクセスできれば d0.L に 0 を返す。出来なければ非0 を返す。
        !           139: checkmem:
        !           140:                movem.l a0,-(sp)
        !           141: 
        !           142:                clr.b   niv_occur
        !           143:                clr.b   eiv_occur
        !           144: 
        !           145:                moveq.l #$11,d0                 ; Word, ReqMax
        !           146:                or.b    d2,d0                   ; bit7 = DtoM/MtoD
        !           147:                move.b  d0,DMAC_OCR(a4)
        !           148: 
        !           149:                move.w  #$0001,DMAC_MTC(a4)
        !           150:                move.l  a0,DMAC_DAR(a4)
        !           151:                lea.l   buf(pc),a0
        !           152:                move.l  a0,DMAC_MAR(a4)
        !           153:                move.b  d1,DMAC_DFC(a4)
        !           154:                move.b  #$05,DMAC_MFC(a4)
        !           155:                move.b  #$00,DMAC_CSR(a4)       ; Clear status
        !           156:                move.b  #$88,DMAC_CCR(a4)       ; Start!
        !           157: @@:
        !           158:                move.w  niv_occur(pc),d0
        !           159:                beq     @b              ; Wait until either niv/eiv occur
        !           160: 
        !           161:                movem.l (sp)+,a0
        !           162:                moveq.l #0,d0
        !           163:                move.b  eiv_occur,d0
        !           164:                rts
        !           165: 
        !           166: ; 初期化
        !           167: init:
        !           168:                movem.l a0,-(sp)
        !           169:                movea.l #DMAC_ch2,a4
        !           170: 
        !           171:                moveq.l #$68,d1                 ; NIV 設定
        !           172:                move.b  d1,DMAC_NIV(a4)
        !           173:                lea.l   niv_handler(pc),a1
        !           174:                IOCS    _B_INTVCS
        !           175:                move.l  d0,niv_backup
        !           176: 
        !           177:                moveq.l #$69,d1                 ; EIV 設定
        !           178:                move.b  d1,DMAC_EIV(a4)
        !           179:                lea.l   eiv_handler(pc),a1
        !           180:                IOCS    _B_INTVCS
        !           181:                move.l  d0,eiv_backup
        !           182: 
        !           183:                move.b  #$08,DMAC_DCR(a4)       ; DCR=16bit
        !           184:                move.b  #$05,DMAC_SCR(a4)       ; S++,D++
        !           185:                movem.l (sp)+,a0
        !           186:                rts
        !           187: 
        !           188: niv_handler:
        !           189:                move.b  #$10,DMAC_CCR(a4)       ; Stop
        !           190:                move.b  #$ff,DMAC_CSR(a4)
        !           191:                st      niv_occur
        !           192:                rte
        !           193: 
        !           194: eiv_handler:
        !           195:                move.b  #$10,DMAC_CCR(a4)       ; Stop
        !           196:                move.b  #$ff,DMAC_CSR(a4)
        !           197:                st      eiv_occur
        !           198:                rte
        !           199: 
        !           200: 
        !           201: ; 引数のアドレスを addr に返す。
        !           202: ; a2 は引数の先頭 (先頭1バイトが長さ)。先頭の余分な空白はない。
        !           203: check_arg:
        !           204:                move.b  (a2)+,d1                ; arglen
        !           205:                beq     usage
        !           206:                movea.l a2,a0
        !           207:                .dc.w   $fe12                   ; __STOH
        !           208:                bcs     usage
        !           209:                move.l  d0,addr
        !           210:                rts
        !           211: 
        !           212: usage:
        !           213:                PRINT   msg_usage(pc)
        !           214:                DOS     _EXIT
        !           215: 
        !           216: 
        !           217: msg_usage:
        !           218:                .dc.b   "usage: <address>",$d,$a
        !           219:                .dc.b   "  Access an <address> with FC=1,2,5,6."
        !           220: msg_crlf:
        !           221:                .dc.b   $d,$a,0
        !           222: 
        !           223:                .even
        !           224: buf:
        !           225:                .ds.l   2
        !           226: addr:
        !           227:                .ds.l   1
        !           228: niv_backup:
        !           229:                .ds.l   1
        !           230: eiv_backup:
        !           231:                .ds.l   1
        !           232:                .even
        !           233: niv_occur:
        !           234:                .ds.b   1
        !           235: eiv_occur:
        !           236:                .ds.b   1
        !           237: addrbuf:
        !           238:                .ds.b   10
        !           239: 
        !           240:                .end
        !           241: ; 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.