summaryrefslogtreecommitdiff
path: root/v2.0/source/FORMAT.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v2.0/source/FORMAT.ASM')
-rw-r--r--v2.0/source/FORMAT.ASM1627
1 files changed, 1627 insertions, 0 deletions
diff --git a/v2.0/source/FORMAT.ASM b/v2.0/source/FORMAT.ASM
new file mode 100644
index 0000000..694857b
--- /dev/null
+++ b/v2.0/source/FORMAT.ASM
@@ -0,0 +1,1627 @@
1;***************************************************************
2;
3; 86-DOS FORMAT DISK UTILITY
4;
5; This routine formats a new disk,clears the FAT and DIRECTORY
6; then optionally copies the SYSTEM and COMMAND.COM to this
7; new disk
8;
9; SYNTAX: FORMAT [drive][/switch1][/switch2]...[/switch16]
10;
11; Regardless of the drive designator , the user will be
12; prompted to insert the diskette to be formatted.
13;
14;***************************************************************
15
16;Mod to ask for volume ID ARR 5/12/82
17; 05/19/82 Fixed rounding bug in CLUSCAL: ARR
18;REV 1.5
19; Added rev number message
20; Added dir attribute to DELALL FCB
21;REV 2.00
22; Redone for 2.0
23;REV 2.10
24; 5/1/83 ARR Re-do to transfer system on small memory systems
25
26FALSE EQU 0
27TRUE EQU NOT FALSE
28
29IBMJAPVER EQU FALSE ; SET ONLY ONE SWITCH TO TRUE!
30IBMVER EQU FALSE
31MSVER EQU TRUE
32
33KANJI EQU FALSE
34
35 .xlist
36 INCLUDE DOSSYM.ASM
37 .list
38
39
40;FORMAT Pre-defined switches
41SYSSW EQU 1 ; System transfer
42VOLSW EQU 2 ; Volume ID prompt
43OLDSW EQU 4 ; E5 dir terminator
44
45
46DRNUM EQU 5CH
47
48RECLEN EQU fcb_RECSIZ+7
49RR EQU fcb_RR+7
50
51;Per system file data structure
52
53FILESTRUC STRUC
54FILE_HANDLE DW ? ; Source handle
55FILE_SIZEP DW ? ; File size in para
56FILE_SIZEB DD ? ; File size in bytes
57FILE_OFFSET DD ? ; Offset in file (partial)
58FILE_START DW ? ; Para number of start in buffer
59FILE_DATE DW ? ; Date of file
60FILE_TIME DW ? ; Time of file
61FILE_NAME DB ? ; Start of name
62FILESTRUC ENDS
63
64CODE SEGMENT PUBLIC 'CODE'
65
66 ASSUME CS:CODE,DS:CODE,ES:CODE
67
68 ORG 100H
69
70;For OEM module
71 PUBLIC SWITCHMAP,DRIVE
72 EXTRN HARDFLAG:BYTE ;0 = REMOVABLE MEDIA
73 EXTRN SWITCHLIST:BYTE,FATID:BYTE,FATSPACE:WORD
74 EXTRN STARTSECTOR:WORD,FREESPACE:WORD,INIT:NEAR
75 EXTRN DISKFORMAT:NEAR,BADSECTOR:NEAR,DONE:NEAR
76 EXTRN WRTFAT:NEAR
77
78;For FORMES module
79 EXTRN WAITYN:NEAR,REPORT:NEAR
80 PUBLIC PRINT,CRLF,DISP32BITS,UNSCALE,FDSKSIZ,SECSIZ,CLUSSIZ
81 PUBLIC SYSSIZ,BADSIZ
82
83START:
84 JMP SHORT FSTRT
85
86HEADER DB "Vers 2.10"
87
88FSTRT:
89 MOV SP,OFFSET STACK ;Use internal stack
90
91;Code to print header
92; PUSH AX
93; MOV DX,OFFSET HEADER
94; CALL PRINT
95; POP AX
96
97DOSVER_HIGH EQU 020BH ;2.11 in hex
98 PUSH AX ;Save DRIVE validity info
99 MOV AH,GET_VERSION
100 INT 21H
101 XCHG AH,AL ;Turn it around to AH.AL
102 CMP AX,DOSVER_HIGH
103 JAE OKDOS
104GOTBADDOS:
105 MOV DX,OFFSET BADVER
106 MOV AH,STD_CON_STRING_OUTPUT
107 INT 21H
108 INT 20H
109
110OKDOS:
111
112 IF IBMVER ; IBM WANTS TO CHECK FOR ASSIGN.COM
113 XOR AX,AX
114 MOV ES,AX
115 MOV BX,ES:[4*21H]
116 MOV ES,ES:[4*21H+2]
117 CMP BX,122H
118 JNZ NO_ASSIGN
119 CMP ES:[109H],0807H
120 JNZ NO_ASSIGN
121 CMP ES:[103H],0201H
122 JNZ RE_ASSIGN
123 CMP ES:[105H],0403H
124 JNZ RE_ASSIGN
125 CMP ES:[107H],0605H
126 JZ NO_ASSIGN
127RE_ASSIGN:
128 MOV DX,OFFSET ASGERR
129 CALL PRINT
130 JMP FEXIT2
131NO_ASSIGN:
132 PUSH CS
133 POP ES
134 ENDIF
135
136 POP AX
137
138 CMP AL,0FFH ;See if invalid drive specified
139 JNZ DRVGD ;If not proceed
140 MOV DX,OFFSET INVDRV ;Invalid drive message
141 CALL PRINT ;Print the message
142 JMP FEXIT2 ;Exit
143DRVGD:
144 MOV AH,GET_DEFAULT_DRIVE ;Must get the default drive
145 INT 21H ;Default now in AL
146 MOV DEFALT,AL ;Save for later
147 ADD AL,"A"
148 MOV [BIODRV],AL
149 MOV [DOSDRV],AL
150 MOV [SYSDRV],AL
151 MOV [COMDRV],AL
152 MOV SI,DRNUM ;So we can get our parameters
153 LODSB ;Fetch drive designation
154 OR AL,AL ;See if specified
155 JNZ DRVSPEC ;If specfied proceed
156 MOV AL,DEFALT
157 INC AL
158DRVSPEC:
159 DEC AL ;Drive designator now correct
160 MOV BYTE PTR DS:[DRNUM],AL ;And updated
161 MOV DRIVE,AL ;Save copy
162 MOV DX,OFFSET INT_23
163 MOV AH,SET_INTERRUPT_VECTOR
164 MOV AL,23H
165 INT 21H ;Set ^C vector
166 ;Get all the swith information from the command line
167 XOR AX,AX
168 MOV AH,CHAR_OPER ;GET SWITCH CHARACTER
169 INT 21H ;CALL THE DOS
170 MOV [SWTCH],DL
171
172 XOR BX,BX ;Store switch information in BX
173 MOV SI,81H ;Point to the command line buffer
174NXTSWT:
175 CALL SCANOFF
176 LODSB
177 CMP AL,[SWTCH]
178 JZ GETPARM
179 CMP AL,13
180 JZ SAVSWT
181 LODSB ;Get next character
182 CMP AL,":" ;Is it a drive specifier?
183 JNZ INVALID ;No -- invalid parameter
184 CMP BYTE PTR DBLFLG,0 ;Is is the only drive specifier we've seen
185 JNZ INVALID ;No -- invalid parameter
186 INC BYTE PTR DBLFLG ;Yes -- set the flag
187 JMP SHORT NXTSWT
188GETPARM:
189 LODSB
190 ;Convert any lower case input into upper case
191 CMP AL,41H
192 JL GETCHR ;Switch is a digit don't try to convert it
193 AND AL,0DFH
194GETCHR:
195 MOV CL,SWITCHLIST ;Number of legal switches
196 OR CL,CL ;If it's none we shouldn't be here
197 JZ INVALID ;Report the error
198 MOV CH,0
199 MOV DI,1+OFFSET SWITCHLIST ;Point to the legal switch characters
200 REPNE SCASB
201 JNZ INVALID
202 MOV AX,1
203 SHL AX,CL
204 OR BX,AX ;Set the appropriate bit in SWITCHMAP
205 JMP SHORT NXTSWT ;See if there are anymore
206
207INVALID:
208 MOV DX,OFFSET INVPAR
209 CALL PRINT
210 JMP FEXIT
211
212SCANOFF:
213 LODSB
214 CMP AL,20H
215 JZ SCANOFF
216 CMP AL,9
217 JZ SCANOFF
218 DEC SI
219 RET
220
221MEMERR:
222 MOV DX,OFFSET MEMEX
223 CALL PRINT
224 JMP FEXIT
225
226
227SAVSWT:
228
229 IF IBMVER ;/B SWITCH TURNS /8 ON AND /S OFF
230 TEST BX,00100000B
231 JZ NOT_SW_B
232 AND BX,NOT SYSSW ;TURN OFF /S
233 OR BX,00010000B ;TURN ON /8
234NOT_SW_B:
235 ENDIF
236
237 MOV SWITCHMAP,BX
238 TEST SWITCHMAP,SYSSW
239 JZ INITCALL
240 CALL SAVUDIRS
241 MOV BX,[FREESPACE]
242 ADD BX,15
243 MOV CL,4
244 SHR BX,CL
245 PUSH CS
246 POP ES
247 MOV AH,SETBLOCK
248 INT 21H
249 MOV BX,0FFFFH
250 MOV AH,ALLOC
251 INT 21H
252 OR BX,BX
253 JZ MEMERR ;No memory
254 MOV [MSIZE],BX
255 MOV AH,ALLOC
256 INT 21H
257 JC MEMERR ;No memory
258 MOV [MSTART],AX
259 MOV DX,OFFSET SWTCH
260 MOV AH,CHDIR
261 INT 21H ;Go to root on default drive (source)
262
263RDFRST:
264 CALL READDOS ;Read BIOS and DOS
265 JNC INITCALL ;OK -- read next file
266NEEDSYS:
267 CALL SYSPRM ;Prompt for system disk
268 JMP RDFRST ;Try again
269
270INITCALL:
271 CALL INIT ;Let OEM read any files before disk is changed
272 JNC SWITCHCHK
273 MOV DX,OFFSET FRMTERR
274 CALL PRINT
275 JMP FEXIT
276
277SWITCHCHK:
278 MOV DX,SWITCHMAP
279 MOV SWITCHCOPY,DX
280
281SYSLOOP:
282 MOV WORD PTR BADSIZ,0 ;Must intialize for each iteration
283 MOV WORD PTR BADSIZ+2,0
284 MOV WORD PTR SYSSIZ,0
285 MOV WORD PTR SYSSIZ+2,0
286 MOV BYTE PTR DBLFLG,0
287 MOV BYTE PTR CLEARFLG,0
288 MOV DX,SWITCHCOPY
289 MOV SWITCHMAP,DX ;Restore original Switches
290 MOV AL,DRIVE ;Fetch drive
291 ADD AL,"A" ;(AL)= ASCII designation
292 MOV BYTE PTR SNGDRV,AL ;Fill out the message
293 MOV BYTE PTR TARGDRV,AL
294 MOV BYTE PTR HRDDRV,AL
295 CALL DSKPRM ;Prompt for new disk
296 CALL DISKFORMAT ;Format the disk
297 JNC GETTRK
298FRMTPROB:
299 MOV DX,OFFSET FRMTERR
300 CALL PRINT
301 JMP SHORT SYSLOOP
302
303 ;Mark any bad sectors in the FATs
304 ;And keep track of how many bytes there are in bad sectors
305
306GETTRK:
307 CALL BADSECTOR ;Do bad track fix-up
308 JC FRMTPROB ;Had an error in Formatting - can't recover
309 CMP AX,0 ;Are we finished?
310 JNZ TRKFND ;No - check error conditions
311 JMP DRTFAT ;Yes
312TRKFND:
313 CMP BX,STARTSECTOR ;Are any sectors in the system area bad?
314 JGE CLRTEST
315 MOV DX,OFFSET NOUSE ;Can't build FATs of Directory
316 CALL PRINT
317 JMP FRMTPROB ;Bad disk -- try again
318CLRTEST:
319 MOV SECTORS,AX ;Save the number of sectors on the track
320 CMP BYTE PTR CLEARFLG,0 ;Have we already cleared the FAT and DIR?
321 JNZ SYSTEST ;Yes - all set
322 INC CLEARFLG ;Set the flag
323 PUSH BX
324 CALL CLEAR ;Fix-up fat and directory
325 POP BX
326SYSTEST:
327 TEST SWITCHMAP,SYSSW ;If system requested calculate size
328 JZ BAD100
329 CMP BYTE PTR DBLFLG,0 ;Have we already calculated System space?
330 JNZ CMPTRKS ;Yes -- all ready for the compare
331 INC BYTE PTR DBLFLG ;No -- set the flag
332 CALL GETSIZE ;Calculate the system size
333 MOV DX,WORD PTR SYSSIZ+2
334 MOV AX,WORD PTR SYSSIZ
335 DIV SECSIZ
336 ADD AX,STARTSECTOR
337 MOV SYSTRKS,AX ;Space FAT,Dir,and system files require
338CMPTRKS:
339 CMP BX,SYSTRKS
340 JG BAD100
341 MOV DX,OFFSET NOTSYS ;Can't transfer a system
342 CALL PRINT
343 AND SWITCHMAP,NOT SYSSW ;Turn off system transfer switch
344 MOV WORD PTR SYSSIZ+2,0 ;No system to transfer
345 MOV WORD PTR SYSSIZ,0 ;No system to transfer
346BAD100:
347; BX is the first bad sector #, SECTORS is the number of bad sectors starting
348; at BX. This needs to be converted to clusters. The start sector number may
349; need to be rounded down to a cluster boundry, the end sector may need to be
350; rounded up to a cluster boundry. Know BX >= STARTSECTOR
351 SUB BX,STARTSECTOR ; BX is now DATA area relative
352 MOV CX,BX
353 ADD CX,SECTORS
354 DEC CX ; CX is now the last bad sector #
355 MOV AX,BX
356 XOR DX,DX
357 DIV CLUSSIZ
358 MOV BX,AX ; BX is rounded down and converted
359 ; to a cluster #. Where cluster 0 =
360 ; first cluster of data. First bad
361 ; Sector is in cluster BX.
362 MOV AX,CX
363 XOR DX,DX
364 DIV CLUSSIZ
365 MOV CX,AX ; CX is rounded up and converted to a
366 ; to a cluster #. Where cluster 0 =
367 ; first cluster of data. Last bad
368 ; Sector is in cluster CX.
369 SUB CX,BX
370 INC CX ; CX is number of clusters to mark bad
371 ADD BX,2 ; Bias start by correct amount since
372 ; first cluster of data is really
373 ; cluster 2.
374 MOV AX,CLUSSIZ ; Sectors/Cluster
375 MUL SECSIZ ; Times Bytes/Sector
376 MOV BP,AX ; = Bytes/Cluster
377
378; Mark CX clusters bad starting at cluster BX
379PACKIT:
380 MOV DX,0FF7H ;0FF7H indicates a bad sector
381 CALL PACK ;Put it in the allocation map
382 CMP DX,DI ;Have we already marked it bad?
383 JZ BAD150 ;if so, don't add it in
384 ADD WORD PTR BADSIZ,BP ;Add in number of bad bytes
385 JNB BAD150
386 INC WORD PTR BADSIZ+2
387BAD150:
388 INC BX ;Next cluster
389 LOOP PACKIT ;Continue for # of clusters
390 JMP GETTRK
391
392; Inputs:
393 ;BX = Cluster number
394 ;DX = Data
395; Outputs:
396 ;The data is stored in the FAT at the given cluster.
397 ;SI is destroyed
398 ;DI contains the former contents
399 ;No other registers affected
400PACK:
401 PUSH BX
402 PUSH CX
403 PUSH DX
404 MOV SI,BX
405 SHR BX,1
406 ADD BX,FATSPACE
407 ADD BX,SI
408 SHR SI,1
409 MOV SI,WORD PTR [BX]
410 MOV DI,SI
411 JNB ALIGNED
412 MOV CL,4
413 SHL DX,CL
414 SHR DI,CL
415 AND SI,15
416 JMP SHORT PACKIN
417
418ALIGNED:
419 AND SI,0F000H
420PACKIN:
421 AND DI,00FFFH ;DI CONTAINS FORMER CONTENTS
422 OR SI,DX
423 MOV WORD PTR[BX],SI
424 POP DX
425 POP CX
426 POP BX
427 RET
428
429DRTFAT:
430 CMP BYTE PTR CLEARFLG,0
431 JNZ CLEARED
432 CALL CLEAR ;Clear the FAT and Dir
433 TEST SWITCHMAP,SYSSW ;If system requested, calculate size
434 JZ CLEARED
435 CMP BYTE PTR DBLFLG,0 ;Have we already calculated System space?
436 JNZ CLEARED ;Yes
437 INC BYTE PTR DBLFLG ;No -- set the flag
438 CALL GETSIZE ;Calculate the system size
439CLEARED:
440 CALL WRTFAT
441 JNC FATWRT
442 MOV DX,OFFSET NOUSE
443 CALL PRINT
444 JMP FRMTPROB
445
446FATWRT:
447
448 TEST SWITCHMAP,SYSSW ;System desired
449 JZ STATUS
450 CALL WRITEDOS ;Write the BIOS & DOS
451 JNC SYSOK
452 MOV DX,OFFSET NOTSYS ;Can't transfer a system
453 CALL PRINT
454 MOV WORD PTR SYSSIZ+2,0 ;No system transfered
455 MOV WORD PTR SYSSIZ,0 ;No system transfered
456 JMP SHORT STATUS
457
458SYSOK:
459 MOV DX,OFFSET SYSTRAN
460 CALL PRINT
461STATUS:
462 CALL CRLF
463 CALL VOLID
464 MOV AH,DISK_RESET
465 INT 21H
466 CALL DONE ;Final call to OEM module
467 JNC REPORTC
468 JMP FRMTPROB ;Report an error
469
470REPORTC:
471 CALL REPORT
472
473 CALL MORE ;See if more disks to format
474 JMP SYSLOOP ;If we returned from MORE then continue
475
476DISP32BITS:
477 PUSH BX
478 XOR AX,AX
479 MOV BX,AX
480 MOV BP,AX
481 MOV CX,32
482CONVLP:
483 SHL SI,1
484 RCL DI,1
485 XCHG AX,BP
486 CALL CONVWRD
487 XCHG AX,BP
488 XCHG AX,BX
489 CALL CONVWRD
490 XCHG AX,BX
491 ADC AL,0
492 LOOP CONVLP
493 ; Conversion complete. Print 8-digit number with 2 leading blanks.
494 MOV CX,1810H
495 XCHG DX,AX
496 CALL DIGIT
497 XCHG AX,BX
498 CALL OUTWORD
499 XCHG AX,BP
500 CALL OUTWORD
501 POP DX
502 CMP DX,0
503 JZ RET3
504 CALL PRINT
505RET3: RET
506
507OUTWORD:
508 PUSH AX
509 MOV DL,AH
510 CALL OUTBYTE
511 POP DX
512OUTBYTE:
513 MOV DH,DL
514 SHR DL,1
515 SHR DL,1
516 SHR DL,1
517 SHR DL,1
518 CALL DIGIT
519 MOV DL,DH
520DIGIT:
521 AND DL,0FH
522 JZ BLANKZER
523 MOV CL,0
524BLANKZER:
525 DEC CH
526 AND CL,CH
527 OR DL,30H
528 SUB DL,CL
529 MOV AH,STD_CON_OUTPUT
530 INT 21H
531 RET
532
533CONVWRD:
534 ADC AL,AL
535 DAA
536 XCHG AL,AH
537 ADC AL,AL
538 DAA
539 XCHG AL,AH
540RET2: RET
541
542UNSCALE:
543 SHR CX,1
544 JC RET2
545 SHL AX,1
546 RCL DX,1
547 JMP SHORT UNSCALE
548
549
550;******************************************
551; Calculate the size in bytes of the system rounded up to sector and
552; cluster boundries, Answer in SYSSIZ
553
554GETSIZE:
555 MOV AX,WORD PTR BIOSSIZB ;And calculate the system size
556 MOV DX,WORD PTR BIOSSIZB+2
557 CALL FNDSIZ
558 MOV AX,WORD PTR DOSSIZB
559 MOV DX,WORD PTR DOSSIZB+2
560 CALL FNDSIZ
561 MOV AX,WORD PTR COMSIZB
562 MOV DX,WORD PTR COMSIZB+2
563
564;Calculate the number of sectors used for the system
565FNDSIZ:
566 DIV SECSIZ
567 OR DX,DX
568 JZ FNDSIZ0
569 INC AX ; Round up to next sector
570FNDSIZ0:
571 PUSH AX
572 XOR DX,DX
573 DIV CLUSSIZ
574 POP AX
575 OR DX,DX
576 JZ ONCLUS
577 SUB DX,CLUSSIZ
578 NEG DX
579 ADD AX,DX ; Round up sector count to cluster
580 ; boundry
581ONCLUS:
582 MUL SECSIZ ; Turn it back into bytes
583 ADD WORD PTR SYSSIZ,AX
584 ADC WORD PTR SYSSIZ+2,DX
585 RET
586
587PRINT: MOV AH,STD_CON_STRING_OUTPUT ;Print msg pointed to by DX
588 INT 21H
589 RET
590
591MORE: CMP BYTE PTR [HARDFLAG],0 ;Check if removable media
592 JNZ FEXIT
593 CALL WAITYN ;Get yes or no response
594 JB FEXIT ;Exit if CF=1
595 CALL CRLF
596CRLF:
597 MOV DX,OFFSET CRLFMSG
598 CALL PRINT
599 RET
600
601PERROR: CALL PRINT ;Print message and exit
602FEXIT:
603 CALL RESTUDIR ;Restore users dirs
604FEXIT2:
605 INT 20H
606
607 ;Prompt the user for a system diskette in the default drive
608SYSPRM:
609 MOV AH,GET_DEFAULT_DRIVE ;Will find out the default drive
610 INT 21H ;Default now in AL
611 IF IBMVER OR IBMJAPVER
612 MOV BX,AX
613 ENDIF
614 ADD AL,41H ;Now in Ascii
615 MOV SYSDRV,AL ;Text now ok
616
617 IF IBMVER OR IBMJAPVER
618 INT 11H ;Make sure drive has insertable media
619 AND AL,11000000B
620 ROL AL,1
621 ROL AL,1
622 OR AL,AL
623 JNZ NOTONEDRV
624 INC AL
625NOTONEDRV:
626 CMP BL,AL
627 JBE ISFLOPPY
628 MOV AL,"A"
629 MOV BYTE PTR [SYSDRV],AL
630 MOV [BIODRV],AL
631 MOV [DOSDRV],AL
632 MOV [COMDRV],AL
633ISFLOPPY:
634 ENDIF
635
636 MOV DX,OFFSET SYSMSG
637 CALL PRINT ;Print first line
638 CALL WAITKY ;Wait for a key
639 CALL CRLF
640 RET
641
642TARGPRM:
643 MOV DX,OFFSET TARGMSG
644 CALL PRINT ;Print first line
645 CALL WAITKY ;Wait for a key
646 CALL CRLF
647 RET
648
649DSKPRM:
650 MOV DX,OFFSET SNGMSG ;Point to the message
651 CMP BYTE PTR [HARDFLAG],0 ;Check if removable media
652 JZ GOPRNIT
653 MOV DX,OFFSET HRDMSG
654GOPRNIT:
655 CALL PRINT ;Print the message
656 CALL WAITKY ;Wait for space bar
657 CALL CRLF
658 CALL CRLF
659 RET
660
661 ;Will wait for any key to be depressed.
662WAITKY:
663 MOV AX,(STD_CON_INPUT_FLUSH SHL 8) OR STD_CON_INPUT_NO_ECHO
664 INT 21H
665 MOV AX,(STD_CON_INPUT_FLUSH SHL 8) + 0
666 INT 21H
667
668 return
669
670FDPB: MOV DL,DRIVE
671 INC DL
672 MOV AH,GET_DPB
673 PUSH DS
674 INT 21H
675 INC AL
676 JZ DRVERR
677 MOV DX,WORD PTR [BX+13]
678 DEC DX
679 MOV AL,BYTE PTR [BX+4]
680 INC AL
681 MOV CX,WORD PTR [BX+2]
682 POP DS
683 RET
684DRVERR:
685 POP DS
686 MOV DX,OFFSET INVDRV
687 JMP PERROR
688
689 ;Clear the FAT and directory and set Dirty byte in the FAT
690CLEAR:
691 MOV AL,FATID
692 OR AL,0F8H ;Make sure it's a legal value
693 MOV AH,0FFH
694 MOV DI,FATSPACE
695 MOV WORD PTR[DI],AX
696 MOV BYTE PTR[DI+2],AH
697 MOV AH,DISK_RESET
698 INT 21H
699 CALL WRTFAT
700
701 IF IBMJAPVER
702 PUSH DS
703 MOV DL,[DRIVE] ;GET THE DRIVE PARAMETER
704 INC DL
705 MOV AH,32H
706 INT 21H
707
708 MOV DPB_FIRST_ACCESS[BX],-1 ;FORCE MEDIA CHANGE
709 POP DS
710 ENDIF
711
712 CALL FDPB
713 MOV WORD PTR FDSKSIZ,DX
714 MOV SECSIZ,CX
715 MOV AH,0
716 MOV CLUSSIZ,AX
717 SHR DX,1
718 JNC ROUNDED
719 INC DX
720ROUNDED:
721 ADD DX,WORD PTR FDSKSIZ
722 XOR AX,AX
723 MOV CX,DX
724 MOV DI,FATSPACE
725 ADD DI,3
726 REP STOSB
727 MOV AH,DISK_RESET
728 INT 21H
729 CALL WRTFAT
730 MOV DL,[DRIVE]
731 ADD DL,'A'
732 MOV [ROOTSTR],DL
733 MOV DX,OFFSET ROOTSTR
734 MOV AH,CHDIR
735 INT 21H ;Go to root on target drive
736 MOV AL,DRIVE
737 INC AL
738 MOV ALLDRV,AL
739 MOV AH,FCB_DELETE
740 MOV DX,OFFSET ALLFILE
741 INT 21H
742
743 TEST SWITCHMAP,OLDSW ;See if E5 terminated DIR requested
744 JZ RET25
745 MOV AL,DRIVE
746 INC AL
747 MOV BYTE PTR CLEANFILE,AL ;Get the drive
748 MOV DX,OFFSET CLEANFILE
749 MOV AH,FCB_CREATE
750MAKE_NEXT:
751 INT 21H
752 OR AL,AL
753 JNZ DELETE_THEM
754 INC BYTE PTR CLNNAM
755 CMP BYTE PTR CLNNAM,"Z" + 1
756 JNZ MAKE_NEXT
757 MOV BYTE PTR CLNNAM,"A"
758 INC BYTE PTR CLNNAM + 1
759 CMP BYTE PTR CLNNAM + 1,"Z" + 1
760 JNZ MAKE_NEXT
761 MOV BYTE PTR CLNNAM + 1,"A"
762 INC BYTE PTR CLNNAM + 2
763 JMP MAKE_NEXT
764
765DELETE_THEM:
766 MOV WORD PTR CLNNAM,"??"
767 MOV BYTE PTR CLNNAM + 2,"?"
768 MOV AH,FCB_DELETE
769 INT 21H
770RET25:
771 RET ;And return
772
773
774;*****************************************
775; Process V switch if set
776
777VOLID:
778 TEST [SWITCHMAP],VOLSW
779 JNZ DOVOL
780VRET: CLC
781 RET
782
783DOVOL:
784 PUSH CX
785 PUSH SI
786 PUSH DI
787 PUSH ES
788 PUSH DS
789 POP ES
790VOL_LOOP:
791 MOV AL,DRIVE
792 INC AL
793 MOV DS:BYTE PTR[VOLFCB+7],AL
794 MOV DX,OFFSET LABPRMT
795 CALL PRINT
796 MOV DX,OFFSET INBUFF
797 MOV AH,STD_CON_STRING_INPUT
798 INT 21H
799 MOV DX,OFFSET CRLFMSG
800 CALL PRINT
801 MOV DX,OFFSET CRLFMSG
802 CALL PRINT
803 MOV CL,[INBUFF+1]
804 OR CL,CL
805 JZ VOLRET
806 XOR CH,CH
807 MOV SI,OFFSET INBUFF+2
808 MOV DI,SI
809 ADD DI,CX
810 MOV CX,11
811 MOV AL,' '
812 REP STOSB
813 MOV CX,5
814 MOV DI,OFFSET VOLNAM
815 REP MOVSW
816 MOVSB
817 MOV DX,OFFSET VOLFCB
818 MOV AH,FCB_CREATE
819 INT 21H
820 OR AL,AL
821 JZ GOOD_CREATE
822 MOV DX,OFFSET INVCHR ;PRINT INVALID CHARS MESSAGE
823 CALL PRINT
824 JMP VOL_LOOP
825GOOD_CREATE:
826 MOV DX,OFFSET VOLFCB
827 MOV AH,FCB_CLOSE
828 INT 21H
829 CALL CRLF
830VOLRET:
831 POP ES
832 POP DI
833 POP SI
834 POP CX
835 RET
836
837;****************************************
838;Copy IO.SYS, MSDOS.SYS and COMMAND.COM into data area.
839; Carry set if problems
840
841READDOS:
842 CALL TESTSYSDISK
843 JNC RDFILS
844 RET
845
846RDFILS:
847 MOV BYTE PTR [FILSTAT],0
848 MOV BX,[BIOSHandle]
849 MOV AX,[MSTART]
850 MOV DX,AX
851 ADD DX,[MSIZE] ; CX first bad para
852 MOV [BIOSSTRT],AX
853 MOV CX,[BIOSSIZP]
854 ADD AX,CX
855 CMP AX,DX
856 JBE GOTBIOS
857 MOV BYTE PTR [FILSTAT],00000001B ; Got part of BIOS
858 MOV SI,[MSIZE]
859 XOR DI,DI
860 CALL DISIX4
861 MOV DS,[BIOSSTRT]
862ASSUME DS:NOTHING
863 CALL READFILE
864ASSUME DS:CODE
865 JC CLSALL
866 XOR DX,DX
867 MOV CX,DX
868 MOV AX,(LSEEK SHL 8) OR 1
869 INT 21H
870 MOV WORD PTR [BIOSOFFS],AX
871 MOV WORD PTR [BIOSOFFS+2],DX
872FILESDONE:
873 CLC
874CLSALL:
875 PUSHF
876 CALL COMCLS
877 POPF
878 RET
879
880GOTBIOS:
881 MOV BYTE PTR [FILSTAT],00000010B ; Got all of BIOS
882 LES SI,[BIOSSIZB]
883 MOV DI,ES
884 MOV DS,[BIOSSTRT]
885ASSUME DS:NOTHING
886 CALL READFILE
887ASSUME DS:CODE
888 JC CLSALL
889 MOV BX,[DOSHandle]
890 MOV [DOSSTRT],AX
891 CMP AX,DX ; No room left?
892 JZ CLSALL ; Yes
893 MOV CX,[DOSSIZP]
894 ADD AX,CX
895 CMP AX,DX
896 JBE GOTDOS
897 OR BYTE PTR [FILSTAT],00000100B ; Got part of DOS
898 SUB DX,[DOSSTRT]
899 MOV SI,DX
900 XOR DI,DI
901 CALL DISIX4
902 MOV DS,[DOSSTRT]
903ASSUME DS:NOTHING
904 CALL READFILE
905ASSUME DS:CODE
906 JC CLSALL
907 XOR DX,DX
908 MOV CX,DX
909 MOV AX,(LSEEK SHL 8) OR 1
910 INT 21H
911 MOV WORD PTR [DOSOFFS],AX
912 MOV WORD PTR [DOSOFFS+2],DX
913 JMP FILESDONE
914
915GOTDOS:
916 OR BYTE PTR [FILSTAT],00001000B ; Got all of DOS
917 LES SI,[DOSSIZB]
918 MOV DI,ES
919 MOV DS,[DOSSTRT]
920ASSUME DS:NOTHING
921 CALL READFILE
922ASSUME DS:CODE
923CLSALLJ: JC CLSALL
924 MOV BX,[COMHandle]
925 MOV [COMSTRT],AX
926 CMP AX,DX ; No room left?
927 JZ CLSALL ; Yes
928 MOV CX,[COMSIZP]
929 ADD AX,CX
930 CMP AX,DX
931 JBE GOTCOM
932 OR BYTE PTR [FILSTAT],00010000B ; Got part of COMMAND
933 SUB DX,[COMSTRT]
934 MOV SI,DX
935 XOR DI,DI
936 CALL DISIX4
937 MOV DS,[COMSTRT]
938ASSUME DS:NOTHING
939 CALL READFILE
940ASSUME DS:CODE
941 JC CLSALLJ
942 XOR DX,DX
943 MOV CX,DX
944 MOV AX,(LSEEK SHL 8) OR 1
945 INT 21H
946 MOV WORD PTR [COMOFFS],AX
947 MOV WORD PTR [COMOFFS+2],DX
948 JMP FILESDONE
949
950GOTCOM:
951 OR BYTE PTR [FILSTAT],00100000B ; Got all of COMMAND
952 LES SI,[COMSIZB]
953 MOV DI,ES
954 MOV DS,[COMSTRT]
955ASSUME DS:NOTHING
956 CALL READFILE
957ASSUME DS:CODE
958 JMP CLSALL
959
960;**************************************************
961;Write BIOS DOS COMMAND to the newly formatted disk.
962
963WRITEDOS:
964 MOV CX,BIOSATT
965 MOV DX,OFFSET BIOSFIL
966 LES SI,[BIOSSIZB]
967 MOV DI,ES
968 CALL MAKEFIL
969 JNC GOTNBIO
970RET34: RET
971
972GOTNBIO:
973 MOV [TempHandle],BX
974 TEST BYTE PTR FILSTAT,00000010B
975 JNZ GOTALLBIO
976 LES SI,[BIOSOFFS]
977 MOV DI,ES
978 MOV WORD PTR [IOCNT],SI
979 MOV WORD PTR [IOCNT+2],DI
980 MOV BP,OFFSET BIOSData
981 CALL GOTTARG
982 JC RET34
983 JMP SHORT BIOSDONE
984
985GOTALLBIO:
986 LES SI,[BIOSSIZB]
987 MOV DI,ES
988 MOV DS,[BIOSSTRT]
989ASSUME DS:NOTHING
990 CALL WRITEFILE
991ASSUME DS:CODE
992BIOSDONE:
993 MOV BX,[TempHandle]
994 MOV CX,BTIME
995 MOV DX,BDATE
996 CALL CLOSETARG
997 MOV CX,DOSATT
998 MOV DX,OFFSET DOSFIL
999 LES SI,[DOSSIZB]
1000 MOV DI,ES
1001 CALL MAKEFIL
1002 JC RET34
1003
1004GOTNDOS:
1005 MOV [TempHandle],BX
1006 TEST BYTE PTR FILSTAT,00001000B
1007 JNZ GOTALLDOS
1008 MOV BP,OFFSET DOSData
1009 TEST BYTE PTR FILSTAT,00000100B
1010 JNZ PARTDOS
1011 MOV WORD PTR [DOSOFFS],0
1012 MOV WORD PTR [DOSOFFS+2],0
1013 CALL GETSYS3
1014RET34J: JC RET34
1015 JMP SHORT DOSDONE
1016
1017PARTDOS:
1018 LES SI,[DOSOFFS]
1019 MOV DI,ES
1020 MOV WORD PTR [IOCNT],SI
1021 MOV WORD PTR [IOCNT+2],DI
1022 CALL GOTTARG
1023 JC RET34J
1024 JMP SHORT DOSDONE
1025
1026GOTALLDOS:
1027 LES SI,[DOSSIZB]
1028 MOV DI,ES
1029 MOV DS,[DOSSTRT]
1030ASSUME DS:NOTHING
1031 CALL WRITEFILE
1032ASSUME DS:CODE
1033DOSDONE:
1034 MOV BX,[TempHandle]
1035 MOV CX,DTIME
1036 MOV DX,DDATE
1037 CALL CLOSETARG
1038 MOV CX,COMATT
1039 MOV DX,OFFSET COMFIL
1040 LES SI,[COMSIZB]
1041 MOV DI,ES
1042 CALL MAKEFIL
1043 JNC GOTNCOM
1044RET35: RET
1045
1046GOTNCOM:
1047 MOV [TempHandle],BX
1048 TEST BYTE PTR FILSTAT,00100000B
1049 JNZ GOTALLCOM
1050 MOV BP,OFFSET COMData
1051 TEST BYTE PTR FILSTAT,00010000B
1052 JNZ PARTCOM
1053 MOV WORD PTR [COMOFFS],0
1054 MOV WORD PTR [COMOFFS+2],0
1055 CALL GETSYS3
1056 JC RET35
1057 JMP SHORT COMDONE
1058
1059PARTCOM:
1060 LES SI,[COMOFFS]
1061 MOV DI,ES
1062 MOV WORD PTR [IOCNT],SI
1063 MOV WORD PTR [IOCNT+2],DI
1064 CALL GOTTARG
1065 JC RET35
1066 JMP SHORT COMDONE
1067
1068GOTALLCOM:
1069 LES SI,[COMSIZB]
1070 MOV DI,ES
1071 MOV DS,[COMSTRT]
1072ASSUME DS:NOTHING
1073 CALL WRITEFILE
1074ASSUME DS:CODE
1075COMDONE:
1076 MOV BX,[TempHandle]
1077 MOV CX,CTIME
1078 MOV DX,CDATE
1079 CALL CLOSETARG
1080 CMP BYTE PTR [FILSTAT],00101010B
1081 JZ NOREDOS
1082RDFRST2:
1083 CALL READDOS ; Start back with BIOS
1084 JNC NOREDOS
1085 CALL SYSPRM ;Prompt for system disk
1086 JMP RDFRST2 ;Try again
1087NOREDOS:
1088 CLC
1089 RET
1090
1091;*********************************************
1092; Create a file on target disk
1093; CX = attributes, DX points to name
1094; DI:SI is size file is to have
1095;
1096; There is a bug in DOS 2.00 and 2.01 having to do with writes
1097; from the end of memory. In order to circumvent it this routine
1098; must create files with the length in DI:SI
1099;
1100; On return BX is handle, carry set if problem
1101
1102MAKEFIL:
1103 MOV BX,DX
1104 PUSH WORD PTR [BX]
1105 MOV AL,TARGDRV
1106 MOV [BX],AL
1107 MOV AH,CREAT
1108 INT 21H
1109 POP WORD PTR [BX]
1110 MOV BX,AX
1111 JC RET50
1112 MOV CX,DI
1113 MOV DX,SI
1114 MOV AX,LSEEK SHL 8
1115 INT 21H ; Seek to eventual EOF
1116 XOR CX,CX
1117 MOV AH,WRITE
1118 INT 21H ; Set size of file to position
1119 XOR CX,CX
1120 MOV DX,CX
1121 MOV AX,LSEEK SHL 8
1122 INT 21H ; Seek back to start
1123RET50:
1124 RET
1125
1126;*********************************************
1127; Close a file on the target disk
1128; CX/DX is time/date, BX is handle
1129
1130CLOSETARG:
1131 MOV AX,(FILE_TIMES SHL 8) OR 1
1132 INT 21H
1133 MOV AH,CLOSE
1134 INT 21H
1135 RET
1136
1137SAVUDIRS:
1138 XOR DL,DL
1139 MOV SI,OFFSET USERDIRS
1140 MOV BYTE PTR [SI],'\'
1141 INC SI
1142 MOV AH,CURRENT_DIR
1143 INT 21H
1144RET43: RET
1145
1146
1147RESTUDIR:
1148 TEST SWITCHMAP,SYSSW
1149 JZ RET43
1150 MOV DX,OFFSET USERDIRS
1151 MOV AH,CHDIR
1152 INT 21H ; Restore users DIR
1153 RET
1154
1155INT_23:
1156 PUSH CS
1157 POP DS
1158 JMP FEXIT
1159
1160;****************************************
1161; Transfer system files
1162; BP points to data structure for file involved
1163; offset is set to current amount read in
1164; Start set to start of file in buffer
1165; TempHandle is handle to write to on target
1166
1167IOLOOP:
1168 MOV AL,[SYSDRV]
1169 CMP AL,[TARGDRV]
1170 JNZ GOTTARG
1171 MOV AH,DISK_RESET
1172 INT 21H
1173 CALL TARGPRM ;Get target disk
1174
1175GOTTARG:
1176;Enter here if some of file is already in buffer, IOCNT must be set
1177; to size already in buffer.
1178 MOV BX,[TempHandle]
1179 MOV SI,WORD PTR [IOCNT]
1180 MOV DI,WORD PTR [IOCNT+2]
1181 MOV DS,[BP.FILE_START]
1182ASSUME DS:NOTHING
1183 CALL WRITEFILE ; Write next part
1184ASSUME DS:CODE
1185 JNC TESTDONE
1186 RET
1187
1188TESTDONE:
1189 LES AX,[BP.FILE_OFFSET]
1190 CMP AX,WORD PTR [BP.FILE_SIZEB]
1191 JNZ GETSYS3
1192 MOV AX,ES
1193 CMP AX,WORD PTR [BP.FILE_SIZEB+2]
1194 JNZ GETSYS3
1195 RET ; Carry clear from CMP
1196
1197GETSYS3:
1198;Enter here if none of file is in buffer
1199 MOV AX,[MSTART] ; Furthur IO done starting here
1200 MOV [BP.FILE_START],AX
1201 MOV AL,[SYSDRV]
1202 CMP AL,[TARGDRV]
1203 JNZ TESTSYS
1204 MOV AH,DISK_RESET
1205 INT 21H
1206GSYS:
1207 CALL SYSPRM ;Prompt for system disk
1208TESTSYS:
1209 CALL TESTSYSDISK
1210 JC GSYS
1211 MOV BX,[BP.FILE_HANDLE]
1212 LES DX,[BP.FILE_OFFSET]
1213 PUSH DX
1214 MOV CX,ES
1215 MOV AX,LSEEK SHL 8
1216 INT 21H
1217 POP DX
1218 LES SI,[BP.FILE_SIZEB]
1219 MOV DI,ES
1220 SUB SI,DX
1221 SBB DI,CX ; DI:SI is #bytes to go
1222 PUSH DI
1223 PUSH SI
1224 ADD SI,15
1225 ADC DI,0
1226 CALL DISID4
1227 MOV AX,SI
1228 POP SI
1229 POP DI
1230 CMP AX,[MSIZE]
1231 JBE GOTSIZ2
1232 MOV SI,[MSIZE]
1233 XOR DI,DI
1234 CALL DISIX4
1235GOTSIZ2:
1236 MOV WORD PTR [IOCNT],SI
1237 MOV WORD PTR [IOCNT+2],DI
1238 MOV DS,[MSTART]
1239ASSUME DS:NOTHING
1240 CALL READFILE
1241ASSUME DS:CODE
1242 JNC GETOFFS
1243 CALL CLSALL
1244 JMP GSYS
1245GETOFFS:
1246 XOR DX,DX
1247 MOV CX,DX
1248 MOV AX,(LSEEK SHL 8) OR 1
1249 INT 21H
1250 MOV WORD PTR [BP.FILE_OFFSET],AX
1251 MOV WORD PTR [BP.FILE_OFFSET+2],DX
1252 CALL CLSALL
1253 JMP IOLOOP
1254
1255;*************************************************
1256; Test to see if correct system disk. Open handles
1257
1258TESTSYSDISK:
1259 MOV AX,OPEN SHL 8
1260 MOV DX,OFFSET BIOSFIL
1261 INT 21H
1262 JNC SETBIOS
1263CRET12: STC
1264RET12: RET
1265
1266SETBIOS:
1267 MOV [BIOSHandle],AX
1268 MOV BX,AX
1269 CALL GETFSIZ
1270 CMP [BIOSSIZP],0
1271 JZ SETBIOSSIZ
1272 CMP [BIOSSIZP],AX
1273 JZ SETBIOSSIZ
1274BIOSCLS:
1275 MOV AH,CLOSE
1276 MOV BX,[BIOSHandle]
1277 INT 21H
1278 JMP CRET12
1279
1280SETBIOSSIZ:
1281 MOV [BIOSSIZP],AX
1282 MOV WORD PTR [BIOSSIZB],SI
1283 MOV WORD PTR [BIOSSIZB+2],DI
1284 MOV [BDATE],DX
1285 MOV [BTIME],CX
1286 MOV AX,OPEN SHL 8
1287 MOV DX,OFFSET DOSFIL
1288 INT 21H
1289 JNC DOSOPNOK
1290 JMP BIOSCLS
1291
1292DOSOPNOK:
1293 MOV [DOSHandle],AX
1294 MOV BX,AX
1295 CALL GETFSIZ
1296 CMP [DOSSIZP],0
1297 JZ SETDOSSIZ
1298 CMP [DOSSIZP],AX
1299 JZ SETDOSSIZ
1300DOSCLS:
1301 MOV AH,CLOSE
1302 MOV BX,[DOSHandle]
1303 INT 21H
1304 JMP BIOSCLS
1305
1306SETDOSSIZ:
1307 MOV [DOSSIZP],AX
1308 MOV WORD PTR [DOSSIZB],SI
1309 MOV WORD PTR [DOSSIZB+2],DI
1310 MOV [DDATE],DX
1311 MOV [DTIME],CX
1312 MOV AX,OPEN SHL 8
1313 MOV DX,OFFSET COMFIL
1314 INT 21H
1315 JC DOSCLS
1316 MOV [COMHandle],AX
1317 MOV BX,AX
1318 CALL GETFSIZ
1319 CMP [COMSIZP],0
1320 JZ SETCOMSIZ
1321 CMP [COMSIZP],AX
1322 JZ SETCOMSIZ
1323COMCLS:
1324 MOV AH,CLOSE
1325 MOV BX,[COMHandle]
1326 INT 21H
1327 JMP DOSCLS
1328
1329SETCOMSIZ:
1330 MOV [COMSIZP],AX
1331 MOV WORD PTR [COMSIZB],SI
1332 MOV WORD PTR [COMSIZB+2],DI
1333 MOV [CDATE],DX
1334 MOV [CTIME],CX
1335 CLC
1336 RET
1337
1338;*******************************************
1339; Handle in BX, return file size in para in AX
1340; File size in bytes DI:SI, file date in DX, file
1341; time in CX.
1342
1343GETFSIZ:
1344 MOV AX,(LSEEK SHL 8) OR 2
1345 XOR CX,CX
1346 MOV DX,CX
1347 INT 21H
1348 MOV SI,AX
1349 MOV DI,DX
1350 ADD AX,15 ; Para round up
1351 ADC DX,0
1352 AND DX,0FH ; If the file is larger than this
1353 ; it is bigger than the 8086 address space!
1354 MOV CL,12
1355 SHL DX,CL
1356 MOV CL,4
1357 SHR AX,CL
1358 OR AX,DX
1359 PUSH AX
1360 MOV AX,LSEEK SHL 8
1361 XOR CX,CX
1362 MOV DX,CX
1363 INT 21H
1364 MOV AX,FILE_TIMES SHL 8
1365 INT 21H
1366 POP AX
1367 RET
1368
1369;********************************************
1370; Read/Write file
1371; DS:0 is Xaddr
1372; DI:SI is byte count to I/O
1373; BX is handle
1374; Carry set if screw up
1375;
1376; I/O SI bytes
1377; I/O 64K - 1 bytes DI times
1378; I/O DI bytes
1379; DS=CS on output
1380
1381
1382READFILE:
1383; Must preserve AX,DX
1384 PUSH AX
1385 PUSH DX
1386 PUSH BP
1387 MOV BP,READ SHL 8
1388 CALL FILIO
1389 POP BP
1390 POP DX
1391 POP AX
1392 PUSH CS
1393 POP DS
1394 RET
1395
1396WRITEFILE:
1397 PUSH BP
1398 MOV BP,WRITE SHL 8
1399 CALL FILIO
1400 POP BP
1401 PUSH CS
1402 POP DS
1403 RET
1404
1405FILIO:
1406 XOR DX,DX
1407 MOV CX,SI
1408 JCXZ K64IO
1409 MOV AX,BP
1410 INT 21H
1411 JC IORET
1412 ADD DX,AX
1413 CMP AX,CX ; If not =, AX<CX, carry set.
1414 JNZ IORET
1415 CALL NORMALIZE
1416K64IO:
1417 CLC
1418 MOV CX,DI
1419 JCXZ IORET
1420 MOV AX,BP
1421 INT 21H
1422 JC IORET
1423 ADD DX,AX
1424 CMP AX,CX ; If not =, AX<CX, carry set.
1425 JNZ IORET
1426 CALL NORMALIZE
1427 MOV CX,DI
1428K64M1:
1429 PUSH CX
1430 XOR AX,AX
1431 OR DX,DX
1432 JZ NORMIO
1433 MOV CX,10H
1434 SUB CX,DX
1435 MOV AX,BP
1436 INT 21H
1437 JC IORETP
1438 ADD DX,AX
1439 CMP AX,CX ; If not =, AX<CX, carry set.
1440 JNZ IORETP
1441 CALL NORMALIZE
1442NORMIO:
1443 MOV CX,0FFFFH
1444 SUB CX,AX
1445 MOV AX,BP
1446 INT 21H
1447 JC IORETP
1448 ADD DX,AX
1449 CMP AX,CX ; If not =, AX<CX, carry set.
1450 JNZ IORETP
1451 CALL NORMALIZE ; Clears carry
1452 POP CX
1453 LOOP K64M1
1454 PUSH CX
1455IORETP:
1456 POP CX
1457IORET:
1458 RET
1459
1460
1461;*********************************
1462; Shift DI:SI left 4 bits
1463DISIX4:
1464 MOV CX,4
1465SH32:
1466 SHL SI,1
1467 RCL DI,1
1468 LOOP SH32
1469 RET
1470
1471;*********************************
1472; Shift DI:SI right 4 bits
1473DISID4:
1474 MOV CX,4
1475SH32B:
1476 SHR DI,1
1477 RCR SI,1
1478 LOOP SH32B
1479 RET
1480
1481;********************************
1482; Normalize DS:DX
1483
1484NORMALIZE:
1485 PUSH DX
1486 PUSH AX
1487 SHR DX,1
1488 SHR DX,1
1489 SHR DX,1
1490 SHR DX,1
1491 MOV AX,DS
1492 ADD AX,DX
1493 MOV DS,AX
1494 POP AX
1495 POP DX
1496 AND DX,0FH ; Clears carry
1497 RET
1498
1499
1500ROOTSTR DB ?
1501 DB ":"
1502SWTCH DB "/",0
1503DBLFLG DB 0 ;Initialize flags to zero
1504CLEARFLG DB 0
1505DRIVE DB 0
1506DEFALT DB 0 ;Default drive
1507IOCNT DD ?
1508MSTART DW ? ; Start of sys file buffer (para#)
1509MSIZE DW ? ; Size of above in paragraphs
1510TempHandle DW ?
1511FILSTAT DB ? ; In memory status of files
1512 ; XXXXXX00B BIOS not in
1513 ; XXXXXX01B BIOS partly in
1514 ; XXXXXX10B BIOS all in
1515 ; XXXX00XXB DOS not in
1516 ; XXXX01XXB DOS partly in
1517 ; XXXX10XXB DOS all in
1518 ; XX00XXXXB COMMAND not in
1519 ; XX01XXXXB COMMAND partly in
1520 ; XX10XXXXB COMMAND all in
1521
1522USERDIRS DB DIRSTRLEN+3 DUP(?) ; Storage for users current directory
1523
1524BIOSData LABEL BYTE
1525BIOSHandle DW 0
1526BIOSSIZP DW 0
1527BIOSSIZB DD ?
1528BIOSOFFS DD ?
1529BIOSSTRT DW ?
1530BDATE DW 0 ;IO system date stored here
1531BTIME DW 0 ;IO system time stored here
1532
1533BIOSATT EQU attr_hidden + attr_system + attr_read_only
1534BIOSFIL LABEL BYTE
1535BIODRV LABEL BYTE
1536 DB "X:\"
1537 IF IBMVER OR IBMJAPVER
1538 DB "IBMBIO.COM"
1539 ENDIF
1540 IF MSVER
1541 DB "IO.SYS"
1542 ENDIF
1543 DB 0
1544
1545DOSData LABEL BYTE
1546DOSHandle DW 0
1547DOSSIZP DW 0
1548DOSSIZB DD ?
1549DOSOFFS DD ?
1550DOSSTRT DW ?
1551DDATE DW 0 ;DOS date stored here
1552DTIME DW 0 ;DOS time
1553
1554DOSATT EQU attr_hidden + attr_system + attr_read_only
1555DOSFIL LABEL BYTE
1556DOSDRV LABEL BYTE
1557 DB "X:\"
1558 IF IBMVER OR IBMJAPVER
1559 DB "IBMDOS.COM"
1560 ENDIF
1561 IF MSVER
1562 DB "MSDOS.SYS"
1563 ENDIF
1564 DB 0
1565
1566COMData LABEL BYTE
1567COMHandle DW 0
1568COMSIZP DW 0
1569COMSIZB DD ?
1570COMOFFS DD ?
1571COMSTRT DW ?
1572CDATE DW 0 ;Date of COMMAND
1573CTIME DW 0 ;Time of COMMAND
1574
1575COMATT EQU 0
1576COMFIL LABEL BYTE
1577COMDRV LABEL BYTE
1578 DB "X:\COMMAND.COM",0
1579
1580VOLFCB DB -1,0,0,0,0,0,8
1581 DB 0
1582VOLNAM DB " "
1583 DB 8
1584 DB 26 DUP(?)
1585
1586ALLFILE DB -1,0,0,0,0,0,0FFH
1587ALLDRV DB 0,"???????????"
1588 DB 26 DUP(?)
1589
1590CLEANFILE DB 0
1591CLNNAM DB "AAAFFFFFFOR"
1592 DB 26 DUP(?)
1593
1594SWITCHMAP DW ?
1595SWITCHCOPY DW ?
1596FAT DW ?
1597 DW ?
1598CLUSSIZ DW ?
1599SECSIZ DW ?
1600SYSSIZ DD ?
1601FDSKSIZ DD ?
1602BADSIZ DD ?
1603SYSTRKS DW ?
1604SECTORS DW ?
1605INBUFF DB 80,0
1606 DB 80 DUP(?)
1607
1608 DB 100H DUP(?)
1609
1610STACK LABEL BYTE
1611
1612;For FORMES module
1613
1614 EXTRN BADVER:BYTE,SNGMSG:BYTE,SNGDRV:BYTE,HRDMSG:BYTE,HRDDRV:BYTE
1615 EXTRN LABPRMT:BYTE,TARGMSG:BYTE,TARGDRV:BYTE
1616 EXTRN SYSTRAN:BYTE,CRLFMSG:BYTE,INVCHR:BYTE,INVDRV:BYTE
1617 EXTRN SYSMSG:BYTE,SYSDRV:BYTE,FRMTERR:BYTE,NOTSYS:BYTE
1618 EXTRN NOUSE:BYTE,MEMEX:BYTE,INVPAR:BYTE
1619
1620 IF IBMVER
1621 EXTRN ASGERR:BYTE
1622 ENDIF
1623
1624CODE ENDS
1625
1626 END START
1627 \ No newline at end of file