.TITLE REGION .SBTTL REGION/WINDOW ATTACH AND DETACH ROUTINES ;*************************************************************************** ; ; REGION ATTACH AND DETACH ROUTINES ; REGION FOR INDEX BUFFER AND REGION FOR CORE IMAGE ; ;*************************************************************************** INDEXR: RDBBK$ 200,INDEX,, ;4K REGION (DEFAULT) INDXW1: WDBBK$ APR5,200,0,0,0, ;4K WINDOW INDXW2: WDBBK$ APR6,200,0,200,0, ;4K WINDOW INDXW3: WDBBK$ APR7,200,0,400,0, ;4K WINDOW ; INDEXC::MOV #200,R5 ;ASSUME DEFAULT BIT #SI,FLAG ;WAS THE SIZE CHANGED? BEQ 1$ ;NO MOV MODSIZ,R5 ;GET IT IF IT WAS CHANGED ADD #77,R5 ;ROUND UP TO AN EVEN 32 WORD BOUNDARY ASH #-6,R5 ;MAKE IT A 32 WORD BLOCK COUNT CMP #200,R5 ;ARE WE LESS THAN THE DEFAULT? BLE .+6 ;NO MOV #200,R5 ;NEVER LESS THAN THE DEFAULT 1$: MOV R5,INDEXR+R.GSIZ ;SAVE FOR SIZE OF REGION SUB #10000,MODSIZ ;COUNT OFF THE SIZE OF THE INDEX CRRG$C INDEXR ;CREATE A REGION FOR INDEX BUFFER BCC .+6 ;OKAY? JMP INSCOR ;ERROR, INSUFFICENT CORE MOV INDEXR+R.GID,INDXW1+W.NRID ;SEND ID TO WINDOW MOV INDEXR+R.GID,INDXW2+W.NRID ;SEND ID TO WINDOW MOV INDEXR+R.GID,INDXW3+W.NRID ;SEND ID TO WINDOW CRAW$C INDXW1 ;MAP A WINDOW TO THE REGION BCC .+6 ;OKAY? JMP ATTERR ;ERROR, ATTACH ERROR SUB #200,R5 ;NEED ANOTHER WINDOW? BGT .+4 ;YES RETURN CRAW$C INDXW2 ;MAP A WINDOW TO THE REGION BCC .+6 ;OKAY? JMP ATTERR ;ERROR, ATTACH ERROR SUB #200,R5 ;NEED ANOTHER WINDOW? BGT .+4 ;YES RETURN CRAW$C INDXW3 ;MAP A WINDOW TO THE REGION BCC .+6 ;OKAY? JMP ATTERR ;ERROR, ATTACH ERROR RETURN ; INXDET::BIS #RS.MDL,INDEXR+R.GSTS ;SET FOR DELETE ON DETACH DTRG$C INDEXR ;DETACH THE REGION RETURN ;************************************************************************ ; ; DUMP CIL REGION TO OUTPUT FILE ; R2 = LENGTH, R1 = BUFFER ADDRESS ; ;***************************************************************************** CILDMP::PUSH R2 ;WE WILL NEED THIS AGAIN PUSH R0 ;SAVE OUR OLD FDB MOV #OUTCIL,R0 ;GET THE CIL FDB MOV R1,F.BKDS+2(R0) ;SET BUFFER ADDRESS TO START 1$: CALL WRITE ;DO IT ADD #BLKSIZ,F.BKDS+2(R0) ;NEXT BLOCK SUB #BLKSIZ,R2 ;LOOP FOR ALL POSSIBLE BLOCKS BGT 1$ ;LOOP TIL DONE POP R0 ;GET OUR OLD FDB BACK POP R2 ;GET LENGTH BACK RETURN .PAGE ;**************************************************************************** ; ; SEARCH THE INDIRECT COMMAND BUFFER FOR A NAME MATCH ; ;**************************************************************************** SEARCH::MOV #ICMD,R2 ;PTR TO COMMAND BUFFER SRCH2: TST (R2)+ ;COMMAND COMPLETED OR AT END? BEQ 3$ ;THIS COMMAND COMPLETED BPL 1$ ;GOT AN ACTIVE COMMAND SEC ;MUST HAVE REACHED END; FLAG UNSUCCESS RETURN ;AND RETURN 1$: CMP (R2)+,NAME ;IS IT THE ONE WE WANT BNE 4$ ;NO CMP (R2)+,NAME+2 ;AN EXACT MATCH? BNE 5$ ;NO CLC ;GOT IT RETURN ; 4$: TST (R2)+ ;SKIP REST OF NAME 5$: CMP (R2)+,(R2)+ ;SKIP IDENT OR OTHER NAME BR SRCH2 ;CONTINUE 3$: ADD #10,R2 ;GET TO NEXT COMMAND BR SRCH2 ;CONTINUE .PAGE ;**************************************************************************** ; ; LICIL HEADER DUMPER ROUTINE ; ;**************************************************************************** LCLHDR::OPEN$W #OUTLIL,,,,,,FILERR ;OPEN THE LCL FOR OUTPUT MOV #LILBUF,R1 ;POINT TO THE BUFFER MOV #256.,R2 ;LENGTH CALL BLANK ;CLEAR IT CLR CKSUM ;INIT MOV #LILBUF,R2 ;BUF PTR MOV #LILHDR,R1 ;HEADER FORMAT MOV #LILLEN,R5 ;LENGTH ASR R5 ;WORD OFFSET 1$: MOV (R1)+,(R2)+ ;COPY HEADER TO OUTPUT BUFFER CALL CHECK ;CALC CHECKSUM SOB R5,1$ ;LOOP CKS R2 ;SAVE THE CHECKSUM MOV #INXARY,R1 ;COPY CIL HEADER ALSO MOV #CILLEN,R5 ;LENGTH IN BYTES ASR R5 ;WORD OFFSET INC R5 ;AND CHECKSUM 2$: MOV (R1)+,(R2)+ ;COPY IT SOB R5,2$ ;LOOP CLR CKSUM ;REINIT MOV #LILHDR,R2 ;ONE MORE TIME FOR THE HEADER MOV (R2)+,LILBUF+BLKSIZ-2 ;SAVE THE 1ST WORD AT END OF THIS REC. CALL CHECK ;CALC CHECKSUM CALL WRITE ;WRITE THAT 1ST BLOCK MOV #LILBUF,R1 ;POINT TO BUFFER INC LILBLP+4 ;CHANGE THE FLAG MOV #LILLEN-2,R5 ;LENGTH OF REST ASR R5 ;MAKE A WORD OFFSET 3$: MOV (R2)+,(R1)+ ;COPY IT AGAIN CALL CHECK ;CALC CHECKSUM SOB R5,3$ ;LOOP CKS R1 ;SAVE THE CHECKSUM MOV R1,LCLPTR ;SAVE OUR BUFFER POINTER RETURN ;AND RETURN .PAGE ;**************************************************************************** ; ; DUMP A MODULE CORE IMAGE TO THE LICIL FILE ; R3 =PTR TO INDEX ENTRY ; ;**************************************************************************** LCLDMP::PUSH R3 ;SAVE SOME REGS PUSH R2 ; PUSH R0 ; MOV #INXARY+10000,R1 ;POINTER TO CORE IMAGE MOV (R3),R5 ;GET INDEX ENTRY SIZE ASR R5 ;MAKE WORD OFFSET INC R5 ;PLUS CHECKSUM TST -(R3) ;BACKUP OVER THE "1" MOV #OUTLIL,R0 ;FDB MOV LCLPTR,R4 ;LCL BUFFER PTR 1$: CMP #13,R5 ;IS THIS THE BLOCK NUMBER WORD? BNE 2$ ;NO CLR (R4)+ ;JUST CLEAR IT IF IT IS TST (R3)+ ;SKIP THIS WORD BR .+4 ;CONT 2$: MOV (R3)+,(R4)+ ;COPY THE INDEX ENTRY HEADER CALL LCHK ;CHECK FOR EOB SOB R5,1$ ;LOOP CLR CODE ;INIT LCLDLP: MOV R1,R5 ;SAVE WHERE WE ARE CLR R3 ;CURRENT RECORD SIZE 2$: TST (R1)+ ;END RECORDS AT A ZERO BNE 3$ ;NOT A ZERO TST R3 ;IF AT ZERO, HAVE WE GOTTEN ANY? BNE 4$ ;DUMP A SMALL RECORD ADD #2,LADR ;KEEP OUR ADDRESS CORRECT SUB #2,R2 ;COUNT THIS WORD OFF SIZE BLE 10$ ;GET OUT IF DONE BR LCLDLP ;LOOP 3$: ADD #2,R3 ;COUNT THIS WORD SUB #2,R2 ;COUNT THIS WORD OFF SIZE CMP #LCLMAX-6,R3 ;GOT ENOUGH? BLE 4$ ;NO TST R2 ;AT THE END? BGT 2$ ;NO COM CODE ;FLAG THAT THIS IS LAST RECORD 4$: MOV R5,R1 ;GET OUR POSITION BAC CLR CKSUM ;INIT MOV #1,(R4)+ ;SEND A ONE CALL LCHECK ;CHECK FOR EOB AND CALC CHECKSUM MOV R3,(R4) ;SEND # OF BYTES ADD #6,(R4)+ ;COUNT RECORD HEADER CALL LCHECK ;CHECK FOR EOB AND CALC CHECKSUM MOV LADR,(R4)+ ;SAVE THE LOAD ADDRESS CALL LCHECK ;CHECK FOR EOB AND CALC CHECKSUM ASR R3 ;MAKE IT A WORD OFFSET .PAGE 5$: MOV (R1)+,(R4)+ ;COPY DATA CALL LCHECK ;CHECK FOR EOB AND CALC CHECKSUM ADD #2,LADR ;COUNT IT SOB R3,5$ ;LOOP CKS R4 ;SAVE THE CHECKSUM CALL LCHK ;CHECK FOR EOB TST CODE ;LAST RECORD? BMI 10$ ;YES BR LCLDLP ;LOOP TIL DONE CORE IMAGE ; AT THE END OF CORE IMAGE 10$: MOV #LEND,R1 ;GET ENDING RECORD FOR CORE IMAGE MOV #LENDL,R5 ;LENGTH ASR R5 ;WORD OFFSET 11$: MOV (R1)+,(R4)+ ;COPY IT CALL LCHK ;CHECK FOR EOB SOB R5,11$ ;LOOP MOV R4,LCLPTR ;SAVE OUR BUFFER POINTER POP R0 ;GET OUR REGS BACK POP R2 ; POP R3 ; RETURN ;AND RETURN .PAGE ;**************************************************************************** ; ; LOCAL ROUTINES ; ;**************************************************************************** INSCOR: MOV #INSMG,R1 ;MESSAGE POINTER CALL PRINT ;PRINT ERROR JMP RESTAR ;RESTART INSMG: .WORD INSMGL ;LENGTH .ASCII /CIL> *** INSUFFICENT CORE ***/ INSMGL = .-INSMG-2 .EVEN ATTERR: MOV #ATTMG,R1 ;MESSAGE POINTER CALL PRINT ;PRINT ERROR JMP RESTAR ;RESTART ATTMG: .WORD ATTMGL ;LENGTH .ASCII ?CIL> *** REGION/WINDOW ATTACH ERROR ***? ATTMGL = .-ATTMG-2 .EVEN ; CHECK FOR END OF BLOCK ROUTINE LCHK: CMP #LILBUF+512.,R4 ;AT THE END OF THE BLOCK? BGT .+12 ;NO, RETURN CALL WRITE ;WRITE IT OUT MOV #LILBUF,R4 ;REINIT BUFFER POINTER RETURN ; CALCULATE CHECKSUM AND CHECK FOR EOB LCHECK: ADD -2(R4),CKSUM ;ADD ONCE SWAB -2(R4) ;SWAP BYTES ADD -2(R4),CKSUM ;AND ADD AGAIN SWAB -2(R4) ;PUT BYTES BACK CALL LCHK ;CHECK FOR EOB RETURN ; END OF CORE IMAGE RECORD FORMAT LEND: .WORD 1,6,1,370 ;4 WORDS IN LENGTH LENDL = .-LEND ;LENGTH .END