*        MACHINE DEPENDENT ROUTINES FOR KERMIT
*        SET FLAGS 1 FOR DIAGNOSTIC VERSION
        XDEF  SYSINI,SYSINIT SYSTEM INITIALIZATION
        XDEF  SYSFIN,SYSFIN  SYSTEM FINISH UP
        XDEF  GETIN,GETIN    GET INPUT CHARACTER
        XDEF  XMTCHA,XMTCHAR TRANSMIT OUTPUT CHARACTER
        XDEF  CONNEC,CONNECT TALK TO REMOTE COMPUTER
        XDEF  SLEEP,SLEEP    DELAY FOR GIVEN NUMBER OF SECONDS
        XDEF  TTYRAW,RAW     PUT CONSOLE IN CHARACTER BY CHARACTER I/O
        XDEF  TTYCOO,COOKED  PUT CONSOLE IN NORMAL MODE
        XDEF  FILECR,CREATE  CREATE A FILE
        XDEF  FLUSH,FLUSH    FLUSH OUTPUT BUFFER
        XDEF  FIXNAM,FIXNAME REMOVE QUALIFIER FROM FILE NAME
BUFSIZE EQIV  54             WORDS IN A BUFFER
        SKFZ  B1
        COMM  /KERMIT/RLCCNT,RLBUF(54),LRCCNT,LRBUF(54)
*              RLCCNT = REMOTE TO LOCAL CHARACTER COUNT
*              RLBUF  = REMOTE TO LOCAL BUFFER
*              LRCCNT = LOCAL TO REMOTE CHARACTER COUNT
*              LRBUF  = LOCAL TO REMOTE BUFFER
        MCOM  KERMIT
        ESKP
        REEN
SYSINIT TJM   RETURN         SAVE RETURN ADDRESS
        TNK   '0313          OPEN TERMINAL OUPUT
        BLU   $I/O
        SKFZ  B1
        TNK   '0613          OPEN DIAGNOSTIC OUTPUT
        BLU   $I/O
        TLO   SYSINIC        REPORT CALL
        BLJ   REPORT
        ESKP
        BUC*  RETURN         AND RETURN
        SKFZ  B1
        PORG  *
SYSINIC DATA  '0302
        DAC   SYSINIE-SYSINIB
        DAC   SYSINIB
        RORG  *
SYSINIB DATA  " SYSINIT CALLED"
SYSINIE EQIV  *
*
REPORT  TJM   REPJ           SAVE RETURN
        TKM   REPK           SAVE PARAMETER LIST POINTER
        TOA   '0302          SEND TO TERMINAL
        TAM   0,K
        BLU   $IOW
        TMK   REPK
        TOA   '0602          SEND TO LO FILE
        TAM   0,K
        BLU   $IOW
        BUC*  REPJ
        PORG  *
REPJ    DAC   *-*            RETURN FROM REPORT
REPK    DAC   *-*            PARAMETER LIST POINTER
LOCAL   DATA  0              0=REMOTE (I.E. HOST), OTHER=LOCAL
        RORG  *
*
SYSFIN  TJM   RETURN         SAVE RETURN ADDRESS
        TLO   SYSFINC        REPORT CALL
        BLJ   REPORT
        BUC*  RETURN         AND RETURN
        PORG  *
SYSFINC DATA  '0302
        DAC   SYSFINE-SYSFINB
        DAC   SYSFINB
SYSFINB DATA  " SYSFIN CALLED: "
SYSFINQ DATA  "REMOTE"
SYSFINE EQIV  *
        RORG  *
        ELSE
SYSFIN  BJL   0              RETURN AT ONCE--DO NOTHING
        ESKP
*
RAW     TJM   RETURN         SAVE RETURN ADDRESS
        SKFZ  B1
        TLO   RAWC           REPORT CALL
        BLJ   REPORT
        TZM   !RLCCNT        WE HAVE NOT YET SENT ANYTHING
        ELSE
        TLO   HOTMODE
        BLU   $I/O
        ESKP
        BUC*  RETURN         AND RETURN
        SKFZ  B1
        PORG  *
RAWC    DATA  '0302
        DAC   RAWE-RAWB
        DAC   RAWB
RAWB    DATA  " RAW CALLED: "
RAWQ    DATA  "REMOTE"
RAWE    EQIV  *
        RORG  *
        ELSE
HOTMODE DATA  '0351          HOT MODE INITIALIZE
        DATA  BUFSIZE        INPUT BUFFER SIZE
        DAC   INPUT          LOCATION OF INPUT BUFFER
        ESKP
*
        PORG  *
INPUT   BLOK  BUFSIZE        INPUT BUFFER
INCNT   DATA  0              INPUT CHARACTERS LEFT
INPLACE BAC   INPUT,0        INPUT BUFFER POINTER
OUTPL   DATA  '0352          HOT WRITE
OUTCNT  DATA  0              OUTPUT CHARACTER COUNT
        DAC   OUTPUT
OUTPUT  BLOK  BUFSIZE        OUTPUT BUFFER
OUTPUT2 BLOK  BUFSIZE        SECOND OUTPUT BUFFER
IWHICH  DATA  0              INDICATES WHICH OUTPUT BUFFER IS USED
OUTPLCE BAC   OUTPUT,0       OUTPUT BUFFER POINTER
        RORG  *
IN1ST   BAC   INPUT,0        POINTER TO 1ST CHARACTER OF INPUT BUFFER
OUT1ST  BAC   OUTPUT,0       POINTER TO 1ST CHARACTER OF OUTPUT BUFFER
OUT2ND  BAC   OUTPUT2,0      POINTER TO 1ST CHAR. OF 2ND OUTPUT BUFFER
*
COOKED  TJM   RETURN         SAVE RETURN ADDRESS
        SKFZ  B1
        TLO   COOKEDC        REPORT CALL
        BLJ   REPORT
        ELSE
        TLO   NORMAL         RETURN TERMINAL TO NORMAL MODE
        BLU   $I/O
        ESKP
        BUC*  RETURN         AND RETURN
        SKFZ  B1
        PORG  *
COOKEDC DATA  '0302
        DAC   COOKEDE-COOKEDB
        DAC   COOKEDB
COOKEDB DATA  " COOKED CALLED: "
COOKEDQ DATA  "REMOTE"
COOKEDE EQIV  *
        RORG  *
        ELSE
NORMAL  DATA  '0351          NORMAL MODE PLEASE
        DATA  -1
        DATA  0
        ESKP
*
GETIN   EQIV  *
        GAP   1              GET ADDRESS OF TIME-OUT COUNT
        TIM   TIMEOUT
        GAP   1              GET ADDRESS FOR CHARACTER FROM CONSOLE
        TIM   CONSOLE
        TJM   RETURN         SAVE RETURN ADDRESS
        BLJ   FLUSH          FLUSH OUTPUT BUFFER
        TMA   INCNT          ANY INPUT CHARACTERS LEFT FROM BEFORE?
        BOP   GETIN2         YES--BRANCH
        TMA   IN1ST          REWIND BUFFER POINTER
        TAM   INPLACE
GETIN0  TNA   10             FOR 1 SECOND COUNT DOWN
        TAM   COUNTDN
GETIN1  EQIV  *
        SKFZ  B1
        TMI   M.LRCNT        USE THIS IF WE ARE REMOTE
        CZM   LOCAL
        BOZ   *+2
        TMI   =RLCCNT        USE THIS IF WE ARE LOCAL
        TMA   !0,I           GET CHARACTER COUNT
        TNK   BUFSIZE        AND COPY THE BUFFER
        TME   !1,I
        TEM   INPUT+BUFSIZE,K
        AOI   1
        BWK   *-3
        SOI   BUFSIZE        RESTORE I
        CZA                  DID WE GET ANY CHARACTERS?
        BNP   *+2            NO--BRANCH
        TZM   !0,I           YES--BUFFER IS NOW FREE
        ELSE
        TNK   '0353          CHECK IF WE HAVE INPUT
        BLU   $I/O
        ESKP
        CZA                  DID WE GET ANY CHARACTERS?
        BOP   GETIN2         YES--BRANCH
        TOK   12             WAIT A 0.1 SECONDS
        BLU   $DELAY
        AUM   COUNTDN
        BON   GETIN1         BRANCH IF A SECOND HASN'T PASSED YET
        AOM   -1             DECREMENT TIME OUT WORD
        DAC*  TIMEOUT
        BOP   GETIN0         BRANCH IF WE HAVEN'T TIMED OUT YET
        TZA                  RETURN A NULL
        BUC   GETIN3
GETIN2  SOA   1              DECREMENT CHARACTERS LEFT
        TAM   INCNT
        TMJ   INPLACE        INPUT BUFFER CHARACTER POINTER
        EMB   !0             GET THE CHARACTER
        EZB
        BBJ   *+1            INCREMENT CHARACTER POINTER
        TJM   INPLACE
GETIN3  EQIV  *
        SKFZ  B1
        TAM   GETINSV        SAVE THE CHARACTER
        BLU   $OCTASC        CONVERT FOR REPORT
        TKM   GETINV
        TDM   GETINV+1
        TOA   '177
        TMA   GETINSV        GET CHARACTER AGAIN
        COB   " "            IS IT A PRINTABLE CHARACTER?
        BNN   *+2            YES--BRANCH
        TOB   "?"            NO--USE A QUESTION MARK
        TBM   GETINX         STORE IN MESSAGE
        TLO   GETINC         REPORT CALL
        BLJ   REPORT
        TMA   GETINSV        RESTORE THE CHARACTER
        ESKP
        BUC*  RETURN         AND RETURN
        PORG  *
TIMEOUT DAC   *-*            ADDRESS OF TIME-OUT WORD
CONSOLE DAC   *-*            PLACE TO STORE CHARACTER FROM CONSOLE
COUNTDN DATA  0              COUNT DOWN FOR FULL SECOND
        SKFZ  B1
GETINSV DATA  0
GETINC  DATA  '0302
        DAC   GETINE-GETINB
        DAC   GETINB
GETINB  DATA  " GETIN CALLED:"
GETINV  BLOK  3
GETINX  DATA  " '?'  "
GETINQ  DATA  "REMOTE"
GETINE  EQIV  *
        ESKP
        RORG  *
*
XMTCHAR TJM   RETURN         SAVE RETURN ADDRESS
        TMA*  !0,J
        TMI   OUTPLCE
        RBM   !0             STORE IT IN OUTPUT BUFFER
        BBI   *+1            ADVANCE BUFFER POINTER
        TIM   OUTPLCE
        TMA   OUTCNT         INCREMENT CHARACTER COUNT
        AOA   1
        TAM   OUTCNT
        SOA   3*BUFSIZE      IS THE BUFFER FULL?
        BON   *+2            NO--BRANCH
        BLJ   FLUSH          YES--WRITE IT OUT
        SKFZ  B1
        TMJ   RETURN         GET THE CHARACTER AGAIN
        TMA*  !0,J
        BLU   $OCTASC
        TKM   XMTCHAV
        TDM   XMTCHAV+1
        TMJ   RETURN         GET VALUE AGAIN
        TOA   '177
        DMA*  !0,J
        COB   " "            IS IT A PRINTABLE CHARACTER?
        BNN   *+2            YES--BRANCH
        TOB   "?"            NO--USE A QUESTION MARK
        TBM   XMTCHAX        STORE IN MESSAGE
        TLO   XMTCHAC        REPORT CALL
        BLJ   REPORT
        ESKP
        TMJ   RETURN
        BJL   1              AND RETURN
        PORG  *
        SKFZ  B1
XMTCHAC DATA  '0302
        DAC   XMTCHAE-XMTCHAB
        DAC   XMTCHAB
XMTCHAB DATA  " XMTCHAR CALLED:"
XMTCHAV BLOK  3
XMTCHAX DATA  " '?'  "
XMTCHAQ DATA  "REMOTE"
XMTCHAE EQIV  *
        ESKP
RETURN  BLOK  1
        RORG  *
*
FLUSH   TJM   FLUSHRT        SAVE RETURN ADDRESS
        TMA   OUTCNT         ANY CHARACTER IN THE BUFFER?
        BNP   FLUSHEX        NO--BRANCH
        SKFZ  B1
FLUSH2  TMI   =RLCCNT        USE IF REMOTE
        CZM   LOCAL
        BOZ   *+2
        TMI   M.LRCNT        USE THIS IF LOCAL
        CZM   !0,I           IS THE BUFFER AVAILABLE
        BNP   FLUSH3         YES--BRANCH
        TOK   12             NO--WAIT 0.1 SECONDS
        BLU   $DELAY
        BUC   FLUSH2         AND TRY AGAIN
FLUSH3  EQIV  *
        TMJ   M.LRCNT        INPUT BUFFER IF REMOTE
        CZM   LOCAL
        BOZ   *+2
        TMJ   =RLCCNT        INPUT BUFFER IF LOCAL
        TZM   !0,J           IGNORE RESPONSE TO PREVIOUS MESSAGE
        TNK   BUFSIZE        COPY THE OUTPUT BUFFER
        TMJ   OUTPL+2
        TMA   !0,J
        TAM   !1,I
        AOI   1
        AOJ   1
        BWK   *-4
        SOI   BUFSIZE        RESTORE I
        TMA   OUTCNT         GET OUTPUT COUNT
        TAM   !0,I           AND STORE IN BUFFER
        ELSE
        TNK   '0353          IGNORE RESPONSE (IF ANY) TO PREVIOUS MESSAGE
        BLU   $I/O
        TLO   OUTPL          WRITE THE BUFFER
        BLU   $I/O
        ESKP
        TZM   OUTCNT         NO CHARACTERS IN BUFFER NOW
        TOA   IWHICH         NOW WHICH BUFFER SHOULD WE USE?
        AOA   1
        TAM   IWHICH
        TME   OUT1ST         USE IF 1ST BUFFER
        TLO   OUTPUT         1ST BUFFER ADDRESS
        QBB   B0             IS IWHICH ODD?
        BOZ   *+3            NO--BRANCH
        TME   OUT2ND         USE IF 2ND BUFFER
        TLO   OUTPUT2
        TEM   OUTPLCE        BUFFER FILL LOCATION
        TKM   OUTPL+2        BUFFER ADDRESS FOR WRITE
FLUSHEX BUC*  FLUSHRT        AND RETURN
FLUSHRT PBLOK 1              RETURN ADDRESS
        TSFZ  B1
M.LRCNT LAC   RLCCNT+BUFSIZE+1   ADDRESS OF LOCAL TO REMOTE
*
SLEEP   GAP   1
        TMA   !0,I           GET NUMBER OF SECONDS
        TJM   RETURN
        SKFZ  B1
        TAM   SECONDS
        BLU   $OCTASC
        TKM   SLEEPV
        TDM   SLEEPV+1
        TLO   SLEEPC
        BLJ   REPORT
        TMA   SECONDS
        ESKP
        MYO   120            120 TICKS PER SECOND
        TAK
        BLU   $DELAY
        BUC*  RETURN
        SKFZ  B1
        PORG  *
SECONDS DATA  0
SLEEPC  DATA  '0302
        DAC   SLEEPE-SLEEPB
        DAC   SLEEPB
SLEEPB  DATA  " SLEEP CALLED: "
SLEEPV  BLOK  3
        DATA  "   "
SLEEPQ  DATA  "REMOTE"
SLEEPE  EQIV  *
        RORG  *
        ESKP
*
CREATE  GAP   1
        TIM   SCINITL+1      TO INITIALIZE THE SCANNER
        TJM   RETURN
        TLO   SCINITL
        BLU   $SCINIT
        TLO   GENLIST        GET AREANAME FOR GENERATE
        BLU   $AREANM
        BON   CREATE2        BRANCH IF TROUBLE
        TLO   GENLIST
        BLU   $GENERATE      CREATE THE FILE
CREATE2 EQIV  *
        SKFZ  B1
        TLO   CREATEC        REPORT THE CALL
        BLJ   REPORT
        ESKP
        BUC*  RETURN
        PORG  *
SCINITL DATA  6              WORD COUNT
        DAC   *-*            BUFFER ADDRESS
GENLIST BLOK  4              AREA NAME
        DATA  0              GRANUAL SIZE
        DATA  0              MAXIMUM SIZE
        DATA  0              PACK NUMBER
        DATA  '10000000      BLOCKED FILE
        DATA  0              PURGE DATE
        DATA  0              BLOCKING FACTOR
        DATA  0              SPOOL PDN
        DATA  3              OWNER WRITE, OWNER DELETE
        DATA  0              ACCESS LEVEL
        DATA  0              FORCED STARTING SECTOR
        BLOK  4              M/TYP#
        SKFZ  B1
CREATEC DATA  '0302
        DAC   CREATEE-CREATEB
        DAC   CREATEB
CREATEB DATA  " CREATE CALLED: "
CREATEQ DATA  "REMOTE"
CREATEE EQIV  *
        ESKP
        RORG  *
*
CONNECT EQIV  *
        SKFZ  B1
        GAP   1              ADDRESS OF DUPLEX WORD
        TJM   RETURN         SAVE RETURN ADDRESS
        TMA   !0,I
        BLU   $OCTASC
        TKM   CONNECV
        TDM   CONNECV+1
        TFM   LOCAL          0=REMOTE (I.E. HOST), OTHER=LOCAL
        TMD   ="LOCAL "
        TDM   SYSFINQ
        TDM   GETINQ
        TDM   SLEEPQ
        TDM   XMTCHAQ
        TDM   RAWQ
        TDM   COOKEDQ
        TDM   CREATEQ
        TLO   CONNECC        REPORT CALL
        BLJ   REPORT
        TZM*  M.LRCNT        WE HAVE NOT YET SENT ANYTHING
        TOA   1              RETURN TRUE
        BUC*  RETURN         AND RETURN
        PORG  *
CONNECC DATA  '0302
        DAC   CONNECE-CONNECB
        DAC   CONNECB
CONNECB DATA  " CONNECT CALLED: "
CONNECV BLOK  3
CONNECE EQIV  *
        RORG  *
        ESKP
        TZA                  NO CONNECTION IS POSSIBLE
        BJL   1              RETURN--BRANCH OVER ARGUMENT
*
FIXNAME GAP   1              REMOVE ANY GIVEN QUALIFIER
        TJM   RETURN
        TIJ
        TNK   20
FIXNAML TMA   !0,J           GET NEXT CHARACTER
        BOZ   FIXNAMR        RETURN AT END-OF-STRING
        AOJ   1
        COB   "*"            IS THIS AN ASTERISK
        BOZ   FIXNAMC        YES--BRANCH
        BWK   FIXNAML        LOOP FOR A WHILE
FIXNAMR BUC*  RETURN         DO NOTHING--RETURN
FIXNAMC TNK   20             COPY FILE NAME DOWN
        TMA   !0,J
        TAM   !0,I
        AOI   1
        AOJ   1
        BWK   *-4
        BUC*  RETURN         AND RETURN
*
        END$
