forked from mist64/cbmsrc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tstfnd.src
185 lines (147 loc) · 3.77 KB
/
tstfnd.src
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
.messg "tstfnd"
.subttl "tstfnd"
.page
; returns next available trk & sec
; given current t & s
; allocation is from trk 40
; towards 1 & 80, by full tracks
nxtts jsr gethdr
lda #3
sta temp ; set pass count
lda #1 ; find next
ora wbam
sta wbam
nxtds jsr setbam
lda (bmpnt),y
bne fndnxt
lda track
cmp dirtrk
beq nxterr
bcc nxt2
inc track
lda track
cmp maxtrk
bne nxtds
ldx dirtrk
dex
stx track
cpx startrk
bcc nxt3
lda #0
sta sector
dec temp
bne nxtds
nxterr lda #dskful
jsr cmderr
nxt2 lda track
cmp startrk
bcc nxt3
dec track
bne nxtds
nxt3 ldx dirtrk
inx
stx track
lda #0
sta sector
dec temp
bne nxtds
beq nxterr
fndnxt lda sector ; get current sec
clc ; add in the incr
adc secinc
sta sector
lda numsec ; find next sec
sta cmd
cmp sector ; is it over?
bcs fndn0 ; no..it's ok
sec
lda sector
sbc numsec
sta sector
beq fndn0
dec sector ; -1
fndn0 jsr getsec
beq fndn2 ; nothing here...
fndn1
jmp wused
fndn2
lda #0
sta sector ; start again
jsr getsec
bne fndn1 ; sumtin here...
jmp derr
.page
intts lda #1 ; find init opt t&s
ora wbam
sta wbam
lda r0
pha ; save temp var
lda #1 ; clr r0
sta r0
its1 lda dirtrk ; track:= dirtrk-r0
sec
sbc r0
sta track
php
cmp startrk ; ok
bcs 1$ ; startrk < track
plp
jmp its2
1$ plp
bcc its2 ; if t>0
beq its2 ; then begin
jsr setbam ; set the bam pntr
lda (bmpnt),y
bne fndsec
its2 lda dirtrk ; trk= dirtrk+r0
clc
adc r0
sta track
inc r0 ; next trk
cmp maxtrk
bcc its3 ; next icf cmnd err
lda #systs
jsr cmder2
its3 jsr setbam ; set ptr
lda (bmpnt),y
beq its1
fndsec pla
sta r0 ; restore r0
lda #0
sta sector
jsr getsec
beq derr
jmp wused
derr lda #direrr
jsr cmder2
.pag
getsec jsr setbam ; set bam, find avl sec
jsr avck ; chk bits & count
gs10 lda sector
cmp numsec
bcs gs20
jsr bambit ; get sector offset
bne gs30
inc sector
bne gs10 ; bra
gs20 lda #0 ; nothing free
gs30 rts ; (z=1): free
avck lda #0
sta ftnum ; blk counter
ldy bamsiz
dey ; adjust it
ac10 ldx #8
lda (bmpnt),y
ac20 asl a ; used ?
bcc ac30 ; no
inc ftnum ; count it
ac30 dex
bne ac20 ; do next bit
dey ; do next byte
bne ac10
lda (bmpnt),y
cmp ftnum
bne ac40 ; counts don't match
rts
ac40 lda #direrr
jsr cmder2