ߋtv ?B-NO BOOT ON VOLUME K@w p@w w&׭ ׭ w f& fwW#w f   @ @w$ v @& 7   BLOCK@ t IS BAD  -̂@ &   # D@ jw 7 $7 & & B g wD ѕ Rì    s ` h] LJ 1  T s-"w UqJkQUq%kQJUq?TkQUqkQ6 UqkQ(Uq9kQ0UqkQ7 \\\9v #tv *%v *vLDv *xev *jLpv*&#v *y%v *Udv*0 = TWO OR MORE SYNCH'S RECEIVED. .XSECT SWITCH,2 ;BIT 0 = (1) NO INPUT FILE OPEN ;BIT 1 = (1) VERIFY SWITCH ON ;BIT 2 = (1) CLOSE SWITCH ON ;BIT 3 = (1) OUTPUT FILE HAS SOME OUTPUT ;BIT 4 = (1) LIST IN OPERATION ;BIT 5 = (1) INDIRECT COMMAND IN USE (@) ;BIT 6 = (1) CONTINUED LINE ;BIT 7 = (1) BLOCK MODE ON ; SECOND BYTE OF 'SWITCH' ;BIT 0 = (1) TOP OF FILE REQUESTED ;BIT 1 = (1) BOTTOM REQUEST FROM READ COMMAND ;BIT 2 = (1) FORM FEED FOUND ON TEXT ; INPUT. ;BIT 3 = (1) /L GIVEN IN FILE COMMAND ;BIT 4 = (1) SECONDARY FILE OPEN ;BIT 5 = (1) SECONDARY FILE SELECTED FOR INPUT ;BIT 6 = (1) OUTPUT ON SWITCH ;BIT 7 = (1) EXIT CURRENTLY UNDERWAY .XSECT SW2,2 ;BIT 0 = (1) NP COMMAND REQUESTED ;BIT 1 = (1) PAGE REQUESTED ;BIT 2 = (1) READ/WRITE OPERATION UNDERWAY ;BIT 3 = (1) NUMERIC REQUESTED DURING ; COMMAND MODE PROCESSING. ;BIT 4 = (1) MACRO IN PROGRESS ;BIT 5 = (1) BLOCK MODE WAS ACTIVE BEFORE CLOSE ;BIT 6 = (1) PAGE-FIND(LOCATE) ACTIVE ;BIT 7 = (1) LC OR PASTE ACTIVE ;BIT 8 = (1) AP/TYPE ACTIVE ;BIT 9 = (1) NO LINES READ IN FOR THIS PAGE ;BIT10 = (1) IMMEDIATE MACRO IN PROGRESS ;BIT11 = (1) RUN STATUS ;BIT12 = (1) CHANGE/LC/PASTE/SEARCH CALLING "SCAN" ;BIT13 = (1) EOB DETECTED ;BIT14 = (1) MACRO ALLOWED TO BE RE-EXECUTED ; AFTER EOB DETECTED. ;BIT15 = (1) "SAVE" OR "FILE" UNDERWAY .XSECT STACK,122. ;STACK LOCATION FOR CURRENT USER .XSECT ARG1,2 ;1ST ARGUMENT FOR SCAN ROUTINE .XSECT ARG2,2 ;2ND ARGUMENT FOR SCAN ROUTINE .XSECT OARG,2 ;OLD ARGUMENT USED IN DETECTING ; RECURSION IN PASTES AND LC'S. .XSECT MACDEF,2 ;MACRO DEFINITION FLAGS .XSECT DDCMPO,1 ;DDCMP OUTPUT MODE FLAG .XSECT MAXMAC,1 ;MAXIMUM # OF MACRO SLOTS AVAILABLE .XSECT NARG,2 ;NUMERIC ARGUMENT FOR MACRO .XSECT MACARG,2 ;MACRO REPEAT COUNTER .XSECT CURMAC,2 ;CURRENT MACRO START ADDRESS .XSECT OLDCWD,2 ;OLD CWDS POINTER .XSECT .CURRN,LINELN+4 ;WORK BUFFER (CURRENT LINE) .XSECT CMD,LINELN+4 ;COMMAND BUFFER .IF NDF NODUPS .XSECT TSBUF,120. ;TEMPORARY BUFFER FOR SEARCH COMMAND .ENDC ;.IF NDF NODUPS .XSECT FNAME,12 ;FILE NAME STORAGE .IF NDF NOMAC .XSECT MACBUF,<<130.*2>> ;MACRO STORAGE .ENDC ;.IF NDF NOMAC .XSECT IBLKNM,2 ;INPUT BUFFER CURRENT BLOCK # .XSECT INPTR,10 ;INPUT BUFFER POINTER .XSECT INBUF,1000+8. ;INPUT BUFFER .XSECT OBLKNM,0 ;OUTPUT BUFFER CURRENT BLOCK # .XSECT BCNT,2 ;BYTE COUNT DURING DDCMP INPUT .XSECT OUTPTR,0 ;OUTPUT BUFFER POINTER .XSECT DDCMPI,2 ;BUFFER POINTER DURING DDCMP INPUT .XSECT CRC,2 ;CRC VALUE DURING DDCMP INPUT .XSECT SPACE,4 ;DUMMY SPACE NEEDED FOR OUTPUT DESCRIPTOR ; BLOCK. .XSECT OUTBUF,1000 ;OUTPUT BUFFER .XSECT SBLKNM,2 ;SECONDARY BUFFER CURRENT BLOCK # .XSECT SECPTR,10 ;SECONDARY BUFFER POINTER .XSECT UBLKNM,2 ;SAVE/UNSAVE BUFFER CURRENT BLOCK # .XSECT USVPTR,10 ;SAVE/UNSAVE BUFFER POINTER .XSECT FLTMP,10 ;TEMPORARY FILE STORAGE FOR RENAMING BACKUP FILE .XSECT BAKFIL,10 ;INPUT BACKUP FILE .XSECT INFIL,10 ;INPUT FILE NAME .XSECT OUTFIL,10 ;OUTPUT FILE NAME .XSECT SECFIL,10 ;SECONDARY INPUT FILE NAME .XSECT SAVFIL,10 ;SAVE FILE NAME .XSECT TMPFIL,10 ;TEMPORARY FILE NAME .XSECT SAVNAM,2 ;SAVE FILE NAME .XSECT CPAGE,5 ;CURRENT PAGE NUMBER MESSAGE .XSECT PAGECU,7 ;ACTUAL PAGE NUMBER IN ASCII .XSECT SIZEMG,1 ;SIZE OF PAGE MESSAGE .XSECT SIZENB,25 ;ACTUAL SIZE OF PAGE IN ASCII .XSECT OVLYSW,1 ;OVERLAY FLAG: 0 => OVERLAY 1(REMED1), ; #0 => OVERLAY 2(REMED2). .XSECT RETRY,1 ;RETRY COUNT FOR ERROR RECOVERY .XSECT ICHAN,1 ;INPUT CHANNEL NUMBER .XSECT OCHAN,1 ;OUTPUT CHANNEL NUMBER .XSECT SCHAN,1 ;SECONDARY CHANNEL NUMBER .XSECT UCHAN,1 ;SAVE/UNSAVE CHANNEL NUMBER .XSECT RELBLK,0 ;RELATIVE BLK NBR DURING DDCMP PROGRAM LOADS .XSECT ACHAN,2 ;ACTIVE CHANNEL NUMBER (LEFT BYTE FOR INPUT, ; RIGHT BYTE FOR OUTPUT). .XSECT USP,2 ;USERS STACK POINTER .XSECT ERR,2 ;I/O ERROR WORD .XSECT CROUT,2 ;I/O COROUTINE .XSECT NEEDLN,1 ;TTY NEED LINE FLAG .XSECT NEEDRM,1 ;TTY NEED OUTPUT BUFFER SPACE FLAG .XSECT TTOCLO,2 ;TTY CONTROL FLAG .XSECT TTYTAB,2 ;TTY INPUT BUFFER HEADER ADDRESS .XSECT TTOTAB,2 ;TTY OUTPUT BUFFER HEADER ADDRESS .XSECT TTILCT,2 ;TTY INPUT BUFFER LINE COUNT .XSECT TTIPRE,2 ;TTY INPUT PREVIOUS CHAR COUNT .XSECT TKS,2 ;TTY INPUT CSR REGISTER .XSECT TPS,2 ;TTY OUTPUT CSR REGISTER .XSECT TKB,2 ;TTY INPUT BUFFER REGISTER .XSECT TPB,2 ;TTY OUTPUT BUFFER REGISTER .XSECT OUTCH,2 ;TTY TAB AND FILL COUNTERS .XSECT FILLIT,1 ;TTY FILL CHARACTER .XSECT FILLCT,1 ;TTY FILL COUNTER .XSECT TTYVEC,2 ;TTY VECTOR ADDRESS .XSECT TTYIN,2 ;TTY INPUT INTERRUPT ADDRESS .XSECT TTYOUT,2 ;TTY OUTPUT INTERRUPT ADDRESS .IF DF DIAL .XSECT TKSSAV,2 ;DL RECEIVER STATUS WORD SAVE AREA .ENDC .XSECT E,2 ;INPURE AREA LABEL USED TO INSURE THAT ALL AREAS ; HAVE IDENTICAL SIZE. ; ; END OF IMPURE AREA DEFINITION TABLE ; .SBTTL IMPURE AREA (FOR USER #1) ; .GLOBL USER1,.CURR1,DLVEC1,ENDM1,STACK1,USP1 .GLOBL CROUT1,TKS1,TPS1,TKB1,TPB1,TTVEC1 .GLOBL TTYIN1,TTYOT1,ENDUSR ; .NLIST BEX USER1: .WORD 0 ;(QUIT) QUIT CONTROL VARIABLE .=.+12. ;(CWD) CONTROL WORD ARRAY .BYTE 15 ;CWD TERMINATOR .BYTE 33 ;(CATEN) CONCATENATION CHARACTER .WORD 0 ;(PAGE) PAGE COUNTER .WORD 0 ;(SIZELS) TOTAL # OF LINES READ IN ;(BYTECT) BYTE COUNT OF LINE .WORD 55. ;(SIZEBF) TOTAL # OF LINES PER PAGE ALLOWED .WORD 0 ;(CWDS) CONTROL WORD POINTER .BYTE 0 ;(XOFF) DISABLE TTY OUTPUT [^S] .BYTE 0 ;(IOCOMP) I/O COMPLETION ROUTINE FLAG .BYTE 0 ;(DDCMP) DDCMP MODE SWITCH .BYTE 0 ;(DFLAG) DDCMP COMPLETION FLAG .BYTE 0 ;(CTIME) MAXIMUM TIME INTERVAL BETWEEN CHARACTERS OR ; MESSAGES IN DDCMP MODE. .BYTE 0 ;(DDCMPS) DDCMP MESSAGE EXPECTED .WORD 0 ;(DDCMPE) DDCMP ERROR ROUTINE FOR HANDLING MESSAGES ; NOT RECEIVED IN A CERTAIN TIME FRAME. .WORD 0 ;(SWAP) SWAP BLOCKS FOR DISK SCRATCH AREA .WORD .CURR1 ;(CURREN) CURRENT LINE .WORD 0 ;(PP) PREVIOUS LINE POINTER IN BLOCK BUFFER .WORD 0 ;(CP) CURRENT LINE POINTER IN BLOCK BUFFER .WORD 0 ;(NUMBER) NUMBER OF LINES TO LIST/PRINT/DELETE/MOVE ;(LOADAD) LOAD ADDRESS DURING DDCMP OPERATIONS .WORD 0 ;(LOADPC) LOAD PC DURING DDCMP OPERATIONS .WORD DLVEC1 ;(DLVEC) DL VECTOR ADDRESS ON REMOTE .WORD 0 ;(WRIOT) READ/WRITE BUFFER ADDRESS .WORD 0 ;(CHAN) CURRENT ACTIVE CHANNEL NUMBER .BYTE 0 ;(TEMP) TEMP STORAGE (BYTE ONLY) .BYTE 0 ;(QUOTE) QUOTE CHARACTER USED IN CHANGE AND PASTE ;(RUNGET) GET=0, RUN#0 FOR LOADING PROGRAMS INTO ; THE REMOTE. .WORD 0 ;(TEMP1) TEMP STORAGE (WORD ONLY) ;(CKSUM) CHECKSUM FOR LOADING DDCMP PROGRAMS .WORD 0 ;(TEMP2) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP3) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP4) TEMP STORAGE (WORD ONLY) .WORD 0 ;($CHAN) CHANNEL NUMBER .WORD 0 ;($DBLK) DEVICE BLOCK ADDRESS .WORD 0 ;(FSIZE) FILE SIZE GIVEN BY USER .WORD 0 ;BUFFER ADDRESS IN .READC AND .WRITC .WORD 0 ;CO-ROUTINE ADDRESS .WORD 0 ;(CDONE) CHANGE DONE ON THIS LINE COUNTER ;(TEMP5) TEMPORARY STORAGE (WORD ONLY) .WORD 0 ;(PDONE) PASTE CHANGE(S) DONE ON THIS LINE COUNTER ENDM1: .WORD 0 ;(ENDM) END OF MEMORY .WORD 0 ;(ENDCM) END OF LAST COMMAND .WORD 0,0 ;(BASE) BASE ADDRESS OF DATA AREA .WORD 0 ;(DEV) DEFAULT DEVICE .BYTE 0 ;(GO) GO FLAG .BYTE 0 ;(SYNS) SYNCH CHARACTER DETECTED: 0 = NO SYNCH'S RECEIVED, ; <0 = 1 SYNCH CHARACTER RECEIVED, ; >0 = TWO OR MORE SYNCH'S RECEIVED. .BYTE 202 ;(SWITCH) BIT 0 = (1) NO INPUT FILE OPEN ;BIT 1 = (1) VERIFY SWITCH ON ;BIT 2 = (1) CLOSE SWITCH ON ;BIT 3 = (1) OUTPUT FILE HAS SOME OUTPUT ;BIT 4 = (1) LIST IN OPERATION ;BIT 5 = (1) INDIRECT COMMAND IN USE (@) ;BIT 6 = (1) CONTINUED LINE ;BIT 7 = (1) BLOCK MODE ON .BYTE 0 ;BIT 0 = (1) TOP OF FILE REQUESTED ;BIT 1 = (1) BOTTOM REQUEST FROM READ COMMAND ;BIT 2 = (1) FORM FEED FOUND ON TEXT ; INPUT. ;BIT 3 = (1) /L GIVEN IN FILE COMMAND ;BIT 4 = (1) SECONDARY FILE OPEN ;BIT 5 = (1) SECONDARY FILE SELECTED FOR INPUT ;BIT 6 = (1) OUTPUT ON SWITCH ;BIT 7 = (1) EXIT CURRENTLY UNDERWAY .WORD 0 ;(SW2) BIT 0 = (1) NP COMMAND REQUESTED ;BIT 1 = (1) PAGE REQUESTED ;BIT 2 = (1) READ/WRITE OPERATION UNDERWAY ;BIT 3 = (1) NUMERIC REQUESTED DURING ; COMMAND MODE PROCESSING. ;BIT 4 = (1) MACRO IN PROGRESS ;BIT 5 = (1) BLOCK MODE WAS ACTIVE BEFORE CLOSE ;BIT 6 = (1) PAGE-FIND(LOCATE) ACTIVE ;BIT 7 = (1) LC OR PASTE ACTIVE ;BIT 8 = (1) AP/TYPE ACTIVE ;BIT 9 = (1) NO LINES READ IN FOR THIS PAGE ;BIT10 = (1) IMMEDIATE MACRO IN PROGRESS ;BIT11 = (1) RUN STATUS ;BIT12 = (1) CHANGE/LC/PASTE/SEARCH CALLING "SCAN" ;BIT13 = (1) EOB DETECTED ;BIT14 = (1) MACRO ALLOWED TO BE RE-EXECUTED ; AFTER EOB DETECTED. ;BIT15 = (1) "SAVE" OR "FILE" UNDEWAY STACK1: .WORD 0 ;(STACK) STACK LOCATION FOR CURRENT USER .=.+120. ;STACK SPACE FOR USER .WORD 0 ;(ARG1) 1ST ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(ARG2) 2ND ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(OARG) OLD ARGUMENT USED IN DETECTING ; RECURSION IN PASTES AND LC'S. .BYTE 0 ;(MACDEF) MACRO DEFINITION FLAGS .BYTE 0 .BYTE 0 ;(DDCMPO) DDCMP OUTPUT MODE FLAG .BYTE 2 ;(MAXMAC) MAXIMUM # OF MACRO SLOTS AVAILABLE .WORD 0 ;(NARG) NUMERIC ARGUMENT FOR MACRO .WORD 0 ;(MACARG) MACRO REPEAT COUNTER .WORD 0 ;(CURMAC) CURRENT MACRO START ADDRESS .WORD 0 ;(OLDCWD) OLD CWDS POINTER .CURR1: .=.+LINELN+4 ;(.CURRN) CURRENT LINE PROCESSED .=.+LINELN+4 ;(CMD) COMMAND BUFFER .IF NDF NODUPS .=.+120. ;(TSBUF) TEMPORARY BUFFER FOR SEARCH COMMAND .ENDC ;.IF NDF NODUPS .=.+12 ;(FNAME) FILE NAME STORAGE .IF NDF NOMAC .=.+130. ;(MACBUF) MACRO STORAGE AREAS .=.+130. .ENDC ;.IF NDF NOMAC 0 ;(IBLKNM) INPUT BUFFER CURRENT BLOCK # 0 ;(INPTR) INPUT BUFFER POINTER 0 ;INPUT BUFFER EOF FLAG .+4+1000 ;INPUT BUFFER END ADDRESS .+2 ;INPUT BUFFER START ADDRESS .=.+1000+8. ;(INBUF) INPUT BUFFER (EXTRA 8 BYTES FOR DDCMP) ; 0 ;(OBLKNM) OUTPUT BUFFER CURRENT BLOCK # ;(BCNT) BUFFER COUNT DURING DDCMP INPUT 0 ;(OUTPTR) OUTPUT BUFFER POINTER ;(DDCMPI) BUFFER POINTER DURING DDCMP INPUT 0 ;OUTPUT BUFFER EOF FLAG ;(CRC) CRC VALUE DURING DDCMP INPUT .+4+1000 ;OUTPUT BUFFER END ADDRESS .+2 ;OUTPUT BUFFER START ADDRESS .=.+1000 ;(OUTBUF) OUTPUT BUFFER ; 0 ;(SBLKNM) SECONDARY BUFFER CURRENT BLOCK # 0 ;(SECPTR) SECONDARY BUFFER POINTER 0 ;SECONDARY BUFFER EOF FLAG INPTR+USER1+1010 ;SECONDARY BUFFER END ADDRESS INPTR+USER1+10 ;SECONDARY BUFFER START ADDRESS ; 0 ;(UBLKNM) SAVE/UNSAVE BUFFER CURRENT BLOCK # 0 ;(USVPTR) SAVE/UNSAVE BUFFER POINTER 0 ;SAVE/UNSAVE BUFFER EOF FLAG 0 ;SAVE/UNSAVE BUFFER END ADDRESS 0 ;SAVE/UNSAVE BUFFER START ADDRESS ; .RAD50 /SY/ ;(FLTMP) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(BAKFIL) SYSTEMS DEVICE .RAD50 / / ;FILE NAME (1ST HALF) .RAD50 / / ;FILE NAME (2ND HALF) .RAD50 /BAK/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(INFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(OUTFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SECFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SAVFIL) SYSTEMS DEVICE .RAD50 /SAV/ ;FILE NAME (1ST HALF) .RAD50 /E/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(TMPFIL) SYSTEMS DEVICE .RAD50 /EDI/ ;FILE NAME (1ST HALF) .RAD50 /T01/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /E01/ ;(SAVNAM) 2ND HALF OF SAVE FILE NAME ; .ASCII /[PAGE/ .BYTE 0,0,0,0,0,'],0 .ASCII /[/ .ASCIZ /00000 LINES READ IN]/ .EVEN ; .BYTE 0 ;(OVLYSW) OVERLAY FLAG: 0 => OVERLAY 1(REMED1), ; #0 => OVERLAY 2(REMED2). .BYTE 0 ;(RETRY) RETRY COUNT FOR ERROR RECOVERY .BYTE 0 ;(ICHAN) INPUT CHANNEL NUMBER .BYTE 1 ;(OCHAN) OUTPUT CHANNEL NUMBER .BYTE 2 ;(SCHAN) SECONDARY CHANNEL NUMBER .BYTE 3 ;(UCHAN) SAVE/UNSAVE CHANNEL NUMBER ;(RELBLK) RELATIVE BLK NBR DURING DDCMP PROGRAM LOADS .WORD 0 ;(ACHAN) ACTIVE CHANNEL NUMBER (LEFT BYTE FOR ; INPUT, RIGHT BYTE FOR OUTPUT). USP1: .WORD 0 ;(USP) USERS STACK POINTER .WORD 0 ;(ERR) I/O ERROR WORD .WORD CROUT1 ;(CROUT) I/O COROUTINE .BYTE 0 ;(NEEDIN) TTY NEED LINE FLAG .BYTE 0 ;(NEEDRM) TTY NEED OUTPUT BUFFER FLAG .WORD 0 ;(TTOCLO) TTY CONTROL O FLAG .WORD TT1BUF ;(TTYTAB) TTY INPUT BUFFER HEADER ADDRESS .WORD TT1OBF ;(TTOTAB) OUTPUT BUFFER HEADER ADDRESS .WORD 0 ;(TTILCT) INPUT BUFFER LINE COUNTER .WORD 0 ;(TTIPRE) TTY INPUT PREVIOUS CHARACTER .WORD TKS1 ;(TKS) TTY INPUT CSR REGISTER .WORD TPS1 ;(TPS) TTY OUTPUT CSR REGISTER .WORD TKB1 ;(TKB) TTY INPUT BUFFER REGISTER .WORD TPB1 ;(TPB) TTY OUTPUT BUFFER REGISTER .WORD TT1TBC ;(OUTCH) TTY TAB AND FILLER COUNTERS .BYTE 15 ;(FILLIT) TTY FILL CHARACTER .BYTE 0 ;(FILLCT) TTY FILL COUNT .WORD TTVEC1 ;(TTYVEC) TTY VECTOR ADDRESS .WORD TTYIN1 ;(TTYIN) TTY INPUT INTERRUPT ROUTINE .WORD TTYOT1 ;(TTYOUT) TTY OUTPUT INTERRUPT ROUTINE .IIF DF DIAL, .WORD 0 ;(TKSSAV) DL RECEIVER STATUS WORD SAVE ;MAKE SURE ALL AREAS ARE IDENTICAL (SIZE WISE) UP TO HERE T=.-USER1 .IIF NE T-E, .ERROR 1;IMPURE AREAS NOT IDENTICALLY ASSIGNED .WORD TT1BUF+6 ;TTY 1 INPUT BUFFER .WORD TT1BUF+6 TT1BUF: 0 .WORD TT1BUF+6 .WORD TT1BUF+TTINBF+6 .=.+TTINBF .WORD TT1OBF+6 ;TTY 1 OUTPUT BUFFER .WORD TT1OBF+6 TT1OBF: 0 .WORD TT1OBF+6 .WORD TT1OBF+TTOUBF+6 .=.+TTOUBF TT1TBC: 0,0,10 ;TAB AND FILLER COUNTER USIZE = .-USER1 ;USED FOR AREA TESTING FOR EQUAL LENGTHS .GLOBL USIZE .IF GT NUSERS-1 .SBTTL IMPURE AREA (FOR USER #2) ; .GLOBL USER2,.CURR2,DLVEC2,ENDM2,STACK2,USP2 .GLOBL CROUT2,TKS2,TPS2,TKB2,TPB2,TTVEC2 .GLOBL TTYIN2,TTYOT2 ; USER2: .WORD 0 ;(QUIT) QUIT CONTROL VARIABLE .=.+12. ;(CWD) CONTROL WORD ARRAY .BYTE 15 ;CWD TERMINATOR .BYTE 33 ;(CATEN) CONCATENATION CHARACTER .WORD 0 ;(PAGE) PAGE COUNTER .WORD 0 ;(SIZELS) TOTAL # OF LINES READ IN ;(BYTECT) BYTE COUNT OF LINE .WORD 55. ;(SIZEBF) TOTAL # OF LINES PER PAGE ALLOWED .WORD 0 ;(CWDS) CONTROL WORD POINTER .BYTE 0 ;(XOFF) DISABLE TTY OUTPUT [^S] .BYTE 0 ;(IOCOMP) I/O COMPLETION ROUTINE FLAG .BYTE 0 ;(DDCMP) DDCMP MODE SWITCH .BYTE 0 ;(DFLAG) DDCMP COMPLETION FLAG .BYTE 0 ;(CTIME) MAXIMUM TIME INTERVAL BETWEEN CHARACTERS OR ; MESSAGES IN DDCMP MODE. .BYTE 0 ;(DDCMPS) DDCMP MESSAGE EXPECTED .WORD 0 ;(DDCMPE) DDCMP ERROR ROUTINE FOR HANDLING MESSAGES ; NOT RECEIVED IN A CERTAIN TIME FRAME. .WORD 0 ;(SWAP) SWAP BLOCKS FOR DISK SCRATCH AREA .WORD .CURR2 ;(CURREN) CURRENT LINE .WORD 0 ;(PP) PREVIOUS LINE POINTER IN BLOCK BUFFER .WORD 0 ;(CP) CURRENT LINE POINTER IN BLOCK BUFFER .WORD 0 ;(NUMBER) NUMBER OF LINES TO LIST/PRINT/DELETE/MOVE ;(LOADAD) LOAD ADDRESS DURING DDCMP OPERATIONS .WORD 0 ;(LOADPC) LOAD PC DURING DDCMP OPERATIONS .WORD DLVEC2 ;(DLVEC) DL VECTOR ADDRESS ON REMOTE .WORD 0 ;(WRIOT) READ/WRITE BUFFER ADDRESS .WORD 0 ;(CHAN) CURRENT ACTIVE CHANNEL NUMBER .BYTE 0 ;(TEMP) TEMP STORAGE (BYTE ONLY) .BYTE 0 ;(QUOTE) QUOTE CHARACTER USED IN CHANGE AND PASTE ;(RUNGET) GET=0, RUN#0 FOR LOADING PROGRAMS INTO ; THE REMOTE. .WORD 0 ;(TEMP1) TEMP STORAGE (WORD ONLY) ;(CKSUM) CHECKSUM FOR LOADING DDCMP PROGRAMS .WORD 0 ;(TEMP2) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP3) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP4) TEMP STORAGE (WORD ONLY) .WORD 0 ;($CHAN) CHANNEL NUMBER .WORD 0 ;($DBLK) DEVICE BLOCK ADDRESS .WORD 0 ;(FSIZE) FILE SIZE GIVEN BY USER .WORD 0 ;BUFFER ADDRESS IN .READC AND .WRITC .WORD 0 ;CO-ROUTINE ADDRESS .WORD 0 ;(CDONE) CHANGE DONE ON THIS LINE COUNTER ;(TEMP5) TEMPORARY STORAGE (WORD ONLY) .WORD 0 ;(PDONE) PASTE CHANGE(S) DONE ON THIS LINE COUNTER ENDM2: .WORD 0 ;(ENDM) END OF MEMORY .WORD 0 ;(ENDCM) END OF LAST COMMAND .WORD 0,0 ;(BASE) BASE ADDRESS OF DATA AREA .WORD 0 ;(DEV) DEFAULT DEVICE .BYTE 0 ;(GO) GO FLAG .BYTE 0 ;(SYNS) SYNCH CHARACTER DETECTED: 0 = NO SYNCH'S RECEIVED, ; <0 = 1 SYNCH CHARACTER RECEIVED, ; >0 = TWO OR MORE SYNCH'S RECEIVED. .BYTE 202 ;(SWITCH) BIT 0 = (1) NO INPUT FILE OPEN ;BIT 1 = (1) VERIFY SWITCH ON ;BIT 2 = (1) CLOSE SWITCH ON ;BIT 3 = (1) OUTPUT FILE HAS SOME OUTPUT ;BIT 4 = (1) LIST IN OPERATION ;BIT 5 = (1) INDIRECT COMMAND IN USE (@) ;BIT 6 = (1) CONTINUED LINE ;BIT 7 = (1) BLOCK MODE ON .BYTE 0 ;BIT 0 = (1) TOP OF FILE REQUESTED ;BIT 1 = (1) BOTTOM REQUEST FROM READ COMMAND ;BIT 2 = (1) FORM FEED FOUND ON TEXT ; INPUT. ;BIT 3 = (1) /L GIVEN IN FILE COMMAND ;BIT 4 = (1) SECONDARY FILE OPEN ;BIT 5 = (1) SECONDARY FILE SELECTED FOR INPUT ;BIT 6 = (1) OUTPUT ON SWITCH ;BIT 7 = (1) EXIT CURRENTLY UNDERWAY .WORD 0 ;(SW2) BIT 0 = (1) NP COMMAND REQUESTED ;BIT 1 = (1) PAGE REQUESTED ;BIT 2 = (1) READ/WRITE OPERATION UNDERWAY ;BIT 3 = (1) NUMERIC REQUESTED DURING ; COMMAND MODE PROCESSING. ;BIT 4 = (1) MACRO IN PROGRESS ;BIT 5 = (1) BLOCK MODE WAS ACTIVE BEFORE CLOSE ;BIT 6 = (1) PAGE-FIND(LOCATE) ACTIVE ;BIT 7 = (1) LC OR PASTE ACTIVE ;BIT 8 = (1) AP/TYPE ACTIVE ;BIT 9 = (1) NO LINES READ IN FOR THIS PAGE ;BIT10 = (1) IMMEDIATE MACRO IN PROGRESS ;BIT11 = (1) RUN STATUS ;BIT12 = (1) CHANGE/LC/PASTE/SEARCH CALLING "SCAN" ;BIT13 = (1) EOB DETECTED ;BIT14 = (1) MACRO ALLOWED TO BE RE-EXECUTED ; AFTER EOB DETECTED. ;BIT15 = (1) "SAVE" OR "FILE" UNDERWAY STACK2: .WORD 0 ;(STACK) STACK LOCATION FOR CURRENT USER .=.+120. ;STACK SPACE FOR USER .WORD 0 ;(ARG1) 1ST ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(ARG2) 2ND ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(OARG) OLD ARGUMENT USED IN DETECTING ; RECURSION IN PASTES AND LC'S. .BYTE 0 ;(MACDEF) MACRO DEFINITION FLAGS .BYTE 0 .BYTE 0 ;(DDCMPO) DDCMP OUTPUT MODE FLAG .BYTE 2 ;(MAXMAC) MAXIMUM # OF MACRO SLOTS AVAILABLE .WORD 0 ;(NARG) NUMERIC ARGUMENT FOR MACRO .WORD 0 ;(MACARG) MACRO REPEAT COUNTER .WORD 0 ;(CURMAC) CURRENT MACRO START ADDRESS .WORD 0 ;(OLDCWD) OLD CWDS POINTER .CURR2: .=.+LINELN+4 ;(.CURRN) CURRENT LINE .=.+LINELN+4 ;(CMD) COMMAND BUFFER .IF NDF NODUPS .=.+120. ;(TSBUF) TEMPORARY BUFFER FOR SEARCH COMMAND .ENDC ;.IF NDF NODUPS .=.+12 ;(FNAME) FILE NAME STORAGE .IF NDF NOMAC .=.+130. ;(MACBUF) MACRO STORAGE AREAS .=.+130. .ENDC ;.IF NDF NOMAC 0 ;(IBLKNM) INPUT BUFFER CURRENT BLOCK # 0 ;(INPTR) INPUT BUFFER POINTER 0 ;INPUT BUFFER EOF FLAG .+4+1000 ;INPUT BUFFER END ADDRESS .+2 ;INPUT BUFFER START ADDRESS .=.+1000+8. ;(INBUF) INPUT BUFFER (EXTRA 8 BYTES FOR DDCMP) ; 0 ;(OBLKNM) OUTPUT BUFFER CURRENT BLOCK # ;(BCNT) BUFFER COUNT DURING DDCMP INPUT 0 ;(OUTPTR) OUTPUT BUFFER POINTER ;(DDCMPI) BUFFER POINTER DURING DDCMP INPUT 0 ;OUTPUT BUFFER EOF FLAG ;(CRC) CRC VALUE DURING DDCMP INPUT .+4+1000 ;OUTPUT BUFFER END ADDRESS .+2 ;OUTPUT BUFFER START ADDRESS .=.+1000 ;(OUTBUF) OUTPUT BUFFER ; 0 ;(SBLKNM) SECONDARY BUFFER CURRENT BLOCK # 0 ;(SECPTR) SECONDARY BUFFER POINTER 0 ;SECONDARY BUFFER EOF FLAG INPTR+USER2+1010 ;SECONDARY BUFFER END ADDRESS INPTR+USER2+10 ;SECONDARY BUFFER START ADDRESS ; 0 ;(UBLKNM) SAVE/UNSAVE BUFFER CURRENT BLOCK # 0 ;(USVPTR) SAVE/UNSAVE BUFFER POINTER 0 ;SAVE/UNSAVE BUFFER EOF FLAG 0 ;SAVE/UNSAVE BUFFER END ADDRESS 0 ;SAVE/UNSAVE BUFFER START ADDRESS ; .RAD50 /SY/ ;(FLTMP) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(BAKFIL) SYSTEMS DEVICE .RAD50 / / ;FILE NAME (1ST HALF) .RAD50 / / ;FILE NAME (2ND HALF) .RAD50 /BAK/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(INFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(OUTFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SECFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SAVFIL) SYSTEMS DEVICE .RAD50 /SAV/ ;FILE NAME (1ST HALF) .RAD50 /E/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(TMPFIL) SYSTEMS DEVICE .RAD50 /EDI/ ;FILE NAME (1ST HALF) .RAD50 /T02/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /E02/ ;(SAVNAM) 2ND HALF OF SAVE FILE NAME ; .ASCII /[PAGE/ .BYTE 0,0,0,0,0,'],0 .ASCII /[/ .ASCIZ /00000 LINES READ IN]/ .EVEN ; .BYTE 0 ;(OVLYSW) OVERLAY FLAG: 0 => OVERLAY 1(REMED1), ; #0 => OVERLAY 2(REMED2). .BYTE 0 ;(RETRY) RETRY COUNT FOR ERROR RECOVERY .BYTE 4 ;(ICHAN) INPUT CHANNEL NUMBER .BYTE 5 ;(OCHAN) OUTPUT CHANNEL NUMBER .BYTE 6 ;(SCHAN) SECONDARY CHANNEL NUMBER .BYTE 7 ;(UCHAN) SAVE/UNSAVE CHANNEL NUMBER ;(RELBLK) RELATIVE BLK NBR DURING DDCMP PROGRAM LOADS .WORD 0 ;(ACHAN) ACTIVE CHANNEL NUMBER (LEFT BYTE FOR ; INPUT, RIGHT BYTE FOR OUTPUT). USP2: .WORD 0 ;(USP) USERS STACK POINTER .WORD 0 ;(ERR) I/O ERROR WORD .WORD CROUT2 ;(CROUT) I/O COROUTINE .BYTE 0 ;(NEEDIN) TTY NEED LINE FLAG .BYTE 0 ;(NEEDRM) TTY NEED OUTPUT BUFFER FLAG .WORD 0 ;(TTOCLO) TTY CONTROL O FLAG .WORD TT2BUF ;(TTYTAB) TTY INPUT BUFFER HEADER ADDRESS .WORD TT2OBF ;(TTOTAB) OUTPUT BUFFER HEADER ADDRESS .WORD 0 ;(TTILCT) INPUT BUFFER LINE COUNTER .WORD 0 ;(TTIPRE) TTY INPUT PREVIOUS CHARACTER .WORD TKS2 ;(TKS) TTY INPUT CSR REGISTER .WORD TPS2 ;(TPS) TTY OUTPUT CSR REGISTER .WORD TKB2 ;(TKB) TTY INPUT BUFFER REGISTER .WORD TPB2 ;(TPB) TTY OUTPUT BUFFER REGISTER .WORD TT2TBC ;(OUTCH) TTY TAB AND FILLER COUNTERS .BYTE 15 ;(FILLIT) TTY FILL CHARACTER .BYTE 0 ;(FILLCT) TTY FILL COUNT .WORD TTVEC2 ;(TTYVEC) TTY VECTOR ADDRESS .WORD TTYIN2 ;(TTYIN) TTY INPUT INTERRUPT ROUTINE .WORD TTYOT2 ;(TTYOUT) TTY OUTPUT INTERRUPT ROUTINE .IIF DF DIAL, .WORD 0 ;(TKSSAV) DL RECEIVER STATUS WORD SAVE ;MAKE SURE ALL AREAS ARE IDENTICAL (SIZE WISE) UP TO HERE T=.-USER2 .IIF NE T-E, .ERROR 1;IMPURE AREAS NOT IDENTICALLY ASSIGNED .WORD TT2BUF+6 ;TTY 2 INPUT BUFFER .WORD TT2BUF+6 TT2BUF: 0 .WORD TT2BUF+6 .WORD TT2BUF+TTINBF+6 .=.+TTINBF .WORD TT2OBF+6 ;TTY 2 OUTPUT BUFFER .WORD TT2OBF+6 TT2OBF: 0 .WORD TT2OBF+6 .WORD TT2OBF+TTOUBF+6 .=.+TTOUBF TT2TBC: 0,0,10 ;TAB AND FILLER COUNTER UX = .-USER2 .IIF NE UX-USIZE, .ERROR 1; IMPURE AREAS NOT IDENTICALLY ASSIGNED .ENDC ;.IF GT NUSERS-1 .IF GT NUSERS-2 .SBTTL IMPURE AREA (FOR USER #3) ; .GLOBL USER3,.CURR3,DLVEC3,ENDM3,STACK3,USP3 .GLOBL CROUT3,TKS3,TPS3,TKB3,TPB3,TTVEC3 .GLOBL TTYIN3,TTYOT3 ; USER3: .WORD 0 ;(QUIT) QUIT CONTROL VARIABLE .=.+12. ;(CWD) CONTROL WORD ARRAY .BYTE 15 ;CWD TERMINATOR .BYTE 33 ;(CATEN) CONCATENATION CHARACTER .WORD 0 ;(PAGE) PAGE COUNTER .WORD 0 ;(SIZELS) TOTAL # OF LINES READ IN ;(BYTECT) BYTE COUNT OF LINE .WORD 55. ;(SIZEBF) TOTAL # OF LINES PER PAGE ALLOWED .WORD 0 ;(CWDS) CONTROL WORD POINTER .BYTE 0 ;(XOFF) DISABLE TTY OUTPUT [^S] .BYTE 0 ;(IOCOMP) I/O COMPLETION ROUTINE FLAG .BYTE 0 ;(DDCMP) DDCMP MODE SWITCH .BYTE 0 ;(DFLAG) DDCMP COMPLETION FLAG .BYTE 0 ;(CTIME) MAXIMUM TIME INTERVAL BETWEEN CHARACTERS OR ; MESSAGES IN DDCMP MODE. .BYTE 0 ;(DDCMPS) DDCMP MESSAGE EXPECTED .WORD 0 ;(DDCMPE) DDCMP ERROR ROUTINE FOR HANDLING MESSAGES ; NOT RECEIVED IN A CERTAIN TIME FRAME. .WORD 0 ;(SWAP) SWAP BLOCKS FOR DISK SCRATCH AREA .WORD .CURR3 ;(CURREN) CURRENT LINE .WORD 0 ;(PP) PREVIOUS LINE POINTER IN BLOCK BUFFER .WORD 0 ;(CP) CURRENT LINE POINTER IN BLOCK BUFFER .WORD 0 ;(NUMBER) NUMBER OF LINES TO LIST/PRINT/DELETE/MOVE ;(LOADAD) LOAD ADDRESS DURING DDCMP OPERATIONS .WORD 0 ;(LOADPC) LOAD PC DURING DDCMP OPERATIONS .WORD DLVEC3 ;(DLVEC) DL VECTOR ADDRESS ON REMOTE .WORD 0 ;(WRIOT) READ/WRITE BUFFER ADDRESS .WORD 0 ;(CHAN) CURRENT ACTIVE CHANNEL NUMBER .BYTE 0 ;(TEMP) TEMP STORAGE (BYTE ONLY) .BYTE 0 ;(QUOTE) QUOTE CHARACTER USED IN CHANGE AND PASTE ;(RUNGET) GET=0, RUN#0 FOR LOADING PROGRAMS INTO ; THE REMOTE. .WORD 0 ;(TEMP1) TEMP STORAGE (WORD ONLY) ;(CKSUM) CHECKSUM FOR LOADING DDCMP PROGRAMS .WORD 0 ;(TEMP2) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP3) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP4) TEMP STORAGE (WORD ONLY) .WORD 0 ;($CHAN) CHANNEL NUMBER .WORD 0 ;($DBLK) DEVICE BLOCK ADDRESS .WORD 0 ;(FSIZE) FILE SIZE GIVEN BY USER .WORD 0 ;BUFFER ADDRESS IN .READC AND .WRITC .WORD 0 ;CO-ROUTINE ADDRESS .WORD 0 ;(CDONE) CHANGE DONE ON THIS LINE COUNTER ;(TEMP5) TEMPORARY STORAGE (WORD ONLY) .WORD 0 ;(PDONE) PASTE CHANGE(S) DONE ON THIS LINE COUNTER ENDM3: .WORD 0 ;(ENDM) END OF MEMORY .WORD 0 ;(ENDCM) END OF LAST COMMAND .WORD 0,0 ;(BASE) BASE ADDRESS OF DATA AREA .WORD 0 ;(DEV) DEFAULT DEVICE .BYTE 0 ;(GO) GO FLAG .BYTE 0 ;(SYNS) SYNCH CHARACTER DETECTED: 0 = NO SYNCH'S RECEIVED, ; <0 = 1 SYNCH CHARACTER RECEIVED, ; >0 = TWO OR MORE SYNCH'S RECEIVED. .BYTE 202 ;(SWITCH) BIT 0 = (1) NO INPUT FILE OPEN ;BIT 1 = (1) VERIFY SWITCH ON ;BIT 2 = (1) CLOSE SWITCH ON ;BIT 3 = (1) OUTPUT FILE HAS SOME OUTPUT ;BIT 4 = (1) LIST IN OPERATION ;BIT 5 = (1) INDIRECT COMMAND IN USE (@) ;BIT 6 = (1) CONTINUED LINE ;BIT 7 = (1) BLOCK MODE ON .BYTE 0 ;BIT 0 = (1) TOP OF FILE REQUESTED ;BIT 1 = (1) BOTTOM REQUEST FROM READ COMMAND ;BIT 2 = (1) FORM FEED FOUND ON TEXT ; INPUT. ;BIT 3 = (1) /L GIVEN IN FILE COMMAND ;BIT 4 = (1) SECONDARY FILE OPEN ;BIT 5 = (1) SECONDARY FILE SELECTED FOR INPUT ;BIT 6 = (1) OUTPUT ON SWITCH ;BIT 7 = (1) EXIT CURRENTLY UNDERWAY .WORD 0 ;(SW2) BIT 0 = (1) NP COMMAND REQUESTED ;BIT 1 = (1) PAGE REQUESTED ;BIT 2 = (1) READ/WRITE OPERATION UNDERWAY ;BIT 3 = (1) NUMERIC REQUESTED DURING ; COMMAND MODE PROCESSING. ;BIT 4 = (1) MACRO IN PROGRESS ;BIT 5 = (1) BLOCK MODE WAS ACTIVE BEFORE CLOSE ;BIT 6 = (1) PAGE-FIND(LOCATE) ACTIVE ;BIT 7 = (1) LC OR PASTE ACTIVE ;BIT 8 = (1) AP/TYPE ACTIVE ;BIT 9 = (1) NO LINES READ IN FOR THIS PAGE ;BIT10 = (1) IMMEDIATE MACRO IN PROGRESS ;BIT11 = (1) RUN STATUS ;BIT12 = (1) CHANGE/LC/PASTE/SEARCH CALLING "SCAN" ;BIT13 = (1) EOB DETECTED ;BIT14 = (1) MACRO ALLOWED TO BE RE-EXECUTED ; AFTER EOB DETECTED. ;BIT15 = (1) "SAVE" OR "FILE" UNDERWAY STACK3: .WORD 0 ;(STACK) STACK LOCATION FOR CURRENT USER .=.+120. ;STACK SPACE FOR USER .WORD 0 ;(ARG1) 1ST ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(ARG2) 2ND ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(OARG) OLD ARGUMENT USED IN DETECTING ; RECURSION IN PASTES AND LC'S. .BYTE 0 ;(MACDEF) MACRO DEFINITION FLAGS .BYTE 0 .BYTE 0 ;(DDCMPO) DDCMP OUTPUT MODE FLAG .BYTE 2 ;(MAXMAC) MAXIMUM # OF MACRO SLOTS AVAILABLE .WORD 0 ;(NARG) NUMERIC ARGUMENT FOR MACRO .WORD 0 ;(MACARG) MACRO REPEAT COUNTER .WORD 0 ;(CURMAC) CURRENT MACRO START ADDRESS .WORD 0 ;(OLDCWD) OLD CWDS POINTER .CURR3: .=.+LINELN+4 ;(.CURRN) CURRENT LINE .=.+LINELN+4 ;(CMD) COMMAND BUFFER .IF NDF NODUPS .=.+120. ;(TSBUF) TEMPORARY BUFFER FOR SEARCH COMMAND .ENDC ;.IF NDF NODUPS .=.+12 ;(FNAME) FILE NAME STORAGE .IF NDF NOMAC .=.+130. ;(MACBUF) MACRO STORAGE AREAS .=.+130. .ENDC ;.IF NDF NOMAC 0 ;(IBLKNM) INPUT BUFFER CURRENT BLOCK # 0 ;(INPTR) INPUT BUFFER POINTER 0 ;INPUT BUFFER EOF FLAG .+4+1000 ;INPUT BUFFER END ADDRESS .+2 ;INPUT BUFFER START ADDRESS .=.+1000+8. ;(INBUF) INPUT BUFFER (EXTRA 8 BYTES FOR DDCMP) ; 0 ;(OBLKNM) OUTPUT BUFFER CURRENT BLOCK # ;(BCNT) BUFFER COUNT DURING DDCMP INPUT 0 ;(OUTPTR) OUTPUT BUFFER POINTER ;(DDCMPI) BUFFER POINTER DURING DDCMP INPUT 0 ;OUTPUT BUFFER EOF FLAG ;(CRC) CRC VALUE DURING DDCMP INPUT .+4+1000 ;OUTPUT BUFFER END ADDRESS .+2 ;OUTPUT BUFFER START ADDRESS .=.+1000 ;(OUTBUF) OUTPUT BUFFER ; 0 ;(SBLKNM) SECONDARY BUFFER CURRENT BLOCK # 0 ;(SECPTR) SECONDARY BUFFER POINTER 0 ;SECONDARY BUFFER EOF FLAG INPTR+USER3+1010 ;SECONDARY BUFFER END ADDRESS INPTR+USER3+10 ;SECONDARY BUFFER START ADDRESS ; 0 ;(UBLKNM) SAVE/UNSAVE BUFFER CURRENT BLOCK # 0 ;(USVPTR) SAVE/UNSAVE BUFFER POINTER 0 ;SAVE/UNSAVE BUFFER EOF FLAG 0 ;SAVE/UNSAVE BUFFER END ADDRESS 0 ;SAVE/UNSAVE BUFFER START ADDRESS ; .RAD50 /SY/ ;(FLTMP) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(BAKFIL) SYSTEMS DEVICE .RAD50 / / ;FILE NAME (1ST HALF) .RAD50 / / ;FILE NAME (2ND HALF) .RAD50 /BAK/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(INFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(OUTFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SECFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SAVFIL) SYSTEMS DEVICE .RAD50 /SAV/ ;FILE NAME (1ST HALF) .RAD50 /E/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(TMPFIL) SYSTEMS DEVICE .RAD50 /EDI/ ;FILE NAME (1ST HALF) .RAD50 /T03/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /E03/ ;(SAVNAM) 2ND HALF SAVE FILE NAME ; .ASCII /[PAGE/ .BYTE 0,0,0,0,0,'],0 .ASCII /[/ .ASCIZ /00000 LINES READ IN]/ .EVEN ; .BYTE 0 ;(OVLYSW) OVERLAY FLAG: 0 => OVERLAY 1(REMED1), ; #0 => OVERLAY 2(REMED2). .BYTE 0 ;(RETRY) RETRY COUNT FOR ERROR RECOVERY .BYTE 10 ;(ICHAN) INPUT CHANNEL NUMBER .BYTE 11 ;(OCHAN) OUTPUT CHANNEL NUMBER .BYTE 12 ;(SCHAN) SECONDARY CHANNEL NUMBER .BYTE 13 ;(UCHAN) SAVE/UNSAVE CHANNEL NUMBER ;(RELBLK) RELATIVE BLK NBR DURING DDCMP PROGRAM LOADS .WORD 0 ;(ACHAN) ACTIVE CHANNEL NUMBER (LEFT BYTE FOR ; INPUT, RIGHT BYTE FOR OUTPUT). USP3: .WORD 0 ;(USP) USERS STACK POINTER .WORD 0 ;(ERR) I/O ERROR WORD .WORD CROUT3 ;(CROUT) I/O COROUTINE .BYTE 0 ;(NEEDIN) TTY NEED LINE FLAG .BYTE 0 ;(NEEDRM) TTY NEED OUTPUT BUFFER FLAG .WORD 0 ;(TTOCLO) TTY CONTROL O FLAG .WORD TT3BUF ;(TTYTAB) TTY INPUT BUFFER HEADER ADDRESS .WORD TT3OBF ;(TTOTAB) OUTPUT BUFFER HEADER ADDRESS .WORD 0 ;(TTILCT) INPUT BUFFER LINE COUNTER .WORD 0 ;(TTIPRE) TTY INPUT PREVIOUS CHARACTER .WORD TKS3 ;(TKS) TTY INPUT CSR REGISTER .WORD TPS3 ;(TPS) TTY OUTPUT CSR REGISTER .WORD TKB3 ;(TKB) TTY INPUT BUFFER REGISTER .WORD TPB3 ;(TPB) TTY OUTPUT BUFFER REGISTER .WORD TT3TBC ;(OUTCH) TTY TAB AND FILLER COUNTERS .BYTE 15 ;(FILLIT) TTY FILL CHARACTER .BYTE 0 ;(FILLCT) TTY FILL COUNT .WORD TTVEC3 ;(TTYVEC) TTY VECTOR ADDRESS .WORD TTYIN3 ;(TTYIN) TTY INPUT INTERRUPT ROUTINE .WORD TTYOT3 ;(TTYOUT) TTY OUTPUT INTERRUPT ROUTINE .IIF DF DIAL, .WORD 0 ;(TKSSAV) DL RECEIVER STATUS WORD SAVE ;MAKE SURE ALL AREAS ARE IDENTICAL (SIZE WISE) UP TO HERE T=.-USER3 .IIF NE T-E, .ERROR 1;IMPURE AREAS NOT IDENTICALLY ASSIGNED .WORD TT3BUF+6 ;TTY 3 INPUT BUFFER .WORD TT3BUF+6 TT3BUF: 0 .WORD TT3BUF+6 .WORD TT3BUF+TTINBF+6 .=.+TTINBF .WORD TT3OBF+6 ;TTY 3 OUTPUT BUFFER .WORD TT3OBF+6 TT3OBF: 0 .WORD TT3OBF+6 .WORD TT3OBF+TTOUBF+6 .=.+TTOUBF TT3TBC: 0,0,10 ;TAB AND FILLER COUNTER UX = .-USER3 .IIF NE UX-USIZE, .ERROR 1; IMPURE AREAS NOT IDENTICALLY ASSIGNED .ENDC ;.IF GT NUSERS-2 .IF GT NUSERS-3 .SBTTL IMPURE AREA (FOR USER #4) ; .GLOBL USER4,.CURR4,DLVEC4,ENDM4,STACK4,USP4 .GLOBL CROUT4,TKS4,TPS4,TKB4,TPB4,TTVEC4 .GLOBL TTYIN4,TTYOT4 ; USER4: .WORD 0 ;(QUIT) QUIT CONTROL VARIABLE .=.+12. ;(CWD) CONTROL WORD ARRAY .BYTE 15 ;CWD TERMINATOR .BYTE 33 ;(CATEN) CONCATENATION CHARACTER .WORD 0 ;(PAGE) PAGE COUNTER .WORD 0 ;(SIZELS) TOTAL # OF LINES READ IN ;(BYTECT) BYTE COUNT OF LINE .WORD 55. ;(SIZEBF) TOTAL # OF LINES PER PAGE ALLOWED .WORD 0 ;(CWDS) CONTROL WORD POINTER .BYTE 0 ;(XOFF) DISABLE TTY OUTPUT [^S] .BYTE 0 ;(IOCOMP) I/O COMPLETION ROUTINE FLAG .BYTE 0 ;(DDCMP) DDCMP MODE SWITCH .BYTE 0 ;(DFLAG) DDCMP COMPLETION FLAG .BYTE 0 ;(CTIME) MAXIMUM TIME INTERVAL BETWEEN CHARACTERS OR ; MESSAGES IN DDCMP MODE. .BYTE 0 ;(DDCMPS) DDCMP MESSAGE EXPECTED .WORD 0 ;(DDCMPE) DDCMP ERROR ROUTINE FOR HANDLING MESSAGES ; NOT RECEIVED IN A CERTAIN TIME FRAME. .WORD 0 ;(SWAP) SWAP BLOCKS FOR DISK SCRATCH AREA .WORD .CURR4 ;(CURREN) CURRENT LINE .WORD 0 ;(PP) PREVIOUS LINE POINTER IN BLOCK BUFFER .WORD 0 ;(CP) CURRENT LINE POINTER IN BLOCK BUFFER .WORD 0 ;(NUMBER) NUMBER OF LINES TO LIST/PRINT/DELETE/MOVE ;(LOADAD) LOAD ADDRESS DURING DDCMP OPERATIONS .WORD 0 ;(LOADPC) LOAD PC DURING DDCMP OPERATIONS .WORD DLVEC4 ;(DLVEC) DL VECTOR ADDRESS ON REMOTE .WORD 0 ;(WRIOT) READ/WRITE BUFFER ADDRESS .WORD 0 ;(CHAN) CURRENT ACTIVE CHANNEL NUMBER .BYTE 0 ;(TEMP) TEMP STORAGE (BYTE ONLY) .BYTE 0 ;(QUOTE) QUOTE CHARACTER USED IN CHANGE AND PASTE ;(RUNGET) GET=0, RUN#0 FOR LOADING PROGRAMS INTO ; THE REMOTE. .WORD 0 ;(TEMP1) TEMP STORAGE (WORD ONLY) ;(CKSUM) CHECKSUM FOR LOADING DDCMP PROGRAMS .WORD 0 ;(TEMP2) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP3) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP4) TEMP STORAGE (WORD ONLY) .WORD 0 ;($CHAN) CHANNEL NUMBER .WORD 0 ;($DBLK) DEVICE BLOCK ADDRESS .WORD 0 ;(FSIZE) FILE SIZE GIVEN BY USER .WORD 0 ;BUFFER ADDRESS IN .READC AND .WRITC .WORD 0 ;CO-ROUTINE ADDRESS .WORD 0 ;(CDONE) CHANGE DONE ON THIS LINE COUNTER ;(TEMP5) TEMPORARY STORAGE (WORD ONLY) .WORD 0 ;(PDONE) PASTE CHANGE(S) DONE ON THIS LINE COUNTER ENDM4: .WORD 0 ;(ENDM) END OF MEMORY .WORD 0 ;(ENDCM) END OF LAST COMMAND .WORD 0,0 ;(BASE) BASE ADDRESS OF DATA AREA .WORD 0 ;(DEV) DEFAULT DEVICE .BYTE 0 ;(GO) GO FLAG .BYTE 0 ;(SYNS) SYNCH CHARACTER DETECTED: 0 = NO SYNCH'S RECEIVED, ; <0 = 1 SYNCH CHARACTER RECEIVED, ; >0 = TWO OR MORE SYNCH'S RECEIVED. .BYTE 202 ;(SWITCH) BIT 0 = (1) NO INPUT FILE OPEN ;BIT 1 = (1) VERIFY SWITCH ON ;BIT 2 = (1) CLOSE SWITCH ON ;BIT 3 = (1) OUTPUT FILE HAS SOME OUTPUT ;BIT 4 = (1) LIST IN OPERATION ;BIT 5 = (1) INDIRECT COMMAND IN USE (@) ;BIT 6 = (1) CONTINUED LINE ;BIT 7 = (1) BLOCK MODE ON .BYTE 0 ;BIT 0 = (1) TOP OF FILE REQUESTED ;BIT 1 = (1) BOTTOM REQUEST FROM READ COMMAND ;BIT 2 = (1) FORM FEED FOUND ON TEXT ; INPUT. ;BIT 3 = (1) /L GIVEN IN FILE COMMAND ;BIT 4 = (1) SECONDARY FILE OPEN ;BIT 5 = (1) SECONDARY FILE SELECTED FOR INPUT ;BIT 6 = (1) OUTPUT ON SWITCH ;BIT 7 = (1) EXIT CURRENTLY UNDERWAY .WORD 0 ;(SW2) BIT 0 = (1) NP COMMAND REQUESTED ;BIT 1 = (1) PAGE REQUESTED ;BIT 2 = (1) READ/WRITE OPERATION UNDERWAY ;BIT 3 = (1) NUMERIC REQUESTED DURING ; COMMAND MODE PROCESSING. ;BIT 4 = (1) MACRO IN PROGRESS ;BIT 5 = (1) BLOCK MODE WAS ACTIVE BEFORE CLOSE ;BIT 6 = (1) PAGE-FIND(LOCATE) ACTIVE ;BIT 7 = (1) LC OR PASTE ACTIVE ;BIT 8 = (1) AP/TYPE ACTIVE ;BIT 9 = (1) NO LINES READ IN FOR THIS PAGE ;BIT10 = (1) IMMEDIATE MACRO IN PROGRESS ;BIT11 = (1) RUN STATUS ;BIT12 = (1) CHANGE/LC/PASTE/SEARCH CALLING "SCAN" ;BIT13 = (1) EOB DETECTED ;BIT14 = (1) MACRO ALLOWED TO BE RE-EXECUTED ; AFTER EOB DETECTED. ;BIT15 = (1) "SAVE" OR "FILE" UNDERWAY STACK4: .WORD 0 ;(STACK) STACK LOCATION FOR CURRENT USER .=.+120. ;STACK SPACE FOR USER .WORD 0 ;(ARG1) 1ST ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(ARG2) 2ND ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(OARG) OLD ARGUMENT USED IN DETECTING ; RECURSION IN PASTES AND LC'S. .BYTE 0 ;(MACDEF) MACRO DEFINITION FLAGS .BYTE 0 .BYTE 0 ;(DDCMPO) DDCMP OUTPUT MODE FLAG .BYTE 2 ;(MAXMAC) MAXIMUM # OF MACRO SLOTS AVAILABLE .WORD 0 ;(NARG) NUMERIC ARGUMENT FOR MACRO .WORD 0 ;(MACARG) MACRO REPEAT COUNTER .WORD 0 ;(CURMAC) CURRENT MACRO START ADDRESS .WORD 0 ;(OLDCWD) OLD CWDS POINTER .CURR4: .=.+LINELN+4 ;(.CURRN) CURRENT LINE .=.+LINELN+4 ;(CMD) COMMAND BUFFER .IF NDF NODUPS .=.+120. ;(TSBUF) TEMPORARY BUFFER FOR SEARCH COMMAND .ENDC ;.IF NDF NODUPS .=.+12 ;(FNAME) FILE NAME STORAGE .IF NDF NOMAC .=.+130. ;(MACBUF) MACRO STORAGE AREAS .=.+130. .ENDC ;.IF NDF NOMAC 0 ;(IBLKNM) INPUT BUFFER CURRENT BLOCK # 0 ;(INPTR) INPUT BUFFER POINTER 0 ;INPUT BUFFER EOF FLAG .+4+1000 ;INPUT BUFFER END ADDRESS .+2 ;INPUT BUFFER START ADDRESS .=.+1000+8. ;(INBUF) INPUT BUFFER (EXTRA 8 BYTES FOR DDCMP) ; 0 ;(OBLKNM) OUTPUT BUFFER CURRENT BLOCK # ;(BCNT) BUFFER COUNT DURING DDCMP INPUT 0 ;(OUTPTR) OUTPUT BUFFER POINTER ;(DDCMPI) BUFFER POINTER DURING DDCMP INPUT 0 ;OUTPUT BUFFER EOF FLAG ;(CRC) CRC VALUE DURING DDCMP INPUT .+4+1000 ;OUTPUT BUFFER END ADDRESS .+2 ;OUTPUT BUFFER START ADDRESS .=.+1000 ;(OUTBUF) OUTPUT BUFFER ; 0 ;(SBLKNM) SECONDARY BUFFER CURRENT BLOCK # 0 ;(SECPTR) SECONDARY BUFFER POINTER 0 ;SECONDARY BUFFER EOF FLAG INPTR+USER4+1010 ;SECONDARY BUFFER END ADDRESS INPTR+USER4+10 ;SECONDARY BUFFER START ADDRESS ; 0 ;(UBLKNM) SAVE/UNSAVE BUFFER CURRENT BLOCK # 0 ;(USVPTR) SAVE/UNSAVE BUFFER POINTER 0 ;SAVE/UNSAVE BUFFER EOF FLAG 0 ;SAVE/UNSAVE BUFFER END ADDRESS 0 ;SAVE/UNSAVE BUFFER START ADDRESS ; .RAD50 /SY/ ;(FLTMP) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(BAKFIL) SYSTEMS DEVICE .RAD50 / / ;FILE NAME (1ST HALF) .RAD50 / / ;FILE NAME (2ND HALF) .RAD50 /BAK/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(INFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(OUTFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SECFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SAVFIL) SYSTEMS DEVICE .RAD50 /SAV/ ;FILE NAME (1ST HALF) .RAD50 /E/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(TMPFIL) SYSTEMS DEVICE .RAD50 /EDI/ ;FILE NAME (1ST HALF) .RAD50 /T04/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /E04/ ;(SAVNAM) "SAVE" OR "FILE" UNDERWAY ; .ASCII /[PAGE/ .BYTE 0,0,0,0,0,'],0 .ASCII /[/ .ASCIZ /00000 LINES READ IN]/ .EVEN ; .BYTE 0 ;(OVLYSW) OVERLAY FLAG: 0 => OVERLAY 1(REMED1), ; #0 => OVERLAY 2(REMED2). .BYTE 0 ;(RETRY) RETRY COUNT FOR ERROR RECOVERY .BYTE 20 ;(ICHAN) INPUT CHANNEL NUMBER .BYTE 21 ;(OCHAN) OUTPUT CHANNEL NUMBER .BYTE 22 ;(SCHAN) SECONDARY CHANNEL NUMBER .BYTE 23 ;(UCHAN) SAVE/UNSAVE CHANNEL NUMBER ;(RELBLK) RELATIVE BLK NBR DURING DDCMP PROGRAM LOADS .WORD 0 ;(ACHAN) ACTIVE CHANNEL NUMBER (LEFT BYTE FOR ; INPUT, RIGHT BYTE FOR OUTPUT). USP4: .WORD 0 ;(USP) USERS STACK POINTER .WORD 0 ;(ERR) I/O ERROR WORD .WORD CROUT4 ;(CROUT) I/O COROUTINE .BYTE 0 ;(NEEDIN) TTY NEED LINE FLAG .BYTE 0 ;(NEEDRM) TTY NEED OUTPUT BUFFER FLAG .WORD 0 ;(TTOCLO) TTY CONTROL O FLAG .WORD TT4BUF ;(TTYTAB) TTY INPUT BUFFER HEADER ADDRESS .WORD TT4OBF ;(TTOTAB) OUTPUT BUFFER HEADER ADDRESS .WORD 0 ;(TTILCT) INPUT BUFFER LINE COUNTER .WORD 0 ;(TTIPRE) TTY INPUT PREVIOUS CHARACTER .WORD TKS4 ;(TKS) TTY INPUT CSR REGISTER .WORD TPS4 ;(TPS) TTY OUTPUT CSR REGISTER .WORD TKB4 ;(TKB) TTY INPUT BUFFER REGISTER .WORD TPB4 ;(TPB) TTY OUTPUT BUFFER REGISTER .WORD TT4TBC ;(OUTCH) TTY TAB AND FILLER COUNTERS .BYTE 15 ;(FILLIT) TTY FILL CHARACTER .BYTE 0 ;(FILLCT) TTY FILL COUNT .WORD TTVEC4 ;(TTYVEC) TTY VECTOR ADDRESS .WORD TTYIN4 ;(TTYIN) TTY INPUT INTERRUPT ROUTINE .WORD TTYOT4 ;(TTYOUT) TTY OUTPUT INTERRUPT ROUTINE .IIF DF DIAL, .WORD 0 ;(TKSSAV) DL RECEIVER STATUS WORD SAVE ;MAKE SURE ALL AREAS ARE IDENTICAL (SIZE WISE) UP TO HERE T=.-USER4 .IIF NE T-E, .ERROR 1;IMPURE AREAS NOT IDENTICALLY ASSIGNED .WORD TT4BUF+6 ;TTY 4 INPUT BUFFER .WORD TT4BUF+6 TT4BUF: 0 .WORD TT4BUF+6 .WORD TT4BUF+TTINBF+6 .=.+TTINBF .WORD TT4OBF+6 ;TTY 4 OUTPUT BUFFER .WORD TT4OBF+6 TT4OBF: 0 .WORD TT4OBF+6 .WORD TT4OBF+TTOUBF+6 .=.+TTOUBF TT4TBC: 0,0,10 ;TAB AND FILLER COUNTER UX = .-USER4 .IIF NE UX-USIZE, .ERROR 1; IMPURE AREAS NOT IDENTICALLY ASSIGNED .ENDC ;.IF GT NUSERS-3 .IF GT NUSERS-4 .SBTTL IMPURE AREA (FOR USER #5) ; .GLOBL USER5,.CURR5,DLVEC5,ENDM5,STACK5,USP5 .GLOBL CROUT5,TKS5,TPS5,TKB5,TPB5,TTVEC5 .GLOBL TTYIN5,TTYOT5 ; USER5: .WORD 0 ;(QUIT) QUIT CONTROL VARIABLE .=.+12. ;(CWD) CONTROL WORD ARRAY .BYTE 15 ;CWD TERMINATOR .BYTE 33 ;(CATEN) CONCATENATION CHARACTER .WORD 0 ;(PAGE) PAGE COUNTER .WORD 0 ;(SIZELS) TOTAL # OF LINES READ IN ;(BYTECT) BYTE COUNT OF LINE .WORD 55. ;(SIZEBF) TOTAL # OF LINES PER PAGE ALLOWED .WORD 0 ;(CWDS) CONTROL WORD POINTER .BYTE 0 ;(XOFF) DISABLE TTY OUTPUT [^S] .BYTE 0 ;(IOCOMP) I/O COMPLETION ROUTINE FLAG .BYTE 0 ;(DDCMP) DDCMP MODE SWITCH .BYTE 0 ;(DFLAG) DDCMP COMPLETION FLAG .BYTE 0 ;(CTIME) MAXIMUM TIME INTERVAL BETWEEN CHARACTERS OR ; MESSAGES IN DDCMP MODE. .BYTE 0 ;(DDCMPS) DDCMP MESSAGE EXPECTED .WORD 0 ;(DDCMPE) DDCMP ERROR ROUTINE FOR HANDLING MESSAGES ; NOT RECEIVED IN A CERTAIN TIME FRAME. .WORD 0 ;(SWAP) SWAP BLOCKS FOR DISK SCRATCH AREA .WORD .CURR5 ;(CURREN) CURRENT LINE .WORD 0 ;(PP) PREVIOUS LINE POINTER IN BLOCK BUFFER .WORD 0 ;(CP) CURRENT LINE POINTER IN BLOCK BUFFER .WORD 0 ;(NUMBER) NUMBER OF LINES TO LIST/PRINT/DELETE/MOVE ;(LOADAD) LOAD ADDRESS DURING DDCMP OPERATIONS .WORD 0 ;(LOADPC) LOAD PC DURING DDCMP OPERATIONS .WORD DLVEC5 ;(DLVEC) DL VECTOR ADDRESS ON REMOTE .WORD 0 ;(WRIOT) READ/WRITE BUFFER ADDRESS .WORD 0 ;(CHAN) CURRENT ACTIVE CHANNEL NUMBER .BYTE 0 ;(TEMP) TEMP STORAGE (BYTE ONLY) .BYTE 0 ;(QUOTE) QUOTE CHARACTER USED IN CHANGE AND PASTE ;(RUNGET) GET=0, RUN#0 FOR LOADING PROGRAMS INTO ; THE REMOTE. .WORD 0 ;(TEMP1) TEMP STORAGE (WORD ONLY) ;(CKSUM) CHECKSUM FOR LOADING DDCMP PROGRAMS .WORD 0 ;(TEMP2) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP3) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP4) TEMP STORAGE (WORD ONLY) .WORD 0 ;($CHAN) CHANNEL NUMBER .WORD 0 ;($DBLK) DEVICE BLOCK ADDRESS .WORD 0 ;(FSIZE) FILE SIZE GIVEN BY USER .WORD 0 ;BUFFER ADDRESS IN .READC AND .WRITC .WORD 0 ;CO-ROUTINE ADDRESS .WORD 0 ;(CDONE) CHANGE DONE ON THIS LINE COUNTER ;(TEMP5) TEMPORARY STORAGE (WORD ONLY) .WORD 0 ;(PDONE) PASTE CHANGE(S) DONE ON THIS LINE COUNTER ENDM5: .WORD 0 ;(ENDM) END OF MEMORY .WORD 0 ;(ENDCM) END OF LAST COMMAND .WORD 0,0 ;(BASE) BASE ADDRESS OF DATA AREA .WORD 0 ;(DEV) DEFAULT DEVICE .BYTE 0 ;(GO) GO FLAG .BYTE 0 ;(SYNS) SYNCH CHARACTER DETECTED: 0 = NO SYNCH'S RECEIVED, ; <0 = 1 SYNCH CHARACTER RECEIVED, ; >0 = TWO OR MORE SYNCH'S RECEIVED. .BYTE 202 ;(SWITCH) BIT 0 = (1) NO INPUT FILE OPEN ;BIT 1 = (1) VERIFY SWITCH ON ;BIT 2 = (1) CLOSE SWITCH ON ;BIT 3 = (1) OUTPUT FILE HAS SOME OUTPUT ;BIT 4 = (1) LIST IN OPERATION ;BIT 5 = (1) INDIRECT COMMAND IN USE (@) ;BIT 6 = (1) CONTINUED LINE ;BIT 7 = (1) BLOCK MODE ON .BYTE 0 ;BIT 0 = (1) TOP OF FILE REQUESTED ;BIT 1 = (1) BOTTOM REQUEST FROM READ COMMAND ;BIT 2 = (1) FORM FEED FOUND ON TEXT ; INPUT. ;BIT 3 = (1) /L GIVEN IN FILE COMMAND ;BIT 4 = (1) SECONDARY FILE OPEN ;BIT 5 = (1) SECONDARY FILE SELECTED FOR INPUT ;BIT 6 = (1) OUTPUT ON SWITCH ;BIT 7 = (1) EXIT CURRENTLY UNDERWAY .WORD 0 ;(SW2) BIT 0 = (1) NP COMMAND REQUESTED ;BIT 1 = (1) PAGE REQUESTED ;BIT 2 = (1) READ/WRITE OPERATION UNDERWAY ;BIT 3 = (1) NUMERIC REQUESTED DURING ; COMMAND MODE PROCESSING. ;BIT 4 = (1) MACRO IN PROGRESS ;BIT 5 = (1) BLOCK MODE WAS ACTIVE BEFORE CLOSE ;BIT 6 = (1) PAGE-FIND(LOCATE) ACTIVE ;BIT 7 = (1) LC OR PASTE ACTIVE ;BIT 8 = (1) AP/TYPE ACTIVE ;BIT 9 = (1) NO LINES READ IN FOR THIS PAGE ;BIT10 = (1) IMMEDIATE MACRO IN PROGRESS ;BIT11 = (1) RUN STATUS ;BIT12 = (1) CHANGE/LC/PASTE/SEARCH CALLING "SCAN" ;BIT13 = (1) EOB DETECTED ;BIT14 = (1) MACRO ALLOWED TO BE RE-EXECUTED ; AFTER EOB DETECTED. ;BIT15 = (1) "SAVE" OR "FILE" UNDEWAY STACK5: .WORD 0 ;(STACK) STACK LOCATION FOR CURRENT USER .=.+120. ;STACK SPACE FOR USER .WORD 0 ;(ARG1) 1ST ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(ARG2) 2ND ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(OARG) OLD ARGUMENT USED IN DETECTING ; RECURSION IN PASTES AND LC'S. .BYTE 0 ;(MACDEF) MACRO DEFINITION FLAGS .BYTE 0 .BYTE 0 ;(DDCMPO) DDCMP OUTPUT MODE FLAG .BYTE 2 ;(MAXMAC) MAXIMUM # OF MACRO SLOTS AVAILABLE .WORD 0 ;(NARG) NUMERIC ARGUMENT FOR MACRO .WORD 0 ;(MACARG) MACRO REPEAT COUNTER .WORD 0 ;(CURMAC) CURRENT MACRO START ADDRESS .WORD 0 ;(OLDCWD) OLD CWDS POINTER .CURR5: .=.+LINELN+4 ;(.CURRN) CURRENT LINE .=.+LINELN+4 ;(CMD) COMMAND BUFFER .IF NDF NODUPS .=.+120. ;(TSBUF) TEMPORARY BUFFER FOR SEARCH COMMAND .ENDC ;.IF NDF NODUPS .=.+12 ;(FNAME) FILE NAME STORAGE .IF NDF NOMAC .=.+130. ;(MACBUF) MACRO STORAGE AREAS .=.+130. .ENDC ;.IF NDF NOMAC 0 ;(IBLKNM) INPUT BUFFER CURRENT BLOCK # 0 ;(INPTR) INPUT BUFFER POINTER 0 ;INPUT BUFFER EOF FLAG .+4+1000 ;INPUT BUFFER END ADDRESS .+2 ;INPUT BUFFER START ADDRESS .=.+1000+8. ;(INBUF) INPUT BUFFER (EXTRA 8 BYTES FOR DDCMP) ; 0 ;(OBLKNM) OUTPUT BUFFER CURRENT BLOCK # ;(BCNT) BUFFER COUNT DURING DDCMP INPUT 0 ;(OUTPTR) OUTPUT BUFFER POINTER ;(DDCMPI) BUFFER POINTER DURING DDCMP INPUT 0 ;OUTPUT BUFFER EOF FLAG ;(CRC) CRC VALUE DURING DDCMP INPUT .+4+1000 ;OUTPUT BUFFER END ADDRESS .+2 ;OUTPUT BUFFER START ADDRESS .=.+1000 ;(OUTBUF) OUTPUT BUFFER ; 0 ;(SBLKNM) SECONDARY BUFFER CURRENT BLOCK # 0 ;(SECPTR) SECONDARY BUFFER POINTER 0 ;SECONDARY BUFFER EOF FLAG INPTR+USER5+1010 ;SECONDARY BUFFER END ADDRESS INPTR+USER5+10 ;SECONDARY BUFFER START ADDRESS ; 0 ;(UBLKNM) SAVE/UNSAVE BUFFER CURRENT BLOCK # 0 ;(USVPTR) SAVE/UNSAVE BUFFER POINTER 0 ;SAVE/UNSAVE BUFFER EOF FLAG 0 ;SAVE/UNSAVE BUFFER END ADDRESS 0 ;SAVE/UNSAVE BUFFER START ADDRESS ; .RAD50 /SY/ ;(FLTMP) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(BAKFIL) SYSTEMS DEVICE .RAD50 / / ;FILE NAME (1ST HALF) .RAD50 / / ;FILE NAME (2ND HALF) .RAD50 /BAK/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(INFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(OUTFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SECFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SAVFIL) SYSTEMS DEVICE .RAD50 /SAV/ ;FILE NAME (1ST HALF) .RAD50 /E/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(TMPFIL) SYSTEMS DEVICE .RAD50 /EDI/ ;FILE NAME (1ST HALF) .RAD50 /T05/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /E05/ ;(SAVNAM) 2ND HALF OF SAVE FILE NAME ; .ASCII /[PAGE/ .BYTE 0,0,0,0,0,'],0 .ASCII /[/ .ASCIZ /00000 LINES READ IN]/ .EVEN ; .BYTE 0 ;(OVLYSW) OVERLAY FLAG: 0 => OVERLAY 1(REMED1), ; #0 => OVERLAY 2(REMED2). .BYTE 0 ;(RETRY) RETRY COUNT FOR ERROR RECOVERY .BYTE 24 ;(ICHAN) INPUT CHANNEL NUMBER .BYTE 25 ;(OCHAN) OUTPUT CHANNEL NUMBER .BYTE 26 ;(SCHAN) SECONDARY CHANNEL NUMBER .BYTE 27 ;(UCHAN) SAVE/UNSAVE CHANNEL NUMBER ;(RELBLK) RELATIVE BLK NBR DURING DDCMP PROGRAM LOADS .WORD 0 ;(ACHAN) ACTIVE CHANNEL NUMBER (LEFT BYTE FOR ; INPUT, RIGHT BYTE FOR OUTPUT). USP5: .WORD 0 ;(USP) USERS STACK POINTER .WORD 0 ;(ERR) I/O ERROR WORD .WORD CROUT5 ;(CROUT) I/O COROUTINE .BYTE 0 ;(NEEDIN) TTY NEED LINE FLAG .BYTE 0 ;(NEEDRM) TTY NEED OUTPUT BUFFER FLAG .WORD 0 ;(TTOCLO) TTY CONTROL O FLAG .WORD TT5BUF ;(TTYTAB) TTY INPUT BUFFER HEADER ADDRESS .WORD TT5OBF ;(TTOTAB) OUTPUT BUFFER HEADER ADDRESS .WORD 0 ;(TTILCT) INPUT BUFFER LINE COUNTER .WORD 0 ;(TTIPRE) TTY INPUT PREVIOUS CHARACTER .WORD TKS5 ;(TKS) TTY INPUT CSR REGISTER .WORD TPS5 ;(TPS) TTY OUTPUT CSR REGISTER .WORD TKB5 ;(TKB) TTY INPUT BUFFER REGISTER .WORD TPB5 ;(TPB) TTY OUTPUT BUFFER REGISTER .WORD TT5TBC ;(OUTCH) TTY TAB AND FILLER COUNTERS .BYTE 15 ;(FILLIT) TTY FILL CHARACTER .BYTE 0 ;(FILLCT) TTY FILL COUNT .WORD TTVEC5 ;(TTYVEC) TTY VECTOR ADDRESS .WORD TTYIN5 ;(TTYIN) TTY INPUT INTERRUPT ROUTINE .WORD TTYOT5 ;(TTYOUT) TTY OUTPUT INTERRUPT ROUTINE .IIF DF DIAL, .WORD 0 ;(TKSSAV) DL RECEIVER STATUS WORD SAVE ;MAKE SURE ALL AREAS ARE IDENTICAL (SIZE WISE) UP TO HERE T=.-USER5 .IIF NE T-E, .ERROR 1;IMPURE AREAS NOT IDENTICALLY ASSIGNED .WORD TT5BUF+6 ;TTY 1 INPUT BUFFER .WORD TT5BUF+6 TT5BUF: 0 .WORD TT5BUF+6 .WORD TT5BUF+TTINBF+6 .=.+TTINBF .WORD TT5OBF+6 ;TTY 1 OUTPUT BUFFER .WORD TT5OBF+6 TT5OBF: 0 .WORD TT5OBF+6 .WORD TT5OBF+TTOUBF+6 .=.+TTOUBF TT5TBC: 0,0,10 ;TAB AND FILLER COUNTER UX = .-USER5 .IIF NE UX-USIZE, .ERROR 1; IMPURE AREAS NOT IDENTICALLY ASSIGNED .ENDC ;.IF GT NUSERS-4 .IF GT NUSERS-5 .SBTTL IMPURE AREA (FOR USER #6) ; .GLOBL USER6,.CURR6,DLVEC6,ENDM6,STACK6,USP6 .GLOBL CROUT6,TKS6,TPS6,TKB6,TPB6,TTVEC6 .GLOBL TTYIN6,TTYOT6 ; USER6: .WORD 0 ;(QUIT) QUIT CONTROL VARIABLE .=.+12. ;(CWD) CONTROL WORD ARRAY .BYTE 15 ;CWD TERMINATOR .BYTE 33 ;(CATEN) CONCATENATION CHARACTER .WORD 0 ;(PAGE) PAGE COUNTER .WORD 0 ;(SIZELS) TOTAL # OF LINES READ IN ;(BYTECT) BYTE COUNT OF LINE .WORD 55. ;(SIZEBF) TOTAL # OF LINES PER PAGE ALLOWED .WORD 0 ;(CWDS) CONTROL WORD POINTER .BYTE 0 ;(XOFF) DISABLE TTY OUTPUT [^S] .BYTE 0 ;(IOCOMP) I/O COMPLETION ROUTINE FLAG .BYTE 0 ;(DDCMP) DDCMP MODE SWITCH .BYTE 0 ;(DFLAG) DDCMP COMPLETION FLAG .BYTE 0 ;(CTIME) MAXIMUM TIME INTERVAL BETWEEN CHARACTERS OR ; MESSAGES IN DDCMP MODE. .BYTE 0 ;(DDCMPS) DDCMP MESSAGE EXPECTED .WORD 0 ;(DDCMPE) DDCMP ERROR ROUTINE FOR HANDLING MESSAGES ; NOT RECEIVED IN A CERTAIN TIME FRAME. .WORD 0 ;(SWAP) SWAP BLOCKS FOR DISK SCRATCH AREA .WORD .CURR6 ;(CURREN) CURRENT LINE .WORD 0 ;(PP) PREVIOUS LINE POINTER IN BLOCK BUFFER .WORD 0 ;(CP) CURRENT LINE POINTER IN BLOCK BUFFER .WORD 0 ;(NUMBER) NUMBER OF LINES TO LIST/PRINT/DELETE/MOVE ;(LOADAD) LOAD ADDRESS DURING DDCMP OPERATIONS .WORD 0 ;(LOADPC) LOAD PC DURING DDCMP OPERATIONS .WORD DLVEC6 ;(DLVEC) DL VECTOR ADDRESS ON REMOTE .WORD 0 ;(WRIOT) READ/WRITE BUFFER ADDRESS .WORD 0 ;(CHAN) CURRENT ACTIVE CHANNEL NUMBER .BYTE 0 ;(TEMP) TEMP STORAGE (BYTE ONLY) .BYTE 0 ;(QUOTE) QUOTE CHARACTER USED IN CHANGE AND PASTE ;(RUNGET) GET=0, RUN#0 FOR LOADING PROGRAMS INTO ; THE REMOTE. .WORD 0 ;(TEMP1) TEMP STORAGE (WORD ONLY) ;(CKSUM) CHECKSUM FOR LOADING DDCMP PROGRAMS .WORD 0 ;(TEMP2) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP3) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP4) TEMP STORAGE (WORD ONLY) .WORD 0 ;($CHAN) CHANNEL NUMBER .WORD 0 ;($DBLK) DEVICE BLOCK ADDRESS .WORD 0 ;(FSIZE) FILE SIZE GIVEN BY USER .WORD 0 ;BUFFER ADDRESS IN .READC AND .WRITC .WORD 0 ;CO-ROUTINE ADDRESS .WORD 0 ;(CDONE) CHANGE DONE ON THIS LINE COUNTER ;(TEMP5) TEMPORARY STORAGE (WORD ONLY) .WORD 0 ;(PDONE) PASTE CHANGE(S) DONE ON THIS LINE COUNTER ENDM6: .WORD 0 ;(ENDM) END OF MEMORY .WORD 0 ;(ENDCM) END OF LAST COMMAND .WORD 0,0 ;(BASE) BASE ADDRESS OF DATA AREA .WORD 0 ;(DEV) DEFAULT DEVICE .BYTE 0 ;(GO) GO FLAG .BYTE 0 ;(SYNS) SYNCH CHARACTER DETECTED: 0 = NO SYNCH'S RECEIVED, ; <0 = 1 SYNCH CHARACTER RECEIVED, ; >0 = TWO OR MORE SYNCH'S RECEIVED. .BYTE 202 ;(SWITCH) BIT 0 = (1) NO INPUT FILE OPEN ;BIT 1 = (1) VERIFY SWITCH ON ;BIT 2 = (1) CLOSE SWITCH ON ;BIT 3 = (1) OUTPUT FILE HAS SOME OUTPUT ;BIT 4 = (1) LIST IN OPERATION ;BIT 5 = (1) INDIRECT COMMAND IN USE (@) ;BIT 6 = (1) CONTINUED LINE ;BIT 7 = (1) BLOCK MODE ON .BYTE 0 ;BIT 0 = (1) TOP OF FILE REQUESTED ;BIT 1 = (1) BOTTOM REQUEST FROM READ COMMAND ;BIT 2 = (1) FORM FEED FOUND ON TEXT ; INPUT. ;BIT 3 = (1) /L GIVEN IN FILE COMMAND ;BIT 4 = (1) SECONDARY FILE OPEN ;BIT 5 = (1) SECONDARY FILE SELECTED FOR INPUT ;BIT 6 = (1) OUTPUT ON SWITCH ;BIT 7 = (1) EXIT CURRENTLY UNDERWAY .WORD 0 ;(SW2) BIT 0 = (1) NP COMMAND REQUESTED ;BIT 1 = (1) PAGE REQUESTED ;BIT 2 = (1) READ/WRITE OPERATION UNDERWAY ;BIT 3 = (1) NUMERIC REQUESTED DURING ; COMMAND MODE PROCESSING. ;BIT 4 = (1) MACRO IN PROGRESS ;BIT 5 = (1) BLOCK MODE WAS ACTIVE BEFORE CLOSE ;BIT 6 = (1) PAGE-FIND(LOCATE) ACTIVE ;BIT 7 = (1) LC OR PASTE ACTIVE ;BIT 8 = (1) AP/TYPE ACTIVE ;BIT 9 = (1) NO LINES READ IN FOR THIS PAGE ;BIT10 = (1) IMMEDIATE MACRO IN PROGRESS ;BIT11 = (1) RUN STATUS ;BIT12 = (1) CHANGE/LC/PASTE/SEARCH CALLING "SCAN" ;BIT13 = (1) EOB DETECTED ;BIT14 = (1) MACRO ALLOWED TO BE RE-EXECUTED ; AFTER EOB DETECTED. ;BIT15 = (1) "SAVE" OR "FILE" UNDEWAY STACK6: .WORD 0 ;(STACK) STACK LOCATION FOR CURRENT USER .=.+120. ;STACK SPACE FOR USER .WORD 0 ;(ARG1) 1ST ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(ARG2) 2ND ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(OARG) OLD ARGUMENT USED IN DETECTING ; RECURSION IN PASTES AND LC'S. .BYTE 0 ;(MACDEF) MACRO DEFINITION FLAGS .BYTE 0 .BYTE 0 ;(DDCMPO) DDCMP OUTPUT MODE FLAG .BYTE 2 ;(MAXMAC) MAXIMUM # OF MACRO SLOTS AVAILABLE .WORD 0 ;(NARG) NUMERIC ARGUMENT FOR MACRO .WORD 0 ;(MACARG) MACRO REPEAT COUNTER .WORD 0 ;(CURMAC) CURRENT MACRO START ADDRESS .WORD 0 ;(OLDCWD) OLD CWDS POINTER .CURR6: .=.+LINELN+4 ;(.CURRN) CURRENT LINE .=.+LINELN+4 ;(CMD) COMMAND BUFFER .IF NDF NODUPS .=.+120. ;(TSBUF) TEMPORARY BUFFER FOR SEARCH COMMAND .ENDC ;.IF NDF NODUPS .=.+12 ;(FNAME) FILE NAME STORAGE .IF NDF NOMAC .=.+130. ;(MACBUF) MACRO STORAGE AREAS .=.+130. .ENDC ;.IF NDF NOMAC 0 ;(IBLKNM) INPUT BUFFER CURRENT BLOCK # 0 ;(INPTR) INPUT BUFFER POINTER 0 ;INPUT BUFFER EOF FLAG .+4+1000 ;INPUT BUFFER END ADDRESS .+2 ;INPUT BUFFER START ADDRESS .=.+1000+8. ;(INBUF) INPUT BUFFER (EXTRA 8 BYTES FOR DDCMP) ; 0 ;(OBLKNM) OUTPUT BUFFER CURRENT BLOCK # ;(BCNT) BUFFER COUNT DURING DDCMP INPUT 0 ;(OUTPTR) OUTPUT BUFFER POINTER ;(DDCMPI) BUFFER POINTER DURING DDCMP INPUT 0 ;OUTPUT BUFFER EOF FLAG ;(CRC) CRC VALUE DURING DDCMP INPUT .+4+1000 ;OUTPUT BUFFER END ADDRESS .+2 ;OUTPUT BUFFER START ADDRESS .=.+1000 ;(OUTBUF) OUTPUT BUFFER ; 0 ;(SBLKNM) SECONDARY BUFFER CURRENT BLOCK # 0 ;(SECPTR) SECONDARY BUFFER POINTER 0 ;SECONDARY BUFFER EOF FLAG INPTR+USER6+1010 ;SECONDARY BUFFER END ADDRESS INPTR+USER6+10 ;SECONDARY BUFFER START ADDRESS ; 0 ;(UBLKNM) SAVE/UNSAVE BUFFER CURRENT BLOCK # 0 ;(USVPTR) SAVE/UNSAVE BUFFER POINTER 0 ;SAVE/UNSAVE BUFFER EOF FLAG 0 ;SAVE/UNSAVE BUFFER END ADDRESS 0 ;SAVE/UNSAVE BUFFER START ADDRESS ; .RAD50 /SY/ ;(FLTMP) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(BAKFIL) SYSTEMS DEVICE .RAD50 / / ;FILE NAME (1ST HALF) .RAD50 / / ;FILE NAME (2ND HALF) .RAD50 /BAK/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(INFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(OUTFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SECFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SAVFIL) SYSTEMS DEVICE .RAD50 /SAV/ ;FILE NAME (1ST HALF) .RAD50 /E/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(TMPFIL) SYSTEMS DEVICE .RAD50 /EDI/ ;FILE NAME (1ST HALF) .RAD50 /T06/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /E06/ ;(SAVNAM) 2ND HALF OF SAVE FILE NAME ; .ASCII /[PAGE/ .BYTE 0,0,0,0,0,'],0 .ASCII /[/ .ASCIZ /00000 LINES READ IN]/ .EVEN ; .BYTE 0 ;(OVLYSW) OVERLAY FLAG: 0 => OVERLAY 1(REMED1), ; #0 => OVERLAY 2(REMED2). .BYTE 0 ;(RETRY) RETRY COUNT FOR ERROR RECOVERY .BYTE 30 ;(ICHAN) INPUT CHANNEL NUMBER .BYTE 31 ;(OCHAN) OUTPUT CHANNEL NUMBER .BYTE 32 ;(SCHAN) SECONDARY CHANNEL NUMBER .BYTE 33 ;(UCHAN) SAVE/UNSAVE CHANNEL NUMBER ;(RELBLK) RELATIVE BLK NBR DURING DDCMP PROGRAM LOADS .WORD 0 ;(ACHAN) ACTIVE CHANNEL NUMBER (LEFT BYTE FOR ; INPUT, RIGHT BYTE FOR OUTPUT). USP6: .WORD 0 ;(USP) USERS STACK POINTER .WORD 0 ;(ERR) I/O ERROR WORD .WORD CROUT6 ;(CROUT) I/O COROUTINE .BYTE 0 ;(NEEDIN) TTY NEED LINE FLAG .BYTE 0 ;(NEEDRM) TTY NEED OUTPUT BUFFER FLAG .WORD 0 ;(TTOCLO) TTY CONTROL O FLAG .WORD TT6BUF ;(TTYTAB) TTY INPUT BUFFER HEADER ADDRESS .WORD TT6OBF ;(TTOTAB) OUTPUT BUFFER HEADER ADDRESS .WORD 0 ;(TTILCT) INPUT BUFFER LINE COUNTER .WORD 0 ;(TTIPRE) TTY INPUT PREVIOUS CHARACTER .WORD TKS6 ;(TKS) TTY INPUT CSR REGISTER .WORD TPS6 ;(TPS) TTY OUTPUT CSR REGISTER .WORD TKB6 ;(TKB) TTY INPUT BUFFER REGISTER .WORD TPB6 ;(TPB) TTY OUTPUT BUFFER REGISTER .WORD TT6TBC ;(OUTCH) TTY TAB AND FILLER COUNTERS .BYTE 15 ;(FILLIT) TTY FILL CHARACTER .BYTE 0 ;(FILLCT) TTY FILL COUNT .WORD TTVEC6 ;(TTYVEC) TTY VECTOR ADDRESS .WORD TTYIN6 ;(TTYIN) TTY INPUT INTERRUPT ROUTINE .WORD TTYOT6 ;(TTYOUT) TTY OUTPUT INTERRUPT ROUTINE .IIF DF DIAL, .WORD 0 ;(TKSSAV) DL RECEIVER STATUS WORD SAVE ;MAKE SURE ALL AREAS ARE IDENTICAL (SIZE WISE) UP TO HERE T=.-USER6 .IIF NE T-E, .ERROR 1;IMPURE AREAS NOT IDENTICALLY ASSIGNED .WORD TT6BUF+6 ;TTY 1 INPUT BUFFER .WORD TT6BUF+6 TT6BUF: 0 .WORD TT6BUF+6 .WORD TT6BUF+TTINBF+6 .=.+TTINBF .WORD TT6OBF+6 ;TTY 1 OUTPUT BUFFER .WORD TT6OBF+6 TT6OBF: 0 .WORD TT6OBF+6 .WORD TT6OBF+TTOUBF+6 .=.+TTOUBF TT6TBC: 0,0,10 ;TAB AND FILLER COUNTER UX = .-USER6 .IIF NE UX-USIZE, .ERROR 1; IMPURE AREAS NOT IDENTICALLY ASSIGNED .ENDC ;.IF GT NUSERS-5 .IF GT NUSERS-6 .SBTTL IMPURE AREA (FOR USER #7) ; .GLOBL USER7,.CURR7,DLVEC7,ENDM7,STACK7,USP7 .GLOBL CROUT7,TKS7,TPS7,TKB7,TPB7,TTVEC7 .GLOBL TTYIN7,TTYOT7 ; USER7: .WORD 0 ;(QUIT) QUIT CONTROL VARIABLE .=.+12. ;(CWD) CONTROL WORD ARRAY .BYTE 15 ;CWD TERMINATOR .BYTE 33 ;(CATEN) CONCATENATION CHARACTER .WORD 0 ;(PAGE) PAGE COUNTER .WORD 0 ;(SIZELS) TOTAL # OF LINES READ IN ;(BYTECT) BYTE COUNT OF LINE .WORD 55. ;(SIZEBF) TOTAL # OF LINES PER PAGE ALLOWED .WORD 0 ;(CWDS) CONTROL WORD POINTER .BYTE 0 ;(XOFF) DISABLE TTY OUTPUT [^S] .BYTE 0 ;(IOCOMP) I/O COMPLETION ROUTINE FLAG .BYTE 0 ;(DDCMP) DDCMP MODE SWITCH .BYTE 0 ;(DFLAG) DDCMP COMPLETION FLAG .BYTE 0 ;(CTIME) MAXIMUM TIME INTERVAL BETWEEN CHARACTERS OR ; MESSAGES IN DDCMP MODE. .BYTE 0 ;(DDCMPS) DDCMP MESSAGE EXPECTED .WORD 0 ;(DDCMPE) DDCMP ERROR ROUTINE FOR HANDLING MESSAGES ; NOT RECEIVED IN A CERTAIN TIME FRAME. .WORD 0 ;(SWAP) SWAP BLOCKS FOR DISK SCRATCH AREA .WORD .CURR7 ;(CURREN) CURRENT LINE .WORD 0 ;(PP) PREVIOUS LINE POINTER IN BLOCK BUFFER .WORD 0 ;(CP) CURRENT LINE POINTER IN BLOCK BUFFER .WORD 0 ;(NUMBER) NUMBER OF LINES TO LIST/PRINT/DELETE/MOVE ;(LOADAD) LOAD ADDRESS DURING DDCMP OPERATIONS .WORD 0 ;(LOADPC) LOAD PC DURING DDCMP OPERATIONS .WORD DLVEC7 ;(DLVEC) DL VECTOR ADDRESS ON REMOTE .WORD 0 ;(WRIOT) READ/WRITE BUFFER ADDRESS .WORD 0 ;(CHAN) CURRENT ACTIVE CHANNEL NUMBER .BYTE 0 ;(TEMP) TEMP STORAGE (BYTE ONLY) .BYTE 0 ;(QUOTE) QUOTE CHARACTER USED IN CHANGE AND PASTE ;(RUNGET) GET=0, RUN#0 FOR LOADING PROGRAMS INTO ; THE REMOTE. .WORD 0 ;(TEMP1) TEMP STORAGE (WORD ONLY) ;(CKSUM) CHECKSUM FOR LOADING DDCMP PROGRAMS .WORD 0 ;(TEMP2) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP3) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP4) TEMP STORAGE (WORD ONLY) .WORD 0 ;($CHAN) CHANNEL NUMBER .WORD 0 ;($DBLK) DEVICE BLOCK ADDRESS .WORD 0 ;(FSIZE) FILE SIZE GIVEN BY USER .WORD 0 ;BUFFER ADDRESS IN .READC AND .WRITC .WORD 0 ;CO-ROUTINE ADDRESS .WORD 0 ;(CDONE) CHANGE DONE ON THIS LINE COUNTER ;(TEMP5) TEMPORARY STORAGE (WORD ONLY) .WORD 0 ;(PDONE) PASTE CHANGE(S) DONE ON THIS LINE COUNTER ENDM7: .WORD 0 ;(ENDM) END OF MEMORY .WORD 0 ;(ENDCM) END OF LAST COMMAND .WORD 0,0 ;(BASE) BASE ADDRESS OF DATA AREA .WORD 0 ;(DEV) DEFAULT DEVICE .BYTE 0 ;(GO) GO FLAG .BYTE 0 ;(SYNS) SYNCH CHARACTER DETECTED: 0 = NO SYNCH'S RECEIVED, ; <0 = 1 SYNCH CHARACTER RECEIVED, ; >0 = TWO OR MORE SYNCH'S RECEIVED. .BYTE 202 ;(SWITCH) BIT 0 = (1) NO INPUT FILE OPEN ;BIT 1 = (1) VERIFY SWITCH ON ;BIT 2 = (1) CLOSE SWITCH ON ;BIT 3 = (1) OUTPUT FILE HAS SOME OUTPUT ;BIT 4 = (1) LIST IN OPERATION ;BIT 5 = (1) INDIRECT COMMAND IN USE (@) ;BIT 6 = (1) CONTINUED LINE ;BIT 7 = (1) BLOCK MODE ON .BYTE 0 ;BIT 0 = (1) TOP OF FILE REQUESTED ;BIT 1 = (1) BOTTOM REQUEST FROM READ COMMAND ;BIT 2 = (1) FORM FEED FOUND ON TEXT ; INPUT. ;BIT 3 = (1) /L GIVEN IN FILE COMMAND ;BIT 4 = (1) SECONDARY FILE OPEN ;BIT 5 = (1) SECONDARY FILE SELECTED FOR INPUT ;BIT 6 = (1) OUTPUT ON SWITCH ;BIT 7 = (1) EXIT CURRENTLY UNDERWAY .WORD 0 ;(SW2) BIT 0 = (1) NP COMMAND REQUESTED ;BIT 1 = (1) PAGE REQUESTED ;BIT 2 = (1) READ/WRITE OPERATION UNDERWAY ;BIT 3 = (1) NUMERIC REQUESTED DURING ; COMMAND MODE PROCESSING. ;BIT 4 = (1) MACRO IN PROGRESS ;BIT 5 = (1) BLOCK MODE WAS ACTIVE BEFORE CLOSE ;BIT 6 = (1) PAGE-FIND(LOCATE) ACTIVE ;BIT 7 = (1) LC OR PASTE ACTIVE ;BIT 8 = (1) AP/TYPE ACTIVE ;BIT 9 = (1) NO LINES READ IN FOR THIS PAGE ;BIT10 = (1) IMMEDIATE MACRO IN PROGRESS ;BIT11 = (1) RUN STATUS ;BIT12 = (1) CHANGE/LC/PASTE/SEARCH CALLING "SCAN" ;BIT13 = (1) EOB DETECTED ;BIT14 = (1) MACRO ALLOWED TO BE RE-EXECUTED ; AFTER EOB DETECTED. ;BIT15 = (1) "SAVE" OR "FILE" UNDEWAY STACK7: .WORD 0 ;(STACK) STACK LOCATION FOR CURRENT USER .=.+120. ;STACK SPACE FOR USER .WORD 0 ;(ARG1) 1ST ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(ARG2) 2ND ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(OARG) OLD ARGUMENT USED IN DETECTING ; RECURSION IN PASTES AND LC'S. .BYTE 0 ;(MACDEF) MACRO DEFINITION FLAGS .BYTE 0 .BYTE 0 ;(DDCMPO) DDCMP OUTPUT MODE FLAG .BYTE 2 ;(MAXMAC) MAXIMUM # OF MACRO SLOTS AVAILABLE .WORD 0 ;(NARG) NUMERIC ARGUMENT FOR MACRO .WORD 0 ;(MACARG) MACRO REPEAT COUNTER .WORD 0 ;(CURMAC) CURRENT MACRO START ADDRESS .WORD 0 ;(OLDCWD) OLD CWDS POINTER .CURR7: .=.+LINELN+4 ;(.CURRN) CURRENT LINE .=.+LINELN+4 ;(CMD) COMMAND BUFFER .IF NDF NODUPS .=.+120. ;(TSBUF) TEMPORARY BUFFER FOR SEARCH COMMAND .ENDC ;.IF NDF NODUPS .=.+12 ;(FNAME) FILE NAME STORAGE .IF NDF NOMAC .=.+130. ;(MACBUF) MACRO STORAGE AREAS .=.+130. .ENDC ;.IF NDF NOMAC 0 ;(IBLKNM) INPUT BUFFER CURRENT BLOCK # 0 ;(INPTR) INPUT BUFFER POINTER 0 ;INPUT BUFFER EOF FLAG .+4+1000 ;INPUT BUFFER END ADDRESS .+2 ;INPUT BUFFER START ADDRESS .=.+1000+8. ;(INBUF) INPUT BUFFER (EXTRA 8 BYTES FOR DDCMP) ; 0 ;(OBLKNM) OUTPUT BUFFER CURRENT BLOCK # ;(BCNT) BUFFER COUNT DURING DDCMP INPUT 0 ;(OUTPTR) OUTPUT BUFFER POINTER ;(DDCMPI) BUFFER POINTER DURING DDCMP INPUT 0 ;OUTPUT BUFFER EOF FLAG ;(CRC) CRC VALUE DURING DDCMP INPUT .+4+1000 ;OUTPUT BUFFER END ADDRESS .+2 ;OUTPUT BUFFER START ADDRESS .=.+1000 ;(OUTBUF) OUTPUT BUFFER ; 0 ;(SBLKNM) SECONDARY BUFFER CURRENT BLOCK # 0 ;(SECPTR) SECONDARY BUFFER POINTER 0 ;SECONDARY BUFFER EOF FLAG INPTR+USER7+1010 ;SECONDARY BUFFER END ADDRESS INPTR+USER7+10 ;SECONDARY BUFFER START ADDRESS ; 0 ;(UBLKNM) SAVE/UNSAVE BUFFER CURRENT BLOCK # 0 ;(USVPTR) SAVE/UNSAVE BUFFER POINTER 0 ;SAVE/UNSAVE BUFFER EOF FLAG 0 ;SAVE/UNSAVE BUFFER END ADDRESS 0 ;SAVE/UNSAVE BUFFER START ADDRESS ; .RAD50 /SY/ ;(FLTMP) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(BAKFIL) SYSTEMS DEVICE .RAD50 / / ;FILE NAME (1ST HALF) .RAD50 / / ;FILE NAME (2ND HALF) .RAD50 /BAK/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(INFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(OUTFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SECFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SAVFIL) SYSTEMS DEVICE .RAD50 /SAV/ ;FILE NAME (1ST HALF) .RAD50 /E/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(TMPFIL) SYSTEMS DEVICE .RAD50 /EDI/ ;FILE NAME (1ST HALF) .RAD50 /T07/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /E07/ ;(SAVNAM) 2ND HALF OF SAVE FILE NAME ; .ASCII /[PAGE/ .BYTE 0,0,0,0,0,'],0 .ASCII /[/ .ASCIZ /00000 LINES READ IN]/ .EVEN ; .BYTE 0 ;(OVLYSW) OVERLAY FLAG: 0 => OVERLAY 1(REMED1), ; #0 => OVERLAY 2(REMED2). .BYTE 0 ;(RETRY) RETRY COUNT FOR ERROR RECOVERY .BYTE 34 ;(ICHAN) INPUT CHANNEL NUMBER .BYTE 35 ;(OCHAN) OUTPUT CHANNEL NUMBER .BYTE 36 ;(SCHAN) SECONDARY CHANNEL NUMBER .BYTE 37 ;(UCHAN) SAVE/UNSAVE CHANNEL NUMBER ;(RELBLK) RELATIVE BLK NBR DURING DDCMP PROGRAM LOADS .WORD 0 ;(ACHAN) ACTIVE CHANNEL NUMBER (LEFT BYTE FOR ; INPUT, RIGHT BYTE FOR OUTPUT). USP7: .WORD 0 ;(USP) USERS STACK POINTER .WORD 0 ;(ERR) I/O ERROR WORD .WORD CROUT7 ;(CROUT) I/O COROUTINE .BYTE 0 ;(NEEDIN) TTY NEED LINE FLAG .BYTE 0 ;(NEEDRM) TTY NEED OUTPUT BUFFER FLAG .WORD 0 ;(TTOCLO) TTY CONTROL O FLAG .WORD TT7BUF ;(TTYTAB) TTY INPUT BUFFER HEADER ADDRESS .WORD TT7OBF ;(TTOTAB) OUTPUT BUFFER HEADER ADDRESS .WORD 0 ;(TTILCT) INPUT BUFFER LINE COUNTER .WORD 0 ;(TTIPRE) TTY INPUT PREVIOUS CHARACTER .WORD TKS7 ;(TKS) TTY INPUT CSR REGISTER .WORD TPS7 ;(TPS) TTY OUTPUT CSR REGISTER .WORD TKB7 ;(TKB) TTY INPUT BUFFER REGISTER .WORD TPB7 ;(TPB) TTY OUTPUT BUFFER REGISTER .WORD TT7TBC ;(OUTCH) TTY TAB AND FILLER COUNTERS .BYTE 15 ;(FILLIT) TTY FILL CHARACTER .BYTE 0 ;(FILLCT) TTY FILL COUNT .WORD TTVEC7 ;(TTYVEC) TTY VECTOR ADDRESS .WORD TTYIN7 ;(TTYIN) TTY INPUT INTERRUPT ROUTINE .WORD TTYOT7 ;(TTYOUT) TTY OUTPUT INTERRUPT ROUTINE .IIF DF DIAL, .WORD 0 ;(TKSSAV) DL RECEIVER STATUS WORD SAVE ;MAKE SURE ALL AREAS ARE IDENTICAL (SIZE WISE) UP TO HERE T=.-USER7 .IIF NE T-E, .ERROR 1;IMPURE AREAS NOT IDENTICALLY ASSIGNED .WORD TT7BUF+6 ;TTY 1 INPUT BUFFER .WORD TT7BUF+6 TT7BUF: 0 .WORD TT7BUF+6 .WORD TT7BUF+TTINBF+6 .=.+TTINBF .WORD TT7OBF+6 ;TTY 1 OUTPUT BUFFER .WORD TT7OBF+6 TT7OBF: 0 .WORD TT7OBF+6 .WORD TT7OBF+TTOUBF+6 .=.+TTOUBF TT7TBC: 0,0,10 ;TAB AND FILLER COUNTER UX = .-USER7 .IIF NE UX-USIZE, .ERROR 1; IMPURE AREAS NOT IDENTICALLY ASSIGNED .ENDC ;.IF GT NUSERS-6 .IF GT NUSERS-7 .SBTTL IMPURE AREA (FOR USER #8) ; .GLOBL USER8,.CURR8,DLVEC8,ENDM8,STACK8,USP8 .GLOBL CROUT8,TKS8,TPS8,TKB8,TPB8,TTVEC8 .GLOBL TTYIN8,TTYOT8 ; USER8: .WORD 0 ;(QUIT) QUIT CONTROL VARIABLE .=.+12. ;(CWD) CONTROL WORD ARRAY .BYTE 15 ;CWD TERMINATOR .BYTE 33 ;(CATEN) CONCATENATION CHARACTER .WORD 0 ;(PAGE) PAGE COUNTER .WORD 0 ;(SIZELS) TOTAL # OF LINES READ IN ;(BYTECT) BYTE COUNT OF LINE .WORD 55. ;(SIZEBF) TOTAL # OF LINES PER PAGE ALLOWED .WORD 0 ;(CWDS) CONTROL WORD POINTER .BYTE 0 ;(XOFF) DISABLE TTY OUTPUT [^S] .BYTE 0 ;(IOCOMP) I/O COMPLETION ROUTINE FLAG .BYTE 0 ;(DDCMP) DDCMP MODE SWITCH .BYTE 0 ;(DFLAG) DDCMP COMPLETION FLAG .BYTE 0 ;(CTIME) MAXIMUM TIME INTERVAL BETWEEN CHARACTERS OR ; MESSAGES IN DDCMP MODE. .BYTE 0 ;(DDCMPS) DDCMP MESSAGE EXPECTED .WORD 0 ;(DDCMPE) DDCMP ERROR ROUTINE FOR HANDLING MESSAGES ; NOT RECEIVED IN A CERTAIN TIME FRAME. .WORD 0 ;(SWAP) SWAP BLOCKS FOR DISK SCRATCH AREA .WORD .CURR8 ;(CURREN) CURRENT LINE .WORD 0 ;(PP) PREVIOUS LINE POINTER IN BLOCK BUFFER .WORD 0 ;(CP) CURRENT LINE POINTER IN BLOCK BUFFER .WORD 0 ;(NUMBER) NUMBER OF LINES TO LIST/PRINT/DELETE/MOVE ;(LOADAD) LOAD ADDRESS DURING DDCMP OPERATIONS .WORD 0 ;(LOADPC) LOAD PC DURING DDCMP OPERATIONS .WORD DLVEC8 ;(DLVEC) DL VECTOR ADDRESS ON REMOTE .WORD 0 ;(WRIOT) READ/WRITE BUFFER ADDRESS .WORD 0 ;(CHAN) CURRENT ACTIVE CHANNEL NUMBER .BYTE 0 ;(TEMP) TEMP STORAGE (BYTE ONLY) .BYTE 0 ;(QUOTE) QUOTE CHARACTER USED IN CHANGE AND PASTE ;(RUNGET) GET=0, RUN#0 FOR LOADING PROGRAMS INTO ; THE REMOTE. .WORD 0 ;(TEMP1) TEMP STORAGE (WORD ONLY) ;(CKSUM) CHECKSUM FOR LOADING DDCMP PROGRAMS .WORD 0 ;(TEMP2) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP3) TEMP STORAGE (WORD ONLY) .WORD 0 ;(TEMP4) TEMP STORAGE (WORD ONLY) .WORD 0 ;($CHAN) CHANNEL NUMBER .WORD 0 ;($DBLK) DEVICE BLOCK ADDRESS .WORD 0 ;(FSIZE) FILE SIZE GIVEN BY USER .WORD 0 ;BUFFER ADDRESS IN .READC AND .WRITC .WORD 0 ;CO-ROUTINE ADDRESS .WORD 0 ;(CDONE) CHANGE DONE ON THIS LINE COUNTER ;(TEMP5) TEMPORARY STORAGE (WORD ONLY) .WORD 0 ;(PDONE) PASTE CHANGE(S) DONE ON THIS LINE COUNTER ENDM8: .WORD 0 ;(ENDM) END OF MEMORY .WORD 0 ;(ENDCM) END OF LAST COMMAND .WORD 0,0 ;(BASE) BASE ADDRESS OF DATA AREA .WORD 0 ;(DEV) DEFAULT DEVICE .BYTE 0 ;(GO) GO FLAG .BYTE 0 ;(SYNS) SYNCH CHARACTER DETECTED: 0 = NO SYNCH'S RECEIVED, ; <0 = 1 SYNCH CHARACTER RECEIVED, ; >0 = TWO OR MORE SYNCH'S RECEIVED. .BYTE 202 ;(SWITCH) BIT 0 = (1) NO INPUT FILE OPEN ;BIT 1 = (1) VERIFY SWITCH ON ;BIT 2 = (1) CLOSE SWITCH ON ;BIT 3 = (1) OUTPUT FILE HAS SOME OUTPUT ;BIT 4 = (1) LIST IN OPERATION ;BIT 5 = (1) INDIRECT COMMAND IN USE (@) ;BIT 6 = (1) CONTINUED LINE ;BIT 7 = (1) BLOCK MODE ON .BYTE 0 ;BIT 0 = (1) TOP OF FILE REQUESTED ;BIT 1 = (1) BOTTOM REQUEST FROM READ COMMAND ;BIT 2 = (1) FORM FEED FOUND ON TEXT ; INPUT. ;BIT 3 = (1) /L GIVEN IN FILE COMMAND ;BIT 4 = (1) SECONDARY FILE OPEN ;BIT 5 = (1) SECONDARY FILE SELECTED FOR INPUT ;BIT 6 = (1) OUTPUT ON SWITCH ;BIT 7 = (1) EXIT CURRENTLY UNDERWAY .WORD 0 ;(SW2) BIT 0 = (1) NP COMMAND REQUESTED ;BIT 1 = (1) PAGE REQUESTED ;BIT 2 = (1) READ/WRITE OPERATION UNDERWAY ;BIT 3 = (1) NUMERIC REQUESTED DURING ; COMMAND MODE PROCESSING. ;BIT 4 = (1) MACRO IN PROGRESS ;BIT 5 = (1) BLOCK MODE WAS ACTIVE BEFORE CLOSE ;BIT 6 = (1) PAGE-FIND(LOCATE) ACTIVE ;BIT 7 = (1) LC OR PASTE ACTIVE ;BIT 8 = (1) AP/TYPE ACTIVE ;BIT 9 = (1) NO LINES READ IN FOR THIS PAGE ;BIT10 = (1) IMMEDIATE MACRO IN PROGRESS ;BIT11 = (1) RUN STATUS ;BIT12 = (1) CHANGE/LC/PASTE/SEARCH CALLING "SCAN" ;BIT13 = (1) EOB DETECTED ;BIT14 = (1) MACRO ALLOWED TO BE RE-EXECUTED ; AFTER EOB DETECTED. ;BIT15 = (1) "SAVE" OR "FILE" UNDEWAY STACK8: .WORD 0 ;(STACK) STACK LOCATION FOR CURRENT USER .=.+120. ;STACK SPACE FOR USER .WORD 0 ;(ARG1) 1ST ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(ARG2) 2ND ARGUMENT FOR SCAN ROUTINE .WORD 0 ;(OARG) OLD ARGUMENT USED IN DETECTING ; RECURSION IN PASTES AND LC'S. .BYTE 0 ;(MACDEF) MACRO DEFINITION FLAGS .BYTE 0 .BYTE 0 ;(DDCMPO) DDCMP OUTPUT MODE FLAG .BYTE 2 ;(MAXMAC) MAXIMUM # OF MACRO SLOTS AVAILABLE .WORD 0 ;(NARG) NUMERIC ARGUMENT FOR MACRO .WORD 0 ;(MACARG) MACRO REPEAT COUNTER .WORD 0 ;(CURMAC) CURRENT MACRO START ADDRESS .WORD 0 ;(OLDCWD) OLD CWDS POINTER .CURR8: .=.+LINELN+4 ;(.CURRN) CURRENT LINE .=.+LINELN+4 ;(CMD) COMMAND BUFFER .IF NDF NODUPS .=.+120. ;(TSBUF) TEMPORARY BUFFER FOR SEARCH COMMAND .ENDC ;.IF NDF NODUPS .=.+12 ;(FNAME) FILE NAME STORAGE .IF NDF NOMAC .=.+130. ;(MACBUF) MACRO STORAGE AREAS .=.+130. .ENDC ;.IF NDF NOMAC 0 ;(IBLKNM) INPUT BUFFER CURRENT BLOCK # 0 ;(INPTR) INPUT BUFFER POINTER 0 ;INPUT BUFFER EOF FLAG .+4+1000 ;INPUT BUFFER END ADDRESS .+2 ;INPUT BUFFER START ADDRESS .=.+1000+8. ;(INBUF) INPUT BUFFER (EXTRA 8 BYTES FOR DDCMP) ; 0 ;(OBLKNM) OUTPUT BUFFER CURRENT BLOCK # ;(BCNT) BUFFER COUNT DURING DDCMP INPUT 0 ;(OUTPTR) OUTPUT BUFFER POINTER ;(DDCMPI) BUFFER POINTER DURING DDCMP INPUT 0 ;OUTPUT BUFFER EOF FLAG ;(CRC) CRC VALUE DURING DDCMP INPUT .+4+1000 ;OUTPUT BUFFER END ADDRESS .+2 ;OUTPUT BUFFER START ADDRESS .=.+1000 ;(OUTBUF) OUTPUT BUFFER ; 0 ;(SBLKNM) SECONDARY BUFFER CURRENT BLOCK # 0 ;(SECPTR) SECONDARY BUFFER POINTER 0 ;SECONDARY BUFFER EOF FLAG INPTR+USER8+1010 ;SECONDARY BUFFER END ADDRESS INPTR+USER8+10 ;SECONDARY BUFFER START ADDRESS ; 0 ;(UBLKNM) SAVE/UNSAVE BUFFER CURRENT BLOCK # 0 ;(USVPTR) SAVE/UNSAVE BUFFER POINTER 0 ;SAVE/UNSAVE BUFFER EOF FLAG 0 ;SAVE/UNSAVE BUFFER END ADDRESS 0 ;SAVE/UNSAVE BUFFER START ADDRESS ; .RAD50 /SY/ ;(FLTMP) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(BAKFIL) SYSTEMS DEVICE .RAD50 / / ;FILE NAME (1ST HALF) .RAD50 / / ;FILE NAME (2ND HALF) .RAD50 /BAK/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(INFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(OUTFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SECFIL) SYSTEMS DEVICE 000000 ;FILE NAME (1ST HALF) 000000 ;FILE NAME (2ND HALF) 000000 ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(SAVFIL) SYSTEMS DEVICE .RAD50 /SAV/ ;FILE NAME (1ST HALF) .RAD50 /E/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /SY/ ;(TMPFIL) SYSTEMS DEVICE .RAD50 /EDI/ ;FILE NAME (1ST HALF) .RAD50 /T08/ ;FILE NAME (2ND HALF) .RAD50 /TMP/ ;FILE NAME EXTENSION ; .RAD50 /E08/ ;(SAVNAM) 2ND HALF OF SAVE FILE NAME ; .ASCII /[PAGE/ .BYTE 0,0,0,0,0,'],0 .ASCII /[/ .ASCIZ /00000 LINES READ IN]/ .EVEN ; .BYTE 0 ;(OVLYSW) OVERLAY FLAG: 0 => OVERLAY 1(REMED1), ; #0 => OVERLAY 2(REMED2). .BYTE 0 ;(RETRY) RETRY COUNT FOR ERROR RECOVERY .BYTE 40 ;(ICHAN) INPUT CHANNEL NUMBER .BYTE 41 ;(OCHAN) OUTPUT CHANNEL NUMBER .BYTE 42 ;(SCHAN) SECONDARY CHANNEL NUMBER .BYTE 43 ;(UCHAN) SAVE/UNSAVE CHANNEL NUMBER ;(RELBLK) RELATIVE BLK NBR DURING DDCMP PROGRAM LOADS .WORD 0 ;(ACHAN) ACTIVE CHANNEL NUMBER (LEFT BYTE FOR ; INPUT, RIGHT BYTE FOR OUTPUT). USP8: .WORD 0 ;(USP) USERS STACK POINTER .WORD 0 ;(ERR) I/O ERROR WORD .WORD CROUT8 ;(CROUT) I/O COROUTINE .BYTE 0 ;(NEEDIN) TTY NEED LINE FLAG .BYTE 0 ;(NEEDRM) TTY NEED OUTPUT BUFFER FLAG .WORD 0 ;(TTOCLO) TTY CONTROL O FLAG .WORD TT8BUF ;(TTYTAB) TTY INPUT BUFFER HEADER ADDRESS .WORD TT8OBF ;(TTOTAB) OUTPUT BUFFER HEADER ADDRESS .WORD 0 ;(TTILCT) INPUT BUFFER LINE COUNTER .WORD 0 ;(TTIPRE) TTY INPUT PREVIOUS CHARACTER .WORD TKS8 ;(TKS) TTY INPUT CSR REGISTER .WORD TPS8 ;(TPS) TTY OUTPUT CSR REGISTER .WORD TKB8 ;(TKB) TTY INPUT BUFFER REGISTER .WORD TPB8 ;(TPB) TTY OUTPUT BUFFER REGISTER .WORD TT8TBC ;(OUTCH) TTY TAB AND FILLER COUNTERS .BYTE 15 ;(FILLIT) TTY FILL CHARACTER .BYTE 0 ;(FILLCT) TTY FILL COUNT .WORD TTVEC8 ;(TTYVEC) TTY VECTOR ADDRESS .WORD TTYIN8 ;(TTYIN) TTY INPUT INTERRUPT ROUTINE .WORD TTYOT8 ;(TTYOUT) TTY OUTPUT INTERRUPT ROUTINE .IIF DF DIAL, .WORD 0 ;(TKSSAV) DL RECEIVER STATUS WORD SAVE ;MAKE SURE ALL AREAS ARE IDENTICAL (SIZE WISE) UP TO HERE T=.-USER8 .IIF NE T-E, .ERROR 1;IMPURE AREAS NOT IDENTICALLY ASSIGNED .WORD TT8BUF+6 ;TTY 1 INPUT BUFFER .WORD TT8BUF+6 TT8BUF: 0 .WORD TT8BUF+6 .WORD TT8BUF+TTINBF+6 .=.+TTINBF .WORD TT8OBF+6 ;TTY 1 OUTPUT BUFFER .WORD TT8OBF+6 TT8OBF: 0 .WORD TT8OBF+6 .WORD TT8OBF+TTOUBF+6 .=.+TTOUBF TT8TBC: 0,0,10 ;TAB AND FILLER COUNTER UX = .-USER8 .IIF NE UX-USIZE, .ERROR 1; IMPURE AREAS NOT IDENTICALLY ASSIGNED .ENDC ;.IF GT NUSERS-7 .LIST BEX ENDUSR: ;END OF USER AREA ; .SBTTL INITIALIZATION CODE ; .GLOBL SYS.SP,QUEUE,DVAREA,FG,RSUME,$STACK .GLOBL NOPAGE,KBVEC,TTVEC,PRI,START,.PRNT .GLOBL MSG0,ENDP,SCHED .IIF NDF NOMMT, .GLOBL MMT,MMT45,$GETBY,MMT40 .IIF NDF NODDC, .GLOBL TIME ; ; ALL INITIALIZATION CODE LIVES INSIDE OF I/O BUFFERS AND IS ; ONCE ONLY CODE. .=USER1+INBUF ; BEGIN: .SETTOP #-2 ;ASK FOR ALL OF CORE TEMP0=BEGIN TEMP00=BEGIN+2 MOV R0,TEMP0 ;R0 CONTAINS LAST AVAILABLE USER ADDRESS ; IN LOW CORE. MOV SP,SYS.SP MOV #SCHED,@#46 ;SET USR SWAP AREA .QSET #QUEUE,#NUSERS ;EXTEND MONITOR QUEUE LENGTH .DEVICE #DVAREA ;SETUP DEVICE VECTORS FOR ^C SHUTDOWN ; ; GET JOB NUMBER BY .GTJB ; .GTJB #GTJB ;GET JOB PARAMETER BLOCK MOVB TEMP00,FG ;SET UP SWITCH MOV TEMP00,RSUME+2 ;SET UP THE SYNCH BLOCK .IIF DF NOMMT, JMP X$ .IF NDF NOMMT .TRPSET #AREA,#MTRAPS ;ESTABLISH ERROR TRAP HANDLER ;DETERMINE CPU TYPE MOV MMT45-2,MMT45 ;SET UP DUMMY SR3 ADDRESS MOV #ERR1,TRAP10 ;SET TRAP THROUGH 10 VECTOR XOR R0,R0 ;THIS IS GOOD FOR 11/40'S AND ; HIGHER PROCESSORS TST R0 ; IF IT WORKED, IT MUST BE ZERO NOW. BEQ 1$ ;OK: IT WORKED JMP X$ ;NO EXTENDED MEMORY AVAILABLE 1$: SPL 0 ;THIS INSTRUCTION ON 11/45 AND 11/70 TST R0 ;ERROR? BNE P11.40 ;MUST BE AN 11/40 PROCESSOR MOV #172516,MMT45 ;SET UP SR3 ADDRESS ; P11.40: MOV #MMT40,MMT ;SET CORRECT VECTOR TABLE MOV #ERR2,TRAP4 ;INITIALIZE THE TRAP THROUGH 4 VECTOR MOV MMT,R4 ;LOAD THE TABLE ADDRESS CLR @10(R4) ;DISABLE MEMORY MANAGEMENT CLR @12(R4) ;11/45 AND 11/70 NEED SR3 CLEARED ALSO ; PDRVAL=077406 ;4K OF READ/WRITE MEMORY AS PAGE ; DESCRIPTOR. (PDR REGISTERS) ; MOV @R4,R1 ;POINT AT THE KERNEL PDR REGS MOV 2(R4),R2 ;POINT TO THE KERNEL PAR REGS CLR R0 ;START WITH BASE OF ZERO MOV #8.,R3 ;LOOP FOR 8 ITERATIONS ; 1$: MOV R0,(R2)+ ;SET THE KERNEL PAR ADD #4096./32.,R0 ;UPDATE BASE ADDRESS MOV #PDRVAL,(R1)+ ;SET IN PAGE DESCRIPTOR DEC R3 ;COUNT OUT THE LOOPS BGT 1$ ;CONTINUE... BIS #6000,-(R2) ;MAP LAST PAGE TO EXTERNAL PAGE MOV @R4,R1 ;POINT TO KERNEL REGISTERS MOV 4(R4),R2 ;POINT TO USER REGISTERS MOV #8.,R3 ;SET COUNTER 2$: MOV 40(R1),40(R2) ;COPY THE PAR REGS MOV (R1)+,(R2)+ ; AND THE PDR ONES DEC R3 ;COUNT IT OUT BGT 2$ ;CONTINUE UNTIL FINISHED ; INC @10(R4) ;ESTABLISH VIRTUAL MEMORY BIS #140000,@#PS ;ENTER USER MODE MOV #$STACK,SP ;SET UP USER MODE STACK BIC #140000,@#PS ;RESET TO KERNEL MODE CLR @10(R4) ;DISABLE MEMORY MANAGEMENT ;SCAN FOR MEMEORY SIZE MOV #ERR3,TRAP4 ;SETUP ERROR TRAP CLR MMLIN1 ;RESET THE MEMORY POINTER CLR MMLIN2 ; WHICH IS 2 WORDS LONG 3$: ADD #1024.*2,MMLIN1 ;ADD 1K WORDS ADC MMLIN2 ;PROPAGATE CARRY MOV #MMLIN2,R5 ;POINT TO 2 WORD ADDRESS SUB #BASE,R5 CALL $GETBY ;GET ONE WORD TST FAULT ;DID WE GET IT? BEQ 3$ ;YES: CONTINUE MOV MMLIN1,R1 ;PUT RESULT IN R0 AND R1 MOV MMLIN2,R0 SUB #1,R1 ;REDUCE BYTE COUNT (CAN'T USE "DEC") SBC R0 ;MAKE SURE WE POINT TO LAST GOOD BYTE JMP Y$ .ENDC ;.IF NDF NOMMT ; .=USER1+OUTBUF X$: MOV TEMP0,R1 ;USE LOW CORE ON NON MMT MACHINE CLR R0 CALL ENDP ;CALCULATE SIZE OF EACH USERS AREA BR Z$ Y$: MOV #160000,R2 ;FOR MMT MACHINES, BEGIN AT 28K PHYSICAL Z$: CLR R3 SUB R2,R1 SBC R0 MOV R0,R4 ;MAKE SURE SOME AREA EXISTS BIS R1,R4 BEQ U$ ;NO: DON'T ALLOW PAGE MODE THEN .IF EQ NUSERS-2 ASR R0 ROR R1 .ENDC ;.IF EQ NUSERS-2 .IF EQ NUSERS-3 MOV R1,R4 CLR R1 4$: SUB #3.,R4 SBC R0 BLT 3$ INC R1 BR 4$ 3$: CLR R0 .ENDC ;.IF EQ NUSERS-3 .IF EQ NUSERS-4 ASR R0 ROR R1 ASR R0 ROR R1 .ENDC ;.IF EQ NUSERS-4 .IF EQ NUSERS-5 MOV R1,R4 CLR R1 2$: SUB #5.,R4 SBC R0 BLT 1$ INC R1 BR 2$ 1$: CLR R0 .ENDC ;.IF EQ NUSERS-5 .IF EQ NUSERS-6 MOV R1,R4 CLR R1 5$: SUB #6.,R4 SBC R0 BLT 6$ INC R1 BR 5$ 6$: CLR R0 .ENDC ;.IF EQ NUSERS-6 .IF EQ NUSERS-7 MOV R1,R4 CLR R1 7$: SUB #7.,R4 SBC R0 BLT 8$ INC R1 BR 7$ 8$: CLR R0 .ENDC ;.IF EQ NUSERS-7 .IF EQ NUSERS-8. ASR R0 ROR R1 ASR R0 ROR R1 ASR R0 ROR R1 .ENDC ;.IF EQ NUSERS-8. TST R0 ;IF > 65K BYTES, SET = 65K BYTES BEQ U$ MOV #177776,R1 U$: BIC #1,R1 ;MAKE SURE BUFFER SIZE IS EVEN CMP R1,#256. ;BUFFER SIZE FOR EACH USER >256 BYTES? BHI V$ ;YES INCB NOPAGE ;NO: DON'T ALLOW PAGE MODE OPERATIONS ; THEN. V$: MOV @#60,KBVEC ;SAVE CONSOLE TTY VECTORS MOV @#64,TTVEC SUB #2,R1 ;SET UP BUFFER AREAS AND TTY'S MOV #USER1,R4 .IIF NDF NODDC, ADD R4,TTYIN1+2 ADD #BASE,R4 MOV R3,(R4)+ ;USER #1 MOV R2,(R4) ADD R1,R2 ADC R3 MOV R1,ENDM1 ; MOV #STACK1+<60.*2.>,USP1 MOV #STACK1+<60.*2.+2.>,STACK1 MOV #START,@USP1 SUB #10.,USP1 .VCSET 1 CLR @#TPS1 TST @#TPB1 MOV #INIDLI,@#TKS1 MOV #USER1,R4 BIS #4000,SW2(R4) ;SET USER #1 RUNNING MOV #USER1,R5 .PRINT #MSG0 ;SHOW USER THE CURRENT VERSION NBR .IIF EQ NUSERS-1, JMP W$ .IF GT NUSERS-1 JMP B2 .=.CURR2 B2: TST (R2)+ MOV #USER2,R4 .IIF NDF NODDC, ADD R4,TTYIN2+2 ADD #BASE,R4 MOV R3,(R4)+ ;USER #2 MOV R2,(R4) ADD R1,R2 ADC R3 MOV R1,ENDM2 ; MOV #STACK2+<60.*2.>,USP2 MOV #STACK2+<60.*2.+2.>,STACK2 MOV #START,@USP2 SUB #10.,USP2 .VCSET 2 CLR @#TPS2 TST @#TPB2 MOV #INIDLI,@#TKS2 .IIF EQ NUSERS-2, JMP W$ .ENDC ;IF GT NUSERS-1 .IF GT NUSERS-2 JMP B3 .=.CURR3 B3: TST (R2)+ MOV #USER3,R4 .IIF NDF NODDC, ADD R4,TTYIN3+2 ADD #BASE,R4 MOV R3,(R4)+ ;USER #3 MOV R2,(R4) ADD R1,R2 ADC R3 MOV R1,ENDM3 ; MOV #STACK2+<60.*2.>,USP3 MOV #STACK3+<60.*2.+2.>,STACK3 MOV #START,@USP3 SUB #10.,USP3 .VCSET 3 CLR @#TPS3 TST @#TPB3 MOV #INIDLI,@#TKS3 .IIF EQ NUSERS-3, JMP W$ .ENDC ;.IF GT NUSERS-2 .IF GT NUSERS-3 JMP B4 .=.CURR4 B4: TST (R2)+ MOV #USER4,R4 .IIF NDF NODDC, ADD R4,TTYIN4+2 ADD #BASE,R4 MOV R3,(R4)+ ;USER #4 MOV R2,(R4) ADD R1,R2 ADC R3 MOV R1,ENDM4 ; MOV #STACK4+<60.*2.>,USP4 MOV #STACK4+<60.*2.+2.>,STACK4 MOV #START,@USP4 SUB #10.,USP4 .VCSET 4 CLR @#TPS4 TST @#TPB4 MOV #INIDLI,@#TKS4 .IIF EQ NUSERS-4, JMP W$ .ENDC ;.IF GT NUSERS-3 .IF GT NUSERS-4 JMP B5 .=.CURR5 B5: TST (R2)+ MOV #USER5,R4 .IIF NDF NODDC, ADD R4,TTYIN5+2 ADD #BASE,R4 MOV R3,(R4)+ ;USER #5 MOV R2,(R4) ADD R1,R2 ADC R3 MOV R1,ENDM5 ; MOV #STACK5+<60.*2.>,USP5 MOV #STACK5+<60.*2.+2.>,STACK5 MOV #START,@USP5 SUB #10.,USP5 .VCSET 5 CLR @#TPS5 TST @#TPB5 MOV #INIDLI,@#TKS5 .IIF EQ NUSERS-5, JMP W$ .ENDC ;.IF GT NUSERS-4 .IF GT NUSERS-5 JMP B6 .=.CURR6 B6: TST (R2)+ MOV #USER6,R4 .IIF NDF NODDC, ADD R4,TTYIN6+2 ADD #BASE,R4 MOV R3,(R4)+ ;USER #6 MOV R2,(R4) ADD R1,R2 ADC R3 MOV R1,ENDM6 ; MOV #STACK6+<60.*2.>,USP6 MOV #STACK6+<60.*2.+2>,STACK6 MOV #START,@USP6 SUB #10.,USP6 .VCSET 6 CLR @#TPS6 TST @#TPB6 MOV #INIDLI,@#TKS6 .IIF EQ NUSERS-6, JMP W$ .ENDC ;.IF GT NUSERS-5 .IF GT NUSERS-6 JMP B7 .=.CURR7 B7: TST (R2)+ MOV #USER7,R4 .IIF NDF NODDC, ADD R4,TTYIN7+2 ADD #BASE,R4 MOV R3,(R4)+ ;USER #7 MOV R2,(R4) ADD R1,R2 ADC R3 MOV R1,ENDM7 ; MOV #STACK7+<60.*2.>,USP7 MOV #STACK7+<60.*2.+2.>,STACK7 MOV #START,@USP7 SUB #10.,USP7 .VCSET 7 CLR @#TPS7 TST @#TPB7 MOV #INIDLI,@#TKS7 .IIF EQ NUSERS-7, JMP W$ .ENDC ;.IF GT NUSERS-6 .IF GT NUSERS-7 JMP B8 .=.CURR8 B8: TST (R2)+ MOV #USER8,R4 .IIF NDF NODDC, ADD R4,TTYIN8+2 ADD #BASE,R4 MOV R3,(R4)+ ;USER #8 MOV R2,(R4) ADD R1,R2 ADC R3 MOV R1,ENDM8 ; MOV #STACK8+<60.*2.>,USP8 MOV #STACK8+<60.*2.+2.>,STACK8 MOV #START,@USP8 SUB #10.,USP8 .VCSET 8 CLR @#TPS8 TST @#TPB8 MOV #INIDLI,@#TKS8 JMP W$ .ENDC ;.IF GT NUSERS-7 ; .=.CURR1 W$: .IF GT NUSERS-3 MOV #R0LIST,R0 ;SETUP ADDITIONAL I/O CHANNELS IF >3 EMT 375 ; USERS. .ENDC ;.IF GT NUSERS-3 .SERR ;CATCH HARD MONITOR ERRORS (LIKE A WRITE ; LOCKED DISK) MOV #SWPBLK,R0 ;ALLOCATE DISK SWAP AREA (.ENTER) EMT 375 BCS BXX ;ERROR IN ALLOCATION .HERR ;ALLOW MONITOR ERRORS .IF NDF NODDC .MRKT #TIME ;START UP MARK TIME FOR DDCMP TIMEOUTS .ENDC ;.IF NDF NODDC JMP SCHED ;START THINGS GOING NOW ; ;--- MTRAPS - TRAP HANDLER ; .IF NDF NOMMT MTRAPS: BCS 1$ ;HANDLE TRAP THROUGH 10 .TRPSET #AREA,#MTRAPS ;RESET MTRAPS JMP @TRAP4 ;PROCESS TRAP-4 1$: .TRPSET #AREA,#MTRAPS ;RESET TRAP HANDLER JMP @TRAP10 ;PROCESS TRAP-10 ; ; ; .GLOBL TRAP4,TRAP10 ; TRAP4: .WORD 0 ;TRAP AT LOC 4 HANDLER ADDRESS TRAP10: .WORD 0 ;TRAP AT LOC 10 HANDLER ; ; ; ; ERR1 - TRAP AT 10 HANDLER ; ERR1: MOV (SP),R0 ;SET LOCATION INTO R0 RTI ;RETURN ; ; ; ERR2 - TRAP THROUGH 4 HANDLER ; ERR2: CLR MMT ;NO MEMORY MANAGEMENT AVAILABLE TST (SP)+ ;POP THE RETURN MOV (SP)+,@#PS ;RESET THE PSW JMP X$ ;CONTINUE WITH THE NEXT SECTION ERR3: MOV (SP),FAULT ;SET FAULT FLAG RTI ;RETURN FAULT: 0 ;FAULT FLAG MMLIN2: 0 MMLIN1: 0 .ENDC ;.IF NDF NOMMT ; BXX: .PRINT #NOSWAP ;TELL USER THERE'S NO SWAP SPACE .EXIT ;EXIT PGM NOSWAP: .ASCIZ /[DISK ERROR OR NOT ENOUGH SWAP AREA AVAILABLE]/ .EVEN ; B: 31*400 ;PROTECT BLOCK 260 .IF NDF NOMMT ; ; TRAP SET BLOCK ; AREA: .BYTE 0,3 MTRAPS .ENDC ;.IF NDF NOMMT .IF GT NUSERS-3 .GLOBL CHBLK R0LIST: 15*400 ;.CDNF BLOCK CHBLK NUSERS*4+4+1 .ENDC ;.IF GT NUSERS-3 ; ; EDITOR SWAP BLOCK ; SWPBLK: ;USE LARGEST CHANNEL +1 FOR SWAPPING .IIF LE NUSERS-3, .BYTE NUSERS*4,2 .IIF GT NUSERS-3, .BYTE NUSERS*4+4,2 SWPDEV NUSERS*3 0 SWPDEV: .RAD50 /SY/ .RAD50 /SWP/ .RAD50 / / .RAD50 /SYS/ ; GTJB: .BYTE 0,20 ;.GTJB EMT CALL .WORD TEMP00 ;SET RESULTS IN TEMP00 ; ; END OF EDITOR ; ; .END BEGIN .SBTTL COMMON SECTION .TITLE REMOTE V01-X02 .NLIST TTM,ME .CSECT REMCOM EDIT=002. ; ; ; PDP-11 RT-11 MULTI-USER LINE TEXT EDITOR AND DOWN LINE LOADER ; ; PROGRAM NAME: LETTER / REMOTE-11 ; ; COMMON SECTION: VERSION LEVEL V01-X02: PATCH LEVEL A ; ; AUTHOR: RICK HULLY ; ; DATE: SEP., 1975 ; ; ; COPYRIGHT (C) 1975 ; ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- ; SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER ; COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE ; TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO ; AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE ; SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; .SBTTL CONDITIONAL ASSEMBLY PARAMETERS ; ; THE FOLLOWING CONDITIONAL ASSEMBLY PARAMETERS PERTAIN TO THIS ; SECTION. ; ; NO CONDITIONALS SPECIFIED YIELDS: ; EDITOR FUNCTIONS ; [BACKGROUND REQUIRED] MESSAGE ; REMOTE FUNCTIONS FOR DOWN-LINE LOADING OF PROGRAMS ; 2 USER VERSION OF REMOTE-11 ; ; IF DEFINED "NOEDIT", THE EDITOR FUNCTIONS ARE REMOVED. ; ; IF DEFINED "NOBMSG", THE "[BACKGROUND REQUIRED]" MESSAGE ; IS NOT PRINTED ON THE BACKGROUND TERMINAL WHEN ; THE BACKGROUND IS REQUESTED BY A FOREGROUND ; USER. ; ; IF DEFINED "NODDC", THE REMOTE DOWN LINE LOADING FUNCTIONS ; ARE REMOVED. ; .IIF NDF NUSERS, NUSERS=2. .SBTTL PROGRAM DEFINITIONS ; R0 = %0 ;GENERAL REGISTERS R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 RETURN = 207 ;RETURN = RTS PC .EXIT = EMT+350 ;.EXIT PROGRAMMED REQUEST SWR = 177570 ;SWITCH REGISTER PS = -2 ;PROCESSOR STATUS WORD .IF NDF NODDC DLE = 220 ;DLE CHARACTER SYN = 377 ;SYNC CHARACTER (ASYNC) POLY = 120001 ;CRC-16 POLYNOMINAL DLECRC = 66000 ;DLE CRC CHARACTER VALUE SYNDLE = 110377 ;SYN AND DLE CHARACTERS .ENDC ;.IF NDF NODDC LINELN = 130. ;MAXIMUM LINE LENGTH TTINBF = LINELN+4 ;SIZE OF TTY INPUT BUFFER TTOUBF = 20. ;SIZE OF TTY OUTPUT BUFFER .IF NDF NODDC SOFTVC = 150 ;SOFTWARE VECTORS WHICH MUST BE PROTECTED ; (LOCATIONS 150-167). .ENDC ;.IF NDF NODDC ; PRI=340 ; .IIF DF NOEDIT, NOMMT=0 ; .IF DF NOEDIT .IF DF NODDC .ERROR 1;CANNOT DEFINE BOTH "NOEDIT" AND "NODDC" .ENDC ;.IF DF NODDC .ENDC ;.IF DF NOEDIT ; ; .SBTTL GLOBALS ; .GLOBL USIZE,ARG1,ARG2,ATCMD,ATVT,SIZEAT .GLOBL BELL,BGDUSE,CATEN,CHAN,CMD,CONTC .GLOBL CROUT,CTIME,CURREN,CWD,CWDS,DDCMP,DDCMPE .GLOBL DDCMPS,DEVERR,DFLAG,EATVT .GLOBL ENDUSR,ERR,FILEMG,FNAME,FSIZE,ICHAN .GLOBL INTERV,IOCOMP,MSG0,MSG7 .GLOBL NARG,NOBGD,NODEV,NOTRES .GLOBL QUIT,STACK,SAVFIL,GO .GLOBL CTIME,DEV,DWAIT,.IO,GETLIN,PUTLIN .GLOBL SYS.SP,SWITCH,SW2,SYNTAX,TEMP,TEMP1,TEMP2 .GLOBL TEMP4,TEMP5,TKB,TKS,TPB,TPS .GLOBL TTWAIT,TTYIN,TTYOUT,TTYVEC,WEWANT,USP .GLOBL WRIOT,$CHAN,$DBLK,.CURRN,.PRNT,.TTIN .GLOBL .TTOUT,SR5,RSUME,XSW,SAVE1$,SAVE2$,SAVER2,SAVER4,MMT40 .GLOBL NOPAGE,FG,MMT,SWAIT,SCAN,OCTDEC,GETNUM,GETCOM .GLOBL TESTDV,START,BEGIN4,ILLCOM,RSTRET,QUOTE .GLOBL EXITBK,SEND,STRT,TESTCR,GETNM .GLOBL SAVER,RESTOR,SCANCH,SCHED,DVAREA,KBVEC .GLOBL TTVEC,$STACK,MMT45,PRI,QUEUE,TTOTAB,DDCMPO ; .IIF NDF NODDC, .GLOBL OSOP,DDCMPP,TIME .IF NDF NOEDIT .GLOBL ILLCHR,KILL,OTHED,OUTDSK,PRT0,FLTMP .GLOBL REDIT,TSTPG,$GETBY,INFIL,OUTFIL,BAKFIL .GLOBL TMPFIL,ILLNM,ILLCD,EDITOR,EDITED,TMP,NERROR .ENDC ;.IF NDF NOEDIT .IIF GT NUSERS-3, .GLOBL CHBLK ; .GLOBL USER1,CROUT1 .IF GT NUSERS-1 .GLOBL USER2,CROUT2 .ENDC ;.IF GT NUSERS-1 .IF GT NUSERS-2 .GLOBL USER3,CROUT3 .ENDC ;.IF GT NUSERS-2 .IF GT NUSERS-3 .GLOBL USER4,CROUT4 .ENDC ;.IF GT NUSERS-3 .IF GT NUSERS-4 .GLOBL USER5,CROUT5 .ENDC ;.IF GT NUSERS-4 .IF GT NUSERS-5 .GLOBL USER6,CROUT6 .ENDC ;.IF GT NUSERS-5 .IF GT NUSERS-6 .GLOBL USER7,CROUT7 .ENDC ;.IF GT NUSERS-6 .IF GT NUSERS-7 .GLOBL USER8,CROUT8 .ENDC ;.IF GT NUSERS-7 .SBTTL MACRO DEFINITIONS ; .MCALL ..V2.. ..V2.. .MCALL .SETTOP,.SPND,.RSUM ; ; MACRO TO SET UP DL VECTOR AND REGISTER DEFINITIONS ; .MACRO TTGLBL A .GLOBL TTVEC'A,TKS'A,TPS'A,TKB'A,TPB'A .GLOBL DLVEC'A .ENDM TTGLBL ; TTCNT = 0 .REPT NUSERS .RADIX 10. TTCNT = TTCNT+1 TTGLBL \TTCNT .RADIX 8. .ENDR ; .MACRO CNTTY A .WORD TKS'A,0 .WORD TPS'A,0 .ENDM CNTTY ; .MACRO PUSH CELL MOV CELL,-(SP) .ENDM PUSH ; .MACRO POP CELL MOV (SP)+,CELL .ENDM POP ; .MACRO CALL ROUTINE JSR PC,ROUTINE .ENDM CALL ; .MACRO MOVR X,Y MOV X,Y ADD R5,Y .ENDM MOVR ; .MACRO .RADPK ADDR MOV ADDR,R0 ADD R5,R0 JSR PC,RADPK .ENDM .RADPK ; .MACRO BSS N .REPT N .WORD 0 .ENDR .ENDM BSS ; .MACRO .WAIT JSR PC,DWAIT .ENDM .WAIT ; .MACRO .SCHED JSR PC,SWAIT .ENDM .SCHED ; .MACRO .TTYIN JSR PC,.TTIN .ENDM .TTYIN ; .MACRO .PRINT .MESADDR .IF NB .MESADDR MOV .MESADDR,R0 .ENDC ;.IF NB .MSADDR JSR PC,.PRNT .ENDM .PRINT ; .MACRO .TTYOUT .CHAR .IF NB .CHAR MOVB .CHAR,R0 .ENDC ;.IF NB .CHAR JSR PC,.TTOUT .ENDM .TTYOUT ; .MACRO .MRKT,.AREA MOV .AREA,R0 EMT 375 .ENDM .MRKT ; .MACRO .MTPS,X MOV X,-(6.) MOV #.+6.,-(6.) RTI .ENDM ; .MACRO .CLRPS CLR -(6.) MOV #.+6.,-(6.) RTI .ENDM .SBTTL RT-11 CHANNEL ASSIGNMENTS ; ; CHANNEL USER USE ; ; 0 1 SY INPUT ; 1 1 SY OUTPUT ; 2 1 SY SECONDARY ; 3 1 SY SAVE/UNSAVE ; 4 2 SY INPUT ; 5 2 SY OUTPUT ; 6 2 SY SECONDARY ; 7 2 SY SAVE/UNSAVE ; 10 3 SY INPUT ; 11 3 SY OUTPUT ; 12 3 SY SECONDARY ; 13 3 SY SAVE/UNSAVE ; 20 4 SY INPUT ; 21 4 SY OUTPUT ; 22 4 SY SECONDARY ; 23 4 SY SAVE/UNSAVE ; 24 5 SY INPUT ; 25 5 SY OUTPUT ; 26 5 SY SECONDARY ; 27 5 SY SAVE/UNSAVE ; 30 6 SY INPUT ; 31 6 SY OUTPUT ; 32 6 SY SECONDARY ; 33 6 SY SAVE/UNSAVE ; 34 7 SY INPUT ; 35 7 SY OUTPUT ; 36 7 SY SECONDARY ; 37 7 SY SAVE/UNSAVE ; 40 8 SY INPUT ; 41 8 SY OUTPUT ; 42 8 SY SECONDARY ; 43 8 SY SAVE/UNSAVE ; NUSERS*4+4 SYS SY SYSTEM SWAPPER ; .SBTTL SYSTEM VARIABLES ; SYS.SP: .WORD 0 ;SYSTEM STACK POINTER IRUN: .BYTE 0 ;INDICATORS USED TO DETERMINE IF ; SOMEONE RAN WHILE SCANNING THE ; QUEUE FROM TOP TO BOTTOM. BACKGD: .BYTE 0 ;BACKGROUND IN USE FLAG. 0 -> AVAILABLE, ; #0 -> IN USE. KBVEC: .WORD 0 ;RT-11 KEYBOARD VECTOR TTVEC: .WORD 0 ;RT-11 PRINTER VECTOR FG: .BYTE 0 ;0 IF IN SJ MONITOR OR IN BGD OF FB ; MONITOR. #0 IF IN FGD. NOPAGE: .BYTE 0 ;0 IF PAGE MODE ALLOWED. #0 IF NOT. SR5: .WORD 0 ;TEMPORARY STORAGE FOR SAVING R5 ; ; MEMORY MANAGEMENT TABLES (MMT) ; MMT: .WORD 0 ;POINTER TO CORRECT MMT ; MMT40: .WORD 172300 ;(00) KERNEL PDR 0 .WORD 172340 ;(02) KERNEL PAR 0 .WORD 177600 ;(04) USER PDR 0 .WORD 177640 ;(06) USER PAR 0 .WORD 177572 ;(10) SR0 - ENABLE REG MMT45: .WORD 000000 ;(12) SR3 - I/D SPACE ENA ; INITIALIZED TO SR1 ADDR ; THEN SET UP IF A PDP 11/45. TMP: ;TEMPORARY STORAGE USED BY OVERLAY ; HANDLER. XSW: .WORD 0 ;SWITCH FOR STORE/FETCH OPERATION SAVE1$: .WORD 0 ;TEMP STORAGE SAVE2$: .WORD 0 ;TEMP STORAGE .BLKW 10 ;STACK AREA FOR USER MODE $STACK: .WORD 0 ;STACK FOR USER MODE STARTS HERE SAVER2: .WORD 0 ;TEMP STORAGE FOR R2 SAVER4: .WORD 0 ;TEMP STORAGE FOR R4 .IF NDF NODDC TIME: 22*400+0 ;MARK TIME INTERVAL INTERV ;1 SECOND INTERVALS MRKT ;COMPLETION ROUTINE 0 ;ID (ALWAYS ZERO) .ENDC ;.IF NDF NODDC QUEUE: BSS NUSERS*7+1 ;QUEUE EXTENSION RSUME: 0,2,0,0,0,-1,0 ;DEFINE RESUME INTERRUPT BLOCK ; TTCNT = 1 DEVTAB: .REPT NUSERS-1 ;TABLE FOR .DEVICE .RADIX 10. TTCNT = TTCNT+1 CNTTY \TTCNT .RADIX 8. .ENDR .WORD 0 DVAREA: .BYTE 0,14 .WORD DEVTAB ; .IF GT NUSERS-3 CHBLK: BSS ;SETUP ADDITIONAL I/O CHANNELS IF MORE ; THAN 3 USERS ARE DEFINED. ;THERE ARE 4 CHANNELS PER USER, ; ONE CHANNEL FOR THE SYSTEM, ; AND ALL CHANNELS REQUIRE 5 WORDS ; EACH. CHANNEL NUMBERS 14, 15, ; 16, AND 17 ARE SKIPPED BECAUSE ; CHANNEL 17 IS NEEDED BY THE ; OVERLAY HANDLER. .ENDC ;.IF GT NUSERS-3 .ST: .WORD 0,0,0,0 ;STORAGE AREA FOR RETURNED ; STATUS INFORMATION. .SBTTL GET/PUT LINE ; ;ROUTINE TO READ A LINE FROM BUFFER SPECIFIED BY R2 INTO @WRIOT ; ; CALL: ; MOV #CHANBR,CHAN(R5) ; MOV #LINE,WRIOT(R5) ; MOVR #BUFFER,R2 ; CALL GETLIN ; RETURN IF EOF ; RETURN IF SUCCESS ; GETLIN: BICB #4,SWITCH+1(R5) ;CLEAR FORM-FEED FLAG PUSH R0 ;SAVE R0 .IF NDF NOEDIT TSTB DDCMP(R5) ;DDCMP MODE? BNE 18$ ;YES MOV WRIOT(R5),R0 ;ADDRESS OF LINE TO FILL IN R0 CLR (R0)+ ;ZERO CHAR COUNT SO FAR MOV #LINELN,TEMP5(R5) ;ALLOW NO MORE THAN 130 CHARACTERS PER LINE .ENDC ;.IF NDF NOEDIT 18$: TST 2(R2) ;EOF FOUND? BNE GET7 ;YES: RETURN IMMEDIATELY TST (R2) ;BUFFER EMPTY? BNE GET2 ;NO: GET A LINE THEN BR GET4 ;READ IN A NEW BLOCK GET7: POP R0 ;RESTORE R0 RETURN ;SHOW EOF FOUND ; GET4: MOV 6(R2),(R2) ;RESET BUFFER POINTER PUSH R0 ;SAVE R0 ; .READC 0,(R2),#400,CROUT(R5),-2(R2) ;READ ONE BLOCK MOV -2(R2),R0 ;THIS AND THE FOLLOWING 8 LINES MOV CROUT(R5),$DBLK+6(R5) ; ARE THE EXPANSION OF THE .READC MOV #400,$DBLK+4(R5) ; ABOVE. MOV (R2),$DBLK+2(R5) MOVB CHAN(R5),10$ ;SETUP CHANNEL NUMBER INCB IOCOMP(R5) ;INDICATE I/O COMPLETION ROUTINE ACTIVE CALL .IO ;ISSUE EMT NOW 10$: .BYTE 0 ;CHANNEL 0 FOR INPUT .BYTE 10 ;READ ARGUMENT BCS GET1 ;IMMEDIATE ERROR, MUST BE AN EOF 1$: .WAIT ;WAIT FOR I/O TO FINISH TSTB IOCOMP(R5) ;I/O REQUESTED COMPLETE? BNE 1$ ;NO: MUST BE SOME OTHER REQUEST DONE THEN POP R0 ;RESTORE R0 CLC ;DON'T ALLOW CARRY TO TRICKLE INTO ERROR ; WORD. RORB ERR(R5) BCS GET3 ;READ ERROR CLR ERR(R5) ;SHOW NO ERROR INC -2(R2) ;+1 TO BLOCK # GET2: CMP (R2),4(R2) ;OUT OF DATA FOR THIS BLOCK? BHIS GET4 ;YES: READ IN ANOTHER BLOCK .IF NDF NOEDIT TSTB DDCMP(R5) ;DDCMP MODE? BNE 17$ ;YES MOVB @(R2),(R0) ;GET A CHARACTER FROM BUFFER BEQ 9$ ;IGNORE NULL CHARACTERS BPL 16$ ;OK IF BIT 7 IS 0 .PRINT #ILLCHR ;WARN USER OF FUNNY BYTE BICB #200,(R0) ;FORCE IT INTO 7-BIT FORMAT 16$: CMPB (R0)+,#177 ;RUBOUT CHARACTER? BEQ 14$ ;IGNORE LIKE WE DID THE NULL CHAR... CMPB @(R2),#12 ;IF LF, THE LINE HAS BEEN BEQ 5$ ; READ IN. CMPB @(R2),#14 BEQ 6$ 9$: INC (R2) ;BUMP BUFFER POINTER TSTB (R0) ;DON'T COUNT IF NULL CHAR BEQ GET2 DEC TEMP5(R5) ;TOO MANY CHARACTERS? BNE GET2 ;NO: GET ANOTHER CHARACTER MOVB #15,(R0)+ ;TERMINATE LINE WITH CR/LF MOVB #12,(R0)+ BR 12$ 14$: DEC R0 ;BACK UP POINTER IN CASE OF RUBOUT BR 9$ 6$: BISB #4,SWITCH+1(R5) ;REMEMBER A FF WAS FOUND 5$: INC (R2) ;BUMP PAST LF/FF 12$: SUB WRIOT(R5),R0 ;COMPUTE BYTE COUNT SUB #2,R0 ;ACCOUNT FOR HEADER WORD MOV R0,@WRIOT(R5) .ENDC ;.IF NDF NOEDIT 17$: POP R0 ;RESTORE R0 ADD #2,(SP) ;USE NORMAL EXIT RETURN ; GET1: POP R0 ;RESTORE R0 MOVB @#52,ERR(R5) ;SET UP ERROR CODE GET3: TSTB ERR(R5) ;HARDWARE ERROR? BNE PUTLN2 ;YES: DEVICE ERROR. CLOSE AND RELEASE ; I/O DEVICE AND RESTART EDITOR. MOV SP,2(R2) ;SET EOF FLAG BR GET7 ;USE EOF EXIT ; ; ;ROUTINE TO PUT A LINE INTO BUFFER SPECIFIED BY R2 FROM @WRIOT ; ; CALL: ; MOV #CHANBR,CHAN(R5) ; MOV #LINE,WRIOT(R5) ; MOVR #BUFFER,R2 ; CALL PUTLIN ; .ENABL LSB PUTLIN: PUSH R0 ;SAVE R0 TSTB DDCMP(R5) ;DDCMP MODE? BNE 3$ ;YES MOV WRIOT(R5),R0 ;ADDRESS OF WHERE LINE IS WITH DATA PUSH (R0)+ ;BYTE COUNT OF LINE 3$: CMP (R2),4(R2) ;THIS BUFFER FULL? BLO 2$ ;NO: CONTINUE MOV 6(R2),(R2) ;RESET OUTPUT BUFFER POINTER PUSH R0 ;SAVE R0 TEMP ; .WRITC 1,(R2),#400,CROUT(R5),-2(R2) ;WRITE IT OUT MOV -2(R2),R0 ;THIS AND THE NEXT 8 LINES MOV CROUT(R5),$DBLK+6(R5) ; ARE THE EXPANSION OF THE .WRITC. MOV #400,$DBLK+4(R5) MOV (R2),$DBLK+2(R5) MOVB CHAN(R5),7$ ;SETUP CHANNEL NUMBER INCB IOCOMP(R5) ;INDICATE I/O COMPLETION ROUTINE ACTIVE CALL .IO ;ISSUE EMT NOW 7$: .BYTE 1 ;CHANNEL 1 FOR WRITE .BYTE 11 ;WRITE ARGUMENT BCS PUTLN6 ;USER MUST BE OUT OF DISK SPACE 6$: .WAIT ;WAIT FOR I/O TO FINISH TSTB IOCOMP(R5) ;I/O REQUETED COMPLETE? BNE 6$ ;NO: MUST BE SOME OTHER REQUEST DONE THEN POP R0 ;RESTORE R0 CLC ;DON'T ALLOW CARRY TO TRICKLE INTO ERROR ; WORD. RORB ERR(R5) BCS 1$ ;ERROR CLR ERR(R5) ;SHOW NO ERROR INC -2(R2) ;WRITE SUCCESSFUL, SO BUMP BLOCK # TSTB DDCMP(R5) ;DDCMP MODE? BNE 4$ ;YES 2$: TST (SP) ;IF ZERO BYTE COUNT, EXIT IMMEDIATELY BEQ 8$ MOVB (R0)+,@(R2) ;TRANSFER ONE CHAR FROM LINE TO BUFFER INC (R2) ;BUMP TO NEXT CHARACTER POSITION DEC (SP) ;DECREMENT BYTE COUNT OF LINE BGT 3$ ;MORE TO GO: CONTINUE 8$: TSTB DDCMP(R5) ;IN DDCMP MODE? BNE 4$ ;YES: DON'T POP OFF EXTRA WORD 5$: TST (SP)+ ;CLEAN UP STACK 4$: POP R0 ;RESTORE R0 RETURN ;RETURN TO CALLER 1$: TSTB ERR(R5) ;IS IT EOF? BEQ PUTLN5 ;YES PUTLN2: TSTB DDCMP(R5) ;DDCMP MODE? BNE PUTLN0 ;YES: SHOW ERROR ON RETURN .PRINT #DEVERR ;HARDWARE ERROR BR PUTLN1 PUTLN6: TST (SP)+ ;CLEAN UP STACK PUTLN5: .IF NDF NOEDIT TSTB DDCMP(R5) ;DDCMP MODE? BNE PUTLN0 ;YES: SHOW ERROR ON RETURN .PRINT #OUTDSK ;DISK AREA ALLOCATED EXCEEDED .ENDC ;.IF NDF NOEDIT PUTLN1: CMP (SP)+,(SP)+ ;CLEAN UP STACK .IF NDF NOEDIT TSTB DDCMP(R5) ;DDCMP MODE? BNE PUTLN0 ;YES: SHOW ERROR ON RETURN .PRINT #EDITED ;TELL USER HIS EDITED FILE IS IN "EDIT0N.TMP" JMP KILL ;CLOSE FILES AND RESTART THIS USER .ENDC ;.IF NDF NOEDIT PUTLN0: MOV #-1,ERR(R5) ;SHOW ERROR ON RETURN BR 5$ ;NOW RETURN TO CALLER ; .DSABL LSB ; .SBTTL MARK TIME HANDLER ; ;MRKT - MARK TIME HANDLER FOR DDCMP TIME-OUT CONDITIONS ; .IF NDF NODDC MRKT: MOV #USER1,R0 ;BEGIN WITH USER #1 MOV #NUSERS,R1 ;SCAN ALL USERS 1$: .MTPS #200 ;PROTECT FROM TTY INTERRUPTS TSTB DDCMP(R0) ;USER DOING DDCMP INPUT? BMI 2$ ;YES: SEE IF HE'S TAKEN TO MUCH TIME TSTB DDCMPS(R0) ;NO: ARE WE WAITING FOR A RESPONSE? BEQ 5$ ;NO: LOOK AT NEXT USER 2$: DECB CTIME(R0) ;TIME EXPIRED? BNE 5$ ;NO: LOOK AT NEXT USER TSTB DFLAG(R0) ;IS COMPLETION FLAG SET? BNE 5$ ;YES: LET HIM CLEAN IT UP THEN TSTB DDCMP(R0) ;HAVE WE STARTED A MESSAGE? BEQ 3$ ;NO: SET FLAG INDICATING SO MOVB #-1,DFLAG(R0) ;YES: SET FAILURE FLAG INDICATING BR 4$ ; LAST MESSAGE WASN'T RECEIVED OK. 3$: MOVB #-2,DFLAG(R0) ;SET FAILURE FLAG INDICATING THAT NO ; MESSAGE HAS BEEN RECEIVED YET. 4$: .CLRPS ;RETURN TO MAINSTREAM LEVEL BIS #4000,SW2(R0) ;SET USER'S GO BIT PUSH R0 ;SAVE R0 TEMPORARILY .RSUM ;RESUME PROGRAM NOW POP R0 ;RESTORE R0 5$: .CLRPS ;RETURN TO MAINSTREAM LEVEL ADD #USIZE,R0 ;LOOK AT NEXT USER DEC R1 ;ALL DONE? BGT 1$ ;NO: CONTINUE .MRKT #TIME ;RESTART TIMER RETURN ;ALL DONE, EXIT MRKT .ENDC ;.IF NDF NODDC ; .SBTTL I/O COMPLETION ROUTINES ; ; I/O COMPLETION ROUTINES ; CROUT1: JSR R5,CRCOM ;SAVE R5 AND CALL COMMON CODE .WORD USER1 ;OFFSET FOR USER #1 ; .IF GT NUSERS-1 CROUT2: JSR R5,CRCOM ;SAVE R5 AND CALL COMMON CODE .WORD USER2 ;OFFSET FOR USER #2 .ENDC ;.IF GT NUSERS-1 ; .IF GT NUSERS-2 CROUT3: JSR R5,CRCOM ;SAVE R5 AND CALL COMMON CODE .WORD USER3 ;OFFSET FOR USER #3 .ENDC ;.IF GT NUSERS-2 ; .IF GT NUSERS-3 CROUT4: JSR R5,CRCOM ;SAVE R5 AND CALL COMMON CODE .WORD USER4 ;OFFSET FOR USER #4 .ENDC ;.IF GT NUSERS-3 ; .IF GT NUSERS-4 CROUT5: JSR R5,CRCOM ;SAVE R5 AND CALL COMMON CODE .WORD USER5 ;OFFSET FOR USER #5 .ENDC ;.IF GT NUSERS-4 ; .IF GT NUSERS-5 CROUT6: JSR R5,CRCOM ;SAVE R5 AND CALL COMMON CODE .WORD USER6 ;OFFSET FOR USER #6 .ENDC ;.IF GT NUSERS-5 ; .IF GT NUSERS-6 CROUT7: JSR R5,CRCOM ;SAVE R5 AND CALL COMMON CODE .WORD USER7 ;OFFSET FOR USER #7 .ENDC ;.IF GT NUSERS-6 ; .IF GT NUSERS-7 CROUT8: JSR R5,CRCOM ;SAVE R5 AND CALL COMMON CODE .WORD USER8 ;OFFSET FOR USER #8 .ENDC ;.IF GT NUSERS-7 ; CRCOM: MOV (R5),R5 ;GET USER OFFSET MOVB R0,ERR(R5) ;SAVE ERROR CODE BIS #4000,SW2(R5) ;SET USER RUNNABLE CLRB IOCOMP(R5) ;INDICATE FLAG WAS CLEARD FROM COMPLETION ; ROUTINE. POP R5 ;RESTORE R5 TSTB FG ;IN FGD? BEQ 1$ ;NO: THEN DON'T ISSUE A .RSUME THEN .RSUM ;RESUME USERS 1$: RETURN ;RETURN TO CALLER ; .SBTTL SCHEDULER ; SCHED: CLRB IRUN ;INDICATE NO ONE HAS RUN THIS PASS .MTPS 300 ;DO THIS PROTECTED MOV #USER1,R5 ;LOOK AT USER #1 FIRST 1$: BIT #4000,SW2(R5) ;USER CAPABLE OF RUNNING? BEQ 2$ ;NO: LOOK AT NEXT GUY THEN .CLRPS ;RUN USER AT MAINSTREAM INCB IRUN ;INDICATE SOMEONE IS READY TO RUN CALL SRUN ;NOW RUN HIM .MTPS #300 ;BACK TO PROTECTED MODE 2$: ADD #USIZE,R5 ;BIAS TO NEXT USER CMP R5,#ENDUSR-2 ;LOOKED AT ALL USERS? BLO 1$ ;NO: CONTINUE .CLRPS ;NO NEED TO PROTECT ANYMORE TSTB FG ;IN FGD? BEQ SCHED ;NO: THEN DON'T SUSPEND THEN TSTB IRUN ;ANYONE RUN THIS PASS? BNE SCHED ;YES: RESCAN QUEUE .SPND BR SCHED ;TRY AGAIN ; ;--- WAIT - ROUTINE TO PAUSE A USER FOR A SECOND OR SO ; ; WAIT: SUB #10.,SP ;GET ROOM ON THE STACK MOV SP,R0 ;SAVE IT CLRB (R0)+ ;GET ENTRY MOVB #22,(R0)+ ;ID WORD [22,0] CLR (R0)+ ;HIGH ORDER =0 MOV CROUT(R5),(R0)+ ;SET CO-ROUTINE ADDRESS MOV R5,(R0) ;USE USER AREA AS .MRKT ID MOV SP,R0 ;POINT TO IT MOV #60.,-(SP) ;GET TIME VALUE CLR -(SP) ;FORCE IT MOV SP,2(R0) ;SET ADDRESS OF TIME BIC #4000,SW2(R5) ;SET NOT RUNNABLE... EMT 375 ;HANG IN THERE ADD #14.,SP ;POP THE AREA .WAIT ; UNTIL CO-ROUTINE RE-ACTIVATES US RETURN ;THEN RETURN TO THE CALLER ; ; ; A USER IS RUNNABLE - START HIM UP ; SRUN: MOV SP,SYS.SP ;SWITCH STACKS MOV USP(R5),SP BIC #4000,SW2(R5) ;INDICATE THAT HE'S NOT RUNNABLE ; WHEN HE DOES HIS NEXT .WAIT. JSR R0,RESTOR ;RESTORE HIS GP'S RETURN ;GO TO USER ; ; SCHEDULE USER AND ENTER I/O WAIT ; SWAIT: BIS #4000,SW2(R5) ;SET USER RUNNABLE TO FORCE RESCHEDULING ; AND LET SOMEONE ELSE RUN. ; ; USER IS I/O BOUND ; DWAIT: JSR R0,SAVER ;SAVE HIS GP'S FOR HIM MOV SP,USP(R5) ;SWITCH STACKS TO SYSTEM STACK MOV SYS.SP,SP RETURN ;START UP NEXT USER ; ; ; READC, WRITC, LOOKUP, RENAME, ENTER, DELETE, AND CLOSE ; .IO: MOV R0,$DBLK(R5) ;SETUP DEVICE BLOCK ADDRESS MOVR #$CHAN,R0 ;GET ADDRESS OF AREA BLOCK CLR (R0) ;INITIALIZE CHANNEL NUMBER AREA MOVB ICHAN(R5),(R0) ;GET CHANNEL OFFSET ADD @(SP),(R0) ;ADD IN CHANNEL NUMBER AND OP-CODE ADD #2,(SP) ;BUMP EXIT EMT 375 ;ISSUE EMT NOW RETURN ;RETURN TO CALLER ; ; WAIT FOR TTY TO FINISH ; TTWAIT: .SCHED ;ALLOW SOMEONE ELSE TO RUN WHILE MESSAGE ; IS BEING PRINTED. TSTB @TTOTAB(R5) ;WAIT FOR ALL TTY OUTPUT TO FINISH BGT TTWAIT ; BEFORE LEAVING. CLRB DDCMPO(R5) ;CLEAR DDCMP OUTPUT MODE FLAG RETURN ;RETURN TO CALLER ; .SBTTL DEVICE TESTER ; ; TEST DEVICE EXISTS AND IS LOADED ; TESTDV: PUSH #.ST ;SEE IF DEVICE EXISTS EMT 342 BCC 1$ ;YES: NOW SEE IF ITS RESIDENT .PRINT #NODEV ;NO: TELL USER RETURN ;RETURN USING ERROR EXIT 1$: TST .ST+4 ;DEVICE CORE RESIDENT? BNE 2$ ;YES: ALL OK THEN .PRINT #NOTRES ;NO: TELL USER RETURN ;RETURN TO CALLER USING ERROR EXIT 2$: ADD #2,(SP) ;SHOW SUCCESS TO CALLER RETURN ;RETURN TO HIM ; .SBTTL SPLICE INTO BACKGROUND ; ;--- SPLICE - ROUTINE TO SPLICE INTO THE BACKGROUND OUTPUT ; SPLICE: MOV @#54,R0 ;POINT TO THE MONITOR MOV 304(R0),R0 ;GET THE VECTOR ADDRESS BEQ 2$ ;NO USER ADD #4,R0 ;GET AT OUTPUT VECTOR MOV (R0),-(SP) ;SAVE THE OUTPUT CSR CONTENTS CLR @R0 ;SHUT DOWN INTERRUPTS 1$: TSTB @R0 ;READY FOR CHARACTER? BPL 1$ ;NO - WAIT MOVB (R1)+,2(R0) ;SEND IT .SCHED ;SCHEDULE SOMEONE ELSE NOW TSTB @R1 ;WAS THAT THE LAST ONE? BNE 1$ ;NO - CONTINUE MOV (SP)+,@R0 ;RESTORE THE OUTPUT CSR 2$: RETURN ;RETURN TO THE CALLER ; .SBTTL EDITOR RESTART POINT ; START: MOV STACK(R5),SP ;RESET STACK POINTER CLRB GO(R5) ;USER IS NOT EDITING A FILE YET MOV (PC)+,R0 ;SETUP DEFAULT DEVICE .RAD50 /SY/ MOV R0,DEV(R5) .IF NDF NODDC TSTB DDCMP(R5) ;DDCMP MODE? BEQ 12$ ;NO 8$: JMP DDCMPP ;YES: PROCESS REQUEST 7$: CLRB DFLAG(R5) ;CLEAR ERROR FLAG JMP OSOP ;WAIT FOR NEW MESSAGE 12$: MOV #7$,DDCMPE(R5) ;SETUP ERROR RETURN FOR DDCMP TIME OUTS .ENDC ;.IF NDF NODDC MOVR #CMD+2,CMD(R5) ;SET UP POINTER FOR FILENAME CLR @CMD(R5) ;CLEAR OUT 1ST WORD MOV #FILEMG,R1 ;REQUEST FILE NAME FROM USER 3$: MOVB (R1)+,R0 BEQ 2$ .TTYOUT BR 3$ 2$: MOVR #.CURRN,CURREN(R5) ;INITIALIZE WORK BUFFER BIC #7575,SWITCH(R5) ;INITIALIZE SWITCH SETTINGS BIS #40200,SWITCH(R5) CLR FSIZE(R5) CLR SW2(R5) ;CLEAR ALL OPTION SWITCHES 6$: .TTYIN ;GET FILE NAME .IF NDF NODDC TSTB DDCMP(R5) ;DID WE ENTER DDCMP? BNE 8$ ;YES: PROCESS IT .ENDC ;.IF NDF NODDC MOVB R0,@CMD(R5) INC CMD(R5) CMPB R0,#12 BNE 6$ MOVR #CMD+2,R1 ;GET ADDRESS OF USER'S RESPONSE CMPB (R1),#15 ;CR ONLY TYPED? BEQ START ;YES: JUST IGNORE IT THEN CMPB (R1),#'@ ;FIRST CHAR AN "@"? (INDIRECT COMMAND) BEQ BEGIN2 ;YES .IF NDF NOEDIT MOVR #INFIL+2,R4 ;GET FILENAME AND PUT IT HERE (INFIL) BICB #10,SWITCH+1(R5) ;ASSUME 'BLOCK ON' MODE CALL GETNM ;GET NAME NOW BR BEGIN4 ;ERROR: TELL USER MOV INFIL(R5),R4 ;SETUP ALL DEFAULT DEVICE NAMES AND UNIT NBRS MOV R4,DEV(R5) MOV R4,OUTFIL(R5) MOV R4,FLTMP(R5) MOV R4,BAKFIL(R5) MOV R4,TMPFIL(R5) BITB #10,SWITCH+1(R5) ;LINE MODE REQUESTED? BEQ 5$ ;NO 4$: BIC #200,SWITCH(R5) ;YES: SO SET IT NOW 1$: JMP EDITOR ;START UP EDITOR PORTION 5$: CALL TSTPG ;IS IT ILLEGAL TO GET TO PAGE MODE? BR 4$ ;YES: GO TO LINE MODE THEN BR 1$ ;OK TO STAY IN PAGE MODE .ENDC ;.IF NDF NOEDIT ; BEGIN4: .PRINT #SYNTAX ;SYNTAX ERROR, TELL USER BR START ;ASK FOR NAME AGAIN ; ; PROCESS "@" SYSTEM COMMAND ; BEGIN2: MOVR #CMD+3,CWDS(R5) ;GET CONTROL WORD CALL GETCOM MOVR #CWD,ARG1(R5) ;GET ADDRESS OF INDIRECT COMMAND MOV #ATCMD,ARG2(R5) ;TABLE OF COMMANDS CLR R0 1$: JSR R0,SCAN ;CLEAR TABLE ENTRY COUNTER BR .+4 ;NO MATCH BR IFOUND ;END OF STRING 1 (CONSIDER THIS A MATCH) MOV ARG2(R5),R1 ;END OF STRING 2 (NO POSSIBLE MATCH) 2$: CMPB (R1)+,#15 ;FIND START OF NEW STRING BNE 2$ MOV R1,ARG2(R5) ;START OF NEW STRING TO CAN INC R0 CMP R0,#SIZEAT ;END OF TABLE? BNE 1$ ;NO: CONTINUE ILLCOM: .PRINT #MSG7 ;ILLEGAL COMMAND RSTRET: JMP START ;RESTART EDITOR ; IFOUND: ASL R0 ;CONVERT TO A WORD OFFSET JMP @ATVT(R0) ;DISPATCH TO CORRECT ROUTINE ; .SBTTL SEND COMMAND ; ; SEND COMMAND ; SEND: MOV CWDS(R5),R1 ;POINT TO ARG CALL TESTCR ;ANY STRING? JMP BEGIN4 ;NO: NULL STRING IS ILLEGAL TSTB BACKGD ;BACKGROUND HAVE ANYONE THERE? BEQ 2$ ;NO: ILLEGAL COMMAND THEN MOV R1,R0 ;SAVE FOR LATER MOVB #12,-(R1) ;PREFIX WITH MOVB #15,-(R1) ;FIX UP 1$: CMPB (R0)+,#12 ;SEARCH FOR BNE 1$ ;KEEP IT UP CLRB @R0 ;FORCE NULL AFTER MESSAGE CALL SPLICE ;SEND IT TO THE BACKGROUND BR RSTRET ;ASK "FILE:" AGAIN 2$: .PRINT #NOBGD ;NOTIFY USER OF NO BACKGROUND STRT: BR RSTRET SENDIL: JMP BEGIN4 ; .SBTTL EXIT SYSTEM COMMAND ; ; EXIT TO BACKGROUND ; EXITBK: MOVB #1,TEMP(R5) ;SET SWITCH FOR MESSAGES MOV #1,QUIT(R5) ;ALSO SET FLAG FOR ^C OR ^P TSTB FG ;IN FGD? BNE 4$ ;YES .IF NDF NOEDIT MOV #NUSERS,R0 ;MAKE USERS ALL USERS ARE FINISHED EDITING MOV #USER1,R1 7$: TSTB GO(R1) ;THIS GUY EDITING? BEQ 6$ ;NO: OK SO FAR .PRINT #OTHED ;YES: OTHERS ARE STILL EDITING. BR EXIT2 6$: ADD #USIZE,R1 ;LOOK AT NEXT USER DEC R0 ;ALL DONE? BNE 7$ ;NO: CONTINUE .ENDC ;.IF NDF NOEDIT MOV KBVEC,@#60 ;RESTORE KEYBOARD AND PRINTER VECTORS MOV TTVEC,@#64 .EXIT ;NO: THEN EXIT 4$: TSTB BACKGD ;SEE IF BGD IS AVAILABLE BEQ 1$ ;OK: CONNECT USER UP TSTB TEMP(R5) ;SHOULD WE SEND THE MESSAGE? BEQ 5$ ;NO - SKIP AROUND IT .PRINT #BGDUSE ;PRINT INUSE MESSAGE .IF NDF NOBMSG MOV #WEWANT,R1 ;POINT TO THE MESSAGE CALL SPLICE ;SPLICE TO THE BACKGROUND USER .ENDC ;.IF NDF NOBMSG CLRB TEMP(R5) ;RESET MESSAGE FLAG 5$: CALL WAIT ;SKIP AROUND THE QUEUE TST QUIT(R5) ;TIME TO GO AWAY? BNE 4$ ;NO - SEE IF USER HAS LEFT THE BACKGROUND BR EXIT2 ;EXIT FROM THIS LOOP TO LETTER 1$: TSTB TEMP(R5) ;DID WE HAVE TO WAIT FOR BGD? BNE 2$ ;NO .PRINT #BELL ;YES: WAKE UP USER WITH SOME BELLS 2$: CALL TTWAIT ;WAIT FOR ALL TTY OUTPUT TO FINISH MOV @#54,R0 ;GET ADDRESS OF RMON TERMINAL DEVICE ADD #304,R0 ; ADDRESSES. MOV TKS(R5),(R0)+ ;SWITCH TTY FROM FGD TO BGD NOW MOV TKB(R5),(R0)+ MOV TPS(R5),(R0)+ MOV TPB(R5),(R0)+ MOV TTYVEC(R5),R2 MOV KBVEC,(R2) ;NOW SETUP THE VECTORS SO TTY CAN BE MOV TTVEC,4(R2) ; USED IN THE BGD. .MTPS #240 ;RAISE TO LEVEL 4 TEMPORARILY SUB #6,R0 ;OK, NOW ECHO TWO ^C'S TO GET BGD GOING MOV (R0),R2 ;SAVE KBBUF POINTER TEMPORARILY MOV #CONTC,(R0) ;POINT TO ^C NOW AS KBBUF CLR -(SP) ;SIMULATE INTERRUPT AND RETURN AT LEVEL 0 JSR PC,@KBVEC ;CALL KEYBOARD INTERRUPT HANDLER IN RT-11 CLR -(SP) ;ONE MORE JSR PC,@KBVEC MOV R2,(R0) ;RESTORE KBBUF VECTOR EXIT0: MOV CROUT(R5),$DBLK+6(R5) ;SETUP TO RESTART WHEN BGD TELLS US ; WE CAN. (THIS AND THE NEXT 5 INSTRUCTIONS ; ARE AN EXPANDED .RCVDC.) MOV CURREN(R5),R2 MOV R2,$DBLK+2(R5) CLR (R2)+ CLR (R2) MOV #1,$DBLK+4(R5) MOVR #$CHAN,R0 MOV #26*400+0,(R0) INCB IOCOMP(R5) ;INDICATE I/O COMPLETION ROUTINE ACTIVE INCB BACKGD ;INDICATE BACKGROUND IN USE NOW EMT 375 EXIT1: .WAIT ;OK THE BGD IS ALL SETUP AND NO LONGER ; AVAILABLE FOR FGD USE FOR THIS USER. TSTB IOCOMP(R5) ;WERE WE STARTED FROM "FLET"? BNE EXIT1 ;NO: WAIT TILL WE ARE THEN CMP (R2),#"GO ;DID BGD SEND "GO" MESSAGE? BNE EXIT0 ;NO: SPURIOUS MESSAGE, REQUEST ANOTHER CLRB BACKGD ;FREE UP BACKGROUND IN USE INDICATOR MOV TTYVEC(R5),R2 ;RESET TERMINAL VECTORS MOV TTYIN(R5),(R2) MOV TTYOUT(R5),4(R2) EXIT2: JMP START ;RESTART USER WHEN HE RE-CONNECTS .SBTTL TEST FOR CR, FF, OR THE CATENATION CHARACTER ; ; CALLING SEQUENCE: ; R1 POINTS TO CHAR TO TEST ; CALL TESTCR ; JMP YES ;CR, FF, OR CATEN CHAR FOUND ; TESTCR: CMPB (R1),#15 ;CR? BEQ 1$ ;YES CMPB (R1),#14 ;FF? BEQ 1$ ;YES CMPB (R1),CATEN(R5) ;CATENATION CHARACTER? BEQ 1$ ADD #4,(SP) ;NO: USE ALTERNATE RETURN 1$: RETURN ;RETURN TO CALLER ; .SBTTL SAVE/RESTORE GENERAL PURPOSE(GP) REGISTERS ; ; CALLING SEQUENCE: ; ; JSR R0,SAVER ;TO SAVE R0-R4 ; JSR R0,RESTOR ;TO RESTORE R0-R4 ; SAVER: PUSH R1 ;R0 ALREADY ON STACK FROM CALL PUSH R2 PUSH R3 PUSH R4 MOV R0,PC ;RETURN TO CALLER ; RESTOR: TST (SP)+ ;JUNK CALLERS R0 POP R4 ;RESTORE REGISTERS NOW POP R3 POP R2 POP R1 RTS R0 ;RESTORE R0 AND RETURN TO CALLER ; .SBTTL GET CONTROL WORD ; ;ROUTINE TO PUT CONTROL WORD INTO CWD ARRAY ; GETCOM: MOV CWDS(R5),R1 ;POINTER IS IN CWDS MOVR #CWD,R2 ;RESULTANT ARGUMENT ARRAY MOV #12.,R3 2$: CMPB (R1),#40 BEQ 3$ ;SPACE CMPB (R1),#100 ;ANY CHAR OTHER THAN A LETTER IS BLE 4$ ; CONSIDERED A TERMINAL NOW. CMPB (R1),#132 BGT 4$ MOVB (R1)+,(R2)+ ;SAVE CHAR DEC R3 ;12 YET? BGE 2$ ;NO: CONTINUE .IF NDF NOEDIT JMP ILLCD ;ILLEGAL COMMAND .ENDC ;.IF NDF NOEDIT .IF DF NOEDIT .PRINT #MSG7 JMP START .ENDC ;.IF DF NOEDIT 3$: TSTB (R1)+ ;BUMP PAST SPACE 4$: DEC R3 ;PAD NAME WITH ZEROS BMI 6$ ;ALL DONE CLRB (R2)+ BR 4$ ;DO ANOTHER 6$: MOV R1,CWDS(R5) ;NEW CWDS POINTER RETURN ;RETURN .SBTTL GET NUMERIC ; ;ROUTINE TO INPUT A NUMBER AND LEAVE RESULT IN R1 ; GETNUM: CLR R4 ;ZERO RESULTS REGISTER CLR TEMP1(R5) ;SIGN STORAGE (ASSUME POS. AS DEFAULT) PUSH R0 ;SAVE R0 TEMP. MOV CWDS(R5),R0 ;SETUP POINTER MOV #6,R3 ;MAX OF 5 DIGITS 7$: MOVB (R0)+,R2 ;GET A CHAR CMPB R2,#'- ;MINUS SIGN? BNE 2$ ;NO COM TEMP1(R5) ;SET SIGN BIT NEG. BR 7$ ;GET NEXT CHAR 2$: CMPB R2,#'+ ;IGNORE (+) SIGN BEQ 7$ CMPB R2,#'* ;ASTERISK MEANS 77777(8) BNE 14$ MOV #77777,R4 ;ASTERISK FOUND, SET = 77777 BR 7$ 14$: CMPB R2,CATEN(R5) ;LOOK FOR CATENATION CHAR BEQ 1$ ;YES CMPB R2,#'< ;LOOK FOR "<" BEQ 17$ ;YES: MUST BE IN COMMAND MODE THEN CMPB R2,#60 ;TEST A LEGAL DIGIT BGE 3$ 4$: CMPB R2,#15 ;LOOK FOR CR BNE 6$ ;NO 1$: DEC R0 ;YES: BACK UP POINTER AND STAY ON TERMINATOR BR 5$ 6$: CMPB R2,#40 ;ALSO COULD BE A SPACE OR COMMA BEQ 5$ CMPB R2,#54 BEQ 5$ .IF NDF NOEDIT BIT #20,SW2(R5) ;ARE WE PROCESSING A MACRO? BEQ 12$ ;NO: ILLEGAL CHAR THEN CMPB R2,#'% ;IF "%" IS FOUND, SUBSTITUTE THE BNE 12$ ; CURRENT VALUE OF THE NUMERIC ; GIVEN IN THE MACRO CALL. TST NARG(R5) ;ERROR IF ARG IS UNDEFINED. BNE 13$ .PRINT #NERROR ;MACRO NUMERIC UNDEFINED CMP (SP)+,(SP)+ ;CLEAN UP STACK JMP REDIT 13$: ADD NARG(R5),R4 ;ADD NUMERIC IN WITH PREVIOUS NUMBER BR 7$ 12$: CMP (SP)+,(SP)+ ;UPDATE STACK JMP PRT0 ;ILLEGAL DIGIT .ENDC 3$: CMPB R2,#100 ;IF NEXT CHAR IS A LETTER, WE MUST BLE 10$ ; BE IN COMMAND MODE. CMPB R2,#132 BGT 10$ 17$: BIT #10,SW2(R5) BNE 11$ ;WE ARE 10$: CMPB R2,#71 ;TEST UPPER LIMIT NOW BGT 4$ ;ILLEGAL DIGIT BIC #177760,R2 ;SAVE ONLY 4 BITS MOV R4,-(SP) ;SAVE ON STACK TEMP ASL R4 ;RESULT*2 ASL R4 ;*4 ADD (SP)+,R4 ;*5 ASL R4 ;*10 ADD R2,R4 ;+ NEW DIGIT DEC R3 ;6 DIGITS YES? BNE 7$ ;NO: CONTINUE BR 6$ ;ILLEGAL NBR OF DIGITS 5$: MOV R0,CWDS(R5) ;SAVE CURRENT STRING POSITION POP R0 ;RESTORE R0 MOV R4,(SP) ;NEW RESULT MOV R4,R2 ;RETURN RESULT IN R2 ALSO BGT 8$ INC (SP) ;MAP A ZERO INTO A ONE IN THIS CASE 8$: TST TEMP1(R5) ;TEST SIGN BEQ 9$ NEG (SP) ;NEGATE NUMBER 9$: BIC #10,SW2(R5) ;CLEAR COMMAND MODE ID TST (SP) ;SET CONDITION CODES BEFORE EXITING RTS R1 ;RETURN 11$: TSTB -(R0) ;BACKUP STRING POINTER BY ONE BR 5$ ;NOW SAVE IT .SBTTL CONVERT OCTAL TO DECIMAL ; ; ROUTINE TO CONVERT OCTAL TO DECIMAL ; ; CALL: ; MOV #NBR,R0 ; MOVR #RESULT,R1 ; CALL OCTDEC ; OCTDEC: PUSH #5 ;5 DECIMAL DIGITS TO GENERATE PUSH #DECIML ;TABLE OF POWERS OF TEN 3$: CLR -(SP) ;(WORK SPACE) 1$: CMP @2(SP),R0 ;GENERATE DECIMAL DIGIT BHI 2$ SUB @2(SP),R0 INC (SP) TST R0 ;IF ZERO, QUIT NOW BEQ 2$ BR 1$ ;CONTINUE ; 2$: ADD #60,(SP) ;MAKE IT AN ASCII DIGIT MOVB (SP)+,(R1)+ ;SAVE GENERATED DIGIT ADD #2,(SP) ;POINTS TO NEXT POWER OF TEN DEC 2(SP) ;ALL 5 GENERATED? BGT 3$ ;NO: CONTINUE CMP (SP)+,(SP)+ ;CLEAN UP STACK RETURN ;RETURN TO CALLER ; DECIML: 10000. ;TABLE OF POWERS OF TEN 1000. 100. 10. 1. ; .SBTTL GET FILE NAME ; ;ROUTINE TO GET FILE NAME ; ; ; CALL: ; MOVR #ADDRESS OF RESULT AREA TO R4 ; CALL GETNM ;TO GET FILENAME FROM (R1) ; ERROR RETURN ; NORMAL RETURN ; GETNM: CLR FNAME(R5) ;CLEAR OUT TEMP STORAGE CLR FNAME+2(R5) CLR FNAME+4(R5) CLR FNAME+6(R5) CLR FNAME+10(R5) MOV DEV(R5),-2(R4) ;SETUP DEFAULT DEVICE PUSH R1 ;SAVE R1 11$: CMPB (R1),#12 ;LOOK FOR LINE TERMINATOR OR ":" BEQ 12$ ;YES CMPB (R1),#14 ;NO: TRY FF BEQ 12$ ;YES CMPB (R1)+,#': ;NO: HOW ABOUT A COLON? BNE 11$ ;NO: KEEP LOOKING MOV (SP),R2 ;COLON FOUND: CALCULATE HOW MANY CHARS WERE SUB R1,R2 ; SCANNED. CMP R2,#4 ;CANNOT BE > 4 BGT GETNM3 ;IT WAS: USE ERROR RETURN POP R0 ;CONVERT DEV+UNIT TO RAD50 CALL RADPK BR GETNM3 ;ILLEGAL CHARACTER ENCOUNTERED MOV R0,-2(R4) ;SAVE RESULT BR GETNM1 12$: POP R1 ;RESTORE ORIGINAL POINTER GETNM1: MOV #6,R0 ;6 CHARS TO FILE NAME (3 FOR EXT) MOVR #FNAME,R2 ;WHERE RESULT WILL TEMP END UP 1$: MOVB (R1)+,(R2)+ ;GET A CHARACTER BNE 10$ DEC R2 ;IGNORE NULLS 10$: CMPB (R1),#15 ;CR TERMINATES LINE BEQ 2$ CMPB (R1),CATEN(R5) ;CATENATION CHAR TERMINATES NAME BEQ 2$ CMPB (R1),#'/ ;SLASH TERMINATES NAME ALSO BEQ 2$ CMPB (R1),#'[ ;LEFT BRACKET TERMINATES NAME ALSO BEQ 2$ CMPB (R1),#'. ;PERIOD TERMINATES NAME BEQ 3$ DEC R0 ;DONE 6 YET? (OR 3 IF EXT) BGT 1$ ;NO: CONTINUE CMPB (R1),#15 ;NEXT CHAR A TERMINATOR? BEQ 2$ ;YES CMPB (R1),CATEN(R5) ;COULD ALSO BE A CATENATION CHAR BEQ 2$ CMPB (R1),#'. ;MIGHT ALSO BE A PERIOD BNE GETNM3 ;SYNTAX ERROR 3$: MOV #3,R0 ;GET EXTENSION NOW MOVR #FNAME+6,R2 ;RESET POINTER TSTB (R1)+ ;BUMP PAST PERIOD BR 1$ ;GET EXTENSION NOW 2$: .RADPK #FNAME ;CONVERT NAME TO RADIX 50 BR GETNM3 ;ERROR RETURN MOV R0,(R4)+ BEQ GETNM3 ;NULL FILE NAME IS ILLEGAL .RADPK #FNAME+3 BR GETNM3 ;ERROR RETURN MOV R0,(R4)+ .RADPK #FNAME+6 ;AND THE EXTENSION BR GETNM3 ;ERROR RETURN MOV R0,(R4)+ CLR R0 ;GET FILE SIZE IF GIVEN BY USER CMPB (R1),#'[ ;LEFT BRACKET TERMINATES NAME BNE 5$ INC R1 ;YES: BUMP PAST "[" 6$: CMPB (R1),#15 ;CR, ], OR THE CONCATENATION CHARACTER BEQ 5$ ; TERMINATES SIZE. CMPB (R1),CATEN(R5) BEQ 5$ CMPB (R1),#'] BNE 9$ INC R1 ;] FOUND, BUMP PAST IT BR 5$ 9$: PUSH R0 ;MULTIPLY # BY 10 ASL R0 ;*2 ASL R0 ;*4 ADD (SP)+,R0 ;*5 ASL R0 ;*10 CLR -(SP) ;ADD IN NEW DIGIT MOVB (R1)+,(SP) CMPB (SP),#'0 ;MUST BE A DIGIT BLT 7$ CMPB (SP),#'9 BGT 7$ BIC #177760,(SP) ;REMOVE UNWANTED BITS ADD (SP)+,R0 BR 6$ ;GET NEXT DIGIT 7$: TST (SP)+ ;CLEAN UP STACK BR GETNM3 ;ILLEGAL # GIVEN 5$: CMPB (R1),#'/ ;SLASH FOLLOW? BNE GETNM2 ;NO: INC R1 ;YES: BUMP PAST "/" CMPB (R1)+,#'L ;/L? BNE GETNM2 ;NO: IGNORE ALL BUT "L" BISB #10,SWITCH+1(R5) ;SET LINE MODE SWITCH GETNM2: MOV R0,FSIZE(R5) ;SAVE SIZE ADD #2,(SP) ;SHOW SUCCESSFUL RETURN GETNM3: RETURN ;RETURN .SBTTL RAD50 CONVERSION ROUTINE ; ; CALLING SEQUENCE: ; ; MOVR #FNAME,R0 ; CALL RADPK ; RETURN HERE ON ILLEGAL CHARACTER FOUND ; RESULT RETURNED IN R0 ; RADPK: PUSH R1 ;SAVE SOME REGISTERS PUSH R2 PUSH R3 CLR R3 ;WHERE RESULT WILL BE ACCUMULATED MOV #3,R2 ;3 CHARACTERS TO CONVERT 2$: MOVB (R0)+,R1 ;GET NEXT CHARACTER CMPB R1,#'A BGE 3$ ;COULD BE LETTER A THRU Z CMPB R1,#'0 BGE 4$ ;COULD BE A DIGIT 0 THRU 9 7$: CMPB R1,#': ;COULD BE A COLON BEQ 5$ ;YES TST R1 ;NULL CHAR IS ONLY LEGAL CHAR NOW BEQ 14$ BR 1$ ;ILLEGAL FILE NAME GIVEN 5$: DEC R0 ;BACK UP TO : CLR R1 ;ASSUME A NULL BR 14$ 3$: CMPB R1,#'Z ;LETTER TEST (HIGH END) BGT 1$ ;ILLEGAL CHAR BR 9$ 4$: CMPB R1,#'9 ;DIGIT TEST (HIGH END) BGT 7$ BR 6$ 9$: SUB #56,R1 6$: SUB #22,R1 14$: PUSH R3 ;MULTIPLY BY 50(8) ASL R3 ;*2 ASL R3 ;*4 ADD (SP)+,R3 ;*5 ASL R3 ;*12 ASL R3 ;*24 ASL R3 ;*50 ADD R1,R3 ;ADD IN NEW DIGIT DEC R2 ;3 CHARACTERS SQUOZED YET? BGT 2$ ;NO: CONTINUE MOV R3,R0 ;RETURN ANSWER IN R0 ADD #2,6(SP) ;SHOW SUCCESS RETURN 1$: POP R3 ;RESTORE R3, R2, AND R1 POP R2 POP R1 RETURN ;RETURN TO CALLER ; .SBTTL CHARACTER SCAN ROUTINE ; ; ;ATTEMPT TO MATCH TWO CHARACTER STRINGS ;CALL SEQUENCE: ; JSR R0,SCAN ;SUBR. CALL ; (OR) JSR R0,SCANCH ;FOR CHANGE/LC/PASTE/SEARCH COMMANDS ; ADDRESS OF STRING TO SEARCH FOR IN ARG1(R5) ; ADDRESS OF STRING WHERE SEARCH IS TO BE PERFORMED IN ARG2(R5) ; RETURN IF STRING NOT FOUND ; RETURN IF END OF STRING 1 FOUND ; RETURN IF END OF STRING 2 FOUND ;ROUTINE USES REGISTERS R1 AND R2 (R0 PERSERVED ON STACK) ; SCANCH: BIS #10000,SW2(R5) ;INDICATE CHANGE/LC/PASTE/SEARCH CALLED BR SCAN1 SCAN: BIC #10000,SW2(R5) ;INDICATE CHANGE/LC/PASTE/SEARCH NO CALLING SCAN1: MOV ARG1(R5),R1 ;GET STRING POINTER MOV ARG2(R5),R2 1$: CALL 10$ ;TEST END OF STRING 1 FOUND CALL 30$ ;TEST FOR "..." CONSTRUCTION BR 2$ ;"..." FOUND CALL 20$ ;TEST END OF STRING 2 FOUND CMPB (R1)+,(R2)+ ;TEST CHARACTER MATCH BEQ 1$ ;YES: CONT. TILL A STRING IS EXHAUSTED RTS R0 ;EXIT SCAN - NO MATCH FOUND 2$: CALL 10$ ;TEST END OF STRING 1 CALL 20$ ;TEST END OF STRING 2 CMPB (R1),(R2)+ ;TEST CHARACTER MATCH BNE 2$ ;NO: CONTINUE LOOKING MOV R1,TEMP4(R5) ;SAVE STRING 1 POINTER INC R1 MOV R2,TEMP2(R5) ;SAVE STRING 2 POINTER 3$: CALL 10$ ;TEST END OF STRING 1 CALL 30$ ;TEST FOR "..." CONSTRUCTION BR 2$ ;"..." FOUND CALL 20$ ;TEST END OF STRING 2 CMPB (R1)+,(R2)+ ;TEST FOR CHAR MATCH BEQ 3$ ;YES: KEEP LOOKING MOV TEMP4(R5),R1 ;NO: RESTORE R1 AND R2 MOV TEMP2(R5),R2 BR 2$ ;TRY AGAIN ; ; 10$: BIT #10000,SW2(R5) ;CHANGE/LC/PASTE/SEARCH CALL? BNE 50$ ;YES: CHECK QUOTE CHARACTER THEN TSTB (R1) ;TEST END OF STRING 1 FOUND BEQ 4$ ;YES BR 60$ 50$: CMPB (R1),QUOTE(R5) ;QUOTE CHARACTER FOUND? BEQ 4$ ;YES 60$: CMPB (R1),#15 BEQ 4$ ;YES CMPB (R1),#14 BEQ 4$ ;YES CMPB (R1),CATEN(R5) BEQ 4$ ;YES RETURN ;NO MATCH 4$: TST (R0)+ ;BUMP EXIT BR 6$ ;MATCH ON STRING 1 ; ; 20$: CMPB (R2),#15 ;TEST END OF STRING 2 FOUND BEQ 5$ ;YES CMPB (R2),#14 BEQ 5$ ;YES RETURN ;NO MATCH: RETURN 5$: CMP (R0)+,(R0)+ ;MATCH ON STRING 2 6$: TST (SP)+ ;CLEAN UP STACK RTS R0 ;RETURN TO CALLER ; ; 30$: CMPB (R1),#'. ;TEST FOR "..." CONSTRUCTION BNE 7$ ;NO CMPB 1(R1),#'. ;MUST HAVE 3 IN A ROW BNE 7$ CMPB 2(R1),#'. BNE 7$ 8$: CMPB (R1)+,#'. ;"..." CONSTRUCTION RECOGNIZED, NOW BEQ 8$ ; BYPASS ALL PERIODS. DEC R1 RETURN ;RETURN: (MATCH) 7$: ADD #2,(SP) ;USE NO MATCH RETURN RETURN ; .END .SBTTL MESSAGES AND COMMANDS SECTION .TITLE REMOTE V01-X03 .NLIST TTM,ME .CSECT REMMSG EDIT=003. ; ; ; PDP-11 RT-11 MULTI-USER LINE TEXT EDITOR AND DOWN LINE LOADER ; ; PROGRAM NAME: LETTER / REMOTE-11 ; ; MESSAGES AND COMMANDS SECTION: VERSION LEVEL V01-X03: PATCH LEVEL A ; ; AUTHOR: RICK HULLY ; ; DATE: SEP., 1975 ; ; ; COPYRIGHT (C) 1975 ; ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- ; SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER ; COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE ; TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO ; AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE ; SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; .SBTTL CONDITIONAL ASSEMBLY PARAMETERS ; ; THE FOLLOWING CONDITIONAL ASSEMBLY PARAMETERS PERTAIN TO THIS ; SECTION. ; ; NO CONDITIONALS SPECIFIED YIELDS: ; EDITOR FUNCTIONS ; DUPLICATE AND SEARCH COMMANDS SUPPORTED ; REMOTE FUNCTIONS FOR DOWN-LINE LOADING OF PROGRAMS ; MACRO SUPPORT IN THE EDITOR ; ; IF DEFINED "NOEDIT", THE EDITOR FUNCTIONS ARE REMOVED. ; ; IF DEFINED "NODUPS", THE "SEARCH" AND "DUPLICATE" ; COMMANDS ARE REMOVED. ; ; IF DEFINED "NODDC", THE REMOTE DOWN LINE LOADING FUNCTIONS ; ARE REMOVED. ; ; IF DEFINED "NOMAC", THE MACRO SUPPORT IN THE EDITOR IS ; REMOVED. ; .SBTTL MACRO DEFINITIONS ; .MACRO .DEFINE,NAME .GLOBL NAME NAME .ENDM .DEFINE ; .SBTTL MESSAGES ; .GLOBL MSG0,MSG7,SYNTAX,FILEMG,BGDUSE,NOBGD .GLOBL WEWANT,BELL,DEVERR,NODEV,NOTRES,SWAPER,DIRERR .GLOBL FILENF ; .IF NDF NOEDIT .GLOBL MSG1,MSG2,MSG3,MSG8,MSG10,MSG11,MSG12 .GLOBL MSG13,MSG15,MSG16,MSG18,EXITMG,FERR1 .GLOBL ILLSTR,REOPEN,SECOND,NOFIL,SECNOT,ILLNAM .GLOBL ILLPAG,CATENM,ILLSAV,OUTDSK,ILLBLK,ILLOFF .GLOBL NOLINE,NOROOM,NFULL,ILLNM,OFILE,EDITED .GLOBL ILLCHR,OTHED,NOXIT,NOPG,NERROR ; .IF NDF NOMAC .GLOBL MACERR .ENDC ;.IF NDF NOMAC .ENDC ;.IF NDF NOEDIT ; .IF NDF NODDC .GLOBL FILENF,CKERR,ILLLDA,NOREM,LOADER .GLOBL NOADDR,LOADED,SECNAM,SECEND .ENDC ;.IF NDF NODDC ; .NLIST BEX MSG0: .ASCII "REMOTE V01-X" .BYTE +60,-+60 .BYTE -+60,'A,0 MSG7: .ASCIZ /[ILL CMD]/ SYNTAX: .ASCIZ /[SYNTAX ERROR]/ FILEMG: .ASCIZ /FILE: / BGDUSE: .ASCIZ /[WAITING...]/ NOBGD: .ASCIZ /[NO BACKGROUND]/ WEWANT: .ASCII <15><12><7><7><7>/[BACKGROUND REQUIRED!]/ BELL: .ASCIZ <7><7><7><15><12> DEVERR: .ASCIZ /[DEVICE ERROR]/ NODEV: .ASCIZ /[NO DEV]/ NOTRES: .ASCIZ /[DEV NOT LOADED]/ SWAPER: .ASCIZ /[SWAP ERROR]/ DIRERR: .ASCIZ /[DIRECTORY ERROR]/ FILENF: .ASCIZ /[FILE DOES NOT EXIST]/ .IF NDF NOEDIT MSG1: .ASCIZ /[ILL STRING CONST]/ MSG2: .ASCIZ /[LINE DELETED]/ .EVEN MSG3: .WORD 0 MSG8: .ASCIZ /[TOO MANY CHARS]/ MSG10: .ASCIZ /[ILL NUM]/ MSG11: .ASCIZ /[*EOB*]/ MSG12: .ASCIZ /[*BOB*]/ MSG13: .ASCIZ /[*EOF*]/ MSG15: .ASCIZ /[BUFFER EXCEEDED BY]/ MSG16: .ASCIZ /[NO FILE OPEN]/ MSG18: .ASCIZ /[CREATING NEW FILE]/<15><12>/INPUT/ EXITMG: .ASCIZ /[EXIT]/ FERR1: .ASCII /[BACKUP FILE CANNOT BE EDITED BECAUSE/ .ASCII / FILENAME "XXXXXX.NEW"]/<15><12> .ASCII /[IS CURRENTLY IN USE. RENAME BACKUP FILE/ .ASCIZ / OR "XXXXXX.NEW"]/ ILLSTR: .ASCIZ /[NO MATCH]/ REOPEN: .ASCIZ /[REOPENING FILE]/ SECOND: .ASCIZ /[SECONDARY FILE ALREADY OPEN]/ NOFIL: .ASCIZ /[ILL NAME OR SECONDARY FILE NOT FOUND]/ SECNOT: .ASCIZ /[SECONDARY FILE CURRENTLY SELECTED FOR INPUT]/ ILLNAM: .ASCII /[ILL FILE NAME GIVEN IN CLOSE OR EXIT]/<15><12> .ASCIZ /[FILE WAS NOT RENAMED]/ ILLPAG: .ASCIZ /[ALREADY PASSED THAT PAGE!]/ CATENM: .ASCIZ /[CONCATENATING CHAR CHANGED TO "$"]/ ILLSAV: .ASCIZ /[ILL "SAVE" FILE NAME]/ OUTDSK: .ASCIZ /[FILE AREA ALLOCATED EXCEEDED, ORIGINAL FILE STILL OK]/ ILLBLK: .ASCIZ /[ILL IN BLOCK ON MODE]/ ILLOFF: .ASCIZ /[ILL IN BLOCK OFF MODE]/ NOLINE: .ASCIZ /[NO LINE OR NOT ENOUGH LINES IN BUFFER TO COMPLETE REQUEST]/ NOROOM: .ASCIZ /[NOT ENOUGH ROOM ON DEVICE FOR FILE SIZE REQUESTED]/ NFULL: .ASCIZ ?[BUFFER > 7/8 FULL]? ILLNM: .ASCIZ /[FILE NAME CURRENTLY IN USE BY SOMEONE ELSE]/ OFILE: .ASCIZ /[EDITED FILE IS NAMED "EDIT0N.TMP" WHERE "N" IS YOUR/ .ASCIZ / USER NUMBER]/ EDITED: .ASCII /[EDITED FILE IS IN "EDIT0N.TMP", RENAME IT IMMEDIATELY / .ASCIZ /OR IT WILL BE DELETED]/ ILLCHR: .ASCIZ /[ILL CHAR]/ OTHED: .ASCIZ /[OTHERS STILL EDITING]/ NOXIT: .ASCIZ /[USE "@EXIT"]/ NOPG: .ASCIZ /[NOT ENOUGH BUFFER ROOM FOR BLOCK-ON MODE]/ NERROR: .ASCIZ /[MACRO NUMERIC ARG UNDEFINED]/ .IF NDF NOMAC MACERR: .ASCIZ /[MACRO UNDEFINED]/ .ENDC ;IF NDF NOMAC .ENDC ;.IF NDF NOEDIT .IF NDF NODDC ILLLDA: .ASCIZ /[ILL FORMAT FOR LOAD MODULE]/ NOREM: .ASCIZ /[SATELLITE NOT CONNECTED HERE]/ LOADER: .ASCIZ /[LOAD ERROR]/ NOADDR: .ASCIZ /[NO ADDR]/ LOADED: .ASCIZ /[LOADED]/ SECNAM: .ASCII /R SECPR0/<15><12> SECEND: CKERR: .ASCIZ /[CHECKSUM ERROR]/ .ENDC .EVEN ; .SBTTL CONSTANTS ; .GLOBL CONTC,INTERV ; .IF NDF NOEDIT .GLOBL NEW,BAK NEW: .RAD50 /NEW/ ;NEW FILENAME EXTENSION FOR EDITING ; BACKUP FILE. BAK: .RAD50 /BAK/ ;BACKUP FILE EXTENSION .ENDC ;.IF NDF NOEDIT CONTC: .BYTE 3,0 ;ASCII ^C INTERV: .WORD 0,60 ;MARK TIME INTERVAL (1 SECOND) ; .SBTTL MACRO COMMANDS ; .IF NDF NOEDIT .GLOBL OLDMAC,TYPMAC,IMMAC ; OLDMAC: .ASCII /BL OFF/ .BYTE 33 .ASCII /T/ .BYTE 33 .ASCII /PAG%/ .BYTE 15,12 .EVEN ; TYPMAC: .ASCII /P%/ .BYTE 33 .ASCII /N/ .BYTE 33 .ASCII /N-%/ .BYTE 15,12 ; IMMAC: .ASCII /M1/ .BYTE 15,12 ; .SBTTL EDITING COMMANDS ; .GLOBL EDITCM,EDITVT,ENDVT,SIZEVT ; EDITCM: .ASCII /ADD/<15> ;A[DD] .ASCII /AP/<15> ;AP .ASCII /BEGIN/<15> ;B[EGIN] .ASCII /BLOCK/<15> ;BL[OCK] .ASCII /BOTTOM/<15> ;BO[TTOM] .ASCII /CHANGE/<15> ;C[HANGE] .ASCII /CLOSE/<15> ;CL[OSE] .ASCII /CLOSES/<15> ;CLOSES .ASCII /CC/<15> ;CC .ASCII /DELETE/<15> ;D[ELETE] .ASCII /DP/<15> ;DP .IF NDF NODUPS .ASCII /DUPLICATE/<15> ;DU[PLICATE] .ENDC ;.IF NDF NODUPS .ASCII /END/<15> ;E[ND] .ASCII /ERAS/<15> ;ER[AS] .ASCII /ERASE/<15> ;ERASE .ASCII /EXIT/<15> ;EX[IT] .ASCII /FIND/<15> ;F[IND] .ASCII /FILL/<15> ;FIL[L] .ASCII /FF/<15> ;FF .ASCII /INSERT/<15> ;I[NSERT] .ASCII /KIL/<15> ;K[IL] .ASCII /KILL/<15> ;KILL .ASCII /LOCATE/<15> ;L[OCATE] .ASCII /LC/<15> ;LC .ASCII /LIST/<15> ;LI[ST] .IF NDF NOMAC .ASCII /M/<15> ;M .ASCII /MACRO/<15> ;MA[CRO] .ENDC ;.IF NDF NOMAC .ASCII /NEXT/<15> ;N[EXT] .ASCII /NP/<15> ;NP .ASCII /OVERLAY/<15> ;O[VERLAY] .ASCII /OUTPUT/<15> ;OU[TPUT] .ASCII /OPENS/<15> ;OP[ENS] .ASCII /OLDPAGE/<15> ;OL[DPAGE] .ASCII /PRINT/<15> ;P[RINT] .ASCII /PASTE/<15> ;PA[STE] .ASCII /PAGE/<15> ;PAG[E] .ASCII /PFIND/<15> ;PF[IND] .ASCII /PLOCATE/<15> ;PL[OCATE] .ASCII /RETYPE/<15> ;R[ETYPE] .ASCII /READ/<15> ;REA[D] .ASCII /RENEW/<15> ;REN[EW] .IF NDF NODUPS .ASCII /SEARCH/<15> ;S[EARCH] .ENDC ;.IF NDF NODUPS .ASCII /SIZE/<15> ;SI[ZE] .ASCII /SAVE/<15> ;SA[VE] .ASCII /SP/<15> ;SP .ASCII /SS/<15> ;SS .ASCII /TOP/<15> ;T[OP] .ASCII /TOF/<15> ;TOF .ASCII /TYPE/<15> ;TY[PE] .ASCII /UN/<15> ;U[N] .ASCII /UNSAVE/<15> ;UNS[AVE] .ASCII /VERIFY/<15> ;V[ERIFY] .ASCII /VERSION/<15> ;VERS[ION] .ASCII /WRITE/<15> ;W[RITE] .EVEN .SBTTL EDITING COMMAND VECTORS ; EDITVT: .DEFINE ADDIT .DEFINE APPEND .DEFINE TOP .DEFINE BLOCK .DEFINE BOTTOM .DEFINE CHANGE .DEFINE CLOSE .DEFINE CLOSES .DEFINE CC .DEFINE DELETE .DEFINE DELETP .IF NDF NODUPS .DEFINE DUP .ENDC ;.IF NDF NODUPS .DEFINE BOTTOM .DEFINE ILLCD .DEFINE ERASE .DEFINE EXIT .DEFINE FIND .DEFINE FILL .DEFINE FF .DEFINE INSERT .DEFINE ILLCD .DEFINE KILL .DEFINE LOCATE .DEFINE LC .DEFINE LIST .IF NDF NOMAC .DEFINE MACRO .DEFINE MACROD .ENDC ;.IF NDF NOMAC .DEFINE NEXT .DEFINE NP .DEFINE OVER .DEFINE OUTSW .DEFINE OPENS .DEFINE OLDPAG .DEFINE PRINT .DEFINE PASTE .DEFINE PAGEC .DEFINE PFIND .DEFINE PLOCAT .DEFINE RETYPE .DEFINE READ .DEFINE RENEW .IF NDF NODUPS .DEFINE SEARCH .ENDC ;.IF NDF NODUPS .DEFINE SIZE .DEFINE SAVE .DEFINE SELP .DEFINE SELS .DEFINE TOP .DEFINE TOF .DEFINE TYPLIN .DEFINE ILLCD .DEFINE UNSAVE .DEFINE VERIFY .DEFINE VERSON .DEFINE WRITE ENDVT: SIZEVT = ENDVT-EDITVT/2 .ENDC ;.IF NDF NOEDIT .SBTTL INDIRECT COMMANDS AND VECTORS ; .GLOBL ATCMD,ATVT,EATVT,SIZEAT ; ATCMD: .ASCII <15> ;TABLE STARTER .ASCII /EXIT/<15> ;E[XIT] .IF NDF NODDC .ASCII /GET/<15> ;G[ET] .ASCII /RUN/<15> ;R[UN] .ASCII /REENTER/<15> ;RE[ENTER] .ASCII /START/<15> ;S[TART] .ENDC ;.IF NDF NODDC .ASCII /SEND/<15> ;SE[ND] .EVEN ; ATVT: .DEFINE ILLCOM .DEFINE EXITBK .IF NDF NODDC .DEFINE GET .DEFINE RUN .DEFINE REENTR .DEFINE STARTP .ENDC ;.IF NDF NODDC .DEFINE SEND EATVT: .LIST BEX SIZEAT = EATVT-ATVT/2 ; .END .SBTTL DOWN-LINE LOADING SECTION .TITLE REMOTE V01-X01 .NLIST TTM,ME .CSECT REMDDC EDIT=001. ; ; ; PDP-11 RT-11 MULTI-USER LINE TEXT EDITOR AND DOWN LINE LOADER ; ; PROGRAM NAME: LETTER / REMOTE-11 ; ; DOWN-LINE LOADING SECTION: VERSION LEVEL V01-X01: PATCH LEVEL A ; ; AUTHOR: RICK HULLY ; ; DATE: SEP., 1975 ; ; ; COPYRIGHT (C) 1975 ; ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- ; SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER ; COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE ; TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO ; AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE ; SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; .SBTTL PROGRAM DEFINITIONS ; R0 = %0 ;GENERAL REGISTERS R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 RETURN = 207 ;RETURN = RTS PC PS = -2 ;PROCESSOR STATUS WORD ; DLE = 220 ;DLE CHARACTER SYN = 377 ;SYNC CHARACTER (ASYNC) POLY = 120001 ;CRC-16 POLYNOMINAL DLECRC = 66000 ;DLE CRC CHARACTER VALUE SYNDLE = 110377 ;SYN AND DLE CHARACTERS SOFTVC = 150 ;SOFTWARE VECTORS WHICH MUST BE PROTECTED ; (LOCATIONS 150-167). ; .SBTTL CONDITIONAL ASSEMBLY PARAMETERS ; ; THE FOLLOWING CONDITIONAL ASSEMBLY PARAMETERS PERTAIN TO THIOS ; SECTION. ; ; NO CONDITIONALS SPECIFIED YIELDS: ; ; REMOTE FUNCTIONS FOR DOWN-LINE LOADING OF PROGRAMS ; ; IF DEFINED "NODDC", THE REMOTE FUNCTIONS ARE REMOVED. ; .IIF DF NODDC, .END .SBTTL GLOBALS ; .GLOBL CWDS,TESTCR,LOADPC,RUNGET,.CURRN,NOADDR .GLOBL STRT,DLVEC,NOREM,RSTRET,INFIL,GETNM,TESTDV .GLOBL ARG1,DIRERR,FILENF,INPTR,IBLKNM,TEMP,CKSUM .GLOBL BYTECT,LOADED,CKERR,DDCMP,TEMP1,TEMP2 .GLOBL LOADER,RELBLK,START,TTWAIT,DDCMPE,OUTBUF .GLOBL CTIME,DFLAG,DDCMPS,SECEND,USER1,CMD,USIZE .GLOBL CHAN,DDCMPI,GETCHN,OUTFIL,FSIZE,PUTLIN .GLOBL GETLIN,ERR,ILLLDA,DDCMPO,TTOPUT,DWAIT .GLOBL CALCRC,.PRNT,.IO,SECNAM,BEGIN4,STARTP,REENTR .GLOBL RUN,GET,OSOP,DDCMPP,RETRY,TTOTAB,TTYTAB,RUBCOM .SBTTL MACRO DEFINITIONS ; .MCALL ..V2.. ..V2.. .MCALL .SERR,.HERR ; .MACRO PUSH CELL MOV CELL,-(SP) .ENDM PUSH ; .MACRO POP CELL MOV (SP)+,CELL .ENDM POP ; .MACRO CALL ROUTINE JSR PC,ROUTINE .ENDM CALL ; .MACRO MOVR X,Y MOV X,Y ADD R5,Y .ENDM MOVR ; .MACRO .WAIT JSR PC,DWAIT .ENDM .WAIT ; .MACRO .LOOKUP .CHANNEL,.DEVBLK .IF NB .DEVBLK MOVR .DEVBLK,R0 .ENDC ;.IF NB .DEVBLK JSR PC,.IO .BYTE ^O<.CHANNEL> .BYTE 1 .ENDM .LOOKUP ; .MACRO .CLOSE .CHANNEL JSR PC,.IO .BYTE ^O<.CHANNEL> .BYTE 7 .ENDM .CLOSE ; .MACRO .PRINT .MESADDR .IF NB .MESADDR MOV .MESADDR,R0 .ENDC ;.IF NB .MSADDR JSR PC,.PRNT .ENDM .PRINT ; .SBTTL START AND REENTER SYSTEM COMMANDS ; ; START SYSTEM COMMAND ; .ENABL LSB STARTP: MOV CWDS(R5),R1 ;POINT TO ARG CALL TESTCR ;ANY STRING? JMP 3$ ;NO: DEFAULT THEN CLR R2 ;YES: ASSEMBLE IT AS AN OCTAL NBR 1$: MOVB (R1)+,R3 ;GET A DIGIT CMPB R3,#15 ;TERMINATOR? BEQ 2$ ;YES: NBR ASSEMBLED SUB #60,R3 ;LEGAL DIGIT? BLT SENDIL ;NO: PROTEST CMP R3,#7 ;HOW ABOUT HIGH SIDE? BGT SENDIL ;NO: PROTEST BIT #160000,R2 ;WILL WE HAVE OVERFLOW? BNE SENDIL ;YES: TOO BIG OF NBR ASL R2 ;NO: SHIFT ONE OCTAL DIGIT RIGHT THEN ASL R2 ASL R2 ADD R3,R2 ;ADD IN NEW DIGIT BR 1$ ;GET NEXT DIGIT 2$: MOV R2,LOADPC(R5) ;SAVE RESULT 3$: MOV LOADPC(R5),R0 ;IS THERE A START ADDRESS? BEQ 4$ ;NO: FORGET REQUEST THEN RENTR: MOVB #1,RUNGET(R5) ;INDICATE WE WANT TO RUN MOVR #.CURRN,R4 ;BUILD MESSAGE TO START UP REMOTE CLR (R4)+ ;WORD 0 HAS BYTE COUNT CLR (R4)+ ;PROGRAM LOAD WITH TRANSFER ADDRESS JMP STRTP ;SEND OUT START ADDRESS ; 4$: .PRINT #NOADDR ;TELL USER NO ADDRESS EXISTS JMP STRT SENDIL: JMP BEGIN4 ; ; REENTER SYSTEM COMMAND ; REENTR: MOV LOADPC(R5),R0 ;LOAD ADDRESS DEFINED? BEQ 4$ ;NO: FORGET IT THEN SUB #2,R0 ;YES: MAKE START ADDRESS = START ; ADDRESS -2. BR RENTR .DSABL LSB ; .SBTTL GET AND RUN SYSTEM COMMANDS ; ; GET AND RUN SYSTEM COMMANDS ; GET: CLRB RUNGET(R5) ;INDICATE "GET" REQUEST BR RUN1 RUN: MOVB #1,RUNGET(R5) ;INDICATE "RUN" REQUEST RUN1: INC ARG1(R5) ;SETUP TO LOOK AT 2ND CHARACTER OF COMMAND ; TO DETERMINE LATER IF JUST "R" OR ; "G" RATHER THAN "RUN" OR "GET" ; WAS TYPED. CLR LOADPC(R5) ;ASSUME NO LOAD ADDRESS SPECIFIED TST DLVEC(R5) ;MAKE SURE THERE IS A SATELLITE BNE 1$ ;OK .PRINT #NOREM ;NO: TELL USER BR 7$ ;RESTART THE EDITOR 3$: JMP BEGIN4 ;SYNTAX ERROR 1$: MOVR #INFIL+2,R4 ;GET FILE NAME AND PUT IT HERE (INFIL) MOV CWDS(R5),R1 ;FILE NAME IS IN HERE RIGHT NOW CALL GETNM BR 3$ ;SYNTAX ERROR .CLOSE 0 ;CLOSE CHANNEL IN CASE SOMEONE LEFT IT OPENED MOVR #INFIL,R0 ;MAKE SURE DEV EXISTS CALL TESTDV BR 7$ ;NO: RESTART EDITOR THEN .SERR ;CATCH MONITOR ERRORS ON LOOKUPS CMPB #'U,@ARG1(R5) ;WAS JUST "R" OR "G" TYPED? BEQ 6$ ;NO: RUN WAS TYPED: USE WHAT WAS GIVEN CMPB #'E,@ARG1(R5) ;HOW ABOUT "GET" BEQ 6$ ;YES: USE WHAT WE HAVE THEN TST INFIL+6(R5) ;YES: WAS EXTENSION GIVEN? BNE 6$ ;YES: FORGET IT THEN MOV (PC)+,R0 ;NO: USE .LDA THEN .RAD50 /LDA/ MOV R0,INFIL+6(R5) 6$: .LOOKUP 0,#INFIL ;SEE IF FILE EXISTS AND OPEN IT IF IT DOES BCC 2$ ;FILE FOUND MOVB @#52,R2 ;GET ERROR CODE .HERR ;LET MONITOR HANDLE BAD ERRORS NOW CMPB R2,#-3 ;DIRECTORY ERROR? BNE 4$ ;NO .PRINT #DIRERR ;YES: TELL USER BR 7$ ;RESTART EDITOR 4$: .PRINT #FILENF ;TELL USER THAT FILE WAS NOT FOUND 7$: JMP RSTRET ;RESART USER 2$: .HERR ;LET MONITOR HANDLE BAD ERRORS NOW MOVR #INPTR,R2 ;INITIALIZE INPUT BUFFER CLR (R2) CLR 2(R2) ;RESET EOF FLAG CLR IBLKNM(R5) ;BEGIN AT BLOCK #0 CLRB TEMP(R5) ;RESET RELATIVE BLOCK FOR OUTPUT NEXTBK: MOVR #.CURRN,R4 ;WHERE LOAD IMAGE WILL BE BUILT CLR (R4)+ ;WORD 0 HAS THE BYTE COUNT MOVB #2,(R4)+ ;ASSUME PROGRAM LOAD WITHOUT TRANSFER ADDRESS MOVB TEMP(R5),(R4)+ ;NOW THE RELATIVE BLOCK NBR OF THIS TRANSFER INCB TEMP(R5) ;FOR NEXT TIME 1$: CLR CKSUM(R5) ;ZERO CHECKSUM CALL GETB ;GET A BYTE DEC R3 ;CHECK FOR +1 (START OF BLOCK) BNE 1$ ;NO: CONTINUE LOOKING CALL GETB ;NEXT BYTE MUST BE =0 TST R3 BNE 1$ ;NO: KEEP LOOKING FOR A 1,0 PATTERN CALL GETW ;GET FULL BYTE COUNT SUB #4,R3 ;SUBTRACT 4 TO MAKE BYTE COUNT CORRECT CMP #2,R3 ;IF BYTE COUNT =6 (2+4) THEN END BLOCK HAS BEEN ; READ IN. BEQ 3$ ;YES: GET START ADDRESS IF GIVEN MOV R3,BYTECT(R5) ;SAVE BYTE COUNT OF LINE CALL GETW ;GET LOAD ADDRESS MOV R3,(R4)+ ;SAVE IN BUFFER (32 BIT ADDRESS) CLR (R4)+ ; LOW ADDRESS FIRST. 2$: CALL GETB ;GET A DATA BYTE BLT BEGIN1 ;IF NO MORE DATA REMAINS MOVB R3,(R4)+ ;STORE 8 BITS AT A TIME BR 2$ ;GET NEXT BYTE 3$: CALL GETW ;GET POSSIBLE TRANSFER ADDRESS MOV R3,R0 ;SAVE TILL LATER CALL GETB ;GET CHECKSUM TSTB CKSUM(R5) ;CHECKSUM ERROR BNE BEGN12 ;YES: TELL USER BIT #1,R0 ;CHECK FOR VALID TRANSFER ADDRESS BEQ 4$ ;YES CLR R0 ;NO: CHANGE ODD ADDRESS TO ZERO 4$: MOV R0,LOADPC(R5) ;SAVE PC IN CASE WE NEED IT LATER STRTP: CLRB -2(R4) ;CHANGE OSOP CODE TO TRANSFER ADDRESS BLOCK CLR (R4)+ ;NO BLOCK LOAD ADDRESS ON TRANSFER ADDRESS CLR (R4)+ ;NOW INSERT THE TRANSFER ADDRESS (32 BITS) ; LOW ADDRESS FIRST. CLR (R4)+ TSTB RUNGET(R5) ;START UP USER? BEQ 2$ ;NO: MUST BE "GET" COMMAND THEN CLRB RUNGET(R5) ;CLEAR RUN-GET FLAG MOV R0,-2(R4) CLR (R4)+ BR BEGN10 ;SEND LINE 2$: PUSH #LOADED ;TELL USER ITS LOADED BR ENTTY ; BEGIN1: TSTB CKSUM(R5) ;CHECKSUM CORRECT? BEQ BEGN10 ;YES: BLOCK ALL DONE - SEND IT OUT BEGN12: PUSH #CKERR ;PRINT CHECKSUM ERROR ENTTY: MOVR #.CURRN,R4 ;RESTORE R4 MOV #1,(R4) ;SEND ENTER TTY MODE DDCMP MESSSAGE MOV #22,2(R4) CLR DDCMP(R5) ;CLEAR DDCMP FLAGS CALL SENDSY ;SEND A BUNCH OF SYNCH CHARACTERS CALL SENDDC CALL GETMSG ;GET RESPONSE (REMOTE RESPONDS WITH "ENTER ; TTY" MESSAGE ALSO. BR ENTTY ;IF RESPONSE IS "READY FOR PGM LOAD", ; TELL REMOTE AGAIN. BR 1$ ;ENTER TTY MODE BR ENTTY ;NEITHER, TELL HIM AGAIN THEN 1$: CLRB DDCMP(R5) ;ENTER TTY MODE .PRINT (SP)+ ;TELL USER OF ERROR JMP RSTAR ;RESTART EDITOR FOR THIS USER ; BEGN10: MOVR #.CURRN+2,R3 ;CALCULATE BYTE COUNT OF LINE SUB R3,R4 MOV R4,-(R3) ;SAVE IN OUTPUT LINE MOV R3,R4 MOV #SOFTVC,TEMP1(R5) ;SCAN OUTPUT LINE FOR LOCATIONS 150-167 MOV #SOFTVC+20,TEMP2(R5) ; THESE ARE NOT ALLOWED IN THE REMOTE. BEGN11: CMP 4(R4),TEMP1(R5) ;LOAD ADDRESS < PROTECTED AREA ON REMOTE? BHIS BEGIN3 ;NO: SEE IF ITS >= TO THE UPPER LIMIT OF ; THE AREA. MOV 4(R4),R3 ;YES: SEE IF LOAD ADDRESS + BYTE COUNT ADD (R4),R3 ; OF LINE FALLS INTO ONE OF THE ; PROTECTED AREAS. SUB #6,R3 ;REMOVE HEADER WORDS CMP R3,TEMP1(R5) ;ADDRESS < PROTECTED AREA? BHI BEGIN2 ;NO JMP BEGIN6 ;YES: OUTPUT LINE AS IS THEN .ENABL LSB BEGIN2: SUB TEMP1(R5),R3 ;NO: MUST SPLIT UP LINE INTO 2 SEGMENTS. ; WE'LL DO THE 1ST HALF FIRST AND ; THEN THE SECOND HALF. PUSH R3 ;SAVE REMAINING BYTE COUNT TEMPORARILY SUB R3,(R4) ;SUBTRACT IT FROM THE FIRST HALF MOVB #8.,RETRY(R5) ;SETUP RETRY COUNT IN CASE OF ERRORS 1$: CLR DDCMP(R5) ;CLEAR DDCMP MODE FLAGS CALL SENDDC ;OUTPUT 1ST HALF CALL GETMSG ;GET RESPONSE BR 5$ ;RETURN IF "REQUEST PROGRAM LOAD" BR TTYENT ;RETURN IF "ENTER TTY MODE" 6$: MOVR #.CURRN,R4 ;RESEND MESSAGE CALL SENDSY ;SEND A BUNCH OF SYNCH CHARACTERS DECB RETRY(R5) ;TRIED 8 TIMES? BGT 1$ ;NO: CONTINUE 4$: PUSH #LOADER ;NO: DDCMP LOAD ERROR, TELL USER BR ENTTY 5$: CMPB RELBLK(R5),TEMP(R5) ;LOAD RECEIVED OK? BNE 6$ ;NO: RESEND IT THEN MOV R4,R3 ADD (R4),R3 TST (R3)+ ;NOW WE'RE POINTING AT THE 1ST DATA FROM ; THE 2ND HALF OF THE LINE. ADD (R4),4(R4) ;UPDATE LOAD ADDRESS SUB #6,4(R4) ;DON'T ADD IN HEADER, JUST THE DATA MOV (SP),(R4) ;SETUP BYTE COUNT OF 2ND PART ADD #6,(R4) ;+ HEADERS INCB 3(R4) ;+1 TO BLOCK COUNT INCB TEMP(R5) ;FOR NEXT TIME MOV R4,R2 ;GET PTR TO WHERE WE WILL MOVE DATA TO ADD #8.,R2 ;BYPASS STANDARD HEADER 2$: MOVB (R3)+,(R2)+ ;MOVE DATA NOW DEC (SP) ;ALL DONE? BGT 2$ ;NO: CONTINUE TST (SP)+ ;CLEAN UP STACK BR BEGN11 ;RESCAN LINE AGAIN ; BEGIN3: CMP 4(R4),TEMP2(R5) ;IS LOAD ADDRESS > PROTECTED AREA BHIS BEGIN5 ;YES: OUTPUT LINE AS IS THEN IF ; WE'VE CHECKED THE DL'S ADDRESS. PUSH DLVEC(R5) ADD #10,(SP) CMP 4(R4),(SP)+ ;DOES THIS LINE LIE IN THE DL VECTOR ; AREA? BHIS BEGN15 ;NO: NO SWEAT THEN CMP 4(R4),DLVEC(R5) BLO BEGN15 ;NO MOV DLVEC(R5),R3 ;YES: REMOVE THAT AREA FROM THIS LINE ADD #10,R3 MOV (R4),R2 ; AND TRANSFER IT AS 170-176 INSTEAD. SUB 4(R4),R3 ADD #6,R3 ;PLUS HEADER WORDS MOV R3,(R4) ;NEW BYTE COUNT OF TRANSFER SUB R3,R2 ;REMAINING BYTE COUNT AFTER TRANSFER MOV #170+10+6,4(R4) ;NOW CHANGE ADDRESS TO 170 + ANY OFFSET SUB R3,4(R4) MOVB #8.,RETRY(R5) ;SETUP RETRY COUNT IN CASE OF ERRORS 7$: CLR DDCMP(R5) ;CLEAR DDCMP MODE FLAGS CALL SENDDC ;SEND OUT LINE CALL GETMSG ;GET RESPONSE BR 8$ ;RETURN IF "REQUEST PROGRAM LOAD" BR TTYENT ;RETURN IF "ENTER TTY MODE" 10$: MOVR #.CURRN,R4 ;RESEND MESSAGE CALL SENDSY ;SEND A BUNCH OF SYNCH CHARACTERS DECB RETRY(R5) ;TRIED 8 TIMES? BGT 7$ ;NO: CONTINUE BR 4$ ;DDCMP LOAD ERROR, TELL USER 8$: CMPB RELBLK(R5),TEMP(R5) ;LOAD RECEIVED OK? BNE 10$ ;NO: RESEND IT THEN MOV (R4),R3 ;HAVE TO MOVE DATA DOWN NOW SUB #6,R3 ;BYTE COUNT OF LINE JUST TRANSFERRED MOV R4,R0 ; MUST BE REMOVED FROM NEW LINE. ADD #8.,R0 ;R0 POINTS TO THE NEW DATA MOV R0,R1 ADD R3,R1 ;R1 POINTS TO THE NEW DATA MOV R2,(R4) ;NEW BYTE COUNT 9$: MOVB (R1)+,(R0)+ ;NOW MOVE DATA DOWN DEC R2 BGT 9$ MOV DLVEC(R5),4(R4) ;NEW LOAD ADDRESS ADD #10,4(R4) BR BEGIN3 ;NOW RECHECK LINE .DSABL LSB ; TTYENT: JMP START ;RESTART USER IN TTY MODE ; BEGN15: MOV TEMP2(R5),R3 ;NO: IGNORE THE PART WE'RE WORRIED ABOUT SUB 4(R4),R3 ;NUMBER OF BYTES TO IGNORE SUB R3,(R4) ;ADJUST NEW BYTE COUNT IN HEADER ADD R3,4(R4) ;UPDATE LOAD ADDRESS MOV R4,R2 ;NOW MOVE DATA DOWN ADD #8.,R2 ;WHERE DATA WILL BE MOVED TO MOV R2,R1 ADD R3,R1 ;WHERE DATA WILL BE MOVED FROM MOV (R4),R3 ;CALCULATE NBR OF TYPES TO MOVE SUB #6,R3 ;REMOVE HEADER WORDS BLE BEGIN7 ;NOTHING TO MOVE, ALL DONE THEN 1$: MOVB (R1)+,(R2)+ ;MOVE DATA DEC R3 ;MORE? BGT 1$ ;YES: CONTINUE ; BEGIN5: CMP DLVEC(R5),TEMP1(R5) ;DID WE CHECK DL ADDRESS YET? BEQ BEGIN6 ;YES: OUTPUT LINE THEN IF IT EXISTS MOV DLVEC(R5),TEMP1(R5) ;NO: THEN DO DL AREA NOW MOV DLVEC(R5),TEMP2(R5) ADD #10,TEMP2(R5) JMP BEGN11 ; BEGIN6: CMP (R4),#6 ;ANY BYTES TO SEND OUT? BLE BEGIN7 ;NO: IGNORE REQUEST MOVB #8.,RETRY(R5) ;SETUP RETRY COUNT IN CASE OF ERRORS 1$: CLR DDCMP(R5) ;CLEAR DDCMP FLAGS CALL SENDDC ;SEND LINE OUT NOW TSTB 2(R4) ;WAS THIS A TRANSFER BLOCK JUST SENT OUT? BEQ OSOP1 ;YES: LOOK FOR SOMETHING TO DO NOW THAT ; USER IS COMPLETELY SATISFIED FOR ; THE TIME BEING. CALL GETMSG ;GET RESPONSE BR 2$ ;RETURN IF "REQUEST PROGRAM LOAD" BR TTYENT ;RETURN IF "ENTER TTY" MESSAGE 3$: MOVR #.CURRN,R4 ;RESEND MESSAGE CALL SENDSY ;SEND A BUNCH OF SYNCH CHARACTERS DECB RETRY(R5) ;TRIED 8 TIMES? BGT 1$ ;NO: CONTINUE PUSH #LOADER ;DDCMP LOAD ERROR, TELL USER JMP ENTTY 2$: CMPB RELBLK(R5),TEMP(R5) ;LOAD RECEIVED OK? BNE 3$ ;NO: RESEND IT THEN BEGIN7: TSTB 2(R4) ;LAST BLOCK SEND OUT? BEQ OSOP1 ;YES: LOOK FOR SOMETHING ELSE TO DO MOVR #INPTR,R2 ;NO: DO NEXT BLOCK JMP NEXTBK ; .SBTTL DDCMP PROTOCOL PROCESSOR ; ; DDCMP PROTOCOL PROCESSOR ; OSOP1: MOV #OSOP2,DDCMPE(R5) ;SETUP TIMEOUT ERROR RETURN TO NOP RIGHT NOW OSOP: CALL TTWAIT ;WAIT FOR COMM LINE TO FINISH MOVB #1,DDCMPS(R5) ;INDICATE A DDCMP MESSAGE IS EXPECTED BR DDWAIT OSOP2: MOVB #16.,CTIME(R5) ;WAIT A MINIMUM OF 16 SECONDS CLR DDCMP(R5) ;CLEAR DDCMP FLAGS DDWAIT: .WAIT ;WAIT FOR SOMETHING TO DO DDCMPP: MOVR #OUTBUF,R4 ;GET ADDRESS OF BUFFER CONTAINING ; DDCMP MESSAGE. MOVB DFLAG(R5),R0 ;ANY MESSAGE IN? BEQ DDWAIT ;NO: WAIT FOR ONE THEN BPL 1$ ;MESSAGE RECEIVED OK CMPB R0,#-2 ;ANY PART OF MESSAGE RECEIVED? BNE NAK02 ;NO: MUST BE MESSED UP MESSAGE THEN. ; SEND ILLEGAL DAP MESSAGE BACK. JMP @DDCMPE(R5) ;YES: SEND HIM LAST MESSAGE AGAIN 1$: CLRB DFLAG(R5) ;CLEAR OUT FLAG MOVB (R4)+,R0 ;GET OSOP CODE SUB #10,R0 ;IS IS REQUEST SECONDARY LOAD? BEQ SECLOD ;YES: PROCESS IT SUB #10,R0 ;CODES < 20 ARE ILLEGAL HERE BLT OSOP ;YES: IGNORE IT BEQ BEGN14 ;MUST BE DAP CODE MESSAGE (CODE =20) CMPB R0,#22-20 ;ENTER TTY MODE MESSAGE? BNE OSOP ;NO: IGNORE MESSAGE THEN CLRB DDCMP(R5) ;CLEAR DDCMP OPERATION FLAG CLRB DDCMPS(R5) ;INDICATE NO DDCMP MESSAGE EXPECTED 2$: MOV TTYTAB(R5),R4 ;PURGE ALL INPUT AND OUTPUT TTY BUFFERS TST (R4) ;ANY INPUT LEFT? BEQ 3$ ;NO TST -(R4) ;YES: SETUP POINTER FOR RUBOUT ROUTINE CALL RUBCOM ;RUBOUT CHARACTER BR 2$ ;CONTINUE TILL ALL RUBBED OUT 3$: MOV TTOTAB(R5),R4 ;NOW DELETE ALL OUTPUT CHARACTERS CLR (R4)+ MOV -4(R4),(R4) JMP START ;RESTART EDITOR SECLOD: MOV #SECNAM,R0 ;CALCULATE FILE NAME FROM USER NBR. MOVR #CMD,R2 ;GET ADDRESS OF COMMAND BUFFER MOV R2,R1 ;SAVE FOR LATER 2$: MOV (R0)+,(R2)+ ;COPY FILE NAME DESCRIPTION TO COMMAND CMP R0,#SECEND ; BUFFER FOR DECODING LATER. BLOS 2$ MOV R5,R0 ;FIND OUT WHICH USER NBR THIS IS SUB #USER1,R0 ;REMOVE BASE ADDRESS OF IMPURE AREA 3$: INCB CMD+7(R5) ;BUMP FILE NAME SUB #USIZE,R0 ;REMOVE AN IMPURE AREA SIZE BGE 3$ ;MORE TO GO: CONTINUE MOV R1,ARG1(R5) ;ADDRESS OF WHERE COMMAND IS TST (R1)+ ;R1=R1+2 MOV R1,CWDS(R5) ;FOR ARGUMENT PARSER IN 'RUN' COMMAND JMP RUN ;NOW IT LOOKS LIKE A @R SECPR0 ; BEGN14: MOVB (R4)+,R0 ;GET DAP OPERATOR BPL NAK18 ;NAK MESSAGE IF NO CHANNEL NBR WITH IT BIC #177600,R0 ;RID GARBAGE BITS CMPB R0,#10 ;MUST BE <=10 BGT NAK02 ;NO: NAK MESSAGE THEN ASL R0 ;CONVERT TO A WORD OFFSET MOV DAPOPR(R0),PC ;PROCESS REQUEST ; DAPOPR: .WORD NAK02 ;( 0) - FILE DATA WITHOUT EOR(UNSUPPORTED) .WORD FWEOR ;( 1) - FILE DATA WITH EOR .WORD FSTAT ;( 2) - STATUS .WORD OSOP ;( 3) - CONTINUE AFTER ERR (IGNORED) .WORD FCONT ;( 4) - CONTROL DEVICE/FILE .WORD OSOP ;( 5) - USER ID (IGNORED) .WORD FILACC ;( 6) - FILE ACCESS .WORD OSOP ;( 7) - FILE ATTRIBUTES (IGNORED) .WORD NAK02 ;( 8) - ERROR ; NAK02: MOVB #2.,R2 ;UNSUPPORTED DAP MESSAGE/FUNCTION BR ERRNAK ; NAK18: MOV #18.,R2 ;SEND NAK MESSAGE INDICATING NO CHANNEL ; NBR SPECIFIED. BR ERRNAK ; ACKACC: MOV #2,TEMP1(R5) ;SEND ACK MESSAGE INDICATING CHANNEL ACCESS OK ACK3: MOV #ACK3,DDCMPE(R5) ;RESEND MESSAGE IF USER DOESN'T RESPOND ; IN A CERTAIN TIME. MOVB #377,CTIME(R5) ;SETUP DUMMY TIMER JUST IN CASE ACK1: MOVR #.CURRN+5,R4 ;SETUP TO SEND OUT ACK/NAK MOVB TEMP1(R5),(R4) ;INSERT ACK/NAK CODE MOVB CHAN(R5),-(R4) ;INSERT CHANNEL NBR MOVB #200+2,-(R4) ;INSERT OPERATOR PLUS CHANNEL ID ACK2: MOVB #20,-(R4) ;MESSAGE IS A DAP TYPE MOV #4,-(R4) ;FOUR BYTE LONG MESSAGE CLR DDCMP(R5) ;CLEAR DDCMP MODE FLAGS CALL SENDDC ;SEND MESSAGE BR OSOPJP ;WAIT FOR ANOTHER ; ;GET CHANNEL NUMBER ; GETCHN: MOVB (R4)+,R0 ;GET CHANNEL NBR (0 THRU 3 ONLY) MOVB R0,CHAN(R5) ;SAVE IT BLT 1$ ;CHANNEL NBR LESS THAN 0 IS ILLEGAL CMPB R0,#4 ;MUST ALSO BE <4 BGE 1$ ;NO: NAK MESSAGE THEN RETURN ;RETURN TO CALLER 1$: TST (SP)+ ;CLEAN UP STACK MOV #22.,R2 ;SHOW ERROR ; ERRNAK: MOVB R2,TEMP1(R5) ;SAVE ERROR CODE ERNAK: MOVR #.CURRN+5,R4 ;ADDRESS OF WHERE NAK MESSAGE WILL BE BUILT MOVB TEMP1(R5),(R4) ;INSERT ERROR CODE MOVB CHAN(R5),-(R4) ;INSERT CHANNEL NBR MOV #210*400+20,-(R4) ;INSERT CHANNEL NBR+CHANNEL ID + DAP CODE MOV #4,-(R4) ;MESSAGE IS 4 BYTES LONG CLR DDCMP(R5) ;CLEAR DDCMP MODE FLAG CALL SENDSY ;SEND A BUNCH OF SYNCH CHARACTERS CALL SENDDC ;SEND MESSAGE MOV #ERNAK,DDCMPE(R5) ;RESEND IF USER DOES NOT ANSWER OSOPJP: JMP OSOP ; ; ; FILE ACCESS ; FILACC: CLR DDCMP(R5) ;CLEAR DDCMP MODE FLAG SUB #2,DDCMPI(R5) ;ADJUST INPUT POINTER TO POINT TO END ; OF LAST LINE INPUT FROM SATELLITE. MOVB #15,@DDCMPI(R5) ;STORE CR/LF AFTER LINE FOR NAME PARSER INC DDCMPI(R5) MOVB #12,@DDCMPI(R5) CALL GETCHN ;GET CHANNEL NBR MOVB (R4)+,R2 ;GET ACCESS CODES (5, 10 AND 11) SUB #10.,R2 BEQ 2$ ;ACCESS CODE OF 10 (READ) BMI 1$ ;POSSIBLY A 5 CMPB R2,#1 ;MUST BE CODE OF 11 THEN BNE NAK09 ;NO: NAK MESSAGE THEN 2$: MOV R4,R1 ;PARSE NAME NOW TST R2 ;INPUT REQUEST? BGT 3$ ;NO: OUTPUT MOVR #INFIL+2,R4 ;PUT FILE NAME HERE BR 4$ 1$: CMPB R2,#5-10. ;DELETE? BNE NAK09 ;NO: ILLEGAL CODE THEN BR 2$ ;YES: CONTINUE 3$: MOVR #OUTFIL+2,R4 ;PUT FILE NAME HERE FOR OUTPUT NAMES 4$: PUSH R0 ;SAVE CHANNEL NBR PUSH R2 ;SAVE I/O CODE CALL GETNM ;GET NAME BR NAK10 ;SYNTAX ERROR - NAK MESSAGE POP R2 ;GET I/O CODE BACK BGT 8$ ;OUTPUT REQUEST - OPEN OUTPUT FILE MOVB (SP),6$ ;INSERT CHANNEL NBR MOVB (SP),13$ MOVB (SP)+,7$ CALL .IO ;CLOSE FILE ON CHANNEL FIRST 6$: .BYTE 0,7 MOVR #INFIL,R0 CALL TESTDV ;MAKE SURE DEVICE EXISTS BR NAK38 ;NO: NAK MESSAGE THEN MOVR #INFIL,R0 ;OK TST R2 ;INPUT OR DELETE? BMI 5$ ;DELETE CALL .IO ;OPEN FILE FOR INPUT 7$: .BYTE 0,1 12$: BCS NAK33 ;ERROR: NAK MESSAGE JMP ACKACC ;MESSAGE OK: ACK IT 5$: CALL .IO ;DELETE FILE 13$: .BYTE 0,0 BCS NAK33 ;ERROR: NAK MESSAGE BR ACCACK ; 8$: MOVB (SP),9$ ;INSERT CHANNEL NBR MOVB (SP)+,10$ CALL .IO ;CLOSE FILE ON CHANNEL FIRST 9$: .BYTE 0,7 TST FSIZE(R5) ;DON'T RE-ADJUST FILE SIZE IF IT WAS BNE 11$ ; SPECIFIED BY USER IN COMMAND ADD #50.,FSIZE(R5) ; STRING. 11$: MOVR #OUTFIL,R0 ;OPEN NEW OUTPUT FILE NOW CALL TESTDV ;MAKE SURE DEVICE EXISTS FIRST BR NAK38 ;NO: NAK MESSAGE THEN MOVR #OUTFIL,R0 ;OK CALL .IO 10$: .BYTE 0,2 BCS NAK40 ;ERROR: NAK MESSAGE ACKRDY: MOV #ACKRDY,DDCMPE(R5) ;RESEND MESSAGE IF USER DOES NOT RESPOND MOVB #377,CTIME(R5) ; WITHIN A CERTAIN TIME PERIOD. MOVR #.CURRN+5,R4 ;SETUP TO SEND OUT REQUEST FOR ; RECORD MESSAGE. CLRB (R4) ;INITIALIZE OPERAND MOVB CHAN(R5),-(R4) ;INSERT CHANNEL NBR MOVB #200+4,-(R4) ;INSERT OPERATOR PLUS CHANNEL ID JMP ACK2 ;INSERT MESSAGE TYPE AND SEND IT ; NAK07: MOVB #7.,R2 ;UNSUPPORTED ATTRIBUTE IN FCONT MESSAGE BR NAKCOM NAK09: MOVB #9.,R2 ;PARTICULAR ACCESS FUNCTION REQUESTED NOT BR NAKCOM ; IMPLEMENTED. NAK10: MOVB #10.,R2 ;SYNTAX ERROR IN FILE SPECIFICATION BR NAKCOM NAK33: MOVB #33.,R2 ;LOOKUP FAILURE BR NAKCOM NAK38: MOVB #38.,R2 ;DIRECTORY ERROR BR NAKCOM NAK16: MOVB #16.,R2 ;HARDWARE ERROR BR NAKCOM NAK40: MOVB #40.,R2 ;DEVICE FULL ; NAKCOM: JMP ERRNAK ;ISSUE NAK MESSAGE ; ; ; FILE DATA WITH EOR ; FWEOR: CALL GETCHN ;GET CHANNEL NBR 1$: MOVB (R4)+,IBLKNM(R5) ;GET RECORD NBR MOVB (R4)+,IBLKNM+1(R5) CMPB (R4)+,(R4)+ ;IGNORE NEXT 2 BYTES MOVR #INPTR,R2 ;GET BUFFER DESCRIPTOR ADDRESS MOV 4(R2),(R2) ;SHOW BUFFER FULL MOV 6(R2),R3 ;NOW FILL IT MOV #512.,R1 ;512 CHARACTERS TO TRANSFER (256. WORDS) 2$: MOVB (R4)+,(R3)+ ;NOW TRANSFER THE BUFFER DEC R1 BGT 2$ CALL PUTLIN ;OUTPUT BLK TST ERR(R5) ;ERROR DURING PUT? BNE NAK16 ;YES: NAK MESSAGE BR ACKRDY ;SHOW ACCESS OK ; ; ; FILE STATUS ; FSTAT: CALL GETCHN ;GET CHANNEL NBR 1$: MOVB R0,2$ ;INSERT CHANNEL NBR IN CLOSE REQUEST CALL .IO ;CLOSE REQUESTED CHANNEL NOW 2$: .BYTE 0,7 ACCACK: MOV #1,TEMP1(R5) ;SHOW ACCESS ACK OK JMP ACK3 ; ; FILE CONTROL ; FCONT: CALL GETCHN ;GET CHANNEL NBR 1$: CMPB (R4)+,#2 ;REQUEST RECORD? BNE NAK07 ;NO: ERROR THEN MOVB (R4)+,IBLKNM(R5) ;GET RECORD NBR MOVB (R4)+,IBLKNM+1(R5) MOVR #INPTR,R2 ;GET BUFFER DESCRIPTOR ADDRESS CLR (R2) ;SHOW BUFFER EMPTY CLR 2(R2) ;SHOW NO EOF FOUND YET CALL GETLIN ;GET BUFFER BR EOFFND ;EOF FOUND OR ERROR CLR DDCMP(R5) ;CLEAR DDCMP MODE FLAGS MOVB #7,-(R2) ;MESSAGE WILL BE 519 BYTES LONG MOV R2,R4 INC R2 MOVB #2,(R2)+ MOVB #20,(R2)+ ;DAP CODE MOVB #200+1,(R2)+ ;OPERATOR CODE + CHANNEL ID MOVB CHAN(R5),(R2)+ ;SAVE CHANNEL NBR DEC IBLKNM(R5) ;RETURN SAME BLOCK NBR MOVB IBLKNM(R5),(R2)+ ;SAVE BLOCK NBR MOVB IBLKNM+1(R5),(R2)+ CLRB (R2)+ ;USE 0 FOR M.S. PART OF BLOCK NBR CLRB (R2)+ MOVB #377,CTIME(R5) ;SEND OUT ACK IF NO ANSWER MOV #ACKACC,DDCMPE(R5) CALL SENDDC ;OUTPUT MESSAGE MOVR #INPTR+8.,R2 ;RESET INPUT BUFFER DESCRIPTOR POINTERS MOV R2,-4(R2) ADD #1000,-4(R2) MOV R2,-2(R2) JMP OSOP ; EOFFND: TST ERR(R5) ;HARDWARE ERROR? BMI NAK16 ;YES: NAK IT MOV #2,R0 ;NO: ACK MESSAGE SHOWING EOF JMP ACK1 ; ; ; GET BYTE ; GETB: TST (R2) ;BUFFER EMPTY? BEQ 2$ ;YES: MUST BE 1ST TIME THEN CMP (R2),4(R2) ;ANY BYTES LEFT? BLO 1$ ;YES: GET ONE THEN 2$: CLR CHAN(R5) ;NO: GET A BLOCK (USE CHANNEL 0) MOVB #1,DDCMP(R5) ;ENTER DDCMP MODE MOVR #INPTR,R2 ;BUFFER ADDRESS CALL GETLIN BR 3$ ;EOF FOUND: ILLEGAL HERE 1$: CLRB DDCMP(R5) ;TURN OFF DDCMP MODE MOVB @(R2),R3 ;GET A BYTE FROM THE BUFFER INC (R2) ;BUMP BUFFER POINTER ADD R3,CKSUM(R5) ;ADD TO CHECKSUM BIC #177400,R3 ;MASK OFF JUNK DEC BYTECT(R5) ;DECREMENT BYTE COUNT RETURN ;RETURN 3$: CALL TTWAIT ;MAKE SURE COMM LINE IS EMPTY PUSH #ILLLDA ;TELL USER ITS AN ILLEGAL LOAD FILE JMP ENTTY RSTAR: .CLOSE 0 ;CLOSE CHANNEL 0 JMP START ; ; GET WORD ; GETW: CALL GETB ;GET A BYTE PUSH R3 ;SAVE IT CALL GETB ;GET 2ND BYTE SWAB R3 ;NOW COMBINE WITH FIST BISB (SP)+,R3 RETURN ;RETURN TO CALLER ; ; .SBTTL INSERT BYTE IN DDCMP BUFFER AND COMPUTE CRC ON IT ; ; CALLING SEQUENCE: ; ; MOV BYTE,R3 ;TO SEND ONE BYTE ; CALL IN1CRC ; ; MOV WORD,R3 ;TO SEND TWO BYTES ; CALL IN2CRC ; IN2CRC: PUSH R3 ;SAVE ORIGINAL VALUE TEMP SWAB (SP) ;GET IT READY FOR LATER USE CALL IN1CRC ;OUTPUT BYTE AND COMPUTE CRC ON IT POP R3 ;NOW DO 2ND BYTE ; IN1CRC: CALL TTOPUT ;OUTPUT BYTE MOV R3,R0 ;COMPUTE CRC ON IT CALL CALCRC RETURN ;RETURN TO CALLER ; ; GET MESSAGE FROM SATELLITE ; ; CALL GETMSG ;GET RETURNED MESSAGE ; BR REQPGL ;RETURN IF MESSAGE "REQUEST PROGRAM ; ; LOAD." ; BR ENTER TTY ;RETURN IF "ENTER TTY" MESSAGE ; RETURN IF MESSAGE RETURNED NOT "REQUEST PROGRAM LOAD" OR ; ENTER TTY MODE. ; GETMSG: MOVB #1,DDCMPS(R5) ;INDICATE A DDCMP MESSAGE IS EXPECTED MOVB #5,CTIME(R5) CALL TTWAIT ;WAIT FOR COMMON LINE TO FINISH PUSH R3 ;SAVE R3 BR 5$ ;SEE IF MESSAGE HAPPENS TO BE ALREADY IN 4$: .WAIT 5$: MOVR #OUTBUF,R3 ;GET RETURNED ANSWER TSTB DFLAG(R5) ;ANY MESSAGE IN? BEQ 4$ ;NO: WAIT FOR ONE THEN BPL 2$ ;MESSAGE RECEIVED OK 1$: POP R3 ;RESTORE R3 ADD #4,(SP) ;USE ERROR EXIT RETURN ;RETURN TO CALLER 2$: CLR DDCMP(R5) ;CLEAR OUT DDCMP FLAGS CMPB (R3)+,#12 ;OSOP CODE = 12(8) BNE 3$ ;NO: SEE IF TTY THEN CLRB DDCMPS(R5) ;INDICATE NO DDCMP MESSAGE EXPECTED MOVB (R3),RELBLK(R5) ;GET LOAD NBR POP R3 ;RESTORE R3 RETURN ;RETURN TO CALLER 3$: CMPB -(R3),#22 ;ENTER TTY MODE MESSAGE? BNE 1$ ;NO: USE ERROR RETURN POP R3 ;YES: RESTORE R3 ADD #2,(SP) ;SHOW SUCCESS IN RETURN CLRB DDCMPS(R5) ;INDICATE NO DDCMP MESSAGE EXPECTED RETURN ;RETURN TO CALLER. ; .SBTTL OUTPUT 10. SYNCH CHARACTERS ; ; CALLING SEQUENCE: ; ; CALL SENDSY ; SENDSY: PUSH R3 ;SAVE R3 PUSH #10. ;OUTPUT 10 SYNCH CHARACTERS 1$: MOVB #SYN,R3 CALL TTOPUT ;OUTPUT 1 OF THEM DEC (SP) ;ALL DONE? BGT 1$ ;NO: DO ANOTHER TST (SP)+ ;YES: CLEAN UP STACK POP R3 ;RESTORE R3 RETURN ;RETURN TO CALLER ; .SBTTL OUTPUT DDCMP LINE ; ; CALLING SEQUENCE: ; ; R4 POINTS TO BUFFER (1ST WORD CONTAINS BYTE COUNT OF LINE) ; CALL SENDDC ; SENDDC: MOVB #1,DDCMPO(R5) ;ENABLE DDCMP OUTPUT MODE MOVB #SYN,R3 ;OUTPUT 3 SYN'S TO GET IN SYNC CALL TTOPUT CALL TTOPUT CALL TTOPUT CLR R1 ;INITIALIZE COLLECTIVE CRC MOVB #DLE,R3 ;NOW THE DLE CALL IN1CRC ;CALCULATE CRC ON IT MOVB (R4),R3 ;GET BYTE COUNT OF LINE AND SEND IT CALL IN1CRC MOVB 1(R4),R3 CALL IN1CRC CLR R3 ;NOW 2 FILLER CHARACTERS CALL IN2CRC INC R3 ;STATION ADDRESS IS ALWAYS '1' CALL IN1CRC MOV R1,R3 ;NOW SEND OUT CRC ITSELF CALL IN2CRC CLR R1 ;RE-INIT CRC VALUE PUSH R2 ;SAVE R2 MOVB (R4)+,R2 ;GET BYTE COUNT OF LINE TO SEND BIC #177400,R2 SWAB R2 BISB (R4)+,R2 SWAB R2 1$: MOVB (R4)+,R3 ;OUTPUT BYTE MOV R3,R0 CALL IN1CRC DEC R2 ;ALL DONE? BGT 1$ ;NO: CONTINUE POP R2 ;RESTORE R2 MOV R1,R3 ;NOW SEND OUT CRC ON LINE CALL IN2CRC MOVR #.CURRN,R4 ;RESTORE R4 RETURN ;RETURN TO CALLER ; .END .SBTTL EDITOR COMMON SECTION .TITLE REMOTE V01-X01 .NLIST TTM,ME .CSECT REMEDC EDIT=001. ; ; ; PDP-11 RT-11 MULTI-USER LINE TEXT EDITOR AND DOWN LINE LOADER ; ; PROGRAM NAME: LETTER / REMOTE-11 ; ; EDITOR COMMON SECTION: VERSION LEVEL V01-X01: PATCH LEVEL A ; ; AUTHOR: RICK HULLY ; ; DATE: SEP., 1975 ; ; ; COPYRIGHT (C) 1975 ; ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- ; SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER ; COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE ; TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO ; AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE ; SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; .SBTTL CONDITIONAL ASSEMBLY PARAMETERS ; ; THE FOLLOWING CONDITIONAL ASSEMBLY PARAMETERS PERTAIN TO THIS ; SECTION. ; ; NO CONDITIONALS SPECIFIED YIELDS: ; ; EDITOR FUNCTIONS SUPPORTED ; MEMORY MANAGEMENT SUPPORTED ; 2 USER VERSION OF REMOTE-11 ; ; IF DEFINED "NOEDIT", THE EDITOR FUNCTIONS ARE ; REMOVED. ; ; IF DEFINED "NOMMT", THE MEMORY MANAGEMENT SUPPORT IS ; REMOVED. ; .IIF DF NOEDIT, .END .IIF NDF NUSERS, NUSERS=2. ; .SBTTL PROGRAM DEFINITIONS ; R0 = %0 ;GENERAL REGISTERS R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 PS = -2 RETURN = 207 ;RETURN = RTS PC ; .SBTTL GLOBALS ; .GLOBL .IO,.PRNT,START,TYPE,MSG2,MSG15,MSG16,SWAPER,MSG7 .GLOBL GETLIN,PUTLIN,XSW,MMT,SAVER2,SAVER4,SAVE1$,SAVE2$ .GLOBL OUTPTR,SAVFIL,SWITCH,BASE,INPTR,.CURRN,SW2 .GLOBL TEMP2,TEMP3,CURREN,ENDM,CP,PP,$DBLK,TESTCR .GLOBL WRIOT,CHAN,ACHAN,SECPTR,USER1,USIZE,CWDS .GLOBL REDIT,COMOUT,$GETBY,$PUTBY,SAVER,RESTOR .GLOBL MOVE,INSRT,MOVETL,ONOFF,EDITS,EDITSS,TOPS .GLOBL ERASES,FSWAP,OUTPUT,INPUTX,INPUT,BUFCHK .GLOBL CKFILE,GO,INFIL,OUTFIL,BAKFIL,FLTMP,SECFIL .GLOBL TMPFIL,ILLNM,NOPAGE,OVLY,OVLY1,OVLY2,OVLYSW .GLOBL TMP ; .SBTTL MACRO DEFINITIONS ; .MACRO PUSH CELL MOV CELL,-(SP) .ENDM PUSH ; .MACRO POP CELL MOV (SP)+,CELL .ENDM POP ; .MACRO CALL ROUTINE JSR PC,ROUTINE .ENDM CALL ; .MACRO MOVR X,Y MOV X,Y ADD R5,Y .ENDM MOVR ; .MACRO .CLOSE .CHANNEL JSR PC,.IO .BYTE ^O<.CHANNEL> .BYTE 7 .ENDM .CLOSE ; .MACRO .PRINT .MESADDR .IF NB .MESADDR MOV .MESADDR,R0 .ENDC ;.IF NB .MSADDR JSR PC,.PRNT .ENDM .PRINT ; .SBTTL CHECK BUFFER > 7/8 FULL ; ; CHECK BUFFER > 7/8 FULL ; BUFCHK: PUSH R2 ;SAVE R2 TSTB SWITCH(R5) ;USER IN BLOCK ON MODE? BPL 2$ ;NO: FORGET REQUEST THEN MOV ENDM(R5),R2 ;DETERMINE IF USER'S EXCEEDED 7/8 OF ; THE BUFFER SIZE. CCC ;16 BIT SHIFT CAUSES THE CCC AND ROR R2 ROR R2 ;SIZE/2 ASR R2 ;SIZE/4 ASR R2 ;SIZE/8 PUSH CP(R5) SUB PP(R5),(SP) CMP (SP)+,R2 ;ENOUGH ROOM? BLOS 1$ ;NO: USE ERROR EXIT 2$: ADD #2,2(SP) ;BUMP EXIT SHOWING BUFFER OK 1$: POP R2 ;RESTORE R2 RETURN ;RETURN TO CALLER ; .SBTTL OVERLAY HANDLER ; ; OVELAY HANDLER USED TO INSURE THAT A CALL TO COMMON CODE IS ; RETURNED TO THE CORRECT OVERLAY. ; OVLY: ;OVERLAY HANDLER MOV @(SP),TMP ;GET ADDRESS OF ROUTINE TO CALL ADD #2,(SP) ;BUMP PAST ROUTINE ADDRESS PUSH #1$ ;SETUP RETURN ADDRESS (JSR PC,(SP)+ ; IS ILLEGAL.) JMP @TMP ;CALL APPROPRIATE ROUTINE 1$: BR 3$ ;NORMAL RETURN BR 2$ ;.+2 RETURN (ADD 2 TO RETURN ADDRESS) ADD #2,(SP) ;.+4 RETURN (ADD 4 TO RETURN ADDRESS) 2$: ADD #2,(SP) ;RETURN ADDRESS = RETURN ADDRESS +2 3$: TSTB OVLYSW(R5) ;WHICH OVERLAY CALLED? BNE 4$ ;OVLY #2 CALL OVLY1 ;OVLY #1: MAKE SURE ITS IN RETURN ;RETURN TO CALLER 4$: CALL OVLY2 ;OVLY #2: MAKE SURE ITS IN RETURN ;RETURN TO CALLER ; .SBTTL CHECK FILE NAME ; ;ROUTINE TO CHECK FILE NAME USAGE FOR POSSIBLE CONFLICTS BETWEEN USERS. ; ;CALLING SEQUENCE: ; ; .CKFIL #FILE BLOCK ; ERROR RETURN ;MESSAGE PRINTED BY CKFILE ; SUCCESS RETURN ; CKFILE: .IF GT NUSERS-1 PUSH R3 ;SAVE R3 AND R4 PUSH R4 PUSH #NUSERS ;GET NUMBER OF USERS MOV #USER1,R4 ;TABLE INDEX FOR USER #1'S IMPURE AREA 1$: TSTB GO(R4) ;USER EDITING? BNE 3$ ;YES 4$: DEC (SP) ;NO: CHECKED ALL USERS? BEQ 2$ ;YES: USE SUCCESS EXIT ADD #USIZE,R4 ;LOOK AT NEXT USER BR 1$ 2$: TST (SP)+ ;CLEAR UP STACK POP R4 ;RETORE R3 AND R4 POP R3 ADD #2,(SP) ;SHOW SUCCESSFUL RETURN RETURN 3$: CMP R4,R5 ;ARE WE CHECKING OURSELVES? BEQ 4$ ;YES: LOOK AT NEXT USER CALL TESTNM ;TEST NAME AGAINST "INFIL" .WORD INFIL CALL TESTNM ;TEST NAME AGAINST "OUTFIL" .WORD OUTFIL CALL TESTNM ;TEST NAME AGAINST "BAKFIL" .WORD BAKFIL CALL TESTNM ;TEST NAME AGAINST "FLTMP" .WORD FLTMP CALL TESTNM ;TEST "NAME AGAINST TMPFIL" .WORD TMPFIL BITB #20,SWITCH+1(R4) ;SECONDARY FILE I/O ACTIVE? BEQ 5$ ;NO CALL TESTNM ;YES: TEST NAME AGAINST "SECFIL" .WORD SECFIL 5$: BIT #100000,SW2(R4) ;SAVE/UNSAVE/FILE CURRENTLY UNDERWAY? BEQ 4$ ;NO: LOOK AT NEXT USER CALL TESTNM ;YES: TEST NAME AGAINST "SAVFIL" .WORD SAVFIL BR 4$ ;ALL OK, CHECK NEXT USER ; TESTNM: MOV @(SP),R3 ;GET FILE NAME BLOCK OFFSET ADD R4,R3 ;ADD BASE ADDRESS OF USERS IMPURE AREA ADD #2,(SP) ;BUMP PAST SUB CALL ARGUMENT CMP (R3)+,(R0) ;DEVICE NAME MATCH? BNE 1$ ;NO: NO MATCH THEN CMP (R3)+,2(R0) ;DO FILE NAME AND EXTENSION THEN BNE 1$ CMP (R3)+,4(R0) BNE 1$ CMP (R3)+,6(R0) BNE 1$ .PRINT #ILLNM ;TELL USER THE NAME MATCHED ADD #10,SP ;CLEAN UP STACK 1$: .ENDC ;.IF GT NUSERS-1 RETURN ;USE ERROR RETURN ; .SBTTL OUTPUT A LINE ; ;OUTPUT LINE IN "CURREN" ; OUTPUT: PUSH R0 ;SAVE R0 TEMP MOV CURREN(R5),R0 MOV R0,WRIOT(R5) TSTB (R0) ;ANYTHING TO OUTPUT? BEQ OUTPT5 ;NO BISB #10,SWITCH(R5) ;INDICATE OUTPUT FILE HAS SOME OUTPUT BIT #4,SW2(R5) ;WRITE OPERATION GOING ON? BNE OUTPT2 ;YES: WRITE LINE TO OUTPUT DEVICE. TSTB SWITCH(R5) ;BLOCK MODE IN EFFECT? BPL OUTPT2 ;NO CALL INSRT ;INSERT LINE IN BLOCK BUFFER BR BUFFUL ;BUFFER FULL RETURNS HERE BR OUTPT5 ;LINE INSERTED RETURN OUTPT2: BITB #100,SWITCH+1(R5) ;OUTPUT TURNED OFF? BEQ OUTPT5 ;YES MOVR #OUTPTR,R2 ;WRITE OUT LINE MOV #1,CHAN(R5) ;USE CHANNEL #1 CALL PUTLIN OUTPT5: CLR (R0) ;NULL LINE SINCE IT NO LONGER EXISTS BIC #4,SW2(R5) ;CLEAR READ/WRITE SWITCH POP R0 ;RESTORE R0 RETURN ;RETURN BUFFUL: PUSH R0 ;SAVE R0 TST ACHAN(R5) ;WAS USER DOING AN UNSAVE? BEQ 1$ ;NO .CLOSE 3 ;YES: CLOSE FILE MOVR #INPTR,R0 ;RESTORE PRIMARY INPUT BUFFER MOV #-2,R1 CLR ACHAN(R5) ;CLEAR OUT UNSAVE BIC #100000,SW2(R5) ;UNSAVE NO-LONGER UNDERWAY CALL FSWAP ;NOW GET INPUT BUFFER CLR SAVFIL+2(R5) ;DISABLE SAVE FILE NAME BLOCK 1$: .PRINT #MSG15 ;BUFFER CAPACITY EXCEEDED POP R0 ;RESTORE R0 CALL TYPE ;ECHO OFFENDING LINE CLR (R0) ;NULL LINE SINCE IT WAS THIS ONE WHICH ; CAUSED US ALL THE TROUBLE. .PRINT #MSG2 ;TELL USER THAT WE DELETED IT TST (SP)+ ;UPDATE STACK AND RETURN TO COMMAND JMP EDITSS ; INTERPRETER.... .SBTTL INPUT A LINE ; ;INPUT A LINE INTO "CURREN" ; INPUT: MOV CURREN(R5),R2 ;BUFFER TO FILL IS "CURREN" INPUTX: ;ALTERNATE ENTRY POINT FOR SEARCH COMMAND BIT #4,SW2(R5) ;READ/WRITE OPERATION UNDERWAY? BNE 1$ ;YES: GET LINE FROM INPUT FILE TSTB SWITCH(R5) ;BLOCK MODE IN EFFECT? BPL 1$ ;NO MOV R2,R4 CMP CP(R5),ENDM(R5) ;MAKE SURE LINE EXISTS IN THE BUFFER BHIS 9$ ;NO: EOB TST (R4)+ ;YES: R4=R4+2 PUSH R4 ;SAVE R4, R3, AND R1 PUSH R3 PUSH R1 MOV #-1,R1 ;SHOW LINE COMING FROM THE MMT MOV CP(R5),R2 ;WHERE TO GET LINE FROM CLR R3 ;SHOW LINE GOING TO LOW CORE CALL MOVETL ;MOVE LINE TO "CURREN" POP R1 ;RESTORE R1 AND R3 POP R3 MOV R2,CP(R5) ;SAVE NEW POINTER SUB (SP),R4 ;CALCULATE NBR OF CHARS TRANSFERRED SUB #2,(SP) ;BACKUP POINTER BY 2 TO INSERT NEW ; BYTE COUNT. MOV R4,@(SP)+ ;SAVE IN HEADER WORD BR 6$ ;RETURN 1$: BITB #40,SWITCH+1(R5) ;IS SECONDARY FILE SELECTED FOR INPUT? BNE 10$ ;YES BITB #1,SWITCH(R5) ;INPUT FILE EXIST? BNE 8$ ;NO: REPORT THE FACT 10$: MOV R2,WRIOT(R5) ;SETUP BUFFER ADDRESS BITB #40,SWITCH+1(R5) ;SECONDARY INPUT? BNE 11$ ;YES 13$: MOVR #INPTR,R2 ;READ A LINE FROM PRIMARY INPUT FILE CLR CHAN(R5) ;USE CHANNEL #0 15$: CALL GETLIN BR 3$ ;EOF RETURNS HERE 6$: ADD #4,(SP) ;USE NORMAL RETURN 3$: BIC #4,SW2(R5) ;CLEAR READ/WRITE SWITCH RETURN ;RETURN 9$: BIS #20000,SW2(R5) ;INDICATE EOB DETECTED BR 3$ 11$: BIT #404,SWITCH(R5) ;TAKE FROM PRIMARY IF WE'RE DOING BNE 13$ ; A CLOSE OR TOP. MOVR #SECPTR,R2 ;READ FROM SECONDARY FILE MOV #2,CHAN(R5) ;USE CHANNEL #2 BR 15$ 8$: BITB #4,SWITCH(R5) ;ARE WE CURRENTLY CLOSING? BNE 15$ ;NO: RETURN AS IF EOF WAS FOUND ;TELL USER OF HIS ERROR .PRINT #MSG16 ;NO INPUT FILE PRESENT JMP REDIT .SBTTL ROUTINE TO COMPLETE OUTPUT ON A SPECIFIC CHANNEL ; ; CALL: ; MOV #CHANBR,CHAN ; MOV #BUFFER,R2 ; CALL COMOUT ; COMOUT: PUSH R0 ;SAVE R0 MOVR #TEMP3,WRIOT(R5) ;PAD REST OF OUTPUT BLOCK WITH NULLS CLR @WRIOT(R5) ; BEFORE WRITING IT OUT. MOV (R2),R0 1$: CMP R0,4(R2) BHIS 2$ CLRB (R0)+ BR 1$ 2$: MOV R0,(R2) CALL PUTLIN POP R0 ;RESTORE R0 RETURN ;RETURN TO CALLER ; .SBTTL TOP/ERASE BLOCK BUFFER ; ;ROUTINE TO TOP THE BLOCK BUFFER ; TOPS: CALL OUTPUT ;MAKE SURE LINE IS INSERTED FIRST 1$: MOV #-1,R1 ;PUT POINTER AT TOP OF BLOCK BUFFER BY CALL MOVE ; MOVING ONE LINE AT A TIME UNTIL RETURN ; A BOB IS REACHED. BR 1$ ;CONTINUE ; ;ROUTINE TO ERASE THE BLOCK BUFFER ; ERASES: CLR PP(R5) ;BUFFER IS CLEARED BY DIDDLING BUFFER MOV ENDM(R5),CP(R5) ; POINTERS TO TOP AND BOTTOM WITH AN ; EMPTY MIDDLE. CLR R1 ;NOW STORE 0 AS 1ST WORD CLR R0 TSTB NOPAGE ;PAGE MODE ALLOWED? BNE 2$ ;NO: DON'T FIDDLE WITH AREA THEN CALL $PUTBY 2$: CLR .CURRN(R5) ;NULL OUT CURRENT LINE ALSO TSTB SWITCH(R5) ;DON'T TOP IF WE'RE NOT IN BLOCK BPL 1$ ; ON MODE. CALL TOPS ;NOW DO A TOP TO ADJUST THE POINTERS 1$: RETURN ;RETURN TO CALLER ; .SBTTL ON/OFF SWITCH PROCESSOR ; ;PROCESS ON/OFF SWITCH IN COMMAND STRING ; ONOFF: PUSH R1 ;SAVE R1 MOV CWDS(R5),R0 ;GET NEXT WORD MOV R0,R1 ;FOR "TESTCR" BELOW CALL TESTCR ;ANY ARG EXIST? JMP 1$ ;NO POP R1 ;YES: RESTORE R1 CMPB #'O,(R0)+ ;FIRST LETTER MUST BE AN "O" THEN BNE 2$ ;NO: ILLEGAL COMMAND CMPB #'N,(R0) ;NEXT LETTER IS EITHER AN "N" OR "F" OR BEQ 3$ ; ITS ILLEGAL. CMPB #'F,(R0)+ BNE 2$ ;NEITHER N OR F CMPB #'F,(R0)+ ;NEXT LETTER MUST ALSO BE AN "F" BNE 2$ BIC R1,SWITCH(R5) ;TURN BIT OFF RETURN ;RETURN 1$: POP R1 ;RESTORE R1 3$: BIS R1,SWITCH(R5) ;TURN BIT ON RETURN ;RETURN 2$: TST (SP)+ ;CLEAN UP STACK .PRINT #MSG7 ;TELL USER OF ERROR JMP EDITS ; .SBTTL FILE BLOCK SWAPPER ; ; FILE BLOCK SWAPPER ; ; CALLING SEQUENCE: ; MOVR #BUFFER,R0 ;BUFFER TO SWAP ; MOV #AREA NUMBER,R1 ;+ IF WRITE, - IF READ ; CALL FSWAP ; ; REGISTERS AFFECTED: R1 DESTROYED ; FSWAP: PUSH R0 ;SAVE R0 AND R2 PUSH R2 MOVR #$DBLK+6,R2 ;GET ADDRESS OF END OF DEVICE BLOCK CLR (R2) ;NO COMPLETION ROUTINE HERE MOV #400,-(R2) ;400 OCTAL WORDS MOV R0,-(R2) ;BUFFER ADDRESS CLR -(SP) ;CALCULATE STARTING SWAP BLOCK FOR THIS USER PUSH #USER1 1$: CMP (SP),R5 ;THIS USER? BHIS 2$ ;YES ADD #USIZE,(SP) ;NO: TRY NEXT ONE INC 2(SP) BR 1$ 2$: TST (SP)+ ;CLEAN UP STACK MOV #11*400+,R0 ;ASSUME A .WRITW OPERATION TST R1 BPL 3$ ;YES NEG R1 ;NO: TAKE ABS OF RELATIVE CHANNEL BIC #400,R0 ;CONVERT .WRITW TO .READW 3$: ADD R1,(SP) ;ADD TO BASE STARTING BLOCK NBR MOV (SP)+,-(R2) ;RELATIVE BLOCK NBR IN FILE MOV R0,-(R2) ;BUFFER ADDRESS MOV R2,R0 ;NO DO OPERATION EMT 375 BCS 4$ ;ERROR ON SWAP - BAD NEWS POP R2 POP R0 RETURN ;RETURN TO CALLER ; 4$: .PRINT #SWAPER ;TELL USER OF SWAP ERROR JMP START ;RESTART EDITOR .SBTTL MOVE A LINE IN TEXT BUFFER ; ; SUBROUTINE TO MOVE A LINE IN THE TEXT BUFFER ; ; CALLING SEQUENCE: ; ; MOV #N,R1 ;NBR OF LINES TO MOVE (-=REV, +=FWD) ; CALL MOVE ; EOB/BOB RETURN ; NORMAL RETURN ;MOVE WAS MADE ; ; REGISTERS AFFECTED: R1 DESTROYED ; MOVE: JSR R0,SAVER ;SAVE GP'S PUSH R1 ;DIRECTION? 1$: BPL 7$ ;"+", MOVE FORWARD MOV PP(R5),R0 ;"-", MOVE BACKWARD. GET ADDRESS ; OF PREVIOUS LINE POINTER. MOV R0,TEMP2(R5) ;SAVE FOR LATER BLE 6$ ;WE'RE AT BOB MOV #2,R2 2$: SUB R2,R0 ;BACKUP PAST PREVIOUS LINES DELIMITER CALL $GETBY ;GET BYTE CMPB R1,#14 ;LF OR FF FOUND YET? BGT 8$ ;NO BEQ 3$ ;FF CMPB R1,#12 ;COULD BE, IS IT AN LF? BEQ 3$ ;YES 8$: MOV #1,R2 ;NO: (USED TO BACKUP POINTER LATER) TST R0 ;AT BOB? BGT 2$ ;NO: CONTINUE CLR R0 ;YES: RESET POINTERS AND EXIT BR 4$ ; 3$: INC R0 ;BUMP PAST TERMINATOR 4$: SUB R0,TEMP2(R5) ;CALCULATE LENGTH OF LINE TO XFER MOV R0,PP(R5) ;SAVE NEW PREVIOUS POINTER SUB TEMP2(R5),CP(R5) ;NOW ADJUST CP MOV CP(R5),R4 ;WHERE TO MOVE DATA TO MOV R0,R2 ;WHERE TO MOVE DATA FROM PUSH R1 ;SAVE R1 AND R3 PUSH R3 MOV #-1,R1 ;SHOW LINE COMING FROM MMT AREA MOV R1,R3 ;SHOW LINE GOING TO MMT AREA CALL MOVETL ;MOVE LINE POP R3 ;RESTORE R3 AND R1 POP R1 INC (SP) ;ALL DONE? BLT 1$ ;NO: CONTINUE 5$: ADD #2,14(SP) ;SHOW SUCCESS RETURN 6$: TST (SP)+ ;CLEAN UP STACK BR MVINXT ;RESTORE GP'S AND RETURN TO CALLER ; 7$: MOV CP(R5),R2 ;GET POINTER OF WHERE DATA WILL BE MOVED ; FROM. MOV PP(R5),R4 ;GET POINTER OF WHERE DATA WILL BE MOVED ; TO. CMP R2,ENDM(R5) ;EOB? BHIS 6$ ;YES: USE EOB RETURN PUSH R1 ;SAVE R1 AND R3 PUSH R3 MOV #-1,R3 ;SHOW LINE COMING AND GOING INTO MMT AREA MOV R3,R1 CALL MOVETL ;MOVE LINE POP R3 ;RESTORE R3 AND R1 POP R1 MOV R2,CP(R5) ;SAVE NEW POINTERS MOV R4,PP(R5) DEC (SP) ;ALL DONE? BGT 1$ ;NO: CONTINUE BR 5$ ;YES: RESTORE REGISTERS AND USE SUCCESS ; EXIT. .SBTTL INSERT LINE INTO TEXT BUFFER ; ; SUBROUTINE TO INSERT A LINE INTO THE TEXT BUFFER. (INSERTED ; LINES ARE ALWAYS IN THE FORWARD DIRECTION). ; ; CALLING SEQUENCE: ; ; MOV #LINE TO INSERT,R0 ; CALL INSRT ; BUFFER FULL RETURN ; LINE INSERTED SUCCESSFULLY RETURN ; ; REGISTERS AFFECTED: NONE ; INSRT: JSR R0,SAVER ;SAVE GP'S MOV 10(SP),R0 ;GET ADDRESS OF LINE TO INSERT TST (R0) ;NULL LINE? BEQ 1$ ;YES: RETURN AS IF LINE WAS INSERTED MOV CP(R5),R4 ;CALCULATE SIZE OF FREE AREA SUB PP(R5),R4 CMP (R0)+,R4 ;ENOUGH ROOM TO INSERT LINE? BHI MVINXT ;NO: RETURN AS BUFFER IS FULL. MOV PP(R5),R4 ;INSERT LINE NOW MOV R0,R2 PUSH R1 ;SAVE R1 AND R3 PUSH R3 CLR R1 ;SHOW LINE COMING FROM LOW CORE MOV #-1,R3 ;SHOW LINE GOING TO MMT AREA CALL MOVETL POP R3 ;RESTORE R3 AND R1 POP R1 MOV R4,PP(R5) ;SAVE UPDATED POINTER 1$: ADD #2,12(SP) ;SHOW SUCCESS EXIT MVINXT: JSR R0,RESTOR ;RESTORE GP'S RETURN ;RETURN TO CALLER ; .SBTTL $GETBY/$PUTBY - FETCH AND STORE USING EXTENDED MEMORY ; ;--- $GETBY - FETCH BYTE FROM EXTENDED MEMORY. ; ; R0 HAS RELATIVE ADDRESS ; ; ON RETURN: R1 HAS DATA ; ; $GETBY: CLR XSW ;SET SWITCH FOR FETCH BR $XXXBY ;PROCESS IT ; ;--- $PUTBY - STORE BYTE INTO EXTENDED MEMORY ; ; REGISTER SET UP AS IN $GETBY. DATA IN R1 ; $PUTBY: MOV #1,XSW ;SET SWITCH FOR STORE ; $XXXBY: PUSH R4 ;SAVE REGS PUSH R3 PUSH R2 .IF NDF NOMMT MOV MMT,R4 ;POINT TO MMT FOR THIS MACHINE BEQ 2$ ;NO MEMORY MANAGEMENT CALL ADJADR ;ADDRESS MEMORY PUSH @#PS ;SAVE CURRENT KERNEL PS PUSH 6(R4) ;SET UP TO USE PAR#6 ADD #14,@SP ;OFFSET TO PAR#6 FROM PAR#0 BIS #340,@#PS ;PROTECT IN KERNEL MODE MOV R2,@(SP)+ ;SET IT INTO THE REGISTER INC @10(R4) ;ENABLE MEMORY MANAGEMENT BIS #140000,@#PS ;ENTER USER STATE TST XSW ;FETCH OR STORE? BNE 5$ ; STORE IT MOVB 140000(R3),R1 ;FETCH MEMORY DATA (PAR#6) BR 6$ ;CONTINUE 5$: MOVB R1,140000(R3) ;STORE THE DATA 6$: BIC #140000,@#PS ;ENTER KERNEL STATE CLR @10(R4) ;DISABLE MEMORY MANAGEMENT POP @#PS ;RESTORE KERNELS PS BR 3$ ;RESTORE REGISTERS AND EXIT .ENDC ;.IF NDF NOMMT ; 2$: MOV BASE+2(R5),R2 ;GET BASE ADDRESS OF REGION ADD R0,R2 ;ADD OFFSET TST XSW ;FETCH OR STORE? BNE 7$ ;FETCH MOVB (R2),R1 ;GET THE DATA BR 3$ ;CONTINUE 7$: MOVB R1,(R2) ;STORE IT 3$: POP R2 ;RESTORE REGISTERS POP R3 POP R4 RETURN ;RETURN TO CALLER ; .SBTTL ADJADR - CONVERT 18 BIT ADDRESS TO PAGE/DISPLACEMENT ; ; ; ON ENTRY: R0 HAS RELATIVE ADDR ; ; ON EXIT: R2: PAR FOR PAGE; R3: DISPLACEMENT ; .IF NDF NOMMT ADJADR: MOV R0,R3 ;GET DISPLACEMENT ADD BASE+2(R5),R3 PUSH PS ;SAVE CARRY MOV R3,R2 ;COPY IT BIC #177400,R3 ;MOD 256 BIC R3,R2 ;LEAVE REMAINDER IN R2 ADD BASE(R5),R2 ;GET HIGH BITS IN LOW BYTE BIC #177776,(SP) ;GET CARRY AND ADD IT ALSO ADD (SP)+,R2 SWAB R2 ;NOW ALL IS CORRECT ASL R2 ;SHIFT INTO CORRECT POSITION ASL R2 ; LAST ONE. RETURN ;RETURN WITH CORRECT DATA .ENDC ;.IF NDF NOMMT ; .SBTTL MOVE TEXT LINE ; ;SUBROUTINE TO MOVE A LINE OF TEXT DELIMITED BY A LF OR FF. ; ; CALLING SEQUENCE: ; ; MOV #CODE,R1 ;WHERE CODE IS 0 IF LINE ; ; IS IN NON MMT AREA. ; MOV #16 BIT OFFSET ADDRESS,R2 ;WHERE LINE IS ; MOV #CODE,R3 ;WHERE CODE IS #0 IF LINE ; ; IS IN MMT AREA. ; MOV #16 BIT OFFSET ADDRESS,R4 ;WHERE LINE WILL GO ; CALL MOVETL ; MOVETL: PUSH R3 ;SAVE R0, R1, AND R3 PUSH R1 PUSH R0 .IF NDF NOMMT MOV MMT,R0 ;POINT TO MMT TABLE BEQ NOXMEM ;SKIP EXTENDED MEMORY INFO IF NO MMT ; HARDWARE ON THIS MACHINE. PUSH R0 ;SAVE ADDRESS ON STACK MOV R2,R0 ;SETUP SOURCE ADDRESS MOV R2,SAVER2 MOV R4,SAVER4 TST R1 ;SOURCE IN MMT AREA? BNE 1$ ;YES: SETUP MMT REGISTERS THEN MOV R2,R3 ;NO: USE ADDRESS AS IS CLR R2 BR 2$ 1$: CALL ADJADR ;ADJUST SOURCE ADDRESS 2$: MOV R4,R0 ;SET UP FOR DESTINATION ADDRESS ADD #6,(SP) ;SET INTO PAR #6 FOR SOURCE ADDRESS MOV @(SP),(SP) TST 4(SP) ;SOURCE ADDRESS NEED MMT? BEQ 3$ ;NO: USE ADDRESS AS IS PUSH (SP) ;SAVE FOR FUTURE USE ADD #14,(SP) ;INSERT OFFSET VALUE MOV R2,@(SP)+ ;SET IT UP 3$: MOV R3,R1 ;SAVE IT TST 6(SP) ;DESTINATION ADDRESS IN MMT? BNE 4$ ;YES: SETUP PAR THEN MOV R0,R3 ;NO: USE ADDRESS AS IS THEN TST (SP)+ ;CLEAN UP STACK BR SET1 ;SETUP MMT AND TRANSFER LINE NOW 4$: CALL ADJADR ;ADJUST DESTINATION ADDRESS TST PC ;SEE IF WE USE REG 5 OR 0 BMI SET0 ;USE REG 0 ADD #12,(SP) ;SET OFFSET ADD #120000,R3 ;ALSO INTO DISPLACEMENT SET0: MOV (SP),SAVE1$ ;SAVE ADDRESS MOV @(SP),SAVE2$ ;AND ITS CONTENTS MOV R2,@(SP)+ ;SET UP SET1: MOV R1,R2 ;GET ADDRESS TST 2(SP) ;LOW CORE ADDRESS? BEQ 2$ ;YES: DON'T RELOCATE ADDRESS FOR MMT USE THEN ADD #140000,R2 ;SETUP DISPLACEMENT 2$: MOV MMT,R0 ;ENABLE MMT PUSH @#PS ;SAVE KERNEL'S PS BIS #340,@#PS ;PROTECT IN KERNEL MODE INC @10(R0) BIS #140000,@#PS ;ENTER USER STATE 1$: INC SAVER2 ;BUMP TO NEXT POSITION INC SAVER4 3$: MOVB (R2)+,(R3) ;PASS DATA CMPB (R3)+,#14 ;FF OR LF? BGT 1$ ;NO CMPB -1(R3),#14 ;COULD BE, CHECK IT SOME MORE BEQ 4$ ;YES CMPB -1(R3),#12 ;LF? BNE 1$ ;NO: DO NEXT PIECE OF DATA 4$: BIC #140000,@#PS ;BACK TO KERNEL MODE CLR @10(R0) ;DISABLE MMT POP @#PS ;RESTORE KERNEL MODE NON-PROTECTED MOV SAVER2,R2 ;RETURN UPDATED R2 AND R4 MOV SAVER4,R4 MOV SAVE2$,@SAVE1$ ;RESTORE USER REGISTER BR MOVEND ;RESTORE REGISTERS AND EXIT .ENDC ;.IF NDF NOMMT ; NOXMEM: PUSH BASE+2(R5) ;GET BASE ADDRESS OF REGION TST R1 ;ADD IT IN TO ALL ADDRESSES IF NECESSARY BEQ 3$ ADD (SP),R2 3$: TST R3 BEQ 1$ ADD (SP),R4 1$: MOVB (R2)+,(R4) ;PASS BYTES CMPB (R4)+,#14 ;LF OR FF? BGT 1$ ;NO CMPB -1(R4),#12 ;COULD BE, HOW ABOUT AN LF? BEQ 2$ ;YES CMPB -1(R4),#14 ;FF? BNE 1$ ;NO: KEEP LOOKING 2$: TST R1 ;SUBTRACT OFF BASE ADDRESS BEFORE BEQ 4$ ; STORING NEW POINTERS. SUB (SP),R2 4$: TST R3 BEQ 5$ SUB (SP),R4 5$: TST (SP)+ ;CLEAN UP STACK MOVEND: POP R0 ;RESTORE REGISTERS POP R1 POP R3 RETURN ;RETURN TO CALLER ; .END .SBTTL TTY SECTION .TITLE REMOTE V01-X03 .NLIST TTM,ME .CSECT REMTTY EDIT=003. ; ; ; PDP-11 RT-11 MULTI-USER LINE TEXT EDITOR AND DOWN LINE LOADER ; ; PROGRAM NAME: LETTER / REMOTE-11 ; ; TTY SECTION: VERSION LEVEL V01-X03: PATCH LEVEL A ; ; AUTHOR: RICK HULLY ; ; DATE: SEP., 1975 ; ; ; COPYRIGHT (C) 1975 ; ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- ; SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER ; COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE ; TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO ; AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE ; SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; .SBTTL CONDITIONAL ASSEMBLY PARAMETERS ; ; THE FOLLOWING CONDITIONAL ASSEMBLY PARAMETERS PERTAIN TO THIS ; SECTION. ; ; NO CONDITIONALS SPECIFIED YIELDS: ; REMOTE FUNCTIONS FOR DOWN-LINE LOADING OF PROGRAMS ; FAST CRC CALCULATION ; "XOR" IS ASSUMED ON THE HOST MACHINE ; 2 USER VERSION OF REMOTE-11 ; ; IF DEFINED "NODDC", THE REMOTE DOWN LINE LOADING FUNCTIONS ; ARE REMOVED. ; ; IF DEFINED "NOXOR", THE XOR INSTRUCTIONS USED IN CRC ; CALCULATIONS ARE PERFORMED USING BIC AND BIS ; INSTRUCTIONS. ; ; IF DEFINED "SCRC", THE SMALL VERSION OF THE CRC CALCULATOR ; REPLACES THE FASTER TABLE LOOKUP VERSION. ; ; IF DEFINED "DIAL", FULL DIAL-UP SUPPORT IS INCLUDED FOR THE ; DL11-E COMMUNICATIONS INTERFACE. ; ; IF DEFINED "KG11", CRC CALCULATIONS ARE DONE USING THE KG11-A ; HARDWARE REDUNDANCY-CHECK CALCULATOR. ; .IIF NDF NUSERS, NUSERS=2. .SBTTL PROGRAM DEFINITIONS ; R0 = %0 ;GENERAL REGISTERS R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 RETURN = 207 ;RETURN = RTS PC .EXIT = EMT+350 ;.EXIT PROGRAMMED REQUEST SWR = 177570 ;SWITCH REGISTER PS = -2 ;PROCESSOR STATUS WORD RMON = 54 ;ADDRESS OF RMON .IF NDF NODDC DLE = 220 ;DLE CHARACTER SYN = 377 ;SYNC CHARACTER (ASYNC) POLY = 120001 ;CRC-16 POLYNOMINAL DLECRC = 66000 ;DLE CRC CHARACTER VALUE SYNDLE = 110377 ;SYN AND DLE CHARACTERS .ENDC ;.IF NDF NODDC LINELN = 130. ;MAXIMUM LINE LENGTH TTINBF = LINELN+4 ;SIZE OF TTY INPUT BUFFER TTOUBF = 20. ;SIZE OF TTY OUTPUT BUFFER .IF NDF NODDC SOFTVC = 150 ;SOFTWARE VECTORS WHICH MUST BE PROTECTED ; (LOCATIONS 150-167). .ENDC ;.IF NDF NODDC ; .IF DF KG11 ;DEFINE KG11-A REGISTER ADDRESSES KGSR = 170700 ;STATUS REGISTER KGBCC = KGSR+2 ;BCC REGISTER KGDAT = KGSR+4 ;DATA REGISTER .ENDC ;KG11 ; PRI=^C<200>&340 ; .SBTTL GLOBALS ; .GLOBL QUIT,XOFF,DDCMP,DFLAG,CTIME,DDCMPE,DLVEC,SYNS .GLOBL SWITCH,SW2,DDCMPO,CMD,BCNT,DDCMPI,CRC,OUTBUF .GLOBL NEEDLN,NEEDRM,TTOCLO,TTYTAB,TTOTAB,TTILCT .GLOBL TTIPRE,TPS,TKB,TPB,OUTCH,FILLIT,FILLCT,FG .GLOBL DWAIT,SR5,RSUME,TYPEIN,TYPE,.TTOUT,.TTIN .GLOBL .PRNT,TTOPUT,RESTOR,SAVER,RUBCOM .GLOBL TKS .IF DF DIAL .GLOBL TKSSAV .ENDC ; .IIF NDF NODDC, .GLOBL CALCRC ; .GLOBL USER1 .IIF GT NUSERS-1, .GLOBL USER2 .IIF GT NUSERS-2, .GLOBL USER3 .IIF GT NUSERS-3, .GLOBL USER4 .IIF GT NUSERS-4, .GLOBL USER5 .IIF GT NUSERS-5, .GLOBL USER6 .IIF GT NUSERS-6, .GLOBL USER7 .IIF GT NUSERS-7, .GLOBL USER8 ; .SBTTL MACRO DEFINITIONS ; .MCALL ..V2.. ..V2.. .MCALL .SPND,.RSUM,.SERR,.HERR ; .MACRO PUSH CELL MOV CELL,-(SP) .ENDM PUSH ; .MACRO POP CELL MOV (SP)+,CELL .ENDM POP ; .MACRO CALL ROUTINE JSR PC,ROUTINE .ENDM CALL ; .MACRO MOVR X,Y MOV X,Y ADD R5,Y .ENDM MOVR ; .IF DF NOXOR .MACRO XOR,A,B PUSH A BIC B,(SP) BIC A,B BIS (SP)+,B .ENDM XOR .ENDC ;.IF DF NOXOR ; .MACRO .WAIT JSR PC,DWAIT .ENDM .WAIT ; .MACRO .TTYIN JSR PC,.TTIN .ENDM .TTYIN ; .MACRO .TTYOUT .CHAR .IF NB .CHAR MOVB .CHAR,R0 .ENDC ;.IF NB .CHAR JSR PC,.TTOUT .ENDM .TTYOUT ; .MACRO TTYIN,X .LIST ME .GLOBL TTYIN'X TTYIN'X: .IF NDF NODDC TSTB DDCMP ;IN DDCMP MODE? ;INITIALIZED TO TSTB DDCMP+USER'X BNE 1$ ;YES .ENDC ;.IF NDF NODDC JSR R5,@RMON ;NO: SET UP INTERRUPT THEN .WORD PRI 1$: JSR R0,SVREG ;SAVE REGISTERS FOR USER #'X USER'X ;ADDRESS OF USER AREA #'X .IIF NE X-NUSERS, BR TTICOM .NLIST ME .ENDM TTYIN ; .MACRO TTYOT,X .LIST ME .GLOBL TTYOT'X TTYOT'X: JSR R5,@RMON ;SET UP INTERRUPT .WORD PRI JSR R0,SVREG ;SAVE REGISTERS FOR USER #'X USER'X ;ADDRESS OF USER AREA #'X .IIF NE X-NUSERS, BR TTOCOM .NLIST ME .ENDM TTYOT ; .MACRO .MTPS,X MOV X,-(6.) MOV #.+6.,-(6.) RTI .ENDM .MTPS ; .MACRO .CLRPS CLR -(6.) MOV #.+6.,-(6.) RTI .ENDM .CLRPS ; .SBTTL TTY I/O ROUTINES ; ;ROUTINE TO ACCEPT INPUT FROM USER'S KEYBOARD ; TYPEIN: MOVR #CMD,R0 ;GET ADDRESS OF COMMAND BUFFER PUSH R0 ;SAVE R0, R1 AND R2 PUSH R1 PUSH R2 MOV #LINELN,R2 ;DON'T ALLOW MORE THAN 130 CHARACTERS PER LINE MOV R0,R1 ;WHERE CHARACTERS WILL END UP TST (R1)+ 1$: .TTYIN ;GET A CHARACTER 6$: MOVB R0,(R1)+ ;SAVE IT CMPB R0,#14 ;FF? BEQ 5$ ;YES: ATTACH CR/LF JUST IN CASE DEC R2 ;TO MANY CHARACTERS INPUT? BNE 4$ ;NO: CONTINUE INC R2 ;YES: IGNORE ALL TILL LINE TERMINATOR DEC R1 BR 1$ 4$: CMP R0,#12 ;TERMINATE ON AN LF BNE 1$ ;NOT YET, CONTINUE MOV R1,R0 ;SAVE END POINTER SUB 4(SP),R1 ;DETERMINE HOW MANY CHARACTERS SUB #2,R1 ; WERE RECEIVED. CMP R1,#1 ;IF LINE HAS LENGTH GREATER THAN ONE, MAKE BEQ 2$ ; SURE ITS TERMINATED WITH A CR/LF. DEC R0 CMPB -1(R0),#15 BEQ 2$ MOVB #15,(R0)+ MOVB #12,(R0)+ INC R1 2$: MOV R1,@4(SP) POP R2 ;RESTORE R2, R1, AND R0 POP R1 POP R0 RETURN ;RETURN TO CALLER 5$: MOVB #15,(R1)+ ;TERMINATE LINE WITH CR/LF MOVB #12,R0 BR 6$ ; ; ; ROUTINE TO TYPE LINE SPECIFIED BY R0 ON USER'S TTY ; TYPE: JSR R0,SAVER ;SAVE GP'S MOV 10(SP),R0 ;GET ADDRESS OF LINE TO TYPE MOVB (R0)+,R1 BISB (R0)+,R1 BEQ 5$ ;IGNORE NULL LINES MOV R0,R1 1$: MOVB (R1)+,R0 ;GET A CHARACTER BEQ 2$ ;GENERATE CR/LF FOR ASCIZ STRINGS CMPB #14,R0 ;FF TERMINATES BEQ 5$ 3$: PUSH R0 ;SAVE R0 TEMP .TTYOUT ;TYPE CHAR POP R0 ;RESTORE R0 CMPB #12,R0 ;LF TERMINATES BNE 1$ ;NOT YET: CONTINUE 5$: JSR R0,RESTOR ;RESTORE GP'S RETURN ;RETURN TO CALLER 2$: MOVB #15,R0 ;ECHO CR/LF .TTYOUT MOV #12,R0 BR 3$ ; .SBTTL TTY HANDLER ; .TTIN: TSTB DDCMP(R5) ;IN DDCMP MODE? BNE 3$ ;YES: BEAT IT OUT OF HERE .MTPS #200 ;PROTECT WHILE LOOKING AT DYNAMIC FLAGS TST TTILCT(R5) ;GOT ANY DATA BEQ NOINPT ;NO .CLRPS ;RETURN TO MAIN STREAM PUSH R4 ;SAVE R4 MOV TTYTAB(R5),R4 ;POINT AT CHARACTER TST (R4)+ ;@ GET POINTER INC (R4) ;@ NEXT CHARACTER CMP (R4),2(R4) ;WRAP? BNE 1$ ;NO SUB #TTINBF,(R4) ;YES 1$: MOVB @(R4),R0 ;GET CHARACTER DEC -(R4) ;DECREMENT CHARACTER COUNT CMPB R0,#12 ;END OF LINE? BNE 2$ ;NO DEC TTILCT(R5) ;YES DECREMENT LINE COUNTER 2$: POP R4 ;RESTORE R4 3$: RETURN ;RETURN TO CALLER ; NOINPT: INCB NEEDLN(R5) ;INDICATE A LINE IS NEEDED .CLRPS ;RESTORE INTERRUPTS .WAIT ;WAIT TILL LINE GETS IN BR .TTIN ;PROCESS LINE NOW ; ; .PRNT: PUSH R3 ;SAVE R3 1$: MOVB (R0)+,R3 ;GET CHARACTER BEQ 2$ ;DONE - OUTPUT CR/LF NOW CALL TTOPUT ;OUTPUT CHARACTER BR 1$ ;GET NEXT CHARACTER 2$: MOVB #15,R3 ;NOW DO A CR/LF CALL TTOPUT MOVB #12,R3 .P0: CALL TTOPUT POP R3 ;RESTORE R3 RETURN ;RETURN TO CALLER ; ; .TTOUT: PUSH R3 ;SAVE R3 MOV R0,R3 BR .P0 ;OUTPUT CHARACTER ; ;BASIC TTY OUTPUT CHARACTER ROUTINE ; TTOPUT: .MTPS #200 ;PROTECT WHILE LOOKING AT DYNAMIC FLAGS CALL OPUT ;INSERT CHARACTER BCC OPUT1 ;CHARCTER WAS INSERTED - RETURN INCB NEEDRM(R5) ;INDICATE OUTPUT ROOM IS NEEDED .CLRPS ;RESTORE INTERRUPTS 1$: .WAIT ;WAIT FOR OUTPUT BUFFER ROOM TSTB NEEDRM(R5) ;DID WE GET ROOM YET? BNE 1$ ;NO: WAIT SOME MORE THEN BR TTOPUT ;PROCESS CHARACTER NOW ; OPUT: PUSH R2 ;SAVE R2 TST TTOCLO(R5) ;SHOULD WE OUTPUT THIS ONE? BNE 1$ ;NO BIC #177400,R3 ;CLEAR ALL BUT 8 BITS MOV TTOTAB(R5),R2 ;POINT TO COUNT CMP #TTOUBF-1,(R2) ;WILL IT FIT? BLO 2$ ;NO: EXIT MOVB R3,@-(R2) ;YES: PUT IT IN INC (R2) CMP (R2),6(R2) ;TIME TO WRAP? BLO 3$ ;NO SUB #TTOUBF,(R2) ;YES: DO IT 3$: INC 2(R2) ;INCREMENT COUNT IN BUFFER .CLRPS MOV #100,@TPS(R5) ;ENABLE TELEPRINTER 1$: CCC ;SHOW SUCCESS 4$: POP R2 ;RESTORE R2 RETURN ;RETURN TO CALLER 2$: SEC ;SHOW FAILURE BR 4$ OPUT1: .CLRPS ;RETURN TO MAINSTREAM LEVEL RETURN ; ; ;TTY INTERRUPT HANDLER ; TTCNT=1 .REPT NUSERS ;GENERATE INTERRUPT ENTRANCES FOR ALL USERS .RADIX 10. TTYIN \TTCNT TTCNT=TTCNT+1 .RADIX 8. .ENDR TTICOM: .IF DF DIAL ;DL11-E DIAL-UP SUPPORT MOV @TKS(R5),R0 ;GET RECEIVER STATUS REG ;THIS READ RESETS BIT 15 TO 0 BPL 6$ ;BIT15 OFF MEANS NOT CAUSE OF INTRPT ; OTHERWISE, BIT 14,13,12 OR 10 HAS CHANGED MOV #140,R3 ;(LOAD TKS INTRPT=ENABLE FLAGS) BIC R3,@TKS(R5) ;DISABLE INPUT INTRPTS THIS DEV ROL R0 ;ROTATE BIT14, RING, TO SIGN MOV TKSSAV(R5),R1 ;GET OLD TKS VALUE (ROTATED) MOV R1,R2 ;COPY MOV R0,TKSSAV(R5) ;SAVE NEW VALUE FOR NEXT TIME BPL 7$ ;BR IF NOT RINGING NOW BIS #2,@TKS(R5) ;ELSE ANSWER RING WITH DATA-TERMINAL-RDY 7$: BIC R0,R1 ;DO XOR, TO SEE IF BIT 12, CARRIER- BIC R2,R0 ;DETECT, CHANGED BIS R0,R1 ROL R1 ;PUT BIT 12 IN SIGN ROL R1 BPL 8$ ;0 MEANS IT DIDN'T CHANGE ; OTHERWISE IT CHANGED. SEE WHICH WAY. BIT #20000,R2 ;WAS IT ON BEFORE? BEQ 9$ ;BR IF NO (IT'S ON NOW) BIC #2,@TKS(R5) ;YES=WENT FROM 1 TO 0. CLEAR DATA-TERM-RDY BR 8$ 9$: CMP (R3)+,(R3)+ ;WENT 0 TO 1; SET R3=144 TO SET ;REQ-TO-SEND BIT 8$: BIS R3,@TKS(R5) ;NOW RE-ENABLE INTRPTS TSTB DDCMP(R5) ;DID WE CALL RMON ABOVE? BEQ 10$ ;BR IF YES JMP DMEXIT ;NO, JUST RESTORE REGS AND RTI 10$: JMP TTIEX3 ;YES, DO RMON RETURN ; 6$: ;NORMAL BYTE-IN INTERRUPT. CONTINUE .ENDC ;DIAL MOVB @TKB(R5),R0 ;GET CHARACTER .IF NDF NODDC TSTB DDCMP(R5) ;IN DDCMP MODE? BEQ 1$ ;NO JMP IDDCMP ;YES: PROCESS DDCMP REQUEST 1$: TST DLVEC(R5) ;CAN WE PROCESS DDCMP MESSAGES FOR THIS GUY? BEQ 5$ ;NO: NO SATELLITE CONNECTED HERE CMPB R0,#SYN ;SYNC CHARACTER? BEQ 3$ ;YES: SEE IF ITS 1ST OR 2ND ONE CMPB R0,#DLE ;NO: DLE CHARACTER? BNE 5$ ;NO: JUST NORMAL CHARACTER THEN TSTB SYNS(R5) ;2 OR MORE SYN'S RECEIVED? BLE 5$ ;NO: CLEAR SYN FLAG AND TREAT DLE AS ; A CONTROL-P. COMB DDCMP(R5) ;ENTER DDCMP INPUT MODE CLRB SYNS(R5) ;CLEAR SYNCH CHARACTER FLAG MOV #DLECRC,CRC(R5) ;SETUP CRC VALUE FOR 'DLE' RECEIVED CLR @TPS(R5) ;DISABLE OUTPUT MOV TTOTAB(R5),R4 ;PURGE ANY OUTPUT CLR (R4)+ MOV -(R4),(R4) 12$: MOV TTYTAB(R5),R4 ;AND ANY INPUT TST (R4) ;ANY CHARACTERS LEFT? BEQ 11$ ;NO: ALL DONE TST -(R4) CALL RUBCOM ;REMOVE A CHARACTER BR 12$ ;CONTINUE TILL ALL EMPTY 11$: MOV #-7.,BCNT(R5) ;ASSUME 7 BYTES LEFT IN HEADER SINCE ; WE'VE ALREADY RECEIVED THE SYN'S AND DLE. MOVR #OUTBUF,DDCMPI(R5) ;SETUP BUFFER HEADER CLRB DFLAG(R5) ;INDICATE MESSAGE IS NOT IN YET MOVB #2,CTIME(R5) ;SETUP TIME OUT OF 2 SECONDS MAXIMUM FOR ; NEXT CHARACTER TO ARRIVE. JMP TTIEX3 ;EXIT NOW 5$: CLRB SYNS(R5) ;CLEAR SYN FLAG .ENDC ;.IF NDF NODDC BIC #177600,R0 ;SAVE LOWEST 7 BITS BNE TTICM 2$: JMP TTIEX3 ;IGNORE NULLS .IF NDF NODDC 3$: NEGB SYNS(R5) ;1ST OR 2ND SYN? BEQ 4$ ;1ST: OK SET FLAG AND EXIT MOVB #1,SYNS(R5) ;2ND, RESET FLAG BR 2$ 4$: MOVB #-1,SYNS(R5) ;SET FLAG BR 2$ .ENDC ;.IF NDF NODDC TTICM: MOV TTYTAB(R5),R4 ;POINT TO CHARACTER COUNT 2$: CMPB R0,#141 ;LOWER CASE? BLT 3$ ;NO CMPB R0,#174 ;ADD ESCAPES AND RUBOUTS? BGT 3$ BIC #40,R0 ;NO CONVERT TO UPPER CASE 3$: MOV TTIPRE(R5),R1 ;GET PREVIOUS CHARACTER MOV #LS,R2 4$: CLR R3 ;CUZ MOVB IS WIERD BISB (R2)+,R3 ;END OF TABLE? BEQ T.SPEC ;YES: COULD BE A SPECIAL CHARACTER CMPB (R2)+,R0 ;MATCH? BNE 4$ ;NO CONTINUE LOOKING ADD R3,PC ;YES: DISPATCH TO IT LS: .BYTE CTRLO-LS,17 ;^O? .BYTE CTRLCC-LS,03 ;^C? .BYTE ALT-LS,33 ;ESC? .BYTE ALT-LS,175 ;ESC? .BYTE ALT-LS,176 ;ESC? .BYTE RUBT-LS,177 ;RUBOUT? .BYTE CTRLPP-LS,20 ;^P? .BYTE TTINCC-LS,15 ;CR? .BYTE TTIEX3-LS,14 ;FF? .BYTE TTINCC-LS,13 ;VT? .BYTE TTINCC-LS,12 ;LF? .BYTE TTINCC-LS,11 ;HT? .BYTE CTRLUJ-LS,25 ;^U? .BYTE X.OFF-LS,23 ;^S? .BYTE X.ON-LS,21 ;^Q? .BYTE 0 ;END OF TABLE .EVEN RUBT: JMP RUB CTRLUJ: JMP CTRLU CTRLCC: JMP CTRLC CTRLPP: JMP CTRLP ALT: MOVB #33,R0 ;PASS ONLY 33 BR TTINCC ;SAVE IT X.OFF: MOVB R0,XOFF(R5) ;SET ^S FLAG BR TTIEX3 ;NOW EXIT X.ON: CLRB XOFF(R5) ;CLEAR ^S FLAG CLR @TPS(R5) ;RESET TTY OUTPUT HARDWARE BIS #100,@TPS(R5) ;NOW ENABLE TTY OUTPUT BR TTIEX3 ;EXIT T.SPEC: CMPB R0,#40 ;PRINTABLE CHARACTER? BGE TTINCC ;YES CALL EKOR0 ;NO ECHO AS A CONTROL CHARACTER TTINCC: CMPB #177,R1 ;PREVIOUS CHARACTER A RUBOUT? BNE CHR.IN ;NO: INSERT IT MOV #134,R3 ;ECHO A BACK SLASH CALL OPUT ;OUTPUT IT CHR.IN: MOV #7,R3 ;OUTPUT BELL IF BUFFER IS FULL CMP (R4),#TTINBF ;BUFFER FULL? BGE TTIEXZ ;YES: LEAVE TTIPRE ALONE INC (R4) ;INCREMENT CHARACTER COUNT INC -(R4) ;INCREMENT PUT PTR CMP (R4),6(R4) ;TIME TO WRAP AROUND? BNE 1$ ;NO SUB #TTINBF,(R4) ;YES START OVER 1$: MOVB R0,@(R4)+ ;INSERT CHARACTER MOV R0,R3 ;OUTPUT CHARACTER NOW CMPB R0,#12 ;LINE TERMINATOR? BNE TTIEXI ;NO INC TTILCT(R5) ;YES: INCREMENT LINE COUNT TSTB NEEDLN(R5) ;WAS USER LOOKING FOR A LINE? BEQ TTIEXI ;NO CLRB NEEDLN(R5) ;YES: CLEAR FLAG BIS #4000,SW2(R5) ;TELL HIM HIS LINE IS READY TTIEXI: MOV R0,TTIPRE(R5) ;SAVE CHARACTER TTIEXZ: CMPB R0,#33 ;ESC? BNE 2$ ;NO MOVB #'$,R3 ;YES: ECHO "$" INSTEAD 2$: CALL OPUT ;OUTPUT THE CHARACTER CMPB R0,#13 ;LAST CHARACTER A VT? BNE 1$ ;NO MOVB #15,R0 ;YES: ADD A CR/LF TO IT JMP TTICM 1$: SUB #3,R0 ;FOR NEXT TEST CMPB R0,#12 ;WAS LAST CHARACTER A CR? BEQ CHR.IN ;YES: INSERT AN LF TTIEX3: MOV R5,SR5 ;SAVE R5 TEMPORARILY JSR R0,RSTREG ;RESTORE REGISTERS MOV SR5,R5 ;RESTORE R5 TSTB FG ;ARE IN THE FG? BEQ TTIEX1 ;NO BIT #4000,SW2(R5) ;USER RUNNABLE? BEQ TTIEX1 ;NO TTIEX2: MOV @#54,R5 ;GET ADDRESS OF RMON MOV #RSUME,R4 ;SET UP TO RESUME JOB JSR R5,@324(R5) BR TTIEX1 ;TASK ALREADY TO BE RESUMED SO DON'T ; RESUME IT AGAIN. .RSUM ;RESUME USER TTIEX1: RETURN ;EXIT ; ; CTRLO: MOV TTOTAB(R5),R3 ;POINT TO OUTPUT CLR (R3)+ ;CLEAR OUTPUT COUNT MOV -4(R3),(R3) ;MAKE GET = PUT CALL EKOR0 ;ECHO THE ^O COM TTOCLO(R5) ;TOGGLE THE ^O FLAG TTCRLF: CALL TTLFCR ;ECHO A CR/LF BR TTIEX3 ;RESTORE REGISTERS AND EXIT ; CTRLC: BIS #4000,SW2(R5) ;SET USER'S GO BIT CTRLP: CLR QUIT(R5) ;QUIT CURRENT OPERATION FOR THIS USER AND ; TREAT THIS NOW AS A CONTROL O. BIC #100,SWITCH(R5) BIC #62024,SW2(R5) MOV TTOTAB(R5),R3 ;POINT TO OUTPUT CLR (R3)+ ;CLEAR OUTPUT COUNT MOV -4(R3),(R3) ;MAKE GET = PUT CTRLU: CALL EKOR0 ;ECHO A ^U TTICTL: TST (R4) ;ANY CHARACTERS? BEQ TTIBUM ;NO MOVB @-(R4),R3 ;YES: GET ONE CMPB R3,#12 ;LINE TERMINATOR? BEQ TTIBUM ;YES CALL RUBCOM ;NO: RUB IT OUT BR TTICTL ;CONTINUE TTIBUM: CLR TTIPRE(R5) ;CLEAR SAVED CHARACTER BR TTCRLF ;ECHO CR/LF TTICLR: CLR TTIPRE(R5) ;CLEAR OUT PREVIOUS CHAR BR TTIEX3 ; RUB: TST (R4) ;ANY CHARACTERS BEQ TTICLR ;NO: NOTHING TO RUBOUT MOVB @-(R4),R3 ;GET LAST CHARACTER CMPB R3,#12 ;LINE TERMINATOR? BEQ TTIBUM ;YES: ALL DONE CMPB R0,R1 ;LAST CHARACTER A RUBOUT TOO? BEQ 1$ ;YES MOVB #134,R3 ;OUTPUT A BACK SLASH CALL OPUT MOV R0,TTIPRE(R5) 1$: MOVB @(R4),R3 ;NOW RUBOUT THE CHARACTER CALL RUBCOM MOV R3,R0 ;NOW ECHO THE CHARACTER RUBBED OUT BR TTIEXZ ; TTLFCR: JSR R4,ECHO ;ECHO A CR/LF .BYTE 15,12 RETURN ; RUBCOM: CMP (R4),-2(R4) ;WRAP? BNE 1$ ;NO ADD #TTINBF,(R4) ;YES: BACKWARDS 1$: DEC (R4)+ ;ADJUST COUNTER AND POINTER DEC (R4) RETURN ;RETURN TO CALLER ; .SBTTL DDCMP INPUT INTERRUPT PROCESSOR ; .IF NDF NODDC IDDCMP: TSTB DFLAG(R5) ;COMPLETION FLAG SET? BNE DMEXIT ;YES: IGNORE REQUEST THEN TSTB CTIME(R5) ;HAS TO MUCH TIME ELASPED BETWEEN RECEIVED ; CHARACTERS? BEQ DMFAIL ;YES: SET COMPLETION FLAG SHOWING ERROR MOVB #2,CTIME(R5) ;NO: RESET CHARACTER TIMER MOVB R0,@DDCMPI(R5) ;SAVE BYTE IN BUFFER INC DDCMPI(R5) ;INCREMENT BUFFER POINTER .IF NDF KG11 MOV CRC(R5),R1 ;GET CURRENT CRC CALL CALCRC ;CALCULATE CRC FOR THIS BYTE MOV R1,CRC(R5) ;SAVE NEW CRC .ENDC ;KG11 TST BCNT(R5) ;HEADER OR DATA SECTION? BPL DOL1 ;DATA ; ; HEADER BLOCK PROCESSING ; INC BCNT(R5) ;INCREMENT HEADER BYTE COUNT BMI DMEXIT ;MORE BYTES TO GO YET .IF DF KG11 ;DO HARDWARE CRC COMPUTATION PUSH #3$ ;SAVE RETURN ADDRESS FOR BYM ROUTINE PUSH KGBCC ;SAVE CURRENT KG11 BCC PUSH KGSR ;SAVE CURRENT KG11 STATUS MOV #132,KGSR ;SET LRC-16 MODE, 16-BIT, AND CLEAR MOV #DLECRC,KGDAT ;MOV IN INITIAL CRC OF DLE MOV #7,R1 ;NUMBER BYTES FOR BYM ROUTINE MOV DDCMPI(R5),R2 ;GET ADDR WHERE NEXT BYTE WOULD BE PUT SUB R1,R2 ;COMPUTE ADDR WHERE FIRST BYTE IS BR BYM2 ;AND GO TO BYTE-AT-A-TIME CRC ROUTINE 3$: ;STORES CRC AND RETURNS HERE .ENDC ;KG11 TST CRC(R5) ;HEADER IS IN, TEST CRC BNE DMFAIL ;ERROR: SET ERROR FLAG MOV OUTBUF(R5),BCNT(R5) ;GET BYTE COUNT OF DATA FIELD BIC #140000,BCNT(R5) ;MASK OFF S AND F BITS ADD #2,BCNT(R5) ;GET CRC OF DATA FIELD ALSO MOVR #OUTBUF,DDCMPI(R5) ;RESET BUFFER POINTER TO BEGINNING ; OF BUFFER. CMP BCNT(R5),#521. ;BYTE COUNT > 521. BYTES? BGT DMFAIL ;YES: ERROR THEN, SET ERROR FLAG BR DMEXIT ;EXIT AND WAIT FOR DATA TO ARRIVE ; ; RESTORE REGS AND EXIT ; DMEXIT: JSR R0,RSTREG ;RESTORE REGISTERS RTI ;RETURN TO INTERRUPTED PROGRAM ; ; DATA BLOCK PROCESSING ; DOL1: DEC BCNT(R5) ;DECREMENT DATA FIELD BYTE COUNT BGT DMEXIT ;MORE BYTES TO GO .IF DF KG11 ;DO HARDWARE CRC CALCULATION MOV DDCMPI(R5),R1 ;GET ADDR WHERE NEXT BYTE WOULD BE PUT MOV #OUTBUF,R2 ;COMPUTE WHERE FIRST BYTE IS, AND ADD R5,R2 ;LEAVE IN R2 SUB R2,R1 ;MAKE R1 = BYTE COUNT (R2 SHOULD BE EVEN) PUSH #BYMR ;PUT BYM RETURN-ADR ON STACK FOR ROUTINE PUSH KGSR ;SAVE STATUS OF KG11 PUSH KGBCC ;SAVE KG11 CURRENT BCC (CRC) MOV #131,KGSR ;SET CRC-16 MODE, WORDS, CLEARING DEC R1 ;START LOOP; PREPARE TO CATCH ODD BYTE 2$: TSTB KGSR ;KG11 READY BPL 2$ MOV (R2)+,KGDAT ;FEED CRC CALCULATOR NEXT WORD SUB #2,R1 ;DEC BYTE COUNT BY 2 BGT 2$ ;R1>0 MEANS AT LEAST TWO BYTES LEFT BMI BYM3 ; -1 MEANS NO BYTES LEFT ;OTHERWISE 1 BYTE LEFT, FALL INTO BYM BYM2: MOV #101,KGSR ;SAY CRC-16 MODE, BYTES, DON'T CLEAR 1$: TSTB KGSR ;READY? BPL 1$ MOVB (R2)+,KGDAT ;FEED CRC CALCULATOR NEXT BYTE DEC R1 ;COUNT DOWN BGT 1$ ;GO BACK UNTIL DONE BYM3: MOV KGBCC,CRC(R5) ;STORE COMPUTED CRC MOV #132,KGSR ;NOW RESTORE KG11 TO PREVIOUS STATE ;SET LRC-16 MODE, WORD, CLEARING POP KGDAT ;GET OLD BCC (CRC), AND LOAD POP KGSR ;RESTORE OLD KGSR STATUS, BITS 6,5,3-1 RTS PC ;AND GO TO RIGHT RETURN POINT BYMR: .ENDC ;KG11 MOVB #1,DFLAG(R5) ;SET COMPLETION FLAG SHOWING SUCCESS TST CRC(R5) ;ALL BYTES IN, CHECK CRC BEQ DMCOMP ;OK ; DMFAIL: MOVB #-1,DFLAG(R5) ;SET COMPLETION FLAG SHOWING ERROR ; DMCOMP: BIS #4000,SW2(R5) ;SET USER'S GO BIT MOV R5,SR5 ;SAVE R5 TEMPORARILY JSR R0,RSTREG ;RESTORE ALL REGISTERS JSR R5,@54 ;SETUP INTERRUPT STACK .WORD ^C<200>&340 MOV SR5,R5 ;RESTORE R5 JMP TTIEX2 ;SYNCHRONIZE NOW WITH RT11 AND RESUME USER .SBTTL CRC CALCULATOR ; ; ROUTINE TO CALCULATE CRC-16 POLYNOMINAL ; ; CALLING SEQUENCE: ; ; MOVB BYTE,R0 ; MOV CRC,R1 ; CALL CALCRC ; CALCRC: PUSH R2 ;SAVE R2 .IF DF SCRC PUSH #8. ;BYTE LENGTH IS 8 BITS BIC #177400,R0 ;CLEAR OUT HIGH BITS MOV #POLY,R2 ;GET POLYNOMINAL READY CRCLOP: CLC ;INITIALIZE CARRY BIT ROR R1 ;SHIFT OLD PARTIAL ROR R0 ;SHIFT BYTE BVC 1$ ;XOR POLYNOMINAL ; XOR R2,R1 ;XOR POLYNOMINAL WITH PARTIAL 1$: DEC (SP) ;DECREMENT BIT COUNT BGT CRCLOP ;MORE BITS TO GO TST (SP)+ ;CLEAN UP STACK .ENDC ;.IF DF SCRC .IF NDF SCRC XOR R1,R0 ;XOR OLD CRC AND DATA CHAR MOV R0,R2 ;SAVE VALUE BIC #177760,R0 ;CLEAN HIGH BITS ASL R0 ;MAKE WORD INDEX MOV CRCTAB(R0),R0 ;MODIFIER WORD BIC #177417,R2 ;LEAVE HIGH 4 BITS ASR R2 ;MAKE WORD INDEX ASR R2 ASR R2 MOV CRCTAB+32.(R2),R2 ;MODIFIER WORD XOR R2,R0 ;TOTAL MODIFIER CLRB R1 ;CLEAR LOW BYTE OF OLD CRC SWAB R1 ;MOVE HIGH TO LOW POSITION XOR R0,R1 ;XOR MODIFIER AND OLD HIGH .ENDC ;.IF NDF SCRC POP R2 ;RESTORE R2 RETURN ;RETURN TO CALLER ; .IF NDF SCRC ; ; 32 WORD CRC TABLE ; CRCTAB: 000000, 140301, 140601, 000500 141401, 001700, 001200, 141101 143001, 003300, 003600, 143501 002400, 142701, 142201, 002100 000000, 146001, 154001, 012000 170001, 036000, 024000, 162001 120001, 066000, 074000, 132001 050000, 116001, 104001, 042000 .ENDC ;.IF NDF SCRC .ENDC ;.IF NDF NODDC ; ; ;TTY OUTPUT INTERRUPT HANDLER ; TTCNT=1 .REPT NUSERS ;GENERATE INTERRUPT ENTRANCES FOR ALL USERS .RADIX 10. TTYOT \TTCNT TTCNT=TTCNT+1 .RADIX 8. .ENDR ; TTOCOM: MOV TTOTAB(R5),R4 ;POINT TO COUNT IN BUFFER TST (R4)+ ;POINT AT GET POINTER TSTB XOFF(R5) ;^S ACTIVE? BNE TTXOFF ;YES: TURN OFF INTERRUPTS AND EXIT FOR NOW MOV OUTCH(R5),R1 ;POINT AT DATA .IF NDF NODDC TSTB DDCMPO(R5) BNE 4$ .ENDC ;.IF NDF NODDC DEC (R1)+ ;DOING TABS OR FILLS? BGT TPRNT3 ;YES: PRINT SOME MORE CLR -2(R1) ;NO: RESET COUNTER THEN 4$: CMP (R4),2(R4) ;TIME TO WRAP BNE 1$ ;NO SUB #TTOUBF,(R4) ;CYCLE PTR 1$: TSTB NEEDRM(R5) ;WAS USER LOOKING FOR ROOM? BEQ 2$ ;NO BIS #4000,SW2(R5) ;YES: INDICATE SOME ROOM HAS BEEN MADE CLRB NEEDRM(R5) ;CLEAR INDICATOR 2$: DEC -2(R4) ;DECREMENT CHAR COUNT BLT TTODON ;DONE - EXIT .IF NDF NODDC TSTB DDCMPO(R5) ;IN DDCMP MODE? BEQ 5$ ;NO TST (R1)+ ;YES: UPDATE R1 .ENDC ;.IF NDF NODDC 5$: MOVB @(R4)+,(R1) ;GET CHARACTER .IF NDF NODDC TSTB DDCMPO(R5) ;IN DDCMP MODE? BNE TPRNT7 ;YES: DON'T ALTER CHAR THEN .ENDC ;.IF NDF NODDC CMPB (R1),#40 ;PRINTABLE? BLT TCHKSP ;NO CHECK SPECIALS CMP (R1)+,#177 ;BAD ON HIGH SIDE? BGE TTPRNT ;YES: DON'T PRINT IT DEC (R1) ;DECREASE # TO NEXT STEP BNE TTPRNT ;IF 0 RESET TO 10 MOV #10,(R1) TTPRNT: TST -(R1) ;POINT AT FILL CHARACTER TPRNT7: INC -(R4) ;POINT AT NEXT BUFFER LOCATION TPRNT3: MOVB (R1),@TPB(R5) ;OUTPUT CHARACTER BR TTPOXT ;EXIT TCHKSP: CMPB (R1),#11 ;TAB? BNE 1$ ;NO MOV #40,(R1)+ ;YES: FILL WITH SPACES MOV (R1),-4(R1) ;SET TAB COUNT BR 3$ 1$: CMP (R1)+,#15 ;CR? BNE 2$ ;NO CLR -4(R1) ;YES: CLEAR LINE COUNT 3$: MOV #10,(R1) ;RESET TAB COUNT 2$: TST -(R1) ;POINT TO FILL CHARACTER CMPB (R1),FILLIT(R5) ;FILL CHARACTER MATCH BNE TPRNT7 ;NO MOV (R1),@TPB(R5) ;YES: OUTPUT IT CLR (R1) CLR -(R1) ;CLEAN HOUSE MOVB FILLCT(R5),(R1) ;GET # OF FILLERS INC -(R4) ;NEXT BUFFER WORD BR TTPOXT ;EXIT TTODON: CLR -(R4) TTXOFF: CLR @TPS(R5) ;CLEAR INTERRUPTS TTPOXT: JMP TTIEX3 ;STORE REGISTERS AND EXIT ; ; ;MISC. ROUTINES ; ECHO: MOVB (R4)+,R3 ;GET CHAR CALL OPUT ;OUTPUT IT MOVB (R4)+,R3 ;GET SECOND ONE BEQ 1$ ;NULL: EXIT CALL OPUT ;OUTPUT IT 1$: RTS R4 ;EXIT ; SVREG: PUSH R1 ;SAVE REGISTERS (R0 SAVED ON CALL) PUSH R2 PUSH R3 PUSH R4 PUSH R5 MOV (R0)+,R5 ;GET ADDRESS OF USER'S IMPURE AREA MOV R0,PC ;RETURN TO CALLER ; RSTREG: TST (SP)+ ;RESTORE REGISTERS (JUNK R0) POP R5 POP R4 POP R3 POP R2 POP R1 RTS R0 ;RETURN TO CALLER ; EKOR0: MOVB R0,-(SP) ;CONVERT CHARACTER TO UPPER CASE ADD #100,(SP) MOVB (SP)+,1$ JSR R4,ECHO ;ECHO ^ AND THE CHARACTER .BYTE 136 1$: .BYTE 0 RETURN ;RETURN TO CALLER ; ; .END .SBTTL EDITOR SECTION PART 1 .TITLE REMOTE V01-X02 .NLIST TTM,ME .CSECT REMED1 EDIT=002. ; ; ; PDP-11 RT-11 MULTI-USER LINE TEXT EDITOR AND DOWN LINE LOADER ; ; PROGRAM NAME: LETTER / REMOTE-11 ; ; EDITOR SECTION PART 1: VERSION LEVEL V01-X02: PATCH LEVEL A ; ; AUTHOR: RICK HULLY ; ; DATE: SEP., 1975 ; ; ; COPYRIGHT (C) 1975 ; ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- ; SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER ; COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE ; TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO ; AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE ; SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; .SBTTL CONDITIONAL ASSEMBLY PARAMETERS ; ; THE FOLLOWING CONDITIONAL ASSEMBLY PARAMETERS PERTAIN TO THIS ; SECTION. ; ; NO CONDITIONALS SPECIFIED YIELDS: ; ; EDITOR FUNCTIONS SUPPORTED ; DUPLICATE AND SEARCH COMMANDS SUPPORTED ; MACRO SUPPORT IN THE EDITOR ; 2 USER VERSION OF REMOTE-11 ; ; IF DEFINED "NOEDIT", THE EDITOR FUNCTIONS ARE REMOVED ; ; IF DEFINED "NODUPS", THE "DUPLICATE" AND "SEARCH" COMMANDS ; ARE REMOVED. ; ; IF DEFINED "NOMAC", THE MACRO SUPPORT IN THE EDITOR IS ; REMOVED. ; .IIF DF NOEDIT, .END .IIF NDF NUSERS, NUSERS=2. ; .SBTTL PROGRAM DEFINITIONS ; R0 = %0 ;GENERAL REGISTERS R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 RETURN = 207 ;RETURN = RTS PC LINELN = 130. ;MAXIMUM LINE LENGTH ; .SBTTL GLOBALS ; .GLOBL EDITOR,.IO,BAK,NEW,CKFILE,FERR1,.PRNT,START .GLOBL SWAIT,TESTDV,SECOND,SECNOT,BUFCHK .GLOBL GETNUM,CH0,CH11,CH15,CH16,CH17,COMOUT .GLOBL GETNM,EDITS,EDITSS,CATEN,EOF,FSWAP,ILLMOD .GLOBL MSG0,MSG7,INPUT,INPUTX,MOVE,OUTPUT .GLOBL MSG16,MSG18,RETYPE,RENEW1,.NOL .GLOBL DIRERR,NOROOM,NFULL,PUTLIN,GETLIN,TESTCR .GLOBL IMMAC,NOFIL,ILLSAV,FILENF,OVLYSW .GLOBL OUTPTR,INFIL,OUTFIL,SWITCH,SAVFIL,INPTR .GLOBL TMPFIL,FSIZE,.CURRN,PAGE,IBLKNM,OBLKNM .GLOBL GO,QUIT,CURREN,CDONE,EDIT1,ONOFF .GLOBL OARG,QUOTE,MAXMAC,MACDEF .GLOBL DEV,USVPTR,UBLKNM,SECFIL,SBLKNM .GLOBL FILLCT,SW2,MACARG,CURMAC .GLOBL TEMP1,TEMP2,TEMP3,TEMP4,NUMBER .GLOBL ARG1,ARG2,WRIOT,CHAN,ACHAN .GLOBL SIZEBF,CWDS,OUTBUF,INBUF,SAVNAM,TEMP .GLOBL ERASES,INPUTS,OVLY1,OVLY ; .GLOBL FF,VERIFY,CC,VERSON .GLOBL SIZE,SAVE,UNSAVE,OVER .GLOBL OPENS,CLOSES,SELS,SELP,FILL,KILL,REDIT .GLOBL PRT0,OUTSW,SCANCH .IIF NDF NODUPS, .GLOBL DUP,SEARCH,TSBUF .IIF NDF NOMAC, .GLOBL IMEDMC,MACROD,MAC001,MACBUF ; .SBTTL MACRO DEFINITIONS ; .MCALL ..V2.. ..V2.. .MCALL .SERR,.HERR ; .MACRO PUSH CELL MOV CELL,-(SP) .ENDM PUSH ; .MACRO POP CELL MOV (SP)+,CELL .ENDM POP ; .MACRO CALL ROUTINE JSR PC,ROUTINE .ENDM CALL ; .MACRO CALLO ROUTINE CALL OVLY .WORD ROUTINE .ENDM CALLO ; .MACRO MOVR X,Y MOV X,Y ADD R5,Y .ENDM MOVR ; .MACRO .SCHED CALLO SWAIT .ENDM .SCHED ; .MACRO .CKFIL .DEVBLK,FAIL .IF NB .DEVBLK MOVR .DEVBLK,R0 .ENDC ;.IF NB .DEVBLK CALLO CKFILE BR FAIL .ENDM .CKFIL ; .MACRO .LOOKUP .CHANNEL,.DEVBLK .IF NB .DEVBLK MOVR .DEVBLK,R0 .ENDC ;.IF NB .DEVBLK CALL .IO .BYTE ^O<.CHANNEL> .BYTE 1 .ENDM .LOOKUP ; .MACRO .ENTER .CHANNEL,.DEVBLK .IF NB .DEVBLK MOVR .DEVBLK,R0 .ENDC ;.IF NB .DEVBLK CALL .IO .BYTE ^O<.CHANNEL> .BYTE 2 .ENDM .ENTER ; .MACRO .RENAME .CHANNEL,.DEVBLK .IF NB .DEVBLK MOVR .DEVBLK,R0 .ENDC ;.IF NB .DEVBLK CALL .IO .BYTE ^O<.CHANNEL> .BYTE 4 .ENDM .RENAME ; .MACRO .CLOSE .CHANNEL CALL .IO .BYTE ^O<.CHANNEL> .BYTE 7 .ENDM .CLOSE ; .MACRO .DELETE .CHANNEL,.DEVBLK .IF NB .DEVBLK MOVR .DEVBLK,R0 .ENDC ;.IF NB .DEVBLK CALL .IO .WORD ^O<.CHANNEL> .ENDM .DELETE ; .MACRO .PRINT .MESADDR .IF NB .MESADDR MOV .MESADDR,R0 .ENDC ;.IF NB .MSADDR CALLO .PRNT .ENDM .PRINT ; .SBTTL BEGINNING OF EDITOR ; OVLY1: ;ROUTINE BRINGS IN OVERLAY #1 RETURN ;RETURN TO CALLER ; EDITOR: MOV INFIL+2(R5),OUTFIL+2(R5) ;USE INPUT FILE NAME FOR OUTPUT MOV INFIL+4(R5),OUTFIL+4(R5) MOV INFIL+6(R5),OUTFIL+6(R5) EDIT1: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE .CLOSE 0 ;CLOSE CHANNELS 0 AND 1 .CLOSE 1 CMP BAK,INFIL+6(R5) ;CANNOT EDIT A BACKUP FILE UNLESS WE ; CAN RENAME IT. BNE 3$ ;ITS NOT MOV NEW,OUTFIL+6(R5) ;RENAME FILE TO HAVE A "NEW" EXT. .CKFIL #OUTFIL,8$ ;NO ONE ELSE CAN USE THIS FILE NAME .SERR ;CATCH MONITOR ERRORS .LOOKUP 1,#OUTFIL ;MAKE SURE IT DOESN'T EXIST BEFORE ; RENAMING IT. BCS 4$ ;IT DOESN'T .HERR ;ALLOW MONITOR ERRORS NOW .CLOSE 1 ;CLOSE FILE .PRINT #FERR1 ;TELL USER THAT HIS BACKUP FILE CAN'T ; BE EDITED BECAUSE THE NEW FILE NAME ; AFTER RENAMING THE BACKUP FILE ; ALREADY EXISTS. 8$: JMP START ;RESTART EDITOR 4$: MOVB @#52,R2 ;GET ERROR CODE CMPB R2,#-3 ;DIRECTORY ERROR? BNE 1$ ;NO 7$: .HERR ;ALLOW MONITOR ERRORS NOW .PRINT #DIRERR ;YES: TELL USER BR 8$ ;RESTART THE EDITOR 1$: .HERR ;ALLOW MONITOR ERRORS NOW .SCHED ;SCHEDULE SOMEONE ELSE .CKFIL #OUTFIL,8$ ;NO ONE ELSE CAN USE THIS FILE NAME .SERR ;CATCH MONITOR ERRORS NOW .RENAME 0,#INFIL ;RENAME BACKUP FILE NOW BCC 2$ ;NO ERRORS DETECTED TSTB @#52 ;ERROR OCCURRED: WAS IT HARD? BMI 7$ ;YES: TELL USER AND QUIT 2$: .HERR ;ALLOW MONITOR ERRORS NOW MOV OUTFIL+6(R5),INFIL+6(R5) 3$: .CKFIL #OUTFIL,8$ ;NO ONE ELSE CAN USE THIS FILE NAME BICB #1,SWITCH(R5) ;ASSUME INPUT FILE IS PRESENT MOVR #INFIL,R0 ;MAKE SURE FILE EXISTS FIRST CALLO TESTDV ;TEST DEV FIRST BR 8$ ;NO: RESTART THEN .LOOKUP 0,#INFIL ;SEE IF INPUT FILE EXISTS BCC 5$ ;YES BISB #1,SWITCH(R5) ;REMEMBER THAT THERE IS NO INPUT FILE CLR R0 ;ALLOW ONLY 50 BLOCKS FOR NEW FILE 5$: TST FSIZE(R5) ;DON'T RE-ADJUST FILE SIZE IF IT WAS BNE 6$ ; GIVEN BY USER IN COMMAND STRING. ADD #50.,R0 ;SINCE USER DID NOT SPECIFY SIZE, USE MOV R0,FSIZE(R5) ; INPUT FILE SIZE PLUS 50 BLOCKS. 6$: .SCHED ;SCHEDULE SOMEONE ELSE .CKFIL #TMPFIL,EDIT2 ;NO ONE ELSE CAN USE THIS FILE NAME .SERR ;CATCH MONITOR ERRORS NOW .DELETE 1,#TMPFIL ;DELETE ANY TEMP FILES OPEN .ENTER 1,#TMPFIL ;OPEN OUTPUT FILE NOW BCC EDIT0 ;FILE SIZE ALLOCATED OK TSTB @#52 ;ERROR OCCURRED: WAS IT HARD? BMI 7$ ;YES: TELL USER AND QUIT .HERR ;ALLOW MONITOR ERRORS NOW .PRINT #NOROOM ;NOT ENOUGH ROOM ON DEVICE FOR FILE SIZE .CLOSE 1 ; REQUESTED. EDIT2: .CLOSE 0 JMP START EDIT0: .HERR ;ALLOW MONITOR ERRORS NOW CLR FSIZE(R5) ;USE FILE SIZE OF "FILE" + 50 NEXT TIME CLR .CURRN(R5) ;EMPTY ALL LINE BUFFERS FROM ; ANY PREVIOUS EDITS. CALLO ERASES ;ALSO THE BLOCK BUFFER CLR PAGE(R5) ;BEGIN ON PAGE ZERO BIS #40000,SWITCH(R5) ;MAKE SURE OUTPUT SWITCH IS ON BITB #20,SWITCH+1(R5) ;IS SECONDARY FILE STILL OPEN (FROM BEQ 2$ ; PREVIOUS EDITS)? .PRINT #SECOND ;YES: TELL USER BITB #40,SWITCH+1(R5) ;IS IT ALSO CURRENTLY SELECTED FOR BEQ 2$ ; INPUT? .PRINT #SECNOT ;YES: TELL USER THIS ALSO 2$: CLR IBLKNM(R5) ;BEGIN AT BLOCK #0 CLR OBLKNM(R5) MOVR #OUTBUF,OUTPTR(R5) ;RESET BUFFER POINTER FOR OUTPUT FILE CLR INPTR(R5) ;RESET BUFFER POINTER CLR INPTR+2(R5) ;CLEAR EOF FLAG INCB GO(R5) ;INDICATE THIS USER HAS BEGUN EDITING BITB #1,SWITCH(R5) ;IF THERE WAS NO INPUT FILE OPEN, GO BNE EDIT3 ; IMMEDIATELY TO INPUT MODE UNLESS ; BLOCK MODE IS DEFINED. TSTB SWITCH(R5) ;DO AN AUTOMATIC "RENEW 1" COMMAND IF BMI 1$ ; USER IS IN BLOCK MODE. JMP EDITS 1$: MOV #1,R1 MOV R1,QUIT(R5) ;INDICATE SOMETHING IS GOING ON JMP RENEW1 EDIT3: .PRINT #MSG18 ;USE "CREATE" MESSAGE TO SIGNAL USER ; THAT HE'S IN INPUT MODE NOW. JMP INPUTS ;ENTER INPUT MODE .SBTTL FF AND OVERLAY COMMANDS ; ;INSERT FORM FEED AFTER CURRENT LINE ; FF: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE MOVB #14,@CWDS(R5) ;INSERT FF AS PART OF TEXT CALLO OUTPUT ;WRITE OUT CURRENT LINE JMP RETYPE ;NOW ACT AS IF LINE WAS RETYPED ; ;SERVICE AN OVERLAY REQUEST ; OVER: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE JSR R1,GETNUM ;GET ARGUMENT (RETURNED IN R1) MOV R1,NUMBER(R5) BPL 1$ ;ARGUMENT MUST BE POSITIVE JMP PRT0 ;ILLEGAL NUMERIC ARGUMENT 1$: CLR .CURRN(R5) ;NULL CURRENT LINE DEC NUMBER(R5) ;COUNT CURRENT LINE BEQ 2$ ;ALL DONE DELETING, GO CHANGE TO INPUT ; MODE. CALLO INPUT ;READ IN NEXT LINE JMP EOF ;END OF FILE FOUND BR 1$ ;READ WAS SUCCESSFUL, PROCESS THIS LINE 2$: JMP INPUTS ;GO DIRECTLY TO INPUT MODE NOW. .SBTTL DUPLICATE COMMAND ; ;DUPLICATE THE NEXT M LINES N TIMES ; .IF NDF NODUPS DUP: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE JSR R1,GETNUM ;GET LINE COUNT (RETURNED IN R1) MOV R1,QUIT(R5) ;SAVE IT BPL 1$ ;MUST BE + JMP PRT0 ;NEG LINE COUNT IS ILLEGAL 1$: TSTB SWITCH(R5) ;MUST BE IN BLOCK MODE BMI DUP2 ;OK JMP ILLMOD ;ILLEGAL BLOCK MODE DUP2: MOV QUIT(R5),TEMP4(R5) ;SAVE LINE COUNT FOR NUMEROUS OPERATIONS DUP3: MOV QUIT(R5),TEMP3(R5) MOV CURREN(R5),R0 ;COPY CURRENT LINE INTO WORK AREA MOVR #TSBUF,R1 MOVB (R0),R2 ;GET BYTE COUNT OF LINE TO MOVE BEQ 10$ ;NO LINE (ERROR) ADD #2,R2 ;+ HEADER BYTES 4$: MOVB (R0)+,(R1)+ ;COPY LINE NOW DEC R2 BGT 4$ 5$: CALLO OUTPUT ;OUTPUT CURRENT LINE DEC TEMP3(R5) ;AT PLACE TO INSERT? BEQ 6$ ;YES CALLO INPUT ;NO: GET NEXT INPUT LINE 10$: JMP .NOL ; EOB'S ARE ILLEGAL BR 5$ ;CONTINUE 6$: MOVR #TSBUF,R1 ;NOW COPY NEW LINE IN MOV CURREN(R5),R0 MOVB (R1),R2 ;BYTE COUNT OF LINE ADD #2,R2 ;+ HEADER BYTES 7$: MOVB (R1)+,(R0)+ DEC R2 BGT 7$ CALLO OUTPUT ;OUTPUT THAT LINE MOV QUIT(R5),R1 ;NOW BACK UP N LINES NEG R1 CALL MOVE NOP ;IGNORE BOB'S CALLO INPUT ;GET NEXT LINE JMP .+2 ;IGNORE EOB'S DEC TEMP4(R5) ;ALL LINES COPIED? BGT DUP3 ;NO: CONTINUE DEC NUMBER(R5) ;YES: HAVE WE DONE "N" SETS OF COPIES? BGT DUP2 ;NO: DO ANOTHER 8$: CALLO OUTPUT ;OUTPUT CURRENT LINE CALLO INPUT ;NOW SET CURRENT LINE TO ONE ; FOLLOWING THE DUPLICATED ONES. 9$: JMP EDITS ;QUIT ON EOF CALLO OUTPUT DEC QUIT(R5) BGT 8$ BR 9$ ;DO NEXT COMMAND .SBTTL SEARCH AND MODIFY COMMAND ; ; SEARCH FOR STRING1, PERFORM THE INDICATED OPERATION AND ; OPTIONALLY INSERT STRING2. ; SEARCH: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE CLR CDONE(R5) ;SETUP TO USE PART OF 'CHANGE' CLRB TEMP(R5) ; COMMAND IF NECESSARY. TSTB .CURRN(R5) ;IF LINE DOES NOT EXIST, DON'T BNE 9$ ; LET USER TRY TO CHANGE IT. JMP .NOL 9$: MOV CURREN(R5),OARG(R5) ;BEGIN SEARCHING AT BEGINNING OF STRING ADD #2,OARG(R5) ;BUMP PAST HEADER WORD CMPB @OARG(R5),#14 ;DON'T ALLOW CHANGES TO A LINE WITH ; ONLY A FF. BNE 1$ JMP .NOL ;NO LINE (ERROR) 1$: MOV CWDS(R5),R0 ;START ADDRESS OF STRING1 MOVB (R0)+,QUOTE(R5) ;FIRST CHAR IS THE QUOTE MOV R0,ARG1(R5) ;START ADDRESS OF QUOTE STRING 2$: CMPB (R0),QUOTE(R5) ;QUOTE AGAIN? BEQ 4$ ;YES CMPB (R0),CATEN(R5) ;CATENATION CHAR? BEQ 3$ ;YES: ILLEGAL HERE CMPB (R0)+,#15 ;C/R ENDS REQUEST BNE 2$ 3$: JMP CH0 ;ILLEGAL COMMAND CONSTRUCTION 4$: INC R0 ;BUMP PAST QUOTE CHARACTER 5$: MOV OARG(R5),ARG2(R5) ;SCAN FOR A MATCH OF STRING1 6$: JSR R0,SCANCH ;(STRING COMPARER) BR 7$ ;NOT FOUND THIS TRY BR 8$ ;FOUND JMP CH17 ;NOT FOUND ANYWHERE IN THIS LINE 7$: INC ARG2(R5) ;START AT NEXT CHAR IN LINE BR 6$ 8$: MOV R2,ARG2(R5) ;SAVE END OF STRING POINTER NEXTP: ;GET POSSIBLE PRECEDING NUMERIC CLR R4 ;ASSUME "+" CMPB (R0),#'+ ;"+"? BEQ 1$ ;YES: IGNORE CMPB (R0),#'- ;"-"? BNE 2$ ;NO COM R4 ;YES: SET SIGN 1$: INC R0 ;BUMP PAST SIGN 2$: CMPB (R0),#'* ;"*"? BNE 3$ ;NO INC R0 ;BUMP PAST '*' MOV #LINELN+6,R1 ;YES: SET TO MAXIMUM LINE LENGTH BR 5$ ;SET SIGN 3$: CLR R1 ;CLEAR WORK AREA 4$: CMPB (R0),#60 ;DIGIT? BLT 5$ ;NO CMPB (R0),#71 BGT 5$ ;NO MOVB (R0)+,R3 ;YES: GET DIGIT BIC #177760,R3 ;REMOVE UNWANTED BITS PUSH R1 ;MULTIPLY PREVIOUS # BY 10 ASL R1 ASL R1 ADD (SP)+,R1 ASL R1 ADD R3,R1 ;ADD IN NEW DIGIT BR 4$ ;GET NEXT DIGIT 5$: TST R1 ;IF =0, SET =1 BNE 7$ INC R1 7$: TST R4 ;SET SIGN ON RESULT BEQ 6$ NEG R1 6$: CMPB (R0),#'M ;MOVE? BNE 10$ ;NO: MUST BE INSERT, DELETE, CONCATENATE ; OR END OF LINE. INC R0 ;BUMP PAST 'M' ADD R1,ARG2(R5) ;YES: POSITION POINTER TO CORRECT ; POSITION IN STRING. CMP ARG2(R5),OARG(R5) ;TEST IF HE TRIED MOVING PAST THE ; BEGINNING OF THE STRING. BHIS 9$ ;NO: TEST END ALSO MOV OARG(R5),ARG2(R5) ;YES: RESET TO BEGINNING OF STRING BR NEXTP ;PROCESS NEXT PART OF COMMAND 9$: MOV .CURRN(R5),R3 ;CHECK IF USER TRIED MOVING PAST THE ADD CURREN(R5),R3 ; END OF THE STRING. CMP ARG2(R5),R3 ;EXCEEDED? BLOS NEXTP ;NO: PROCESS NEXT PART MOV R3,ARG2(R5) ;YES: POSITION TO END OF STRING BR NEXTP ;PROCESS NEXT PART ; 10$: CMPB (R0),#'D ;DELETE? BNE ESEAR ;NO: MUST BE INSERT, CONCATENATE, OR END ; THEN. INC R0 ;BUMP PAST 'D' MOV ARG2(R5),R2 ;DELETE THE SPECIFIED CHARACTERS MOV R2,R4 ADD R1,R2 ;TEST USER GOING OFF LEFT SIDE OF STRING CMP R2,OARG(R5) BHIS 13$ ;NO: TEST RIGHT SIDE THEN MOV OARG(R5),R2 ;RESET TO BEGINNING OF STRING BR 14$ 13$: MOV .CURRN(R5),R3 ;TEST RIGHT SIDE OF STRING ADD CURREN(R5),R3 CMP R2,R3 BLOS 14$ ;STRING OK MOV R3,R2 ;USER WENT OFF END OF STRING 14$: TST R1 ;SAVE NEW STRING POINTER IF IT CHANGED BPL 15$ ;NO CHANGE MOV R2,ARG2(R5) ;YES: HE DELETED BACKWARDS SO SAVE THE ; NEW POINTER. 15$: TST R1 ;LEFT OR RIGHT DELETE? BMI 19$ ;LEFT 16$: MOVB (R2)+,(R4) ;RIGHT DELETE 17$: CMPB (R4)+,#12 ;END OF LINE? BNE 15$ ;NO: CONTINUE CMP R4,R2 ;CORRECT STRING BYTE COUNT BLOS 18$ MOV R2,R4 18$: SUB CURREN(R5),R4 SUB #2,R4 MOV R4,.CURRN(R5) BR NEXTP ;NO NEXT PORTION OF COMMAND 19$: MOVB (R4),(R2)+ BR 17$ ; ESEAR: CMPB (R0),#'E ;END? BNE CSEAR ;NO: MUST EITHER BE 'I', 'C', OR END ; OF REQUEST. MOV R1,NUMBER(R5) ;SAVE SIGN FROM 'E' MOV ARG2(R5),R2 ;END: TERMINATE STRING AT 'ARG2' MOVR #TSBUF,R1 ; AND BUILD A NEW ONE OUT OF THE ; REMAINING PORTION OF THE STRING. 1$: MOVB (R2),(R1)+ ;COPY REMAINING PORTION OF STRING INTO CMPB (R2)+,#12 ; TEMP BUFFER. BNE 1$ MOV ARG2(R5),R2 ;TERMINATE FIRST PART OF STRING WITH MOVB #15,(R2)+ ; CR/LF. MOVB #12,(R2)+ SUB CURREN(R5),R2 ;NOW CALCULATE BYTE COUNT OF LINE SUB #2,R2 ;ACCOUNT FOR HEADER MOV R2,.CURRN(R5) CALLO OUTPUT ;OUTPUT THAT LINE MOV CURREN(R5),R1 ;NOW BUILD NEW LINE FROM THE REMAIN- TST (R1)+ ; ING PORTION OF STRING AND SET MOV R1,ARG2(R5) ; 'ARG2' TO THE BEGINNING OF THE MOVR #TSBUF,R2 ; LINE. 2$: MOVB (R2)+,(R1) CMPB (R1)+,#12 BNE 2$ SUB #2,R1 ;CALCULATE BYTE COUNT OF LINE SUB CURREN(R5),R1 MOV R1,.CURRN(R5) INC R0 ;BUMP PAST 'E' TST NUMBER(R5) ;BACKUP TO FIRST PART OF LINE IF NEGATIVE ; "E" GIVEN. BPL 4$ ;NO TSTB SWITCH(R5) ;MUST BE IN BLOCK ON MODE BMI 3$ ;OK JMP ILLMOD ;ILLEGAL IN BLOCK OFF MODE 3$: CALLO OUTPUT ;OUTPUT CURRENT LINE MOV #-2,R1 ;NOW BACKUP 2 LINES CALL MOVE NOP ;IGNORE BOB'S CALLO INPUT ;GET CURRENT LINE JMP .+2 ;IGNORE EOB'S MOV CURREN(R5),ARG2(R5) ;SET ARG2 TO END OF LINE NOW ADD .CURRN(R5),ARG2(R5) 4$: JMP NEXTP ;EXECUTE NEXT COMMAND IF GIVEN ; CSEAR: CMPB (R0),#'C ;CONCATENATE? BNE ISEAR ;NO: MUST BE EITHER 'I' OR END OF REQUEST INC R0 ;BUMP PAST 'C' MOVR #TSBUF,R2 CALLO INPUTX ;GET THE NEXT LINE JMP NEXTP ;IGNORE CONCATENATION OF EOB/EOF MOV CURREN(R5),R2 ;POSITION TO EOL MOV R2,R3 ADD .CURRN(R5),R2 MOV R2,ARG2(R5) MOVR #TSBUF,R1 ;NOW APPEND THE NEXT LINE TO IT CLR (R1)+ ;LINE NO LONGER NEEDED ADD #132.,R3 ;MAXIMUM CHAR POSITION 2$: MOVB (R1)+,(R2) ;TRANSFER A CHAR CMPB (R2)+,#12 ;LF TERMINATES LINE BEQ 1$ ;EOL FOUND CMP R2,R3 ;MAKE SURE WE STILL HAVE ROOM LEFT BLO 2$ ;YES: CONTINUE MOVB #15,(R2)+ ;LINE TOO LONG: TERMINATE WITH CR/LF MOVB #12,(R2)+ SUB CURREN(R5),R2 ;CALCULATE BYTE COUNT OF LINE SUB #2,R2 MOV R2,.CURRN(R5) ;TELL USER LINE IS TOO LONG JMP CH16 1$: SUB CURREN(R5),R2 ;CALCULATE BYTE COUNT OF LINE SUB #2,R2 ;MINUS BYTE COUNT OF HEADER MOV R2,.CURRN(R5) JMP NEXTP ;EXECUTE NEXT COMMAND IF GIVEN ; ISEAR: CMPB (R0)+,#'I ;INSERT? BEQ 1$ ;YES CMPB -(R0),#15 ;MUST BE A LINE TERMINATOR THEN BNE 2$ ;NO: ILLEGAL THEN MOV .CURRN(R5),R4 ;PRINT OUT RESULT JMP CH15 2$: JMP CH0 ;NO: ILLEGAL COMMAND CONSTRUCTION 1$: MOV R0,TEMP1(R5) ;SAVE START ADDRESS FOR 'CHANGE' COMMAND 3$: CMPB (R0)+,#15 ;SCAN TILL EOL BNE 3$ DEC R0 SUB TEMP1(R5),R0 ;CALCULATE BYTE COUNT OF NEW STRING JMP CH11 ;NOW INSERT IT .ENDC ;.IF NDF NODUPS ; .SBTTL VERIFY, OUTPUT, CC, AND VERSON COMMANDS ; ;SERVICE VERIFY ON/OFF REQUEST ; VERIFY: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE MOV #2,R1 ;INDICATE VERIFY MODE BY A 2 CALLO ONOFF ;SET SWITCH ON/OFF NOW LINE1: JMP EDITS ;RETURN ; ;SERVICE AN OUTPUT ON/OFF REQUEST ; OUTSW: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE MOV #40000,R1 ;INDICATE OUTPUT MODE BY #40000 CALLO ONOFF ;SET SWITCH ON/OFF NOW BR LINE1 ;RETURN ; ;SERVICE A CC REQUEST (CONCATENATING CHARACTER) ; CC: MOV CWDS(R5),R1 ;GET PTR TO CATENATION CHAR CALL TESTCR ;DEFAULT TO "ESC"? JMP 1$ ;YES MOVB (R1),CATEN(R5) ;NO: USE CHAR GIVEN BY USER BR LINE1 1$: MOVB #33,CATEN(R5) CC1: BR LINE1 ;RETURN ; ;SERVICE A VERSION REQUEST ; VERSON: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE .PRINT #MSG0 ;PRINT OUT PROGRAM NAME AND VERSION BR LINE1 ;RETURN ; .IF NDF NOMAC .SBTTL MACRO DEFINITION COMMAND ; ;SERVICE A MACRO DEFINITION REQUEST ; MACROD: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE JSR R1,GETNUM ;GET ARGUMENT (RETURNED IN R1) BMI ILLN ;NEGATIVE NUMBER IS ILLEGAL CMPB R1,MAXMAC(R5) ;LEGAL SLOT NUMBER? BGT ILLN ;NO: ILLEGAL NUMBER THEN MAC001: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE MOV R2,TEMP2(R5) ;SAVE R2 MOVR #MACDEF-1,R0 ;DEFINE MACRO NOW ADD R1,R0 MOVB #-1,(R0) MOV CWDS(R5),R0 ;GET CHAR STRING START ADDRESS MOVR #MACBUF-130.,R2 ;CALCULATE MACRO START ADDRESS 2$: ADD #130.,R2 ;130 CHARS PER MACRO BUFFER DEC R1 BGT 2$ MAC005: CMPB (R0),#15 ;END OF STRING? BEQ 4$ ;YES CMPB (R0),#'> ;LOOK FOR ">" ALSO BEQ 6$ ;FOUND ONE, IGNORE UNLESS WE'RE ; WORKING ON AN IMMEDIATE ; MACRO. 7$: MOVB (R0)+,(R2)+ BR MAC005 4$: BICB #100,SWITCH(R5) ;CONCATENATION CHARACTER NOT ALLOWED ; TO START NEW COMMAND HERE. MOVB #15,(R2)+ ;ADD CR/LF TO END OF LINE MOVB #12,(R2)+ BIT #2000,SW2(R5) ;WAS THIS AN IMMEDIATE MACRO? BEQ CC1 ;NO: GET NEXT COMMAND THEN MOV TEMP1(R5),MACARG(R5) ;DEFINE MACRO REPEAT COUNT INC MACARG(R5) ;+1 TO COUNT SO IT EXECUTES THE ; PROPER NUMBER OF TIMES. MOV #IMMAC,CURMAC(R5) ;GET READY TO EXECUTE THE "M1" ; COMMAND. TST TEMP2(R5) ;IF ORIGINAL R2 WAS UNDEFINED, (I.E. BNE 8$ ; ZERO) THEN NO NUMERIC WAS MOV #77777,MACARG(R5) ; GIVEN PRECEEDING THE < >. ; THEREFORE SET IT TO MAXIMUM. 8$: BIS #20,SW2(R5) ;ENABLE MACRO PROCESSING NOW BIC #22000,SW2(R5) ;DISABLE IMMEDIATE MACRO ; RECOGNITION. JMP EDITSS ;EXECUTE MACRO NOW. 6$: BIT #2000,SW2(R5) ;IN IMMEDIATE MACRO MODE? BEQ 7$ ;NO: IGNORE ">" THEN BR 4$ ;YES: ADD CR/LF TO END OF LINE ILLN: JMP PRT0 ;ILLEGAL NUMBER GIVEN. .ENDC ;.IF NDF NOMAC ; .SBTTL SIZE COMMAND ; ;SERVICE SIZE REQUEST ; SIZE: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE JSR R1,GETNUM ;GET ARGUMENT (RETURNED IN R1) BPL SIZE0 SIZE1: JMP PRT0 ;ILLEGAL NUMERIC ARGUMENT SIZE0: MOV R1,SIZEBF(R5) ;SAVE ARGUMENT SIZE2: JMP EDITS ;RETURN ; ; .SBTTL SAVE AND UNSAVE COMMANDS ; ;SERVICE A SAVE REQUEST ; SAVE: TSTB SWITCH(R5) ;IN BLOCK ON MODE? BMI 3$ ;YES JMP ILLMOD ;NO: THIS COMMAND IS ILLEGAL IN BLOCK OFF ; MODE. 3$: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE MOV SAVENM,SAVFIL+2(R5) ;ASSUME FILE NAME OF "SAVE0N.TMP" MOV SAVNAM(R5),SAVFIL+4(R5) MOV SAVENM+2,SAVFIL+6(R5) MOV DEV(R5),SAVFIL(R5) ;USE DEFAULT DEVICE ALSO CLR FSIZE(R5) ;ASSUME NO FILE SIZE GIVEN JSR R1,GETNUM ;GET ARG (RETURNED IN R1) BPL 1$ ;MUST BE POSITIVE ARG JMP PRT0 ;NO: ILLEGAL THEN 1$: MOV R1,NUMBER(R5) MOV CWDS(R5),R1 ;GET FILE NAME CALL TESTCR ;ANY ARG? JMP 2$ ;NO MOVR #SAVFIL+2,R4 ;PUT IT IN FILE NAME BLOCK CALL GETNM BR SAVE5 ;SYNTAX ERROR 2$: TST FSIZE(R5) ;IF USER DID NOT SPECIFY FILE SIZE, ALLOW BNE 6$ ; HIM ONLY 10 BLOCKS. MOV #10.,FSIZE(R5) 6$: .CKFIL #SAVFIL,SAVE2 ;NO ONE ELSE CAN USE THIS FILE NAME MOVR #SAVFIL,R0 ;MAKE SURE DEV EXISTS FIRST CALLO TESTDV BR SAVE6 ;NO: FORGET SAVE THEN BIS #100000,SW2(R5) ;INDICATE A "SAVE" IS UNDERWAY .SERR ;CATCH MONITOR ERRORS .ENTER 3,#SAVFIL ;OPEN OUTPUT FILE NOW BCC SAVE7 ;FILE SIZE ALLOCATED OK MOVB @#52,R2 ;GET ERROR BYTE .HERR ;ALLOW MONITOR TO HANDLE BAD ERRORS CMPB R2,#-3 ;DIRECTORY ERROR? BNE SAVE4 ;NO MOV #DIRERR,R0 ;YES: TELL USER JMP OPENS4 SAVE4: .PRINT #NOROOM ;NOT ENOUGH ROOM ON DEVICE FOR FILE SIZE BR SAVE3 ; REQUESTED. SAVE5: .PRINT #ILLSAV ;TELL USER OF ERROR SAVE1: JMP PRT0 ;ILLEGAL NUMBER (NEGATIVE) SAVE7: .HERR ;ALLOW MONITOR TO HANDLE BAD ERRORS MOVR #USVPTR,R2 ;RESET BUFFER POINTER MOV OUTPTR+4(R5),4(R2) MOV OUTPTR+6(R5),(R2) MOV (R2),6(R2) CLR UBLKNM(R5) ;BEGIN AT BLOCK #0 OF FILE MOVR #OUTBUF,R0 ;WRITE OUT CURRENT PRIMARY BUFFER MOV #2,R1 MOV R1,ACHAN(R5) ;INDICATE BUFFER SWAP IS ACTIVE CALLO FSWAP 3$: MOV CURREN(R5),WRIOT(R5) ;WRITE OUT CURRENT LINE MOVR #USVPTR,R2 MOV #3,CHAN(R5) CALLO PUTLIN DEC NUMBER(R5) ;MORE LINES TO SAVE? BLE 4$ ;NO: COMPLETE I/O ON OUTPUT FILE, ; CLOSE IT, AND RETURN. CALLO OUTPUT ;OUTPUT CURRENT LINE CALLO INPUT ;GET NEW LINE AND OUTPUT LAST JMP 4$ ;EOF CLOSES FILE TST QUIT(R5) ;PREMATURE TERMINATE DESIRED? BNE 3$ ;NO: DO NEXT LINE BIC #20,SW2(R5) ;DISABLE MACRO PROCESSING 4$: MOVR #USVPTR,R2 ;RESTORE R2 CALLO COMOUT ;COMPLETE OUTPUT ON THIS CHANNEL MOVR #OUTBUF,R0 ;RESTORE PRIMARY OUTPUT BUFFER SAVE8: MOV #-2,R1 CLR ACHAN(R5) ;BUFFER SWAP IS NO LONGER ACTIVE CALLO FSWAP SAVE3: .CLOSE 3 ;CLOSE FILE NOW AND RETURN SAVE2: BIC #100000,SW2(R5) ;SAVE/UNSAVE/FILE NO LONGER UNDERWAY CLR SAVFIL+2(R5) ;DISABLE FILE NAME BLOCK SAVE6: JMP EDITS ;RETURN TO COMMAND MODE SAVENM: .RAD50 /SAV/ .RAD50 /TMP/ ; ; ;SERVICE AN UNSAVE REQUEST ; UNSAVE: TSTB SWITCH(R5) ;IN BLOCK ON MODE? BMI 6$ ;YES JMP ILLMOD ;NO: THIS COMMAND IS ILLEGAL IN BLOCK OFF ; MODE. 6$: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE MOV SAVENM,SAVFIL+2(R5) ;ASSUME FILE NAME OF "SAVE.TMP" MOV SAVNAM(R5),SAVFIL+4(R5) MOV SAVENM+2,SAVFIL+6(R5) MOV DEV(R5),SAVFIL(R5) ;USE DEFAULT DEVICE ALSO MOV CWDS(R5),R1 ;GET FILE NAME CALL TESTCR ;EXIST? JMP 4$ ;NO MOVR #SAVFIL+2,R4 ;PUT IT IN A FILE NAME BLOCK CALL GETNM BR 2$ ;SYNTAX ERROR 4$: .CKFIL #SAVFIL,SAVE2 ;NO ONE ELSE CAN USE THIS FILE NAME MOVR #SAVFIL,R0 ;MAKE SURE DEV EXISTS FIRST CALLO TESTDV BR 9$ ;NO: FORGET SAVE THEN BIS #100000,SW2(R5) ;INDICATE "UNSAVE" IS UNDERWAY .SERR ;CATCH MONITOR ERRORS .LOOKUP 3,#SAVFIL ;MAKE SURE A SAVE FILE EXITS BCC 1$ ;YES MOVB @#52,R2 ;GET ERROR CODE .HERR ;LET MONITOR HANDLE BAD ERRORS NOW CMPB R2,#-3 ;DIRECTORY ERROR? BNE 7$ ;NO MOV #DIRERR,R0 ;YES: TELL USER BR 8$ 7$: MOV #FILENF,R0 ;TELL USER THAT NO SAVE FILE EXISTS 8$: JMP OPENS4 ;RETURN 9$: JMP EDITS 1$: .HERR ;LET MONITOR HANDLE BAD ERRORS NOW MOVR #UBLKNM,R2 ;ADDRESS OF UNSAVE CONTROL BLOCK CLR (R2)+ ;BEGIN AT BLOCK #0 OF FILE CLR (R2)+ ;RESET BUFFER POINTER CLR (R2)+ ;CLEAR EOF FLAG MOV INPTR+4(R5),(R2)+ MOV INPTR+6(R5),(R2) MOVR #INBUF,R0 ;WRITE OUT CURRENT PRIMARY INPUT BUFFER MOV #2,R1 MOV R1,ACHAN(R5) ;INDICATE BUFFER SWAP IS ACTIVE CALLO FSWAP 3$: CALLO OUTPUT ;OUTPUT CURRENT LINE MOV CURREN(R5),R0 ;READ A LINE FROM SAVE FILE MOV R0,WRIOT(R5) MOVR #USVPTR,R2 MOV #3,CHAN(R5) CALLO GETLIN BR UNS6 ;EOF DETECTED CALL BUFCHK ;CHECK BUFFER > 7/8 FULL BR 5$ ;YES BR 3$ ;GET NEXT LINE 5$: .PRINT #NFULL ;TELL USER BUFFER IS GETTING FULL BR 3$ ;CONTINUE 2$: .PRINT #ILLSAV ;TELL USER OF ERROR JMP SAVE2 ;RETURN UNS6: MOVR #INBUF,R0 ;RESTORE PRIMARY INPUT BUFFER JMP SAVE8 ; .SBTTL OPENS AND CLOSES COMMANDS ; ;SERVICE AN OPENS REQUEST ; OPENS: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE BITB #20,SWITCH+1(R5) ;SECONDARY FILE ALREADY OPENED? BEQ 1$ ;NO MOV #SECOND,R0 ;ILLEGAL TO HAVE TWO SECONDARYS OPEN BR OPENS4 1$: MOVR #SECFIL,R4 ;GET FILE NAME AND PUT IT HERE MOV DEV(R5),(R4)+ ;USE DEFAULT DEVICE MOV CWDS(R5),R1 CALL GETNM BR OPENS3 ;ILLEGAL RETURN BR OPENS2 ;SUCCESSFUL RETURN OPENS3: MOVB @#52,R2 ;GET ERROR CODE .HERR ;LET MONITOR HANDLE BAD ERRORS CMPB R2,#-3 ;DIRECTORY ERROR? BNE 1$ ;NO MOV #DIRERR,R0 ;YES: TELL USER BR OPENS4 1$: MOV #NOFIL,R0 ;ILLEGAL FILE NAME OPENS4: .PRINT OPENS5: JMP REDIT OPENS2: .CKFIL #SECFIL,OPENS5 ;NO ONE ELSE CAN USE THIS FILE NAME MOVR #SECFIL,R0 ;MAKE SURE DEV EXISTS FIRST CALLO TESTDV BR RCMDR ;NO: FORGET SAVE THEN .SERR ;CATCH MONITOR ERRORS .LOOKUP 2,#SECFIL ;SECONDARY FILE MUST EXIST BCS OPENS3 ;NO: ERROR THEN .HERR ;LET MONITOR HANDLE BAD ERRORS NOW .SCHED ;SCHEDULE SOMEONE ELSE BISB #20,SWITCH+1(R5) ;INDICATE SECONDARY FILE IS OPEN MOVR #SBLKNM,R2 ;ADDRESS OF SECONDARY FILE BLOCK CLR (R2)+ ;BEGIN AT BLOCK #0 OF FILE CLR (R2)+ ;RESET BUFFER POINTER CLR (R2)+ ;CLEAR EOF FLAG MOV INPTR+4(R5),(R2)+ MOV INPTR+6(R5),(R2) RCMDR: JMP EDITS ;RETURN TO COMMAND DECODER ; ;SERVICE A CLOSES REQUEST ; CLOSES: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE BITB #20,SWITCH+1(R5) ;SECONDARY FILE MUST BE OPEN BNE CLOSE1 ;YES CLOSE2: MOV #MSG16,R0 ;NO INPUT FILE OPEN, TELL USER BR OPENS4 CLOSE1: .CLOSE 2 ;CLOSE FILE BITB #40,SWITCH+1(R5) ;SECONDARY FILE SELECTED FOR INPUT? BEQ 1$ ;NO MOVR #INBUF,R0 ;YES: RESTORE PRIMARY INPUT BUFFER MOV #-1,R1 CALLO FSWAP 1$: BICB #60,SWITCH+1(R5) ;CLOSE SWITCHES ALSO BR RCMDR ;RETURN .SBTTL SP, SS, FILL, AND KILL COMMANDS ; ;SERVICE A SP REQUEST (SELECT PRIMARY) ; SELP: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE BITB #40,SWITCH+1(R5) ;WAS SECONDARY FILE SELECTED FOR INPUT? BEQ RCMDR ;NO: IGNORE REQUEST THEN MOVR #INBUF,R0 ;YES: WRITE OUT SECONDARY TO SCRATCH ; AREA. MOV #3,R1 CALLO FSWAP MOV #-1,R1 ;NOW GET PRIMARY BUFFER CALLO FSWAP BICB #40,SWITCH+1(R5) ;SELECT PRIMARY INPUT BR RCMDR ;RETURN ; ;SERVICE A SS REQUEST (SELECT SECONDARY) ; SELS: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE BITB #20,SWITCH+1(R5) ;SECONDARY FILE MUST BE OPEN BEQ CLOSE2 ;NO: TELL USER BITB #40,SWITCH+1(R5) ;WAS PRIMARY SELECTED FOR INPUT? BNE RCMDR ;NO: IGNORE REQUEST THEN MOVR #INBUF,R0 ;YES: GO WRITE OUT PRIMARY TO SCRATCH ; AREA. MOV #1,R1 CALLO FSWAP MOV #-3,R1 ;NOW READ IN SECONDARY BUFFER CALLO FSWAP BISB #40,SWITCH+1(R5) ;SELECT SECONDARY INPUT BR RCMDR ;RETURN ; ;SERVICE A FILL REQUEST ; FILL: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE JSR R1,GETNUM ;GET ARGUMENT (RETURNED IN R1) BMI 1$ ;NEGATIVE ARG IS ILLEGAL MOVB R1,FILLCT(R5) ;SAVE ARGUMENT BR RCMDR ;RETURN 1$: JMP PRT0 ;NEGATIVE ARG IS ILLEGAL ; ;SERVICE A KILL REQUEST ; KILL: CLRB OVLYSW(R5) ;SHOW OVERLAY #1 ACTIVE .CLOSE 0 ;CLOSE INPUT AND OUTPUT FILES .CLOSE 1 JMP START ;RESTART THE EDITOR .END