[comp.sys.atari.8bit] MYDOS 4.51 source posting

chasm@killer.DALLAS.TX.US (Charles Marslett) (06/24/89)

#	This is a shell archive (Part 1 of 3)
#
#	It contains a note describing the changes made to
#	MYDOS from version 4.50 to 4.51, a short file
#	describing how to rebuild MYDOS from the source
#	files, and the source to the BUILD utility program
#	used to install MYDOS into memory -- the final step
#	in rebuilding MYDOS from the sources.
#
#	Run it through the Bourne shell "sh" or an unshar program.
#	Assemble the BUILD.ASM file using the just posted A65
#	assembler and read the other two.
#
#	The source to MYDOS 4.51 follows in the two remaining parts of
#	this posting.
#
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:   Shell Archiver
#	Run the following text with /bin/sh to create:
#	changes
#	read.me
#	build.asm
# This archive created: Sat Jun 24 08:36:56 1989
sed 's/^X//' << \SHAR_EOF > changes
XMYDOS 4.51 -- Released June 14, 1989
X
XMYDOS 4.51 restores some of the
X"features" of 4.3, including being
Xwritten in Atari AMAC syntax (that
Xis, compatible with MADMAC and my
Xown A65 assemblers). This seems more
Xconsistent than MAC/65. See the
Xfollowing list for the changed
Xcode. Like 4.50, it mostly fixes
Xbugs in features that never worked
Xright in the past. the changes are
Xvery minor.
X
X
XChanges from 4.50 to 4.51 --
X
X1.Lock/Unlock work the way they
X  used to.  Query is the default.
X2.A bug inserted into the program
X  load code is corrected (some code
X  that has to be resident was moved
X  into the DUP overlay area).
X3.The code to work around I/O errors
X  deleting the program file in most
X  BASIC program "starter"s is re-
X  inserted (inadvertently removed
X  in 4.50).
X4.Formatting of disks with bad sec-
X  tors is reenabled (with warning).
X5.Corrected code to copy DOS.SYS
X  from one diskette to another (this
X  never really worked before).
X6.The RAMdisk configuration code in-
X  serted by Bob Puff was retained,
X  but the old code (with specifiable
X  I/O port) is restored for non-
X  Axlon, non-XE compatible RAMdisks.
X7.The correction to keep the VTOC
X  of other disks from being corrupt-
X  ed when I/O errors occurred while
X  writing a VTOC was worse than the
X  problem (any I/O error scrambles
X  all VTOCs with output files open).
X  Perhaps the best fix is to retry
X  forever? Anyway, this is still a
X  problem area.
X8.And, of course, the assembler A65
X  is included. The executable code
X  in MYDOS 4.51 was all assembled
X  using A65.
X
XCopying DOS.SYS -- we now . . .
X
X1) load the 3 boot sectors into RAM
X   from the source disk.
X2) copy the actual file, renaming it
X   "diamond"OS.SYS on the destina-
X   tion disk.
X3) write the 3 boot sectors to the
X   destination drive (updating the
X   sector link mask, link location
X   and sector size flag).
X4) rename "diamond"OS.SYS to DOS.SYS
X   (updating the sector size flag
X   and the starting sector number of
X   DOS.SYS).
X
X
XTo do (before 1990, at least):
X
X1. Add script (batch file) support.
X2. Enable BASIC if no cartridge is
X   installed and the [B] command is
X   issued. Then, disable BASIC if
X   the [L] or [N] commands are
X   issued.
X
XAny volunteers?
X
X
XEnjoy,
X
XCharles Marslett
X
XUsenet: chasm@killer.dallas.tx.us
XCompuserve: 73317,3662
X
XJune 16, 1989
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > read.me
X
X
X
X
X
X     
X     
X     
X     
X     
X     
X     
X     
X     
X                      MYDOS 4.51 Source Code Documentation
X     
X     
X             Copyright (C) 1988, 1989 by WORDMARK Systems and the authors:
X     
X                               Charles Marslett
X                               2705 Pinewood Dr.
X                               Garland, TX 75042
X                                   CIS: 73317,3662
X                                   UseNet: CHASM@KILLER.DALLAS.TX.US
X     
X                                        and
X     
X                               Robert Puff
X                               Suite 222
X                               2117 Buffalo Rd.
X                               Rochester, NY 14624
X                                   GEnie: BOB.PUFF
X     
X     
X     
X          This software may be freely used and distributed provided that
X     this copyright notice is left intact, and provided that:
X     
X     (1) The source code in machine readable form is provided with
X         any binary distribution, or made available at no additional cost
X         to the recipients of the binary distribution.
X     
X     (2) A binary version of a derivative work may be sold for a
X         reasonable distribution charge (less than $50), and the
X         source code in machine readable format must be available.
X     
X     (3) A derivative work may not impose and restriction on the free
X         distribution of the source code.
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X     
X          This is the source code to MYDOS version 4.51.  It is written in
X     Atari AMAC format.  Use the included A65 assembler, Atari AMAC or the
X     Atari MADMAC programs to assemble it.  If you do not want a listing, or
X     do not have a printer, and you are assembling with A65, you can specify
X     "-" as the listing file and only the object files will ge generated.
X     If you want a listing you will probably have to increase the "FILES"
X     configuration parameter to 4 (so the included files can be read -- this
X     is the cause of the "I" errors).
X     
X          Here are a few notes on how to create a working copy of MYDOS
X     from the source:
X     
X     (1) It is easiest to use an older version of MYDOS to assemble the
X     new DOS.  All filenames used in assembling use the D: default drive
X     number; so go to your DOS menu, and set the default drive (and
X     directory) to where your source code resides.  The source code and
X     object files will all fit on one double density disk.  If you only
X     have single density drive(s), then separate the MDOS and MDUP files,
X     but put the object files on the same disk prior to BUILDing.
X     
X     (2) Load A65 and enter D:MDOS.ASM as the source file.  Press return
X     for the object file and either - or P: for the listing file.  A65 will
X     exit back to the MYDOS menu when the assembly is completed.
X     
X     (3) Load A65 and enter D:MDUP.ASM as the source file.  This will
X     assemble the rest of the resident code, and also the non-resident
X     DUP.SYS part.  Again A65 will return to the MYDOS menu.
X     
X     (4) If necessary, copy the MDOS.OBJ and MDUP.OBJ files to a diskette
X     containing BUILD.  Now load (and execute) BUILD.  This file will read
X     the MDOS.OBJ and MDUP.OBJ files you just created.  When asked to,
X     press START, and you will be in the new DOS!  Now use the [H] command
X     to write out DOS files, and you're set!
X
X     
X     What the files contain:
X     
X          The MDOS.ASM and MDUP.ASM files are "header" files, that have
X     some equates, and simply INCLUDE the actual source files (source
X     files are MDOS1.ASM, MDOS2.ASM, MDOS3.ASM, MDOS4.ASM, MDUP1.ASM,
X     MDUP2.ASM, MDUP3.ASM, MDUP4.ASM, MDUP5.ASM, MDUP6.ASM and MDUP3.ASM).
X     Be warned that there are absolute references that MDUP makes to the
X     MDOS files; these are limited to locations in MDOS1.ASM so if the
X     MDOS.ASM or MDOS1.ASM files are modified in any way, these references
X     may need to be changed as well.  They are located in the very beginning
X     of the MDUP.ASM file.
X     
X          The DOS.SYS file itself is contained mostly in the MDOSx files;
X     but the code that takes care of MEM.SAV and loading DUP.SYS is in the
X     file MDUP1.ASM.  Because the DOS is split between two files, you must
X     take note of the last byte the assembly of MDOS.ASM produced, and
X     place this address in the "ORIGIN = xxxx" statement in the MDUP.ASM
X     segment, or the possibility of both files running into each other
X     will exist.
X     
X          I think that is about it.  If you find/correct any bugs, or do
X     any major modifications, Mr. Marslett and I would like to see them.
X     Please see the above references on how to contact us.
X     
X                         Bob Puff          11/28/88
X                         Charles Marslett  6/14/89
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > build.asm
X	TITLE 'DOUBLE DENSITY MYDOS3 SYSTEM DISK BUILDER'
X;
X;  Copyright 1984, Charles Marslett, Wordmark Systems
X;
X;  Permission is granted by the author for any use whatsoever of this
X;    code, so long as this notice remains in the source code, and so
X;    long as the source to this routine, however modified or unmodified,
X;    is made available for a nominal cost.
X;
X;
X;  Some important absolute addresses
X;
XCIOV	=	$E456	;CIO ENTRY VECTOR
X;
XMENUP	=	$02E0	;THE RUN ENTRY POINT OF "MDUP.OBJ"
X;
XORIGIN	=	$4800	;GOTTA BE BIG ENOUGH TO NOT HIT EITHER COPY OF MYDOS
X;
XZCTR	=	$FA	;A GENERAL PURPOSE COUNTER
XBPTR	=	$FC	;A GENERAL PURPOSE POINTER
XZPTR	=	$FE	;AND ANOTHER GENERAL PURPOSE POINTER
X;
X;  Define the fields of IOCB $10 that I use
X;
X	ORG	$0351
X	DS	1
XICMD	DS	1
X	DS	1
XIBUF	DS	4
XILEN	DS	2
XIAUX1	DS	1
XIAUX2	DS	1
X;
X; The BUILD program itself -- loads MDOS.OBJ and MDUP.OBJ into memory above
X;   itself, then relocates the code down over the previous version of MYDOS
X;   that we are running with and starts it up.  This is how we create a new
X;   version of MYDOS.
X;
X	ORG	ORIGIN
X;
XSTART	LDX	#LOW[SIGNON]
X	LDY	#HIGH[SIGNON]	;LOG ONTO THE SCREEN
X	JSR	DMSG
X;
X	LDA	#$C0
X	STA	BPTR+1		;POINT BPTR AT $C000
X	LDY	#0
X	STY	BPTR
X	LDA	#$FF
X	STA	SAVC
X	LDX	#$10
XCLRC	STA	(BPTR),Y
X	INY
X	BNE	CLRC
X	INC	BPTR+1
X	DEX
X	BNE	CLRC
X;
X	LDA	#HIGH[BUFFER]
X	STA	BPTR+1		;POINT BPTR AT "BUFFER"
X	LDA	#LOW[BUFFER]
X	STA	BPTR
X	LDX	#$20
X	LDA	#0
XMVLP1	STA	(BPTR),Y	;FILL THE 8K BUFFER WITH $00 BYTES
X	INY
X	BNE	MVLP1
X	INC	BPTR+1
X	DEX
X	BNE	MVLP1
X;
X; COPY NEW DOS CODE FROM FILE "MDOS.OBJ"
X;
X	LDX	#LOW[MSG01]
X	LDY	#HIGH[MSG01]
X	JSR	DMSG		;ANNOUNCE WE ARE READING "D:MDOS.OBJ"
X	LDY	#LOW[DOSFIL]
X	LDA	#HIGH[DOSFIL]
X	JSR	LOADBF		;LOAD CONTENTS OF "MDOS.OBJ"
X;
X; COPY NEW DOS AND DUP CODE FROM FILE "MDUP.OBJ"
X;
X	LDX	#LOW[MSG02]
X	LDY	#HIGH[MSG02]
X	JSR	DMSG		;ANNOUNCE WE ARE READING "D:MDUP.OBJ"
X	LDY	#LOW[DUPFIL]
X	LDA	#HIGH[DUPFIL]
X	JSR	LOADBF		;LOAD CONTENTS OF "MDUP.OBJ"
X;
X; MOVE BUFFER DOWN TO LOW MEMORY
X;
X	LDX	#LOW[MSG03]
X	LDY	#HIGH[MSG03]
X	JSR	DMSG		;ANNOUNCE WE ARE RELOCATING DOS AND DUP CODE
X	LDA	#$07
X	STA	ZPTR+1
X	LDA	#$00
X	STA	ZPTR		;SET DESTINATION POINTER TO $0700
X	LDA	#HIGH[BUFFER]
X	STA	BPTR+1
X	LDA	#LOW[BUFFER]
X	STA	BPTR		;SET SOURCE POINTER TO "BUFFER"
X;
X	LDY	#0
XMVLP2	LDA	(BPTR),Y
X	STA	(ZPTR),Y	;COPY 256 BYTES AT A TIME UNTIL WE
X	INY			;ARE ABOUT TO OVERWRITE BUILD ITSELF
X	BNE	MVLP2		;(THIS IS TOO MUCH, I HOPE, BUT IT WORKS)
X	INC	BPTR+1
X	INC	ZPTR+1
X	LDA	ZPTR+1
X	CMP	#HIGH[START]
X	BNE	MVLP2
X;
X; REINITIALIZE THE SYSTEM
X;
X	LDX	#LOW[MSG04]
X	LDY	#HIGH[MSG04]
X	JSR	WFSTR		;ANNOUNCE STARTUP AND WAIT FOR A KEY
X;
X	JSR	DOSINI		;REINITIALIZE THE NEW MYDOS
X;
X	LDX	#0
X	LDA	#3
X	STA	ICMD-16
X	LDA	#$2C
X	STA	IAUX1-16
X	LDA	#LOW[EC]
X	STA	IBUF-16
X	LDA	#HIGH[EC]
X	STA	IBUF+1-16
X	JSR	CIOV		;REOPEN THE KEYBOARD/SCREEN "E:" DEVICE
X;
X	LDX	#LOW[MSG05]
X	LDY	#HIGH[MSG05]
X	JSR	WFSTR		;ANNOUNCE WE ARE READY TO RUN THE NEW MYDOS
X;
X	JMP	(MENUP)		;ENTER BACK AT MENU (USE "H" TO SAVE NEW DOS)
X;
X;
X; LOAD CONTENTS OF OBJECT FILE INTO BUFFER
X;
XLOADBF	STY	IBUF
X	STA	IBUF+1
X	LDA	#$FF
X	STA	MINAD
X	STA	MINAD+1		;SET LOW ADDRESS TO $FFFF
X	LDA	#3
X	STA	ICMD
X	LDA	#4
X	STA	IAUX1
X	LDA	#0
X	STA	MAXAD		;SET HIGH ADDRESS TO $0000
X	STA	MAXAD+1
X	STA	IAUX2
X	LDX	#$10
X	JSR	CIOV		;OPEN D:MDOS.OBJ OR D:MDUP.OBJ
X	BPL	GOTFIL
X	LDX	#LOW[NOFIL]
X	LDY	#HIGH[NOFIL]
X	JSR	DMSG		;REPORT IT IF WE CANNOT OPEN THE FILE
X	JMP	($000A)
X;
XGOTFIL	LDA	#7		;ELSE,
X	STA	ICMD		;CHANGE COMMAND TO READ
X	LDA	#LOW[BUFAD]
X	STA	IBUF
X	LDA	#HIGH[BUFAD]	;BUFFER ADDRESS TO THAT OF LOCAL BUF.
X	STA	IBUF+1
X	LDA	#2
X	STA	ILEN
X	LDA	#0
X	STA	ILEN+1		;LENGTH TO 2 BYTES
X	LDX	#$10
X	JSR	CIOV		;READ HEADER
X	BMI	INVHDR		;IF ERROR, REPORT IT
X	LDA	BUFAD
X	AND	BUFAD+1
X	CMP	#$FF		;ELSE, VALID HEADER?
X	BPL	RDNXTB
XINVHDR	LDX	#LOW[NOHDR]
X	LDY	#HIGH[NOHDR]
X	JSR	DMSG		;IF NOT, REPORT THAT ERROR
X	JMP	($000A)
X;
XRDNXTB	LDA	#LOW[BUFAD]	;READ THE NEXT WORD PAIR (START & END ADDR)
X	STA	IBUF
X	LDA	#HIGH[BUFAD]
X	STA	IBUF+1
X	LDA	#4
X	STA	ILEN		;SET LENGTH TO 4 BYTES
X	LDA	#0
X	STA	ILEN+1
X	LDX	#$10
X	JSR	CIOV		;READ START/END ADDRESSES
X	BPL	RDDATA		;IF NO ERROR, LOAD THE DATA
X	CPY	#$88		;ELSE, IS IT EOF?
X	BNE	ABORT		;IF NOT EOF, REPORT THE ERROR
X	JMP	MOVER		;IF EOF, WE HAVE LOADED IT ALL, RETURN NORMALLY
X;
XRDDATA	LDA	BUFAD+2
X	LDY	BUFAD+3
X	CPY	MAXAD+1
X	BCC	NOTMAX		;IF THIS BLOCK SETS A NEW HIGH ADDRESS LOADED
X	BNE	NEWMAX
X	CMP	MAXAD
X	BCC	NOTMAX
XNEWMAX	STY	MAXAD+1		;UPDATE THE HIGH WATER MARK
X	STA	MAXAD
XNOTMAX	SEC
X	SBC	BUFAD
X	STA	ZCTR
X	TYA
X	SBC	BUFAD+1
X	STA	ZCTR+1
X	INC	ZCTR
X	BNE	LENOK
X	INC	ZCTR+1
XLENOK	JSR	DEBUG1
X	LDY	BUFAD+1
X	LDA	BUFAD
X	CPY	MINAD+1		;AND IF IT SETS A NEW LOW ADDRESS LOADED
X	BCC	NEWMIN
X	BNE	NOTMIN
X	CMP	MINAD
X	BCS	NOTMIN		;UPDATE THE LOW WATER MARK
XNEWMIN	CPY	#$03
X	BCC	NOTMIN
X	STY	MINAD+1
X	STA	MINAD
XNOTMIN	CPY	#$07
X	BCC	DONTMV
X	CPY	#$C0		;SKIP THE INDIRECT BUFFER AND MOVE
X	BCS	DONTMV		;IF THE ADDR <0700 OR >BFFF
X	ADC	#LOW[BUFFER-$700]
X	PHA
X	TYA
X	ADC	#HIGH[BUFFER-$700]
X	TAY
X	PLA
XDONTMV	STA	BPTR
X	STY	BPTR+1
X	JSR	DEBUG2
X	LDA	#0
X	STA	ILEN
X	STA	ILEN+1		;READ ONE BYTE AT A TIME
XGETNB	LDX	#$10
X	JSR	CIOV
X	BPL	STBYTE		;AND IF NO ERROR, STORE IT
XABORT	LDX	#LOW[ABORTED]
X	LDY	#HIGH[ABORTED]
X	JSR	DMSG		;REAL I/O ERROR
X	JMP	($000A)		;EXIT TO DOS
X;
XSTBYTE	LDY	BPTR
X	BNE	STBY0
X	LDY	BPTR+1		;TEST FOR BUFFER POINTER BEING STILL VALID
X	CPY	#$C0
X	BNE	STBY0
X	STA	SAVC
X	BEQ	STBY3
XSTBY0	LDY	#0
X	STA	(BPTR),Y	;ALL OK, STORE THE BYTE JUST READ
XSTBY3	INC	BPTR
X	BNE	STBT1
X	INC	BPTR+1
XSTBT1	LDA	ZCTR
X	BNE	STBT2		;INCREMENT THE MEMORY POINTER
X	DEC	ZCTR+1
XSTBT2	DEC	ZCTR
X	LDA	ZCTR
X	ORA	ZCTR+1		;DECREMENT THE BYTE COUNTER
X	BNE	GETNB		;IF STILL IN THE BLOCK, READ THE NEXT BYTE
X	JMP	RDNXTB		;ELSE, EXAMINE THE NEXT BLOCK
X;
XMOVER	LDA	#12		;DONE WITH THE LOAD,
X	STA	ICMD
X	LDX	#$10
X	JSR	CIOV		;CLOSE LOAD FILE
X	JSR	PSTR
X	DB	'(',0
X	LDA	MINAD+1
X	JSR	PHEX		;REPORT THE LOW AND HIGH WATER MARKS
X	LDA	MINAD
X	JSR	PHEX
X	JSR	PSTR
X	DB	'-',0
X	LDA	MAXAD+1
X	JSR	PHEX
X	LDA	MAXAD
X	JSR	PHEX
X	LDX	#LOW[LOADED]
X	LDY	#HIGH[LOADED]
X	JSR	DMSG
X	RTS			;AND RETURN TO THE MAIN LINE CODE
X;
X;	PROGRAM FILE (NEW FMS)
X;
XDOSFIL	DB	'D:MDOS.OBJ',$9B
X;
X;	PROGRAM FILE (NEW UTILITY PROGRAM)
X;
XDUPFIL	DB	'D:MDUP.OBJ',$9B
X;
X;	CONSOLE KEYBOARD/DISPLAY
X;
XEC	DB	'E:',$9B
X;
X; DISPLAY A MESSAGE AND WAIT FOR "START"
X;
XWFSTR	JSR	DMSG		;NESTED CALL TO DISPLAY THE MESSAGE
X	LDA	#8
X	STA	$D01F
XWFSTRT	LDA	$D01F		;READ CONSOLE SWITCHES
X	AND	#1
X	BNE	WFSTRT		;WAIT UNTIL START IS DEPRESSED
X	RTS
X;
X; DISPLAY A MESSAGE TO THE OPERATOR
X;
XDMSG	STX	ZPTR
X	STY	ZPTR+1
X	LDA	#0
X	STA	ZCTR
XMSGLP	LDY	ZCTR
X	LDA	(ZPTR),Y
X	BEQ	DXIT
X	JSR	BYTOUT
X	INC	ZCTR
X	BNE	MSGLP
X;
XDXIT	RTS
X;
XCODE	DB	'0123456789ABCDEF'
X;
X;  DISPLAY A 4 DIGIT HEX NUMBER ON THE SCREEN
X;
XPHEX	PHA
X	LSR	A
X	LSR	A
X	LSR	A
X	LSR	A
X	TAX
X	LDA	CODE,X
X	JSR	BYTOUT
X	PLA
X	AND	#$0F
X	TAX
X	LDA	CODE,X
X;
XBYTOUT	LDX	#11
X	STX	ICMD-$10
X	LDX	#0
X	STX	ILEN-$10
X	STX	ILEN-$10+1
X	JSR	CIOV
X	RTS
X;
XPSTR	PLA
X	STA	ZPTR
X	PLA
X	STA	ZPTR+1
XPLOOP	INC	ZPTR
X	BNE	POUT
X	INC	ZPTR+1
XPOUT	LDX	#0
X	LDA	(ZPTR,X)
X	BEQ	PEXIT
X	JSR	BYTOUT
X	JMP	PLOOP
X;
XPEXIT	LDA	ZPTR+1
X	PHA
X	LDA	ZPTR
X	PHA
X	RTS
X;
X;  REPORT THE HIGH AND LOW BUFFER LIMITS
X;
XDEBUG1	JSR	PSTR
X	DB	'(',0
X	LDA	BUFAD+1
X	JSR	PHEX
X	LDA	BUFAD
X	JSR	PHEX
X	JSR	PSTR
X	DB	'-',0
X	LDA	BUFAD+3
X	JSR	PHEX
X	LDA	BUFAD+2
X	JSR	PHEX
X	RTS
X;
XDEBUG2	JSR	PSTR
X	DB	')'
X	DB	$1E,$1E,$1E,$1E,$1E
X	DB	$1E,$1E,$1E,$1E,$1E
X	DB	$1E,0
X	RTS
X;
X;  ROUTINE TO REINITIALIZE DOS 2.0
X;
XDOSINI	LDA	$704
X	STA	$00C
X	LDA	$704+1
X	STA	$00C+1
X	JMP	($00C)		;==REINITIALIZE ENTIRE DOS/DUP
X;
X;  MESSAGES TO OPERATOR
X;
XSIGNON	DC	$9B,$9B,'  '
X	DC	'M','Y','D','O','S','3',' ','d','o','u','b','l','e'
X	DC	' ','d','e','n','s','i','t','y'
X	DC	' ','A','T','A','R','I',' ','O','S',' ',$9B
X	DB	' '
X	DC	' ',' ',' ',' ',' ',' ','s','y','s','t','e','m'
X	DC	' ','d','i','s','k',' ','b','u','i','l','d','e','r'
X	DC	' ',' ',' ',' ',' ',' ',' ',$9B,$9B
X	DB	0
X;
XMSG01	DB	'LOADING MDOS.OBJ',0
XMSG02	DB	'LOADING MDUP.OBJ',0
XLOADED	DB	$1E,$1E,$1E,$1E,$1E
X	DB	$1E,$1E,$1E,$1E,$1E
X	DB	$1E,$1E,$1E,$1E,$1E
X	DB	$1E,$1E,$1E,$1E,$1E
X	DB	$1E,$1E,'ED',$FE,$9B,0
XMSG03	DB	'Moving DOS/DUP into place',$9B,0
XMSG04	DB	'PRESS '
X	DC	'S','T','A','R','T'
X	DB	' TO INITIALIZE NEW DOS',$9B,0
XMSG05	DB	'PRESS '
X	DC	'S','T','A','R','T'
X	DB	' TO ENTER NEW DOS.',$9B,0
X;
XNOFIL	DB	'Cannot open Object File',$9B,0
XNOHDR	DB	'Invalid Header in Object File',$9B,0
XABORTED	DB	'I/O Error, load aborted',$9B,0
X;
X;  BUFFER FOR PATCHING A RUNNING DOS
X;
XMAXAD	DS	2
XMINAD	DS	2
XSAVC	DS	1
XBUFAD	DS	6	;FOR ADDRESSES
XBUFFER	DS	START-$0700
X;
X; EXECUTION FORCED, LOAD RUN ADDRESS
X;
X;	ORG	$02E0
X;	DW	START		;run address
X;
X	END	START
SHAR_EOF
#	End of shell archive
exit 0
===========================================================================
Charles Marslett
STB Systems, Inc.  <== Apply all standard disclaimers
Wordmark Systems   <== No disclaimers required -- that's just me
chasm@killer.dallas.tx.us

chasm@killer.DALLAS.TX.US (Charles Marslett) (06/24/89)

#	This is a shell archive (Part 2 of 3)
#
#	It contains the source code to the file manager
#	part of MYDOS.  See the documentation in part 1 to
#	assemble it.
#
#	Run this file through the Bourne shell "sh" or an unshar
#	program to extract the individual files.  Assemble using
#	the just posted A65 assembler.
#
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:   Shell Archiver
#	Run the following text with /bin/sh to create:
#	mdos.asm
#	mdos1.asm
#	mdos2.asm
#	mdos3.asm
#	mdos4.asm
# This archive created: Sat Jun 24 08:37:24 1989
sed 's/^X//' << \SHAR_EOF > mdos.asm
X	TITLE	'LARGE DISK FMS'
X;
X;  Copyright 1984, Charles Marslett, Wordmark Systems
X;
X;  Permission is granted by the author for any use whatsoever of this
X;    code, so long as this notice remains in the source code, and so
X;    long as the source to this routine, however modified or unmodified,
X;    is made available for a nominal cost.
X;
X	LIST	C,G,I
X;
X;  DISK I/O EQUATES
X;
XDKADDR	=	$31	;SIO ADDRESS OF FIRST DISK DRIVE (D1:)
XTODK	=	$80	;STATUS BYTE FOR A DATA TRANSFER TO THE DISK
XFROMDK	=	$40	;STATUS BYTE FOR A DATA TRANSFER FROM THE DISK
X;
XREAD	=	'R'	;SIO COMMAND EQUATE FOR READING A DISK
XWRITE	=	'P'	;SIO COMMAND EQUATE FOR WRITING A DISK
XRDSTAT	=	'S'	;SIO COMMAND EQUATE FOR READING THE DRIVE STATUS
XWRITEV	=	'W'	;SIO COMMAND EQUATE FOR WRITING A DISK with VERIFY
XFMTCMD	=	'!'	;SIO COMMAND TO FORMAT A DISKETTE
X;
XLK128	=	125	;LOCATION OF 128 BYTE SECTOR LINK
XLK256	=	253	;LOCATION OF 256 BYTE SECTOR LINK
X;
XWARMST	=	$0008
XDOSVEC	=	$000A
XDOSINI	=	$000C
X;
X	ORG	$0020
XICHIDZ	DS	1
XICDNOZ	DS	1
XICCOMZ	DS	1
XICSTAZ	DS	1
XICBALZ	DS	1
XICBAHZ	DS	1
XICPTLZ	DS	2
XICBLLZ	DS	1
XICBLHZ	DS	1
XICAX1Z	DS	1
XICAX2Z	DS	1
X	DS	2
XCURFCB	DS	1
XDATBYT	DS	1
X;
X	ORG	$0031
XCHKSUM	DS	1
XBUFR	DS	2
X;
X	ORG	$0043
XFMSZPG	DS	2
XDIRDSP	=	FMSZPG
XDIRSEC	=	FMSZPG+1
XCURFNO	DS	1
XFMSBPT	DS	2
XTMP1	DS	1
XTMP2	DS	1
X;
X;  DEFINITIONS FOR THE ATARI ROM EXECUTIVE
X;
XDSKTIM	=	$0246
XRUNADR	=	$02E0
XINIADR	=	$02E2
XMEMTOP	=	$02E7
XDVSTAT	=	$02EA
X;
X;  SIO COMMAND BUFFER DEFINITION
X;
X	ORG	$0300
XDDEVIC	DS	1
XDUNIT	DS	1
XDCOMND	DS	1
XDSTATS	DS	1
XDBUFLO	DS	1
XDBUFHI	DS	1
XDTIMLO	DS	2
XDBYTLO	DS	1
XDBYTHI	DS	1
XDAUX1	DS	1
XDAUX2	DS	1
X;
X;  I/O SYSTEM DEFINITIONS
X;
XHATABS	=	$031A		;BASE OF THE DYNAMIC HANDLER TABLE
X;
X;  CIO COMMAND TABLE BASE DEFINITIONS (FOR IOCB $00)
X;
X	ORG	$0340
XICHID	DS	1
XICDNO	DS	1
XICCOM	DS	1
XICSTA	DS	1
XICBAL	DS	1
XICBAH	DS	1
XICPTL	DS	1
XICPTH	DS	1
XICBLL	DS	1
XICBLH	DS	1
XICAX1	DS	1
XICAX2	DS	1
XICSPR	DS	4
X;
X;  CARTRIDGE SUBSYSTEM DEFINITIONS
X;
XCARINIT	=	$BFFE		;LOCATION OF INIT VECTOR
XCARTEST	=	$BFFC		;LOCATION OF FLAGS
XCARRUN	=	$BFFA		;LOCATION OF RUN VECTOR
X;
X;  800XL MAP CONTROL
X;
XMAPREG	=	$D301
X;
X;  OTHER I/O PORT DEFINITIONS
X;
XNMIEN	=	$D40E
X;
X;  ROM VECTORS
X;
XDSKINV	=	$E453		;SINGLE DENSITY DISK I/O ENTRY POINT
XSIOV	=	$E459		;SERIAL I/O O.S. ENTRY POINT
X;
X	INCLUDE	D:MDOS1.ASM	;DATA AND CODE THAT REMAINS FIXED
X;
X	INCLUDE	D:MDOS2.ASM	;FILE SYSTEM FUNCTIONS
X;
X	INCLUDE	D:MDOS3.ASM	;INTERNAL DISK I/O ROUTINES
X;
X	INCLUDE	D:MDOS4.ASM	;UTILITY SUBROUTINES
X;
XBOOTND	END			;START DUP HERE!
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > mdos1.asm
X;=================================================
X;=	MYDOS BOOT CODE				==
X;=================================================
X;
X;	DISK BOOT SECTORS (3)
X;
X	ORG	$0700	;DOS.BOOT LOADS AT 0700
XBOOTFL	DB	'M'	;INDICATE MYDOS 4.5 OR LATER
XBOOTL	DB	3	;NUMBER OF SECTORS IN THE BOOT
XBOOTAD	DW	BOOTFL	;ADDRESS OF BOOT CODE IN RAM
XBOOTIN	DW	INIT
X	JMP	INBOOT	;JUMP TO THE BOOT CONTINUATION
XFILES	DB	3	;NUMBER OF FILES THAT MAY BE OPEN AT ONCE
X;DRIVES	=	*	;USED TO BE BIT PATTERN FOR DRIVES
XRAMDKU	DB	$09	;RAM DISK UNIT #
X;BUFALC	=	*	;USED TO BE BUF. ALLOC. DIR.
XDEFAULT	DB	1	;DEFAULT UNIT NUMBER
XDOSEND	DW	BOOTND	;ADDRESS OF THE FIRST BYTE OF FREE MEM.
XSECDAT	DB	1	;1=128 BYTE SECTOR/2=256 BYTE SECTOR
XDOSLOC	DW	4	;SECTOR ADDRESS OF DOS.SYS
XDLINK	DB	LK128	;OFFSET TO THE SECTOR LINK FIELD
XDOSAD	DW	BASE	;ADDRESS TO LOAD DOS.SYS INTO
X;
XINBOOT	LDY	DOSAD	;SET UP START OF DOS AS BUFFER ADDRESS
X	LDA	DOSAD+1
X	JSR	BTSET	;LOW ADDR IN Y, HIGH IN A
X;
X	LDA	DOSLOC+1
X	LDY	DOSLOC	;PUT DOS DISK ADDRESS INTO (A,Y)
X;
X;	DOS.SYS INPUT LOOP
X;
XINITLP	CLC		;CLEAR CY, 'DO A READ'
X	LDX	SECDAT	;GET CODE FOR SECTOR SIZE
X	BEQ	NODOS	;IF ZERO, NO DOS ON DISK!
X	JSR	DKIO	;INVOKE DISK I/O ROUTINE
X	BMI	NODOS	;IF AN ERROR, RETURN NO-DOS ERROR
X	LDY	DLINK	;POINT TO LINK
X	LDA	(FMSZPG),Y	;CHECK FOR NEXT LINK (10-BITS)
XANDCD	AND	#$03	;BEING ZERO,
X	PHA		;SAVE UPPER BYTE OF ADDRESS
X	INY
X	ORA	(FMSZPG),Y	;IF SO, LOADING IS COMPLETE
X	BEQ	BOOTXT
X	LDA	(FMSZPG),Y	;ELSE, IT'S THE ADDRESS OF NEXT SECTOR
X	PHA		;SAVE LOWER BYTE ON STACK
X	JSR	MVBUFR	;THEN ADJUST THE BUFFER POINTER IN DCB
X	PLA
X	TAY		;RESTORE LOWER BYTE TO Y-REG
X	PLA		;RECOVER UPPER BYTE OF DISK ADDRESS
X	BCC	INITLP	;AND CONTINUE LOADING
X;
XNODOS	LDA	#$C0	;NO BOOT PROGRAM ERROR CODE
X	DB	$A0	;SKIP SINGLE BYTE (LDY #)
X;
XBOOTXT	PLA
XDOSXIT	ASL	A	;SET CARRY, CONVER CODE TO FINAL VALUE
X	TAY		;PUT CODE INTO Y-REG
X	RTS		;AND EXIT
X;
X;	MOVE BUFFER POINTERS TO NEXT AREA TO BE LOADED
X;
XMVBUFR	LDA	DLINK
X	CLC
X	ADC	FMSZPG	;ADD DLINK TO THE CURRENT BUFFER ADDRESS
X	TAY		;LOW BYTE TO Y-REG
X	LDA	FMSZPG+1
X	ADC	#0
XBTSET	STY	FMSZPG
X	STA	FMSZPG+1
XBUFSET	STY	DBUFLO	;STORE LOW BYTE INTO DCB
X	STA	DBUFHI	;THEN UPPER BYTE
X	RTS
X;
X;	PERFORM DISK READ(CY=0) OR WRITE (CY=1)
X;
XDKIO	STA	DAUX2	;STORE UPPER BYTE OF SECTOR ADDRESS
X	STY	DAUX1	;THEN LOWER BYTE
XDKIO2	LDY	#3
X	LDA	#READ
X	BCC	SETRTY	;IF CY=0, READ INTO RAM
X	LDA	WRCMDB
X;
XSETRTY	STY	TMP1	;SET NUMBER OF TRIES
XDKFME	STA	DCOMND
X	CLC
X	LDA	#WRITEV	;CLC AND CONSTANT FOR POKERS
XWRCMDB	=	*-1
X	STY	DTIMLO
X	LDA	#128	;ASSUME A 128-BYTE SECTOR SIZE
X	DEX
X	BEQ	STBUFL
X	LDX	DAUX2	;SECTOR > 256?
X	BNE	SET256
X	LDX	DAUX1
X	CPX	#4	;SECTOR > 3
X	BCC	STBUFL	;IF NOT
XSET256	ASL	A	;MAKE A 256 BYTE SECTOR SIZE
XSTBUFL	STA	DBYTLO
X	ROL	A
X	STA	DBYTHI
X	LDY	#DKADDR	;PUT DISK DEVICE CODE INTO DCB
X	STY	DDEVIC
XIORTRY	DEC	TMP1
X	BMI	DIOXIT
X	LDX	DCOMND
X	INX
X	TXA
X	LDX	#FROMDK	;ASSUME DATA ==> DISK
X	AND	#$06
X	BNE	ISREAD	;IF NOT X0,X7,X8 OR XF, OK
X	LDX	#TODK	;ELSE, DATA ==> DISK
XISREAD	STX	DSTATS	;RESTORE STATUS TO DCB
X	JSR	SIOV	;DO THE I/O OPERATIONS
X	DEY
X	BMI	IORTRY	;IF NOT OK, RETRY
X;
XDIOXIT	LDX	CURFCB	;ELSE, LOAD FCB OFFSET AND STATUS
X	INY
X	TYA
X	RTS
X;
X;	FIXED RAM DEFINITIONS IN BOOT SECTORS
X;
XDIUNIT	DS	1	;UNIT NO. OF CURRENT DIRECTORY
XCDIREC	DS	2	;SECTOR NO. OF CURRENT DIRECTORY
XHOLFN	DS	1
XSTATE	DB	$70	;DUP loaded, MEM.SAV inactive, Warmstart
X			;  bit 7 -- MEM.SAV in use
X			;  bit 6 -- DUP.SYS loaded
X			;  bit 5 -- AUTORUN.SYS already run
X			;  bit 4 -- Initial BUILD active
X			;
XSTKPSV	DS	1	;SAVED STACK POINTER
X	ORG	$07C0	;MUST MATCH DUP LOCATION
X;
XTRACKS	DB	35,40,80,77	;TRACKS IN EACH DISK FORMAT
X;
XSECSIZ	DB	0,0,0,0		;BUFFER SIZE TABLE
X	DB	0,0,0,0
X;
XDRVDEF	DB	$52,$52	;DRIVE CONFIGURATION TABLE:
X	DB	$D2,$D2	;BIT 7=1 => NO DRIVE
X	DB	$D2,$D2	;BIT 6=1 => ATARI 810 DRIVE
X	DB	$D2,$D2	;BIT 5-4 IS (0=35, 1=40,
X			;   2=80, 3=77 TRACKS(8")
X			;BIT 3=1 => DOUBLE DENSITY
X			;BIT 2-1 IS DRIVE STEP RATE
X			;BIT 0=1 => DOUBLE SIDED
X;
X;	DOS.SYS PROGRAM FOLLOWS
X;
XDKEPT	DW	DKOPEN-1
X	DW	DKCLOS-1
X	DW	DKREAD-1
X	DW	DKWRIT-1
X	DW	DKSTAT-1
X	DW	DKXIO-1
X;
X	ORG	$07E0
X;
X;	IDENTIFY DRIVE TYPES
X;
XINIT	LDA	#LOW[361]
X	STA	CDIREC
X	LDA	#HIGH[361]
X	STA	CDIREC+1
X;
X;  IDENTIFY DRIVE TYPES
X;
X	LDX	#8
XIDRVLP	STX	DUNIT
X	JSR	ZERDVS		;ASSUME THE DRIVE IS NOT PRESENT
X	LDA	DRVDEF-1,X
X	BMI	NXTDRV		;IF NOT DECLARED, WE ARE DONE
X;
X	JSR	JSTRD		;ELSE, READ ITS STATUS
X	BEQ	NXTDRV		;IF ABSENT, GO ON TO THE NEXT ONE
X	LDY	#9
XWOTCPY	LDA	WOTDCB,Y
X	STA	DDEVIC+2,Y
X	DEY
X	BPL	WOTCPY
X	LDA	DRVDEF-1,X
X	CMP	#$40
X	BCS	NXTDRV		;IF NOT CONFIGURABLE, CONTINUE
X	LDY	SECSIZ-1,X
X	JSR	SETDRV		;TELL IT ABOUT MY CONFIGURATION
X;
XNXTDRV	DEX			;STEP TO NEXT DRIVE NUMBER
X	BNE	IDRVLP		;IF MORE, LOOK AT THEM
X;
X;	ZERO INITIALIZED MEMORY
X;
X	LDY	#MAPBUF+7-CHGMAP
X	TXA		;NOTE X=0 HERE
XZERLP1	STA	CHGMAP-1,Y
X	DEY
X	BNE	ZERLP1
X	INC	MAP2MOD
X;
X;	DEFINE TOP OF FMS FOR USER PROGRAM
X;
X	LDA	DOSEND
X	STA	MEMTOP
X	LDY	DOSEND+1
X;
X;	ALLOCATE FILE SECTOR BUFFERS
X;
X	LDX	#15		;MAX OF 16 SECTOR BUFFERS
XDKBFLP	CPX	FILES		;EMPTY BUFFERS DONE?
X	BCC	ALCBUF
X	DEC	BUFFLG,X
X	BMI	DKBFSQ
XALCBUF	TYA
X	STA	SBTABU,X
X	INY
XDKBFSQ	DEX			;BUMP BUFFER COUNTER
X	BPL	DKBFLP		;IF NOT CONTINUE LOOPING
X	STY	MEMTOP+1	;DEFINE TOP OF MEMORY USED
X;
X;	SET UP HANDLER VECTOR
X;
XFNDHND	INX
X	INX
X	INX
X	LDA	HATABS-2,X	;END OF THE HANDLER TABLE?
X	BEQ	NOHAND		;THEN INSTALL IT HERE
X	CMP	#$44		;A 'D' ALREADY PRESENT?
X	BNE	FNDHND		;NO, CONTINUE LOOKING, ELSE OVERWRITE IT
X;
XNOHAND	LDA	#$44		;WRITE AT END OF TABLE OR CURRENT "D" ENTRY
X	STA	HATABS-2,X
X	LDA	#LOW[DKEPT]	;STASH MYDOS ENTRY VECTOR
X	STA	HATABS-1,X
X	LDA	#HIGH[DKEPT]
X	STA	HATABS,X	;BUILD HANDLER VECTOR
X	JMP	DUPINV		;DONE, INITIALIZE DUP [overwritten by MDUP]
X;
X;	DOS NON-ZERO PAGE RAM ALLOCATIONS
X;
XCHGMAP	DS	1
XCURMAP	DS	1
XMAP2	DS	1
XMAP2MOD	DS	1
XLSTSEC	DS	2
XLSTIOCB	DS	1
X;
X;  MYDOS FCB STRUCTURE (ALMOST THE SAME AS ATARI DOS 2.0)
X;
XFCBFNO	DS	1
XFCBOTC	DS	1	;OPEN TYPE CODE
XFCBFLG	DS	1
XMAXLEN	DS	1
XCURLEN	DS	1
XBUFNO	DS	1
XCURSEC	DS	2
XLNKSEC	DS	2
XSECCNT	DS	2
XDIRBAS	DS	2	;BASE ADDRESS OF CUR. SECTOR
XSAVSEC	DS	2
XFCBLEN	=	16
X	DS	7*FCBLEN	;SPACE FOR THE REMAINING 7 IOCBs
X;
XBUFFLG	DS	16	;IF 0, BUFFER NOT IN USE
XSBTABU	DS	16	;UPPER BYTE OF THE SECTOR BUFFER ADDRESS
XMAPBUF	DS	512	;SPACE ALLOCATED FOR VTOC
XDIRBUF	=	MAPBUF	;SPACE ALLOCATED TO READ DIRECTORIES
XFNAME	DS	12
XCURMP	DS	1
X;
XBASE	=	*
XHDTAB	DW	0,0,0,0	;8 LOGICAL HARD DRIVES OF
X	DW	0,0,0,0	;UP TO 65535 SECTORS EACH
X;
X;
X;NOTE: this table is referenced by DUP.SYS, and should not be moved!
X;
X; DOS CONFIGURATION CODE
X;
X; CONTROL BLOCK TO BE WRITTEN TO A DRIVE TO CONFIGURE IT
X;
XWOTDCB	DB	$4E,$40
X	DW	DIRBUF,1
X	DW	12,4
X;
X;  THE CONFIGURATION CODE, FORCES A DRIVE INTO THE APPROPRIATE CONFIGURATION
X;
XSETDRV	AND	#$3F		;EXTRACT CONF. BITS
X	STA	TMP1
X	STY	TMP2
X	JSR	SIOV		;READ CURRENT CONFIGURATION
X	BMI	JSTRD
X	LDA	TMP1
X	LDY	TMP2
X	LSR	A
X	PHA			;SAVE REMAINING BITS
X	AND	#3		;EXTRACT STEP RATE CODE
X	STA	DIRBUF+1
X	LDA	#0
X	STA	DIRBUF+2
X	ROL	A
X	STA	DIRBUF+4	;STORE DOUBLE SIDED FLAG
X	TYA			;GET DENSITY
X	LSR	A
X	STA	DIRBUF+6	;STORE UPPER BYTE OF SECTOR SIZE
X	ROR	A
X	STA	DIRBUF+7	;THEN LOWER BYTE
X	ROL	A
X	ASL	A
X	ASL	A
X	STA	DIRBUF+5
X	PLA
X	LSR	A
X	LSR	A
X	LSR	A		;POSITION TRACK COUNT FIELD
X	TAY
X	LDA	TRACKS,Y	;GET NUMBER OF TRACKS
X	STA	DIRBUF
X	AND	#$04		;SEE IF 77 TRACK 8 IN.
X	PHA
X	LSR	A
X	ORA	DIRBUF+5	;MERGE D/DENSITY WITH 8 IN. FLAG
X	STA	DIRBUF+5
X	PLA
X	ASL	A		;CONVERT TO 0 OR 8
X	ADC	#18		;SECTOR COUNT = 18 OR 26
X	STA	DIRBUF+3
X	LDY	DUNIT
X	LDA	HDTAB-1+8,Y
X	BEQ	TOSIOV
X	STA	DIRBUF+2	;SIZE = SECTORS/TK
X	LDA	HDTAB-1,Y
X	STA	DIRBUF+3	;LOW BYTE OF SIZE
X	LDA	#1
X	STA	DIRBUF		;ONE TRACK/DRIVE
XTOSIOV	INC	DCOMND		;CHANGE COMMAND TO WRITE
X	LDA	#$80
X	STA	DSTATS		;SET DIRECTION -> DISK
X	JSR	SIOV		;WRITE OPTION TABLE TO DRIVE
X;
XJSTRD	LDA	#RDSTAT
X	STA	DCOMND
X	JSR	DSKINV
X	LDX	DUNIT
X	TYA
X	BMI	ZERDVS
X	LDA	DVSTAT
X	ASL	A		;SECTOR SIZE=256?
X	ASL	A
X	ASL	A
X	LDA	#1
X	ADC	#0
XSETSIZ	STA	SECSIZ-1,X
X	RTS
X;
XZERDVS	LDA	#0
X	BEQ	SETSIZ		;ALWAYS BRANCHES!
X;
X; DOS RAMDISK CODE (moved here starting with version 4.5)
X;
X; RAM DISK I/O HANDLER (POS. IND. CODE)
X;
XMAPAGE
X	DB	$E3,$E7,$EB,$EF
X	DB	$83,$87,$8B,$8F
X	DB	$C3,$C7,$CB,$CF
X	DB	$A3,$A7,$AB,$AF
X;
X	DB	$93,$97,$9B,$9F
X	DB	$D3,$D7,$DB,$DF
X	DB	$B3,$B7,$BB,$BF
X	DB	$F3,$F7,$FB,$FF
X;
X	DB	$E3,$E7,$EB,$EF
X	DB	$83,$87,$8B,$8F
X	DB	$C3,$C7,$CB,$CF
X	DB	$A3,$A7,$AB,$AF
X;
X	DB	$93,$97,$9B,$9F
X	DB	$D3,$D7,$DB,$DF
X	DB	$B3,$B7,$BB,$BF
X	DB	$F3,$F7,$FB,$FF
X;
XVALSEC	PHA
X	TYA
X	ORA	#$80
X	LSR	A
X	STA	BUFR+1
X	SEI		;DISABLE INT-S
X	LDA	#0
X	STA	NMIEN	;DISABLE NMI-S
X	ROR	A
X	STA	BUFR
X	PLA
X	TAY
X	LDA	MAPREG
X	ORA	#$1C
X	STA	CHKSUM
X	ORA	#$7C
X	AND	MAPAGE,Y
X	STA	MAPREG	;SELECT RAMDISK DATA PAGE
X;
X	LDA	DBUFLO	;USER BUFFER ADDRESS GOES HERE
X	STA	BUFR+2
X	LDA	DBUFLO+1
X	STA	BUFR+3
X	LDY	#0
X	PLP
X	BCC	RREADL	;CY=0 IF READ
XRWRITL	LDA	(BUFR+2),Y
X	STA	(BUFR),Y
X	INY
X	BPL	RWRITL
X	BMI	RIOX
X;
XRDKIO	STY	DAUX1	;*** FOR FORMAT CODE ***
X	CPY	#$80
X	ROL	A
X	CMP	#4
XRDKLMT	=	*-1	;NUMBER OF 16K PAGES IN RAMDISK
X	BCC	VALSEC	;CALCULATE MEM. ADDR.
X	PLP
X	LDA	#139
X	BMI	RERROR
X;
XRREADL	LDA	(BUFR),Y
X	STA	(BUFR+2),Y
X	INY
X	BPL	RREADL
X;
XRIOX	LDA	CHKSUM	;FORCE REAL RAM PAGE
X	STA	MAPREG	;BEFORE EXITING
X	LDA	#$C0
X	STA	NMIEN	;RE-ENABLE NMI
X	CLI		;ENABLE INTERRUPTS
X	LDA	#1	;RETURN '1' IN Y-REG
XRERROR	STA	DSTATS	;AND IN STATUS BYTE
X	LDX	CURFCB	;RESTORE FCB ADDR
X	TAY
X	RTS		;THEN EXIT
X;
XSTEPBP	LDA	DBUFLO
X	EOR	#$80
X	STA	DBUFLO
X	BMI	TSTEOD
X	INC	DBUFHI
X;
XTSTEOD	LDY	DAUX1
X	RTS
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > mdos2.asm
X;
X;  DISK OPEN ROUTINE
X;
XDKOPEN	JSR	WBITMP		;Fix nasty bug! [Bob Puff]
X	JSR	SETUP		;SET UP BUF PTRS, ETC.
X	JSR	GETFNM		;GET DRIVE ID OR FILE NAME FROM BUFFER
X	LDA	ICAX1Z		;GET TYPE OF OPEN FROM IOCB
X	STA	FCBOTC,X
X	AND	#$02		;TEST DIRECTORY READ FLAG
X	BEQ	DKOPN1
X	JMP	LSTDIR		;IF SET, GO HANDLE DIRECTORY FORMATTING
X;
XDKOPN1	STA	SAVSEC,X
X	STA	SAVSEC+1,X	;CLEAR SAVSEC
X	JSR	SFDIR
X	PHP			;SAVE STATUS RETURNED
X	BCS	OPNEW
X	LDA	#$10		;MAKE SURE THIS IS NOT A DIRECTORY
X	JSR	GETFLAG
X	BNE	DIROPN		;IF A DIRECTORY, GO HANDLE IT SEPERATELY
XOPNEW	LDY	ICAX1Z
X	CPY	#8
X	BEQ	OPNOP		;IF OPEN FOR OUTPUT
X	CPY	#4
X	BEQ	OPNIN		;IF OPEN FOR INPUT
X	CPY	#12
X	BEQ	OPNUP		;IF OPEN FOR READ/WRITE (UPDATE)
X	CPY	#9
X	BEQ	OPNAP		;IF OPEN FOR OUTPUT/APPENDED
XDIROPN	JMP	ERRCMD		;IF NONE OF THE ABOVE, IT IS AN ERROR!
X;
XOPNAP	PLP		;OPEN APPEND
X	BCS	OPNCR0
X	JSR	TSTLOK
X	JSR	INITYP	;READ ALL THE SECTORS IN THE FILE
X	LDA	DIRBUF+1,Y
X	STA	SECCNT,X
X	LDA	DIRBUF+2,Y
X	STA	SECCNT+1,X
XAPPRD	JSR	RDNXTS
X	BCC	APPRD	;IF NOT EOF, READ ANOTHER
X	LDA	MAXLEN,X
X	JSR	LENSET	;SET LENGTHS FOR OUTPUT
X	LDA	SECCNT,X
X	BNE	SGLDEC
X	DEC	SECCNT+1,X
XSGLDEC	DEC	SECCNT,X ;ALLOW FOR SECTOR REWRITTEN
X	JMP	OPOUTX
X;
XOPNUP	PLP		;OPEN UPDATE (OUTPUT)
X	BCS	OPNER1
X	JSR	TSTLOK
XOPNOWR	JSR	INSTRT
X	JMP	DONE
X;
XOPNIN	PLP		;OPEN INPUT
X	BCC	OPNOWR
XOPNER1	LDA	#170	;FILE NOT FOUND
X	BMI	EROXIT
X;
XOPNOP	PLP		;OPEN (NORMAL) OUTPUT
X	BCS	OPNCR
X	JSR	REMOVE
X	JMP	GET1ST
X;
XOPNCR0	DEC	FCBOTC,X
XOPNCR	LDA	HOLFN
X	STA	CURFNO
X	BMI	OPDIRF
XGET1ST	JSR	ALLOC
X;
X	LDA	ICAX2Z	;IF OUTPUT, TYPE OF FILE
X	AND	#$24	;SAVE LOCKED & FORMAT BITS (with 4.5, DOS I no-more)
X	EOR	#$43	;MERGE IN DEFAULT CODE (DOS II, UNLOCKED)
X	LDY	MAPBUF	;WHICH TYPE DISK?
X	CPY	#3	;IF >2 THEN MYDOS
X	BCC	LLINKS
X	ORA	#$04
X;
XLLINKS	PHA
X	JSR	RDCFNO	;SELECT PROPER SECTOR IN DIRECTORY
X	SEC
X	JSR	ENTNAME		;ENTER NAME INTO IT
X	LDA	LNKSEC+1,X
X	STA	DIRBUF+4,Y
X	LDA	LNKSEC,X
X	STA	DIRBUF+3,Y
X	PLA
X	JSR	SAVFLAG
X	JSR	INITYP
X	JSR	TONXT
XOPOUTX	LDA	#$80
X	STA	FCBFLG,X
X	JSR	TSTDOS		;FILE NAME = DOS.SYS?
X	BNE	JDONE
X	LDY	CURSEC,X
X	LDA	CURSEC+1,X
X	JSR	SETDOS		;IF SO, UPDATE BOOT SECTORS
X;
X	LDA	DOSAD
X	STA	FMSZPG
X	LDA	DOSAD+1
X	STA	FMSZPG+1
X	BNE	OWTDOS		;NOTE: DOS CANNOT START ON ZERO-PAGE
X;
XOPDIRF	LDA	#169
XEROXIT	JMP	AEXIT
X;
XLWTDOS	JSR	WRNXTS		;AUTOMATICALLY WRITE DOS.SYS OUT
XOWTDOS	LDY	#0		;IF WE OPEN "DOS.SYS" FOR A WRITE
XCDOSBF	LDA	(FMSZPG),Y	;(THIS IS BECAUSE DOS 2.0 WOULD BLOW
X	STA	(FMSBPT),Y	; ITSELF AWAY IF A REAL WRITE FROM THE
X	INY			; DOS AREA WAS ATTEMPTED, AND WE HAVE
X	CPY	DLINK		; TO REMAIN COMPATIBLE).
X	BCC	CDOSBF
X	TYA
X	STA	CURLEN,X
X	JSR	MVBUFR
X	CPY	DOSEND
X	SBC	DOSEND+1
X	BCC	LWTDOS
XJDONE	JMP	DONE
X;
X; READ DATA FROM A FILE
X;
XDKREAD	JSR	SETUP		;SETUP BUFFER POINTERS, ETC.
X	LDA	FCBOTC,X
X	AND	#$02		;TEST THE DIRECTORY I/O FLAG
X	BEQ	RDFILE
X	JMP	DIRRD		;JUMP IF THE SPECIAL CASE OF A DIRECTORY READ
X;
XRDFILE	LDA	CURLEN,X
X	CMP	MAXLEN,X
X	BCC	RDSGBT		;IF NOT AT SECTOR BOUND., READ A BYTE AT A TIME
X	BCS	RDASNT		;ELSE, CHECK FOR READ MODE AND BUFFER SIZE
X;
XRDASLP	LDA	ICCOMZ
X	AND	#$02
X	BEQ	RDSGBT		;IF NOT BINARY I/O READ A BYTE AT A TIME
X	LDY	DLINK
X	DEY
XRDSCLP	LDA	(FMSBPT),Y	;SIMULATED BURST I/O (with unrolled loop)
X	STA	(ICBALZ),Y
X	DEY
X	LDA	(FMSBPT),Y
X	STA	(ICBALZ),Y
X	DEY
X	LDA	(FMSBPT),Y
X	STA	(ICBALZ),Y
X	DEY
X	LDA	(FMSBPT),Y
X	STA	(ICBALZ),Y
X	DEY
X	BNE	RDSCLP
X	LDA	(FMSBPT),Y	;NUM OF DATA BYTES IS MULTIPLE OF 4 + 1
X	STA	(ICBALZ),Y
X	JSR	BUFADJ		;ADJUST BUFFER PTR BY 125 OR 253
XRDASNT	JSR	RDNXTS		;READ IN THE NEXT SECTOR
X	BCS	RETEOF		;REPORT EOF/ERROR IF NECESSARY
X	LDA	ICBLLZ+1
X	BNE	RDASLP		;AND REPEAT THE LOOP IF > 256 BYTES LEFT
X;
XRDSGBT	TAY
X	LDA	(FMSBPT),Y	;FETCH A DATA BYTE FROM THE BUFFER
X	STA	DATBYT		;AND RETURN IT TO CIO
X	INY
X	TYA
X	STA	CURLEN,X	;BUMP CURRENT BUFFER LENGTH
X	EOR	MAXLEN,X
X	ORA	LNKSEC,X
X	ORA	LNKSEC+1,X	;TEST FOR THE LAST BYTE OF THE FILE
X	BNE	JDONE
X	LDA	#3		;IF IT IS, REPORT THIS IS THE LAST BYTE
X	DB	$2C
X;
XRETEOF	LDA	#136		;RETURN END OF FILE STATUS
X	JMP	AEXIT
X;
X; WRITE DATA TO A FILE
X;
XDKWRIT	STA	DATBYT		;SAVE THE DATA BYTE (IF IT IS IN ACC)
X	LDY	ICDNO,X
X	STY	ICDNOZ		;INSURE ICDNOZ IS SET UP (BASIC DOES NOT!)
X	JSR	SETUPW
X	LDA	FCBOTC,X
X	AND	#$08
X	BEQ	CANTWR		;ERROR OUT IF ILLEGAL TO WRITE (BASIC AGAIN!)
X	LDA	CURLEN,X
X	TAY
X	CMP	MAXLEN,X
X	BCC	SKBURST		;SKIP AROUND IF NOT THE END OF THE SECTOR
X
XWRASLP	JSR	WRNXTS		;WRITE A SECTOR OF DATA
X	BCS	RETEOF		;ERROR OUT IF NO MORE DISK SPACE
X	LDY	STKPSV
X	LDA	$0102,Y
X	CMP	#$C0		;IF FROM BASIC (RETURN ADDRESS < $C000)
X	BCC	BASWRT		;PASS SINGLE BYTES
X	LDA	FCBOTC,X	;Fix bug in open/update vs. burst I/O
X	AND	#$04		;[Bob Puff, again!]
X	BNE	BASWRT
X	LDA	ICCOMZ		;IF RECORD I/O, PASS SINGLE BYTES ALSO
X	AND	#$02
X	BEQ	BASWRT
X	LDY	ICBLLZ+1	;AND IF THE BUFFER HOLDS FEWER THAN 256 BYTES
X	BEQ	BASWRT		;PASS SINGLE BYTES AS WELL
X	LDY	MAXLEN,X
X	DEY
XWRSCLP	LDA	(ICBALZ),Y	;ELSE, DO SIMULATED BURST I/O
X	STA	(FMSBPT),Y
X	DEY
X	LDA	(ICBALZ),Y
X	STA	(FMSBPT),Y	;BUT ONLY UNROLL 2 ENTRIES FOR WRITES!
X	DEY			;(WE GOT VERY LITTLE RAM TO WASTE!)
X	BNE	WRSCLP
X	LDA	(ICBALZ),Y
X	STA	(FMSBPT),Y
X	JSR	BUFADJ
X	LDA	(ICBALZ),Y
X	STA	DATBYT
X	JMP	WRASLP
X;
XBASWRT	LDY	#0
XSKBURST	LDA	DATBYT
X	INC	CURLEN,X
X	STA	(FMSBPT),Y
X	LDA	#$40
X	ORA	FCBFLG,X	;FOR UPDATE MODE, SAY THE SECTOR WAS MODIFIED
X	STA	FCBFLG,X
X	BNE	TODONE		;BRANCH ALWAYS!
X;
XCANTWR	JMP	ERRCMD
X;
XBUFADJ	CLC
X	LDA	MAXLEN,X
X	STA	CURLEN,X
X	ADC	ICBALZ
X	STA	ICBALZ
X	BCC	RBAOK
X	INC	ICBALZ+1
XRBAOK	SEC
X	LDA	ICBLLZ
X	SBC	MAXLEN,X
X	STA	ICBLLZ
X	BCS	RBLOK
X	DEC	ICBLLZ+1
XRBLOK	RTS
X;
X; RETURN FILE STATUS
X;
XDKSTAT	JSR	SETUP		;SET UP RETURN ADDRESS, ETC.
X	JSR	LFFILE		;FIND IF FILE IS THERE, ETC.
X	JSR	TSTLOK		;IS IT LOCKED?
XTODONE	JMP	DONE		;RETURN TO CALLER
X;
X; CLOSE FILE (WRITING ANY PENDING SECTOR)
X;
XDKCLOS	JSR	SETUP
X	LDA	FCBOTC,X
X	AND	#$08		;OUTPUT ALLOWED?
X	BEQ	CLROTC		;IF NOT, JUST EXIT
X	ROL	FCBFLG,X
X	BCC	CKFLSC
X	JSR	REWRIT		;REWRITE THE LAST SECTOR
X	JSR	RRDIR
X	LDA	SECCNT,X
X	LDY	DIRDSP
X	STA	DIRBUF+1,Y
X	LDA	SECCNT+1,X
X	STA	DIRBUF+2,Y
X	LDA	DIRBUF,Y
X	AND	#$FE		;NOT OPEN FOR OUTPUT ANY MORE
X	JSR	SAVFLAG
X	LDA	SAVSEC,X
X	ORA	SAVSEC+1,X
X	BEQ	CLROTC
X	CPX	LSTIOCB
X	BEQ	FAPPD
X	JSR	INITYP	;READ ALL THE SECTORS AGAIN
XAPPLP	JSR	RDNXTS
X	BCC	APPLP	;NOT EOF YET
X	BCS	TIELNK
XFAPPD	LDA	LSTSEC
X	STA	CURSEC,X
X	LDA	LSTSEC+1
X	STA	CURSEC+1,X
XTIELNK	CLC
X	JSR	RWDISK
X	LDA	DLINK
X	STA	CURLEN,X
X	LDA	SAVSEC,X
X	LDY	SAVSEC+1,X
X	JSR	SAVLNK
XCLROTE	BPL	CLROTC
X	LDA	#163		;FAILURE IS A SYSTEM ERROR
X	JMP	AEXIT
XCLROTC	LDA	#$FF
X	STA	ICHID,X
X	LDA	#0
X	STA	FCBOTC,X
X	JMP	FREDON
X;
XCKFLSC	ROL	FCBFLG,X
X	BCC	CLROTC
X	JSR	WRDISK
X	JMP	CLROTE
X;
XINITYP	LDA	#$06
X	JSR	GETFLAG
X	LSR	A
X	ROR	A
X	ROR	A
X	ROR	A
X	ORA	FCBOTC,X
X	STA	FCBOTC,X
X	LDA	DIRBUF+3,Y
X	STA	LNKSEC,X
X	LDA	DIRBUF+4,Y
X	STA	LNKSEC+1,X
X	LDA	CURFNO
X	STA	FCBFNO,X
X	LDA	#0
X	STA	FCBFLG,X
X	STA	CURLEN,X
X	STA	SECCNT,X
X	STA	SECCNT+1,X
X	RTS
X;
X; DOS XIO ROUTINES
X;
X;  Sorry about the lack of comments in some parts of this file,
X;    I just never had to figure this code out after I wrote it (:-)!
X;
XNODIRF	LDA	#176		;FILE NOT A DIRECTORY
X	JMP	AEXIT
X;
XPIKDIR	LDY	#0
X	LDA	#':'
XFDVND	INY
X	CMP	(ICBALZ),Y
X	BNE	FDVND
X	INY
X	LDA	(ICBALZ),Y
X	CMP	#'@'
X	BCC	SETRDIR
X	CMP	#'Z'+1
X	BCC	GFNDIR
X	CMP	#'_'
X	BCC	SETRDIR
X	CMP	#'z'+1
X	BCS	SETRDIR
XGFNDIR	JSR	LFFILE		;FIND NEW DEFAULT DIRECTORY
X	JSR	INITYP
X	JSR	TONXDR
X	BEQ	NODIRF		;IF NOT A DIRECTORY
X	LDA	DIRBAS+1,X
X	TAY
X	LDA	DIRBAS,X
XSAVDEF	STY	CDIREC+1	;UPDATE ADDRESS OF DIR.
X	STA	CDIREC
X	LDA	ICDNOZ
X	STA	DEFAULT		;UPDATE UNIT NUMBER
X	BPL	TOFDN
X;
XSETRDIR	LDA	#LOW[361]
X	LDY	#HIGH[361]
X	BPL	SAVDEF
X;
XRENAME	JSR	LFFILE		;GET OLD NAME, DRIVE, VALIDATE
X	LDY	#11
XSTEMPL	LDA	FNAME-1,Y
X	STA	MAPBUF+256,Y
X	DEY
X	BNE	STEMPL
XRNLOOP	JSR	TSTLOK		;CANNOT RENAME IF LOCKED
X	JSR	TDDOS		;TEST FOR DOS GONE!
X	LDY	TMP2
X	JSR	GETNAM		;GET NEW NAME
X	CLC
X	JSR	ENTNAME		;OVERWRITE NAME IN DIR.
X	JSR	WDIRBK		;REWRITE DIRECTORY TO DISK
X;
X	JSR	TSTDOS		;NEW NAME DOS.SYS?
X	BNE	REPLDS		;NO, LOOK AT NEXT
X
X	LDY	DIRDSP
X	LDA	DIRBUF+4,Y	;SAVE FILE LOCATION ON THE STACK
X	PHA
X	LDA	DIRBUF+3,Y
X	PHA
X;
X;;;	JSR	SYSSET		;Use the MAP buffer [IS THIS NECESSARY???]
X;
X	CLC			; == READ
X	LDX	#1		; == SECTOR SIZE CODE (1=128, 2=256)
X	LDA	#0
X	LDY	#1		; == SECTOR #1
X	JSR	DKIO		;Read it
X;
X	LDA	SECDAT
X	STA	MAPBUF+SECDAT-$0700
X	PLA
X	STA	MAPBUF+DOSLOC-$0700
X	PLA
X	STA	MAPBUF+DOSLOC+1-$0700
X;
X;;;	LDA	#$00		;[AND IS THIS REALLY NECESSARY???]
X;;;	STA	MAPBUF+STATE-$0700
X;
X	SEC			; == WRITE
X	LDX	#1		; == SECTOR SIZE CODE (1=128, 2=256)
X	JSR	DKIO2		;Write it (same sector as I read before)
X;
X	LDA	#$FF		;Then make sure we reread the directory buffer
X	STA	DIUNIT
X;
XREPLDS	LDY	#11
XRTEMPL	LDA	MAPBUF+256,Y
X	STA	FNAME-1,Y
X	DEY
X	BNE	RTEMPL
X	JSR	CSFDIR		;TO RENAME
X	BCC	RNLOOP
XTOFDN	JMP	FREDON
X;
XDELETE	JSR	LFFILE
XDELLP	JSR	REMOVE		;FLUSH THE SECTORS
X	JSR	RRDIR		;REREAD DIRECTORY BLOCK
X	JSR	TDDOS		;DOS.SYS DELETED?
X	LDA	#$80
X	JSR	SAVFLAG		;REWRITE DIRECTORY BLOCK
X	JSR	CSFDIR
X	BCC	DELLP		;IF ANOTHER FOUND,
X	BCS	TOFDN		;ELSE, WRAP UP AND EXIT
X;
XREMOVE	JSR	TSTLOK		;ONCE HAD 'OPVTOC' CALL FIRST
X	JSR	INITYP
X	JSR	TONXDR
X	BNE	DELDIR
X	JSR	CHASE
X;
XFREELP	JSR	FREE
X	JSR	RDNXTS
X	BCC	FREELP
X	RTS
X;
XINVDEL	LDA	#175		;DIRECTORY NOT DELETABLE
X	JMP	AEXIT
X;
XLOCK	LDA	#$20
X	DB	$2C		;BIT ABS (SKIP 2 BYTES)
X;
XUNLOCK	LDA	#$00
X	STA	DATBYT
X	JSR	LFFILE		;FIND FILE AND VERIFY WRITABLE
XLKULKL	LDA	#$DF		;STRIP OFF OLD BIT 5
X	JSR	GETFLAG
X	ORA	DATBYT		;AND REPLACE WITH NEW
X	JSR	SAVFLAG
X	JSR	CSFDIR
X	BCC	LKULKL
X	BCS	TOFDN
X;
XDELDIR	LDY	#-11
X	LDA	#'?'
XDELSET	STA	FNAME+11-256,Y
X	INY
X	BNE	DELSET
X	JSR	SFDIR
X	BCC	INVDEL
X;
X	LDA	#8
X	STA	DATBYT
X	JSR	TONXT
XDELDRL	JSR	FREE
X	JSR	INCCSEC
X	DEC	DATBYT
X	BNE	DELDRL
X	JMP	GETFNM
X;
XPOINT	LDY	FCBFLG,X
X	BMI	ERRCMD
X;
X	LDA	ICSPR+1,X
X	CMP	CURSEC+1,X
X	BNE	PNTREAD
X	LDA	ICSPR,X
X	CMP	CURSEC,X
X	BEQ	PNTSME
XPNTREAD	TYA
X	BEQ	PNTCLN		;IF SECTOR UNMODIFIED
X	JSR	WRDISK
X	LDA	#0
X	STA	FCBFLG,X
XPNTCLN	LDA	ICSPR+1,X
X	STA	LNKSEC+1,X
X	LDA	ICSPR,X
X	STA	LNKSEC,X
X	JSR	CHASE		;READ SECTOR POINTED TO
X	BCS	BADPNT
X;
XPNTSME	LDA	ICSPR+2,X
X	CMP	MAXLEN,X
X	BCS	PNTEQL
XPNTLST	STA	CURLEN,X
X	JMP	DONE
X;
XPNTEQL	BEQ	PNTLST		;IF POINTING AT LAST BYTE
XBADPNT	LDA	#166		;INVALID POINT LOCATION
X	DB	$AE
X;
XERRCMD	LDA	#168		;INVALID IOCB PARAMETER
X	JMP	AEXIT
X;
XNOTE	LDA	CURSEC,X
X	STA	ICSPR,X
X	LDA	CURSEC+1,X
X	STA	ICSPR+1,X
X	LDA	CURLEN,X
X	STA	ICSPR+2,X
X	JMP	DONE
X;
XDKXIO	JSR	SETUP
X	LDA	ICCOMZ		;GET COMMAND BYTE
X	CMP	#254
X	BEQ	FORMAT
X	CMP	#43		;ADD "MKDIR" CODE FOR SpartaDOS(?) [Bob Puff]
X	BCS	ERRCMD		;IF INVALID COMMAND
X	SBC	#32-1
X	BCC	ERRCMD
X	TAY
X	LDA	VECTBH,Y
X	PHA
X	LDA	VECTBL,Y
X	PHA
X	RTS			;VECTOR TO PROPER ROUTINE
X;
XVECTBH	DB	HIGH[RENAME-1],HIGH[DELETE-1]
X	DB	HIGH[MKDIR-1],HIGH[LOCK-1]
X	DB	HIGH[UNLOCK-1],HIGH[POINT-1]
X	DB	HIGH[NOTE-1],HIGH[DKLOAD-1]
X	DB	HIGH[ERRCMD-1],HIGH[PIKDIR-1]
X	DB	HIGH[MKDIR-1]	;extra vector to MKDIR [Bob Puff]
X;
XVECTBL	DB	LOW[RENAME-1],LOW[DELETE-1]
X	DB	LOW[MKDIR-1],LOW[LOCK-1]
X	DB	LOW[UNLOCK-1],LOW[POINT-1]
X	DB	LOW[NOTE-1],LOW[DKLOAD-1]
X	DB	LOW[ERRCMD-1],LOW[PIKDIR-1]
X	DB	LOW[MKDIR-1]
X;
X; DOS FORMAT ROUTINES
X;
XFORMAT	JSR	WBITMP		;WRITE OUT ANY PENDING VTOC SECTORS
X;
X	ldy	#9		;Force format to match current density
XWOTCP2	lda	WOTDCB,y	;set up DCB for specified density [Bob Puff]
X	sta	DDEVIC+2,y
X	dey
X	bpl	WOTCP2
X	ldx	ICDNOZ
X	cpx	RAMDKU
X	beq	WOTRAM		;don't do it for RAMdisks
X;
X	ldy	SECSIZ-1,x 
X	lda	DRVDEF-1,x 
X	jsr	SETDRV		;set density
XWOTRAM  ldx	CURFCB		;restore X reg
X;
X	LDY	#0
X	TYA			;THEN INITIALIZE NEW BIT MAP (VTOC)
XCLRMAP	STA	MAPBUF,Y
X	STA	MAPBUF+256,Y
X	INY
X	BNE	CLRMAP
X;
X	LDA	#2
X	STA	MAPBUF		;start out as a DOS 2.0 disk
X	LDA	#$FF
X	STA	(FMSBPT),Y
X	INY
X	STA	(FMSBPT),Y	;PRESUME NO BAD SECTORS IF BUFFER IS UNMODIFIED
X	LDY	ICDNOZ
X	CPY	RAMDKU
X	BEQ	RAMFMT		;IF RAMDISK, SKIP EVERYTHING
X	LDA	FMSBPT+1
X	LDY	FMSBPT
X	JSR	BUFSET		;SET UP BUFFER POINTER FOR SIO CALL
X	LDX	#1
X	STX	TMP1		;ALLOW ONE TRY ONLY
X	LDA	#$22		;PRESUME 1050 D/D FORMAT NEEDED
X	LDY	ICAX2Z		;GET AUX2 BYTE
X	BMI	FMTOK		;MINUS --> NO FORMAT REQUIRED
X	BNE	NMLFMT		;AUX2 NONZERO, NORMAL FORMAT WITH SIZE DEFINED
X	LDY	ICAX1Z		;(AUX2,AUX1) = 1?
X	DEY
X	BEQ	FT1050		;YES, FORMAT WITH A $22 COMMAND
X;
XNMLFMT	ldx	DUNIT
X	lda	SECSIZ-1,X	;PUT SECTOR SIZE CODE (1 OR 2) INTO X
X	tax
X	lda	#FMTCMD		;AUX IS 0, must not be 1050 d/d
XFT1050	STA	DAUX1		;MAKE SURE WE SECTOR > 3
X	LDY	DSKTIM		;DISK TIMEOUT VALUE (RETURNED IN STATUS)
X	JSR	DKFME		;ENTER DKIO AT FORMAT ENTRY
X	BPL	FMTOK		;Accepting 144 errors here removed [Bob Puff]
X	JMP	AEXIT		;RETURN ERROR CODE IF ANY OCCURRED
X;
XRAMFMT	STA	CURSEC,X	;STUFF PROPER NUMBER OF SECTORS INTO CURSEC
X	CLC			;(256-BYTE PAGES * 2 SINCE SECTOR SIZE IS 128)
X	ADC	RDKLMT
X	LSR	A
X	ROR	CURSEC,X
X	BNE	NOTDEF		;FAIL IF NOT 256 SECTORS OR MORE (need 370)
X;
X;	SUCCESSFUL FORMAT, CREATE VTOC AND EMPTY DIRECTORY
X;
XFMTOK				;Bob Puff disabled the marginal format code
X;	ldy	#0		;check for a bad format
X;	lda	(FMSBPT),y 
X;	and	(FMSBPT),y	;first two bytes $FF?
X;	cmp	#$FF
X;	beq	FMTOK2		;yep, continue
X;	lda	#173		;otherwise format error
X;	bne	FMEXIT
X;
XFMTOK2
X	JSR	INVUNIT		;Can we do this (asks Bob Puff)
X	JSR	DELDOS
X	LDA	ICAX1Z
X	STA	CURSEC,X
X	LDA	ICAX2Z
X	AND	#$7F		;DISK MUST HAVE 256 SECTORS
X	BNE	NOTDEF		;IF SIZE SPECIFIED, USE IT
X	LDY	ICDNOZ
X	LDA	HDTAB-1,Y	;IF NOT AND THIS IS A HARD DISK
X	STA	CURSEC,X	;USE THE SYSTEM DEFINED SIZE
X	LDA	HDTAB+8-1,Y
X	BNE	NOTDEF
X	BIT	DVSTAT		;1050 DRIVE?
X	BPL	FIGSIZ		;NO, FIGURE SIZE THEN
X	LDA	#LOW[1040]	;YES, FORCE TO 1040 SECTORS
X	STA	CURSEC,X
X	LDA	#HIGH[1040]
X	BNE	NOTDEF
X;
XFIGSIZ	LDA	DRVDEF-1,Y
X	AND	#$31		;EXTRACT TRACK COUNT FLAGS
X	LSR	A
X	PHP
X	LSR	A
X	LSR	A
X	TAY
X	LDA	NOSECS,Y	;AND USE DRIVE DEFAULT SECTOR COUNT
X	STA	CURSEC,X
X	LDA	NOSECS+1,Y
X	PLP
X	BCC	NOTDEF		;IF NOT DOUBLE SIDED, THIS IS IT
X	ASL	CURSEC,X
X	ROL	A		;ELSE, DOUBLE IT
X;
XNOTDEF	STA	CURSEC+1,X
X	CMP	#4		;NEED 16 BIT LINKS?
X	BCC	SHORTS		;NO, SHORT FORMAT OK
X	INC	MAPBUF		;YES, FORCE LONG FORMAT (DOS3)
XSHORTS	JSR	FNDBIT		;FIND LAST BIT MAP SECTOR
X	LDA	TMP2
X	BNE	GT246		;IF PAST 256TH MAP BYTE
X	BIT	DLINK		;SINGLE DENSITY?
X	BMI	FDBDEN
X	CPY	#0
X	BPL	FDBDEN
XGT246	STA	MAP2
X	CLC
X	ADC	#3
X	STA	MAPBUF
XFDBDEN	LDA	#HIGH[-9]
X	STA	MAPBUF+4
X	LDA	#LOW[-9]
X	STA	MAPBUF+3	;START WITH 9 FREE SECTORS UN-FREE!
XFLOOP	JSR	FMTFRE
X	JSR	DECCSEC
X	CMP	#4		;BOOT SECTORS YET?
X	BNE	FLOOP		;IF NOT, CONTINUE DEALLOCATING
X	LDA	CURSEC+1,X
X	BNE	FLOOP
X;
X;	ALLOCATE BAD SECTORS
X;	[Bob Puff replaced this with code to set FMSBPT to 1, since he
X;	 disallows bad sectors]
X;
X	LDY	#0
XCLRBDLP	LDA	(FMSBPT),Y
X	STA	CURSEC,X
X	INY
X	LDA	(FMSBPT),Y
X	STA	CURSEC+1,X
X	INY
X	AND	CURSEC,X
X	CMP	#$FF
X	CLC
X	BEQ	MAPDONE
X	STY	TMP1
X	JSR	DECCNT
X	JSR	FNDLBIT
X	EOR	#$FF
X	BCC	CLRBD1
X	AND	MAPBUF+256,Y
X	STA	MAPBUF+256,Y
X	BCS	CLRBD2
XCLRBD1	AND	MAPBUF,Y
X	STA	MAPBUF,Y
XCLRBD2	LDY	TMP1
X	BNE	CLRBDLP
X	SEC
X	LDY	#173*2-256	;NO $FFFF => BAD FORMAT
XMAPDONE	TYA
X	ROR	A
X	STA	FMSBPT		;POSITIVE VALUE = NUMBER OF BAD SECTORS
X;
X;	[End of code that can be optionally deleted]
X;
X	LDA	#$00
X	STA	MAPBUF+55
X	LDA	#$7F
X	STA	MAPBUF+56
X	LDY	#44		;START ALLOC. OF VTOC HERE
X	LDA	MAPBUF
X	SEC
X	SBC	#2		;GET NUMBER OF SECTORS
X	BIT	DLINK		;(SINGLE DENSITY?)
X	BMI	MPNSD		;IF NOT, M-3
X	ASL	A		;IF SO, M*2-5
XMPNSD	TAX
X	DEX			;MOVE COUNT TO X
X;
XALCMPL	LDA	#$FF
XALCMAP	DEX
X	BMI	SMBSIZ
X	PHA
X	JSR	DECCNT
X	PLA
X	ASL	A
X	BNE	ALCMAP
X	STA	MAPBUF+10,Y
X	DEY
X	BPL	ALCMPL		;BRANCH ALWAYS!
X;
XSMBSIZ	STA	MAPBUF+10,Y
X	LDA	MAPBUF+3	;MARK EMPTY SIZE, TOO
X	STA	MAPBUF+1
X	LDA	MAPBUF+4
X	STA	MAPBUF+2
X	JSR	FMTMAP		;WRITE MAP TO DISK
X;
X;  CREATE AN EMPTY DIRECTORY
X;
X	LDA	#LOW[361]
X	LDY	#HIGH[361]
XCLRDIR	JSR	SETDIR		;RESET THE DIRECTORY BASE SECTOR
X	TYA
XCLRDLP	STA	DIRBUF,Y	;ZERO THE DIRECTORY BUFFER
X	INY
X	BNE	CLRDLP
X;
X	LDA	#7
X	STA	DIRSEC
XCLRDL2	JSR	WDIRBK		;THEN WRITE ALL 8 SECTORS OUT
X	DEC	DIRSEC
X	BPL	CLRDL2
X	LDY	BUFNO,X
X	LDA	#0
X	STA	BUFNO,X
X	STA	BUFFLG-1,Y	;FORMAT DONE, FREE THE INTERNAL BUFFER
X	LDA	FMSBPT
X	JMP	AEXIT
X;
XNOSECS	DW	35*18,40*18,80*18,77*26
X;
XSETDIR	STA	DIRBAS,X
X	TYA
X	STA	DIRBAS+1,X
X	LDY	#0
X	RTS
X;
X; DOS BINARY LOAD CODE (LOAD AND OPTIONALLY EXECUTE A PROGRAM)
X;
XDKLOAD	LDA	ICAX1Z
X	STA	ICPTLZ		;SAVE PROGRAM NAME BUFFER POINTER
X	CMP	#$08
X	BCS	TOERRC		;IF WRITE, REPORT ERROR
X;
X	LDA	#LOW[TORTS]
X	STA	RUNADR
X	LDA	#HIGH[TORTS]	;ASSUME RUNN ADDRESS IS ABSENT
X	STA	RUNADR+1
X	LDA	#4
X	STA	ICAX1Z
X	LDA	ICHID,X		;IOCB OPEN?
X	BPL	CCFILE
X	JSR	DKOPEN		;IF NOT, OPEN IT
X	BMI	DKLERV
X	JSR	WDREAD		;READ ONE WORD OF THE HEADER
X	BEQ	CCFILE
X	LDY	#180		;NO $FFFF, HEADER ERROR CODE
X	BMI	DKLERV
X;
XTOERRC	LDY	#168		;INVALID IOCB
X	RTS
X;
XGETTXT	LDA	#LOW[TORTS]
X	STA	INIADR
X	LDA	#HIGH[TORTS]	;FOR EACH SEGMENT, RECLEAR THE INIT VECTOR
X	STA	INIADR+1
XTXTLP	JSR	DKREAD
XDKLERV	BMI	DKLERR
X	LDY	#0
X	STA	(ICBALZ),Y
X	INC	ICBALZ
X	BNE	DECLEN
X	INC	ICBAHZ
XDECLEN	LDA	ICBLLZ
X	BNE	DECLOW
X	DEC	ICBLHZ
XDECLOW	DEC	ICBLLZ
X	BNE	TXTLP
X	LDA	ICBLHZ
X	BNE	TXTLP
X	LDA	ICBAHZ
X	CMP	#HIGH[INIADR]
X	BNE	CCFILE
X;
X	LDA	ICPTLZ		;IF NO INITS,
X	LSR	A
X	BCS	CCFILE		;SKIP TO NEXT PAGE
X	TXA			;ELSE SAVE IOCB
X	PHA
X	LDY	#256-12
XCPSICB	LDA	ICHIDZ-256+12,Y
X	STA	ICHID,X		;SAVE THE 12-BYTE IOCB ENTRY
X	INX
X	INY
X	BNE	CPSICB
X	PLA
X	TAX
X	PHA
X	JSR	DOINIT		;AND CALL INIT FUNCTION
X	PLA
X	TAX
X	PHA
X	LDY	#256-12
XCPRICB	LDA	ICHID,X		;THEN RESTORE THE 12-BYTE IOCB
X	STA	ICHIDZ-256+12,Y
X	INX
X	INY
X	BNE	CPRICB
X	PLA
X	TAX
X;
XCCFILE	JSR	WDREAD		;READ THE SEGMENT START ADDRESS
X	BEQ	CCFILE
X	STA	ICBALZ
X	STY	ICBAHZ
X	JSR	WDREAD		;READ THE SEGMENT END ADDRESS
X	SEC
X	ADC	#0
X	BCC	CCSUBT
X	INY
XCCSUBT	SEC
X	SBC	ICBALZ		;CALCULATE THE LENGTH TO LOAD INTO RAM
X	STA	ICBLLZ
X	TYA
X	SBC	ICBAHZ
X	STA	ICBLHZ
X	BCS	GETTXT		;BRANCH IF VALID LENGTH (GET DATA BYTES)
X	LDY	#181		;ELSE, MEMORY WRAP ERROR
X	BMI	DKLERR
X;
XWDXIT	PLA
X	PLA
XDKLERR	TYA
X	PHA
X	JSR	DKCLOS		;CLOSE THE PROGRAM FILE
X	PLA
X	TAY			;AND RETURN ANY ERROR CODE
X	RTS
X;
X;  READ A WORD FROM THE PROGRAM FILE AND COMPARE IT WITH $FFFF
X;
XWDREAD	LDA	#0
X	STA	ICBLLZ
X	STA	ICBLHZ		;SET LENGTH TO ZERO
X	JSR	DKREAD		;READ A BYTE
X	BMI	WDEOF
X	PHA
X	JSR	DKREAD		;READ THE SECOND BYTE
X	BMI	WDEOF1
X	TAY
X	PLA
X	CPY	#$FF		;UPPER BYTE $FF?
X	BNE	TORTS		;NO, THEN WORD IS NOT $FFFF
X	CMP	#$FF		;YES, IS LOWER BYTE $FF?
XTORTS	RTS			;IF BOTH $FF, RETURN ZERO FLAG
X;
XWDEOF1	PLA
XWDEOF	CPY	#136		;IS THIS END OF FILE?
X	BNE	WDXIT		;IF NOT, RETURN ERROR CODE
X	PLA
X	PLA			;ELSE, GET RID OF RETURN ADDR
X	LDA	ICPTLZ
X	LSR	A
X	LSR	A
X	PHP
X	JSR	DKCLOS		;CLOSE FILE AND SET Y=1
X	PLP
X	BCS	TORTS		;EXIT IF NO-RUN SPECIFIED
X	JMP	(RUNADR)	;THEN GO TO RUN ADDRESS
X;
X;  INVOKE INIT FOR EVERY BLOCK OF INPUT CODE (USUALLY JUST AN RTS)
X;
XDOINIT	JMP	(INIADR)	;CALL INDIRECT
X;
X;  XIO FUNCTION TO CREATE A NEW DIRECTORY
X;
X;  PARSE DIRECTORY NAME
X;
XMKDIR	JSR	GETFNM
X	JSR	SFDIR		;FIND FILE IN DIRECTORY
X	BCS	MKDMRD
X	LDA	#172		;FILE ALREADY EXISTS
X	DB	$AE		;SKIP 2 BYTES
XDISFUL	LDA	#169		;DIRECTORY FULL
X	JMP	AEXIT
X;
X;  READ IN BIT MAP
X;
XMKDMRD	LDA	HOLFN
X	BMI	DISFUL
X	JSR	RBITMP
X	LDY	MAPBUF
X	DEY
X	DEY
X	STY	DATBYT
X;
X;  FIND EIGHT SECTORS FOR DIRECTORY
X;
X	LDA	#LOW[369]	;FIRST AVAILABLE SECTOR AFTER ROOT DIR.
X	STA	CURSEC,X
X	LDA	#HIGH[369]
X	STA	CURSEC+1,X
X	LDA	#0
X	STA	TMP1
XFDIRLP	INC	TMP1
X	JSR	FNDLBIT		;IS THIS SECTOR FREE?
X	BCS	FDIR2
X	AND	MAPBUF,Y
X	BCC	FDIR1
XFDIR2	AND	MAPBUF+256,Y
XFDIR1	BNE	FDIR3
X	STA	TMP1
XFDIR3	JSR	INCCSEC
X	LDA	TMP1
X	CMP	#8
X	BNE	FDIRLP
X;
X;  ALLOCATE THE SECTORS USED
X;
XALCDLP	JSR	DECCSEC
X	JSR	FNDLBIT
X	EOR	#$FF
X	BCS	ALCPG2
X	AND	MAPBUF,Y
X	STA	MAPBUF,Y
X	BCC	ALCPG1
XALCPG2	AND	MAPBUF+256,Y
X	STA	MAPBUF+256,Y
X	LSR	MAP2MOD
XALCPG1	JSR	DECCNT
X	DEC	TMP1
X	BNE	ALCDLP
X;
X;  WRITE ALLOCATION MAP BACK TO DISK
X;
X	JSR	FMTMAP
X;
X;  ENTER NAME AND TYPE INFO INTO PARENT DIRECTORY
X;
X	LDA	HOLFN
X	JSR	SDIRBK
X	SEC
X	JSR	ENTNAME
X	LDA	CURSEC+1,X
X	STA	DIRBUF+4,Y
X	LDA	CURSEC,X
X	STA	DIRBUF+3,Y
X	LDA	#0
X	STA	DIRBUF+2,Y
X	LDA	#8
X	STA	DIRBUF+1,Y
X	ASL	A
X	JSR	SAVFLAG
X;
X;  THEN CLEAR NEW DIRECTORY
X;
X	LDA	#1
X	STA	FMSBPT
X	LDA	CURSEC,X
X	LDY	CURSEC+1,X
X	JMP	CLRDIR
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > mdos3.asm
X;
X; DOS DIRECTORY ROUTINES
X;
X;	OPEN A DIRECTORY (FOR USER)
X;
XLSTDIR	LDY	#$80-11
XSAVFNB	LDA	FNAME-$80+11,Y
X	STA	(FMSBPT),Y
X	INY
X	BPL	SAVFNB
X	JSR	SFDIR		;FIND A MATCH IN THE DIRECTORY
X	BCS	ENDDIR		;IF NO MORE MATCHES, REPORT FREE SPACE
XNXTDIR	JSR	FMTDIR		;ENTRY FOUND, FORMAT INTO A TEXT STRING
X	LDA	CURFNO
X	STA	FCBFNO,X	;SAVE THE FILE NUMBER OF THE ENTRY FOUND
XGODONE	JMP	DONE		;AND RETURN
X;
XGOTEOD	DEC	DATBYT		;CONVERT EOL TO $9B (REAL EOL)
X	STA	CURLEN,X	;AND FINISH UP
X	BNE	GODONE
X;
XDIRRD	LDY	#$80-11
XRSTFNB	LDA	(FMSBPT),Y	;FETCH BYTES OF PREVIOUSLY PARSED DIRECTORY ENT
X	STA	FNAME-$80+11,Y
X	INY
X	BPL	RSTFNB
X	LDA	CURLEN,X
X	BMI	DIREOF		;EOF IF WE ALREADY REPORTED FREE SPACE
X	TAY
X	LDA	(FMSBPT),Y
X	STA	DATBYT
X	INC	CURLEN,X
X	CMP	#$9C
X	BEQ	GOTEOD
X	CMP	#$9B		;IS THIS END OF LINE?
X	BNE	GODONE		;IF NOT, CONTINUE FETCHING OLD BYTES
X	LDA	FCBFNO,X
X	CMP	CURFNO
X	BNE	DMSTRD
X	CPX	DIUNIT
X	BEQ	DRDNRQ
XDMSTRD	JSR	RRDIR		;IF SO, INSURE DIRECTORY BLOCK IS IN MEMORY
XDRDNRQ	JSR	CSFDIR		;AND FIND THE NEXT ENTRY
X	BCC	NXTDIR		;IF FOUND, LOOP BACK AND FORMAT IT
X;
X;  NO MORE ENTRIES, REPORT FREE SECTORS LAST
X;
XENDDIR	JSR	RBITMP		;READ THE VTOC DATA
X	LDY	#0
X	STY	CURMAP		;FORCE A REREAD NEXT TIME
X	LDA	MAPBUF+3
X	LDX	MAPBUF+4	;AND STUFF THE BUFFER WITH NO. OF FREE SECTORS
X	JSR	CVTDEC
X	LDX	#-14
XFSECL	LDA	FSECM+14-256,X	;FOLLOWED BY THE "FREE SECTORS" TEXT
X	STA	(FMSBPT),Y
X	INY
X	INX
X	BNE	FSECL
X	BEQ	GODONE
X;
XDIREOF	JMP	RETEOF		;NO MORE LINES, RETURN EOF INDICATION
X;
XFSECM	DB	' FREE SECTORS',$9C
X;
X;  FORMAT A DIRECTORY ENTRY FOR BASIC, ETC.
X;
XFMTDIR	LDY	#' '
X	LDX	DIRDSP
X	LDA	DIRBUF,X
X	PHA
X	AND	#$20
X	BEQ	D0E35
X	LDY	#'*'	;IF SO, MARK AS LOCKED
XD0E35	TYA
X	LDY	#0
X	STA	(FMSBPT),Y
X	PLA
X	LDY	#' '
X	AND	#$10
X	BEQ	NOTDIR
X	LDY	#':'
XNOTDIR	TYA
X	LDY	#1
X	STA	(FMSBPT),Y
XCPYNAML	INY
X	LDA	DIRBUF+5,X
X	STA	(FMSBPT),Y
X	INX
X	CPY	#13
X	BCC	CPYNAML
X;
X	LDA	#' '
X	STA	(FMSBPT),Y
X	LDY	DIRDSP
X	LDA	DIRBUF+1,Y
X	LDX	DIRBUF+2,Y
X	LDY	#14	;SECTOR COUNT STARTS HERE
X;
X;  CONVERT A 16-BIT INTEGER TO A 4 OR 5 DIGIT NUMBER
X;
XCVTDEC	STX	TMP2
X	STA	TMP1
X	LDX	#HIGH[10000]
X	LDA	#LOW[10000]
X	JSR	MKDGT2
X	CMP	#'0'
X	BNE	SKIP5
X	DEY
XSKIP5	LDX	#HIGH[1000]
X	LDA	#LOW[1000]
X	JSR	MKDGT2
X	LDA	#100		;FOR THE SHORT STUFF
X	JSR	MAKDGT
X	LDA	#10
X	JSR	MAKDGT
X	TXA
X	ADC	#'0'+10
X	STA	(FMSBPT),Y
X	INY
X	LDA	#$9B		;TERMINATE LINE
X	STA	DATBYT
X	STA	(FMSBPT),Y
X	LDA	#0
X	LDX	CURFCB
X	STA	CURLEN,X
X	RTS
X;
X;  CREATE A DIGIT AND STORE IT INTO THE DIRECTORY BUFFER
X;
XMAKDGT	LDX	#0		;IF SUBTRAHEND < 256, ZERO UPPER BYTE
XMKDGT2	STX	DIRDSP
X	STA	DIRSEC
X	STY	DATBYT
X	LDY	#'0'
X	SEC
XDGTLP2	LDA	TMP1
X	SBC	DIRSEC
X	TAX
X	LDA	TMP2
X	SBC	DIRDSP
X	BCC	DGTXIT
X	STA	TMP2
X	STX	TMP1
X	INY
X	BCS	DGTLP2
X;
XDGTXIT	TYA
X	LDY	DATBYT
X	STA	(FMSBPT),Y
X	INY
X	RTS
X;
X;  PARSE A FILE NAME WITH WILD CARD CHARACTERS ('*' AND '?')
X;
XGETNM2	iny			;look for ">" in
X	lda	(ICBALZ),y	;the start of
X	cmp	#'>'		;the filename
X	beq	GETNAM		;(for SpartaDOS compatibility)
X	dey			;[Bob Puff]
X	bne	GETNAM		;branch always
X;
XGETFNM	LDX	CURFCB
X	LDY	#HIGH[361]
X	LDA	#LOW[361]
X	JSR	SETDIR
X	INY
X	LDA	(ICBALZ),Y
X	INY
X	CMP	#':'		;DEFAULT DIRECTORY?
X	BNE	GETNM2		;IF NOT, CHECK FOR SPARTA ">"
X	DEY
X	STY	TMP1
X	LDY	DEFAULT
X	STY	ICDNOZ
X	TYA
X	STA	ICDNO,X
X	JSR	SETUPD
X	LDA	CDIREC
X	LDY	CDIREC+1
X	JSR	SETDIR
X	LDY	TMP1
X;
XGETNAM	LDX	#-11
X	INY
XAFTSTR	LDA	(ICBALZ),Y
X	CMP	#'*'
X	BNE	TSTPER
X	LDA	#'?'
X	INY
XQLOOP	STA	FNAME+11-256,X
X	INX
X	BPL	TOXITC		;END OF EXTENSION?
XPERFND	CPX	#-3		;END OF FILE NAME?
X	BNE	QLOOP		;NO MORE -?-S
X	BEQ	AFTSTR
X;
XTSTPER	CMP	#'.'		;A PERIOD?
X	BNE	TSTCHR		;IF NOT, CHECK FOR INDIVIDUAL CHARACTERS
X	LDA	#' '		;IF SO, FILL WITH SPACES
X	INY
X	BNE	PERFND
X;
XTSTCHR	CMP	#'?'
X	BCC	ENDCHR		;IF < '?', CHECK FOR DIGIT
X	CMP	#'Z'+1		;ELSE, UPPER CASE LETTER, '?', OR '@'?
X	BCC	GOTCHR
X	CMP	#'_'
X	BCC	ENDCHR		;IF CARET, BACKSL. OR BRACKETS
X	CMP	#'z'+1		;LOWER CASE, ACCENT OR UNDERSCORE?
X	BCC	GOTCHR
XENDCHR	CPX	#-11		;IF FIRST CHAR, ERROR
X	BEQ	ERRCHR		;NO BYTES IN FILE NAME
X	CMP	#'0'		;ELSE, A DIGIT?
X	BCC	FILLNM		;IF NOT, THIS IS END OF NAME
X	CMP	#':'
X	BCS	FILLNM
X;
XGOTCHR	STA	FNAME+11-256,X
X	INY
X	INX
X	BMI	AFTSTR
X;
XTOXITC	LDA	(ICBALZ),Y
XTSTDIR	CMP	#':'		;LOOK FOR SUBDIRECTORY
X	BEQ	MYDIR		;IF MYDOS SYNTAX
X	CMP	#'>'		;OR SPARTA SYNTAX
X	BNE	XITCHR		;IF FINISHED, RESTORE FCB PTR TO X AND EXIT
XMYDIR	STY	TMP2
X	JSR	SFDIR		;ELSE, FIND FILE
X	BCS	FNER1		;NO SUCH FILE
X	JSR	TONXDR
X	BEQ	FNER1
X	LDY	TMP2
X	BNE	GETNAM
XFNER1	LDA	#174	;IF NOT, RETURN ERROR 174
X	DB	$2C	;BIT ABS (SKIP 2 BYTES)
X;
XERRCHR	LDA	#165
X	JMP	AEXIT
X;
XFILLNM	PHA
X	LDA	#' '
XFILLLP	STA	FNAME+11-256,X
X	INX
X	BMI	FILLLP
X	PLA
X	JMP	TSTDIR
X;
X;  RETURN WITH NON-ZERO FLAG IF FILE IS A DIRECTORY
X;
XTONXDR	LDA	#$10		;FILE FOUND, A DIRECTORY?
X	JSR	GETFLAG
X	BEQ	TONXIT		;IF NOT, SET ZERO FLAG
X	LDA	DIRBUF+3,Y	;IF SO, MOVE POINTERS TO THE NEW LEVEL
X	STA	DIRBAS,X
X	LDA	DIRBUF+4,Y
X	STA	DIRBAS+1,X
X	LDA	#$10		;AND CLEAR THE ZERO FLAG
XTONXIT	RTS
X;
X;  ENTER A NAME INTO THE DIRECTORY AT DIRBUF[DIRDSP]
X;
XENTNAME	PHP
X	LDX	#-11
X	LDY	DIRDSP
XNAMELP	LDA	FNAME+11-256,X	;LOAD THE MASK CHARACTER
X	CMP	#'?'
X	BNE	STORIT		;IF NOT '?', SAVE IT AS IT APPEARS
X	PLP
X	PHP
X	BCC	NOSTOR		;IF CY CLEAR, LEAVE THE CHARACTERS UNCHANGED
X	LDA	#' '		;IF CY SET, CONVERT '?'S TO SPACES
XSTORIT	STA	DIRBUF+5,Y
XNOSTOR	INY
X	INX
X	BMI	NAMELP
X	PLP
X	LDY	DIRDSP
XXITCHR	LDX	CURFCB
X	RTS
X;
XSFDIR	JSR	WBITMP		;INSURE BIT MAP IS SAFE
X	LDX	#255
X	STX	HOLFN
X	STX	CURFNO
X	INX
X	STX	DAUX2
X	INX
X	STX	DAUX1
X	LDX	#READ
X	STX	DCOMND
X	JSR	SYSSET		;SET UP POINTERS FOR SYSTEM BUFFER I/O
X;
X	LDA	ICDNOZ
X	CMP	RAMDKU
X	BEQ	CSFDIR		;IF RAMDISK, FORGET DENSITY CHECK
X	ldx	CURFCB		;IF A ROOT DIRECTORY ACCESS, READ BOOT SECTOR
X	lda	DIRBAS,X	;IF IN A SUBDIRECTORY, ASSUME DENSITY IS OK
X	cmp	#LOW[361]	;[Bob Puff]
X	bne	CSFDIR
X;;;	lda	DIRBAS+1,X	;Only occasionally will we get an extra read!
X;;;	cmp	#HIGH[361]
X;;;	bne	CSFDIR
X;
X	JSR	DSKINV		;ELSE, READ THE FIRST BOOT SECTOR
X	BMI	ERRX
X	JSR	INVUNIT		;UPDATE DRIVE CONFIGURATION
X;
XCSFDIR	INC	CURFNO		;READ NEXT 16-BYTE DIR. BLOCK
X	LDA	CURFNO
X	JSR	BSECDS		;CONVERT TO SECTOR AND DISPLACEMENT
XXITCH1	BCS	XITCHR
X	BNE	NOREAD		;IF DISP>0, PROCESS BLOCK
X	JSR	RDIRBK		;IF DISP=0, READ SECTOR
X;
XNOREAD	LDY	DIRDSP
X	LDA	DIRBUF,Y
X	BEQ	FNDOLD		;ZERO IS END OF DIRECTORY (NO MORE ENTRIES)
X	BMI	FNDOLD		;NEGATIVE IS EMPTY SLOT (MAY HAVE MORE ENTRIES)
X;
X;  HANDLE DOS 2.5 FILES
X;
X	and	#$DF		;preserve lock flag
X	cmp	#3		;is this DOS 2.5 + file?
X	bne	NOD25		;nope
X	lda	#$41		;otherwise, kludge the
X	eor	DIRBUF,Y	;flag to make $42
X	sta	DIRBUF,Y	;and save lock.
X;
XNOD25	AND	#$01		;IGNORE ANY FILE THAT IS MARKED "OPEN"
X	BNE	CSFDIR
X	LDX	#-11
XCPNXCH	LDA	FNAME+11-256,X
X	CMP	#'?'
X	BEQ	WCMTCH		;EVERYTHING MATCHES "?"
X	CMP	DIRBUF+5,Y
X	BNE	CSFDIR		;NO MATCH, LOOK AT THE NEXT DIRECTORY ENT
XWCMTCH	INY
X	INX
X	BMI	CPNXCH
X	CLC
X	BCC	XITCHR		;ENTRY FOUND, RETURN WITH CY=0
X;
XFNDOLD	LDX	HOLFN
X	BPL	KPOLD		;IF AN EMPTY SLOT IS ALREADY FOUND, DO NOTHING
X	LDX	CURFNO
X	STX	HOLFN		;ELSE SAVE THIS ONE, ITS THE FIRST!
XKPOLD	TAX
X	BMI	CSFDIR		;IF NOT END OF THE DIRECTORY, KEEP LOOKING
XERRX	SEC
X	BCS	XITCH1		;ELSE, ENTRY NOT FOUND, RETURN WITH CY=1
X;
X; DOS I/O ROUTINES
X;
X;  DISK SECTOR I/O ROUTINES
X;
XWRDISK	SEC			;FMS DISK WRITE ENTRY
XRWDISK	LDY	FMSBPT		;DATA SECTOR READ/WRITE ENTRY
X	LDA	FMSBPT+1
X	JSR	BUFSET
X	LDA	CURSEC+1,X
X	LDY	CURSEC,X
XFMDKIO	PHP
X	LDX	DUNIT
X	CPX	RAMDKU
X	BEQ	RDKIO1
X	PLP
X	pha			;ALLOW FOR DENSITY CHANGE IN FORMAT, ETC.
X	lda	SECSIZ-1,X	;[Bob Puff]
X	tax
X	pla
X	JMP	DKIO
X;
XRDKIO1	JMP	RDKIO		;ABSOLUTE DISK I/O ROUTINE WAS MOVED TO LOW RAM
X;
XEXTEND	JSR	ALLOC
X	LDA	FCBOTC,X
X	LSR	A
X	BCC	REWRIT
X	DEC	FCBOTC,X
X	JSR	WTRICK
X	JMP	WRTTST
X;
XREWRIT	LDY	LNKSEC+1,X
X	LDA	LNKSEC,X
X	JSR	SAVLNK
XWRTTST	BMI	RTBADF
X	INC	SECCNT,X
X	BNE	TONXT
X	INC	SECCNT+1,X
X;
XTONXT	LDA	LNKSEC,X	;MAKE NEXT SECTOR
X	STA	CURSEC,X	;NEW CURRENT SEC.
X	LDA	LNKSEC+1,X
X	STA	CURSEC+1,X
X	LDA	#0
X	STA	LNKSEC,X	;ZERO LINK
X	STA	LNKSEC+1,X
XLENSET	STA	CURLEN,X	;ZERO CURRENT OFFSET
X	LDA	DLINK		;GET THE LINK LOC.
X	STA	MAXLEN,X	;MAKE IT MAX. LEN.
X	CLC			;CLEAR CY FOR LATER READ
X	RTS
X;
XRDNXTS	LDA	FCBFLG,X
X	BEQ	CHASE
X;
XWRNXTS	LDA	FCBFLG,X
X	BMI	EXTEND
X	ASL	A
X	BPL	RDNXTS
X	ASL	A
X	STA	FCBFLG,X
X	JSR	WRDISK
X	BPL	RDNXTS
X;
XRTBADF	JMP	HWERR		;RETURN HARDWARE ERROR CODE IF PRESENT
X;
XSAVLNK	PHA
X	TYA
X	LDY	DLINK
X	STA	(FMSBPT),Y
X	PLA
X	INY
X	STA	(FMSBPT),Y
X	INY
X	LDA	CURLEN,X
XNOBIT	STA	(FMSBPT),Y
X	LDY	FCBOTC,X
X	BMI	LEN16		;16-BIT LENGTH?
X	LDA	FCBFNO,X
X	ASL	A
X	ASL	A
X	LDY	DLINK
X	ORA	(FMSBPT),Y
X	STA	(FMSBPT),Y
XLEN16	JMP	WRDISK
X;
XWTRICK	LDA	LNKSEC,X
X	STA	SAVSEC,X
X	LDA	LNKSEC+1,X
X	STA	SAVSEC+1,X
X	STX	LSTIOCB
X	LDA	CURSEC,X
X	STA	LSTSEC
X	LDA	CURSEC+1,X
X	STA	LSTSEC+1
X	JMP	WRDISK
X;
XINSTRT	JSR	INITYP
X;
XCHASE	LDA	LNKSEC,X
X	ORA	LNKSEC+1,X
X	BEQ	NOLINK
X	JSR	TONXT		;SET CY=0, FUNC=READ
X	JSR	RWDISK
X	BMI	RTBADF		;CANNOT READ SO BAD FILE NUMBER(ERR=164)
X	LDY	DLINK
X	LDA	FCBOTC,X	;16-BIT LINK?
X	ORA	#$7F
X	BMI	LNGLNK
X	LDA	(FMSBPT),Y
X	LSR	A
X	LSR	A
X	CMP	FCBFNO,X
X	BNE	XLINKED
X	LDA	#$03
XLNGLNK	AND	(FMSBPT),Y
X	STA	LNKSEC+1,X
X	INY
X	LDA	(FMSBPT),Y
X	STA	LNKSEC,X
X	INY
X	LDA	(FMSBPT),Y
X	STA	MAXLEN,X
XDRDXIT	CLC
X	RTS
X;
XXLINKED	LDA	ICCOM,X
X	CMP	#FMTCMD		;IS THIS A FORMAT?
X	BNE	FNOERR
XNOLINK	SEC
X	RTS
X;
X;	READ OR WRITE A DIRECTORY BLOCK
X;
XRRDIR	LDA	FCBFNO,X
X;
XSDIRBK	STA	CURFNO
XRDCFNO	LDA	CURFNO
X	JSR	BSECDS
X;
XRDIRBK	JSR	WBITMP		;TAKE CONTROL OF SYSTEM BUFFER
X	CLC
X	DB	$A9		;LDA # (SKIPS 1 BYTE)
XWDIRBK	SEC
XRWDBK	PHP
X	LDX	CURFCB		;PUT FCB NO. IN X
X	STX	DIUNIT		;SAVE THE DIR. BUFFER IOCB
X	JSR	SYSSET
X	CLC
X	LDA	DIRSEC
X	ADC	DIRBAS,X
X	TAY
X	LDA	DIRBAS+1,X
X	ADC	#0		;MULTIPLE DIRS. REQ. THIS [ChasM]
X	PLP
XSYSRW	JSR	FMDKIO
X	BPL	DRDXIT
X	LDA	#163		;BIT MAP R/W ERROR, RETURN SYSTEM ERR. CODE
X	DB	$AE		;SKIP 2 BYTES
X;
XFNOERR	lda	#164
X	sta	DSTATS
X	jmp	HWERR		;FILE NUMBER MISMATCH
X;
X;	READ OR WRITE THE DISK VTOC (BIT MAP)
X;
XRBITMP	LDA	CURMAP
X	CMP	ICDNOZ
X	BEQ	MAPXIT		;SKIP READ IF WHAT WE WANT IS ALREADY THERE
X	JSR	WBITMP		;ELSE, REAL I/O, SAVE CURRENT BUFFER CONTENTS
X;
X	LDA	#0
X	TAY
XZMAP	STA	MAPBUF,Y	;ZERO ENTIRE 512
X	STA	MAPBUF+256,Y	;BYTES OF MAP BUF.
X	DEY
X	BNE	ZMAP
X	CLC
X	JSR	RWBMAP		;THEN READ 128 OR 256 BYTES OF VTOC DATA
X;
X	LDY	#$FF
X	STY	DIUNIT		;INDICATE MAP (NOT DIR) IS LOADED
X	STY	MAP2		;INDICATE SECOND PAGE OF MAP IS UNLOADED
X	INY
X	STY	CHGMAP		;INDICATE MAP IS UNCHANGED
X	INY
X	STY	MAP2MOD
X	STY	CURMP
X;
XMAPCLR	STA	CURMAP		;AND SAVE DRIVE NUMBER MAP APPLIES TO
XMAPXIT	RTS
X;
XWBITMP	LDA	CHGMAP
X	BEQ	MAPCLR		;IF MAP NOT CHANGED, SKIP WRITING IT
X	STA	DUNIT
XFMTMAP	LDA	#0
X	STA	CHGMAP		;ELSE MARK IT UNUSED
X	STA	CURMAP
X	lda	DUNIT		;save drive # [Bob Puff]
X	pha
X	SEC
X	JSR	RWBMAP
X 	pla			;then restore it [Bob Puff]
X	sta	DUNIT
X;
XWRNXTM	LDA	MAP2MOD
X	BNE	NOMPI2		;IF THE PAGE BUFFER IS CLEAN, JUST EXIT
X	LDA	#$FF		;ELSE, WRITE IT TO DISK
X	PHA
X	LDA	MAP2
X	INC	MAP2MOD
X	SEC
X	BCS	MUSTWM
X;
XRDNXTM	CMP	MAP2		;READ A PAGE INTO THE SECOND PAGE BUFFER
X	BEQ	NOMAPI		;IF IT IS ALREADY THERE, JUST EXIT
X	PHA
X	JSR	WRNXTM		;ELSE, WRITE THE CURRENT PAGE (IF NECESSARY)
X	PLA			;AND READ THE NEW ONE
X	PHA
X	CLC			;BY FALLING INTO MUSTWM WITH CY=0
X;
XMUSTWM	PHA
X	LDA	#HIGH[MAPBUF+256]
X	LDY	#LOW[MAPBUF+256]
X	JSR	BUFSET		;SET UP THE BUFFER POINTER FOR 2ND PAGE
X	PLA			;  OF THE VTOC BUFFER
X	JSR	MAPIOC		;ISSUE I/O REQUESTS
X	PLA
X	STA	MAP2		;UPDATE SECOND BUFFER ID BYTE
XNOMAPI	RTS
X;
XRWBMAP	JSR	SYSSET		;SET UP BUFFER POINTERS FOR SYSTEM BUF I/O
X	LDA	#0
XMAPIOC	PHP
X	pha 
X	ldx	DUNIT		;NOTE: THE CURRENT I/O MAY NOT BE TO THE
X	lda	SECSIZ-1,X	;FCB BEING ACCESSED!
X	tax			;[Bob Puff]
X	pla
X	cpx	#2		;256 BYTE SECS?
X	beq	MAPDDS
X	ASL	A		;128, CHANGE PAGE NUMBER TO PAIR NUMBER
XMAPDDS	EOR	#$FF
X	SEC
X	ADC	#LOW[360]
X	TAY
X	cpx	#2		;128 OR 256 BYTE SECTORS?
X	beq	DDMAPX		;IF 128, READ 2 SECTORS TO FILL BUFFER
X	LDA	#HIGH[360]
X	PLP
X	PHP
X	JSR	SYSRW		;READ OR WRITE THE FIRST SECTOR
X	LDA	MAPBUF
X	CMP	#3		;IF DOS 2.0 DISK, READ ONE SECTOR
X	BCC	XITMBF		;EVEN IN SINGLE DENSITY
X	JSR	STEPBP
X	DEY
XDDMAPX	LDA	#HIGH[360]
X	PLP
X	PHP
X	JSR	SYSRW		;READ OR WRITE THE SECOND (OR ONLY) SECTOR
XXITMBF	PLP
XNOMPI2	LDA	ICDNOZ
X	STA	DUNIT		;RESTORE THE USER DRIVE NUMBER TO DUNIT,
X	RTS			;SINCE I/O MAY HAVE BEEN TO ANOTHER DRIVE
X;
XSYSSET	LDA	#HIGH[MAPBUF]
X	LDY	#LOW[MAPBUF]
X	JMP	BUFSET
X;
X;  ROUTINE TO STEP TO THE NEXT DIRECTORY ENTRY (UNTIL WE RUN OUT)
X;
XBSECDS	LDY	#0
X	STY	DIRDSP
X	LSR	A
X	ROR	DIRDSP
X	LSR	A
X	ROR	DIRDSP
X	LSR	A
X	ROR	DIRDSP		;(FILE NUMBER MOD 8) * 16 IS OFFSET IN SECTOR
X	STA	DIRSEC		;FILE NUMBER/8 IS SECTOR OFFSET
X;
X	CMP	#8		;END OF DIRECTORY?
X	DEY
X	BCS	BSECXT
X	ROR	DIRDSP
XBSECXT	RTS
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > mdos4.asm
X;
X; DOS ALLOCATION ROUTINES
X;
X;	FREE A SECTOR FOR LATER USE
X;
XFREE	JSR	RBITMP		;MAKE SURE WE HAVE THE RIGHT MAP
X	STA	CHGMAP
XFMTFRE	INC	MAPBUF+3	;BUMP LOW BYTE OF FREE SECTOR COUNT
X	BNE	FREE0		;IF NO CARRY
X	INC	MAPBUF+4
XFREE0	JSR	FNDBIT
X	PHA
X	LDA	TMP2
X	BEQ	SBMP1
X	STY	TMP2
X	CMP	CURMP		;BEFORE FIRST HOLE?
X	BCS	SBMP2		;NO, LEAVE UNCHANGED
X	STA	CURMP		;YES, NEW FIRST HOLE
XSBMP2	JSR	RDNXTM
X	LDY	TMP2
X	LSR	MAP2MOD		;MARK MAP PAGE2 DIRTY
X	PLA
X	ORA	MAPBUF+256,Y
X	STA	MAPBUF+256,Y
X	RTS
X;
XSBMP1	PLA
X	ORA	MAPBUF,Y
X	STA	MAPBUF,Y
X	RTS
X;
X;	FIND BIT ASSOCIATED WITH A SECTOR ON THE DISK
X;
XFNDBIT	LDA	CURSEC,X
X	AND	#7	;EXTRACT THE BIT NUMBER
X	TAY
X	SEC
X	LDA	#0
XFREE1	ROR	A	;POSITION CARRY TO THE BIT TO FLIP
X	DEY
X	BPL	FREE1
X	PHA		;SAVE THE BIT MASK
X;
X	LDA	CURSEC,X
X	CLC
X	ADC	#10*8	;ALLOW FOR 10 BYTE HEADER
X	TAY		;SAVE LOW BYTE
X	LDA	CURSEC+1,X
X	ADC	#0	;PROPOGATE CARRY
X	LSR	A
X	STA	TMP2
X	TYA
X	ROR	A
X	LSR	TMP2
X	ROR	A
X	LSR	TMP2
X	ROR	A
X	TAY
X;
X	PLA		;RESTORE THE BIT MASK
X	RTS
X;
X;	ALLOCATE AN UNUSED SECTOR TO A FILE
X;
XALLOC	JSR	RBITMP
X	STA	CHGMAP
X	LDY	#10
X	LDA	#0
X	STA	TMP2
XALL1	CMP	MAPBUF,Y	;ANY BITS LEFT?
X	BNE	SECFN1		;IF SO
X	INY
X	BNE	ALL1
X;
X	SEC
X	LDA	MAPBUF
X	SBC	CURMP
X	SEC
X	SBC	#3
X	STA	TMP1
XALLCK	BMI	ALGONE
X	LDA	CURMP
X	STA	TMP2
X	JSR	RDNXTM
X	LDA	#0
X	TAY
XALL2	CMP	MAPBUF+256,Y
X	BNE	SECFN2		;IF FREE SECTOR IN SECOND PART OF MAP
X	INY
X	BNE	ALL2
X	INC	CURMP		;TO NEXT SECTOR OF BIT MAP
X	DEC	TMP1
X	BPL	ALLCK
X;
XALGONE	DEC	CURMP
XDFERR	LDA	#162		;DISK FULL ERROR CODE
X	JMP	AEXIT		;IF THIS IS IT, ERROR-EXIT
X;
XSECFN1	SEC
X	LDX	#$AF		;I.E., -8*10 - 1
XALL3	ROR	A
X	INX
X	CMP	MAPBUF,Y
X	BCC	ALL4
X	CLC
X	BNE	ALL3
XALL4	EOR	MAPBUF,Y
X	STA	MAPBUF,Y
X	BPL	ALL7
X;
XSECFN2	SEC
X	LDX	#$AF		;I.E., -8*10 - 1
XALL5	ROR	A
X	INX
X	CMP	MAPBUF+256,Y
X	BCC	ALL6
X	CLC
X	BNE	ALL5
XALL6	LSR	MAP2MOD
X	EOR	MAPBUF+256,Y
X	STA	MAPBUF+256,Y
X;
XALL7	TYA
X	ASL	A
X	ROL	TMP2
X	ASL	A
X	ROL	TMP2
X	ASL	A
X	ROL	TMP2
X	STA	TMP1
X	TXA
X	ADC	TMP1
X	LDX	CURFCB
X	STA	LNKSEC,X
X	LDA	TMP2
X	ADC	#$FF
X	STA	LNKSEC+1,X
XDECCNT	LDA	MAPBUF+3
X	BNE	NOBOR
X	DEC	MAPBUF+4
XNOBOR	DEC	MAPBUF+3
X	CLC
X	RTS
X;
X;  SIMULATE OLD STYLE BIT FINDER
X;
XFNDLBIT	JSR	FNDBIT
X	PHA			;SAVE MASK
X	LDA	TMP2		;FIRST PAGE?
X	BEQ	FNDPG0
X	STY	TMP2		;SAVE OFFSET IN PAGE
X	CMP	DATBYT
X	BCS	DFEJMP
X	JSR	RDNXTM		;READ IN PROPER PAGE
X	LDY	TMP2		;THEN RESTORE A AND Y REGS
X	PLA
X	SEC			;SET CY (PAGE 1 BUFFER USED)
X	RTS
X;
XFNDPG0	PLA			;RESTORE SAVED MASK
X	CLC			;AND CLR CY (SAY PAGE 0)
X	RTS
X;
XDFEJMP	JMP	DFERR
X;
XDECCSEC	LDA	CURSEC,X
X	BNE	ALCPG0
X	DEC	CURSEC+1,X
XALCPG0	DEC	CURSEC,X
X	RTS
X;
XINCCSEC	INC	CURSEC,X
X	BNE	DELDIN
X	INC	CURSEC+1,X
XDELDIN	RTS
X;
X;  DOS MISC. SUBROUTINES
X;
X;	SET UP STATE VARIABLES ON ENTRY
X;
XSETUP	LDY	ICDNOZ	;GET UNIT NO.
XSETUPW	STX	CURFCB
X	TSX
X	INX
X	INX
X	STX	STKPSV	;SAVE POINTER TO RETURN ADDR ON STACK
XSETUPD	STY	DUNIT	;COPY UNIT NO. TO DCB
X	LDA	#1
X	CPY	RAMDKU
X	BEQ	UFIXED	;RAMDISK SECTOR SIZE IS ALWAYS 128 BYTES
X	LDA	SECSIZ-1,Y
X	BEQ	INVUNIT	;IF NOT CURRENTLY VALID UNIT, TEST FOR DENSITY
XUFIXED	STA	SECDAT	;OTHERWISE, STORE CORRECT DENSITY DATA
X	LSR	A
X	ROR	A
X	ROR	A
X	ORA	#$7D	;UPDATE THE LINK POSITION IN THE DISK SECTOR
X	STA	DLINK
X;
X	LDX	CURFCB
X	LDY	BUFNO,X		;GET THE BUFFER NUMBER
X	BNE	RSETUP
X	LDY	FILES		;IF ONE IS NOT ALLOCATED
X	INY
XSFORB	DEY
X	BEQ	NOSECB		;ALLOCATE ONE, OR ABORT THE OPERATION NOW
X	LDA	BUFFLG-1,Y
X	BNE	SFORB
X	LDA	#$80
X	STA	BUFFLG-1,Y
X	TYA
X	STA	BUFNO,X
XRSETUP	LDA	DOSEND	;==SBTABL
X	STA	FMSBPT
X	LDA	SBTABU-1,Y
X	STA	FMSBPT+1
X	RTS
X;
XINVUNIT	JSR	JSTRD
X	BNE	UFIXED
X;
XNOUNIT	LDA	#160	;RETURN ST=160, DRIVE NOT PRESENT
X	DB	$AE	;SKIP TO JMP INSTRUCTION
XNOSECB	LDA	#161	;RETURN ST=161, NO MORE FILE BUFFERS
X	JMP	AEXIT
X;
X;  REMOVE DOS POINTER FROM BOOT SECTORS
X;
XTDDOS	JSR	TSTDOS	;MUST WE UPDATE BOOT?
X	BNE	NODOSX	;NO, RETURN
X;
XDELDOS	LDY	#0	;YES, REMOVE DOS POINTER FROM BOOT
X	BEQ	UPDBT
X;
X;  ADD DOS POINTER TO BOOT SECTORS
X;
XSETDOS	STY	DOSLOC
X	STA	DOSLOC+1
X	LDY	SECDAT
XUPDBT	LDA	DUNIT
X	CMP	RAMDKU
X	BEQ	TDEXIT
X	STY	SECDAT
X	LDA	STATE
X	PHA
X	LDA	DEFAULT
X	PHA
X	LDA	#$00
X	STA	STATE		;NOTHING IS IN MEMORY YET
X	LDY	#$FF
X	LDA	FCBOTC,X
X	BMI	NOAND		;LONG LENGTH FIELD?
X	LDY	#$03		;IF NOT, USE ONLY 10 BITS
XNOAND	STY	ANDCD+1
X	LDA	#HIGH[BOOTFL]
X	LDY	#LOW[BOOTFL]
X	JSR	BUFSET
X	LDY	#0
X	STY	DAUX2
X;
XWSECL	INY
X	STY	DAUX1
X	LDX	#1
X	STX	DEFAULT
X	SEC
X	JSR	DKIO2
X	JSR	STEPBP
X	CPY	BOOTL
X	BNE	WSECL
X;
X	PLA
X	STA	DEFAULT
X	PLA
X	STA	STATE
X	LDY	ICDNOZ
X	STY	DUNIT
X	LDA	SECSIZ-1,Y
X	STA	SECDAT
XNODOSX	RTS
X;
X;  TEST FOR FILE NAME = 'DOS.SYS'
X;
XTSTDOS	LDY	#256-11
X	LDX	DIRDSP
XTDLOOP	LDA	DIRBUF+5,X
X	EOR	DOSSYS-256+11,Y
X	BNE	TDEXIT
X	INX
X	INY
X	BNE	TDLOOP
XTDEXIT	LDX	CURFCB
X	TAY
X	RTS
X;
XDOSSYS	DB	'DOS     SYS'
X;
X;  FIND AT LEAST ONE FILE MATCHING GIVEN NAME
X;
XLFFILE	JSR	GETFNM	;EXTRACT FILE NAME FROM BUFFER
X	STY	TMP2	;SAVE IT FOR -RENAME-
X	JSR	SFDIR	;FIND FIRST MATCHING FILE IN DIR
X	LDA	#170	;IF NONE, RETURN ERROR 170
X	BCS	AEXIT	;ELSE, RETURN
X	RTS
X;
X;  RETURN ERROR IF FILE IS LOCKED
X;
XTSTLOK	LDA	#$20	;CHECK BIT 5
X	JSR	GETFLAG
X	BEQ	TDEXIT
X	LDA	#167	;FILE LOCKED ERROR = 167
X	DB	$AE	;SKIP 2 BYTES
X;
X;  RETURN WITH NO ERROR
X;
XDONE	LDA	#1	;NORMAL COMPLETION
X;
X;  RETURN ERROR CODE IN ACC TO CIO (IN Y)
X;
XAEXIT	LDX	STKPSV	;RESTORE STACK POINTER
X	TXS
X	LDX	CURFCB	;RESTORE IOCB OFFSET TO X-REG
X	STA	ICSTA,X	;RETURN STATUS IN IOCB
X	TAY		;RETURN STATUS IN Y-REG
X	LDA	DATBYT
X	CPY	#0
X	RTS
X;
X;  RETURN HARDWARE ERRORS TO CIO
X;
XHWERR
X;;;	lda	#0		;fix VTOC updating bug
X;;;	sta	CURMAP		;do we really want to do this?????
X;;;	sta	CHGMAP		;[Bob Puff]
X
X	LDA	DSTATS
X	BNE	AEXIT
X;
X;  RELEASE FCB AND RETURN NO-ERROR STATUS
X;
XFREDON	LDX	CURFCB
X;
X	LDY	BUFNO,X	;FINISHED WITH THE SECTOR BUFFER, RETURN IT
X	BEQ	DONE	;IF NONE ALLOCATED, SO WHAT!
X	LDA	#0
X	STA	BUFNO,X
X	STA	BUFFLG-1,Y
X	BEQ	DONE
X;
X;  TEST OR CLEAR A BIT IN THE FLAG BYTE
X;
XGETFLAG	LDY	DIRDSP
X	AND	DIRBUF,Y
X	RTS
X;
X;  SAVE FLAG BYTE AND WRITE BACK TO DIRECTORY
X;
XSAVFLAG	LDY	DIRDSP
X	STA	DIRBUF,Y
X	JMP	WDIRBK
SHAR_EOF
#	End of shell archive
exit 0
===========================================================================
Charles Marslett
STB Systems, Inc.  <== Apply all standard disclaimers
Wordmark Systems   <== No disclaimers required -- that's just me
chasm@killer.dallas.tx.us

chasm@killer.DALLAS.TX.US (Charles Marslett) (06/24/89)

#	This is a shell archive (Part 3 of 3)
#
#	It contains the source code to the utility overlay
#	(DUP.SYS) and the interface between it an the file
#	manager part of MYDOS.  See the documentation in part
#	1 to assemble it.
#
#	Run this file through the Bourne shell "sh" or an unshar
#	program to extract the individual files.  Assemble using
#	the just posted A65 assembler.
#
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:   Shell Archiver
#	Run the following text with /bin/sh to create:
#	mdup.asm
#	mdup1.asm
#	mdup2.asm
#	mdup3.asm
#	mdup4.asm
#	mdup5.asm
#	mdup6.asm
#	mdup7.asm
# This archive created: Sat Jun 24 08:38:07 1989
sed 's/^X//' << \SHAR_EOF > mdup.asm
X	TITLE	'MYDOS UTILITIES PROGRAM'
X	LIST	I
X;  Copyright 1984, Charles Marslett, Wordmark Systems
X;
X;  Permission is granted by the author for any use whatsoever of this
X;    code, so long as this notice remains in the source code, and so
X;    long as the source to this routine, however modified or unmodified,
X;    is made available for a nominal cost.
X;
X;  FMS ENTRY POINTS (These should not be changed lightly!)
X;
X;  [Data]
X;
XFILES	=	$0709		;MAX NUMBER OF OPEN DISK FILES
XRAMDKU	=	$070A		;LOC OF RAM DISK DRIVE NO
XDFUNIT	=	$070B		;CURRENT DEFAULT UNIT NUMBER
XSECDAT	=	$070E		;CURRENT I/O SECTOR SIZE (1=128, 2=256)
XDLINK	=	$0711		;OFFSET TO THE LINK FIELD IN EACH SECTOR
XANDCD	=	$0734		;OFFSET TO THE MASK EXTRACTING NEXT SECTOR BITS
XDKIO2	=	$0769		;SECTOR I/O SUBROUTINE ENTRY POINT
XWRCMD	=	$0779		;ADDRESS OF WRITE COMMAND BYTE (50/57)
XSTATE	=	$07BE		;CURRENT STATE OF DUP/MEM/AUTORUN
XDKTYPE	=	$07C4		;DISK SECTOR SIZE TABLE (8 BYTES)
XDRVDEF	=	$07CC		;FLOPPY DRIVE CONFIGURATION TABLE (8-BYTES)
XMDINIT	=	$07E0		;MDOS initialization code
XMAPBUF	=	$0908		;512-BYTE BUFFER DOWN IN RESIDENT AREA
XHDTAB	=	$0B15		;HARD DISK DRIVE SIZE TABLE (0 = FLOPPY)
XWOTDCB	=	$0B25		;PROTOTYPE DRIVE MODE SET TABLE
XMAPAGE	=	$0BBA		;Page configuration table (64-bytes) in MDOS
X;
X;  [Code]
X;
XCONFIGR	=	$0B2F		;CONFIGURE DRIVE SUBROUTINE ENTRY
XRDCONF	=	$0B9A		;READ CONFIGURATION STATE SUBROUTINE ENTRY
XSTEPBP	=	$0C5D		;STEP TO THE NEXT BOOT SECTOR BUFFER ADDRESS
X;
X;
X;  RAM disk I/O driver patch locations
X;
XRDKLMT	=	$0C3A		;Size of RAM disk
XRDAD1	=	$0C0D		;Three locations where the control address
XRDAD2	=	$0C19		;  needs to be stored
XRDAD3	=	$0C4C
XNMLMAP	=	$0C14		;Mask (1=part of mapping register)
X;
X;  Starting location for the MDUP code
X;
XORIGIN	=	$1AE0		;FIRST BYTE AFTER MDOS(19CE - 4.00)
X;
X;  Patches linking MDUP into MDOS
X;
X	ORG	$70C
X	DW	RESEND		;START OF FREE MEMORY (end of resident stuff)
X;
X	ORG	$085E
X	JMP	INIT		;DUP INITIALIZATION ENTRY POINT
X;
X;
X;  DEFINED VALUES
X;
XCR	=	$9B
XEOF	=	$88
X;
XOPEN	=	3
XGETREC	=	5
XGETCHR	=	7
XPUTCHR	=	11
XCLOSE	=	12
XRENAME	=	32
XDELETE	=	33
XLOCK	=	35
XUNLOCK	=	36
XFORMAT	=	254
X;
X;  ROM AND RAM ADDRESSES
X;
XCARTST	=	$BFFA
X;
XAUDF1	=	$D200
XAUDCTL	=	$D208
XSKRES	=	$D20A
XSERIN	=	$D20D
XSEROUT	=	$D20D
XIRQEN	=	$D20E
XSKCTL	=	$D20F
XPBCTL	=	$D303
X;
XFASCII	=	$D8E6
XIFP	=	$D9AA
XEDITRV	=	$E400
XDSKIO	=	$E453
XCIOV	=	$E456
XSIOV	=	$E459
XSETVBV	=	$E45C
XCIOINV	=	$E46E
X;
XWARMST	=	$08
XDOSVEC	=	$0A
XDOSINI	=	$0C
XPOKMSK	=	$10
XBRKKEY	=	$11
XRAMLO	=	$1A
X;
XDUNITZ	=	$21
XDCMDZ	=	$22
XDBUFZ	=	$24
XDLENZ	=	$28
XDAUX1Z	=	$2A
XDAUX2Z	=	$2B
XDAUX3Z	=	$2C
X;
XLMARGN	=	$52
XRMARGN	=	$53
X;
XFR0	=	$D4
XVECTOR	=	$D4
XHDBUF	=	$D6
XBUFAD	=	$DA
XBUFLEN	=	$DC
XFNPTR	=	$DE
XTEMP	=	$E0
XTEMP2	=	$E1
X;
XINBUFF	=	$F3
X;
XVSERIN	=	$20A
XVIMIRQ	=	$216
XCDTMV3	=	$21C
XCDTMF3	=	$22A
XSHFLOK	=	$2BE
XRUNAD	=	$2E0
XINITAD	=	$2E2
XMEMTOP	=	$2E5
XMEMLO	=	$2E7
XDVSTAT	=	$2EA		;SYSTEM STATUS BUFFER
X;
XDDEVIC	=	$300
XDUNIT	=	$301
XDCMD	=	$302
XDSTAT	=	$303
XDBUF	=	$304
XDTIMEO	=	$306
XDLEN	=	$308
XDAUX	=	$30A
XHATABS	=	$31A
X;
XIOCB	=	$340
XICDNO	=	$341
XICMD	=	$342
XISTAT	=	$343
XIBUF	=	$344
XILEN	=	$348
XIAUX	=	$34A
X;
X	ORG	ORIGIN		;START OF MDUP
X;
X	INCLUDE	D:MDUP1.ASM	;RESIDENT CODE
X;
XMSBASE	=	*		;START OF NON-RESIDENT CODE
X;
X	INCLUDE	D:MDUP2.ASM	;DATA AREAS AND THE MAIN MENU
X;
X	INCLUDE	D:MDUP3.ASM	;COPY, LIST, CREATE, AND DELETE FUNCTIONS
X;
X	INCLUDE	D:MDUP4.ASM	;ENTIRE DISK FUNCS (FORMAT, COPY, WRT BOOT)
X;
X	INCLUDE	D:MDUP5.ASM	;PROGRAM LOAD AND SAVE FUNCTIONS
X;
X	INCLUDE	D:MDUP6.ASM	;CONFIGURATION FUNCTIONS
X;
X	INCLUDE	D:MDUP7.ASM	;MISC. SUBROUTINES
X;
XDUPEND	=	*
XDUPLEN	=	DUPEND-DUPBASE
XMSLEN	=	DUPEND-MSBASE
X	END	MENUSL
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > mdup1.asm
X;
X;  Resident MDUP code
X;
X;  INITIALIZE MYDOS INTERFACE
X;
XINIT	LDA	#HIGH[DUPENT]
X	STA	DOSVEC+1
X	LDA	#LOW[DUPENT]
X	STA	DOSVEC
X;
X	LDA	#0
X	STA	FNAME
X	LDA	#$20
X	BIT	STATE
X	BNE	CKMDOS		;IF WARM START CHECK FOR DUP LOADED
X;
X;  COLD START CODE
X;
X	STA	STATE		;SET MODE TO WARMSTART
X	LDX	#$10
X	JSR	SOPEN		;RUN AUTORUN.SYS FILE
X	DB	6
X	DB	39
X	DW	AFN
X	BMI	CLOSX
X	JSR	CLOSX
X	JMP	(RUNAD)
X;
X;  CLOSE IOCBS 10 AND 20
X;
XCLOSX	JSR	CLOS20
XCLOS10	LDX	#$10		;CLOSE IOCB 10
X	DB	$2C		;SKIP 2 BYTES
XCLOS20	LDX	#$20		;CLOSE IOCB 20
XCLOS2	LDA	#CLOSE		;CLOSE ANY IOCB
XSCMD	STA	ICMD,X
X	JMP	CIOV
X;
XDBUF10	LDX	#$10
XDEFBUF	STA	IBUF,X
X	TYA
X	STA	IBUF+1,X
XCKMDOS	RTS
X;
X;  Moved AUTORUN.SYS filename here so SUPERARC will not think
X;  this is >=4.3 DOS
X;
XAFN	DB	'D1:AUTORUN.SYS',$9B
X;
X; OPEN FILE
X;
X; CALLING SEQUENCE:
X;    JSR SOPEN
X;    DB  AUX
X;    DB  CMD
X;    DW  BUFFER ADDRESS
X;
XSOPEN	SEC
X	DB	$A9		;LDA #IMM OPCODE
X;
X; DO A READ/WRITE TYPE I/O REQUEST
X;
X; CALLING SEQUENCE:
X;    JSR DOIO
X;    DB  IOCBNO
X;    DW  BUFFER LENGTH
X;    DB  CMD
X;    DW  BUFFER ADDRESS
X;
XDOIO	CLC
X	PLA
X	STA	RAMLO
X	PLA
X	STA	RAMLO+1
X	LDY	#1
X	LDA	(RAMLO),Y
X	BCC	DOIO1
X	STA	IAUX,X
X	BCS	XTRCB
XDOIO1	TAX
X	INY
X	LDA	(RAMLO),Y
X	STA	ILEN,X
X	INY
X	LDA	(RAMLO),Y
X	STA	ILEN+1,X
XXTRCB	INY
X	LDA	(RAMLO),Y
X	STA	ICMD,X
X	INY
X	LDA	(RAMLO),Y
X	STA	IBUF,X
X	INY
X	LDA	(RAMLO),Y
X	STA	IBUF+1,X
X	TYA
X	CLC
X	ADC	RAMLO
X	TAY
X	LDA	#0
X	ADC	RAMLO+1
X	PHA
X	TYA
X	PHA
X	JMP	CIOV		;DO I/O REQUEST
X;
X; IF NO DUP.SYS, INCREMENT DRIVE NO.
X;
XRETRYOS	INC	DUPSYS+1
X	LDA	DUPSYS+1
X	AND	#$0F
X	CMP	#9
X	BCC	RTYOSV
X	BNE	GOTO1
X	CMP	RAMDKU
X	BEQ	RTYOSV
XGOTO1	LDA	#'1'
X	STA	DUPSYS+1
XRTYOSV	TAX
X	LDA	DKTYPE-'1',X
X	BEQ	RETRYOS
X	BNE	NOWMS
X;
X; LOAD PROGRAM FUNCTION
X;
XLDFILE	JSR	LDMEM
X	LDX	#$10
X	JSR	TOVECT		;LOAD PROGRAM OR GO TO IT
X	DB	$2C		;SKIP THE LDY #1 INSTRUCTION
X;
X;*************************************
X;
X;   STANDARD EXIT POINT FOR PROGRAMS
X;
X;*************************************
X;
X; RESTORE DOS/DUP INIT VECTOR
X;
XDUPENT	LDY	#1
XSAVERR	STY	CBSAV
X	BIT	STATE
X	BVS	GODOS
X	BPL	NOWMS
X	JSR	CLOS10
X	JSR	SOPEN
X	DB	$08		;WRITE MEM.SAV FILE
X	DB	OPEN
X	DW	NMSAV
X	BMI	NOWMS
X	JSR	DOIO
X	DB	$10
X	DW	MSLEN
X	DB	PUTCHR
X	DW	MSBASE
XNOWMS	JSR	CLOS10
X	JSR	SOPEN		;GET DUP.SYS INTO MEMORY
X	DB	$06
X	DB	39
X	DW	DUPSYS
X	BMI	RETRYOS
X	LDA	DOSINI
X	STA	INISAV
X	LDA	DOSINI+1
X	STA	INISAV+1
XGODOS	JSR	CLOSX
X	JMP	DOSOS		;THEN START IT UP
X;
X; SAVE MEMORY SUBROUTINE:  WRITE FILE BODY, INIT AND RUN VECTORS
X;
XWDR	JSR	LDMEM	;LOAD MEM.SAV IF NEED BE
XWDR1	LDX	#$10	;WRITE TEXT TO DISK FILE
X	JSR	CIOV
XWRERRO	BMI	SAVERR
X	LDX	#LOW[INITAD]
X	JSR	WRVEC
X	LDX	#LOW[RUNAD]
X	JSR	WRVEC
X	BIT	STATE
X	BVS	GODOS
X	BVC	NOWMS
X;
XWRVEC	LSR	TEMP	;WRITE THIS 6-BYTE VECTOR?
X	BCC	RTS2	;IF NOT, JUST RETURN
X	STX	VECTOR
X	LDA	INITAD&$FF00,X
X	STA	VECTOR+4
X	INX
X	LDA	INITAD&$FF00,X
X	STA	VECTOR+5
X	LDA	#HIGH[INITAD]
X	STA	VECTOR+1
X	STA	VECTOR+3	;(X,A)=MIDDLE WORD
X	STX	VECTOR+2
XWR6BYT	JSR	DOIO
X	DB	$10
X	DW	6
X	DB	PUTCHR
X	DW	VECTOR
X	BMI	WRERRO
XRTS2	RTS
X;
X; RUN AT ADDRESS
X;
XTOVECT	JMP	(VECTOR) ;TO 'RUN AT' ADDRESS
X;
X; LOAD MEM.SAV IF NEED BE
X;
XLDMEM	BIT	STATE	;LOAD MEM.SAV?
X	BPL	NOLDMS
X;
X	LDX	#$20
X	JSR	SOPEN
X	DB	$04
X	DB	OPEN
X	DW	NMSAV
X	BMI	NOLDMS
X;
X	JSR	DOIO
X	DB	$20
X	DW	MSLEN
X	DB	GETCHR
X	DW	MSBASE
X;
XNOLDMS	JMP	CLOS20
X;
XNMSAV	DB	'D1:MEM.SAV',$9B
XEC	DB	'E:'
XDUPSYS	DB	'D1:DUP.SYS',$9B
XOPT	DB	0
XDUPFLAG	DB	0	;DUP RESIDENT = $80
XINISAV	DW	MDINIT
XCBSAV	DB	0	;ERROR CODE FROM PROG EXECUTED
XFNAME	DB	0
X	DS	39	;ALLOW FOR 40 CHAR DEF DIR
X;
XRESEND	DS	$300	;ALLOW FOR THREE FILE BUFFERS
XDRIVERS	DS	$800	;ALLOW 2K FOR RESIDENT CODE
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > mdup2.asm
X;
X;======================================================================
X;======================================================================
X;
X; START OF NONRESIDENT PORTION OF DUP.SYS
X;
XDATA	DS	80		;ALLOCATE BUFFER FOR BIT MAP, ETC.
XDELIM	DS	1
XPAR2	DS	20		;PAR* BUFFERS EXPANDED TO 80 BYTES FROM 32
XPAR3	DS	80		;  BY BOB PUFF, VERSION 4.5 (PAR2 WAS OK)
XBOOTBUF	DS	384		;SPACE FOR 3 BOOT SECTORS
XTEMPBUF	DS	128		;TEMPORARY BUFFER FOR FILE OPEN DENSITY INIT.
X;
X;	ORG	DATA+512	;USE THIS ORG ONLY IF ABOVE ALLOCS < 512 BYTES
X;
XUNNO	DS	1
XPTR	DS	1
XPTRSAV	DS	1
XIPTR	DS	1
XIPSAV	DS	1
XCBYTE	DS	1
XSECTOR	DS	2
XCSRC	DS	1
XCDES	DS	1
XCPYTYP	DS	1
XSWPFLG	DS	1
XRCNT	DS	1
XSECSIZ	DS	2
XFNPT	DS	1
XFNPT2	DS	1
XPAR	DS	80		;REAL PARAMETER (LAST)
XDUPBASE	=	*
XDOSSYS	DB	'D1:DOS.SYS',$9B
X;
X; CLOSE (BRUTALLY) ALL IOCBS AND REOPEN SCREEN
X;
XINITIO	JSR	CIOINV
X	LDX	#0
X	JSR	SOPEN		;OPEN SCREEN AS IOCB #0
X	DB	$0C
X	DB	OPEN
X	DW	EC
X	STX	CDTMV3		;CLEAR TIMER #3
X	STX	CDTMV3+1
X	LDY	#1
X	LDA	#3
X	STA	CDTMF3		;SET TIMER NOT DONE FLAG
X	JSR	SETVBV
XWAITIM	LDA	CDTMF3		;DONE?
X	BNE	WAITIM		;NO, CONTINUE LOOPING
X	RTS
X;
X; DISK UTILITY PROGRAM ENTRY
X;
XDOSOS	CLC
X	CLD
X
X	LDX	#-3
XHATLP	INX
X	INX
X	INX
X	LDA	HATABS,X	;REINSTALL E: HANDLER TO
X	CMP	#'E'		;AVOID DELETING BASIC PROGRAMS
X	BNE	HATLP		;STARTED UP BY AUTORUN.SYS
X	LDA	#LOW[EDITRV]	;"E:" HANDLER SIMULATORS
X	STA	HATABS+1,X
X	LDA	#HIGH[EDITRV]	;REMOVED BY BOB PUFF IN 4.5 [Change for scripts]
X	STA	HATABS+2,X
X
X	LDX	#$FF
X	STX	BRKKEY		;ENABLE BREAK KEY
X;
X	LDA	#HIGH[MDINIT]
X	STA	DOSINI+1
X	LDA	#LOW[MDINIT]
X	STA	DOSINI
X;
X	LDA	#2
X	STA	LMARGN		;SET MARGINS
X	LDA	#39
X	STA	RMARGN
X	LDA	DUPFLAG
X	ORA	STATE
X	AND	#$C1
X	CMP	#$80
X	BNE	NOSWF
X	STA	WARMST
XNOSWF	LDA	#$40
X	ORA	STATE
X	STA	STATE		;ELSE, SAY IT WAS DONE
X	LDA	#$80
X	ORA	POKMSK
X	STA	POKMSK		;ALLOW BREAK INTERRUPTS
X	STA	IRQEN
X	JSR	INITIO		;CLOSE ALL FILES
X;
X	LDA	STATE
X	AND	#1
X	BEQ	SHMEN
X	JSR	ERRXIT	;MEM.SAV ERROR CAN NOW BE SHOWN
X	DB	'Error loading MEM.SAV or memory!',$9B,0
X;
XSHMEN	LDA	DFUNIT
X	ORA	#'0'
X	STA	DEFAULT
X	LDX	#28
X	LDY	#8
XDKSLP	LDA	#' '
X	STA	D1STAT-2,X
X	STA	D1STAT-1,X
X	STA	D1STAT,X
X	STA	D1STAT+1,X
X	CPY	RAMDKU
X	BNE	CKHCD	;IF NOT RAM DISK
X	LDA	#'R'
X	BNE	SETUNI
X;
XCKHCD	LDA	HDTAB+8-1,Y
X	BEQ	GENDCD	;IF NOT HARD DISK
X	LDA	#'H'
XSETUNI	STA	D1STAT,X
X	BNE	DKUNIN
X;
XGENDCD	LDA	DKTYPE-1,Y
X	BEQ	NXTDKS
X	LSR	A	;DOUBLE DENSITY?
X	LDA	#'S'
X	BCS	DKSNGD	;NO, SINGLE
X	LDA	#'D'	;YES, DOUBLE
XDKSNGD	STA	D1STAT,X
X	LDA	DRVDEF-1,Y
X	LSR	A
X	LDA	#'-'
X	BCC	DKSSD
X	LDA	#'='
XDKSSD	STA	D1STAT+1,X
XDKUNIN	TYA
X	ORA	#'0'
X	STA	D1STAT-1,X
XNXTDKS	DEX
X	DEX
X	DEX
X	DEX
X	DEY
X	BNE	DKSLP
X	JSR	PRINT
X	DB	$7D	;CLEAR SCREEN
X	DB	'MYDOS 4.51 -- copyright 1989,'
X	DC	'W','O','R','D','M','A','R','K'
X;
X	DB	$9B,'DISKS:  '
XD1STAT	DB	'1S  '
X	DB	'2S  '
X	DB	'3S  '
X	DB	'4S  '
X	DB	'5S  '
X	DB	'6S  '
X	DB	'7S  '
X	DB	'8S'
X	DB	'D: = D'
XDEFAULT	DB	'1:',0
X	LDA	#LOW[FNAME]
X	LDX	#HIGH[FNAME]
X	JSR	PRTMSG
X;
X	JSR	PRINT
X	DB	$9B,$9B
X	DB	'1-8.Dir of D1:-D8: *. Dir of D:',$9B
X	DB	'A. Disk Directory  K. Save Memory',$9B
X	DB	'B. Run Cartridge   L. Load Memory',$9B
X	DB	'C. Copy File(s)    M. Run at Address',$9B
X	DB	'D. Delete File(s)  N. Load MEM.SAV',$9B
X	DB	'E. Rename File(s)  O. Change Config.',$9B
X	DB	'F. Lock File(s)    P. Set Density',$9B
X	DB	'G. Unlock File(s)  Q. Make Directory',$9B
X	DB	'H. Write DOS Files R. Pick Directory',$9B
X	DB	'I. Initialize Disk S. Set RAMdisk #',$9B
X	DB	'J. Duplicate Disk  V. Set Verify Flag',$9B
X	DB	' ',$9B,0
X	LDY	CBSAV
X	BPL	MENUSL
X	JSR	CIOER1	;IF LOAD ERROR, REPORT IT
X;
X; SELECT MENU FUNCTION
X;
XMENUSL	LDX	#$FF
X	TXS
X	INX
X	STX	OPT	;OPT=00 IF NO OPTIONS
X	STX	SWPFLG
X	STX	CBSAV	;FOR DIR SCANS, SKIP NO EXTNS.
X	JSR	CLOSX	;CLOSE IOCBs 10 AND 20
X	LDX	#$30
X	JSR	CLOS2	;AND IOCB 30
X	JSR	PRINT
X	DB	'Select Item ('
X	DC	'R','E','T','U','R','N'
X	DB	' for menu):',0
X	LDA	#$40	;FORCE UPPER CASE
X	STA	SHFLOK
X	ORA	STATE
X	STA	STATE	;SAY DUP.SYS IN MEMORY
X	JSR	CHRGET
X	CMP	#$9B
X	BNE	CKITEM
X	JMP	SHMEN
X;
XCKFDIR	CMP	#'1'
X	BCC	CKFDD
X	JMP	FASTDIR
XCKFDD	CMP	#'*'
X	BNE	BADITM
X	JMP	FASTDD
X;
XCKITEM	CMP	#'9'+1
X	BCC	CKFDIR
X	CMP	#'A'+NFUNC
X	BCS	BADITM
X	SBC	#'A'-1
X	BCS	ITEMV
XBADITM	LDA	#NFUNC
XITEMV	ASL	A
X	TAY
X	LDA	DUPJT,Y
X	STA	RAMLO
X	LDA	DUPJT+1,Y
X	STA	RAMLO+1
X	JMP	PRTMEN	;GO TO MENU EXIT (WITH MESSAGE)
X;
XTCOMND	=	*
XUCOMND	=	*
XNSI	DB	'No such item!',$9B,0
X	JMP	MENUSL
X;
XDUPJT	DW	DIRLST-1,STCAR-1
X	DW	CPYFIL-1,DELFIL-1
X	DW	RENFIL-1,LKFIL-1
X	DW	ULKFIL-1,WBOOT-1
X	DW	FMTDSK-1,DUPDSK-1
X	DW	SAVFIL-1,LDFIL-1
X	DW	BRUN-1,MEMSAV-1
X	DW	CONFGR-1,CHDISK-1
X	DW	MKDIR-1,SETDIR-1
X	DW	RAMDRV-1,TCOMND-1
X	DW	UCOMND-1,VERIFY-1
XNFUNC	=	[*-DUPJT]/2
X	DW	NSI-1
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > mdup3.asm
X;
X; * AND 1-8.  FAST DIRECTORY LIST
X;
XFASTDD	STA	PAR+2
X	LDA	#':'
X	STA	PAR+1
X	BNE	DOFDD
X;
XFASTDIR	STA	PAR+1
X	LDA	#':'
X	STA	PAR+2
XDOFDD	LDA	#'*'
X	STA	PAR+3
X	STA	PAR+4
X	LDA	#'D'
X	STA	PAR
X	LDA	#$9B
X	STA	PAR+5		;fix the 174 errors in menu [Bob Puff]
X	STA	CPYTYP
X	STA	DELIM
X	BNE	DODIRL
X;
X; A.  DIRECTORY LIST
X;
XDIRLST	DB	'Files to list, Destination?',$9B,0
X	LDA	#$9B
X	STA	CPYTYP
X	JSR	GETFN
X	JSR	DEFPAR
XDODIRL	LDA	#LOW[PAR]
X	LDY	#HIGH[PAR]
X	JSR	DBUF10
X	LDX	#$10
X	STX	CSRC		;IOCB10 IS SOURCE
X	JSR	OPDIR		;OPEN IOCB10 AS DIRECTORY
X;
X	LDA	#HIGH[TEMPBUF+1]
X	STA	BUFAD+1
X	LDA	#LOW[TEMPBUF+1]
X	STA	BUFAD
X;
X	LDA	#38
X	STA	BUFLEN
X	LDA	#0
X	STA	BUFLEN+1
X;
X	LDX	#$00		;CDES=IOCB00
X	LDA	DELIM
X	BMI	CPY1FSP
X	LDA	DELIM
X	BMI	SGFCPY
X	JSR	GETFN2
X	STY	IBUF+$20
X	STA	IBUF+1+$20
XSGFCPY	LDX	#$20
X	LDA	#GETCHR
X	BNE	DOCALL
X;
XCPY1FSP	LDA	#GETREC
XDOCALL	STX	CDES
X	JSR	COPYF
X	JMP	MENUSL	;THEN RETURN TO CMD. LINE
X;
XBADRN	JSR	ERRXIT
X	DB	'Need new file name!',$9B,0
XCANTDV	JSR	ERRXIT
X	DB	'No drive or directories allowed in new name!',$9B,0
X;
XLKMSG	DB	'Lock ',0
XULMSG	DB	'Unlock ',0
XDELMSG	DB	'Delete ',0
X;
X; D.  DELETE FILE(S)
X;
XDELFIL	DB	'Delete what file?',$9B,0
X	LDY	#LOW[DELMSG]
X	LDX	#HIGH[DELMSG]
X	LDA	#DELETE
X	BNE	DOCMD
X;
X; F.  LOCK FILES
X;
XLKFIL	DB	'Lock which file?',$9B,0
X	LDY	#LOW[LKMSG]
X	LDX	#HIGH[LKMSG]
X	LDA	#LOCK
X	BNE	DOCMD	;GET FILE NAME THEN LOCK IT
X;
X; G.  UNLOCK FILES
X;
XULKFIL	DB	'Unlock which file?',$9B,0
X	LDY	#LOW[ULMSG]
X	LDX	#HIGH[ULMSG]
X	LDA	#UNLOCK
X;
XDOCMD	STY	SECSIZ
X	STX	SECSIZ+1
X	PHA
X	JSR	GETFN
X	JSR	CKDSK
X	LDX	OPT
X	CPX	#'N'	;IF '/N' THEN DO IT THE EASY WAY
X	BEQ	AFTCHK
X	JSR	PRINT
X	DB	'Answer ',$27,'Y',$27
X	DB	' or ',$27,'N',$27,$9B,0
X	PLA
X	JSR	SETSCN
X;
XRDFN	JSR	SCNDIR
X	BCS	DELX	;IF END OF DIRECTORY
X	LDA	SECSIZ
X	LDX	SECSIZ+1
X	JSR	PRTMSG
X	LDA	#LOW[PAR]
X	LDX	#HIGH[PAR]
X	JSR	PRTMSG
X	JSR	PRINT
X	DB	'?',0
X	JSR	CHRGET
X	CMP	#'Y'
X	BNE	NODELT
X	LDX	#$20
X	JSR	CIOCL	;DELETE THE FILE THEN
XNODELT	JMP	RDFN
X;
XSMPLCMD	PHA
X	JSR	GETFN	;GET FILE NAME
X	JSR	CKDSK	;VERIFY A DISK FILE
XAFTCHK	PLA
XISSCMD	STA	ICMD+$10
X	LDX	#$10
X	JSR	CIOCL
X	LDA	ICMD+$10
X	CMP	#41
X	BEQ	SETFNJ
XDELX	JMP	MENUSL
XSETFNJ	JMP	SETFNM
XJCANTDV	JMP	CANTDV
XJBADRN	JMP	BADRN
X;
X; E.  RENAME FILE(S)
X;
XRENFIL	DB	'File to rename, new name?',$9B,0
X	JSR	GETFN
X	JSR	CKDSK
X	LDY	PTR
X	LDA	DELIM
X	CMP	#','
X	BEQ	CKNAM2
X	CMP	#' '
X	BNE	JBADRN
XCKNAM2	INY
X	LDA	(FNPTR),Y
X	CMP	#':'
X	BEQ	JCANTDV
X	CMP	#'>'		;check for sparta type
X	BEQ	JCANTDV
X	CMP	#'0'
X	BCC	DOREN
X	CMP	#'z'+1
X	BCC	CKNAM2
XDOREN	LDA	#RENAME
X	BNE	ISSCMD
X;
X; Q.  MAKE A DIRECTORY
X;
XMKDIR	DB	'Full directory name?',$9B,0
X	LDX	#8
X	STX	IAUX+$10
X	LDA	#34	;MAKE DIR. COMMAND
X	JMP	SMPLCMD
X;
X; R.  SET DIRECTORY
X;
XSETDIR	DB	'Directory to be used as ',$27,'D:',$27,'?',$9B,0
X	JSR	GETFN
X	JSR	CKDSK
X	LDY	PTR	;DRIVE OR NULL?
X	CPY	#4
X	BCC	CPYDNE
X	LDA	#41
X	JMP	ISSCMD
X;
XSETFNM	LDX	#0
X	LDA	PTR
X	EOR	#4
X	BEQ	ZAPNAM
X	LDY	#1
X	LDA	#':'
X	CMP	(FNPTR),Y
X	BNE	ALLNEW	;IF NOT SUBDIRECTORY
XFNDEND	INX
X	LDY	FNAME-1,X
X	BNE	FNDEND	;END OF OLD DIR?
X	STA	FNAME-1,X
X;
XALLNEW	INY
X	BEQ	CPYDNE
X	CMP	(FNPTR),Y
X	BNE	ALLNEW
X	DEX		;POINT BACK AT ':'
X	BEQ	CPY1ST	;IF START, NO ':' TO PRESERVE
X;
XCPYNAM	INX
XCPY1ST	INY
X	LDA	(FNPTR),Y
XZAPNAM	STA	FNAME,X
X	BNE	CPYNAM
X	JMP	MENUSL
X;
XCPYDNE	JSR	ERRXIT
X	DB	'Invalid directory!',$9B,0
X;
X; SINGLE FILE (DEVICE) COPY
X;
XTOERR1	JMP	CIOER1
XSGCOPY	LDX	#$10
X	STX	CSRC	;SOURCE IS IOCB10
X	JSR	SOPEN
X	DB	4	;INPUT
X	DB	OPEN	;OPEN FUNCTION
X	DW	PAR	;INPUT DEVICE NAM
X	BMI	TOERR1
X	JMP	SGFCPY
X;
X; C.  COPY FILES
X;
XDUPFIL	=	*
XCPYFIL	DB	'File source, destination?',$9B,0
X	LDA	#' '
X	STA	PAR3+2	;DEFINE CHAR 3 OF DEVICE NAME
X	LDA	#$9B
X	STA	CPYTYP
X	JSR	GETFN	;GET SOURCE FILE NAME
X;
X	LDA	#HIGH[DUPEND]
X	STA	BUFAD+1
X	LDA	#LOW[DUPEND]
X	STA	BUFAD
X;
X	LDA	MEMTOP
X	SEC
X	SBC	#LOW[DUPEND]
X	STA	BUFLEN
X	LDA	MEMTOP+1
X	SBC	#HIGH[DUPEND]
X	STA	BUFLEN+1
X;
X	JSR	DEFPAR
X	LDA	DELIM
X	BMI	SFNAME
X	JSR	GETFN2
X	LDA	#0
XSFNAME	STA	SWPFLG
X	ASL	WARMST
X	LDA	FNPTR+1
X	STA	IBUF+1+$20
X	LDA	FNPTR
X	STA	IBUF+$20
X	LDA	PAR	;DISK DEVICE?
X	CMP	#'D'
X	BNE	SGCOPY
X	LDA	#LOW[PAR]
X	LDY	#HIGH[PAR]
X	JSR	DBUF10
X;
X	LDA	#'?'
X	LDY	#11
XQQQ	STA	PAR2-1,Y
X	DEY
X	BNE	QQQ
X;
X	JSR	CWFSD
X	LDX	#$10
X	JSR	OPDIR	;OPEN IOCB10 AS DIRECTORY
X;
X	LDY	#$FF
XCPSCL1	INY
X	LDA	(FNPTR),Y
X	STA	PAR3,Y
X	BNE	CPSCL1
XCPSCL2	DEY
X	LDA	(FNPTR),Y
X	CMP	#'>'		;account for sparta type
X	BEQ	CPSCL3
X	CMP	#':'
X	BNE	CPSCL2
XCPSCL3	INY
X	STY	FNPT2
X	LDA	(FNPTR),Y
X	BEQ	OPINP
X;
X	LDX	#0	;SCAN -PAR- STARTING AT 1-ST BYTE
XMVMSK	LDA	(FNPTR),Y
X	BMI	WCOPYB	;1 FILESPEC COPY??
X	CMP	#'*'
X	BEQ	MVNML
X	CMP	#'.'
X	BCC	WCOPYB
X	BNE	DOSTOR
X	LDA	#' '
X	DEY
XDOSTOR	STA	PAR2,X
X	INY
XMVNML	INX
X	CPX	#8
X	BCC	MVMSK
XSKPPRD	INY
XMVEXT	LDA	(FNPTR),Y
X	BEQ	WCOPYB
X	CMP	#'.'
X	BEQ	SKPPRD	;IF A PERIOD, SKIP OVER IT
X	CMP	#'*'
X	BEQ	OPINP
X	CMP	#' '
X	BEQ	WCOPYB
X	CMP	#','
X	BEQ	WCOPYB
X	CMP	#$9B
X	BEQ	WCOPYB
X	INY
XSAVBLK	STA	PAR2,X
X	INX
X	CPX	#11
X	BCC	MVEXT
X	BCS	OPINP
X;
XWCOPY	JSR	CWFSD
XOPINP	JSR	SCNDIR
X	BIT	CBYTE
X	BMI	OPINP
X	BCC	WCNEXT
X	JMP	MENUSL
X;
XWCOPYB	LDA	#' '
X	BNE	SAVBLK
XWCNEXT	LDA	#HIGH[PAR3]
X	STA	IBUF+$30+1
X	LDA	#LOW[PAR3]
X	STA	IBUF+$30
X;
X	LDX	#0
X	LDY	FNPT2
XWCNBLD	LDA	PAR2,X
X	BEQ	TERMX
X	CMP	#'?'
X	BNE	STWCC
X	LDA	DATA+2,X
XSTWCC	STA	PAR3,Y
X	CMP	#' '
X	BEQ	OVWRTC
X	INY
XOVWRTC	INX
X	CPX	#8
X	BCC	WCNBLD
X	LDA	#'.'
X	STA	PAR3,Y
X	INY
XWCEBLD	LDA	PAR2,X
X	BEQ	TERMX
X	CMP	#'?'
X	BNE	STWCEC
X	LDA	DATA+2,X
XSTWCEC	STA	PAR3,Y
X	CMP	#' '
X	BEQ	OVWRTE
X	INY
XOVWRTE	INX
X	CPX	#11
X	BCC	WCEBLD
XTERMX	LDA	#'.'
X	CMP	PAR3-1,Y
X	BNE	NOTOVP
X	DEY
XNOTOVP	LDA	#$9B
X	LDX	OPT
X	CPX	#'Q'
X	BNE	NOQUERY
X	LDA	#'?'
XNOQUERY	STA	PAR3,Y
X	LDA	#0
X	STA	PAR3+1,Y
X;
X	LDA	CPYTYP
X	BNE	DOONE
X	LDA	#LOW[PAR]
X	LDX	#HIGH[PAR]
X	JSR	PRTMSG
X	JSR	PRINT
X	DB	'-->',0
X	LDA	#LOW[PAR3]
X	LDX	#HIGH[PAR3]
X	JSR	PRTMSG
X	LDA	OPT
X	CMP	#'Q'
X	BNE	DOONE
X	JSR	CHRGET
X	CMP	#'Y'
X	BNE	SKPCOP
XDOONE	LDA	IAUX+5+$10
X	STA	IAUX+5+$20
X	LDX	#$20
X	STX	CSRC
X	LDA	#4
X	STA	IAUX,X
X	LDA	#LOW[PAR]
X	LDY	#HIGH[PAR]
X	JSR	DEFBUF
X	LDA	#OPEN
X	JSR	SCMD		;OPEN THE SOURCE FILE
X	BMI	CPYERR
X;
X	LDX	#7
XCKFDOS	LDA	CKDTST-1,X	;File name = DOS.SYS?
X	CMP	PAR3+2,X
X	BNE	NOXDOS		;No, handle it normally then
X	DEX
X	BNE	CKFDOS
X;
X;  COPYING DOS.SYS, SET UP FOR RENAME AND LOAD BOOT SECTORS
X;
X	LDA	PAR3+1
X	STA	DOSRNM+1	;Stash the unit number in the rename buffer
X	STA	DOSSYS+1
X	LDA	#$60		;Change destination name to diamond-OS
X	STA	PAR3+3
X;
X	CLC			;READ BOOT SECTORS
X	JSR	DOBOOT		;DO BOOT I/O
X;
X;  THIS REALLY COPIES THE FILE . . .
X;
XNOXDOS	LDA	#HIGH[PAR3]
X	STA	IBUF+$30+1
X	LDA	#LOW[PAR3]
X	STA	IBUF+$30
X;
X	LDX	#8		;IOCB $30 set up for writing
X	STX	IAUX+$30
X	LDX	#$30
X	STX	CDES
X	LDA	#GETCHR
X	JSR	COPYF	;COPY FILE
X;
X	LDA	DOSRNM+1	;NEED TO RENAME DOS.SYS?
X	BEQ	SKPCOP
X;
X;  WRITE THE BOOT SECTORS OUT TO THE DESTINATION AND RENAME BACK TO DOS.SYS
X;
X	JSR	FIXUPDOS	;FIX BOOT SECTORS, WRITE THEM, AND RENAME FILE
X	LDA	#0		;CLEAR RENAME FLAG
X	STA	DOSRNM+1
X;
XSKPCOP	LDA	CPYTYP
X	BNE	TOEXIT
X	JMP	WCOPY
XTOEXIT	JMP	MENUSL
XCPYERR	JMP	CIOER1
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > mdup4.asm
X;
X; I.  FORMAT A DISK
X;
XFMTDSK	DB	'Disk to FORMAT:',0
X	JSR	GETDN	;GET DRIVE NUMBER OR NAME
X	JSR	DEFPAR
X;
X	LDA	#HIGH[PAR]
X	STA	IBUF+$10+1
X	LDA	#LOW[PAR]
X	STA	IBUF+$10
X;
X	LDY	#1
X	LDA	(FNPTR),Y
X	STA	FMTDVN
X;
X; MAKE SURE ABOUT DRIVE NUMBER
X;
X	JSR	PRINT
X	DB	'(Press [A] for Enhanced Dns)',$9B
X	DB	'Type [Y] to Format Drive '
XFMTDVN	DB	'0:',0
X;
X	JSR	CHRGET
X	CMP	#'A'
X	BEQ	FMT1050
X	EOR	#'Y'
X	BNE	WBX
XDOFMT	STA	IAUX+$10
X	LDA	#0
X	LDX	OPT	;REAL FORMAT?
X	CPX	#'N'
X	BNE	RELFMT
X	ROR	A
XRELFMT	STA	IAUX+1+$10
X;
X	LDA	#FORMAT
X	STA	ICMD+$10
X	LDX	#$10
X	JSR	CIOV	;DO FORMAT OF DISK
X	BPL	WBX
XWBERR	JMP	CIOER1	;IF ERROR, SAY SO!
XWBX	DEY
X	BEQ	ALFMTD
X	JSR	ERRXIT
X	DC	'W','A','R','N','I','N','G'
X	DB	': Bad sectors on disk!',$9B,0
XALFMTD	JMP	MENUSL
X;
XFMT1050	LDA	#1
X	BNE	DOFMT
X;
X; H.  WRITE DOS/DUP TO DISK
X;
XDUPFNM	DB	'D1:DUP.SYS',$9B
XWBOOT	DB	'Drive to write DOS files to?',0
X	JSR	GETDN
X	LDA	DUPSYS+1
X	PHA
X	LDA	#'1'
X	STA	DUPSYS+1
X	STA	NMSAV+1
X	LDY	#1
X	LDA	(FNPTR),Y
X	CMP	#':'
X	BNE	CANWB
X	LDA	DEFAULT
XCANWB	STA	DOSSYS+1
X	STA	DUPFNM+1
X;
X	DEY		;SET UP INITIAL VALUES OF PARMS.
X	STY	OPT
X	LDA	#$80
X	STA	STATE
X;
X	LDA	#LOW[DOSSYS]
X	LDY	#HIGH[DOSSYS]
X	JSR	DBUF10
X	LDA	#8	;OPEN OUTPUT=WRITE DOS.SYS
X	STA	IAUX+$10
X	JSR	ANYDEN	;OPEN AND WRITE DOS.SYS (ANY DENSITY)
X	JSR	CLOS10
X	PLA
X	STA	NMSAV+1
X	STA	DUPSYS+1
X;
X; **** WRITE DUP.SYS HERE ****
X;
X	LDY	#$70
X	LDA	#LOW[DUPBASE]
X	LDX	#HIGH[DUPBASE]
X	JSR	D2B8A
X;
X	LDA	#HIGH[DUPFNM]
X	STA	IBUF+$10+1
X	LDA	#LOW[DUPFNM]
X	STA	IBUF+$10
X	LDA	#HIGH[DUPEND-1]
X	STA	HDBUF+3
X	LDA	#LOW[DUPEND-1]
X	STA	HDBUF+2
X	LDA	#HIGH[DUPLEN]
X	STA	HDBUF+5
X	LDA	#LOW[DUPLEN]
X	STA	HDBUF+4
X;
X	LDA	#0
X	STA	TEMP		;CLEAR 'RUN' FLAG
X	JMP	WRDUP		;WRITE DUP.SYS
X;
X; J.  DUPLICATE A DISK
X;
XDUPDSK	DB	'Source, Destination (Sectors)?',$9B,0
X	JSR	GETDN
X	LDY	#1
X	LDA	(FNPTR),Y
X	AND	#$0F	;GET DRIVE NUMBER
X	STA	CSRC
X	STA	CDES
X	LDA	DELIM	;IF SINGLE DRIVE DUP.
X	CMP	#'('
X	BEQ	SETSSZ	;GO SET SECTOR SIZE
X	JSR	GETDN2	;ELSE, GET SECOND DRIVE NAME
X	LDY	#1
X	LDA	(FNPTR),Y
X	AND	#$0F
X	STA	CDES
X	CMP	CSRC	;SAME DRIVE?
X	BNE	SETSSZ	;YES, SINGLE DRIVE DUP.
X	LDX	#$9B
X	STX	SWPFLG
XSETSSZ	TAX
X	LDY	CSRC
X	LDA	SWPFLG
X	ORA	#$40	;SET DUP-DISK FLAG
X	STA	SWPFLG
X	BMI	DODKDP
X	JSR	PRINT
X	DB	'Insert both disks, type '
X	DC	'R','E','T','U','R','N'
X	DB	0
X	JSR	CHRGET
X;
XDODKDP	JSR	CWFSD
X	LDA	CSRC	;POINT TO SOURCE DRIVE
X	JSR	GETDEN	;IDENTIFY DENSITY OF SOURCE DISKETTE
X	LDY	CDES	;ELSE, TWO DRIVE DUP.
X	LDX	CSRC
X	LDA	DKTYPE-1,X
X	CMP	DKTYPE-1,Y
X	BEQ	SAME
X	STY	UNNO
X	JSR	SETDEN
X	LDY	CDES
X	LDX	CSRC
X	LDA	DKTYPE-1,X
X	CMP	DKTYPE-1,Y
X	BEQ	SAME
X	JSR	ERRXIT
X	DB	'Drives not compatible!',$9B,0
XSAME	ASL	WARMST
X	LSR	A
X	STA	SECSIZ+1
X	ROR	A
X	STA	SECSIZ	;SET SECTOR SIZE (128 OR 256)
X	STX	DUNIT	;READ SOURCE VTOC
X;
X	LDA	DELIM
X	PHA
X	LDA	#$FF
X	TAX
XINIBMP	STA	DATA+128,X
X	STA	DATA+256,X
X	DEX
X	BNE	INIBMP
X	PLA		;BOOT COPY?
X	CMP	#'('
X	BEQ	BLDVTOC	;YES, BUILD IMAGINARY VTOC
X	CMP	#$9B
X	BEQ	RDVTOC	;NO, DOS COPY
XOOPS	JSR	ERRXIT	;ELSE, ERROR
X	DB	'Invalid options!',$9B,0
XBLDVTOC	JSR	GETNUM
X	CPY	#'-'
X	BNE	OOPS
X	STA	DATA+3
X	STX	DATA+4
X	JSR	GETNUM
X	CPY	#')'
X	BNE	OOPS
X	STA	DATA+1
X	STX	DATA+2
X	LDY	#0
X	STY	PTR
X	STY	DATA+6
X	STY	DATA+5
X;
X	LDA	#HIGH[DATA+10]
X	STA	BUFAD+1
X	LDA	#LOW[DATA+10]
X	STA	BUFAD
X;
X	LDA	#$FE
XD26BB	LDX	DATA+6
X	CPX	DATA+4
X	BNE	D26CB
X	LDX	DATA+5
X	CPX	DATA+3
X	BCS	D26D2
XD26CB	SEC
X	ROL	A
X	JSR	NXTSCT
X	BNE	D26BB
X;
XD26D2	LDX	DATA+2
X	CPX	DATA+6
X	BCC	D26EA
X	BNE	D26E4
X	LDX	DATA+1
X	CPX	DATA+5
X	BCC	D26EA
XD26E4	ASL	A
X	JSR	NXTSCT
X	BNE	D26D2
X;
XD26EA	SEC
X	ROL	A
X	BCS	D26EA
X	STA	(BUFAD),Y
X;
XRDVTOC	SEC
X	LDA	MEMTOP
X	SBC	SECSIZ
X	STA	BUFLEN
X	LDA	MEMTOP+1
X	SBC	SECSIZ+1
X	STA	BUFLEN+1
X;
X	LDA	BUFLEN
X	CMP	#LOW[DUPEND]
X	LDA	BUFLEN+1
X	SBC	#HIGH[DUPEND]
X	BCS	ENUF
X	JSR	ERRXIT
X	DB	'Not enough memory!',$9B,0
X;
XNXTSCT	BCS	D272E
X	STA	(BUFAD),Y
X	LDA	#$FE
X	INC	BUFAD
X	BNE	D272E
X	INC	BUFAD+1
XD272E	INC	DATA+5
X	BNE	D2736
X	INC	DATA+6
XD2736	RTS
X;
XENUF	LDA	PTR
X	BEQ	SKRDVT	;IF POS, SKIP READING VTOC
X	LDA	#LOW[360]
X	LDX	#HIGH[360]
X	STA	DAUX
X	STX	DAUX+1
X	LDA	#LOW[DATA]
X	LDX	#HIGH[DATA]
X	STA	DBUF
X	STX	DBUF+1
X	JSR	RSEC1
X	BPL	NOERFD
X	JMP	CIOER1
XNOERFD	CLC
X	LDA	DATA+1
X	ADC	#12		;ADD IN THE BOOT, MAP AND DIR SECTORS
X	STA	DATA+1
X	BCC	CK2BIT		;THEN TAKE CARE OF SECOND BIT MAP IF NEC.
X	INC	DATA+2		;ELSE, BUMP UPPER BYTE
XCK2BIT	LDA	DATA
X	CMP	#4
X	BCC	SKRDVT		;IF SINGLE SECTOR, SKIP READING SECOND
X	INC	DATA+1
X	CLC
X	LDA	DBUF
X	ADC	DLEN
X	STA	DBUF
X	LDA	DBUF+1
X	ADC	DLEN+1
X	STA	DBUF+1
X	DEC	DAUX
X	JSR	RSEC1
X;
XSKRDVT	LDA	#0
X	STA	DAUX+1
X	LDA	#1
X	STA	DAUX
X	LDA	DATA+10
X	STA	CBYTE
X	LDA	#8
X	STA	IPTR
X	LDA	#HIGH[DATA+10]
X	STA	VECTOR+1
X	LDA	#LOW[DATA+10]
X	STA	VECTOR
X;
XDORD	LDA	VECTOR
X	STA	PTRSAV
X	LDA	VECTOR+1
X	STA	PTR
X	LDA	IPTR
X	STA	IPSAV
X	LDA	CBYTE
X	STA	CBSAV
X	LDA	DAUX
X	STA	SECTOR
X	LDA	DAUX+1
X	STA	SECTOR+1
X	LDA	#0
X	STA	CPYTYP	;SET OPERATION TO 'READ'
XLRS	LDA	#HIGH[DUPEND]
X	STA	DBUF+1
X	LDA	#LOW[DUPEND]
X	STA	DBUF
XLRS1	ASL	CBYTE
X	DEC	IPTR
X	BNE	CBIT
X	INC	VECTOR
X	BNE	PAGE1
X	INC	VECTOR+1
XPAGE1	LDY	#0
X	LDA	(VECTOR),Y
X	STA	CBYTE
X	LDX	#8
X	STX	IPTR
XCBIT	BIT	CBYTE
X	BMI	ASPT
X	LDA	CPYTYP
X	ASL	A	;CY=0, READ; CY=1, WRITE
X	LDA	CSRC
X	BCC	RSECIN	;ACC=DRIVE #
X	LDA	CDES
XRSECIN	JSR	SECTIO	;READ OR WRITE
XIOD	CLC
X	LDA	DBUF
X	ADC	SECSIZ
X	STA	DBUF
X	LDA	DBUF+1
X	ADC	SECSIZ+1
X	STA	DBUF+1
XASPT	LDA	DAUX
X	CMP	DATA+1
X	LDA	DAUX+1
X	SBC	DATA+2
X	BCC	ASPN
X;
X	LDA	CPYTYP	;END OF DRIVE
X	BPL	STDD2	;IF READ, DO WRITE
X	JMP	MENUSL	;IF WRITE, THEN DONE!
X;
XASPN	INC	DAUX
X	BNE	ASPX
X	INC	DAUX+1
XASPX	LDA	BUFLEN	;ELSE, END OF THE BUFFER?
X	CMP	DBUF
X	LDA	BUFLEN+1
X	SBC	DBUF+1
X	BCS	LRS1	;NO, GET NEXT SECTOR
X;
X	LDA	CPYTYP
X	BPL	STDD2	;IF WRITE, DO NEXT READ
X	JSR	CWFSD
X	JMP	DORD
X;
XSTDD2	BIT	SWPFLG
X	BPL	CKFORM
X	JSR	PRINT
XIDD	DB	'Insert DESTINATION disk, press '
X	DC	'R','E','T','U','R','N'
X	DB	0
X	JSR	CHRGET
XCKFORM	LDA	#'N'
X	CMP	OPT
X	BEQ	NOFORM
X	STA	OPT
X	LDX	#$20	;IF FORMAT REQ., DO IT
X	LDA	#LOW[DOSSYS]
X	LDY	#HIGH[DOSSYS]
X	JSR	DEFBUF
X	LDA	#FORMAT
X	STA	ICMD+$20
X	LDA	CDES
X	ORA	#'0'	;CONVERT DRIVE NO. TO ASCII
X	STA	DOSSYS+1
X	JSR	CIOCL
XNOFORM	DEC	CPYTYP	;THEN, MAKE A WRITE
X	LDA	PTRSAV
X	STA	VECTOR
X	LDA	PTR
X	STA	VECTOR+1
X	LDA	SECTOR
X	STA	DAUX
X	LDA	SECTOR+1
X	STA	DAUX+1
X	LDA	IPSAV
X	STA	IPTR
X	LDA	CBSAV
X	STA	CBYTE
X	JMP	LRS
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > mdup5.asm
X;
X; K.  SAVE FILE COMMAND
X;
XSAVFIL	DB	'SAVE:filename,start,end(,init(,run))',$9B,0
X	JSR	GETFN
X	STY	IBUF+$10
X	STA	IBUF+1+$10
X	LDA	OPT
X	PHA
X	JSR	GETNO2
X	CPX	#HIGH[DUPEND]
X	LDY	#$70
X	BCS	DSLMFG
X	LDY	#$60	;FORCE MEM.SAV TO MEMORY BEFORE SAVING IMAGE
XDSLMFG	JSR	D2B8A
X	JSR	GETNO2
X	STA	HDBUF+2
X	STX	HDBUF+3
X	SEC
X	SBC	HDBUF
X	STA	HDBUF+4
X	TXA
X	SBC	HDBUF+1
X	BPL	ADDOK
X	JSR	ERRXIT
X	DB	'Invalid START-END range!',$9B,0
XADDOK	STA	HDBUF+5
X	INC	HDBUF+4
X	BNE	INCOK
X	INC	HDBUF+5
XINCOK	LDA	#0
X	CPY	#CR
X	BEQ	NINTAD
X	JSR	GETNO2
X	STA	INITAD
X	STX	INITAD+1
X	ORA	INITAD+1
X	BEQ	NINTAD
X	LDA	#1	;SET 'GOT INIT' FLAG
XNINTAD	STA	TEMP
X	CPY	#CR
X	BEQ	NRUNAD
X	JSR	GETNO2
X	STA	RUNAD
X	STX	RUNAD+1
X	ORA	RUNAD+1
X	BEQ	NRUNAD
X	INC	TEMP
X	INC	TEMP	;SET 'GOT RUN' FLAG
XNRUNAD	PLA
XWRDUP	LDY	#0
X	STY	OPT
X	DEY
X	STY	VECTOR
X	STY	VECTOR+1
X;
X; OPEN THE PROGRAM FILE
X;
X	LDY	#8
X	CMP	#'A'
X	BNE	OPTOK1
X	DEC	OPT
X	INY
XOPTOK1	STY	IAUX+$10
X	LDX	#$10
X	JSR	ANYDEN	;OPEN FILE 'OUTPUT/ANY DENSITY'
X	BMI	KIOERR
X	LDA	OPT
X	BEQ	FULHDR	;IF NO 'APPEND'
X	JSR	DOIO	;WRITE SHORT HEADER
X	DB	$10
X	DW	4
X	DB	PUTCHR
X	DW	VECTOR+2
X	BMI	KIOERR
XKEXIT	LDA	HDBUF+4
X	STA	ILEN+$10
X	LDA	HDBUF+5
X	STA	ILEN+1+$10
X	LDA	HDBUF
X	STA	IBUF+$10
X	LDA	HDBUF+1
X	STA	IBUF+1+$10
X	BIT	STATE
X	BMI	KMSAV
X	JMP	WDR1
XKMSAV	JMP	WDR
X;
XFULHDR	JSR	WR6BYT
X	BPL	KEXIT
XKIOERR	JMP	CIOER1
X;
XD2B8A	STA	HDBUF
X	STX	HDBUF+1
X	STY	STATE
X	RTS
X;
X; N.  LOAD PROGRAM INTO MEM.SAV
X;
XMEMSAV	DB	'Load MEM.SAV from what file?',$9B,0
X	LDA	STATE
X	ORA	#$80		;TURN ON MEM.SAV FLAG
X	BMI	LOADIT
XTOMEN	JMP	MENUSL
X;
X; L.  LOAD USER FILE FUNCTION
X;
XBDLDFL	LDY	#180
XBLOWUP	JMP	CIOER1
X;
XLDFIL	DB	'Load from what file?',$9B,0
X	LDA	STATE
X	AND	#$7F		;TURN OFF MEM.SAV FLAG
XLOADIT	STA	STATE
X	JSR	GETFN
X	STY	IBUF+$10
X	STA	IBUF+1+$10
X	LDX	DATA+3		;JUST A CR?
X	BEQ	TOMEN
X	LDA	#4
X	STA	IAUX+$10
X	LDX	#$10
X	JSR	ANYDEN
X	JSR	DOIO
X	DB	$10
X	DW	2
X	DB	GETCHR
X	DW	DATA
X	BMI	BLOWUP
X	LDA	DATA
X	AND	DATA+1
X	CMP	#$FF
X	BNE	BDLDFL
X	LDA	DATA+3
X	BEQ	TOMEN
X	LDA	OPT
X	EOR	#'N'
X	BEQ	GOTN
X	LDA	#0
X	STA	WARMST
X	LDA	#3
XGOTN	EOR	#7
X	STA	IAUX+$10
X	LDA	#39
X	STA	ICMD+$10
X	LDA	#LOW[CIOV]
X	LDX	#HIGH[CIOV]
X	BNE	BRUN1
X;
X; B.  RUN CARTRIDGE
X;
XSTCAR	DB	0
X	LDA	$BFFD
X	EOR	#$AA
X	STA	$BFFD
X	CMP	$BFFD
X	BNE	NORAM		;IF ADDRESS SPACE IS NOT RAM
X	EOR	#$AA
X	STA	$BFFD		;IF RAM, NO CARTRIDGE
XNOCART	JSR	ERRXIT
X	DB	'NO CARTRIDGE!',$9B,0
X;
XNORAM	LDX	$BFFC
X	BNE	NOCART		;IF NOT ATARI CARTRIDGE
X	LDA	CARTST
X	LDX	CARTST+1
XBRUN1	STA	VECTOR
X	STX	VECTOR+1
X	LDA	INISAV
X	STA	DOSINI
X	LDA	INISAV+1
X	STA	DOSINI+1
X	LDA	STATE
X	AND	#$BF
X	STA	STATE
X	JMP	LDFILE
X;
X; M.  RUN AT ADDRESS
X;
XBRUN	DB	'Run from what address?',0
X	JSR	GETLIN
X	LDA	(FNPTR),Y
X	CMP	#$9B	;NO ADDRESS?
X	BEQ	BRUN2	;IF SO, ABORT
X	JSR	GETNO2
X	CPY	#$9B
X	BNE	BRUN2
X	LDY	#0
X	STY	WARMST
X	BEQ	BRUN1
XBRUN2	JSR	ERRXIT
X	DB	'Address must be 1-4 hex digits!',$9B,0
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > mdup6.asm
X;
X; P.  CHANGE DISK FORMAT
X;
XCHDISK	DB	'Drive, new density:',0
X	JSR	GETDN	;GET DRIVE NO.
X	LDA	DELIM
X	CMP	#$9B	;DRIVE NUMBER ONLY?
X	BNE	CHDSK2	;IF SO, CHANGE DEFAULT
XBADPCMD	JSR	ERRXIT
X	DB	'Drive unchanged.',$9B,0
XCHDSK2	LDY	PTR
X	LDA	(FNPTR),Y
X	TAX
X	LDY	#1
X	LDA	(FNPTR),Y
X	CMP	#'9'
X	BCS	BADPCMD
X	SBC	#'1'-1
X	BCC	BADPCMD
X	TAY
X	INY
X	STY	UNNO
X	LDA	#1
X	CPX	#'S'
X	BEQ	TOSGL
X	CPX	#'D'
X	BNE	BADPCMD
X	ASL	A
XTOSGL	STA	DKTYPE-1,Y
X	JSR	DOFSIN
X	JMP	SHMEN	;THEN SHOW CHANGED MENU
X;
X; O.  CONFIGURE SYSTEM OR DISK DRIVE
X;
XCKBANKS	SEI			;was CHKBANKS
X	LDY	#0		;This is BOB code...
X	STY	$D40E		;uncommented as
X	STY	$D20E		;per usual...
X	LDA	$D301
X	PHA			;We validate the memory mapping ability
X	LDX	#$FF		;of the box we are running in?
XCKBL1	STY	$D301		;[Don't really understand this, but
X	LDA	$4000		; thats OK, for now, ChasM]
X	STA	MAPBUF,Y	;[Bob Puff]
X	STX	$4000
X	TXA
X	sta	MAPBUF+256,Y
X	INY
X	BNE	CKBL1
X	DEX
X	STX	$D301
X	STX	0
X	STX	$4000
X	STX	$8000
X	STX	$C000
X
X	LDX	#0
XCKBL2	sty	$D301
X	lda	$4000
X	cmp	#$FF
X	bne	CKBNOT
X	inx
X	stx	$4000
X	txa
XCKBNOT	sta	MAPBUF+256,Y
X	iny
X	bne	CKBL2
X	stx	RDKLMT
X;
X	ldx	#1
XCKBL8	txa
X	ldy	#$FF
XCKBL6	cmp	MAPBUF+256,Y
X	beq	CKBFO
X	dey
X	cpy	#$FF
X	bne	CKBL6
X;;;;;;	nop			;was a DEY
XCKBL9	sty	$D301
X	lda	MAPBUF,Y
X	sta	$4000
X	dey 
X	cpy	#$FF
X	bne	CKBL9
X	pla
X	sta	$D301
X	lda	#$C0
X	sta	$D40E
X	lda	$10
X	sta	$D20E
X	cli 
X	rts
X;
XCKBFO	tya 
X	sta	MAPAGE-1,X
X	inx 
X	cpx	#65
X	bcc	CKBL8
X	ldy	#$FE
X	bne	CKBL9
X;
XSPCPORT	JSR	PRINT		;Handle non-standard port addresses
X	DB	'Control Address(HEX)?',0
X	JSR	GETLIN
X	JSR	GETNO2
X	TAY
X	ORA	VECTOR+1
X	BNE	SAVADR
X	beq	RAMDSU		;If < $0100, ask again!
X	jmp	SAVADR		;Stash the specified address
X;
X;  Test for RAMdisk, and configure it
X;
XGETRDK	jsr	PRINT
X	db	'RAM disk present?',0
X	jsr	CHRGET
X	ldy	#$FF
X	cmp	#'N'
X	bne	RAMDSU
X	jmp	NOFAST
X;
XRAMDSU	jsr	PRINT
X	db	'[A]xlon, [X]E or [C]ustom RAMdisk?',0
X	jsr	CHRGET
X	cmp	#'C'
X	beq	SPCPORT
X	ldy	#LOW[$D301]
X	ldx	#HIGH[$D301]
X	cmp	#'A'
X	bne	SAVADR
X	ldy	#LOW[$CFFF]
X	ldx	#HIGH[$CFFF]
X	cmp	#'X'
X	bne	RAMDSU			;Keep on trying!
XSAVADR	sty	RDAD1
X	sty	RDAD2
X	sty	RDAD3
X	stx	RDAD1+1
X	stx	RDAD2+1
X	stx	RDAD3+1
X	cmp	#'X'
X	bne	OKP0
X	jsr	CKBANKS
X	lda	RDKLMT
X	bne	OKP1
X	jsr	PRINT
X	db	'No extra memory available!',$9B,0
X	ldy	#0
X	jmp	NOFAST
XOKP0	jmp	RMDSU2
X;
XOKP1	ldx	#0
X	stx	NMLMAP
X	stx	FR0+1
X	asl	a
X	asl	a
X	rol	FR0+1
X	asl	a
X	rol	FR0+1
X	asl	a
X	sta	FR0
X	rol	FR0+1
X	jsr	IFP
X	jsr	FASCII
X	jsr	PRINT
X	db	'Use default config for ',0
X	ldy	#0
XOKP2	lda	(INBUFF),Y
X	bmi	OKP3
X	iny
X	bne	OKP2
XOKP3	and	#$7F
X	sta	(INBUFF),Y
X	iny
X	lda	#0
X	sta	(INBUFF),Y
X	lda	INBUFF
X	ldx	INBUFF+1
X	jsr	PRTMSG
X	jsr	PRINT
X	db	'K?',0
X	jsr	CHRGET
X	cmp	#'N'
X	beq	RMDSU2
X	jmp	DVNOQ
X;
XRMDSU2	JSR	PRINT
X	DB	'Size(K)?',0
X	JSR	GETLIN
X	JSR	GETNUM
X	LSR	VECTOR+1
X	ROR	A
X	LSR	VECTOR+1
X	ROR	A
X	LSR	VECTOR+1
X	ROR	A
X	LSR	VECTOR+1
X	ROR	A
X	BNE	SAVRDS
X	LDA	#4
XSAVRDS	STA	RDKLMT
X;
XGETSEQN	JSR	PRINT
X	DB	'Page sequence?',0
X	JSR	GETLIN
X	JSR	GETNO2
X	CPY	#CR
X	BNE	FSNUM
X	BEQ	RSEQ
XDVNOQ	JSR	PRINT
X	DB	'RAM disk drive no?',0
XGETRDRV	JSR	CHRGET
X	LDY	#9		;ASSUME 9
X	CMP	#'0'
X	BCC	NOFAST		;IF DIGIT, CHANGE RAMDISK CODE
X	CMP	#'9'
X	BCS	NOFAST
X	AND	#$0F
X	TAY
XNOFAST	STY	RAMDKU		;SET RAMDISK UNIT NO.
X	RTS
X;
XRSEQ	TAY
X	LDX	PGMAP,Y
X	STX	NMLMAP
X	CPY	#3
X	BCS	CPAXSQ
X	LDA	SQMAP,Y
X	LDX	#0
XCPY0	ROL	A
X	ROL	A
X	PHA
X	ROL	A
X	ROL	A
X	ROL	A
X	AND	#$0C
X	TAY
XCPY1	LDA	SQTAB,Y
X	STA	MAPAGE,X
X	INX
X	INY
X	TXA
X	AND	#3
X	BNE	CPY1
X	PLA
X	CPX	#16
X	BNE	CPY0
XCPSEQ	LDA	SQTAB,X
X	STA	MAPAGE,X
X	INX
X	CPX	#64
X	BNE	CPSEQ
X	BEQ	DVNOQ
X;
XCPAXSQ	LDX	#64
XAXSQL	DEX
X	TXA
X	STA	MAPAGE,X
X	BNE	AXSQL
X	BEQ	DVNOQ
X;
XFSNUM	LDX	#0
X	PHA
X	TXA
XFSNCL	STA	DATA+256,X
X	INX
X	BNE	FSNCL
X	PLA
XFSLP1	STX	UNNO
X	CPY	#CR
X	BEQ	TONML
X	STA	DATA+256-64,X
X	TAX
X	LDA	DATA+256,X
X	BNE	BADSEQ
X	DEC	DATA+256,X
X	LDY	PTR
X	LDA	(FNPTR),Y
X	CMP	#CR
X	BNE	FSLP4
X	JSR	GETLIN
XFSLP4	JSR	GETNO2
X	LDX	UNNO
X	INX
X	CPX	#64
X	BNE	FSLP1
XTONML	CPX	RDKLMT
X	BNE	WRONG
X	STA	NMLMAP
XUPDLP1	DEX
X	LDA	DATA+256-64,X
X	STA	MAPAGE,X
X	TXA
X	BNE	UPDLP1
X	JMP	DVNOQ
XBADSEQ	JSR	PRINT
X	DB	'Duplicated sequence number!',$9B,0
X	JMP	GETSEQN
X;
XWRONG	JSR	PRINT
X	DB	'Wrong number of entries!',$9B,0
X	JMP	GETSEQN
X;
XPGMAP	DB	$00,$00,$00,$FF,$FF,$FF
XSQMAP	DB	$9C,$D8,$4B,$FF,$FF,$00
X;
XSQTAB	DB	$A3,$A7,$AB,$AF
X	DB	$C3,$C7,$CB,$CF
X	DB	$E3,$E7,$EB,$EF
X	DB	$83,$87,$8B,$8F
X;
X	DB	$A1,$A5,$A9,$AD
X	DB	$C1,$C5,$C9,$CD
X	DB	$E1,$E5,$E9,$ED
X	DB	$81,$85,$89,$8D
X;
X	DB	$A2,$A6,$AA,$AE
X	DB	$C2,$C6,$CA,$CE
X	DB	$E2,$E6,$EA,$EE
X	DB	$82,$86,$8A,$8E
X;
X	DB	$A0,$A4,$A8,$AC
X	DB	$C0,$C4,$C8,$CC
X	DB	$E0,$E4,$E8,$EC
X	DB	$80,$84,$88,$8C
X;
XCONSYS	JSR	PRINT
X	DB	'Verify WRITEs?',0
X	JSR	DOVRFY
X	JSR	PRINT
X	DB	'Number of File Buffers?',0
X	JSR	GETLIN
X	JSR	GETNUM
X	TAX
X	BEQ	SKPFCT
X	CMP	#17
X	BCS	SKPFCT
X	STA	FILES	;SET NUMBER OF FILES (0-16)
XSKPFCT	JSR	GETRDK
X	JSR	MDINIT	;REINITIALIZE DOS3
X	JMP	DOSOS
X;
XZAPDRV	LDA	#$D2
X	DB	$2C	;SKIP 2 BYTES
XSET52	LDA	#$52
X	LDY	UNNO
X	STA	DRVDEF-1,Y
X	JSR	CLRHDS
XCONXIT	JMP	MENUSL
X;
XCONFGR	DB	'Drive number or '
X	DC	'R','E','T','U','R','N'
X	DB	':',0
X	JSR	CHRGET	;GET DRIVE NUMBER
X	CMP	#$9B	;IF RETURN, GO TO SYSTEM CONFIGURATION
X	BNE	CONDRIV
X	JMP	CONSYS
XCONDRIV	CMP	#'9'
X	BCC	SAVDVN
XTOBADP	JMP	BADPCMD
XSAVDVN	SBC	#'1'-1
X	BCC	TOBADP
X	TAY
X	INY
X	STY	UNNO
X	LDA	#0	;THEN ZERO CONFIGURATION BYTE
X	STA	DRVDEF-1,Y
X;
X	JSR	PRINT
X	DB	'Remove drive?',0
X	JSR	CHRGET
X	CMP	#'Y'
X	BEQ	ZAPDRV
X	JSR	PRINT
X	DB	'Is drive configurable?',0
X	JSR	CHRGET
X	CMP	#'Y'	;IF NO, SET TO $52 AND EXIT
X	BNE	SET52
X	JSR	PRINT
X	DB	'High capacity drive?',0
X	JSR	CHRGET
X	CMP	#'Y'
X	BEQ	GETHCD
X	JSR	PRINT
X	DB	'Is drive double sided?',0
X	JSR	CHRGET
X	CMP	#'Y'
X	BNE	SETSS
X	LDA	#$01
X	JSR	ORDRV
XSETSS	JSR	PRINT
X	DB	'Tracks/side?',0
X	JSR	GETLIN
X	JSR	GETNUM
X	CMP	#35
X	BEQ	SET35
X	TAY
X	LDA	#$30
X	CPY	#77
X	BEQ	SETTKS
X	LDA	#$20
X	CPY	#80
X	BEQ	SETTKS
X	LDA	#$10
X	CPY	#40
X	BNE	SETSS
XSETTKS	JSR	ORDRV
XSET35	JSR	PRINT
X	DB	'Step rate?',0
X	JSR	CHRGET
X	CMP	#'4'
X	BCS	SET35
X	SBC	#'0'-1
X	BCC	SET35
X	ASL	A
X	JSR	ORDRV
X	JSR	CLRHDS
X	JMP	MENUSL
X;
XGETHCD	JSR	PRINT
X	DB	'Drive size (in sectors)?',0
X	JSR	GETLIN
X	JSR	GETNUM
X	CPX	#0
X	BEQ	GETHCD	;INVALID SIZE
X	PHA
X	LDY	UNNO
X	LDA	#$12
X	STA	DRVDEF-1,Y
X	LDA	#2
X	STA	DKTYPE-1,Y
X	PLA
X	JSR	SETHDS
X	JMP	MENUSL
X;
X;  S.  Set RAMdisk Drive Number
X;
XRAMDRV	DB	'RAM disk drive no?',0
X	JSR	GETRDRV
X	JMP	MENUSL
X;
X;  V.  Set Verify Flag ON or OFF
X;
XVERIFY	DB	'Verify WRITEs?',0
X	JSR	DOVRFY
X	JMP	MENUSL
X;
XDOVRFY	JSR	CHRGET
X	LDX	#$57	;ASSUME YES!
X	CMP	#'N'
X	BNE	DOVFY
X	LDX	#$50
XDOVFY	STX	WRCMD	;SAVE THE WRITE COMMAND IN DOS
X	RTS
X;
XORDRV	LDY	UNNO
X	ORA	DRVDEF-1,Y
X	STA	DRVDEF-1,Y
X	RTS
X;
XCLRHDS	LDX	#0
X	TXA
XSETHDS	LDY	UNNO
X	STA	HDTAB-1,Y
X	TXA
X	STA	HDTAB+8-1,Y
X	JMP	DOFSIN
SHAR_EOF
sed 's/^X//' << \SHAR_EOF > mdup7.asm
X;
X; PUT A SINGLE CHARACTER ON THE SCREEN
X;
XCHRPUT	LDX	#PUTCHR
X	STX	ICMD
X	LDX	#0
X	STX	ILEN
X	STX	ILEN+1
X	JMP	CIOV
X;
X; PUT MESSAGE TO THE SCREEN
X;
XPRTMSG	STA	RAMLO
X	STX	RAMLO+1
XPRTNXT	LDX	#0
X	LDA	(RAMLO,X)
X	BEQ	PRTXIT
X	JSR	CHRPUT
XPRTENT	INC	RAMLO
X	BNE	PRTNXT
X	INC	RAMLO+1
X	BNE	PRTNXT
XPRTXIT	RTS
X;
X; PRINT AN IN-LINE STRING
X;
XPRINT	PLA
X	STA	RAMLO
X	PLA
X	STA	RAMLO+1
XPRTMEN	JSR	PRTENT
X	LDA	RAMLO+1
X	PHA
X	LDA	RAMLO
X	PHA
X	RTS
X;
X; READ A BYTE FROM THE KEYBOARD
X;
XCHRGET	JSR	XE424	;FETCH THE BYTE
X	CPY	#0
X	BMI	KILLRD	;IF BREAK OR EOF, ABORT COMMAND
X	CMP	#'z'+1	;> LOWER CASE Z?
X	BCS	NCHGCS
X	CMP	#'a'	;< LOWER CASE A?
X	BCC	NCHGCS
X	SBC	#$20	;CONVERT TO UPPER CASE
XNCHGCS	PHA		;SAVE IT
X	CMP	#$9B
X	BEQ	CHRXIT	;IF EOL, ECHO IT
X	JSR	CHRPUT	;ELSE, ECHO IT
X	LDA	#$9B	;FOLLOWED BY EOL
XCHRXIT	JSR	CHRPUT
X	PLA		;RESTORE FOR PROGRAM
X	RTS		;THEN EXIT
XKILLRD	JSR	CHRPUT	;MOVE TO NEXT LINE AND
X	JMP	MENUSL	;EXIT WITHOUT RETURN TO COMMAND
X;
XXE424	ldx	#$70		;Get a character from the keyboard [Bob Puff]
X	jsr	CLOS2		;Close IOCB $70
X;
X	jsr	SOPEN		;Open IOCB #$70 for keyboard input
X	db	4
X	db	OPEN
X	dw	KDEV
X;
X	jsr	DOIO		;get a character
X	db	$70		;IOCB $70
X	dw	0		;Buffer length (0=return 1 byte in ACC)
X	db	GETCHR
X	dw	0		;Buffer address (unused)
X	pha			;save the character for a sec.
X;
X	ldx	#$70
X	jsr	CLOS2		;Close IOCB $70 again
X;
X	pla			;get character back
X	rts			;that's all, folks!
X;
XKDEV	db	'K:',$9B	;Keyboard handler addr.
X;
XCLOSE7	jsr	DOIO	;close IOCB #7
X	db	$70
X	dw	0
X	db	$0C
X	dw	0
X rts 
X;
X; RAW SECTOR READ/WRITE FUNCTIONS
X;
XRSEC1	LDA	CSRC
XRSEC2	CLC
X;
XSECTIO	STA	DUNIT
X	LDX	SECSIZ+1
X	INX
X	STX	SECDAT
XBOOT1	LDX	#3
X	STX	RCNT
XCLD1	LDX	SECDAT
X	PHP
X	JSR	DKIO2
X	BPL	DRTS
X	CMP	#$80
X	BEQ	TOERR2
X	PLP
X	DEC	RCNT
X	BPL	CLD1
X	PHP
XTOERR2	PLP
X	JMP	CIOER1
X;
XDRTS	PLP
X	RTS
X;
X;  BOOT SECTOR I/O ROUTINE (USED TO COPY DOS.SYS)
X;
XDOBOOT
X	LDA	#HIGH[BOOTBUF-128]
X	STA	DBUF+1
X	LDA	#LOW[BOOTBUF-128]
X	STA	DBUF		;INITIALIZE THE BUFFER ADDRESS
X	LDA	#0		;START WITH SECTOR #1
X	STA	DAUX
X;
X	JSR	BOOTIO
X;
X	JSR	BOOTIO		;2 CALLS, THEN FALL THROUGH (TRANSFER 3 SECTORS)
X;
XBOOTIO
X	JSR	STEPBP
X	INY
X	STY	DAUX
X	JMP	BOOT1		;JUMP ALWAYS!
X;
X; CHECK FOR 2-COLUMN DIRECTORY LIST
X;
XCLEARIT	LDX	CSRC
X	LDA	ICMD,X
X	CMP	#GETCHR
X	BEQ	CLERXIT
X	LDA	TEMPBUF+1
X	CMP	#'0'
X	BCS	EOFEXIT
X	LDY	ILEN,X
X	CPY	#20
X	BCC	SHFNL
X	DEC	ILEN,X
X	LDY	#-24
XSFTSIZ	LDA	TEMPBUF+39-256,Y
X	STA	TEMPBUF+39-1-256,Y
X	INY
X	BNE	SFTSIZ
XSHFNL	LDA	TOGGL
X	EOR	#$BB
X	STA	TOGGL
X	STA	TEMPBUF+19
XCLERXIT	RTS
X;
XEOFEXIT	LDA	#$9B
X	CMP	TOGGL
X	BEQ	CLERXIT
X	DEC	IBUF,X
X	INC	ILEN,X
X	STA	TEMPBUF
X	RTS
X;
XTOGGL	DB	$9B
X;
X; COPY ONE FILE (AS MANY MEMORY LOADS AS NEEDED)
X;
XCOPYFL	LDX	CSRC
X	LDA	ILEN,X
X	ORA	ILEN+1,X
X	BEQ	NOOUTP
X	LDA	SWPFLG
X	BPL	WRFILE
X	LDA	#LOW[IDD]
X	LDX	#HIGH[IDD]
X	JSR	PRTMSG
X	JSR	CHRGET
X	LDX	CDES
X	JSR	RESET
XWRFILE	LDX	CDES
X	BNE	DOWRFI
X	JSR	CLEARIT
X	LDX	#$00
XDOWRFI	LDA	IOCB,X	;OPEN?
X	BPL	PUTOUT	;YES, WRITE NEXT BLOCK
X;
X	LDX	OPT
X	LDA	#8
X	CPX	#'A'	;APPEND?
X	BNE	DOPO1
X	LDA	#9
XDOPO1	LDX	CDES
X	STA	IAUX,X
X	JSR	ANYDEN	;OPEN THE OUTPUT FILE
X	BMI	TOCIOR
X;
XPUTOUT	LDX	CDES
X	LDY	CSRC
X	LDA	ILEN,Y
X	STA	ILEN,X
X	LDA	ILEN+1,Y
X	STA	ILEN+1,X
X	LDA	IBUF,Y
X	STA	IBUF,X
X	LDA	IBUF+1,Y
X	STA	IBUF+1,X
X	LDA	#PUTCHR
X	STA	ICMD,X
X	JSR	CIOCL		;WRITE NEXT BLOCK OF DATA
XNOOUTP	LDX	CSRC
X	LDA	ISTAT,X		;EOF?
X	CMP	#$88
X	BEQ	CPYXIT
X	LDA	SWPFLG
X	BPL	RECOPY
X	LDA	#LOW[ISD]
X	LDX	#HIGH[ISD]
X	JSR	PRTMSG
X	JSR	CHRGET
X	LDX	CSRC
X	JSR	RESET
X	JMP	RECOPY
X;
XCOPYF	LDX	CSRC
X	STA	ICMD,X
X	LDA	#$9B
X	STA	TOGGL
XRECOPY	LDX	CSRC
X	LDA	#0
X	STA	TEMPBUF+22
X	LDA	BUFAD
X	LDY	BUFAD+1
X	JSR	DEFBUF
X	LDA	BUFLEN
X	STA	ILEN,X
X	LDA	BUFLEN+1
X	STA	ILEN+1,X
X	JSR	CIOV		;READ DIRECTORY DATA
X	BPL	TOCPFL
X	CPY	#$88		;END OF FILE?
X	BNE	TOCIOR		;IF ERROR, ABORT
XTOCPFL	JMP	COPYFL
XTOCIOR	JMP	CIOER1
X;
XCPYXIT	LDX	CDES
X	BEQ	NOTCL
X	JSR	CLOS2
XNOTCL	LDX	CSRC
X	JMP	CLOS2
X;
X;  FIX UP DOS COPY OPERATION
X;
XDLKMSK	=	*-1
X	DB	$03,$FF
XDLKLOC	=	*-1
X	DB	$7D,$FD
XFIXUPDOS
X	LDX	SECDAT		;STASH SECTOR SIZE INFO
X	STX	SECDAT-$0700+BOOTBUF
X	LDA	DLKLOC,X	;STASH LINK LOCATION IN THE SECTOR
X	STX	DLINK-$0700+BOOTBUF
X	LDY	#$14
XNOTRITE	LDA	#$29		;AND COMMAND CODE
XFNDAND	INY
X	BMI	NOAND
X	CMP	BOOTBUF-1,Y
X	BNE	FNDAND
X	LDA	BOOTBUF,Y
X	CMP	#$03
X	BEQ	ANDOK
X	CMP	#$FF
X	BNE	NOTRITE
XANDOK	LDA	DLKMSK,X	;STASH THE MASK FOR 10 BIT OR 16 BIT LINKS
X	STA	BOOTBUF,Y
X;
XNOAND	SEC			;WRITE BOOT SECTORS
X	JSR	DOBOOT		;DO BOOT I/O
X;
X	LDX	#$30		;USE THE DESTINATION IOCB ($30 IS ALWAYS OK)
X	JSR	SOPEN		;IF COPYING DOS.SYS (REALLY 'DIAMOND'OS.SYS)
X	DB	0		;AUX
X	DB	DELETE		;CMD
X	DW	DOSSYS		;FILENAME -- DELETE EXISTING DOS.SYS
X;
X	LDX	#$30		;USE THE DESTINATION IOCB ($30 IS ALWAYS OK)
X	JSR	SOPEN
X	DB	0
X	DB	RENAME
X	DW	DOSRNM		;MAKE NEW ONE
X	RTS
X;
X;
X;	SCAN DIRECTORY AND BUILD THE NEXT FILE NAME
X;	EXIT WITH NOT-EQUAL IF AT END
X;
XSCNDIR	LDA	#LOW[DATA]
X	LDY	#HIGH[DATA]
X	JSR	DBUF10
X	LDA	#GETREC
X	STA	ICMD+$10
X	LDA	#32
X	STA	ILEN+$10
X	LDA	#0
X	STA	ILEN+1+$10
X	STA	CBYTE		;ASSUME NOT A DIRECTORY
X	JSR	CIOCL		;READ A FILE NAME
X	LDA	DATA+1
X	CMP	#':'
X	BCS	NOTDIR
X	CMP	#'0'
X	BCS	SCNDX
XNOTDIR	BEQ	GOTSPC
X	LDA	DATA+10
X	CMP	CBSAV
X	BNE	NOTSYS
XGOTSPC	DEC	CBYTE
XNOTSYS	LDX	FNPT
X	LDY	#2
X;
XMDN1	LDA	DATA,Y
X	CMP	#' '
X	BEQ	MDN2
X	STA	PAR,X
X	INX
X	INY
X	CPY	#10
X	BCC	MDN1
X;
XMDN2	LDA	#'.'
X	STA	PAR,X
X	INX
X	LDY	#10
XMDN3	LDA	DATA,Y
X	CMP	#' '
X	BEQ	MDN4
X	STA	PAR,X
X	INY
X	INX
X	CPY	#13
X	BCC	MDN3
XMDN4	LDA	#'.'
X	CMP	PAR-1,X
X	BNE	MDN5
X	DEX
XMDN5	LDA	#0		;TERMINATE FILE NAME
X	STA	PAR,X
X	CLC
XSCNDX	RTS
X;
XGETLIN	LDA	#LOW[DATA+3]
X	STA	FNPTR
X	STA	IBUF
X	LDA	#HIGH[DATA+3]
X	STA	FNPTR+1
X	STA	IBUF+1
X	LDA	#GETREC
X	STA	ICMD
X	LDX	#1
X	STX	ILEN+1
X	DEX
X	STX	ILEN
X	LDY	#0
X	STY	PTR
X;
XCIOCL	JSR	CIOV
X	TYA
X	BMI	CIOER1
X	RTS
XCIOER1	STY	FR0
X	LDA	#0
X	STA	FR0+1
X	JSR	IFP
X	JSR	FASCII
X	LDY	#0
X	LDA	(INBUFF),Y
X	STA	CIERC
X	INY
X	LDA	(INBUFF),Y
X	STA	CIERC+1
X	INY
X	LDA	(INBUFF),Y
X	AND	#$7F
X	STA	CIERC+2
X	JSR	ERRXIT
X	DB	'Error -- '
XCIERC	DB	'000',$9B,0
X;
XHEXDEF	LDY	DATA+3
X	CPY	#$9B
X	BNE	GETNO2
X	RTS
X;
XGETNUM	CLC
X	DB	$24	;SKIP SINGLE BYTE
X;
XGETNO2	SEC
X	ROR	TEMP2
X	JSR	NXTFLD
X	STY	VECTOR
X	STY	VECTOR+1
XGETND	LDA	(FNPTR),Y
X	INY
X	CMP	#'F'+1	;IS IT A DIGIT
X	BCS	GETNDE
X	SBC	#'0'-1	;NOTE THAT CY=0
X	BCC	GETND1
X	CMP	#10	;0-9?
X	BIT	TEMP2
X	BPL	GOT10
X	BCC	GOT1	;YES, SHIFT INTO NUMBER
X	CMP	#17	;A-F?
X	BCS	GOT16	;YES, HANDLE IT
XGETND1	SEC
X	ADC	#'0'-1
XGETNDE	STY	PTR
X	TAY
X	LDA	VECTOR
X	LDX	VECTOR+1
X	RTS
X;
XGOT10	BCS	GETND1
X	PHA
X	ASL	VECTOR
X	ROL	VECTOR+1
X	LDA	VECTOR
X	LDX	VECTOR+1
X	ASL	VECTOR
X	ROL	VECTOR+1
X	ASL	VECTOR
X	ROL	VECTOR+1
X	CLC
X	ADC	VECTOR
X	STA	VECTOR
X	PLA
X	PHP
X	CLC			;[Bob Puff]
X	ADC	VECTOR
X	STA	VECTOR
X	TXA
X	ADC	VECTOR+1
X	PLP
X	ADC	#0
X	STA	VECTOR+1
X	JMP	GETND
X;
XGOT16	SBC	#7
XGOT1	ASL	VECTOR
X	ROL	VECTOR+1
X	ASL	VECTOR
X	ROL	VECTOR+1
X	ASL	VECTOR
X	ROL	VECTOR+1
X	ASL	VECTOR
X	ROL	VECTOR+1
X	ORA	VECTOR
X	STA	VECTOR
X	JMP	GETND
X;
X; GETFN -- READ A LINE, GET FILENAME FROM IT
X;
XGETFN	LDA	#0
X	STA	DOSRNM+1
X	JSR	GETLIN
X	BEQ	WCTSTL
X;
X; GETFN2 -- EXTRACT A FILENAME FROM A LINE ALREADY READ IN
X;           X IS THE OFFSET IN THE BUFFER
X;
XGETFN2	JSR	NXTFLD
XWCTSTL	LDA	(FNPTR),Y
X	INY
X	CMP	#'?'
X	BEQ	SETWC	;IF ? OR * FOUND,
X	CMP	#'*'
X	BNE	CKEOFN	;SET FLAG, FIND FIRST MATCH
XSETWC	LDA	#0
X	STA	CPYTYP
X	BEQ	WCTSTL
X;
XCKEOFN	CMP	#$9B	;IF EOL, CONTINUE WIT SINGLE FILE
X	BEQ	FNSET
X	CMP	#'.'
X	BEQ	WCTSTL
X	CMP	#'/'
X	BCC	FNSET
X	BNE	WCTSTL
XSLSHLP	LDA	(FNPTR),Y
X	CMP	#'S'
X	BNE	NCPSYS
X	STA	CBSAV
X	BEQ	SAVED
XNCPSYS	CMP	#'X'
X	BNE	NOTSWP
X	LDA	#$80
X	STA	SWPFLG
X	BMI	SAVED
XNOTSWP	STA	OPT	;SAVE OPTION CODE
XSAVED	DEY
X	LDA	#0
X	STA	(FNPTR),Y
X	INY
X	INY
X	LDA	(FNPTR),Y
X	INY
X	CMP	#'/'
X	BEQ	SLSHLP
X	CMP	#'.'
X	BCC	FNSET
X	CMP	#$9B
X	BEQ	FNSET
X	DEY
X;
XFNSET	STY	PTR	;SAVE POINTER TO SECOND ARG.
X	DEY
X	LDA	(FNPTR),Y
X	STA	DELIM
X	LDA	#0
X	STA	(FNPTR),Y
X	TAY
X	LDA	(FNPTR),Y
X	CMP	#'0'
X	BCC	DEFDRV
X	CMP	#':'
X	BEQ	DEFDRV
X	INY
X	BCS	LKFCOL
X	TAX
X	LDA	#':'
X	CMP	(FNPTR),Y
X	BEQ	DBEFOR
X	DEY
X	STA	(FNPTR),Y
X	TXA
X	BNE	DGTCOD
X;
XLKFCOL	LDA	(FNPTR),Y ;SCAN FOR DRIVE ID
X	BEQ	DEFDRV
X	CMP	#':'
X	BEQ	DEVINC	;DEVICE INCLUDED
X	INY
X	LDA	(FNPTR),Y
X	CMP	#':'
X	BEQ	DEVINC
X;
XDEFDRV	LDA	#':'
XDGTCOD	JSR	DECFNP
XDBEFOR	LDA	#'D'
X	JSR	DECFNP
XDEVINC	LDY	FNPTR
X	LDA	FNPTR+1
X	RTS
X;
XNXTFLD	CLC
X	LDA	PTR	;MOVE INDEX TO A
X	ADC	FNPTR
X	STA	FNPTR
X	LDA	#0
X	TAY
X	ADC	FNPTR+1
X	STA	FNPTR+1
X	RTS
X;
XDECFNP	LDY	FNPTR
X	BNE	DECFP1
X	DEC	FNPTR+1
XDECFP1	DEC	FNPTR
X	INC	PTR
X	LDY	#0
X	STA	(FNPTR),Y
XGETDN1	RTS
X;
X;	REQUIRE A DISK DRIVE (NO FILE SPECIFICATION)
X;
XGETDN2	JSR	GETFN2	;GET NEXT FILE NAME
X	JMP	GETDNE	;THEN CHECK FOR DRIVE ONLY
XGETDN	JSR	GETFN
XGETDNE	STY	IBUF+$10
X	STA	IBUF+1+$10
X	LDY	#$FF
XGETDNL	INY
X	TAX
X	LDA	(FNPTR),Y
X	BNE	GETDNL
X	CPX	#':'	;ANY FILE NAME INCLUDED?
X	BEQ	GETDN1	;NO, THEN RETURN
X	JSR	ERRXIT
X	DB	'File name not allowed!',$9B,0
X;
X; UPDATE DENSITY OF DISK IN DRIVE
X;
XGETDEN	CMP	#':'
X	BNE	GTDEN2
X	LDA	DFUNIT
XGTDEN2	AND	#$0F	;MAKE UNIT BINARY
X	LDX	#0
X	STX	DAUX+1
X	INX
X	STX	DAUX
X	LDX	#LOW[TEMPBUF]
X	STX	DBUF
X	LDX	#HIGH[TEMPBUF]
X	STX	DBUF+1
X	JSR	RSEC2
X	BMI	GETDN3
X	JMP	RDCONF
X;
X;	REQUIRE A DISK FILE NAME, SAVING THE POINTER IN IOCB10
X;
XCKDSK	STY	IBUF+$10
X	STA	IBUF+1+$10
X	LDY	#0
X	LDA	(FNPTR),Y
X	CMP	#'D'
X	BEQ	GETDN3
X	JSR	ERRXIT
X	DB	'Not a disk file!',$9B,0
X;
X; WAIT FOR SOURCE DISK
X;
XCWFSD	LDA	SWPFLG
X	BMI	WFSD
XGETDN3	RTS		;IF NO WAIT REQUIRED
XWFSD	JSR	PRINT
XISD	DB	'Insert SOURCE disk, press '
X	DC	'R','E','T','U','R','N'
X	DB	0
X	JSR	CHRGET
X	BIT	SWPFLG
X	BVS	GETDN3	;IF IN DUP-DISK
X	LDX	CSRC
X;
XRESET	LDY	IOCB+1,X
X	STY	UNNO
X	LDA	IAUX+5,X
X	BEQ	NOCHG
X	CMP	#3
X	BCS	NOCHG
XSETDEN	STA	DKTYPE-1,Y
X	LDX	#15
XSAVMAP	LDA	MAPBUF,X
X	STA	SAXMAP,X
X	DEX
X	BPL	SAVMAP
X	JSR	DOFSIN
X	LDX	#15
XRSTMAP	LDA	SAXMAP,X
X	STA	MAPBUF,X
X	DEX
X	BPL	RSTMAP
X;
XNOCHG	RTS
X;
XSAXMAP	DB	0,0,0,0,0,0,0,0
X	DB	0,0,0,0,0,0,0,0
X;
X;  RECONFIGURE DENSITY OR CONFIGURATION
X;
XDOFSIN	LDX	#9
XDOFLOP	LDA	WOTDCB,X
X	STA	DUNIT+1,X
X	DEX
X	BPL	DOFLOP
X	LDX	#$31
X	STX	DUNIT-1
X	LDX	UNNO
X	STX	DUNIT		;TELL SIO DRIVE TO CONFIGURE
X	LDY	DKTYPE-1,X	;GET DENSITY/SECTOR SIZE
X	LDA	DRVDEF-1,X	;GET DRIVE SPECIFICATION
X	JMP	CONFIGR		;GO CONFIGURE DRIVE
X;
X;	SET UP PAR AND IOCB10 FOR A DIRECTORY SCAN (MULTI-FILE ACTIVITY)
X;
XSETSCN	STA	ICMD+$20
X	LDA	#LOW[PAR]
X	LDX	#HIGH[PAR]
X	STA	IBUF+$20
X	STX	IBUF+1+$20
X	JSR	SETPTR
X	LDX	#$10	;OPEN IOCB10 AS DIRECTORY
X;
XOPDIR	LDA	#6	;OPEN IOCB AS DIRECTORY
X	STA	IAUX,X
X;
X; OPEN A FILE INDEPENDENT OF DRIVE DENSITY
X;
XANYDEN	LDA	#0
X	STA	IAUX+1,X
X	STA	IAUX+5,X
X	LDA	#OPEN
X	JSR	SCMD
X	BPL	SAVDEN
X	JMP	CIOER1
X;
XSAVDEN	LDY	DUNIT
X	LDA	DKTYPE-1,Y
X	STA	IAUX+5,X
X	RTS
X;
X; SET UP 'PAR' FOR A WILD CARD COPY
X;
XDEFPAR	JSR	SETPTR
X	LDA	(FNPTR),Y
X	BNE	DEFPX
X	STA	CPYTYP
X	STA	PAR+2,Y
X	LDA	#'*'
X	STA	PAR,Y
X	STA	PAR+1,Y
X	lda	#$9B		;termination!!!
X	sta	PAR+2,Y		;[Bob Puff]
XDEFPX	RTS
X;
XSETPTR	LDY	#$FF
XSETLP1	INY
X	LDA	(FNPTR),Y
X	STA	PAR,Y
X	BNE	SETLP1
XSETLP2	DEY
X	LDA	PAR,Y
X	cmp	#'>'		;account for sparta type
X	beq	SETLP3		;[Bob Puff]
X	CMP	#':'
X	BNE	SETLP2
XSETLP3	INY
X	STY	FNPT
X	RTS
X;
X; REPORT ERROR, THEN RETURN TO MENU
X;
XERRXIT	PLA
X	STA	RAMLO
X	PLA
X	STA	RAMLO+1
X	JSR	PRTENT	;WRITE ERROR MESSAGE FOLLOWING 'JSR ERRXIT'
X	JMP	MENUSL	;THEN RETURN TO MENU
X;
XDOSRNM	DB	'D',0,':',$60,'OS.SYS,'
XCKDTST	DB	'DOS.SYS',0
SHAR_EOF
#	End of shell archive
exit 0
===========================================================================
Charles Marslett
STB Systems, Inc.  <== Apply all standard disclaimers
Wordmark Systems   <== No disclaimers required -- that's just me
chasm@killer.dallas.tx.us

chasm@killer.DALLAS.TX.US (Charles Marslett) (06/26/89)

The assembler I just posted uses the disk IOCBs like they were going out of
style if you use the INCLUDE directive (and I do in MYDOS).  To write a listing
to a disk file, you have to have 4 file buffers allocated in the DOS you are
running A65 under.

Good luck, and enjoy,

===========================================================================
Charles Marslett
STB Systems, Inc.  <== Apply all standard disclaimers
Wordmark Systems   <== No disclaimers required -- that's just me
chasm@killer.dallas.tx.us