''HEAD,FRAME MULTIPLEX & DEMULTIPLEX ''TITLE,MUXDEMUX ''LIST //*************************************************** // //DESCRIPTION:SAMPLE INTRANODAL MULTIPLEXING AND DE- //MULTIPLEXING PROGRAMS. // //LOCATION:MUXDEMUX.LOS // //DATE:NOVEMBER 9, 1978 // ''EJECT //******************************** //* * //* POINTER BLOCK FORMAT * //* * //******************************** 'TP' [0]:'LBR' OBP PAGE MAP,//OUTPUT BUFFER POINTER PAGE MAP 'DP' OBP ADDRESS,//OUTPUT BUFFER ADDRESS OPTR,//OUTPUT CHARACTER POINTER IBP PAGE MAP,//INPUT BUFFER POINTER PAGE MAP 'DP' IBP ADDRESS,//INPUT BUFFER ADDRESS IPTR,//INPUT CHARACTER POINTER CP PAGE MAP,//PARE MAP FOR CONNECTION POINTER 'DP' CP ADDRESS,//ADDRESS FOR CONNECTION POINTER C TIMER,//CONNECTION TIMER FOR AUDIT 'RBR' ''EJECT //********************************************* //* * //* INTRANODAL CHARACTER BUFFER FORMAT * //* * //********************************************* //ASSUME THE FOLLOWING: // 1. EMPTY CHARACTER DATA BUFFERS ARE INITIALIZED TO CONTAIN // ZEROS. DATA OF ZERO INDICATES NO CHARACTER PRESENT. // // 2. CHARACTERS STORED IN DESCENDING ADDRESS ORDER WITH INITIAL // INPUT AND OUTPUT POINTERS AT OFFSET 12. // // 3. THE INPUT POINTER SHOWS THE POSITION FOR THE NEXT CHARACTER // WITHIN THE CURRENT BUFFER. WHEN THE LAST CHARACTER POS- // ITION IN THE BUFFER IS ABOUT TO BE FILLED, THE DEMULTIPLEX // PROGRAM LINKS A NEW EMPTY BUFFER AND THEN FILLS IN THE // FINAL CHARACTER FOR THE PREVIOUS BUFFER. // // 4. BLOCKS ARE FILLED LINEARLY BY THE DEMULTIPLEX PROGRAM, // EMPTIED BY THE MULTIPLEX PROGRAM, AND THEN RELEASED. // WHEN THEY ARE RELEASED, THEY ARE ASSIGNED TO THE FREE // POOL FOR THE MULTIPLEXING LPU UNTIL THEY ARE REUSED // BY THAT LPU OR RELEASED TO THE COMMON SYSTEM FREE POOL. 'TP' [13]:'LBR' BP MAP,//BUFFER POINTER PAGE MAP 'DP' AD NXT BUFF, //ADDRESS OF NEXT CHARACTER BUFFER 'RBR' ''EJECT //********************************** //* * //* OPERATIONAL PARAMETERS * //* * //********************************** MAX CPF:200,//MAXIMUM NUMBER (APPROX) OF CHAR/FRAME MAX SKIP: 15,//MAX. NR. CHANNELS TO SKIP PER CNTRL BYTE MAX CPCB: 15,//MAX. NR CHAR/CHANNEL/CONTROL BYTE MAX CHAN:240,//MAX NUMBER OF CHANNELS PER FRAME MAX BUFF: 12,//MAXIMUM DATA BUFFER OFFSET //******************************* //* * //* ZERO PAGE ADDRESSES * //* * //******************************* 'ZREL' 'LBR' 'DP' CF ADR,//CURRENT FRAME ADDRESS 'DP' CC ADR,//CURRENT CHANNEL DEFINITION BLOCK 'DP' CB ADR,//CURRENT CHARACTER BUFFER ADDRESS 'RBR' ''EJECT //************************* //************************* //** ** //** DEMULTIPLEX ** //** ** //************************* //************************* // //DESCRIPTION:MAIN PROGRAM TO DEMULTIPLEX CHARACTERS FROM AN //INPUT FRAME. // //INPUT:ASSUME THAT THE FRAME POINTER, CF ADR, IS POINTING //TO THE INITIAL CHANNEL NUMBER. CHARACTER COUNT,//CHARACTERS LEFT FOR THIS CHANNEL ;OFFSET = 0, 12, 24, 36,//BLOCK INCREMENT BY CHAN SKIP INDEX 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 168, 180, ;DEMULTIPLEX:: 'LBR' 'DP' INITIAL CHAN AD () -> CC ADR,//CAL. FIRST CHAN BLK ADR ^CF ADR, 'DO' ^CF ADR, 'WHILE' [CF ADR] # 0: CC ADR + OFFSET [[CF ADR] 'RS' 4] -> CC ADR, //ADD OFFSET FOR NEXT CHAN BUF ADR [CF ADR] & 0F -> CHARACTER COUNT # 0: //GO TO NXT CHAN IF NO CHARACTERS DEMUX CHANNEL;;//DEMULTIPLEX FOR ONE CHANNEL 'END' 'RBR' .... //*********************************** //* * //* DEMULTIPLEX ONE CHANNEL * //* * //*********************************** // //NOTE:IF A CHARACTER IS ABOUT TO FILL AN EXISTING BUFFER, THE //DEMULTIPLEXING PROGRAM LINKS THE NEXT BUFFER BEFORE //ENTERING THE LAST CHARACTER IN THE EXISTING BUFFER. THIS //PREVENTS PROBLEMS WHICH MIGHT OCCUR IF THE MULTIPLEXING //PROGRAM FOR ANOTHER LPU GETS AHEAD OF THIS DEMULTIPLEXING //PROGRAM. ;;DEMUX CHANNEL: 'LBR' IBP PAGE MAP [CC ADR] -> CB PM REG,//SET MAP FOR CURRENT BUF. IBP ADDRESS [CC ADR] -> CB ADR,//SET CUR. BUF. ADDRESS 1 -> CTIMER [CC ADR],//SET CHAN TIMER FOR AUDIT 'DO' 'WHILE' CHARACTER COUNT # 0://CHANNEL LOOP ^ CF ADR,//FRAME PTR FOR NEXT CHAR 'DEC' CHARACTER COUNT, IPTR [CC ADR] = 0://LAST POSITION IN BUFFER? LINK BUFFER,//ATTACH NEXT BUFFER [CF ADR] -> [CB ADR + IPTR[CC ADR]], //LOAD NEXT CHARACTER AD NXT BUFF [CB ADR] -> IBP ADDRESS [CC ADR], //SET NXT INPUT CHAN PTR BP MAP [CB ADR] -> IBP PAGE MAP [CC ADR] -> CB PM REG, MAX BUFF -> IPTR [CC ADR];//RESET INPUT PTR FOR NXT BLK [CF ADR] -> [CB ADR + IPTR[CC ADR]], //LOAD NEXT CHARACTER 'DEC' IPTR [CCADR];//SET NEXT INPUT POINTER 'END' 'RBR' .... //***************************** //***************************** //** ** //** MULTIPLEX FRAME ** //** ** //***************************** //***************************** //INPUT:CF ADR IS SET FOR ADDRESS OF FIRST CONTROL CHARACTER FCHAR COUNT,//FRAME CHARACTER COUNT FCHAN COUNT,//FRAME CHANNEL COUNT SKIP COUNT,//CHANNELS SKIPPED - THIS CONTROL BYTE BCHAR COUNT,//BYTE CHARACTER COUNT 'DP' CTLB ADR;//CONTROL BYTE ADDRESS IN FRAME CB LENGTH = 12,//CHANNEL BLOCK LENGTH ;MULTIPLEX:: 'LBR' 0 -> FCHAR COUNT -> FCHAN COUNT, 'DP' INITIAL CHAN AD () -> CC ADR,//INIT CHAN BLK ADR 'DO' 'WHILE' FCHAR COUNT <= MAX CPF://RUN TO LAST CHAN. CF ADR -> CTLB ADR,//SAVE CTL BYTE ADR. ^ CF ADR,//NEXT FRAME POSITION 0 -> BCHAR COUNT, 1 -> SKIP COUNT, 'DO' 'WHILE' SKIP COUNT # MAX SKIP & BCHAR COUNT # 0://LOAD DATA FOR ONE CTL OBP PAGE MAP [CC ADR] -> CB PM REG,//MAP FOR CURRENT BUFFER OBP ADDRESS [CC ADR] -> CB ADR, [CB ADR + IPTR[CC ADR]] # 0://CHAR ON THIS CHAN? LOAD FRAME;//CHARACTER FOUND ^SKIP COUNT;//NONE FOUND CC ADR + CB LENGTH -> CC ADR,//NEXT CHANNEL BUFFER ^FCHAN COUNT = MAX CHAN: END MPLX.;//MAX CHAN COUNT 'END' (SKIP COUNT 'LS' 4) + BCHAR COUNT -> [CTL BADR], //CONTROL BYTE 'END' 0 -> CF ADR,//MARK END OF FRAME 'RETURN'. END MPLX: (SKIP COUNT 'LS' 4) + BCHAR COUNT -> [CTL BADR],//SET CONTROL BYTE 0 -> CF ADR,//MARK END OF FRAME 'RBR' .... //************************************** //** //* LOAD FRAME FOR ONE CHANNEL * //** //************************************** ;;LOAD FRAME: 'LBR' 'DO' 'WHILE' BCHAR COUNT # MAX CPCB: [OPTR [CB ADR] + CB ADR] -> [CF ADR],//LOAD ONE CHARACTER ^ CF ADR,//NEXT FRAME ADDRESS 'DEC' OPTR [CC ADR] & 080 # 0: SET NEXT BUFFER, MAX BUFF -> OPTR [CC ADR];;//INIT. OUTPUT PTR //CUR BUF. EMPTY? ^ BCHAR COUNT,//CHAR PER GROUP [CB ADR + IPTR[CC ADR]] = 0: 'RETURN'.;//ANY MORE CHAR? 'END' 'RBR' .... ''END