-
Notifications
You must be signed in to change notification settings - Fork 136
Expand file tree
/
Copy path86DOS.DIF
More file actions
1810 lines (1779 loc) · 47.7 KB
/
86DOS.DIF
File metadata and controls
1810 lines (1779 loc) · 47.7 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
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
1)1 00230 SMALLDIR: EQU 1 ;1 to enable, 0 to disable
1) 00260 ; Turn on switch below to allow testing disk code with DEBUG. It sets
****
2)1 00230 SMALLDIR: EQU 0 ;1 to enable, 0 to disable
2) 00260 ; Turn on switch below to allow testing disk code with DEBUG. It sets
**************
1)1 00300 DSKTEST: EQU 0 ;1 to enable, 0 to disable
1) 00330 ; Interrupt Entry Points:
****
2)1 00300 DSKTEST: EQU 1 ;1 to enable, 0 to disable
2) 00330 ; Interrupt Entry Points:
**************
1)1 00460 MAXCOM: EQU 41
1) 00470 ESCCH: EQU 1BH
1) 00480 INTBASE:EQU 80H
****
2)1 00460 MAXCOM: EQU 45
2) 00470 ESCCH: EQU 0
2) 00480 INTBASE:EQU 80H
**************
1)1 00590 ; Field definition for FCBs
****
2)1 00580 ;Date format
2) 00590 ;16 15 14 13 11 10 9 8 7 6 5 4 3 2 1 0
2) 00600 ; y y y y y y y m m m m d d d d d
2) 00610 ;
2) 00620 ;where y=year,m=month,d=day
2) 00640 ; Field definition for FCBs
**************
1)1 00790 ;
1) 00800 ; Location bytes Description
1) 00810 ;
1) 00820 ; 0 11 File name and extension ( 0E5H if empty)
1) 00830 ; 11 13 Zero field (for expansion)
1) 00840 ; 24 2 Date. Bits 0-4=day, bits 5-8=month, bits 9-15=year-1980
****
2)1 00850 ; Location bytes Description
2) 00870 ; 0 11 File name and extension ( 0E5H if empty)
2) 00880 ; 11 1 Attributes. Bits 1 or 2 make file hidden
2) 00890 ; 12 12 Zero field (for expansion)
2) 00900 ; 24 2 Date. Bits 0-4=day, bits 5-8=month, bits 9-15=year-1980
**************
1)1 00870 ;
1) 00880 ; The File Allocation Table uses a 12-bit entry for each allocation unit on
1) 00890 ; the disk. These entries are packed, two for every three bytes. The contents
1) 00900 ; of entry number N is found by 1) multiplying N by 1.5; 2) adding the result
1) 00910 ; to the base address of the Allocation Table; 3) fetching the 16-bit word at
1) 00920 ; this address; 4) If N was odd (so that N*1.5 was not an integer), shift the
1) 00930 ; word right four bits; 5) mask to 12 bits (AND with 0FFF hex). Entry number
1) 00940 ; zero is used as an end-of-file trap in the OS and as a flag for directory
1) 00950 ; entry size (if SMALLDIR selected). Entry 1 is reserved for future use. The
1) 00960 ; first available allocation unit is assigned entry number two, and for Drive Parameter Block
1) 00980 ORG 0
****
2)1 00950 ; Field definition for Drive Parameter Block
2) 00970 ORG 0
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
**************
1)1 01270 BIOSSEG: EQU 40H
1) 01280 ORG 0
****
2)1 01260 BIOSSEG: EQU 60H
2) 01270 ORG 0
**************
1)1 01650 ESCTAB:
1) 01660 DB "SC" ;Copy one char
1) 01670 DB "VN" ;Skip one char
1) 01680 DB "TA" ;Copy to char
1) 01690 DB "WB" ;Skip to char
1) 01700 DB "UH" ;Copy line
1) 01710 DB "HH" ;Kill line (no change in template)
1) 01720 DB "RM" ;Reedit line (new template)
1) 01730 DB "DD" ;Backspace
1) 01740 DB "P@" ;Enter insert mode
1) 01750 DB "QL" ;Exit insert mode
1) 01760 DB ESCCH,ESCCH ;Escape character
1) 01770 DB ESCCH,ESCCH ;End of table
1) 01790 ESCTABLEN:EQU $-ESCTAB
1) 01810 HEADER: DB 13,10,"86-DOS version 1.00"
1) 01830 IF DSKTEST
1) 01840 DB "D"
1) 01850 ENDIF
1) 01870 DB 13,10
1) 01880 DB "Copyright 1980,81 Seattle Computer Products, Inc.",13,10,"$"
1) 01900 QUIT:
****
2)1 01630 ENDDOS: DW ENDDOS ;SEGMENT FOR COMMAND STORED HERE
2) 01640 ESCTAB:
2) 01650 DB 77 ;Copy one char--RIGHT ARROW
2) 01660 DB 59 ;Copy one char--F1
2) 01670 DB 83 ;Skip one char--DELETE
2) 01680 DB 60 ;Copy to char--F2
2) 01690 DB 62 ;Skip to char--F4
2) 01700 DB 61 ;Copy line--F3
2) 01710 DB 64 ;Ctrl-Z--F6
2) 01720 DB 63 ;Reedit line (new template)--F5
2) 01730 DB 75 ;Backspace--LEFT ARROW
2) 01740 DB 82 ;Toggle insert mode--INSERT
2) 01750 DB 65 ;Escape character--F7
2) 01760 DB 65 ;End of table
2) 01780 ESCTABLEN:EQU $-ESCTAB
2) 01810 QUIT:
**************
1)1 02420 MOV BP,SP
1) 02430 MOV BX,[BP+CSSAVE]
1) 02440 SEG CS
1) 02450 MOV [CSLOC],BX
1) 02460 MOV SP,CS
1) 02470 MOV SS,SP
1) 02480 MOV SP,STACK
1) 02490 EI ;Stack OK now
****
2)1 02330 MOV SP,CS
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
2) 02340 MOV SS,SP
2) 02350 REDISP:
2) 02360 MOV SP,IOSTACK
2) 02370 EI ;Stack OK now
**************
1)1 02570 IF DSKTEST
1) 02580 CMP AH,12
1) 02590 JL SAMSTK
1) 02600 MOV SP,TESTSTK
1) 02610 SAMSTK:
1) 02620 ENDIF
1) 02640 SEG CS
****
2)1 02440 CMP AH,12
2) 02450 JLE SAMSTK
2) 02460 MOV SP,DSKSTACK
2) 02470 SAMSTK:
2) 02480 SEG CS
**************
1)1 02790 MOV [SPSA ENDIF
1) 02810 PBX
1) 02820 POP CX
****
2)1 02630 MOV [SPSAVE],AX
2) 02640 SEG CS
2) 02650 MOV AX,[NSS]
2) 02660 SEG CS
2) 02670 MOV [SSSAVE],AX
2) 02680 ENDIF
2) 02700 POP AX
2) 02710 POP BX
2) 02720 POP CX
**************
1)1 02930 DW ABORT ;0
1) 02940 DW CONIN
****
2)1 02830 DW ABORT
2) 02840 DW CONIN
**************
1)1 02980 DW LIST ;5
1) 02990 DW RAWIO
****
2)1 02880 DW LIST
2) 02890 DW RAWIO
**************
1)1 03030 DW BUFIN ;10
1) 03040 DW CONSTAT
1) 03050 DW VERSION
1) 03060 DW DSKRESET
1) 03070 DW SELDSK
1) 03080 DW OPEN ;15
1) 03090 DW CLOSE
****
2)1 02930 DW BUFIN
2) 02940 DW CONSTAT
2) 02950 DW FLUSHKB
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
2) 02960 DW DSKRESET
2) 02970 DW SELDSK
2) 02980 DW OPEN
2) 02990 DW CLOSE
**************
1)1 03130 DW SEQRD ;20
1) 03140 DW SEQWRT
****
2)1 03030 DW SEQRD
2) 03040 DW SEQWRT
**************
1)1 03180 DW CURDRV ;25
1) 03190 DW SETDMA
****
2)1 03080 DW CURDRV
2) 03090 DW SETDMA
**************
1)1 03230 DW SETATTRIB ;30
1) 03240 DW GETDSKPT
****
2)1 03130 DW SETATTRIB
2) 03140 DW GETDSKPT
**************
1)1 03280 DW FILESIZE ;35
1) 03290 DW SETRNDREC
****
2)1 03180 DW FILESIZE
2) 03190 DW SETRNDREC
**************
1)1 03370 VERSION:
1) 03380 GETIO:
****
2)1 03260 DW GETDATE
2) 03270 DW SETDATE
2) 03280 DW GETTIME
2) 03290 DW SETTIME ;45
2) 03310 GETIO:
**************
1)1 03440 MOV AL,0
1) 03450 RET
1) 03480 READER:
1) 03490 CALL BIOSAUXIN,BIOSSEG
****
2)1 03370 INUSE:
2) 03380 GETDSKPT:
2) 03390 MOV AL,0
2) 03400 RET
2) 03420 FLUSHKB:
2) 03430 XOR BX,BX
2) 03440 MOV ES,BX ;Select segment 0
2) 03450 SEG ES
2) 03460 MOV B,[41AH],1EH ;Reset KB queue head pointer
2) 03470 SEG ES
2) 03480 MOV B,[41CH],1EH ;Reset tail pointer
2) 03490 MOV AH,AL
2) 03500 CMP AL,1
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
2) 03510 JZ REDISPJ
2) 03520 CMP AL,7
2) 03530 JZ REDISPJ
2) 03540 CMP AL,8
2) 03550 JZ REDISPJ
2) 03560 CMP AL,10
2) 03570 JZ REDISPJ
2) 03575 MOV AL,0
2) 03580 RET
2) 03600 REDISPJ:JMP REDISP
2) 03620 READER:
2) 03630 AUXIN:
2) 03640 CALL STATCHK
2) 03650 CALL BIOSAUXIN,BIOSSEG
**************
1)1 03540 CALL BIOSAUXOUT,BIOSSEG
****
2)1 03700 AUXOUT:
2) 03710 PUSH AX
2) 03720 CALL STATCHK
2) 03730 POP AX
2) 03740 CALL BIOSAUXOUT,BIOSSEG
**************
1)1 03860 MOV SI,BADMES
1) 03870 CALL OUTMES
1) 03880 JMP ERROR
1) 03910 PACK:
****
2)1 04070 PUSH AX
2) 04080 MOV AH,80H
2) 04090 MOV DI,0FFFH
2) 04100 CALL FATAL
2) 04110 POP AX
2) 04120 RET
2) 04150 PACK:
**************
1)1 04230 IOCHK:
1) 04240 MOV CX,5 ;Check rest of name but not extension
1) 04250 CMP B,[DI],":"
1) 04260 JNZ NOCOL
1) 04270 INC DI ;Skip over colon
1) 04280 DEC CX
1) 04290 NOCOL:
1) 04300 MOV AL," "
****
2)1 04454 DEVNAME:
2) 04455 MOV SI,IONAME ;List of I/O devices with file names
2) 04456 MOV BL,6 ;BL = number of device names
2) 04457 LOOKIO:
2) 04458 MOV DI,NAME1
2) 04459 MOV CX,4 ;All device names are 4 letters
2) 04460 REPE
2) 04461 CMPB ;Check for name in list
2) 04462 JZ IOCHK ;If first 4 letters OK, check the rest
2) 04463 ADD SI,CX ;Point to next device name
2) 04464 DEC BL
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
2) 04465 JNZ LOOKIO
2) 04466 CRET:
2) 04467 STC
2) 04468 RET
2) 04470 IOCHK:
2) 04480 MOV CX,4 ;Check rest of name but not extension
2) 04490 MOV AL," "
**************
1)1 04330 JNZ FILSRCH
1) 04340 DEC BL
1) 04350 RET
1) 04370 GETFILE:
1) 04390 ; Inputs:
****
2)1 04520 JNZ CRET
2) 04530 MOV AL,BL
2) 04540 MOV BX,IONUM-1
2) 04550 XLAT ;Translate to internal device number
2) 04560 MOV BL,AL
2) 04570 MOV BH,-1
2) 04580 RET
2) 04600 GETFILE:
2) 04610 ; Same as GETNAME except ES:DI points to FCB on successful return
2) 04620 CALL MOVNAME
2) 04630 JC RET
2) 04640 PUSH DX
2) 04650 PUSH DS
2) 04660 CALL FINDNAME
2) 04670 POP ES
2) 04680 POP DI
2) 04690 RET
2) 04710 GETNAME:
2) 04730 ; Inputs:
**************
1)1 04480 ; BP = Base of drive parameters
****
2)1 04820 ; Zero set if attributes match (always except when creating)
2) 04830 ; BP = Base of drive parameters
**************
1)1 04620 MOV SI,IONAME ;List of I/O devices with file names
1) 04630 MOV BX,0FF04H ;BL = number of devices
1) 04640 LOOKIO:
1) 04650 MOV DI,NAME1
1) 04660 MOV CX,3 ;All device names are 3 letters
1) 04670 REPE
1) 04680 CMPB ;Check for name in list
1) 04690 JZ IOCHK ;If first 3 letters OK, check the rest
1) 04700 ADD SI,CX ;Point to next device name
1) 04710 DEC BL
1) 04720 JNZ LOOKIO
1) 04730 FILSRCH: ;Not a device name
1) 04740 CALL STARTSRCH
****
2)1 04961 CALL DEVNAME
2) 04962 JNC RET
2) 05090 CALL STARTSRCH
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
**************
1)1 05010 ADD SI,15
1) 05020 RET
****
2)1 05370 ;Check if attributes allow finding it
2) 05380 MOV AH,[ATTRIB] ;Attributes of search
2) 05390 NOT AH
2) 05400 AND AH,[SI] ;Compare with attributes of file
2) 05410 ADD SI,15
2) 05420 AND AH,6 ;Only look at bits 1 and 2
2) 05430 JZ RET
2) 05440 TEST B,[CREATING],-1
2) 05450 JZ NEXTENT
2) 05460 RET
**************
1)1 05230 MOV [LASTENT],AX
****
2)1 05670 GETENT:
2) 05680 MOV [LASTENT],AX
**************
1)1 05920 CALL GETFILE
1) 05930 JC ERRET
1) 05940 CMP BH,-1 ;Check if device name
1) 05950 JZ ERRET ;Can't delete I/O devices
1) 05960 DELFILE:
****
2)1 06370 CALL GETNAME
2) 06375 MOV AL,-1
2) 06380 JC RET
2) 06390 CMP BH,AL ;Check if device name
2) 06400 JZ RET ;Can't delete I/O devices
2) 06410 DELFILE:
**************
1)1 06180 CMP BH,-1 ;Check if I/O device name
1) 06190 JZ ERRET ;If so, can't rename it
1) 06200 ADD SI,5
****
2)1 06650 ADD SI,5
**************
1)1 06250 RENFIL:
1) 06260 MOV B,[DIRTYDIR],-1
1) 06270 MOV DI,BX
1) 06280 MOV SI,NAME2
****
2)1 06692 CMP BH,-1 ;Check if I/O device name
2) 06694 JZ ERRET ;If so, can't rename it
2) 06700 MOV SI,NAME1
2) 06710 MOV DI,NAME3
2) 06720 MOV CX,6 ;Include attribute byte
2) 06730 REP
2) 06740 MOVW ;Copy name to search for
2) 06750 RENFIL:
2) 06760 MOV DI,NAME1
2) 06770 MOV SI,NAME2
**************
1)1 06330 JZ NOCHG
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
1) 06340 MOV [DI],AL
1) 06350 NOCHG:
1) 06360 INC DI
1) 06370 LOOP NEWNAM
1) 06380 CALL CONTSRCH
****
2)1 06820 JNZ NOCHG
2) 06830 MOV AL,[BX]
2) 06840 NOCHG:
2) 06850 STOB
2) 06860 INC BX
2) 06870 LOOP NEWNAM
2) 06871 MOV B,[DI],6 ;Stop duplicates with any attributes
2) 06872 CALL DEVNAME ;Check if giving it a device name
2) 06874 JNC RENERR
2) 06890 PUSH [LASTENT] ;Save position of match
2) 06895 MOV [LASTENT],-1 ;Search entire dirctory for duplicate
2) 06900 CALL CONTSRCH ;See if new name already exists
2) 06910 POP AX
2) 06920 JNC RENERR ;Error if found
2) 06930 CALL GETENT ;Re-read matching entry
2) 06940 MOV DI,BX
2) 06950 MOV SI,NAME1
2) 06960 MOV CX,11
2) 06970 REP
2) 06980 MOVB ;Replace old name with new
2) 06990 MOV B,[DIRTYDIR],-1 ;Flag change in directory
2) 07000 MOV SI,NAME3
2) 07010 MOV DI,NAME1
2) 07020 MOV CX,6 ;Include attribute byte
2) 07030 REP
2) 07040 MOVW ;Copy name back into search buffer
2) 07050 CALL CONTSRCH
**************
1)1 06440 ERRET:
****
2)1 07102 RENERR:
2) 07104 CALL CHKDIRWRITE
2) 07110 ERRET:
**************
1)1 06520 ; DS, DX point to FCB
1) 06530 ; Outputs:
1) 06540 ; ES = CS
****
2)1 07190 ; DS, DX point to FCB or extended FCB
2) 07200 ; Outputs:
2) 07210 ; DS:DX point to normal FCB
2) 07220 ; ES = CS
**************
1)1 06610 MOV AX,CS
****
2)1 07290 SEG CS
2) 07300 MOV B,[CREATING],0
2) 07310 MOV AX,CS
**************
1)1 06660 CALL GETBP
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
****
2)1 07360 SEG CS
2) 07370 MOV [EXTFCB],AL
2) 07380 MOV AH,0
2) 07390 CMP AL,-1
2) 07400 JNZ HAVATTRB
2) 07410 ADD DX,7
2) 07420 ADD SI,6
2) 07430 MOV AH,[SI-1]
2) 07440 LODB
2) 07450 HAVATTRB:
2) 07460 SEG CS
2) 07470 MOV [ATTRIB],AH
2) 07480 CALL GETBP
**************
1)1 06730 LODB
1) 06740 AND AL,7FH
1) 06750 CMP AL,60H
1) 06760 JLE CASEOK
1) 06770 AND AL,5FH
1) 06780 CASEOK:
1) 06790 CMP AL,20H
****
2)1 07550 CALL GETLET
2) 07560 JNZ CTRLCHK ;Is it a delimiter?
2) 07570 CMP AL," " ;This is the only delimiter allowed
2) 07580 STC ;In case of error
2) 07590 JNZ RET
2) 07600 CTRLCHK:
2) 07610 CMP AL,20H
**************
1)1 06970 PUSH DX
1) 06980 PUSH DS
1) 06990 CALL GETFILE
****
2)1 07790 CALL GETFILE
**************
1)1 07020 ; in directory. DS=ES=CS, BX points to directory
1) 07030 ; entry in DIRBUF, SI points to First Cluster field, and
1) 07040 ; the top of the stack has the address and segment
1) 07050 ; of the FCB to be opened. This entry point is used
1) 07060 ; by CREATE.
1) 07070 POP ES
1) 07080 POP DI
1) 07090 JC ERRET
****
2)1 07820 ; in directory. DS=CS, BX points to directory
2) 07830 ; entry in DIRBUF, SI points to First Cluster field, and
2) 07840 ; ES:DI point to the FCB to be opened. This entry point
2) 07850 ; is used by CREATE.
2) 07860 JC ERRET
**************
1)1 07870 PUSH DX
1) 07880 PUSH CX
1) 07890 PUSH BX
1) 07900 PUSH AX
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
1) 07910 CALL DREAD
1) 07920 OR AL,AL
1) 07930 POP AX
1) 07940 POP BX
1) 07950 POP CX
1) 07960 POP DX
1) 07970 JNZ BADFAT
1) 07990 IF SMALLDIR
****
2)1 08640 PUSH AX
2) 08650 CALL DSKREAD
2) 08660 POP AX
2) 08670 JC BADFAT
2) 08690 IF SMALLDIR
**************
1)1 08220 ADD DX,CX
****
2)1 08920 MOV CX,DI
2) 08930 ADD DX,CX
**************
1)1 08250 POP BP
1) 08260 ;{Insert error code here. All FATs on drive are bad.}
1) 08270 MOV SI,BADFATMES
1) 08280 CALL HARDERR
1) 08290 JP FATREAD
1) 08310 OKRET1:
****
2)1 08960 CALL FIGFAT ;Reset registers
2) 08970 JMP DREAD ;Try first FAT once more
2) 08990 OKRET1:
**************
1)1 08370 CMP B,[DI+FILDIRBLK],-1 ;Check for I/O device
****
2)1 09050 CMP B,[DI],-1
2) 09060 JNZ NORMFCB3
2) 09070 ADD DI,7
2) 09080 NORMFCB3:
2) 09090 CMP B,[DI+FILDIRBLK],-1 ;Check for I/O device
**************
1)1 08620 PUSH DX
1) 08630 PUSH DS
1) 08640 CALL GETFILE
1) 08650 POP ES
1) 08660 POP DI
1) 08670 BADCLOSEJ:
****
2)1 09340 CALL GETFILE
2) 09350 BADCLOSEJ:
**************
1)1 09710 PUSH DX
****
2)1 10390 SEG CS
2) 10400 MOV B,[CREATING],1
2) 10410 PUSH DX
**************
1)1 09820 POP DS
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
****
2)1 10520 ERRPOP:
2) 10530 POP DS
**************
1)1 09890 CMP BH,-1 ;Check if file is I/O device
1) 09900 JZ OPENJMP ;If so, no action
1) 09910 XOR CX,CX
1) 09920 MOV [SI+2],CX
1) 09930 MOV AX,[DATE]
1) 09950 IF SMALLDIR
1) 09960 MOV [SI+4],CL
1) 09970 CMP B,[BP+DIRSIZ],-1
1) 09980 JZ SMLENT
1) 09990 MOV [SI+5],CL
1) 10000 MOV [SI-2],AX
1) 10010 SMLENT:
1) 10020 ENDIF
1) 10040 IF 1-SMALLDIR
1) 10050 MOV [SI+4],CX
1) 10060 MOV [SI-2],AX
1) 10070 ENDIF
1) 10090 XCHG CX,[SI]
1) 10100 PUSH SI
1) 10110 PUSH BX
1) 10120 JCXZ WRTBACK
1) 10130 CMP CX,[BP+MAXCLUS]
1) 10140 JA WRTBACK
1) 10150 MOV BX,CX
1) 10160 LEA SI,[BP+FAT]
1) 10170 CALL RELEASE
1) 10180 CALL FATWRT
1) 10190 JP WRTBACK
1) 10210 FREESPOT:
****
2)1 10600 JNZ ERRPOP ;Error if attributes don't match
2) 10610 CMP BH,-1 ;Check if file is I/O device
2) 10620 JZ OPENJMP ;If so, no action
2) 10630 MOV CX,[SI] ;Get pointer to clusters
2) 10640 JCXZ FREESPOT
2) 10650 CMP CX,[BP+MAXCLUS]
2) 10660 JA FREESPOT
2) 10670 PUSH BX
2) 10680 MOV BX,CX
2) 10690 LEA SI,[BP+FAT]
2) 10700 CALL RELEASE ;Free any data already allocated
2) 10710 CALL FATWRT
2) 10720 POP BX
2) 10730 FREESPOT:
**************
1)1 10280 XOR AX,AX
1) 10300 IF SMALLDIR
****
2)1 10810 IF SMALLDIR
**************
1)1 10350 JP SMALLENT
****
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
2)1 10860 XOR AX,AX
2) 10870 JP SMALLENT
**************
1)1 10390 MOV CL,13
1) 10400 REP
1) 10410 STOB
1) 10420 MOV AX,[DATE]
1) 10430 STOW
****
2)1 10910 MOV AL,[ATTRIB]
2) 10920 STOB
2) 10930 XOR AX,AX
2) 10940 MOV CL,6
2) 10950 REP
2) 10960 STOW
2) 10970 CALL DATE16
2) 10980 STOW
**************
1)1 10510 WRTBACK:
1) 10520 CALL DIRWRITE
****
2)1 11060 CALL DIRWRITE
**************
1)1 10570 JMP DOOPEN
****
2)1 11110 POP ES
2) 11120 POP DI
2) 11130 JMP DOOPEN
**************
1)1 10940 ; Outputs:
1) 10950 ; AL = 0 if no error, otherwise non-zero
1) 10960 ; BP preserved. All other registers destroyed.
1) 10980 MOV AL,[BP+DRVNUM]
****
2)1 11500 ; BP preserved. All other registers destroyed.
2) 11520 CALL DSKREAD
2) 11530 JNC RET
2) 11540 SEG CS
2) 11550 MOV B,[READOP],0
2) 11560 CALL HARDERR
2) 11570 CMP AL,1 ;Check for retry
2) 11580 JZ DREAD
2) 11590 RET ;Ignore otherwise
2) 11610 HARDERR:
2) 11620 ;Hard disk error handler. Entry conditions:
2) 11630 ; DS:BX = Original disk transfer address
2) 11640 ; DX = Original logical sector number
2) 11650 ; CX = Number of sectors to go (first one gave the error)
2) 11660 ; AX = Hardware error code
2) 11670 ; DI = Original sector transfer count
2) 11680 ; BP = Base of drive parameters
2) 11690 ; [READOP] = 0 for read, 1 for write
2) 11710 XCHG AX,DI ;Error code in DI, count in AX
2) 11720 SUB AX,CX ;Number of sectors successfully transferred
2) 11730 ADD DX,AX ;First sector number to retry
2) 11740 PUSH DX
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
2) 11750 MUL AX,[BP+SECSIZ] ;Number of bytes transferred
2) 11760 POP DX
2) 11770 ADD BX,AX ;First address for retry
2) 11780 MOV AH,0 ;Flag disk section in error
2) 11790 CMP DX,[BP+FIRFAT] ;In reserved area?
2) 11800 JB ERRINT
2) 11810 INC AH ;Flag for FAT
2) 11820 CMP DX,[FIRDIR] ;In FAT?
2) 11830 JB ERRINT
2) 11840 INC AH
2) 11850 CMP DX,[FIRREC] ;In directory?
2) 11860 JB ERRINT
2) 11870 INC AH ;Must be in data area
2) 11880 ERRINT:
2) 11890 SHL AH ;Make room for read/write bit
2) 11900 SEG CS
2) 11910 OR AH,[READOP]
2) 11920 FATAL:
2) 11930 MOV AL,[BP+DRVNUM] ;Get drive number
2) 11940 PUSH BP ;The only thing we preserve
2) 11950 SEG CS
2) 11960 MOV [CONTSTK],SP
2) 11970 DI ;Prepare to play with stack
2) 11980 SEG CS
2) 11990 MOV SS,[SSSAVE]
2) 12000 SEG CS
2) 12010 MOV SP,[SPSAVE] ;User stack pointer restored
2) 12020 INT 24H ;Fatal error interrupt vector
2) 12030 SEG CS
2) 12040 MOV [SPSAVE],SP
2) 12050 SEG CS
2) 12060 MOV [SSSAVE],SS
2) 12070 MOV SP,CS
2) 12080 MOV SS,SP
2) 12090 SEG CS
2) 12100 MOV SP,[CONTSTK]
2) 12110 EI
2) 12120 POP BP
2) 12130 CMP AL,2
2) 12140 JZ ERROR
2) 12150 RET
2) 12170 DSKREAD:
2) 12180 MOV AL,[BP+DRVNUM]
**************
1)1 11080 JC HARDREAD
1) 11090 XOR AL,AL
1) 11100 RET
1) 11120 HARDREAD:
1) 11130 MOV SI,RDERRMES
1) 11140 CALL HARDERR
1) 11150 JP DREAD
1) 11180 CHKDIRWRITE:
****
2)1 12280 RET
2) 12310 CHKDIRWRITE:
**************
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
1)1 11490 ; Outputs:
1) 11500 ; AL = 0 if no error, otherwise non-zero
1) 11510 ; BP preserved. All other registers destroyed.
1) 11530 MOV AL,[BP+DRVNUM]
1) 11540 WRTDRV:
1) 11550 PUSH AX
1) 11560 PUSH BP
****
2)1 12620 ; BP preserved. All other registers destroyed.
2) 12640 MOV AL,[BP+DRVNUM]
2) 12650 PUSH BP
**************
1)1 11650 POP AX
1) 11660 JC HARDWRITE
1) 11670 XOR AL,AL
1) 11680 RET
1) 11690 HARDWRITE:
1) 11700 MOV SI,WRTERRMES
1) 11710 CALL HARDERR
1) 11720 JP WRTDRV
1) 11750 HARDERR:
1) 11760 SUB DI,CX
1) 11770 ADD DX,DI
1) 11780 CALL SHFTDI7
1) 11790 ADD BX,DI
1) 11800 MOV AH,AL ;Save drive number
1) 11810 CALL OUTMES
1) 11820 GETINSTR:
1) 11830 CALL IN
1) 11840 OR AL,20H
1) 11850 CMP AL,"a"
1) 11860 JZ ERROR
1) 11870 CMP AL,"r"
1) 11880 JZ RETRY
1) 11890 CMP AL,"i"
1) 11900 JZ IGNORE
1) 11910 CMP AL,"c"
1) 11920 JNZ GETINSTR
1) 11930 CONTINUE:
1) 11940 POP AX
1) 11950 MOV AL,1
1) 11960 RET
1) 11970 IGNORE:
1) 11980 POP AX
1) 11990 MOV AL,0
1) 12000 RET
1) 12010 RETRY:
1) 12020 MOV AL,AH ;Restore drive number
1) 12030 RET
****
2)1 12740 JNC RET
2) 12750 SEG CS
2) 12760 MOV B,[READOP],1
2) 12770 CALL HARDERR
2) 12780 CMP AL,1 ;Check for retry
2) 12790 JZ DWRITE
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
2) 12800 RET
**************
1)1 12080 MOV DS,[CSLOC]
1) 12090 XOR AX,AX
****
2)1 12840 LDS SI,[SPSAVE]
2) 12850 MOV DS,[SI+CSSAVE]
2) 12860 XOR AX,AX
**************
1)1 13120 MOV AX,[DI+RR]
****
2)1 13890 CMP B,[DI],-1
2) 13900 JNZ NORMFCB1
2) 13910 ADD DI,7
2) 13920 NORMFCB1:
2) 13930 MOV AX,[DI+RR]
**************
1)1 13180 MOV B,[DSKERR],-2
1) 13190 POP BX
****
2)1 13990 MOV B,[DSKERR],4
2) 14000 POP BX
**************
1)1 13880 DIV AX,[BP+SECSIZ]
1) 13890 MOV [SECPOS],AX
****
2)1 14690 MOV BX,[BP+SECSIZ]
2) 14700 CMP DX,BX ;See if divide will overflow
2) 14710 JNC EOFERR
2) 14720 DIV AX,BX
2) 14730 MOV [SECPOS],AX
**************
1)1 14020 JZ OK ;Must stay within 64K
1) 14030 MOV AX,[DMAADD]
1) 14040 NEG AX ;Amount of room left in segment
1) 14050 XOR DX,DX
1) 14060 DIV AX,SI ;How many records will fit?
1) 14070 MUL AX,SI ;Translate that back into bytes
****
2)1 14860 JZ OK ;Must be less than 64K
2) 14870 MOV AX,[DMAADD]
2) 14880 NEG AX ;Amount of room left in segment
2) 14890 JNZ PARTSEG ;All 64K available?
2) 14900 DEC AX ;If so, reduce it by one
2) 14910 PARTSEG:
2) 14920 XOR DX,DX
2) 14930 DIV AX,SI ;How many records will fit?
2) 14940 MOV [RECCNT],AX
2) 14950 MUL AX,SI ;Translate that back into bytes
**************
1)1 15170 OR AL,AL
1) 15180 JNZ SETBUF
1) 15190 CMP DX,[BUFSECNO]
****
2)1 16050 MOV [PREREAD],AL
2) 16060 CMP DX,[BUFSECNO]
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
**************
1)1 15280 MOV AL,[BUFDRVNO]
1) 15290 MOV BX,[BUFFER]
****
2)1 16150 PUSH BP
2) 16160 MOV BP,[BUFDRVBP]
2) 16170 MOV BX,[BUFFER]
**************
1)1 15320 CALL WRTDRV
1) 15330 POP DX
1) 15340 RDSEC:
1) 15350 MOV BX,[BUFFER]
****
2)1 16200 CALL DWRITE
2) 16210 POP BP
2) 16220 POP DX
2) 16230 RDSEC:
2) 16240 TEST B,[PREREAD],-1
2) 16250 JNZ SETBUF
2) 16260 MOV BX,[BUFFER]
**************
1)1 15450 FINBUF:
****
2)1 16360 MOV [BUFDRVBP],BP
2) 16370 FINBUF:
**************
1)1 16560 CALL BIOSAUXIN,BIOSSEG
1) 16570 STOB
****
2)1 17480 CALL AUXIN
2) 17490 STOB
**************
1)1 18310 WRTLST:
****
2)1 19230 DEC BL
2) 19240 JNZ ENDWRDEV ;Done if device is NUL
2) 19250 WRTLST:
**************
1)1 18350 CALL BIOSPRINT,BIOSSEG
1) 18360 LOOP WRTLST
****
2)1 19290 CALL LISTOUT
2) 19300 LOOP WRTLST
**************
1)1 18410 CALL BIOSAUXOUT,BIOSSEG
1) 18420 CMP AL,1AH
****
2)1 19350 CALL AUXOUT
2) 19360 CMP AL,1AH
**************
1)1 18900 SEG CS
1) 18910 MOV BX,[DATE]
1) 18920 MOV [DI+FDATE],BX
1) 18930 CALL SETUP
1) 18940 SEG ES
****
File 1) DSKC:86DOS.ASM[500,500] created: 1056 05-MAY-1981
File 2) DSKC:86DOS.A86[500,500] created: 1425 16-JUNE-1981
2)1 19840 CALL SETUP
2) 19850 CALL DATE16
2) 19860 SEG ES
2) 19870 MOV [DI+FDATE],AX
2) 19880 SEG ES
**************
1)1 19120 MOV DX,[DI+FILSIZ]
1) 19130 DIV AX,[BP+SECSIZ]
****
2)1 20060 MOV DX,[DI+FILSIZ+2]
2) 20070 DIV AX,[BP+SECSIZ]
**************
1)1 19260 JCXZ HAVSTART
1) 19270 PUSH CX ;No. of clusters short of first
****
2)1 20200 JCXZ HAVSTART ;See if no more data
2) 20210 PUSH CX ;No. of clusters short of first
**************
1)1 21460 MOV CX,1
****
2)1 22400 CMP B,[DI],-1
2) 22410 JNZ NORMFCB2
2) 22420 ADD DI,7
2) 22430 NORMFCB2:
2) 22440 MOV CX,1
**************
1)1 22920 PUSH DX
1) 22930 PUSH DS
1) 22940 CALL GETFILE
****
2)1 23900 CALL GETFILE
**************
1)1 22980 POP ES
1) 22990 POP DI
1) 23000 JC KILLSRCH
****
2)1 23940 JC KILLSRCH
**************
1)1 23100 MOV AL,[BP+DRVNUM]
****
2)1 24040 MOV AX,00FFH
2) 24050 CMP AL,[EXTFCB]
2) 24060 JNZ NORMFCB
2) 24070 STOW
2) 24080 INC AL
2) 24090 STOW
2) 24100 STOW
2) 24110 MOV AL,[ATTRIB]
2) 24120 STOB
2) 24130 NORMFCB:
2) 24140 MOV AL,[BP+DRVNUM]
**************
1)1 23530 SUB SI,3 ;Point to device name