.TITLE EDIT .SBTTL PROCESS EDIT COMMANDS ON INPUT(S) ;*************************************************************************** ; ; PROCESS EDIT COMMANDS ON PRIMARY AND SECONDARY INPUTS ; ;*************************************************************************** EDIT:: CALL INDEXC ;CREATE THE REGION MOV #CILCIC,R1 ;CLEAR HEADER WORDS MOV #6,R2 ; CALL BLANK ;CLEAR IT MOV #INXARY,R1 ;ZERO OUT REGION INITIALLY MOV #10000,R2 ; CALL BLANK ;ZERO IT MOV #CILTIM,R4 ;POINT TO DATE/TIME STORAGE CALL GDATE ;GO GET CURRENT DATE AND TIME OPEN$R #PRIINP,,,,,,PRIERR ;OPEN PRIMARY INPUT CALL READ ;READ A BLOCK ; DETERMINE THE TYPES OF INPUT FILES CLR PRIFLG ;ASSUME PRIMARY INPUT IS CIL CMP #1,PRIBUF ;IS IT CIL OR LICIL? BEQ 1$ ;YES MOV #-1,PRIFLG ;NO, MUST BE LDA BR 3$ ;CONT 1$: CMPB #4,PRIBUF+6 ;LICIL? BNE 2$ ;NO MOV #-2,PRIFLG ;YES CALL READ ;SKIP MEANINGLESS BLOCK NEXT ;GET TO NEXT ENTRY BR 3$ ;CONT 2$: CMPB #3,PRIBUF+6 ;CIL? BEQ .+6 ;YES JMP UNDERR ;OTHERWISE TYPE IS UNKNOWN TST (R4)+ ;SKIP THAT "1" CALL DCHK ;CHECK FOR EOB NEXT ;GET TO 1ST ENTRY .PAGE 3$: CLR CODE ;INIT TST SECFLG ;DO WE HAVE A SECONDARY FILE? BEQ 6$ ;NO PUSH R4 ;SAVE SPOT IN PRIMARY OPEN$R #SECINP,,,,,,PRIERR ;OPEN SECONDARY INPUT CALL READ ;READ A BLOCK POP R4 ;RECOVER OUR BUFF PTR MOV #1,F.BKVB+2(R0) ;REINIT PRIMARY BLOCK NUMBER CLR SECFLG ;ASSUME PRIMARY INPUT IS CIL COM CODE ; CMP #1,PRIBUF ;IS IT CIL OR LICIL? BEQ 4$ ;YES MOV #-1,SECFLG ;NO, MUST BE LDA CLR CODE ; BR EDIT2 ;CONT 4$: CMPB #4,PRIBUF+6 ;LICIL? BNE 5$ ;NO MOV #-2,SECFLG ;YES CLR CODE ; BR EDIT2 ;CONT 5$: CMPB #3,PRIBUF+6 ;CIL? BEQ EDIT2 ;YES JMP UNDERR ;OTHERWISE TYPE IS UNKNOWN ; NO SECONDARY, MAKE SURE NO COMMAND REQUIRES SECONDARY 6$: MOV #ICMD,R2 ;COMMAND BUFFER PTR 7$: TST (R2) ;CHECK THRU ALL COMMANDS BMI EDIT2 ;CHECKED ALL IF NEGATIVE BIT #I!R,(R2) ;GOT A COMMAND REQUIRING A SEC INPUT? BEQ 10$ ;NO JMP MISERR ;ERROR IF YES 10$: ADD #12,R2 ;SKIP TO NEXT COMMAND BR 7$ ;LOOP .PAGE ;************************************************************************** ; ; NOW LOOP THRU INPUT FILES AND CMD BUFFER TO SET UP CIL INDEX ; ;************************************************************************** EDIT2: MOV #PRIINP,R0 ;FDB PTR PUSH R4 ;SAVE DEC F.BKVB+2(R0) ;REREAD LAST BLOCK INCASE ITS GONE CALL READ ;READ A BLOCK MOV #36,CILISZ ;INIT INDEX SIZE (36 IS SIZE OF HDR) MOV #INXARY+36,R3 ;WHERE TO START PUSH F.BKVB+2(R0) ; CALL DIR ;INITIAL DIRECTORY READ MOV LADR,CILBLP ;LOAD ADDRESS MOV LADR,LILBLP ; BR EDPLP2 ;CONT ; LOOP THRU PRIMARY INPUT MODULES AND INDIRECT COMMANDS, AND PROCESS EDPLOP: PUSH R4 ;SAVE WHERE WE ARE IN FILE CURRENTLY PUSH F.BKVB+2(R0) ; CALL DIROP ;GET A MODULE NAME FROM PRIMARY INPUT EDPLP2: BCC 1$ ;NOT DONE YET JMP EDEND ;OTHERWISE WE SHOULD BE DONE 1$: POP R5 ;BLOCK NUMBER POP R4 ;BUFFER POSITION CALL ERECVR ;GET BACK TO WHERE WE WERE(RECOVER) CALL SEARCH ;DOES THIS MODULE NEED TO ACTED ON? BCC 2$ ;YES ; IF NO COMMAND, JUST PASS THIS MODULE TO OUTPUT CALL EINDEX ;PUT 1ST PART INTO INDEX MOV #11,R5 ;AND DO THE REST 4$: MOV (R4)+,(R3)+ ;COPY CALL DCHK ;CHECK FOR EOB CALL ECHECK ;CALC CHECKSUM SOB R5,4$ ;LOOP MOV CKSUM,(R3)+ ;SAVE CHECKSUM SUB #4,R4 ;BACK UP A BIT CALL DIROP2 ;GET TO NEXT MODULE CORRECTLY JMP EDPLOP ;LOOP 2$: SUB #6,R2 ;GO BACK TO COMMAND BITS BIT #D,(R2) ;IS IT A DELETE? BEQ 3$ ;NO CLR (R2) ;SIGNAL COMMAND COMPLETION NXTHDR ;SKIP THIS MODULE JMP EDPLOP ;AND LOOP 3$: BIT #N,(R2) ;IS IT A CHANGE THE NAME? BEQ .+6 ;NO CALL ENAME ;YES BIT #R,(R2) ;IS IT A REPLACE MODULE? BEQ .+6 ;NO CALL ERPLCE ;YES BIT #I,(R2) ;IS IT AN INSERT NEW MODULE? BEQ .+6 ;NO CALL EINSRT ;YES JMP EDPLOP ;LOOP .PAGE ;***************************************************************************** ; ; CLEAN UP AND DUMP THE CIL INDEX ; ;***************************************************************************** EDEND: MOV #ICMD,R2 ;PTR TO COMMAND BUFFER 1$: TST (R2) ;WAS THE COMMAND COMPLETED? BMI EDEND2 ;AT THE END OF THE LIST BGT 2$ ;NOT COMPLETED 7$: ADD #12,R2 ;OKAY IF COMPLETED, CHECK NEXT ONE BR 1$ ;LOOP 2$: BIT #I,(R2)+ ;IS IT AN INSERT? BEQ 3$ ;IF NOT, WE NEVER FOUND THAT MODULE TST 4(R2) ;WAS IT AN INSERT AT THE END? BNE 3$ ;NO, SO MUST BE AN ERROR MOV #-3,4(R2) ;FLAG THE INSERT FROM SECONDARY CALL ELOCAT ;GO FIND FILE IN SEC. AND TACK ON END ADD #10,R2 ;NEXT COMMAND BR 1$ ;LOOP 3$: CALL MODNOT ;REPORT THE PROBLEM JMP RESTAR ;AND RESTART EDEND2: MOV #1,PRIINP+F.BKVB+2 ;INIT START BLOCKS IN INPUT FILES MOV #1,SECINP+F.BKVB+2 ; ; CLEAN UP CIL INDEX AND DUMP IT MOV CILISZ,R2 ;GET INDEX SIZE ADD #777,R2 ;ROUND UP TO EVEN BLOCK ASH #-9.,R2 ;GET # OF BLOCKS NEEDED FOR INDEX MOV R2,INXSIZ ;SAVE IT MOV CILBK2,R1 ;GET TOTAL BYTES COUNT MOV CILBK1,R0 ; ADD #777,R1 ;CALC # OF 256. WORD BLOCKS ADC R0 ; ASHC #-9.,R0 ;(256.) ADD INXSIZ,R1 ;DON'T FORGET DIRECTORY SIZE MOV R1,CILBK1 ;SAVE MOV CILBK4,R1 ;GET TOTAL BYTES COUNT MOV CILBK3,R0 ; ADD CILISZ,R1 ;ADD IN SIZE OF THE INDEX ADC R0 ; ADD #177,R1 ;CALC # OF 64. WORD BLOCKS ADC R0 ; ASHC #-7,R0 ;(64.) MOV R1,CILBK3 ;SAVE MOV CILBK1,CILBK2 ;COPY ALL OVER MOV CILBK1,CILBK4 ; CLR CKSUM ;CLEAR CHECKSUM MOV #INXARY,R3 ;GO TO BEGINNING OF INDEX BUFFER MOV #CILHDR,R4 ;POINT TO CIL HEADER FORMAT MOV #16,R2 ;HEADER LENGTH 15$: MOV (R4)+,(R3)+ ;COPY HEADER TO FRONT OF BUFFER CALL ECHECK ;CALC CHECKSUM SOB R2,15$ ;LOOP CKS R3 ;SAVE THE CHECKSUM .PAGE ; ; FIX THE RELATIVE BLOCK NUMBERS IN THE INDEX DIRECTORY ; MOV INXSIZ,R0 ;SIZE OF INDEX IN BLOCKS MOV CILCIC,R1 ;COUNTER OF # OF ENTRIES 6$: MOV 12(R3),R2 ;GET MODULE SIZE ADD #777,R2 ;ROUND UP ASH #-9.,R2 ;USE FOR FUTURE REL. BLOCK OFFSETS MOV R0,20(R3) ;SAVE RELATIVE BLOCK OFFSET ADD R0,44(R3) ;RECALC CKSUM SWAB R0 ; ADD R0,44(R3) ; SWAB R0 ; NEG 44(R3) ; BIC #177400,44(R3) ;WE ONLY WANT A BYTE CHECKSUM ADD R2,R0 ;GET NEXT BLOCK NUMBER ADD #LDAHDR+6,R3 ;GO TO NEXT ENTRY SOB R1,6$ ;LOOP MOV CILBK1,OUTCIL+F.CNTG ;SIGNAL THAT WE WANT A CONTIGUOUS FILE OPEN$W #OUTCIL,,,,,,CONERR ;TRY TO OPEN A CIL MOV CILISZ,R2 ;SIZE TO DUMP MOV #INXARY,R1 ;ADDRESS TO START AT CALL CILDMP ;DUMP THE BUFFER ; MAKE SURE ALL COMMANDS DONE; FIX UP CHANGES SO WE CAN FIND LATER MOV #ICMD,R2 ;PTR TO COMMAND BUFFER 1$: TST (R2) ;WAS THE COMMAND COMPLETED? BMI 4$ ;AT THE END OF THE LIST CMP #-1,6(R2) ;WAS THIS A NAME CHANGE? BEQ 5$ ;YES CMP #-2,6(R2) ;WAS IT A REPLACE? BEQ 2$ ;YES CMP #-3,6(R2) ;WAS IT AN INSERT? BEQ 2$ ;YES BR 7$ ;CONT 2$: FLGHDR ;FLAG IT BR 7$ ;CONT 5$: MOV 10(R2),R1 ;GET ADDRESS FOR NAME SUB #4,R1 ; MOV 2(R2),(R1)+ ;PUT OLD NAME BACK IN ORDER TO FIND... MOV 4(R2),(R1)+ ;...IT FOR THE COPY TO THE CIL LATER 7$: ADD #12,R2 ;OKAY IF COMPLETED, CHECK NEXT ONE BR 1$ ;LOOP 4$: TST PRIFLG ;CIL TYPE? BNE .+10 ;NO MOV #-3,PRIFLG ;CHANGE THE CODE FOR CIL TST CODE ;CHECK FLAG BEQ .+10 ;NO PROBLEM MOV #-3,SECFLG ;CHANGE CODE FOR CIL JMP MKE ;GO MAKE THE REST OF THE CIL .PAGE ;***************************************************************************** ; ; DO A NAME CHANGE ; ;***************************************************************************** ENAME: CLR (R2) ;SIGNAL THE COMMAND COMPLETION CALL EINDEX ;COPY IT TO CIL INDEX MOV 6(R2),(R3)+ ;USE THE NEW NAME MOV #-1,6(R2) ;FLAG THAT THIS WAS A NAME CHANGE TST (R4)+ ;SKIP THE OLD NAME CALL DCHK ;CHECK FOR EOB CALL ECHECK ;CALC CHECKSUM MOV 10(R2),(R3)+ ; MOV R3,10(R2) ;SAVE NAME ADDRESS SO WE CAN CHANGE IT TST (R4)+ ; CALL DCHK ;CHECK FOR EOB CALL ECHECK ;CALC CHECKSUM MOV #7,R5 ;COPY THE REST 1$: MOV (R4)+,(R3)+ ;COPY CALL DCHK ;CHECK FOR EOB CALL ECHECK ;CALC CHECKSUM SOB R5,1$ ;LOOP SUB #4,R4 ;BACK UP A BIT CALL DIROP2 ;GET TO NEXT MODULE MOV CKSUM,(R3)+ ;SAVE CHECKSUM RETURN ;AND RETURN ;**************************************************************************** ; ; RECOVER OUR LAST KNOWN POSITION IN THE DIRECTORY INDEX ; ;**************************************************************************** ERECVR: PUSH R4 ;GET BLOCK NUMBER CMP R5,F.BKVB+2(R0) ;DID WE MOVE? BNE .+6 ;YES 1$: POP R4 ;NO, SO DON'T REREAD RETURN ;AND RETURN DEC R5 ;BACK UP TO REREAD MOV R5,F.BKVB+2(R0) ;SET IT UP CALL READ ;GET BACK THAT BUFFER BR 1$ ;CONTINUE .PAGE ;***************************************************************************** ; ; DO A REPLACE MODULE ; ;**************************************************************************** ERPLCE: CLR (R2)+ ;SIGNAL THE COMMAND COMPLETION PUSH R4 ;SAVE TEMPORARILY ADD #4,R2 ;SKIP TO SECOND NAME CALL ELOCAT ;FIND IT IN SECONDARY INPUT POP R4 ;GET WHERE WE WERE NXTHDR ;JUST SKIP THIS MODULE SUB #6,R2 ;GET BACK TO COMMAND BITS MOV 6(R2),2(R2) ;MOVE THE NEW NAME UP MOV 10(R2),4(R2) ; MOV #-2,6(R2) ;FLAG THE REPLACE FROM SECONDARY RETURN ;AND RETURN ;***************************************************************************** ; ; DO A MODULE INSERT ; ;***************************************************************************** EINSRT: TST 6(R2) ;ARE THERE TWO NAMES BNE 2$ ;YES, SO PROCESS INSERT HERE CALL EINDEX ;JUST PUT THIS MODULE IN THE OUTPUT MOV #11,R5 ;DO THE REST 1$: MOV (R4)+,(R3)+ ;COPY CALL DCHK ;CHECK FOR EOB CALL ECHECK ;CALC CHECKSUM SOB R5,1$ ;LOOP SUB #4,R4 ;BACK UP A BIT CALL DIROP2 ;GET TO NEXT MODULE MOV CKSUM,(R3)+ ;COPY CHECKSUM RETURN ;AND RETURN 2$: CLR (R2)+ ;SIGNAL COMMAND COMPLETION PUSH R4 ;SAVE WHERE WE ARE ADD #4,R2 ;GET TO SECOND NAME CALL ELOCAT ;FIND IT POP R4 ;GET BACK SUB #6,R2 ;GET BACK TO COMMAND BITS MOV 6(R2),2(R2) ;MOVE THE NEW NAME UP MOV 10(R2),4(R2) ; MOV #-2,6(R2) ;FLAG THE REPLACE FROM SECONDARY RETURN ;KEEP USING THIS MODULE .PAGE ;***************************************************************************** ; ; COPY PART OF MODULE DIRECTORY ENTRY TO CIL INDEX BUFFER ; ;***************************************************************************** EINDEX: TST (R4)+ ;SKIP THE RECORD BYTE SIZE CALL DCHK ;CHECK FOR EOB CLR CKSUM ;CLEAR THE CHECKSUM MOV #1,(R3)+ ;SAVE A "1" MOV #LDAHDR+4,(R3)+ ;RECORD SIZE CALL ECHECK ;CALC CHECKSUM MOV #3,R5 ;COPY 3 WORDS 1$: MOV (R4)+,(R3)+ ;COPY CALL DCHK ;CHECK FOR EOB CALL ECHECK ;CALC CHECKSUM SOB R5,1$ ;LOOP INC CILCIC ;COUNT THE MODULE CMP #MODNUM,CILCIC ;CHECK FOR OVER THE LIMIT BGE .+6 ;NO JMP OVRERR ;OVER THE LIMIT ADD #LDAHDR+6,CILISZ ;COUNT THE SIZE OF ENTRY ADD (R4),CILBK2 ;KEEP COUNT OF TOTAL BYTES ADC CILBK1 ; ADD #777,CILBK2 ;ROUND UP TO 256. WORD BLOCKS ADC CILBK1 ; BIC #777,CILBK2 ;TRUNCATE ADD (R4),CILBK4 ;KEEP COUNT OF TOTAL BYTES ADC CILBK3 ; ADD #177,CILBK4 ;ROUND UP TO 64. WORD BLOCKS ADC CILBK3 ; BIC #177,CILBK4 ;TRUNCATE MOV #4,R5 ;COPY 4 MORE 2$: MOV (R4)+,(R3)+ ;COPY CALL DCHK ;CHECK FOR EOB CALL ECHECK ;CALC CHECKSUM SOB R5,2$ ;LOOP RETURN ;AND RETURN .PAGE ;************************************************************************* ; ; LOCATE A MODULE IN THE SECONDARY INPUT ; ;************************************************************************* ELOCAT: MOV #SECINP,R0 ;FDB PTR CALL READ ;READ A BLOCK TST SECFLG ;CIL? BNE 7$ ;NO TST (R4)+ ;SKIP THE "1" PUSH R3 ;SAVE NEXT ;SKIP HEADER IN CIL POP R3 ;RECOVER 7$: CMP #-2,SECFLG ;LICIL? BNE 6$ ;NO CALL READ ;SKIP A BLOCK IF YES PUSH R3 ;SAVE NEXT ;AND HEADER POP R3 ;RECOVER 6$: PUSH PRIFLG ;SAVE MOV SECFLG,PRIFLG ;FOR DIR'S BENEFIT PUSH R4 ;SAVE WHERE WE ARE IN FILE CURRENTLY PUSH F.BKVB+2(R0) ; CALL DIR ;INIT READ BR 1$ ;CONT 4$: PUSH R4 ;SAVE WHERE WE ARE IN FILE CURRENTLY PUSH F.BKVB+2(R0) ; CALL DIROP ;CHECK FOR NEXT MODULE BCC 1$ ;OKAY? POP R5 ;POP STACK TWICE TO CLEAN IT POP R5 ; CALL MODNOT ;REPORT THAT MODULE NOT FOUND JMP RESTAR ;RESTART 1$: POP R5 ;GET BLOCK NUMBER POP R4 ;BUFFER ADDRESS CALL ERECVR ;RECOVER OUR POSITION CMP (R2),NAME ;IS IT WHAT WE WANT? BNE 3$ ;NO CMP 2(R2),NAME+2 ;SO FAR SO GOOD BNE 3$ ;NO CALL EINDEX ;SEND PART TO OUTPUT MOV #11,R5 ;COPY THE REST 2$: MOV (R4)+,(R3)+ ;COPY CALL DCHK ;CHECK FOR EOB CALL ECHECK ;CALC CHECKSUM SOB R5,2$ ;LOOP MOV CKSUM,(R3)+ ;COPY CHECKSUM MOV #1,F.BKVB+2(R0) ;INIT BLOCK NUMBER CLR F.BKVB(R0) ; POP PRIFLG ;RECOVER MOV #PRIINP,R0 ;FDB PTR DEC F.BKVB+2(R0) ;BACK UP CALL READ ;RELOAD BUFFER RETURN ;AND RETURN 3$: NXTHDR ;GET TO NEXT MODULE JMP 4$ ;AND LOOP .PAGE ;************************************************************************ ; ; LOCAL ROUTINES ; ;************************************************************************ ECHECK: ADD -2(R3),CKSUM ;ADD ONCE SWAB -2(R3) ;SWAP BYTES ADD -2(R3),CKSUM ;AND ADD AGAIN SWAB -2(R3) ;PUT BYTES BACK RETURN ;RETURN CONERR: MOV #CONMG,R1 ;MESSAGE FORMAT CALL PRINT ;PRINT IT JMP RESTAR ;RESTART CONMG: .WORD CONMGL ;LENGTH .ASCII /CIL> *** ERROR OPENING CONTIGUOUS CIL FILE ***/ CONMGL = .-CONMG-2 .EVEN OVRERR: MOV #OVRMG,R1 ;MESSAGE FORMAT CALL PRINT ;PRINT IT JMP RESTAR ;RESTART OVRMG: .WORD OVRMGL ;LENGTH .ASCII /CIL> *** ERROR, OVERFLOW OF CIL INDEX DIRECTORY ***/ OVRMGL = .-OVRMG-2 .EVEN MISERR: MOV #MISMG,R1 ;MESSAGE FORMAT CALL PRINT ;PRINT IT JMP RESTAR ;RESTART MISMG: .WORD MISMGL ;LENGTH .ASCII /CIL> *** ERROR SECONDARY INPUT REQUIRED, BUT IS MISSING ***/ MISMGL = .-MISMG-2 .EVEN .END