Path: utzoo!attcan!utgpu!jarvis.csri.toronto.edu!rutgers!mit-eddie!killer!chasm From: chasm@killer.DALLAS.TX.US (Charles Marslett) Newsgroups: comp.sys.atari.8bit Subject: MYDOS 4.51 source posting Keywords: DOS MYDOS A65 SOURCE Message-ID: <8452@killer.DALLAS.TX.US> Date: 24 Jun 89 16:28:48 GMT Organization: The Unix(R) Connection, Dallas, Texas Lines: 2973 # 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