-
Notifications
You must be signed in to change notification settings - Fork 82
/
hdalloc
377 lines (377 loc) · 8.71 KB
/
hdalloc
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
365
366
367
368
369
370
371
372
373
374
375
376
377
;*************************************
;
; THESE ROUTINES WILL ALLOCATE THE FIRST
; OR NEXT ALLOCATION
;
;*************************************
;
; PRIMARY ALLOCATION
; THIS ROUTINE IS CALLED TO ALLOCATE THE FIRST
; SECTOR TO A FILE OR TO ALLOCATE
; A SECTOR TO THE DIRECTORY
;
INTTS
NXTDS
LDA #1
LDX #0 ;BEGINNING ZONE
STA NAHEAD ;EVERY OTHER SECTOR
STX TRACK ;LAST ONE AT T&S 00
STX SECTOR ;*
BEQ HDGS1 ;JMP TO COMMON CODE
;
; SECONDARY ALLOCATION
; THIS ROUTINE IS CALLED TO ALLOCATE N SECTORS
; TO AN EXISTING FILE OR IN THE CASE
; THAT THE PRIMARY ALLOCATION ZONE
; IS FULL AN ATTEMPT WILL BE MADE TO ALLOCATE
; A SECTOR FROM THIS THE NON-PRIME ZONES
;
NXTTS
LDX #10 ;N AHEAD = 10
STX NAHEAD ;*
LDX #1 ;BEGINNING ZONE NUMBER
;
; THE FOLLOWING CODE IS COMMON TO BOTH
;
HDGS1
STX HDTYP ;SAVE BEG ZONE = REQ TYPE
STX HDCZN ;SAVE AS CURRENT ZONE ALSO
LDX DRVNUM ;CHK IF VER FLAG SET
LDA HDDFLG,X ;*
AND #HDVIP ;*
BEQ HDGS6 ;BR IF
LDA #VERLK ;GIVE THE VALIDATE LOCK ERROR
JSR CMDERR ;*
HDGS6
;****************************************
;
; DO OPTIMUM ALLOCATION OF THE SECTOR
;
;****************************************
LDA TRACK ;CURRENT TRACK #
JSR HDGNSB ;GET # SECTORS THIS TRACK
STA HDTMPA ;SAVE
STA HDTMPB ;*
LDA SECTOR ;CURRENT SECTOR
AND #$3F ;TURN OFF HEAD BITS
CLC ;ADD THE NUMBER AHEAD
ADC NAHEAD ;*
CMP HDTMPA ;CHK FOR WRAP
BCC GS1 ;BR IF NO WRAP AROUND
SEC ;CALC # WRAPPED
SBC HDTMPA ;*
GS1
STA HDTMPA ;SAVE DESIRED SECTOR #
LDA SECTOR ;COPY PROPER HEAD BITS
AND #$C0 ;*
ORA HDTMPA ;*
STA SECTOR ;*
;CALC # SECTORS TO SEARCH
;BETWEEN HERE AND END OF TRACK
AND #$3F ;SECTOR # ONLY
STA HDTMPA ;*
SEC ;SUBTRACT FROM TOTAL ON TRK
LDA HDTMPB
SBC HDTMPA
STA HDTMPA ;# TO END OF TRACK
JSR SRCHET ;SEARCH TO END OF TRACK
BEQ GS2 ;BR IF NOT FOUND
GSGOT
RTS ;EXIT (NZ=GOT ONE)
GS2
LDA HDTMPB ;SEARCH WHOLE TRK
STA HDTMPA ;*
LDA SECTOR ;*
AND #$C0 ;BEG AT SECTOR 00
STA SECTOR ;*
JSR SRCHET ;LOOK FOR ONE
BNE GSGOT ;BR IF FOUND ONE
;
; COULD NOT FIND A SECTOR SO
; GO BACK TO BEGINNING OF PROPER
; ZONE AND LOOK TILL END OF DISK
; FOR A SECTOR
;
; NOW LOOK AT FULL SWITCHES TO SEE
; IF DESIRED ZONE HAS AVAILABLE SECTORS
;
HDGS2
LDX HDCZN ;GET DESIRED ZONE #
JSR HDCIND ;CALC INDEX VALUE
LDA HDZFUL,X ;LOOK AT FULL SW.
BEQ HDGS4 ;JMP IF NOT FULL
HDGS3
INC HDCZN ;BUMP TO NEXT ZONE
LDX DRVNUM ;GET MAX ON THAT DRIVE
LDA HDCZN ;CHK IF AT END OF MEDIA
CMP HDNZA,X ;*
BCC HDGS2 ;IF NOT GO CHK THAT ZONE
;
; ZONES 1-N ARE FULL
; TRY ZONE 0 UNLESS WE STARTED THERE
;
DEC HDTYP ;CHK REQUEST TYPE
LDA HDTYP ;SET PROPER ZONE
STA HDCZN ;*
BEQ HDGS2 ;GO GET FROM ZONE
;
; GIVE DISK FULL ERROR
;
LDA #DSKFUL ;ERROR MSG
JMP CMDERR ;EXIT
;
; ALLOCATE A SECTOR FROM THE ZONE
; THE TABLE INDEX IS IN REG X
;
HDGS4
JSR HDGTS ;GET A SECTOR
BEQ HDGS5 ;JMP IF NONE ARE AVAIL
STA SECTOR ;SAVE SECTOR #
STY TRACK ;SAVE TRACK #
RTS ;EXIT TO CALLER
;
; ZONE IS FULLY ALLOCATED MARK IT & MOVE TO NEXT
;
HDGS5
LDA #1 ;NZ IS FULL
STA HDZFUL,X ;*
BNE HDGS3 ;JMP
.PAG 'GET A SECTOR'
; GET A SECTOR FROM THE CALC ZONE INDEX
;
; ON EXIT:
; X=CALC ZONE # (UNCHANGED)
; Z=NO SECTOR AVAILABLE
; NZ=SECTOR IS ALLOC (SEE A&Y)
; A=ALLOCATED SECTOR ADDR
; Y=ALLOCATED TRACK ADDR
;
; ON ENTRANCE:
; HDCZN=UNCALCULATED ZONE #
;
HDGTS
JSR HDISU ;SET UP INDIRECT WORD
JSR HDLBM ;LOAD THE DESIGNATED BAM
LDY #HDBIT1 ;PT TO FIRST BIT
HDGTS1
LDA (HDBMP),Y ;LOOK AT NEXT GROUP OF SECTS.
BNE HDGTS2 ;JMP IF ANY AVAILABLE
INY ;BUMP TO NEXT GROUP
BNE HDGTS1 ;LOOP TILL WHOLE BAM CHKD
;
; NONE AVAILABLE IN THIS BAM
;
RTS ;EXIT (Z IS SET)
;
; FOUND SOME AVAILABLE
; SO CALCULATE THE TRACK & SECTOR ADDR OF ONE OF THEM
;
;
;FIRST CALC THE BIT NUMBER
;
HDGTS2
LDX #0 ;BIT 0 = LEFTMOST BIT
HDGTS4
ASL A ;LOOK AT LEFTMOST
BCS HDGTS3 ;BR IF BIT IS SET
INX ;BUMP THE BIT NUMBER
BNE HDGTS4 ;JMP
HDGTS3
STX HDTMP1 ;SAVE THE BIT NUMBER
;
; TURN THE BIT OFF TO INDICATE
; THAT THE SECTOR HAS BEEN ALLOCATED
;
HDGT4
LSR A ;MOVE A ZERO BACK
DEX ;KEEP SHIFTING ZEROES BACK IN
BPL HDGT4 ;LOOP TILL DONE
;
; PUT BYTE BACK INTO BAM
;
STA (HDBMP),Y ;*
;
; CALCULATE THE BYTE NUMBER
;
TYA ;BAM INDEX
SEC ;PREP FOR SBC
SBC #HDBIT1 ;INDEX TO FIRST BYTE
STA HDTMP2 ;SAVE # BYTES
;
; MULTIPLY NUMBER OF BYTES BY 8
;
LDA #0 ;CLEAR HIGH BYTE
STA HDTMP3 ;*
ASL HDTMP2 ;SHIFT LEFT 3
ROL HDTMP3 ;*
ASL HDTMP2 ;*
ROL HDTMP3 ;*
ASL HDTMP2 ;*
ROL HDTMP3 ;*
;
; ADD IN THE NUMBER OF BITS
;
LDA HDTMP1 ;*
ADC HDTMP2 ;*
STA HDTMP2
BCC HDGT5 ;16 BIT ADD
INC HDTMP3
;
; HDTMP 2&3 ARE NOW EQ TO #BITS INTO BAM
;
HDGT5
;
; GET # SECTORS PER CYLINDER
;
LDY #HDNSEC ;NUMBER PER SURFACE
LDA (HDBMP),Y ;*
LDX DRVNUM ;DRIVE NUMBER
PHA
LDA HDNSUR,X ;GET NUMBER OF SURFACES
AND #HDSURF ;LEAVE ONLY # SURFS
TAY
PLA
DEY ;CHK FOR ONLY ONE SURFACE
BEQ HDGT5A ;JMP IF ONLY ONE
ASL A ;MULT # SECTORS * 2
DEY ;CHK IF TWO SURFACES
BEQ HDGT5A ;JMP IF TWO SURFACES
ASL A ;MULTIPLIES THE # SECT * 4
HDGT5A
STA HDTMP4 ;SAVE NUMBER OF SECTS. PER CYL
;
; DIVIDE NUMBER OF BITS DISP INTO
; BAM BY THE NUMBER OF SECTORS PER
; CYLINDER TO GIVE THE CYLINDER
; OFFSET FROM THE FIRST OF THE BAM
; AND THE REMAINDER IS THE SECTOR WITHIN THE CYL
;
; (ACTUALLY MAX OF 11 BITS IN HDTMP2&3)
; 8 BITS IN HDTMP4&5
; RESULT GOES IN HDTMP1
;
LDA #0 ;CLEAR HIGH RESULT
STA HDTMP5 ;*
STA HDTMP1 ;CLEAR RESULT
LDA #2 ;SET SHIFT COUNTER INIT=2
STA HDTMP ;*
;
; ALIGN HIGH ORDER BITS
;
HDGT6
ASL HDTMP4 ;SHIFT 8 LEFT
INC HDTMP ;BUMP SHIFT COUNTER
BCC HDGT6 ;ASSUMES NOT DIV BY 0
ROL HDTMP5 ;SHIFT THREE MORE TIMES
ASL HDTMP4 ;*
ROL HDTMP5 ;*
ASL HDTMP4 ;*
ROL HDTMP5 ;*
;
; NOW SUBTRACT SHIFTED DIVISOR FROM DIVIDEND
;
HDGT7
SEC ;PREP FOR SBC
LDA HDTMP2 ;LOW BYTE OF DIVIDEND
SBC HDTMP4 ;LOW BYTE OF DIVISOR
TAX ;DONT UPDATE YET
LDA HDTMP3 ;HIGH BYTE DIVIDEND
SBC HDTMP5 ;HIGH BYTE DIVISOR
BCC HDGT8 ;BR IF RESULT WENT MINUS
STA HDTMP3 ;ELSE UPDATE DIVIDEND
STX HDTMP2 ;*
INC HDTMP1 ;SET LOW BIT IN RESULT
BNE HDGT7 ;JMP
;
; SHIFT DIVISOR RIGHT
;
HDGT8
LSR HDTMP5 ;*
ROR HDTMP4 ;*
;
; DECR SHIFT COUNTER
;
DEC HDTMP ;*
BMI HDGT9 ;JMP IF ALL DONE
;
; SHIFT RESULT LEFT ONE
;
ASL HDTMP1 ;*
JMP HDGT7 ;LOOP TILL DONE
;
; DIVIDE DONE NOW CALC TRACK #
;
HDGT9
LDY #HDCYL ;GET BEG CYL #
LDA (HDBMP),Y ;*
CLC ;PREP FOR ADC
ADC HDTMP1 ;ADD QUOTIENT
PHA ;SAVE TRACK (CYLINDER)
;
; REMAINDER DIVIDED BY # SECTORS PER SURFACE = HEAD #
;
LDY #HDNSEC ;PT TO # SECTS PER SURF
LDA HDTMP2 ;REMAINDER FROM DIVIDE
LDX #255 ;RESULT
HDGT10
SEC ;PREP FOR SBC
SBC (HDBMP),Y ;SUB LOOP
INX ;*
BCS HDGT10 ;LOOP TILL DONE
;
; X = HEAD NUMBER
;
ADC (HDBMP),Y ;MAKE POSITIVE
ORA HDXLT,X ;OR HEAD INTO SECTOR #
STA HDTMP ;SAVE HEAD & SECTOR
;
; MARK BAM AS MODIFIED & CALC NEW LRC
;
JSR HDCLRC ;*
;
;
; NOW DECREMENT # SECTORS AVAIL
;
JSR HDDBC ;DO IT
;
; NOW RETURN NZ,A=SECTOR,Y=CYLINDER,X=INDEX
;
PLA ;Y=CYLINDER (TRACK)
TAY ;*
LDX HDCZN ;ORIG ZONE
JSR HDCIND ;CALC INDEX
LDA HDTMP ;A=SECTOR (&HEAD)
CMP #$FF ;SET NZ
RTS ;EXIT TO CALLER
;
HDXLT .BYT 0,$40,$80,$C0 ;HEAD TRANSLATE
;
; SEARCH FROM CURRENT T&S TO END OF TRACK
;
SRCHET
JSR FINDTS ;SET POINTERS TO CURNT POS.
LDX SECTOR ;SAVE SECTOR
STX HDTMP1 ;*
STA HDTMP2 ;SAVE BIT
SRCHE1
LDA (HDBMP),Y ;GET THE BYTE
BIT HDTMP2 ;TEST IF AVAILABLE
BNE SRCHE3 ;BR IF AVAIL
DEC HDTMPA ;DEC # SECTORS TO CHECK
BEQ SRCHE2 ;BR IF DONE WITH SCAN
INC HDTMP1 ;BUMP CURNT SECTOR
ROR HDTMP2 ;MOVE MASK BIT TO THE RIGHT
BNE SRCHE1 ;LOOP TILL DONE/FOUND
ROR HDTMP2 ;PUT BIT BACK INTO BIT 7
INY ;BUMP TO NEXT BYTE
BNE SRCHE1 ;JMP
SRCHE2
RTS ;EXIT NZ=FOUND Z=NOT FOUND
SRCHE3
LDA HDTMP2 ;BIT MASK
LDX HDTMP1
STX SECTOR ;SECTOR TO USE
JSR HDCBIK ;ALLOC SECTOR & GEN LRC
LDA #1 ;NZ
RTS
.END