-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathjm_mdv
More file actions
364 lines (338 loc) · 10.1 KB
/
jm_mdv
File metadata and controls
364 lines (338 loc) · 10.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
**************************
*
* JM2 MDV-ROUTINES EXCEPT THAT D0=28 INSTEAD OF 14
*
***************************
* TRAP 2, D0=3
L05000 TST.B $EE(A6) * Format mdv-Routine: is mdv actif ?
BEQ.S L0500A * yes
MOVEQ #-9,D0 * "in use"
RTS
* OPEN CHANNEL FOR FORMATTING
L0500A MOVE.L D1,D7 * SAVE VALUE OF D1 UND A1
MOVEA.L A1,A4
MOVE.L #1152,D1 * reserved space
JSR L02FAE * MM.ALCHP
BEQ.S L0501E * sucess
RTS * error out of mem
L0501E LEA $0010(A0),A0 * A0 / A5: BASISADR. FOR FORMATTING
MOVEA.L A0,A5
MOVEQ #-$01,D0
MOVE.W D0,(A0)+
MOVEQ #$09,D1
L0502A MOVE.B #$20,(A0)+ * RESERVE 10*SPACE FOR NAME
DBF D1,L0502A
MOVE.W $002E(A6),(A0) * SV.RND
SUBA.W #$000A,A0
MOVE.W (A4)+,D1
ADDQ.W #5,A4
SUBQ.W #5,D1
* NOW TRANSFER NAME AND SHORTEN TO MAXIMUM LENGHT
CMPI.W #$000A,D1
BLS.S L05048
MOVEQ #$0A,D1
L05048 MOVE.B (A4)+,(A0)+
SUBQ.W #1,D1
BGT.S L05048
LEA $000E(A5),A0
MOVE.L #$FD000C10,(A0)+ * FORMAT PARAM.
ADDQ.W #6,A0
MOVE.W D0,(A0)+
MOVE.W #$012A,D1 * LOOP-COUNTER
L05060 MOVE.W #$AA55,(A0)+ * FORMAT VALUE
DBF D1,L05060
MOVE.W #$0F0E,$021A(A5) * END SECTOR VALUE
MOVE.W D7,D1
LEA $00018020,A3 * A3 status of 8049
MOVEQ #$10,D0 * LOOP-COUNTER FOR TRANSMISSION
JSR L00420
ORI.W #$0700,SR * interrupts
JSR L02C56 * motor on
MOVE.L #$0001E848,D0 * COUNTER: about 0.5 secs
L0508E SUBQ.L #1,D0
BNE.S L0508E
MOVE.B #$0A,(A3)
L05096 MOVEA.L A5,A1
MOVEQ #$0D,D1
MOVE.W #$0479,D0
L0509E DBF D0,L0509E
JSR L051A6(PC)
MOVE.W #$0261,D1
MOVE.W #$047B,D0
L050AE DBF D0,L050AE
JSR L051A6(PC) * WRITE SECTOR-HEAD
SUBQ.B #1,-$026F(A1) * ONE SECTOR LESS
BCC.S L05096
MOVE.B #$02,(A3)
CLR.L -(A7)
MOVEQ #$00,D5
L050C4 MOVE.W #$00FF,D5
L050C8 MOVEA.L A5,A1
JSR L0523A(PC) * read sector header
BRA.S L050E6 * error - no synchronisation
BRA.S L050E2 * read - error
JSR L052A4(PC) * correct - read more
BRA.S L050E2 * error
ADD.W D7,D7 * next sector
SUBQ.B #1,$00(A1,D7.W) * adapt sector nr.
TST.W D7 * sector 0
BEQ.S L050EA * end verifying
L050E2 DBF D5,L050C8
L050E6 BRA L05180 * format failed
L050EA TST.L D5 * 1. verify
BLT.S L050F2 * no
MOVEQ #-$01,D5
BRA.S L050C4
L050F2 MOVEQ #$00,D5 * list formatted sectors
L050F4 SUBQ.B #1,(A1)
CMPI.B #$FE,(A1) * IS SECTOR CORRECT FORMATTED?
BGT.S L05108 * YES BUT NOT SUCCESSFUL
BEQ.S L05100 * NO
ADDQ.W #1,(A7) * ADD 1 TO SECTOR-COUNTER
L05100 MOVE.B D5,$0003(A7)
MOVE.B (A1),D4
MOVEA.L A1,A4
L05108 ADDQ.W #2,A1
ADDQ.B #1,D5
BCC.S L050F4 * CONTINUE TILL CARRY = 255 SECTORS
ST (A4)
ADDQ.B #2,D4
BEQ.S L05116
SUBQ.W #1,(A7)
L05116 CMPI.W #$00C8,(A7) * less than 200 sectors?
BLT.S L05180 * error
LEA $000E(A5),A1
MOVEQ #$00,D0
L05122 CLR.L (A1)+
ADDQ.B #1,D0
BPL.S L05122
LEA $0270(A5),A1 * ADRESSE OF SECTOR-LIST
MOVE.B #$F8,(A1)
MOVE.L (A7),D1
ADD.W D1,D1
SUBI.W #$0010,D1
L05138 SUBQ.W #2,D1
CMPI.B #$FD,$00(A1,D1.W)
BNE.S L05138
CLR.B $00(A1,D1.W)
MOVE.W D1,$01FE(A1)
LSR.W #1,D1
MOVE.B D1,(A7)
MOVEQ #$00,D2
JSR L05222(PC) * search sector 0
BRA.S L05180 * not found - error
LEA $0270(A5),A1
MOVE.W (A1),-(A7)
JSR L051B0(PC) * write sector catalogue
ADDQ.W #2,A7
MOVE.B (A7),D2 * last sector in d2
JSR L05222(PC) * read header
BRA.S L05180 * failed
LEA $000E(A5),A1 *
MOVE.L #$0040,(A1)
CLR.W -(A7)
JSR L051B0(PC) * write errors
ADDQ.W #2,A7
MOVEQ #$00,D7
BRA.S L05182 * no errors o.k
L05180 MOVEQ #-$0E,D7 * format failed
L05182 JSR L02C50 * stop motor
LEA -$0010(A5),A0
JSR L0305E
JSR L00452
ANDI.W #$F0FF,SR
CLR.B (A7)
MOVE.W (A7)+,D1
MOVE.W (A7)+,D2
MOVE.L D7,D0
RTS
L051A6 LEA L051AC(PC),A4 * ADDR OF WRITING TO SECTOR
BRA.S L051E4
L051AC MOVEQ #$0A,D4
BRA.S L051DA
L051B0
XL011B0 EQU L051B0-$4000
MOVE.B #$0A,(A3) * write a sector
MOVE.W #$05C9,D0
L051B8 DBF D0,L051B8
MOVEA.L A1,A0
LEA $0004(A7),A1
MOVEQ #$01,D1
LEA L051CA(PC),A4
BRA.S L051E4
L051CA MOVEA.L A0,A1 * A0= ADRESSE OF BUFFER
MOVE.W #$01FF,D1
MOVEQ #$05,D5
LEA L051D8(PC),A4
BRA.S L051F2
L051D8 MOVEQ #$02,D4
L051DA MOVEQ #$30,D0
L051DC DBF D0,L051DC
MOVE.B D4,(A3)
RTS
L051E4 MOVEQ #$0E,D0 * common mdv write routine
MOVE.B D0,(A3) * A3 = 8049
MOVE.B D0,(A3)
MOVEQ #$01,D6
LEA $0002(A3),A2
MOVEQ #$09,D5
L051F2 MOVEQ #$00,D4
L051F4 BSR.S L0521A
SUBQ.B #1,D5
BGE.S L051F4
MOVEQ #-$01,D4
BSR.S L0521A
BSR.S L0521A
MOVE.W #$0F0F,D3
MOVEQ #$00,D4
L05206 MOVE.B (A1)+,D4
ADD.W D4,D3
BSR.S L0521A
DBF D1,L05206
MOVE.W D3,D4
BSR.S L0521A
LSR.W #8,D4
BSR.S L0521A
JMP (A4)
L0521A BTST D6,(A3) * test if 8049 busy
BNE.S L0521A
MOVE.B D4,(A2)
RTS
L05222 MOVEQ #$00,D5 * search mdvsector header - d5 counts sectors
L05224 MOVEA.L A5,A1
BSR.S L0523A * do it
RTS * failed
BRA.S L05224 * read-error
CMP.B D7,D2 * was selected sector?
BEQ.S L05236
ADDQ.B #1,D5
BCC.S L05224 * til 255 sectors read
RTS * normal return adress
L05236 ADDQ.L #2,(A7) * return addr. + 2
RTS
L0523A
XL0123A EQU L0523A-$4000
JSR L05448(PC) * read sector header
RTS * failed
ADDQ.L #2,(A7) * correct
MOVEQ #$0D,D1
BSR L052CE * read
BRA.S L0525A * failed
CMPI.B #$FF,-$000E(A1) * sector nr. ok
BNE.S L0525A
MOVEQ #$00,D7
MOVE.B -$000D(A1),D7 * return sector nr.
ADDQ.L #2,(A7)
L0525A RTS
L0525C
XL0125C EQU L0525C-$4000
LEA L052CE(PC),A0 * read sector (addr. in a0)
BRA.S L05266
L05262
XL01262 EQU L05262-$4000
LEA L05354(PC),A0 * verify sector addr. in a0
L05266 JSR L05448(PC) * do it
RTS * failed
MOVE.L A1,-(A7)
CLR.W -(A7)
MOVEA.L A7,A1
MOVEQ #$01,D1
BSR.S L052CE * read header
BRA.S L05296 * failed
MOVE.B #$02,D1 * ok
MOVE.B D1,(A3) * set timing (8049)
MOVEQ #$08,D0 * wait a little
L05280 DBF D0,L05280
MOVE.B D1,(A3) * again timing
MOVE.W #$01FF,D1
MOVEA.L $0002(A7),A1 * a1= buffer address
JSR (A0) * do it
BRA.S L05296 * error
ADDQ.L #2,$0006(A7)
L05296 MOVEQ #$00,D1
MOVEQ #$00,D2
MOVE.B $0001(A7),D2
MOVE.B (A7)+,D1
ADDQ.W #4,A7
RTS
L052A4 JSR L05448(PC) * verify formatted sector / read header
RTS * failed
MOVE.W #$0261,D1
BSR L05354 * read sector
RTS * failed
ADDQ.L #2,(A7)
RTS
L052B8 MOVE.W #$0100,D0 * initialise parameters
MOVE.W #$0F0F,D3 * d0=counter, d3=checksum
MOVEQ #$00,D4
MOVEQ #$02,D6
LEA $0002(A3),A2 * to read track 1
LEA $0003(A3),A4 * to read track 2
RTS
L052CE BSR L052B8 * read number of bits - initialise
L052D0 BTST D6,(A3)
DBNE D0,L052D0 * till buffer is empty
EXG A2,A4
MOVE.B (A2),D4
MOVE.B D4,(A1)+
ADD.W D4,D3
TST.W D0
BLT L05446
MOVEQ #$28,D0 * !!! VALUE CHANGED
SUBQ.W #1,D1
BGE.S L052D0 * try evtl second track
BRA L05376
L05354 BSR L052B8 * verify reading - initialise
L05358 BTST D6,(A3)
DBNE D0,L05358
EXG A2,A4
MOVE.B (A2),D4
CMP.B (A1)+,D4
BNE L05446
ADD.W D4,D3
TST.W D0
BLT L05446
MOVEQ #$28,D0 * !!! VALUE CHANGED
SUBQ.W #1,D1
BGE L05358
L05376 BTST D6,(A3)
DBNE L05376
EXG A4,A2
MOVE.B (A2),D4
ROR.W #8,D4
TST.W D0 * if too long waited
BLT.S L05446 * back
MOVEQ #$28,D0 * !!! VALUE CHANGED
ADDQ.W #1,D1
BEQ.S L05376
CMP.W D4,D3 * compare checksum
BNE.S L05446 * not equal - BACK
ADDQ.L #2,(A7)
L05446 RTS
* adapted from AA94 ff in JM
* with one differnce: IN JM is AAB6 : send two times
* D1 to (A3)=8049 In JS this is done 1 + 9 times
* here you have the shortened form of JS
L05448 MOVEQ #$00,D1 * wait for pulsing interrupts
L0544A SUBQ.W #1,D1 * 0.38 seconds
BEQ.S L05476
BTST #$03,(A3) * from 8049
BEQ.S L0544A
MOVEQ #$00,D1
L05456 SUBQ.W #1,D1 * wait again 0.38 sec
BEQ.S L05476
MOVEQ #$14,D0
L0545C BTST #$03,(A3)
BNE.S L05456
DBF D0,L0545C
MOVE.B #$02,D1
MOVEQ #$09,D0
L0546E DBF D0,L0546E
MOVE.B D1,(A3)
ADDQ.L #2,(A7)
L05476 RTS
**************************************************
* *
* End MDV_ROUTINES mdv_routines *
* *
**************************************************