-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathUade12.asm
1216 lines (1172 loc) · 18.1 KB
/
Uade12.asm
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
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
;.OPT
;UADE12;> Uade12
;.TTL
;Fileserver file UADE12
.UADE12
;** MAPMAP UTILS II(2) **
.SMPPTR;SMPPTR
{
;SET POINTER TO ENTRY IN MAP TABLE
;CORRESPONDING TO DRIVE IN CURDRV.
;POINTER IS IN BOTH MAPPTR AND
;MAPENT.
LDX CURDRV
LDA MAPTB
STA MAPPTR
LDA MAPTB + 1
STA MAPPTR + 1
.SMPPTL
DEX
BMI SMPPTX
JSR MPADMP
JMP SMPPTL
.SMPPTX
LDA MAPPTR
STA MAPENT
LDA MAPPTR + 1
STA MAPENT + 1
RTS
}
;RDDATA: READ DISC INFO FROM SECTOR 0 INTO
;STORE STARTING AT ADDRESS IN FREPTR.
;ENTRY: A = DRIVE NUMBER
;EXIT: A = RC
;FUNCTION: -
;0) SET FDRIVE, OLDFDR & SELECT & START DRIVE
;1) SEEK TRACK ZERO
;2) READ SECTOR 0
;RDSZRO ENTRY POINT FOR USE WHEN
;DDRSTA POINTER ALREADY SET UP.
.RDDATA
LDY FREPTR
STY DSCCB+TRADD
LDY FREPTR + 1
STY DSCCB+TRADD + 1;DDRSTA:=STORE ADDR FOR SECTOR
LDY #0
STY DSCCB
STY DSCCB+TRADD+ 2
STY DSCCB+TRADD+ 3
.RDSTWO
{
STA DRIVNO
LDX #9
LDA #0
STA RBDA;SECTOR ZERO
.RDDLP2
STA DSCCB+CMD,X
DEX
BPL RDDLP2
JSR GTDRNO
STA DSCCB+CMD+ 1
LDA #&08
STA DSCCB+CMD
LDA DSCCB+TRADD
STA MPCYPT
LDA DSCCB+TRADD+1
STA MPCYPT+1
INC DSCCB+LENGTH+ 1
.RDDLP
JSR DSCCMD
BNE RDSEC1
LDY #SZOFF
LDA (MPCYPT),Y
STA DSCCB+CMD+3
INY
LDA (MPCYPT),Y
STA DSCCB+CMD+2
INY
JSR GTDRNO
ORA (MPCYPT),Y
STA DSCCB+CMD+1
JSR DSCCMD
BEQ RDDND
.RDSEC1
LDY DSCCB;RETURN CODE
CPY #&65;BAD DRIVE
BEQ RDDND
LDY RBDA
BNE RDDND
INC RBDA
INC DSCCB+CMD+3
BNE RDDLP
.RDDND
TAX
RTS
}
;
; MAKE AN ENTRY IN THE MAP BLOCK
;
; ON ENTRY
; MKENVA HOLD THE NUMBER OF BLOCKS TO ALLOCATE
; MAPTMP POINT TO THE MAP BLOCK
;
; ON EXIT
; C SET IF FAILED
;
; USES
; MAPGEN
; MPTMPE
;
.MKEN
{
LDY #MPSPCY
LDA (MAPPTR),Y
STA TMPSPC
INY
LDA (MAPPTR),Y
STA TMPSPC + 1
LDA MAPGEN
PHA
LDA MAPGEN + 1
PHA
LDA MAPTMP;GET POINTER TO MAP BLOCK
STA MAPGEN
LDA MAPTMP+ 1
STA MAPGEN+ 1
JSR GETPOS;GET NEXT FREE POSITION IN MAP BLOCK
BCS MES1;BRANCH IF ROOM
JMP MECNT
.MES1
LDY #MPCYMP;GET ADDRESS OF CYLINDER MAP
LDA (MAPPTR),Y
STA MAPGEN
INY
LDA (MAPPTR),Y
STA MAPGEN+ 1
SEC
LDY #0;CHECK IF ROOM FOR ANOTHER BLOCK
LDA (MAPGEN),Y
SBC #1
STA (MAPGEN),Y
INY
LDA (MAPGEN),Y
SBC #0
STA (MAPGEN),Y
INY
LDA (MAPGEN),Y
SBC #0
STA (MAPGEN),Y
BCC MKR3
LDA MAPTMP
STA MPMBPT
STA CBSTA
LDA MAPTMP + 1
STA MPMBPT + 1
STA CBSTA + 1
JSR MMBLKD
JSR GTCYPS;GET CLOSET CYCLINDER BLOCK
LDA MAPGEN
STA MPTMPB
LDA MAPGEN + 1
STA MPTMPB + 1
LDA MPTMPE
STA MPTMPC;NEW CYLINDER COUNT
LDA MPTMPE+ 1
STA MPTMPC+ 1
JSR RDBTMP
BNE MKR2
JSR ALBLK;GET NEW MAP BLOCK
SEC
JSR RDMPBK;GET AREA OF STORE FOR IT
LDA ERRTYP
BEQ MKR1
.MKR2
JSR ULMB
.MKR3
JMP NOSPC
.MKR1
CLC
LDA MPMBPT;GET POINTER TO OLD MAP BLOCK
STA CBSTA
ADC #LO(LSTENT);POINT TO LAST ENTRY
STA MPMBPT
LDA MPMBPT+ 1
STA CBSTA + 1
ADC #HI(LSTENT)
STA MPMBPT+ 1
LDY #0;SAVE SIN OF NEW MAP BLOCK
LDA MPTMPA
STA (MPMBPT),Y
INY
LDA MPTMPA+ 1
STA (MPMBPT),Y
INY
LDA MPTMPA+ 2
STA (MPMBPT),Y
INY ;NOW SAVE LENGTH
LDA #1
STA (MPMBPT),Y
INY
LDA #0
STA (MPMBPT),Y
JSR MMBWT
JSR ULMB
CLC
LDY #MPCYMP;GET ADDRESS OF CYLINDER MAP
LDA (MAPPTR),Y
STA MAPGEN
ADC #3;POINT TO START OF ENTRIES
STA MPTMPB
INY
LDA (MAPPTR),Y
STA MAPGEN + 1
ADC #0
STA MPTMPB+ 1
JSR GTCYPS
LDA MAPGEN
STA MPCYPT
LDA MAPGEN + 1
STA MPCYPT + 1
LDA MPTMPE
STA MPTMPC
LDA MPTMPE + 1
STA MPTMPC + 1
JSR RDBTMP
BNE MKR2
LDA MAPTMP
STA MAPGEN;SAVE ADDRESS OF NEW MAP BLOCK
LDA MAPTMP+ 1
STA MAPGEN+ 1
; TEST 27/10/83
JSR SIZE
LDA MPTMPD
CMP MKENVA
LDA MPTMPD + 1
SBC MKENVA + 1
BCS MKOK1
LDA MPTMPD
STA MKENVA
LDA MPTMPD + 1
STA MKENVA + 1
; END OF TEST 27/10/83
.MKOK1
JSR GETPOS;GET FREE POSITION IN MAP BLOCK
.MECNT
LDA #0
STA MPTMPE
STA MPTMPE+ 1;ZERO VARIABLES
STA MPTMPE+ 2
TAY
.MELP3
LDA (MPSCPT),Y;LOOK FOR BLOCKS TO ALLOCATE
BEQ MEADD;NOT FOUND
LDX #8
.MELP9
ROR A
BCS MECNT2
DEX
INC MPTMPE;STILL NOT FOUND
BNE MELP9
INC MPTMPE+ 1
JMP MELP9;CHECK NEXT ONE ;;MM C=0 SO BCC MELP9?
.MEADD
CLC ;NEXT BYTE SO ADD 8
LDA MPTMPE
ADC #8
STA MPTMPE
INY
BCC MELP3
INC MPTMPE+ 1
BCS MELP3;ALWAYS
.MECNT2
PHA
LDA MPTMPE
ORA MPTMPE + 1
STA MPTMPB + 2;FLAG
LDA MKENVA
STA MPTMPB
LDA MKENVA + 1
STA MPTMPB + 1
PLA
.MELP8
CLC
ROR A
PHP
PHA
LDA MPTMPB
BNE MELP8A
DEC MPTMPB + 1
.MELP8A
DEC MPTMPB
LDA MPTMPB + 1
ORA MPTMPB
BEQ MESK3
PLA
PLP
DEX
BNE MELP8
STA (MPSCPT),Y
INY
LDA (MPSCPT),Y
ROR A
LDX #8
BNE MELP8;ALWAYS
.MESK3
PLA
PLP
DEX
.MELP7
ROR A
DEX
BNE MELP7
STA (MPSCPT),Y
LDA MPTMPC
PHA
LDA MPTMPC+ 1
PHA ;SAVE POSITION
.MELP4
LDA MPTMPC;NOW GET DISC ADDRESS
ORA MPTMPC+ 1;IF ZERO THS IS IT!
BEQ MESK2
CLC
LDA MPTMPE
ADC TMPSPC
STA MPTMPE
LDA MPTMPE+ 1
ADC TMPSPC + 1
STA MPTMPE+ 1
BCC MELP4A
INC MPTMPE+ 2
.MELP4A
LDA MPTMPC
BNE MELP4B
DEC MPTMPC + 1
.MELP4B
DEC MPTMPC
JMP MELP4
.MESK2
PLA
STA MPTMPC + 1
PLA
STA MPTMPC
LDA MPTMPB + 2;FLAG
BEQ MESK2C
SEC
LDA MAPGEN
SBC MAPTMP
TAY
LDA MAPGEN + 1
SBC MAPTMP + 1
BNE MESK2A
CPY #MBENTS
BEQ MESK2C
.MESK2A
SEC
LDA MAPGEN
PHA
SBC #ENSZ
STA MAPGEN
LDA MAPGEN + 1
PHA
SBC #0
STA MAPGEN + 1
SEC
LDY #BLKSN
LDA MPTMPE
SBC (MAPGEN),Y
STA CBSTA
INY
LDA MPTMPE + 1
SBC (MAPGEN),Y
STA CBSTA + 1
INY
LDA MPTMPE + 2
SBC (MAPGEN),Y
BNE MESK2B
INY ;Y:=BLKNO
LDA CBSTA
CMP (MAPGEN),Y
BNE MESK2B
INY
LDA CBSTA + 1
CMP (MAPGEN),Y
BNE MESK2B
DEY
CLC
LDA MKENVA
ADC (MAPGEN),Y
STA (MAPGEN),Y
INY
LDA MKENVA + 1
ADC (MAPGEN),Y
STA (MAPGEN),Y
PLA
PLA
JMP MESK2D
.MESK2B
PLA
STA MAPGEN + 1
PLA
STA MAPGEN
.MESK2C
LDY #0;SAVE THE DISC ADDRESS
LDA MPTMPE
STA (MAPGEN),Y
INY
LDA MPTMPE+ 1
STA (MAPGEN),Y
INY
LDA MPTMPE+ 2
STA (MAPGEN),Y
INY
LDA MKENVA;SAVE SIZE
STA (MAPGEN),Y
LDA MKENVA+ 1
INY
STA (MAPGEN),Y
.MESK2D
JSR MBMWT;MARK BIT MAP WRITTEN
LDA MAPTMP
STA CBSTA
LDA MAPTMP + 1
STA CBSTA + 1
JSR MMBWT;MARK MAP BLOCK WRITTEN
SEC
LDA DIVTMP
SBC MKENVA
STA DIVTMP
LDA DIVTMP + 1
SBC MKENVA + 1
STA DIVTMP + 1
CLC ;FLAG EVERYTHING OK
.MEND
PLA
STA MAPGEN + 1
PLA
STA MAPGEN
RTS
.NOSPC
CLC
LDY #0
LDA (MAPGEN),Y
ADC #1
STA (MAPGEN),Y
INY
LDA (MAPGEN),Y
ADC #0
STA (MAPGEN),Y
INY
LDA (MAPGEN),Y
ADC #0
STA (MAPGEN),Y
SEC ;NO GOOD
BCS MEND
}
;ALLOCATE ONE BLOCK
;
; LOOKS IN CURRENT BIT MAP AND RETURNS THE SIN
; OF THE FIRST FREE BLOCK
;
; ON ENTRY
; MPTMPC HOLDS THE CYLINDER NUMBER
; MPSCPT POINTS TO THE CURRENT BIT MAP
;
; ON EXIT
; MPTMPA HOLDS THE SIN OF THE ALLOCATED BLOCK
;
; USES
; MPCYPT
;
.ALBLK
{
LDA #0;ZERO VARIABLES
STA MPTMPA
STA MPTMPA+ 1
STA MPTMPA+ 2
LDA MPSCPT;COPY POINTER TO USE
STA MPCYPT
LDA MPSCPT + 1
STA MPCYPT + 1
.ALNX
LDY #0
LDA (MPCYPT),Y;FIND FREE BLOCK
BEQ ALS8
.ALLP
ROR A;NOW FIND THE SECTOR
BCS ALGT;FOUND WHEN C SET
INC MPTMPA;KEEP LOOKING
BNE ALLP
INC MPTMPA + 1
JMP ALLP
.ALS8
CLC
LDA MPTMPA;MOVE TO NEXT BYTE
ADC #8
STA MPTMPA
BCC ALS8A
INC MPTMPA+ 1
.ALS8A
INC MPCYPT
BNE ALNX
INC MPCYPT+ 1;*** M OAKLEY 27/1/86 ***
.ALSK1
JMP ALNX
.ALGT
PHA ;SAVE TO MARK AS ALLOCATED
LDA MPTMPA
AND #7
TAX
INX
PLA
CLC
.ALLP2
ROL A
DEX
BNE ALLP2
STA (MPCYPT),Y;BLOCK MARKED ALLOCATED
LDA MPTMPC
STA MAPTMP
LDA MPTMPC+ 1
STA MAPTMP+ 1
.ALLP3
LDA MAPTMP
ORA MAPTMP+ 1
BEQ ALND;GET DISC ADDRESS
LDY #MPSPCY
CLC
LDA MPTMPA
ADC (MAPPTR),Y
STA MPTMPA
INY
LDA MPTMPA+ 1
ADC (MAPPTR),Y
STA MPTMPA+ 1
BCC ALLP3A
INC MPTMPA+ 2
.ALLP3A
LDA MAPTMP
BNE ALLP3B
DEC MAPTMP+ 1
.ALLP3B
DEC MAPTMP
JMP ALLP3
.ALND
LDA MPTMPB;GET POINTER TO CYLINDER MAP
STA MPCYPT
LDA MPTMPB+ 1
STA MPCYPT+ 1
LDY #0;DECREMENT FREE COUNT
SEC
LDA (MPCYPT),Y
SBC #1
STA (MPCYPT),Y
INY
LDA (MPCYPT),Y
SBC #0
STA (MPCYPT),Y
LDY #MPCYMP
LDA (MAPPTR),Y
STA MPCYPT
INY
LDA (MAPPTR),Y
STA MPCYPT + 1
JSR MBMWT;MARK BIT MAP WRITTEN
LDA MPTMPA
ORA MPTMPA + 1
ORA MPTMPA + 2
BNE AND
LDA #&FC
JSR INTERR
.AND
RTS
}
; ALLOCATE A SERIES OF BLOCKS
;
; ON ENTRY
; MPCYPT POINTS TO POSITION IN CYLINDER MAP
; DIVTMP HOLDS NUMBER OF SECTORS REQUIRED
; MPSCPT POINTS TO BIT MAP
; MAPPTR POINTS TO MAP TABLE
; MAPTMP POINTS TO MAP BLOCK
; MPTMPC HOLDS CYLINDER NUMBER
;
; ON EXIT
; DIVTMP HOLDS NUMBER OF BLOCKS LEFT
; C SET IF FAILED
;
; USES
; MAPGEN
;
.ABLKS
{
LDY #MPCYMP
LDA (MAPPTR),Y;GET POINTER TO START OF CYLINDER MAP
STA MAPGEN
INY
LDA (MAPPTR),Y
STA MAPGEN+ 1
JSR SIZE;GET SIZE OF THIS BLOCK
LDA MPTMPD;MPTMPD HAS SIZE
CMP DIVTMP;SEE IF WE NEED THEM ALL
LDA MPTMPD+ 1
SBC DIVTMP+ 1
BCC ABSALL
LDA DIVTMP+ 2
BNE ABSALL;ABSALL ALLOCATES ALL BLOCKS
LDA DIVTMP
STA MKENVA;MAKE ENTRY IN MAP BLOCK
LDA DIVTMP+ 1
STA MKENVA+ 1
.ABSMKE
JSR MKEN
BCS ABSFLD;ALL DONE SO FINISH
LDA ERRTYP
BNE ABSFLD
LDY #0
SEC
LDA (MPCYPT),Y
SBC MKENVA
STA (MPCYPT),Y
INY
LDA (MPCYPT),Y
SBC MKENVA + 1
STA (MPCYPT),Y
CMP #&FF
BNE ABSNM1
DEY
LDA (MPCYPT),Y
CMP #&FF
BNE ABSNM1
LDA #&FA
JSR INTERR
.ABSNM1
CLC
RTS
.ABSFLD
JSR DAGRP;NOT ABLE TO MAKE ENTRY
LDY #0
CLC
LDA (MAPGEN),Y;INCREASE FREE COUNT
ADC MKENVA
STA (MAPGEN),Y
INY
LDA (MAPGEN),Y
ADC MKENVA+ 1
STA (MAPGEN),Y
INY
LDA (MAPGEN),Y
ADC #0
STA (MAPGEN),Y
SEC ;TO INDICATE FAILURE
RTS
.ABSALL
LDA MPTMPD
STA MKENVA;PREPARE TO MAKE ENTRY IN MAP BLOCK
LDA MPTMPD+ 1
STA MKENVA+ 1
JMP ABSMKE
}
; DEALLOCATE MAP BLOCK
;
; DEALLOCATES THE SPECIFIED MAP BLOCK. OVERWRITES THE SEQUENCE NUBERS
; SO THAT IT WILL NO LONGER APPEAR AS A MAP BLOCK
;
; ON ENTRY
; MPTMPA HOLDS THE SIN OF THE MAP BLOCK
; MPCYPT POINTS TO THE CYLINDER MAP
;
; USES
; MPTMPA,MPTMPD,MPTMPC,MPSCPT
;
.DAMPBK
{
LDY #MPSPCY
LDA (MAPPTR),Y
STA TMPSPC
INY
LDA (MAPPTR),Y
STA TMPSPC + 1
LDA MPTMPA;DEALLOCATE MAP BLOCK
STA CBSIN
LDA MPTMPA + 1
STA CBSIN + 1
LDA MPTMPA + 2
STA CBSIN + 2
JSR FNDMB; GNCBPT POINTS TO CURRENT ENTRY
LDY #CBSA
LDA (GNCBPT),Y
STA MPSCPT;SAVE POINTER TO MAP BLOCK
STA CBSTA
INY
LDA (GNCBPT),Y
STA MPSCPT + 1
STA CBSTA + 1
LDY #MBSQNO
LDA #&FF
STA (MPSCPT),Y;SAVE INVALID SQ.NO.
CLC
LDA MPSCPT
ADC #LO(LSTSQ)
STA MPSCPT
LDA MPSCPT + 1
ADC #HI(LSTSQ)
STA MPSCPT + 1
LDA #0
TAY
STA (MPSCPT),Y
JSR MMBWT
LDA #0
STA MPTMPC; ZERO VARIABLES
STA MPTMPC + 1
.DMBLP1
SEC
LDA MPTMPA
SBC TMPSPC; FIND CYLINDER NUMBER
STA MPTMPA
LDA MPTMPA + 1
SBC TMPSPC + 1
STA MPTMPA + 1
LDA MPTMPA + 2
SBC #0
STA MPTMPA + 2
BCC DMBCNT; CYLINDER FOUND
INC MPTMPC;INCREMENT CYLINDER COUNT
BNE DMBLP1
INC MPTMPC + 1
JMP DMBLP1
.DMBCNT
JSR RDBTMP; GET THE RELEVCANT BIT MAP TO STORE
CLC
LDA MPTMPA; GET WHICH BLOCK OF THIS CYLINDER
ADC TMPSPC
STA MPTMPA
LDA MPTMPA + 1
ADC TMPSPC + 1
STA MPTMPA + 1
BCC DMBJ1
INC MPTMPA + 2
.DMBJ1
LDY #0
.DMBLP2
SEC ;GET POSITION IN BIT MAP
LDA MPTMPA
SBC #8
STA MPTMPA
LDA MPTMPA + 1
SBC #0
STA MPTMPA + 1
BCC DMBSK1; POSITION FOUND IF BRANCH
INY
JMP DMBLP2
.DMBSK1
CLC
LDA MPTMPA; GET OLD POSITION BACK
ADC #8
STA MPTMPA
BCC DMBJ2
INC MPTMPA + 1
.DMBJ2
LDX MPTMPA
INX
LDA (MPSCPT),Y; X HOLDS POSITION IN BYTE A HOLDS THE BYTE
.DMBLP3
ROR A;MOVE TO CORRECT POSITION
DEX
BNE DMBLP3
SEC
LDX MPTMPA;BLOCK IS FLAGGED FREE AND X HOLDS NUMBER OF SHIFTS
INX
.DMBLP4
ROL A; UNTIL BACK TO CORRECT POSITION
DEX
BNE DMBLP4
STA (MPSCPT),Y; SAVE FLAGS
CLC
LDA MPCYPT;NOW MAKE COUNTS CORRECT
ADC #3
STA MAPGEN
LDA MPCYPT + 1
ADC #0
STA MAPGEN + 1
LDA MPTMPC
STA MPTMPE
LDA MPTMPC + 1
STA MPTMPE + 1
.DMBLP5
LDA MPTMPE
ORA MPTMPE + 1
BEQ DMBSK2
CLC
LDA MAPGEN
ADC #2
STA MAPGEN
BCC DMBJ3
INC MAPGEN + 1
.DMBJ3
LDA MPTMPE
BNE DMBJ4
DEC MPTMPE + 1
.DMBJ4
DEC MPTMPE
JMP DMBLP5
.DMBSK2
LDY #0
CLC
LDA (MAPGEN),Y;INCREMENT FREE BLOCK COUNT
ADC #1
STA (MAPGEN),Y
INY
LDA (MAPGEN),Y
ADC #0
STA (MAPGEN),Y
LDY #0
CLC
LDA (MPCYPT),Y
ADC #1
STA (MPCYPT),Y
INY
LDA (MPCYPT),Y
ADC #0
STA (MPCYPT),Y
INY
LDA (MPCYPT),Y
ADC #0
STA (MPCYPT),Y
JMP MBMWT;NOW FINISHED
}
;
; DALLOCATE A GROUP OF BLOCKS
; MARKS THE ENTRIES IN THE SPECIFIED BIT MAP FREE ASND INCREASES THE FREE BLOCK COUNT
;
; ON ENTRY
; MPSCPT POINTS TO RELEVANT ENTRY IN MAP BLOCK
; MPCYPT POINTS TO CYLINDER MAP
; MAPTMP POINTS TO MAP BLOCK
;
; USES
; MPTMPC,MAPGEN,MPTMPD,MAPTMP
;
.DAGRP
{
LDA MAPTMP
PHA
LDA MAPTMP + 1
PHA
LDY #0
STY MPTMPC; ZERO VALUES
STY MPTMPC + 1
LDA (MPSCPT),Y; GET SIN
STA MPTMPD
INY
LDA (MPSCPT),Y
STA MPTMPD + 1
INY
LDA (MPSCPT),Y
STA MPTMPD + 2
LDA MPSCPT; SAVE MAP BLOCK POINTER
STA MAPGEN
LDA MPSCPT + 1
STA MAPGEN + 1
.DAGLP1
LDY #MPSPCY
SEC ; NOW FIND CYLINDER
LDA MPTMPD
SBC (MAPPTR),Y
STA MPTMPD
INY
LDA MPTMPD + 1
SBC (MAPPTR),Y
STA MPTMPD + 1
LDA MPTMPD + 2
SBC #0
STA MPTMPD + 2
BCC DAGGT; END FOUND
INC MPTMPC; COUNT TO NEXT CYLINDER
BNE DAGLP1
INC MPTMPC + 1
JMP DAGLP1
.DAGGT
LDY #MPSPCY
CLC
LDA MPTMPD; RESTORE BLOCK COUNT
ADC (MAPPTR),Y
STA MPTMPD
INY
LDA MPTMPD + 1
ADC (MAPPTR),Y
STA MPTMPD + 1
BCC DAGGT1
INC MPTMPD + 2
.DAGGT1
LDA MPTMPC; SAVE CYLINDER NUMBER
STA MAPTMP
LDA MPTMPC + 1
STA MAPTMP + 1
JSR RDBTMP
LDY #0
.DAGLP2
SEC ; GET POSITION IN BIT MAP
LDA MPTMPD
SBC #8
STA MPTMPD
LDA MPTMPD + 1
SBC #0
STA MPTMPD + 1
LDA MPTMPD + 2
SBC #0
STA MPTMPD + 2
BCC DAGFD; WHEN POSITION FOUND
INY
JMP DAGLP2
.DAGFD
CLC ; GET BIT POSITION BACK
LDA MPTMPD
ADC #8
STA MPTMPD
BCC DAGFD1
INC MPTMPD + 1
BNE DAGFD1
INC MPTMPD + 2
.DAGFD1
LDA MPTMPD
STA MPTMPC; SAVE BIT COUNT
INC MPTMPC
LDA (MPSCPT),Y; GET CORRECT BYTE
LDX #9
.DAGLP3
ROR A; ROTATE TO GET CORRECT POSITION
DEX
DEC MPTMPC
BNE DAGLP3
PHA ;SAVE VALUE
TYA
PHA ; SAVE POSITION
LDY #3
LDA (MAPGEN),Y; GET NUMBER OF BLOCKS TO BE DEALLOCATED
STA MPTMPC
INY
LDA (MAPGEN),Y
STA MPTMPC + 1
PLA ; GET POSITION BACK
TAY
PLA
.DAGNX
SEC ;MARK BLOCK FREE
ROR A
DEX
BEQ DAGEOB
PHP
PHA ; SAVE VALUE
.DAGNX1
LDA MPTMPC
BNE DAGNX2
DEC MPTMPC + 1
.DAGNX2
DEC MPTMPC; DECREMENT COUNT
LDA MPTMPC + 1
ORA MPTMPC; CHECK FOR END
BEQ DAGSK1
PLA ; GET VALUE BACK
PLP
JMP DAGNX; DEALLOCATE NEXT BLOCK