.PAGE .SBTTL **** PORT READ ISR **** ; ; (NOTES LATER) ; .GLOBL DA1,DA4,DA5,DA6,DA7,PRPTR,SAVE,RSTOR,HALTFL .GLOBL PCB,PR0,PR1,PR2,PR3,PR4,PCBDAT,PR5 .GLOBL RCSRI,RBUFI,XCSRI,XBUFI,BOMB,RVITAB ; ; NOCR1=1 ;DEFINED TO STRIP CR FROM BCC .PAGE .SBTTL ISR ENTRY PTS ; ; NORMAL CHAR CAUSES 50. INSTRUCTION EXECUTION ; PR0: MOV #DA1,PRPTR ;SET D.A PTR BR PRCOM ;(CONSOLE ENTRY PT) PR1: MOV #DA4,PRPTR ;SET D.A. PTR BR PRCOM PR2: MOV #DA5,PRPTR ;SET D.A. PTR BR PRCOM PR3: MOV #DA6,PRPTR ;SET D.A. PTR BR PRCOM PR4: MOV #DA7,PRPTR ;SET D.A. PTR BR PRCOM .GLOBL DA8 PR5: MOV #DA8,PRPTR ;SET D.A. PTR ; PRCOM: ;**** COMMON READ PROCESSING JSR PC,SAVE ;DON'T MESS UP MAINLINE MOV PRPTR,R5 ;GET INPUT PTR TO DA/PCB TABLE MOV (R5)+,R4 ;GET # ENTRIES IN THIS DA/PCB TABLE 30$: MOV (R5)+,R3 ;GET PCB # MOV (R5)+,R2 ;GET D.A. FOR THIS PCB MOV R2,RCSRI ;SET READ CSR ADR FOR USE CMP #R.DONE+R.IE,@RCSRI ;THIS PORT INTERRUPTED ? BEQ PRPRO ;YES 35$: SOB R4,30$ ;NO JSR PC,BOMB ;**** WELL, SOMEONE DID !!!! **** PRPRO: ADD #2,R2 ;NEXT REG PLEASE MOV R2,RBUFI ; THE ADD #2,R2 ;NEXT REG PLEASE MOV R2,XCSRI ; ADR ADD #2,R2 ;NEXT REG PLEASE MOV R2,XBUFI ; WDS 40$: ; ; NOTE: PCB LEN ** ASSUMED ** 40 OCTAL **** ; MOV R3,R1 ;COMPUTE OFFSET INTO PCBDAT TABLE CLC ;PRESET FOR ROL ROL R1 ;COMPUTE OFFSET INTO ROL R1 ;PCBDAT (2 WDS / ENTRY ) MOV PCBDAT(R1),R1 ;GET PCB ADR MOV P.RBFA(R1),R0 ;GET READ BUFFER ADR BEQ 45$ ;ERROR - NO BUFFER TST @RBUFI ;ERRORS ON INPUT ?? BGE 50$ ;NO 45$: INCB P.ERR(R1) ;YES - COUNT ERROR INC RBUFI ;POSITION TO STATUS PORTION MOVB @RBUFI,P.RST(R1) ; RETURN BIT SETTINGS AS STATUS DEC RBUFI ;RESET ADR TO WD BOUNDARY ; ;*********************************RELEASE 16******************************** ; BISB #PS.RF,P.PST(R1) ;SIGNAL READ ERROR ; ;*********************************RELEASE 16******************************** ; 46$: MOVB #BELL,P.ECH(R1) ;SET ECHO CHAR AS BELL ; DON'T PULL THE INPUT CHAR OR ECHO IT JMP FINI 50$: TSTB AFL(R0) ;READ BUFFER ACTIVE ? BEQ 45$ ;NO - ERROR AGAIN .GLOBL B77TMO ;TRUNK TIME-OUT FLAG MOVB P.DST(R1),R4 ;GET TRUNK NUMBER TSTB B77TMO(R4) ;IS TRUNK DOWN? BEQ 51$ ;NO CMPB #CONSOL,P.SOU(R1) ;YES-CONSOLE? BNE 46$ ;NO 51$: MOV P.RBP(R1),R4 ;GET BUFFER PTR MOVB @RBUFI,R5 ;GET INPUT CHAR ; NOTE: OK TO DESTROY R4/R5; ONE CHAR/INTERRUPT PLEASE BIC #177600,R5 ;7-BIT ASCII ONLY ; ;****************************RELEASE 17********************************* ; * CMPB #ETX,R5 ;INVALID CONTROL CHARACTER? * BHIS 46$ ;YES - ERROR * ; * ;****************************RELEASE 17********************************* ; TSTB HALTFL ; HALT MODE?? BEQ 55$ ;NO CMPB #CONSOL,P.SOU(R1) ; YES - IS THIS CONSOLE?? BNE 46$ ; NO - SIGNAL ERROR 55$: CMP #DEL,R5 ;DELETE LINE ? BNE 60$ ;NO ;******************* RELEASE 20 ******************** .IF NDF,DELMSG ;BELL ON DELETE CLRB P.RC(R1) ;YES - RESET CHAR CNT MOV P.RBFA(R1),P.RBP(R1) ; RESET BUFFER PTR ADD #PDATA-1,P.RBP(R1) ; TO START OF DATA MOVB #BELL,P.ECH(R1) ;SET FOR BELL AS ECHO .ENDC .IF DF,DELMSG ;MESSAGE ON DELETE MOV P.RBFA(R1),R4 ;GET READ BUFFER ADR MOVB P.SOU(R1),WQ(R4) ;QUEUE FOR RE-WRITE TO PORT .GLOBL CM7 MOVB CM7,R5 ;GET THE SIZE ADD #PDATA-TDATA+1,R5 ;SIMULATE READ FROM TRUNK MOVB R5,SZ(R4) ;SET INTO BUFFER CLRB AFL(R4) ;CLEAR ACTIVE FLAG ADD #PDATA,R4 ;SET POINTER TO DATA AREA MOV #CM7,R5 ;SET MSG PTR MOVB (R5)+,R3 ;SET MSG SIZE 30$: MOVB (R5)+,(R4)+ ;COPY SOB R3,30$ ;MESSAGE TO BUFFER MOVB #BELL,P.ECH(R1) ;ECHO A BELL (?) BIC #R.IE,@RCSRI ;KILL READ INTERRUPTS CLR P.RBFA(R1) ;CLEAN UP THE CLR P.RBP(R1) ;READ POINTERS IN CLRB P.RC(R1) ;THE PCB AND BISB #PS.RB,P.PST(R1); ASK FOR ANOTHER READ BUFFER .ENDC ;******************* RELEASE 20 ************************ BR FINI 60$: CMP #BS,R5 ;BACK-SPACE 1 CHAR? BNE 70$ ;NO DEC P.RBP(R1) ; YES - DECBUFFER PTR DECB P.RC(R1) ; AND CHAR CNT BGE 65$ ;STILL HAVE SOMETHING IN BUFFER CLRB P.RC(R1) ;EMPTY NOW - RESET CNT INC P.RBP(R1) ;RESET BUFFER PTR 65$: MOVB R5,P.ECH(R1) ;ECHO A BACK-SPACE BR FINI 70$: ;***************** RELEASE 20 ****R*************J .IF DF,BRKCHR ;?BRK TO BURROUGHS ON CONTROL-O (?) JSR PC,BREAK ;PROCESS POSSIBLE BREAK CHARACTER .ENDC ;************************* RELEASE 20 **************** MID: ;MAKE THE ASSEMBLER HAPPY ABOUT LOCAL SYMBOLS INC R4 ;POSITION TO NEXT CHAR ADR INCB P.RC(R1) ;COUNT CHAR CMPB P.RC(R1),P.LSIZ(R1) ; ROOM FOR CHAR? BLOS 75$ ;YES MOV #CR,R5 ;FORCE END-OF-LINE ******* BR 80$ 75$: MOVB R5,(R4) ;INSERT CHAR INTO BUFFER MOVB R5,P.ECH(R1) ;AND ECHO SAVE AREA MOV R4,P.RBP(R1) ;SAVE NEW BUFFER PTR 80$: CMP #CR,R5 ;CARRIAGE RETURN ? .IF DF,ESCTRM ; IF ESC IS VALID TERMINATOR BEQ 85$ ;YES CMP #ESC,R5 ;NO - ESCAPE ? .ENDC BNE FINI ;NO .IF DF,ESCTRM ;IF ESC IS VALID TERMINATOR MOVB #CR,P.ECH(R1) ;ECHO A CR TO PRETTY UP THE OUTPUT .ENDC 85$: TSTB P.ECHO(R1) ;DO WE ECHO CHARACTERS?? BEQ 86$ ;NO MOVB #LF,@XBUFI ;YES - ECHO A LINE-FEED TO PREVENT OVERWRITES 86$: CLRB AFL(R0) ;YES - SET BUFFER INACTIVE MOVB P.DST(R1),WQ(R0) ;SET DESTINATION PCB # MOVB P.RC(R1),R3 ;GET SIZE BIC #177400,R3 ;8 BITS ONLY ADD #PDATA-TDATA+2,R3 ;ACCOUNT FOR ETX AND BCC AND HEADER MOVB R3,SZ(R0) ;SAVE FOR XMIT MOVB R3,P.RC(R1) ;COPY TO RCV CNT BIC #R.IE,@RCSRI ;KILL READ INTERRUPTS MOVB #ETX,1(R4) ;INSERT ETX TEMP2=PS.RB+PS.RF ;SET FOR READ COMPLETE & Q NEW BUFFER BISB #TEMP2,P.PST(R1) ;SIGNAL FOR NEW ONE MOVB #PS.OK,P.RST(R1) ;SET READ COMPLETION AS OK MOVB P.SOU(R1),R3 ;GET PCB OF THIS PORT CLC ;COMPUTE ROL R3 ;POLTAB .GLOBL POLTAB MOVB POLTAB(R3),BAD0(R0) ;COPY POLL MOVB POLTAB+1(R3),BAD0+1(R0) ; ADR TO HDR CLR BCC(R0) ;PRESET BCC VALUE MOV R0,R2 ;GET BUFFER ADR ADD #BAD0,R2 ;POINT TO START OF POL ADR 10$: MOVB (R2)+,R3 ;GET THIS CHAR BIC #177600,R3 ;(7-BITS ONLY) .IF DF NOSYN ;IF ON BURROUGH'S W/ SYNC STRIP CMPB #SYNC,R3 ; IS IT A SYNC CHAR?? BEQ 20$ ; YES - (AS PER MANUAL, NOT INCLUDED IN BCC) ;*************************************************************** .ENDC .IF DF,NOCR1 CMPB #CR,R3 ;IS THIS A CARRIAGE RETURN BEQ 20$ ;NOT IN BCC, TWISR WILL STRIP .ENDC XOR R3,BCC(R0) ; ADD TO BCC COMPUTATION 20$: CMPB #ETX,R3 ;WAS THIS THE ETX CHAR?? BNE 10$ ; NO - CONTINUE MOVB BCC(R0),R3 ;YES - GET BCC VALUE BIC #177600,R3 ;(7-BITS) MOVB R3,(R2) ;STORE AFTER ETX CHAR ; ; SPECIAL CHECK: IF CONSOLE, SPECIAL CHAR FLAG @ START OF ; BUFFER INDICATES THIS IS A CONSOLE COMMAND ; CMP #DA1,PRPTR ;CONSOLE? BNE FINI ;NO .GLOBL CMDFLG CMPB CMDFLG,PDATA(R0) ;1ST BYTE SAME ? BNE FINI ;NO CMPB CMDFLG+1,PDATA+1(R0) ;YES - 2ND BYTE SAME ? BNE FINI ;NO BISB #PS.CMD,P.PST(R1) ;YES - SIGNAL COMMAND WAITING MOVB #-1,WQ(R0) ;AND RESET QUEUING FLAG SO TRUNK DOESN'T GET THIS FINI: TSTB P.ECHO(R1) ;DO WE ECHO THIS CHAR ? BEQ JMPBAK ;NO MOVB P.ECH(R1),@XBUFI ;LOAD ECHO CHAR FOR XMIT ; ; NOTE: THE XMIT ISR MUST VERIFY AND CLEAR THAT THIS IS ; AN ECHO CHAR AND NOT FROM THE WRITE BUFFER ; JMPBAK: JSR PC,RSTOR ;RESET REG'S ;EXIT ISR RTI ; USE THIS ?? ; ;********************* RELEASE 20 ********************** .IF DF,BRKCHR BREAK: ;PROCESS POSSIBLE BREAK CHARACTER CMPB #BRKCHR,R5 ;BREAK DESIRED?? BEQ 10$ ;*** YES *** RTS PC ;NO 10$: MOV P.RBFA(R1),R5 ;LOAD MOVB #MBRKL,P.RC(R1) ;SET MESSAGE SIZE ADD #PDATA,R5 ;THE MOVB MBRK,(R5)+ ;? MOVB MBRK+1,(R5)+ ;B MOVB MBRK+2,(R5)+ ;R MOVB MBRK+3,(R5) ;K MESSAGE FOR HOST MOV R5,R4 ;PRESET BUFFER PTR FOR RETURN BISB #PS.FLH,P.PST(R1) ; SIGNAL FOR BUFFER FLUSH MOVB #CR,R5 ;ECHO (?) A CR RTS PC ;AND EXIT MBRK: .ASCII /?BRK/ ;BURROUGHS BREAK MESSAGE MBRKL=.-MBRK ;SIZE OF MESSAGE .EVEN .ENDC ;********************* RELEASE 20 *****R************** ; ; .END ;NO XFR ADR