.TITLE EXEC ;*********************************************************************** ;* ** ;* S Y S T E M E X E C U T I V E ** ;* ** ;* THESE PROGRAMS FORM THE BASIC EXECUTIBE FUNCTIONS FOR THE ** ;* ELITE MICRO-HUB SYSTEM. THEY PERFORM SUCH FUNCTIONS AS ** ;* TASK CONTROL, TIMER CONTROL, TELETYP .TITLE COMMEX ;*********************************************************************** ;* ** ;* C O M M U N I C A T I O N S E X E C U T I V E ** ;* ** ;* THESE TWO PROGRAMS (INPUT AND OUTPUT) PERFORM AND MONITOR ** ;* ALL COMMUNICATIONS WITH THE ELITE COMMUNICATIONS PROCESSOR ** ;* (CP). ALL CP TRANSMISSIONS ARE RE .TITLE UTILTY ;*********************************************************************** ;* ** ;* T R S B U F ** ;* ** ;* PROGRAM IDENTIFICATION. TRSBUF - TRANSFER CURRENT BUFFER ** ;* CONTENTS. ** ;*  .TITLE DATA ;*********************************************************************** ;* ** ;* T E R M I N A L / R A C K D A T A B U F F E R S ** ;* ** ;* THE BUFFRS TABLE IS USED TO DETERMINE THE ADDRESS WITHIN ** ;* RACKBF OF THE BEFINNING OF THE TERMINALS INPUT RACK BUFFERS. ** ;* THE FORMAT OF EACH RACK BUFFER IS: E I/O, ETC. THE ** ;* FOLLOWING ARE ALL CONSIDERED AS PART OF THE EXECUTIVE= ** ;* ** ;* 1. EXEC - TO DISPATCH PROGRAMS ** ;* 2. TTYIN - TELETYPE INPUT CONTROL ** ;* 3. TTYOUT - TELETYPE OUTPUT CONTROL ** ;* 4. TIMER - SYSTEM TIMER CONTROL ** ;* 5. CLOCK - TIME/DATE MAINTE CEIVED BY INPUT, VERIFIED ** ;* FOR MESSAGE INTEGRITY, THEN MOVED TO A RACK BUFFER FOR ** ;* PROCESSING BY PROGRAM RECEIV. OUTPUT SENDS ALL COMPUTER ** ;* RESPONSES BACK TO THE CP. ** ;* ** ;* INPUT AND OUTPUT COMMUNICATE WITH THE CP OVER STANDARD ** ;* TELEPHONE LINES USING DEC'S DC11 INTERFACE - IF MORE THAN ** ;* ONE TERMINAL IS CONNECTED ** ;* PURPOSE. THIS SUBROUTINE TRANSFERS THE CONTENTS OF THE ** ;* CURRENT COMMUNICATIONS RECEIVER BUFFER (CRBUF) TO A ** ;* PERMANENT BUFFER ASSIGNED TO THE RACK/TERMINAL ASSOCIATED ** ;* WITH THE MESSAGE. AS A SYSGEN OPTION, SEVERAL BUFFERS CAN ** ;* BE ASSIGNED TO EACH RACK PER TERMINAL. IF A BUFFER IS NOT ** ;* AVAILABLE, AN ERROR CONDITION IS RETURNED TO THE CALLING ** ;* PROGRAM. EACH TERMINAL IS ** ;* ** ;* .WORD RKADDR BASIC RACK ** ;* .WORD RKSTAT INPUT BUFFER ** ;* .WORD RKBACK ***** ** ;* .WORD RKSTAT * ** ;* . . * ** ;* . . ***> NB NANCE ** ;* ** ;*********************************************************************** ;* ** ;* E X E C ** ;* ** ;* PROGRAM NAME. EXEC - EXECUTIVE PROGRAM CONTROL ** ;* (MICRO-HUB SYSTEMS). IF ONLY ** ;* ONE TERMINAL IS CONNECTED (STANDALONE SYSTEM) THEN A ** ;* TELETYPE-LIKE TRANSFER IS USED (THE CP AND COMPUTER ARE ** ;* HOUSED IN THE SAME CABINET); PHONE LINES ARE NOT USED IN ** ;* THIS CASE ** ;* ** ;*********************************************************************** .DEF INPUT,OUTP ASSIGNED A MINIMUM OF N+2 ** ;* BUFFERS, WHERE N IS THE NUMBER OF RACKS. THE OTHER TWO ** ;* BUFFERS ARE DEDICATED TO MANUAL ENTRY AND CP MESSAGES ** ;* WHICH DO NOT CONTAIN DATA (REDIAL REQUESTS). ** ;* ** ;* USAGE. THE LINKAGE TO SUBROUTINE TRSBUF IS: ** ;* ** ;* JSR PC,TRSBUF ACK ADDITIONAL BUFFERS ** ;* . . * ** ;* .WORD RKBACK * ** ;* .WORD RKSTAT ***** ** ;* ** ;* WHERE: ** ;* RKADDR = ADDRESS OF BUFFER (CORE)> OR DISC ** ;* S ** ;* PURPOSE. THIS PROGRAM IS THE MAIN LOOP OF THE SYSTEM AND ** ;* IS RESPONSIBLE FOR DISPATCHING ANY QUEUED PROGRAMS THAT ARE ** ;* WAITING TO BE EXECUTED. ** ;* ** ;* USAGE. ALL PROGRAMS TERMINATE EXECUTION BY CALLING EXEC. ** ;* EXEC USES A FIXED SLOT QUEUE, EXTABL. THE FORMAT OF THIS ** ;* TABLE IS: UT,BCC,CPERR,OUTINT,OUTGOA,OUTGON, .REF TTYOUT,TRSBUF,VALUE,TSTAT .IFNZ $MTAPE .REF MTWRIT .ENDC .DEF OUTERR,QTIME .PAGE ;*********************************************************************** ;* ** ;* I N P U T ** ;* ** ;* PROGRAM IDENTIFI ** ;* BNE ERROR ;BRANCH IF NO BUFFER AVAILABLE ** ;* ** ;* ON RETURN, REGISTERS R0 AND R1 ARE SET AS FOLLOWS: ** ;* ** ;* R0 = BUFFER ADDRESS (IF A BUFFER IS FOUND) ** ;* R1 = TERMINAL INDEX (0,2,4,...) ** ;* ECTOR ADDRESS (IF DISC IS USED) ** ;* RKSTAT = BUFFER STATUS ** ;* 0 - AVAILABLE ** ;* 1 - READY TO BE PROCESSED ** ;* 2 - BEING PROCESSED ** ;* RKBACK = BACKUP BUFFERS ** ;* ** ;*******  ** ;* .WORD TADDR ;ADDRESS OF PROGRAM ** ;* .BYTE TSTAT ;0 = DISABLED, 1 = QUEUED ** ;* .BYTE DATA ;INFORMATION FOR PROGRAM ** ;* ** ;* A TASK IS QUEUED BY SETTING TSTAT=1. ALL TASKS ARE ENTERED ** ;* WITH THE VALUE OF DATA IN REGISTER R0. ** ;* CATION. INPUT - ACCEPT AN INPUT MESSAGE ** ;* FROM THE COMMUNICATIONS PROCESSOR. ** ;* ** ;* PURPOSE. THIS PROGRAM ACCEPTS ALL CHARACTERS CONSTITUTING ** ;* A MESSAGE FROM THE CP, CHECKS FOR TRANSMISSION ERRORS, ** ;* PERFORMS NECESSARY ACK/NAK HANDSHAKING, THE ACTIVATES THE ** ;* RECEIV PROGRAM TO PROCESS THE DATA (IF TRANSMISSION WAS ** ;* VALID).  ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* ** ;*********************************************************************** .D ** BUFFRS: .WORD TRK1 ;TERMINAL 1 .WORD TRK2 ;TERMINAL 2 .WORD TRK3 ;TERMINAL 3 .WORD TRK4 ;TERMINAL 4 .WORD TRK5 ;TERMINAL 5 .WORD TRK6 ;TERMINAL 6 .WORD TRK7 ;TERMINAL 7 .WORD TRK8 ;TERMINAL 8 .WORD TRK9 ;TERMINAL 9 .WORD TRK10 ;TERMINAL  ** ;* ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* ** ;*********************************************************************** .DEF EXEC,TSTAT **  IF A MAGNETIC TAPE IS IN THE SYSTEM, THEN THE ** ;* INFORMATION IS TRAILED TO MAGNETIC TAPE. IF A BCC ERROR IS ** ;* DETECTED, A NAK IS SENT TO THE CP (VIA OUTPUT) AND THE ** ;* COMPLETE MESSAGE IS IGNORED. ** ;* ** ;* USAGE. THE SYSTEM INITIALIZATION ROUTINE SETS THE ** ;* COMMUNICATIONS LINE TO A RECEIVE MODE AND CONNECTS THE ** ;* EF TRSBUF .IFNZ $DISC .REF DISCIO .ENDC .REF BUFFRS,RACKBF ; ; ;* ;* TERMINAL ID TABLE, USED TO CONVERT ASCII TERMINAL CODES TO ;* A BINARY TERMINAL INDEX: 0,2,4,... ;* TERMNL: .ASCII 'TRM01 ' ;TERMINAL 1 .ASCII 'TRM02 ' ;TERMINAL 2 .ASCII ' ' ;TERMINAL 3 .ASCII ' ' ;TERMINAL 4 .ASCII ' ' ;TERMINAL 5 .ASCII ' ' 10 .=BUFFRS+NTERM+NTERM ;* ;* ;* THE GENERAL BUFFER ADDRESSES ARE: BFTT.R ;* WHERE TT = TERMINAL NUMBER (1,2,...,10) ;* R = RACK NUMBER (1,2,...,8) ;* ;* MANUAL ENTRY BUFFERS ARE MMTT.J AND REDIAL BUFFERS ARE ;* RDTT.J, WHERE IT IS DESCRIBED ABOVE AND ;* J = BACKUP BUFFER NUMBER (0 FOR FIRST BUFFER) ;* RACKBF: ; ; T E R M I N A L 1 ; TRK1: .WORD MN01.0,0 ;MANUAL ENTRY BUFFERS  .PAGE ** ;*********************************************************************** ;* ** ;* S Y S T E M E X E C U T I V E T A B L E S ** ;* ** ;* EXTABL IS BROKEN DOWN INTO TWO SEPARATE TABLES: TADDR AND ;* TSTAT. THIS HELPS INDEXING. ;* ;* TADDR: .WORD 0 ASSOCIATED INTERRUPT TO INPUT. THE GENERAL SEQUENCE OF ** ;* EVENTS DURING A TRANSMISSION SHOULD BE: ** ;* ** ;* RECEIVED BY INPUT ACTION SENT BY OUTPUT ** ;* ----------------- ------ -------------- ** ;* ** ;* 1. RING (FROM CP) ISSUE TERMINAL ** ;TERMINAL 6 .ASCII ' ' ;TERMINAL 7 .ASCII ' ' ;TERMINAL 8 .ASCII ' ' ;TERMINAL 9 .ASCII ' ' ;TERMINAL 10 .=TERMNL+NTERM+NTERM+NTERM+NTERM+NTERM+NTERM ; TRMSIZ: .WORD NRAK1,NRAK2,NRAK3,NRAK4,NRAK5 .WORD NRAK6,NRAK7,NRAK8,NRAK9,NRAK10 .=TRMSIZ+NTERM+NTERM .PAGE ;* ;* TRSBUF: MOV #CRBUF+TERMID,R0 ;GET BEGINNING ADDRESS OF TERMINAL ID JSR .WORD MN01.1,0 .WORD MN01.2,0 .WORD MN01.3,0 .=.-12.+NBACK4 ; .WORD RD01.0,0 ;REDIAL BUFFERS .WORD RD01.1,0 .WORD RD01.2,0 .WORD RD01.3,0 .=.-12.+NBACK4 ; .WORD BF01.1,0 ;RACK 1 BUFFERS .WORD B101.1,0 .WORD B201.1,0 .WORD B301.1,0 .=.-12+NBACK4 ; .IFG NRAK1-1 .WORD BF01.2,0 ;RACK 2 BUFFERS .WORD B1! ;USED BY TTYIN FOR TASK SUSPENSION .WORD INTIME ;TTYIN TIMEOUT PROGRAM .WORD OUTIME ;TTYOUT TIMEOUT PROGRAM .WORD OUTGOA ;DC11 OUTPUT ACKNOWLEDGED .WORD OUTGON ;DC11 OUTPUT NOT ACKNOWLEDGED .WORD CPERR ;DC11 INPUT TIMER EXPIRED .WORD QTIME ;DC11 TIMER EXPIRED BEFORE CP SENT ACK .WORD OUTERR ;CARRIER TRANSITION (LINE LOST) .WORD DEMAND ";* READY ** ;* 2. CARRIER TRANSITION ** ;* 3. STX (FROM CP) CLEAR BCC ** ;* 4. MESSAGE (FROM CP) UPDATE BCC ** ;* 5. ETB/ETX UPDATE BCC ** ;* 6. BCC COMPARE TO ** ;* CALCULATED # PC,GETERMID ;CONVERT TO TERMINAL INDEX MOV R0,R1 ;SAVE INDEX IN R1 FOR CALLER BLT TRSC00 ;THEN BRANCH IF INDEX IS ILLEGAL MOV BUFFRS(R1),R0 ;GET THE BEGINNING ADDRESS FOR CLR R2 ;THIS TERMINAL'S DATA BUFFERS BISB CRBUF+ACTION,R2 ;CHECK ACTION CODE SWAB R2 BISB CRBUF+ACTION+1,R2 ;R2 = ASCII ACTION CODE MOV #NBA$01.2,0 .WORD B201.2,0 .WORD B301.2,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK1-2 .WORD BF01.3,0 ;RACK 3 BUFFERS .WORD B101.3,0 .WORD B201.3,0 .WORD B301.3,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK1-3 .WORD BF01.4,0 ;RACK 4 BUFFERS .WORD B101.4,0 .WORD B201.4,0 .WORD B301.4,0 .=.-12.+NBACK4 .ENDC ; .I% ;OPERATOR DEMAND PROCESSING .WORD MICRO ;SYSTEM INITIALIZATION PROGRAM .WORD RECEIV ;TERMINATION ( * .WORD RECEIV ;TERMINAL 2 * .WORD RECEIV ;TERMINAL 3 * .WORD RECEIV ;TERMINAL 4 * RECEIV PROCESS THE .WORD RECEIV ;TERMINAL 5 * DC11 INPUT DATA FROM .WORD RECEIV ;TERMINAL 6 * THE CP .WORD RECEIV ;TERMINAL 7 * & ** ;* VALUE ** ;* 7. SEND ACK IF GOOD ** ;* SEND NAK IF BAD ** ;* 8. DECODE MESSAGE ** ;* AND FORMULATE ** ;* RESPONSE ** ;* 9. SEND STX, 'CK+1,R3 ;R3 = NO. BACKUP BUFFERS PLUS ONE CMP R2,#MNCODE ;MANUAL ENTRY? BEQ TRSA20 ;BRANCH IF YES CMP R2,#RDCODE ;REDIAL? BEQ TRSA10 ;BRANCH IF YES ;OTHERWISE IT'S AUTOMATIC TRANSACTION CLR R4 ;SO GET THE SPOT NUMBER BISB CRBUF+SPOT,R4 ;AND PUT IN R4 SUB #60,R4 ;CONVERT TO BINARY BLT TRSC00 ;BRANC(FG NRAK1-4 .WORD BF01.5,0 ;RACK 5 BUFFERS .WORD B101.5,0 .WORD B201.5,0 .WORD B301.5,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK1-5 .WORD BF01.6,0 ;RACK 6 BUFFERS .WORD B101.6,0 .WORD B101.7,0 .WORD B101.8,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK1-6 .WORD BF01.7,0 ;RACK 7 BUFFERS .WORD B101.7,0 .WORD B201.7) .WORD RECEIV ;TERMINAL 8 * .WORD RECEIV ;TERMINAL 9 * .WORD RECEIV ;TERMINAL 10 * .=.-NTMAX-NTMAX+NTERM+NTERM ; ; AND NOW FOR THE SECOND HALF OF THE EXTABL - THE STATUS AND DATA ; VALUES. THIS TABLE IS CALLED TSTAT. ALL STATUS INITIALLY DISABLED ; ; TSTAT: .WORD 0 ;TTYIN TASK SUSPENSION .WORD 0 ;INTIME - TTYIN TIMEOUT .WORD 0 ;OUTIME - TTYOUT T*MESSAGE, ** ;* BCC AND ETB/ETX ** ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* +H IF NO GOOD CMP R4,TRMSIZ(R1) ;CHECK FOR TOO LARGE A NUMBER BGT TRSC00 ; ADD #2,R4 ;GET FINAL INDEX BY THE EQUATION MOV R4,-(SP) ; INDEX = R0 + (R4 + 2)*(NBACK+3)*2 MOV #NBACK+3,-(SP) JSR PC,MULT MOV (SP)+,R4 ASL R4 ADD R4,R0 ;R0 NOW POINTS TO THE BEGINNING RACKBF BR TRSA20 ;ENTRY FOR THIS BUFFER ; TRSA10: ,,0 .WORD B301.7,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK1-7 .WORD BF01.8,0 ;RACK 8 BUFFERS .WORD B101.8,0 .WORD B201.8,0 .WORD B301.8,0 .=.-12.+NBACK4 .ENDC ; ; ; T E R M I N A L 2 ; TRK2: .IFG NTERM-1 ;ASSEMBLE ONLY IF MORE THAN 1 TERMINAL .WORD MN02.0,0 ;MANUAL ENTRY BUFFERS .WORD MN02.1,0 .WORD MN02.2-IMEOUT .WORD 0 ;OUTGOA - DC11 ACK .WORD 0 ;OUTGON - DC11 NAK .WORD 0 ;CPERR - DC11 INPUT TIMEOUT .WORD 0 ;QTIME - DC11 OUTPUT TIMEOUT .WORD 0 ;OUTERR - DC11 LINE LOST .WORD 0 ;DEMAND - OPERATOR DEMAND .WORD 1 ;MICRO - SYSTEM INITIALIZATION .WORD 0 ;RECEIV - TERMINAL 1 .WORD 1000 ;R. ** ;*********************************************************************** ; CRBUF: .=.+S .=.+$CPMSG ;CURRENT INPUT BUFFER FOR ACCUMULATING MSGS ACWAIT: .WORD 0 ;1 = OUTPUT WAITING FOR ACK/NAK MODE: .WORD 1 ;0 = OUTPUT MODE, 1 = INPUT MODE SWITCH: .WORD 0 ;INDICATES WHICH CHARACTER INPUT EXPECTS NEXT ERR: .WORD 0 ;1 = ERROR DETECTED IN CURRENT TRANSMISSION INEXT: .WORD /TST (R0)+ ;BUMP POINTER TO REDIAL ENTRY ; TRSA20: MOV #INHIBIT,@#PS ;INHIBIT INTERRUPTS ; TRSA30: TST 2(R0) ;SEE IF BUFFER IS AVAILABLE BEQ TRSB00 ;BRANCH IF YES ADD #4,R0 ;INCREMENT TO NEXT BUFFER (BACKUP) DEC R3 BLT TRSA30 ;GO BACK IF THERE MIGHT BE MORE BUFFERS CLR @#PS TST PC ;TOO BAD, GIVE AN ERROR RETURN RTS 0,0 .WORD MN02.3,0 .=.-12.+NBACK4 ; .WORD RD02.0,0 ;REDIAL BUFFERS .WORD RD02.1,0 .WORD RD02.2,0 .WORD RD02.3,0 .=.-12.+NBACK4 ; .WORD BF02.1,0 ;RACK 1 BUFFERS .WORD B102.1,0 .WORD B202.1,0 .WORD B302.1,0 .=.-12.+NBACK4 ; .IFG NRAK2-1 .WORD BF02.2,0 ;RACK 2 BUFFERS .WORD B102.2,0 .WORD B202.2,0 .WOR1ECEIV - TERMINAL 2 .WORD 2000 ;RECEIV - TERMINAL 3 .WORD 3000 ;RECEIV - TERMINAL 4 .WORD 4000 ;RECEIV - TERMINAL 5 .WORD 5000 ;RECEIV - TERMINAL 6 .WORD 6000 ;RECEIV - TERMINAL 7 .WORD 7000 ;RECEIV - TERMINAL 8 .WORD 10000 ;RECEIV - TERMINAL 9 .WORD 11000 ;RECEIV - TERMINAL 10 .WORD -1 .=.-NTMAX-NTMAX+NTERM+NTERM+2. ; 2CRBUF ;BUFFER INDEX INTO CRBUF INXMAX: .WORD CRBUF+$CPMSG-1 ;MAXIMUM LEGAL VALUE OF INEXT NEWBCC: .WORD 0 ;RUNNING BCC OF CURRENT MESSAGE CPBCC: .WORD 0,0 ;CP'S VALUE OF BCC IBCNXT: .WORD OBCC EXCESS: .WORD 1,24. .BYTE CR,LF .ASCII 'XXXXX EXCESS CP DATA' .BYTE CR,LF .PAGE ;*********************************************************************** ;* 3 PC ;* ;* ;* WHOPEE, WE FOUND A BUFFER. SET IT BUSY AND TRANSFER THE ;* DATA. ;* TRSB00: MOV #-1,2(R0) ;SET STATUS TO 'BEING INITIALIZED' CLR @#PS .IFNZ $DISC ;DISC LOGIC MOV R1,-(SP) ;SAVE R1 MOV (R0),R3 ;LOAD SECTOR ADDRESS MOV #CRBUF,R1 ;DATA BUFFER ADDRESS MOV #SCRMSG,2(R1) ;STORE MESSAGE LENGTH MOV #TRSB10,R2 ;I/O EXIT ADDRESS 4D B302.2,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK2-2 .WORD BF02.3,0 ;RACK 3 BUFFERS .WORD B102.3,0 .WORD B202.3,0 .WORD B302.3,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK2-3 .WORD BF02.4,0 ;RACK 4 BUFFERS .WORD B102.4,0 .WORD B202.4,0 .WORD B302.4,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK2-4 .WORD BF02.5,0 5; ; THE FOLLOWING BLOCK OF CORE IS THE SYSTEM STACK AREA. THE FIRST ; WORD (-1) IS USED TO DETECT STACK OVERFLOW. ; OVFLO: .WORD -1 ;STACK OVERFLOW DETECTOR .=.+STKSIZ+STKSIZ-2 ; STACK: .WORD 0 ; ; OTHER EXEC PARAMETERS GO HERE ; NEXT: .WORD 0 ; ; .PAGE ;*********************************************************************** ;* ** ;* NOW, LET'S START UP THE CODE6 ** ;* I N P U T ** ;* ** ;* ENTER HERE WHEN AN INTERRUPT IS RECEIVED FROM EITHER THE ** ;* DC11 (MICRO-HUB SYSTEM) OR TTY LINK (STANDALONE). ** ;* INTERRUPT CAN BE CAUSED BY: ** ;* ** ;* 1. RING 7 JSR PC,DISCIO ;WRITE ON DISC MOV (SP)+,R1 ;RESTORE R1 CLR R3 ;SET NO-ERROR CONDITION RTS ;AND RETURN ; TRSB10: NEG 2(R0) ;DISC I/O COMPLETE ENTRY; SET BUFFER RTS PC ;STATUS TO 'READY FOR PROCESSING' .ENDC ; ; .IFZ $DISC ;LOGIC FOR BUFFER IN CORE MOV R0,R2 MOV #CRMSG+1,R3 ASR R3 H ;RACK 5 BUFFERS .WORD B102.5,0 .WORD B202.5,0 .WORD B302.5,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK2-5 .WORD BF02.6,0 ;RACK 6 BUFFERS .WORD B102.6,0 .WORD B202.6,0 .WORD B302.6,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK2-6 .WORD BF02.7,0 ;RACK 7 BUFFERS .WORD B102.7,0 .WORD B202.7,0 .WORD B302.7,0 .=.-12.+E FOR EXEC, THE SYSTEM EXECUTIVE ** ;* ** ;* ** EXEC: MOV #STACK,SP ;INITIALIZE STACK POINTER CMP #-1,OVFLO ;CHECK STACK DETECTOR BNE ;BRANCH IF SOMETHING HAPPENED MOV NEXT,RU ;PREPARE TO SEARCH EXEC TABLE ; ; EXCAD0: TSTB TSTAT(R1) ;TEST STATUS OF CURRENF ** ;* 2. CARRIER TRANSITION (POSSIBLE LINE LOSS; MICRO-HUB) ** ;* 3. STX, ETB, ETX, BCC, ACK, NAK OR X'FF' ** ;* 4. DATA ** ;* ** ;******* ** ; INPUT: JSR R5,SAVE ;FIRST, WE MUST DO OUT DUTY AND CLR @#PS ;SAVE THE G ;R3 = NO. WORDS TO TRANSFER MOV #CRBUF,R4 ; TRSB10: MOV (R4)+,(R2)+ ;TRANSFER DATA FROM CRBUF TO RACKBF DEC R3 ; BGT TRSB10 NEG 2(R0) ;SET BUFFER STATUS TO READY CLR R3 ;SET NO-ERROR CONDITION RTS PC ;AND EXIT ;* ;* ;* RECEIVED BAD DATA FROM CP, GIVE ERROR CONDITION AND RETURN ;* ;* TRSC00: MOV #CRBUF+TERMID,R2 MOV """"""" """"""""""""""""""""""""""""""""DDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDˆˆˆˆˆˆˆ€ˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆADD-B -B C#À4d7PI›% R4d7RR›i†9N4d7[›<@4d7J8›[qff4d7_:C›$D˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïnF˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙8ŽIT ENTRY BGT EXCA10 ;BRANCH IF ACTIVE BLT EXCA20 ;BRANCH IF END OF TABLE TST (R1)+ ;OTHERWISE,INCREMENT AND BR EXCA00 ;GO BACK FOR MORE ; EXCA10: CLRB TSTAT(R1) ;SET TASK STATUS INACTIVE TST (R1)+ ;SAVE INDEX POINTER MOV R1,NEXT ; IN NEXT CLR R0 ;NOW, LET'S SET BISB TSTAT+1(R1),R0 ; R0 = THE DATA BYTE JREGISTERS, THEN ENABLE INTERRUPTS MOV ACWAIT,R0 BIS MODE,R0 ;SEE IF WE EXPECT AN INPUT INTERRUPT BEQ INPH00 ;BRANCH IF NO (LINE LOST?) .IFNZ $MICRO BIT #CTRANS,@#RCSR ;NOW, MAKE SURE WE HAVEN'T LOST THE LINE BEQ INPA10 ;BRANCH IF LINE OK JSR PC,SWRCVE ;OTHERWISE, RESET ALL COUNTERS, AND JSR R5,RESTOR ;FORCE CP TO CALL AGAIN RTI .ENDC ; INPAK #BADID+6,R3 MOVB (R2)+,(R3)+ ;PUT TERMINAL ID IN ERROR MESSAGE MOVB (R2)+,(R3)+ ; MOVB (R2)+,(R3)+ ; MOVB (R2)+,(R3)+ ; MOVB (R2)+,(R3)+ ; MOV R1,-(SP) ;SAVE R0 MOV #BADID,R0 ;PRINT ERROR MESSAGE: JSR PC,TTYOUT ; 'XXXXX BAD TERMINAL DATA' MOV (SP)+,R1 TST PC ;SET ERROR CONDITION RTS PC ;RETLNBACK4 .ENDC ; .IFG NRAK2-7 .WORD BF02.8,0 ;RACK 8 BUFFERS .WORD B102.8,0 .WORD B202.8,0 .WORD B302.8,0 .=.-12.+NBACK .ENDC .ENDC ; ; T E R M I N A L 3 ; TRK3: .IFG NTERM-2 ;ASSEMBLE ONLY IF MORE THAN 2 TERMINALS .WORD MN03.0,0 ;MANUAL ENTRY BUFFERS .WORD MN03.1,0 .WORD MN03.2,0 .WORD MN03.3,0 M CLZ JMP @TADDR-2(R1) ; AND GO EXECUTE THE TASK ; EXCA20: CLR R1 BR EXCA00 .PAGE ;*********************************************************************** ;* ** ;* T T Y I N ** ;* ** ;* PROGRAM INDENTIFICATION. TTYIN - TELETYPE INPUT SUBROUTINN10: MOV SWITCH,R0 ;TEST SWITCH TO DETERMINE WHAT IS ASL R0 ;EXPECTED NEXT JMP ITABLE(R0) ; ITABLE: .WORD INPB00 ;0 - RING .WORD INPC00 ;1 - CARRIER TRANSITION .WORD INPD00 ;2 - STX, EOT, OR ACK/NAK .WORD INPE00 ;3 - MESSAGE .WORD INPF00 ;4 - BCC AND X'FF' .WORD INPB10 ;5 - ILLEGAL, ERROR CONDITION ; ; ; THIS SOURN TO CALLER ; BADID: .WORD 1,28. .BYTE CR,LF .ASCII 'XXXXX BAD TERMINAL DATA ' .BYTE CR,LF .PAGE ;*********************************************************************** ;* ** ;* G E T E R M I D ** ;* THIS SUBROUTINE CONVERTS AN ASCII TERMINAL ID (5 CHARACTERS) ** ;* TO A TERMINAL INDEX VALUE (0, 2, 4, ... ). LINKAGE ISP .=.-12.+NBACK4 ; .WORD RD03.0,0 ;REDIAL BUFFERS .WORD RD03.1,0 .WORD RD03.2,0 .WORD RD03.3, RD03.3,0 .=.-12.+NBACK4 ; .WORD BF03.1,0 ;RACK 1 BUFFERS .WORD B103.1,0 .WORD B203.1,0 .WORD B303.1,0 .=.-12.+NBACK4 ; .IFG NRAK3-1 .WORD BF03.2,0 ;RACK 2 BUFFERS .WORD B103.2,0 .WORD B203.2,0 .WORD B303.2,0 .=QE. ** ;* ** ;* PURPOSE. THIS SUBROUTINE MONITORS ALL INPUT FROM THE ** ;* MICRO-HUB SYSTEM TELETYPE, EITHER SOLICITED OR UNSOLICITED. ** ;* SOLICITED INPUT IS DEFINED AS INPUT REQUESTS INITIATED BY ** ;* MICRO-HUB SYSTEM PROGRAMS; UNSOLICITED INPUT IS DEFINED ** ;* AS DATA ENTRY INITIATED BY THE COMPUTER OPERATOR. ** ;* RECTION PROCESSES A RING (ENTERED WHEN SWITCH = 0) ; ; INPB00: .IFNZ $MICRO BIT #RING,@#RCSR ;MAKE SURE WE GOT RING STATUS BEQ INPB10 ;IGNORE INTERRUPT IF NOT RING BIS #TREADY,@#RCSR ;ISSUE DATA TERMINAL READY COMMAND MOV #$10SEC,VALUE+INPTM ;SET UP FOR 10 SECOND DELAY INC SWITCH ;(EXPECT CARRIER TRANSITION BY THEN) .ENDC ; INPB10: JSR R5,RESTOR ;RESTORE REGISTERSS: ** ;* ** ;* R0 = ASCII TERMINAL ID (FIRST CHARACTER ADDRESS) ** ;* JSR PC,GETERMID ** ;* BLT ERROR ** ;* RETURN WITH R0 = TERMINAL INDEX. ** ;* ** ;*****************************************************T.-12.+NBACK4 .ENDC ; .IFG NRAK3-2 .WORD BF03.3,0 ;RACK 3 BUFFERS .WORD B103.3,0 .WORD B203.3,0 .WORD B303.3,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK3-3 .WORD BF03.4,0 ;RACK 4 BUFFERS .WORD B103.4,0 .WORD B203.4,0 .WORD B303.4,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK3-4 .WORD BF03.5,0 ;RACK 5 BUFFERS U ** ;* USAGE. THE LINKAGE TO SUBROUTINE TTYIN IS: ** ;* ** ;* R0 = BUFFER ADDRESS ** ;* JSR PC,TTYIN ** ;* BNE ERROR ;BRANCH IF ILLEGAL THREAD WORD ** ;* ** ;* THE FORMAT OF THE DATA BUFFER IS: V RTI ;AND EXIT ; ; ; ENTRY HERE FOR SWITCH = 1; INTERRUPT SHOULD HAVE BEEN CAUSED ; BY TRANSITION TO CARRIER DETECT. LINE TO MODEM SHOULD BE ; ESTABLISHED. ; ; INPC00: .IFNZ $MICRO BIT #DETECT,@#RCSR ;SEE IF WE GOT CARRIER DETECT BNE INPC20 ;BRANCH IF NO (CARRIER LOST?) INC SWITCH ;SET SWITCH TO EXPECT STX STATUS .ENDC ; INPC10: MOV #TGAP,VALUE+W****************** ; GETERMID: .IFZ NTERM-1 ;* NOT MUCH TO DO IF THIS IS A CLR R0 ;* STANDALONE SYSTEM (ONLY ONE RTS PC ;* TERMINAL). .ENDC ;* ; ; REST IS USED IN MICRO-HUB LOGIC. ; CLR R5 ;R5 = TEMPORARY TERMINAL INDEX MOV #TERMNL,R4 ;BEGINNING OF TERMINAL ID TABLE ; GETA00: MOV R0,R3 ;TRANSFER ASCII ADDRESS MOX .WORD B103.5,0 .WORD B203.5,0 .WORD B303.5,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK3-5 .WORD BF03.6,0 ;RACK 6 BUFFERS .WORD B103.6,0 .WORD B203.6,0 .WORD B303.6,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK3-6 .WORD BF03.7,0 ;RACK 7 BUFFERS .WORD B103.7,0 .WORD B203.7,0 .WORD B303.7,0 .=.-12.+NBACK4 .ENDC Y ** ;* ** ;* !---------------------------------! ** ;* ! THREAD ! ** ;* !---------------------------------! ** ;* ! NREAD ! NCHAR ! ** ;* !---------------------------------! ** ;* ! CHAR 2 ! CHAZINPTM ;RESET TIMER FOR TGAP MILLISECONDS BR INPB10 ;(EXPECT STX BY THEN) AND GO EXIT ; ; ; ENTRY HERE FOR SWITCH = 2; INTERRUPT SHOULD HAVE BEEN CAUSED ; BY AN STX, EOT, OR ACK/NAK. INITIALLY EXPECT AN STX; EOT FOR ; LINE TURNAROUND, AND ACK/NAK FOR OUTPUT RESPONSE. ; ; INPD00: CLR R0 ;GET THE CHARACTER BISB @#RBUF,R0 ; BISB @#RBUF,R0 ; .IFNZ [V #5,R2 ;SET UP FOR FIVE CHARACTERS ; GETA10: CMPB (R3)+,(R4)+ ;COMPARE CURRENT TABLE ENTRY WITH BNE GETA30 ;TERMINAL'S ID DEC R2 BGT GETA10 ;WE FOUND IT! ; GETA20: MOV R5,R0 ;PUT INDEX IN R0 RTS PC ;AND EXIT ; GETA30: ADD R2,R4 ;CURRENT ENTRY NOT THE ONE WE WANT TST (R5)+ ;INCREMENT INDEX VALUE TSTB \; .IFG NRAK3-7 .WORD BF03.7,0 ;RACK 8 BUFFERS .WORD B103.7,0 .WORD B203.7,0 .WORD B303.7,0 .=.-12.+NBACK .ENDC .ENDC ; ; T E R M I N A L 4 ; TRK4: .IFG NTERM-3 ;ASSEMBLE ONLY IF MORE THAN 3 TERMINALS .WORD MN04.0,0 ;MANUAL ENTRY BUFFERS .WORD MN04.1,0 .WORD MN04.2,0 .WORD MN04.3,0 .=.-12.+NBACK4 ; ]R 1 ! ** ;* !---------------------------------! ** ;* ** ;* . ** ;* . ** ;* . ** ;* ** ;* !-----------------^; * MICRO-HUB BIT #PARITY,@#RCSR ;TEST DC11 PARITY * PARITY .ENDC ; * CHECK .IFZ $MICRO ; * STANDALONE JSR PC,CKPRTY ;CALCULATE PARITY AND CHECK IF OK * PARITY .ENDC ; * CHECK BEQ INPD20 ;BRANCH IF PARITY IS OK ; INPD10: MOV #1,ERR (R4) ;INCREMENT TO NEXT TABLE ENTRY BNE GETA00 ;BRANCH IF MORE IN TABLE MOV #-1,R5 ;SET ERROR CODE BR GETA20 ;GO EXIT ;******* ; NOTE: INCLUDE THE FOLLOWING LOGIC: IF THE MESSAGE SEQ. NO. IS ; ALREADY IN BUFFERS, THEN IGNORE DATA (NO TRANSFER). .PAGE .END ` .WORD RD04.0,0 ;REDIAL BUFFERS .WORD RD04.1,0 .WORD RD04.2,0 .WORD RD04.3,0 .=.-12.+NBACK4 ; .WORD BF04.1,0 ;RACK 1 BUFFERS .WORD B104.1,0 .WORD B204.1,0 .WORD B304.1,0 .=.-12.+NBACK4 ; .IFG NRAK4-1 .WORD BF04.2,0 ;RACK 2 BUFFERS .WORD B104.2,0 .WORD B204.2,0 .WORD B304.2,0 .=.-12.+NBACK4 .ENDC ; a----------------! ** ;* ! CHAR NREAD ! CHAR NREAD-1 ! ** ;* !---------------------------------! ** ;* ** ;* THREAD = 1, ALWAYS, OR I/O REQUEST WILL NOT BE HONORED ** ;* NCHAR = MAXIMUM NUMBER CHARACTERS TO INPUT ** ;* NREAD = ACTUAL NUMBER CHARACTERS READ (0 = ERROR) ** ;* CHAR K = INPUT CHAb ;SET ERROR IN TRANSMISSION FLAG MOV #3,SWITCH ;SET TO RECEIVE DATA MODE BR INPC10 ;GO RESET TIMER AND EXIT ; INPD20: CMP R0,#STX ;SEE WHICH CHARACTER WE GOT BNE INPD30 ;BRANCH IF NOT STX MOV #CRBUF,INEXT ;OTHERWISE, SETUP FOR INCOMING MESSAGES CLR NEWBCC CLR ERR INC SWITCH ;SET SWITCH TO EXPECT DATA BR INPC10 ;GO RESET TIc .TITLE RESPON ;*********************************************************************** ;* ** ;* R E C E I V ** ;* ** ;* PROGRAM IDENTIFICATION. RECEIV - DECODE MESSAGE RECEIVED ** ;* FROM THE COMMUNICATIONS PROCESSOR. ** ;* d .IFG NRAK4-2 .WORD BF04.3,0 ;RACK 3 BUFFERS .WORD B104.3,0 .WORD B204.3,0 .WORD B304.3,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK4-3 .WORD BF04.4,0 ;RACK 4 BUFFERS .WORD B104.4,0 .WORD B204.4,0 .WORD B304.4,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK4-4 .WORD BF04.5,0 ;RACK 5 BUFFERS .WORD B104.5,0 .WeRACTER STRING ** ;* ** ; COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* ** ;*****************fMER AND EXIT ; INPD30: CMP R0,#EOT ;MAYBE IT'S AN EOT BEQ INPG00 ;BRANCH IF YES CMP R0,#ACK ;WELL, MAYBE IT'S AN ACK BEQ INPD40 CMP R0,#NAK ;OR, THEN AGAIN, IT COULD BE A NAK BNE INPH00 ;FORGET IT - GO SEE IF WE LOST THE LINE TST ACWAIT ;NAK IT IS, BUT DID WE WANT A NAK? BEQ INPH00 ;NO - GO DO SOMETHING ELSE XXXXXX INg ** ;* PURPOSE. THIS PROGRAM DECODES THE INFORMATION RECEIVED FROM ** ;* THE COMMUNICATIONS PROCESSOR AND CALLS THE APPROPRIATE ** ;* SUBROUTINE TO PROCESS THE REQUEST. ** ;* ** ;* RECEIV IS RE-ENTRANT SO THAT PARALLEL PROCESSING (TERMINAL- ** ;* TO-TERMINAL) IS POSSIBLE. ** ;* hORD B204.5,0 .WORD B304.5,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK4-5 .WORD BF04.6,0 ;RACK 6 BUFFERS .WORD B104.6,0 .WORD B204.6,0 .WORD B304.6,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK4-6 .WORD BF04.7,0 ;RACK 7 BUFFERS .WORD B104.7,0 .WORD B204.7,0 .WORD B304.7,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK4-7 i****************************************************** .DEF TTYIN,TTYINT,INTIME .REF ; TYISTR: .WORD 0 ;POINTER TO FIRST ENTRY IN QUEUE TYIEND= .WORD TYISTR ;POINTER TO LAST ENTRY IN QUEUE TTYUSE: .WORD 0 ;TTY IN USE INDICATOR ; 0 = TTY NOT BEING USED ; 1 = TTY IN INPUT MODE ; 2 = TTY IN OUTPUT MODE TTYBUF: .WORD OPRBUF jC TSTAT+OUTN ;QUEUE OUTPUT'S OUTGON TO PROCESS IT BR INPC10 ;THEN RESET TIMER AND EXIT ; INPD40: TST ACWAIT ;ACK IT IS, ASSUMING THAT'S WHAT WE WANT BEQ INPH00 ;BRANCH IF BAD NEWS INC TSTAT+OUTA ;OTHERWISE, QUEUE OUTGOA BR INPC10 ;THEN RESET TIMER AND EXIT ; ; ; ENTER HERE WITH SWITCH = 3; ALL ENTRIES HERE SHOULD BE BECAUSE ; OF CP CHARACTERS WHICH FORM THE MESSAGE.k ** ;* USAGE. RECEIV IS EXECUTED BY THE SYSTEM EXECUTIVE AS A ** ;* MAIN PROGRAM. WHEN INPUT HAS STORED A MESSAGE, THE ** ;* ASSOCIATED TERMINAL'S ENTRY IN THE EXECUTIVE QUEUE FOR ** ;* RECEIV IS SET TO THE ENABLED STATE. RECEIV IS ENTERED ** ;* WITH THE TERMINAL INDEX IN R0. ** ;* ** ;* l .WORD BF04.8,0 ;RACK 8 BUFFERS .WORD B104.8,0 .WORD B204.8,0 .WORD B304.8,0 .=.-12.+NBACK .ENDC .ENDC ; ; T E R M I N A L 5 ; TRK5: .IFG NTERM-4 ;ASSEMBLE ONLY IF MORE THAN 4 TERMINALS .WORD MN05.0,0 ;MANUAL ENTRY BUFFERS .WORD MN05.1,0 .WORD MN05.2,0 .WORD MN05.3,0 .=.-12.+NBACK4 ; .WORD RD05.0,0 m ;POINTER TO INPUT BUFFER NREAD: .WORD NOPR ;POINTER TO INPUT SIZE NCHAR: .WORD NENTRY ;POINTER TO MAXIMUM INPUT SIZE INWAIT: .WORD 0 ;1 = INPUT WAITING FOR OUTPUT TO FINISH UNSOL: .WORD 0 ;1 = INPUT IS UNSOLICITED NOPR: .WORD 0 ;SIZE OF UNSOLICITED MESSAGE NENTRY: .WORD NINBUF ;MAX SIZE OF UNSOLICITE MESSAGE BUFFER ; ; OPRBUF: .=.+NINBUF ;UNSOLICITED INPUT MESSAGE BUFFER n CRBUF IS USED AS A ; TEMPORARY STORAGE BUFFER. ; ; INPE00: CLR R0 ; BISB @#RBUF,R0 ;GET THE CHARACTER FROM THE DC11 .IFNZ $7ICRO ;* BIT #PARITY,@#RCSR ;* CHECK .ENDC ;* FOR .IFZ *MICRO ;* PARITY JSR R5,CKPRTY ;* ERROR .ENDC ;* BNE INPD10 ;BRANCH IF PARITY ERROR IN DATA o COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* ** ;*********************************************************************** .DEF RECEIV .REF INVOICE,MANUAL,AUTOER,REDIAL,OOPS ; ; ; p ;REDIAL BUFFERS .WORD RD05.1,0 .WORD RD05.2,0 .WORD RD05.3,0 .=.-12.+NBACK4 ; .WORD BF05.1,0 ;RACK 1 BUFFERS .WORD B105.1,0 .WORD B205.1,0 .WORD B305.1,0 .=.-12.+NBACK4 ; .IFG NRAK5-1 .WORD BF05.2,0 ;RACK 2 BUFFERS .WORD B105.2,0 .WORD B205.2,0 .WORD B305.2,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK5-2 q .EVEN ; ; ; .PAGE ;*********************************************************************** ;* ** ;* BEGIN THE TELETYPE INPUT CODE FOR THE SOLICITED REQUEST ** ;* PROCESSING: TTYIN. ** ;* ** ;******* ; TTYIN: MOV #INHIBIT,@#PS ;INHIBIT INTERRUPTS DEC (R0) r MOV NEWBCC,R1 ;CHARACTER IS OK - KEEP RUNNING BCC JSR PC,BCC MOV R1,NEWBCC ;SAVE RUNNING BCC CMP INEXT,INXMAX ;SEE IF CRBUF OVERRUNNETH BGT INPC20 ;BRANCH IF BAD NEWS MOVB R0,@INEXT ;OTHERWISE, STORE CHARACTER IN BUFFER INC INEXT ;AND INCREMENT THE POINTER CMP R0,#ETB ;WAS THE CHARACTER EITHER ETB OR ETX? BEQ INPE10 CMP R0,#ETX sTABLE TO CONVERT ACTION CODE TO SUBROUTINES WHICH PROCESS THE ; DATA. ACODE IS THE ASCII CODE AND ACSUBR IS THE SUBROUTINE ; ADDRESS. ; ACODE: .WORD ATCODE ;AUTOMATIC TRANSACTION .WORD AUCODE ;AUDIT TRAIL .WORD MNCODE ;MANUAL ENTRY .WORD MCCODE ;MANUAL CONTINUATION .WORD ERCODE ;AUDIT TRAIL ERROR .WORD RDCODE ;REDIAL .WORD -1 ;END OF TABLE t .WORD BF05.3,0 ;RACK 3 BUFFERS .WORD B105.3,0 .WORD B205.3,0 .WORD B305.3,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK5-3 .WORD BF05.4,0 ;RACK 4 BUFFERS .WORD B105.4,0 .WORD B205.4,0 .WORD B305.4,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK5-4 .WORD BF05.5,0 ;RACK 5 BUFFERS .WORD B105.5,0 .WORD B205.5,0 .WORD u ;THEN, QUEUE THE REQUEST BNE TYIX00 ;BRANCH IF NOT QUEUEABLE MOV R0,@TYIEND ;QUEUE IT MOV R0,TYIEND ; QUEUE IT! MOV (SP)+,4(R0) ;NOW SAVE THE RETURN PC IN DATA BUFFER ; ; NOW, WE NEED TO SEE IF THE TELETYPE IS IN USE. IF NOT, WE'LL ; START THE INPUT REQUEST. ; TST TTYUSE BEQ TYIB00 ;BRANCH IF TTY IS AVAILABLE CMP #2,TTYUSE ;TOO BAD. IF IT'Sv BNE INPC10 ;NO - GO RESET TIMER AND EXIT ; INPE10: INC SWITCH ;SWITCH = 4 =====> EXPECT BCC MOV #OBCC,IBCNXT ;INITIALIZE BCC INDEX FOR STORAGE BR INPC10 ;GO RESET TIMER AND EXIT ; ; ; ENTER HERE WHEN SWITCH = 4; EXPECT TWO CHARACTERS WORTH OF ; BCC AND ONE CHARACTER'S WORTH OF X'FF' TRAILING. ; ; INPF00: CLR R0 BISB @#RBUF,R0 ;GET THE CHARACTER MOV IBw; ACSUBR: .WORD INVOICE ;AUTOMATIC TRANSACTION .WORD INVOICE ;AUDIT TRAIL .WORD MANUAL ;MANUAL ENTRY .WORD MANUAL ;MANUAL ENTRY CONTINUATION .WORD AUTOER ;AUDIT TRAIL ERROR .WORD REDIAL ;REDIAL .WORD OOPS ;END OF TABLE ; ; ; ; .PAGE ;* ;* FIRST THING WE NEED TO DO IS TO MAKE SURE WE HAVE AN OUTPUT ;* BUFFER TO PLAY WITH ;* ;* xB305.5,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK5-5 .WORD BF05.6,0 ;RACK 6 BUFFERS .WORD B105.6,0 .WORD B205.6,0 .WORD B305.6,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK5-6 .WORD BF05.7,0 ;RACK 7 BUFFERS .WORD B105.7,0 .WORD B205.7,0 .WORD B305.7,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK5-7 .WORD BF05.8,0 ;Ry IN OUTPUT MODE, BNE TYIA10 INC INWAIT ;THEN SET THE INPUT WAITING FLAG ; TYIA10: CLR @#PSR ;ENABLE INTERRUPTS BR EXEC ;GO TO SYSTEM EXECUTIVE ; ; TELETYPE NOT IN USE, SO SET IT TO THE INPUT MODE AND START INPUT ; TYIB00: INC TTYUSE ; ; TYIB10: TST (R0)+ ;SET UP TTY INPUT BUFFER POINTERS MOV R0,NCHAR ;ADDRESS OF NCHAR INC zCNXT,R1 ;GET BCC INDEX MOVB R0,(R1)+ ;STORE CHARACTER MOV R1,IBCNXT CMP R1,#CPBCC+3 ;DO WE HAVE ALL OF BCC INFO? BLT INPC10 ;NO - RESET TIMER AND EXIT INC SWITCH ;ALL DONE WITH MESSAGE CLR VALUE+INPTM ;STOP TIMER TST ERR ;ANY ERRORS CAUGHT ON THE WAY? BNE INPF40 ;BRANCH IF YES = MOV CPBCC,R2 ;DO THE BCC@S AGREE? SW{RECEIV: MOV OBUFRS(R0),R1 ;GET OUTPUT BUFFER STATUS TABLE MOV #INHIBIT,@#PS ;INHIBIT INTERRUPTS TST OSTAT(R1) ;CHECK BUFFER STATUS BEQ RECA00 JMP EXEC ;BUFFER NOT AVAILABLE, EXIT TO EXEC ; RECA00: DEC OSTAT(R1) ;SET BUFFER BUSY (-1 = BUFFER BEING PREPARED) MOV BUFFRS(R0),R2 ;NOW, WE NEED TO GET AN INPUT BUFFER MOV #NBACK+3,R3 ;THAT WANTS TO BE PROCESSED ; RE|ACK 8 BUFFERS .WORD B105.8,0 .WORD B205.8,0 .WORD B305.8,0 .=.-12.+NBACK .ENDC .ENDC ; ; T E R M I N A L 6 ; TRK6: .IFG NTERM-5 ;ASSEMBLE ONLY IF MORE THAN 5 TERMINALS .WORD MN06.0,0 ;MANUAL ENTRY BUFFERS .WORD MN06.1,0 .WORD MN06.2,0 .WORD MN06.3,0 .=.-12.+NBACK4 ; .WORD RD06.0,0 ;REDIAL BUFFERS .WOR}R0 ; MOV R0,NREAD ; NREAD INC R0 ; MOV R0,TTYBUF ;AND DATA BUFFER INC R0 MOV (R0),TADDR+TYIN ;PUT THE CALLER'S RETURN PC IN THE CLR TSTAT+TYIN ;SYSTEM EXEC TABLE CLR @#PS ;ENABLE INTERRUPTS BIC #100,@#TPS ;DISABLE TTY OUTPUT INTERRUPT MOVB #COLON,@#TPB ;PRINT A COLON MOV #$300MS,VALUE+TYITM ~AB R0 CMP R0,NEWBCC BNE INPF40 ;BRANCH IF THEY DISAGREE .IFNZ $MTAPE ;RETURN WITH R0 = BUFFER ADDRESS MOV #CRBUF,R0 MOV INEXT,R1 SUB R0,R1 ;R1 = MESSAGE SIZE MOV #INPF20,R2 ;R2 = RETURN ADDRESS WHEN I/O IS COMPLETE CLR R3 ;R3 = 0 MEANS TRANSACTION DATA AUDIT TRAIL JSR PC,TRAIL JMP INPB10 ;GO EXIT FOR NOW ; ; ; CA10: TST (R2)+ ;R2 POINTS TO RACKBF INPUT BUFFERS FOR CMP #1,(R2)+ ;THIS TERMINAL BEQ RECA20 ;BRANCH IF ONE IS WAITING DEC R3 BGT RECA10 ;GO BACK TO TEST NEXT BUFFER CLR @#PS JMP EXEC ;TSK, TSK! NO BUFFERS. MAY AS WELL GO HOME ; RECA20: INC -(R2) ;SET INPUT BUFFER 'BEING PROCESSED' STATUS CLR @#PS ;ENABLE INTERRUPTS€D RD06.1,0 .WORD RD06.2,0 .WORD RD06.3,0 .=.-12.+NBACK4 ; .WORD BF06.1,0 ;RACK 1 BUFFERS .WORD B106.1,0 .WORD B206.1,0 .WORD B306.1,0 .=.-12.+NBACK4 ; .IFG NRAK6-1 .WORD BF06.2,0 ;RACK 2 BUFFERS .WORD B106.2,0 .WORD B206.2,0 .WORD B306.2,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK6-2 .WORD BF06.3,0 ;RAC;START UP TTY INPUT TIMER JMP EXEC ;THEN GO TO SYSTEM EXECUTIVE .PAGE ;*********************************************************************** ;* ** ;* T T Y I N T ** ;* ** ;* TELETYPE INPUT INTERRUPT ROUTINE. RETRIEVE CHARACTER AND ** ;* STORE IN MESSAGE BUFFER. ‚ RETURN HERE WHEN TRAILING IS COMPLETE. R0 CONTAINS ERROR CODE, ; AS FOLLOWS: ; 0 = OUTPUT SUCCESSFUL ; 1 = ERROR ; ; INPF20: MOV (SP),-(SP) ;SET UP JSR FROM TRAIL TO LOOK LIKE CLR 2(SP) ;AN INTERRUPT OCCURRED JSR R5,SAVE ;SAVE REGISTERS TST R0 ;SEE IF TRAILING WAS SUCCESSFUL BNE INPF40 ;BRANCH IF NO .ENDC MOV ƒ MOV -(R2),R0 ;GET BUFFER ADDRESS (INPUT) .IFNZ $DISC ;DISC LOGIC TO READ INPUT BUFFER MOV INBUF(R1),R1 JSR PC,DISCIN ;READ INPUT BUFFER FROM DISC MOV OBUFF MOV OBUFRS(R0),R1 ;RETURN HERE WHEN I/O IS COMPLETE MOV INBUF(R1),R3 .ENDC .IFZ $DISC ;ALL CORE LOGIC MOV R3,INBUF(R1) ;STORE ADDRESS OF INPUT BUFFER .ENDC ,* ,* ,* AT T„K 3 BUFFERS .WORD B106.3,0 .WORD B206.3,0 .WORD B306.3,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK6-3 .WORD BF06.4,0 ;RACK 4 BUFFERS .WORD B106.4,0 .WORD B206.4,0 .WORD B306.4,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK6-4 .WORD BF06.5,0 ;RACK 5 BUFFERS .WORD B106.5,0 .WORD B206.5,0 .WORD B306.5,0 .=.-12.+NBACK4…ENTERED WITH INTERRUPTS INHIBITED ** ;* ** ;******* ** ;* TTYINT: JSR R5,SAVE ;SAVE REGISTERS CLR R0 ;GET CHARACTER BISB @#TKB,R0 ;PLACE IT IN R0 CMP #1,TTYUSE ;CHECK TO SEE WHICH MODE TTY IS IN BLT TYIE00 ;BRANCH HERE MEANS THIS MIGHT BE UNSOLICITED BEQ † #CRBUF,R0 JSR PC,TRSBUF ;TRANSFER MESSAGE TO PERMANENT BUFFER JSR PC,OUTACK ;SEND ACKNOWLEDGE TO CP - DATA GOOD .IFG NTERM-1 MOV #CRBUF+TERMID,R0;GET THE TERMINAL INDEX JSR PC,GETERMID ;FOR THIS TERMINAL (0,2, 4, ...) INC TSTAT+RCV(R0) ;QUEUE RECEIV FOR THIS TERMINAL .ENDC .IFZ NTERM-1 INC TSTAT+RCV ;STANDALONE CODE TO QUEUE RECEIV .ENDC MOV ‡HIS POINT, R0 = TERMINAL INDEX ,* R1 = OUTPUT BUFFER CONTROL TABLE (OUTBUF) ,* R3 = ADDRESS OF INPUT BUFFER TO BE DELODED ,* AND PROCESSED ,* NOW, WE'LL SEARCH THE TABLES FOR THIS ACTION CODE ,* ,* CLR R2 ;BUT FIRST - BISB ACTION(R3),R2 ;GET THE SWAB R2 ; ACTION BISB ACTION+1(R3),R2 ; CODE MOV #ACODE,R4 ;LOAD ACODE ˆ .ENDC ; .IFG NRAK6-5 .WORD BF06.6,0 ;RACK 6 BUFFERS .WORD B106.6,0 .WORD B206.6,0 .WORD B306.6,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK6-6 .WORD BF06.7,0 ;RACK 7 BUFFERS .WORD B106.7,0 .WORD B206.7,0 .WORD B306.7,0 .=.-12.+NBACK4 .ENDC ; ; .IFG NRAK6-7 .WORD BF06.8,0 ;RACK 8 BUFFERS .WOR‰ TYIC00 ;BRANCH IF INPUT IS IN PROGRESS CMP R0,#BELL ;AT THIS POINT, OUTPUT IS IN PROGRESS CMP R0,#BELL ;AT THIS POINT, OUTPUT IS IN PROGRESS- BNE TYIC10 ;SEE IF THIS IS AN ABORT REQUEST JMP OUTIME ;YES IT IS, GO TO OUTPUT ABORT ROUTINE ; ; TYIC00: CMP R3,#EOM ;SEE IF CHARACTER IS EOM BEQ TYID00 ;BRANCH IF YES CMP R0,#RUBOUT ;OTHERWISE,TRY RUBOUŠ #2,SWITCH ;SET SWITCH TO EXPECT AN EOT (LINE JMP INPC10 ;TURNAROUND) OR STX (ANOTHER MESSAGE) ; INPF40: JSR PC,OUTNAK ;SEND A NAK, THE MESSAGE WAS NO DARN GOOD MOV #2,SWITCH ;RESET TO GET MESSAGE AGAIN JMP INPC10 ;GO RESET TIMER AND EXIT ; ; INPC20: MOV #EXCESS,R0 ;WE'RE GETTING TOO MANY CHARACTERS FROM CP MOV #TERMID,R1 ;PRINT "EXCESS DATA FRIM CP" MOV ‹TABLE ADDRESS MOV #-1,R5 ; RECB10: CMP R5,(R4) ;END OF TABLE? BEQ RECB30 ;BRANCH IF YES CMP R2,(R4)+ ;OTHERWISE, IS THE CURRENT ENTRY THE BNE RECB10 ;ONE WE WANT? ; ;YES, LINK TO THE SUBROUTINE RECB20: MOV R0,R1 MOV R3,R0 JSR PC,@ACSUBR-ACODE-2(R4) JMP EXEC ; RECB30: TST (R4)+ BR RECB20ŒD B106.8,0 .WORD B206.8,0 .WORD B306.8,0 .=.-12.+NBACK .ENDC .ENDC ; ; T E R M I N A L 7 ; TRK7: .IFG NTERM-6 ;ASSEMBLE ONLY IF MORE THAN 6 TERMINALS .WORD MN07.0,0 ;MANUAL ENTRY BUFFERS .WORD MN07.1,0 .WORD MN07.2,0 .WORD MN07.3,0 .=.-12.+NBACK4 ; .WORD RD07.0,0 ;REDIAL BUFFERS .WORD RD07.1,0 .WORD T BNE TYIC20 ;BRANCH IF NOT RUBOUT TSTB @NREAD ;SEE IF WE'RE AT BEGINNING OF BUFFER BLE TYIC10 ;BRANCH IF YES DEC @NREAD ;OTHERWISE, BACK UP POINTERS DEC TTYBUF ; MOVB #LARROW,@#TPB ;AND ECHO AN ARROW ( ) ; TYIC10: JSR R5,RESTOR ;RESTOR REGISTERS RTI ;RETURN FROM INTERRUPT ; ; CONTINUE PROCESSING CURRENT CHARACTER ; Ž#EXCESS+6,R2 ; MOVB (R1)+,(R2)+ ;INSERT MOVB (R1)+,(R2)+ ; TERMINAL MOVB (R1)+,(R2)+ ; ID MOVB (R1)+,(R2)+ ; IN MOVB (R1)+,(R2)+ ; MESSAGE JSR PC,TTYOUT ; BR INPC10 ;GO WAIT FOR MORE ; ; ; AT THIS POINT, WE FINALLY GOT AN EOT, SO NOW WE CAN SWITCH ; TO TRANSMIT MODE AND LET OUTPUT DO ITS THING (RESPOND TO THE ; CP'S MESSAGE).  ;*********************************************************************** ;* ** ;* I N V O I C E ** ;* ** ;* PROGRAM IDENTIFICATION. INVOICE - TO PREPARE AN INVOICE ** ;* (DELIVERY DOCUMENT). ** ;*  RD07.2,0 .WORD RD07.3,0 .=.-12.+NBACK4 ; .WORD BF07.1,0 ;RACK 1 BUFFERS .WORD B107.1,0 .WORD B207.1,0 .WORD B307.1,0 .=.-12.+NBACK4 ; .IFG NRAK7-1 .WORD BF07.2,0 ;RACK 2 BUFFERS .WORD B107.2,0 .WORD B207.2,0 .WORD B307.2,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK7-2 .WORD BF07.3,0 ;RACK 3 BUFFERS .WORD ‘TYIC20: MOVB R0,@#TPB ;ECHO CHARACTER MOVB @TTYBUF ;STORE CHARACTER IN BUFFER INC @NREAD ;INCREMENT INC TTYBUF ; POINTERS CMPB @NREAD,@NCHAR ;SEE IF WE'RE AT END OF BUFFER BLT TYIC10 ;BRANCH IF THERE'S ROOM FOR MORE ; ; ; THIS IS THE END OF THE CURRENT REQUEST. DEQUEUE, UNSUSPEND, ; ETC., ETC. ; ; TYID00: CLR VALUE+TYITM ;STOP TIMER ’; ; INPG00: CLR MODE ;SET TRANSMIT MODE FLAG CLR VALUE+INPTM ;STOP TIMER CLR SWITCH ;NO MORE INPUT UNTIL WE GET A RING JMP INPB10 ;(EXCEPT FOR MAYBE A FEW ACK/NAK'S). ; ; ; WE GET HERE IF SOME KINDA ERROR HAPPENED (OUT REAL CONCERN IS ; THAT WE HAVEN'T LOST OUT LINE (IS THE RATED X?). ; ; INPH00: BIT #CTRANS,@#RCSR ;CARRIER TRANSITION? BNE INPH10 ;BRANCH “ ** ;* PURPOSE. THIS SUBROUTINE, COMBINED WITH SUBROUTINE ** ;* FORMAT, CREATES A FORMATTED DELIVERY DOCUMENT FOR THE ** ;* CURRENT TRANSACTION. INVOICE PRIMARILY CONTAINS THE ** ;* TABLE REQUIRED BY FORMAT WHICH USES THE GENERAL DOCUMENT ** ;* LANGUAGE. INVOICE ALSO CREATES THE HEADER REQUIRED FOR ** ;* COMMUNICATIONS WITH THE CP. ** ;* ” B107.3,0 .WORD B207.3,0 .WORD B307.3,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK7-3 .WORD BF07.4,0 ;RACK 4 BUFFERS .WORD B107.4,0 .WORD B207.4,0 .WORD B307.4,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK7-4 .WORD BF07.5,0 ;RACK 5 BUFFERS .WORD B107.5,0 .WORD B207.5,0 .WORD B307.5,0 .=.-12.+NBACK4 .ENDC ; • TST UNSOL ;SEE IF THIS WAS AN UNSOLICITED REQUEST BNE TYID20 ;BRANCH IF YES ('CAUSE THEY AINT QUEUED) ; TYID10: MOV TYISTR,R1 ;DEQUEUE THIS REQUEST MOV (R1),R0 ; MOV R0,TYISTR ; BNE TYID20 ;BRANCH IF MORE ENTRIES IN QUEUE MOV #TYISTR,TYIEND ;OTHERWISE, RESET QUEUE POINTER ; TYID20: INC TSTAT+TYIN ;UNSUSPEND THE ORIGINATING PROGRAM ; TY–IF YES (OOPS!) JMP INPC10 ;OTHERWISE, IGNORE IT ; INPH10: TST MODE ;WHAT WE DO DEPENDS ON THE MODE --- BNE INPD10 ;BRANCH IF INPUT MODE JMP OUTERR ;OH, OH! IT HAPPENED TO OUTPUT. TSK, TSK! .PAGE ;*********************************************************************** ;* ** ;* C P E R R — ** ;* USAGE. THE LINKAGE TO SUBROUTINE INVOICE IS: ** ;* ** ;* R0 = INPUT BUFFER ADDRESS ** ;* R1 = TERMINAL INDEX ** ;* JSR PC,INVOICE ** ;* ** ;* ONCE THE DELIVERY DOCUMENT IS CREATED, S˜ .IFG NRAK7-5 .WORD BF07.6,0 ;RACK 6 BUFFERS .WORD B107.6,0 .WORD B207.6,0 .WORD B307.6,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK7-6 .WORD BF07.7,0 ;RACK 7 BUFFERS .WORD B107.7,0 .WORD B207.7,0 .WORD B307.7,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK7-7 .WORD BF07.8,0 ;RACK 8 BUFFERS .WORD B107.8,0 .WORD B2™ID30: TST OUTWAIT ;SEE IF TTYOUT IS WAITING BEQ TYIF00 ;BRANCH IF IT ISN'T MOV R0,INWAIT ;OTHERWISE, WE'LL TIMESHARS THE TTY WITH IM JMP TYOGO ; ; THE INTERRUPT MUST HAVE BEEN CAUSED BY AN UNSOLICITED OPERATOR ; REQUEST. SWITCH TO UNSOLICITED INPUT MODE (IF WE'RE NOT ALREADY ; THERE). ; TYIE00: TST UNSOL ;HAVE WE ALREADY BEEN HERE? BNE TYIC00 ;BRANCH IFš ** ;* ** ;* ENTERED WHEN THE INPUT TIMER ELAPSES AND INDICATES THAT ** ;* SOMETHING HAS HAPPENED TO CP. ** ;* ** ;******* ** JSR PC,SWRCVE ;RE-INITIALIZE MODES, SET UP FOR JMP EXEC ;RECEIVE MODE AND REQUIRE ›UBROUTINE OUTPUT ** ;* IS CALLED TO TRANSMIT IT TO THE PROPER TERMINAL. ** ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* œ07.8,0 .WORD B307.8,0 .=.-12.+NBACK .ENDC .ENDC ; ; T E R M I N A L 8 ; TRK8: .IFG NTERM-7 ;ASSEMBLE ONLY IF MORE THAN 7 TERMINALS .WORD MN08.0,0 ;MANUAL ENTRY BUFFERS .WORD MN08.1,0 .WORD MN08.2,0 .WORD MN08.3,0 .=.-12.+NBACK4 ; .WORD RD08.0,0 ;REDIAL BUFFERS .WORD RD08.1,0 .WORD RD08.2,0 .WORD RD08 YES MOV #TTYBUF,R2 ;SET POINTERS TO OPERATOR DEMAND BUFFER MOV #OPRBUF,(R2)+ ;BUFFER ADDRESS MOV #NOPR,(R2)+ ;BUFFER SIZE ADDRESS MOV #NENTRY,(R2)+ ;BUFFER MAX SIZE ADDRESS INC UNSOL ;SET UNSOL = 1 INC TTYUSE ;SET TTYUSE = ( (INPUT MODE) MOV #DEMAND,TADDR+TYIN ;STORE DEMAND ADDRESS TO PROCESS ;OPERATOR'S REQUEST BR TYICžA RERING ;BEFORE CONTINUING .PAGE ;*********************************************************************** ;* ** ;* O U T P U T ** ;* ** ;* PROGRAM IDENTIFICATION. OUTPUT - COMMUNICATIONS OUTPUT ** ;* SUBROUTINE. Ÿ ** ;*********************************************************************** .DEF INVOICE, FORMAT,HEADER .REF OUTPUT,PREPARE,DELIVR .IFNZ $DISC .REF DISCIO .ENDC ; ; ; ; ; ; .PAGE ;*********************************************************************** ;* ** ;* THE GENERAL PROCEDURE IS:  .3,0 .=.-12.+NBACK4 ; .WORD BF08.1,0 ;RACK 1 BUFFERS .WORD B108.1,0 .WORD B208.1,0 .WORD B308.1,0 .=.-12.+NBACK4 ; .IFG NRAK8-1 .WORD BF08.2,0 ;RACK 2 BUFFERS .WORD B108.2,0 .WORD B208.2,0 .WORD B308.2,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK8-2 .WORD BF08.3,0 ;RACK 3 BUFFERS .WORD B108.3,0 .WORD B208Ħ00 ;GO GET THE CHARACTER AND PLAY WITH IT ; ENTER HERE FROM TTYOUT WHEN IT IS DONE WITH AN OUTPUT REQUEST. ; TTYIN WILL NOW CONTINUE WITH ITS NEXT REQUEST. ; ; TYIG3: TYIF00: BIC #100,@#TPS ;DISABLE OUTPUT INTERRUPT MOV TYISTR,R0 ;CHECK TTYIN QUEUE BNE TYIB10 ;BRANCH IF THER('S AN ENTRY IN IT CLR TTYUSE ;OTHERWISE, SET TTY NOT IN USE FLAG BR TYIC10 ;AND GO EXIT ˘ ** ;* ** ;* PURPOSE. THIS SUBROUTINE OUTPUTS ALL MESSAGES FROM THE ** ;* MICRO-HUB TO THE COMMUNICATIONS PROCESSOR AT THE TERMINAL. ** ;* OUTPUT AUTOMATICALLY PRECEDES ALL MESSAGES WITH AN STX AND ** ;* TRAILS ALL WITH: ETB/ETX, BCC AND X'FF'. IF THE CP DOES ** ;* NOT ACCEPT THE MESSAGE AFTER 'ATEMPT' TRANSMISSION ATTEMPTS ** ;* (EACH UNDER SEPARATE DIAL), THEN THE MESSAGE I£** ;* ** ;* 1. CREATE THE OUTPUT MESSAGE HEADER ** ;* 2. CREATE THE GROSS AND NET (IF INCLUDED) VOLUME TABLES ** ;* 3. CALL FORMAT TO CREATE THE INVOICE AND STORE IN OUTPUT ** ;* BUFFER (USE DELIVR TABLE FOR EDIT CONTROL) ** ;* 4. CALL OUTPUT TO TRANSMIT THE DOCUMENT. ** ;* ¤.3,0 .WORD B308.3,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK8-3 .WORD BF08.4,0 ;RACK 4 BUFFERS .WORD B108.4,0 .WORD B208.4,0 .WORD B308.4,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK8-4 .WORD BF08.5,0 ;RACK 5 BUFFERS .WORD B108.5,0 .WORD B208.5,0 .WORD B308.5,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK8-5 .WOR.PAGE ;*********************************************************************** ;* ** ;* I N T I M E ** ;* ** ;* ENTRY HERE (FROM SYSTEM TIMER) MEANS WE LOST AN INTERRUPT ** ;* FROM THE TTY. WHICH MEANS THE OPERATOR IS PROBABLY ** ;* SLUFFIN' OFF. ABORT THE REQUEST. ĤS DIVERTED TO ** ;* THE SYSTEM TELETYPE. ALL REQUESTS ARE PLACED IN A SINGLE- ** ;* PRIORITY QUEUE; ONE SUCH QUEUE EXISTS FOR EACH TERMINAL. ** ;* ** ;* TWO ENTRY POINTS, OUTACK AND OUTNAK, DO NOT PRECEDE AND ** ;* TRAIL AS SPECIFIED ABOVE. THESE TWO CAUSE ONLY TWO ** ;* CHARACTERS TO BE TRANSMITTED: ACK/NAK AND X'FF'. ** ;* § ** ;******* ** ; INVOICE: MOV R1,-(SP) ;SAVE TERMINAL NUMBER MOV OBUFRS(R1),R1 ;GET OUTPUT BUFFER ADDRESS MOV OUTBUF(R1),R1 JSR PC,HEADER ;CREATE THE MESSAGE HEADER MOV R0,-(SP) ;SAVE: R0 = INPUT BUFFER ADDRESS MOV R1,-(SP) ; R1 = NEXT CHAR. POSITION IN OUTPUT BUFR. MOV 4(SP),R0 ;RESTORE TERMINAL INDE¨D BF08.6,0 ;RACK 6 BUFFERS .WORD B108.6,0 .WORD B208.6,0 .WORD B308.6,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK8-6 .WORD BF08.7,0 ;RACK 7 BUFFERS .WORD B108.7,0 .WORD B208.7,0 .WORD B308.7,0 .WORD B308.7,0 .WORD B308.7,0 .WORD B308.7,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK8-7 .WORD BF08.8,0 ;RACK 8 BUFFERS İ ** ;* ** ;******* ** ; INTIME: TST UNSOL ;SEE IF IT'S UNSOLICITED OR SOLICITED BNE TYIG00 ;BRANCH IF UNSOLICITED CLRB @NREAD ;SOLICITED - SET NREAD = 0 (====> ERROR) MOVB #UARROW,@#TPB ;ECHO UPWARDS ARROW BR TYID10 ;AND CLEAR OUT OF HERE ; TYIG00: Ş ** ;* USAGE. THE LINKAGE TO THIS SUBROUTINE IS: ** ;* ** ;* MOV #LIST,R0 ** ;* MOV #TERM,R1 ** ;* JSR PC,OUTPUT ** ;* ** ;* WHERE LIST IS THE ADDRESS OF TĞX JSR PC,PREPARE ;PREPARE GROSS AND NET VOLUMES BY PRODUCT MOV #DELIVR,R0 ;SET: R0 = ADDRESS OF INVOICE EDIT TABLE MOV (SP)+,R2 ; R1 = INPUT BUFFER MOV (SP)+,R1 ; R2 = OUTPUT BUFFER JSR PC,FORMAT ;CREATE DELIVERY DOCUMENT MOV (SP)+,R0 ;GET TERMINAL INDEX MOV OBUFRS(R0),R0 ;GET OUTPUT BUFFER ADDRESS NEG OSTAT(R0) ;SET STATUS = READY TO BE OUTPUT Ĵ .WORD B108.8,0 .WORD B208.8,0 .WORD B308.8,0 .=.-12.+NBACK .ENDC .ENDC ; ; T E R M I N A L 9 ; TRK9: .IFG NTERM-8 ;ASSEMBLE ONLY IF MORE THAN 8 TERMINALS .WORD MN09.0,0 ;MANUAL ENTRY BUFFERS .WORD MN09.1,0 .WORD MN09.2,0 .WORD MN09.3,0 .=.-12.+NBACK4 ; .WORD RD09.0,0 ;REDIAL BUFFERS .WORD RD09.1,0 ­ CLR TSTAT+TYITM ;UNSOLICITED - CLR UNSOL ;CLEAR UNSOLICITED FLAG MOVB #UARROW,@#TPB ;ECHO UPWARDS ARROW BR TYID30 ;AND GO GO GO ... ; ; TYIX00: INC (R0) ;ERROR, I/O LIST NOT THREADABLE CLR @#PSR ; TST PC ;SET ERROR CONDITION RTS PC ;RETURN TO CALLER ; .PAGE ;*********************************************************HE MESSAGE AND THREE ADDITIONAL ** ;* CONTROL WORDS AS FOLLOWS: ** ;* ** ;* !---------------------------------! ** ;* ! THREAD ! ** ;* !---------------------------------! ** ;* ! COUNT ! ** ;* !-------------Ż MOV OUTBUF(R0),R0 ;GET THE REAL BUFFER ADDRESS JSR PC,OUTPUT ;AND OUTPUT THE BUFFER RTS PC ;RETURN TO CALLER .PAGE ;*********************************************************************** ;* ** ;* F O R M A T ** ;* ** ;* PROGRAM IDENTIFICATI° .WORD RD09.2,0 .WORD RD09.3,0 .=.-12.+NBACK4 ; .WORD BF09.1,0 ;RACK 1 BUFFERS .WORD B109.1,0 .WORD B209.1,0 .WORD B309.1,0 .=.-12.+NBACK4 ; .OFG NRAK9-1 .WORD BF09.2,0 ;RACK 2 BUFFERS .WORD B109.2,0 .WORD B209.2,0 .WORD B309.2,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK9-2 .WORD BF09.3,0 ;RACK 3 BUFFERS ħ************** ;* ** ;* T T Y O U T ** ;* ** ;* PROGRAM IDENTIFICATION. TTYOUT - SYSTEM TELETYPE OUTPUT ** ;* SUBROUTINE. ** ;* ** ;* PURPOSE. THIS SUBROUTINE OUTPUTS ALL MESS²--------------------! ** ;* ! NSIZE ! ** ;* !---------------------------------! ** ;* ! CHAR 2 ! CHAR 1 ! ** ;* !---------------------------------! ** ;* . ** ;* . ** ;* ³ON. FORMAT - PREPARE AN ASCII DOCUMENT ** ;* BY EDIT CONTROL. ** ;* ** ;* PURPOSE. THIS SUBROUTINE CREATES A GENERAL PURPOSE ** ;* DOCUMENT. THE METHOD EMPLOYED IS ENTIRELY DRIVEN BY AN ** ;* EDIT CONTROL TABLE. THIS LANGUAGE CAN BE USED TO CREATE ** ;* ANY DOCUMENT CONTAINING ASCII TEXT AND CAN INCLUDE MOST ** ;* INFORMATION ´ .WORD B109.3,0 .WORD B209.3,0 .WORD B309.3,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK9-3 .WORD BF09.4,0 ;RACK 4 BUFFERS .WORD B109.4,0 .WORD B209.4,0 .WORD B309.4,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK9-4 .WORD BF09.5,0 ;RACK 5 BUFFERS .WORD B109.5,0 .WORD B209.5,0 .WORD B309.5,0 .=.-12.+NBACK4 .ENDµAGES DIRECTED ** ;* TO THE MICRO-HUB SYSTEM TELETYPE. ALL REQUESTS ARE QUEUED, ** ;* BUT THE CALLING PROGRAM IS NOT SUSPENDED. AN OUTPUT ** ;* MESSAGE CAN BE STOPPED BY DEPRESSING THE MESSAGE ABORT ** ;* KEY (NOMINALLY = CTR BELL). ** ;* ** ;* USAGE. THE LINKAGE TO SUBROUTINE TTYOUT IS: ** ;* ĥ . ** ;* !---------------------------------! ** ;* ! CHAR NSIZE ! CHAR NSIZE-1 ! ** ;* !---------------------------------! ** ;* WHERE: ** ;* THREAD = 1 ** ;* COUNT = RESERVED FOR USE BY OUTPUT ** ;* ·RETAINED DURING A TRANSACTION. ** ;* ** ;* USAGE. THE LINKAGE TO FORMAT IS: ** ;* ** ;* R0 = ADDRESS OF EDIT TABLE ** ;* R1 = ADDRESS OF CP BUFFER: REQUIRED ONLY IF INFORMATION ** ;* CONTAINED THEREIN IS REQUIRED. ** ;* R2 ¸C ; .IFG NRAK9-5 .WORD BF09.6,0 ;RACK 6 BUFFERS .WORD B109.6,0 .WORD B209.6,0 .WORD B309.6,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK9-6 .WORD BF09.7,0 ;RACK 7 BUFFERS .WORD B109.7,0 .WORD B209.7,0 .WORD B309.7,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK9-7 .WORD BF09.8,0 ;RACK 8 BUFFERS .WORD B109.8,0 ı ** ;* R0 = BUFFER ADDRESS ** ;* JSR PC,TTYOUT ** ;* BNE ERROR ;ERROR = ILLEGAL THREAD WORD ** ;* ** ;* THE FORMAT OF THE DATA BUFFER IS DEPICTED BELOW: ** ;* !---------------------------------! ** ;* ! THRş NSIZE = NUMBER OF CHARACTERS IN MESSAGE ** ;* CHAR 5 = MESSAGE ** ;******* ******** .PAGE ;******* ******** ;* ** ;* THERE ARE THREE SECONDARY ENTRY POINTS TO OUTPUT. EACH IS ** ;* SUMMARIZED BELOW: ğ = ADDRESS OF BUFFER INTO WHICH THE FORMATTED TEXT IS ** ;* STORED ** ;* JSR PC,FORMAT ** ;* ** ;* REGISTERS ARE NOT SAVED BY FORMAT. FORMAT REQUIRES THAT ** ;* THE GROSS AND NET VOLUME TABLES BE PREPARED IF THE INFORMATION** ;* IS USED. IN THE EDIT TABLE, ALL COMMANDS ARE PRECEDED BY ** ;* ĵ .WORD B209.8,0 .WORD B309.8,0 .=.-12.+NBACK .ENDC .ENDC ; ; T E R M I N A L 1 0 ; TRK10: .IFG NTERM-9 ;ASSEMBLE ONLY IF MORE THAN 9 TERMINALS .WORD MN10.0,0 ;MANUAL ENTRY BUFFERS .WORD MN10.1,0 .WORD MN10.2,0 .WORD MN10.3,0 .=.-12.+NBACK4 ; .WORD RD10.0,0 ;REDIAL BUFFERS .WORD RD10.1,0 .WORD RD10.2,0 ½EAD ! ** ;* !---------------------------------! ** ;* ! NCHAR ! ** ;* !---------------------------------! ** ;* ! CHAR 2 ! CHAR 1 ! ** ;* !---------------------------------! ** ;* ** ;* ** ;* ** ;* MOV #TERM,R1 ;LOAD TERMINAL INDEX (0,2,...) ** ;* JSR PC,OUTSTR ;TO RESTART OUTPUT FOR TERMINAL ** ;* ;(USUALLY FROM A REDIAL REQUEST) ** ;* ** ;* JSR PC,OUTACK ;TO SEND CP AN ACK ** ;* -OR- ż AN @ SYMBOL. THE COMMAND THAT FOLLOWS CAN BE (REFER TO ** ;* DOCUMENTATION FOR DETAILS): ** ;* ** ;* COMMAND MEANING ! COMMAND MEANING ** ;* A MM/DD/YY ! O NET VOLUME ** ;* B HH:MM ! P PRODUCT CODE (GROSS) ** ;* C CUSTOMER NUMBER ! Q PRODUCT NAME (GROSS) À .WORD RD10.3,0 .=.-12.+NBACK4 ; .WORD BF10.1,0 ;RACK 1 BUFFERS .WORD B110.1,0 .WORD B210.1,0 .WORD B310.1,0 .=.-12.+NBACK4 ; .IFG NRAK10-1 .WORD BF10.2,0 ;RACK 2 BUFFERS .WORD B110.2,0 .WORD B210.2,0 .WORD B310.2,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK10-2 .WORD BF10.3,0 ;RACK 3 BUFFERS .WORD B110.3,0 Á . ** ;* . ** ;* . ** ;* ** ;* !---------------------------------! ** ;* ! CHAR NCHAR ! CHAR NCHAR-1 ! ** ;* !---------------------------------! ** ;*  ** ;* JSR PC,OUTNAK ;TO SEND CP A NAK ** ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* ** ;* D CUSTOMER NAME ! R PRODUCT CODE (NET) ** ;* E TERMINAL ID ! S PRODUCT NAME (NET) ** ;* F CARRIER NUMBER ! T GROSS PRODUCT TOTALS ** ;* G TRUCK NUMBER ! U NET PRODUCT TOTALS ** ;* H DRIVER NUMBER ! V LOOP ON ALL PRODUCTS ** ;* I TERMINAL NAME ! W LOOP N TIMES ** ;* J CARRIER NAME ! X INVOICE NUMBER Ä .WORD B210.3,0 .WORD B310.3,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK10-3 .WORD BF10.4,0 ;RACK 4 BUFFERS .WORD B110.4,0 .WORD B210.4,0 .WORD B310.4,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK10-4 .WORD BF10.5,0 ;RACK 5 BUFFERS .WORD B110.5,0 .WORD B210.5,0 .WORD B310.5,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK10Ċ ** ;* THREAD = 1, ALWAYS (USED FOR REQUEST QUEUEING ** ;* NCHAR = NUMBER OF CHARACTERS IN MESSAGE ** ;* CHAR K = MESSAGE ** ;* ** ;* THE CONTENTS OF REGISTERS R0 - R5 ARE DESTROYED. ** ;* COPYRIGHT 1972 ** ;* Ĉ ** ;*********************************************************************** ; TSWITCH:.WORD 0 ;USED TO CONTROL OUTPUT'S ACTIONS OBCC: .WORD 0 ;RUNNING BCC OF CURRENT OUTPUT REQUEST .WORD -1 ;TRAILING X'FF' TO SEND AFTER BCC OBUSY: .WORD 0 ;1 = OUTPUT BUSY COUNT = 2 ;POSITION OF RETRY = 4 ; INPUT PARAMETERS NSIZE = 6 ; IN THE I/O Ç ** ;* K TRUCK NAME ! Y JULIAN DATE - YYDDD ** ;* L DRIVER NAME ! Z N BLANK CHARACTERS ** ;* M GROSS VOLUME ! 0 TAB TO POSITION N ** ;* N TEMPERATURE ! ** ;* ** ;* ** ;* COPYRIGHT 1972 È-5 .WORD BF10.6,0 ;RACK 6 BUFFERS .WORD B110.6,0 .WORD B210.6,0 .WORD B310.6,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK10-6 .WORD BF10.7,0 ;RACK 7 BUFFERS .WORD B110.7,0 .WORD B210.7,0 .WORD B310.7,0 .=.-12.+NBACK4 .ENDC ; .IFG NRAK10-7 .WORD BF10.8,0 ;RACK 8 BUFFERS .WORD B110.8,0 .WORD B210.8,0 É GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* ** ;*********************************************************************** ; TYOSTR: .WORD 0 ;POINTER TO FIRST ENTRY IN QUEUE TYOEND: .WORD TYOSTR ;POINTER TO LAST ENTRY IN QUEUE OUTWAIT:.WORD ÊLIST CHARK = 8. ; OQSTR: .WORD 0 ;POINTER TO BEGINNING OF QUEUE - TERMINAL 1 .WORD 0 ;POINTER TO BEGINNING OF QUEUE - TERMINAL 2 .WORD 0 ;POINTER TO BEGINNING OF QUEUE - TERMINAL 3 .WORD 0 ;POINTER TO BEGINNING OF QUEUE - TERMINAL 4 .WORD 0 ;POINTER TO BEGINNING OF QUEUE - TERMINAL 5 .WORD 0 ;POINTER TO BEGINNING OF QUEUE - TERMINAL 6 Ë ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* ** ;*********************************************************************** .DEF FORMAT .REF BINASC,DATE,TIME ;* ;* ;* THIS TABLE CONVERTS THE COMMAND CODE TO AN ADDÌ.WORD B310.8,0 .=.-12.+NBACK .ENDC .ENDC .PAGE ;*********************************************************************** ;* ** ;* D A T A B U F F E R S ** ;* ** ;* ** ;******* (THE REAL THING) Í 0 ;1 = TTYOUT WAITING ON TTYIN NWRITE: .WORD 0 ;OUTPUT CHARACTER INDEX ; ; .DEF TTYOUT ; .PAGE ;*********************************************************************** ;* ** ;* TTYOUT CALL SECTION BEGINS HERE. THIS PORTION QUEUES THE ** ;* REQUEST AND, IF THE TTY IS IDLE, INITIATES THE OUTPUT. ** ;* Î .WORD 0 ;POINTER TO BEGINNING OF QUEUE - TERMINAL 7 .WORD 0 ;POINTER TO BEGINNING OF QUEUE - TERMINAL 8 .WORD 0 ;POINTER TO BEGINNING OF QUEUE - TERMINAL 9 .WORD 0 ;POINTER TO BEGINNING OF QUEUE - TERMINAL 10 .=OQSTR+NTERM+NTERM ; OQEND: .WORD OQSTR ;POINTER TO END OF QUEUE ------- TERMINAL 1 .WORD OQSTR+2. ;POINTER TO END OF QUEUE ------- TERMINAL 2 ÏRESS OF A ;* PROCESSING SUBROUTINE. ;* ;* PRCESS: .WORD CMD.A ;INSERT DATE - MM/DD/YY .WORD CMD.B ;INSERT TIME - HH;MM .WORD CMD.C ;INSERT CUSTOMER NUMBER .IFNZ SALPHA .WORD CMD.D ;INSERT CUSTOMER NAME ---- LINE NO. .ENDC .IFZ $ALPHA .WORD NOP ; .ENDC .WORD CMD.E ;INSERT TERMINAL ID (5 CHAR) .WORD CMD.F ** ; .DEF MN01.0 ; .IFG NTERM MN01.0 = .+4 ;********** T E R M I N A L 1 *********** .=.+$CMPSG+4 ;MANUAL .IFG NBACK ; ENTRY MN01.1 = .+4 ; BUFFER .=.+$CMPSG+4 ; .....AND .ENDC ; BACKUP .IFG NBACK-1 = BUFFERS MN01.2 = .+4 ; .=.+$CPMSG+4 ; Ñ ** ;******* ** ; TTYOUT: MOV #INHIBIT,@#PS ;INHIBIT INTERRUPTS DEC (R0) ;QUEUE THE REQUEST BEQ TYOA00 ;BRANCH IF THREAD WORD IS LEGAL INC (R0) ;OTHERWISE, RETURN ERROR TO CALLER CLR @#PS RTS PC ; TYOA00: MOV R0,@TYOEND ;PLACE REQUEST IN THREAD MOV R0,TYOEND ; CMP Ò .WORD OQSTR+4. ;POINTER TO END OF QUEUE ------- TERMINAL 3 .WORD OQSTR+6. ;POINTER TO END OF QUEUE ------- TERMINAL 4 .WORD OQSTR+8. ;POINTER TO END OF QUEUE ------- TERMINAL 5 .WORD OQSTR+10. ;POINTER TO END OF QUEUE ------- TERMINAL 6 .WORD OQSTR+12. ;POINTER TO END OF QUEUE ------- TERMINAL 7 .WORD OQSTR+14. ;POINTER TO END OF QUEUE ------- TERMINAL 8 .WORD OQSTR+16. ;POINTER TO END Ó ;INSERT CARRIER NUMBER (4 CHAR) .WORD CMD.G ;INSERT TRUCK NUMBER (5 CHAR) .WORD CMD.H ;INSERT DRIVER NUMBER (3 CHAR) .IFNZ $ALPHA .WORD CMD.I ;INSERT TERMINAL NAME ---- LINE NO. .WORD CMD.J ;INSERT CARRIER NAME ----- LINE NO. .WORD CMD.K ;INSERT TRUCK NAME ------- LINE NO. .WORD CMD.L ;INSERT DRIVER NAME ------ LINE NO. .ENDC .IFZ $ALPHA Ô .ENDC ; .IFG NBACK-2 ; MN01.3 = .+4 ; .=.+$CPMSG+4 ; .ENDC ; .ENDC ; ; .IFG NTERM RD01.0 = .+4 .=.+$CPMSG+4 ; REDIAL .IFG NBACK ; BUFFERS RD01.1 = .+4 ; AND .=.+$CPMSG+4 ; BACKUP .ENDC ; BUFFERS .IFG Ġ #1,TTYUSE ;SEE WHAT MODE THE TTY IS IN BGT TYOA10 ;BRANCH IF IN OUTPUT MODE BLT TYOA20 ;BRANCH IF AVAILABLE INC OUTWAIT ;TTYIN IS USING IT; SET OUTPUT WAITING ; ;FLAG TYOA10; CLR R1 ;SET 'OK' CONDITION RTS PC ;AND RETURN TO CALLER ; ; ; TTY IS FREE, SO WE'LL SET IT BUSY AND START THE OUTPUT ; OF THE CURRENT REQUEST. ; ;TYOA2ÖOF QUEUE ------- TERMINAL 9 .WORD OQSTR+20. ;POINTER TO END OF QUEUE ------- TERMINAL 10 .=OQEND+NTERM+NTERM ACKNAK: .WORD 0 ;1 = ACK/NAK ONLY, 0 = NORMAL REUQEST ADDR: .WORD 0 ;ADDRESS OF CURRENT OUTPUT LIST LENGTH: .WORD 0 ;NO. CHARACTERS LEFT IN CURRENT OUTPUT OTERM: .WORD 0 ;INDEX OF CURRENT TERMINAL OINDEX: .WORD OBCC ;OUTPUT BCC INDEX .PAGE ;*********************************× .WORD NOP :NO-OPS IF ALPHANUMERIC .WORD NOP ; ISN'T INCLUDED IN SYSTEM .WORD NOP ; .WORD NOP .ENDC .WORD CMD.M ;INSERT GROSS VOLUME (6 CHAR) ------ OCCUR NO. .WORD CMD.N ;INSERT TEMPERATURE (3 CHAR) ------ OCCUR NO. .WORD CMD.O ;INSERT NET VOLUME (6 CHAR) ------ OCCUR NO. .WORD CMD.P ;INSERT PRODUCT CODE (2 CHAR) ------ OCCUR NO.ĜNBACK-1 ; RD01.2 = .+4 ; .=.+$CPMSG+4 ; .ENDC ; .IFG NBACK-2 ; RD01.3 = .+4 ; .=.+$CPMSG+4 ; .ENDC ; .ENDC ; ; .IFG NTERM .IFG NRAK1 BF01.1 = .+4 ;*************** R A C K 1 *************** .=.+$CPMSG+4 ; .IFG NBACK ;MÙ0: INC TTYUSE ;SWITCH TTY TO OUTPUT MODE CLR @#PS ;ENABLE INTERRUPTS MOV #100,@#TPS ;ENABLE TTY OUTPUT INTERRUPT MOV #$200MS,VALUE+TYOTM ;SET TIMER FOR 200 MS CLR NWRITE ;CLEAR BUFFER INDEX MOVB 4(R0),@#TPB ;PRINT FIRST CHARACTER BR TYOA10 ;THEN RETURN TO CALLER .PAGE ;*************************************************************Ú************************************** ;* ** ;* START OUTWITH THE ENTRY POINTS FOR CALL, THEN GO TO ** ;* COMMON CODE FOR ALL. ** ;* ** ;* OUTPUT - COMMUNICATIONS OUTPUT ROUTINE ** ;* OUTSTR - START UP OUTPUT AGAIN (RESPONSE TO CP REDIAL) ** ;* OUTACK - SEND ACK Û .WORD CMD.Q ;INSERT PRODUCT NAME --------------- OCCUR NO. .WORD NOP ; .WORD NOP ; .WORD CMD.T ;INSERT GROSS PRODUCT TOTALS --- TERM.INDEX/2 .WORD CMD.U ;INSERT NET PRODUCT TOTALS ----- TERM INDEX/2 .WORD CMD.V ;LOOP ON NO. OF PRODUCTS IN TRANS.-- LOOP ADDR .WORD CMD.W ;LOOP N TIMES --------- N .WORD CMD.X ;INSERT INVOICE NUMBER (ÜAIN BUFFER B101.1 = .+4 ; .=.+$CPMSG+4 ; BACKUP 1 .ENDC ; .IFG NBACK-1 ; B201.1 = .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ; .IFG NBACK-2 ; B301.1 = .+4 ; .=.+$CPMSG+4 ; BACKUP 3 .ENDC ; .ENDC ; .ENDC Ŭ********** ;* ** ;* O U T I N T ** ;* ** ;* TELETYPE OUTPUT INTERRUPT. INTERRUPTS INHIBITED ON ENTRY. ** ;* ;******* ; OUTINT: JSR R5,SAVE ;SAVE THE REGISTERS CMP #2,TTYUSE ;IF WE'RE NOT IN THE TTY OUTPUT MODE, BEQ TYOB10 ;THEN IGNORE THIŜTO CP ** ;* OUTNAK - SEND NAK TO CP ** ;* ** ;******* ** ; OUTPUT: MOV #INHIBIT,'HPS ;INHIBIT INTERRUPTS DEC (R0) ;QUEUE THE REQUEST BNE ;OODS, WHAT'LL WE DO NOW - BAD THREAD WORD MOV R0,'OQEND(R1) MOV ß6 CHAR) .WORD CMD.Y ;INSERT JULIAN DATE (YYDDD) .WORD CMD.Z ;INSERT N BLANKS ------------ N (2 BYTES) .WORD CMD.0 ;TAB TO CHAR. POSITION N ---- N (2 BYTES) .WORD NOP ;1 .WORD NOP ;2 .WORD NOP ;3 .WORD NOP ;4 .WORD NOP ;5 .WORD NOP ;6 .WORD NOP ;7 .WORD NOP ;8à ; ; .IFG NTERM .IFG NRAK1-1 BF01.2 = .+4 ;*************** R A C K 2 *************** .=.+$CPMSG+4 ; .IFG NBACK ;MAIN BUFFER B101.2 = .+4 ; .=.+$CPMSG+4 ; BACKUP 1 .ENDC ; .IFG NBACK-1 ; B201.2 = .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ; .IFG áS INTERRUPT CLR @#TPS ;(MAKE SURE TTY OUTPUT INTERRUPT IS DISABLED) ; TYOB00: JSR R5,RESTOR ;RESTORE REGISTERS RTI ;AND EXIT ; TYOB10: INC NWRITE ;INCREMENT MESSAGE INDEX MOV TYOSTR,R0 ;GET BUFFER ADDRESS CMP NWRITE,2(R0) ;SEE IF WE'RE DONE BGE TYOC00 ;BRANCH IF YES ADD NWRITE,R0 ;GET ADDRESS OF NEXT CHARACTER MOVB â R0,OQEND(R1) MOV #ATEMPT,COUNT(R1) ;INITIALIZ NO. ATTEMPTS COUNTER CLR R2 ;CLEAR ACK-NAK FLAG BR OUTA10 ; OUTSTR: MOV #INHIBIT,'#PS ;INHIBIT INTERRUPTS CLR R2 MOV OQSTR(R1),R0 ;ANY REQUESTS FOR THIS TERMINAL? BNE OUTA10 ;BRANCH IF YES CLR '#PS ;OTHERWISE, ENABLE INTERRUPTS RTS PC ;AND RETURN TO CALLER ; OUTACK .WORD NOP ;9 .WORD NOP ;COLON .WORD NOP ;SEMI-COLON .WORD NOP ;.LT. .WORD NOP ; = .WORD NOP ;.GT. .WORD NOP ;.GT. .WORD NOP ; ? .WORD NOP ; @ .PAGE ;*********************************************************************** ;* ä NBACK-2 ; B301.2 = .+4 ; .=.+$CPMSG+4 ; BACKUP 3 .ENDC ; .ENDC ; .ENDC ; ; .IFG NTERM .IFG NRAK1-2 BF01.3 = .+4 ;*************** R A C K 3 *************** .=.+$CPMSG+4 ; .IFG NBACK ;MAIN BUFFER B101.3 = .+4 ; .=.+$CPMSG+4 ; BACKUP ċ(R0),@#TPB ;PRINT CHARACTER TYOB20: ; MOV #$200MS,VALUE+TYOTM ;RESET TIMER BR TYOB00 ;AND GO EXIT ; ; ; THE CURRENT REQUEST HAS BEEN COMPLETELY PRINTED. DEQUEUE IT ; AND CHECK FOR MORE TO DO. ; ; TYOC00: MOV (R0),R0 ;DEQUEUE THE REQUEST MOV R0,TYOSTR BNE TYOC10 ;BRANCH IF MORE IN QUEUE MOV #TYOSTR,TYOEND ;OTHERWISE, RESET QUĉ: MOV #INHIBIT,'#PS ;INHIBIT INTERRUPTS MOV #1,R2 ;SET ACK FLAG BR OUTA10 ; OUTNAK: MOV #INHIBIT,'#PS ;INHIBIT INTERRUPTS MOV #-1,R2 ;SET NAK FLAG ; ; ...AND NOW FOR THE COMMON CODE... ; OUTA10: TST OBUSY ;IS OUTPUT ROUTINE BUSY BEQ OUTA20 ;BRANCH IF NO - AND GRAB IT TST R2 ;IT'S BUSY. WELL THAT'S NOT TOO BAD BEQ ç ** ;* THIS SECTION OF THE CODE INTERROGATES EACH CHARACTER, IF ** ;* THE CHARACTER IS TEXT, IT IS MOVED TO THE OUTPUT BUFFER. ** ;* IF IT IS CONTROL (@) THEN THE APPROPRIATE PROCESSING ** ;* ROUTINE IS EXECUTED ** ;* ** ;******* ** ; FORMAT: MOV R3,-(SP) ;SAVE BUè1 .ENDC ; .IFG NBACK-1 ; B201.3 = .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ; .IFG NBACK-2 ; B301.3 = .+4 ; .=.+$CPMSG+4 ; BACKUP 3 .ENDC ; .ENDC ; .ENDC ; ; .IFG NTERM .IFG NRAK1-3 BF01.4 = .+4 éEUE POINTER ; TYOC10: TST INWAIT ;SEE IF AN INPUT REQUEST IS WAITING BNE TYOC30 ;BRANCH IF YES TST R0 ;CONTINUE WITH NEXT INPUT REQUEST, BEQ TYOC20 ;IF THERE IS A NEXT REQUEST... TYOC15: CLR NWRITE ;OK, THERE IS. RESET COUNTER MOVB 4(R0),@#TPB ;AND PRINT FIRST CHARACTER BR TYOB20 ;GO RESET TIMER AND EXIT ; TYOC20: CLR @#TPS êOUTA40 ;UNLESS ACK/NAK WAS REQUESTED MOV #-1,R0 ;IN THEORY (HE SAID JOKINGLY) THIS ;SHOULDN'T HAPPEN. SET R0 = -1 TO ; ;TELL CALLER OUTA20: CLR '#PS ;ENABLE INTERRUPTS ; OUTA30: RTS PC ;RETURN TO CALLER ; ; ROUTINE IS NOT BUSY. SO GRAB IT AND START OUTPUT. ; OUTA40: INC OBUSY ;SET OUTPUT BUSY MOV R2,ACKNAK ëFFER START ADDRESS MOV #100,R5 ;SET R5 = @ (100) ; FORA00: CLR R4 BISB (R0)+,R4 ;GET NEXT CHARACTER FROM EDIT TABLE CMP R5,R4 ;IS IT CONTROL (@)? BEQ FORA10 ;BRANCH IF YES MOVB R4,(R2)+ ;OTHERWISE, MOVE THE CHARACTER TO BR FORA00 ;THE OUTPUT BUFFER AND GO GET NEXT ; FORA10: CLR R4 ;CHARACTER IS CONTROL (@) BISB (R0)+,ì ;*************** R A C K 4 *************** .=.+$CPMSG+4 ; .IFG NBACK ;MAIN BUFFER B101.4 = .+4 ; .=.+$CPMSG+4 ; BACKUP 1 .ENDC ; .IFG NBACK-1 ; B201.4 = .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ; .IFG NBACK-2 ; B301.4 = .+4 ; .=.+$CPMSG+4 í ;OUTPUT QUEUE EMPTY - DISABLE OUTPUT INT. CLR TTYUSE ;SET TTY NOT IN USE FLAG BR TYOB00 ;AND EXIT ; TYOC30: MOV R0,OUTWAIT ;GET HERE IF TTYIN WANTS A CRACK AT TTY CLR @#PS DEC TTYUSE JMP TYIGO ;GO TO TTY INPUT SUBROUTINE ; ; ; RETURN HERE FROM TTYIN - SET UP TO CONTINUE TTY OUTPUT ; TYOGO: MOV #INHIBIT,@#PS ;INHIBIT INTERRUPTS MOV #2,TTYUSî ;SAVE ACK/NAK FLAG CLR TSWITCH ;CLEAR TSWITCH CLR '#PS ;ENABLE INTERRUPTS MOV #TENABL!SPEED!STOP,'#TSCR ;SWITCH DC11 TO TRANSMIT MODE TST R2 ;ACK/NAK REQUEST BNE OUTA60 ;BRANCH IF YES ; OUTA50: MOV R0,ADDR ;SAVE LIST ADDRESS MOV NSIZE(R0),LENGTH ;AND MESSAGE SIZE ; OUTA60: MOV #S10SEC,VALUE+OUTTM ;SET TIMER FOR 10 SECONDS ïR4 ;GET NEXT CHARACTER CMP R4,#377 ;END OF TABLE ? BEQ ;BRANCH IF YES SUB #60,R4 ;OTHERWISE CONVERT THE CONTROL COMMAND ASL R4 ;TO A PROCESSING SUBROUTINE JMP @PRCESS(R4) ;GO PROCESS THE COMMAND .PAGE ;ALL PROCESSING ROUTINES RETURN TO FORA00 ;* ;* I N S E R T D A T E - MM/DD/YY ;* .IFNZ $CMDA CMD.A: MOV #DATE,R3 ; BACKUP 3 .ENDC ; .ENDC ; .ENDC ; ; .IFG NTERM .IFG NRAK1-4 BF01.5 = .+4 ;*************** R A C K 5 *************** .=.+$CPMSG+4 ; .IFG NBACK ;MAIN BUFFER B101.5 = .+4 ; .=.+$CPMSG+4 ; BACKUP 1 .ENDC ; .IFG NBACK-1 ; B201.5 = ñE ;SET TO TTY OUTPUT MODE CLR OUTWAIT ;CLEAR OUTPUT WAITING FLAG MOV #100,@#TPS ;ENABLE TTY OUTPUT INTERRUPT MOV TYOSTR,R0 BR TYOC15 .PAGE ;*********************************************************************** ;* ** ;* O U T I M E ** ;* òDELAY ; OUTA70: MOV #REQSND,'#TSCR ;ISSUE REQUEST TO SEND BR OUTA30 ;RETURN TO CALLER .PAGE ;*********************************************************************** ;* ** ;* O U T I N T ** ;* ** ;* TRANSMIT INTERRUPT PROCESSING ROUTINE, ENTERó MOV #8.,R4 .ENDC ; FORA20: MOVB (R3)+,(R2)+ ;MOVE THE REQUIRED ASCII STRING TO DEC R4 ;THE OUTPUT BUFFER BGT FORA20 ;R3 = ADDRESS OF STRING BR FORA00 ;R4 = NUMBER OF CHARACTERS ;* ;* I N S E R T T I M E - H H : M M ;* .IFNZ $CMDB CMD.B: MOV #TIME,R3 MOV #5,R4 BR FORA20 .ENDC ;* ;* I N S E R T C U S T O M E Rô .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ; .IFG NBACK-2 ; B301.5 = .+4 ; .=.+$CPMSG+4 ; BACKUP 3 .ENDC ; .ENDC ; .ENDC ; ; .IFG NTERM .IFG NRAK1-5 BF01.6 = .+4 ;*************** R A C K 6 *************** .=.+$CPMSG+4 ; ġ ** ;* ENTRY HERE FROM TIMER ROUTINE MEANS WE LOST THE OUTPUT ** ;* INTERRUPT. WE'LL KEEP PLUGGIN' AWAY, BUT AT A SLOWER RATE ** ;* ;******* ; OUTIME: CLR -(SP) ;MAKE STACK LOOK LIKE AN INTERRUPT MOV #EXEC,-(SP) ;STORE PS VALUE SUB #12.,SP BR TYOB10 ;THEN GO DO NEXT CHARACTER .PAGE ;*********************************************************************** ;* öED WHENEVER ** ;* ONE OF THE FOLLOWING OCCURS: ** ;* ** ;* 1. TRANSMITTER READY FOR ANOTHER CHARACTER (PREVIOUS ** ;* CHARACTER SENT) ** ;* 2. RECEIPT OF 'CLEAR-TO-SEND' FROM DATA MODEM ** ;* ** ;*******************************************÷ N U M B E R ;* .IFNZ $CMDC CMD.C: MOV R1,R3 ADD #CUST,R3 ;SET R3 = ADDRESS OF CUST. NO. IN CP BUFFER MOV #CUSTSZ,R4 BR FORA20 .ENDC ;* ;* I N S E R T C U S T O M E R N A M E ;* .IFNZ $ALPHA .INFZ $CMDD CMD.D: CLR R5 ;R5 = TYPE (CUSTOMER NAME) MOV R1,R3 ADD #CUST,R3 ;R3 = ADDRESS OF CUSTOMER NUMBER MOV #CUSĝ .IFG NBACK ;MAIN BUFFER B101.6 = .+4 ; .=.+$CPMSG+4 ; BACKUP 1 .ENDC ; .IFG NBACK-1 ; B201.6 = .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ; .IFG NBACK-2 ; B301.6 = .+4 ; .=.+$CPMSG+4 ; BACKUP 3 .ENDC ; .ENDC ; ù ** ;* T I M E R ** ;* ** ;* PROGRAM IDENTIFICATION. TIMER - SYSTEM TIMER ROUTINE ** ;* ** ;* PURPOSE. THIS ROUTINE IS DRIVEN BY THE CLOCK INTERRUPT ** ;* AND PERFORMS THE LOGIC REQUIRED TO EXECUTE PROGRAMS ON AN ** ;* ELAPSED TIME Bú**************************** ; OUTINT: JSR R5,SAVE ;SAVE GENERAL REGISTERS TST MODE ;ARE WE IN TRANSMIT MODE? BEQ OUT ;BRANCH IF YES TST ACKNAK ;WELL, WE MIGHT BE PREPARING TO SEND ACK/NAK BEQ OUTC40 ;BRANCH IF WE'RE NOT OUTB00: MOV TSWITCH,R0 ;UDDERWISE, SEE WHAT ACTION WE'RE ASL R0 ;SUPPOSED TO FOLLOW JMP OTABLE(R0) OTABLE: ûTSZ,R4 ;R4 = NO. CHAR. IN CUSTOMER NUMBER .ENDC ; FORB00: MOV R1,-(SP) ;SAVE R1 TEMPORARILY (INPUT BUFFER ADDR) MOV #NAME,R1 ;GET READY TO SEARCH NAME TABLE MOV R,-(SP) ;SAVE R2 MOV R3,-(SP) ; AND R3 ; FORB10: MOV R1,-(SP) CMPB R4,(R1)+ ;DOES THE CURRENT ENTRY HAVE THE RIGHT BNE FORB40 ;NO. OF CHAR.? BRANCH IF NO. CMPB (R0),(R1)+ ü .ENDC ; ; .IFG NTERM .IFG NRAK1-6 BF01.7 = .+4 ;*************** R A C K 7 *************** .=.+$CPMSG+4 ; .IFG NBACK ;MAIN BUFFER B101.7 = .+4 ; .=.+$CPMSG+4 ; BACKUP 1 .ENDC ; .IFG NBACK-1 ; B201.7 = .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ŭASIS. ELAPSED TIME DELAYS CAN RANGE FROM ** ;* 100 MILLISECONDS TO OVER 100 MINUTES. ** ;* ** ;* USAGE. TIMER WORKS ON A FIXED QUEUE BASIS, WHEREIN ANY ** ;* PROGRAM THAT NEEDS TIMEOUT CAPABILITY IS ASSIGNED A FIXED ** ;* SLOT IN THE QUEUE. THE FORMAT OF THIS TABLE IS: ** ;* ** ;* ŝ.WORD OUTC00 ;0 - CLEAR TO SEND .WORD OUTD00 ;1 - SEND DATA .WORD OUTE00 ;2 - SEND ETB/ETX .WORD OUTF00 ;3 - SEND BCC/X'FF' .WORD OUTG00 ;4 - END OF REQUEST .WORD OUTC40 ;5 - IGNORE ;* ;* ;* INTERRUPT SHOULD BE FROM A 'CLEAR-TO-SEND' FROM THE DATA ;* MODEM. BUT MAKE SURE ANYWAY ;* ;* OUTC00: BIT #CLEAR,'#TCSR ;IS INTERRUPT FROM 'CLEAR-TO-SEND'? BEQ ˙ ;HOW ABOUT THE LINE NO.? BNE FORB40 ;BRANCH IF DIFFERENT MOV R4,-(SP) ;COMPARE THE CHARACTER CODE NAME CMP (R1)+,(R1)+ ; FORB20: CMPB (R1)+,(R3)+ BNE FORB30 ;BRANCH IF NAMES DISAGREE DEC R4 BGT FORB20 ;CHECK ALL CHARACTERS TST (SP)+ ;CODES AGREE, SO SET UP TO GET NAME MOV (SP)+,R1 ;GET BEGINNING ADDRESS OF CURRENT NAME ENTRY  ; .IFG NBACK-2 ; B301.7 = .+4 ; .=.+$CPMSG+4 ; BACKUP 3 .ENDC ; .ENDC ; .ENDC ; ; .IFG NTERM .IFG NRAK1-7 BF01.8 = .+4 ;*************** R A C K 8 *************** .=.+$CPMSG+4 ; .IFG NBACK ;MAIN BUFFER B101.8 = .+4 ; .=.+ !---------------------------------! ** ;* ! VALUE ! ** ;* !---------------------------------! ** ;* ! IEXEC ! ** ;* !---------------------------------! ** ;* ** ;* WHERE: VALUE = THE CURRENT TIMER VALUE (UNSIGNED 16-BIT ** ;*  ;NO - BETTER GO FIX IT TST ACKNAK ;CLEAR TO SEND DATA; SHOULD ACK/NAK BEQ OUTC50 ;BE SENT. BRANCH IF NO BLT OUTC10 ;YES - SEND ACK/NAK MOV #ACK,'#TBUF ;ACK BR OUTC20 ; OUTC10: MOV #NAK,'#TBUF ;NAK ; OUTC20: MOV #3,TSWITCH ;SET SWITCH TO POINT TO BCC/X'FF' LOGIC ; OUTC30: MOV #TGAP,VALUE+OUTTM ;SET TIMER TO TGAP MILLISECO MOV 4(R1),R3 ;MOVE IN ADDRESS OF ASCII STRING MOVB ANSIZE(R5),R4 ;GET SIZE OF ASCII STRING (127. MAX) ADD #4,SP ;RESTORE REGISTERS MOV (SP)+,R2 MOV (SP)+,R1 BR FORA20 ;GO MOVE NAME TO OUTPUT BUFFER ; FORB30: MOV (SP)+,R4 ;RESTORE CODE STRING LENGTH ; FORB40: MOV (SP)+,R1 ;RESTORE CURRENT ENTRY IN NAME TABLE ADD #NAMESZ,R1 ;INCREMENT TO NEXT $CPMSG+4 ; BACKUP 1 .ENDC ; .IFG NBACK-1 ; B201.8 = .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ; .IFG NBACK-2 ; B301.8 = .+4 ; .=.+$CPMSG+4 ; BACKUP 3 .ENDC ; .ENDC ; .ENDC ; ; .IFG NTERM-1 MN02.0 = .+4  INTEGER); ZERO IF REQUEST IS INACTIVE ** ;* IEXEC = WORD INDEX INTO EXTABL TSTAT ENTRY FOR ** ;* THE ASSOCIATED RESPONSE PROGRAM. ** ;* ** ;* NOTE: TIMER DOES NOT JSR TO TIMEOUT PROGRAMS; IT ONLY SETS ** ;* IT ACTIVE IN THE EXEC QUEUE. THUS, ALL TIMEOUT RESPONSE ** ;* PROGRAMS TERMINATE EXECUTION BY JUMPING TO EXEC. **NDS ; OUTC40: JSR R5,RESTOR ;RESTORE REGISTERS RTI ;AND EXIT INTERRUPT ROUTINE ; ; OUTC50: INC TSWITCH ;NOT ACK/NAK - JUST A NORMAL MESSAGE CLR OBCC ;CLEAR RUNNING OUTPUT BCC MOV #STX,'#TBUF ;SEND STX TO START THINGS OFF BR OUTC30 ;THEN START TIMER AND EXIT ;* ;* ;* TSWITCH = (: TRANSMIT NEXT CHARACTER OF MESSAGE TO CP ;* ;* OUTD00: CLR ENTRY CMP (R1),#-1 ;END OF TABLE? BNE FORB10 ;BRANCH IF NO TST (SP)+ ;OTHERWISE, RESTORE REGISTERS AND MOV (SP)+,R2 ;IGNORE REQUEST MOV (SP)+,R1 INC R0 ;BYPASS LINE NO. IN EDIT TABLE BR FORA00 .ENDC ;* ;* I N S E R T T E R M I N A L I D ;* .IFNZ $CMDE CMD.E: MOV R1,R3 ADD #TERMID,R3 ;LOAD ADDRESS O ;********** T E R M I N A L 2 *********** .=.+$CPMSG+4 ;MANUAL .IFG NBACK ; ENTRY MN02.1 = .+4 ; BUFFER .=.+$CPMSG+4 ; .....AND .ENDC ; BACKUP .IFG NBACK-1 ; BUFFERS MN02.2 = .+4 ; .=.+$CPMSG+4 ; .ENDC ; .IFG NBACK-2 ; MN02.3 = .+4 ;  ;* ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* ** ;***************************************************************  R0 BISB CADDR,R0 ;GET NEXT CHARACTER MOVB R0,'#TBUF ;TRANSMIT IT TO CP MOV OBCC,R1 ;GET RUNNING BCC JSR PC,BCC MOV R1,OBCC ;SAVE UPDATED BCC DEC LENGTH ;DECREMENT CHARACTER COUNTER BGT OUTC30 ;GO RESET TIMER AND EXIT INC TSWITCH ;UNLESS, OF COURSE, THAT WAS THE LAST BR OUTC30 ;CHARACTER. IN THAT CASE, SET SWITCH F ASCII TERMINAL ID MOV #TERMSZ,R4 ;AND NO. CHAR. BR FORA20 .ENDC ;* ;* I N S E R T C A R R O E R N U M B E R ;* .IFNZ $ACMDF CMD.F: MOV R1,R3 ADD #CARRIER,R3 ;ADDRESS OF ASCII CARRIER NO MOV #CARRSZ,R4 ;SIZE BR FORA20 .ENDC ;* ;* I N S E R T T R U C K N U M B E R ;* .IFNZ .CMDG MOV R1,R3 ADD #TRUCK,R3  .=.+$CPMSG+4 ; .ENDC ; .ENDC ; ; .IFG NTERM-1 RD02.0 = .+4 .=.+$CPMSG+4 ; REDIAL .IFG NBACK ; BUFFERS RD02.1 = .+4 ; AND .=.+$CPMSG+4 ; BACKUP .ENDC ; BUFFERS .IFG NBACK-1 ; RD02.2 = .+4 ; .=.+$CPMSG+4 ; .E ******** ; .DEF TIMER ; ; .PAGE ;*********************************************************************** ;* ** ;* T I M E R T A B L E S ** ;* ** ;******* ** ; VALUE: .WORD 0 ;INTIME, TTYIN TIMEOUT ENTRY  ;TO POINT TO ETB/ETX LOGIC ;* ;* ;* TSWITCH = 2= SEND EITHER ETB (WHICH REQUESTS REDIAL) OR ETX ;* (WHICH DOES NOT REQUEST REDIAL). ;* ;* OUTE00: MOV #INHIBIT,'#PS ;INHIBIT INTERRUPTS MOV OTERM,R2 ;IS QUEUE EMPTY? TST OQSTR(R2) TST OQSTR(R2) BEQ OUTE20 ;BRANCH IF QUEUE IS EMPTY ; OUTE10: MOV #ETB,R0 ;SEND ETB 'CAUSE THERE'S MORE TO SEND BR  MOV #TRUCSZ,R4 BR FORA20 .ENDC ;* ;* I N S E R T D R I V E R N U M B E R ;* .IFNZ .CMDH CMD.H: MOV R1,R3 ADD #DRIVER,R3 MOV #DRIVSZ,R4 BR FORA20 .ENDC ;* ;* I N S E R T T E R M I N A L N A M E ;* .IFNZ $ALPHA .IFNZ $CMDI CMD.I: MOV R1,R3 ADD #TERMID,R3 ;ADDR. OF ASCII TERMINAL NO. MOV #TERMSZ,R4 ;SINDC ; .IFG NBACK-2 ; RD02.3 = .+4 ; .=.+$CPMSG+4 ; .ENDC ; .ENDC ; ; .IFG NTERM-1 .IFG NRAK2 BF02.1 = .+4 ;*************** R A C K 1 *************** .=.+$CPMSG+4 ; .IFG NBACK ;MAIN BUFFER B102.1 = .+4 ; .=.+$CPMSG+4 ; BACKUP 1  .WORD 0 ;OUTIME, TTYOUT TIMEOUT ENTRY .WORD 0 ; .WORD 0 ; .WORD 0 ; .WORD 0 ; .WORD 0 ; ; IEXEC: .WORD TSTAT+XINTME ;POINTER TO INTIME ENTRY IN EXTABL .WORD TSTAT+XOUTME ;POINTER TO OUTIME ENTRY IN EXTABL .WORD 0 ; .WORD 0 ; .WORD 0 ; .WORD  OUTE40 ;TO THIS TERMINAL ; OUTE20: MOV OTERM,R0 ;WELL, THE QUEUE IS EMPTY, BUT MAYBE MOV BUFFRS(R0),R1 ;THIS TERMINAL'S INPUT BUFFER HAS A MOV BUFFRS+2(R0),R3 ;REQUEST WAITING TO BE PROCESSED. MOV #1,R2 ; OUTE30: CMP R2,(R1)+ ;SEARCH RACKBUF TABLES TO SEE IS AN BEQ OUTE10 ;INPUT BUFFER IS WAITING TO BE PROCESSED CMP R1,R3 BLO OUTE30 MOV #ETXZE MOV #1,R5 ;TYPE 1 = TERMINAL NAME BR FORB00 .ENDC ;* ;* I N S E R T C A R R I E R N A M E ;* .IFNZ $CMDJ CMD.J: MOV R1,R3 ADD #CARRIER,R3 ;ADDR. OF ASCII CARRIER NUMBER MOV #CARRSZ,R4 ;SIZE MOV #2,R5 ;TYPE 2 = CARRIER NAME BR FORB00 .ENDC ;* ;* I N S E R T T R U C K N A M E ;* .IFNZ $CMDK CMD.K:  .ENDC ; .IFG NBACK-1 ; B202.1 = .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ; .IFG NBACK-2 ; B302.1 = .+4 ; .=.+$CPMSG+4 ; BACKUP 3 .ENDC ; .ENDC ; .ENDC ; ; .IFG NTERM-1 .IFG NRAK2-1 BF02.2 = .+4 ;***** 0 ; .WORD 0 ; ; ; BASE: .WORD $TBASE ;NO. ENTRIES REQUIRED FOR 100 MS ELAPSED TIME ; ; .PAGE ;*********************************************************************** ;* ** ;* TIMER INTERRUPT ENTRY POINT. ** ;* ** ;******* ,R0 ;NONE WAITING, SEND ETX ; OUTE40: MOVB R0,'#TBUF ;SEND CHARACTER MOV OBCC,R1 ;GET RUNNING BCC JSR PC,BCC ;UPDATE IT SWAB R1 MOV R1,OBCC ;AND SAVE IT CLR '#PS ;ENABLE INTERRUPTS INC TSWITCH ;SET SWITCH = 3 (SEND BCC) MOV #OBCC,OINDEX ;INITIALIZE INDEX FOR OBCC OUTPUT BR OUTC30 ;* ;* ;* TSWITCH = 3: SEND BCC AND X' MOV R1,R3 ADD #TRUCK,R3 ;ADDRESS OF ASCII TRUCK NO. MOV #TRUCSZ,R4 ;SIZE MOV #3,R5 ;TYPE 3 = TRUCK NAME BR FORB00 .ENDC ;* ;* I N S E R T D R I V E R N A M E ;* .IFNZ $CMDL CMD.L: MOV R1,R3 ADD #DRIVER,R3 ;ADDRESS OF ASCII DRIVER NUMBER MOV #DRIVSZ,R4 ;SIZE MOV #4,R5 ;TYPE 4 = DRIVER NAME BR FORB00 ********** R A C K 2 *************** .=.+$CPMSG+4 ; .IFG NBACK ;MAIN BUFFER B102.2 = .+4 ; .=.+$CPMSG+4 ; BACKUP 1 .ENDC ; .IFG NBACK-1 ; B202.2 = .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ; .IFG NBACK-2 ; B302.2 = .+4 ; .=.+$CPMSG+4 ; B ** ; TIMER: DEC BASE ;DECREMENT NO. ENTRIES BEQ TIMA00 ;BRANCH IF 100 MS HAS ELAPSED RTI ; ; TIMA00: MOV #$TBASE,BASE ;RESET TIMER BASE JSR R5,SAVE ;SAVE REGISTERS MOV #VALUE,R0 ;SET UP FOR LOOP MOV #NTIMER,R1 ; TIMA10: TST (R0) ;TEST NEXT ENTRY BEQ TIMA20 ;BRANCH IF INACTIVE DEC (RFF', OR JUST X'FF' IF ACK/NAK ;* FLAG IS SET ;* ;* OUTF00: MOV OINDEX,R0 ;GET BCC INDEX TST ACKNAK ;IS ACK/NAK FLAG SET? BEQ OUTF10 ;BRANCH IF NO TST (R0)+ ;ADJUST TO POINT TO X'FF' ; OUTF10: MOVB (R0)+,'#TBUF ;SEND NEXT CHARACTER (BCC OR X'FF') CMP R0,#OBCC+2 ;END OF THIS SECTION BLE OUTC30 ;BRANCH IF NO INC TSWITCH ;OTHERWI .ENDC .ENDC ;* ;* I N S E R T G R O S S V O L U M E ;* .IFNZ .CMDM CMD.M: MOV 6(SP),R3 ;GET TRMBUF ENTRY FOR THIS BUFFER MOV GROSS(R3),R3 ;GET ADDRESS OF GROSS VOLUME TABLE MOV #GROSSZ,R4 ;LOAD NO. CHARACTERS .ENDC .IFNZ $CMDM!$CMDO ; FORC00: CLR R5 ;ON ENTRY, R3 = BINARY TABLE ADDRESS BISB (R0)+,R5 R4 = NO. CHAR. TO USE INACKUP 3 .ENDC ; .ENDC ; .ENDC ; ; .IFG NTERM-1 .IFG NRAK2-2 BF02.3 = .+4 ;*************** R A C K 3 *************** .=.+$CPMSG+4 ; .IFG NBACK ;MAIN BUFFER B102.3 = .+4 ; .=.+$CPMSG+4 ; BACKUP 1 .ENDC ; .IFG NBACK-1 ; B202.3 = .+4 0)+ ;OTHERWISE, DECREMENT THE ENTRY'S TIMER BNE TIMA30 ;BRANCH IF ITS TIME ISN'T UP YET INC @IEXEC-VALUE-2(R0) ;ACTIVATE TIMEOUT PROGRAM CMP R1,#1 ;IS THIS THE CLOCK ENTRY? BNE TIMA30 MOV #CLBASE,VALUE+CLOCTM ;YES, RESET CLOCK TIMER VALUE BR TIMA30 ; TIMA20: TST (R0)+ ; TIMA30: DEC R1 ;IS THERE MORE? BGT TIMA10 SE, SET SWITCH TO END(4) BR OUTC30 ;* ;* ;* TSWITCH = 4: END OF MESSAGE. WHAT WE DO NOW DEPENDS ON WHETHER ;* THE ACK/NAK FLAG IS SET: ;* ;* YES - SWITCH BACK TO RECEIVE MODE AND EXIT ;* NO - WAIT FOR CP RESPONSE ;* ;* OUTG00: TST ACKNAK ;CHECK FLAG BEQ OUTG10 ;BRANCH IF NORMAL REQUEST CLEANUP BIC #REQSND!TENABL,'#TCSR ;WE JUST FINISHED SENDING AN ACK CLR OBUSY  ASCII SUB #60,R5 ;R5 = OCCURRENCE INDEX BGT FORC10 ;BRANCH IF OCCURRENCE ORDER IS SPECIFIED MOV 8.(SP),R5 ;OTHERWISE, LOAD AUTOMATIC INDEX ;R5 = TERMINAL INDEX MOV JNEXT(R5),R5 ;R5 NOW EQUALS OCCURRENCE ORDER FORC10: DEC R5 ASL R5 ;CONVERT TO DOUBLE WORD INDEX ASL RK ADD R3,R5 ;AND GET THE BINARY VALUE ADDRESS MOV  ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ; .IFG NBACK-2 ; B302.3 = .+4 ; .=.+$CPMSG+4 ; BACKUP 3 .ENDC ; .ENDC ; .ENDC ; ; .IFG NTERM-1 .IFG NRAK2-3 BF02.4 = .+4 ;*************** R A C K 4 *************** .=.+$CPMSG+4 ; ! JSR R5,RESTOR ;NO - RESTORE REGISTERS RTI ;AND EXIT .PAGE ;*********************************************************************** ;* ** ;* C L O C K ** ;* ** ;* PROGRAM IDENTIFICATION. CLOCK - SYSTEM TIME/DATE MAINTENANCE ** ;* " ;(OR NAK) AND X'FF'. CLEAR JMP OUTC40 ;REQUEST-TO-SEND, DISABLE TRANSMIT ;INTERRUPT, RESET OUTPUT BUSY ; ;FLAG AND GO EXIT OUTG10: MOV PC,ACWAIT ;NORMAL MESSAGE - WE HAVE TO TURN THE INC SWITCH ;LINE AROUND AND AWIT FOR AN ACK/NAK MOV #$10SEC,VALUE+OUTTM ;SET TIMER FOR 10 SECONDS BIC #REQSND!TENABL,'#TCSR ;C# R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) MOV R2,-(SP) MOV (R5)+,R0 ;LOAD BINARY MOV (R5)+,R1 ; VALUE MOV R4,R2 ;R2 = NO. CHARACTERS REQUIRED MOV (SP),R3 ;R3 = ADDRESS TO STORE ASCII STRING JSR PC,BINASC ;CONVERT TO ASCII, STORE IN OUTPUT BUFFER MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R1 MOV (SP)+,R0 J$.IFG NBACK ;MAIN BUFFER B102.4 = .+4 ; .=.+$CPMSG+4 ; BACKUP 1 .ENDC ; .IFG NBACK-1 ; B202.4 = .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ; .IFG NBACK-2 ; B302.4 = .+4 ; .=.+$CPMSG+4 ; BACKUP 3 .ENDC ; .ENDC ; % ** ;* PURPOSE. THIS PROGRAM MAINTAINS THE SYSTEM TIME AND DATE ** ;* IN BOTH ASCII AND BINARY. THE DATE IS UPDATED AT MIDNIGHT ** ;* AND INCLUDES LEAPYEAR LOGIC. ** ;* ** ;* USAGE. CLOCK IS ACTIVATED VIA EXEC BY THE SYSTEM TIMER ** ;* ROUTINE. ** ;* &LEAR REQ-TO-SEND AND TRANSMIT INT BIS #RENABL,'#RCSR ;ENABLE RECEIV INTERRUPT JMP OUTC40 ;AND GO EXIT .PAGE ;*********************************************************************** ;* ** ;* O U T G O A ** ;* ** ;* THIS ROUTINE IS ENTERED FROM THE C'MP FORA00 ;AND GO CONTINUE EDITING .ENDC ;* ;* I N S E R T T E M P E R A T U R E ;* .IFNZ $CMDN CMD.N: MOV 6(SP),R3 ;LOAD ADDRESS OF TRMBUF ENTRY FOR THIS BUFFER MOV TEMP(R3),R3 ;GET ADDR(SS OF ASCII TEMPERATURE MOV #TEMPSZ,R4 ;NO. CHARACTERS JMP FORA20 ;GO STORE ASCII TEMP .ENDC ;* ;* I N S E R T N E T V O L U M E ;* .IFNZ $CMDO CMD.O: ( .ENDC ; ; .IFG NTERM-1 .IFG NRAK2-4 BF02.5 = .+4 ;*************** R A C K 5 *************** .=.+$CPMSG+4 ; .IFG NBACK ;MAIN BUFFER B102.5 = .+4 ; .=.+$CPMSG+4 ; BACKUP 1 .ENDC ; .IFG NBACK-1 ; B202.5 = .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ) ** ;* COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* ** ;*********************************************************************** .DEF*OMMUNICATIONS INPUT ROUTINE ** ;* WHEN AN ACKNOWLEDGE (ACK) IS RECEIVED FROM THE CP. ** ;* ** ;******* ** ; OUTGOA: MOV #INHIBIT,'#PS ;INHIBIT INTERRUPTS ; OUTH00: MOV OTERM,R0 ;GET THE TERMINAL NUMBER MOV 'OQSTR(R0),OQSTR(R0) ;DEQUEUE THE REQUEST BNE OUTH10 ;BRANC+ MOV 6(SP),R3 ;LOAD ADDRESS OF TRMBUF ENTRY FOR THIS BUFFER MOV VOLUME(R3),R3 ;GET ADDRESS OF BINARY NET VOLUME TABLE MOV #NETSZ,R4 ;NO. CHAR. IN NET VOLUME BR FORC00 ;GO CONVERT TO ASCII AND STORE .ENDC ;* ;* I N S E R T P R O D U C T C O D E ;* .IFNZ $CMDP!CMDQ CMD.P: CLR -(SP) FORD00: MOV 8(SP),R3 ;GET TRMBUF ENTRY MOV PTYPE(R3),R4 ;GET ADDRES, ; .IFG NBACK-2 ; B302.5 = .+4 ; .=.+$CPMSG+4 ; BACKUP 3 .ENDC ; .ENDC ; .ENDC ; ; .IFG NTERM-1 .IFG NRAK2-5 BF02.6 = .+4 ;*************** R A C K 6 *************** .=.+$CPMSG+4 ; .IFG NBACK ;MAIN BUFFER B102.6 = .+4 ; .=.+- CLOCK ; ; HOUR: .WORD 0 ;BINARY HOURS (0-23) * INITIAL TIME/DATE IS MINUTE: .WORD 0 ;BINARY MINUTES (0-59) * DAY: .WORD 1 ;BINARY DAY (1-31) * 00:00 1 JAN 1972 MONTH: .WORD 1 ;BINARY MONTH (1-12) * YEAR: .WORD 72. ;BINARY YEAR (0-99) * TIME: .ASCII '00:00' ;ASCII TIME - HH:MM .EVEN DATE: .ASCII '01/01/72' ;ASCII DATE - MM/DD/YY MONTHS: .WORD 31 .H IF MORE IN QUEUE MOV R0,OQEND(R0) ;OTHERWISE, INITIALIZE QUEUE POINTERS ADD #OQSTR,OQEND(R0) ; OUTH10: MOV OBUFRS(R0),R1 ;GET TRMBUF ENTRY FOR THIS TERMINAL CLR OSTAT(R1) ;SET OUTPUT BUFFER AVAILABLE MOV INBUF(R1),R2 ;GET ADDRESS OF CORRESPONDING INPUT BUFFER CLR 2(R2) ;AND SET THE INPUT BUFFER AVAILABLE CLR VALUE+OUTIM ;STOP THE TIMER CLR @#PS ;E/S OF PRODUCT TYPE TABLE CLR R5 BISB (R0)+,R5 ;GET OCCURRENCE NO. SUB #60,R5 ;CONVERT TO BINARY BGT FORD10 ;BRANCH IF OCCURRENCE IS SPECIFIED MOV 10.(SP),R5 ;OTHERWISE, DETERMINE OCCURRENCE MOV JNEXT(R5),R5 DEC R5 ; FORD10: ASL R5 ;CONVERT TO WORD INDEX ADD R5,R3 ;R3 = ADDRESS OF PRODUCT CODE TST (SP)+ BNE F0$CPMSG+4 ; BACKUP 1 .ENDC ; .IFG NBACK-1 ; B202.6 = .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ; .IFG NBACK-2 ; B302.6 = .+4 ; .=.+$CPMSG+4 ; BACKUP 3 .ENDC ; .ENDC ; .ENDC ; ; .IFG NTERM-1 .IFG NRAK2-6 1 ;JANUARY * .WORD 28 ;FEBRUARY * .WORD 31 ;MARCH * .WORD 30 ;APRIL * NUMBER .WORD 31 ;MAY * OF .WORD 30 ;JUNE * DAYS .WORD 31 ;JULY * IN .WORD 31 ;AUGUST * EACH .WORD 30 ;SEPTEMBER MONTH .WORD 31 2NABLE INTERRUPTS JSR PC,SWRCVE ;SWITCH TO RECEIVE MODE INC TSTAT(R0) ;THEN QUEUE RECEIV FOR THIS TERMINAL JMP EXEC ;AND GO BACK TO EXECUTIVE .PAGE ;*********************************************************************** ;* ** ;* O U T G O N ** ;* 3ORE00 ;BRANCH IF FOR PRODUCT NAME MOV #PRESIZE,R4 JMP FORA20 ;* ;* I N S E R T P R O D U C T N A M E ;* .IFNZ $CMDQ CMD.Q: MOV PC,-(SP) BR FORD00 ; FORE00: MOV (R3),R4 ;GET 2-CHARACTER PRODUCT CODE MOV #PRCODE,R3 ;AND SEARCH PRCODE TABLE CLR R5 ; FORE10: CMP (R3),#-1 ;END OF TABLE? BEQ ;BRANCH IF YES 4 BF02.7 = .+4 ;*************** R A C K 7 *************** .=.+$CPMSG+4 ; .IFG NBACK ;MAIN BUFFER B102.7 = .+4 ; .=.+$CPMSG+4 ; BACKUP 1 .ENDC ; .IFG NBACK-1 ; B202.7 = .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ; .IFG NBACK-2 ; B302.7 = .+4 ; 5 ;OCTOBER .WORD 30 ;NOVEMBER .WORD 31 ;DECEMBER ; ; .PAGE ;*********************************************************************** ;* ** ;* BEGIN CLOCK/CALENDAR LOGIC ** ;* ** ;******* ** ; CLOCK: 6 ** ;* THIS ROUTINE BECOMES ACTIVE WHEN THE COMMUNICATIONS INPUT ** ;* ROUTINE RECEIVES A NAK FROM THE CP. WE'LL HAVE TO SEND ** ;* THE DUMB MESSAGE AGAIN. ** ;* ** ;******* ** ; OUTGON: MOV ADDR,R0 ;GET CURRENT LIST ADDRESS DEC COUNT(R0) ;DECREMENT NUMBER OF ATTEM7 CMP (R3)+,R4 ;IS THIS THE PRODUCT WE WANT? BEQ FORE20 ;BRANCH IF YES ADD #NPNAME,R5 ;OTHERWISE, GO TRY THE NEXT BR FORE10 ; FORE20: ADD #PRNAME,R5 ; MOV R5,R3 ;R3 = ADDRESS OF ASCII PRODUCT NAME MOV #NPNAME,R4 ;NAME LENGTH JMP FORA20 ;GO STORE NAME IN OUTPUT BUFFER .ENDC ;* ;* I N S E R T G R O S S P R O D U C T T O T A L S 8 .=.+$CPMSG+4 ; BACKUP 3 .ENDC ; .ENDC ; .ENDC ; ; .IFG NTERM-1 .IFG NRAK2-7 BF02.8 = .+4 ;*************** R A C K 8 *************** .=.+$CPMSG+4 ; .IFG NBACK ;MAIN BUFFER B102.8 = .+4 ; .=.+$CPMSG+4 ; BACKUP 1 .ENDC ; .IFG 9 MOV #INHIBIT,@#PS ;WE'LL EXECUTE UNDER LOCKOUT TO PREVENT MOV #CONVRT,R1 INC MINUTE ;ANY SCREWED-UP DATES OR TIME CMP #60.,MINUTE ;HAS AN HOUR PASSED? BLT CLKA60 ;BRANCH IF NO CLR MINUTE INC HOUR ;BUMP HOURS CMP #24.,HOUR ;NEW DAY? BLT CLKA50 ;BRANCH IF NO CLR HOUR ; INC DAY ;INCREMENT DATE :PTS COUNTER BLE OUTI00 ;BRANCH IF WE GIVE UP ----- CLR TSWITCH ;REPRIEVE, WE'LL TRY AGAIN CLR VALUE+OUTTM ;STOP TIMER JMP OUTA50 ;GO RE-TRANSMIT .PAGE ;*********************************************************************** ;* ** ;* Q T I M E / O U T E R R ** ;* ; ;* .IFNZ $CMDT CMD.T: MOV 8.(SP),R3 ;GET TERMINAL INDEX ASL R3 ;CONVERT TO DOUBLEWORD INDEX ADD #GTOTAL,R3 ;ADD IN GROSS TOTALS TABLE ADDRESS MOV #GTOTSZ,R4 ;CHARACTER SIZE JMP FORC00 ;GO CONVERT TO ASCII AND STORE .ENDC ;* ;* I N S E R T N E T P R O D U C T T O T A L S ;* .IFNZ $CMDU CMD.U: MOV 8.(SP),R3 ;GET TERMINAL INDEX NBACK-1 ; B202.8 = .+4 ; .=.+$CPMSG+4 ; BACKUP 2 .ENDC ; .IFG NBACK-2 ; B302.8 = .+4 ; .=.+$CPMSG+4 ; BACKUP 3 .ENDC ; .ENDC ; .ENDC ; .END = MOV MONTH,R0 ;GET CURRENT MONTH CMP MONTHS(R0),DAY ;END OF MONTH? BLT CLKA40 ;BRANCH IF NO MOV #1,DAY ; INC MONTH ;BUMP MONTH CMP R0,#12 ;NEW YEAR? BLT CLKA30 ;BRANCH IF NO MOV #1,MONTH ;HAPPY NEW YEAR! INC YEAR ;BUMP YEAR BIT #3,YEAR ;IS IT LEAP YEAR? BEQ CLKA10 ;BRANCH > ** ;* QTIME ENTERED IF TIMER EXPIRED BEFORE CP RESPONDED. ** ;* OUTERR ENTERED IF WE LOST THE LINE (DURN PHONE COMPANY!) ** ;* WE FOLLOW THIS PATH A SPECIFIED NUMBER OF TIMES, THEN IN ** ;* FINAL DESPERATION, WE'LL PRINT THE MESSAGE ON THE MICRO-HUB ** ;* SYSTEM TELETYPE. ** ;* ** ;******* ? ASL R3 ;CONVERT TO DOUBLEWORD INDEX ADD #NTOTAL,R3 ;ADD IN NET TOTALS TABLE ADDRESS MOV #NTOTSZ,R4 ;SIZE JMP FORC00 .ENDC ;* ;* L O O P O N N O . O F P R O D U C T S ;* .IFNZ $CMDV CMD.V: MOV 6(SP),R3 ;GET TRMBUF ENTRY MOV 8.(SP),R4 ;GET TERMINAL INDEX INC JNEXT(R4) ;INCREMENT PRODUCT INDEX BIT #1,R0 ;GET LOOP A) JMP @(%4)+ $I0000: 000001 $P0014: MOV #000014,-(%6) JMP @(%4)+ $I0001: 000014 $P0015: MOV NN,-(%6) JMP @(%4)+ NN: 0,0 $P0017: MOV #000015,-(%6) JMP @(%4)+ $I0004: 000015 $P0020: MOV #000000,-(%6) JMP @(%4)+ $I0005: 000000 ADD #4,%0 $F0005: MOV -(%0),-(%6) MOV -(%0),-(%6) JMP @(%4)+ .END AIF YES MOV #28.,MONTHS+2 BR CLKA20 ; CLKA10: MOV #29.,MONTHS+2 ; CLKA20: MOV YEAR,R0 ; JSR R5,(R1) ;CONVERT YEAR TO ASCII .WORD DATE+6 ; CLKA30: MOV MONTH,R0 JSR R5,(R1) ;CONVERT MONTH TO ASCII .WORD DATE+3 ; CLKA40: MOV DAY,R0 JSR R5,(R1) ;CONVERT DAY TO ASCII .WORD DATE ; CLKA50: MOV HOB ** ;* QTIME: OUTERR: OUTI00: JSR PC,SWRCVE ;SWITCH TO RECEIV MODE (WE GONNA FORCE MOV ADDR,R0 ;THE CP TO REDIAL) DEC RETRY(R0) ;DECREMENT NO. OF FAILURES COUNTER BLE OUTI10 JMP EXEC ;EXIT TO EXEC, WE'LL LET THE CP TRY AGAIN ; AI OUTI10: CDDRESS BEQ FORF00 INC R0 ;FORCE EDIT TABLE TO EVEN ADDRESS ; FORF00: MOV (R0)+,R5 ;GET EDIT LOOP ADDRESS CMP NGROSS(R3),JNEXT(R4) ;ALL PRODUCTS PROCESSED? BLT FORF20 ;BRANCH IF YES MOV R5,R0 ;OTHERWISE, SET EDIT BACK TO LOOP POINTER ; FORF10: JMP FORA00 ; FORF20: CLR JNEXT(R4) ;RESET INDEX BR FORF10 ;AND GO PROEUR,R0 JSR R5,(R1) ;CONVERT HOUR TO ASCII .WORD TIME+3 ; CLKA60: MOV MINUTE,R0 JSR R5,(R1) ;CONVERT MINUTE TO ASCII .WORD TIME JMP EXEC ;RETURN TO SYSTEM EXECUTE ; ; ; THIS LITTLE ROUTINE CONVERTS A TWO DECIMAL DIGIT BINARY ; NUMBER TO ASCII. LINKAGE IS: ; ; MOV BINARY,R0 64 MICROSECONDS AVERAGE ; JSR R5,CONVRT ; .WORD ADDR FAI MOV OTERMR1 ;GET TERMINAL NUMBER AI MOV R1,R2 ; AI ASL R2 AI ADD R1,R2 ;R2 = (TERM NO)*6 AI ADD #TERMNL,R2 AI MOV #BADCP+6,R3 AI MOV (R2)+,(R3)+ ;STORE ASCII CESS NEXT ENTRY .ENDC ;* ;* L O O P N T I M E S ;* .END I ;ADDRESS OF MOST SIGNIFICANT DIGIT ASCII ; CONVRT: MOV #10.,R2 CLR R1 ; CNVA00: INC R1 ;THIS LOOP DIVIDES R0 (BINARY NO.) BY 10 SUB R2,R0 ;ON COMPLETION, R0 = UNITS BGE CNVA00 ; R1 = TENS ADD #57,R1 ;CONVERT TO ADD #72,R0 ; ASCII MOVB R1,@(R5)+ ;STORE RESULTS MOVB R0,@(R5)+ RTS R5 J AI MOV (R2)+,(R3)+ ; TERMINAL ID AI MOV (R2)+,(R3)+ ; IN OUTPUT MESSAGES AI MOV #BADCP,R0 ;AND PRINT AI JSR PC,TTYOUT ; 'XXXXX CP NOT ACCEPTING MESSAGES' BR OUTH00 .PAGE ;*********************************************************************** ;* ** ;* K************************************************************* ; ; ;CRTIME IS ENTERED FROM TIMER ROUTINES CRTIME: ;R1 POINTS TO THE TIMER MODULE LIST MOV 6(R1),R3 ;SET R3 = C/R INDEX MOV @CRS(R3),R0 BIS #4,R0 ;SET BIT 2 = 1 TO SIGNAL C/R ERROR CONDITION MOV R0,@ERRCR(R3) ;STORE ERROR MOV #ERMSGE,-(SP) ;PRINT MESSAGE JSR PC,CRMSGE MOV ;AND RETURN TO CALLER .END N S W R C V E ** ;* ** ;* THIS LITTLE SUBROUTINE SWITCHES THE DC11, MODEM AND ** ;* A SUCCESSFUL MESSAGE TRANSFER TO THE CP OR AFTER AN ERROR ** ;* CONDITION THAT NECESSITATES REDIAL ** ;* ** ;******* ** ; O #MXTIME,COUNT(R3) ;SET MAXIMUM DELAY THAT WE'LL MOV CRDLAY,8.(R1) ;WAIT FOR CORRECTIVE ACTION CLR @CRS(R3) ;STORE NEW TIMEOUT ENTRY AND CRTA00: ;DISABLE INTERRUPTS MOV R1,-(SP) ;SET UP FOR 1 SECOND DELAY MOV #$1SEC,-(SP) ; JSR PC,QTIME TST (SP)+ BNE CRLA00 ;LET'S GO ABORT THIS REQUEST ; CRTA10: RTS PCQ ** ;* CRDLAY IS ENTERED FROM THE TIMER ROUTINE AND R1 POINTS TO ** ;* THE TIMER MODULE. ** ;* ** ;********************************************************************** ; CRDLAY: MOV 6(R1),R3 ;GET C/R INDEX BIT #READY,@CRS(R3) ;CHECK C/R STATUS BNE CRLA10 ;BRANCH IF C/R IS READY DEC COUNT(R3) ;TR ** SWRCVE: BIC #TENABL!REQSND,@#TCSR ;DISABLE TRANSMIT INTERRUPT AND ;CLEAR THE REQUEST-TO-SEND BIS #RENABL,@#RCSR ;ENABLE RECEIVE INTERRUPT CLR SWITCH ;SET INPUT TO EXPECT RING CLR OBUSY ;CLEAR OUTPUT BUSY FLAG RTS PC ;RETURN TO CALLER BADCP: .WORD 1,34. S ;RETURN TO TIMER ROUTINES .PAGE ;********************************************************************** ;* ** ;* C R D L A Y ** ;* ** ;* THIS ROUTINE IS ENTERED ONCE EVERY SECOND AND IS INITIALLY ** ;* ACTIVATED BY CRTIME. IT PURPOSE IS TO PATIENTLY SIT AND ** ;* USK, TSK. DECREMENT COUNTER BNE CRTA00 ;GO WAIT SOME IF MXTIME SEC. HAVEN'T ELAPSED CRLA00: MOV (SP)+,R5 ;PUT TIMER RETURN ADDRESS IN R5 MOV CRFRST(R3),R1 ;GET USER'S LIST ADDRESS MOV #7,ERROR(R1) ;SET I/O REQUEST ABORTED ERROR CODE JMP CRCLOS ;THEN GO TO DEQUEUE THE REQUEST AND EXIT ; CRLA10: MOV (SP)+,R5 ;SET TIMER TO RETURN TO LOOK LIKE RESTOR JMP CRIC10 ;AND .BYTE CR,LF .ASCIII 'XXXXX CP NOT ACCEPTING MESSAGES ' .BYTE CR,LF .END WWAIT FOR THE CARD READER TO GET READY. HOWEVER, NOT BEING ** ;* A VERY PATIENT INDIVIDUAL, HE JUST MIGHT ABORT THE C/R ** ;* REQUEST, BUT ONLY AFTER MXTIME SECONDS HAVE ELAPSED. ** ;* ** ;* CRDLAY IS ENTERED FROM THE TIMER ROUTINE AND R1 POINTS TO ** ;* THE TIMER MODULE. ** ;* ** Y GO RESTART THE I/O .PAGE ;********************************************************************** ;* C R M S G E ** ;* ** ;* THIS SUBROUTINE OUTPUTS THE INDICATED MESSAGE TO THE SYSTEM ** ;* TELETYPE. CRMSGE IS CALLED WHEN AN ERROR HAS BEEN DETECTED ** ;* OR OPERATOR ACTION IS REQUIRED. LINKAGE IS ** ;* Z .WORD 040100 ; (330-331) .WORD 040100 ; (332-333) .WORD 040100 ; (334-335) .WORD 040100 ; (336-337) .WORD 040100 ; (340-341) .WORD 040100 ; (342-343) .WORD 040100 ; (344-345) .WORD 040100 ; (346-347) .WORD 040100 ; (350-351) .WORD 040100 ; (352-353) .W[;********************************************************************** ; CRDLAY: MOV 6(R1),R3 ;GET C/R INDEX BIT #READY,@CRS(R3) ;CHECK C/R STATUS BNE CRLA10 ;BRANCH IF C/R IS READY DEC COUNT(R3) ;TSK, TSK. DECREMENT COUNTER BNE CRTA00 ;GO WAIT SOME IF MXTIME SEC. HAVEN'T ELAPSED CRLA00: MOV (SP)+,R5 ;PUT TIMER RETURN ADDRESS IN R5 MOV CRFRST(R3),R1 ;GET USER'S LI] ** ;* SET R3 = C/R INDEC ** ;* MOV #DATA-(SP) PUSH DATA BUFFER ADDRESS ** ;* JSR PC,CRMSGE ** ;* BNE BNE IF LIST WASN'T AVAILABLE ** ;* ** ;* REGISTER R4 IS DESTROYED. ** ;* ^ORD 040100 ; (354-355) .WORD 040100 ; (356-357) .WORD 040100 ; (360-361) .WORD 040100 ; (362-363) .WORD 040100 ; (364-365) .WORD 040100 ; (366-367) .WORD 040100 ; (370-371) .WORD 040100 ; (372-373) .WORD 040100 ; (374-375) .WORD 040100 ; (376-377) .ENDC _ST ADDRESS MOV #7,ERROR(R1) ;SET I/O REQUEST ABORTED ERROR CODE JMP CRCLOS ;THEN GO TO DEQUEUE THE REQUEST AND EXIT ; CRLA10: MOV (SP)+,R5 ;SET TIMER TO RETURN TO LOOK LIKE RESTOR JMP CRIC10 ;AND GO RESTART THE I/O .PAGE ;********************************************************************** ;* C R M S G E ** ;* a ** ;********************************************************************** ; CRMSGE: MOV (SP)+,R4 ;GET DATA BUFFER ADDRESS FROM STACK .IFG NCR-1 ADD R3,R4 ;GET ADDRESS OF BUFFER FOR THSI C/R MOV (R4),R4 .ENDC MOV R5,-(SP) ;SAVE R5 MOV CRIOLS(R3),R5 ;GET THE I/O LIST ADDRESS ; ; MOV @#PSR,-(SP) ;SAVE PSR .ENDC .END c ** ;* THIS SUBROUTINE OUTPUTS THE INDICATED MESSAGE TO THE SYSTEM ** ;* TELETYPE. CRMSGE IS CALLED WHEN AN ERROR HAS BEEN DETECTED ** ;* OR OPERATOR ACTION IS REQUIRED. LINKAGE IS ** ;* ** ;* SET R3 = C/R INDEC ** ;* MOV #DATA-(SP) PUSH DATA BUFFER ADDRESS ** ;* JSR PC,CRMSGE e.IFZ $1145 ;THEN, INHIBIT INTERRUPTS MOV #340,@#PSR ;11/20 CODE .ENDC .IFNZ $1145 SPL 7 ;11/45 CODE .ENDC TST DATA(R5) ;SEE IF LIST IS AVAILABLE BNE CMSX00 ;BRANCH IF NO MOV R4,DATA(R5) ;YES - GRAB IT MOV (SP)+,@#PSR ;ENABLE INTERRUPTS MOV R5,-(SP) ;STORE LIST ADDRESS JSR PC,TTYOUT ;CALL TTYOUT TO f*ìk& & && &fĤĉ&f„Ċ$… & Ċ ŭ…ù lĉ&ü %\ô**lġ "w65$"uŸ" ġ( w”w:*Nl² 5 5 µ "AŸ"Á ùġ Á-Ş*rlġ Áċ0Á% ġ µ À `À Ĵ*–lÀ @`ßuŸ" ġ  5‡A Á,>*şlÁ) Á/ÁTDÁ%' w,wœw`½*Ŝlwŝwxwœġ, òġ) A Á(–*míÁ/ìÁ'ëÁċAŜÁ%Û @œ\mÀ À *&m`wÖwúwÔwÚwĜwÖwÖwÖwĈ*Jmĉg ** ;* BNE BNE IF LIST WASN'T AVAILABLE ** ;* ** ;* REGISTER R4 IS DESTROYED. ** ;* ** ;********************************************************************** ; CRMSGE: MOV (SP)+,R4 ;GET DATA BUFFER ADDRESS FROM STACK .IFG NCiPRINT MESSAGE CLZ RTS PC ;RETURN TO CALLER ; CMSX00: MOV (SP)+,@#PSR ;LIST BUSY SEZ ;SET ERROR INDICATOR (BUSY LIST) RTS PC ;RETURN TO CALLER ; CRTTY: CLR DATA(R1) ;TTY I/O COMPLETE SUBROUTINE RTS PC ;SET LIST NOT BUSY AND EXIT .PAGE ;********************************************************************** ;* jww4wHwŽ G*nm ġ w‚÷ Ìŝwr˙ġ wp *’mu÷ ´ŝwJ˙ġ wX÷ ˘ŝġ ġ *ĥm5m5-ƒ5t4-‡›*Úmw5 5 wĈŝġ w µ ġ –*ŝmùtm4-ƒwê÷ :ŝwŝġ w*"nŜA"B´`4-ƒwĵ ô ""*Fn ”P’ ÷u"÷ öŭwŒŝġ wš5-°*jn†t5 ü ÷ Îŭwdŝġ w*ŽnrA" É' 4 ‡wRô " ”*²nòP’ñkR-1 ADD R3,R4 ;GET ADDRESS OF BUFFER FOR THSI C/R MOV (R4),R4 .ENDC MOV R5,-(SP) ;SAVE R5 MOV CRIOLS(R3),R5 ;GET THE I/O LIST ADDRESS ; ; MOV @#PSR,-(SP) ;SAVE PSR .IFZ $1145 ;THEN, INHIBIT INTERRUPTS MOV #340,@#PSR ;11/20 CODE .ENDC .IFNZ $1145 SPL 7 ;11/45 CODE .ENDC TST DATA(R5) m ** ;* C R S I O ** ;* ** ;* CARD READER START I/O SUBROUTINE. CRSIO SETS UP ALL ** ;* COUNTERS, INITIATES A C/R READ REQUEST, AND STARTS ** ;* UP A TIMER (100 MS DELAY) TO MAKE SURE WE DON'T HANG ** ;* IF AN INTERRUPT ISN'T RECEIVED. CRDQTM, A SECOND ** ;* ENTRY, WILn'ô " ë1Šèu"4û*Ön÷ tŭw ŝġ wµ ġ ùġ Ŝ*únġ% ‚Àwâu"uµ *ouµ ÷ $ŭwÊŭu"uġ ı*Bowşġ% ‚ġ u"÷ îüw„ŭ0*fouġ öġ úu"ïô ô " *Šo 5-†t5 ü wHġ À*ow<5-†t5 ü ġ 5}*Òo$"µ Áuu"µ ô‡w ĥ ´ Ë*öo wVÀ÷Àô5 Âġ˙˙­*p÷ġ o ;SEE IF LIST IS AVAILABLE BNE CMSX00 ;BRANCH IF NO MOV R4,DATA(R5) ;YES - GRAB IT MOV (SP)+,@#PSR ;ENABLE INTERRUPTS MOV R5,-(SP) ;STORE LIST ADDRESS JSR PC,TTYOUT ;CALL TTYOUT TO PRINT MESSAGE CLZ RTS PC ;RETURN TO CALLER ; CMSX00: MOV (SP)+,@#PSR ;LIST BUSY SEZ ;SET ERROR INDICATOR (BUSY LIST) RTS PC qL DEQUEUE (STOP) THIS TIMER REQUEST BY USING ** ;* SUBROUTINE DQTIME. USAGE IS: ** ;* ** ;* MOV #CRINDX,R3 ;SET R3 = C/R INDEX ** ;* JSR PC,CRSIO ** ;* ** ;* REGISTERS R0, R1, R2 AND R4 ARE DESTROYED. ** ;* rġúġöm"`*>pm"5Žp ġ w˙µ uĝ÷ ƒ*bpìûġ óuï ġ%. é÷ Îûġ ‚†päuw$€q˘q`fHcxfBcÇžp\fBcVfBcjjA*Ĵp$k–yœydjkô wĈŝ&f´c4-Ñ*pƒw$˙ġ ffô "Àġ *ôp  5 ‚@Ÿ& À À `€ ĉ v˜|*qN˜À úŭ  ô "Àġ   5 Ŝ* BINARY INC R1 ;SET R1 = 1 (BINARY) NEG R2 ; CRSA10: MOV R1,CRMODv*„q‚€ †€`ÀàÂP” ŭ wş˙Ö ‚Í*¨q ñ‚`ÁàÂìÀ`ƒàà• ü€à{ÌqäĠ*Îq…EcĊe %eċ%ċ D…Ġ 4 4 4 ˙*òqô wdw‚ô ü Ï*rĈe(\À Àw v%Ô*:r÷ 6ü w  ÷ (÷ 8Ĉe(—*^rò\÷ "Ĉe(\ñ ùÀPn‚rw $‡ ‡Û*˜r&÷ ¤Á  wx˙ÂŒ~ô xñµ *ĵr ÷ . ÷ \  ewN˙ñµ ÓwOUTINE. CRSIO SETS UP ALL ** ;* COUNTERS, INITIATES A C/R READ REQUEST, AND STARTS ** ;* UP A TIMER (100 MS DELAY) TO MAKE SURE WE DON'T HANG ** ;* IF AN INTERRUPT ISN'T RECEIVED. CRDQTM, A SECOND ** ;* ENTRY, WILL DEQUEUE (STOP) THIS TIMER REQUEST BY USING ** ;* SUBROUTINE DQTIME. USAGE IS: ** ;* ** ;* MOV #CRINDX,R3yE(R3) ;STORE MODE CODE CLR ERRCR(R3) ;CLEAR ERROR STATUS MOV PC,CRBUSY(R3) ;SET C/R BUSY .IFZ NCR-1 ;NOW WE GOT'S TA GET THE ADDRESS OF MOV #CRMOD,R1 ;THE TIMER MODULE FOR THIS C/R .ENDC MOV CRMDAD(R3),R1 ;GET ADDRESS OF TIMER MODULE MOV @#PSR,-(SP) .IFZ $1145 MOV #340,@#PSR .ENDC .IFNZ $1145 SPL 7 .ENDC MOV z*àr w>˙ñô "1r÷ ô Ŝw*s˙E€Mô "òÀˆrƒeĉӕ À *(süÀ…ƒĤ ˆÖ Î-Ì˙Î-È˙ƒ –%ôô%*Ls`ô‡ròˆ÷ ê wĥŝħ *psÂe‚lŝ˙ CÊ ‚Ê ‡Â Ê °*”s‚ À…`B Ӄҕ ûô "Ġròˆ!*¸sĤ ˆÖ ƒÖ -@˙-<˙ü• ´ ü• O*Üs4í´ 2÷  5ħ Šü• ĝ*t´ ü• 2Š—Ĵ+2 ô Ŝ—Ĵ*$t1ò ƒœò × 0òT"Ht÷ { ;SET R3 = C/R INDEX ** ;* JSR PC,CRSIO ** ;* ** ;* REGISTERS R0, R1, R2 AND R4 ARE DESTROYED. ** ;* ** ;********************************************************************** ; ; CRSIO: CLR COUNT(R3) ;SET COUNT = 0 MOV CRDATA(R3),R} #CRTIME,8.(R1) ;SET JSR ADDRESS IN TIMER MODULE TO CRTIME CMP (R1),#1 ;SEE IF MODULE IS ALREADY ACTIVE BNE CRSA30 ;BRANCH IF YES MOV (SP)+,@#PSR ;OTHERWISE, RESTORE INTERRUPT STATUS MOV R1,-(SP) ; MOV #$100MS,-(SP) ;SET UP FOR 100 MS DELAY JSR PC,QTIME ;START UP TIMER TST (SP)+ ; ; CRSA20: MOV R2,MXCNT(R3) ;STORE MAXIMUM NUMBER WORDS (CHARACT~v ò÷ h ÜwÀŭ`(dtô "W=ü ùġUü wˆŭ°*†tô " ġ Šúü ġ ñlŞt$€ =wVŭċ*¸t& ĉĉ ĉĉĉĉD*Üt…Ċ U%…aEcĊe %eċ%ċ D…Y*uĊ …aU%Ġ ÷ Z´.4ô%†ôE„*$uƒ ƒaôü ÷ .ô%ôeü Ĉ*Hu ÷ Î êċ F\ô óá*lu‡ƒ ƒa´t A @ A @ A A A ¨*uA ÁEĝ˙4Á%‚ ‡Q¤ô% ´ 0 ;GET DATA ADDRESS CLR R1 ;DETERMINE MODE OF INPUT MOV (R0),R2 BGE CRSA10 ;NWORD < 0 ======> BINARY INC R1 ;SET R1 = 1 (BINARY) NEG R2 ; CRSA10: MOV R1,CRMODE(R3) ;STORE MODE CODE CLR ERRCR(R3) ;CLEAR ERROR STATUS MOV PC,CRBUSY(R3) ;SET C/R BUSY .IFZ NCR-1 ;NOW WE GOT'S TA GET THE ADDRESS OF MOV #CRMOD,R1 ERS) ;NOW, WE CAN FINALLY START THE I/O MOV #ENABLE!START,@CRS(R3) ; RTS PC ;RETURN TO HE WHO CALLS ; CRSA30: MOV #$100MS,4(R1) ;TIMER MODULE IS ALREADY ACTIVE MOV (SP)+,@#PSR ;RESET IT TO 100 MS BR CRSA20 .PAGE ;********************************************************************** ; ** ; ‚*´u Á%Á  ´ t&ÄâuààĤÀ >*Ĝuŭ\,y,yâu€„&ü ÷ v˙4mô%š*üuô%ü ÷ X˙4m€À ĉÎ ¨wž v0˙2*"v ô Wĵ XWĵ Vòîvŝ˙Ĥˆ^*FvĤˆòôvŝ˙ñ‹òwffĉ€÷ ˜*jvöÖ Ö Ž ĤÎe Ĥ ˆ– Bò wĤÎe ö*ŽvĤƒ ô  Ĥ ˆ–%ħħeñ˙˙ ô t*²v" ò ˆĤˆħœ ƒ ñ*Öv ħ ‡‡‡˙˙‡˙˙Ĥm*úvòîvŝ˙ˆ‡Ö öòƒ;THE TIMER MODULE FOR THIS C/R .ENDC MOV CRMDAD(R3),R1 ;GET ADDRESS OF TIMER MODULE MOV @#PSR,-(SP) .IFZ $1145 MOV #340,@#PSR .ENDC .IFNZ $1145 SPL 7 .ENDC MOV #CRTIME,8.(R1) ;SET JSR ADDRESS IN TIMER MODULE TO CRTIME CMP (R1),#1 ;SEE IF MODULE IS ALREADY ACTIVE BNE CRSA30 ;BRANCH IF YES MOV (SP)+,@#PSR ;OTHERWISE, RESTORE … P A T C H A R E A ** ; ** ; ** .=.+100. .PAGE .PAGE .PAGE ;********************************************************************** ;* ** ;* C R D Q T M ** ;* † òú*w Ëòċƒ òò܂ƒ BwÚc$DwÀ 7 Á ÁeX}É A‡ ‡°*bw&fĤĉ&ƒ„   Ħ †Á`@ €`g*†w B Ä ö  ƒ ƒ €   „ ù  @ DŞwÄ üv6„ƒ‚€‡*Âwò xŝ˙ô "2Šò•ĤÎeĤˆ*ĉwĤˆ ò‹ ƒ òµ ƒ ƒ òµ@ƒ f* x‡˙˙‡òĤÎeĤ ˆĤˆ ò‹î9(.xƒ òµ€éƒ òµ@äƒ òµßƒ Ŭj*Pxòxŝ˙ô ,2Šò•Ĥ‡INTERRUPT STATUS MOV R1,-(SP) ; MOV #$100MS,-(SP) ;SET UP FOR 100 MS DELAY JSR PC,QTIME ;START UP TIMER TST (SP)+ ; ; CRSA20: MOV R2,MXCNT(R3) ;STORE MAXIMUM NUMBER WORDS (CHARACTERS) ;NOW, WE CAN FINALLY START THE I/O MOV #ENABLE!START,@CRS(R3) ; RTS PC ;RETURN TO HE WHO CALLS ; CRSA30: MOV #$100MS,4(R1) ;TIMER M‰ ** ;* THIS SUBROUTINE DEACTIVATES THE CURRENT TIMER FOR THE ** ;* INDICATED CARD READER. LINKAGE IS: ** ;* ** ;* MOV #CRINDX,R3 ;PLACE C/R INDEX IN R3 ** ;* JSR PC,CRDQTM ** ;* ** ;* REGIŠÎeĤˆ×*txĤˆ ò òµ@òĊÙ ƒ C*˜xòµ ƒ òµƒ ‡˙˙‡òĤ?*ĵxÎeĤ ˆĤˆ ò‹îƒ òµ€éƒ òµ@àxäƒ òµßƒ Ŭò*òxò&yŝ˙ĤˆĤˆĤˆ1ŠñĊ 1 1 Ŝy1 1 1  ‡˙˙‡Œ",yÀÄŝˆ&÷µ…\w ^\ĥ"HyÀÄŝˆà `$&\w B\*dyÀ7Ì Ô %\Ä7ü  …ˆyÀw  y7ì\T –y w L œy w L*˘y‹ODULE IS ALREADY ACTIVE MOV (SP)+,@#PSR ;RESET IT TO 100 MS BR CRSA20 .PAGE ;********************************************************************** ; ** ; P A T C H A R E A ** ; ** ; ** ;* ;* ;* F O STERS R0, R1, R2 AND R4 ARE DESTROYED. ** ;* ** ;********************************************************************** ; ; CRDQTM: MOV @#PSR,-(SP) ;INHIBIT .IFZ $1145 ; INTERRUPTS MOV #340,@#PSR .ENDC .IFNZ$1145 SPL 7 .ENDC .IFZ NCR-1 MOV #CRMOD,(R1) ;PUT BASE ADDRESS OF TIMER MODULE Ž&@&fĤĉ&fÄ |ô ŝ˙ƒ ë*Ĉy÷ Ä`À÷Ì ġô%˙˙ô%ŝ˙ċ*êy÷ôĜ| ÷ žÀàÀ À`&ĉÙ*z…„ƒ‚€…ĊV}ÂŒ~A5Á **2zAaA0Wĵ ,ñ‹WĴ%.&@'*Vz÷ ”€ò–zŝ˙ò–zĤˆò• ĤÎeR*zz ĤˆĤˆħœ ħŠ ħ ĤˆÀàÀ *žzÀ`&ĉwër2 ŝ˙E@Í fc*Âzˆġ8{fÎe fˆfˆfÎef5a*ĉzƒ ġ` ˆfˆEÀ5Ċe@ò@²î* {rò•R C H E C K O U T O N L Y ;* ;* THEAD: .WORD 1,CHECKO,0,500. .BYTE 40.,3 ;TASK HEADER .WORD 0,0,30.*256.,0 .=.+80. ; .DEF LARRY .REF TSTAT,TPRTY,TASKS,HEADER,EXIT LARRY: MOV #30.,R0 ;INSERT TASK IN TASK TABLES CLRB TSTAT(R0) MOVB #3,TPRTY(R0) CMP TASKS,#30. BGT LARRY1 MOV #30.,TASKS ; LARRY1: ASL R0 MOV #THE‘ON ST .ENDC .IFG NCR-1 ;DO THIS PART IF > ONE C/R MOV CRMDAD(R3),R1 ;GET TIMER MODULE ADDRESS FOR THIS C/R .ENDC MOV #CRQA00,8.(R1) ;SET TIMER JSR ADDR JUST IN CASE HE SLIPS IN MOV (SP)+,@#PSR ;ENABLE INTERRUPTS MOV R1,-(SP) ;PUSH TIMER MODULE ADDRESS ON STACK JSR PC,DQTIME ;THEN DEQUEUE IT ; CRQA00: RTS PC ;THEN GO WHENCE WE CAME .PAGE ’ĤÎeĤˆĤˆòµ@$f-*.{ĉ#êfˆŠÀ&ĉĊ„|fĠ Îeĉ3*R{"ˆfĉ"ˆġ ÍRTċFOò É÷ *v{$ Ĝô wˆŝ´ 4-ĝ÷êwyš{VŝŽ*œ{&€Àe&€Ž&f&Í À÷ ~÷ #*À{ĵTAÀѕ À üÉ ġ• ÍNAġMEi*ä{ġ•SġEQÀ÷ BÄ€Á~ffÎeä*|ĉ"ˆ&&fĉ"ˆfÎeĉ"ˆ˘*,|÷ ċw022ròĤp*P|ÎeĤˆĤˆòµ@‡ƒ Ö  „€ž“AD,HEADER(R0) JSR PC,CRINIT RTS PC CHECKO: MOV #CLIST,(SP) JSR PC,CREAD BR HANG MOV #CLIST2,-(SP) JSR PC,CREAD ; HANG: JSR PC,EXIT ; CLIST1: .WORD 1 .WORD 0,0,0,0,CBUF1 ; CLIST2: .WORD 1 .BYTE 2,1 .WORD 0,0,0,0,CBUF2 ; CBUF1: .WORD 80.,0 .=.+80. ; CBUF2: .WORD -60.,0 .=.+120. .=.+100. •; ; ; I N I T I A L I Z A T I O N ; CRINIT: .IFZ NCR-1 ;FIRST, LET'S SET UP THE INTERRUPT VECTORS ;STORE C/R INTERRUPT ADDRESS MOV #340,@#CRVECT+2 .ENDC .IFG NCR-1 MOV #CRVECT,R0 MOV #CRINT1,R1 MOV #340,R4 MOV #NCR,R2 ; CRNA10: MOV (R0),R3 ;LOAD VECTOR ADDRESS MOV R1,(R3)+ ;STORE ADDR(CRINT) IN VECTOR – t|Ö ‡x|V}Œ~ |*ž| zŭ˙ z z zĉÂ| z z˙˙$ zŠĜ|ÀĤ˙0ˆÀ ŭ&ĉĝéc*|2 rrœ2 r rr ]*}rrœ &ĤÎeĉ"ˆƒeË"8}0ƒ ó• ĝĉ& "ˆ²Ö ‡À*T}l~j}Š}Ş}Ê}ê} ~*~J~ê'OÀ<›8*x}ê'PÀ<›Ĉ*œ}ê'QÀ<›Ħ*À}fê'RÀ<›O— .PAGE .PAGE .PAGE ;********************************************************************** ;* ** ;* C R D Q T M ** ;* ** ;* THIS SUBROUTINE DEACTIVATES THE CURRENT TIMER FOR THE ** ;* INDICATED CARD READER. LINKAGE IS: ** ;* ™ MOV R4,(R3)+ ;SET PRIORITY LEVEL TO ZERO ADD #8.,R1 .IFZ $1145 ; DEC R2 BNE CRNA10 .ENDC ; IFNZ $1145 ; SOB R2,CRNA10 .ENDC ; .ENDC ; ; NOW, LET'S CLEAR THE QUEUES OUT ; .IFZ NCR-1 CLR CRFRST MOV #CRFRST,CRLAST .ENDC .IFG NCR-1 MOV #NCR,R0 *ä}€Mê'SÀ<›“*~Eê'TÀ<›ċ*,~ê'UÀ<›*P~ê'VÀ<›""˘t~ê'Ŝ?TÒ$Š~ˆJş^á› ** ;* MOV #CRINDX,R3 ;PLACE C/R INDEX IN R3 ** ;* JSR PC,CRDQTM ** ;* ** ;* REGISTERS R0, R1, R2 AND R4 ARE DESTROYED. ** ;* ** ;********************************************************************** ; ; CRDQTM:  MOV #CRFRST,R1 MOV #CRLAST,R2 ; CRNA20: MOV R1,(R2)+ ;SET CRLAST = ADDR(CRFRST) CLR (R1)+ ;SET CRFRST = 0 .IFZ $1145 DEC R0 ;DECREMENT COUNTER BNE CRNA20 ;AND TRY, TRY AGAIN .ENDC .IFNZ $1145 SOB R0,CRNA20 .ENDC .ENDC RTS PC .ENDC ;ENDC FOR THE BEGINNING .IFNZ NCR STATEMENT Ÿ MOV @#PSR,-(SP) ;INHIBIT .IFZ $1145 ; INTERRUPTS MOV #340,@#PSR .ENDC .IFNZ $1145 SPL 7 .ENDC .IFZ NCR-1 MOV #CRMOD,(R1) ;PUT BASE ADDRESS OF TIMER MODULE ON ST .ENDC .IFG NCR-1 ;DO THIS PART IF > ONE C/R MOV CRMDAD(R3),R1 ;GET TIMER MODULE ADDRESS FOR THIS C/R .ENDC MOV #CRQA00,8.(R1) ;SET TIMER JSR ADD .END CRINIT £R JUST IN CASE HE SLIPS IN MOV (SP)+,@#PSR ;ENABLE INTERRUPTS MOV R1,-(SP) ;PUSH TIMER MODULE ADDRESS ON STACK JSR PC,DQTIME ;THEN DEQUEUE IT ; CRQA00: RTS PC ;THEN GO WHENCE WE CAME .PAGE ; ; ; I N I T I A L I Z A T I O N ; CRINIT: .IFZ NCR-1 ;FIRST, LET'S SET UP THE INTERRUPT VECTORS MOV #CRINT1,@#CRVECT ;STORE C/R INTERRUPT A .IFZ $1145 ;ENABLE INTERRUPTS CLR @#PSR ; . .ENDC ; . .IFNZ $1145 ; . SPL 0 ; . .ENDC ; . JMP (R5) ;AND EXIT TO RESTOR .PAGE ;* ;* THIS SECTION OF CODE IS EXECUTED WHEN A COLUMN OF DATA IS READY. ;* THE INPUT MODE (BINARY OR ALPHANUMERIC) IS DETERMINED, AND THE ;* DATA ARE PROCESSED A§DDRESS MOV #340,@#CRVECT+2 .ENDC .IFG NCR-1 MOV #CRVECT,R0 MOV #CRINT1,R1 MOV #340,R4 MOV #NCR,R2 ; CRNA10: MOV (R0),R3 ;LOAD VECTOR ADDRESS MOV R1,(R3)+ ;STORE ADDR(CRINT) IN VECTOR MOV R4,(R3)+ ;SET PRIORITY LEVEL TO ZERO ADD #8.,R1 .IFZ $1145 ; DEC R2 BNE CRNA10 .ENDC İCCORDINGLY ;* ; CRID00: .IFZ NCR ;IF THERE IS ONLY ONE CARD READER CLR R3 ;IN THE SYSTEM, SET INDEX = 0 .ENDC ; ; TST CRMODE(R3) ;SEE IF WE'RE IN THE BINARY MODE BEQ CRIE00 ;BRANCH IF ALPHANUMERIC TST MXCNT(R3) ;SEE IF THERE'S ANYMORE INFORMATION BLE CRID30 ;THAT WE WANT ON CARD - BRANCH IF NO ;* ;* Ğ ; SOB R2,CRNA10 .ENDC ; .ENDC ; ; NOW, LET'S CLEAR THE QUEUES OUT ; .IFZ NCR-1 CLR CRFRST MOV #CRFRST,CRLAST .ENDC .IFG NCR-1 MOV #NCR,R0 MOV #CRFRST,R1 MOV #CRLAST,R2 ; CRNA20: MOV R1,(R2)+ ;SET CRLAST = ADDR(CRFRST) CLR (R1)+ ;SET CRFRST = 0 .IFZ $1145 DEC R0 ­USE BYTE TO TELL US HOW AND WHERE TO USE THE 12 BITS IN CRB1 ;* AS FOLLOWS. ASSUME FORMAT OF CRB1 IS 00 X1 X2 X3, WHERE ;* XX = 4 BITS EACH. ;* ;* BYTE CRB1 IN CURRENT WORD CRB1 IN NEXT WORD ;* ;* 0 X1 X2 X3 00 ----------- ;* 1 00 00 00 X1 X2 X3 00 00 ;* 2 00 00 X1 X2 X3 00 00 00 ;* 3 00 X1 X2 X3 ----------- ;DECREMENT COUNTER BNE CRNA20 ;AND TRY, TRY AGAIN .ENDC .IFNZ $1145 SOB R0,CRNA20 .ENDC .ENDC RTS PC .ENDC ;ENDC FOR THE BEGINNING .IFNZ NCR STATEMENT .END CRINIT ħ MOV CRDATA(R3),R1 ;GET ADDRESS OF DATA BUFFER ADD COUNT(R3),R1 ;ADD INDEX INTO BUFFER MOV BYTE(R3),R2 BEQ CRID10 DEC R2 BEQ CRID40 DEC R2 BEQ CRID50 BR CRID60 ; CRID10: MOV @CRB1(R3),R4 ;GET CURRENT DATA .IFZ $1145 ;SHIFT ASL R4 ; DATA ASL R4 ; INTO ASL R4 µ ; POSITION ASL R4 ; .ENDC ; .IFNZ $1145 ; ASH R4,4 ; .ENDC ; MOV R4,4(R1) ;STORE BINARY DATA ; CRID20: INC BYTE(R3) ; CRID30: JMP (R5) ;EXIT TO RESTOR ; ; CRID40: MOV @CRB1(R3),R4 ;GET CURRENT COLUMN OF DATA CLR R0 BISB R4,R0 ;SET R4 = BIıTS 0-7 OF CRB1 DATA SWAB R4 BISB R4,4(R1) ;STORE BITS 8-11 OF CRB1 IN DATA BUFFER ADD #2,COUNT(R3) ;INCREMENT DATA BUFFER INDEX DEC MXCNT(R3) ;DECREMENT NO. WORDS COUNTER BLE CRID30 ;BRANCH IF NO MORE CARD DATA IS REQUIRED MOVB R0,7(R1) ;STORE 8 BITS OF BINARY DATA IN TOP BYTE BR CRID20 ;OF DATA BUFFER ; CRID50: MOV @CRB1(R3),R4 ;GET CURRENT DATA ½ .IFZ $1145 ;SHIFT ASL F4 ; INTO ASL F4 ; BIT ASL F4 ; POSITIONS ASL F4 ; 4-15 SO WE .ENDC ; CAN GET THE .IFNZ $1145 ; MOST SIGNIFICANT ASH R4,4 ; 8 BITS OF CRB1 .ENDC ; DATA CLR Á R0 BISB R4,R0 ;SET R4 = BITS 0-3 OF CRB1 DATA MOVB R4,4(R1) ;STORE BINARY DATA AS 00 00 X1 X2 ADD #2,COUNT(R3) ;INCREMENT DATA BUFFER INDEX DEC MXCNT(R3) ;DECREMENT NO. WORDS COUNTER BLE CRID30 SWAB R0 MOV R0,6(R1) ;STORE BINARY DATA IN NEXT WORD OF BR CRID20 ;BUFFER AS X3 00 00 00 ; CRID60: BIS @CRB1(R3),4(R1) ;PUT CURRENT BINARY DATA IN ĊBUFFER ADD #2,COUNT(R3) ;AS 00 X1 X2 X3 CLR BYTE(R3) DEC MXCNT(R3) JMP (R5) ;EXIT TO RESTOR .PAGE ;* ;* ;* A L P H A N U M E R I C M O D E ;* ;* THIS SECTION CONVERTS THE CURRENT COLUMN CHARACTER TO THE ;* SPECIFIED FORMAT AND STORES IT IN THE DATA BUFFER. IS ALSO ;* CHECKS COLUMN 1 OF EACH CARD FOR CONTROL INFORMATION (FORMAT) ;* OF CARDS, ETC.). ;* ; CRIE00: INC COUNT(ÉR3) ;INCREMENT CHARACTER (COLUMN) COUNT CMP COUNT(R3),#1 ;IS THIS THE FIRST COLUMN? BNE CRIE15 ;BRANCH IF NO MOV @CRB1(R3),R4 ;OTHERWISE, GET BINARY CARD IMAGE .IFNZ TTYSW CMP R4,#SWITCH ;SEE IF COMMAND IS TO SWITCH TO TTY BNE CRIE10 INC CRBKUP(R3) ;SET FLAG TO SWITCH TO TTY BACKUP BR CRIF10 ;THEN GO SET 'READ ANOTHER CARD' FLAG ; CRIE10: CMP Í R4,#$026 ;026 CONTROL COMMAND? BEQ CRIF00 ;BRANCH IF YES CMP R4,#$029 ;029 CONTROL COMMAND? BEQ CRIF30 ;BRANCH IF 029 CMP R4,#EOD ;LOGICAL END-OF-DATA? BEQ CRIE20 ;BRANCH IF EOD ; CRIE15: ; TST MXCNT(R3) ;WELL THEN, IT MUST BE AN ORDINARY CHARACTER BEQ CRID30 ;BRANCH IF WE DON'T NEED ANY MORE CHARACTERS MOV Ñ@CRB2(R3),R2 ;GET COMPRESSED VERSION OF CHARACTER ADD TABLE(R3),R2 ;ADD IN BASE TABLE ADDRESS MOV CRDATA(R3),R1 ;GET DATA BUFFER ADDRESS ADD COUNT(R3*,R1 ;ADD CHARACTER INDEX MOVB (R2),-(R1) ;MOVE CONVERTED CHARACTER TO CALLER'S BUFFER DEC MXCNT(R3) BR CRID30 ; CRIE20: MOV CRFRST(R3),R1 ;EOD READ - GET ADDRESS OF LIST MOV #7,ERROR(R1) ;SET EOD ENCOUNTERED ERROR CODE ĠINC IGNORE(R3) ;SET 'IGNORE CARD' FLAG ; ; 026 CONTROL CARD READ. SET CONVERSION TABLE ADDRESS UP. ; CRIF00: MOV CRLIST(R3),R0 ^GET LIST BUFFER ADDRESS TST (R0) ;TEST LEVEL TO DETERMINE MODE BNE CRIF20 ;1 = EBCDIC MOV #026ASC,TABLE(R3) ;0 = ASCII ; CRIF10: INC REPEAT(R3) ;SET 'READ ANOTHER CARD FLAG' BR CRID30 ; CRIF20: MOV #026EBC,TABLE(R3) Ù ;SET FOR 026 TO EBCDIC CONVERSION BR CRIF10 ; ; 029 CONTROL CARD. SET FOR PROPER CONVERSION ; CRIF30: MOV CRLIST(R3),R0 ;GET LIST ADDRESS TST (R0) ;TEST FOR INTERNAL FORMAT TYPE BNE CRIF40 ;BRANCH IF EBCDIC MOV #029ASC,TABLE(R3) ;OTHERWISE, SET FOR 029-ASCII BR CRFI10 ; CRIF40: MOV #029EBC,TABLE(R3) ;029-EBCDIC BR CRFI10 .PAGE ;*Ŭ********************************************************************* ;$ ** ;$ C R T I M E ** ;$ ** ;$ THIS ROUTINE IS ENTERED WHENEVER AN EXPECTED CARD ** ;$ READER INTERRUPT IS NOT RECEIVED. AN APPROPRIATE ** ;$ OPERATOR ACTION MESSAGE IS PRINTED, AND THE C/R á ** ;$ ;********************************************************************** ; ; ;CRTIME IS ENTERED FROM TIMER ROUTINES CRTIME: ;R1 POINTS TO THE TIMER MODULE LIST MOV 6(R1),R3 ;SET R3 = C/R INDEX MOV @CRS(R3),R0 BIS #4,R0 ;SET BIT 2 = 1 TO SIGNAL C/R ERROR CONDITION MOV R0,@ERRCR(R3) ;STORE ERROR MOV CRNO,-(SP) ;PRINT MESSAGE ASR (SP)ċ MOV #ERMSGE,-(SP) JSR PC,CRMSGE MOV #MXTIME,COUNT(R3) ;SET MAXIMUM DELAY THAT WE'LL MOV CRDLAY,8.(R1) ;WAIT FOR CORRECTIVE ACTION CLR @CRS(R3) ;STORE NEW TIMEOUT ENTRY AND CRTA00: ;DISABLE INTERRUPTS MOV R1,-(SP) ;SET UP FOR 1 SECOND DELAY MOV #R10MS*100.,-(SP) ; JSR PC,QTIME TST (SP)+ BEQ é CRTA00 ;BRANCH IF QUEUE ACCEPTED BR CRLA00 ;OTHERWISE, GO ABORT REQUEST ; CRTA10: RTS PC ;RETURN TO TIMER ROUTINES .PAGE ;********************************************************************** ;* ** ;* C R D L A Y ** ;* ** í ;* THIS ROUTINE IS ENTERED ONCE EVERY SECOND AND IS INITIALLY ** ;* ACTIVATED BY CRTIME. IT PURPOSE IS TO PATIENTLY SIT AND ** ;* WAIT FOR THE CARD READER TO GET READY. HOWEVER, NOT BEING ** ;* A VERY PATIEND INDIVIDUAL, HE JUST MIGHT ABORT THE C/R NG ** ;* REQUEST, BUT ONLY AFTER MXTIME SECONDS HAVE ELAPSED. G ** ;* G ** ;* CRDLAY IS ENTERED FROM THE TIMER ROUTINE AND R1 POINTS TñO ** ;* THE TIMER MODULE. ** ;* ** ;********************************************************************** ; CRDLAY: MOV 6(R1),R3 ;GET C/R INDEX BIT #READY,@CRS(R3) ;CHECK C/R STATUS BNE ;BRANCH IF C/R IS READY DEC COUNT(R3) ;TSK, TSK. DECREMENT COUNTER BNE CRTA00 ;GO WAIT SġOME IF MXTIME SEC. HAVEN'T ELAPSED CRLA00: MOV R3,-(SP) ;WELL, THAT'S REALLY TOO BAD. MOV #CRXXXX,-(SP) JSR PC,CRMSGE ;PRINT 'CR K ABORT' MOV (SP)+,R5 ;PUT TIMER RETURN ADDRESS IN R5 MOV CRFRST(R3),R1 ;GET USER'S LIST ADDRESS MOV #7,ERROR(R1) ;SET I/O REQUEST ABORTED ERROR CODE JMP CRCLOS ;THEN GO TO DEQUEUE THE REQUEST AND EXIT .PAGE ;*****************************ù***************************************** ;* C R M S G E ** ;* ** ;* THIS SUBROUTINE OUTPUTS THE INDICATED MESSAGE TO THE SYSTEM ** ;* TELETYPE. CRMSGE IS CALLED WHEN AN ERROR HAS BEEN DETECTED ** ;* OR OPERATOR ACTION IS REQUIRED. LINKAGE IS ** ;* ** ;* MOV CRNO,-ŭ(SP) PUSH C/R NUMBER (LOGICAL DEVICE) ** ;* MOV #DATA-(SP) PUSH DATA BUFFER ADDRESS ** ;* JSR PC,CRMSGE ** ;* BNE BNE IF LIST WASN'T AVAILABLE ** ;* ** ;* REGISTER R5 IS DESTROYED. ** ;* ** ;********************************************************************** ; CRMSGE: .IFG NCR-1 MOV 4(SP),R5 ;SET R5 = CRNO .IFZ $1145 ; * ASL R5 ; SET R5 = 14*R5 * ASL R5 ; * 11/20 CODE ASL R5 ; * SUB 4(SP),R5 ; * ASL R5 ; * .ENDC  ; * .IFNZ $1145 ; * MUL #14,R5 ; * 11/45 CODE .ENDC ; * ADD #CRLIST,R5 ;ADD IN BASE ADDRESS OF LIST .ENDC ; ; CODE IF ONLY ONE C/R IN SYSTEM ; .IFZ NCR-1 MOV #CRLIST,R5 .ENDC MOV @#PSR,-(SP) ;SAVE PSR .IFZ $1145 ;THEN, INHIBIT INTERRUPTS MOV #340,@#P SR ;11/20 CODE .ENDC .IFNZ $1145 SPL 7 ;11/45 CODE .ENDC TST 12.(R5) ;SEE IF LIST IS AVAILABLE BNE CMSX00 ;BRANCH IF NO MOV 4(SP),12.(R5) ;YES - GRAB IT MOV (SP)+,@#PSR ;ENABLE INTERRUPTS MOV (SP)+,2(SP) ;PUT RETURN PC AHEAD OF DATA ADDRESS MOV R5,(SP) ;STORE LIST ADDRESS JSR PC,TTYOUT ;CALL TTYOUT TO PRINT MESSAGE CLZ RTS PC ;RETURN TO CALLER ; CMSX00: MOV (SP)+,@#PSR ;LIST BUSY MOV (SP)+,2(SP) TST (SP)+ SEZ ;SET ERROR INDICATOR (BUSY LIST) RTS PC ;RETURN TO CALLER ; CRTTY: CLR 12.(R ) ;TTY I/O COMPLETE SUBROUTINE RTS PC ;SET LIST NOT BUSY AND EXIT .PAGE ;********************************************************************** ;* ** ;* C R S I O ** ;* ** ;* CARD READER START I/O SUBROUTINE. CRSIO SETS UP ALL ** ;* COUNTERS, INITIATES A C/R READ REQUEST, AND STARTS ** ;* UP A TIMER (100 MS DELAY) TO MAKE SURE WE DON'T HANG ** ;* IF AN INTERRUPT ISN'T RECEIVED. CRDQJM, A SECOND ** ;* ENTRY, WILL DEQUEUE (STOP) THIS TIMER REQUEST BY USING ** ;* SUBROUTINE DQTIME. USAGE IS: ** ;* ** ;* MOV #CRINDX,R3 ;SET R3 = C/R INDEX ** ;* JSR PC,CRSIO ** ;* ** ;* REGISTERS R0, R1, R2 AND R4 ARE DESTROYED. ** ;* ** ;********************************************************************** ; ; CRSIO: CLR COUNT(R3) ;SET COUNT = 0 MOV CRDATA(R3),R0 ;GET DATA ADDRESS CLR R1 ;DETERMINE MODE OF INPUT MOV (R0),R2 BGE CRSA10 ;NWORD < 0 ======> BINARY INC R1 ;SET R1 = 1 (BINARY) NEG R4 ; CRSA10: MOV R1,CRMODE(R3) ;STORE MODE CODE CLR ERROR(R3) ;CLEAR ERROR STATUS MOV PC,CRBUSY(R3) ;SET C/R BUSY .IFZ NCR-1 ;NOW WE GOT'S TA GET THE ADDRESS OF MOV #CRMOD,R ;THE TIMER MODULE FOR THIS C/R .ENDC .IFG NCR-1 ;IF ONLY ONE C/R, THEN THE ADDRESS MOV R3,R1 ;IS = CRMOD .IFZ $1145 ; IF > ONE C/R, THEN THE ! ASL R1 ;11/20 CODE ADDRESS IS: ASL R1 ; ADD R3,R1 ; 5*NCR*2 + ADDR(CRMOD) .ENDC ; WHERE .IFNZ $1145 ; R3 = 2*NCK MUL #5,R1 ;11/45 CODE FOR 5*NCR .ENDC ; ADD #CRMOD,R1 ; .ENDC ; MOV #CRTIME,8.(R1) ;SET JSR ADDRESS I%N TIMER MODULE TO CRTIME MOV R1,-(SP) ; MOV #R10MS*10.,-(SP);SET UP FOR 100 MS DELAY JSR PC,QTIME ;START UP TIMER TST (SP)+ ; MOV R2,MXCNT(R3) ;STORE MAXIMUM NUMBER WORDS (CHARACTERS) ;NOW, WE CAN FINALLY START THE I/O MOV #ENABLE!START,@CRS(R3) ; RTS PC ;RETURN TO HE WHO CALLS .PAGE ;*******************************************)*************************** ; ** ; P A T C H A R E A ** ; ** ; ** .=.+100. .PAGE .PAGE .PAGE ;********************************************************************** ;* - ** ;* C R D Q T M ** ;* ** ;* THIS SUBROUTINE DEACTIVATES THE CURRENT TIMER FOR THE ** ;* INDICATED CARD READER. LINKAGE IS: ** ;* ** ;* MOV #CRINDX,R3 ;PLACE C/R INDEX IN R3 ** ;* JSR PC,CRDQTM 1 ** ;* ** ;* REGISTERS R0, R1, R2 AND R4 ARE DESTROYED. ** ;* ** ;********************************************************************** ; ; CRDQTM: MOV #CRMOD,-(SP) ;PUT BASE ADDRESS OF TIMER MODULE ON STACK .IFG NCR-1 ;DO THIS PART IF > ONE C/R MOV R3,R1 5 ;CALCULATE 5*CRINDX .IFZ $1145 ; ASL R1 ;11/20 ASL R1 ; ADD R3,R1 ; .ENDC ; IFNZ $1145 ; MUL #5,R1 ; .ENDC ; ADD R1,(SP) ;ADD MODULE OFFSET TO BASE JSR PC,DQTIME ;THEN DEQUEUE IT RTS PC ;THEN GO WHENCE WE CAME ; CRBUSY: .=.+NCR+NCR 9 ;0 = C/R NOT IN USE, 1 = C/R IN USE ; CRDATA: .=.+NCR+NCR ;ADDRESS OF CURRENT DATA BUFFER ; CRTASK: .=.+NCR+NCR ;TASK NO. FOR CURRENT I/O - 0=NON-TASK RQST ; ; ; I N I T I A L I Z A T I O N ; CRDA00: .IFZ NCR-1 ;FIRST, LET'S SET UP THE INTERRUPT VECTORS MOV #CRINT,@#CRVECT CLR @#CRVECT+2 .ENDC .IFG NCR-1 MOV #CRVECT,R0 MOV =#CRINT1,R1 MOV #NCR,R2 ; CRDA10: MOV (R0),R3 ;LOAD VECTOR ADDRESS MOV R0,(R3)+ ;STORE ADDR(CRINT) IN VECTOR CLR (R3)+ ;SET PRIORITY LEVEL TO ZERO ADD #8.,R1 DEC R2 BNE CRDA10 .ENDC ; ; NOW, LET'S CLEAR THE QUEUES OUT ; .IFZ NCR-1 CLR CRFRST MOV #CRFRST,CRLAST .ENDC .IFG NCR-1 MOV #NCR,R0 C PROGRAM TO TEST DYNAMIC COR ALLOCATION C ˙IMPLICIT INTEGER (A-Z) ˙COMMON TIME(50), FREQ(50),TIME0(50),FREQ0(50), ˙1 ATEMPT(50), XEQ(50), ACTXEQ(50), REJECT(50), ˙2 STATUS(50), CORE(200), S(50), ˙3 C, DISC, NCORE C ˙DO 1 I=1,160 1 ˙˙CORE(I)=0 ˙DO 2 I=1,50 2 ˙STATUS(I)=0 ˙WRITE (6,5) 5 ˙FORMAT (19H0N,SIZE,C,MAXT,DISC) ˙READ (5,10) N,SIZE,C,MAXT,DISC 10 ˙FORMAT (I2,1X,I4,1X,I1,1X,I5,1X,I2) ˙NCORE = (SIZE + 49)/50 ˙IF (NCORE .GT. 200) NCORE = 200 ˙DO 50 J = 1, N ˙WRITE (6,2 MOV #CRFRST,R1 MOV #CRLAST,R2 ; CRDA20: MOV R1,(R2)+ ;SET CRLAST = ADDR(CRFRST) CLR (R1)+ ;SET CRFRST = 0 DEC R0 ;DECREMENT COUNTER BNE CRDB10 ;AND TRY, TRY AGAIN .ENDC RTS PC .END ˙IF (ERR .NE. 0) GO TO 100 ˙ACTXEQ(J) = ACTXEQ(J) + 1 ˙FREQ(J) = FREQ0(J) ˙STATUS(J) = 1 ˙GO TO 5000 100 ˙REJECT(J) = REJECT(J) + 1 ˙GO TO 5000 C C......TASK IS CURRENTLY EXECUTING, SEE IF TIME TO STOP..... 200 ˙TIME(J) = TIME(J) - 1 ˙IF (TIME(J) .NE. 0) GO TO 60 C C......REMOVE TASK CORE ASSIGNMENT..... ˙CALL REMOVE (J) ˙STATUS(J) = 0 ˙TIME(J) = TIME0(J) ˙GO TO 60 C C......END OF THE J-TH TASK LOOP..... 5000 ˙CONTINUE 9000 ˙CONTINUE ˙WRITE (6,9100) 9100 ˙FORMAT (37H0TASK TIME FREQ SIZE ATEMPT XEQ, ˙1 16H ACTXEQ REJECT) ˙WRITE (6,9200) (J,TIME0(J),FREQ0(J),S(J), ˙2 ATEMPT(J),XEQ(J),ACTXEQ(J), ˙3 REJECT(J), J = 1, N) 9200 ˙FORMAT (1H , I3, 3I6, I8, I7, 2I8) ˙STOP ˙END C