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