-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathBIOS.s
More file actions
1080 lines (1072 loc) · 29.1 KB
/
BIOS.s
File metadata and controls
1080 lines (1072 loc) · 29.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
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
37160 ;OUP/M BIOS WRITTEN BY SHAO,JIAN-XIONG
37170 ;ON JULY 1982
37180 ;ERROR NO. LISTING
37190 ;$20 INDEX HOLE FOUND WHILE WRITING
37200 ;$21 INDEX HOLE FOUND WHILE READING
37210 ;$22 DRIVE NOT READY
37220 ;$23 TRACK NOT MATCH
37230 ;$24 DISK WRITING PROTECTION
37240 ;$25 I/O DEVICE NOT DEFINED
37250 ;$40 BUFFER AND DISK NOT MATCH
37260 ;$80 PARITY ERROR
37270 *=$E41A ;OPBIOS START ADDR.
37280 START=$00
37290 IOBYTE=$03 ;I/0 BYTE
37300 COUNTER=$04 ;PAGE NO. COUNTER
37310 DEREG=$09 ;WORK STORAGES
37320 HLREG=$0B
37330 HLREG1=$00
37340 FLAG=$0F
37350 TEMP=$1F
37360 IOBFFG=$39 ;'FLUSH' FLAG
37370 CRTDSK=$3A ;CURRENT DISK NO.
37380 BLKNB1=$42 ;BLOCK#
37390 SECNB1=$43 ;SECTOR#
37400 TKNDER=$44 ;PREVIOUS TRACK# WHICH THEN
37410 ;CHANGE TO DESIRED TRACK#
37420 TRKDRC=$45 ;DESIRED TRACK#
37430 DMAREG=$46 ;DMA ADDRESS
37440 TRKCRN=$48 ;HEAD POSITION TRACK#
37450 TKTMAX=$49 ;MAX TIMES FOR MATCHING TRACK#
37460 ERORFG=$4A ;ERROR FLAG
37470 STATFG=$4B ;STATE FLAG
37480 IOBUFA=$4C
37490 PAGNUB=$4E ;PAGE COUNT
37500 ERTMAX=$4F ;R/W MAX TIMES
37510 DVACIA=$C010 ;DISK I/O PORT
37520 DVPIA1=$C000 ;DISK CONTROL
37530 DVPIA2=$C002 ;DISK CONTROL
37540 CLACIA=$FC00 ;CONSOLE I/O PORT
37550 PTACIA=$CF02 ;PRINTER I/O PORT
37560 SLACIA=$CF00 ;SERIAL COMMUNICATION I/O PORT
37570 USACI1=$FB03 ;USER USING I/O PORT
37580 USACI2=$F400 ;USER USING I/O PORT
37590 IOBUF=$B000 ;DISK I/O BUFFER ADDR.
37600 CCPSAT=$D000 ;CCP ENTRY NO. 1
37610 CCPST1=$D3F5 ;CCP ENTRY NO. 2
37620 BDOS=$D93F ;BDOS ENTRY
37630 WHBCOT .BYTE $28
37640 FRYCST .BYTE $62
37650 DKCONT .BYTE $40,$00
37660 DIKCRT .BYTE $00
37670 PAMTAB .WORD DIRBUF,MAPAR0,CHKAR0,$0000 ;DIAK PARA.
37680 .WORD HIRBUF,MAPAR1,CHKAR1,$0000 ;HEAD TABLE
37690 ;
37700 ; *****************************************************
37710 ; * *
37720 ; * NUMBER 0 : INITIALIZE INPUT/OUTPUT PORT *
37730 ; * *
37740 ; *****************************************************
37750 ;
37760 B00T=*
37770 ;
37780 LDA #$80 ;SET IOBYTE TO INDICATE SELECTING
37790 ;PRINTER IN LIST FIELD AND
37800 STA IOBYTE ;SELECTING CONSOLE IN CONSLE FIELD
37810 LDY #$00 ;SET DVPIA1+1 BIT 2 TO ZERO,INDICAT
37820 ;DVPIA1 IS DIRECTION REGISTER NOW.
37830 STA DVPIA1+1
37840 LDY #$40 ;SET DVPIA1 BIT 6 OUTPUT AND REST
37850 ;INPUT
37860 STY DVPIA1
37870 LDY #$04 ;SET BACK INDICATING DVPIA1 IS
37880 ;CONTROL GATE NOW
37890 STY DVPIA1+1
37900 LDA #$03 ;INITIAIZE CONSOLE PORT
37910 STA CLACIA
37920 LDY #$11
37930 STY CLACIA
37940 STA PTACIA ;INITIALIZE PRINTER PORT
37950 STY PTACIA
37960 STA SLACIA ;INITIALIZE SERIAL COMMUN. PORT
37970 STY SLACIA
37980 LDA USACI1+3 ;INITIALIZE USER PORT1
37990 LDX #$FF
38000 STX USACI1+2
38010 LDY #$00 ;INITIALIZE USER PORT2
38020 STY USACI2+1
38030 STY USACI2
38040 STY USACI2+3
38050 STX USACI2+2
38060 LDA #$04
38070 STA USACI2+1
38080 STA USACI2+3
38090 RTS
38100 ;
38110 ; *****************************************************
38120 ; * *
38130 ; * NUMBER 1 : WARM BOOT *
38140 ; * *
38150 ; *****************************************************
38160 ;
38170 WBOOT=*
38180 ;
38190 NOP
38200 LDA #CCPSAT ;SET STARTING ADDR, OF CCP FOR DMA
38210 LDX #CCPSAT/256
30220 JSR STDMA1
38230 LDA #$00 ;SELECT DRIVE A
38240 STA DIKCRT
38250 JSR DIKSEL
38260 LDA #$01 ;SELECT TRACK 1
38270 STA TRKDRC
38280 LDA #$00 ;SELECT SECTOR 00
38290 STA SECNB1
38300 LDA #$10 ;SET READ SECTOR FLAG
38310 STA FLAG
38320 W$OOT=*
38330 JSR RWDBS1 ;READ A SECTOR FROM DISK
38340 CLC
38350 LDA #$80 ;NO INCREASE DMAREG TO GET NEXT
38360 ;SECTOR
38370 ADC DMAREG
38380 STA DMAREG
38390 BCC WB$OT
38400 INC DMAREG+1
38410 WB$OT=*
38420 INC SECNB1 ;SET SECTOR NUMBER WITHIN ONE TRACK
38430 LDA SECNB1
38440 CMP #$1C ;ONE TRACK IS DONE?
38450 BNE W$OOT ;IF NOT,KEPT READING
38460 LDA #DFBUFA ;RECOVE DEFAULT BUFFER
38470 LDX #DFBUFA/256
38480 JSR STDMA1
38490 LDA #$4C
38500 STA START+5 ;SET JMP BDOS AT$05
38510 STA START ;SET JMP WBOOT AT $00
38520 LDA #WBOOT
38530 STA START+1
38540 LDA #WBOOT/256
38550 STA START+2
38560 LDA #BDOS
38570 STA START+6
38580 LDA #BDOS/256
38590 STA START+7
38600 LDA #$00
38610 STA IOBFFG
38620 JMP CCPSAT
38630 ;
38640 C0NTST=* ;CONSOLE TEST FOR RECEIVE READY
38650 ;
38660 LDA CLACIA ;TEST BIT 0 OF CLACIA FOR READY
38670 AND #$01
38680 BNE C$LTST
38690 RTS ;IF NOT READY,RETURN WITH A=$00
38700 C$LTST=*
38710 LDA #$FF ;IF READY,RETURN WITH A=$FF
33720 RTS
38730 ;
38740 CONIN=* ;READ A CHARACTER FROM CONSOLE
38750 ;
38760 JSR CONTST ;TEST FOR CONSOLE'S READY,IF NOT
38770 BEQ CONIN ;KEPT TESTING
38780 LDA CLACIA+1 ;IF READY,READ A CHARACTER
38790 AND #$7F ;MASK OFF IT'S BIT 7
38800 RTS
38810 ;
38820 CONTOT=* ;CONSOLE TEST FOR TRANSMIT READY
38830 ;
38840 LDA CLACIA ;TEST BIT1 OF CLACIA FOR READY
38850 AND #$02
38860 BNE C$NTOT
38870 RTS ;IF NOT READY,RETURN WITH A=$00
38880 C$NTOT=*
38890 LDA #$FF ;IF READY,RETURN WITH A=$FF
38900 RTS
38910 ;
38920 CONOUT=* ;OUTPUT A CHARACTER TO CONSOLE
38930 ;
38940 JSR CONTOT ;KEPT TESTING UNTIL IS READY
38950 BEQ CONOUT
38960 STX CLACIA+1 ;SENT A CHARACTER TO CONSOLE
38970 RTS
38980 ;
38990 PRTTST=* ;PRINTER TEST FOR TRANSMIT READY
39000 ;
39010 LDA PTACIA ;TEST BIT1 OF PTACIA FOR READY
39020 AND #$02
39030 BNE P$TTST
39040 RTS ;IF NOT READY,RETURN WITH A=$00
39050 P$TTST=*
39060 LDA #$FF ;IF READY, RETURN WITH A=$FF
39070 RTS
39080 ;
39090 PRTOUT=* ;PRINTER OUTPUT
39100 ;
39110 JSR PRTTST ;KEPT TESTING,UNTIL IS READY
39120 BEQ PRTOUT
39130 STX PTACIA+1 ;OUTPUT A CHARACTER
39140 LDA PTACIA ;TEST FOR RECEIVING READY
39150 AND #$01
39160 BNE P$TOUT
39170 RTS ;IF NOT,RETURN
39180 P$TOUT=*
39190 LDA PTACIA+1 ;IF READY,READ A CHARACTER
39200 CMP #$13 ;CONTROL-S
39210 BNE PR$OUT ;IF NOT CONTROL-S RETURN
39220 RTS
39230 PR$OUT=*
39240 LDA PTACIA ;IF CONTROL-S WAIT UNTL CONTROL-Q
39250 AND #$01 ;IS RECEIVED
39260 BEQ PR$OUT
39270 CMP #$11
39280 BNE PR$OUT
39290 RTS
39300 ;
39310 SRLTST=* ;SERIAL COMMUN. RECEIVE READY TEST
39320 ;
39330 LDA SLACIA ;THE BIT 0 OF SLACIA FOR READY
39340 AND #$01
39350 BNE S$LTST ;NOT,RETURN WITH A=$00
39340 RTS
39370 S$LTST=*
393S0 LDA #$FF ;READY,RETURN WITH A=$FF
39390 RTS
39400 ;
39410 SRLIN=*
39420 ;
39430 JSR SRLTST ;KEPT TESTING,UNTIL IS READY
39440 BEQ SRLIN
39450 LDA SLACIA+1 ;READ A CHARACTER
39460 AND #$7F ;MASK OFF IT'S BIT 7
39470 RTS
39480 ;
39490 SRLTOT=* ;SERIAL COMMUN. TRANSMIT READY TEST
39500 ;
39510 LDA SLACIA ;TEST BIT 1 OF SLACIA FOR READY
39520 AND #$02
39530 BNE S$LTOT
39540 RTS ;IF NOT,RETURN WITH A=$00
39550 S$LTOT=*
39560 LDA #$FF ;IF READY,RETURN WITH A=$FF
39570 RTS
39580 ;
39590 SRLOUT=*
39600 ;
39610 JSR SRLTOT ;KEPT TESTING,UNTIL SLACIA IS
39620 ;READY
39630 BEQ SRLOUT
39640 STX SLACIA+1 ;OUTPUT A CHARACTER
39650 RTS
39660 ;
39670 ;
39680 OUTBFF=*
39690 ;
39700 LDY #$00
39710 OU$BFF=*
39720 LDA (DEREG),Y
39730 CMP #$24
39740 BNE O$TBFF
39750 RTS
39760 O$TBFF=*
39770 TAX
39780 JSR CONOUT
39790 INY
39800 BNE OU$BFF
39810 ;
39820 ;
39830 ;
39840 ; *****************************************************
39850 ; * *
39860 ; * NUMBER 2 : SAMPLE THE STATUS OF THE CURRENTLY *
39870 ; * ASSIGNED CONSOLE DEVICE *
39880 ; * *
39890 ; *****************************************************
39900 ; * *
39910 ; * RETURNED VALUE : *
39920 ; * REGISTER A : $FF READY TO READ *
39930 ; * $00 NOT READY *
39940 ; * *
39950 ; *****************************************************
39960 ;
39970 CSLTET=*
39980 ;
39990 LDA IOBYTE ;GET THE CONSLE FIELD OF IOBYTE
40000 AND #$03
40010 BNE C$LTET
40020 JMP CONTST ;IF #$00 TO CONSOLE TEST
40030 C$LTET=*
40040 CMP #$01
40050 BNE CS$TET
40060 JMP PRTTST ;IF #$01 TO PRINT TEST
40070 CS$TET=*
40080 CMP #$03
40090 BNE CSL$ET
40100 JMP USRTST ;IF #$03 TO USER TEST
40110 CSL$ET=*
40120 JMP SRLTST ;IF #$02 TO SERIAL TEST
40130 ;
40140 ; *****************************************************
40150 ; * *
40160 ; * NUMBER 3 : READ FROM THE CURRENT ASSIGNED CONSLE *
40170 ; * DEVICE *
40180 ; * *
40190 ; *****************************************************
40200 ; * *
40210 ; * RETURNED VALUE : *
40220 ; * REGISTER A : CHARACTER TO BE READ IN *
40230 ; * *
40240 ; *****************************************************
40250 ;
40260 CLINN=*
40270 ;
40280 LDA IOBYTE ;GET THE CONSOLE FIELD OF IOBYTE
40290 AND #$03
40300 BNE C$INN
40310 CLIN$=*
40320 JMP CONIN ;IF #$00 TO CONSOLE IN
40330 C$INN=*
40340 CMP #$01
40350 BNE CL$NN
40360 JMP SRLIN ;IF #$01 TO SERIAL COMMUNICATOR IN
40370 CL$NN=*
40380 CMP #$03
40390 BNE CLIN$ ;IF #$02 TO CONSOLE IN
40400 JMP USRIN ;IF #$30 TO USERIN
40410 ;
40420 ; *****************************************************
40430 ; * *
40440 ; * NUMBER 4 : OUTPUT CHARACTER TO THE CURRENTLY *
40450 ; * ASSIGNED CONSOLE DEVICES *
40460 ; * *
40470 ; *****************************************************
40480 ; * *
40490 ; * ENTRY PARAMETERS 1 *
40500 ; * REGISTER A : CHARACTER TO BE OUTPUT *
40510 ; * *
40520 ; *****************************************************
40530 ;
40540 CLOUTT=*
40550 ;
40560 TAX
40570 LDA IOBYTE ;GET CONSOLE FIELD OF IOBYTE
40580 AND #$03
40590 BNE C$OUTT
40600 CLOU$T=*
40610 JMP CONOUT ;IF #$00 TO CONSLE OUT
40620 C$OUTT=*
40630 CMP #$01
40640 BNE CL$UTT
40650 JMP SRLOUT ;IF #$01 TO SERIAL COMMUNICATON OUT
40660 CL$UTT=*
40670 CMP #$03
40680 BNE CLOU$T ;IF #$02 TO CONSOLE OUT
40690 JMP USROUT ;IF #$03 TO USER OUT
40700 ;
40710 ; *****************************************************
40720 ; * *
40730 ; * NUMBER 5 : OUTPUT CHARACTER TO THE CURRENTLY *
40740 ; * ASSIGNED LIST DEVICE *
40750 ; * *
40760 ; *****************************************************
40770 ; * *
40780 ; * ENTRY PARAMETERS : *
40790 ; * REGISTER A : CHARACTER TO BE OUTPUT *
40800 ; * *
40810 ; *****************************************************
40820 ;
40830 LITOUT=*
40840 ;
40850 TAX
40860 LDA IOBYTE ;GET LIST FIELD OF IOBYTE
40870 AND #$C0
40880 BNE L$TOUT
40890 LITO$T=*
40900 JMP CONOUT ;IF #$00 TO CONSLE OUT
40910 L$T0UT=*
40920 CMP #$01
40930 BNE LI$OUT
40940 JMP SRLOUT ;IF #$01 TO SERIAL COMMUN. OUT
40950 LI$OUT=*
40960 CMP #$03
40970 BEQ LITO$T ;IF #$03 TO CONSOLE
40980 JMP PRTOUT ;IF #$02 TO PRINTER OUT
40990 ;
41000 ; *****************************************************
41010 ; * *
41020 ; * NUMBER 6 : OUTPUT A CHARACTER TO THE CURRENTLY *
41030 ; * ASSIGNED PUNSH DEVICE *
41040 ; * *
41060 ; *****************************************************
41050 ; * *
41070 ; * ENTRY PARAMETERS : *
41080 ; * REGISTER A : A CHARACTER TO BE OUTPUT *
41090 ; * *
41100 ; *****************************************************
41110 ;
41120 PUHOUT=* ;RESERVE FOR FURTHER USE
41130 ;
41140 ; *****************************************************
41150 ; * *
41160 ; * NUMBER 7 : READ A CHARACTER FROM THE CURRENTYLY *
41170 ; * ASSIGNED READER DEVICE *
41180 ; * *
41190 ; *****************************************************
41200 ; * *
41210 ; * RETURNED VALUE : *
41220 ; * REGISTER A : A CHARACTER BE READ IN *
41230 ; * *
41240 ; *****************************************************
41250 ;
41260 READIN=* ;RESERVE FOR FURTHER USE
41270 ;
41280 USRTST=* ;RESERVE FOR FURTHER USE
41290 USROUT=* ;AS ABOVE
41300 USRIN=* ;AS ABOVE
41310 LDA #$25
41320 JMP ERROR
41330 ;
41340 DELAYB=* ;DELAY ROUTINE
41350 ;
41360 INC DELYMR
41370 INC DELYMR
41380 INC DELYMR
41390 INC DELYMR
41400 RTS
41410 DELYMR*=*+1
41420 ;
41430 ;
41440 DELYMS=* ;DELAY 1 MS
41450 ;
41460 JSR DELAYB
41470 DEY
41480 BNE DELYMS
41490 RTS
41500 ;
41510 DLYMS1=* ;DELAY (X) MS
41520 ;
41530 LDX #$0C
41540 D$YMS1=*
41550 LDY FRYCST
41560 JSR DELYMS
41570 DEX
41580 BNE D$YMS1
41590 DL$MS1=*
41600 RTS
41610 ;
41620 DELYUS=* ;DELAY (X)*100 US
41630 ;
41640 LDA FRYCST
41650 D$LYUS=*
41660 BIT $00
41670 SEC
41680 SBC #$05
41690 BCS D$LYUS
41700 DEX
41710 BNE DELYUS
41720 RTS
41730 ;
41740 ; *****************************************************
41750 ; * *
41760 ; * NUMBER 8 : POSITION HEAD TO TRACK 0 *
41770 ; * *
41780 ; *****************************************************
41790 ;
41800 HOMEHD=* ;HOME HEAD TO ZERO
41810 ;
41820 JSR STPIN
41830 JSR DLYMS1
41840 STY TRKCRN
41850 STY TKNDER
41860 H$MEHD=*
41870 LDA #$02
41880 BIT DVPIA1
41890 BEQ DLYMS1
41900 JSR STPOUT
41910 BEQ H$MEHD
41920 ;
41930 ASLDS1= ;(A) * 2'S POWER OF (X)
41940 ;
41950 ASL A
41960 ROL TEMP
41970 DEX
41980 BNE ASLDS1
41990 RTS
42000 ;
42010 ADCOF1=*
42020 ;
42030 CLC
42040 ADC HLREG
42050 STA HLREG
42060 LDA TEMP
42070 ADC HLREG+1
42080 STA HLREG+1
42090 RTS
42100 ;
42110 ADCIOF=*
42120 ;
42130 LDX #IOBUF
42140 STX HLREG
42150 LDX #IOBUF/256
42160 STX HLREG+1
42170 JMP ADCOF1
42180 ;
42190 DIKSEL= ;GET DESIRED DISK PARAMETERS
42200 ;
42210 LDX DIKCRT
42220 LDA DKCONT,X
42230 STA DVPIA1
42240 LDA #$FF
42250 STA DVPIA2
42260 D$KSEL=*
42270 LDA #$10
42280 CPX #$01
42290 BEQ DI$SEL
42300 LDA #$01
42310 DI$SEL=*
42320 BIT DVPIA1
42330 RTS
42340 ;
42350 ; *****************************************************
42360 ; * *
42370 ; * NUMBER 9 : SELECT DISK *
42380 ; * *
42390 ; *****************************************************
42400 ; * *
42410 ; * ENTRY PARAMETERS : *
42420 ; * REGISTER A : DISK NUMBER *
42430 ; * *
42440 ; *****************************************************
42450 ;
42460 DKSEL1=*
42470 ;
42480 STA DIKCRT ;STORE DESIRED DISK NO.
42490 LDX #$03 ;*8 TO GET OFFSET
42500 JSR ASLDS1
42510 LDX #PAMTAB
42520 STX HLREG
42530 LDX #PAMTAB/256
42540 STX HLREG+1
42550 LDX #$00
42560 STX TEMP
42570 JSR ADCOF1 ;GET DESIRED ENTRY ADDR.
42580 JSR DIKSEL ;GET PARA. & TEST DISK READY
42590 BNE D$SEL1
42600 JMP HOMEHD ;READY! HOME HEAD
42610 D$SEL1=*
42620 JMP TRKPS1 ;IF DISK NOT READY,ERR
42630 ;
42640 ; *****************************************************
42650 ; * *
42660 ; * NUMBER 10 : SET TRACK NUMBER *
42670 ; * *
42680 ; *****************************************************
42690 ; * *
42700 ; * ENTRY PARAMETERS : *
42710 ; * REGISTER A : TRACK NUMBER *
42720 ; * *
42730 ; *****************************************************
42740 ;
42750 SETTR1=*
42760 ;
42770 STA TRKDRC
42780 RTS
42790 ;
42800 ; *****************************************************
42810 ; * *
42820 ; * NUMBER 11 : SET SECTOR NUMBER *
42830 ; * *
42840 ; *****************************************************
42850 ; * *
42860 ; * ENTRY PARAMETERS : *
42870 ; * REGISTER A : SECTOR NUMBER *
42880 ; * *
42890 ; *****************************************************
42900 ;
42910 SETSC1=*
42920 ;
42930 STA SECNB1
42940 RTS
42950 ;
42960 ; *****************************************************
42970 ; * *
42980 ; * NUMBER 12 : SET BLOCK NUMBER *
42990 ; * *
43000 ; *****************************************************
43010 ; * *
43020 ; * ENTRY PARAMETERS : *
43030 ; * REGISTER A : BLOCK NUMBER *
43040 ; * *
43050 ; *****************************************************
43060 ;
43070 SETBL1=*
43080 ;
43090 STA BLKNB1
43100 RTS
43110 ;
43120 ; *****************************************************
43130 ; * *
43140 ; * NUMBER 13 : SET DMA *
43150 ; * *
43160 ; *****************************************************
43170 ; * *
43180 ; * ENTRY PARAMETERS : *
43190 ; * REGISTER A,X : DMA ADDRESS *
43200 ; * *
43210 ; *****************************************************
43220 ;
43230 STDMA1=*
43240 ;
43250 STA DMAREG
43260 STX DMAREG+1
43270 RTS
43280 ;
43290 SEKIHL=* ;SEEK INDEX HOLE
43300 ;
43310 LDA DVPIA1
43320 BMI SEKIHL
43330 S$KIHL=*
43340 LDA DVPIA1
43350 BPL S$KIHL
43360 RTS
43370 ;
43380 STPOUT=* ;STEP OUT ONE TRACK
43390 ;
43400 LDA DVPIA2 ;SET BIT 2 OF DVPIA2
43410 ORA #$04
43420 BNE STEP
43430 STPIN=* ;STEP IN ONE TRACK
43440 LDA #$FB
43450 AND DVPIA2 ;RESET BIT 2 OF DVPIA2
43460 STEP=*
43470 STA DVPIA2 ;STEP IN OR OUT ACCORDINGLY
43480 JSR DL$MS1 ;DELAY!
43490 AND #$F7 ;SENT A PULSE TO STEP HEAD
43500 STA DVPIA2
43510 JSR DL$MS1
43520 JSR DL$MS1
43530 ORA #$08
43540 STA DVPIA2
43550 JSR DL$MS1 ;DELAY!
43560 LDX #$08
43570 JMP D$YMS1 ;DELAY!
43580 ;
43590 SIHSDK=* ;SEEK HOLE ,SET ACIA
43600 ;
43610 JSR SEKIHL
43620 LDA #$03
43630 STA DVACIA
43640 LDA #$58
43650 STA DVACIA
43660 RTS
43670 ;
43680 LDHEAD=* ;LOAD HEAD
43690 ;
43700 LDA #$7F ;RESET BIT 7 OF DVPIA2
43710 AND DVPIA2
43720 L$HEAD=*
43730 STA DVPIA2 ;LOAD OR UNLOAD HEAD ACCORDINGLY
43740 LDX #$28 ;DELAY
43750 JMP D$YMS1
43760 ;
43770 UNLDHD=* ;UNLOAD HEAD
43780 LDA #$80 ;SET BIT 7 OF DVAPIA2
43790 ORA DVPIA2
43800 BNE L$HEAD
43810 ;
43820 WRTDIK=* ;WRITE A BYTE TO DISK
43830 ;
43840 LDA DVPIA1 ;INDEX HOLE FOUND?
43850 BPL W$TDIK
43860 LDA DVACIA ;READY?
43870 LSR A
43880 LSR A
43890 BCC WRTDIK ;IF NO,KEEP TESTING!
43900 STX DVACIA+1 ;WRITE A BYTE TO DISK
43910 RTS
43920 W$TDIK=*
43930 LDA #$20 ;IF INDEX HOLE FOUND, ERR!
43940 JMP ERROR
43950 ;
43960 REDDIK=* ;READ ABYTE FROM DISK
43970 ;
43980 LDA DVPIA1 ;INDEX HOLE FOUND?
43990 BPL R$DDIK ;FOUND, ERROR!
44000 LDA DVACIA ;READY?
44010 LSR A
44020 BCC REDDIK ;IF NO, KEEP TESTING
44030 LDA DVACIA+1 ;READ IN A CHAR.
44040 RTS
44050 R$DDIK=*
44060 LDA #$21 ;INDEX HOLE FOUND,ERROR!
44070 JMP ERROR
44080 ;
44090 TRKPSA=* ;PUT HEAD TO DESIRED TRACK
44100 ;
44110 LDX DIKCRT ;DESIRED DISK READY?
44120 JSR D$KSEL
44130 BEQ T$KPSA
44140 TRKPS1=*
44150 LDA #$22 ;NOT READY,ERROR!
44160 JMP ERROR
44170 T$KPSA=*
44180 LDA TKNDER ;CURRENT DESIRED TRACK =
44190 CMP TRKCRN ;CURRENT HEAD POSITION?
44200 BEG TR$PSA ;IF EQUAL, FINISH STEPIN6
44210 BCS TRK$SA ;IF GREATER,STEP IN ONE TRACK
44220 JSR STPOUT ;OIF LESS,STEP OUT ONE TARACK
44230 LDA #$99 ;AND SET 'A' TO 99 INDICATING
44240 BCC TRKP$A ;SUBTRACTING ONE TRACK
44250 TRK$SA=*
44260 JSR STPIN
44270 TXA
44280 TRKP$A=*
44290 SED
44300 ADC TRKCRN ;+ (OR -) ONE TO (OR FROM)
44310 STA TRKCRN ;CURRENT HEAD POSITION
44320 CLD
44330 JMP T$KPSA ;KEEP STEPIN6 UNTIL DONE
44340 TR$PSA=*
44350 CMP #$43 ;CHECK CURRENT TRACK RANGE
44360 LDA DVPIA2 ;IF IN NO.43-76, RESET BIT 7
44370 AND #$BF ;OF DVPIA2 TO ADJUST CURRENT
44380 LDY #$00
44390 NOP
44400 BCS TRKPS$
44410 LDA #$40 ;IF IN NO.0-42, SET BIT 7
44420 ORA DVPIA2 ;OF DVACIA
44430 TRKPS$=*
44440 STA DVPIA2
44450 RTS
44460 ;
44470 TRKPSH=*
44480 ;
44490 JSR TRKPSA ;POSITION HEAD
44500 LDA #IOBUF ;SET DISK I/O BUFFER ADDR.
44510 STA IOBUFA
44520 LDA #IOBUF/256
44530 STA IOBUFA+1
44540 JMP LDHEAD ;LOAD HEAD
44550 ;
44560 TKNMTH=* ;MATCH TRACK#
44570 ;
44580 LDA #$05 ;SET MAX. TRACK READ TIMES
44590 STA TKTMAX
44600 TKNM$H=*
44610 JSR SIHSDK ;SEEK INDEX HOLE, SET DVACIA
44620 T$NMTH=*
44630 JSR REDDIK ;READ A BYTE INTO 'A'
44640 TK$MTH=*
44650 CMP #$43 ;FIND TRACK IDENTIFICATION
44660 BNE T$NMTH ;NO. $43 & $57
44670 JSR REDDIK
44680 CMP #$57
44690 BNE TK$MTH
44700 JSR REDDIK ;CHECK TRACK NO.
44710 CMP TKNDER
44720 BNE TKN$TH
44730 RTS ;IF MATCH,RETURN!
44740 TKN$TH=* ;IF NOT,HOME HEAD AND TRY AGAIN
44750 DEC TKTMAX ;MAX, TIME EXCEED?
44760 BEQ TKNMT$
44770 LDA TKNDER ;NO? SAME CURRENT DESIRED NO.
44730 PHA
44790 JSR HOMEHD ;HOME HEAD!
44SOO PLA
44810 STA TKNDER ;RECOVE TRACK NO.
44820 JSR T$KPSA ;POSITION HEAD AGAIN
44830 JMP TKNM$H ;MATCHT THEM AGAIN!
44840 TKNMT$=*
44850 LDA #$23 ;MAX, EXHAUSTED, ERROR!
44860 JMP ERROR
44870 ;
44880 WRTTKS=* ;WRITE A TRACK TO DISK
44890 ;
44900 LDA #$20 ;INDEX HOLE FOUND!
44910 BIT DVPIA1
44920 BNE W$TTKS
44930 LDA #$24 ;IF FOUND, ERROR!
44940 JMP ERROR
44950 W$TTKS=*
44960 JSR TKNMTH ;CHECK IF TRACK NO, ARE MATCHED
44970 LDX #$04 ;DELAY!
44980 JSR DELYUS
44990 LDA #$FE ;ENABLE ERASING
45000 AND DVPIA2
45010 STA DVPIA2
45020 LDX #$02 ;DELAY!
45030 JSR DELYUS
45040 LDA #$FD ;ENABLE WRITING
45050 AND DVPIA2
45060 STA DVPIA2
45070 LDX #$08 ;DELAY!
45080 JSR DELYUS
45090 LDX #$76 ;WRITE START FLAG $76
45100 JSR WRTDIK
45110 LDX #$0E ;SET 14 PAGES
45120 STX PAGNUB
45130 LDY #$00
45140 WR$TKS=*
45150 LDA (IOBUFA),Y ;GET A BYTE FROM DISK I/O
45160 TAX ;BUFFER AND WRITE IT
45170 JSR WRTDIK ;TO THE DISK
45180 INY
45190 BNE WR$TKS
45200 INC IOBUFA+1
45210 DEC PAGNUB ;KEEP DOING UNTIL 14 PAGE DONE
45220 BNE WR$TKS
45230 LDX #$47 ;WRITE END FLAG
45240 JSR WRTDIK
45250 LDX #$53
45260 JSR WRTDIK
45270 LDA DVPIA2 ;DISABLE WRITING
45280 ORA #$01
45290 STA DVPIA2
45300 LDX #$05 ;DELAY!
45310 JSR DELYUS
45320 LDA DVPIA2 ;DISABLE ERASING
45330 ORA #$02
45340 STA DVPIA2
45350 LDA #I0BUF/256
45360 STA IOBUFA+ ;RECOVE I/O BUFFER ADDR,1
45370 RTS
45380 ;
45390 REDTKS=* ;READ A TRACK
45400 ;
45410 JSR TKNMTH ;MATCH TRACK NO.
45420 R$DTKS=*
45430 JSR REDDIK ;FIND DATA AREA START FLAG
45440 CMP #$76
45450 BNE R$DTKS
45460 LDX #$0E ;SET TOTAL PAGE NO. 14
45470 LDY #$00
45480 STY ERORFG ;INIT ERR FLAG
45490 LDA #$01
45500 RE$TKS=*
45510 BIT DVACIA ;READY?
45520 BEQ RE$TKS
45530 LDA DVACIA+ ;READ A BYTE
45540 BVC RED$KS ;PARITY ERR?
45550 LDA #$80 ;IF IS, SET ERR FLAG
45560 STA ERORFG
45570 R$$TKS=*
45580 CLC ;RESET CARRY TO INDICATE ERR
45590 RTS
45600 RED$KS=*
45610 BIT STATFG
45620 BPL REDTK$
45630 CMP (IOBUFA),Y ;YES, COMPARE IT WITH THE ONE
45640 BEQ REDTK$ ;IN THE I/O BUFFER READ IN BEFORE
45650 LDA #$40 ;IF NOT, SET ERR FLAG
45660 STA ERORFG
45670 BNE R$$TKS
45680 REDTK$=*
45690 STA (IOBUFA),Y
45700 LDA #$01
45710 INY
45720 BNE RE$TKS ;ONE PAGE DONE?
45730 INC IOBUFA+ ;YES, INCREAMENT HIGH BYTE
45740 DEX
45750 BNE RE$TKS ;14 PAGE DONE?
45760 LDA #IOBUF/256
45770 STA IOBUFA+1 ;RECOVE I/O BUFFER ADDR.
45780 SEC ;SET CARRY INDICATING NO ERR
45790 RTS
45800 ;
45810 WRTTRK=* ;WRITE A TRACK UTILL NO ERROR
45S20 ;
45830 LDA #$A0 ;SET NO REREAD MODE
45840 STA STATFG
45850 JSR TRKPSH ;POSITION HEAD TO DESIRED TRACK
45860 LDA #$04 ;SET MAX. WRITE TIMES
45870 STA ERTMAX+1
45880 W$TTRK=*
45890 JSR WRTTKS ;WRITE A TRACK
45900 JMP RE$TRK ;GO TO REREAD MODE TO CHECK
45910 ;
45920 REDTRK=* ;;READ A TRACK UNTIL NO ERROR
45930 ;
45940 LDA #$40 ;SET NO REREAD MODE
45950 STA STATFG
45960 JSR TRKPSH ;POSITION HEAD TO DESIRED TRACK
45970 LDA #$04
45980 STA ERTMAX
45990 RE$TRK=*
46000 LDA #$06
46010 STA ERTMAX+2
46020 REDT$K=*
46030 JSR REDTKS ;READ A TRACK
46040 BCC REREAD ;IF ERR, GO TO ERR HANDLING
46050 BIT STATFG ;REREAD MODE/?
46060 BMI R$DTRK
46070 LDA #$80 ;IF NOT, SET FLAG TO INDICATE
46080 ORA STATFG ;NOW IS IN REREAD MODE
46090 STA STATFG
46100 BNE RE$TRK ;AND GO BACK TO REREAD!
46110 R$DTRK=*
46120 JMP UNLDHD ;IF IS REREAD,UNLOAD HEAD, FINISH
46130 NOP
46140 REREAD=* ;ERR HANDLING
46150 LDA #I0BUF/256
46160 STA IOBUFA+1
46170 DEC ERTMAX+2
46180 BNE REDT$K
46190 BIT ERORFG
46200 BMI RE$EAD
46210 BIT STATFG
46220 BV3 R$READ
46230 DEC ERTMAX+1
46240 BNE W$TTRK
46250 R$READ=*
46260 LDA ERORFG
46270 JMP ERROR
46280 RE$EAD=*
46290 DEC ERTMAX
46300 BEQ R$READ
46310 JSR STPOUT
46320 JSR DLYMS1
46330 JSR STPIN
46340 JSR DLYMS1
46350 BEQ RE$TRK
46360 RESV27*=*+5
46370 ;
46380 ; *****************************************************
46390 ; * *
46400 ; * NUMBER 14 : READ/WRITE B/S FROM/TO DISK *
46410 ; * *
46420 ; *****************************************************
46430 ;
46440 RWDBS1=* ;READ/WRITE B/S FROM/TO DISK
46450 ;
46460 LDA TKNDER ;TRACK 0?
46470 BEQ RWDB$$
46480 CMP TRKDRC ;DESIRED TRACK = CURRENT TRACK?
46490 BEQ R$DBS1 ;YES, NO DISK I/O
46500 BIT IOBFFG ;'FLUSH' FLAG SET?
46510 BPL RWDB$$ ;IF NO, NO WRITING BACK
46520 JSR WRTTRK ;WRITE BACK TO CURRENT TRACK
46530 RWDB$$=*
46540 LDA TRKDRC ;STORE DESIRED NO, TO CURRENT NO.
46550 STA TKNDER
46560 JSR REDTRK ;READ THIS TRACK
46570 LDA #$00 ;FLUSH 'FLUSH' FLAG
46580 STA IOBFFG
46590 R$DBS1=*
46600 BIT FLAG ;WRITE OR READ?
46610 BVC RWD$$$
46620 LDA #$80 ;IF WRITE? SET 'FLUSH' FLSA6
46630 STA IOBFFG
46640 RWD$$$=*
46650 NOP
46660 NOP
46670 NOP
46680 NOP
46690 NOP
46700 LDA DMAREG ;SENT DMA ADDR. TO HLREG1
46710 STA HLREG1
46720 LDA DMAREG+1
46730 STA HLREG1+1
46740 LDY #$00
46750 STY TEMP
46760 LDA #$10 ;SECTOR OPERATION?
46770 BIT FLAG
46780 BEQ RE$BS1
46790 LDA SECNB1 ;YES? READ OR WRITE A SECTOR
46800 LDX #$07 ;BETWEEN DISK I/O BUFFER AND DMA
46810 JSR ASLDS1
46820 JSR ADCIOF
46830 RED$S1=*
46840 BIT FLAG
46850 BVS REDBS$
44360 LDA (HLREG),Y
46S70 STA (HLREG1),Y
46830 JMP R$$BS1
46890 REDBS$=*
46900 LDA (HLREG1),Y
46910 STA (HLREG),Y
46920 RIIBS1=*
46930 INY
46940 CPY #$80
46950 BNE RED$S1
46960 RTS
46970 RE$BS1=*
46980 LDA BLKNB1 ;IF IS BLOCK OPERATION, READ
46990 LDX #$09 ;OR WRITE A BLOCK BETWEEN
47000 JSR ASLDS1 ;DISK I/O BUFFER AND DMA
47010 JSR ADCIOF
47020 LDX #$02
47030 REDB$1=*
47040 BIT FLAG
47050 BVS RE$$S1
47060 LDA (HLREG),Y
47070 STA (HLREG1),Y