GL!V+ BACKUP.SYSTEMZyL BACKUP.SYSTEMX#X#< ,#< ,0" C ث$/] ʎ ƹ" ! L.0Ly " H h( 0 " "ϝH hD0 "  u !׾־ *! ! !־׾  ϩIL `" L!H)JhjJJJJݦ#9ee#"#"#""""" ~! ~!`  "L~!}""`$ k"#L!$ "eͦ#ҩ$ Y"߅$ Y"셈$ Y"셉憆ݳ# $L!$ "ƪ#L"$ "eͨ#֥ Ɉɍ񥋦* ` " i ` " s )(` " w )(` ɍɈ`12)ō8`2)`ҠŠŠĠӠݍĭͭӠ͠ӠȍĠˠӍӠ٠٠ϠԠϠέŠɯϠҍӠ٠٠ϠԠϠ d (2ЭԠȠҬ٠٠ΠРӠՠήԠӬӬĠӬĠ٠РӠΠϠŠĠӠŠĠ٠ǠŠȭԠŠҠΠөƠŠ̠ҠˠέǠҠϠŠĠΠӠŠӠǠĠЬŠĠ٠ŠȠŠנӠĠǠŠԠŠ̠ŠŠӠӠɮŮӬ̬ӠݠٮΠĠϠҠŠĠЯͩӠŠӠŠΠŠŠҠŠŠӠ٠ŠŠǠӠ٠ɮŮԠӠ٠٠ϠΠϠΠՠ X g C ث 9 [ɛ֥ ,+lL  W뤞  Rϭ)Rо   )LR/ ⾰ u FLRLUh   @ܭ¾ Π & LOL ! W뤞  Cɛ֤. &  & a` L$L C 뫩  ﯰ @'L Ġ. &  謰 ǩ 謰 *  謰LL f 뫩  C奓 a` © & LPL  뫩  C} ٠ & `a LU 찭TLL 뫠 G [ɛڥ g0 eL@ / X`Ɠ0 La ̰ɋɊ` ʆLo 䔐Lo$e [ ȱȱ ĕ ` X ` XW %HJ &h [` [$  ` [$ ɹ ` uѾԾҾվ 8ѾԾH` ` ̾ξ; ̾`̾ξ; ̾`߾ᾌ ޾`˾ʾ ɾ`BC)pJJJJ ȱGFEDl'8` `` Ww ' 8` [$ : ` ) 8 L/侩Ѝ ⾰ک義Ѝ 徰ȭ꾍쾍+ 뾰#ᄅLg$0)ġ 0ei 뾰椭)ƢƣşЮ )L L ꥥFP B `% [ɛ`羌澩 龩辮S?S& 徍@꾍쾍 *   * ` `F ` [ B  ǯm ڥ` m ̯𾥓`L D%i [ɛ`Lί (% i [ɛ`*L>   L ɍ7ɛ= Ɉ $L i [ڮ )L `8` i w `ې8`ɴ ɰɺ8`ɮɯ8`H h(` ɛ `$()? @($0 H(hɕ` ɍɛɈɕɋɊ`)` A A( Y T(08Ʊ 殥#֩' /` n ti毥0 ѱ ѱ ѱHh (Ű'`  Ʊ  Ʊ8`0ߩƯ̥ ưư`x)p,HhHh݌'`݌X`( Y`8,Ii&F&K L IƳꥮ`V `  Ʊ' /`O꽌ɪɖ*%E 꽌I'` I꽌ɪWɭ焳ɖʈij+80d݌Hh ݴ ݴ݌ ﴩ ﴩ ﴥ ޴ ޴ ޴EEHJh  ﴩ ﴩ LѴ+80RHhHh ﴩ ﴩ ﴠW 󴩪 ﴩ ﴩ ﴽ`HJ݌h ꦫꝍ݌`؆C)pJJJJ IHȱHWHBKJ vGF }v#NKMLeNMMJ QL.LL׈L5ȱLFȱLGKJMLONP KKPPLFNGFL X0GFKJEDlHŠϠĠӠ&PRODOS ' @U*Vŷٷˁ%'(+.@BCDEFGHIJKLMNPQRSUVWX-/%:JawJJJƄwΠϠΠԠϠӠРԠנŠҍРˠϠŭŠŠϠ˭ԠŠˠŠŠŠŠԭԠŠōԠԠōҠźҠźԠŠϠōŠ٠ӠŠԿٯŠ˿ٯԠ΍ǠǠǠǠԠŠנӠĠݠϠΠ͠ɯϠŠԠŠȯŨөԠŠؠҠˠĠƠӠŨөԠӠŠůŠ F  E D D I 0 A E 3 A E   1 O C  E D L5 BC 0 0P D3 D 6   E 0 A 0 ' ; 0 A 0 C B 3 MD 4 5 B 5A ԠŠԠŠԠŠԠŠԠŠԠŠԠŠԠŠԠŠԠŠԠŠԠŠԠŠԠŠԠŠԠŠL" 0@P`pмԠנ̮  GL mV+3 BU.LABELSZ SBTL 'BACKUP.SYSTEM VARIABLES' ; ;MNEMONICS ; VERSION EQU $22 DISK.II EQU $00 ;DISK II ID BYTE DISK3.5 EQU $0B ;UNIDISK 3.5 ID BYTE DD.STAT EQU $00 ;DEVICE DRIVER COMMANDS DD.READ EQU $01 DD.WRITE EQU $02 DD.FRMT EQU $03 MSB EQU %10000000 ;MOST SIGNIFICANT BIT NOT EQU -1 ;NEGATIVE ONE BELL EQU $87 ;ASCII BELL CONTROL CHARACTER BACKSPC EQU $88 ;BACKSPACE LEFT.ARW EQU $88 ;LEFT ARROW DOWN.ARW EQU $8A ;RIGHT ARROW UP.ARW EQU $8B ;UP ARROW RETURN EQU $8D ;CARRIAGE RETURN CNTL.U EQU $95 ;CONTROL-U RT.ARW EQU $95 ;RIGHT ARROW ESCAPE EQU $9B ;ESCAPE SPACE EQU $A0 ;SPACE BAR SLOTMASK EQU %01110000 ;PRODOS MASK FOR SLOT VALUE IOMASK EQU $C0 BCKUP.FT EQU $F8 ;FILETYPE USED TO MARK BACKUP FILES ; ;ZERO.PAGE ; DSECT ORG $0080 ; CR.FLG DS 1 ;CARRIAGE RETURN PRESSED FLAG ; MOD.DAY DS 1 ;NEW.DATE VARIABLES MOD.MONTH DS 1 MOD.YEAR DS 1 ; DB.1 DS 1 DB.2 DS 1 MB.0 DS 1 MB.1 DS 1 MB.2 DS 1 MB.3 DS 1 M.SRCH.C DS 1 ;MONTH SEARCH COUNTER YB.1 DS 1 YB.2 DS 1 ; DRVTYPE DS 1 ;DRIVE TYPE TO SEARCH FOR ; MLINE1 DS 1 ;LINE ONE OF MENU MENU.I1 DS 2 ;MENU INDEX TABLE POINTER MENU.I2 DS 2 ;MENU DATA TABLE POINTER MENU.I3 DS 1 ;MENU RETURNED VALUE MENU.CNT DS 1 ;MENU SCRATCH STORAGE ME.LEN DS 1 ;LENGTH OF MENU LINE TEXT TEMP1 DS 1 ;SCRATCH STORAGE MENU.DF DS 1 ;MENU DEFAULT OPTION MM.DF DS 1 ;MAIN MENU DEFAULT D3.DF DS 1 ;UNIDISK 3.5 DEFAULT D5.DF DS 1 ;DISK II DEFAULT JUMP DS 2 ;JUMP VECTOR BR.SRC DS 1 ;BACKUP/RESTORE SOURCE SELECTION BR.TGT DS 1 ;BACKUP/RESTORE TARGET SELECTION SRCH.FT DS 1 ;SEARCH FOR WHAT FILE TYPE? E.LEN DS 1 ;DIRECTORY ENTRY LENGTH E.P.BLK DS 1 ;ENTRIES PER DIRECTORY BLOCK FILE.CNT DS 2 ;ACTIVE FILES IN DIRECTORY EPB.CNTR DS 1 ;ENTRIES PER BLOCK COUNTER FNAME.I DS 1 ;FILENAME INDEX FNAME.T DS 2 ;FILENAME TABLE POINTER FNC.P DS 2 ;FILENAME COPY ROUTINE POINTER RCSAVE DS 1 ;RDCHAR TEMPERARY STORAGE SLOT DS 1 ;SLOT NUMBER * 16 VOLUME DS 1 ;VOLUME NUMBER TO FORMAT 5.25" DISKS CUR.TRK DS 1 ;CURRENT TRACK ORDR.TRK DS 1 ;ORDERED TRACK SECTOR DS 1 ;SECTOR NUMBER SYNC DS 1 ;SYNC GAP SIZE RETRIES DS 1 ;RETRY COUNTER SCRATCH1 DS 1 ;FOR SCRATCH SCRATCH2 DS 1 ;FOR SCRATCH FND.TBL EQU * ;RDADR DATA TABLE CHKFND DS 1 ;CHECKSUM FOUND SECFND DS 1 ;SECTOR NUMBER FOUND TRKFND DS 1 ;TRACK NUMBER FOUND VOLFND DS 1 ;VOLUME NUMBER FOUND CHKTBL DS 16 ;FORMAT5 SECTOR CHECK TABLE DEND ; CH EQU $24 ;CURSOR - HORIZONTAL CV EQU $25 ;CURSOR - VERTICAL BAS EQU $28 ;CURRENT LINE BASE ADDRESS A1 EQU $3C ;16-BIT ACCUMULATOR #1 DD.CMD EQU $42 ;DEVICE DRIVER PARAMETER TABLE DD.UNIT EQU $43 DD.BUFR EQU $44 DD.BLK EQU $46 SLOTVEC EQU $48 BUFR.P EQU $4A DEP EQU $4C DES EQU $4E IBP.1 EQU $4C IBP.2 EQU $4E IBP.3 EQU $50 ; ;MAIN MEMORY ; PN.BUFR EQU $0280 ;PATHNAME BUFFER V5.BUFR EQU $02C0 ;DISK II VOLUMENAME V3.BUFR EQU $02D0 ;UNIDISK 3.5 VOLUMENAME SOFTVEC EQU $03F2 ;RESET SOFTVEC PWREDUP EQU $03F4 ;RESET POWERED-UP BYTE TXTLINE EQU $05AE TEXTPG2 EQU $0800 ;TEXTPAGE #2 BASE ADDRESS FILEBUFR EQU $0C00 ;PRODOS FILE BUFFER DATABUFR EQU $1000 ;BACKUP.SYSTEM DATA BUFFER DIR.BUFR EQU $1E00 GO.PDOS EQU $2000 ; ;MLI GLOBAL PAGE ; MLI EQU $BF00 ;PRODOS MLI ENTRY POINT ERROR.P EQU $BF0F ;PRODOS KERNAL ERROR CODE DEVNUM EQU $BF30 ;DEVICE NUMBER OF LAST USED DEVICE DEVCNT EQU $BF31 ;COUNT OF SENSED PRODOS DEVICES (-1) DEVLIST EQU $BF32 ;LIST OF SENSED PRODOS DEVICES BITMAP EQU $BF58 ;MAIN MEMORY BITMAP DATE EQU $BF90 ;PRODOS GLOBAL PAGE DATESTAMP LEVEL EQU $BF94 ;CURRENT FILE LEVEL IBAKVER EQU $BFFC ;MINIMUM COMPATABLE PRODOS VERSION IVERSION EQU $BFFD ;CURRENT PRODOS VERSION ; ;MLI.CALLS ; QUIT.C EQU $65 ;QUIT RDBLK.C EQU $80 ;READ_BLOCK WRBLK.C EQU $81 ;WRITE_BLOCK G.TIME.C EQU $82 ;GET_TIME CREATE.C EQU $C0 ;CREATE DSTRY.C EQU $C1 ;DESTROY RENAME.C EQU $C2 ;RENAME SFI.C EQU $C3 ;SET_FILE_INFO GFI.C EQU $C4 ;GET_FILE_INFO ONLINE.C EQU $C5 ;ONLINE SETPFX.C EQU $C6 ;SET_PREFIX GET.PFX.C EQU $C7 ;GET_PREFIX OPEN.C EQU $C8 ;OPEN RDFILE.C EQU $CA ;READ WRFILE.C EQU $CB ;WRITE CLOSE.C EQU $CC ;CLOSE SMARK.C EQU $CE ;SET_MARK ; ;MLI.RETURNS ; NO.E EQU $00 ;NO_ERROR IO.E EQU $27 ;I/O_ERROR WP.E EQU $2B ;WRITE_PROTECTED_ERROR FNF.E EQU $46 ;FILE_NOT_FOUND DF.E EQU $48 ;DISK_FULL NP.E EQU $52 ;NOT_PRODOS ; ;IO.ADDRESSES ; KBD EQU $C000 ;KEYBOARD KBDSTRB EQU $C010 ;KEYBOARD FLAG RESET TPG1.SS EQU $C054 ;SELECT TEXTPAGE 1 SOFTSWITCH TPG2.SS EQU $C055 ;SELECT TEXTPAGE 2 SOFTSWITCH SETROME2 EQU $C081 ;SELECT ROM, WRITE-ENABLE RAMCARD ; IWMPHASE EQU $C080 ;STEPPER MOTOR PHASES MOTOROFF EQU $C088 ;TURN DRIVE MOTOR OFF MOTORON EQU $C089 ;TURN DRIVE MOTOR ON DRIVE1 EQU $C08A ;SELECT DRIVE 1 DRIVE2 EQU $C08B ;SELECT DRIVE 2 IWMSTRB EQU $C08C ;DATA STROBE IWMLATCH EQU $C08D ;DATA LATCH IWMREAD EQU $C08E ;SET IWM TO READ IWMWRITE EQU $C08F ;SET IWM TO WRITE ; ;ROM/LC.ADDRESSES ; SETTEXT EQU $FB2F ;SET TEXT MODE TABV EQU $FB5B ;MOVE TO LINE NUMBER IN ACCUMULATOR HOME EQU $FC58 ;CLEAR THE SCREEN CLREOP EQU $FC42 ;CLEAR TO END OF PAGE CLREOL EQU $FC9C ;CLEAR TO END OF LINE WAIT EQU $FCA8 ;MONITOR WAIT ROUTINE COUT EQU $FDED ;OUTPUT A CHARACTER MOVE EQU $FE2C ;MOVE A RANGE OF BYTES SETINV EQU $FE80 ;SET INVERSE VIDEO SETNORM EQU $FE84 ;SET NORMAL VIDEO SETKBD EQU $FE89 ;SET KEYBOARD AS INPUT DEVICE SETVID EQU $FE93 ;SET VIDEO SCREEN AS OUTPUT DEVICE ; GLV+3 BU.LAUNCHERZ; SBTL 'BACKUP.SYSTEM LAUNCHER' ; ORG $2000 ; JMP BU.3.5 ; MSB OFF BACKUP STR 'BACKUP.SYSTEM' DS BACKUP-*+16,0 ; BU.3.5 CLD CLI LDX #$FF TXS ;SET STACK POINTER TO $01FF LDY #17 ;LENGTH OF BITMAP (-1) BITMAP.L LDA BITMAP.I,Y ;UPDATE PRODOS GLOBAL PAGE BITMAP STA BITMAP,Y DEY BPL BITMAP.L LDY #7 MVTPG2.L LDA TXTPG2.I,Y ;MOVE HELPSCREEN TO TEXTPAGE 2 STA A1,Y DEY BPL MVTPG2.L LDY #0 JSR MOVE LDY #7 MVBKUP.L LDA BACKUP.I,Y ;MOVE BACKUP.SYSTEM TO STA A1,Y ; FINAL DESTINATION DEY BPL MVBKUP.L LDY #0 JSR MOVE LDA DEVNUM ;SAVE CURRENT DEVICE STA DEVNUM.B LDA #0 ;UPDATE PRODOS GLOBAL PAGE STA LEVEL ; FILE LEVEL AND STA IBAKVER ; MINIMUM COMPATABLE PRODOS KERNEL LDA #VERSION STA IVERSION ; AND CURRENT PRODOS KERNEL JSR HOME40 ;CLEAR THE SCREEN JSR P.COPR ;PRINT THE TITLE PAGE LDX PN.BUFR INX FNDSLASH DEX ;SET THE PREFIX BEQ TST4DEV ;NO PREFIX TO SET.. LDA #'/' EOR PN.BUFR,X ;FIND LAST SLASH ASL A ;(DIRECTORY DELIMITER) BNE FNDSLASH DEX ;AND SET POINTER JUST STX PN.BUFR ;BEFORE IT JSR MLI ;NOW SET THE PREFIX DFB SETPFX.C DW KBD.PFX BCC TST4DEV ; IO.ERR LDY #IOERR-L.MSGS ;PRINT I/O ERROR MESSAGE ERROR2 JSR P.LMSGS JSR RDKEY JMP QUIT3 ; NO5.25 EQU * NO3.5 LDY #NODEV-L.MSGS ;PRINT DISK TYPE ERROR MESSAGE JMP ERROR2 ; TST4DEV LDX #0 LDA #DISK.II JSR DEVTYPE BCS NO5.25 GETNXT5 STA DEVLST5,X ;COMPILE LIST OF DISK II DRIVES STX DEVCNT5 PHA TXA ASL A TAX PLA STA DISK5.T,X LDX DEVCNT5 INX DEY BMI GET3 JSR NEXTDEV BCC GETNXT5 GET3 LDX #0 LDA #DISK3.5 JSR DEVTYPE BCS NO3.5 GETNXT3 STA DEVLST3,X ;COMPILE LIST OF UNIDISK 3.5 DRIVES STX DEVCNT3 PHA TXA ASL A TAX PLA STA DISK3.T,X LDX DEVCNT3 INX DEY BMI GETDATE JSR NEXTDEV BCC GETNXT3 ; GETDATE LDX #BACKUP JSR DO.GFI J.IOE BCS IO.ERR JSR GET.TIME LDX DATE+1 ;CHECK THE GLOBAL PAGE LDA DATE BNE USE.DS ;USE IT... LDX GFI.P+11 ;CHECK THE MOD_DATE LDA GFI.P+10 BEQ NO.DATE ;NEITHER VALID... USE.DS JSR UNPACK ;UNPACK THE DATA NO.DATE LDY #REQ.DATE-L.MSGS JSR P.LMSGS ;PRINT DATE PROMPT JSR NEW.DATE ;GET THE DATE INPUT LDA #0 STA GFI.P+10 STA GFI.P+11 LDX #BACKUP JSR DO.SFI BCS J.IOE LDA #>COLDSTRT ;SET THE SOFTSTART VECTOR STA SOFTVEC LDA #00-*,0 MSB ON DT2 EQU * DS >17-*,SPACE ASC '-HELP-' DS >80-*,SPACE ASC 'START WITH A LETTER, MAY ONLY CONTAIN' DS >173-*,SPACE ASC 'BACKUP 3.5 IS MENU DRIVEN. MOST' DS >208-*,SPACE ASC 'LETTERS, NUMBERS, AND PERIODS, AND MAY' DS >5-*,SPACE ASC 'BACKUP 3.5 IS WRITTEN TO SAVE AND' DS >40-*,SPACE ASC 'OPTIONS ARE SELECTED BY MOVING THE HIGH-' DS >80-*,SPACE ASC 'NOT BE LONGER THAN 15 CHARACTERS). IF A' DS >128-*,SPACE ASC 'RESTORE ALL 16 SECTOR / 35 TRACK NON-' DS >168-*,SPACE ASC 'LIGHTING BAR TO THE DESIRED SELECTION' DS >208-*,SPACE ASC 'PRODOS DISKETTE IS BEING BACKED UP, THE' DS >0-*,SPACE ASC 'PROTECTED 5.25" MINIFLOPPY DISKETTE' DS >40-*,SPACE ASC 'WITH THE ARROW KEYS AND PRESSING THE' DS >80-*,SPACE ASC 'DEFAULT FILENAME WILL BE THE DISKETTES' DS >128-*,SPACE ASC 'FORMATS (I.E. PRODOS, PASCAL, DOS 3.3' DS >168-*,SPACE ASC '[RETURN] KEY. WHEN REQUESTED TO ENTER' DS >208-*,SPACE ASC 'VOLUMENAME' DS >0-*,SPACE ASC 'AND CP/M) AS A SINGLE PRODOS FILE ON A' DS >40-*,SPACE ASC 'THE NAME FOR THE DISKETTE - PRODOS' DS >128-*,SPACE ASC '3.5" MICROFLOPPY DISKETTE' DS >168-*,SPACE ASC 'FILE NAMING CONVENTIONS APPLY (I.E. MUST' DS >210-*,SPACE ASC 'PRESS ANY KEY TO RETURN TO MAIN MENU' DS >0-*,SPACE ; GL6V+hBU.MAINZ SBTL 'BACKUP.SYSTEM MAIN PROGRAM' ; ;BACKUP 3.5 MAIN PROGRAM BODY ; ; DS >00-*,0 ; BU.IMAGE EQU * ; ORG $A800 BU.MAIN EQU * ; MM.ERR JSR SYS.ERR MM.COLD CLD ;CLEAR THE DECIMAL FLAG CLI ;CLEAR THE INTERUPT FLAG LDA #0 ;RESET MENU DEFAULTS STA MM.DF STA D3.DF STA D5.DF JSR CLS.ALL BCS MM.ERR MM.ENTRY LDX #$FF ;RESET THE STACK POINTER TXS JSR HOME40 ;CLEAR THE SCREEN JSR P.COPR ;PRINT THE COPYRIGHT LDY #SOPROMPT-PROMPT LDA #4 JSR P.PROMPT ;PRINT "SELECT OPTION" JSR P.AK ;PRINT ARROW KEY PROMPT LDA #MMTABLE STA MENU.I1 LDA MM.DF STA MENU.DF LDY #5 LDA #MMTE-MMTB/2 JSR DO.MENU ;PRINT MAIN MENU CMP #ESCAPE BEQ MM.ENTRY ;IF ESCAPE PRESSED THEN... LDA MENU.I3 ;ELSE USE RETURN VALUE, STA MM.DF ASL A ;AS INDEX TO SUBROUTINE TAX LDA MMTB+1,X STA JUMP+1 LDA MMTB,X STA JUMP JMP (JUMP) ; ;BACKUP ROUTINE ; BU.ESC JMP MM.ENTRY ;RETURN TO MAIN MENU BU.ERR JSR SYS.ERR BU.ENTRY LDA #0 STA COPYDIR ;SET COPY DIRECTION LDY #BUTITLE-TITLE JSR P.TITLE ;PRINT BACKUP TITLE JSR REQ.ST ;GET SOURCE AND TARGET DRIVES BCS BU.ESC LDY BR.TGT LDA DEVLST3,Y STA DEVNUM3 ;CONVERT SOURCE TO DRIVE NUMBER LDY BR.SRC LDA DEVLST5,Y STA DEVNUM5 ;CONVERT TARGET TO DRIVE NUMBER LDX #V5.BUFR JSR D.ONLINE ;GET VOLUMENAME OF SOURCE CMP #NP.E BEQ NBUE ;IF NOT PRODOS, SKIP IT CMP #1 BCS BU.ERR NBUE LDA V5.BUFR AND #%00001111 STA V5.BUFR BNE VPV5 ;VALID PRODOS NAME... LDA V5.BUFR+1 ;IF NOT, CHECK ERROR CODE CMP #NP.E ;IF NOT PRODOS, SKIP IT BNE BU.ERR VPV5 JSR GETVOL ;GET DISK ][ VOLUME NUMBER BCS BU.ERR LDA VOLFND ;COPY IT TO GLOBAL PAGE STA VOLNUM JSR REQ.FN ;REQUEST INPUT BCS BU.ENTRY LDA DEVNUM3 LDX #V3.BUFR+1 JSR D.ONLINE ;GET UNIDISK 3.5 VOLUMENAME BCS BU.ERR LDA V3.BUFR+1 AND #%00001111 BNE VPV3 LDA V3.BUFR+2 BU.ERR1 JMP BU.ERR MSB OFF VPV3 TAX INX INX STX V3.BUFR LDA #'/' STA V3.BUFR+1 ;CONVERT TO PREFIX FORMAT STA V3.BUFR,X JSR MLI ;SET THE PREFIX TO THE UNIDISK 3.5 DFB SETPFX.C DW SETPFX.P BCS BU.ERR1 LDX #V5.BUFR JSR DO.GFI ;CHECK IF FILE EXISTS BCC DSTRY.FN CMP #FNF.E ;IF FILE_NOT_FOUND, BEQ DO.COPY ; EVERYTHINGS OKAY... BU.ERR2 JMP BU.ERR MSB ON BU.E1 JMP BU.ENTRY DSTRY.FN LDY #FEPROMPT-PROMPT LDA #23 JSR P.PROMPT ;REPORT FILE EXISTS JSR RD.YN BCS BU.E1 LDX #V5.BUFR JSR D.DSTRY ;DESTROY IT BCS BU.ERR2 DO.COPY LDX #V3.BUFR JSR CADS ;GET AVAILABLE DISK SPACE BCS BU.ERR2 LDA VOLNUM STA CREATE.P+5 ;SAVE DISK ][ VOLUME NUMBER IN DIRECTORY JSR MLI ;CREATE FILE ON UNIDISK 3.5 DFB CREATE.C DW CREATE.P BCS BU.ERR2 LDY #CBMSG-MSGS LDA #23 JSR P.MSG ;REPORT COPYING BLOCKS LDX #V5.BUFR JSR COPY ;DO THE COPYING BCS BU.ERR2 JMP BU.ESC ;AND RETURN TO MAIN MENU ; ;RESTORE.ROUTINE ; RS.ESC JMP MM.ENTRY ;RETURN TO MAIN MENU RS.ERR JSR SYS.ERR RS.ENTRY LDA #2 STA COPYDIR ;SET COPY DIRECTION LDY #RSTITLE-TITLE JSR P.TITLE ;PRINT RESTORE TITLE JSR REQ.ST ;REQUEST SOURCE AND TARGET DRIVES BCS RS.ESC LDY BR.TGT LDA DEVLST5,Y STA DEVNUM5 ;CONVERT TARGET TO DRIVE NUMBER LDY BR.SRC LDA DEVLST3,Y STA DEVNUM3 ;CONVERT SOURCE TO DRIVE NUMBER LDY #BCKUP.FT JSR SEARCH ;SEARCH FOR "BACKUP" FILES BCS RS.ENTRY CMP #ESCAPE BCS RS.ENTRY LDY MENU.I3 LDA VOLNUM.T,Y STA VOLNUM ;GET TARGET VOLUME NUMBEER LDY #FDMSG-MSGS LDA #23 JSR P.MSG ;REPORT FORMATTING TARGET DISK JSR FORMAT5 ;DO THE FORMATTING BCS RS.ERR LDY #CBMSG-MSGS LDA #23 JSR P.MSG ;REPORT COPYING BLOCKS LDA MENU.I3 ASL A TAY LDA FN.T+1,Y TAX LDA FN.T,Y TAY JSR COPY ;AND DO THE COPYING BCS RS.ERR JMP RS.ESC ;AND RETURN TO MAIN MENU ; ;FORMAT UNIDISK 3.5 ROUTINE ; F3.ESC JMP MM.ENTRY F3.ERR JSR SYS.ERR F3.ENTRY LDY #F3TITLE-TITLE JSR P.TITLE ;PRINT FORMAT STORAGE DISK MENU LDA #2 JSR REQ.D3T ;GET TARGET DISK BCS F3.ESC LDY MENU.I3 LDA DEVLST3,Y STA DEVNUM3 ;CONVERT TO DRIVE NUMBER JSR REQ.VN ;GET VOLUMENAME BCS F3.ENTRY LDA DEVNUM3 LDY #DD.STAT JSR DO.DD ;GET DEVICE STATUS BCS F3.ERR CPY #<1600 BNE NOT1600 CPX #>1600 BEQ IS1600 NOT1600 LDA #IO.E JMP F3.ERR ; IS1600 LDY #IDPROMPT-PROMPT LDA #23 JSR P.PROMPT ;ASK TO DESTROY IT JSR RD.YN BCS F3.ENTRY LDY #FDMSG-MSGS LDA #23 JSR P.MSG ;REPORT FORMATING DISK LDY #DD.FRMT LDA DEVNUM3 JSR DO.DD BCS F3.ERR JSR ZEROBUFR LDY #0 CPYBOOT0 LDA BOOT1,Y STA DATABUFR,Y INY BNE CPYBOOT0 CPYBOOT1 LDA BOOT1+256,Y STA DATABUFR+256,Y INY BNE CPYBOOT1 LDX #<0 LDY #>0 LDA DEVNUM3 JSR DO.WRBLK F3.ERR1 BCS F3.ERR JSR ZEROBUFR LDY #1600/8-1 LDA #$FF MAKE.BM STA DATABUFR,Y DEY BNE MAKE.BM LDA #%00011111 STA DATABUFR LDX #<1 LDY #>1 LDA DEVNUM3 JSR DO.WRBLK BCS F3.ERR1 JSR ZEROBUFR LDY #VDH.END-VDH-1 CPY.VDH LDA VDH,Y STA DATABUFR,Y DEY BPL CPY.VDH LDY #3 CPY.CDT LDA DATE,Y STA DATABUFR+$1C,Y DEY BPL CPY.CDT LDY V5.BUFR CPY.VNM LDA V5.BUFR,Y STA DATABUFR+4,Y DEY BPL CPY.VNM ORA #%11110000 STA DATABUFR+4 LDX #<2 LDY #>2 LDA DEVNUM3 JSR DO.WRBLK BCS F3.ERR1 JMP F3.ESC ; ;RENAME FILE ROUTINE ; RN.ESC JMP MM.ENTRY ;RETURN TO MAIN MENU RN.ERR JSR SYS.ERR RN.ENTRY LDY #RNTITLE-TITLE JSR P.TITLE ;PRINT RENAME MENU LDA #2 JSR REQ.D3S ;GET SOURCE DISK BCS RN.ESC LDY MENU.I3 LDA DEVLST3,Y STA DEVNUM3 ;CONVERT TO DRIVE NUMBER LDY #BCKUP.FT JSR SEARCH ;SEARCH FOR "BACKUP" FILES BCS RN.ENTRY LDA MENU.I3 ;USE RETURNED VALUE ASL A TAX LDA FN.T+1,X ;AS INDEX INTO FILENAME TABLE STA RENAME.P+2 STA FNC.P+1 LDA FN.T,X STA RENAME.P+1 STA FNC.P LDY #15 FNC.L LDA (FNC.P),Y STA V5.BUFR,Y DEY BPL FNC.L JSR REQ.FN ;ASK FOR A NEW ONE BCS RN.ENTRY LDA #V5.BUFR STA RENAME.P+3 LDY #RNMSG-MSGS LDA #23 JSR P.MSG ;REPORT RENAMEING FILE JSR MLI ; AND RENAME THE FILE DFB RENAME.C DW RENAME.P BCS RN.ERR JMP RN.ESC ;AND RETURN TO MAIN MENU ; ;DELETE FILE ROUTINE ; D.ESC JMP MM.ENTRY ;RETURN TO MAIN MENU D.ERR JSR SYS.ERR D.ENTRY LDY #DTITLE-TITLE JSR P.TITLE ;PRINT DELETE TITLE LDA #2 JSR REQ.D3S ;REQUEST SOURCE DISK BCS D.ESC LDY MENU.I3 LDA DEVLST3,Y STA DEVNUM3 ;CONVERT SOURCE TO DRIVE NUMBER LDY #BCKUP.FT JSR SEARCH ;SEARCH FOR BACKUP FILES BCS D.ENTRY LDY #DIPROMPT-PROMPT LDA #23 JSR P.PROMPT ;ASK TO DESTROY IT JSR RD.YN BCS D.ENTRY LDY #DMSG-MSGS LDA #23 JSR P.MSG ;REPORT DELETEING FILE LDA MENU.I3 ASL A TAX LDA FN.T,X TAY LDA FN.T+1,X TAX JSR D.DSTRY ;DELETE THE FILE BCS D.ERR JMP D.ESC ; ;HELP ROUTINE ; H.ENTRY LDA TPG2.SS ;SWITCH IN TEXT SCREEN TWO JSR RDKEY ;WAIT FOR KEYPRESS LDA TPG1.SS ;SWITCH IN TEXT SCREEN ONE JMP MM.ENTRY ;RETURN TO MAIN MENU ; ;QUIT ROUTINE ; Q.ESC JMP MM.ENTRY ;RETURN TO MAIN MENU Q.ENTRY LDY #QTITLE-TITLE JSR P.TITLE ;PRINT QUIT TITLE LDY #SOPROMPT-PROMPT LDA #2 JSR P.PROMPT ;PRINT "SELECT OPTION" LDA #QTABLE STA MENU.I1 LDA #0 STA MENU.DF LDY #3 LDA #2 JSR DO.MENU ;PRINT QUIT MENU CMP #ESCAPE BEQ Q.ESC ;IF [ESCAPE]... LDA MENU.I3 BEQ Q.ESC ;IF RETURN TO MAIN MENU... QUIT3 DEC PWREDUP JSR CLS.ALL LDA DEVNUM.B STA DEVNUM ;RESET DEVICE NUMBER JSR MLI ;EXIT THROUGH QUIT.CODE DFB QUIT.C DW QUIT.P QHALT JMP QHALT ;LOOP IF AN ERROR EXISTS ; SBTL 'BACKUP.SYSTEM SUBROUTINES' ; ; ;SUBROUTINES USED BY BACKUP 3.5 ; ; HOME40 STA SETROME2 ;ENSURE ROM SELECTED JSR SETKBD ;SET KEYBOARD AS INPUT JSR SETVID ;SET VIDEO AS OUTPUT JSR SETTEXT ;SET TEXTMODE JSR SETNORM ;SET NORMAL VIDEO LDA #CNTL.U ;SET 40 COLUMN JSR COUT2 JSR HOME ;CLEAR THE SCREEN RTS ; DO.MENU STY MLINE1 ;SAVE THE STARTING LINE NUMBER STA MENU.CNT ;SAVE THE NUMBER OF MENU LINES STA MENU.I3 DO.MENU2 DEC MENU.I3 BMI DO.MENU3 ;IF ALL PRINTED, HIGHLIGHT THE DEFAULT JSR P.MENU2S ;PRINT MENU LINE JMP DO.MENU2 ;AND DO THE NEXT DO.MENU3 LDA MENU.DF STA MENU.I3 HIGHLITE JSR SETINV ;HIGHLIGHT THE SELECTED LINE JSR P.MENU2S JSR SETNORM JSR RDAK ;WAIT FOR INPUT CMP #UP.ARW BEQ UP1 ;IF UP ARROW... CMP #DOWN.ARW BEQ DOWN1 ;IF DOWN ARROW... RTS ;EXIT IF [RETURN] OR [ESCAPE] ; UP1 JSR P.MENU2S ;RETURN LINE TO NORMAL LDX MENU.I3 BNE UP1.2 LDX MENU.CNT ;IF WRAP, GET MAX COUNT +1 UP1.2 DEX ;DECREMENT INDEX STX MENU.I3 ;SAVE IT JMP HIGHLITE ; AND HIGHLIGHT NEW SELECTION ; DOWN1 JSR P.MENU2S ;RETURN LINE TO NORMAL LDX MENU.I3 ;INCREMENT INDEX INX CPX MENU.CNT ;IF EQUAL TO MAX COUNT BCC DOWN1.2 LDX #0 ;WRAP TO ZERO DOWN1.2 STX MENU.I3 ;SAVE IT JMP HIGHLITE ; AND HIGHLIGHT NEW SELECTION ; P.MENU2S LDA #5 STA CH ;INDEX LINE FIVE SPACES LDA MLINE1 ;GET MENU BASE LINE NUMBER CLC ADC MENU.I3 ;ADD CURRENT LINE INDEX JSR TABV ;SET CV AND BAS TO NEW LINE LDA #SPACE ; PRINT A SPACE CHARACTER JSR COUT2 LDA MENU.I3 ;USE LINE INDEX ASL A TAY LDA (MENU.I1),Y TO GET TEXT STARTING ADDRESS STA MENU.I2 INY LDA (MENU.I1),Y STA MENU.I2+1 LDY #0 ;GET TEXT LENGTH LDA (MENU.I2),Y STA ME.LEN ;SAVE IT P.M2S2 INY LDA (MENU.I2),Y ;PRINT THE MENU LINE JSR COUT2 CPY ME.LEN ;UNTIL ME.LEN = LENGTH OF TEXT BCC P.M2S2 LDA #SPACE ;PRINT A CLOSING SPACE CHARACTER JSR COUT2 RTS ; P.COPR STY TEMP1 ;PRINT COPYRIGHT JSR HOME LDY TEMP1 P.C2 LDA COPR,Y BEQ P.C3 JSR COUT2 INY BNE P.C2 P.C3 RTS ; P.TITLE STY TEMP1 ;PRINT TITLE POINTED TO BY Y-REG JSR HOME LDY TEMP1 P.T2 LDA TITLE,Y BEQ P.AK JSR COUT2 INY BNE P.T2 P.AK LDA CV ;PRINT ARROW KEY PROMPT ON LINE 23 PHA LDA #23 LDY #AKMSG-MSGS JSR P.MSG PLA JSR TABV RTS ; P.PROMPT STY TEMP1 ;PRINT PROMPT (Y) ON LINE (A) JSR TABV LDA #0 STA CH JSR CLREOL LDY TEMP1 P.P2 LDA PROMPT,Y BEQ P.PRTS JSR COUT2 INY BNE P.P2 P.PRTS RTS ; P.MSG STY TEMP1 ;PRINT MESSAGE (Y) ON LINE (A) JSR TABV LDA #0 STA CH JSR CLREOL LDY TEMP1 P.MSG2 LDA MSGS,Y BEQ P.MRTS JSR COUT2 INY BNE P.MSG2 P.MRTS RTS ; CADS JSR DO.GFI ;GET VOLUME INFO BCS CADS3 LDA GFI.P+5 CMP GFI.P+8 LDA GFI.P+6 SBC GFI.P+9 CMP #<283 ;TOTAL-USED>283 ? BNE CADS2 SEC LDA GFI.P+5 SBC GFI.P+8 CMP #>283 CADS2 LDA #NO.E ;YES BCS CADS3 LDA #DF.E ;NO CADS3 CMP #1 RTS ; CLS.ALL LDA #0 STA CLOSE.P+1 ;ZERO REFERENCE NUMBER STA LEVEL ;AND LEVEL JSR MLI ;AND CLOSE ALL OPEN FILES DFB CLOSE.C DFB CLOSE.P RTS ; DO.GFI LDA #10 ;DO GET_FILE_INFO STA GFI.P+0 STX GFI.P+2 STY GFI.P+1 JSR MLI DFB GFI.C DW GFI.P RTS ; DO.SFI LDA #7 ;DO SET_FILE_INFO STA GFI.P+0 STX GFI.P+2 STY GFI.P+1 JSR MLI DFB SFI.C DW GFI.P RTS ; D.ONLINE STA ONLINE.P+1 ;DO ONLINE CALL STX ONLINE.P+3 STY ONLINE.P+2 JSR MLI DFB ONLINE.C DW ONLINE.P RTS ; D.DSTRY STX DSTRY.P+2 ;DO DESTROY CALL STY DSTRY.P+1 JSR MLI DFB DSTRY.C DW DSTRY.P RTS ; DO.DD STY DD.CMD STA DD.UNIT AND #SLOTMASK LSR A LSR A LSR A LSR A ORA #IOMASK STA JUMP+1 LDY #$FF STY JUMP INY LDA (JUMP),Y BEQ DD.ERR CMP #$F9 BCS DD.ERR STA JUMP LDA #$00 STA DD.BLK+1 STA DD.BLK LDA #DATABUFR STA DD.BUFR JMP (JUMP) ; DD.ERR LDA #IO.E SEC RTS ; DO.WRBLK STX RWB.P+5 STY RWB.P+4 LDX #DATABUFR STX RWB.P+3 STY RWB.P+2 STA RWB.P+1 JSR MLI DFB WRBLK.C DW RWB.P RTS ; ZEROBUFR LDY #0 ZB2 STA DATABUFR+256,Y STA DATABUFR,Y DEY BNE ZB2 RTS ; SYS.ERR STA ERROR.GP ;SAVE ERROR NUMBER LDY #EC.T2-EC.T FE.L CMP EC.T,Y ;SEARCH ERROR INDEX TABLE BEQ ERRFND ;FOUND CODE IN TABLE DEY BNE FE.L ERRFND LDA EPI.T,Y ;GET INDEX TO TEXT TABLE TAY JSR P.EMSG ;PRINT THE ERROR MESSAGE JSR RDKEY ;WAIT FOR KEYPRESS SEC RTS ;AND RETURN ; P.EMSG STY TEMP1 ;PRINT ERROR MESSAGE (Y) ON LINE 23 LDA #23 JSR TABV LDA #0 STA CH JSR CLREOL LDY TEMP1 P.EMSG2 LDA EPROMPT,Y BEQ P.EMRTS JSR COUT2 INY BNE P.EMSG2 P.EMRTS RTS ; SEARCH STY SRCH.FT ;SEARCH FOR FILETYPE (Y) LDX #V3.BUFR+1 JSR D.ONLINE ;GET THE VOLUMENAME OF THE UNIDISK 3.5 BCS SRCH.E1 LDA V3.BUFR+1 ;CHECK VALIDITY AND #%00001111 STA V3.BUFR BNE SRCH1 LDA V3.BUFR+2 SEC SRCH.E1 JSR SYS.ERR JMP SRCH2 MSB OFF SRCH1 TAX INX INX STX V3.BUFR LDA #'/' ;CONVERT TO PREFIX FORMAT STA V3.BUFR+1 STA V3.BUFR,X LDA #V3.BUFR STA SETPFX.P+1 JSR MLI ;AND SET THE PREFIX DFB SETPFX.C DW SETPFX.P BCS SRCH.E1 LDA #V3.BUFR STA OPEN.P+1 JSR MLI ;OPEN THE DIRECTORY DFB OPEN.C DW OPEN.P BCS SRCH.E1 LDA OPEN.P+5 STA RWF.P+1 STA CLOSE.P+1 STA SMARK.P+1 LDA #DATABUFR STA RWF.P+2 LDA #<43 STA RWF.P+5 LDA #>43 STA RWF.P+4 JSR MLI ;READ THE DIRECTORY HEADER DFB RDFILE.C DW RWF.P BCS SRCH.E1 LDX #3 MOVDD.L LDA DATABUFR+$23,X STA E.LEN,X DEX BPL MOVDD.L STA RWF.P+4 LDA #1 STA EPB.CNTR LDA #0 STA SMARK.P+4 STA SMARK.P+3 STA FNAME.I LDA FILE.CNT+1 ORA FILE.CNT BNE CHKFE JCDC LDA #0 JCDS CMP #1 JMP CLS.DIR * CHKFE BIT FILE.CNT+1 ;SCAN THE ENTRIES FOR THE FILE TYPE WANTED BMI JCDC TNE LDA SMARK.P+3 AND #%11111110 STA SMARK.P+3 LDY EPB.CNTR LDA #0 CPY E.P.BLK BCC INCCPG TAY STY EPB.CNTR INC SMARK.P+3 INCNPG INC SMARK.P+3 INCCPG DEY CLC BMI ADD4 ADC E.LEN BCC INCCPG BCS INCNPG ADD4 ADC #4 STA SMARK.P+2 JSR MLI DFB SMARK.C DW SMARK.P BCS JCDS JSR MLI DFB RDFILE.C DW RWF.P BCS JCDS INC EPB.CNTR LDA DATABUFR AND #%11110000 BEQ TNE DEC FILE.CNT BNE CHKFT DEC FILE.CNT+1 CHKFT LDA DATABUFR+$10 CMP SRCH.FT ;IS IT THE RIGHT TYPE? BNE CHKFE ;NO... LDX FNAME.I CPX #16 ;BUFFER FULL? BCS JCDC ;YES... TXA ASL A ASL A ASL A ASL A STA FNAME.T LDA #FN.T STA MENU.I1 LDY CV LDA FNAME.I JSR DO.MENU ;AND ASK USER TO SELECT ONE CMP #ESCAPE SRCH2 RTS ; COPY STX OPEN.P+2 ;SETUP VARIABLES STY OPEN.P+1 LDA #FILEBUFR STA OPEN.P+3 LDX COPYDIR LDA DIRTBL,X STA RWB.CMD INX LDA DIRTBL,X STA RWF.CMD JSR MLI ;OPEN THE FILE DFB OPEN.C DW OPEN.P STA ERROR.GP BCS OPENERR LDA OPEN.P+5 STA RWF.P+1 STA CLOSE.P+1 LDA #0 ;INITIALIZE BLOCK NUMBER COUNTER STA RWB.P+5 STA RWB.P+4 LDX #4 ;MAKE FOUR PASSES LDA COPYDIR BNE CF2D ;JUMP TO COPY FILE TO DISK CD2F JSR RWB70 ;COPY DISK TO FILE, READ 70 BLOCKS BCS COPYCLS JSR RWF70 ;WRITE 70 BLOCKS TO FILE BCS COPYCLS DEX BNE CD2F ;IF NOT DONE... BEQ COPYCLS ;IF DONE... CF2D JSR RWF70 ;COPY FILE TO DISK, READ 70 BLOCKS BCS COPYCLS JSR RWB70 ;WRITE 70 BLOCKS TO DISK BCS COPYCLS DEX BNE CF2D ;IF NOT DONE... COPYCLS LDA ERROR.P ;RECOVER ERROR CODE STA ERROR.GP JSR MLI ;CLOSE THE FILE DFB CLOSE.C DW CLOSE.P OPENERR LDA ERROR.GP ;LOAD THE ERROR CODE CMP #1 ;CHECK IF NO_ERROR RTS ;AND EXIT ; RWF70 LDA #DATABUFR STA RWF.P+2 LDA #<512*70 STA RWF.P+5 LDA #>512*70 STA RWF.P+4 JSR MLI RWF.CMD DFB RDFILE.C DW RWF.P RTS ; RWB70 LDY #70 ;READ/WRITE 70 BLOCKS FROM/TO DISK LDA #DATABUFR STA RWB.P+2 LDA DEVNUM5 STA RWB.P+1 RDNXTB JSR MLI RWB.CMD DFB RDBLK.C DW RWB.P BCS RWB.RTN INC RWB.P+3 INC RWB.P+3 INC RWB.P+4 BNE RWB5 INC RWB.P+5 RWB5 DEY BNE RDNXTB CLC RWB.RTN RTS ; REQ.ST LDA #2 ;REQUEST SOURCE AND TARGET DRIVES JSR TABV JSR CLREOP ;CLEAR LINES 2-23 JSR P.AK ;PRINT ARROW KEYS PROMPT LDA COPYDIR ;CHECK THE COPY DIRECTION BNE REQ.35 ;IF DOING A RESTORE... REQ.53 LDA #2 JSR REQ.D5S ;REQUEST SOURCE DISK ][ BEQ RSDESC1 LDA MENU.I3 STA BR.SRC LDA #5 CLC ADC DEVCNT5 JSR REQ.D3T ;REQUEST TARGET UNIDISK 3.5 BEQ REQ.ST LDA MENU.I3 STA BR.TGT CLC RSDESC1 RTS ; REQ.35 LDA #2 JSR REQ.D3S ;REQUEST SOURCE UNIDISK 3.5 BEQ RSDESC2 LDA MENU.I3 STA BR.SRC LDA #5 CLC ADC DEVCNT3 JSR REQ.D5T ;REQUEST TARGET DISK][ BEQ REQ.ST LDA MENU.I3 STA BR.TGT CLC RSDESC2 RTS ; REQ.D3S LDY #SPROMPT-PROMPT JMP REQ.D3 REQ.D3T LDY #TPROMPT-PROMPT REQ.D3 JSR P.PROMPT ;PROMPT FOR UNIDISK 3.5 DRIVE LDA #DISK3.T STA MENU.I1 LDA D3.DF STA MENU.DF LDY CV LDA DEVCNT3 CLC ADC #1 JSR DO.MENU LDY MENU.I3 STY D3.DF CMP #ESCAPE RTS ; REQ.D5S LDY #SPROMPT-PROMPT JMP REQ.D5 REQ.D5T LDY #TPROMPT-PROMPT REQ.D5 JSR P.PROMPT ;PROMPT FOR DISK ][ DRIVE LDA #DISK5.T STA MENU.I1 LDA D5.DF STA MENU.DF LDY CV LDA DEVCNT5 CLC ADC #1 JSR DO.MENU LDY MENU.I3 STY D5.DF CMP #ESCAPE RTS ; REQ.VN LDY #0 STY V5.BUFR LDY #VNPROMPT-PROMPT JMP REQ.VN2 ; REQ.FN LDY #FNPROMPT-PROMPT REQ.VN2 LDA #21 JSR P.PROMPT ;PROMPT FOR FILENAME LDX #0 ;REQUEST FILENAME REQ.FN2 CPX V5.BUFR BEQ REQ.FN3 INX LDA V5.BUFR,X JSR COUT2 ;PROMPT WITH DEFAULT (V5.BUFR) JMP REQ.FN2 REQ.FN3 JSR RDCHAR ;GET A CHARACTER CMP #RETURN BEQ RFN.RTN ;IF [RETURN]... CMP #ESCAPE BEQ RFN.ESC ;IF [ESCAPE]... LDX V5.BUFR ;CHECK FILENAME LENGTH BEQ REQ.FN4 ;IF ZERO, ALLOW ONLY LETTERS CMP #BACKSPC ;CHECK IF BACKSPACE PRESSED BNE REQ.FN5 ;NOT BACKSPACE... DEC V5.BUFR ;WAS BACKSPACE SO MOVE BACK ONE (1) DEC CH JMP REQ.FN3 ; AND GET NEXT KEYPRESS REQ.FN4 JSR TST.ALFA ;ALLOW ONLY LETTERS BCS REQ.FN3 ;NOT A LETTER... REQ.FN5 JSR TST.PDOS ;ALLOW LETTERS, NUMBERS, AND PERIODS BCS REQ.FN3 ;NONE OF THE ABOVE... LDX V5.BUFR ;GET FILENAME LENGTH CPX #15 ;GREATER THAN FIFTEEN (>15) BCS REQ.FN3 ;YES... REQ.FN6 JSR COUT2 ;PRINT THE CHARACTER AND #NOT-MSB ;CLEAR THE MSB INC V5.BUFR ;UPDATE THE FILENAME LENGTH LDX V5.BUFR STA V5.BUFR,X ;AND ADD THE NEW CHARACTER TO THE FILENAME JMP REQ.FN3 ;AND GET THE NEXT... ; RFN.RTN LDX V5.BUFR ;VERIFY FILENAME LENGTH OF AT LEAST ONE BEQ REQ.FN3 ;FILENAME LENGTH EQUALS ZERO... JSR CLREOL ;CLEAR REST OF LINE CLC ;SIGNAL NO ERRORS RTS ;AND EXIT TO CALLING ROUTINE ; RFN.ESC SEC ;MARK AN ESCAPE RTS ;AND RETURN ; TST.PDOS JSR TST.ALFA ;TEST FOR LETTERS, BCC TP2 JSR TST.NM9 ; NUMBERS, BCC TP2 JSR TST.PRD ; AND PERIODS TP2 RTS ; MSB ON TST.ALFA CMP #'A' ;CHECK FOR LETTER BETWEEN 'A' BCC TA2 CMP #'Z'+1 ; AND 'Z' BCC TA3 TA2 SEC ;NOT A LETTER TA3 RTS ; MSB ON TST.NM3 CMP #'3'+1 ;CHECK FOR A NUMBER BETWEEN 0 AND 3 BCS TN3 TST.NM9 CMP #'0' ;CHECK FOR A NUMBER BETWEEN 0 AND 9 BCC TN2 CMP #'9'+1 BCC TN3 TN2 SEC ;NOT A NUMBER TN3 RTS ; MSB ON TST.PRD CMP #'.' ;CHECK FOR PERIODS BCC T.2 CMP #'.'+1 BCC T.3 T.2 SEC T.3 RTS ; ;KEYBOARD - SCREEN I/O ROUTINES ; COUT2 PHP ;SAVE STATUS REGISTER PHA ; AND ACCUMULATOR ORA #MSB ;SET MSB JSR COUT ;PRINT THE CHARACTER PLA ;RESTORE ACCUMULATOR PLP ; AND STATUS REGISTER RTS ;AND RETURN ; MSB ON RD.YN JSR RDCHAR ;GET A CHARACTER CMP #ESCAPE ;IS IT [ESCAPE] BEQ RD.YN2 ;YES... CMP #'N' ;IS IT [N]O BEQ RD.YN2 ;YES.... CMP #'Y' ;IS IT [Y]ES BNE RD.YN ;NO... CLC ;YES, SO CLEAR CARRY RD.YN2 RTS ;AND RETURN ; RDCHAR LDA #0 ;CLEAR CR.FLG STA CR.FLG RDCH LDY CH ;GET THE CHARACTER AT THE LDA (BAS),Y ; CURRENT CURSOR LOCATION STA RCSAVE ; AND SAVE IT AND #%00111111 ORA #%01000000 ;CAUSE IT TO FLASH STA (BAS),Y ;AND PUT IT BACK LDA #RT.ARW ;FORCE RIGHT ARROW BIT CR.FLG ;CHECK IF CR.FLG SET BMI RC2 ;IF SO SKIP RDKEY... JSR RDKEY ;GET THE CHARACTER FROM KEYBOARD RC2 PHA LDA RCSAVE ;RESTORE THE SCREEN STA (BAS),Y PLA CMP #RT.ARW ;WAS IT A RIGHT ARROW BNE RC3 ;NO... LDA RCSAVE ;YES, GET SCREEN CHARACTER RC3 RTS ;AND RETURN ; RDAK JSR RDKEY ;GET CHARCTER FROM KEYBOARD CMP #RETURN BEQ RDAKRTN ;IF [RETURN]... CMP #ESCAPE BEQ RDAKRTN ;IF [ESCAPE]... CMP #LEFT.ARW BNE RDAK2 LDA #UP.ARW ;IF LEFT ARROW, CONVERT TO UP ARROW RDAK2 CMP #RT.ARW BNE RDAK3 LDA #DOWN.ARW ;IF RIGHT ARROW, CONVERT TO DOWN ARROW RDAK3 CMP #UP.ARW BEQ RDAKRTN ;IF [UP ARROW]... CMP #DOWN.ARW BNE RDAK ;IF NOT AN ARROW KEY, LOOP... RDAKRTN RTS ; MSB ON RDKEY LDA KBD ;READ THE KEYBOARD BPL RDKEY ;LOOP IF KEY NOT PRESSED STA KBDSTRB ;RESET THE KEYBOARD STROBE CMP #'a' ;FORCE TO UPPER CASE BCC RK2 CMP #'z'+1 BCS RK2 AND #%11011111 RK2 RTS ; DS >$00-*,0 FORMAT5 JSR STRTDRV ;START THE DISK ][ BCS FTERR JSR RECAL ;MOVE THE ARM TO TRACK 0 LDA VOLNUM ;GET THE VOLUME NUMBER STA VOLUME FORMAT LDA #0 ;AND START FORMATTING STA ERROR.GP ;RESET ERROR BYTE STA SECTOR ;SET SECTOR TO ZERO LDA #40 ;SETUP FOR 40 SYNC BYTES STA SYNC WRNXTTRK JSR SEEKTRK ;FIND NEXT TRACK JSR WRTRACK ;FORMAT IT LDA ERROR.GP BNE FTERR2 ;THERE WAS AND ERROR... LDA #48 ;SET RETRIES COUNTER STA RETRIES FNDSEC0 SEC ;SEARCH FOR SECTOR ZERO DEC RETRIES BEQ FTERR JSR RDADR ;READ A SECTOR ADDRESS BCS FNDSEC0 ;UNSUCCESSFUL READ... LDA SECFND BNE FNDSEC0 ;WASN'T SECTOR ZERO... JSR READ ;READ SECTOR DATA BCS FNDSEC0 ;UNSUCCESSFUL READ INC ORDR.TRK ;INCREMENT TRACK NUMBER LDA ORDR.TRK CMP #35 ;ALL TRACKS DONE? BCC WRNXTTRK ;NO... LDA #NO.E ;YES, SO FLAG NO ERRORS BEQ NFTERR FTERR LDA #IO.E ;ERROR IN FORMATTING NFTERR STA ERROR.GP FTERR2 JSR STOPDRV ;STOP THE DISK ][ LDA ERROR.GP ;GET THE ERROR CODE CMP #$01 ;SET CARRY IF ERROR RTS ; WRTRACK LDA #$00 STA SECTOR ;START WITH SECTOR ZERO LDY #128 ;AND 128 SYNC BYTES BNE WR1STSEC WRNXTSEC LDY SYNC ;GET NUMBER OF SYNC BYTES WR1STSEC JSR WRADR ;WRITE THE SECTOR ADDRESS BCS FMT.RTS JSR WRITE ;AND SECTOR DATA BCS FMT.RTS INC SECTOR ;INCREMENT THE SECTOR NUMBER LDA SECTOR CMP #16 ;ALL SECTORS DONE BCC WRNXTSEC ;NO... LDY #$0F STY SECTOR LDA #$30 STA RETRIES CHKTBLLP STA CHKTBL,Y ;INIT THE SECTOR CHECK TABLE DEY BPL CHKTBLLP LDY SYNC FTWAIT JSR FMT.RTS ;WAIT FOR SECTOR ZERO JSR FMT.RTS JSR FMT.RTS PHA PLA NOP DEY BNE FTWAIT JSR RDADR ;READ THE SECTOR ADDRESS BCS RDSAA LDA SECFND BEQ RDSDATA ;IT WAS ZERO LDA #$10 ;NO IT WASN'T CMP SYNC LDA SYNC SBC #1 ;SO DECREMENT THE NUMBER OF SYNC BYTES STA SYNC CMP #5 ;NO LESS THAN 5 ACCEPTABLE BCS RDSAA LDA #IO.E ;IF LESS THAN 5, FLAG AN ERROR STA ERROR.GP CMP #$01 RTS ; RDSECADR JSR RDADR ;READ EACH SECTOR ADDRESS BCS RSAERR RDSDATA JSR READ ;AND DATA BCC GOOD.A.D RSAERR DEC RETRIES BNE RDSECADR RDSAA JSR RDADR BCS NOTSEC15 LDA SECFND CMP #15 BNE NOTSEC15 JSR READ BCC WRTRACK NOTSEC15 DEC RETRIES BNE RDSAA SEC FMT.RTS RTS ; GOOD.A.D LDY SECFND ;AND MARK THE GOOD ONES LDA CHKTBL,Y BMI RSAERR LDA #$FF STA CHKTBL,Y ;IN THE SECTORS GOOD TABLE DEC SECTOR BPL RDSECADR LDA ORDR.TRK BNE NOT.TRK0 LDA SYNC CMP #16 BCC FMT.RTS DEC SYNC DEC SYNC NOT.TRK0 CLC RTS ; STRTDRV SEI ;DISABLE INTERUPTS LDA DEVNUM5 ;GET DEVICE NUMBER AND #SLOTMASK ;CONVERT TO SLOT NUMBER STA SLOT TAX LDA MOTOROFF,X ;VERIFY MOTOR OFF LDA IWMREAD,X ;AND UNIT IN READ MODE LDA IWMSTRB,X LDA DRIVE1,X ;SELECT DRIVE 1 BIT DEVNUM5 BPL DRVSET LDA DRIVE2,X ;SELECT DRIVE 2 DRVSET LDA MOTORON,X ;START THE SELECTED DRIVE LDY #8 DRVSET1 LDA IWMSTRB,X PHA PLA PHA PLA CMP IWMSTRB,X BNE DRV.OK DEY BNE DRVSET1 ;WAIT FOR DRIVE TO START SPINNING LDA #IO.E BNE SD.RTN DRV.OK LDA #NO.E SD.RTN STA ERROR.GP CMP #1 RTS ; STOPDRV LDA MOTOROFF,X ;TURN THE MOTOR OFF CHKOFF LDY #8 LDA IWMSTRB,X SAME CMP IWMSTRB,X BNE CHKOFF ;WAIT FOR DRIVE TO STOP SPINNING DEY BNE SAME CLI ;ENABLE INTERUPTS RTS ; RECAL LDA #40 ;FORCE ARM TO TRACK 0 STA CUR.TRK ;BY STATING ARM AT TRACK 40 LDA #0 STA ORDR.TRK ;AND ORDERING TO TRACK 00 JSR SEEKTRK LDA IWMPHASE+0,X ;TURN OFF ALL PHASES LDA IWMPHASE+2,X LDA IWMPHASE+4,X LDA IWMPHASE+6,X RTS ; SEEKTRK LDA #$00 ;MOVE ARM TO ORDERED TRACK STA SCRATCH1 LDA CUR.TRK SEC SBC ORDR.TRK BEQ NO.MOVE BCS MOVEOUT EOR #$FF ADC #$01 MOVEOUT STA SCRATCH2 ROL SCRATCH1 LSR CUR.TRK ROL SCRATCH1 ASL SCRATCH1 LDY SCRATCH1 MOVEARM LDA PTABLE,Y JSR PHASE LDA PTABLE+1,Y JSR PHASE TYA EOR #$02 TAY DEC SCRATCH2 LDA SCRATCH2 BNE MOVEARM LDA ORDR.TRK STA CUR.TRK NO.MOVE LDX SLOT RTS ; PHASE ORA SLOT TAX LDA IWMPHASE+1,X LDA #$56 JSR WAIT LDA IWMPHASE,X RTS ; DS >0-*,0 ; GETVOL JSR STRTDRV ;START THE DRIVE BCS V.STOP LDA #16 ;SET RETRIES COUNTER STA RETRIES RAAGAIN JSR RDADR ;TRY READING SECTOR ADDRESS BCC V.STOP DEC RETRIES BNE RAAGAIN LDA #IO.E STA ERROR.GP V.STOP JSR STOPDRV ;STOP THE DRIVE LDA ERROR.GP CMP #$01 RTS ; RDADR LDY #$FC ;READ A SECTOR ADDRESS STY SCRATCH1 RAPERR INY BNE RAWP1 INC SCRATCH1 BEQ RA.ERR RAWP1 LDA IWMSTRB,X BPL RAWP1 RATP1 CMP #$D5 BNE RAPERR NOP RAWP2 LDA IWMSTRB,X BPL RAWP2 CMP #$AA BNE RATP1 LDY #$03 RAWP3 LDA IWMSTRB,X BPL RAWP3 CMP #$96 BNE RATP1 LDA #$00 RAINFOLP STA SCRATCH2 RAWIB1 LDA IWMSTRB,X BPL RAWIB1 ROL A STA SCRATCH1 RAWIB2 LDA IWMSTRB,X BPL RAWIB2 AND SCRATCH1 STA FND.TBL,Y EOR SCRATCH2 DEY BPL RAINFOLP TAY BNE RA.ERR RAWE1 LDA IWMSTRB,X BPL RAWE1 CMP #$DE BNE RA.ERR NOP RAWE2 LDA IWMSTRB,X BPL RAWE2 EOR #$AA BEQ NRA.ERR RA.ERR LDA #IO.E NRA.ERR STA ERROR.GP CMP #$01 RTS ; READ LDY #$20 ;READ A SECTOR OF DATA RDPERR DEY BEQ RA.ERR RDWP1 LDA IWMSTRB,X BPL RDWP1 RDTP1 EOR #$D5 BNE RDPERR NOP RDWP2 LDA IWMSTRB,X BPL RDWP2 CMP #$AA BNE RDTP1 LDY #$57 RDWP3 LDA IWMSTRB,X BPL RDWP3 CMP #$AD BNE RDTP1 RDPRILP STY SCRATCH2 RDSECLP LDA IWMSTRB,X BPL RDSECLP CMP #$96 BNE RA.ERR DEY BNE RDSECLP CPY SCRATCH2 BNE RDPRILP BEQ RAWE1 ; DS >0-*,0 ; WRADR STY SCRATCH2 ;WRITE A SECTOR ADDRESS LDY #WP.E SEC LDA IWMLATCH,X LDA IWMREAD,X BMI WA.WPE LDY SCRATCH2 LDA #$AA STA SCRATCH2 LDA #$FF STA IWMWRITE,X CMP IWMSTRB,X PHA PLA WASYNCLP JSR WD.RTN JSR WD.RTN STA IWMLATCH,X CMP IWMSTRB,X NOP DEY BNE WASYNCLP LDA #$D5 JSR WRITE08 LDA #$AA JSR WRITE08 LDA #$96 JSR WRITE08 LDA VOLUME JSR WRDBYTE LDA CUR.TRK JSR WRDBYTE LDA SECTOR JSR WRDBYTE LDA VOLUME EOR CUR.TRK EOR SECTOR PHA LSR A ORA SCRATCH2 STA IWMLATCH,X LDA IWMSTRB,X PLA ORA #$AA JSR WRITE06 LDA #$DE JSR WRITE08 LDA #$AA JSR WRITE08 LDA #$EB JSR WRITE08 CLC WA.WPE JMP WD.WPE ; WRITE LDY #WP.E ;WRITE A SECTOR OF DATA SEC LDA IWMLATCH,X LDA IWMREAD,X BMI WD.WPE LDA #$00 STA SCRATCH1 LDA #$FF STA IWMWRITE,X ORA IWMSTRB,X PHA PLA NOP LDY #$04 WDSYNCLP PHA PLA JSR WRITE10 DEY BNE WDSYNCLP LDA #$D5 JSR WRITE08 LDA #$AA JSR WRITE08 LDA #$AD JSR WRITE08 LDY #$57 BNE WDSECLP WDSECLP LDA #$96 JSR WRITE13 DEY BNE WDSECLP WDPRILP BEQ WDPRI2 WDPRI2 JSR WRITE13 DEY BNE WDPRILP LDX SLOT LDA #$DE JSR WRITE15 LDA #$AA JSR WRITE08 LDA #$EB JSR WRITE08 LDA #$FF JSR WRITE08 WD.WPE LDA IWMREAD,X LDA IWMSTRB,X TYA STA ERROR.GP CMP #$01 WD.RTN RTS ; WRDBYTE PHA LSR A ;WRITE 2 FOUR BIT NYBBLES ORA SCRATCH2 STA IWMLATCH,X CMP IWMSTRB,X PLA NOP NOP NOP ORA #$AA WRITE06 NOP WRITE08 NOP WRITE10 LDX SLOT ;WRITE NYBBLES WRITE13 NOP WRITE15 NOP WRITE17 STA IWMLATCH,X CMP IWMSTRB,X RTS ; GLV+BU.DATAZ SBTL 'BACKUP 3.5 DATA TABLES ; DS >0-*,0 OS EQU *-$0800 ; BOOT1 DFB 1 CLD STX DD.UNIT TXA AND #SLOTMASK LSR A LSR A LSR A LSR A ORA #IOMASK STA SLOTVEC+1 LDY #$FF STY SLOTVEC INY LDA (SLOTVEC),Y BEQ UTLP.B6 CMP #$F9 BCS UTLP.B3 STA SLOTVEC LDA #DD.READ STA DD.CMD LDX #DIR.BUFR STX BUFR.P+1 STA BUFR.P LDX #<2 LDA #>2 RNDB JSR RDABLK-OS UTLP.B3 BCS UTLP.B8 LDA DD.BLK+1 BNE NOT2 LDA DD.BLK CMP #2 BNE NOT2 LDA DIR.BUFR+1 ORA DIR.BUFR BNE UTLP LDA DIR.BUFR+4 CMP #$F1 BCC UTLP LDA DIR.BUFR+$23 STA DES NOT2 LDA BUFR.P+1 STA DEP+1 LDA #4 BNE SCAN.DIR TNDE LDA DEP SCAN.DIR CLC ADC DES TAY BCC SD2 INC DEP+1 INC DEP+1 LSR A BCS SD2 LDA DIR.BUFR+3 TAX ORA DIR.BUFR+2 UTLP.B6 BEQ UTLP LDA DIR.BUFR+2 JMP RNDB-OS ; SD2 STY DEP LDY #PRODOS.E-PRODOS-1 CHKFN LDA (DEP),Y CMP PRODOS-OS,Y BNE TNDE DEY BPL CHKFN LDY #$10 LDA (DEP),Y CMP #$FF BNE UTLP INY LDA (DEP),Y STA DD.BLK INY LDA (DEP),Y STA DD.BLK+1 LDX BUFR.P+1 LDA BUFR.P STX IBP.1+1 STA IBP.1 INX STX IBP.2+1 STA IBP.2 STA IBP.3 RDPDOS JSR RDABLK2-OS UTLP.B8 BCS UTLP INC BUFR.P+1 INC BUFR.P+1 LDY IBP.3 INC IBP.3 LDA (IBP.1),Y STA DD.BLK LDA (IBP.2),Y STA DD.BLK+1 ORA DD.BLK BNE RDPDOS JMP GO.PDOS ; UTLP JSR HOME LDY #UTLP.E-UTLP.T-1 UTLP.2 LDA UTLP.T-OS,Y STA TXTLINE,Y DEY BPL UTLP.2 UTLP.3 BMI UTLP.3 ; RDABLK STX DD.BLK+1 STA DD.BLK RDABLK2 LDX BUFR.P+1 LDA BUFR.P STX DD.BUFR+1 STA DD.BUFR JMP (SLOTVEC) ; MSB ON UTLP.T ASC '--- UNABLE TO LOAD PRODOS ---' UTLP.E EQU * ; MSB OFF PRODOS DFB $26 ASC 'PRODOS' PRODOS.E EQU * ; DS BOOT1+512-*,0 ; VDH DW 0 ;PREVIOUS DIRECTORY BLOCK DW 0 ;NEXT DIRECTORY BLOCK DS 1 ;STORAGE TYPE/NAME LENGTH DS 15,$20 ;VOLUME NAME DS 8,0 ;RESERVED DW 0 ;CREATION DATE DW 0 ;CREATION TIME DFB 1 ;CREATION VERSION DFB 0 ;MINIMUM VERSION DFB %11000011 ;ACCESS DFB $27 ;ENTRY LENGTH DFB 13 ;ENTRIES PER DIRECTORY BLOCK DW 0 ;FILE COUNT DW 1 ;BITMAP POINTER DW 1600 ;TOTAL BLOCKS VDH.END EQU * ; MMTB DW BU.ENTRY ;TABLE OF SUBROUTINES DW RS.ENTRY DW F3.ENTRY DW RN.ENTRY DW D.ENTRY DW H.ENTRY DW Q.ENTRY MMTE EQU * ; MMTABLE DW MO.B ;INDEX TO MAIN MENU SELECTIONS DW MO.RS DW MO.F DW MO.RN DW MO.D DW MO.H DW MO.Q ; QTABLE DW MO.RMM ;QUIT MENU TEXT INDEX DW MO.EP ; PTABLE DFB 2,4,6,0 DFB 6,4,2,0 ; DIRTBL DFB RDBLK.C,WRFILE.C DFB WRBLK.C,RDFILE.C ; EC.T DFB $00,$01,$04,$25 ;TABLE OF PRODOS ERROR CODES DFB $27,$28,$2B,$2E DFB $40,$42,$43,$44 DFB $45,$46,$47,$48 DFB $49,$4A,$4B,$4C DFB $4D,$4E,$50,$51 DFB $52,$53,$55,$56 DFB $57,$58,$2D,$2F EC.T2 EQU * ; EPI.T DFB UKEP-EPROMPT ;0 ;TABLE OF ERROR TEXT INDEXES DFB SYSEP-EPROMPT ;1 DFB SYSEP-EPROMPT ;4 DFB SYSEP-EPROMPT ;25 DFB IOEP-EPROMPT ;27 DFB DNCP-EPROMPT ;28 DFB WPEP-EPROMPT ;2B DFB PNFP-EPROMPT ;2E DFB PSEP-EPROMPT ;40 DFB BUFREP-EPROMPT ;42 DFB SYSEP-EPROMPT ;43 DFB PNFP-EPROMPT ;44 DFB PNFP-EPROMPT ;45 DFB PNFP-EPROMPT ;46 DFB DVFEP-EPROMPT ;47 DFB DFEP-EPROMPT ;48 DFB DFEP-EPROMPT ;49 DFB SYSEP-EPROMPT ;4A DFB SYSEP-EPROMPT ;4B DFB EOFP-EPROMPT ;4C DFB SYSEP-EPROMPT ;4D DFB AEP-EPROMPT ;4E DFB FOEP-EPROMPT ;50 DFB IOEP-EPROMPT ;51 DFB NPDEP-EPROMPT ;52 DFB SYSEP-EPROMPT ;53 DFB SYSEP-EPROMPT ;55 DFB BUFREP-EPROMPT ;56 DFB DVFEP-EPROMPT ;57 DFB IOEP-EPROMPT ;58 DFB IOEP-EPROMPT ;2D DFB IOEP-EPROMPT ;2F ; MSB ON MO.B STR 'BACKUP' ;MAIN MENU TEXT MO.RS STR 'RESTORE' MO.F STR 'FORMAT' MO.RN STR 'RENAME' MO.D STR 'DELETE' MO.H STR 'HELP' MO.Q STR 'QUIT' ; MSB ON MO.RMM STR 'RETURN TO MAIN MENU' MO.EP STR 'EXIT TO PRODOS ' ; MSB ON COPR DS 40-10/2,SPACE ASC 'BACKUP 3.5' DS 1,RETURN DS 40-34/2,SPACE ASC 'COPYRIGHT 1987, MATTHEW LEE STIER' DS 1,RETURN DS 40,'-' DS 1,RETURN DFB $00 ; MSB ON TITLE EQU * BUTITLE DS 40-21/2,SPACE ASC '-BACKUP DISK TO FILE-' DS 2,RETURN DFB $00 ; RSTITLE DS 40-22/2,SPACE ASC '-RESTORE FILE TO DISK-' DS 2,RETURN DFB $00 ; F3TITLE DS 40-24/2,SPACE ASC '-FORMAT A STORAGE DISK -' DS 2,RETURN DFB $00 ; RNTITLE DS 40-16/2,SPACE ASC '-RENAME A FILE -' DS 2,RETURN DFB $00 ; DTITLE DS 40-16/2,SPACE ASC '-DELETE A FILE -' DS 2,RETURN DFB $00 ; QTITLE DS 40-6/2,SPACE ASC '-QUIT-' DFB $00 ; MSB ON PROMPT EQU * ; SPROMPT ASC 'SELECT SOURCE DRIVE' DS 1,RETURN DFB $00 ; TPROMPT ASC 'SELECT TARGET DRIVE' DS 1,RETURN DFB $00 ; VNPROMPT ASC ' ENTER VOLUMENAME: ' DFB $00 ; FNPROMPT ASC ' ENTER FILENAME: ' DFB $00 ; SFPROMPT ASC 'SELECT FILE TO RESTORE' DS 1,RETURN DFB $00 ; FEPROMPT ASC 'FILE ALREADY EXISTS -' DIPROMPT ASC ' DELETE IT? [Y/N]' DFB $00 ; IDPROMPT ASC ' INITIALIZE DISK? [Y/N]' DFB $00 ; SOPROMPT ASC 'SELECT OPTION' DS 1,RETURN DFB $00 ; MSGS EQU * RNMSG ASC ' RENAMING FILE' DFB $00 ; DMSG ASC ' DELETING FILE' DFB $00 ; CBMSG ASC ' COPYING BLOCKS' DFB $00 ; FDMSG ASC ' FORMATTING TARGET DISKETTE' DFB $00 ; AKMSG ASC ' USE ARROW KEYS AND [RETURN] TO SELECT' DFB $00 ; EPROMPT EQU * ; UKEP ASC 'UNKNOWN ERROR' DFB 0 ; SYSEP ASC 'SYSTEM ERROR' DFB 0 ; IOEP ASC 'I/O ERROR' DFB 0 ; DNCP ASC 'DEVICE NOT CONNECTED' DFB 0 ; WPEP ASC 'WRITE PROTECTED' DFB 0 ; PNFP ASC 'PATH/FILE(S) NOT FOUND' DFB 0 ; PSEP ASC 'PATHNAME SYNTAX ERROR' DFB 0 ; BUFREP ASC 'BUFFER ERROR' DFB 0 ; DFEP ASC 'DISK FULL' DFB 0 ; EOFP ASC 'END OF FILE' DFB 0 ; AEP ASC 'ACCESS ERROR' DFB 0 ; FOEP ASC 'FILE(S) OPEN' DFB 0 ; NPDEP ASC 'NOT A PRODOS DISK' DFB 0 ; DVFEP ASC 'DUPLICATE VOLUME/FILE FOUND' DFB 0 ; DS >$00-*,0 FNM.BUFR DS 256 ; DS >$00-*,0 MSB ON SLTDRV STR 'SLOT 0, DRIVE 1' STR 'SLOT 1, DRIVE 1' STR 'SLOT 2, DRIVE 1' STR 'SLOT 3, DRIVE 1' STR 'SLOT 4, DRIVE 1' STR 'SLOT 5, DRIVE 1' STR 'SLOT 6, DRIVE 1' STR 'SLOT 7, DRIVE 1' STR 'SLOT 0, DRIVE 2' STR 'SLOT 1, DRIVE 2' STR 'SLOT 2, DRIVE 2' STR 'SLOT 3, DRIVE 2' STR 'SLOT 4, DRIVE 2' STR 'SLOT 5, DRIVE 2' STR 'SLOT 6, DRIVE 2' STR 'SLOT 7, DRIVE 2' ; SBTL 'BACKUP.SYSTEM GLOBAL PAGE' ; DS $BE00-*,0 MSB ON ; ;BACKUP 3.5 GLOBAL PAGE ; COLDSTRT JMP MM.COLD ;JUMP TO PROGRAMS ENTRY POINT VOLNUM DS 1,0 ;DISK ][ VOLUME NUMBER ERROR.GP DS 1,0 ;BACKUP.SYSTEM ERROR CODE COPYDIR DS 1,0 ;DIRECTION TO COPY 0=D->F, 2=F->D DEVNUM.B DS 1,0 ;SAVED VALUE FROM PRODOS GLOBAL PAGE BU.REV DFB VERSION ;PROGRAM REVISION NUMBER DEVNUM5 DS 1,0 ;SELECTED DISK ][ DRIVE DEVCNT5 DS 1,0 ;NUMBER OF AVAILABLE DISK ]['S DEVLST5 DS 14,0 ;LIST OF DISK ][ DRIVES DEVNUM3 DS 1,0 ;SELECTED UNIDISK 3.5 DRIVE DEVCNT3 DS 1,0 ;NUMBER OF AVAILABLE UNIDISK 3.5'S DEVLST3 DS 14,0 ;LIST OF UNIDISK 3.5 DRIVES DISK5.T DW SLTDRV ;TABLE OF DISK ][ SLOT/DRIVE TITLES DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV ; DISK3.T DW SLTDRV ;TABLE OF UNIDISK 3.5 SLOT/DRIVE TITLES DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV DW SLTDRV ; FN.T DW 0*16+FNM.BUFR ;FILENAME TABLE INDEX DW 1*16+FNM.BUFR DW 2*16+FNM.BUFR DW 3*16+FNM.BUFR DW 4*16+FNM.BUFR DW 5*16+FNM.BUFR DW 6*16+FNM.BUFR DW 7*16+FNM.BUFR DW 8*16+FNM.BUFR DW 9*16+FNM.BUFR DW 10*16+FNM.BUFR DW 11*16+FNM.BUFR DW 12*16+FNM.BUFR DW 13*16+FNM.BUFR DW 14*16+FNM.BUFR DW 15*16+FNM.BUFR ; VOLNUM.T DS 16,0 ; DS >$90-*,0 COPYRITE ASC 'COPYRIGHT 1987, MATTHEW L. STIER' DS >$B0-*,0 ; ;PARAMETER TABLES ; QUIT.P DFB 4 DFB 0 DW 0 DFB 0 DW 0 ; RWB.P DFB 3 DFB 0 DW 0 DW 0 ; CREATE.P DFB 7 DW V5.BUFR DFB %11100011 DFB $F8 DW 0 DFB 1 DW 0 DW 0 ; DSTRY.P DFB 1 DW V5.BUFR ; GFI.P EQU * SFI.P DFB 7 DW 0 DFB 0 DFB 0 DW 0 DFB 0 DW 0 DW 0 DW 0 DW 0 DW 0 ; ONLINE.P DFB 2 DFB 0 DW 0 ; SETPFX.P DFB 1 DW V3.BUFR ; OPEN.P DFB 3 DW V5.BUFR DW FILEBUFR DFB 0 ; RWF.P DFB 4 DFB 0 DW DATABUFR DW 512*70 DW 0 ; CLOSE.P DFB 1 DFB 0 ; SMARK.P DFB 2 DFB 0 DS 3,0 ; RENAME.P DFB 2 DW V3.BUFR DW V5.BUFR ; BU.END EQU * ;