.TITLE UICTRN ; ; PROGRAM UICTRN ; TO TRANSFER ALL FILES FROM A GIVEN DISK AND UIC ; TO ANOTHER DISK AND UIC. ; A DISK NAME MUST BE SPECIFIED ON BOTH INPUT AND OUTPUT ; A UIC IS OPTIONAL ON BOTH INPUT AND OUTPUT ; THE FOLLOWING SWITCHES MAY BE SPECIFIED ON OUTPUT SPEC ; /OL - PRESERVE OLD FILE IDENTIFICATION INFO IN HEADER ; DEFAULT: /OL ; /SU - SUPERSEDE OLD FILES WITH SAME NAME ; DEFAULT: /-SU ; /OW:XXX:XXX - SPECIFY OWNER ON OUTPUT ; IF NO SWITCH VALUE IS SPECIFIED, OWNER IS ; SAME AS OUTPUT UIC. IF NEGATED, OWNER IS ; SAME AS IN ORIGINAL FILE. ; DEFAULT: /-OW .CSECT ; ; MACRO CALLS: .MCALL GCMLB$ FDBDF$ FDRC$A FDOP$A FDBF$A .MCALL NMBLK$ CSI$ CSI$SW CSI$ND CSI$SV .MCALL FINIT$ DIR$ GCML$ CSI$1 CSI$2 .MCALL OPEN$R OPEN$ FDAT$R CLOSE$ GET$ .MCALL PUT$ MOUT$ MOWA$S EXIT$S FSRSZ$ .MCALL SVTK$ FHDOF$ .CSECT ; ; LISTS AND TABLES FHDOF$ DEF$L ;DEFINE FILE HEADER OFFSETS LOCALLY CMLBLK: GCMLB$ 1,TUI,FIDSPT,1 FIDSPT: .BLKW 41. INPFDB: FDBDF$ FDRC$A FD.PLC,BUF1,1000 FDOP$A 2,INPCSI+C.DSDS,,FO.RD,20 FDBF$A 2,,2,FD.RAH OUTFDB: FDBDF$ FDOP$A 3,OUTCSI+C.DSDS,OUTFNB,FO.WRT!FA.NSP,20 FDBF$A 3,,2,FD.WBH OUTFNB: NMBLK$ CSI$ .EVEN INPCSI: .BLKB C.SIZE .EVEN OUTCSI: .BLKB C.SIZE NAMSTR: .ASCII /*.*;*/ .EVEN TSWTCH: .WORD TS.OLD SWTBL: CSI$SW OL,TS.OLD,TSWTCH,SET,NEG CSI$SW SU,TS.SUP,TSWTCH,SET,NEG CSI$SW OW,TS.OWN,TSWTCH,SET,NEG,OWNVAL CSI$ND OWNVAL: CSI$SV OCTAL,UICOWN+2,2 CSI$SV OCTAL,UICOWN,2 CSI$ND UICOWN: .WORD 0 TS.OLD=1 TS.SUP=2 TS.OWN=4 UICSTO: .WORD 0 STKSAV: .WORD 0 FILCNT: .WORD 0 BUF1: .BLKB 1000 NATTR: .BLKB 56 OATTR: .BLKB 56 OPFLAG: .WORD 0 PARBL1: .WORD INPFDB+F.FNB .WORD FCNLS1 .WORD 0 FCNLS1: .BYTE -1,2 .WORD UICSTO .BYTE -5,56 .WORD IDINP .BYTE -2,3 .WORD CHRBUF .WORD 0 IDINP: .BLKB 56 PARBL4: .WORD OUTFDB+F.FNB .WORD FCNLS4 .WORD 0 FCNLS4: .BYTE 5,56 .WORD IDINP .WORD 0 VECDIR: SVTK$ VECTAB,7 VECTAB: .BLKW 6 .WORD TRPHDL CHRBUF: .BLKW 2 ; ; CODE SECTION START: FINIT$ MOV SP,STKSAV ;SAVE STACK POINTER DIR$ #VECDIR ;SET UP SST VECTOR TABLE START1: CLR FILCNT ;CLEAR FILE COUNTER GCML$ #CMLBLK ;GET COMMAND LINE BCC 1$ ;IF OK, BRANCH CMPB CMLBLK+G.ERR,#GE.EOF ;END OF FILE? BNE 14$ ;IF NOT, REPORT ERROR JMP EXIT 14$: TRAP TE.GCM ;ELSE REPORT ERROR 1$: CSI$1 #INPCSI,CMLBLK+G.CMLD+2,CMLBLK+G.CMLD BCC 2$ ;IF PRELIM CHECK OK, BRANCH TRAP TE.CS1 ;ELSE ERROR 2$: CSI$2 #INPCSI,INPUT ;CHECK FOR PROPER INPUT SPEC BCC 3$ ;IF OK, BRANCH TRAP TE.SWI ;ERROR 3$: BITB #CS.NMF,INPCSI+C.STAT ;FILE NAME STRING? BEQ 4$ ;IF NOT, OK TRAP TE.NMF ;ELSE ERROR 4$: BITB #CS.DVF,INPCSI+C.STAT ;DEVICE NAME STRING? BNE 5$ ;IF PRESENT, OK TRAP TE.DVF ;IF NOT, ERROR 5$: MOV #5,R0 ;NO. OF CHAR TO XFER MOV CMLBLK+G.CMLD+2,R1 ;START OF COMMAND LINE IN R1 ADD CMLBLK+G.CMLD,R1 ;END OF COMMAND LINE IN R1 MOV #NAMSTR,R2 ;START OF STRING TO XFER IN R2 6$: MOVB (R2)+,(R1)+ ;PERFORM SOB R0,6$ ;TRANSFER ADD #5,CMLBLK+G.CMLD ;INCREASE LENGTH OF LINE CSI$1 #INPCSI,CMLBLK+G.CMLD+2,CMLBLK+G.CMLD CSI$1 #OUTCSI,CMLBLK+G.CMLD+2,CMLBLK+G.CMLD BCC 7$ ;IF OK, BRANCH TRAP TE.CS1 ;ELSE ERROR 7$: CSI$2 #INPCSI,INPUT ;DO INPUT CSI$2 MOV #TS.OLD,TSWTCH ;INITIALIZE SWITCHES CLR UICOWN ;AND OWNER CLR UICOWN+2 CSI$2 #OUTCSI,OUTPUT,#SWTBL ;DO OUTPUT CSI$2 BCC 8$ ;OK, CONTINUE TRAP TE.OSW ;ELSE, SWITCH ERROR 8$: BITB #CS.NMF,OUTCSI+C.STAT ;WAS NAME SPECIFIED? BEQ 9$ ;IF NOT, OK TRAP TE.NMF ;ELSE ERROR 9$: BITB #CS.DVF,OUTCSI+C.STAT ;DEVICE SPECIFIED? BNE 10$ ;IF SO, OK TRAP TE.DVF ;ELSE ERROR 10$: BIT #TS.OWN,TSWTCH ;OWNER SWITCH SPECIFIED? BEQ 11$ ;IF NOT, SKIP PROCESSING TST UICOWN ;WAS VALUE FILLED IN? BEQ 12$ ;IF NOT, BRANCH MOVB UICOWN+2,UICOWN+1 ;SET UPPER BYTE OF UIC MOV UICOWN,R1 ;PUT UIC VALUE IN R1 BR 13$ 12$: BITB #CS.DIF,OUTCSI+C.STAT ;WAS DIR STRING SPEC'D IN OUTPUT? BEQ 11$ ;IF NOT, NOTHING TO DO MOV #OUTCSI+C.DIRD,R2 ;PUT DIRECTORY STRING DESC ADD IN R2 MOV #UICSTO,R3 ;TEMP. STORAGE ADD. IN R3 JSR PC,.ASCPP ;CONVERT STRING MOV UICSTO,R1 ;PUT VALUE IN R1 13$: JSR PC,.WFOWN ;AND CHANGE TO NEW FILE OWNER 11$: MOV #INPFDB,R0 ;SET UP REGISTERS MOV R0,R1 ;FOR .PARSE ADD #F.FNB,R1 ;ROUTINE MOV #INPCSI+C.DSDS,R2 CLR R3 JSR PC,.PARSE NXTFIL: MOV #INPFDB,R0 ;SET UP REGISTERS MOV #INPFDB+F.FNB,R1;FOR .FIND JSR PC,.FIND BCC 1$ ;IF OK, BRANCH JMP DONE ;ON ERROR PROBABLY DONE 1$: OPEN$R ;OPEN INPUT FILE BCC 21$ ;CHECK FOR ERROR TRAP TE.OPI 21$: MOV #OUTFNB,R2 ;SET UP REGISTERS FOR ADD #N.FNAM,R2 ;TRANSFER OF FILE NAME MOV R1,R3 ;INFO FROM INPUT FNB ADD #N.FNAM,R3 ;TO OUTPUT DEFAULT FNB MOV #5,R4 15$: MOV (R3)+,(R2)+ SOB R4,15$ MOV #INPFDB,R0 ;DO READ ATTRIBUTES MOV #IO.RAT,R1 ;FOR OWNER, ID AREA MOV #3,R2 ;AND USER CONTROLLED MOV #PARBL1,R3 ;CHARACTERISTICS OF JSR PC,.XQIO ;INPUT FILE BCC 17$ ;IF OK, BRANCH TRAP TE.RAT ;ELSE ERROR 17$: DEC IDINP+12 ;DECREMENT REVISION COUNT BIT #TS.OWN,TSWTCH ;OWNER SWITCH SPEC'D? BNE 16$ ;IF SO, SKIP OWNER CHANGE MOV UICSTO,R1 ;PUT NEW OWNER UIC JSR PC,.WFOWN ;IN FSR 16$: MOV #FO.WRT,OPFLAG ;SET BIT FOR WRITE BITB #UC.CON,CHRBUF+2;IS FILE CONTIGUOUS? BEQ 28$ ;BRANCH IF NOT MOV INPFDB+F.HIBK+2,OUTFDB+F.CNTG ;ALLOC SAME SPACE BR 27$ 28$: MOV INPFDB+F.EFBK+2,OUTFDB+F.CNTG ;ALLOC USED SPACE ONLY TST INPFDB+F.FFBY ;EOF AT START OF BLOCK? BNE 26$ ;IF SO DEC OUTFDB+F.CNTG ;CAN REDUCE # BLOCKS BY 1 26$: NEG OUTFDB+F.CNTG ;IF NOT, NEGATE 27$: BIT #TS.SUP,TSWTCH ;HAS SUPERSEDE BEEN SPEC'D? BNE 18$ ;IF SO, SKIP BIS #FA.NSP,OPFLAG ;SET NO SUPERSEDE BIT 18$: MOV #INPFDB,R1 ;INIT FILE ATTRIBUTES SECTION FDAT$R #OUTFDB,F.RTYP(R1),F.RATT(R1),F.RSIZ(R1) OPEN$ #OUTFDB,OPFLAG ;OPEN OUTPUT FILE BCC 20$ ;OK, BRANCH CMPB #IE.DUP,F.ERR(R0) ;IS IT DUP FILE NAME BNE 2$ ;IF NOT BRANCH TRAP TM.SUP ;PRINT ERROR FOR SUPERSEDE BR 3$ ;GET NEXT FILE 2$: TRAP TE.OPO ;ELSE OPEN ERROR 20$: BIT #TS.OLD,TSWTCH ;KEEP OLD ID AREA INFO? BEQ 24$ ;IF NOT, SKIP THIS MESS MOV #OUTFDB,R0 ;WRITE OUT NEW MOV #IO.WAT,R1 ;ATTRIBUTES MOV #3,R2 MOV #PARBL4,R3 JSR PC,.XQIO BCC 24$ ;IF OK, PROCEED TRAP TE.WAT+1 ;ELSE REPORT ERROR 24$: JSR PC,TRNSFR ;DO BLOCK TRANSFER INC FILCNT ;UPDATE FILE COUNT 3$: CLOSE$ #INPFDB ;CLOSE INPUT CLOSE$ #OUTFDB ;CLOSE OUTPUT JMP NXTFIL ;GET NEXT FILE DONE: CMPB INPFDB+F.ERR,#IE.NSF ;ARE WE AT END OF FILES? BEQ 1$ ;IF SO, DO NORMAL FINISH TRAP TE.DON ;ELSE REPORT ERROR 1$: TRAP TM.DON ;REPORT SUCCESS!! JMP START1 ;GET ANOTHER COMMAND ; ; SUBROUTINE TRNSFR ; TO PERFORM BLOCK TRANSFER FROM OLD TO NEW FILE ; BOTH OLD AND NEW FILES ARE ASSUMED TO BE OPEN TRNSFR: GET$ #INPFDB ;READ RECORD (LOCATE MODE) BCC 1$ ;IF OK, GO WRITE CMPB #IE.EOF,F.ERR(R0) ;END OF FILE? BEQ END ;IF YES, DONE TRAP TE.RDR ;ELSE ERROR 1$: PUT$ #OUTFDB,INPFDB+F.NRBD+2,INPFDB+F.NRBD ;WRITE RECORD BCC TRNSFR ;IF OK, GET ANOTHER RECORD TRAP TE.WRR ;ELSE ERROR END: RTS PC ;RETURN ON EOF ; ; TRPHDL - TRAP HANDLER ; ERROR PROCESSING FOR UICTRN PROGRAM ; ; DEFINE TRAP ERROR VALUES ; ; GCML - CSI ERRORS TE.GCM=1. ;GET COMMAND LINE ERROR TE.CS1=2. ;COMMAND STRING SYNTAX ERROR TE.SWI=3. ;NO SWITCHES ALLOWED ON INPUT SPEC TE.OSW=4. ;SWITCH ERROR ON OUTPUT FILE TE.DVF=5. ;MISSING DEVICE SPEC TE.NMF=6. ;NO FILE NAMES ALLOWED ; ; FCS TYPE ERRORS - EVEN FOR INPUT FDB, ODD FOR OUTPUT TE.OPI=20. ;ERROR ON INPUT OPEN TE.OPO=21. ;ERROR ON OUTPUT OPEN TE.RAT=22. ;READ ATTRIBUTES ERROR TE.WAT=24. ;WRITE ATTRIBUTES ERROR TE.DON=26. ;FIND ERROR TE.RDR=28. ;READ RECORD ERROR TE.WRR=29. ;WRITE RECORD ERROR ; ; MESSAGE TRAPS TM.DON=100. ;FINISHED WITH CURRENT COMMAND TM.SUP=101. ;FILE NOT SUPERSEDED ; ; MO LISTS AND TABLES MODPBE: MOUT$ STRDSC,PARLMO,0,CONT,SYLOG,BUF1,1000,MOSTAT,4 STRDSC: .WORD 3 .WORD MOSTRG MOSTRG: .ASCII /%VA%LON %VA FILE, FCS CODE = %D, FILE: %X/ GC1: .ASCII /GET COMMAND LINE ERROR/ GC2: .ASCII /COMMAND STRING SYNTAX ERROR/ GC3: .ASCII /NO SWITCHES ALLOWED ON INPUT SPEC/ GC4: .ASCII /SWITCH ERROR ON OUTPUT FILE/ GC5: .ASCII /MISSING DEVICE SPEC/ GC6: .ASCII /NO FILE NAMES ALLOWED/ GC7: FCS1: .ASCII /FILE OPEN ERROR/ FCS2: .ASCII /READ ATTRIBUTES ERROR/ FCS3: .ASCII /WRITE ATTRIBUTES ERROR/ FCS4: .ASCII /FIND ERROR/ FCS5: .ASCII "RECORD I/O ERROR" FCS6: .ASCII /FILE ALREADY EXISTS - NOT SUPERSEDED/ FCS7: FILI: .ASCII /INPUT/ FILO: .ASCII /OUTPUT/ FIL: .EVEN .MACRO ERD P1,P2 .WORD P2-P1 .WORD P1 .ENDM GCD1: ERD GC1,GC2 GCD2: ERD GC2,GC3 GCD3: ERD GC3,GC4 GCD4: ERD GC4,GC5 GCD5: ERD GC5,GC6 GCD6: ERD GC6,GC7 FCD1: ERD FCS1,FCS2 FCD2: ERD FCS2,FCS3 FCD3: ERD FCS3,FCS4 FCD4: ERD FCS4,FCS5 FCD5: ERD FCS5,FCS6 FCD6: ERD FCS6,FCS7 FILDI: ERD FILI,FILO FILDO: ERD FILO,FIL .EVEN PARLMO: .WORD 0,0 ;SPACE FOR MESSAGE STRING DESCRIPTOR .WORD 0,0 ;INPUT/OUTPUT DESCRIPTOR .WORD 0 ;FCS CODE FILNAM: .BLKW 5 ;SPACE FOR FILE NAME INFO ; MODPBM: MOUT$ MSGDSC,PARLMG,0,CONT,SYLOG,BUF1,1000,MOSTAT,4 MSGDSC: .WORD 29. .WORD MESTRG MESTRG: .ASCII /FINISHED TRANSFER OF %D FILES/ .EVEN PARLMG: .WORD 0 ;SPACE FOR FILE COUNTER MOSTAT: .BLKW 2 ;STATUS BLOCK FOR MO QIO ; ; TRAP HANDLING CODE TRPHDL: MOV (SP)+,R5 ;POP 2*TRAP VALUE FROM STACK CMP R5,#200. ;IS IT MESSAGE (<=100.) BGE MESOUT ;IF SO, BRANCH MOV #PARLMO,R4 ;PARAM LIST ADDRESS IN R4 MOV #3,STRDSC ;ASSUME SHORT MESSAGE CMP R5,#40. ;NEED FCS INFO? BLT 4$ ;IF NOT, SKIP BIC #2,R5 ;GET EVEN TRAP OFFSET IN R5 ADD #FCD1-40.,R5 ;R5=FCS STR DESC ADDRESS BR 5$ 4$: ASL R5 ;ACCOUNT FOR 2 WORD DESCRIPTOR ADD #GCD1-4,R5 ;R5=STR DESC. ADDRESS 5$: MOV (R5)+,(R4)+ ;MOVE IN STRING DESCRIPTOR MOV (R5)+,(R4)+ CMP R5,#FCD1 ;FCS INFO NEEDED? BLOS ERROUT ;IF NOT GO TO OUTPUT MOV #INPFDB,R0 ;INPUT FDB ADDRESS IN R0 MOV #FILDI,R3 ;INPUT DESCRIPTOR ADDRESS BIT #2,-2(SP) ;ODD TRAP? BEQ 6$ ;IF EVEN, THEN INPUT FILE MOV #OUTFDB,R0 ;ELSE OUTPUT FILE WANTED MOV #FILDO,R3 6$: MOV (R3)+,(R4)+ ;MOVE IN/OUT SPEC TO MOV (R3)+,(R4)+ ;PARAM LIST 2$: MOVB F.ERR(R0),R1 ;FCS ERROR CODE IN R1 (SIGN EXTEND) MOV R1,(R4)+ ;PUT IT IN PARAM LIST ADD #F.FNB+N.FNAM,R0;R0 POINTS TO FILE NAME MOV #5,R1 ;SET UP FOR NAME TRANSFER 3$: MOV (R0)+,(R4)+ ;PUT 5 WORDS OF FILE NAME SOB R1,3$ ;INTO PARAM LIST MOV #41.,STRDSC ;LONG STRING WANTED ERROUT: DIR$ #MODPBE ;PERFORM QIO BCS EXIT ;IF ERROR, EXIT MOWA$S ;WAIT FOR MESSAGE MOV STKSAV,SP ;RESTORE ORIGINAL STACK CLOSE$ #INPFDB ;CLOSE OLD IN AND CLOSE$ #OUTFDB ;OUT FDB'S JMP START1 ;GO GET NEXT COMMAND MESOUT: SUB #200.,R5 ;GET OFFSET IN R5 JMP @MSGTBL(R5) ;AND DO IT MSGTBL: .WORD DONMSG .WORD SUPMSG DONMSG: MOV FILCNT,PARLMG ;FILE COUNT IN PARAM LIST DIR$ #MODPBM ;PERFORM QIO RETURN: BCS EXIT ;IF ERROR, EXIT MOWA$S ;WAIT FOR EVENT FLAG BCS EXIT ;IF ERROR, EXIT RTT ;RETURN TO MAIN PROGRAM EXIT: CLOSE$ #INPFDB CLOSE$ #OUTFDB EXIT$S SUPMSG: MOV #41.,STRDSC MOV #PARLMO,R4 MOV #FCD6,R5 MOV (R5)+,(R4)+ MOV (R5)+,(R4)+ MOV #FILDO,R3 MOV (R3)+,(R4)+ MOV (R3)+,(R4)+ MOVB F.ERR(R0),R1 MOV R1,(R4)+ ADD #F.FNB+N.FNAM,R0 MOV #5,R1 1$: MOV (R0)+,(R4)+ SOB R1,1$ DIR$ #MODPBE BR RETURN FSRSZ$ 4 .END START