.TITLE LOAD .SBTTL BUILD AN CIL FROM AN LICIL ;*********************************************************************** ; ; BUILD A CIL FILE FROM AN LICIL ; ;*********************************************************************** LOAD:: CALL INDEXC ;CREATE AN INDEX BUFFER REGION MOV #CILCIC,R1 ;CLEAR VARIABLES IN CIL HEADER MOV #6,R2 ;# OF WORDS CALL BLANK ;DO IT MOV #INXARY,R1 ;POINT TO REGION MOV #10000,R2 ;LENGTH CALL BLANK ;CLEAR IT MOV #CILTIM,R4 ;STORAGE FOR DATE AND TIME CALL GDATE ;GET THE DATE OPEN$R #PRIINP,,,,,,PRIERR ;OPEN THE PRIMARY INPUT CALL READ ;GET A BLOCK MOV #INXARY+36,R2 ;POINT PAST ROOM FOR CIL HEADER CMP #1,(R4) ;HAVE WE GOT AN LICIL? BEQ .+6 ;OKAY SO FAR JMP UNDERR ;IF NOT, ERROR CMPB #4,6(R4) ;DEFINITELY A LICIL? BEQ .+6 ;YES JMP UNDERR ;ERROR OTHERWISE MOV 4(R4),CILBLP ;SAVE BLOCK LOAD ADDRESS MOV 4(R4),LILBLP ; CALL READ ;1ST BLOCK WAS USELESS;GET NEXT BLOCK MOV #36,CILISZ ;COUNT CIL HEADER IN INDEX SIZE CALL LODINX ;GO FIND ALL THE MODULE ENTRIES MOV CILISZ,R3 ;GET INDEX SIZE ADD #777,R3 ;ROUND UP TO EVEN BLOCK ASH #-9.,R3 ;GET # OF BLOCKS FOR INDEX MOV R3,INXSIZ ;SAVE FOR LATER RELATIVE BLK CALC. 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 THE DIRECTORY MOV R1,CILBK1 ;SAVE # OF 256. WORD BLOCKS MOV CILBK4,R1 ;GET TOTAL BYTES COUNT MOV CILBK3,R0 ; ADD CILISZ,R1 ;ADD IN INDEX SIZE ADC R0 ; ADD #177,R1 ;CALC # OF 64. WORD BLOCKS ADC R0 ; ASHC #-7,R0 ;(64.) MOV R1,CILBK3 ;SAVE # OF 64. WORD BLOCKS .PAGE MOV CILBK1,CILBK2 ;COPY ALL OVER MOV CILBK1,CILBK4 ; CLR CKSUM ;CLEAR IT AGAIN MOV #INXARY,R2 ;GET TO BEGINNING OF INDEX BUFFER MOV #CILHDR,R4 ;POINT TO CIL HEADER FORMAT MOV #16,R3 ;HEADER LENGTH 1$: MOV (R4)+,(R2)+ ;COPY HEADER TO FRONT OF BUFFER CALL CHECK ;CALC A CHECKSUM SOB R3,1$ ;LOOP CKS R2 ;SAVE THE CHECKSUM ; ; FIX THE RELATIVE BLOCK NUMBERS IN THE INDEX ; MOV INXSIZ,R0 ;SIZE IN BLOCKS OF INDEX MOV CILCIC,R1 ;COUNTER OF # OF ENTRIES IN INDEX 2$: MOV 12(R2),R3 ;GET MODULE SIZE ADD #777,R3 ;RE-CALC ITS SIZE ASH #-9.,R3 ;FOR FUTURE REL. BLOCK OFFSETS MOV R0,20(R2) ;SAVE REL. BLOCK OFFSET FOR THIS MODLE ADD R0,44(R2) ;RECALC CKSUM FOR THIS ENTRY SWAB R0 ; ADD R0,44(R2) ; SWAB R0 ; NEG 44(R2) ; BIC #177400,44(R2) ;WE ONLY WANT ONE BYTE CHECKSUM ADD R3,R0 ;GET NEXT REL BLOCK NUMBER ADD #LDAHDR+6,R2 ;GO TO NEXT ENTRY SOB R1,2$ ;LOOP FOR ALL ENTRIES MOV CILBK1,OUTCIL+F.CNTG ;SIGNAL THAT WE WANT 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 MOV #-2,PRIFLG ;FLAG THAT WE ARE AN LCL CLR SECFLG ;NO SECONDARY FILE JMP MKE ;AND CONTINUE .PAGE ;**************************************************************************** ; ; BUILD THE INDEX DIRECTORY FOR A CIL FROM THE INPUT LICIL ; R0 = FDB, R2 = BUFFER POINTER ; R4 = INPUT BUFFER POINTER ; ;**************************************************************************** LODINX: NEXT ;SKIP THE SPECIAL RECORD MOV #1,(R2)+ ;"1" LODX2: MOV R2,R1 ;SAVE WHERE WE ARE CMP #LDAHDR+4,(R4) ;ARE WE AT THE PROPER RECORD? BEQ 4$ ;YES CLR -(R2) ;ERASE THE EXTRA "1" MOV #1,F.BKVB+2(R0) ;REINIT FILE BLOCK POINTER FOR REREAD CLR F.BKVB(R0) ; RETURN ;IF NOT, RETURN 4$: MOV (R4),(R2)+ ;RECORD SIZE MOV (R4)+,R3 ;GET RECORD SIZE IN BYTES CALL DCHK ;CHECK FOR END OF BUFFER ASR R3 ;MAKE IT WORDS 1$: MOV (R4)+,(R2)+ ;COPY INPUT TO OUTPUT CALL DCHK ;CHECK FOR END OF INPUT BUFFER SOB R3,1$ ;LOOP INC CILCIC ;ONE MORE ENTRY CMP #MODNUM,CILCIC ;ARE WE OVER THE LIMIT? BGE .+6 ;NO, OKAY JMP OVRERR ;OVERFLOW ERROR ADD #LDAHDR+6,CILISZ ;COUNT THE TOTAL BYTES IN INDEX ADD 10(R1),CILBK2 ;KEEP A TOTAL # OF BYTES ADC CILBK1 ;FOR LATER CALCULATIONS ADD #777,CILBK2 ;ROUND UP TO NEAREST BLOCK ADC CILBK1 ; BIC #777,CILBK2 ;TRUNCATE IT THERE (256. WORD BLOCKS) ADD 10(R1),CILBK4 ;KEEP A TOTAL # OF BYTES ADC CILBK3 ;FOR LATER CALCULATIONS ADD #177,CILBK4 ;ROUND UP TO NEAREST BLOCK ADC CILBK3 ; BIC #177,CILBK4 ;TRUNCATE IT THERE (64. WORD BLOCKS) 2$: BUMP R1 ;MAKE SURE AT END OF RECORD MOV (R4)+,R3 ;NEXT RECORD SIZE MOV R3,R1 ;SAVE IT CALL DCHK ;CHECK FOR END OF BUFFER BIT #1,R3 ;ODD RECORD? BEQ .+4 ;NO INC R3 ;EVEN UP IF ODD ASR R3 ;MAKE IT A WORD COUNT 3$: TST (R4)+ ;SKIP OVER THIS WORD CALL DCHK ;CHECK FOR END OF BUFFER SOB R3,3$ ;LOOP THRU RECORD CMP #6,R1 ;END OF MODULE? BNE 2$ ;LOOP TIL DONE BUMP R1 ;MAKE SURE AT THE END OF RECORD BR LODX2 ;LOOP FOR NEXT MODULE ENTRY IN INDEX .PAGE ;************************************************************************* ; ; LOCAL ERROR ROUTINES ; ;************************************************************************* 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 .END