|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.