-
Notifications
You must be signed in to change notification settings - Fork 136
Expand file tree
/
Copy pathMSDOS.LST
More file actions
5013 lines (4826 loc) · 273 KB
/
MSDOS.LST
File metadata and controls
5013 lines (4826 loc) · 273 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
The Microsoft MACRO Assembler 01-26-83 PAGE 1-1
MS-DOS version 1.25 by Tim Paterson March 3, 1982
TITLE MS-DOS version 1.25 by Tim Pate
rson March 3, 1982
PAGE 60,132
; Use the following booleans to set the switches
= 0000 FALSE EQU 0
= FFFF TRUE EQU NOT FALSE
; Use the switches below to produce the standard Microsoft version of the IBM
; version of the operating system
= MSVER EQU TRUE
= IBM EQU FALSE
; Set this switch to cause DOS to move itself to the end of memory
= HIGHMEM EQU FALSE
; Turn on switch below to allow testing disk code with DEBUG. It sets
; up a different stack for disk I/O (functions > 11) than that used for
; character I/O which effectively makes the DOS re-entrant.
= DSKTEST EQU FALSE
C INCLUDE MSDOS.ASM
C ; 86-DOS High-performance operating system for the 8086 version 1.25
C ; by Tim Paterson
C
C
C ; ****************** Revision History *************************
C ; >> EVERY change must noted below!! <<
C ;
C ; 0.34 12/29/80 General release, updating all past customers
C ; 0.42 02/25/81 32-byte directory entries added
C ; 0.56 03/23/81 Variable record and sector sizes
C ; 0.60 03/27/81 Ctrl-C exit changes, including register save on user stack
C ; 0.74 04/15/81 Recognize I/O devices with file names
C ; 0.75 04/17/81 Improve and correct buffer handling
C ; 0.76 04/23/81 Correct directory size when not 2^N entries
C ; 0.80 04/27/81 Add console input without echo, Functions 7 & 8
C ; 1.00 04/28/81 Renumber for general release
C ; 1.01 05/12/81 Fix bug in `STORE'
C ; 1.10 07/21/81 Fatal error trapping, NUL device, hidden files, date & time,
C ; RENAME fix, general cleanup
C ; 1.11 09/03/81 Don't set CURRENT BLOCK to 0 on open; fix SET FILE SIZE
C ; 1.12 10/09/81 Zero high half of CURRENT BLOCK after all (CP/M programs don't)
C ; 1.13 10/29/81 Fix classic "no write-through" error in buffer handling
C ; 1.20 12/31/81 Add time to FCB; separate FAT from DPT; Kill SMALLDIR;
C ; Add FLUSH and MAPDEV calls; allow disk mapping in DSKCHG;
C ; Lots of smaller improvements
C ; 1.21 01/06/82 HIGHMEM switch to run DOS in high memory
C ; 1.22 01/12/82 Add VERIFY system call to enable/disable verify after write
C ; 1.23 02/11/82 Add defaulting to parser; use variable escape character
C ; Don't zero extent field in IBM version (back to 1.01!)
C ; 1.24 03/01/82 Restore fcn. 27 to 1.0 level; add fcn. 28
C ; 1.25 03/03/82 Put marker (00) at end of directory to speed searches
C ;
C ; *************************************************************
The Microsoft MACRO Assembler 01-26-83 PAGE 1-2
MS-DOS version 1.25 by Tim Paterson March 3, 1982
C
C
C ; Interrupt Entry Points:
C
C ; INTBASE: ABORT
C ; INTBASE+4: COMMAND
C ; INTBASE+8: BASE EXIT ADDRESS
C ; INTBASE+C: CONTROL-C ABORT
C ; INTBASE+10H: FATAL ERROR ABORT
C ; INTBASE+14H: BIOS DISK READ
C ; INTBASE+18H: BIOS DISK WRITE
C ; INTBASE+40H: Long jump to CALL entry point
C
C ELSE
= 001B C ESCCH EQU 1BH
= 0018 C CANCEL EQU "X"-"@" ;Cancel with Ctrl-X
= C TOGLINS EQU FALSE ;Separate keys for insert mode on and off
= C TOGLPRN EQU FALSE ;Separate keys for printer echo on and off
= 0005 C NUMDEV EQU 5 ;Number of I/O device names
= C ZEROEXT EQU FALSE
C ENDIF
C
= 0024 C MAXCALL EQU 36
= 002E C MAXCOM EQU 46
= 0080 C INTBASE EQU 80H
= 0020 C INTTAB EQU 20H
= 000C C ENTRYPOINTSEG EQU 0CH
= 00C0 C ENTRYPOINT EQU INTBASE+40H
= 0023 C CONTC EQU INTTAB+3
= 0088 C EXIT EQU INTBASE+8
= 00EA C LONGJUMP EQU 0EAH
= 009A C LONGCALL EQU 9AH
= 0FFF C MAXDIF EQU 0FFFH
= 000A C SAVEXIT EQU 10
C
C ; Field definition for FCBs
C
C FCBLOCK STRUC
0000 0C [ C DB 12 DUP (?) ;Drive code and name
?? C
] C
C
000C ???? C EXTENT DW ?
000E ???? C RECSIZ DW ? ;Size of record (user settable)
0010 ???? C FILSIZ DW ? ;Size of file in bytes
0012 ???? C DRVBP DW ? ;BP for SEARCH FIRST and SEARCH NEXT
0014 ???? C FDATE DW ? ;Date of last writing
0016 ???? C FTIME DW ? ;Time of last writing
0018 ?? C DEVID DB ? ;Device ID number, bits 0-5
C ;bit 7=0 for file, bit 7=1 for I/O device
C ;If file, bit 6=0 if dirty
C ;If I/O device, bit 6=0 if EOF (input)
0019 ???? C FIRCLUS DW ? ;First cluster of file
001B ???? C LSTCLUS DW ? ;Last cluster accessed
001D ???? C CLUSPOS DW ? ;Position of last cluster accessed
The Microsoft MACRO Assembler 01-26-83 PAGE 1-3
MS-DOS version 1.25 by Tim Paterson March 3, 1982
001F ?? C DB ? ;Forces NR to offset 32
0020 ?? C NR DB ? ;Next record
0021 03 [ C RR DB 3 DUP (?) ;Random record
?? C
] C
C
0024 C FCBLOCK ENDS
= 0010 C FILDIRENT = FILSIZ ;Used only by SEARCH FIRST and SEARCH NEXT
C
C ; Description of 32-byte directory entry (same as returned by SEARCH FIRST
C ; and SEARCH NEXT, functions 17 and 18).
C ;
C ; Location bytes Description
C ;
C ; 0 11 File name and extension ( 0E5H if empty)
C ; 11 1 Attributes. Bits 1 or 2 make file hidden
C ; 12 10 Zero field (for expansion)
C ; 22 2 Time. Bits 0-4=seconds/2, bits 5-10=minute, 11-15=hour
C ; 24 2 Date. Bits 0-4=day, bits 5-8=month, bits 9-15=year-1980
C ; 26 2 First allocation unit ( < 4080 )
C ; 28 4 File size, in bytes (LSB first, 30 bits max.)
C ;
C ; The File Allocation Table uses a 12-bit entry for each allocation unit on
C ; the disk. These entries are packed, two for every three bytes. The contents
C ; of entry number N is found by 1) multiplying N by 1.5; 2) adding the result
C ; to the base address of the Allocation Table; 3) fetching the 16-bit word at
C ; this address; 4) If N was odd (so that N*1.5 was not an integer), shift the
C ; word right four bits; 5) mask to 12 bits (AND with 0FFF hex). Entry number
C ; zero is used as an end-of-file trap in the OS and as a flag for directory
C ; entry size (if SMALLDIR selected). Entry 1 is reserved for future use. The
C ; first available allocation unit is assigned entry number two, and even
C ; though it is the first, is called cluster 2. Entries greater than 0FF8H are
C ; end of file marks; entries of zero are unallocated. Otherwise, the contents
C ; of a FAT entry is the number of the next cluster in the file.
C
C
C ; Field definition for Drive Parameter Block
C
C DPBLOCK STRUC
0000 ?? C DEVNUM DB ? ;I/O driver number
0001 ?? C DRVNUM DB ? ;Physical Unit number
0002 ???? C SECSIZ DW ? ;Size of physical sector in bytes
0004 ?? C CLUSMSK DB ? ;Sectors/cluster - 1
0005 ?? C CLUSSHFT DB ? ;Log2 of sectors/cluster
0006 ???? C FIRFAT DW ? ;Starting record of FATs
0008 ?? C FATCNT DB ? ;Number of FATs for this drive
0009 ???? C MAXENT DW ? ;Number of directory entries
000B ???? C FIRREC DW ? ;First sector of first cluster
000D ???? C MAXCLUS DW ? ;Number of clusters on drive + 1
000F ?? C FATSIZ DB ? ;Number of records occupied by FAT
0010 ???? C FIRDIR DW ? ;Starting record of directory
0012 ???? C FAT DW ? ;Pointer to start of FAT
0014 C DPBLOCK ENDS
C
= 0014 C DPBSIZ EQU 20 ;Size of the structure in bytes
The Microsoft MACRO Assembler 01-26-83 PAGE 1-4
MS-DOS version 1.25 by Tim Paterson March 3, 1982
= 000B C DIRSEC = FIRREC ;Number of dir. sectors (init temporary)
= 000D C DSKSIZ = MAXCLUS ;Size of disk (temp used during init only)
C
C ;The following are all of the segments used
C ;They are declared in the order that they should be placed in the executable
C
0000 C CODE SEGMENT
0000 C CODE ENDS
C
0000 C CONSTANTS SEGMENT BYTE
0000 C CONSTANTS ENDS
C
0000 C DATA SEGMENT WORD
0000 C DATA ENDS
C
C DOSGROUP GROUP CODE,CONSTANTS,DATA
C
0000 C SEGBIOS SEGMENT
0000 C SEGBIOS ENDS
C
C
C ; BOIS entry point definitions
C
C ENDIF
C IF NOT IBM
= 0040 C BIOSSEG EQU 40H
C ENDIF
C
0000 C SEGBIOS SEGMENT AT BIOSSEG
0000 C ORG 0
0000 03 [ C DB 3 DUP (?) ;Reserve room for jump to init code
?? C
] C
C
0003 03 [ C BIOSSTAT DB 3 DUP (?) ;Console input status check
?? C
] C
C
0006 03 [ C BIOSIN DB 3 DUP (?) ;Get console character
?? C
] C
C
0009 03 [ C BIOSOUT DB 3 DUP (?) ;Output console character
?? C
] C
C
000C 03 [ C BIOSPRINT DB 3 DUP (?) ;Output to printer
?? C
] C
C
000F 03 [ C BIOSAUXIN DB 3 DUP (?) ;Get byte from auxilliary
?? C
] C
C
0012 03 [ C BIOSAUXOUT DB 3 DUP (?) ;Output byte to auxilliary
The Microsoft MACRO Assembler 01-26-83 PAGE 1-5
MS-DOS version 1.25 by Tim Paterson March 3, 1982
?? C
] C
C
0015 03 [ C BIOSREAD DB 3 DUP (?) ;Disk read
?? C
] C
C
0018 03 [ C BIOSWRITE DB 3 DUP (?) ;Disk write
?? C
] C
C
001B 03 [ C BIOSDSKCHG DB 3 DUP (?) ;Dsik-change status
?? C
] C
C
001E 03 [ C BIOSSETDATE DB 3 DUP (?) ;Set date
?? C
] C
C
0021 03 [ C BIOSSETTIME DB 3 DUP (?) ;Set time
?? C
] C
C
0024 03 [ C BIOSGETTIME DB 3 DUP (?) ;Get time and date
?? C
] C
C
0027 03 [ C BIOSFLUSH DB 3 DUP (?) ;Clear console input buffer
?? C
] C
C
002A 03 [ C BIOSMAPDEV DB 3 DUP (?) ;Dynamic disk table mapper
?? C
] C
C
C
002D C SEGBIOS ENDS
C ; Location of user registers relative user stack pointer
C
C STKPTRS STRUC
0000 ???? C AXSAVE DW ?
0002 ???? C BXSAVE DW ?
0004 ???? C CXSAVE DW ?
0006 ???? C DXSAVE DW ?
0008 ???? C SISAVE DW ?
000A ???? C DISAVE DW ?
000C ???? C BPSAVE DW ?
000E ???? C DSSAVE DW ?
0010 ???? C ESSAVE DW ?
0012 ???? C IPSAVE DW ?
0014 ???? C CSSAVE DW ?
0016 ???? C FSAVE DW ?
0018 C STKPTRS ENDS
C
C ; Start of code
The Microsoft MACRO Assembler 01-26-83 PAGE 1-6
MS-DOS version 1.25 by Tim Paterson March 3, 1982
C
0000 C CODE SEGMENT
C ASSUME CS:DOSGROUP,DS:DOSGROUP,ES:DOSGROUP,SS:DOSGROUP
C
0000 C ORG 0
= 0000 C CODSTRT EQU $
0000 E9 0024 R C JMP DOSINIT
C
0003 1B C ESCCHAR DB ESCCH ;Lead-in character for escape sequences
0004 C ESCTAB:
C IF NOT IBM
0004 53 C DB "S" ;Copy one char
0005 56 C DB "V" ;Skip one char
0006 54 C DB "T" ;Copy to char
0007 57 C DB "W" ;Skip to char
0008 55 C DB "U" ;Copy line
0009 45 C DB "E" ;Kill line (no change in template)
000A 4A C DB "J" ;Reedit line (new template)
000B 44 C DB "D" ;Backspace
000C 50 C DB "P" ;Enter insert mode
000D 51 C DB "Q" ;Exit insert mode
000E 52 C DB "R" ;Escape character
000F 52 C DB "R" ;End of table
C ENDIF
C ENDIF
C
= 000C C ESCTABLEN EQU $-ESCTAB
C IF NOT IBM
0010 0D 0A 4D 53 2D 44 C HEADER DB 13,10,"MS-DOS version 1.25"
4F 53 20 76 65 72 C
73 69 6F 6E 20 31 C
2E 32 35 C
C ENDIF
C ENDIF
C
0025 0D 0A C DB 13,10
0027 43 6F 70 79 72 69 C DB "Copyright 1981,82 Microsoft, Inc.",13,10,"$"
67 68 74 20 31 39 C
38 31 2C 38 32 20 C
4D 69 63 72 6F 73 C
6F 66 74 2C 20 49 C
6E 63 2E 0D 0A 24 C
C ENDIF
C
004B C QUIT:
004B B4 00 C MOV AH,0
004D EB 1E C JMP SHORT SAVREGS
C
004F C COMMAND: ;Interrupt call entry point
004F 80 FC 2E C CMP AH,MAXCOM
0052 76 19 C JBE SAVREGS
0054 C BADCALL:
0054 B0 00 C MOV AL,0
0056 CF C IRET: IRET
C
The Microsoft MACRO Assembler 01-26-83 PAGE 1-7
MS-DOS version 1.25 by Tim Paterson March 3, 1982
0057 C ENTRY: ;System call entry point and dispatcher
0057 58 C POP AX ;IP from the long call at 5
0058 58 C POP AX ;Segment from the long call at 5
0059 2E: 8F 06 0131 R C POP CS:[TEMP] ;IP from the CALL 5
005E 9C C PUSHF ;Start re-ordering the stack
005F FA C CLI
0060 50 C PUSH AX ;Save segment
0061 2E: FF 36 0131 R C PUSH CS:[TEMP] ;Stack now ordered as if INT had been used
0066 80 F9 24 C CMP CL,MAXCALL ;This entry point doesn't get as many calls
0069 77 E9 C JA BADCALL
006B 8A E1 C MOV AH,CL
006D C SAVREGS:
006D 06 C PUSH ES
006E 1E C PUSH DS
006F 55 C PUSH BP
0070 57 C PUSH DI
0071 56 C PUSH SI
0072 52 C PUSH DX
0073 51 C PUSH CX
0074 53 C PUSH BX
0075 50 C PUSH AX
C
C ENDIF
C
0076 2E: 89 26 0131 R C MOV CS:[SPSAVE],SP
007B 2E: 8C 16 0133 R C MOV CS:[SSSAVE],SS
0080 8C CC C MOV SP,CS
0082 8E D4 C MOV SS,SP
0084 C REDISP:
0084 BC 01DE R C MOV SP,OFFSET DOSGROUP:IOSTACK
0087 FB C STI ;Stack OK now
0088 8A DC C MOV BL,AH
008A B7 00 C MOV BH,0
008C D1 E3 C SHL BX,1
008E FC C CLD
008F 80 FC 0C C CMP AH,12
0092 7E 03 C JLE SAMSTK
0094 BC 025E R C MOV SP,OFFSET DOSGROUP:DSKSTACK
0097 C SAMSTK:
0097 2E: FF 97 00B6 R C CALL CS:[BX+DISPATCH]
009C C LEAVE:
009C FA C CLI
009D 2E: 8B 26 0131 R C MOV SP,CS:[SPSAVE]
00A2 2E: 8E 16 0133 R C MOV SS,CS:[SSSAVE]
00A7 8B EC C MOV BP,SP
00A9 88 46 00 C MOV BYTE PTR [BP.AXSAVE],AL
C
C ENDIF
C
00AC 58 C POP AX
00AD 5B C POP BX
00AE 59 C POP CX
00AF 5A C POP DX
00B0 5E C POP SI
00B1 5F C POP DI
The Microsoft MACRO Assembler 01-26-83 PAGE 1-8
MS-DOS version 1.25 by Tim Paterson March 3, 1982
00B2 5D C POP BP
00B3 1F C POP DS
00B4 07 C POP ES
00B5 CF C IRET
C ; Standard Functions
00B6 06B1 R C DISPATCH DW ABORT ;0
00B8 1253 R C DW CONIN
00BA 119D R C DW CONOUT
00BC 0141 R C DW READER
00BE 014A R C DW PUNCH
00C0 128B R C DW LIST ;5
00C2 1262 R C DW RAWIO
00C4 127F R C DW RAWINP
00C6 125C R C DW IN
00C8 1298 R C DW PRTBUF
00CA 0FBD R C DW BUFIN ;10
00CC 1249 R C DW CONSTAT
00CE 011E R C DW FLUSHKB
00D0 0F64 R C DW DSKRESET
00D2 0FAF R C DW SELDSK
00D4 03CD R C DW OPEN ;15
00D6 04BB R C DW CLOSE
00D8 0E50 R C DW SRCHFRST
00DA 0EB3 R C DW SRCHNXT
00DC 029B R C DW DELETE
00DE 06F6 R C DW SEQRD ;20
00E0 06FE R C DW SEQWRT
00E2 056D R C DW CREATE
00E4 02F3 R C DW RENAME
00E6 0114 R C DW INUSE
00E8 0F97 R C DW GETDRV ;25
00EA 0F12 R C DW SETDMA
00EC 0F20 R C DW GETFATPT
00EE 0F22 R C DW GETFATPTDL
00F0 0114 R C DW GETRDONLY
00F2 0114 R C DW SETATTRIB ;30
00F4 0F4E R C DW GETDSKPT
00F6 0114 R C DW USERCODE
00F8 070E R C DW RNDRD
00FA 0716 R C DW RNDWRT
00FC 0ED2 R C DW FILESIZE ;35
00FE 0F9C R C DW SETRNDREC
C ; Extended Functions
0100 1396 R C DW SETVECT
0102 13A8 R C DW NEWBASE
0104 071E R C DW BLKRD
0106 0726 R C DW BLKWRT ;40
0108 12AF R C DW MAKEFCB
010A 14A6 R C DW GETDATE
010C 14C4 R C DW SETDATE
010E 1546 R C DW GETTIME
0110 1558 R C DW SETTIME ;45
0112 0117 R C DW VERIFY
C
0114 C INUSE:
The Microsoft MACRO Assembler 01-26-83 PAGE 1-9
MS-DOS version 1.25 by Tim Paterson March 3, 1982
0114 C GETIO:
0114 C SETIO:
0114 C GETRDONLY:
0114 C SETATTRIB:
0114 C USERCODE:
0114 B0 00 C MOV AL,0
0116 C3 C RET
C
0117 C VERIFY:
0117 24 01 C AND AL,1
0119 2E: A2 002E R C MOV CS:VERFLG,AL
011D C3 C RET
C
011E C FLUSHKB:
011E 50 C PUSH AX
011F 9A 0027 ---- R C CALL FAR PTR BIOSFLUSH
0124 58 C POP AX
0125 8A E0 C MOV AH,AL
0127 3C 01 C CMP AL,1
0129 74 13 C JZ REDISPJ
012B 3C 06 C CMP AL,6
012D 74 0F C JZ REDISPJ
012F 3C 07 C CMP AL,7
0131 74 0B C JZ REDISPJ
0133 3C 08 C CMP AL,8
0135 74 07 C JZ REDISPJ
0137 3C 0A C CMP AL,10
0139 74 03 C JZ REDISPJ
013B B0 00 C MOV AL,0
013D C3 C RET
C
013E E9 0084 R C REDISPJ:JMP REDISP
C
0141 C READER:
0141 C AUXIN:
0141 E8 11C4 R C CALL STATCHK
0144 9A 000F ---- R C CALL FAR PTR BIOSAUXIN
0149 C3 C RET
C
014A C PUNCH:
014A 8A C2 C MOV AL,DL
014C C AUXOUT:
014C 50 C PUSH AX
014D E8 11C4 R C CALL STATCHK
0150 58 C POP AX
0151 9A 0012 ---- R C CALL FAR PTR BIOSAUXOUT
0156 C3 C RET
C
C
0157 C UNPACK:
C
C ; Inputs:
C ; DS = CS
C ; BX = Cluster number
C ; BP = Base of drive parameters
The Microsoft MACRO Assembler 01-26-83 PAGE 1-10
MS-DOS version 1.25 by Tim Paterson March 3, 1982
C ; SI = Pointer to drive FAT
C ; Outputs:
C ; DI = Contents of FAT for given cluster
C ; Zero set means DI=0 (free cluster)
C ; No other registers affected. Fatal error if cluster too big.
C
0157 3B 5E 0D C CMP BX,[BP.MAXCLUS]
015A 77 18 C JA HURTFAT
015C 8D 38 C LEA DI,[SI+BX]
015E D1 EB C SHR BX,1
0160 8B 39 C MOV DI,[DI+BX]
0162 73 09 C JNC HAVCLUS
0164 D1 EF C SHR DI,1
0166 D1 EF C SHR DI,1
0168 D1 EF C SHR DI,1
016A D1 EF C SHR DI,1
016C F9 C STC
016D C HAVCLUS:
016D D1 D3 C RCL BX,1
016F 81 E7 0FFF C AND DI,0FFFH
0173 C3 C RET
0174 C HURTFAT:
0174 50 C PUSH AX
0175 B4 80 C MOV AH,80H ;Signal Bad FAT to INT 24H handler
0177 BF 0FFF C MOV DI,0FFFH ;In case INT 24H returns (it shouldn't)
017A E8 0639 R C CALL FATAL
017D 58 C POP AX ;Try to ignore bad FAT
017E C3 C RET
C
C
017F C PACK:
C
C ; Inputs:
C ; DS = CS
C ; BX = Cluster number
C ; DX = Data
C ; SI = Pointer to drive FAT
C ; Outputs:
C ; The data is stored in the FAT at the given cluster.
C ; BX,DX,DI all destroyed
C ; No other registers affected
C
017F 8B FB C MOV DI,BX
0181 D1 EB C SHR BX,1
0183 03 DE C ADD BX,SI
0185 03 DF C ADD BX,DI
0187 D1 EF C SHR DI,1
0189 8B 3F C MOV DI,[BX]
018B 73 0E C JNC ALIGNED
018D D1 E2 C SHL DX,1
018F D1 E2 C SHL DX,1
0191 D1 E2 C SHL DX,1
0193 D1 E2 C SHL DX,1
0195 81 E7 000F C AND DI,0FH
0199 EB 04 C JMP SHORT PACKIN
The Microsoft MACRO Assembler 01-26-83 PAGE 1-11
MS-DOS version 1.25 by Tim Paterson March 3, 1982
019B C ALIGNED:
019B 81 E7 F000 C AND DI,0F000H
019F C PACKIN:
019F 0B FA C OR DI,DX
01A1 89 3F C MOV [BX],DI
01A3 C3 C RET
C
01A4 C DEVNAME:
01A4 BE 0000 R C MOV SI,OFFSET DOSGROUP:IONAME ;List of I/O devices with file names
01A7 B7 05 C MOV BH,NUMDEV ;BH = number of device names
01A9 C LOOKIO:
01A9 BF 010B R C MOV DI,OFFSET DOSGROUP:NAME1
01AC B9 0004 C MOV CX,4 ;All devices are 4 letters
01AF F3/ A6 C REPE CMPSB ;Check for name in list
01B1 74 08 C JZ IOCHK ;If first 3 letters OK, check for the rest
01B3 03 F1 C ADD SI,CX ;Point to next device name
01B5 FE CF C DEC BH
01B7 75 F0 C JNZ LOOKIO
01B9 C CRET:
01B9 F9 C STC ;Not found
01BA C3 C RET
C
01BB C IOCHK:
C ENDIF
01BB F6 DF C NEG BH
01BD B9 0002 C MOV CX,2 ;Check rest of name but not extension
01C0 B8 2020 C MOV AX,2020H
01C3 F3/ AF C REPE SCASW ;Make sure rest of name is blanks
01C5 75 F2 C JNZ CRET
01C7 C3 C RET1: RET ;Zero set so CREATE works
C
01C8 C GETFILE:
C ; Same as GETNAME except ES:DI points to FCB on successful return
01C8 E8 0372 R C CALL MOVNAME
01CB 72 FA C JC RET1
01CD 52 C PUSH DX
01CE 1E C PUSH DS
01CF E8 01DA R C CALL FINDNAME
01D2 07 C POP ES
01D3 5F C POP DI
01D4 C3 C RET2: RET
C
C
01D5 C GETNAME:
C
C ; Inputs:
C ; DS,DX point to FCB
C ; Function:
C ; Find file name in disk directory. First byte is
C ; drive number (0=current disk). "?" matches any
C ; character.
C ; Outputs:
C ; Carry set if file not found
C ; ELSE
C ; Zero set if attributes match (always except when creating)
The Microsoft MACRO Assembler 01-26-83 PAGE 1-12
MS-DOS version 1.25 by Tim Paterson March 3, 1982
C ; BP = Base of drive parameters
C ; DS = CS
C ; ES = CS
C ; BX = Pointer into directory buffer
C ; SI = Pointer to First Cluster field in directory entry
C ; [DIRBUF] has directory record with match
C ; [NAME1] has file name
C ; All other registers destroyed.
C
01D5 E8 0372 R C CALL MOVNAME
01D8 72 FA C JC RET2 ;Bad file name?
01DA C FINDNAME:
01DA 8C C8 C MOV AX,CS
01DC 8E D8 C MOV DS,AX
01DE E8 01A4 R C CALL DEVNAME
01E1 73 F1 C JNC RET2
01E3 E8 0423 R C CALL STARTSRCH
01E6 C CONTSRCH:
01E6 E8 023E R C CALL GETENTRY
01E9 72 E9 C JC RET2
01EB C SRCH:
01EB 8A 27 C MOV AH,BYTE PTR [BX]
01ED 0A E4 C OR AH,AH ;End of directory?
01EF 74 1E C JZ FREE
01F1 3A 26 0130 R C CMP AH,[DELALL] ;Free entry?
01F5 74 18 C JZ FREE
01F7 8B F3 C MOV SI,BX
01F9 BF 010B R C MOV DI,OFFSET DOSGROUP:NAME1
01FC B9 000B C MOV CX,11
01FF C WILDCRD:
01FF F3/ A6 C REPE CMPSB
0201 74 23 C JZ FOUND
0203 80 7D FF 3F C CMP BYTE PTR [DI-1],"?"
0207 74 F6 C JZ WILDCRD
0209 C NEXTENT:
0209 E8 0275 R C CALL NEXTENTRY
020C 73 DD C JNC SRCH
020E C3 C RET3: RET
C
020F C FREE:
020F 83 3E 015C R FF C CMP [ENTFREE],-1 ;Found a free entry before?
0214 75 08 C JNZ TSTALL ;If so, ignore this one
0216 8B 0E 0103 R C MOV CX,[LASTENT]
021A 89 0E 015C R C MOV [ENTFREE],CX
021E C TSTALL:
021E 3A 26 0130 R C CMP AH,[DELALL] ;At end of directory?
0222 74 E5 C JZ NEXTENT ;No - continue search
0224 F9 C STC ;Report not found
0225 C3 C RET
C
0226 C FOUND:
C ;Check if attributes allow finding it
0226 8A 26 0116 R C MOV AH,[ATTRIB] ;Attributes of search
022A F6 D4 C NOT AH
022C 22 24 C AND AH,[SI] ;Compare with attributes of file
The Microsoft MACRO Assembler 01-26-83 PAGE 1-13
MS-DOS version 1.25 by Tim Paterson March 3, 1982
022E 83 C6 0F C ADD SI,15
0231 80 E4 06 C AND AH,6 ;Only look at bits 1 and 2
0234 74 D8 C JZ RET3
0236 F6 06 012F R FF C TEST BYTE PTR [CREATING],-1 ;Pass back mismatch if creating
023B 74 CC C JZ NEXTENT ;Otherwise continue searching
023D C3 C RET
C
C
023E C GETENTRY:
C
C ; Inputs:
C ; [LASTENT] has previously searched directory entry
C ; Function:
C ; Locates next sequential directory entry in preparation for search
C ; Outputs:
C ; Carry set if none
C ; ELSE
C ; AL = Current directory block
C ; BX = Pointer to next directory entry in [DIRBUF]
C ; DX = Pointer to first byte after end of DIRBUF
C ; [LASTENT] = New directory entry number
C
023E A1 0103 R C MOV AX,[LASTENT]
0241 40 C INC AX ;Start with next entry
0242 3B 46 09 C CMP AX,[BP.MAXENT]
0245 73 4F C JAE NONE
0247 C GETENT:
0247 A3 0103 R C MOV [LASTENT],AX
024A B1 04 C MOV CL,4
024C D3 E0 C SHL AX,CL
024E 33 D2 C XOR DX,DX
0250 D1 E0 C SHL AX,1
0252 D1 D2 C RCL DX,1 ;Account for overflow in last shift
0254 8B 5E 02 C MOV BX,[BP.SECSIZ]
0257 80 E3 E0 C AND BL,255-31 ;Must be multiple of 32
025A F7 F3 C DIV BX
025C 8B DA C MOV BX,DX ;Position within sector
025E 8A 66 00 C MOV AH,[BP.DEVNUM] ;AL=Directory sector no.
0261 3B 06 0041 R C CMP AX,[DIRBUFID]
0265 74 05 C JZ HAVDIRBUF
0267 53 C PUSH BX
0268 E8 05E8 R C CALL DIRREAD
026B 5B C POP BX
026C C HAVDIRBUF:
026C BA 025E R C MOV DX,OFFSET DOSGROUP:DIRBUF
026F 03 DA C ADD BX,DX
0271 03 56 02 C ADD DX,[BP.SECSIZ]
0274 C3 C RET
C
0275 C NEXTENTRY:
C
C ; Inputs:
C ; Same as outputs of GETENTRY, above
C ; Function:
C ; Update AL, BX, and [LASTENT] for next directory entry.
The Microsoft MACRO Assembler 01-26-83 PAGE 1-14
MS-DOS version 1.25 by Tim Paterson March 3, 1982
C ; Carry set if no more.
C
0275 8B 3E 0103 R C MOV DI,[LASTENT]
0279 47 C INC DI
027A 3B 7E 09 C CMP DI,[BP.MAXENT]
027D 73 17 C JAE NONE
027F 89 3E 0103 R C MOV [LASTENT],DI
0283 83 C3 20 C ADD BX,32
0286 3B DA C CMP BX,DX
0288 72 0A C JB HAVIT
028A FE C0 C INC AL ;Next directory sector
028C 52 C PUSH DX ;Save limit
028D E8 05E8 R C CALL DIRREAD
0290 5A C POP DX
0291 BB 025E R C MOV BX,OFFSET DOSGROUP:DIRBUF
0294 C HAVIT:
0294 F8 C CLC
0295 C3 C RET
C
0296 C NONE:
0296 E8 067A R C CALL CHKDIRWRITE
0299 F9 C STC
029A C3 C RET4: RET
C
C
029B C DELETE: ; System call 19
029B E8 0372 R C CALL MOVNAME
029E B0 FF C MOV AL,-1
02A0 72 F8 C JC RET4
02A2 2E: A0 0116 R C MOV AL,CS:[ATTRIB]
02A6 24 06 C AND AL,6 ;Look only at hidden bits
02A8 3C 06 C CMP AL,6 ;Both must be set
02AA 75 12 C JNZ NOTALL
02AC B9 000B C MOV CX,11
02AF B0 3F C MOV AL,"?"
02B1 BF 010B R C MOV DI,OFFSET DOSGROUP:NAME1
02B4 F3/ AE C REPE SCASB ;See if name is *.*
02B6 75 06 C JNZ NOTALL
02B8 2E: C6 06 0130 R 00 C MOV BYTE PTR CS:[DELALL],0 ;DEL *.* - flag deleting all
02BE C NOTALL:
02BE E8 01DA R C CALL FINDNAME
02C1 B0 FF C MOV AL,-1
02C3 72 D5 C JC RET4
02C5 0A FF C OR BH,BH ;Check if device name
02C7 78 D1 C JS RET4 ;Can't delete I/O devices
02C9 C DELFILE:
02C9 C6 06 002B R FF C MOV BYTE PTR [DIRTYDIR],-1
02CE 8A 26 0130 R C MOV AH,[DELALL]
02D2 88 27 C MOV BYTE PTR [BX],AH
02D4 8B 1C C MOV BX,[SI]
02D6 8B 76 12 C MOV SI,[BP.FAT]
02D9 0B DB C OR BX,BX
02DB 74 08 C JZ DELNXT
02DD 3B 5E 0D C CMP BX,[BP.MAXCLUS]
02E0 77 03 C JA DELNXT
The Microsoft MACRO Assembler 01-26-83 PAGE 1-15
MS-DOS version 1.25 by Tim Paterson March 3, 1982
02E2 E8 0E2F R C CALL RELEASE
02E5 C DELNXT:
02E5 E8 01E6 R C CALL CONTSRCH
02E8 73 DF C JNC DELFILE
02EA E8 052C R C CALL FATWRT
02ED E8 067A R C CALL CHKDIRWRITE
02F0 32 C0 C XOR AL,AL
02F2 C3 C RET
C
C
02F3 C RENAME: ;System call 23
02F3 E8 0372 R C CALL MOVNAME
02F6 72 77 C JC ERRET
02F8 83 C6 05 C ADD SI,5
02FB BF 0117 R C MOV DI,OFFSET DOSGROUP:NAME2
02FE E8 039F R C CALL LODNAME
0301 72 6C C JC ERRET ;Report error if second name invalid
0303 E8 01DA R C CALL FINDNAME
0306 72 67 C JC ERRET
0308 0A FF C OR BH,BH ;Check if I/O device name
030A 78 63 C JS ERRET ;If so, can't rename it
030C BE 010B R C MOV SI,OFFSET DOSGROUP:NAME1
030F BF 0122 R C MOV DI,OFFSET DOSGROUP:NAME3
0312 B9 0006 C MOV CX,6 ;6 words (12 bytes)--include attribute byte
0315 F3/ A5 C REP MOVSW ;Copy name to search for
0317 C RENFIL:
0317 BF 010B R C MOV DI,OFFSET DOSGROUP:NAME1
031A BE 0117 R C MOV SI,OFFSET DOSGROUP:NAME2
031D B9 000B C MOV CX,11
0320 C NEWNAM:
0320 AC C LODSB
0321 3C 3F C CMP AL,"?"
0323 75 02 C JNZ NOCHG
0325 8A 07 C MOV AL,[BX]
0327 C NOCHG:
0327 AA C STOSB
0328 43 C INC BX
0329 E2 F5 C LOOP NEWNAM
032B C6 05 06 C MOV BYTE PTR [DI],6 ;Stop duplicates with any attributes
032E E8 01A4 R C CALL DEVNAME ;Check if giving it a device name
0331 73 39 C JNC RENERR
0333 FF 36 0103 R C PUSH [LASTENT] ;Save position of match
0337 C7 06 0103 R FFFF C MOV [LASTENT],-1 ;Search entire directory for duplicate
033D E8 01E6 R C CALL CONTSRCH ;See if new name already exists
0340 58 C POP AX
0341 73 29 C JNC RENERR ;Error if found
0343 E8 0247 R C CALL GETENT ;Re-read matching entry
0346 8B FB C MOV DI,BX
0348 BE 010B R C MOV SI,OFFSET DOSGROUP:NAME1
034B B9 0005 C MOV CX,5
034E A4 C MOVSB
034F F3/ A5 C REP MOVSW ;Replace old name with new one
0351 C6 06 002B R FF C MOV BYTE PTR [DIRTYDIR],-1 ;Flag change in directory
0356 BE 0122 R C MOV SI,OFFSET DOSGROUP:NAME3
0359 BF 010B R C MOV DI,OFFSET DOSGROUP:NAME1
The Microsoft MACRO Assembler 01-26-83 PAGE 1-16
MS-DOS version 1.25 by Tim Paterson March 3, 1982
035C B9 0006 C MOV CX,6 ;Include attribute byte
035F F3/ A5 C REP MOVSW ;Copy name back into search buffer
0361 E8 01E6 R C CALL CONTSRCH
0364 73 B1 C JNC RENFIL
0366 E8 067A R C CALL CHKDIRWRITE
0369 32 C0 C XOR AL,AL
036B C3 C RET
C
036C C RENERR:
036C E8 067A R C CALL CHKDIRWRITE
036F C ERRET:
036F B0 FF C MOV AL,-1
0371 C3 C RET5: RET
C
C
0372 C MOVNAME:
C
C ; Inputs:
C ; DS, DX point to FCB or extended FCB
C ; Outputs:
C ; DS:DX point to normal FCB
C ; ES = CS
C ; If file name OK:
C ; BP has base of driver parameters
C ; [NAME1] has name in upper case
C ; All registers except DX destroyed
C ; Carry set if bad file name or drive
C
0372 2E: C7 06 012F R E500 C MOV CS:WORD PTR [CREATING],0E500H ;Not creating, not DEL *.*
0379 8C C8 C MOV AX,CS
037B 8E C0 C MOV ES,AX
037D BF 010B R C MOV DI,OFFSET DOSGROUP:NAME1
0380 8B F2 C MOV SI,DX
0382 AC C LODSB
0383 2E: A2 012E R C MOV CS:[EXTFCB],AL ;Set flag if extended FCB in use
0387 B4 00 C MOV AH,0 ;Set default attributes
0389 3C FF C CMP AL,-1 ;Is it an extended FCB?
038B 75 0A C JNZ HAVATTRB
038D 83 C2 07 C ADD DX,7 ;Adjust to point to normal FCB
0390 83 C6 06 C ADD SI,6 ;Point to drive select byte
0393 8A 64 FF C MOV AH,[SI-1] ;Get attribute byte
0396 AC C LODSB ;Get drive select byte
0397 C HAVATTRB:
0397 2E: 88 26 0116 R C MOV CS:[ATTRIB],AH ;Save attributes
039C E8 03B9 R C CALL GETTHISDRV
039F C LODNAME:
C ; This entry point copies a file name from DS,SI
C ; to ES,DI converting to upper case.
039F 80 3C 20 C CMP BYTE PTR [SI]," " ;Don't allow blank as first letter
03A2 F9 C STC ;In case of error
03A3 74 CC C JZ RET5
03A5 B9 000B C MOV CX,11
03A8 C MOVCHK:
03A8 E8 135A R C CALL GETLET
03AB 72 C4 C JB RET5
The Microsoft MACRO Assembler 01-26-83 PAGE 1-17
MS-DOS version 1.25 by Tim Paterson March 3, 1982
03AD 75 05 C JNZ STOLET ;Is it a delimiter?
03AF 3C 20 C CMP AL," " ;This is the only delimiter allowed
03B1 F9 C STC ;In case of error
03B2 75 BD C JNZ RET5
03B4 C STOLET:
03B4 AA C STOSB
03B5 E2 F1 C LOOP MOVCHK
03B7 F8 C CLC ;Got through whole name - no error
03B8 C3 C RET6: RET
C
03B9 C GETTHISDRV:
03B9 2E: 38 06 002C R C CMP CS:[NUMDRV],AL
03BE 72 F8 C JC RET6
03C0 FE C8 C DEC AL
03C2 79 04 C JNS PHYDRV
03C4 2E: A0 004A R C MOV AL,CS:[CURDRV]
03C8 C PHYDRV:
03C8 2E: A2 013C R C MOV CS:[THISDRV],AL
03CC C3 C RET
C
C
03CD C OPEN: ;System call 15
03CD E8 01C8 R C CALL GETFILE
03D0 C DOOPEN:
C ; Enter here to perform OPEN on file already found
C ; in directory. DS=CS, BX points to directory
C ; entry in DIRBUF, SI points to First Cluster field, and
C ; ES:DI point to the FCB to be opened. This entry point
C ; is used by CREATE.
03D0 72 9D C JC ERRET
03D2 0A FF C OR BH,BH ;Check if file is I/O device
03D4 78 29 C JS OPENDEV ;Special handler if so
03D6 A0 013C R C MOV AL,[THISDRV]
03D9 40 C INC AX
03DA AA C STOSB
03DB 33 C0 C XOR AX,AX
C ENDIF
C IF NOT ZEROEXT
03DD 83 C7 0C C ADD DI,12 ;Point to high half of CURRENT BLOCK field
03E0 AA C STOSB ;Set it to zero (CP/M programs set low byte)
C ENDIF
03E1 B0 80 C MOV AL,128 ;Default record size
03E3 AB C STOSW ;Set record size
03E4 AD C LODSW ;Get starting cluster
03E5 8B D0 C MOV DX,AX ;Save it for the moment
03E7 A5 C MOVSW ;Transfer size to FCB
03E8 A5 C MOVSW
03E9 8B 44 F8 C MOV AX,[SI-8] ;Get date
03EC AB C STOSW ;Save date in FCB
03ED 8B 44 F6 C MOV AX,[SI-10] ;Get time
03F0 AB C STOSW ;Save it in FCB
03F1 8A 46 00 C MOV AL,[BP.DEVNUM]