-
Notifications
You must be signed in to change notification settings - Fork 82
/
duplct
207 lines (207 loc) · 4.19 KB
/
duplct
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
.PAGE 'DUPLICATE'
;
; DUPLICATE DISK
;
DUPLCT
LDA #BADCMD
JMP CMDERR ; BAD COMMAND FOR SINGLE DISK
;
; FORMAT THE DRIVE
;
JFORMT
LDY #0
STY JOBNUM ; USE JOB NUMBER 0
JSR JOB2X ; .X = JOBNUM*8
TYA
STA HDRS+2,X
STA HDRS+3,X
INY
STY INTRLV ; INTERLEAVE = 1
LDA #FMTCMD ; FORMAT COMMAND
JSR DOJOB ; FORMAT THE DRIVE
FORMA0
LDA #0 ; USE JOB NUMBER 0
FORMA1
STA JOBNUM
JSR JOB2X ; .X = JOBNUM*8
LDA #0
STA R0 ; R0 = 0, NEW TRACK
STA HDRS+2,X ; TRACK = 0
STA HDRS+3,X ; SECTOR, HEAD = 0
STA SECTOR ; FIRST SECTOR
JSR WORST ; WRITE WORST CASE PATTERN (DB6C)
JSR SETBTS ; SET UP BAD T, S AND H
FORMA2
LDA MAXCYL ; SECTORS/CYLINDER
FORMA3
STA XFRINT ; CHECK 1 CYLINDER AT A TIME
LDA #%11000000
STA ECCRTY ; DISABLE ECC AND RETRY
LDA #1
STA JOBNUM
LDA #$FF
STA JOBRTN ; RETURN ALL ERRORS
LDA #WRITE
JSR DOJOB ; VERIFY ALL SECTORS
CMP #2 ; ANY ERRORS?
BCC FORMA4 ; NO, DONE WITH THIS CYLINDER
JSR ADDBTS ; YES, ADD TO BAD T, S AND H
JSR JOB2X ; .X = JOBNUM*8
INC HDRS+3,X ; NEXT SECTOR, HEAD
LDA MAXCYL
SEC
SBC HDRS+3,X
BNE FORMA3 ; XFRINT = MAXCYL-SECTOR, HEAD
FORMA4
JSR JOB2X ; .X = JOBNUM*8
LDA #0
STA HDRS+3,X ; BACK TO SECTOR, HEAD 0
STA R0 ; R0 = 0, NEW TRACK
INC HDRS+2,X ; TRACK = TRACK+1
LDA HDRS+2,X
CMP MAXTRK ; MORE TRACKS?
BCC FORMA2 ; YES, DO THE NEXT CYLINDER
JMP WRTBTS ; WRITE LAST LIST (RTS)
;
; SET UP BAD T, S AND H
;
; RETURNS WITH:
;
; BUFFER(JOBNUM) = $FF
; INDEX POINTER (IP) = 2
;
SETBTS
LDY JOBNUM
LDA #$FF
JSR SETBUF ; SET BUFFER TO $FF'S
INC IP
INC IP ; IP = 2
RTS
;
; SET BUFFER TO CONTENTS OF .A
;
; ON ENTRY:
;
; .Y = BUFFER NUMBER
; .A = BUFFER CONTENTS
;
SETBUF
LDX BUFIND,Y
STX IP+1
LDY #0
STY IP
SETBU1
STA (IP),Y
INY
BNE SETBU1
RTS
;
; ADD T, S AND H TO LIST
;
ADDBTS
LDY #0
LDA R0 ; NEW TRACK?
BNE ADDBT2 ; NO, JUST ADD SECTOR, HEAD
INC R0 ; R0 <> 0
INC IP ; LEAVE AN $FF
BNE ADDBT1
JSR WRTBTS ; WRITE THIS LIST
ADDBT1
JSR JOB2X ; .X = JOBNUM*8
LDA HDRS+2,X ; TRACK
STA (IP),Y ; MARK THE TRACK
INC IP
BNE ADDBT2
JSR WRTBTS ; WRITE THIS LIST
ADDBT2
JSR JOB2X ; .X = JOBNUM*8
LDA HDRS+3,X ; SECTOR, HEAD
STA (IP),Y ; MARK THE SECTOR, HEAD
INC IP
BNE ADDBT3
JSR WRTBTS ; WRITE THIS LIST
ADDBT3
RTS
;
; WRITE THE BAD T, S AND H LIST
;
WRTBTS
LDA #0
STA JOBNUM ; BTS IN BUFFER 0
JSR JOB2X ; .X = JOBNUM*8
LDA SECTOR
CLC
ADC #1 ; NEXT SECTOR, HEAD
CMP MAXCYL
BCS WRTBT2 ; NO MORE SECTORS
STA HDRS+3,X ; POSSIBLE NEXT SECTOR, HEAD
LDA #0
STA HDRS+2,X ; CYLINDER 0 ONLY
WRTBT1
LDA #$FF
STA JOBRTN ; RETURN ALL ERRORS
JSR DOWRIT ; TRY TO WRITE IT
CMP #2 ; ANY ERRORS?
BCC WRTBT3 ; NO
JSR JOB2X ; YES, .X = JOBNUM*8
INC HDRS+3,X ; NEXT SECTOR, HEAD
LDA HDRS+3,X
CMP MAXCYL
BCC WRTBT1 ; TRY THE NEXT SECTOR, HEAD
WRTBT2
LDA #12
JMP ERROR ; FORMAT ERROR
WRTBT3
LDA SECTOR ; GET THE PREVIOUS SECTOR
BNE WRTBT4 ; HAS A PREVIOUS SECTOR
JSR JOB2X ; .X = JOBNUM*8
LDY DRVNUM
LDA HDRS+3,X
STA BTSSEC,Y ; START OF BAD T, S AND H (SECTOR)
LDA #0
STA BTSTRK,Y ; START OF BAD T, S AND H (TRACK)
BEQ WRTBT5 ; JUMP
WRTBT4
JSR JOB2X ; .X = JOBNUM*8
LDA HDRS+3,X ; CURRENT SECTOR
PHA ; SAVE IT
LDA SECTOR ; PREVIOUS SECTOR
STA HDRS+3,X ; NOW THE CURRENT SECTOR
JSR DOREAD ; READ THE PREVIOUS SECTOR
LDY #0
TYA
STA IP
STA (IP),Y ; SET THE TRACK LINK
INY
PLA ; CURRENT SECTOR
STA (IP),Y ; SET THE SECTOR LINK
PHA ; SAVE THE SECTOR AGAIN
JSR DOWRIT ; WRITE THE PREVIOUS BTS
JSR JOB2X ; .X = JOBNUM*8
PLA ; CURRENT SECTOR
STA HDRS+3,X ; RESTORE THE CURRENT SECTOR
WRTBT5
JSR JOB2X ; .X = JOBNUM*8
LDA HDRS+3,X
STA SECTOR ; NOW THE CURRENT SECTOR
JSR SETBTS ; SET UP FOR NEW BUFFER
LDA #1
STA JOBNUM
RTS
.PAGE
WORST
LDY #1
LDA BUFIND,Y
STA IP+1
DEY ; .Y = 0
STY IP
WORST1
LDA #$DB
STA (IP),Y
INY
LDA #$6C
STA (IP),Y
INY
BNE WORST1
RTS
.END