.TITLE SCR2MT - DISC SOURCE TO MAG TAPE ;*********************************************************************** ;* ** ;* S R C 2 M T ** ;* ** ;* PROGRAM IDENTIFICATION. SRC2MT - COPY A DISC SOURCE FILE ** ;* TO MAGNETIC TAPE. ** ;* ; UPDATE CPSIM.012 02-21-73 .TITLE CPSIM ;*********************************************************************** ;* ** ;* C P S I M ** ;* ** ;* PROGRAM NAME. CPSIM - CP/DC11 SIMULATOR ** ;* **; UPDATE CPSIM.011 01.31.73 .TITLE CPSIM ;*********************************************************************** ;* ** ;* C P S I M ** ;* ** ;* PROGRAM NAME. CPSIM - CP/DC11 SIMULATOR ** ;* **; UPDATE 01.29.73 EODRPT.S05 01.29.73 ; UPDATE 01.27.73 EODRPT.S04 01.27.73 ;UPDATE: 23-JAN-73 EODRPT.S03 ;01-23-73 ;ORIGIN&CARDS 22-JAN-73 EODRPT.S02 ;ORIGIN:CARDS 12-12-72 EODRPT.S01 .NLIST TTM .LIST MEB .LIST ME .ENABL CDR ; 01.29.73 DEBUG = 1 ** ;* PURPOSE. THE GENERAL PURPOSE OF THIS PROGRAM IS TO PROVIDE ** ;* A MEANS OF WRITING DISC RESIDENT SOURCE FILES ONTO ** ;* MAGNETIC TAPE IN FIXED-LENGTH (132-CHARACTER) RECORDS. THE ** ;* MAG TAPE CAN THEN BE READ BY A UNIVAC PROGRAM WHICH WILL ** ;* CREATE A LISTING AND OPTIONALLY TRANSMIT THE SOURCE TO ** ;* HOUSTON, TEXAS. THE SPECIFIC PURPOSE OF THIS PROGRAM IS ** ;* ;* PURPOSE. THE FUNCTION OF THIS PROGRAM IS TO SIMULATE THE ** ;* OPERATION OF THE ELITE TERMINAL COMMUNICATIONS PROCESSOR ** ;* (CP) AS IT INTERFACES INTO THE HUB SOFTWARE THROUGH DEC'S ** ;* DC-11 INTERFACE. CPSIM PROVIDES FOR THE FOLLOWING ** ;* SIMULATIONS: ** ;* ** ;* 1. NORMAL CP/HUB INPUT AND OUTPUT OPERATIONS, INCLUDING ;* PURPOSE. THE FUNCTION OF THIS PROGRAM IS TO SIMULATE THE ** ;* OPERATION OF THE ELITE TERMINAL COMMUNICATIONS PROCESSOR ** ;* (CP) AS IT INTERFACES INTO THE HUB SOFTWARE THROUGH DEC'S ** ;* DC-11 INTERFACE. CPSIM PROVIDES FOR THE FOLLOWING ** ;* SIMULATIONS: ** ;* ** ;* 1. NORMAL CP/HUB INPUT AND OUTPUT OPERATIONS, INCLUDING ;ALLOW INSERTION OF DEBUG TRAPS ; ******************************************************************** ; * PROGRAM IDENTIFICATION: " E O D R P T " * ; * END-OF-DAY REPORT TASK * ; * * ; * PURPOSE: * ; * TO NOTIFY BOTH THE DATACENTER AND THE TERMINAL THAT THE* ; * TRANSACTION TO PROVIDE A MEANS WHEREBY ASSEMBLY LISTINGS CAN BE ** ;* EXPEDIENTLY TRANSMITTED TO GULF OIL, HOUSTON. ** ;* SRC2MT WILL COPY ALL FILES WITH AN EXTENSION OF '.LST' ** ;* FROM A SPECIFIED USER CODE FROM EITHER THE DECDISC OR THE ** ;* DDC DISC. A DOUBLE EOF IS WRITTEN AFTER ALL SOURCE FILES. ** ;* ** ;* USAGE. SRC2MT EXECUTES UNDER CONTROL OF DOS. LOG IN, THEN **  ** ;* ALL ACTION CODES. ** ;* 2. VARIOUS CP/DC11 ERROR CONDITIONS, SUCH AS: INCORRECT STX;** ;* INCORRECT ETX; MISSING EOT; INTERRUPTED INPUT MESSAGE ** ;* WITH LINE DROP ** ;* 3. ACK/NAK COMMUNICATION ** ;* 4. MESSAGE OUTPUT ** ;* 5. VARIOUS OUTPUT TRANSMISSION ERRORS: RECEIPT ** ;* ALL ACTION CODES. ** ;* 2. VARIOUS CP/DC11 ERROR CONDITIONS, SUCH AS: INCORRECT STX;** ;* INCORRECT ETX; MISSING EOT; INTERRUPTED INPUT MESSAGE ** ;* WITH LINE DROP ** ;* 3. ACK/NAK COMMUNICATION ** ;* 4. MESSAGE OUTPUT ** ;* 5. VARIOUS OUTPUT TRANSMISSION ERRORS: RECEIPTFOLIO FOR THE DAY IS BEING CLOSED, AND THAT* ; * A NEW ONE IS BEING OPENED. END-O-MONTH IS ALSO NOTED * ; * ON THE APPROPRIATE DATE FOR EACH TERMINAL. * ; * * ; * METHOD: * ; * THE "TRM" TERMINAL FACILITY DATA FILE IS REFERENCED * ; * EVERY QUARTER HOUR, OR WHENEVER A TANK-GAUGE TRANS- * ; * ACTI;* RUN SRC2MT. THE PROGRAM WILL HALT. PERFORM THE FOLLOWING: ** ;* ** ;* 1. MOUNT A SCRATH MAG TAPE WITH RING ON ONE OF THE TAPE ** ;* TRANSPORTS (0,1,...). ** ;* 2. ENTER THE DISC CODE AND TAPE TRANSPORT CODE ON THE ** ;* CONSOLE SWITCHES: ** ;* LOW BYTE = TRANSPORT (0,1,...)  OF NAK FROM ** ;* CP; LOST INTERRUPT FROM DC11 OUTPUT CHARACTER ** ;* 6. ONE OR TWO TERMINALS ** ;* 7. ONE OR TWO COMMUNICATIONS PORTS ** ;* ** ;* USAGE. THE PDP-11 CONSOLE SWITCHES ARE USED TO SPECIFY ** ;* THE SELECTED OPTIONS. THE BIT ASSIGNMENTS ARE: ** ;*  OF NAK FROM ** ;* CP; LOST INTERRUPT FROM DC11 OUTPUT CHARACTER ** ;* 6. ONE OR TWO TERMINALS ** ;* 7. ONE OR TWO COMMUNICATIONS PORTS ** ;* ** ;* USAGE. THE PDP-11 CONSOLE SWITCHES ARE USED TO SPECIFY ** ;* THE SELECTED OPTIONS. THE BIT ASSIGNMENTS ARE: ** ;* ON IS RECEIVED. IF IT IS THE PROPER TIME, THE * ; * E-O-D SEQUENCE IS INITIATED FOR THAT TERMINAL. SEE * ; * "REQUIREMENTS" BELOW FOR DETAILS OF THE SEQUENCE. * ; * * ; * PROGRAMMERS: 50 AND 52 * ; ******************************************************************** .PAGE ;* * * ; ; ;* * * ; ; REQUIREMENTS ; ; 1. CO ** ;* HIGH BYTE = DISC CODE: 1 = RF11, 0 = DDC ** ;* 3. PRESS 'CONTINUE'. ** ;* ** ;* ALL SOURCE FILES WITH AN 'LST' EXTENSION WILL BE TRANSFERRED ** ;* TO MAG TAPE. ** ;* ** ;* DATE: 02.12.73  ** ;* 0 = DEFINE NEW SET OF MESSAGES (INPUT ON PAPER TAPE) ** ;* 1 = ADD MESSAGES (INPUT ON PAPER TAPE) ** ;* 2 = SIMULATE BCC ERROR ** ;* 3 = USE RECORD SELECTED IN BITS 12-15 ** ;* 4 = SIMULATE STX ERROR ** ;* 5 = SIMULATE ETX ERROR ** ;* 6 = PAUSE AFTER SIMULAT ** ;* 0 = DEFINE NEW SET OF MESSAGES (INPUT ON PAPER TAPE) ** ;* 1 = ADD MESSAGES (INPUT ON PAPER TAPE) ** ;* 2 = SIMULATE BCC ERROR ** ;* 3 = USE RECORD SELECTED IN BITS 12-15 ** ;* 4 = SIMULATE STX ERROR ** ;* 5 = SIMULATE ETX ERROR ** ;* 6 = PAUSE AFTER SIMULATNTROL EOD TRANSACTION GENERATION FOR THE TERMINALS. ; THE CLOSING TIME FOR A TERMINAL IS MAINTAINED IN ITS ; PERSONALITY TABLE (TERMINAL DESCRIPTOR - TRM). ; ; 2. UPDATE THE FOLIO NUMBER FOR THE TERMINAL AT EACH EOD. ; THE FOLIO NUMBER IS IN FIELD TRMFLN. ; ; 3. THE TIME FOR EOD IS IN FIELD TRMEOD. THE DAY FOR EOD ; IS IN THE FIELD TRMEDM. THE YEAR FOR EOD IN IN FIELD ; TRMEDY. THE DAY FOR NEXT EOM TRANSACTION IS IN FIELD ;  ** ;* PROGRAMMER: 55 ** ;* ** ;*********************************************************************** .GLOBL SRC2MT,R50UNP ;* ;* ;* E Q U A T E S ;* ;* R0 = %0 ; R R1 = %1 ; G E R2 = %2 ; E G R3 = %3 ; N ING ONE MESSAGE ** ;* 7 = SUPPRESS PRINTOUT OF OUTPUT MESSAGES ** ;* 8 = STOP PROGRAM, EXIT TO ROS (THIS IS CHECKED ** ;* AFTER MESSAGES ARE DEFINED) ** ;* 10 = SIMULATE NAK FROM CP ** ;* 11 = SIMULATE LINE LOSS DURING INPUT ** ;* 12-15= SELECTED RECORD TO REPEAT (SEE BIT 3) ** ;* ING ONE MESSAGE ** ;* 7 = SUPPRESS PRINTOUT OF OUTPUT MESSAGES ** ;* 8 = STOP PROGRAM, EXIT TO ROS (THIS IS CHECKED ** ;* AFTER MESSAGES ARE DEFINED) ** ;* 9 = SIMULATE TWO TERMINALS (SAME DC11 PORT) ** ;* 10 = SIMULATE NAK FROM CP ** ;* 11 = SIMULATE LINE LOSS DURING INPUT ** ;* 12-15= SELECTED RE TRMEMM. ; ; 4. THE TIME ZONE (TRMTMZ) IS USED TO CORRECT TERMINAL TIME ; TO HUB TIME. ; ; 5. THE EOM TRANSACTION CAN BE GENERATED ON THE LAST DAY OF ; THE MONTH OR THE FIRST DAY OF THE MONTH. THE FIELD TRMEOM ; CONTROLS THIS. ; ; 6. ALL EOD TRANSACTIONS HAVE INPUT ID = 020. FOUR TYPES ; OF TRANSACTION ARE PREPARED AND ARE IDENTIFIED BY THEIR ; OPCODE: ; ; 01 = OPEN FOLIO ;  I R4 = %4 ; E S R5 = %5 ; R T SP = %6 ; A E PC = %7 ; L R PS = 177776 ; S SWITCH = 177570 ;CONSOLE SWITCH REGISTER UCODE = 440 ;ADDRESS IN DOS OF USER CODE TKS = 177560 ;TTY KEYBOARD STATUS REGISTER TKB = 177562  ** ;* COPYRIGHT 1973 ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* ** ;*********************************************************************** .GLOBL CPSIM CORD TO REPEAT (SEE BIT 3) ** ;* ** ;* COPYRIGHT 1973 ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* ** ;*********************** 07 = CLOSE DAILY FOLIO ; 05 = CLOSE MONTH END FOLIO ; 00 = NULL MESSAGE NUMBER LISTING ; ; 7. THE EOD OCCURS IF A FORMAT 090 IS RECEIVED AT THE HUB WITH- ; IN 1 HOUR PRIOR TO THE NORMAL EOD. ; 8. THE FOLIO NUMBER IS ASSIGNED SEQUENTIALLY BEGINNING ; WITH 001 ON THE FIRST DAY OF EACH MONTH ; ; 9. A MESSAGE IS PREPARED FOR THE TERMINAL INDICATING THE EOD. ; THE MESSAGE IS SENT TO THE ASR AT THE TERMINAL. ; ; ! ;TTY KEYBOARD BUFFER REGISTER TPS = 177564 ;TTY PRINTER STATUS REGISTER TPB = 177566 ;TTY PRINTER BUFFER REGISTER ; LINK = DBUF1 ;LINK WORD IN MFD DISC READ BUFFER BLOCK = 2 ;LOCATION OF BLOCK RELATIVE TO UIC IN MFD ULINK = DBUF2 ;LINK WORD IN UFD DISC READ BUFFER START = 10. ;LOCATION OF 'START' IN UFD RELATIVE TO FNAME1 MTSIZE = 132." .PAGE ;* ;* C P S I M E Q U A T E C A R D S ;* R0 = %0 ; G R R1 = %1 ; E E R2 = %2 ; N G R3 = %3 ; E I R4 = %4 ; R S R5 = %5 ; A T SP = %6 ; L E PC = %7 ; R PS = #************************************************ .GLOBL CPSIM .PAGE ;* ;* C P S I M E Q U A T E C A R D S ;* R0 = %0 ; G R R1 = %1 ; E E R2 = %2 ; N G R3 = %3 ; E I R4 = %4 ; R S R5 = %5 ; A T SP = %6 ; L $ 10. THE REQUEST TO OPEN A FOLIO IS SENT TO THE DATA-CENTER ; REAL-TIME QUEUE. THE REQUEST TO CLOSE A FOLIO IS SENT ; TO THE DATA-CENTER BATCH QUEUE. ; ; 11. THE GENERATION OF THE EOD CAUSES TERMINAL INPUT TO BE ; STOPPED FOR 1 MINUTE. THE FIRST ACTION IS TO SEND THE ; OPEN FOLIO. THEN AFTER 30 SECONDS THE CLOSE FOLIO IS ; SENT. AFTER ANOTHER 30 SECONDS THE TERMINAL INPUT IS ; ALLOWED. ; ; TERMINAL INPUT IS STOPPED % ;NO. CHARACTERS IN MAG TAPE BUFFER ; MWC = 167540 ;MAG TAPE WORD COUNT REGISTER STAT = 167542 ;MAG TAPE STATUS REGISTER COM = 167544 ;MAG TAPE COMMAND REGISTER MA = 167546 ;MAG TAPE MEMORY ADDRESS ;* ;* D A T A A N D B U F F E R S ;* SWR: .WORD 0 ;CONTENTS OF SWITCH REGISTER ; BYTE 0 = TAPE TRANSPORT & 177776 ;CPU STATUS REGISTER ; S ; ;* ;* A S Y N C E Q U A T E S ;* ASYNCR = 310 ;ASYNC RECEIVE INTERRUPT ADDRESS * U ASYNCX = 314 ;ASYNC TRANSMIT INTERRUPT ADDRESS * N RCSR = 330 ;DC11 RECEIVE STATUS REGISTER * I RBUF = 332 ;DC11 RECEIVE DATA BUFFER * T XCSR = 334 'E PC = %7 ; R PS = 177776 ;CPU STATUS REGISTER ; S ; ;* ;* A S Y N C E Q U A T E S ;* ASYNCR = 310 ;ASYNC RECEIVE INTERRUPT ADDRESS * U ASYNCX = 314 ;ASYNC TRANSMIT INTERRUPT ADDRESS * N RCSR = 330 ;DC11 RECEIVE STATUS REGISTER * I RBUF = 332 ;DC1(BY SETTING THE INHIBIT INPUT ; FLAG (MSQIH) IN THE TERMINAL QUEUE TABLE MSQ. ; ; NULL MESSAGE NUMBERS ARE REPORTED PRIOR TO FORMING THE ; CLOSE FOLIO MESSAGE. THE NULL MESSAGE NUMBERS ARE IN THE ; NULL MESSAGE NUMBER TABLE (NMN) FOR THE TERMINAL. THE TABLE ; IS CLEARED UPON COMPLETION OF THE REPORT. A MAXIMUM OF 100 ; NULL SEQUENCE NUMBERS ARE REPORTED IN ONE MESSAGE. UP TO ; 10 NULL MESSAGES ARE PREPARED AS REQUIRED ; ; ) ; BYTE 1 = DISC (0 = DDC, 1 = RF11) UIC: .WORD 0 ;USER IDENTIFICATION CODE LST: .RAD50 /LST/ ;THE FILE EXTENSION WE LOOK FOR SAVE: .WORD 0 ;TEMPORARY SAVE AREA ; ; MTBUF: .BLKB MTSIZE ;MAG TAPE BUFFER DBUF1: .BLKW 64. ;DOS MASTER FILE DIRECTORY BUFFER DBUF2: .BLKW 64. ;USER FILE DISC READ BUFFER DERR: .BYTE 15,12 .ASCII 'DISC ERROR' .BYTE *;DC11 TRANSMIT STATUS REGISTER * XBUF = 336 ;DC11 TRANSMIT DATA BUFFER * 1 CPSIMV = 350 ;ADDRESS OF CPSIM FOR ASYNC HANDLER TYOUTV = 352 ;THIS LOCATION CONTAINS THE ADDRESS OF TTYOUT QTIMEV = 354 ;THIS LOCATION CONTAINS THE ADDRESS OF QTIME ACK = 006 ;SPECIAL NAK = 025 ; CHARACTERS DEL = 377 ; TO/FROM ETX = 003 +1 RECEIVE DATA BUFFER * T XCSR = 334 ;DC11 TRANSMIT STATUS REGISTER * XBUF = 336 ;DC11 TRANSMIT DATA BUFFER * 1 CPSIMV = 350 ;ADDRESS OF CPSIM FOR ASYNC HANDLER TYOUTV = 352 ;THIS LOCATION CONTAINS THE ADDRESS OF TTYOUT QTIMEV = 354 ;THIS LOCATION CONTAINS THE ADDRESS OF QTIME ACK = 006 ;SPECIAL NAK = 025 ; CHARACTERS , 12. EOD TRANSACTIONS ARE GENERATED AUTOMATICALLY ONLY ON THE ; QUARTER HOUR. ; ; 13. THE 090 TRANSACTION IS REROUTED TO THE DATACENTER. ; TO = DCRTE ; ACT = .NC (MANUAL TRANSACTION TO DC) ; 14. ALL TIMES RECORDED IN "TRM" ARE IN TERMINAL'S LOCAL TIME. ; THEY ARE CONVERTED TO HUB TIME IF NEEDED FOR COMPARISON ; WITH CURRENT CLOCK. HUB CLOCK IS CONVERTED TO TERMINAL TIME ; WHEN NEEDED FOR LISTINGS AT -15,12,0 MTERR: .BYTE 15,12 .ASCII 'MT ERROR' .BYTE 15,12,0 FILE: .BYTE 15,12 .BLKB 6 .ASCII '.LST' .BYTE 15,12,0 .EVEN .PAGE ;*********************************************************************** ;* ** ;* S R C 2 M T ** ;* ** . ; CP STX = 002 ; EOT = 004 ; CR = 015 ; LF = 012 ; VT = 013 ; SWITCH = 177570 ;CONSOLE SWITCH REGISTER EXIT = 4. ; DEFINE = 41. ;ROS TTYIN = 12. ; TTYOUT = 11. ; SUBROUTINE DISCIO = 19. ; QTIME = 7. ; EQUATES ;* ;* / DEL = 377 ; TO/FROM ETX = 003 ; CP STX = 002 ; EOT = 004 ; CR = 015 ; LF = 012 ; VT = 013 ; SWITCH = 177570 ;CONSOLE SWITCH REGISTER EXIT = 4. ; DEFINE = 41. ;ROS TTYIN = 12. ; TTYOUT = 11. ; SUBROUTINE DISCIO = 19. 0THE TERMINAL. .PAGE .SBTTL LOCAL MACROS ;* * * .MACRO FILEF NAME,LIST,TEMP,LCK,PAR,ERR1,ERR2,ERR3 .LIST ME ERRNUM = ERRNUM+1 .NLIST ME,COM ERR = ERR-4 .IF B LIST .IF B TEMP FILEC NAME,CFFCL,R0,LCK,PAR,ERR1,ERR2,ERR3 .IFF FILEC NAME,CFFCL,TEMP,LCK,PAR,ERR1,ERR2,ERR3 .ENDC .IFF .IF B TEMP FILEC NAME,LIST,R0,LCK,PAR1;* THIS IS THE MAIN ENTRY POINT. ** ;* ** ;******* ; SRC2MT: HALT ;WAIT FOR MAG TAPE AND DISC CODES MOV @#SWITCH,R0 ;SAVE SWITCH REGISTER VALUE MOV R0,SWR ; CMPB R0,#1 ;IS MAG TAPE TRANSPORT CODE LEGAL? BLOS SRCA10 ;BRANCH IF YES ; SRCA00: EMT 60 ;ERROR - E2 DATA SWITCHES BIT ASSIGNMENTS ;* NEW = 1 ;DEFINE NEW SET OF MESSAGES ADD = 2 ;ADD MORE MESSAGES BCCERR = 4 ;SIMULATE BCC ERROR REPEAT = 10 ;USE SELECTED RECORD REPEATEDLY STXERR = 20 ;SIMULATE STX ERROR ETXERR = 40 ;SIMULATE ETX ERROR PAUSE = 100 ;PAUSE AFET SIMULATING ONE MESSAGE SUPRES = 200 ;SUPPRESS PRINTOUT OF TRANSM3 ; QTIME = 7. ; EQUATES ;* ;* DATA SWITCHES BIT ASSIGNMENTS ;* NEW = 1 ;DEFINE NEW SET OF MESSAGES ADD = 2 ;ADD MORE MESSAGES BCCERR = 4 ;SIMULATE BCC ERROR REPEAT = 10 ;USE SELECTED RECORD REPEATEDLY STXERR = 20 ;SIMULATE STX ERROR ETXERR = 40 ;SIMULATE ETX ERROR PAUSE = 100 ;PAUSE AFET SIMULATING4,ERR1,ERR2,ERR3 .IFF FILEC NAME,LIST,TEMP,LCK,PAR,ERR1,ERR2,ERR3 .ENDC .ENDC .LIST COM .ENDM FILEF ;THE FORMAL PARAMETER "ENTRY" MUST BE BLANK, [A], OR [B]. SEE "MOVEX". .MACRO MOVE PAKADR,ERROR,ENTRY ;CALL THE GENERAL "MOVE" RTNE JSR R5,MOVEX'ENTRY PAKADR .IF B ERROR NOP .IFF BR ERROR .ENDC .ENDM MOVE .MACRO ERR 5XIT TO DOS ; SRCA10: MOV @#UCODE,UIC ;GET THE USER CODE FROM DOS BEQ SRCA00 ;BRANCH IF ILLEGAL (USER DIDN'T LOG-IN) BIC #100,@#TKS ;DISABLE TTY KEYBOARD BIC #100,@#TPS ; AND PRINTER INTERRUPTS MOV #DBUF1,R4 ;PREPARE TO READ FIRST BLOCK OF MFD MOV #1,R5 ;(LOCATED IN SECTOR 1) JSR PC,DISCIO ;READ IT TST LINK ;IS THE LINK WORD ZERO? 6ITTED MESSAGES STOP = 400 ;TERMINATE TASK EXECUTION TERMS = 1000 ;SIMULATE TWO TERMINALS NAKSIM = 2000 ;SIMULATE NAK FROM CP DROPPD = 4000 ;SIMULATE A DROPPED LINE SELECT = 170000 ;BITS 12-15 = VALUE FOR 'NEXT' .PAGE ;*********************************************************************** ;* ** ;* BECAUSE THIS IS A TASK THA7 ONE MESSAGE SUPRES = 200 ;SUPPRESS PRINTOUT OF TRANSMITTED MESSAGES STOP = 400 ;TERMINATE TASK EXECUTION TERMS = 1000 ;SIMULATE TWO TERMINALS NAKSIM = 2000 ;SIMULATE NAK FROM CP DROPPD = 4000 ;SIMULATE A DROPPED LINE SELECT = 170000 ;BITS 12-15 = VALUE FOR 'NEXT' .PAGE ;*********************************************************************** ;* H .LIST ME ERRNUM = ERRNUM+1 .NLIST ME ERR = ERR-4 JMP ERR .ENDM ERR .MACRO PACK DEST,SRCE,COUNT,CODE ;GENERATES "MOVE" PACKET .WORD DEST .WORD SRCE .BYTE COUNT .BYTE MVCD'CODE .ENDM PACK ; .PAGE ; TANK GAUGE FORMAT ID MACRO DEF ; ;* * * ; .MACRO TNKFID ; .ASCII /090 / ; .ENDM ; ; ;* * * ; ; MAE BNE SRCA40 ;BRANCH IF NO. OTHERWISE, BAD NEWS. ; SRCA20: MOV #DERR,R5 ;DISC ERROR (HARDWARE OR SOFTWARE) JSR PC,TTYOUT ;TYPE MESSAGE ; SRCA30: BIS #100,@#TKS ;ENABLE TTY READER BIS #100,@#TPS ; AND PRINTER INTERRUPTS EMT 60 ;AND EXIT TO DOS ; SRCA40: MOV LINK,R5 ;GET SECTOR ADDRESS OF NEXT BLOCK IN MFD MOV #DBUF1,R4 ;USE DISC BUFFER 1 FT EXECUTES UNDER CONTROL OF ROS, ** ;* WE NEED TO DEFINE A TASK HEADER. SO, HERE WE ARE. ** ;* ** ;*********************************************************************** ; CPSIM: .WORD 1 ;THREAD WORD .WORD CPSTRT ;ENTRY POINT .WORD 0 ;NOT USED .WORD 0 ;MAXIMUM EXECUTION TIME. 0 = UNLIMITED .BYTE 100. G ** ;* BECAUSE THIS IS A TASK THAT EXECUTES UNDER CONTROL OF ROS, ** ;* WE NEED TO DEFINE A TASK HEADER. SO, HERE WE ARE. ** ;* ** ;*********************************************************************** ; CPSIM: .WORD 1 ;THREAD WORD .WORD CPSTRT ;ENTRY POINT .WORD 0 ;NOT USED .WORD 0 """"""" """"""""""""""""""""DDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDADDB -B (B Cy4d 7SH:x WhSH:w U<SH:q T$DLDDDDDDDDDDDDDDa ͋,L w:B8 ` 5 &  E >w   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * B.&0 M &0 & I JSR PC,DISCIO ;READ NEXT MFD BLOCK MOV #DBUF1+2,R0 ;PREPARE TO SCAN MFD FOR USER CODE MOV UIC,R1 ;GET USER CODE MOV #DBUF1+128.,R2 ; MOV #8.,R3 ; ; SRCA50: CMP (R0),R1 ;IS THIS THE USER WE WANT? BEQ SRCB00 ;BRANCH IF YES ADD R3,R0 ;OTHERWISE, INCREMENT TO NEXT ENTRY CMP R0,R2 ;HAVE ALL ENTRIES IN THIS BLOCK BEEN CHECKEDJ ;STACK SIZE .BYTE 1 ;TASK AND PARTITION PRIORITY .WORD 0 ;CURRENT TIMER VALUE .WORD 0 ;ARGUMENT .BYTE 205 ;PS SAVED WHEN TASK IS SUSPENDED .BYTE 40 ;TASK NUMBER .WORD 0 .WORD 40+50 ;FILE ID = TASK NO. + 50 OFFSET .BLKW 200. ; .PAGE ;*********************************************************************** ;* K ;MAXIMUM EXECUTION TIME. 0 = UNLIMITED .BYTE 100. ;STACK SIZE .BYTE 1 ;TASK AND PARTITION PRIORITY .WORD 0 ;CURRENT TIMER VALUE .WORD 0 ;ARGUMENT .BYTE 205 ;PS SAVED WHEN TASK IS SUSPENDED .BYTE 40 ;TASK NUMBER .WORD 0 .WORD 40+50 ;FILE ID = TASK NO. + 50 OFFSET .BLKW 200. ; .PAGE ;***************LNUAL INPUT ACTION CODE MACRO DEF ; ;* * * ; ; INDICATES TO DC THAT TRANSACTION ORIGINATED AS A MANUAL ENTRY ; .MACRO DCMANA ; .ASCII /.NC/ 01.27.73 .ENDM ; ; ; ;* * * ; ; END OF DAY ACTION CODE MACRO DEF ; ;* * * .MACRO EODACT ; .ASCII /.NB/ 01.27.73 .ENDM ;* * * ; .PAGE .SBTTL LOCAL EQM? BLO SRCA50 ;BRANCH IF NO TST LINK ;YES - IS THE LINK WORD ZERO? BNE SRCA40 ;IF NOT, GO READ NEXT BLOCK AND CONTINUE SEARCH BR SRCA30 ;OTHERWISE, THE USER DOESN'T EXIST ;* ;* ;* THE USER CODE HAS BEEN FOUND IN THE MASTER FILE DIRECTORY. WE ;* CA NOW READ THE FIRST BLOCK OF THIS USER'S FILE DIRECTORY (UFD). ;* ;* SRCB00: MOV BLOCK(R0),LINK ;PUT START BLOCK OF UFD IN LINK N ** ;* AND NOW FOR THE DATA........... ;* ;* ;* FIRST, THE LIST NEEDED BY SUBROUTINE DEFINE TO DEFINE ;* A DISC FILE. ;* FILE: .WORD 1 ;THREAD WORD FERR: .BYTE 0,0 ;ERROR INDICATORS .WORD 0 ;RESERVED FOR USE BY DEFINE .WORD 235 ;FILE IDENTIFICATION .BYTE 9. ;FILE TYPE 9 (DATA) .BYTE 0 ;RESERVED O******************************************************** ;* ** ;* AND NOW FOR THE DATA........... ;* ;* ;* FIRST, THE LIST NEEDED BY SUBROUTINE DEFINE TO DEFINE ;* A DISC FILE. ;* FILE: .WORD 1 ;THREAD WORD FERR: .BYTE 0,0 ;ERROR INDICATORS .WORD 0 ;RESERVED FOR USE BY DEFINE .WORD 235 ;FILE IDENTIFICATION .BYTE 9. PUATES ; .TITLE EODRPT END OF DAY REPORT ; ; SYSTEM EQUATES ; ; TABLES ACCESSED ; ; GENERAL INFORMATION ; ; 1. ASSIGNED MESSAGE QUEUE - QUEODR ; 2. TASK NAME - TSEODR ; 3. TASK PRIORITY - PRIEOD ; .PAGE ; MACRO REFERENCES .MCALL HEADR,MSPLST,FLPLST,MESGM,FILGM,IOPAC,IODLST .MCALL TSKRUN,JEQ,JNE,FILEC .MCALL DATEG,MOVEA,SERCH,QUEUE,CNXRTE ;01-23-73 .MCAQ JSR PC,CHECK ;SEE IF USER WANTS TO ENTER DOS ; SRCB10: MOV LINK,R5 ;GET DISC SECTOR MOV #DBUF1,R4 ;AND LOAD THE BUFFER ADDRESS JSR PC,DISCIO ;THEN GO READ THE NEXT UFD BLOCK MOV #DBUF1+6,R0 ;NOW, PREPARE TO SCAN MOV #18.,R3 ; THE CURRENT UFD BLOCK MOV #DBUF1+128.,R2 ; FOR .LST FILE EXTENSIONS MOV LST,R1 ;EXTENSION NAME ; SRCB20: CMP R .WORD 49. ;NUMBER OF SECTORS TO RESERVE (16 MESSAGES) ;* ;* D I S C I O L I S T S ;* ;* TO READ/WRITE THE CONTROL SECTOR OF 'SIM' FILE ;* CLIST: .WORD 1 ;THREAD WORD .BYTE 1 ;DEVICE 1 = DISC .BYTE 2 ;EXIT 2 (SUSPEND ON I/O) .WORD 0 ;NOT USED .BYTE 0 ;ERROR TASK (NOT USED) .BYTE 1 ;PRIORITY LEVEL CERR: .WORD 0 S ;FILE TYPE 9 (DATA) .BYTE 0 ;RESERVED .WORD 49. ;NUMBER OF SECTORS TO RESERVE (16 MESSAGES) ;* ;* D I S C I O L I S T S ;* ;* TO READ/WRITE THE CONTROL SECTOR OF 'SIM' FILE ;* CLIST: .WORD 1 ;THREAD WORD .BYTE 1 ;DEVICE 1 = DISC .BYTE 2 ;EXIT 2 (SUSPEND ON I/O) .WORD 0 ;NOT USED .BYTE 0 ;ERROR TASK (NOT UTLL DCRTE,HUBRTE,STDID,INTID,TRMAC1 ;01-23-73 ; EXTERNAL DEFINITIONS .GLOBL MESG,MESGB,MESGL,MESGP,MESG1,MESG2,MESG3,MESG4 .GLOBL FILG,FILGB,FILGL,FILGP,FILG1,FILG2,FILG4,FILAT .GLOBL TASKNO,TSKNO ; ; EXTERNAL REFERENCES .GLOBL SYDST,SYDSK3,SYDTM3,SYDVST .GLOBL MOVEX,MOVEXA,MOVEXB,MOVA .GLOBL MSDT,MSAT,FLSNT,FLWR,CNVRTX,CNVRTQ,SECHS,RTEST,OUT ; ;TASK PARAMETERS EXTIM = 80. PRU(R0),R1 ;IS THIS AN 'LST' EXTENSION? BEQ SRCC00 ;BRANCH IF YES ; SRCB25: ADD R3,R0 ;NO - INCREMENT TO NEXT ENTRY CMP R0,R2 ;HAVE WE REACHED THE END OF THIS BLOCK? BLO SRCB20 ;BRANCH IF NO - TST LINK ;YES - ARE THERE MORE UFD BLOCKS TO READ? BNE SRCB10 ;BRANCH IF YES - GO READ THE NEXT JSR PC,MTEOF ;ALL USER FILES HAVE BEEN PROCESSED V ;ERROR STATUS .WORD 0 ;RESERVED .WORD CONTRL ;CONTROL DATA BUFFER ; CONTRL: .WORD 235 ;FILE IDENTIFICATION .BYTE 0 ;SPECIFIES RELATIVE SECTO I/O CTLIO: .BYTE 0 ;I/O COMMAND (0 = READ, 1 = WRITE) .WORD 0,0,0 ;ALL RESERVED .WORD 0 ;RELATIVE SECTOR (THE FIRST SECTOR IS CONTROL) .WORD 64. ;NUMBER OF WORDS TO TRWSED) .BYTE 1 ;PRIORITY LEVEL CERR: .WORD 0 ;ERROR STATUS .WORD 0 ;RESERVED .WORD CONTRL ;CONTROL DATA BUFFER ; CONTRL: .WORD 235 ;FILE IDENTIFICATION .BYTE 0 ;SPECIFIES RELATIVE SECTO I/O CTLIO: .BYTE 0 ;I/O COMMAND (0 = READ, 1 = WRITE) .WORD 0,0,0 ;ALL RESERVED .WORD 0 ;RELATIVE SECTOR (THE FIRST XI = 3 TSKNO = TSEODR FILEID = TSFLBS+TSEODR CSTAT = 200 STKSZ = 50. STRT2 = 0 START = EODRPT TSKFR = 205 TASKNO = TSKNO ; ; TASK EQUATES FLSL1 = 128. ; FLSL2 = 0 ; FLSL3 = 0 ; MSWL2 = 0 ; TSKLV = PRIEOD ; EODST = MESG2+HDRL ; START OF EOD TRANSACTION BUFPRI = 3 ;PRIORITY FOY JSR PC,MTEOF ;WRITE A DOUBLE EOF JSR PC,MTREW ;REWIND THE TAPE, JMP SRCA30 ;AND GO EXIT TO DOS ;* ;* ;* WE FOUND A SOURCE FILE TO COPY. FIRST WE'LL PRINT ITS NAME ;* ON THE TELETYPE, THEN TRANSFER IT TO MAG TAPE IN 132 CHARACTER ;* BLOCKS. ;* ;* SRCC00: MOV R0,SAVE ;FIRST, SAVE THE CURRENT POINTER IN UFD MOV #FILE+2,-(SP) ;CONVERT FILE NAME FROM RAD50 TO ASCII SUB #4ZANSFER NMESGE = . ;DATA BUFFER: NUMBER OF MESSAGES IN FILE NEXT = .+2 ;DATA BUFFER: NEXT RELATIVE SECTOR TO PROCESS NTRMNL = .+4 ;CONTAINS THE NUMBER OF DIFFERENT TERMINALS MSGNO = .+6 ;TABLE OF ALL TERMINALS DEFINED AND ;THEIR NEXT ASSIGNED SEQUENCE NUMBER . = .+128. ;CONTROL DATA BUFFER ;* ;* MESSAGE BUFFER DISCIO LIST, ET. AL. ;* MLIST: .WORD [SECTOR IS CONTROL) .WORD 64. ;NUMBER OF WORDS TO TRANSFER NMESGE = . ;DATA BUFFER: NUMBER OF MESSAGES IN FILE NEXT = .+2 ;DATA BUFFER: NEXT RELATIVE SECTOR TO PROCESS NTRMNL = .+4 ;CONTAINS THE NUMBER OF DIFFERENT TERMINALS MSGNO = .+6 ;TABLE OF ALL TERMINALS DEFINED AND ;THEIR NEXT ASSIGNED SEQUENCE NUMBER . = .+128. ;CONTROL DATA BUFFER ;*\R "GETBUF" NMNTSZ = 63. ;# OF WORDS TO ZERO IN NULL MESSAGE NUMBER TABLE MNTTSZ = 64. ;# OF WORDS TO ZERO IN MESSAGE NUMBER TABLE EODFF = 4 ;# OF LINE FEEDS SURROUNDING E-O-D LISTING @ TRM EODMDY = 180. ;MAX # DAYS EOD ALLOWED TO BE POST-DATED BY TERM PAKEND = -1 ;END-OF-PACKET KEY .PAGE ;01-23-73 ; THESE ARE THE TRANSFER-AND-CONVERT CODES USED BY "MOVE" .RAD],R0 ;POINT R0 TO FIRST WORD OF RAD50 FILE NAME MOV R0,-(SP) ;PUSH ADDRESS OF CONVERTED ASCII STRING JSR PC,R50UNP ;CONVERT TO ASCII MOV #FILE,R5 ;PRINT THE JSR PC,TTYOUT ; FILE NAME MOV START(R0),ULINK ;PUT SECTOR ADDRESS OF FIRST FILE BLOCK IN ULINK BEQ SRCC50 ;BRANCH IF THERE ISN'T ANY STORE INFO MOV #MTSIZE,R5 ;SET UP LOOP MOV #MTBUF,R0 ; R^ 1 ;THREAD WORD .BYTE 1 ;DEVICE 1 = DISC .BYTE 2 ;EXIT 2 (SUSPEND ON I/O) .WORD 0 ;NOT USED .BYTE 0 ;ERROR TASK .BYTE 1 ;PRIORUTY LEVEL MERR: .WORD 0 ;ERROR STATUS .WORD 0 ;RESERVED .WORD MSGBUF ;DATA BUFFER ; MSGBUF: .WORD 235 ;FILE IDENTIFICATION .BYTE 0 _ ;* MESSAGE BUFFER DISCIO LIST, ET. AL. ;* MLIST: .WORD 1 ;THREAD WORD .BYTE 1 ;DEVICE 1 = DISC .BYTE 2 ;EXIT 2 (SUSPEND ON I/O) .WORD 0 ;NOT USED .BYTE 0 ;ERROR TASK .BYTE 1 ;PRIORUTY LEVEL MERR: .WORD 0 ;ERROR STATUS .WORD 0 ;RESERVED .WORD MSGBUF ;DATA BUFFER ; MSGBUF: `IX 2 MVCD00 = 00 ;ALL CHARACTERS ALLOWED MVCD01 = 01 ;NUMERICS ONLY MVCD02 = 10 ;ALPHA ONLY MVCD03 = 11 ;ALPHA & NUMERICS MVCD04 = 1000 ;THE 64 CHARS FROM 40-137 MVCD05 = 101 ;NUMERICS AND SPACES MVCD06 = 110 ;ALPHAS AND SPACES MVCD07 = 111 ;ALPHAS & NUMERICS & SPACES MVCD10 = 10000000 ;ASCII-TO-BINARY (SINGLE) MVCD11 aEGISTERS TO CLEAR MOV #' ,R4 ; MAG TAPE BUFFER ; SRCC05: MOVB R4,(R0)+ ;BLANK OUT MAG TAPE BUFFER SOB R5,SRCC05 ; MOVB #15,MTSIZE/2+MTBUF ;STORE IN MIDDLE OF BUFFER MOVB #14,-(R0) ;AND AT END OF BUFFER JSR PC,MTOUT ;THEN WRITE TO MAG TAPE MOV #MTBUF,R0 ;INITIALIZE MAG TAPE BUFFER POINTER ; SRCC10: MOV ULINK,R5 ;Rb ;SPECIFIES RELATIVE SECTOR I/O SIMIO: .BYTE 0 ;I/O COMMAND (0 = READ, 1 = WRITE) .WORD 0,0,0 ;ALL RESERVED RLSECT: .WORD 0 ;RELATIVE SECTOR OF FILE TO READ NEXT .WORD 192. ;NUMBER WORDS TO TRANSFER SIMBUF: . = .+384. ;SIMULATION MESSAGE DATA BUFFER ;* ;* ;* T I M E R M O D U L E S ;* TIMER1: .WORD 1 ;THREAD WORD .BYTE 0 ;NOT USED c .WORD 235 ;FILE IDENTIFICATION .BYTE 0 ;SPECIFIES RELATIVE SECTOR I/O SIMIO: .BYTE 0 ;I/O COMMAND (0 = READ, 1 = WRITE) .WORD 0,0,0 ;ALL RESERVED RLSECT: .WORD 0 ;RELATIVE SECTOR OF FILE TO READ NEXT .WORD 192. ;NUMBER WORDS TO TRANSFER SIMBUF: . = .+384. ;SIMULATION MESSAGE DATA BUFFER ;* ;* ;* T I M E R M O D U L E S ;* TIMER1: .WORD 1 d= 10000010 ;ASCII-TO-BINARY (DOUBLE) MVCD12 = 10000001 ;BINARY-TO-ASCII (SINGLE) MVCD13 = 10000011 ;BINARY-TO-ASCII (DOUBLE) MVCD14 = 10000101 ;BINARY-TO-ASCII (SINGLE: BYTE SOURCE) .RADIX 8 .PAGE ; END OF DAY MESSAGE EQUATES ; ;* * * ; ; EOD1 = 0 ; FORMAT ID (020) EOD2 = EOD1+3 ; TERMINAL ID EOD3 = EOD2+7 ; FOLIO NO. EOD4 = EOD3+3 eEAD THE NEXT BLOCK OF SOURCE MOV #DBUF2,R4 ; DATE FROM THE FILE JSR PC,DISCIO ; JSR PC,CHECK ;SEE IF USER WANTS TO TALK TO DOS MOV #DBUF2+2,R1 ;INITIALIZE POINTER TO DISC BUFFER 2 ;* ;* THE FOLLOWING LOGIC MOVES THE DISC DATA TO THE MAG TAPE BUFFER ;* SRCC20: MOVB (R1)+,(R0) ;MOVE ONE CHARACTER ;AND AT THE SAME TIME, SEE IF IT IS ZERO BEQ SRCC30 f.BYTE 200 ;SUSPENT OPTION AND RESOLUTION 0 .WORD 0 ;RESERVED ; TIMER2: .WORD 1 ;THREAD WORD .BYTE 0 ;NOT USED .BYTE 20 ;JSR SUBROUTINE OPTION, RESOLUTION 0 .WORD 0 ;RESERVED .WORD SIMB10 ;JSR ADDRESS ;* ;* ;* T E L E T Y P E I / O L I S T S ;* ;* TLIST: .WORD 1 ;THREAD WORD .BYTE 0 ;TTY DEVICE g ;THREAD WORD .BYTE 0 ;NOT USED .BYTE 200 ;SUSPENT OPTION AND RESOLUTION 0 .WORD 0 ;RESERVED ; TIMER2: .WORD 1 ;THREAD WORD .BYTE 0 ;NOT USED .BYTE 20 ;JSR SUBROUTINE OPTION, RESOLUTION 0 .WORD 0 ;RESERVED .WORD SIMB10 ;JSR ADDRESS ;* ;* ;* T E L E T Y P E I / O L I S T S ;* ;* TLIST: .WORD h ; OP CODE EOD5 = EOD4+2 ; JULIAN DAY EOD6 = EOD5+3 ; HOUR EOD7 = EOD6+2 ; MIN EOD8 = EOD7+2 ; LAST SEQ NUM EOD9 = EOD8+3 ; FIRST NULL SEQ.NO. EODL = EOD9 ; LENGTH OF OPEN & CLOSE TRANSACTIONS ; ; FIELD LENGTHS ; EOD1L = 3 ; SEE ABOVE EOD2L = 7 ; EOD3L = 3 ; EOD4L = 2 ; EOD5L i;BRANCH IF IT IS (ZEROES ARE IGNORED) INC R0 ;IT'S NON-ZERO. INCREMENT MAG TAPE BUFFER POINT CMP R0,#MTBUF+MTSIZE;IS MAG TAPE BUFFER FULL? BLO SRCC30 ;BRANCH IF NO MOV #MTBUF,R5 ;OTHERWISE, JSR PC,MTOUT ; WRITE THE BUFFER TO MAG TAPE MOV #MTBUF,R0 ;INITIALIZE MAG TAPE BUFFER POINTER ; SRCC30: CMP R1,#DBUF2+128. ;HAVE WE REACHED THE END OF THE DISC BUFFER? jNUMBER .BYTE 2 ;SUSPEND ON I/O (EXIT 2) .WORD 0 ;NOT USED .BYTE 0 ;NOT USED .BYTE 1 ;PRIORITY LEVEL TTYERR: .WORD 0 ;ERROR STATUS .WORD 0 ;RESERVED TTYBUF: .WORD 0 ;DATA BUFFER ; TTYBF1: .WORD 450.+40000 ;MAXIMUM NUMBER OF CHARACTERS TO ENTER .WORD 0 ;ACTUAL NUMBER CHARACTERS INPUT . = .+450. ; k1 ;THREAD WORD .BYTE 0 ;TTY DEVICE NUMBER .BYTE 2 ;SUSPEND ON I/O (EXIT 2) .WORD 0 ;NOT USED .BYTE 0 ;NOT USED .BYTE 1 ;PRIORITY LEVEL TTYERR: .WORD 0 ;ERROR STATUS .WORD 0 ;RESERVED TTYBUF: .WORD 0 ;DATA BUFFER ; TTYBF1: .WORD 450.+40000 ;MAXIMUM NUMBER OF CHARACTERS TO ENTER .WORD 0 l= 3 ; EOD6L = 2 ; EOD7L = 2 ; EOD8L = 3 ; EOD9L = 3 ; ; ; .PAGE ; .SBTTL TASK HEADER HEADR TSKNO,TSKFR,START,EXTIM,STKSZ,2 .PAGE .SBTTL TASK ROOT ERR = EODE00 ;INIT ERROR "SLIDE" TARGET ERRNUM = 0 ;ERROR NUMBER SIGNAL AND ERROR "SLIDE" LENGTH CONTROL ; **********************m BLO SRCC20 ;BRANCH IF NO 'THERE'S STILL PLENTY LEFT!) TST ULINK ;YES - ARE THERE MORE BLOCKS IN THIS FILE? BNE SRCC10 ;YES - GO READ THE NEXT ONE CMP R0,#MTBUF ;WE'RE ALL DONE WITH THIS FILE. DOES THE BEQ SRCC50 ;MAG TAPE BUFFER HAVE ANYTHING IN IT? BR IF NO. MOV #' ,R1 ;FILL REST OF MAG TAPE BUFFER MOV #MTBUF+MTSIZE,R2;WITH BLANKS ; SRCC40: MOVB R1,(n ERROR: .WORD 12. ;ERROR MESSAGE BUFFER - PRINTED .WORD 0 ;WHEN A DISC ERROR IS ENCOUNTERED .BYTE CR,LF .ASCII 'ERROR ' .ASCII ' 1' ;SIMULATED DC11 NO. 1 ERROR .BYTE CR,LF ; TLIST2: .WORD 1 ;THREAD WORD - TTY LIST FOR CPRNT1 .BYTE 0 ;TTY DEVICE NUMBER .BYTE 3 ;I/O COMPLETE REQUESTED (EXIT 3) .WORD SIMB00 ;I/O COMPLETo ;ACTUAL NUMBER CHARACTERS INPUT . = .+450. ; ERROR: .WORD 12. ;ERROR MESSAGE BUFFER - PRINTED .WORD 0 ;WHEN A DISC ERROR IS ENCOUNTERED .BYTE CR,LF .ASCII 'ERROR ' .ASCII ' 1' ;SIMULATED DC11 NO. 1 ERROR .BYTE CR,LF ; TLIST2: .WORD 1 ;THREAD WORD - TTY LIST FOR CPRNT1 .BYTE 0 ;TTY DEVICE NUMBER .BYTE 3 ;I/Op********************************************** ; CHECK SYSTEM IDLE ; RE-QUEUE SCHEDULER MODULE, IF NEEDED. ; ******************************************************************** EODRPT: ; ENTRY ; DEBUG 1 CLR ERRORX ;INIT ERROR NUMBER CELL FOR ERROR "SLIDE" BITB #SYDF2,SYDST+SYDIDL ;IS THE SYSTEM IDLE? 01.27.73 BEQ 2$ ;NO MOV #SYDSK3,-(SP) ;YES: DE-QUEUE SCHEDULER MODULE qR0)+ ;STORE ONE BLANK CMP R0,R2 ;THEN - END OF BUFFER? BLO SRCC40 ;GO BACK IF IT ISN'T MOV #MTBUF,R5 ; JSR PC,MTOUT ;WRITE BUFFER TO MAG TAPE ; SRCC50: MOV SAVE,R0 ;SET UP REGISTERS TO REENTER MOV #18.,R3 ;THE UFD SCAN FOR .LST EXTENSIONS MOV #DBUF1+128.,R2 ; MOV LST,R1 ; JMP SRCB25 ;THEN GO SEARCH FOR ANOTHErE SUBROUTINE .BYTE 0 ;NOT USED .BYTE 1 ;PRIORITY .WORD 0 ;ERROR STATUS .WORD 0 ;RESERVED .WORD CPRNT1 ;DATA BUFFER ADDRESS ; CPRNT1: .WORD 1,0 ;DATA BUFFER FOR TTY WHEN TRANSMISSION .BYTE 0,0 ;DATA ARE ECHOED ;* ;* ;* M I S C E L L A N E O U S D A T A V A L U E S ;* ;* SEQNO: .ASCII '001' ;SEQUENCE NUMBER FOR MESSAs COMPLETE REQUESTED (EXIT 3) .WORD SIMB00 ;I/O COMPLETE SUBROUTINE .BYTE 0 ;NOT USED .BYTE 1 ;PRIORITY .WORD 0 ;ERROR STATUS .WORD 0 ;RESERVED .WORD CPRNT1 ;DATA BUFFER ADDRESS ; CPRNT1: .WORD 1,0 ;DATA BUFFER FOR TTY WHEN TRANSMISSION .BYTE 0,0 ;DATA ARE ECHOED ;* ;* ;* M I S C E L L A N E O U S D A T A V A L t EMT DQSKED TST (SP)+ ;POP OFF THE ERROR FLAG 01.27.73 JMP EODXIT ;...AND GET OUT UNTIL RE-CALLED BY RECOV ; 2$: TSKRUN EODXIT ; QUIT IF NOT ALLOWED TO RUN EMT GTIME ; GET MOV (SP)+,EODW10 ; THE MOV (SP)+,EODW11 ; TIME TST (SP)+ ; OF DAY MOVB EODW10,EODW12+1 ; COMBINE MOVB EODW11,EODW12 ; HOUR AND MINUuR .LST FILE .PAGE ;*********************************************************************** ;* ** ;* C H E C K ** ;* THIS SUBROUTINE SCHECKS TO SEE IF THE OPERATOR HAS DEPRESSED ** ;* ANY KEY. IF HE HAS, WE FAKE OUT DOS AND GO TO IT. THIS WAY, ** ;* THE USER CAN ABORT THE SRC2MT PROGRAM. THE LINKAGE IS: ** ;* vGES .EVEN NAKFLG: .WORD 0 ;NAK RECEIVED FLAG ACKFLG: .WORD 0 ;ACK RECEIVED FLAG ENDFLG: .WORD 0 ;END OF DATA RECEIVED FLAG LAST: .WORD 0 ;PREVIOUS CHARACTER RECEIVED FOR OUTPUT .PAGE ;*********************************************************************** ;* ** ;* C P S I M ** ;* wU E S ;* ;* TERM: .WORD TERM1 ;POINTS TO CURRENT TERMINAL CODE TERM1: .WORD TERM2 ;POINTS TO NEXT TERMINAL .ASCII 'UNION ' ;TERMINAL 1 CODE TERM2: .WORD TERM1 ;POINTS TO NEXT TERMINAL .ASCII 'HAMBG ' ;TERMINAL 2 CODE NTERM: .WORD 0 ;0 = TERMINAL 1, 1 = TERMINAL 2 SEQNO: .ASCII '001' ;SEQUENCE NUMBER FOR MESSAGES .EVEN NAKFLG: .WORD 0 ;NAK RECEIVED FLAG ACKFLG: .WORD xTE DATEG EODW15 ;FETCH AND STORE CURRENT DATE INFO MOV #365.,EODW24 ;#DAYS THIS YEAR BICB #1,EODCAL+1 ;RESET FEB BIT #3,EODW15 ;LEAP? BNE EODRP7 ;BRANCH IF THIS ISN'T A LEAP YEAR 01.27.73 BISB #1,EODCAL+1 ;YES - MAKE FEB = 29... INC EODW24 ;...AND TOTAL DAYS = 366 ; 01.27.73 y ** ;* JSR PC,CHECK ** ;* ** ;*********************************************************************** ; CHECK: BIT #200,@#TKS ;HAS A KEY BEEN DEPRESSED? BNE CHKA10 ;BRANCH IF YES ; CHKA00: RTS PC ;OTHERWISE, EXIT ; CHKA10: MOV #1,@#TKS ;INITIATE ANOTHER TTz ** ;* THIS IS THE OFFICIAL ENTRY POINT TO THE SIMULATOR PROGRAM. ** ;* CPSIM IS EXECUTED AS A TASK UNDER CONTROL OF ROS II. ** ;* ** ;*********************************************************************** ; CPSTRT: BPT ;.....FOR DEBUG ONLY ..... MOV #TERM1,TERM ;INITIALIZE TERMINAL NAME POINTERS CL{ 0 ;ACK RECEIVED FLAG ENDFLG: .WORD 0 ;END OF DATA RECEIVED FLAG LAST: .WORD 0 ;PREVIOUS CHARACTER RECEIVED FOR OUTPUT .PAGE ;*********************************************************************** ;* ** ;* C P S I M ** ;* ** ;* THIS IS THE OFFICI|EODRP7: 01.27.73 TSTB SYDSK3+2 ;SEE IF THE SCHEDULER MODULE IS QUEUED 01.27.73 BNE EODRP9 ;BRANCH IF IT IS 01.27.73 MOV EODW11,R1 ;CURRENT MINUTE CLR R0 DIV #15.,R0 CMP R1,#13. ;SEE IF WE ARE WITHIN ONE MINUTE OF 01.27.73 BNE 1$ ;THE 15-MINUTE MARK. BRANCH IF NO. 01.27.73 }Y READ COMMAND MOVB @#TKB,-(SP) ;GET THE TTY CHARACTER MOV #1,@#TKS ;ISSUE ANOTHER READ CMPB #3,(SP)+ ;IS THE CHARACTER A CTL C? BNE CHKA00 ;BRANCH IF NO - WE CAN CONTINUE JMP SRCA30 ;IT WAS - GO EXIT TO DOS .PAGE ;*********************************************************************** ;* ** ;* D I ~R NTERM ;AND COUNTERS MOV #SIMOUT,@#CPSIMV;STORE ADDRESS OF SIMOUT FOR ASYNC HANDLER BIT #NEW,@#SWITCH ;DEFINE COMPLETELY NEW MESSAGES? BNE CPSA20 ;BRANCH IF YES CLRB CTLIO ;NO - THEN THE 'SIM' FILE MUST ALREADY EXIST MOV #CLIST,-(SP) ;SO, LET'S EMT DISCIO ; READ IT TSTB CERR ;ANY ERRORS? BEQ CPSA10 ;BRANCH IF NO ; CPSA00: AL ENTRY POINT TO THE SIMULATOR PROGRAM. ** ;* CPSIM IS EXECUTED AS A TASK UNDER CONTROL OF ROS II. ** ;* ** ;*********************************************************************** ; CPSTRT: BPT ;.....FOR DEBUG ONLY ..... MOV #TERM1,TERM ;INITIALIZE TERMINAL NAME POINTERS CLR NTERM ;AND COUNTERS MOV #SIMOUT,@#CPSIMV;STORE ADDRESS OF INC R0 ;OTHERWISE, ADVANCE TO THE NEXT 01.27.73 ;15-MINUTE MARK (EODRPT EXECUTES ON 01.27.73 ;QUARTER HOUR BOUNDARIES) 01.27.73 ; 01.27.73 1$: 01.27.73 MOV R0,R1 MUL #15.,R1 ;GET LAST QUARTER HOUR MOV R1,-(SP) S C I O ** ;* ** ;* THIS SUBROUTINE READS ONE SECTOR FROM EITHER THE DDC OR DEC ** ;* DISC INTO THE SPECIFIED BUFFER. THE LINKAGE IS: ** ;* ** ;* MOV #DISCBF,R4 ;LOAD BUFFER ADDRESS ** ;* MOV #SECTOR,R5 ;AND SECTOR ADDRESS ** ;* MOV #ERROR,TTYBUF ;OTHERWISE, TELL SYSTEM MOV #TLIST,-(SP) ; EMT TTYOUT ; ; CPSA05: EMT EXIT ;EXIT BACK TO ROS ; CPSA10: BIT #ADD,@#SWITCH ;ARE WE SUPPOSED TO ADD MORE MESSAGES? BEQ CPSB10 ;BRANCH IF NO BR CPSA40 ; ; CPSA20: MOV #FILE,-(SP) ;ALL NEW MESSAGES - BUT FIRST WE NEED TO EMT DEFINE ;DEFINE A DISC FILE. CALL IT 'SSIMOUT FOR ASYNC HANDLER BIT #NEW,@#SWITCH ;DEFINE COMPLETELY NEW MESSAGES? BNE CPSA20 ;BRANCH IF YES CLRB CTLIO ;NO - THEN THE 'SIM' FILE MUST ALREADY EXIST MOV #CLIST,-(SP) ;SO, LET'S EMT DISCIO ; READ IT TSTB CERR ;ANY ERRORS? BEQ CPSA10 ;BRANCH IF NO ; CPSA00: MOV #ERROR,TTYBUF ;OTHERWISE, TELL SYSTEM MOV #TLIST,-(SP) ; ;PUSH MINUTES ONTO THE STACK 01.27.73 MOV EODW10,-(SP) ;THEN HOURS 01.27.73 MOV EODW15,-(SP) ;AND THEN DAYS 01.27.73 JSR PC,ADJUST ;NOW, NOW GO ADJUST THE TIME/DATE 01.27.73 ;(BY ADVANCING THE TIME FORWARD BY 01.27.73 ;15 MINUTES, IT IS POSSIBLE THAT THE 01.27.73 ;MINUTES EXCEED 60 ** ;*********************************************************************** ; ;* ;* ;* D I S C R E G I S T E R E Q U A T E S ;* ;* DCS = 0. CMA = 2. WC = 4. DAR = 6. DER = 8. DELAY = 10. ; ; DDC: .WORD 165300 ;DCS - CONTROL STATUS .WORD 165304 ;CMA - MEMORY ADDRESS .WORD 165302 ;WC - WORD COUNT .WORD IM' TSTB FERR ;FILE ERROR? BEQ CPSA30 ;BRANCH IF NONE CMPB #7,FERR ;OOPS! MAYBE IT'S ALREADY DEFINED BNE CPSA00 ;TSK, TSK! ; CPSA30: CLR NMESGE ;INITIALIZE THE CONTROL SECTOR PARAMETERS MOV #1,NEXT ;(PREPARE TO READ MESSAGES) ; CPSA40: MOV #TTYBF1,TTYBUF ;ISSUE READ REQUEST FOR NEXT SIMULATED MOV #TLIST,-(SP) ;MESSAGE FROM TTY READER EMT TTYOUT ; ; CPSA05: EMT EXIT ;EXIT BACK TO ROS ; CPSA10: BIT #ADD,@#SWITCH ;ARE WE SUPPOSED TO ADD MORE MESSAGES? BEQ CPSB10 ;BRANCH IF NO BR CPSA40 ; ; CPSA20: MOV #FILE,-(SP) ;ALL NEW MESSAGES - BUT FIRST WE NEED TO EMT DEFINE ;DEFINE A DISC FILE. CALL IT 'SIM' TSTB FERR ;FILE ERROR? BEQ CPSA30 ;BRA). 01.27.73 MOV (SP)+,EODX51 ;THIS WORD RETURNED BY 'ADJUST' CONTAINS01.27.73 ;THE DAY/HOUR/MINUTE IN QSKED FORMAT. 01.27.73 ;STORE IT IN THE SCHEDULER MODULE 01.27.73 ADD #6,SP ;POP OFF OTHER RETURNED ARGUMENTS 01.27.73 MOVEA EODX50,SYDSK3,8.;TRANSFER THE MODULE TO COMMON 01.27.73 MOV #5,R5 ;SET UP MAXIMUM DELAY LOOP COUNTER 165306 ;DAR - DISC ADDRESS .WORD 165310 ;DER - DISC SELECT AND ERROR .WORD 20000. ;MAX DDC READ TIME (20 MS) ; RF11: .WORD 177460 ;DCS - CONTROL STATUS .WORD 177464 ;CMA - MEMORY ADDRESS .WORD 177462 ;WC - WORD COUNT .WORD 177466 ;DAR - DISC ADDRESS .WORD 177470 ;DAE - ERROR ADDRESS .WORD 40000. ;MAX RF11 DELAY (40 MS) EMT TTYIN ; TSTB TTYERR ;IF THERE'S AN ERROR, WE'LL KEEP TRYING BNE CPSA40 ;UNTIL OPERATOR'S GOT THE TAPE READY ;AT THIS POINT, THE OPERATOR HAS RESPONDED ;AND A MESSAGE HAS BEEN READ MOV TTYBF1+2,R0 ;ANY CHARACTERS IN THE BUFFER? BEQ CPSB00 ;IF NOT, THEN ALL MESSAGES HAVE BEEN ENTERED MOV #SIMBUF,R1 ;TRANSFER MESSAGE NCH IF NONE CMPB #7,FERR ;OOPS! MAYBE IT'S ALREADY DEFINED BNE CPSA00 ;TSK, TSK! ; CPSA30: CLR NMESGE ;INITIALIZE THE CONTROL SECTOR PARAMETERS MOV #1,NEXT ;(PREPARE TO READ MESSAGES) ; CPSA40: MOV #TTYBF1,TTYBUF ;ISSUE READ REQUEST FOR NEXT SIMULATED MOV #TLIST,-(SP) ;MESSAGE FROM TTY READER EMT TTYIN ; TSTB TTYERR ;IF THERE'S AN ERROR 01.27.73 ; 01.27.73 EODRP8: MOV #SYDSK3,-(SP) EMT QSKED ;QUEUE THAT MUTHA TST (SP)+ ;ERROR? BEQ EODRP9 ;NO JSR PC,EODS20 ;SCHEDULER ERROR - MAY BE IT IS BUSY 01.27.73 ;USE EODS20 TO DELAY ONE SECOND 01.27.73 SOB R5,EODRP8 ;THEN LOOP BACK A MAXIMUM OF 5 TIMES 01.27.73 DEBU.PAGE ;*********************************************************************** ;* ** ;* DISCIO ENTRY POINT. ** ;* ;* DISCIO: MOV R0,-(SP) ;SAVE MOV R1,-(SP) ; GENERAL MOV R2,-(SP) ; REGISTERS MOV R3,-(SP) ; CLR R2 ;R2 = DISC ADDRESS EXTENSION MOV R5,R3 TO DISC BUFFER MOV #TTYBF1+4,R2 ; MOVB #STX,(R1)+ ;FIRST, INSERT LEADING CHARACTERS MOVB #CR,(R1)+ ; MOVB #LF,(R1)+ ; ; CPSA50: MOVB (R2)+,R3 ;NOW, MOVE THE MESSAGE CMPB R3,#177 ;CHECK FOR A DELETE CHARACTER BEQ CPSA75 ;BRANCH IF YES - IGNORE IT CMPB R3,#'( ;LEFT PARENS BNE CPSA60 ; ARE REPLACED BY MOVB #CR,R3 , WE'LL KEEP TRYING BNE CPSA40 ;UNTIL OPERATOR'S GOT THE TAPE READY ;AT THIS POINT, THE OPERATOR HAS RESPONDED ;AND A MESSAGE HAS BEEN READ MOV TTYBF1+2,R0 ;ANY CHARACTERS IN THE BUFFER? BEQ CPSB00 ;IF NOT, THEN ALL MESSAGES HAVE BEEN ENTERED MOV #SIMBUF,R1 ;TRANSFER MESSAGE TO DISC BUFFER MOV #TTYBF1+4,R2 ; MOVB #STX,(R1)+ ;FIRG ;THEN GIVE UP 01.27.73 BR EODRP8 ;...AND TRY AGAIN ; ******************************************************************** ; DETERMINE PROGRAM PHASE & JUMP TO PROPER SECTION ; ******************************************************************** EODRP9: ;CALC INDEX TO PROGRAM SECTION AND JUMP TO IT CLR EODW32 ;OPEN THE EXIT SHUNT @ EODA90 MOV SYDST+SYDED1,R0 ;COMMON AREA INDEX TO LOCAL ;R3 = DISC ADDRESS TSTB SWR+1 ;IS THIS A DDC DISC? BNE DISA00 ;BRANCH IF NO (RF11) MOV #DDC,R0 ;YES - SET UP FOR DDC I/O REGISTERS BR DISA10 ; ; DISA00: MOV #RF11,R0 ;SET UP FOR RF11 I/O REGISTERS ASHC #6,R2 ;SHIFT SECTOR COUNT TO LOOK LIKE WORD COUNT ;ANY EXTENSION BITS SLOP OVER INTO R2 ; DISA10: MOV #5,-(SP) ;S ; CARRIAGE RETURNS BR CPSA70 ; ; CPSA60: CMPB R3,#') ;RIGHT PARENS BNE CPSA70 ; ARE REPLACED MOVB #LF,R3 ; BY LINE FEEDS ; CPSA70: MOVB R3,(R1)+ ;STORE CHARACTER IN DISC BUFFER ; CPSA75: SOB R0,CPSA50 ;DECREMENT COUNTER AND LOOP ; MOVB #CR,(R1)+ ;NOW, STORE MOVB #LF,(R1)+ ; ALL OST, INSERT LEADING CHARACTERS MOVB #CR,(R1)+ ; MOVB #LF,(R1)+ ; ; CPSA50: MOVB (R2)+,R3 ;NOW, MOVE THE MESSAGE CMPB R3,#177 ;CHECK FOR A DELETE CHARACTER BEQ CPSA75 ;BRANCH IF YES - IGNORE IT CMPB R3,#'( ;LEFT PARENS BNE CPSA60 ; ARE REPLACED BY MOVB #CR,R3 ; CARRIAGE RETURNS BR CPSA70 ; ; CPSA60: ENTRY POINTS ASL R0 MOV EODJP1(R0),PC ;TRANSFER TO PROPER ENTRY POINT EODJP1: ;ENTRY-POINT JUMP TABLE EODA00 ;INITIAL START ENTRY POINT EODC00 ;ENTRY POINT AFTER 1ST 30 SECOND DELAY EODD00 ;ENTRY POINT AFTER 2ND 30 SECOND DELAY .PAGE .SBTTL PHASE #1 ; ******************************************************************** ; INPUT A MESSAGE FROM THE MESSAGE QUEUE. ; IF A "TANKET UP MAXIMUM NUMBER OF TRIES AT 5 ; DISA20: MOV #400,@DCS(R0) ;CLEAR DISC, JUST IN CASE MOV R4,@CMA(R0) ;START DISC READ. STORE MEMORY ADDRESS MOV #-64.,@WC(R0) ;WORD COUNT MOV R3,@DAR(R0) ;SECTOR ADDRESS (OR WORD/DISC ADDRESS ON RF11) MOV R2,@DER(R0) ;STORE EXTENSION BITS (ONLY RF11 WILL HAVE ANY) MOV #5,@DCS(R0) ;START READ OPERATION MOV DELAY(R0),R2 ;SET UP MAXIMUM DELAY COUNTER F MOVB #VT,(R1)+ ; THE MOVB #VT,(R1)+ ; GOOD OL' MOVB #ETX,(R1)+ ; TRAILER STUFF CLRB (R1)+ ;SET BCC CLRB (R1)+ ; VALUES TO ZERO MOVB #DEL,(R1)+ ;END OF MESSAGE JSR PC,FIND ;SEE IF THIS TERMINAL IS ALREADY DEFINED. ;IF IT ISN'T, THEN ENTER THE TERMINAL ;NAME AND '001' SEQUENCE NUMBER INCMPB R3,#') ;RIGHT PARENS BNE CPSA70 ; ARE REPLACED MOVB #LF,R3 ; BY LINE FEEDS ; CPSA70: MOVB R3,(R1)+ ;STORE CHARACTER IN DISC BUFFER ; CPSA75: SOB R0,CPSA50 ;DECREMENT COUNTER AND LOOP ; MOVB #CR,(R1)+ ;NOW, STORE MOVB #LF,(R1)+ ; ALL OF MOVB #VT,(R1)+ ; THE MOVB #VT,(R1)+ ; GOO GAUGE", PROCESS IT. ; IF SOMETHING ELSE, SEND IT TO INTERCEPT. ; IF NO MESSAGE THERE, GO TO CONDITIONAL EXIT PROCESSING ; ******************************************************************** EODA00: ;INPUT A MESSAGE, IF ANY WAITING. ; WHEN QUEUE IS EMPTY, PROCEED TO SECTION "B" ;UNLESS THIS IS THE FINAL MESSAGE QUEUE CHECK AT END OF SECTION "B", ;IN WHICH CASE WE WILL EXIT IF THE QUEUE IS EMPTY. CLR MSPSVC+EODV10 ; INIT FOR FIRST CALL ; * * * (1 REV) ; DISA30: BIT #200,@DCS(R0) ;NOW - IS DISC READY? BNE DISA35 ;BRANCH IF YES SOB R2,DISA30 ;TRY AGAIN BR DISB00 ;ASSUME DISC ERROR ; DISA35: TST @DCS(R0) ;DISC I/O IS COMPLETE - ANY ERRORS? BMI DISB00 ;YES - GO PROCESS ERROR TST (SP)+ ;NO - POP OFF NO. OF ATTEMPTS COUNTER ; DISA40: MOV (SP)+,R3 ; MOV (SP)+,TO ;THE MSGNO TABLE ; MOVB #1,SIMIO ;NOW, WRITE THE MESSAGE TO DISC MOV NEXT,RLSECT ;STORE THE RELATIVE SECTOR ADDRESS MOV #MLIST,-(SP) ; EMT DISCIO ; TSTB MERR ;DISC ERROR ? BNE CPSA00 ;BRANCH IF YES ADD #3,NMESGE ;OTHERWISE, INCREMENT TO NEXT RELATIVE ADD #3,NEXT ;SECTOR POSITID OL' MOVB #ETX,(R1)+ ; TRAILER STUFF CLRB (R1)+ ;SET BCC CLRB (R1)+ ; VALUES TO ZERO MOVB #DEL,(R1)+ ;END OF MESSAGE JSR PC,FIND ;SEE IF THIS TERMINAL IS ALREADY DEFINED. ;IF IT ISN'T, THEN ENTER THE TERMINAL ;NAME AND '001' SEQUENCE NUMBER INTO ;THE MSGNO TABLE ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF MSDT,EODV10,R0,#0,#0,EODA90; GET A MESSAGE ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * CLR EODW32 ;RESET TO FORCE SCAN OF ALL TERMINALS ;(SHUNT IS CLOSED AT END OF PHASE #1 IF NO TERMINALS REQUIRED SERVICE.) MOV #MESG2+HDRL,R1 ; IS THIS 01.27.73 SERCH EODX10,SXT1L,SXT1L ; A FORMAT TST R1 R2 ;RESTORE MOV (SP)+,R1 ; GENERAL MOV (SP)+,R0 ; REGISTERS RTS PC ;RETURN TO CALLER ;* ;* ;* DISC ERROR - REPEAT FOR 5 TIME. THEN ABORT. ;* ;* DISB00: MOV #400,@DCS(R0) ;DISC ERROR - CLEAR DISC DEC (SP) ;AND DECREMENT NO. RECOVERY ATTEMPTS COUNTER BNE DISA20 ;AND GO TRY AGAIN ADD #12.,SP ;TOO BAD - CLEAN UP STACK JMP SRON BR CPSA40 ;AND, ..... GO BACK FOR MORE .PAGE ;* ;* ;* MESSAGE INPUT FROM PAPER TAPE IS NOW COMPLETE. CLEAN UP ;* THINGS AND WRITE THE CONTROL RECORD TO DISC ;* ;* CPSB00: MOVB #1,CTLIO ;SET DISC I/O TO 'WRITE' MOV #CLIST,-(SP) ;AND EMT DISCIO ;WRITE THE CONTROL SECTOR TO THE DISC TSTB CERR ;ERROR? BNE CPSA00 ;IF THERE IS, TOO BAD! ; CPSB10: MOVB #1,SIMIO ;NOW, WRITE THE MESSAGE TO DISC MOV NEXT,RLSECT ;STORE THE RELATIVE SECTOR ADDRESS MOV #MLIST,-(SP) ; EMT DISCIO ; TSTB MERR ;DISC ERROR ? BNE CPSA00 ;BRANCH IF YES ADD #3,NMESGE ;OTHERWISE, INCREMENT TO NEXT RELATIVE ADD #3,NEXT ;SECTOR POSITION BR CPSA40 ;AND, ..... GO BACK FOR MORE .PAGE ;* ; 090? BNE EODA50 ;BRANCH IF WE FOUND AN 090 FORMAT 01.27.73 ; .PAGE ; ******************************************************************** ; SEND MESSAGE TO INTERCEPT (IT DIDN'T BELONG IN OUR QUEUE) ; ******************************************************************** ; EODA20: MOVEA EODX11,MESG2+HDRID,HDRLID ; SET HEADER ID ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF MSAT,EODV10,R0,#0,#0CA20 ;AND GO TYPE ERROR MESSAGE .PAGE ;*********************************************************************** ;* ** ;* T T Y O U Y ** ;* THIS SUBROUTINE PRINTS AN ASCII STRING ON THE TTY. THE ** ;* LINKAGE TO TTYOUT IS: ** ;* ** ;* MOV #"00,SEQNO ;INITIALIZE THE INPUT MESSAGE MOVB #'1,SEQNO+2 ;SEQUENCE NUMBER TO '001' ; CPSB15: MOV #1,NEXT ;INITIALIZE SECTOR POINTER TO FIRST MESSAGE ; CPSB20: BIT #STOP,@#SWITCH ;SHOULD WE STOP EXECUTION? BNE CPSA05 ;GO STOP IF WE SHOULD BIT #REPEAT,@#SWITCH;OTHERWISE, IS THE USER SELECTING WHICH MESSAGE BEQ CPSB30 ;BRANCH IF NO MOVB @#SWITCH+1,R0 ;G;* ;* MESSAGE INPUT FROM PAPER TAPE IS NOW COMPLETE. CLEAN UP ;* THINGS AND WRITE THE CONTROL RECORD TO DISC ;* ;* CPSB00: MOVB #1,CTLIO ;SET DISC I/O TO 'WRITE' MOV #CLIST,-(SP) ;AND EMT DISCIO ;WRITE THE CONTROL SECTOR TO THE DISC TSTB CERR ;ERROR? BNE CPSA00 ;IF THERE IS, TOO BAD! ; CPSB10: MOV #"00,SEQNO ;INITIALIZE THE INPUT MESSAGE MOVB #'1,SEQN ; ATTACH TO QUE ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * BR EODA00 ;BACK FOR ANY MORE ; .PAGE ; ******************************************************************** ; PROCESS TANK GAUGE TRANSACTION ; SET EOD-REQUIRED FLAG, IF WITHIN ONE HOUR OF EOD ; ******************************************************************** ; EODA50: CLR FLPSVC+EODV20 ; INIT MOV #MESGE,R5 ;ADDRESS OF MESSAGE ** ;* JSR PC,TTYOUT ; ** ;* ** ;* A ZERO CHARACTER TERMINATES OUTPUT. ** ;* ** ;*********************************************************************** ; TTYOUT: MOV R0,-(SP) ;SAVE R0 - 'CAUSE WE USE IT ET THE MESSAGE NUMBER BIC #177417,R0 ;CLEAR EXTRANEOUS BITS BIC #300,R0 ;PATCH THIS OUT WHEN ASYNC DOESN'T USE ;SWITCHES 14 AND 15 FOR BREAKPOINT CONTROL ASR R0 ;SHIFT ASR R0 ; IT ASR R0 ; INTO MOV R0,R1 ; PLACE ASR R0 ; ADD R1,R0 ; INC R0 ; (NEXT O+2 ;SEQUENCE NUMBER TO '001' ; CPSB15: MOV #1,NEXT ;INITIALIZE SECTOR POINTER TO FIRST MESSAGE ; CPSB20: BIT #STOP,@#SWITCH ;SHOULD WE STOP EXECUTION? BNE CPSA05 ;GO STOP IF WE SHOULD BIT #REPEAT,@#SWITCH;OTHERWISE, IS THE USER SELECTING WHICH MESSAGE BEQ CPSB30 ;BRANCH IF NO MOVB @#SWITCH+1,R0 ;GET THE MESSAGE NUMBER BIC #177417,R0 ;CLEAR EXTRANEOUS BITS ;THE FOLLOWING CODE CONVERTS THE ROUTING01.27.73 ;CODE OF THE SENDER TO A BINARY INDEX 01.27.73 CNXRTE MESG2+HDRFR,EODW13,EODA20 ; GET LOCATOR FROM TRML RTE ;GO TO EODA20 IF THE INDEX IS NOT USEFUL01.27.73 ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF FLSNT,EODV20,R0,#2,#0,EODA20 ; GET TRM FILE ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; TTYA00: MOV #30000.,R0 ;TIMEOUT COUNTER (APPROXIMATELY 150 MS) MOVB (R5),@#TPB ;PRINT THE CHARACTER ; TTYA10: TSTB @#TPS ;IS THE OUTPUT COMPLETE? BMI TTYA30 ;BRANCH IF YES DEC R0 ;OTHERWISE, DECREMENT TIMEOUT COUNTER BNE TTYA10 ;AND GO TRY AGAIN ;TSK,TSK! CAN'T PRINT THE MESSAGE ; TTYA20: MOV (SP)+,R0 ;RESTORE= 3*N + 1) MOV R0,NEXT ;AND STORE IT CMP NEXT,NMESGE ;IF THE REQUESTED RECORD IS ILLEGAL BLOS CPSB30 ;BRANCH IF IT'S A GOOD NUMBER JMP CPSA05 ;TSK, TSK! ; CPSB30: CLRB SIMIO ;THEN, ..... MOV #MLIST,-(SP) ;AND THEN, ..... MOV NEXT,RLSECT ;STORE THE RELATIVE SECTOR ADDRESS EMT DISCIO ;READ THE NEXT MESSAGE TO SIMULATE TSTB MERR BIC #300,R0 ;PATCH THIS OUT WHEN ASYNC DOESN'T USE ;SWITCHES 14 AND 15 FOR BREAKPOINT CONTROL ASR R0 ;SHIFT ASR R0 ; IT ASR R0 ; INTO MOV R0,R1 ; PLACE ASR R0 ; ADD R1,R0 ; INC R0 ; (NEXT = 3*N + 1) MOV R0,NEXT ;AND STORE IT CMP NEXT,NMESGE MOV FILG1+TRMEOD,R0 ;GET THE TERMINAL'S EOD JULIAN DATE AND 01.27.73 JSR PC,EODS30 ;CONVERT IT TO LOCAL HUB TIME 01.27.73 ;RETURN FROM EODS30 WITH: 01.27.73 ; R0 = JULIAN DAY FOR EOD 01.27.73 ; R1 = TIME OF DAY FOR EOD 01.27.73 2$: CMP EODW18,R0 ;IS IT FOR TODAY? BNE 4$ ;NO SUB EO R0 RTS PC ;AND RETURN TO CALLER ; TTYA30: JSR PC,CHECK ;SEE IF USER WANTS TO TALK TO DOS TSTB (R5)+ ;HAS ALL OF MESSAGE BEEN PRINTED? BNE TTYA00 ;BRANCH IF NO BR TTYA20 ;YES - GO EXIT .PAGE ;*********************************************************************** ;* ** ;* M T O ;ERROR? BEQ CPSC00 ;BRANCH IF NO JMP CPSA00 ;OTHERWISE, FORGET THE WHOLE THING ;* ;* SET UP SEQUENCE NUMBER, ETC., THEN BEGIN SIMULATING THE DC11/CP ;* COMMUNICATIONS ;* CPSC00: JSR PC,FIND ;GET INDEX INTO MSGNO TABLE FOR THIS TERMINAL MOV #SIMBUF,R0 ;LOAD SIMULATED MESSAGE BUFFER ADDRESS MOVB (R5)+,21.(R0) ;STORE MOVB (R5)+,22.(R0) ; SEQUENCE MOVB (R5)+,23 ;IF THE REQUESTED RECORD IS ILLEGAL BLOS CPSB30 ;BRANCH IF IT'S A GOOD NUMBER JMP CPSA05 ;TSK, TSK! ; CPSB30: CLRB SIMIO ;THEN, ..... MOV #MLIST,-(SP) ;AND THEN, ..... MOV NEXT,RLSECT ;STORE THE RELATIVE SECTOR ADDRESS EMT DISCIO ;READ THE NEXT MESSAGE TO SIMULATE TSTB MERR ;ERROR? BEQ CPSC00 ;BRANCH IF NO JMP CPSA00 DW12,R1 ;GET OFFSET TO EOD CMP #1*400,R1 ;WITHIN ONE HOUR? BLE 4$ ;NO BISB #1,FILG1+TRMAED ;SET EOD-REQUIRED FLAG ; ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 4$: FILEF FLWR,EODV20,R0,#0,#0 ; WRITE TO DISC ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; MOVEA EODX12,MESG2+HDRTO,HDRLTO ; SEND MOVEA EODX13,MESG2+HDRACT,HDRLAC ; TRANSAU T ** ;* ** ;* THIS SUBROUTINE WRITES ONE RECORD TO THE MAG TAPE. THE ** ;* NUMBER OF THE SELECTED TRANSPORT IS RETRIEVED FROM THE ** ;* LOW BYTE OF SWR. THE LINKAGE TO MTOUT IS: ** ;* ** ;* MOV #MTBUF,R5 ;ADDRESS OF TAPE BUFFER ** ;* JSR PC,MTO.(R0) ; NUMBER ; CPSC05: BIT #STOP,@#SWITCH ;DOES USER WANT US TO QUIT? BNE CPSC09 ;BRANCH IF YES BIT #100,RCSR ;IS THE RECEIVE INTERRUPT ENABLED? BEQ CPSC07 ;BRANCH IF NO BIT #1,RCSR ;IS THE DATA TERMINAL READY? BEQ CPSC10 ;BRANCH IF NO (IT SHOULDN'T BE FOR A RING) ; CPSC07: MOV #TIMER1,-(SP) ;OTHERWISE,DELAY MOV #30.,-(SP) ; 500 MS ;OTHERWISE, FORGET THE WHOLE THING ;* ;* SET UP SEQUENCE NUMBER, ETC., THEN BEGIN SIMULATING THE DC11/CP ;* COMMUNICATIONS ;* CPSC00: JSR PC,FIND ;GET INDEX INTO MSGNO TABLE FOR THIS TERMINAL MOV #SIMBUF,R0 ;LOAD SIMULATED MESSAGE BUFFER ADDRESS MOVB (R5)+,21.(R0) ;STORE MOVB (R5)+,22.(R0) ; SEQUENCE MOVB (R5)+,23.(R0) ; NUMBER BIT #TERMS,@#SWITCH ;DON'T STORE TERMINAL CODE CTION ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF MSAT,EODV10,R0,#0,#0 ; TO DC ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JMP EODA00 ;GO PROCESS THE NEXT MESSAGE 01.27.73 ; ******************************************************************** ; CONDITIONAL TASK EXIT: ; IF MESSAGE QUEUE FOUND EMPTY AFTER TERMINAL RE-SCAN, EXIT. ; ELSE, PROCEED TO NEXT SECTION UT ; ** ;* ** ;* RECOVERY IS ATTEMPTED WHEN A WRITE ERROR IS ENCOUNTERED ** ;* ** ;*********************************************************************** ; MTOUT: MOV #40000,COM ;CLEAR MAG TAPE CONTROLLER BEFORE WE DO ANYTHING MOV R0,-(SP) ;SAVE MOV R1,-(SP) ; G EMT QTIME ; AND TST (SP)+ ; TRY IT BR CPSC05 ; AGAIN. ; CPSC09: EMT EXIT ;EXIT FROM SIMULATOR ; CPSC10: BIC #170000,RCSR ;CLEAR ANY EXISTING ERROR BITS BIS #120000,RCSR ;SET 'RING' STATUS JSR PC,INPUTR ;SIMULATE RING INPUT INTERRUPT BEQ CPSC15 ;BRANCH IF INTERRUPT WAS ENABLED BIC #120000,RCSR ;OTHERWISE BEQ CPSC10 ;IF ONLY ONE TERMINAL IS BEING SIMULATED MOV TERM,R1 ;OTHERWISE,..... TST (R1)+ ;BYPASS THE ADDRESS OF THE NEXT TERMINAL TO USE MOVB (R1)+,3(R0) ;STORE MOVB (R1)+,4(R0) ; THE MOVB (R1)+,5(R0) ; TERMINAL MOVB (R1)+,6(R0) ; IDENTIFICATION MOVB (R1)+,7(R0) ; NUMBER ; CPSC05: BIT #100,RCSR ;IS THE RECEIVE INTERRUPT ; ******************************************************************** EODA90: TST EODW32 ;IS EXIT SHUNT CLOSED? (@ EODB30) BEQ EODB10 ;NO - CONTINUE TO SCAN TERMINALS EODXIT: CLR SYDST+SYDED1 ;RESET PHASE FLAG FOR NEXT RUN DEBUG 2 EMT EXIT ;TH-TH-THAT'S ALL, FOLKS! .PAGE ; ******************************************************************** ; CHECK "NULL MESSAGE NUMBER TABLE" AND "MESSAGE NUMBER TAENERAL MOV R2,-(SP) ; REGISTERS MOV #10.,R0 ;ATTEMPT 10 WRITES BEFORE QUITTING TSTB STAT ;IS THE MAG TAPE READY? BMI MTOA05 ;BRANCH IF YES ; MTOA00: MOV #MTERR,R5 ;PRINT THE JSR PC,TTYOUT ; MAG TAPE ERROR MESSAGE ADD #8.,SP ;CLEAN UP THE STACK JMP SRCA30 ;THEN EXIT TO DOS ;* ;* ISSUE THE WRITE COMMAND ;* MTOA05: , CLEAR THE RING BR CPSC05 ;AND TRY AGAIN ; CPSC15: MOV #TIMER1,-(SP) ;SUSPEND EXECUTION FOR 500 MS MOV #30.,-(SP) ;WHILE THE ASYNC DIRECTOR DOES ITS THING EMT QTIME ; TST (SP)+ ;POP OFF ERROR PARAMETER BIT #100,RCSR ;IS THE INPUT INTERRUPT ENABLED? BEQ CPSC16 ;BRANCH IF NO - WE CAN'T PROCEED YET BIT #1,RCSR ;YES - BUT WE ALSO NEED DATA TENABLED? BNE CPSC10 ;BRANCH IF YES - WE CAN START MOV #TIMER1,-(SP) ;OTHERWISE,DELAY MOV #-30.,-(SP) ; 500 MS EMT QTIME ; AND TST (SP)+ ; TRY IT BR CPSC05 ; AGAIN. ; CPSC10: BIC #1,XCSR ;CLEAR THE 'REQUEST-TO-SEND' STATUS BIT MOV #120000,RCSR ;SET 'RING' STATUS JSR PC,INPUT ;SIMULATE INPUT INTERRUPT ; BLE" ; SET ACTIVITY FLAG IF ACTIVITY IN EITHER FOUND. ; ******************************************************************** ;HERE AFTER ALL MESSAGES IN INPUT QUEUE HAVE BEEN SERVICED EODB10: ;CHECK EACH TERMINAL TO SEE IF IT'S TIME FOR E-O-D DEBUG 4 MOV #RTEST-RTEL,R4 ;GET ADDR OF ROUTING TABLE CLR EODW19 ; CLEAR EOD SERVICED FLAG EODB12: ADD #RTEL,R4 ; ADVANCE TO NEXT ENTRY MOV R4 MOV #MTSIZE/2.,MWC ;STORE: WORD COUNT MOV R5,MA ; MEMORY ADDRESS MOVB SWR,R1 ;GET THE TRANSPORT CODE SWAB R1 ;SHIFT INTO ASH #4,R1 ; POSITION BIS #2,R1 ;'OR' IN WRITE COMMAND MOV R1,COM ;AND START THE WRITE OPERATION MOV #1000.,-(SP) ;SET UP FOR MAX I/O TIME OF 1 SECOND MOV #30.,R4 ;DELAY LOOP COUNTER ; MTOA07: ERMINAL READY BNE CPSC20 ;BRANCH IF WE GOT IT ; CPSC16: BIT #STOP,@#SWITCH ;SEE IF USER WANTS US TO EXIT ;PROCESSED THE RING YET). BEQ CPSC15 ;BRANCH BACK TO WAIT SOME MORE JMP CPSA05 ;CAN'T WIN 'EM ALL. OPERATOR WANTS US TO EXIT ; CPSC20: BIC #120000,RCSR ;CLEAR RING STATUS MOVB (R0),R1 ;GET THE NEXT CHARACTER CMP R1,#STX ;I CPSC15: MOV #TIMER1,-(SP) ;SUSPEND EXECUTION FOR 500 MS MOV #30.,-(SP) ;WHILE THE ASYNC DIRECTOR DOES ITS THING EMT QTIME ; TST (SP)+ ;POP OFF ERROR PARAMETER BIT #100,RCSR ;IS THE INPUT INTERRUPT ENABLED? BNE CPSC20 ;BRANCH IF YES, WE CAN PROCEED BIT #200,@#SWITCH ;CAN'T PROCEED YET (DIRECTOR HASN'T ;PROCESSED THE RING YET). ,EODW21 ; SAVE ADDR OF RTE ENTRY MOV RTEID(R4),R0 ; GET FIRST WORD OF ENTRY BEQ EODB12 ;NULL ENTRY CMP #-1,R0 ; END OF LIST JEQ EODB30 ;YES - EXIT LOOP MOV R4,-(SP) JSR PC,CNVRTX ;GET TERMINAL RTE INDEX MOV (SP)+,EODW13 BMI EODB12 ;BRANCH IF ILLEGAL ROUTE INDEX 01.27.73 CLR EODW25 ;RESET SOB R4,MTOA07 ;WE NEED TO DELAY SO THE CONTROLLER CAN ;HAVE TIME TO SET THE READY BIT FALSE ; MTOA10: MOV #1000.,R2 ;NO -SET UP LOOP FOR APPROX 1 MS TSTB STAT ;IS MAG TAPE READY? BPL MTOA20 ;BRANCH IF NO BIT #100,STAT ;OK - IS IT ALSO NOT BUSY? BEQ MTOB00 ;YES- THEN I/O IS COMPLETE ; MTOA20: SOB R2,MTOA20 ; DES IT STX? BEQ CPSC30 ;BRANCH IF YES CMP R1,#ETX ;HOW ABOUT AN ETX? BEQ CPSC60 ;BRANCH IF YES BR CPSC50 ;MUST BE GOOD DATA ; CPSC30: BIT #STXERR,@#SWITCH;STX - SHOULD WE SIMULATE A BAD STX? BEQ CPSC50 ;BRANCH IF NO - LEAVE IT AS IT IS ; CPSC40: DEC R1 ;SET CHARACTER FAULTY ; CPSC50: MOVB R1,RBUF ;STORE CHARACTER IN RECEIVE DA BEQ CPSC15 ;BRANCH BACK TO WAIT SOME MORE JMP CPSA05 ;CAN'T WIN 'EM ALL. OPERATOR WANTS US TO EXIT ; CPSC20: BIC #120000,RCSR ;CLEAR RING STATUS MOVB (R0),R1 ;GET THE NEXT CHARACTER CMP R1,#STX ;IS IT STX? BEQ CPSC30 ;BRANCH IF YES CMP R1,#ETX ;HOW ABOUT AN ETX? BEQ CPSC60 ;BRANCH IF YES BR CPSC50 ;MUST BE GOOD DATA ; ACTIVITY INDICATOR MOV #NMN,EODV30+FLPNAM CLR EODV30+FLPSVC ;FIRST TIME ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF FLSNT,EODV30,R0,#0,#0 ;READ IN NULL MSG # TABLE ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MOV #FILG1,R0 MOV #NMNTSZ,R1 ;WILL CHECK EACH WORD IN TABLE CLR R2 2$: BIS (R0)+,R2 SOB R1,2$ BNE EODB14 ;ACTC (SP) ;THEN DECREMENT TIMEOUT COUNTER BNE MTOA10 ;AND GO BACK IF THERE'S TIME LEFT TST (SP)+ ;TOO BAD - MAG TAPE ERROR MOV #40000,COM ;CLEAR CONTROLLER BR MTOA00 ;AND GO EXIT ;* ;* ;* MAG TAPE I/O IS COMPLETE. IF IT WAS A BAD WRITE, THEN ;* BACKSPACE AND TRY AGAIN. ;* ;* MTOB00: MOV #40000,COM ;CLEAR CONTROLLER ERROR TST (SP)+ ;POP OFF TIMEOTA BUFFER BIC #100000,RCSR ;CLEAR ERROR BIT BIS #200,RCSR ;SET 'DONE' STATUS IN RCSR JSR PC,INPUT ;SIMULATE INPUT INTERRUPT BNE CPXB20 ;BRANCH IF INTERRUPTS WEREN'T ENABLED CMPB (R0)+,#DEL ;IF THIS IS THE LAST CHARACTER OF THE MESSAGE, BEQ CPSD00 ;THEN GO TO THE END PROCESSING LOGIC BIT #DROPPD,@#SWITCH;SHOULD WE SIMULATE A DROPPED LINE? BEQ CPSC20 ;BRA CPSC30: BIT #STXERR,@#SWITCH;STX - SHOULD WE SIMULATE A BAD STX? BEQ CPSC50 ;BRANCH IF NO - LEAVE IT AS IT IS ; CPSC40: DEC R1 ;SET CHARACTER FAULTY ; CPSC50: MOVB R1,RBUF ;STORE CHARACTER IN RECEIVE DATA BUFFER BIC #100000,RCSR ;CLEAR ERROR BIT BIS #200,RCSR ;SET 'DONE' STATUS IN RCSR JSR PC,INPUT ;SIMULATE INPUT INTERRUPT CMPB (R0)+,#DEL IVITY FOUND: GO SET ACTIVITY INDICATOR MOV #MNT,EODV30+FLPNAM CLR EODV30+FLPSVC ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF FLSNT,EODV30,R0,#0,#0 ;READ IN MSG NUMBER TABLE ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * TST FILG1+MNTLMN ;CHECK LAST MESSAGE # BEQ EODB16 ;NO ACTIVITY EODB14: INC EODW25 ;INDICATE MESSAGE ACTIVITY FOR THIS TERMINAL .PAGUT COUNTER BIT #4000,STAT ;WAS AN ERROR DETECTED? BEQ MTOC00 ;NO - GOOD, GO EXIT BIC #2,R1 ;SET COMMAND TO BACKSPACE BIS #200,R1 ;THIS WAY LEAVES TRANSPORT CODE IN MOV R1,COM ;ISSUE BACKSPACE COMMAND MOV #100.,R4 ; ; MTOB05: SOB R4,MTOB05 ;DELAY WHILE READY GOES FALSE ; MTOB10: TSTB STAT ;IS MAG TAPE READY? BPL MTNCH IF NO CMP R0,#SIMBUF+50. ;YES - ARE WE FAR ENOUGH ALONG IN THE TRANSMSN? BNE CPSC20 ;NO - BRANCH BIS #140000,RCSR ;SET CARRIER TRANSITION ERROR JSR PC,REQSND ;AFTER TWO SECONDS, ASYNC WILL MISS THE ;THE INPUT INTERRUPT. IT WILL THEN ISSUE A ;'REQUEST-TO-SEND' SO THAT IT CAN SEND A NAK. ;WHEN WE SENSE THE 'REQUEST-TO-SEND', WE'L;IF THIS IS THE LAST CHARACTER OF THE MESSAGE, BEQ CPSD00 ;THEN GO TO THE END PROCESSING LOGIC BIT #DROPPD,@#SWITCH;SHOULD WE SIMULATE A DROPPED LINE? BEQ CPSC20 ;BRANCH IF NO CMP R0,#SIMBUF+50. ;YES - ARE WE FAR ENOUGH ALONG IN THE TRANSMSN? BNE CPSC20 ;NO - BRANCH JSR PC,REQSND ;AFTER TWO SECONDS, ASYNC WILL MISS THE ;THE INPUT INTERRUPT. IT WILL THEN ISSUE ; ******************************************************************** ; READ IN "TRM" FACILITY TABLE ; CHECK IF TIME FOR [EOD] AND SET EOD-REQUIRED FLAG IF SO. ; CHECK IF TIME FOR [EOM] AND SET EOM-REQUIRED FLAG IF SO. ; IF EOM IS SET, PROCEED TO PROCESS END-OF-DAY FOR THIS TERMINAL ; IF BOTH EOD AND ACTIVITY FLAGS ARE SET, PROCEED WITH EOD. ; IF NONE OF THE ABOVE, PROCEED TO NEXT TERMINAL. ; ************************************************************OB10 ;NO - BRANCH AND TRY AGAIN BIT #100,STAT ;YES - IS IT NOT BUSY? BNE MTOB10 ;NO - GO TRY AGAIN SOB R0,MTOA05 ;ATTEMPT WRITE 10 TIMES BR MTOA00 ;TSK, TSK! GO ABORT ;* ;* ;* I/O SUCCESSFUL. RESTORE REGISTERS AND EXIT ;* ;* MTOC00: NOP ;MOV #77777,R2 12702 * IN CASE WE NOP ; 77777 * WANT TO PATCH NOP L ;SIMULATE A 'CLEAR-TO-SEND' INTERRUPT. MOV #6,R0 ;THEN SET UP FOR A 24 SECOND DELAY ; CPSC55: MOV #TIMER1,-(SP) ;YES - SUSPEND EXECUTION MOV #240.,-(SP) ; FOR EMT QTIME ; 4 SECONDS TST (SP)+ ;POP OFF ERROR PARAMETER SOB R0,CPSC55 ;AND DO IT 6 TIMES = 24 SECONDS TOTAL DELAY JMP CPSB20 ;THEN GO START ALL OVER AGAIN ; CPE A ;'REQUEST-TO-SEND' SO THAT IT CAN SEND A NAK. ;WHEN WE SENSE THE 'REQUEST-TO-SEND', WE'LL ;SIMULATE A 'CLEAR-TO-SEND' INTERRUPT. MOV #6,R0 ;THEN SET UP FOR A 24 SECOND DELAY ; CPSC55: MOV #TIMER1,-(SP) ;YES - SUSPEND EXECUTION MOV #240.,-(SP) ; FOR EMT QTIME ; 4 SECONDS TST (SP)+ ;POP OFF ERROR******** EODB16: CLR FLPSVC+EODV20 ; INIT FILE REQUEST ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF FLSNT,EODV20,R0,#2,#0 ;READ IN "TRM" ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;CHECK TERM'S EOD & EOM DATES & TIME FOR A MATCH WITH NOW. ;JULIAN IS USED FOR THE TARGET DATES TO ELIMINATE AMBIGUITIES. IN ORDER ;TO ALLOW FOR SYSTEM OUTTAGES, ESPECIALLY DURING A NEW YEAR TURNOVER, ;THE FOLLO ;A: SOB R2,A 77201 * IN A DELAY LOOP MOV (SP)+,R2 ;RESTORE MOV (SP)+,R1 ; GENERAL MOV (SP)+,R0 ; REGISTERS RTS PC .PAGE ;*********************************************************************** ;* ** ;* M T E O F ** ;* SC60: ;CURRENT CHARACTER IS ETX - CLRB 1(R0) ;CLEAR BCC VALUES (ZERO MEANS NO ERROR CLRB 2(R0) ;TO THE ASYNC HANDLER BIT #BCCERR,@#SWITCH;SHOULD WE SIMULATE A BCC ERR? BEQ CPSC70 ;BRANCH IF NO MOVB #1,1(R0) ;YES - STORE BAD BCC MOVB #1,2(R0) ; ; CPSC70: BIT #ETXERR,@#SWITCH;SHOULD WE SIMULATE AN ETX ERROR? BEQ CPSC50 PARAMETER SOB R0,CPSC55 ;AND DO IT 6 TIMES = 24 SECONDS TOTAL DELAY JMP CPSB20 ;THEN GO START ALL OVER AGAIN ; CPSC60: ;CURRENT CHARACTER IS ETX - CLRB 1(R0) ;CLEAR BCC VALUES (ZERO MEANS NO ERROR CLRB 2(R0) ;TO THE ASYNC HANDLER BIT #BCCERR,@#SWITCH;SHOULD WE SIMULATE A BCC ERR? BEQ CPSC70 ;BRANCH IF NO MOVB #1,1(R0) ;YES WING RULES ARE IMPOSED: 1) IF THE CURRENT DATE HAS A LOWER ;JULIAN DATE THAN THE TARGET DATE (EOM OR EOD), IT IS CONSIDERED TOO ;SOON FOR THAT FUNCTION, UNLESS THE FUTURE DELAY IS GREATER THAN SOME ;AMOUNT THAT IS MORE THAN HALF A YEAR. IN THIS CASE IT IS ASSUMED AN ;OUTTAGE HAS OCCURRED AND LASTED THROUGH A NEW YEAR, AND THAT THE ;MESSAGE OUGHT TO COME OUT NOW. 2) IF THE CURRENT DATE HAS A GREATER ;JULIAN VALUE THAN THE TARGET, IT IS ASSUMED THE TARGET HAS BEEN ;BYPASSED DUE T0 AN OUTTAGE, ** ;* THIS SUBROUTINE WRITES AN EOF ON THE MAG TAPE. THE NUMBER ** ;* OF THE SELECTED TRANSPORT IS RETRIEVED FROM THE LOW BYTE OF ** ;* SWR. THE LINKAGE IS: ** ;* ** ;* JSR PC,MTEOF ** ;* ** ;***************************************************** ;NO BR CPSC40 ;YES ; CPXA00: JMP CPSA00 ;INTERMEDIATE LINKAGE TO CPSA00 ; CPXB20: JMP CPSB20 ;INTERMEDIATE LINKAGE TO CPSB20 ; CPXA05: EMT EXIT ;EXIT FROM SIMULATOR .PAGE ;*********************************************************************** ;* ;* ;* THE COMPLETE INPUT MESSAGE HAS BEEN SIMULATED. NOW WE WAIT ;* FOR ACK/NAK, THEN RESPOND ACCORDINGLY. ;* ;* CPSD00- STORE BAD BCC MOVB #1,2(R0) ; ; CPSC70: BIT #ETXERR,@#SWITCH;SHOULD WE SIMULATE AN ETX ERROR? BEQ CPSC50 ;NO BR CPSC40 ;YES ; CPXA00: JMP CPSA00 ;INTERMEDIATE LINKAGE TO CPSA00 .PAGE ;*********************************************************************** ;* ;* ;* THE COMPLETE INPUT MESSAGE HAS BEEN SIMULATED. NOW WE WAIT ;* FOR ACK/NAK, THEN RESPOND ACCORDINGLY. ;* UNLESS THE CURRENT MONTH IS DECEMBER AND ;THE TARGET MONTH IS JANUARY, IN WHICH CASE IT IS ASSUMED THE TARGET ;FUNCTION HAS BEEN POSTDATED, CAUSING THE MESSAGE TO BE DELAYED. NOTE ;THAT "EOD" & "EOM" ARE TREATED INDEPENDENTLY: IF EOD IS FOUND POST- ;DATED, BUT EOM IS DUE OR OVERDUE, EOM WILL COME OUT. IF BOTH ARE DUE, ;EOM WILL COME OUT. MOV FILG1+TRMEDM,R0 ;SET R0 = TERMINAL JULIAN DAY FOR EOD 01.27.73 JSR PC,EODS30 ;CONVERT TERMINAL EOD DATE/TIME TO 01****************** ; MTEOF: MOV R0,-(SP) ;SAVE MOV R1,-(SP) ; REGISTERS MOVB SWR,R0 ;GET SELECTED TRANSPORT CODE SWAB R0 ;SHIFT INTO POSITION ASH #4,R0 ; BIS #4,R0 ;'OR' IN EOF COMMAND CODE MOV R0,COM ;ISSUE EOF COMMAND MOV #1000.,R0 ;SET UP LOOP COUNTER MOV #100.,R1 ;DELAY LOOP COUNTER VALUE ; MTE000: : CLR ACKFLG ;CLEAR 'ACK/NAK RECEIVED' FLAGS CLR ENDFLG ; JSR PC,REQSND ;WAIT FOR 'REQUEST-TOSEND' STATUS, THEN ;SIMULATE A 'CLEAR-TO-SEND' INTERRUPT ; CPSD05: BIT #STOP,'#SWITCH ;DOES USER WANT US TO STOP? BNE CPXA05 ;BRANCH IF YES BIT #1,RCSR ;IS DATA TERMINAL STILL READY? BNE CPSD07 ;BRANCH IF YES JMP CPSB20 ;* CPSD00: CLR ACKFLG ;CLEAR 'ACK/NAK RECEIVED' FLAGS CLR ENDFLG ; JSR PC,REQSND ;WAIT FOR 'REQUEST-TOSEND' STATUS, THEN ;SIMULATE A 'CLEAR-TO-SEND' INTERRUPT MOV #40.,R0 ;SET UP 20-SECOND LOOP COUNTER ; CPSD05: DEC R0 ;DECREMENT 20 SECOND COUNTER BGT CPSD07 ;BRANCH IF WE STILL HAVE TIME JMP CPSB20 ;OOPS, TIM.27.73 ;LOCAL HUB TIME. (STORED IN R0) 01.27.73 MOV #1,R4 ;SET R4 = 'EOD' FLAG 01.27.73 JSR PC,EODS10 ;SET FLAG IF EOD MOV FILG1+TRMEMM,R0 ;EOM JULIAN JSR PC,EODS30 ;CONVERT EOM TIME AND DATE TO LOCAL HUB 01.27.73 MOV #2,R4 JSR PC,EODS10 ;SET FLAG IF EOM BITB #2,FILG1+TRMAED ;IS EOM-REQUIRED FLAG SET? BNE EODB20 SOB R1,MTE000 ;WE NEED TO DELAY SO THE CONTROLLER WILL ;HAVE TIME TO SET THE READY BIT FALSE ; MTEA00: MOV #200.,R1 ;SET UP LOOP TIMEOUT COUNTER ; MTEA10: TSTB STAT ;WAIT FOR BPL MTEA10 ; MAG TAPE BIT #100,STAT ; READY CONDITION BEQ MTEA20 ;BRANCH IF READY SOB R1,MTEA10 ;OTHERWISE, WAIT SOB R0,MTEA00 ;OOPS - ASYNC HUNG UP ON US. GO START OVER ; CPSD07: MOV #TIMER1,-(SP) ;SUSPEND MOV #30.,-(SP) ; EXECUTION EMT QTIME ; FOR 500 MS TST (SP)+ ;POP OFF ERROR PARAMETER TST NAKFLG ;WAS A NAK RECEIVED? BEQ CPSD10 ;BRANCH IF NO CLR NAKFLG ;OTHERWISE, CLEAR THE FLAG MOV #SIMBUF,R0 ;RESET TO BEGINNING OF BUFFER JMP CPSCE'S UP. ASYNC PROBABLY DISCONNECTED ; CPSD07: MOV #TIMER1,-(SP) ;SUSPEND MOV #30.,-(SP) ; EXECUTION EMT QTIME ; FOR 500 MS TST (SP)+ ;POP OFF ERROR PARAMETER TST NAKFLG ;WAS A NAK RECEIVED? BEQ CPSD10 ;BRANCH IF NO CLR NAKFLG ;OTHERWISE, CLEAR THE FLAG MOV #SIMBUF,R0 ;RESET TO BEGINNING OF BUFFER BR CPSC20 ;AND ;YEAH - GO DO IT BITB #1,FILG1+TRMAED ;IS EOD-REQUIRED FLAG SET? BEQ EODB26 ;NO - SKIP PROCESSING TST EODW25 ;WAS ACTIVITY INDICATED? BEQ EODB26 ;NO - BYPASS EOD IF NO ACTIVITY .PAGE ; ******************************************************************** EODB20: ;PREPARE OPEN FOLIO MESSAGE ; ******************************************************************** MOV EODW21,-(SP) ;CONVERT ;MAX OF 1 SECOND MOV #MTERR,R5 ;PRINT 'MT ERROR' JSR PC,TTYOUT ; ADD #6,SP ;THEN CLEAN UP THE STACK JMP SRCA30 ;AND GO EXIT TO DOS ; MTEA20: MOV (SP)+,R1 MOV (SP)+,R0 ;RESTORE GENERAL REGISTERS RTS PC ;AND RETURN TO CALLER .PAGE ;*********************************************************************** ;* 20 ;AND GO REPEAT ; CPSD10: TST ACKFLG ;WAS AN ACK RECEIVED? BEQ CPSD05 ;NOPE - HANG IN THERE, BABY! ; CPSD12: MOV #TIMER1,-(SP) ;NOW WE HAVE TO WAIT FOR ABOUT 500 MS MOV #30.,-(SP) ; EMT QTIME ; TST (SP)+ ;POP OFF ERROR PARAMETER BIT #STOP,@#SWITCH ;DOES USER WANT US TO STOP? BNE CPXA05 ;BRANCH IF YES BIT #1,XCSR GO REPEAT ; CPSD10: TST ACKFLG ;WAS AN ACK RECEIVED? BEQ CPSD05 ;NOPE - HANG IN THERE, BABY! BIC #1,XCSR ;CLEAR 'REQUEST-TO-SEND' STATUS BIT MOV #TIMER1,-(SP) ;NOW WE HAVE TO WAIT FOR ABOUT 500 MS MOV #30.,-(SP) ; EMT QTIME ; TST (SP)+ ;POP OFF ERROR PARAMETER BIS #200,RCSR ;YES - SET 'DONE' BIT IN RECEIVE STATUS REGISTER MOVB JSR PC,CNVRTQ ; RTE ADDR MOV (SP)+,R0 ; TO QUEUE TABLE MOV R0,EODW22 ; ADDR BPL 2$ ERR 2$: BIS #MSQF2,MSQIH(R0) ;INHIBIT INPUT FROM TERM BIS #1,EODW19 ;SHOW AT LEAST ONE TERM SERVICED CLR -(SP) ;INDEX FOR "OPEN FOLIO" JSR PC,EODS40 ;BUILD I.D. 20 MESSAGE W/PROPER OP-CODE MOV #3$,EODW25 ;STORE RETURN ADDRESS FOR DELAY ROUTINE 01.27.73 ** ;* M T R E W ** ;* ** ;* THIS SUBROUTINE REWINDS THE SELECTED MAG TAPE TRANSPORT. ** ;* THE LINKAGE IS: ** ;* ** ;* JSR PC,MTREW ** ;* ;NOW WE NEED TO WAIT UNTIL THE BNE CPSD12 ;REQUEST-TO-SEND IS DROPPED. BIC #2,XCSR ;IT'S DROPPED. NOW RESET 'CLEAR-TO-SEND' BIS #200,RCSR ;YES - SET 'DONE' BIT IN RECEIVE STATUS REGISTER MOVB #EOT,RBUF ;STORE AN EOT IN RECEIVE BUFFER ; CPSD15: JSR PC,INPUT ;SIMULATE INPUT INTERRUPT BNE CPXB20 ;BRANCH IF INPUT INTERRUPT NOT ENABLED BIS #200,RCSR ;SET ' #EOT,RBUF ;STORE AN EOT IN RECEIVE BUFFER ; CPSD15: JSR PC,INPUT ;SIMULATE INPUT INTERRUPT BIS #200,RCSR ;SET 'DONE' BIT MOVB #DEL,RBUF ;STORE 'DEL' CHARACTER JSR PC,INPUT ;AND SIMULATE ANOTHER INPUT INTERRUPT JSR PC,REQSND ;WAIT FOR 'REQUEST-TO-SEND' STATUS BIT, THEN ;SIMULATE 'CLEAR-TO-SEND' INTERRUPT ; CPSD20: MOV #60.,R0 ;SET UP 30 ; ;(EXERCISED ONLY IF THE MESSAGE AREA 01.27.73 ; ;IS FULL) 01.27.73 ; 01.27.73 3$: 01.27.73 CLR EODV10+MSPSVC ;SEND ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF MSAT,EODV10,R0,#0,#0,EODR10 ; ** ;*********************************************************************** ; MTREW: MOVB SWR,R5 ;GET TRANSPORT CODE SWAB R5 ;SHIFT IT ASH #4,R5 ; INTO PLACE BIS #400,R5 ;'OR' IN REWIND COMMAND MOV R5,COM ;AND REWIND THE MAG TAPE RTS PC .END SRC2MT DONE' BIT MOVB #DEL,RBUF ;STORE 'DEL' CHARACTER JSR PC,INPUT ;AND SIMULATE ANOTHER INPUT INTERRUPT JSR PC,REQSND ;WAIT FOR 'REQUEST-TO-SEND' STATUS BIT, THEN ;SIMULATE 'CLEAR-TO-SEND' INTERRUPT ; CPSD20: ; CPSD25: BIT #1,RCSR ;DID ASYNC HANG UP ON US? BEQ CPXB20 ;BRANCH IF YES. WASN'T VERY FRIENDLY OF HIM BIT #STOP,@#SWITCH ;SEE IF THE OPERATOR WAN SECOND COUNTER ; CPSD25: DEC R0 ;DECREMENT 30 SECOND COUNTER BLE CPSD35 ;AND BRANCH IF NO MESSAGE FROM ASYNC IN 30 SEC BIT #STOP,@#SWITCH ;SEE IF THE OPERATOR WANTS US TO GIVE UP BEQ CPSD30 ;BRANCH IF NO JMP CPSA05 ;OTHERWISE, GO EXIT ; CPSD30: MOV #TIMER1,-(SP) ;NOW, SUSPEND MOV #30.,-(SP) ; EXECUTION EMT QTIME ; FOR 500 MS OPEN FOLIO ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF MSAT,EODV10,R0,#0,#3 ; TO DC ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * EODB26: FILEF FLWR,EODV20,R0,#0,#0 ;WRITE "TRM" BACK OUT ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; BEGIN FIRST 30-SEC DELAY PERIOD ; ******************************************************************** ; EODB30: TST EODW19 ; ANY TERML NEED SERVICE? BNE EODB34 ;YES: START 30-SEC DELAY INC EODW32 ;SET FLAG TO EXIT ON EMPTY QUEUE AFTER RE-SCAN JMP EODA00 ;LOOK FOR ANY MORE MESSAGES BEFORE EXITING EODB34: DEBUG 10 MOV #1,SYDST+SYDED1 ;FLAG TO RESTART AT [EODC00] EODB40: MOVEA TS US TO GIVE UP BEQ CPSD30 ;BRANCH IF NO JMP CPSA05 ;OTHERWISE, GO EXIT ; CPSD30: MOV #TIMER1,-(SP) ;NOW, SUSPEND MOV #30.,-(SP) ; EXECUTION EMT QTIME ; FOR 500 MS TST (SP)+ ;POP OFF ERROR PARAMETER TST ENDFLG ;END OF TRANSMISSION TO CP? BEQ CPSD25 ;NO - GO WAIT SOME MORE CLR ENDFLG ; BIT #N TST (SP)+ ;POP OFF ERROR PARAMETER TST ENDFLG ;END OF TRANSMISSION TO CP? BEQ CPSD25 ;NO - GO WAIT SOME MORE CLR ENDFLG ; BIT #NAKSIM,@#SWITCH;YES - SHOULD WE SIMULATE A NAK TO ASYNC HANDLER BNE CPSE00 ;BRANCH IF YES MOVB #ACK,RBUF ;OTHERWISE, SEND BIS #200,RCSR ;AN ACK TO THE HANDLER JSR PC,INPUT ;SIMULATE INPUT INTERRUPT JMP EODB12 ; .PAGE ; ******************************************************************** ; BEGIN FIRST 30-SEC DELAY PERIOD ; ******************************************************************** ; EODB30: TST EODW19 ; ANY TERML NEED SERVICE? BNE EODB34 ;YES: START 30-SEC DELAY INC EODW32 ;SET FLAG TO EXIT ON EMPTY QUEUE AFTER RE-SCAN JMP EODA00 ;LOOK FOR ANY MORE MESSAGES BEFORE EXITING EODBEODX30,SYDTM3,EODX32-EODX30 ;TIMER MODULE IMAGE TO BUF;01-23-73 MOV #5,R5 ;SET UP MAXIMUM DELAY LOOP COUNTER 01.27.73 8$: MOV #SYDTM3,-(SP) ; QUEUE ;01-23-73 MOV #30.,-(SP) ; TIMER MODULE EMT QTIME ; FOR TST (SP)+ ; 30 SEC DELAY BNE 10$ ;TIMER WAS NOT QUEUED (VERY,VERY RARE) EMT EXIT ;LEAVE NAKSIM,@#SWITCH;YES - SHOULD WE SIMULATE A NAK TO ASYNC HANDLER BNE CPSE00 ;BRANCH IF YES MOVB #ACK,RBUF ;OTHERWISE, SEND BIS #200,RCSR ;AN ACK TO THE HANDLER JSR PC,INPUT ;SIMULATE INPUT INTERRUPT BNE CPSD35 ;BRANCH IF NOT ACCEPTED (WHO CARES?) MOVB #DEL,RBUF ;THEN SEND BIS #200,RCSR ; A 'DEL' CHARACTER JSR PC,INPUT ; SIMULATE INPUT INTERRUPT MOVB #DEL,RBUF ;THEN SEND BIS #200,RCSR ; A 'DEL' CHARACTER JSR PC,INPUT ; SIMULATE INPUT INTERRUPT ; ; CPSD35: BIT #TERMS,@#SWITCH ;SHOULD WE SIMULATE 2 TERMINALS? BEQ CPSD40 ;BRANCH IF NO (ONLY ONE TERMINAL) MOV @TERM,TERM ;YES - FLIP TERMINAL POINTER COM NTERM ;INCREMENT TERMINAL COUNTER BNE CPSD50 ; ; CP34: DEBUG 10 MOV #1,SYDST+SYDED1 ;FLAG TO RESTART AT [EODC00] EODB40: MOVEA EODX30,SYDTM3,EODX32-EODX30 ;TIMER MODULE IMAGE TO BUF;01-23-73 MOV #5,R5 ;SET UP MAXIMUM DELAY LOOP COUNTER 01.27.73 8$: MOV #SYDTM3,-(SP) ; QUEUE ;01-23-73 MOV #30.,-(SP) ; TIMER MODULE EMT QTIME ; FOR TST (SP)+ ; 30 SOW---COME BACK AGAIN 30 SECS FROM NOW 10$: MOV #40000,R0 ;LOOP FOR ABOUT 17MS UNTIL NEXT BEAT... SOB R0,. ;...OF CLOCK, SO LIST CAN EMPTY SOB R5,8$ ;TRY 5 TIMES 01.27.73 DEBUG ;THEN GIVE UP 01.27.73 JMP EODRPT 01.27.73 .PAGE .SBTTL PHASE #2 ; ************************************ ; ; CPSD35: ; CPSD40: JSR PC,FIND ;FIND THE POSITION OF THIS TERMINAL'S SEQUENCE ;NUMBER IN THE MSGNO TABLE BNE CPSD50 ;BRANCH IF WE COULDN'T FIND IT INCB 2(R5) ;INCREMENT CMPB 2(R5),#': ; THE BLO CPSD50 ; MESSAGE MOVB #'0,2(R5) ; SEQUENCE INCB 1(R5) ; NUMBER CMPBSD40: JSR PC,FIND ;FIND THE POSITION OF THIS TERMINAL'S SEQUENCE ;NUMBER IN THE MSGNO TABLE BNE CPSD50 ;BRANCH IF WE COULDN'T FIND IT INCB 2(R5) ;INCREMENT CMPB 2(R5),#': ; THE BLO CPSD50 ; MESSAGE MOVB #'0,2(R5) ; SEQUENCE INCB 1(R5) ; NUMBER CMPB 1(R5),#': ; (ADDITION BLO EC DELAY BNE 10$ ;TIMER WAS NOT QUEUED (VERY,VERY RARE) EMT EXIT ;LEAVE NOW---COME BACK AGAIN 30 SECS FROM NOW 10$: MOV #40000,R0 ;LOOP FOR ABOUT 17MS UNTIL NEXT BEAT... SOB R0,. ;...OF CLOCK, SO LIST CAN EMPTY SOB R5,8$ ;TRY 5 TIMES 01.27.73 DEBUG ;THEN GIVE UP 01.27.73 JMP EODRPT ******************************** ; CHECK EACH TERMINAL FOR EOD/EOM SERVICING ; ******************************************************************** EODC90: MOV #2,SYDST+SYDED1 ;INIT "COMMON" FLAG TO RESTART AFTER ;THE SECOND 30-SEC DELAY JMP EODB40 ;SET DELAY FOR 30 SECS & EXIT EODC00: ;WAKE UP HERE AFTER FIRST 30-SEC DELAY DEBUG 20 MOV #RTEST-RTEL,R4 ; GET ADDR OF ROUTING TABLE EODC 1(R5),#': ; (ADDITION BLO CPSD50 ; DONE MOVB #'0,1(R5) ; IN INCB (R5) ; ASCII CMPB (R5),#': ; BLO CPSD50 ; MOVB #'0,(R5) ; ; CPSD50: MOVB #1,CTLIO ;NOW WRITE OUT THE CONTROL SECTOR WITH MOV #CLIST,-(SP) ;THE UPDATED SEQUENCE NUMBER EMT DISCIO ; TSTB CPSD50 ; DONE MOVB #'0,1(R5) ; IN INCB (R5) ; ASCII CMPB (R5),#': ; BLO CPSD50 ; MOVB #'0,(R5) ; ; CPSD50: MOVB #1,CTLIO ;NOW WRITE OUT THE CONTROL SECTOR WITH MOV #CLIST,-(SP) ;THE UPDATED SEQUENCE NUMBER EMT DISCIO ; TSTB CERR ;CHECK FOR DISC ERROR BEQ 01.27.73 .PAGE .SBTTL PHASE #2 ; ******************************************************************** ; CHECK EACH TERMINAL FOR EOD/EOM SERVICING ; ******************************************************************** EODC90: MOV #2,SYDST+SYDED1 ;INIT "COMMON" FLAG TO RESTART AFTER ;THE SECOND 30-SEC DELAY JMP EODB40 ;SET DELAY FOR 30 SECS & EXIT EODC00: ;WAKE UP HERE AFTER 10: DEBUG 40 ADD #RTEL,R4 ; ADVANCE POINTER MOV RTEID(R4),R0 ; 1ST 2 BYTES OF ROUTE CODE BEQ EODC10 ; NULL ENTRY- GET NEXT CMP #-1,R0 ; END OF TABLE? BEQ EODC90 ;YES MOV R4,-(SP) JSR PC,CNVRTX ;GET TERM'S RTE INDEX MOV (SP)+,EODW13 CLR EODV30+FLPSVC ;GET NULL MESSAGE TABLE... MOV CERR ;CHECK FOR DISC ERROR BEQ CPSD55 ;BRANCH IF 'OK' JMP CPSA00 ;OTHERWISE, GO PRINT ERROR MESSAGE ; CPSD55: BIT #PAUSE,@#SWITCH ;SHOULD WE PAUSE BEFORE GOING TO ;THE NEXT MESSAGE? BEQ CPSD60 ;BRANCH IF NO MOV #TIMER1,-(SP) ;OTHERWISE, MOV #60.,-(SP) ; SUSPEND EXECUTION EMT QTIME ; FOR 1 SECOND TST (SP)CPSD55 ;BRANCH IF 'OK' JMP CPSA00 ;OTHERWISE, GO PRINT ERROR MESSAGE ; CPSD55: BIT #PAUSE,@#SWITCH ;SHOULD WE PAUSE BEFORE GOING TO ;THE NEXT MESSAGE? BEQ CPSD60 ;BRANCH IF NO MOV #TIMER1,-(SP) ;OTHERWISE, MOV #60.,-(SP) ; SUSPEND EXECUTION EMT QTIME ; FOR 1 SECOND TST (SP)+ ;POP OFF ERROR PARAMETER BR CPFIRST 30-SEC DELAY DEBUG 20 MOV #RTEST-RTEL,R4 ; GET ADDR OF ROUTING TABLE EODC10: DEBUG 40 ADD #RTEL,R4 ; ADVANCE POINTER MOV RTEID(R4),R0 ; 1ST 2 BYTES OF ROUTE CODE BEQ EODC10 ; NULL ENTRY- GET NEXT CMP #-1,R0 ; END OF TABLE? BEQ EODC90 ;YES MOV R4,-(SP) JSR PC,CNVRTX ;GET TERM' #NMN,EODV30+FLPNAM ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF FLSNT,EODV30,R0,#2,#0 ;...IN CASE WE NEED IT ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MOVEA FILGL,EODX60,FILAT-FILGL;SAVE NMNT TO MAKE ROOM FOR TRM CLR EODV20+FLPSVC ; GET ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF FLSNT,EODV20,R0,#0,#0 ; TABLE (TRM) ; * * * + ;POP OFF ERROR PARAMETER BR CPSD50 ;THEN SEE IF WE SHOULD STILL WAIT ; CPSD60: MOV #TIMER1,-(SP) ;NOW, WE'LL DELAY FOR FIVE SECONDS MOV #255.,-(SP) ; EMT QTIME ; TST (SP)+ ; ADD #3,NEXT ;INCREMENT TO NEXT MESSAGE CMP NEXT,NMESGE ;ALL PROCESSED? BGE CPXB15 ;YES - RESTART WITH FIRST ; CPSD70: JMP CPSB20 SD50 ;THEN SEE IF WE SHOULD STILL WAIT ; CPSD60: MOV #TIMER1,-(SP) ;NOW, WE'LL DELAY FOR FIVE SECONDS MOV #255.,-(SP) ; EMT QTIME ; TST (SP)+ ; ADD #3,NEXT ;INCREMENT TO NEXT MESSAGE CMP NEXT,NMESGE ;ALL PROCESSED? BGE CPXB15 ;YES - RESTART WITH FIRST ; CPSD70: JMP CPSB20 ;NO - CONTINUE WITH NEXT MESSAGE ; CPXB15: S RTE INDEX MOV (SP)+,EODW13 CLR EODV30+FLPSVC ;GET NULL MESSAGE TABLE... MOV #NMN,EODV30+FLPNAM ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF FLSNT,EODV30,R0,#2,#0 ;...IN CASE WE NEED IT ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MOVEA FILGL,EODX60,FILAT-FILGL;SAVE NMNT TO MAKE ROOM FOR TRM CLR EODV20+FLPSVC ; GET ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * TSTB FILG1+TRMAED ; EOD FLAG SET BEQ EODC10 ; NO - GET NEXT .PAGE ; ******************************************************************** ; REPORT NULL MESSAGES ; ******************************************************************** EODC14: ;HERE TO CHECK FOR ANY NULL MESSAGES & REPORT THEM MOV #6,-(SP) ;INDEX FOR NULL MSG # REPORT ;NO - CONTINUE WITH NEXT MESSAGE ; CPXB15: JMP CPSB15 ;INTERMEDIATE LINKAGE TO CPSB15 ;* ;* SIMULATE AN NAK FROM THE CP TO THE ASYNC HANDLER (WE'LL MAKE ;* THE HANDLER DO IT ALL OVER AGAIN). ;* CPSE00: BIC #1,XCSR ;CLEAR 'REQUEST-TO-SEND' STATUS MOVB #NAK,RBUF ;PUT 'NAK' IN RECEIVE BUFFER BIS #200,RCSR ;SET 'DONE' BIT JMP CPSD15 ;GO ELSEWHERE TO:  JMP CPSB15 ;INTERMEDIATE LINKAGE TO CPSB15 ;* ;* SIMULATE AN NAK FROM THE CP TO THE ASYNC HANDLER (WE'LL MAKE ;* THE HANDLER DO IT ALL OVER AGAIN). ;* CPSE00: BIC #1,XCSR ;CLEAR 'REQUEST-TO-SEND' STATUS MOVB #NAK,RBUF ;PUT 'NAK' IN RECEIVE BUFFER BIS #200,RCSR ;SET 'DONE' BIT JMP CPSD15 ;GO ELSEWHERE TO: ; 1. SIMULATE NAK INTERRUPT * * * * * * * * * * * * * * * * * * * FILEF FLSNT,EODV20,R0,#0,#0 ; TABLE (TRM) ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * TSTB FILG1+TRMAED ; EOD FLAG SET BEQ EODC10 ; NO - GET NEXT .PAGE ; ******************************************************************** ; REPORT NULL MESSAGES ; ******************************************************************** EODC14:  JSR PC,EODS40 ;BUILD I.D. 20 MESSAGE W/PROPER OP-CODE ;LEAVES R0 POINTING TO NEXT CHAR IN OUTPUT MESSAGE STRING. MOV #EODX60+FILG1-FILGL,R5 ;PNTR TO NULL MSG TABLE IMAGE MOV #NMNTSZ,R1 ;# WORDS TO SCAN MOV #1,R2 ;INIT NEXT MSG # 2$: MOV (R5),R3 ;NEXT WORD OF 16 MSG #'S BEQ 8$ CLR (R5) ;RESET FOR WRITE-BACK MOV #16.,R4 ;WILL SCAN 16 BITS 4$: ASR ; 1. SIMULATE NAK INTERRUPT ; 2. SEND 'DEL' CHARACTER ; 3. WAIT FOR 'REQUEST-TO-SEND' ; 4. SIMULATE 'CLEAR-TO-SEND' ; 5. THEN WAIT FOR NEW MESSAGE FROM ; ASYNC HANDLER .PAGE ;*********************************************************************** ;*  ; 2. SEND 'DEL' CHARACTER ; 3. WAIT FOR 'REQUEST-TO-SEND' ; 4. SIMULATE 'CLEAR-TO-SEND' ; 5. THEN WAIT FOR NEW MESSAGE FROM ; ASYNC HANDLER .PAGE ;*********************************************************************** ;* ** ;*  ;HERE TO CHECK FOR ANY NULL MESSAGES & REPORT THEM MOV #6,-(SP) ;INDEX FOR NULL MSG # REPORT JSR PC,EODS40 ;BUILD I.D. 20 MESSAGE W/PROPER OP-CODE ;LEAVES R0 POINTING TO NEXT CHAR IN OUTPUT MESSAGE STRING. MOV #EODX60+FILG1-FILGL,R5 ;PNTR TO NULL MSG TABLE IMAGE MOV #NMNTSZ,R1 ;# WORDS TO SCAN MOV #1,R2 ;INIT NEXT MSG # 2$: MOV (R5),R3 ;NEXT WORD OF 16 MSG #'S BEQ 8$ R3 BCC 6$ ;NO NULL FOR THIS # MOV R2,EODW25 ;STORE BINARY OF THIS NULL MSG # MOV R1,-(SP) ;SAVE IT (MOVEX USES R1) 01.31.73 MOVE EODP14,,A ;NMN TO ASCII & ATTACH TO MSG MOV (SP)+,R1 ;RESTORE R1 01.31.73 INC EODW26 ;BUMP MSG COUNT CMP EODW26,#100. ;MESSAGE CAN HOLD MAX 100 NUMBERS BEQ 12$ ;GO SEND IT NOW  ** ;* S I M O U T ** ;* ** ;* THIS SUBROUTINE IS CALLED BY THE ASYNC HANDLER WHEN IT HAS ** ;* STORE AN OUTPUT CHARACTER IN XBUF. THIS ROUTINE PRINTS ** ;* THE CHARACTER ON THE TELETYPE, THEN SIMULATES THE OUTPUT ** ;* INTERRUPT ** ;*  S I M O U T ** ;* ** ;* THIS SUBROUTINE IS CALLED BY THE ASYNC HANDLER WHEN IT HAS ** ;* STORE AN OUTPUT CHARACTER IN XBUF. THIS ROUTINE PRINTS ** ;* THE CHARACTER ON THE TELETYPE, THEN SIMULATES THE OUTPUT ** ;* INTERRUPT ** ;* ** ;***************CLR (R5) ;RESET FOR WRITE-BACK MOV #16.,R4 ;WILL SCAN 16 BITS 4$: ASR R3 BCC 6$ ;NO NULL FOR THIS # MOV R2,EODW25 ;STORE BINARY OF THIS NULL MSG # MOVE EODP14,,A ;NMN TO ASCII & ATTACH TO MSG INC EODW26 ;BUMP MSG COUNT CMP EODW26,#100. ;MESSAGE CAN HOLD MAX 100 NUMBERS BEQ 12$ ;GO SEND IT NOW AND THEN COME BACK TO 6$ 6$: INC R2 AND THEN COME BACK TO 6$ 6$: INC R2 ;NEXT MSG # SOB R4,4$ BR 10$ ;DONE W/WORD 8$: ADD #16.,R2 ;SKIP ENTIRE WORD... 10$: TST (R5)+ ;BUMP TO NEXT ENTRY SOB R1,2$ ;...AND GET NEXT WORD TST EODW26 ;ANY NUMBERS TO REPORT IN THIS MESSAGE? BEQ EODC20 ;NO - SKIP SENDING ANY MORE NULL MESSAGE REPORTS 12$: CLR EODW26 ;RESET COUNT AND GET THE MESSA ** ;*********************************************************************** ; SIMOUT: MOV R1,-(SP) ;SAVE REGISTERS MOV R2,-(SP) ; MOVB XBUF,R1 ;GET THE CHARACTER, THEN MOVB LAST,R2 ;GET THE PREVIOUS CHARACTER BIC #200,XCSR ;CLEAR 'DONE' BIT IN TRANSMIT STATUS REGISTER CMPB R1,#DEL ;END OF MESSAGE? BNE SIMA30 ;BRANCH IF NO ******************************************************** ; SIMOUT: MOV R1,-(SP) ;SAVE REGISTERS MOV R2,-(SP) ; MOVB XBUF,R1 ;GET THE CHARACTER, THEN MOVB LAST,R2 ;GET THE PREVIOUS CHARACTER BIC #200,XCSR ;CLEAR 'DONE' BIT IN TRANSMIT STATUS REGISTER CMPB R1,#DEL ;END OF MESSAGE? BNE SIMA30 ;BRANCH IF NO CLR LAST ;CLEAR PREVIOUS CHARAC ;NEXT MSG # SOB R4,4$ BR 10$ ;DONE W/WORD 8$: ADD #16.,R2 ;SKIP ENTIRE WORD... 10$: TST (R5)+ ;BUMP TO NEXT ENTRY SOB R1,2$ ;...AND GET NEXT WORD TST EODW26 ;ANY NUMBERS TO REPORT IN THIS MESSAGE? BEQ EODC20 ;NO - SKIP SENDING ANY MORE NULL MESSAGE REPORTS 12$: CLR EODW26 ;RESET COUNT AND GET THE MESSAGE OFF MOVB #ETX,(R0)+ ;TIE OFFGE OFF MOVB #ETX,(R0)+ ;TIE OFF MESSAGE MOV #13$,EODW25 ;STORE RETURN ADDRESS FOR DELAY IF 01.27.73 ;MESSAGE AREA IS FULL 01.27.73 ; 01.27.73 13$: 01.27.73 CLR EODV10+MSPSVC ;SEND ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *  CLR LAST ;CLEAR PREVIOUS CHARACTER CMPB R2,#ACK ;IS IT A SPECIAL CHARACTER? BNE SIMA10 ;BRANCH IF NOT ACK INC ACKFLG ;SET ACK RECEIVED FLAG BR SIMA35 ; SIMA10: CMPB R2,#NAK ;IS THE CHARACTER A NAK? BNE SIMA20 ;BRANCH IF NO INC NAKFLG ;YES - SET NAK RECEIVED FLAG BR SIMA35 ; ; SIMA20: INC ENDFLGTER CMPB R2,#ACK ;IS IT A SPECIAL CHARACTER? BNE SIMA10 ;BRANCH IF NOT ACK INC ACKFLG ;SET ACK RECEIVED FLAG BR SIMA35 ; SIMA10: CMPB R2,#NAK ;IS THE CHARACTER A NAK? BNE SIMA20 ;BRANCH IF NO INC NAKFLG ;YES - SET NAK RECEIVED FLAG BR SIMA35 ; ; SIMA20: INC ENDFLG ;SET END OF TRANSMIT DATA FLAG BR  MESSAGE MOV #13$,EODW25 ;STORE RETURN ADDRESS FOR DELAY IF 01.27.73 ;MESSAGE AREA IS FULL 01.27.73 ; 01.27.73 13$: 01.27.73 CLR EODV10+MSPSVC ;SEND ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF MSAT,EODV10,R0,#0,#0,EODR1* * FILEF MSAT,EODV10,R0,#0,#0,EODR10 ; NULL MESSAGE NUMBER ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF MSAT,EODV10,R0,#0,#3 ; MESSAGE TO D/C ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MOV #6,-(SP) ;INDEX FOR NULL MESSAGE REPORT JSR PC,EODS40 ;BUILD I.D. 20 MESSAGE W/PROPER OP-CODE  ;SET END OF TRANSMIT DATA FLAG BR SIMA35 ; ; SIMA30: MOV R1,LAST ;SAVE CHARACTER IN PREVIOUS CHARACTER REGISTER ; SIMA35: MOVB R1,CPRNT1+4 ;PUT CHAR IN TTY BUFFER, JUST IN CASE MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R1 ; BIT #SUPRES,@#SWITCH;SHOULD WE PRINT THE CHARACTER? BNE SIMB00 ;BRANCH IF NO MOV #TLIST2,-(SP) ;THEN, JS_ SIMA35 ; ; SIMA30: MOV R1,LAST ;SAVE CHARACTER IN PREVIOUS CHARACTER REGISTER ; SIMA35: MOVB R1,CPRNT1+4 ;PUT CHAR IN TTY BUFFER, JUST IN CASE MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R1 ; BIT #SUPRES,@#SWITCH;SHOULD WE PRINT THE CHARACTER? BNE SIMB00 ;BRANCH IF NO MOV #TLIST2,-(SP) ;THEN, JSR PC,@TYOUTV ; PRINT IT. RTS PC 0 ; NULL MESSAGE NUMBER ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF MSAT,EODV10,R0,#0,#3 ; MESSAGE TO D/C ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MOV #6,-(SP) ;INDEX FOR NULL MESSAGE REPORT JSR PC,EODS40 ;BUILD I.D. 20 MESSAGE W/PROPER OP-CODE TST R1 ;IS LOOP STILL UNSATISFIED TST R1 ;IS LOOP STILL UNSATISFIED? BNE 6$ ;YEAH .PAGE ; ******************************************************************** ; SEND "CLOSE FOLIO" MESSAGE TO DATACENTER ; ******************************************************************** EODC20: MOV #4,-(SP) ;INDEX FOR "CLOSE DAILY FOLIO" MESSAGE BITB #2,FILG1+TRMAED ;IS E-O-M REQUIRED? BEQ 2$ MOV #2,(SP) ;YES: SET FOR "CLOSE; UPDATE CPSIM.010 01.24.73 .TITLE CPSIM ;*********************************************************************** ;* ** ;* C P S I M ** ;* ** ;* PROGRAM NAME. CPSIM - CP/DC11 SIMULATOR ** ;* **R PC,@TYOUTV ; PRINT IT. RTS PC ;RETURN TO ASYNC HANDLER ; SIMB00: MOV #TIMER2,-(SP) ;TTY I/O COMPLETE ENTRY - OR NO PRINT ENTRY MOV #2,-(SP) ;DELAY 16-32 MS JSR PC,@QTIMEV ; TST (SP)+ ;POP OFF ERROR PARAMETER RTS PC ;RETURN ; SIMB10: JSR PC,OUTPUT ;SIMULATE THE TRANSMIT INTERRUPT RTS PC ;AND RETURN TO THE TIMER R ? BNE 6$ ;YEAH .PAGE ; ******************************************************************** ; SEND "CLOSE FOLIO" MESSAGE TO DATACENTER ; ******************************************************************** EODC20: MOV #4,-(SP) ;INDEX FOR "CLOSE DAILY FOLIO" MESSAGE BITB #2,FILG1+TRMAED ;IS E-O-M REQUIRED? BEQ 2$ MOV #2,(SP) ;YES: SET FOR "CLOSE MONTHLY FOLIO" 2$: JSR PC,EODS40 ! MONTHLY FOLIO" 2$: JSR PC,EODS40 ;BUILD I.D. 20 MESSAGE W/PROPER OP-CODE MOV #3$,EODW25 ;STORE RETURN ADDRESS FOR DELAY 01.27.73 ;IF MESSAGE AREA IS TEMPORARILY FULL 01.27.73 ; 01.27.73 3$: 01.27.73 CLR EODV10+MSPSVC ;SEND ; * * * * * * * * * * * * " ;* PURPOSE. THE FUNCTION OF THIS PROGRAM IS TO SIMULATE THE ** ;* OPERATION OF THE ELITE TERMINAL COMMUNICATIONS PROCESSOR ** ;* (CP) AS IT INTERFACES INTO THE HUB SOFTWARE THROUGH DEC'S ** ;* DC-11 INTERFACE. CPSIM PROVIDES FOR THE FOLLOWING ** ;* SIMULATIONS: ** ;* ** ;* 1. NORMAL CP/HUB INPUT AND OUTPUT OPERATIONS, INCLUDING#OUTINE .PAGE ;*********************************************************************** ;* ** ;* U T I L I T Y S U B R O U T I N E S ** ;* ** ;* INPUT - SIMULATE A DC11 RECEIVE INTERRUPT. LINKAGE IS: ** ;* ** ;* JSR PC,INPUT ;CALLER MU$ ;BUILD I.D. 20 MESSAGE W/PROPER OP-CODE MOV #3$,EODW25 ;STORE RETURN ADDRESS FOR DELAY 01.27.73 ;IF MESSAGE AREA IS TEMPORARILY FULL 01.27.73 ; 01.27.73 3$: 01.27.73 CLR EODV10+MSPSVC ;SEND ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * %* * * * * * * * * * * * * * * * * * * * FILEF MSAT,EODV10,R0,#0,#0,EODR10 ; CLOSE FOLIO ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF MSAT,EODV10,R0,#0,#3 ; MESSAGE TO D/C ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * .PAGE ; ******************************************************************** ; UPDATE EOD& ** ;* ALL ACTION CODES. ** ;* 2. VARIOUS CP/DC11 ERROR CONDITIONS, SUCH AS: INCORRECT STX;** ;* INCORRECT ETX; MISSING EOT; INTERRUPTED INPUT MESSAGE ** ;* WITH LINE DROP ** ;* 3. ACK/NAK COMMUNICATION ** ;* 4. MESSAGE OUTPUT ** ;* 5. VARIOUS OUTPUT TRANSMISSION ERRORS: RECEIPT'ST BE A TASK ** ;* BNE ERROR ;BRANCH IF INTERRUPT COULDN'T BE ** ;* ;SIMULATED ** ;* ** ;*********************************************************************** ; INPUT: BIT #1,RCSR ;IS DATA TERMINAL READY? BEQ INPA10 ;BRANCH IF NO - THAT'S A NO-NO ; INPUTR: BIT #100,RCSR ;I( FILEF MSAT,EODV10,R0,#0,#0,EODR10 ; CLOSE FOLIO ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF MSAT,EODV10,R0,#0,#3 ; MESSAGE TO D/C ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * .PAGE ; ******************************************************************** ; UPDATE EOD/EOM DATES IN "TRM" ; **********************)/EOM DATES IN "TRM" ; ******************************************************************** ;NOW ADVANCE EOD & EOM JULIAN DATES IN "TRM". BUMP "TRMEDM" BY 1 ONLY ;IF EOD WAS JUST SCHEDULED (THAT IS, ONLY IS "TRMAED" HAS BIT #1 SET). ;THIS AVOIDS BUMPING A POST-DATED EOD. THE EOM DATE "TRMEMM" ;WILL BE RECALCULATED ONLY IF "TRMAED" HAS BIT #2 SET, INDICATING THAT ;AN EOM MESSAGE WENT OUT. TIMES AND DATES ARE ALWAYS KEPT IN TERM'S ZONE ;THEY ARE CONVERTED TO HUB TIME WHEN MAKING COMPARISONS * OF NAK FROM ** ;* CP; LOST INTERRUPT FROM DC11 OUTPUT CHARACTER ** ;* 6. ONE OR TWO TERMINALS ** ;* 7. ONE OR TWO COMMUNICATIONS PORTS ** ;* ** ;* USAGE. THE PDP-11 CONSOLE SWITCHES ARE USED TO SPECIFY ** ;* THE SELECTED OPTIONS. THE BIT ASSIGNMENTS ARE: ** ;* +S RECEIVE INTERRUPT ENABLED? BEQ INPA10 ;BRANCH IF NO MOV @#PS,-(SP) ;PUSH PS ONTO STACK MOV @#ASYNCR+2,@#PS ;RAISE CPU LEVEL TO WHAT ASYNCR NEEDS MOV #INPA00,-(SP) ;RETURN PC ON STACK TO SIMULATE AN JMP @ASYNCR ;INTERRUPT FROM THE RECEIVE ; INPA00: MOV #TIMER1,-(SP) ; MOV #2,-(SP) ; EMT QTIME ;SUSPEND EXECUTION FOR 16-32 MS TST (SP)+ ,********************************************** ;NOW ADVANCE EOD & EOM JULIAN DATES IN "TRM". BUMP "TRMEDM" BY 1 ONLY ;IF EOD WAS JUST SCHEDULED (THAT IS, ONLY IS "TRMAED" HAS BIT #1 SET). ;THIS AVOIDS BUMPING A POST-DATED EOD. THE EOM DATE "TRMEMM" ;WILL BE RECALCULATED ONLY IF "TRMAED" HAS BIT #2 SET, INDICATING THAT ;AN EOM MESSAGE WENT OUT. TIMES AND DATES ARE ALWAYS KEPT IN TERM'S ZONE ;THEY ARE CONVERTED TO HUB TIME WHEN MAKING COMPARISONS EODC30: BITB #1,FILG1+TRMAED ;WAS T-EODC30: BITB #1,FILG1+TRMAED ;WAS THIS EOD? BEQ 4$ ;NO: JUST EOM MOV EODW15,EODW31 ;INIT EOD YEAR W/CURRENT YEAR MOV EODW18,R1 ;GET TODAY'S JULIAN DATE 01.27.73 INC R1 ;BUMP TO TOMORROW FOR NEW EOD DATE CMP R1,EODW24 ;NEW YEAR ROLL-OVER? BLE 2$ MOV #1,R1 INC EODW31 ;SHOW NEXT YEAR IN PRINTOUT 2$: MOV R1,FILG1+TRMEDM ;RESTO. ** ;* 0 = DEFINE NEW SET OF MESSAGES (INPUT ON PAPER TAPE) ** ;* 1 = ADD MESSAGES (INPUT ON PAPER TAPE) ** ;* 2 = SIMULATE BCC ERROR ** ;* 3 = USE RECORD SELECTED IN BITS 12-15 ** ;* 4 = SIMULATE STX ERROR ** ;* 5 = SIMULATE ETX ERROR ** ;* 6 = PAUSE AFTER SIMULAT/ ;POP OFF ERROR PARAMETER SEZ ;SET 'OK' CONDITION RTS PC ;THEN RETURN TO CALLER ; INPA10: CLZ ;SET ERROR CONDITION RTS PC ;AND EXIT ;* ;* ;* S I M U L A T E O U T P U T I N T E R R U P T ;* ;* OUTPUT: BIT #100,XCSR ;ARE OUTPUT INTERRUPTS ENABLED? BEQ OUTA10 ;BRANCH IF NO - TSK, TSK! BIS #202,XCSR ;SET 'RE0HIS EOD? BEQ 4$ ;NO: JUST EOM MOV EODW15,EODW31 ;INIT EOD YEAR W/CURRENT YEAR MOV EODW18,R1 ;GET TODAY'S JULIAN DATE 01.27.73 INC R1 ;BUMP TO TOMORROW FOR NEW EOD DATE CMP R1,EODW24 ;NEW YEAR ROLL-OVER? BLE 2$ MOV #1,R1 INC EODW31 ;SHOW NEXT YEAR IN PRINTOUT 2$: MOV R1,FILG1+TRMEDM ;RESTORE UPDATED EOD JULIAN 4$: BITB #2,FILG11RE UPDATED EOD JULIAN 4$: BITB #2,FILG1+TRMAED ;WAS THIS ALSO EOM? BEQ EODC35 ;IF NOT, THEN BYPASS EOM UPDATE 01.27.73 MOV EODW17,R1 ;CURRENT MONTH INC R1 ;NEXT MONTH CMP R1,#12. BLE 6$ ;NO MOV #1,R2 ;INIT TO JAN 1 CMPB #1,FILG1+TRMEOM ;FIRST OF MONTH? BEQ 10$ ;YEAH: LEAVE IT MOV #31.,R2 ;INIT TO JAN2ING ONE MESSAGE ** ;* 7 = SUPPRESS PRINTOUT OF OUTPUT MESSAGES ** ;* 8 = STOP PROGRAM, EXIT TO ROS (THIS IS CHECKED ** ;* AFTER MESSAGES ARE DEFINED) ** ;* 9 = SIMULATE TWO TERMINALS (SAME DC11 PORT) ** ;* 10 = SIMULATE NAK FROM CP ** ;* 11 = SIMULATE LINE LOSS DURING INPUT ** ;* 12-15= SELECTED RE3ADY' AND 'CLEAR-TO-SEND' STATUS MOV @#PS,-(SP) ;PUSH PS ON STACK MOV @#ASYNCX+2,@#PS ;THEN SET THE PS TO THE ASYNC INTERRUPT VALUE MOV #OUTA00,-(SP) ;PUSH INTERRUPT RETURN ADDRESS JMP @ASYNCX ;SIMULATE INTERRUPT ; OUTA00: SEZ ;SET 'OK' CONDITION RTS PC ;RETURN TO CALLER ; OUTA10: CLZ ;SET ERROR CONDITION RTS PC ;AND R4+TRMAED ;WAS THIS ALSO EOM? BEQ EODC35 ;IF NOT, THEN BYPASS EOM UPDATE 01.27.73 MOV EODW17,R1 ;CURRENT MONTH INC R1 ;NEXT MONTH CMP R1,#12. BLE 6$ ;NO MOV #1,R2 ;INIT TO JAN 1 CMPB #1,FILG1+TRMEOM ;FIRST OF MONTH? BEQ 10$ ;YEAH: LEAVE IT MOV #31.,R2 ;INIT TO JAN 31 BR 10$ 6$: CMPB #1,F5 31 BR 10$ 6$: CMPB #1,FILG1+TRMEOM ;FIRST OF MONTH? BNE 8$ ;NO: MUST BUMP BY # DAYS NEXT MONTH DEC R1 ;YES: USE #DAYS THIS MONTH 8$: MOVB EODCAL-1(R1),R2 ;# DAYS THIS/NEXT MONTH ADD FILG1+TRMEMM,R2 ;BUMP 10$: MOV R2,FILG1+TRMEMM ;RESTORE NEW EOM JULIAN .PAGE ; ******************************************************************** ; PREPARE DATA FOR TERMINAL'S EOD MESSAGE ; 6CORD TO REPEAT (SEE BIT 3) ** ;* ** ;* COPYRIGHT 1973 ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* ** ;***********************7ETURN TO CALLER .PAGE ;*********************************************************************** ;* ** ;* F I N D ** ;* ** ;* THE PURPOSE OF THIS LITTLE SUBROUTINE IS TO SEARCH THE ** ;* 'MSGNO' TABLE (RESIDENT IN THE CONTROL SECTOR) FOR THE ** ;* TERMINAL WHOSE ID IS SPE8ILG1+TRMEOM ;FIRST OF MONTH? BNE 8$ ;NO: MUST BUMP BY # DAYS NEXT MONTH DEC R1 ;YES: USE #DAYS THIS MONTH 8$: MOVB EODCAL-1(R1),R2 ;# DAYS THIS/NEXT MONTH ADD FILG1+TRMEMM,R2 ;BUMP 10$: MOV R2,FILG1+TRMEMM ;RESTORE NEW EOM JULIAN .PAGE ; ******************************************************************** ; PREPARE DATA FOR TERMINAL'S EOD MESSAGE ; ************************************************9******************************************************************** ;CONVERT HUB TIME & DATE TO TERM TIME & DATE ;IN PREPARATION FOR MESSAGE TO TERMINAL ;FOR THE HOUR: HR(T) = HR(H) + Z(T) - Z(H) + DST(T) - DST(H) EODC35: MOV EODW10,R0 ;HUB HOUR MOVB FILG1+TRMTMZ,R1 ;TRM'S ZONE MOVB FILG1+TRMDST,R2 MOV EODW18,R3 ;INIT W/CURRENT JULIAN MOV EODW15,R4 ;CURRENT YEAR ADD R1,R0 ADD R2,R0 :************************************************ .GLOBL CPSIM .PAGE ;* ;* C P S I M E Q U A T E C A R D S ;* R0 = %0 ; G R R1 = %1 ; E E R2 = %2 ; N G R3 = %3 ; E I R4 = %4 ; R S R5 = %5 ; A T SP = %6 ; L ;CIFIED IN LOCATIONS SIMBUF+3 THROUGH ** ;* SIMBUF+7. THE 'MSGNO' TABLE IS ASSUMED TO BE CORE-RESIDENT. ** ;* THE FORMAT OF THE 'MSGNO' TABLE IS: ** ;* ** ;* .ASCII /TRMID/ ;FIVE CHARACTERS ** ;* .ASCII /SEQ/ ;NEXT SEQUENCE NO. (001-999) ** ;* ** ;* IF THE TERMINAL <******************** ;CONVERT HUB TIME & DATE TO TERM TIME & DATE ;IN PREPARATION FOR MESSAGE TO TERMINAL ;FOR THE HOUR: HR(T) = HR(H) + Z(T) - Z(H) + DST(T) - DST(H) EODC35: MOV EODW10,R0 ;HUB HOUR MOVB FILG1+TRMTMZ,R1 ;TRM'S ZONE MOVB FILG1+TRMDST,R2 MOV EODW18,R3 ;INIT W/CURRENT JULIAN MOV EODW15,R4 ;CURRENT YEAR ADD R1,R0 ADD R2,R0 SUB #HUBZON+HUBDST,R0 BGE 2$ =SUB #HUBZON+HUBDST,R0 BGE 2$ ADD #24.,R0 ;BRING TO TIME, 1 DAY EARLIER DEC R3 ;BACK UP DATE 2$: CMP R0,#23. BLE 4$ SUB #24.,R0 INC R3 ;ALREADY TOMORROW THERE CMP R3,EODW25 ;DID WE GO INTO NEXT YEAR? 01.27.73 BLE 6$ ;BRANCH IF NO 01.27.73 MOV #1,R3 ;YES WE DID - RESET TO JAN 1 >E PC = %7 ; R PS = 177776 ;CPU STATUS REGISTER ; S ; ;* ;* A S Y N C E Q U A T E S ;* ASYNCR = 310 ;ASYNC RECEIVE INTERRUPT ADDRESS * U ASYNCX = 314 ;ASYNC TRANSMIT INTERRUPT ADDRESS * N RCSR = 330 ;DC11 RECEIVE STATUS REGISTER * I RBUF = 332 ;DC1?NAME IS FOUND, THEN A POINTER TO THE SEQUENCE ** ;* NUMBER IS RETURNED TO THE CALLER. IF THE NAME IS NOT FOUND, ** ;* THEN THE NAME IS INSERTED INTO THE TABLE AND THE SEQUENCE ** ;* NUMBER IS INITIALIZED TO '001'. THE LINKAGE TO FIND IS: ** ;* ** ;* JSR PC,FIND ; ** ;* BEQ FOUND ;BRANCH IF TERMINAL FOUND ** ;* @ ADD #24.,R0 ;BRING TO TIME, 1 DAY EARLIER DEC R3 ;BACK UP DATE 2$: CMP R0,#23. BLE 4$ SUB #24.,R0 INC R3 ;ALREADY TOMORROW THERE CMP R3,EODW25 ;DID WE GO INTO NEXT YEAR? 01.27.73 BLE 6$ ;BRANCH IF NO 01.27.73 MOV #1,R3 ;YES WE DID - RESET TO JAN 1 01.27.73 INC R4 A 01.27.73 INC R4 ;AND INCREMENT THE YEAR COUNTER 01.27.73 BR 6$ ;THEN GO STORE IT 01.27.73 4$: TST R3 BNE 6$ MOV #365.,R3 DEC R4 ;BACK UP YEAR BIT #3,R4 BNE 6$ INC R3 ;LAST YEAR WAS LEAP 6$: MOV R0,EODW25 ;SAVE TERM'S HOUR MOV R4,EODW27 ;TERM'S YEAR MOV R3B1 RECEIVE DATA BUFFER * T XCSR = 334 ;DC11 TRANSMIT STATUS REGISTER * XBUF = 336 ;DC11 TRANSMIT DATA BUFFER * 1 CPSIMV = 350 ;ADDRESS OF CPSIM FOR ASYNC HANDLER TYOUTV = 352 ;THIS LOCATION CONTAINS THE ADDRESS OF TTYOUT QTIMEV = 354 ;THIS LOCATION CONTAINS THE ADDRESS OF QTIME ACK = 006 ;SPECIAL NAK = 025 ; CHARACTERS CBGT INSERT ;BRANCH IF THE NAME WAS ADDED ** ;* BLT ERROR ;BRANCH IF THERE WAS ** ;* ;INSUFFICIENT SPACE TO ADD ** ;* ;A NEW ENTRY ** ;* ** ;* R5 POINTS TO THE MOST SIGNIFICANT DIGIT OF THE ASCII ** ;* SEQUENCE NUMBER. ALL OTHER REGISTERS ARE SAVED. ** ;* D ;AND INCREMENT THE YEAR COUNTER 01.27.73 BR 6$ ;THEN GO STORE IT 01.27.73 4$: TST R3 BNE 6$ MOV #365.,R3 DEC R4 ;BACK UP YEAR BIT #3,R4 BNE 6$ INC R3 ;LAST YEAR WAS LEAP 6$: MOV R0,EODW25 ;SAVE TERM'S HOUR MOV R4,EODW27 ;TERM'S YEAR MOV R3,EODW26 ;TERM(S JULIAN DATE ;NOW CALC CUE,EODW26 ;TERM(S JULIAN DATE ;NOW CALC CURRENT MONTH AND DAY OF MONTH FOR TERMINAL MOV #EODCAL,R5 ;LOAD ADDRESS OF CALENDAR 01.31.73 CLR R1 CLR R2 7$: INC R1 MOVB (R5)+,R4 ;DAYS IN SUCCESSIVE MONTHS SUB R4,R3 ;TRYING TO FIND WHICH MONTH IT'S IN BGT 7$ ADD R4,R3 ;FOUND IT: RESTORE FOR DAY OF MONTH MOV R3,EODW31 MOV R1,EODW32 ;NOW CALC EOD F DEL = 377 ; TO/FROM ETX = 003 ; CP STX = 002 ; EOT = 004 ; CR = 015 ; LF = 012 ; VT = 013 ; SWITCH = 177570 ;CONSOLE SWITCH REGISTER EXIT = 4. ; DEFINE = 41. ;ROS TTYIN = 12. ; TTYOUT = 11. ; SUBROUTINE DISCIO = 19. G ** ;*********************************************************************** ; FIND: CLR -(SP) ;SET RETURN CONDITION CODE MOV R1,-(SP) ;SAVE MOV R2,-(SP) ; THE MOV R3,-(SP) ; GENERAL MOV R4,-(SP) ; REGISTERS MOV #MSGNO,R1 ;INITIALIZE LOOP COUNTERS MOV NTRMNL,R2 ; AND BASE ADDRESSES HRRENT MONTH AND DAY OF MONTH FOR TERMINAL MOV EODCAL,R5 ;LOAD ADDRESS OF CALENDAR 01.27.73 CLR R1 CLR R2 7$: INC R1 MOVB (R5)+,R4 ;DAYS IN SUCCESSIVE MONTHS SUB R4,R3 ;TRYING TO FIND WHICH MONTH IT'S IN BGT 7$ ADD R4,R3 ;FOUND IT: RESTORE FOR DAY OF MONTH MOV R3,EODW31 MOV R1,EODW32 ;NOW CALC EOD DAY FROM EOD JULIAN DATE: MOV #EODIDAY FROM EOD JULIAN DATE: MOV #EODCAL,R0 MOV FILG1+TRMEDM,R1 ;JULIAN EOD 8$: MOVB (R0)+,R2 ;#DAYS IN INDEXED MONTH SUB R2,R1 ;KEEP GOING UNTIL RUN OUT BGT 8$ ADD R2,R1 ;STICK LAST ONE BACK IN MOV R1,EODW28 ;SAVE FOR CONVERSION TO ASCII FOR MSG MOVB FILG1+TRMEOM,R1 ;"1" OR "2" FOR EOM DAY MUL #5,R1 ;MUST GET "FIRST" OR "LAST" ADD #EODJ ; QTIME = 7. ; EQUATES ;* ;* DATA SWITCHES BIT ASSIGNMENTS ;* NEW = 1 ;DEFINE NEW SET OF MESSAGES ADD = 2 ;ADD MORE MESSAGES BCCERR = 4 ;SIMULATE BCC ERROR REPEAT = 10 ;USE SELECTED RECORD REPEATEDLY STXERR = 20 ;SIMULATE STX ERROR ETXERR = 40 ;SIMULATE ETX ERROR PAUSE = 100 ;PAUSE AFET SIMULATINGK BEQ FINB00 ;BRANCH IF THERE AREN'T ANY ENTRIES IN MSGNO ; FINA00: MOV #5,R4 ;FIVE CHARACTERS PER TERMINAL ID MOV #SIMBUF+3,R3 ;ADDRESS OF TERMINALS ID ; FINA10: CMPB (R1)+,(R3)+ ;WE HAVE TO CHECK ONE CHARACTER AT A TIME BNE FINA30 ;BRANCH IF THE ID'S DON'T MATCH SOB R4,FINA10 ;COMPARE ALL FIVE CHARACTERS CLR 8.(SP) ;AT THIS POINT, WE HAVE A MATCH MOV LCAL,R0 MOV FILG1+TRMEDM,R1 ;JULIAN EOD 8$: MOVB (R0)+,R2 ;#DAYS IN INDEXED MONTH SUB R2,R1 ;KEEP GOING UNTIL RUN OUT BGT 8$ ADD R2,R1 ;STICK LAST ONE BACK IN MOV R1,EODW28 ;SAVE FOR CONVERSION TO ASCII FOR MSG MOVB FILG1+TRMEOM,R1 ;"1" OR "2" FOR EOM DAY MUL #5,R1 ;MUST GET "FIRST" OR "LAST" ADD #EODX40-5,R1 MOV R1,EODP21 ;LOAD MX40-5,R1 MOV R1,EODP21 ;LOAD SOURCE ADDRESS INTO TRANSFER PAKET MOV EODW13,R1 ;TERM'S INDEX MUL #OUTL,R1 ;MULTIPLY BY THE NUMBER OF BYTES 01.27.73 ;PER 'OUT' TABLE ENTRY 01.27.73 ADD #OUT+2,R1 MOV (R1)+,R0 MOV R0,EODW29 ;SAVE FOR CONVERSION MOV (R1),EODW30 ;OUTPUT SEQ # ;THIS ONE CALL - IN A SINGLE STROKE - MOVES THE MESSAGE N ONE MESSAGE SUPRES = 200 ;SUPPRESS PRINTOUT OF TRANSMITTED MESSAGES STOP = 400 ;TERMINATE TASK EXECUTION TERMS = 1000 ;SIMULATE TWO TERMINALS NAKSIM = 2000 ;SIMULATE NAK FROM CP DROPPD = 4000 ;SIMULATE A DROPPED LINE SELECT = 170000 ;BITS 12-15 = VALUE FOR 'NEXT' .PAGE ;*********************************************************************** ;* OR1,R5 ;SET R5 TO POINT TO THE SEQUENCE NUMBER ; FINA20: MOV (SP)+,R4 ;RESTORE MOV (SP)+,R3 ; THE MOV (SP)+,R2 ; GENERAL MOV (SP)+,R1 ; REGISTERS TST (SP)+ ;SET THE CONDITION CODE RTS PC ; FINA30: ADD R4,R1 ;ID'S DON'T MATCH ADD #2,R1 ;INCREMENT TO NEXT MSGNO ENTRY SOB R2,FINA00 ;GO BACK FOR THE NEXPSOURCE ADDRESS INTO TRANSFER PAKET MOV EODW13,R1 ;TERM'S INDEX MUL #OUTL,R1 ;MULTIPLY BY THE NUMBER OF BYTES 01.27.73 ;PER 'OUT' TABLE ENTRY 01.27.73 ADD #OUT+2,R1 MOV (R1)+,R0 MOV R0,EODW29 ;SAVE FOR CONVERSION MOV (R1),EODW30 ;OUTPUT SEQ # ;THIS ONE CALL - IN A SINGLE STROKE - MOVES THE MESSAGE SKELETON TO THE ;MESSAGE BUFFER, THEN FILLS ITQSKELETON TO THE ;MESSAGE BUFFER, THEN FILLS IT WITH ALL DATA NEEDED FROM THE "TRM" FILE ;AND FROM THE INITIALIZED LOCAL BINARY STORAGE. CONVERSION TO ASCII IS ;SPECIFIED AS NEEDED IN THE TRANSFER PACKET STRING, AND IS MADE PRIOR TO ;THE TRANSFER OF THAT PARTICULAR DATUM. MOVE EODP20 ; ******************************************************************** ; OUTPUT THE EOD MESSAGE TO THE TERMINAL ; ******************************************************************** R ** ;* BECAUSE THIS IS A TASK THAT EXECUTES UNDER CONTROL OF ROS, ** ;* WE NEED TO DEFINE A TASK HEADER. SO, HERE WE ARE. ** ;* ** ;*********************************************************************** ; CPSIM: .WORD 1 ;THREAD WORD .WORD CPSTRT ;ENTRY POINT .WORD 0 ;NOT USED .WORD 0 ST ENTRY ;* ;* ;* THIS TERMINAL IS NOT IN THE MSGNO TABLE, SO NOW WE'LL HAVE TO ;* INSERT IT (IF THERE'S ROOM). ;* ;* FINB00: MOV NTRMNL,R5 ;GET THE NO. OF ENTRIES ALREADY IN TABLE CMP R5,#15. ;IS THERE ROOM FOR ONE MORE? BGE FINC00 ;BRANCH IF NO MUL #8.,R5 ;OTHERWISE, CALCULATE INDEX ADD #MSGNO,R5 ;R5 NOW POINTS TO THE NEW TABLE ENTRY MOV #SIMBUF+3,R0 ;NOW, T WITH ALL DATA NEEDED FROM THE "TRM" FILE ;AND FROM THE INITIALIZED LOCAL BINARY STORAGE. CONVERSION TO ASCII IS ;SPECIFIED AS NEEDED IN THE TRANSFER PACKET STRING, AND IS MADE PRIOR TO ;THE TRANSFER OF THAT PARTICULAR DATUM. MOVE EODP20 ; ******************************************************************** ; OUTPUT THE EOD MESSAGE TO THE TERMINAL ; ******************************************************************** EODC40: U EODC40: ;01-23-73 CLR EODV10+MSPSVC FILEF MSAT,EODV10,,,#0 ;FORM TYPE I CELL FILEF MSAT,EODV10,,,#3 ;ATTACH TO EOD "INPUT" QUEUE ; ******************************************************************** ; WRITE UPDATED "TRM" BACK TO DISC ; ******************************************************************** ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * V ;MAXIMUM EXECUTION TIME. 0 = UNLIMITED .BYTE 100. ;STACK SIZE .BYTE 1 ;TASK AND PARTITION PRIORITY .WORD 0 ;CURRENT TIMER VALUE .WORD 0 ;ARGUMENT .BYTE 205 ;PS SAVED WHEN TASK IS SUSPENDED .BYTE 40 ;TASK NUMBER .WORD 0 .WORD 40+50 ;FILE ID = TASK NO. + 50 OFFSET .BLKW 200. ; .PAGE ;***************W MOVB (R0)+,(R5)+ ; ENTER THE NEW MOVB (R0)+,(R5)+ ; TERMINAL ID NUMBER MOVB (R0)+,(R5)+ ; INTO THE MSGNO TABLE MOVB (R0)+,(R5)+ ; (FIRST FIVE CHARACTERS) MOVB (R0)+,(R5)+ ; MOVB #'0,(R5) ;THEN SET THE SEQUENCE MOVB (R5)+,(R5)+ ; NUMBER TO MOVB #'1,(R5) ; '001' IN ASCII SUB #2,R5 ;POINT R5 TO BEGINNING OF SEQUENCE NUMBER INC X ;01-23-73 CLR EODV10+MSPSVC FILEF MSAT,EODV10,,,#0 ;FORM TYPE I CELL FILEF MSAT,EODV10,,,#3 ;ATTACH TO EOD "INPUT" QUEUE ; ******************************************************************** ; WRITE UPDATED "TRM" BACK TO DISC ; ******************************************************************** ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF FLWR,EODV20,R0,#0,#0 Y* * * * FILEF FLWR,EODV20,R0,#0,#0 ;WRITE BACK UPDATED "TRM" ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * .PAGE ; ******************************************************************** ;NOW RESTORE ZEROED IMAGE OF NULL M.N.T. TO THE FILE WORK AREA. THE ;POINT OF USING "MOVEA" IS TO TRANSFER THE HEADER. ; ******************************************************************** MOVEA EODX60,FILGL,FILAT-FILGL ; * * * * * * * * Z******************************************************** ;* ** ;* AND NOW FOR THE DATA........... ;* ;* ;* FIRST, THE LIST NEEDED BY SUBROUTINE DEFINE TO DEFINE ;* A DISC FILE. ;* FILE: .WORD 1 ;THREAD WORD FERR: .BYTE 0,0 ;ERROR INDICATORS .WORD 0 ;RESERVED FOR USE BY DEFINE .WORD 235 ;FILE IDENTIFICATION .BYTE 9. [ 8.(SP) ;SET RETURN CODE TO 'TERMINAL ID ENTERED' INC NTRMNL ;INCREMENT TNE NO. OF TERMINALS COUNTER BR FINA20 ;GO EXIT ;* ;* ;* NO ROOM FOR THE ENTRY, PASS THE WORD ON TO THE CALLER ;* ;* FINC00: MOV #SEQNO,R5 ;POINT TO A '001' SEQUENCE NUMBER DEC 8.(SP) ;SET 'NO ROOM' CONDITION BR FINA20 ;GO RETURN TO CALLER .PAGE ;* ;* ;* THIS CODE WAITS FOR A 'REQUE\ ;WRITE BACK UPDATED "TRM" ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * .PAGE ; ******************************************************************** ;NOW RESTORE ZEROED IMAGE OF NULL M.N.T. TO THE FILE WORK AREA. THE ;POINT OF USING "MOVEA" IS TO TRANSFER THE HEADER. ; ******************************************************************** MOVEA EODX60,FILGL,FILAT-FILGL ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ]* * * * * * * * * * * * * * * * * * * * * * * * FILEF FLWR,EODV30,R0,#0,#0 ;WRITE NULL M.N.T. BACK, CLEARE ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ******************************************************************** ; CLEAR OUT THE "MESSAGE NUMBER TABLE" ; ******************************************************************** EODC80: ;NOW CLEAR MESSAGE NUMBER TABLE AND CLEAN UP ;01-23-73 MOV #MNT,EODV30+^ ;FILE TYPE 9 (DATA) .BYTE 0 ;RESERVED .WORD 49. ;NUMBER OF SECTORS TO RESERVE (16 MESSAGES) ;* ;* D I S C I O L I S T S ;* ;* TO READ/WRITE THE CONTROL SECTOR OF 'SIM' FILE ;* CLIST: .WORD 1 ;THREAD WORD .BYTE 1 ;DEVICE 1 = DISC .BYTE 2 ;EXIT 2 (SUSPEND ON I/O) .WORD 0 ;NOT USED .BYTE 0 ;ERROR TASK (NOT U`ST-TO-SEND' STATUS. WHEN RECEIVED, ;* THEN A 'CLEAR-TO-SEND' INTERRUPT IS SIMULATED. IF 'REQUEST-TO-SEND' ;* ISN'T RECEIVED WITHIN 4 SECONDS, THEN REQSND EXITS TO CPSB20 ;* (TO PROCESS THE NEXT TASK). ;* ;* REQSND: MOV #40.,R0 ;LOAD 20-SECOND LOOP COUNTER ; REQA00: BIT #1,XCSR ;IS 'REQUEST-TO-SEND' BIT SET? BNE REQA20 ;BRANCH IF YES DEC R0 ;DECREMENT 4 SECOND COUNTER BGT REQA` FILEF FLWR,EODV30,R0,#0,#0 ;WRITE NULL M.N.T. BACK, CLEARE ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ******************************************************************** ; CLEAR OUT THE "MESSAGE NUMBER TABLE" ; ******************************************************************** EODC80: ;NOW CLEAR MESSAGE NUMBER TABLE AND CLEAN UP ;01-23-73 MOV #MNT,EODV30+FLPNAM ;READ IN CLR EODV30+FLPaFLPNAM ;READ IN CLR EODV30+FLPSVC ; MESSAGE SEQUENCE ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF FLSNT,EODV30,R0,#2,#0 ; NUMBER TABLE ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MOV #FILG1,R0 ;WILL CLEAR ENTIRE MNT... MOV #MNTTSZ,R1 ;...IN PREP FOR WRITE-BACK 2$: CLR (R0)+ SOB R1,2$ ; * * * * * * * * * * * * bSED) .BYTE 1 ;PRIORITY LEVEL CERR: .WORD 0 ;ERROR STATUS .WORD 0 ;RESERVED .WORD CONTRL ;CONTROL DATA BUFFER ; CONTRL: .WORD 235 ;FILE IDENTIFICATION .BYTE 0 ;SPECIFIES RELATIVE SECTO I/O CTLIO: .BYTE 0 ;I/O COMMAND (0 = READ, 1 = WRITE) .WORD 0,0,0 ;ALL RESERVED .WORD 0 ;RELATIVE SECTOR (THE FIRST c ;RETURN TO ASYNC HANDLER ; SIMB00: MOV #TIMER2,-(SP) ;TTY I/O COMPLETE ENTRY - OR NO PRINT ENTRY MOV #2,-(SP) ;DELAY 16-32 MS JSR PC,@QTIMEV ; TST (SP)+ ;POP OFF ERROR PARAMETER RTS PC ;RETURN ; SIMB10: JSR PC,OUTPUT ;SIMULATE THE TRANSMIT INTERRUPT RTS PC ;AND RETURN TO THE TIMER ROUTINE .PAGE ;*******************************d10 ;BRANCH IF MAXIMUM TIME HAS NOT ELAPSED TST (SP)+ ;TOO BAD, CLEAR RETURN PC FROM STACK JMP CPSB20 ;AND GO PROCESS NEXT REQUEST ; REQA10: MOV #TIMER1,-(SP) ;SUSPEND MOV #30.,-(SP) ; EXECUTION EMT QTIME ; FOR 500 MS TST (SP)+ ;POP OFF ERROR PARAMETER BR REQA00 ;GO SEE IF 'REQUEST-TO-SEND' IS SET ; REQA20: MOV #TIMER1,-(SP) e* * * * * * * * * * * * * * * * * * * * FILEF FLWR,EODV30,R0,#0,#0 ;WRITE MNT BACK, CLEARED ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * .IF NE .CITGO ;NOW WE'LL FORMAT AND SEND A 'REQUEST 01.31.73 ;TO PRINT TOTALS' MESSAGE TO THE HUB 01.31.73 MOVE EODP40 ;SOFTWARE 01.31.73 FILEF MSAT,EODV10,R0,#0,#0 ;SEND THfSECTOR IS CONTROL) .WORD 64. ;NUMBER OF WORDS TO TRANSFER NMESGE = . ;DATA BUFFER: NUMBER OF MESSAGES IN FILE NEXT = .+2 ;DATA BUFFER: NEXT RELATIVE SECTOR TO PROCESS NTRMNL = .+4 ;CONTAINS THE NUMBER OF DIFFERENT TERMINALS MSGNO = .+6 ;TABLE OF ALL TERMINALS DEFINED AND ;THEIR NEXT ASSIGNED SEQUENCE NUMBER . = .+128. ;CONTROL DATA BUFFER ;*g**************************************** ;* ** ;* U T I L I T Y S U B R O U T I N E S ** ;* ** ;* INPUT - SIMULATE A DC11 RECEIVE INTERRUPT. LINKAGE IS: ** ;* ** ;* JSR PC,INPUT ;CALLER MUST BE A TASK ** ;* h ;'REQUEST-TO-SEND' IS SET, NOW WE NEED MOV #6,-(SP) ;TO WAIT ABOUT 100 MS LONGER. THIS EMT QTIME ;IS ABOUT HOW LONG IT TAKES THE DC11 ET. AL. TST (SP)+ ;TO GIVE A 'CLEAR-TO-SEND' AFTER THE ;'REQUEST-TO-SEND' HAS BEEN ISSUED JSR PC,OUTPUT ;NOW SIMULATE A 'CLEAR-TO-SEND' INTERRUPT BEQ REQA30 ;BRANCH IF SUCCESSFUL BIT #STOP,@#SWITCH ;IS USER REQUESTINiE MESSAGE 01.31.73 FILEF MSAT,EODV10,R0,#0,#3 01.31.73 JMP EODC10 ;BACK FOR MORE .PAGE .SBTTL PHASE #3 ; ******************************************************************** EODD00: ;ENTRY POINT AFTER 2ND 30-SEC DELAY ; ******************************************************************** DEBUG 100 MOV #RTEST-RTEL,R5 ;INIT PNTR TO "RTE" EODD10: ADD #RTEL,j ;* MESSAGE BUFFER DISCIO LIST, ET. AL. ;* MLIST: .WORD 1 ;THREAD WORD .BYTE 1 ;DEVICE 1 = DISC .BYTE 2 ;EXIT 2 (SUSPEND ON I/O) .WORD 0 ;NOT USED .BYTE 0 ;ERROR TASK .BYTE 1 ;PRIORUTY LEVEL MERR: .WORD 0 ;ERROR STATUS .WORD 0 ;RESERVED .WORD MSGBUF ;DATA BUFFER ; MSGBUF: k ** ;*********************************************************************** ; INPUT: MOV @#PS,-(SP) ;PUSH PS ONTO STACK MOV @#ASYNCR+2,@#PS ;RAISE CPU LEVEL TO WHAT ASYNCR NEEDS MOV #INPA00,-(SP) ;RETURN PC ON STACK TO SIMULATE AN JMP @ASYNCR ;INTERRUPT FROM THE RECEIVE ; INPA00: MOV #TIMER1,-(SP) ; MOV #2,-(SP) ; EMT QTIME G A STOP? BEQ REQA20 ;IF NOT, WAIT UNTIL INTERRUPT IS ENABLED ; REQA30: RTS PC ;RETURN TO CALLER .=.+50. ;.....PATCH AREA..... .END mR5 MOV RTEID(R5),R0 BEQ EODD10 ;NULL ENTRY CMP R0,#-1 BNE EODD14 CLR SYDST+SYDED1 ;RESET COMMON CORE ENTRY-POINT FLAG JMP EODRPT ;AND RESTART IN CASE MORE MESSAGES IN ; ******************************************************************** EODD14: ;FOR EACH TERMINAL THAT HAD AN EOD, CLEAR THAT FLAG IN ;ITS FACILITY TABLE & RELEASE THE INHIBIT OF ITS INPUT ; ****************n .WORD 235 ;FILE IDENTIFICATION .BYTE 0 ;SPECIFIES RELATIVE SECTOR I/O SIMIO: .BYTE 0 ;I/O COMMAND (0 = READ, 1 = WRITE) .WORD 0,0,0 ;ALL RESERVED RLSECT: .WORD 0 ;RELATIVE SECTOR OF FILE TO READ NEXT .WORD 192. ;NUMBER WORDS TO TRANSFER SIMBUF: . = .+384. ;SIMULATION MESSAGE DATA BUFFER ;* ;* ;* T I M E R M O D U L E S ;* TIMER1: .WORD 1 o;SUSPEND EXECUTION FOR 16-32 MS TST (SP)+ ;POP OFF ERROR PARAMETER RTS PC ;THEN RETURN TO CALLER ;* ;* ;* S I M U L A T E O U T P U T I N T E R R U P T ;* ;* OUTPUT: BIS #202,XCSR ;SET 'READY' AND 'CLEAR-TO-SEND' STATUS MOV @#PS,-(SP) ;PUSH PS ON STACK MOV @#ASYNCX+2,@#PS ;THEN SET THE PS TO THE ASYNC INTERRUPT VALUE MOV #OUTA00,-(SP) ;PUSH INTERRUPT RETURN ADDRESS p ;FOR EACH TERMINAL THAT HAD AN EOD, CLEAR THAT FLAG IN ;ITS FACILITY TABLE & RELEASE THE INHIBIT OF ITS INPUT ; ******************************************************************** MOV R5,-(SP) JSR PC,CNVRTX ;GET THIS TERM'S INDEX MOV (SP)+,EODW13 ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF FLSNT,EODV20,R0,#2,#0 ;READ IN "TRM" ; * * * * * * * * * * * * * * * * * * * * * * * * * * q**************************************************** MOV R5,-(SP) JSR PC,CNVRTX ;GET THIS TERM'S INDEX MOV (SP)+,EODW13 ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF FLSNT,EODV20,R0,#2,#0 ;READ IN "TRM" ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * TSTB FILG1+TRMAED ;WAS THERE AN EOD ON THIS? BEQ 10$ ;NO MOV R5,-r ;THREAD WORD .BYTE 0 ;NOT USED .BYTE 200 ;SUSPENT OPTION AND RESOLUTION 0 .WORD 0 ;RESERVED ; TIMER2: .WORD 1 ;THREAD WORD .BYTE 0 ;NOT USED .BYTE 20 ;JSR SUBROUTINE OPTION, RESOLUTION 0 .WORD 0 ;RESERVED .WORD SIMB10 ;JSR ADDRESS ;* ;* ;* T E L E T Y P E I / O L I S T S ;* ;* TLIST: .WORD s JMP @ASYNCX ;SIMULATE INTERRUPT ; OUTA00: RTS PC ;RETURN TO CALLER .PAGE ;*********************************************************************** ;* ** ;* F I N D ** ;* ** ;* THE PURPOSE OF THIS LITTLE SUBROUTINE IS TO SEARCH THE ** ;* t* * * * * * TSTB FILG1+TRMAED ;WAS THERE AN EOD ON THIS? BEQ 10$ ;NO MOV R5,-(SP) ;GET ADDR IN QUEUE TABLE... JSR PC,CNVRTQ ;...FROM ADDR IN RTE TABLE MOV (SP)+,R0 BIC #MSQF2,MSQIH(R0) ;CLEAR INHIBIT 10$: CLRB FILG1+TRMAED ;RESET EOD FLAG ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF FLWR,EODV20,R0,#0,#0 ;WRITE "TRu(SP) ;GET ADDR IN QUEUE TABLE... JSR PC,CNVRTQ ;...FROM ADDR IN RTE TABLE MOV (SP)+,R0 BIC #MSQF2,MSQIH(R0) ;CLEAR INHIBIT 10$: CLRB FILG1+TRMAED ;RESET EOD FLAG ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF FLWR,EODV20,R0,#0,#0 ;WRITE "TRM" BACK OUT ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * BR EODD10 ;BACK FOR MORE .Pv1 ;THREAD WORD .BYTE 0 ;TTY DEVICE NUMBER .BYTE 2 ;SUSPEND ON I/O (EXIT 2) .WORD 0 ;NOT USED .BYTE 0 ;NOT USED .BYTE 1 ;PRIORITY LEVEL TTYERR: .WORD 0 ;ERROR STATUS .WORD 0 ;RESERVED TTYBUF: .WORD 0 ;DATA BUFFER ; TTYBF1: .WORD 450.+40000 ;MAXIMUM NUMBER OF CHARACTERS TO ENTER .WORD 0 w'MSGNO' TABLE (RESIDENT IN THE CONTROL SECTOR) FOR THE ** ;* TERMINAL WHOSE ID IS SPECIFIED IN LOCATIONS SIMBUF+3 THROUGH ** ;* SIMBUF+7. THE 'MSGNO' TABLE IS ASSUMED TO BE CORE-RESIDENT. ** ;* THE FORMAT OF THE 'MSGNO' TABLE IS: ** ;* ** ;* .ASCII /TRMID/ ;FIVE CHARACTERS ** ;* .ASCII /SEQ/ ;NEXT SEQUENCE NO. (001-999) ** xM" BACK OUT ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * BR EODD10 ;BACK FOR MORE .PAGE .SBTTL ERROR PROCESSING ; ******************************************************************** ; ERROR PROCESSING: OUTPUT AN ERROR MESSAGE TO THE HUB CONSOLE ; INCLUDE IN IT AN ERROR NUMBER FOR IDENTIFICATION ; ******************************************************************** ;ALL ERROR MESSAGES ENTER ERROR PROCESSIyAGE .SBTTL ERROR PROCESSING ; ******************************************************************** ; ERROR PROCESSING: OUTPUT AN ERROR MESSAGE TO THE HUB CONSOLE ; INCLUDE IN IT AN ERROR NUMBER FOR IDENTIFICATION ; ******************************************************************** ;ALL ERROR MESSAGES ENTER ERROR PROCESSING THROUGH THIS "SLIDE": .REPT ERRNUM INC ERRORX .ENDM EODE00: ;ENTRY TO ERROR PROCESSING ROUTINE z ;ACTUAL NUMBER CHARACTERS INPUT . = .+450. ; ERROR: .WORD 12. ;ERROR MESSAGE BUFFER - PRINTED .WORD 0 ;WHEN A DISC ERROR IS ENCOUNTERED .BYTE CR,LF .ASCII 'ERROR ' .ASCII ' 1' ;SIMULATED DC11 NO. 1 ERROR .BYTE CR,LF ; TLIST2: .WORD 1 ;THREAD WORD - TTY LIST FOR CPRNT1 .BYTE 0 ;TTY DEVICE NUMBER .BYTE 3 ;I/O{;* ** ;* IF THE TERMINAL NAME IS FOUND, THEN A POINTER TO THE SEQUENCE ** ;* NUMBER IS RETURNED TO THE CALLER. IF THE NAME IS NOT FOUND, ** ;* THEN THE NAME IS INSERTED INTO THE TABLE AND THE SEQUENCE ** ;* NUMBER IS INITIALIZED TO '001'. THE LINKAGE TO FIND IS: ** ;* ** ;* JSR PC,FIND ; |NG THROUGH THIS "SLIDE": .REPT ERRNUM INC ERRORX .ENDM EODE00: ;ENTRY TO ERROR PROCESSING ROUTINE DEBUG 200 MOVE EODP30 ;BUILD ERR MSG AND CONVERT ERROR # TO ASCII MOV #2$,EODW25 ;STORE RETURN ADDRESS FOR DELAY IF 01.27.73 ;MESSAGE AREA IS FULL 01.27.73 ; 01.27.73 2$: } DEBUG 200 MOVE EODP30 ;BUILD ERR MSG AND CONVERT ERROR # TO ASCII MOV #2$,EODW25 ;STORE RETURN ADDRESS FOR DELAY IF 01.27.73 ;MESSAGE AREA IS FULL 01.27.73 ; 01.27.73 2$: 01.27.73 CLR EODV10+MSPSVC ;INIT TO FORM ; * * * * * * * * * * * * * * * * ~ COMPLETE REQUESTED (EXIT 3) .WORD SIMB00 ;I/O COMPLETE SUBROUTINE .BYTE 0 ;NOT USED .BYTE 1 ;PRIORITY .WORD 0 ;ERROR STATUS .WORD 0 ;RESERVED .WORD CPRNT1 ;DATA BUFFER ADDRESS ; CPRNT1: .WORD 1,0 ;DATA BUFFER FOR TTY WHEN TRANSMISSION .BYTE 0,0 ;DATA ARE ECHOED ;* ;* ;* M I S C E L L A N E O U S D A T A V A L  ** ;* BEQ FOUND ;BRANCH IF TERMINAL FOUND ** ;* BGT INSERT ;BRANCH IF THE NAME WAS ADDED ** ;* BLT ERROR ;BRANCH IF THERE WAS ** ;* ;INSUFFICIENT SPACE TO ADD ** ;* ;A NEW ENTRY ** ;* ** ;* R5 POINTS TO THE MOST SIGNIFICANT DIGIT OF THE ASC 01.27.73 CLR EODV10+MSPSVC ;INIT TO FORM ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF MSAT,EODV10,R0,#0,#0,EODRPT,EODR10 ;"FORM" TYPE I MSG ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF MSAT,EODV10,R0,#0,#3,EODRPT,EODRPT ;"ATTACH" MESSAGE ; * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF MSAT,EODV10,R0,#0,#0,EODRPT,EODR10 ;"FORM" TYPE I MSG ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * FILEF MSAT,EODV10,R0,#0,#3,EODRPT,EODRPT ;"ATTACH" MESSAGE ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JMP EODRPT ;BACK TO TRY AGAIN .PAGE .SBTTL LOCAL SUBROUTINES EODSU E S ;* ;* TERM: .WORD TERM1 ;POINTS TO CURRENT TERMINAL CODE TERM1: .WORD TERM2 ;POINTS TO NEXT TERMINAL .ASCII 'UNION ' ;TERMINAL 1 CODE TERM2: .WORD TERM1 ;POINTS TO NEXT TERMINAL .ASCII 'HAMBG ' ;TERMINAL 2 CODE NTERM: .WORD 0 ;0 = TERMINAL 1, 1 = TERMINAL 2 SEQNO: .ASCII '001' ;SEQUENCE NUMBER FOR MESSAGES .EVEN NAKFLG: .WORD 0 ;NAK RECEIVED FLAG ACKFLG: .WORD II ** ;* SEQUENCE NUMBER. ALL OTHER REGISTERS ARE SAVED. ** ;* ** ;*********************************************************************** ; FIND: CLR -(SP) ;SET RETURN CONDITION CODE MOV R1,-(SP) ;SAVE MOV R2,-(SP) ; THE MOV R3,-(SP) ; GENERAL MOV R4,-(SP) ; REGISTERS MOV #MSGNO,R* * * * * * * * * * * * * * * * * * * * * JMP EODRPT ;BACK TO TRY AGAIN .PAGE .SBTTL LOCAL SUBROUTINES EODS10: ;SUBROUTINE TO CHECK IF IT IS TIME FOR EOM/EOD [EO!] ;(R0)=JULIAN TARGET (EOM OR EOD); (R4)=FLAG FOR ASSOCIATED FUNCTION MOV EODW18,R1 ;TODAY'S JULIAN CMP R0,R1 ;TARG:NOW BEQ 4$ ;GO CHECK TIME BGT 6$ ;TOO SOON, UNLESS OUTTAGE DURING NEW YEAR 10: ;SUBROUTINE TO CHECK IF IT IS TIME FOR EOM/EOD [EO!] ;(R0)=JULIAN TARGET (EOM OR EOD); (R4)=FLAG FOR ASSOCIATED FUNCTION MOV EODW18,R1 ;TODAY'S JULIAN CMP R0,R1 ;TARG:NOW BEQ 4$ ;GO CHECK TIME BGT 6$ ;TOO SOON, UNLESS OUTTAGE DURING NEW YEAR CMP EODW17,#12. ;IS IT DECEMBER OUTSIDE? BNE 2$ ;NO: ASSUME BYPASSED DUE TO OUTTAGE CMP R0,#31.  0 ;ACK RECEIVED FLAG ENDFLG: .WORD 0 ;END OF DATA RECEIVED FLAG LAST: .WORD 0 ;PREVIOUS CHARACTER RECEIVED FOR OUTPUT .PAGE ;*********************************************************************** ;* ** ;* C P S I M ** ;* ** ;* THIS IS THE OFFICI1 ;INITIALIZE LOOP COUNTERS MOV NTRMNL,R2 ; AND BASE ADDRESSES BEQ FINB00 ;BRANCH IF THERE AREN'T ANY ENTRIES IN MSGNO ; FINA00: MOV #5,R4 ;FIVE CHARACTERS PER TERMINAL ID MOV #SIMBUF+3,R3 ;ADDRESS OF TERMINALS ID ; FINA10: CMPB (R1)+,(R3)+ ;WE HAVE TO CHECK ONE CHARACTER AT A TIME BNE FINA30 ;BRANCH IF THE ID'S DON'T MATCH SOB R4,FINA10 ;COMPARE ALL F CMP EODW17,#12. ;IS IT DECEMBER OUTSIDE? BNE 2$ ;NO: ASSUME BYPASSED DUE TO OUTTAGE CMP R0,#31. ;EO! DURING JAN? BLE 8$ ;YES: ASSUME POSTDATED 2$: BISB R4,FILG1+TRMAED ;MARK FOR EO! BR 8$ 4$: CMP EODW12,EODW14 ;TODAY IS DAY: CHECK TIME BGE 2$ BR 8$ 6$: SUB R1,R0 ;GET # DAYS FUTURE DELAY CMP R0,#EODMDY ;MAXIMUM DELAY  ;EO! DURING JAN? BLE 8$ ;YES: ASSUME POSTDATED 2$: BISB R4,FILG1+TRMAED ;MARK FOR EO! BR 8$ 4$: CMP EODW12,EODW14 ;TODAY IS DAY: CHECK TIME BGE 2$ BR 8$ 6$: SUB R1,R0 ;GET # DAYS FUTURE DELAY CMP R0,#EODMDY ;MAXIMUM DELAY BGT 2$ ;IF THE NUMBER OF DAYS DIFFERENCE IS 01.27.73 ;GREATER THAN THE MAXIMUM ACCEPTABLE, 01AL ENTRY POINT TO THE SIMULATOR PROGRAM. ** ;* CPSIM IS EXECUTED AS A TASK UNDER CONTROL OF ROS II. ** ;* ** ;*********************************************************************** ; CPSTRT: BPT ;.....FOR DEBUG ONLY ..... MOV #TERM1,TERM ;INITIALIZE TERMINAL NAME POINTERS CLR NTERM ;AND COUNTERS MOV #SIMOUT,@#CPSIMV;STORE ADDRESS OF IVE CHARACTERS CLR 8.(SP) ;AT THIS POINT, WE HAVE A MATCH MOV R1,R5 ;SET R5 TO POINT TO THE SEQUENCE NUMBER ; FINA20: MOV (SP)+,R4 ;RESTORE MOV (SP)+,R3 ; THE MOV (SP)+,R2 ; GENERAL MOV (SP)+,R1 ; REGISTERS TST (SP)+ ;SET THE CONDITION CODE RTS PC ; FINA30: ADD R4,R1 ;ID'S DON'T MATCH ADD #2 BGT 2$ ;IF THE NUMBER OF DAYS DIFFERENCE IS 01.27.73 ;GREATER THAN THE MAXIMUM ACCEPTABLE, 01.27.73 ;THEN AN OUTTAGE OCCURRED OVER 01.27.73 ;OVER THE NEW YEAR 01.27.73 8$: RTS PC .PAGE EODS20: ;DELAY 1 SEC SUBROUTINE MOV R5,-(SP) ;SAVE R5 01.27.73 MOV #5,R5 .27.73 ;THEN AN OUTTAGE OCCURRED OVER 01.27.73 ;OVER THE NEW YEAR 01.27.73 8$: RTS PC .PAGE EODS20: ;DELAY 1 SEC SUBROUTINE MOV R5,-(SP) ;SAVE R5 01.27.73 MOV #5,R5 ;SET UP MAXIMUM DELAY LOOP COUNTER 01.27.73 ; 01.27.73 EODS21: SIMOUT FOR ASYNC HANDLER BIT #NEW,@#SWITCH ;DEFINE COMPLETELY NEW MESSAGES? BNE CPSA20 ;BRANCH IF YES CLRB CTLIO ;NO - THEN THE 'SIM' FILE MUST ALREADY EXIST MOV #CLIST,-(SP) ;SO, LET'S EMT DISCIO ; READ IT TSTB CERR ;ANY ERRORS? BEQ CPSA10 ;BRANCH IF NO ; CPSA00: MOV #ERROR,TTYBUF ;OTHERWISE, TELL SYSTEM MOV #TLIST,-(SP) ; ,R1 ;INCREMENT TO NEXT MSGNO ENTRY SOB R2,FINA00 ;GO BACK FOR THE NEXT ENTRY ;* ;* ;* THIS TERMINAL IS NOT IN THE MSGNO TABLE, SO NOW WE'LL HAVE TO ;* INSERT IT (IF THERE'S ROOM). ;* ;* FINB00: MOV NTRMNL,R5 ;GET THE NO. OF ENTRIES ALREADY IN TABLE CMP R5,#15. ;IS THERE ROOM FOR ONE MORE? BGE FINC00 ;BRANCH IF NO MUL #8.,R5 ;OTHERWISE, CALCULATE INDEX ADD #MSG ;SET UP MAXIMUM DELAY LOOP COUNTER 01.27.73 ; 01.27.73 EODS21: 01.27.73 MOV #EODX34,-(SP) MOV #1,-(SP) EMT QTIME TST (SP)+ BEQ 2$ MOV #4000,R0 SOB R0,. SOB R5,EODS21 ;TRY AGAIN FOR A MAXIMUM OF 5 ATTEMPTS 01.27.73 DEBUG ;T 01.27.73 MOV #EODX34,-(SP) MOV #1,-(SP) EMT QTIME TST (SP)+ BEQ 2$ MOV #4000,R0 SOB R0,. SOB R5,EODS21 ;TRY AGAIN FOR A MAXIMUM OF 5 ATTEMPTS 01.27.73 DEBUG ;THEN GIVE UP 01.27.73 ; 01.27.73 2$:  EMT TTYOUT ; ; CPSA05: EMT EXIT ;EXIT BACK TO ROS ; CPSA10: BIT #ADD,@#SWITCH ;ARE WE SUPPOSED TO ADD MORE MESSAGES? BEQ CPSB10 ;BRANCH IF NO BR CPSA40 ; ; CPSA20: MOV #FILE,-(SP) ;ALL NEW MESSAGES - BUT FIRST WE NEED TO EMT DEFINE ;DEFINE A DISC FILE. CALL IT 'SIM' TSTB FERR ;FILE ERROR? BEQ CPSA30 ;BRANO,R5 ;R5 NOW POINTS TO THE NEW TABLE ENTRY MOV #SIMBUF+3,R0 ;NOW, MOVB (R0)+,(R5)+ ; ENTER THE NEW MOVB (R0)+,(R5)+ ; TERMINAL ID NUMBER MOVB (R0)+,(R5)+ ; INTO THE MSGNO TABLE MOVB (R0)+,(R5)+ ; (FIRST FIVE CHARACTERS) MOVB (R0)+,(R5)+ ; MOVB #'0,(R5) ;THEN SET THE SEQUENCE MOVB (R5)+,(R5)+ ; NUMBER TO MOVB #'1,(R5) ; '001' IHEN GIVE UP 01.27.73 ; 01.27.73 2$: 01.27.73 MOV (SP)+,R5 ;RESTORE R5 01.27.73 RTS PC ;AND RETURN TO CALLER 01.27.73 .PAGE ;THIS SUBROUTINE CONVERTS THE TERMINAL'S EOM & EOD TIME TO HUB TIME. ;IN THE PROCESS IT ADJUSTS THE EOD DAY IN ALLO 01.27.73 MOV (SP)+,R5 ;RESTORE R5 01.27.73 RTS PC ;AND RETURN TO CALLER 01.27.73 .PAGE ;THIS SUBROUTINE CONVERTS THE TERMINAL'S EOM & EOD TIME TO HUB TIME. ;IN THE PROCESS IT ADJUSTS THE EOD DAY IN ALLOWING FOR TIME ZONE ;DIFFERENCES EITHER WAY, FOR DIFFERENCES IN DAYLIGHT SAVINGS TIME STATUS ;FOR GOING BACKWARD OR FORWARD THROUGH MIDNIGHT, AND FORNCH IF NONE CMPB #7,FERR ;OOPS! MAYBE IT'S ALREADY DEFINED BNE CPSA00 ;TSK, TSK! ; CPSA30: CLR NMESGE ;INITIALIZE THE CONTROL SECTOR PARAMETERS MOV #1,NEXT ;(PREPARE TO READ MESSAGES) ; CPSA40: MOV #TTYBF1,TTYBUF ;ISSUE READ REQUEST FOR NEXT SIMULATED MOV #TLIST,-(SP) ;MESSAGE FROM TTY READER EMT TTYIN ; TSTB TTYERR ;IF THERE'S AN ERRORN ASCII SUB #2,R5 ;POINT R5 TO BEGINNING OF SEQUENCE NUMBER INC 8.(SP) ;SET RETURN CODE TO 'TERMINAL ID ENTERED' INC NTRMNL ;INCREMENT TNE NO. OF TERMINALS COUNTER BR FINA20 ;GO EXIT ;* ;* ;* NO ROOM FOR THE ENTRY, PASS THE WORD ON TO THE CALLER ;* ;* FINC00: MOV #SEQNO,R5 ;POINT TO A '001' SEQUENCE NUMBER DEC 8.(SP) ;SET 'NO ROOM' CONDITION BR WING FOR TIME ZONE ;DIFFERENCES EITHER WAY, FOR DIFFERENCES IN DAYLIGHT SAVINGS TIME STATUS ;FOR GOING BACKWARD OR FORWARD THROUGH MIDNIGHT, AND FOR GOING BACKWARD ;OR FORWARD THROUGH NEW YEAR'S. THE BASIC CONVERSION FORMULA IS: ; HOUR(H) = HOUR(T) + ZONE(H) - ZONE(T) + DST(H) - DST(T) ;* 01.27.73 ;* LINKAGE TO THIS SUBROUTINE IS: 01.27.73 ;*  GOING BACKWARD ;OR FORWARD THROUGH NEW YEAR'S. THE BASIC CONVERSION FORMULA IS: ; HOUR(H) = HOUR(T) + ZONE(H) - ZONE(T) + DST(H) - DST(T) ;* 01.27.73 ;* LINKAGE TO THIS SUBROUTINE IS: 01.27.73 ;* 01.27.73 ;* JSR PC,EODS30 01.27.73 ;* , WE'LL KEEP TRYING BNE CPSA40 ;UNTIL OPERATOR'S GOT THE TAPE READY ;AT THIS POINT, THE OPERATOR HAS RESPONDED ;AND A MESSAGE HAS BEEN READ MOV TTYBF1+2,R0 ;ANY CHARACTERS IN THE BUFFER? BEQ CPSB00 ;IF NOT, THEN ALL MESSAGES HAVE BEEN ENTERED MOV #SIMBUF,R1 ;TRANSFER MESSAGE TO DISC BUFFER MOV #TTYBF1+4,R2 ; MOVB #STX,(R1)+ ;FIRFINA20 ;GO RETURN TO CALLER .PAGE ;* ;* ;* THIS CODE WAITS FOR A 'REQUEST-TO-SEND' STATUS. WHEN RECEIVED, ;* THEN A 'CLEAR-TO-SEND' INTERRUPT IS SIMULATED. IF 'REQUEST-TO-SEND' ;* ISN'T RECEIVED WITHIN 4 SECONDS, THEN REQSND EXITS TO CPSB20 ;* (TO PROCESS THE NEXT TASK). ;* ;* REQSND: MOV #40.,R0 ;LOAD 4-SECOND LOOP COUNTER ; REQA00: BIT #1,XCSR ;IS 'REQUEST-TO-SEND' BIT SET? BNE REQA20  01.27.73 ;* JSR PC,EODS30 01.27.73 ;* 01.27.73 ;* WHERE R0 MUST CONTAIN THE TERMINAL EOD JULIAN DAY IN 01.27.73 ;* LOCAL TERMINAL TIME 01.27.73 ;* 01.27.73 EODS30: MOVB FILG1+TRMEOD+1,R1 ;TERM'S EO 01.27.73 ;* WHERE R0 MUST CONTAIN THE TERMINAL EOD JULIAN DAY IN 01.27.73 ;* LOCAL TERMINAL TIME 01.27.73 ;* 01.27.73 EODS30: MOVB FILG1+TRMEOD+1,R1 ;TERM'S EOD TIME (HOUR) MOVB FILG1+TRMTMZ,R2 ;TERM'S TIME ZONE MOVB FILG1+TRMDST,R3 ;DAYLIGHT TIME INDICATOR ST, INSERT LEADING CHARACTERS MOVB #CR,(R1)+ ; MOVB #LF,(R1)+ ; ; CPSA50: MOVB (R2)+,R3 ;NOW, MOVE THE MESSAGE CMPB R3,#177 ;CHECK FOR A DELETE CHARACTER BEQ CPSA75 ;BRANCH IF YES - IGNORE IT CMPB R3,#'( ;LEFT PARENS BNE CPSA60 ; ARE REPLACED BY MOVB #CR,R3 ; CARRIAGE RETURNS BR CPSA70 ; ; CPSA60: ;BRANCH IF YES DEC R0 ;DECREMENT 4 SECOND COUNTER BGT REQA10 ;BRANCH IF MAXIMUM TIME HAS NOT ELAPSED TST (SP)+ ;TOO BAD, CLEAR RETURN PC FROM STACK JMP CPSB20 ;AND GO PROCESS NEXT REQUEST ; REQA10: MOV #TIMER1,-(SP) ;SUSPEND MOV #30.,-(SP) ; EXECUTION EMT QTIME ; FOR 500 MS TST (SP)+ ;POP OFF ERROR PARAMETER BR D TIME (HOUR) MOVB FILG1+TRMTMZ,R2 ;TERM'S TIME ZONE MOVB FILG1+TRMDST,R3 ;DAYLIGHT TIME INDICATOR ADD #HUBZON+HUBDST,R1 ;ADD IN HUB'S ZONE & DST SUB R2,R1 SUB R3,R1 BGE 2$ ADD #24.,R1 ;HOUR WENT BELOW 00 DEC R0 ;EOD @ TERM HAPPENS DAY BEYOND DAY AT HUB BNE 6$ ;BRANCH IF TERM. JULIAN DAY IS NON-ZERO 01.27.73 MOV #365.,-(SP) ADD #HUBZON+HUBDST,R1 ;ADD IN HUB'S ZONE & DST SUB R2,R1 SUB R3,R1 BGE 2$ ADD #24.,R1 ;HOUR WENT BELOW 00 DEC R0 ;EOD @ TERM HAPPENS DAY BEYOND DAY AT HUB BNE 6$ ;BRANCH IF TERM. JULIAN DAY IS NON-ZERO 01.27.73 MOV #365.,-(SP) ;THE QUESTION IS, WAS LAST YEAR LEAP YR?01.27.73 MOV EODW15,R0 ;GET THE CURRENT YEAR 01.27.73 DEC CMPB R3,#') ;RIGHT PARENS BNE CPSA70 ; ARE REPLACED MOVB #LF,R3 ; BY LINE FEEDS ; CPSA70: MOVB R3,(R1)+ ;STORE CHARACTER IN DISC BUFFER ; CPSA75: SOB R0,CPSA50 ;DECREMENT COUNTER AND LOOP ; MOVB #CR,(R1)+ ;NOW, STORE MOVB #LF,(R1)+ ; ALL OF MOVB #VT,(R1)+ ; THE MOVB #VT,(R1)+ ; GOOREQA00 ;GO SEE IF 'REQUEST-TO-SEND' IS SET ; REQA20: MOV #TIMER1,-(SP) ;'REQUEST-TO-SEND' IS SET, NOW WE NEED MOV #6,-(SP) ;TO WAIT ABOUT 100 MS LONGER. THIS EMT QTIME ;IS ABOUT HOW LONG IT TAKES THE DC11 ET. AL. TST (SP)+ ;TO GIVE A 'CLEAR-TO-SEND' AFTER THE ;'REQUEST-TO-SEND' HAS BEEN ISSUED JSR PC,OUTPUT ;NOW SIMULATE A 'CLEAR-TO-SEND' INTERRUPT  ;THE QUESTION IS, WAS LAST YEAR LEAP YR?01.27.73 MOV EODW15,R0 ;GET THE CURRENT YEAR 01.27.73 DEC R0 ;BACK UP TO LAST YEAR 01.27.73 BIT #3,R0 ;WAS IT A LEAP YEAR? 01.27.73 BNE 1$ ;BRANCH IF NO 01.27.73 INC (SP) ;OTHERWISE, ACCOUNT FOR FEBRUARY 29 01.27.73 ; R0 ;BACK UP TO LAST YEAR 01.27.73 BIT #3,R0 ;WAS IT A LEAP YEAR? 01.27.73 BNE 1$ ;BRANCH IF NO 01.27.73 INC (SP) ;OTHERWISE, ACCOUNT FOR FEBRUARY 29 01.27.73 ; 01.27.73 1$: 01.27.73 MOV (SP)+,R0 ;PD OL' MOVB #ETX,(R1)+ ; TRAILER STUFF CLRB (R1)+ ;SET BCC CLRB (R1)+ ; VALUES TO ZERO MOVB #DEL,(R1)+ ;END OF MESSAGE JSR PC,FIND ;SEE IF THIS TERMINAL IS ALREADY DEFINED. ;IF IT ISN'T, THEN ENTER THE TERMINAL ;NAME AND '001' SEQUENCE NUMBER INTO ;THE MSGNO TABLE ; RTS PC ;RETURN TO CALLER .=.+50. ;.....PATCH AREA..... .END  01.27.73 1$: 01.27.73 MOV (SP)+,R0 ;PUT DAY IN R0 01.27.73 BR 6$ 01.27.73 2$: CMP R1,#23. BLE 6$ 01.27.73 SUB #24.,R1 ;HUB'S ALREADY IN NEW DAY @ TIME OF TERM EOD INC R0 ;IN HUB TIME, IT IS NEXT DAYUT DAY IN R0 01.27.73 BR 6$ 01.27.73 2$: CMP R1,#23. BLE 6$ 01.27.73 SUB #24.,R1 ;HUB'S ALREADY IN NEW DAY @ TIME OF TERM EOD INC R0 ;IN HUB TIME, IT IS NEXT DAY 6$: CMP R0,EODW24 ;GO PAST END OF YEAR? BLE 8$ MOV #1,R0 ;INIT TO FIRST OF NEXT 8$: SWAB  MOVB #1,SIMIO ;NOW, WRITE THE MESSAGE TO DISC MOV NEXT,RLSECT ;STORE THE RELATIVE SECTOR ADDRESS MOV #MLIST,-(SP) ; EMT DISCIO ; TSTB MERR ;DISC ERROR ? BNE CPSA00 ;BRANCH IF YES ADD #3,NMESGE ;OTHERWISE, INCREMENT TO NEXT RELATIVE ADD #3,NEXT ;SECTOR POSITION BR CPSA40 ;AND, ..... GO BACK FOR MORE .PAGE ;*  6$: CMP R0,EODW24 ;GO PAST END OF YEAR? BLE 8$ MOV #1,R0 ;INIT TO FIRST OF NEXT 8$: SWAB R1 ;NOW FORM HOUR:MIN WORD BISB FILG1+TRMEOD,R1 ;EOD/EOM TIME IN HUB TIME MOV R1,EODW14 ;SAVE IT MOV R0,EODW20 ;SAVE EOD DATE RTS PC .PAGE EODS40: ;THIS SUBROUTINE BUILDS AN I.D. 20 MESSAGE IN THE ;MESSAGE BUFFER AREA, AND FILLS IT WITH THE PROPER OR1 ;NOW FORM HOUR:MIN WORD BISB FILG1+TRMEOD,R1 ;EOD/EOM TIME IN HUB TIME MOV R1,EODW14 ;SAVE IT MOV R0,EODW20 ;SAVE EOD DATE RTS PC .PAGE EODS40: ;THIS SUBROUTINE BUILDS AN I.D. 20 MESSAGE IN THE ;MESSAGE BUFFER AREA, AND FILLS IT WITH THE PROPER OP-CODE. ;IT ALSO STICKS IN THE "LAST MESSAGE #", TAKEN FROM THE "OUT" ;TABLE. THE OP-CODE TO USE IS SPECIFIED BY THE NUMBER ON TH;* ;* MESSAGE INPUT FROM PAPER TAPE IS NOW COMPLETE. CLEAN UP ;* THINGS AND WRITE THE CONTROL RECORD TO DISC ;* ;* CPSB00: MOVB #1,CTLIO ;SET DISC I/O TO 'WRITE' MOV #CLIST,-(SP) ;AND EMT DISCIO ;WRITE THE CONTROL SECTOR TO THE DISC TSTB CERR ;ERROR? BNE CPSA00 ;IF THERE IS, TOO BAD! ; CPSB10: MOV #"00,SEQNO ;INITIALIZE THE INPUT MESSAGE MOVB #'1,SEQNP-CODE. ;IT ALSO STICKS IN THE "LAST MESSAGE #", TAKEN FROM THE "OUT" ;TABLE. THE OP-CODE TO USE IS SPECIFIED BY THE NUMBER ON THE ;STACK, WHICH IS USED TO INDEX INTO A LIST OF OP-CODES. ;IT IS ASSUMED THAT THE TERMINAL'S "RTE" INDEX IS AVAILABLE ;IN "EODW13". ;* 01.27.73 ;* THE LINKAGE TO THIS SUBROUTINE IS: 01.27.73 ;* E ;STACK, WHICH IS USED TO INDEX INTO A LIST OF OP-CODES. ;IT IS ASSUMED THAT THE TERMINAL'S "RTE" INDEX IS AVAILABLE ;IN "EODW13". ;* 01.27.73 ;* THE LINKAGE TO THIS SUBROUTINE IS: 01.27.73 ;* 01.27.73 ;* MOV INDEX,-(SP) ;PUSH INDEX OF OP CODE TO USE 01.27.73 ;* JSR PCO+2 ;SEQUENCE NUMBER TO '001' ; CPSB15: MOV #1,NEXT ;INITIALIZE SECTOR POINTER TO FIRST MESSAGE ; CPSB20: BIT #STOP,@#SWITCH ;SHOULD WE STOP EXECUTION? BNE CPSA05 ;GO STOP IF WE SHOULD BIT #REPEAT,@#SWITCH;OTHERWISE, IS THE USER SELECTING WHICH MESSAGE BEQ CPSB30 ;BRANCH IF NO MOVB @#SWITCH+1,R0 ;GET THE MESSAGE NUMBER BIC #177417,R0 ;CLEAR EXTRANEOUS BITS  01.27.73 ;* MOV INDEX,-(SP) ;PUSH INDEX OF OP CODE TO USE 01.27.73 ;* JSR PC,EODS40 01.27.73 ;* 01.27.73 ;* WHERE: INDEX = 0 OPEN FOLIO (01) 01.27.73 ;* = 2 CLOSE MONTHLY FOLIO (05) 01.27.73 ;* = 4 CLOSE MONTHLY FOLI,EODS40 01.27.73 ;* 01.27.73 ;* WHERE: INDEX = 0 OPEN FOLIO (01) 01.27.73 ;* = 2 CLOSE MONTHLY FOLIO (05) 01.27.73 ;* = 4 CLOSE MONTHLY FOLIO (07) 01.27.73 ;* = 6 NULL SEQUENCE NUMBER (00) 01.27.73 ;* BIC #300,R0 ;PATCH THIS OUT WHEN ASYNC DOESN'T USE ;SWITCHES 14 AND 15 FOR BREAKPOINT CONTROL ASR R0 ;SHIFT ASR R0 ; IT ASR R0 ; INTO MOV R0,R1 ; PLACE ASR R0 ; ADD R1,R0 ; INC R0 ; (NEXT = 3*N + 1) MOV R0,NEXT ;AND STORE IT CMP NEXT,NMESGE O (07) 01.27.73 ;* = 6 NULL SEQUENCE NUMBER (00) 01.27.73 ;* 01.27.73 JSR R5,SAVREG MOV 16(SP),R0 ;THE STACKED INDEX ADD #EODX21,R0 MOV R0,EODP11 ;POINTER TO PROPER OP-CODE FOR "MOVE" MOV EODW13,R1 ;TERM'S "RTE" INDEX MUL #OUTRTV+2,R1 ;GET TO THIS TERM'S ENTRY IN "OUT" MO 01.27.73 JSR R5,SAVREG MOV 16(SP),R0 ;THE STACKED INDEX ADD #EODX21,R0 MOV R0,EODP11 ;POINTER TO PROPER OP-CODE FOR "MOVE" MOV EODW13,R1 ;TERM'S "RTE" INDEX MUL #OUTRTV+2,R1 ;GET TO THIS TERM'S ENTRY IN "OUT" MOV OUT+OUTRTV(R1),EODW30 ;"LAST MSG #" FOR THIS TERMINAL MOVE EODP10 ;TRANSFERS SKELETON, THEN FILLS IMAGE WITH INFO CLR  ;IF THE REQUESTED RECORD IS ILLEGAL BLOS CPSB30 ;BRANCH IF IT'S A GOOD NUMBER JMP CPSA05 ;TSK, TSK! ; CPSB30: CLRB SIMIO ;THEN, ..... MOV #MLIST,-(SP) ;AND THEN, ..... MOV NEXT,RLSECT ;STORE THE RELATIVE SECTOR ADDRESS EMT DISCIO ;READ THE NEXT MESSAGE TO SIMULATE TSTB MERR ;ERROR? BNE CPXA00 ;IF YES - THEN BRANCH AND FORGET THE WHOV OUT+OUTRTV(R1),EODW30 ;"LAST MSG #" FOR THIS TERMINAL MOVE EODP10 ;TRANSFERS SKELETON, THEN FILLS IMAGE WITH INFO CLR EODW26 ;INT COUNT OF NULL MSG #'S REPORTED MOV R0,(SP) ;RETURN WITH R0 POINTING TO NEXT DST JSR R5,RESREG MOV (SP)+,(SP) ;POP STACKED INDEX RTS PC .PAGE ;THIS PATH IS TAKEN IF ANY OF THE "FORM" TYPE MESSAGE CALLS FINDS THE ;MESSAGE BUFFERS ALL TAKEN (A, HOPEFULLY,  EODW26 ;INT COUNT OF NULL MSG #'S REPORTED MOV R0,(SP) ;RETURN WITH R0 POINTING TO NEXT DST JSR R5,RESREG MOV (SP)+,(SP) ;POP STACKED INDEX RTS PC .PAGE ;THIS PATH IS TAKEN IF ANY OF THE "FORM" TYPE MESSAGE CALLS FINDS THE ;MESSAGE BUFFERS ALL TAKEN (A, HOPEFULLY, UNLIKELY SITUATION). ;WHAT WE DO IS SUSPEND THE TASK FOR 5 SECONDS OR SO, THEN RETURN TO THE ;"CALLER" AND TRY THE "FORM" AGAIN. I SAY "CALLER" INLE THING ;* ;* SET UP SEQUENCE NUMBER, ETC., THEN BEGIN SIMULATING THE DC11/CP ;* COMMUNICATIONS ;* CPSC00: JSR PC,FIND ;GET INDEX INTO MSGNO TABLE FOR THIS TERMINAL MOV #SIMBUF,R0 ;LOAD SIMULATED MESSAGE BUFFER ADDRESS MOVB (R5)+,21.(R0) ;STORE MOVB (R5)+,22.(R0) ; SEQUENCE MOVB (R5)+,23.(R0) ; NUMBER BIT #TERMS,@#SWITCH ;DON'T STORE TERMINAL CODE BEQ CPSC10 ;IF ONLYUNLIKELY SITUATION). ;WHAT WE DO IS SUSPEND THE TASK FOR 5 SECONDS OR SO, THEN RETURN TO THE ;"CALLER" AND TRY THE "FORM" AGAIN. I SAY "CALLER" INQUOTES BECAUSE ;THE LINK TO HERE IS VIA A JUMP. CLEVERLY,THOUGH, THE RETURN ADDRESS ;HAS ALREADY BEEN STORED IN [EODW25] IN ANTICIPATION OF THE HAPPENSTANCE ;THIS SEQUENCE HAS INFINITE LOOP POTENTIAL, IN THE EVENT THAT THE ;MESSAGE BUFFERS NEVER BECOME AVAILABLE. SO WATCH IT! EODR10: ;AS IT IS WRITTEN ABOVE MOV R5,-(SP) QUOTES BECAUSE ;THE LINK TO HERE IS VIA A JUMP. CLEVERLY,THOUGH, THE RETURN ADDRESS ;HAS ALREADY BEEN STORED IN [EODW25] IN ANTICIPATION OF THE HAPPENSTANCE ;THIS SEQUENCE HAS INFINITE LOOP POTENTIAL, IN THE EVENT THAT THE ;MESSAGE BUFFERS NEVER BECOME AVAILABLE. SO WATCH IT! EODR10: ;AS IT IS WRITTEN ABOVE MOV R5,-(SP) ;SAVE R5 01.27.73 MOV #5,R5 ;SET UP MAXIMUM DELAY LOOP COUNTER 01.27.73 ;  ONE TERMINAL IS BEING SIMULATED MOV TERM,R1 ;OTHERWISE,..... TST (R1)+ ;BYPASS THE ADDRESS OF THE NEXT TERMINAL TO USE MOVB (R1)+,3(R0) ;STORE MOVB (R1)+,4(R0) ; THE MOVB (R1)+,5(R0) ; TERMINAL MOVB (R1)+,6(R0) ; IDENTIFICATION MOVB (R1)+,7(R0) ; NUMBER ; CPSC05: BIT #100,RCSR ;IS THE RECEIVE INTERRUPT ENABLED? BNE CPSC10  ;SAVE R5 01.27.73 MOV #5,R5 ;SET UP MAXIMUM DELAY LOOP COUNTER 01.27.73 ; 01.27.73 EODR11: 01.27.73 MOV #EODX34,-(SP) ;PREPARE TO SUSPEND MOV #5,-(SP) ;5 SECONDS EMT QTIME ;SUSPEND TASK TST (SP)+ BEQ 2$ ;WE ARE BACK, WI 01.27.73 EODR11: 01.27.73 MOV #EODX34,-(SP) ;PREPARE TO SUSPEND MOV #5,-(SP) ;5 SECONDS EMT QTIME ;SUSPEND TASK TST (SP)+ BEQ 2$ ;WE ARE BACK, WITH NO PROBLEMS MOV #4000,R0 ;IT DIDN'T TAKE IT (I REALLY DON'T NEED SOB R0,. ;ALL THIS AGGRAVATION. LOOK AT ME CR ;BRANCH IF YES - WE CAN START MOV #TIMER1,-(SP) ;OTHERWISE,DELAY MOV #-30.,-(SP) ; 500 MS EMT QTIME ; AND TST (SP)+ ; TRY IT BR CPSC05 ; AGAIN. ; CPSC10: BIC #1,XCSR ;CLEAR THE 'REQUEST-TO-SEND' STATUS BIT MOV #120000,RCSR ;SET 'RING' STATUS JSR PC,INPUT ;SIMULATE INPUT INTERRUPT ; CPSC15: MOV #TIMERTH NO PROBLEMS MOV #4000,R0 ;IT DIDN'T TAKE IT (I REALLY DON'T NEED SOB R0,. ;ALL THIS AGGRAVATION. LOOK AT ME CRYING (SOB) SOB R5,EODR11 ;ATTEMPT 5 TIMES 01.27.73 DEBUG ;THEN, GIVE UP 01.27.73 ; 01.27.73 2$: 01.27.73 MOV (SP)YING (SOB) SOB R5,EODR11 ;ATTEMPT 5 TIMES 01.27.73 DEBUG ;THEN, GIVE UP 01.27.73 ; 01.27.73 2$: 01.27.73 MOV (SP)+,R5 ;RESTORE R5 01.27.73 JMP @EODW25 ;AND RETURN TO THE CALLER 01.27.73 1,-(SP) ;SUSPEND EXECUTION FOR 500 MS MOV #30.,-(SP) ;WHILE THE ASYNC DIRECTOR DOES ITS THING EMT QTIME ; TST (SP)+ ;POP OFF ERROR PARAMETER BIT #100,RCSR ;IS THE INPUT INTERRUPT ENABLED? BNE CPSC20 ;BRANCH IF YES, WE CAN PROCEED BIT #200,@#SWITCH ;CAN'T PROCEED YET (DIRECTOR HASN'T ;PROCESSED THE RING YET). BEQ CPSC15 ;BRANCH +,R5 ;RESTORE R5 01.27.73 JMP @EODW25 ;AND RETURN TO THE CALLER 01.27.73 2$: MOV EODW25,PC ;RETURN TO TRY AGAIN .PAGE SAVREG: .IRP X,<4,3,2,1,0> ;SAVE REGISTERS ON STACK: JSR R5,SAVREG MOV R'X,-(SP) .ENDM JMP (R5) RESREG: TST (SP)+ ;CURRENT VALUE OF R5 NOT RELEVANT .IRP X,<0,1,2,3,4> ;POP STACK INTO REGS: JSR R5,RESREG MOV (SP) .PAGE SAVREG: .IRP X,<4,3,2,1,0> ;SAVE REGISTERS ON STACK: JSR R5,SAVREG MOV R'X,-(SP) .ENDM JMP (R5) RESREG: TST (SP)+ ;CURRENT VALUE OF R5 NOT RELEVANT .IRP X,<0,1,2,3,4> ;POP STACK INTO REGS: JSR R5,RESREG MOV (SP)+,R'X .ENDM RTS R5 .PAGE 01.27.73 ;***********************************************************************01.27.BACK TO WAIT SOME MORE JMP CPSA05 ;CAN'T WIN 'EM ALL. OPERATOR WANTS US TO EXIT ; CPSC20: BIC #120000,RCSR ;CLEAR RING STATUS MOVB (R0),R1 ;GET THE NEXT CHARACTER CMP R1,#STX ;IS IT STX? BEQ CPSC30 ;BRANCH IF YES CMP R1,#ETX ;HOW ABOUT AN ETX? BEQ CPSC60 ;BRANCH IF YES BR CPSC50 ;MUST BE GOOD DATA ; CPSC30: BIT #STXER+,R'X .ENDM RTS R5 .PAGE 01.27.73 ;***********************************************************************01.27.73 ;* **01.27.73 ;* A D J U S T **01.27.73 ;* **01.27.73 ;* THIS SUBROUTINE CHECKS THE TIME/DAY ON THE STACK73 ;* **01.27.73 ;* A D J U S T **01.27.73 ;* **01.27.73 ;* THIS SUBROUTINE CHECKS THE TIME/DAY ON THE STACK AND CORRECTS **01.27.73 ;* THE VALUES IS ANY ARE BEYOND THEIR ALLOWABLE MAXIMUMS. **01.27.73 ;* FOR EXAMPLE, IF MINUTES = 75, THEN 60 IS SUBTRACTED FROM THE **01.27.73 ;* MINUTER,@#SWITCH;STX - SHOULD WE SIMULATE A BAD STX? BEQ CPSC50 ;BRANCH IF NO - LEAVE IT AS IT IS ; CPSC40: DEC R1 ;SET CHARACTER FAULTY ; CPSC50: MOVB R1,RBUF ;STORE CHARACTER IN RECEIVE DATA BUFFER BIC #100000,RCSR ;CLEAR ERROR BIT BIS #200,RCSR ;SET 'DONE' STATUS IN RCSR JSR PC,INPUT ;SIMULATE INPUT INTERRUPT CMPB (R0)+,#DEL ;IF THIS IS THE LAST CHARACTER OF  AND CORRECTS **01.27.73 ;* THE VALUES IS ANY ARE BEYOND THEIR ALLOWABLE MAXIMUMS. **01.27.73 ;* FOR EXAMPLE, IF MINUTES = 75, THEN 60 IS SUBTRACTED FROM THE **01.27.73 ;* MINUTES VALUE (LEAVING 15), THE HOUR IS INCREMENTED AND **01.27.73 ;* COMPARED TO ITS MAXIMUM VALUE. THIS LOGIC EXTENDS UP TO **01.27.73 ;* AND INCLUDING THE YEAR. **01.27.73 ;* **01S VALUE (LEAVING 15), THE HOUR IS INCREMENTED AND **01.27.73 ;* COMPARED TO ITS MAXIMUM VALUE. THIS LOGIC EXTENDS UP TO **01.27.73 ;* AND INCLUDING THE YEAR. **01.27.73 ;* **01.27.73 ;* THE LINKAGE TO SUBROUTINE ADJUST IS: **01.27.73 ;* **01.27.73 ;* MOV MINUTE,-(SP) THE MESSAGE, BEQ CPSD00 ;THEN GO TO THE END PROCESSING LOGIC BIT #DROPPD,@#SWITCH;SHOULD WE SIMULATE A DROPPED LINE? BEQ CPSC20 ;BRANCH IF NO CMP R0,#SIMBUF+50. ;YES - ARE WE FAR ENOUGH ALONG IN THE TRANSMSN? BNE CPSC20 ;NO - BRANCH JSR PC,REQSND ;AFTER TWO SECONDS, ASYNC WILL MISS THE ;THE INPUT INTERRUPT. IT WILL THEN ISSUE A .27.73 ;* THE LINKAGE TO SUBROUTINE ADJUST IS: **01.27.73 ;* **01.27.73 ;* MOV MINUTE,-(SP) **01.27.73 ;* MOV HOUR,-(SP) **01.27.73 ;* MOV DAY,-(SP) **01.27.73 ;* JSR PC,ADJUST **01.27.73 ;*  **01.27.73 ;* MOV HOUR,-(SP) **01.27.73 ;* MOV DAY,-(SP) **01.27.73 ;* JSR PC,ADJUST **01.27.73 ;* **01.27.73 ;* CORRECTED VALUES ARE LEFT ON THE STACK. IN ADDITION, THE **01.27.73 ;* DAY/HOUR/MINUTE VALUES ARE PACKED IN THE S ;'REQUEST-TO-SEND' SO THAT IT CAN SEND A NAK. ;WHEN WE SENSE THE 'REQUEST-TO-SEND', WE'LL ;SIMULATE A 'CLEAR-TO-SEND' INTERRUPT. MOV #6,R0 ;THEN SET UP FOR A 24 SECOND DELAY ; CPSC55: MOV #TIMER1,-(SP) ;YES - SUSPEND EXECUTION MOV #240.,-(SP) ; FOR EMT QTIME ; 4 SECONDS TST (SP)+ ;POP OFF ERROR PARAMETER SOB R0,CPS **01.27.73 ;* CORRECTED VALUES ARE LEFT ON THE STACK. IN ADDITION, THE **01.27.73 ;* DAY/HOUR/MINUTE VALUES ARE PACKED IN THE SCHEDULER FORMAT **01.27.73 ;* AND PUSHED ONTO THE STACK. STACK CLEANUP WOULD THEN **01.27.73 ;* CONSIST OF: **01.27.73 ;* **01.27.73 ;* MOV (SP)+,PACKEDCHEDULER FORMAT **01.27.73 ;* AND PUSHED ONTO THE STACK. STACK CLEANUP WOULD THEN **01.27.73 ;* CONSIST OF: **01.27.73 ;* **01.27.73 ;* MOV (SP)+,PACKED ;GET PACKED FORMAT FOR SCHEDULER **01.27.73 ;* MOV (SP)+,DAY ;ADJUSTED DAY **01.27.73 ;* MOV (SP)+,HOUR ;ADJUSTED HOUR C55 ;AND DO IT 6 TIMES = 24 SECONDS TOTAL DELAY JMP CPSB20 ;THEN GO START ALL OVER AGAIN ; CPSC60: ;CURRENT CHARACTER IS ETX - CLRB 1(R0) ;CLEAR BCC VALUES (ZERO MEANS NO ERROR CLRB 2(R0) ;TO THE ASYNC HANDLER BIT #BCCERR,@#SWITCH;SHOULD WE SIMULATE A BCC ERR? BEQ CPSC70 ;BRANCH IF NO MOVB #1,1(R0) ;YES - STORE BAD BCC MOVB  ;GET PACKED FORMAT FOR SCHEDULER **01.27.73 ;* MOV (SP)+,DAY ;ADJUSTED DAY **01.27.73 ;* MOV (SP)+,HOUR ;ADJUSTED HOUR **01.27.73 ;* MOV (SP)+,MINUTE ;ADJUSTED MINUTES **01.27.73 ;* **01.27.73 ;* THIS SUBROUTINE USES THE CURRENT MONTH, AS STORED IN THE **01.27.73 ;* VARIABLE EODW17. REGISTERS ARE SAVED. **01.27.73 ;* MOV (SP)+,MINUTE ;ADJUSTED MINUTES **01.27.73 ;* **01.27.73 ;* THIS SUBROUTINE USES THE CURRENT MONTH, AS STORED IN THE **01.27.73 ;* VARIABLE EODW17. REGISTERS ARE SAVED. **01.27.73 ;* **01.31.73 ;***********************************************************************01.31.73 ; #1,2(R0) ; ; CPSC70: BIT #ETXERR,@#SWITCH;SHOULD WE SIMULATE AN ETX ERROR? BEQ CPSC50 ;NO BR CPSC40 ;YES ; CPXA00: JMP CPSA00 ;INTERMEDIATE LINKAGE TO CPSA00 .PAGE ;*********************************************************************** ;* ;* ;* THE COMPLETE INPUT MESSAGE HAS BEEN SIMULATED. NOW WE WAIT ;* FOR ACK/NAK, THEN RESPOND ACCORDINGLY. ;* ;* CPSD00: CLR AC **01.27.73 ; 01.27.73 ADJUST: 01.27.73 MOV R1,-(SP) ;SAVE REGISTERS 01.27.73 MOV R0,-(SP) ; R0 AND R1 01.27.73 CMP 10.(SP),#60. ;ARE MINUTES >= 60? 01.27.73 BLT ADJA00 ;BRANCH IF YES - THEY'RE OK  01.27.73 ADJUST: 01.27.73 MOV R1,-(SP) ;SAVE REGISTERS 01.27.73 MOV R0,-(SP) ; R0 AND R1 01.27.73 CMP 10.(SP),#60. ;ARE MINUTES >= 60? 01.27.73 BLT ADJA00 ;BRANCH IF YES - THEY'RE OK 01.27.73 SUB #60.,1KFLG ;CLEAR 'ACK/NAK RECEIVED' FLAGS CLR ENDFLG ; JSR PC,REQSND ;WAIT FOR 'REQUEST-TOSEND' STATUS, THEN ;SIMULATE A 'CLEAR-TO-SEND' INTERRUPT MOV #40.,R0 ;SET UP 20-SECOND LOOP COUNTER ; CPSD05: DEC R0 ;DECREMENT 20 SECOND COUNTER BGT CPSD07 ;BRANCH IF WE STILL HAVE TIME JMP CPSB20 ;OOPS, TIME'S UP. ASYNC PROBABLY DISCONNECT 01.27.73 SUB #60.,10.(SP) ;ADJUST MINUTES 01.27.73 INC 8.(SP) ;AND INCREMENT THE HOUR COUNTER 01.27.73 ; 01.27.73 ADJA00: 01.27.73 CMP 8.(SP),#24. ;HAVE WE EXCEEDED ONE DAY? 01.27.73 BLT ADJA10 ;BRANCH IF WE HAVEN'T 01.27.73 0.(SP) ;ADJUST MINUTES 01.27.73 INC 8.(SP) ;AND INCREMENT THE HOUR COUNTER 01.27.73 ; 01.27.73 ADJA00: 01.27.73 CMP 8.(SP),#24. ;HAVE WE EXCEEDED ONE DAY? 01.27.73 BLT ADJA10 ;BRANCH IF WE HAVEN'T 01.27.73 CLR 8.(SP) ;YES WE ED ; CPSD07: MOV #TIMER1,-(SP) ;SUSPEND MOV #30.,-(SP) ; EXECUTION EMT QTIME ; FOR 500 MS TST (SP)+ ;POP OFF ERROR PARAMETER TST NAKFLG ;WAS A NAK RECEIVED? BEQ CPSD10 ;BRANCH IF NO CLR NAKFLG ;OTHERWISE, CLEAR THE FLAG MOV #SIMBUF,R0 ;RESET TO BEGINNING OF BUFFER BR CPSC20 ;AND GO REPEAT ; CPSD10:  CLR 8.(SP) ;YES WE HAVE, SO RESET HOURS 01.27.73 INC 6.(SP) ;AND INCREMENT THE DAY COUNTER 01.27.73 ; 01.27.73 ADJA10: 01.27.73 MOV EODW17,R0 ;GET THE CURRENT MONTH. WE NEED IT IN 01.27.73 CMPB 6.(SP),EODCAL-2(R0) ;ORDER TO DETERMINE IF THE 01.27.73 HAVE, SO RESET HOURS 01.27.73 INC 6.(SP) ;AND INCREMENT THE DAY COUNTER 01.27.73 ; 01.27.73 ADJA10: 01.27.73 MOV EODW17,R0 ;GET THE CURRENT MONTH. WE NEED IT IN 01.27.73 CMPB 6.(SP),EODCAL-1(R0) ;ORDER TO DETERMINE IF THE 01.31.73 ;DAYS COUNTER HAS TST ACKFLG ;WAS AN ACK RECEIVED? BEQ CPSD05 ;NOPE - HANG IN THERE, BABY! BIC #1,XCSR ;CLEAR 'REQUEST-TO-SEND' STATUS BIT MOV #TIMER1,-(SP) ;NOW WE HAVE TO WAIT FOR ABOUT 500 MS MOV #30.,-(SP) ; EMT QTIME ; TST (SP)+ ;POP OFF ERROR PARAMETER BIS #200,RCSR ;YES - SET 'DONE' BIT IN RECEIVE STATUS REGISTER MOVB #EOT,RBUF ;STORE AN EOT  ;DAYS COUNTER HAS GONE INTO 01.27.73 ;THE NEXT MONTH. 01.27.73 BLE ADJB00 ;BRANCH IF WE'RE OK 01.27.73 MOV #1,6.(SP) ;RESET TO THE FIRST OF THE MONTH 01.27.73 ;* 01.27.73 ;* 01.27.73 ;* NOW WE HAVE TO PACK THE DATEGONE INTO 01.27.73 ;THE NEXT MONTH. 01.27.73 BLE ADJB00 ;BRANCH IF WE'RE OK 01.27.73 MOV #1,6.(SP) ;RESET TO THE FIRST OF THE MONTH 01.27.73 ;* 01.27.73 ;* 01.27.73 ;* NOW WE HAVE TO PACK THE DATE/TIME INTO THE SCHEDULER FORMAT 01.2IN RECEIVE BUFFER ; CPSD15: JSR PC,INPUT ;SIMULATE INPUT INTERRUPT BIS #200,RCSR ;SET 'DONE' BIT MOVB #DEL,RBUF ;STORE 'DEL' CHARACTER JSR PC,INPUT ;AND SIMULATE ANOTHER INPUT INTERRUPT JSR PC,REQSND ;WAIT FOR 'REQUEST-TO-SEND' STATUS BIT, THEN ;SIMULATE 'CLEAR-TO-SEND' INTERRUPT ; CPSD20: MOV #60.,R0 ;SET UP 30 SECOND COUNTER ; CPSD25: /TIME INTO THE SCHEDULER FORMAT 01.27.73 ;* 01.27.73 ;* 01.27.73 ADJB00: 01.27.73 MOVB 6.(SP),R0 ;GET THE DAY COUNTER 01.27.73 SWAB R0 ;SHIFT IT 01.27.73 ROL R0 ; INTO 7.73 ;* 01.27.73 ;* 01.27.73 ADJB00: 01.27.73 MOVB 6.(SP),R0 ;GET THE DAY COUNTER 01.27.73 SWAB R0 ;SHIFT IT 01.27.73 ROL R0 ; INTO 01.27.73 ROL  DEC R0 ;DECREMENT 30 SECOND COUNTER BLE CPSD35 ;AND BRANCH IF NO MESSAGE FROM ASYNC IN 30 SEC BIT #STOP,@#SWITCH ;SEE IF THE OPERATOR WANTS US TO GIVE UP BEQ CPSD30 ;BRANCH IF NO JMP CPSA05 ;OTHERWISE, GO EXIT ; CPSD30: MOV #TIMER1,-(SP) ;NOW, SUSPEND MOV #30.,-(SP) ; EXECUTION EMT QTIME ; FOR 500 MS TST (SP)+ ;POP 01.27.73 ROL R0 ; POSITION 01.27.73 MOV 8.(SP),R1 ;GET THE HOUR COUNTER 01.27.73 SWAB R1 ;AND SHIFT 01.27.73 ASR R1 ; IT INTO 01.27.73 ASR R1 ; POSITION 01.27.73 BIS R1,R0 ;'OR' IT INTO THE DAY  R0 ; POSITION 01.27.73 ROL R0 ; 01.31.73 MOV 8.(SP),R1 ;GET THE HOUR COUNTER 01.27.73 SWAB R1 ;AND SHIFT 01.27.73 ASR R1 ; IT INTO 01.27.73 ASR R1 ; POSITION 01.27.73 BIS R1,R0  OFF ERROR PARAMETER TST ENDFLG ;END OF TRANSMISSION TO CP? BEQ CPSD25 ;NO - GO WAIT SOME MORE CLR ENDFLG ; BIT #NAKSIM,@#SWITCH;YES - SHOULD WE SIMULATE A NAK TO ASYNC HANDLER BNE CPSE00 ;BRANCH IF YES MOVB #ACK,RBUF ;OTHERWISE, SEND BIS #200,RCSR ;AN ACK TO THE HANDLER JSR PC,INPUT ;SIMULATE INPUT INTERRUPT MOVB #DEL,RBUF ;THE01.27.73 BIS 10.(SP),R0 ;'OR' IN THE MINUTES 01.27.73 MOV 2(SP),R1 ;RESTORE R1 01.27.73 MOV 4(SP),2(SP) ;MOVE RETURN PC UP ONE NOTHCH ON STACK 01.27.73 MOV R0,4(SP) ;THEN SOTRE PACKED TIME ON STACK 01.27.73 MOV (SP)+,R0 ;RESTORE R0 01.27.73 RTS PC ;AND RETURN TO CALLER 01.27.73  ;'OR' IT INTO THE DAY 01.27.73 BIS 10.(SP),R0 ;'OR' IN THE MINUTES 01.27.73 MOV 2(SP),R1 ;RESTORE R1 01.27.73 MOV 4(SP),2(SP) ;MOVE RETURN PC UP ONE NOTHCH ON STACK 01.27.73 MOV R0,4(SP) ;THEN SOTRE PACKED TIME ON STACK 01.27.73 MOV (SP)+,R0 ;RESTORE R0 01.27.73 RTS PC ;AND RETURN TO CN SEND BIS #200,RCSR ; A 'DEL' CHARACTER JSR PC,INPUT ; SIMULATE INPUT INTERRUPT ; ; CPSD35: BIT #TERMS,@#SWITCH ;SHOULD WE SIMULATE 2 TERMINALS? BEQ CPSD40 ;BRANCH IF NO (ONLY ONE TERMINAL) MOV @TERM,TERM ;YES - FLIP TERMINAL POINTER COM NTERM ;INCREMENT TERMINAL COUNTER BNE CPSD50 ; ; CPSD40: JSR PC,FIND .PAGE .SBTTL LISTS, SKELETONS, ETC. .LIST ME ; REQUEST LISTS ; EODV10: MSPLST QUEODR ; MESSAGE CONTROL LIST MESGM EODV20: FLPLST TRM,EODW13 ; TRM FILE CONTROL LIST (TERMINAL DESCRIPTOR) FILGM EODV30: FLPLST NMN,EODW13 ; NMN FILE CONTROL LIST (NULL MSG NO) ; ; DATA AREA ; EODX10: TNKFID ; TANK GAUGE FORMAT ID EODX11: INTID ; INTERCEPT ID EODX12: DCRTE ; DATACEALLER 01.27.73 .PAGE .SBTTL LISTS, SKELETONS, ETC. .LIST ME ; REQUEST LISTS ; EODV10: MSPLST QUEODR ; MESSAGE CONTROL LIST MESGM EODV20: FLPLST TRM,EODW13 ; TRM FILE CONTROL LIST (TERMINAL DESCRIPTOR) FILGM EODV30: FLPLST NMN,EODW13 ; NMN FILE CONTROL LIST (NULL MSG NO) ; ; DATA AREA ; EODX10: TNKFID ; TANK GAUGE FORMAT ID EODX11: INTID ; INTERCEPT ID ;FIND THE POSITION OF THIS TERMINAL'S SEQUENCE ;NUMBER IN THE MSGNO TABLE INCB 2(R5) ;INCREMENT CMPB 2(R5),#': ; THE BLO CPSD50 ; MESSAGE MOVB #'0,2(R5) ; SEQUENCE INCB 1(R5) ; NUMBER CMPB 1(R5),#': ; (ADDITION CMPB SEQNO+1,#': ; (ADDITION BLO CPSD50 ; DONE NTER ROUTING CODE EODX13: DCMANA ; MANUAL TRANSACTION TO DC ;CURRENT TIME: EODW10: .WORD 0 ; HOUR EODW11: .WORD 0 ; MIN EODW12: .WORD 0 ; HOUR+MIN EODW13: .WORD 0 ; TERMINAL INDEX FOR USE AS FILE LOC EODW14: .WORD 0 ; TERMINAL EOD TIME EODW15: .WORD 0 ; CURRENT YEAR EODW16: .WORD 0 ; DAY EODW17: .WORD 0 ; MONTH EODW EODX12: DCRTE ; DATACENTER ROUTING CODE EODX13: DCMANA ; MANUAL TRANSACTION TO DC .EVEN 01.31.73 ;CURRENT TIME: EODW10: .WORD 0 ; HOUR EODW11: .WORD 0 ; MIN EODW12: .WORD 0 ; HOUR+MIN EODW13: .WORD 0 ; TERMINAL INDEX FOR USE AS FILE LOC EODW14: .WORD 0 ; TERMINAL EOD TIME EODW15: .W MOVB #'0,1(R5) ; IN INCB (R5) ; ASCII CMPB (R5),#': ; BLO CPSD50 ; MOVB #'0,(R5) ; ; CPSD50: MOVB #1,CTLIO ;NOW WRITE OUT THE CONTROL SECTOR WITH MOV #CLIST,-(SP) ;THE UPDATED SEQUENCE NUMBER EMT DISCIO ; TSTB CERR ;CHECK FOR DISC ERROR BEQ CPSD55 ;BRANCH IF 'OK' JM18: .WORD 0 ; JULIAN DAY EODW19: .WORD 0 ; EOD SERVICED FLAG ; ; = 0 IF NO TERML HAD EOD ON SCAN EODW20: .WORD 0 ; TERMINAL EOD DATE (JULIAN) EODW21: .WORD 0 ; ADDR OF RTE ENTRY EODW22: .WORD 0 ; ADDR OF QUE TABLE ENTRY EODW23: .WORD 0 ; ADDR OF LAST SEQ NO EODW24: .WORD 0 ; # OF DAYS IN CURRENT YEAR EODW25: .WORD 0 ; TEMPORARY EODW ORD 0 ; CURRENT YEAR EODW16: .WORD 0 ; DAY EODW17: .WORD 0 ; MONTH EODW18: .WORD 0 ; JULIAN DAY EODW19: .WORD 0 ; EOD SERVICED FLAG ; ; = 0 IF NO TERML HAD EOD ON SCAN EODW20: .WORD 0 ; TERMINAL EOD DATE (JULIAN) EODW21: .WORD 0 ; ADDR OF RTE ENTRY EODW22: .WORD 0 ; ADDR OF QUE TABLE ENTRY EODW23: .WORD 0 ; ADDR OF LA P CPSA00 ;OTHERWISE, GO PRINT ERROR MESSAGE ; CPSD55: BIT #PAUSE,@#SWITCH ;SHOULD WE PAUSE BEFORE GOING TO ;THE NEXT MESSAGE? BEQ CPSD60 ;BRANCH IF NO MOV #TIMER1,-(SP) ;OTHERWISE, MOV #60.,-(SP) ; SUSPEND EXECUTION EMT QTIME ; FOR 1 SECOND TST (SP)+ ;POP OFF ERROR PARAMETER BR CPSD50 ;THEN SEE IF WE SHOULD STILL W 26: .WORD 0 ; TEMPORARY EODW27: .WORD 0 ; TEMPORARY EODW28: .WORD 0 ; TEMPORARY EODW29: .WORD 0 ; TEMPORARY EODW30: .WORD 0 ; TEMPORARY EODW31: .WORD 0 ; TEMPORARY EODW32: .WORD 0 ;FLAG TO EXIT AFTER MSG QUEUE IS EMPTY ERRORX: .WORD 0 ;ERROR NUMBER .PAGE EODCAL: ;CALENDAR .BYTE 31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31. EODX21 ST SEQ NO EODW24: .WORD 0 ; # OF DAYS IN CURRENT YEAR EODW25: .WORD 0 ; TEMPORARY EODW26: .WORD 0 ; TEMPORARY EODW27: .WORD 0 ; TEMPORARY EODW28: .WORD 0 ; TEMPORARY EODW29: .WORD 0 ; TEMPORARY EODW30: .WORD 0 ; TEMPORARY EODW31: .WORD 0 ; TEMPORARY EODW32: .WORD 0 ;FLAG TO EXIT AFTER MSG QUEUE IS EMPTY ERRORX: .WORD 0 ;ERROR NUMAIT ; CPSD60: MOV #TIMER1,-(SP) ;NOW, WE'LL DELAY FOR FIVE SECONDS MOV #255.,-(SP) ; EMT QTIME ; TST (SP)+ ; ADD #3,NEXT ;INCREMENT TO NEXT MESSAGE CMP NEXT,NMESGE ;ALL PROCESSED? BGE CPXB15 ;YES - RESTART WITH FIRST ; CPSD70: JMP CPSB20 ;NO - CONTINUE WITH NEXT MESSAGE ; CPXB15: JMP CPSB15 ;INTERMEDIATE LINK ND.E . ....EAARH TCPA....;. . 50.+.= R LEAL CTON URET;R PC S RT T UPRRTEIN' NDSEO--TARLE'CA E ATULIM SOW;N T PUUT,OPC R JS EDSUISN EE BAS HD'EN-STOT-ESQURE;' HE TERFT AD'EN-STOR-EACL ' AVEGIO ;T + P)(S T TS L. AT. E11DCE THS KETAT INGLOW HOT OUABS ;I E IMQT T EM S HI T. ERNGLOS M00 1UTBO AITWAO ;T P)(S,-#6 V MO EDNEE WOW NT,SES I: .ASCII /01/ ; OP CODE 01 - OPEN EODX22: .ASCII /05/ ; OP CODE 05 - CLOSE MONTH EODX23: .ASCII /07/ ; OP CODE 07 - CLOSE DAY EODX24: .ASCII /00/ ; OP CODE 00 - NULL SEQ NO. ; ; TIME DELAY SKELETON FOR 30-SECOND WAIT... EODX30: .WORD 1 .BYTE TSEODR ;...THEN RE-QUEUE TASK .BYTE RES5 .WORD 0 EODX32: EODX34: ;TIME DELAY MODULE FOR WAITING FOR BUFFER .WORD 1 .BYTE BER .PAGE EODCAL: ;CALENDAR .BYTE 31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31. EODX21: .ASCII /01/ ; OP CODE 01 - OPEN EODX22: .ASCII /05/ ; OP CODE 05 - CLOSE MONTH EODX23: .ASCII /07/ ; OP CODE 07 - CLOSE DAY EODX24: .ASCII /00/ ; OP CODE 00 - NULL SEQ NO. ; ; TIME DELAY SKELETON FOR 30-SECOND WAIT... EODX30: .WORD 1 .BYTE TSEODR ;...THEN RE-QUEUE TASK .BYTE RES5 AGE TO CPSB15 ;* ;* SIMULATE AN NAK FROM THE CP TO THE ASYNC HANDLER (WE'LL MAKE ;* THE HANDLER DO IT ALL OVER AGAIN). ;* CPSE00: BIC #1,XCSR ;CLEAR 'REQUEST-TO-SEND' STATUS MOVB #NAK,RBUF ;PUT 'NAK' IN RECEIVE BUFFER BIS #200,RCSR ;SET 'DONE' BIT JMP CPSD15: ;GO ELSEWHERE TO: ; 1. SIMULATE NAK INTERRUPT ; 2. SEND 'DEL' CHARACTER D'EN-STOT-ESQURE;' ) SP-(1,ERIM#T V MO : 20QARE ; T SES ID'EN-STOT-ESQURE 'IFE SEO ;G 00QARE BR ERETAMAR PORRR EFF OOP;P + P)(S T TS S M00 5OR F ; E IMQT T EM ONTICUXE E; P)(S,-0.#3 V MO NDPEUS;S ) SP-(1,ERIM#T V MO : 10QARE ; STUEEQ RXTNES ESOCPRO GND;A 20SBCP P JM CKTA SOMFRC PRNTURER EACL, AD BOO;T + P)(S T TS D SEAPELT NOS HAE IM TUMIMAX MIF 0 .BYTE 200+RES5 .WORD 0 ; EODX40: .ASCII "FIRST" .ASCII "LAST " EODX50: ;IMAGE OF SCHEDULER MODULE .WORD 1 .BYTE TASKNO .BYTE 200 ;USE REPEAT FEATURE EODX51: .WORD 0 ;WILL BE INITIALIZED TO QUARTER-HOUR .WORD 15. ;REPEAT EVERY QUARTER HOUR EODX60: ;SAVE BUFFER FOR NULL MESSAGE # TABLE IMAGE .BLKB FILAT-FILGL .PAGE EODOFM: ;OPEN FOLIO MESSAGE SK .WORD 0 EODX32: EODX34: ;TIME DELAY MODULE FOR WAITING FOR BUFFER .WORD 1 .BYTE 0 .BYTE 200+RES5 .WORD 0 ; EODX40: .ASCII "FIRST" .ASCII "LAST " EODX50: ;IMAGE OF SCHEDULER MODULE .WORD 1 .BYTE TASKNO .BYTE 200 ;USE REPEAT FEATURE EODX51: .WORD 0 ;WILL BE INITIALIZED TO QUARTER-HOUR .WORD 15. ;REPEAT EVERY QUARTER HOUR EODX60: ;SAVE BU ; 3. WAIT FOR 'REQUEST-TO-SEND' ; 4. SIMULATE 'CLEAR-TO-SEND' ; 5. THEN WAIT FOR NEW MESSAGE FROM ; ASYNC HANDLER .PAGE ;*********************************************************************** ;* ** ;* S I M O U T H NCRA;B 10QARE T BG R TEUNCOD ONEC S 4NTMEREEC;D R0 C DE ES YIFH NCRA;B 20QARE E BN T?SET BI' NDSEO--TSTUEEQ'RS ;I R CS,X#1 T BI : 00QARE ; R TEUNCOP OO LNDCOSE4-D OA;L 0 ,R0.#4 V MO : NDQSRE ;* ;* . K)AS TXTNEE THS ESOCPRO (T ;* 20SBCPO TTSXI ENDQSREN HE TS,NDCOSE4 N HIIT WEDIVCERET N'IS ;* D'EN-STOT-ESQURE 'IF D.TELAMUSIS IPTRUERNT ID'EN-STOR-EACL ' AENTH ;* D,VEEIEC RENWHELETON ; MESSAGE SKELETON ; STDID ; HEADER HUBRTE ; DCRTE ; .ASCII /000/ ; .ASCII /0 / ; EODACT ; .BYTE EOR ; .ASCII "020" ;INPUT ID FOR OPEN, CLOSE FOLIO & NULL MSG RPT EODOF1: .ASCII " " ;TERMINAL I.D. EODOF2: .ASCII " " ;FOLIO # EODOF3: .ASCII " " ;OP CODE: 00 01 0FFER FOR NULL MESSAGE # TABLE IMAGE .BLKB FILAT-FILGL .PAGE EODOFM: ;OPEN FOLIO MESSAGE SKELETON ; MESSAGE SKELETON ; STDID ; HEADER HUBRTE ; DCRTE ; .ASCII /000/ ; .ASCII /0 / ; EODACT ; .BYTE EOR ; .ASCII "020" ;INPUT ID FOR OPEN, CLOSE FOLIO & NULL MSG RPT EODOF1: .ASCII "  ** ;* ** ;* THIS SUBROUTINE IS CALLED BY THE ASYNC HANDLER WHEN IT HAS ** ;* STORE AN OUTPUT CHARACTER IN XBUF. THIS ROUTINE PRINTS ** ;* THE CHARACTER ON THE TELETYPE, THEN SIMULATES THE OUTPUT ** ;* INTERRUPT ** ;* ** ;***********************************************************. USATST' NDSEO--TSTUEEQ'RA R FOS ITWAE OD CISTH ;* ;* ;* E AG.P ERLLCAO TRNTUREO ;G 20NAFI BR ONTIDION CM'OO RNO 'ET;S P)(S8. C DE R BEUM NCEENQUSE' 01'0A O TNTOI;P 5 ,RNOEQ#S V MO : 00NCFI ;* ;* R LEAL CHE TTON ORDWOE THS AS PY,TRENE THR FOM OO RNO ;* ;* ;* ITEXO ;G 20NAFI BR ' EDERNT EIDL NAMIER'TO TDECON URET RET;S P)(S8. C IN R BEUM NCEENQUSEF ONGNIINEG BTO5 RNTOI5 OR 07 EODOF4: .ASCII " " ;JULIAN DATE EODOF5: .ASCII " " ;HOUR EODOF6: .ASCII " " ;MINUTE EODOF7: .ASCII " " ;LAST MESSAGE NUMBER EODOF8 = . ;BEGIN OF FIELD 10: INDEFINITE LENGTH .EVEN ;ROUTINE DETERMINES END AND AFFIXES "ETX". EODP10: ;PACKET TO FORM I.D. 20 MESSAGE PACK MESG2,EODOFM,EODOF8-EODOFM,00 ;XFER SKELETON TO M/A PACK EODOF1-EODOFM+MESG2,FILG1+ " ;TERMINAL I.D. EODOF2: .ASCII " " ;FOLIO # EODOF3: .ASCII " " ;OP CODE: 00 01 05 OR 07 EODOF4: .ASCII " " ;JULIAN DATE EODOF5: .ASCII " " ;HOUR EODOF6: .ASCII " " ;MINUTE EODOF7: .ASCII " " ;LAST MESSAGE NUMBER EODOF8 = . ;BEGIN OF FIELD 10: INDEFINITE LENGTH .IFNE .CITGO 01.31.73 TOTALS: ;THIS IS THE S************ ; SIMOUT: MOV R1,-(SP) ;SAVE REGISTERS MOV R2,-(SP) ; MOVB XBUF,R1 ;GET THE CHARACTER, THEN MOVB LAST,R2 ;GET THE PREVIOUS CHARACTER BIC #200,XCSR ;CLEAR 'DONE' BIT IN TRANSMIT STATUS REGISTER CMPB R1,#DEL ;END OF MESSAGE? BNE SIMA30 ;BRANCH IF NO CLR LAST ;CLEAR PREVIOUS CHARACTER CMPB R2,#ACK ;IS IT;P 5 ,R#2 B SU I CIASN I1'00 ' ; 5)(R1,#' VBMO TOR BEUM N; + 5)(R+,5)(R VBMO CEENQUSEE THT SEN HE;T 5)(R0,#' VBMO ; + 5)(R+,0)(R V MO S)ERCTRAHA CVEFIT RSFI ( ; + 5)(R+,0)(R V MO E BLTAO GNMSE THO NT I ; + 5)(R+,0)(R V MO R BEUM NIDL NAMIER T ; + 5)(R+,0)(R V MO EW NHE TERNT E; + 5)(R+,0)(R V MO , OW;N R03,F+BUIM#S V MO Y TREN TRMID,EOD2L,00 ;TERMINAL I.D. PACK EODOF2-EODOFM+MESG2,FILG1+TRMFLN,EOD3L,14 ;FOLIO # .WORD EODOF3-EODOFM+MESG2 EODP11: .WORD 0 ;DYNAMIC SOURCE FOR OP-CODE .BYTE EOD4L,MVCD00 PACK EODOF4-EODOFM+MESG2,EODW18,EODOF5-EODOF4,12;JULIAN DATE PACK EODOF5-EODOFM+MESG2,EODW10,EODOF6-EODOF5,12;HOUR PACK EODOF6-EODOFM+MESG2,EODW11,EODOF7-EODOF6,12;MINUTE PACK EODOF7-EODOFM+MESG2,EODW30,EOD8L,12 ;LAST MESSAGE # !KELETON MESSAGE FOR 01.31.73 STDID ;'PRINT TOTALS' REQUEST 01.31.73 TSNDR1: .ASCII /XXXXX / 01.31.73 HUBRTE 01.31.73 .ASCII /000 0 .PB/ 01.31.73 .BYTE EOR 01.31.73 .ASCII /070/ " A SPECIAL CHARACTER? BNE SIMA10 ;BRANCH IF NOT ACK INC ACKFLG ;SET ACK RECEIVED FLAG BR SIMA35 ; SIMA10: CMPB R2,#NAK ;IS THE CHARACTER A NAK? BNE SIMA20 ;BRANCH IF NO INC NAKFLG ;YES - SET NAK RECEIVED FLAG BR SIMA35 ; ; SIMA20: INC ENDFLG ;SET END OF TRANSMIT DATA FLAG BR SIMA35 ; ; SIMA30: E BLTAW NEE THO TTSINPOW NO5 ;R 5 ,RNOSG#M D AD X DEINE ATULLCCA, SEWIERTH;O R5.,#8 L MU O NIFH NCRA;B 00NCFI E BG E?OR MNE OOR FOMROE ERTHS ;I . 15,#R5 P CM LEAB TINY ADREALS IETRENF OO. NHE TET;G 5 ,RNLRMNT V MO : 00NBFI ;* ;* ).OMROS E'ERTHF (IT IRTSEIN ;* O TVEHAL 'LWEW NOO SE,BLTAO GNMSE THN IOT NISL NAMIER TISTH ;* ;* ;* Y TRENT EX NHE TOR FCKBAO ;G 0 A0IN,FR2 B SO $ PAKEND EODP14: ;CONVERT NULL MSG # TO ASCII & ATTACH IT TO MESSAGE ;01-23-73 PACK 0,EODW25,HDRLSE,12 ;01-23-73 PAKEND ;01-23-73 .PAGE EODY00: ;SKELETON OF END-OF-DAY MSG TO TERMINAL STDID ;BEGIN HEADER HUBRTE EODY01: .BLKB HDRLTO ;DEST RTE CODE .ASCII " 000 1 " ;SEQ. # AND TRMAC3 % 01.31.73 TSNDR2: .ASCII /XXXXX/ 01.31.73 .BYTE DEL,ETX 01.31.73 TOTALX: 01.31.73 .ENDC 01.31.73 .EVEN ;ROUTINE DETERMINES END AND AFFIXES "ETX". EODP10: ;PACKET TO FORM I.D. 20 MESSAGE PACK MESG2,EODOFM&MOV R1,LAST ;SAVE CHARACTER IN PREVIOUS CHARACTER REGISTER ; SIMA35: MOVB R1,CPRNT1+4 ;PUT CHAR IN TTY BUFFER, JUST IN CASE MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R1 ; BIT #SUPRES,@#SWITCH;SHOULD WE PRINT THE CHARACTER? BNE SIMB00 ;BRANCH IF NO MOV #TLIST2,-(SP) ;THEN, JSR PC,@TYOUTV ; PRINT IT. RTS PC ;RETURN TO ASYNC HANDLER ; SIRYNT ENOSG MXTNEO TNTMERENC;I 1 ,R#3 D AD H TCMAT N'DOS D';I 1 ,RR4 D AD : 30NAFI ; PC S RT E OD CONTIDION CHE TET;S + P)(S T TS RSTEISEG R ; R1+,P)(S V MO ALEREN G ; R2+,P)(S V MO HE T; R3+,P)(S V MO RETOES;R R4+,P)(S V MO : 20NAFI ; R BEUM NCEENQUSEE THO TNTOI PTO5 RET;S 5 ,RR1 V MO H TCMAA E AV HWE, NTOI PISTHT ;A ( ;TERMINAL ACTION CODE 01.27.73 .ASCII .REPT EODFF .ASCII .ENDM .ASCII " *** TERMINAL SUMMARY ***" .ASCII " DATE = " EODY11: .ASCII " -" ;MONTH EODY12: .ASCII " -" ;DATE EODY13: .ASCII " " ;YEAR .ASCII " TIME = " EODY14: .ASCII " " ;HOUR EODY15: .ASCII " " ;MINUTE .ASCII "TERM ID),EODOF8-EODOFM,00 ;XFER SKELETON TO M/A PACK EODOF1-EODOFM+MESG2,FILG1+TRMID,EOD2L,00 ;TERMINAL I.D. PACK EODOF2-EODOFM+MESG2,FILG1+TRMFLN,EOD3L,14 ;FOLIO # .WORD EODOF3-EODOFM+MESG2 EODP11: .WORD 0 ;DYNAMIC SOURCE FOR OP-CODE .BYTE EOD4L,MVCD00 PACK EODOF4-EODOFM+MESG2,EODW18,EODOF5-EODOF4,12;JULIAN DATE PACK EODOF5-EODOFM+MESG2,EODW10,EODOF6-EODOF5,12;HOUR PACK EODOF6-EODOFM+MESG2,EODW11,EODOF7-EODOF6,1*MB00: MOV #TIMER2,-(SP) ;TTY I/O COMPLETE ENTRY - OR NO PRINT ENTRY MOV #2,-(SP) ;DELAY 16-32 MS JSR PC,@QTIMEV ; TST (SP)+ ;POP OFF ERROR PARAMETER RTS PC ;RETURN ; SIMB10: JSR PC,OUTPUT ;SIMULATE THE TRANSMIT INTERRUPT RTS PC ;AND RETURN TO THE TIMER ROUTINE .PAGE ;*********************************************************************** ;* P)(S8. R CL RSTEACARCHE IV FLL AREPAOM;C 0 A1IN,FR4 B SO H TCMAT N'DOS D' IHE TIFH NCRA;B 30NAFI E BN E IM T AATR TEACARCHE ONK ECCHO TVEHAE ;W + 3)(R+,1)(R PBCM : 10NAFI ; IDS ALINRMTEF OSSREDD;A R33,F+BUIM#S V MO IDL NAMIER TER PRSTEACARCHE IV;F 4 ,R#5 V MO : 00NAFI ; NOSG MINS IETRENY ANT N'RE AREHE TIFH NCRA;B 00NBFI Q BE S SEESDRADE AS BND A; 2 ,RNLRMNT V MO, = " EODY16: .ASCII " FOLIO = " ;TERM I.D. EODY17: .ASCII " INPUT NO = " ;FOLIO NO EODY18: .ASCII " OUTPUT NO = " ;INPUT NO EODY19: .ASCII " " ;OUTPUT NO .ASCII "EOD DAY = " EODY20: .ASCII " EOD(JULN) = " ;EOD DAY EODY22: .ASCII " EOD TIME = " ;EOD JULIAN DATE EODY23: .ASCII " EOM DAY = " EODY24: .ASCII " " ;"FIRST" OR "LAST" .REPT EODFF .ASCII .ENDM -2;MINUTE PACK EODOF7-EODOFM+MESG2,EODW30,EOD8L,12 ;LAST MESSAGE # PAKEND EODP14: ;CONVERT NULL MSG # TO ASCII & ATTACH IT TO MESSAGE ;01-23-73 PACK 0,EODW25,HDRLSE,12 ;01-23-73 PAKEND ;01-23-73 .PAGE EODY00: ;SKELETON OF END-OF-DAY MSG TO TERMINAL STDID ;BEGIN HEADER HUBRTE EODY01: .BLKB HDRLTO . ** ;* U T I L I T Y S U B R O U T I N E S ** ;* ** ;* INPUT - SIMULATE A DC11 RECEIVE INTERRUPT. LINKAGE IS: ** ;* ** ;* JSR PC,INPUT ;CALLER MUST BE A TASK ** ;* S ERNTOU COPLOE IZALTINI;I 1 ,RNOSG#M V MO RSTEISEG R ; P)(S,-R4 V MO ALEREN G ; P)(S,-R3 V MO HE T; P)(S,-R2 V MO E AV;S P)(S,-R1 V MO DECON IOITNDCON URET RET;S ) SP-( R CL : NDFI ; **********************************************************************;* ** ;* ** D.VESAE ARS ERSTGIRER HEOTL 0 .ASCII EODY25: .EVEN .PAGE EODP20: ;PACKET STRING TO BUILD E-O-D MESSAGE FOR TERMINAL EODPC1 = MESG2-EODY00 ;CONSTANT OFFSET TO MESSAGE AREA PACK EODY01,FILG1+TRMRTE,HDRLTO,00 ;PUT DEST RTE CODE IN HDR PACK MESG2,EODY00,-1,00 ;XFER SKELETON TO MESSAGE AREA PACK EODY11+EODPC1,EODW32,2,12 PACK EODY12+EODPC1,EODW31,2,12 PACK EODY13+EODPC1,EODW27,2,12 1;DEST RTE CODE .ASCII " 000 1 " ;SEQ. # AND TRMAC3 ;TERMINAL ACTION CODE 01.27.73 .ASCII .REPT EODFF .ASCII .ENDM .ASCII " *** TERMINAL SUMMARY ***" .ASCII " DATE = " EODY11: .ASCII " -" ;MONTH EODY12: .ASCII " -" ;DATE EODY13: .ASCII " " ;YEAR .ASCII " TIME = " EODY14: .ASCII2 ** ;*********************************************************************** ; INPUT: MOV @#PS,-(SP) ;PUSH PS ONTO STACK MOV @#ASYNCR+2,@#PS ;RAISE CPU LEVEL TO WHAT ASYNCR NEEDS MOV #INPA00,-(SP) ;RETURN PC ON STACK TO SIMULATE AN JMP @ASYNCR ;INTERRUPT FROM THE RECEIVE ; INPA00: MOV #TIMER1,-(SP) ; MOV #2,-(SP) ; EMT QTIME ;SUSPEND EXECUTION FOR 16-32 MS TSAL R.BEUM NCEENQUSE ;* ** IISC AHE TOFT GIDIT ANICIFGNSIT OS MHE TTOS NTOI PR5 ;* ** ;* ** RYNT EEW N;A ;* ** DD ATOE ACSPT ENCIFIUFNS;I ;* ** AS WREHE TIFH NCRA;B R ROER T BL ;* **D DEADS WAE AM NHE TIFH NCRA;B RTSEIN T BG ;* ** D UNFOL NAMIER TIFH NCRA;B 401.27.73 PACK EODY14+EODPC1,EODW25,2,12 PACK EODY15+EODPC1,EODW11,2,12 PACK EODY16+EODPC1,FILG1+TRMID,7,00 PACK EODY17+EODPC1,FILG1+TRMFLN,2,14 PACK EODY18+EODPC1,EODW29,3,12 PACK EODY19+EODPC1,EODW30,3,12 PACK EODY20+EODPC1,EODW28,2,12 PACK EODY22+EODPC1,EODW20,3,12 PACK EODY23+EODPC1,EODW14,2,14 PACK EODY23+2+EODPC1,EODW14+1,2,14 .WORD EODY24 EODP21: .WORD 0 5 " " ;HOUR EODY15: .ASCII " " ;MINUTE .ASCII "TERM ID = " EODY16: .ASCII " FOLIO = " ;TERM I.D. EODY17: .ASCII " INPUT NO = " ;FOLIO NO EODY18: .ASCII " OUTPUT NO = " ;INPUT NO EODY19: .ASCII " " ;OUTPUT NO .ASCII "EOD DAY = " EODY20: .ASCII " EOD(JULN) = " ;EOD DAY EODY22: .ASCII " EOD TIME = " ;EOD JULIAN DATE EODY23: .ASCII " EOM DAY = " EODY24: .ASCII " " 6T (SP)+ ;POP OFF ERROR PARAMETER RTS PC ;THEN RETURN TO CALLER ;* ;* ;* S I M U L A T E O U T P U T I N T E R R U P T ;* ;* OUTPUT: BIS #202,XCSR ;SET 'READY' AND 'CLEAR-TO-SEND' STATUS MOV @#PS,-(SP) ;PUSH PS ON STACK MOV @#ASYNCX+2,@#PS ;THEN SET THE PS TO THE ASYNC INTERRUPT VALUE MOV #OUTA00,-(SP) ;PUSH INTERRUPT RETURN ADDRESS JMP @ASYNCX ;SIMULATE INTERR 0@&I7I@R @ I0I&R7 @ 0@&I7I@R D 8 ;"FIRST" OR "LAST" .BYTE 5,0 PAKEND .PAGE EODEM0: ;SKELETON FOR EOD ERROR MESSAGE TO HUB CONSOLE INTID HUBRTE .ASCII /000/ .ASCII /0 / EODACT .ASCII .ASCII "EOD ERROR # " EODEM1: .ASCII " " .EVEN EODP30: ;PACKET STRING TO FILL AND XFER ERROR MESSAGE PACK EODEM1,ERRORX,2,12 ;CONVERT ERROR NUMBER PACK MESG2,EODEM0,-1,00 9 ;"FIRST" OR "LAST" .REPT EODFF .ASCII .ENDM .ASCII EODY25: .EVEN .PAGE EODP20: ;PACKET STRING TO BUILD E-O-D MESSAGE FOR TERMINAL EODPC1 = MESG2-EODY00 ;CONSTANT OFFSET TO MESSAGE AREA PACK EODY01,FILG1+TRMRTE,HDRLTO,00 ;PUT DEST RTE CODE IN HDR .IFNE .CITGO ;THIS PACK STORES THE 01.31.73 PACK TSNDR1,FILG1+TRMRTE,HDRLTO,00 ;SENDER'S ROUT:UPT ; OUTA00: RTS PC ;RETURN TO CALLER .PAGE ;*********************************************************************** ;* ** ;* F I N D ** ;* ** ;* THE PURPOSE OF THIS LITTLE SUBROUTINE IS TO SEARCH THE ** ;* 'MSGNO' TABLE (RESIDENT IN THE CONTROL SECTO 0@&I7I@R D 0@&I7I@R O 0@&I7I@R ND.E C ND.E 731..301 NDKEPA 731..301 0 ,0LSTATOX-ALOT,TLSTATO2,SGME CKPA 731..301 : 40<PAKEND .END @R7I&I0@ O @R7I&I0@ D @R7I&I0@ D @R7I&I0@ @R7I&I0@ @R7I&I0@ =E CODE 01.31.73 PACK TSNDR2,FILG1+TRMRTE,HDRLTO,00 ;IN THE 'PRINT TOTALS' 01.31.73 .ENDC ;REQUEST MESSAGE 01.31.73 PACK MESG2,EODY00,-1,00 ;XFER SKELETON TO MESSAGE AREA PACK EODY11+EODPC1,EODW32,2,12 PACK EODY12+EODPC1,EODW31,2,12 PACK EODY13+EODPC1,EODW27,2,12 01.27.73 PACK EODY14+EODPC1,EODW25,2,12 PACK EODY15+EODPC1,EODW11,2,1>R) FOR THE ** ;* TERMINAL WHOSE ID IS SPECIFIED IN LOCATIONS SIMBUF+3 THROUGH ** ;* SIMBUF+7. THE 'MSGNO' TABLE IS ASSUMED TO BE CORE-RESIDENT. ** ;* THE FORMAT OF THE 'MSGNO' TABLE IS: ** ;* ** ;* .ASCII /TRMID/ ;FIVE CHARACTERS ** ;* .ASCII /SEQ/ ;NEXT SEQUENCE NO. (001-999) ** ;* DPEO 731..301 GOIT.C E FN.I NDKEPA 001,,-M0DEEO2,SGME CKPA R BEUM NORRR ERTVEON;C 122,X,ORRR,EM1DEEO CKPA E AGSSMER ROERR FE XND ALLFIO TNGRISTT KEAC;P : 30DPEO N VE.E X>ET < "" IISC.A: M1DEEO " #ORRR EOD"E IISC.A > OR