.TITLE MAKE .SBTTL MAKE THE CIL FILE FROM THE INPUT(S) ;************************************************************************* ; ; THIS IS WHERE THE CORE IMAGES ARE MADE AND PUT INTO THE CIL ; ;************************************************************************* MAKE:: MOV #INXARY+40,R3 ;PTR TO 1ST ENTRY MOV #INXARY+10000,R1 ;INDEX POINTER MOV #4000,R2 ;SIZE CALL BLANK ;ZERO IT OUT TST LCLFLG ;GOT AN LICIL TO CREATE? BEQ .+6 ;NO CALL LCLHDR ;CREATE THE SPECIAL LICIL HEADER BIT #ED,FLAG ;IF EDIT, TAKE FROM PRI. THEN SEC. BNE 1$ ;YES MOV #SECINP,MKONE ;OTHERWISE, CHECK SEC. INPUT 1ST MOV SECFLG,MKONE+2 ; MOV #PRIINP,MKTWO ;FOLLOWED BY PRI INPUT MOV PRIFLG,MKTWO+2 ; BR MKELOP ;CONT 1$: MOV #PRIINP,MKONE ;IF EDIT, CHECK PRI INPUT 1ST MOV PRIFLG,MKONE+2 ; MOV #SECINP,MKTWO ;THEN SEC. INPUT IF REQUESTED MOV SECFLG,MKTWO+2 ; MKELOP: TST CILCIC ;DONE ALL ENTRIES? BNE .+6 ;NO JMP MKEND ;WE ARE DONE! MOV 4(R3),MKCDE ;IS THIS SPECIAL GET FROM SEC. REQ.? BMI 1$ ;YES, SO FIND FILE IN OTHER INPUT MOV MKONE,R0 ;GET FDB TST MKONE+2 ;DO WE HAVE A THIS FILE BEQ 1$ ;NO CALL READ ;READ A BLOCK MOV #-1,R2 ;FLAG CMP #-1,MKONE+2 ;GOT AN LDA TYPE? BEQ 2$ ;YES CMP #-2,MKONE+2 ;GOT AN LCL TYPE? BEQ 3$ ;YES CALL MKCIL ;MUST BE A CIL TYPE BCS 1$ ;DIDN'T FIND IT IN THIS INPUT BR 10$ ;GOT IT; LOOK FOR NEXT ONE 2$: CALL MKLDA ;READ LDA TYPE BCS 1$ ;DIDN'T FIND IT IN THIS INPUT BR 10$ ;LOOK FOR NEXT ONE 3$: CALL MKLCL ;READ LCL TYPE BCS 1$ ;DIDN'T FIND IT IN THIS INPUT BR 10$ ;LOOK FOR NEXT ONE .PAGE ; CHECK OTHER INPUT FILE 1$: MOV #1,F.BKVB+2(R0) ;RESET THIS FILE CLR F.BKVB(R0) ; TST MKCDE ;SPECIAL REQUEST FOR SECONDARY INPUT? BMI 6$ ;OKAY BIT #ED,FLAG ;EDIT MODE? BEQ .+6 ;CONTINUE IF NOT JMP INERR ;ERROR OTHERWISE 6$: MOV MKTWO,R0 ;NOW CHECK OTHER FILE TST MKTWO+2 ;GOT THIS INPUT? BNE .+6 ;OKAY JMP INERR ;ERROR OTHERWISE CALL READ ;READ A BLOCK MOV #-1,R2 ;FLAG CMP #-1,MKTWO+2 ;GOT AN LDA TYPE? BEQ 4$ ;YES CMP #-2,MKTWO+2 ;GOT AN LCL TYPE? BEQ 5$ ;YES CALL MKCIL ;MUST BE A CIL TYPE BR 10$ ;GOT IT; LOOK FOR NEXT ONE 4$: CALL MKLDA ;READ LDA TYPE BR 10$ ;LOOK FOR NEXT ONE 5$: CALL MKLCL ;READ LCL TYPE BR 10$ ;LOOK FOR NEXT ONE .PAGE ; COMMON EXIT 10$: MOV #1,F.BKVB+2(R0) ;RESET PRIMARY FILE CLR F.BKVB(R0) ; MOV SIZE,R2 ;GET SIZE OF MODULE JUST TRANSFERRED ADD #777,R2 ;ROUND UP BIC #777,R2 ;AND TRUNCATE MOV #INXARY+10000,R1 ;ALL MODULES START HERE CALL CILDMP ;DUMP IT TO THE CIL MOV SIZE,R2 ;GET ACTUAL SIZE TST LCLFLG ;GOT TO CREATE AN LICIL? BEQ .+6 ;NO CALL LCLDMP ;YES, DO IT MOV #INXARY+10000,R1 ;ALL MODULES START HERE ASR R2 ;MAKE SIZE A WORD COUNT CALL BLANK ;AND BLANK OUT WHAT WE JUST DID DEC CILCIC ;COUNT THE ENTRY ADD (R3)+,R3 ;GO TO THE NEXT ENTRY JMP MKELOP ;LOOP ; ; END OF CIL BUILD ; MKEND: TST LCLFLG ;HAVE WE BEEN BUILDING AN LICIL? BEQ MKEND2 ;NO CMP #LILBUF,LCLPTR ;ANY EXTRA NOT DUMPED YET? BEQ MKEND2 ;NO MOV LCLPTR,R4 ;GET OUR POINTER MOV #77777,(R4)+ ;SIGNAL EOF MOV #77777,(R4) ; MOV #OUTLIL,R0 ;FDB CALL WRITE ;FINISH IT UP MKEND2: JMP RESTAR ;AND RESTART ; ; LOCAL STORAGE ; MKONE: .WORD 0,0 MKTWO: .WORD 0,0 MKCDE: .WORD 0 .PAGE ;***************************************************************************** ; ; MAKE A CORE IMAGE FROM AN LDA FILE ; ;***************************************************************************** MKLDA: BR 2$ ;WE SHOULD HAVE HEADER 1ST 100$: CMP #2,(R4) ;GOT THE END OF FILE RECORD? BEQ 1$ ;YES JMP 50$ ;PROCESS ORDINARY RECORDS 1$: TST (R4)+ ;SKIP RECORD SIZE CALL DCHK ;CHECK FOR EOB TST (R4)+ ;SKIP START ADDRESS CALL DCHK ;CHECK FOR EOB TST R2 ;HAVE WE FOUND THE ONE WE WANTED? BNE .+4 ;IF NEGATIVE, NO RETURN ;IF WE HAVE, RETURN CMP #LDAHDR,(R4) ;HAVE WE GOT ANOTHER FILE HEADER? BEQ 2$ ;YES SEC ;FLAG THE FACT WE DIDN'T FIND IT RETURN ; 2$: TST (R4)+ ;SKIP RECORD SIZE CALL DCHK ;CHECK FOR EOB MOV (R4)+,LADR ;SAVE LOAD ADDRESS CALL DCHK ;CHECK FOR EOB TST (R4)+ ;SKIP FLAG WORD CALL DCHK ;CHECK FOR EOB TST (R4)+ ;SKIP ADDRESS CALL DCHK ;CHECK FOR EOB MOV (R4)+,SIZE ;SAVE MODULE SIZE CMP MODSIZ,SIZE ;WILL IT FIT IN THE REGION? BGE .+6 ;YES JMP SIZERR ;NO, ERROR CALL DCHK ;CHECK FOR EOB MOV #3,R1 ;SKIP 3 WORDS 3$: TST (R4)+ ;SKIP A WORD CALL DCHK ;CHECK FOR EOB SOB R1,3$ ;LOOP MOV #7,R1 ;SKIP COUNT CMP (R4)+,20(R3) ;IS THIS THE MODULE WE WANT? BEQ 4$ ;OKAY, SO FAR CALL DCHK ;CHECK FOR EOB INC R1 ;JUST SKIP 2ND WORD OF NAME BR 5$ ;CONT 4$: CALL DCHK ;CHECK FOR EOB CMP (R4)+,22(R3) ;DOES THE ENTIRE NAME MATCH? BNE .+4 ;NO, NOT COMPLETE MATCH CLR R2 ;FLAG IT AS FOUND CALL DCHK ;CHECK FOR EOB 5$: TST (R4)+ ;SKIP A WORD CALL DCHK ;CHECK FOR EOB SOB R1,5$ ;LOOP .PAGE 50$: TST R2 ;IS THIS IT? BNE 10$ ;NO,JUST SKIP TO NEXT MOV (R4)+,R1 ;GET RECORD SIZE CALL DCHK ;CHECK FOR EOB MOV (R4)+,R5 ;ADDRESS CALL DCHK ;CHECK FOR EOB SUB #2,R1 ;COUNT THE ADDRESS WORD SUB LADR,R5 ;FIGURE OFFSET IN CORE IMAGE ADD #INXARY+10000,R5 ;GET ADDRESS IN CORE IMAGE BUFFER 6$: MOVB (R4)+,(R5)+ ;COPY WORDS TO BUFFER CALL DCHK ;CHECK FOR EOB SOB R1,6$ ;LOOP BIT #1,R4 ;WAS IT AN ODD BYTE? BEQ 7$ ;NO TSTB (R4)+ ;YES, EVEN US UP CALL DCHK ;CHECK FOR END 7$: JMP 100$ ;CONTINUE 10$: PUSH R3 ;SAVE NEXT ;SKIP THIS RECORD POP R3 ;RECOVER JMP 100$ ;CONTINUE .PAGE ;*************************************************************************** ; ; MAKE A CORE IMAGE FROM AN LICIL FILE ; ;*************************************************************************** MKLCL: CALL READ ;GET THE 1ST USEFUL BUFFER PUSH R3 ;SAVE NEXT ;GO TO 1ST HEADER POP R3 ;RESTORE BR 2$ ;WE SHOULD HAVE HEADER 1ST 100$: CMP #6,(R4) ;GOT THE END OF FILE RECORD? BEQ 1$ ;YES JMP 50$ ;PROCESS ORDINARY RECORDS 1$: PUSH R3 ;SAVE NEXT ;GET NEXT RECORD POP R3 ;RESTORE BUMP R1 ;MAKE SURE WE GOT IT TST R2 ;HAVE WE FOUND THE ONE WE WANTED? BNE .+4 ;IF NEGATIVE, NO RETURN ;IF WE HAVE, RETURN CMP #LDAHDR+4,(R4) ;HAVE WE GOT ANOTHER FILE HEADER? BEQ 2$ ;YES SEC ;FLAG THE FACT WE DIDN'T FIND IT RETURN ; 2$: TST (R4)+ ;SKIP RECORD SIZE CALL DCHK ;CHECK FOR EOB MOV (R4)+,LADR ;SAVE LOAD ADDRESS CALL DCHK ;CHECK FOR EOB TST (R4)+ ;SKIP FLAG WORD CALL DCHK ;CHECK FOR EOB TST (R4)+ ;SKIP ADDRESS CALL DCHK ;CHECK FOR EOB MOV (R4)+,SIZE ;SAVE MODULE SIZE CMP MODSIZ,SIZE ;WILL IT FIT IN THE REGION? BGE .+6 ;YES JMP SIZERR ;NO, ERROR CALL DCHK ;CHECK FOR EOB MOV #3,R1 ;SKIP 3 WORDS 3$: TST (R4)+ ;SKIP A WORD CALL DCHK ;CHECK FOR EOB SOB R1,3$ ;LOOP MOV #11,R1 ;SKIP COUNT CMP (R4)+,20(R3) ;IS THIS THE MODULE WE WANT? BEQ 4$ ;OKAY, SO FAR CALL DCHK ;CHECK FOR EOB INC R1 ;JUST SKIP 2ND WORD OF NAME BR 5$ ;CONT 4$: CALL DCHK ;CHECK FOR EOB CMP (R4)+,22(R3) ;DOES THE ENTIRE NAME MATCH? BNE .+4 ;NO, NOT COMPLETE MATCH CLR R2 ;FLAG IT AS FOUND CALL DCHK ;CHECK FOR EOB 5$: TST (R4)+ ;SKIP A WORD CALL DCHK ;CHECK FOR EOB SOB R1,5$ ;LOOP BUMP R1 ;MAKE SURE AT END OF RECORD .PAGE 50$: TST R2 ;IS THIS IT? BNE 10$ ;NO,JUST SKIP TO NEXT MOV (R4)+,R1 ;GET RECORD SIZE CALL DCHK ;CHECK FOR EOB MOV (R4)+,R5 ;ADDRESS CALL DCHK ;CHECK FOR EOB SUB #2,R1 ;COUNT THE ADDRESS WORD SUB LADR,R5 ;FIGURE OFFSET IN CORE IMAGE ADD #INXARY+10000,R5 ;GET ADDRESS IN CORE IMAGE BUFFER 6$: MOVB (R4)+,(R5)+ ;COPY WORDS TO BUFFER CALL DCHK ;CHECK FOR EOB SOB R1,6$ ;LOOP BIT #1,R4 ;WAS IT AN ODD BYTE? BEQ 7$ ;NO TSTB (R4)+ ;YES, EVEN US UP CALL DCHK ;CHECK FOR END 7$: BUMP R1 ;MAKE SURE AT END OF RECORD JMP 100$ ;CONTINUE 10$: PUSH R3 ;SAVE NEXT ;SKIP THIS RECORD BUMP R1 ;MAKE SURE AT END OF RECORD POP R3 ;RECOVER JMP 100$ ;CONTINUE .PAGE ;*************************************************************************** ; ; MAKE A CORE IMAGE FROM A CIL FILE ; ;*************************************************************************** MKCIL: TST (R4)+ ;SKIP THE "1" CALL DCHK ;CHECK FOR EOB PUSH R3 ;SAVE NEXT ;GO TO NEXT RECORD POP R3 ;RESTORE MKCLOP: CMP #LDAHDR+4,(R4)+ ;IS THERE ANOTHER MODULE? BEQ 1$ ;OKAY SEC ;SIGNAL THE END RETURN ;RETURN 1$: CALL DCHK ;CHECK FOR EOG MOV (R4)+,LADR ;SAVE LOAD ADDRESS CALL DCHK ;CHECK FOR EOB TST (R4)+ ;SKIP FLAG WORD CALL DCHK ;CHECK FOR EOB TST (R4)+ ;SKIP ADDRESS CALL DCHK ;CHECK FOR EOB MOV (R4)+,SIZE ;SAVE MODULE SIZE CMP MODSIZ,SIZE ;WILL IT FIT IN THE REGION? BGE .+6 ;YES JMP SIZERR ;NO, ERROR CALL DCHK ;CHECK FOR EOB TST (R4)+ ;SKIP CALL DCHK ;CHECK FOR EOB TST (R4)+ ;SKIP CALL DCHK ;CHECK FOR EOB MOV (R4)+,BLOCK ;SAVE REL. BLOCK NUMBER CALL DCHK ;CHECK FOR EOB INC BLOCK ;MAKE IT VIRTUAL MOV #11,R1 ;SKIP REST OF ENTRY CMP (R4)+,20(R3) ;GOT THE RIGHT ENTRY? BEQ 2$ ;MATCHS SO FAR CALL DCHK ;CHECK FOR EOB INC R1 ;EXTRA WORD TO SKIP BR 3$ ;CONT 2$: CALL DCHK ;CHECK FOR EOB CMP (R4)+,22(R3) ;GOT THE EXACT ENTRY? BNE .+4 ;NOT IT CLR R2 ;SIGNAL THAT WE FOUND IT CALL DCHK ;CHECK FOR EOB .PAGE 3$: TST (R4)+ ;SKIP CALL DCHK ;CHECK FOR EOB SOB R1,3$ ;LOOP TST R2 ;DID WE FIND IT? BNE MKCLOP ;KEEP LOOKING MOV BLOCK,F.BKVB+2(R0) ;SET UP BLOCK TO READ FROM CLR F.BKVB(R0) ; MOV SIZE,R1 ;GET THE SIZE ADD #777,R1 ;ROUND UP ASH #-9.,R1 ;GET # OF 256. WORD BLOCKS MOV #INXARY+10000,F.BKDS+2(R0) ;SET UP ADDRESS TO DUMP TO 4$: CALL READ ;READ FROM THE INPUT CIL ADD #BLKSIZ,F.BKDS+2(R0) ;GO TO NEXT BLOCK OFFSET SOB R1,4$ ;GET IT ALL MOV #PRIBUF,F.BKDS+2(R0) ;REINIT BUFFER PTR CLC ;SIGNAL OUR SUCESS RETURN ;AND RETURN .END