ASMB,R,L,C,F
      HED %TAM 91704-16108 REV A * (C) HEWLETT-PACKARD CO. 1976 
      NAM %TAM,7 91704-16108 REV A 760309 
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
******************************************************************
      SPC 2 
      SPC 1 
***************************************** 
* 
*%TAM               TERMINAL ACCESS MONITOR FOR RTE-B 
* 
*SOURCE PART #      91704-18108 REV A 
* 
*REL PART #         91704-16108 REV A 
* 
*WRITTEN BY:        LARRY POMATTO 
* 
*DATE WRITTEN:      8-22-74 
* 
*MODIFIED BY:       JEAN-PIERRE BAUDOUIN
* 
*DATE MODIFIED:     MAR 1976
* 
***************************************** 
      SUP 
      SPC 2 
*     SUBROUTINE TO DO ALL REMOTE COMMUNICATION 
*     ALL CALLS STARTING AT THE REMOTE TERMINAL WILL
*     GO THRU HERE. 
*     CALLING SEQUENCE
*     JSB %TAM
*     DEF REPLY BUFFER ADDRESS
*     DEF PRM ADDRESS 
*     A REG=0REQ ONLY, NOT 0 REQ AND DATA 
*     E REG=READ/WRITE FLAG 
* 
      SPC 3 
*     DEFINE ENTRY POINTS 
      SPC 2 
      ENT %TAM,STCK,RWAIT 
      SPC 2 
*     DEFINE EXTERNALS
      EXT REPLA,INDCK,FRPLY 
      EXT CLU,M7,M1,EXEC,B377 
      EXT B200,WAIT 
      EXT CLINE,DBSY
      EXT $TIME,#TIME 
      SPC 2 
*     DEFINE A AND B REG
      SPC 1 
A     EQU 0 
B     EQU 1 
      SKP 
* 
*     HERE IS WHERE WE START
* 
%TAM  NOP 
      STA SAVEA     A CONTAINS A PARAMETER!!!! SAVE IT
      LDA CLU 
      AND B77 
      STA CNWD
      LDA SAVEA     RESTORE THE PARAMETER 
      CLB,INB       SET FOR READ
      SEZ           WRITE?
      INB           YES 
      STB DIRCT     SAVE DIRECTION FLAG 
      STA B         GET REQ/DATA FLAF IN B REG
      LDA %TAM,I    GET REPLY ADDRESS 
      JSB INDCK     INDIRECT IT 
      STA REPLA     SAVE REPLY ADDRESS FOR REPLY
      LDA M7        GET RETRY COUNT 
      STA RTRYC     SAVE IN DOWN COUNTER
      CLA 
      STA FRPLY     CLEAR OUT WAIT FLAG 
      ISZ %TAM      GET TO PRAM ADDRESS 
      LDA %TAM,I    GET ADDRESS OF PRAMS
      ISZ %TAM      SET FOR RETURN
      JSB INDCK     INDIRECT IT 
      SZB           SEND REQ AND DATA?
      JMP %TAM2     YES 
      LDB A,I       GET REQ ADDRESS 
      STB REQA      SAVE BUFFER ADDRESS 
      LDA DIRCT     GET DIRECTION 
      IOR BIT15     SET THE NO ABORT BIT
      STA IRW 
      LDA REQA,I    GET WORD 1 OF BUFFER
      IOR BIT11     SET FRIENDLY BIT
      STA REQA,I
      LDA REQA      GET PARMB ADDRESS 
      ADA D33       STEP TO TIME TAGS 
      LDB $TIME     GET 1ST WORD
      STB A,I       SET IN PARMB
      STB #TIME     SAVE FOR RETURN TEST
      INA 
      LDB $TIME+1   SAME FOR 2ND WORD 
      STB A,I 
      STB #TIME+1 
RQRTY ISZ RTRYC     MAX NUMBER OF RETRYS? 
      JMP *+3       NO
      LDA STWRD     GET STATUS WORD 
      JMP %TAM,I    RETURN
* 
*     MAKE EXEC CALL    SEND REQUEST
* 
      LDA DBSY      WAIT TILL EVERYBODY DONE
      SZA 
      JMP *-2 
      JSB EXEC
      DEF *+5 
      DEF IRW 
      DEF CNWD
REQA  NOP 
REQL  DEF D35 
      JMP RQRTY     LINE ERROR
      JSB STCK      DO STATUS CHECKING
      JMP STCK1     NO ERRORS..WAIT FOR RESPONSE
      JMP RQRTY     ERROR  RETRY
      JMP %TAM,I    TERMINATE...TIME OUT OR STOP
      SPC 3 
* 
*     HERE FOR SEND REQ AND DATA
* 
%TAM2 LDB A,I 
      STB DTAD      SAVE DATA ADDRESS 
      INA 
      STA DTL       SAVE DATA LENGTH
      INA 
      LDB A,I 
      STB REQDA     REQUEST ADDRESS 
      ADB D33       STEP TO TIME TAGS 
      LDA $TIME     GET 1ST TIME WORD 
      STA B,I       SET IN PARMB
      STA #TIME     SAVE FOR REPLY TEST 
      INB           SAME FOR 2ND WORD 
      LDA $TIME+1 
      STA B,I 
      STA #TIME+1 
      LDA REQDA,I   GET 1ST WORD OF REQUEST 
      IOR BIT11     SET FRIENDLY BIT
      STA REQDA,I 
* 
      LDA DIRCT     GET DIRECTION OF DATA 
      LDB B200
      CPA D1        DATA READ 
      LDB B100
      LDA CLU       GET THE LU
      AND B77       CLEAN IT
      IOR B         SET THE PROPER CONTROL
      STA CNWD      SET CONTROL 
RDRTY ISZ RTRYC     MAX NUMBER OF RETRYS? 
      JMP *+3       NO....CONTINUE
      LDA STWRD     GET STATUS WORD 
      JMP %TAM,I    RETURN...WITH ERROR 
* 
*     MAKE EXEC CALL...REQ AND DATA 
* 
      LDA DBSY      WAIT FOR LINE CLEAR 
      SZA 
      JMP *-2 
      JSB EXEC
      DEF *+7 
      DEF D2I       REQ & DATA
      DEF CNWD
REQDA NOP 
      DEF D35 
      DEF DTAD
DTL   NOP 
      JMP RDRTY     ERROR RETURN
      JSB STCK      CHECK STATUS
      JMP STCK1     ALL OK
      JMP RDRTY     ERROR...RETRY 
      CPA B10       TIME OUT OR STOP? 
      JMP %TAM,I    TIME OUT...GET OUT
      JMP STCK1     STOP RECIEVED 
      SPC 2 
* 
*     HERE WE WAIT FOR REPLY
* 
STCK1 JSB RWAIT     GO WAIT FOR RESPONSE
      DST SABRG     SAVE THE REGISTERS
      LDA REPLA,I   GET W0 OF THE PARMB 
      AND BIT13     GET BUZY BIT
      SZA,RSS       SET ? 
      JMP NBZY      NO, OK
      CLB           WE WAIT 
      ISZ B           SOME TIME 
      JMP *-1           BEFORE RETRYING 
      ISZ B         WAIT SOME MORE
      JMP *-1 
      LDA REPLA,I   GET W0 AGAIN
      AND NBT13     MASK OFF THE BUSY BIT 
      STA REPLA,I   REPLACE 
      JMP RQRTY     GO RETRY
* 
NBZY  DLD SABRG     RESTORE THE REGISTERS 
      JMP %TAM,I    RETURN
      SKP 
* 
*     SUBROUTINE TO CHECK STATUS OF CALL
*     CALLING SEQUENCE
*     JSB STCK
*     JMP ALL OK
*     JMP RETRY 
*     JMP STOP RETURN 
*     A REG CONTAINS STATUS WORD
*     B REG CONTAINS THE LENGTH 
*     RTRYC MUST BE SET BEFORE CALLED 
*     IF MAX NUMBER OF RETRYS FAILS WILL ABORT BASIC
* 
STCK  NOP 
      AND B377      MASK ALL BUT STATUS 
      SLA           ALL OK? 
      JMP STCK,I    YES...RETURN
      ISZ STCK      NO...SET FOR RETRY
      STA STWRD     SAVE STATUS WORD
      SPC 2 
*     CHECK INDIVIDUAL STATUS BITS FOR ERROR
      SPC 1 
      RAR,SLA,RAR   CHECK FOR DRIVER BUSY 
      JMP STCK3     BUSY...GO WAIT TRY AGAIN
      RAR,SLA       TIMEOUT?
      JMP STCK6     YES...TREAT AS STOP...CLEAR LINE
      RAR,SLA       CHECK FOR STOP OR OUT OF SYNC 
      JMP STCK5     GO CHECK
      RAR,SLA       ILLEGAL LENGTH
      JMP OUT       SHOULD NEVER GET HERE.CLEAR LINE-ERR=-51
      RAR,SLA       PARITY ERROR? 
      JMP STCK3     YES...WAIT AND RETYR
      RAR,SLA       LINE DOWN?
      RSS           YES...TRY "UPING" THE LINE
      JMP OUT       SHOULD NEVER GET HERE.CLEAR LINE-ERR=-51
      LDB MD2 
      STB CNTR2 
STCK2 JSB CLINE     GO CLEAR THE LINE 
      SLA           ALL OK? 
      JMP STCK,I    YES...RETRY 
      ISZ CNTR2 
      RSS 
      JMP OUT+1 
* 
*     IF WE ARE UNABLE TO CLEAR LINE
*     TELL WORLD, WAIT 144 MS 
*     AND TRY CLEARING THE LINE AGAIN.
*     STAY HERE UNTIL THE LINE CAN BE CLEARED...
* 
      LDB B200      WAIT 144 MS AND TRY AGAIN 
      JSB WAIT
      JMP STCK2     TRY AGAIN 
      SPC 2 
STCK3 CLB           SET TO WAIT AWHILE
      INB,SZB 
      JMP *-1 
      LDA STWRD     GET STATUS
      JMP STCK,I    RETURN...RETRY
      SPC 2 
STCK5 CPB M1        LEGAL STOP? 
      JMP STCK7     YES...TERMINATE AND TELL THEM 
      JMP STCK3     NO...WAIT AWHILE AND RETRY
      SPC 2 
STCK6 JSB CLINE     TIMEOUT, CLEAR LINE 
STCK7 LDA STWRD     GET STATUS WORD 
      ISZ STCK      AND RETURN LIKE A STOP
      JMP STCK,I    AND RETURN
      SKP 
* 
*     SUBROUTINE TO WAIT FOR COMPLETION 
* 
*     CALLING SEQUENCE
*     JSB RWAIT 
*     JMP RECEIVED VALUE
* 
*     THIS ROUTINE IS GOING TO TEST A REPLY FLAG. 
*     IT HAS A TIME OUT SET UP SO THAT IT WILL WAIT 
*     FOR THE REPLY A MAXIMUM OF 10 TIMES THE LINE
*     TIME OUT. 
* 
* 
RWAIT NOP 
      JSB SEARC     SEARCH THE EQT TABLE FOR DVR65
      CLA           GET A NOP 
      STA *-2       THE SEARCH IS NEEDED ONLY ONCE
      LDB EQENT     GET ADDRESS OF EQT ENTRY
      ADB D13       STEP TO THE TIME OUT WORD 
      LDA B,I       GET IT
      ADA MD1 
      STA TIMUT     SAVE
LOOK  LDA FRPLY     DID THE REPLY ARRIVE ?
      SZA,RSS 
      JMP WASTE     NO, GO WASTE SOME TIME (100MS)
      DST SABRG     SAVE THE REGISTERS
      CLB           YES, CLEAN THE REPLY FLAG 
      STB FRPLY 
      LDA REPLA     GET REPLY ADDRESS 
      ADA D33       STEP TO TIME TAGS 
      DLD A,I       GET THEM
      CPA #TIME     IS THIS THE RIGHT REPLY ? 
      RSS 
      JMP NOGD      NO, IGNORE IT 
      CPB #TIME+1 
      RSS            YES 
      JMP NOGD      MISMATCH, IGNORE THIS REPLY 
      DLD SABRG     FIRST RESTORE THE REGISTERS 
      JMP RWAIT,I   NOW RETURN
* 
WASTE ISZ TIMUT     DID WE TIME OUT ? 
      RSS           NO
      JMP OUT       YES 
      LDA LENGT 
      STA CNTR
      ISZ CNTR
      JMP *-1 
      JMP LOOK      WE SPENT 100 MS HERE, THAT'S ENOUGH 
* 
OUT   JSB CLINE     CLEAR THE LINE
      LDA MD51      GET A STATUS BACK TO THE CALLER 
      JMP RWAIT,I   RETURN
      SPC 3 
* 
*     WE COME HERE IF A REPLY ARRIVES WITH THE WRONG
*     TIME TAGS. IF DATA IS PENDING (PTOP) WE SEND A
*     STOP TO CANCEL IT.
* 
NOGD  LDB EQENT     GET ADDRESS OF EQT ENTRY
      ADB D11       STEP TO WORD 12 
      LDA B,I       GET WORD 12 
      AND B1773     MASK OUT THE DP BIT (BIT 8) 
      SZA,RSS       DATA PENDING ?
      JMP LOOK      NO, WAIT FOR NEXT REPLY 
      LDA CLU       YES, GET PREPARED FOR A SEND STOP 
      AND B77 
      STA CNWD
      JSB EXEC      SEND A STOP 
      DEF *+3 
      DEF D3        CONTROL REQUEST 
      DEF CNWD      STOP ON COM. LINE.
* 
      JMP LOOK      GO WAIT FOR NEXT REPLY
      SPC 3 
* 
*     THIS ROUTINE WILL SEARCH THE EQT TABLE FOR THE
*     ENTRY OF THE COMM LINE. 
*     THE ADDRESS OF THE 1ST WORD OF THE ENTRY IS STORED
*     IN EQENT. 
* 
SEARC NOP 
      LDA B1651,I   GET # OF EQT ENTRIES
      CMA,INA       NEGATE
      STA EQT#      AND SAVE AS A COUNTER 
      LDB B1650,I   GET @ OF 1ST EQT ENTRY
      ADB D4        STEP TO WORD 5 OF 1ST ENTRY 
* 
LOOP1 LDA B,I       GET A WORD 5
      ALF,ALF       RIGHT JUSTIFY THE TYPE
      AND B77       ISOLATE THE EQT TYPE
      CPA B65       IS IT THE COMM.LINE 
      JMP FOUND     YES (DVR65) 
      ADB D15       STEP TO NEXT ENTRY
      ISZ EQT#      INCREMENT COUNT 
      JMP LOOP1 
      HLT 2         IF WE COME HERE, IT MEANS THAT THERE IS NO
*                                   NO COMM LINE. WE ARE IN TROUBLE.
* 
FOUND ADB DM4       STEP BACK TO WORD 1 
      STB EQENT 
      JMP SEARC,I   RETURN
      SPC 3 
      SKP 
* 
*     DEFINE STORAGE LOCATIONS
* 
DIRCT NOP 
RTRYC NOP 
B10   OCT 10
STWRD NOP 
CNTR  NOP 
CNTR2 NOP 
LENGT DEC -10000
MD1   DEC -1
MD2   DEC -2
TIMUT NOP 
D13   DEC 13
EQT#  NOP 
B65   OCT 65
D15   DEC 15
D4    DEC 4 
B1650 OCT 1650
B1651 OCT 1651
MD51  DEC -51 
D2I   OCT 100002
DTAD  NOP 
B77   OCT 77
B100  OCT 100 
CNWD  NOP 
IRW   NOP 
BIT11 OCT 4000
D1    DEC 1 
D35   DEC 35
D33   DEC 33
SABRG BSS 2 
BIT13 OCT 20000 
BIT15 OCT 100000
NBT13 OCT 15777 
SAVEA NOP 
EQENT NOP 
B1773 OCT 177377
D11   DEC 11
D3    DEC 3 
DM4   DEC -4
* 
      END 
                                                                                                                                                                  