DataMuseum.dk

Presents historical artifacts from the history of:

RegneCentralen RC3600/RC7000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RegneCentralen RC3600/RC7000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦21ebd10a5⟧ TextFile

    Length: 70144 (0x11200)
    Types: TextFile
    Notes: RCSL-43-GL-10024, RCSL-43-GL-11023, RCSL-43-GL-11025
    Names: »SXCOM«

Derivation

└─⟦a59f0a452⟧ Bits:30000472 DOMUS disk image
    └─ ⟦this⟧ »/SXCOM« 

TextFile


;					RCSL:	43-GL10024
;					AUTHOR: LL/MLM/JHA/KDH
;					DATE:	81.01.14













;		XMC23












;KEYWORDS: RC3600, DOMUS, PROCESSOR EXPANSION
;ABSTRACT: THIS PROGRAM MAKES IT POSSIBLE TO COMMUNICATE
;	   BETWEEN PROCESSES PLACED IN TWO DIFFERENT
;	   RC3600 PROCESSORS.

;ASCII SOURCE:		RCSL: 43-GL11023

;PARAMETER SOURCE:	RCSL: 43-GL11025
«ff»
; RC3600 PROCESSOR EXPANSION                          PAGE ..C1..
; CENTRAL ADMINISTRATION

; THIS PROGRAM SHOULD BE ASSEMBLED TOGETHER WITH A
; PARAMETER MODULE (RCSL: 43-GL11025) SPECIFYING THE
; PARAMETERS FOR THE ACTUAL CONFIGURATION.

.TITLE	XCM23

.NREL
.TXTM  1
.RDX   10

XCX0:   1B0+1     
        XCX1
        0
        XCX10-XCX0
.TXT    .XCOMX.

.NOMAC	1
.MACRO	TESTP
.IFN	TEST
	JSR	@.+1
	XTEST
.ENDC
%

«ff»
; RC3600 PROCESSOR EXPANSION			PAGE ..C1A..
; CENTRAL ADMINISTRATION

; DEFINITIONS

; EXTENSION TO MESSAGEBUFFER

BACT  =  -2          ; ACTIVATION ADDDRESS
BCHAIN=  -1          ; CHAIN TO TRANSM QUEUE
BBUF  =  -3          ; SAVED MESSBUF ADR FROM HEADER
BSEND =  -4          ; SAVED SENDER FROM HEADER
BSPEC =  -5          ; SPECIAL, 0 NO SPECIAL
                     ;          1B0 DATABUFFER IS USED
                     ;          1B1 ANSWER INPUT
                     ;          1B2 ANSWER LOOKUP ENTRY
                     ;          1B3 ANSWER SET RESERVATION
                     ;          1B4 ANSWER TTY
		     ;		1B5 ANSWER CAT CONTROL
		     ;		1B6 ANSWER CONVERSION
BDATA =  -6          ; SAVED DATABUFFER ADDRESS
B1DATA=  -7          ;   -    -, CAT NAME OR TTY PROC

; OPERATION BUFFER FOR DESCRIBING RECEIVED MESSAGE BUFFER

MOP   =  1
MNAME =  2
MBUF  =  0           ; ADDRESS OF RECIEVED MESSAGE BUFFER

; CONVERSION BUFFER DESCRIPTION
CCHAIN=  -2
CXSEND=  -3
CREC  =  -4

; HEADER FORMAT

HSTART=  -1           ; START CHARACTER
HDATA =  0            ; NO OF BYTES IN DATA BLOCK
HBUF  =  1            ; MESSAGE BUFFER ADDRESS
HMES0 =  2            ; MESS0
HMES1 =  3            ; MESS1
HMES2 =  4            ; MESS2
HMES3 =  5            ; MESS3
HSEND =  6            ; ADDRESS OF SENDER PROCESS DESCRIPTION
HNAME =  7            ; NAME OF RECEIVING PROCESS
HCATE =  10	      ; NAME OF ENTRY IF CAT OR SUBCAT PROCESS

MAXER =  50           ; MAX NO OF PERMITTED ERRORS
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..C1B..
; CENTRAL ADMINISTRATION


B0    = BCATNAME	; NO OF BUFFERS FOR CAT NAMES
BL0   = 3	
B1    = XCENT+2		; NO OF OPERATION BUFFERS
BL1   = 5
B3    = B0		; NO OF CAT ENTRIES BUFFERS
BL3   = 18
B4    = BTTYPROC	; NO OF TTY PROCESS DESCRIPTIONS
B40   = BTTYMES
BL4   = B40*11+23
.MESB = MESBS+2
.RESN = RESNO+1

.IFE	.PASS
.IFN	TEST
.MSG	VERSION WITH TESTOUTPUT
.ENDC

.IFE	TEST
.MSG	VERSION WITHOUT TESTOUTPUT
.ENDC
.ENDC


.RDX 10


.XREL			;

«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..C2..
; CENTRAL ADMINISTRATION          LL 15.2.76


; CENTRAL WAIT. WAIT HERE FOR AN EVENT: MESSAGE FROM A SENDER
; PROCESS, ANSWER FROM A RECEIVER PROCESS, ANSWER FROM FPA-
; DRIVER OR TIMER.

XCX1:
CWAIT:
      LDA    0   XDELAY    ;
      LDA    1   .0        ;
      LDA    2   XLASTEV   ;
      TESTP		   ; *** TESTPOINT ***
      WAIT                 ; WAIT(DELAY,LASTEV,BUF)
      JMP        CTIMER    ; TIMEOUT
      JMP        CWAIT     ; INTERRUPT
      JMP      @BACT,2     ; ANSWER: GOTO ACTIVATION ADDRESS

; MESSAGE FROM A SENDER PROCESS ARRIVED.

      JSR      @ CW107     ; TEST SPECIAL MESSAGE
      TESTP		   ; *** TESTPOINT ***
      LDA    3   CUR       ; GET CORRESPONDING ENTRY IN COMLIST
      LDA    0   -1,3      ;
      STA    0   XCOMCNT   ;
      LDA    3   -2,3      ; FOR I:=1 STEP 1 UNTIL COMNO DO
CW1:                       ; BEGIN
      LDA    0   +0,3      ;   IF ENTRY IS OCCUPIED
      MOV#   0,0 SNR       ;   AND
      JMP        CW01      ;
      LDA    0   +3,3      ;
      SUB#   2,0 SNR       ;   IF BUF = COMLIST(COMNO) THEN
      JMP        CW2       ;   GOTO FOUND
CW01:                      ;
      LDA    0   .4        ;
      ADD    0,3           ;
      DSZ        XCOMCNT   ;
      JMP        CW1       ; END
                           ; NOT FOUND:
      LDA    0   .1B6      ;
CW3:                       ;
      LDA    1   .0        ; SENDANSWER ( STATUS,0)
      SENDANSWER           ;
      JMP        CWAIT     ; GOTO CWAIT
CW2:                       ; FOUND:
      LDA    0   XCSTATE   ; IF STATE <> RUNNING THEN
      MOV#   0,0 SZR       ;
      JMP        CW4       ; BEGIN
      STA    0   +0,3      ;   CLEAR COMLIST
      LDA    0   .1B15     ;   STATUS:=NOT PROCESSED
      JMP        CW3       ;   GOTO RETURN ANSWER
CW4:                       ; END
      STA    3   CW100     ; SAVE ENTRY IN CONMLIST
      STA    2   XLASTEV   ; SAVE LAST EVENT
      LDA    0   CW101     ;
      JSR      @ CW106     ; CHAIN OPERATION TO TRANSMITTER
      LDA    0   CW100     ; OPERATION(2):=ADDR OF ENTRY IN COMLIST
      STA    0   MNAME,2   ;
      JMP        CW0       ; GOTO TEST
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..C3..
; CENTRAL ADMINISTRATION          LL 15.2.76


; ANSWER FROM A RECEIVER PROCESS ARRIVED.

ANS0:                      ; ACTIVATION ADDRESS:
      STA    2   XLASTEV   ; SAVE LAST EVENT
      LDA    0   CW102     ; ACT. ADR:=ANSWER
      JSR      @ CW105     ; CHAIN OPERATION TO TRANSM.
CW0:                       ; TEST:
      LDA    0   XTSTATE   ;
      MOVZR# 0,0 SNC       ; IF STATE.TRANSM=WAIT FOR FPA
      JMP        CWAIT     ; THEN GOTO WAIT

CEXAMINE:                  ; EXAMINE TRANSM QUEUE
      LDA    2   XTRCHAIN  ; IF TRANSM. CHAIN <> EMPTY THEN
      TESTP		   ; *** TESTPOINT ***
      MOV#   2,2 SZR       ;
      JMP      @ BACT,2    ; GOTO ACTIVAT FIRST OPERATION
      JMP        CWAIT     ; ELSE GOTO WAIT

; TIMER INTERRUPT  

CTIMER:                    ;
      LDA    0   XTSTATE   ;
      TESTP		   ; *** TESTPOINT ***
      MOV#   0,0 SNR       ; IF STATE=WAIT FOR FPA
      JMP        CWAIT     ; THEN GOTO WAIT
      MOVZL# 0,0 SNC       ; IF STATE = WAIT FOR QUEUE
      JMP        CEXAMINE  ; THEN GOTO EXAMINE
     JMP       @ .+1       ; TIMER ACTIVATION
                 CBREAK    ; (BREAKPROCESS)


XDELAY: 50
;XDELAY:  5                ; DELAY PERIOD IS 100 MS
XLASTEV:  0                ; LAST RECEIVED AND QUEUED EVENT
XCOMCNT:  0
X1GETBUF: GETBUF
XTRSEM:   .+1-BCHAIN       ; TRANSMITTER CHAIN
XTRCHAIN: 0                ;
XTSTATE:  1                ; STATE OF TRANSMITTER COROUTINE
                           ; 0 WAIT FOR FPA
                           ; 1 WAIT FOR OPERATION
                           ; 1B0 WAIT FOR TIMER
XCSTATE:  0                ; STATE XCOMX
                           ; 0 INIT
                           ; 1B0: BREAKED
                           ; 1 RUNNING
MESNO:    .MESB-1          ; NO OF MES BUFS FOR USER MESSAGES
CW100:    0
CW101:    RECMES
CW102:    RECANS
CW105:    TCHAIN
CW106:    GECHAIN
CW107:    XSPTEST
«ff»

; RC3600 PROCESSOR EXPANSION                    PAGE..T1..
; TRANSMITTER COROUTINE          LL 15.2.76


; ANSWER FROM A RECEIVER PROCESS, AC2=ADDRESS OF MESSAGE-
; BUFFER.

RECANS:                    ;
      TESTP		   ; *** TESTPOINT ***
      LDA    3   TX10      ;
      STA    2   TBUF      ; SAVE MESSAGE BUFFER ADDRESS
      LDA    0   .0        ; ANSWER:=TRUE
      STA    0   TXFUNC    ;
      STA    0   TXSPEC    ; SPECIAL:=TDBYTES:=0
      STA    0   TDBYTES   ;
      JSR      @ TX22      ; MOVE MESSAGE TO HEADER
      LDA    0   BDATA,2   ; TADR:=MESS2.BUF
      STA    0   TDADR     ;
      LDA    0   BBUF,2    ; HBUF.THEAD:=BBUF.BUF
      STA    0   HBUF,3    ;
      LDA    0   BSEND,2   ; HSEND.THEAD:= BSEND.BUF
      STA    0   HSEND,3   ;
      LDA    0   BSPEC,2   ; IF SPECIAL=0
     
      MOVZL  0,0           ;
      LDA    1   MESS1,2   ; IF ANSWER INPUT
      MOVZL  0,0 SZC       ;
      STA    1   TDBYTES   ; THEN TDBYTES:=MESS1.BUF

      MOVZL  0,0 SNC       ;; IF ANSWER LOOKUP ENTRY THEN
      JMP        TRAN2     ;; BEGIN
      LDA    1   TX11      ;;   TDBYTES:=2*16
      STA    1   TDBYTES   ;;
      LDA    1   .3        ;; SPECIAL:=ANSWER LOOKUP
      STA    1   TXSPEC    ;;
      LDA    1   TDADR     ;; TDADR:=TDADR<2
      MOVZL  1,1           ;;
      STA    1   TDADR     ;;
TRAN2:                     ;; END
      MOVZL  0,0 SNC       ; IF ANSWER SET RESERVATION
      JMP        TRAN3     ;
      LDA    0   .1B6      ; AND MESS0.BUF=ILLEGAL THEN
      LDA    1   MESS0,2   ;
      AND    0,1 SNR       ;
      JMP        TRHEAD    ; BEGIN
      LDA    0   BSEND,2   ; CLEAR RESERVATION IN RESLIST
      LDA    2   RECEI,2   ;
      NEG    2,2           ;
      JSR      @ TX12      ; CHECK RES(SENDER,RECEIVER)
      LDA    0   .0        ; CLEAR ENTRY
      STA    0   +0,3      ;
      JMP        TRHEAD    ; GOTO TRANSMIT HEADER
                           ; END

«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..T1A..
; TRANSMITTER COROUTINE               LL 15.2.76


; SPECIAL TTY TREATMENT

TRAN3:
      LDA    2   TBUF      ;; IF ANSWER TTY THEN
      LDA    2   B1DATA,2  ;;
      MOVZL  0,0 SNC       ;;
      JMP        TRAN4     ;; BEGIN
      ISZ        TTCOUNT,2 ;; TTCOUNT:=TTCOUNT+1
      LDA    0   TTCOUNT,2 ;; IF TTCOUNT < MAX COUNT
      LDA    1   TX290     ;;
      SUB#   0,1 SZR       ;;
      JMP        TRHEAD    ;; THEN GOTO TRANSMIT HEADER
      STOPPROCESS          ;;   STOPPROCESS(AUX TTY PROCESS)
      LDA    0   .0        ;;
      STA    0   TX24+1    ;;
      LDA    0   PROCE     ;;
      LDA    1   TX24      ;; REMOVE FROM PROCESS CHAIN
      RECHAIN              ;;
      JSR      @ TX20      ;; FREE BUFFER(PROCESS DESCRIPTION)
      JMP        TRHEAD    ;;   GOTO TRANSMIT HEADER
                           ;; END

; SPECIAL CAT TREATMENT

TRAN4:                     ;;
      MOVZL  0,0 SZC       ; IF ANSWER CAT CONTROL
      JSR      @ TX20      ;; THEN FREE BUF(NAME BUFFER)
«ff»

; RC3600 PROCESSOR EXPANSION                    PAGE..T2..
; TRANSMITTER COROUTINE          LL 15.2.76


TRHEAD:                    ; TRANSMIT HEADER:
      LDA    0   TDBYTES   ; HDATA.THEAD:=TDBYTES
      LDA    3   TX10      ;
      STA    0   HDATA,3   ;
      LDA    0   .0        ; SET STARTCHAR(HEADER,HMES)
      LDA    2   THMES     ;
      JSR      @ TX9       ;
      LDA    0 @ TX25      ; IF STATE = INIT
      LDA    1   TXFUNC    ;    AND FUNCTION = ANSWER
      ADD#   0,1 SNR       ; THEN GOTO PASS HEADER
      JMP        TRAN5     ;
TRHREP:                    ; REPEAT HEADER:
      LDA    1   THMES     ;
      LDA    2   TNAME     ;
      SENDMESSAGE          ; SEND MESSAGE(TRANSM HEADER, RECEIVE ST)
      LDA    0   TX13      ; SET ACTIVATION ADDRESS
      STA    0   BACT,2    ;
      LDA    0   .0        ; STATE:=WAIT FOR FPA
      STA    0 @ TX23      ;
      JMP      @ TX14      ; GOTO WAIT

«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..T2A..
; TRANSMITTER COROUTINE               LL 15.2.76





TBUF:    0		; SAVED MESSAGE BUFFER ADDRESS
TXFUNC:  0
TXSPEC:  0
TX9:     STCHAR
TX10:    THEAD
TX11:    32
TX12:    CHRES
TX13:    TRANHEAD
TX14:    CWAIT
TX15:    TRCHECK
TX16:    CEVLAST
TX17:    CEXAMINE
TX18:    TRANDATA
TX19:    MESNO
TX20:    FREBUF
TX21:    XTRCHAIN
TX22:    MOVMES
TX23:    XTSTATE
TX24:    .+1-CHAIN
         0
TX25:    XCSTATE
TX27:    CRELEAS
TX290:   BTTYMES+1

THMES:   .+1
         3
         26
         THEAD*2
         0
TDMES:   .+1
         3
TDBYTES: 0
TDADR:   0
         0
TNAME:   .TNAM
.NREL
.TNAM:
.TXT     .FPAX<0>.

.XREL

«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..T3..
; TRANSMITTER COROUTINE          LL 15.2.76


TRANHEAD:                  ; ANSWER HEADER SENDING:
      WAITANSWER           ; FREE MESSAGE BUFFER
      JSR      @ TX15      ;
      TESTP		   ; *** TESTPOINT ***
      MOVZL  0,0 SZC       ; IF STATUS = 1B0
      JMP        TRHREP    ; THEN GOTO RETRANSMIT
      MOVZL# 0,0 SZC       ; IF STATUS = 1B1(REJECT)
      JMP        TRCLEAR   ; THEN GOTO CLEAR
      MOVZR  0,0 SNR       ; IF STATUS > 0
      JMP        TRAN5     ; BEGIN
TRAN6:                     ; RETURN TO USER:
      LDA    3   TX10      ;
      LDA    2   HBUF,3    ;
      JSR      @ TX16      ;   ADJUST LASTEV
      LDA    1   .0        ;   NO OF BYTES:=0
      SENDANSWER           ;   SEND ANSWER(SENDER,STATUS,0)
      JMP        TRA10     ;   GOTO CLEAR MESSAGE
TRAN5:                     ; END
      LDA    0   TDBYTES   ; IF DBYTES = 0
      MOV#   0,0 SNR       ;
      JMP        TRCLEAR   ; THEN GOTO CLEAR

; TRANSMIT CORRESPONDING DATA BLOK

      LDA    0   .1B9      ; SET STARTCHAR(DATA,DMES)
      LDA    2   TDMES     ;
      JSR      @ TX9       ;
      LDA    0 @TX25       ; IF STATE = INIT
      LDA    1   TXFUNC    ;    AND FUNCTION = ANSWER
      ADD#   0,1 SNR       ; THEN GOTO CLEAR
      JMP        TRCLEAR
TDREP:                     ; REPEAT DATA:
      LDA    1   TDMES     ;
      LDA    2   TNAME     ;
      SENDMESSAGE          ;
      LDA    0   TX18      ; SET ACTIVATION ADDRESS
      STA    0   BACT,2    ;
      JMP      @ TX14      ; GOTO WAIT FOR FPA

«ff»

; RC3600 PROCESSOR EXPANSION                    PAGE..T4..
; TRANSMITTER COROUTINE


TRANDATA:
      WAITANSWER           ; FREE MESSAGE BUFFER
      JSR      @ TX15      ; CHECK TRANSPORT
      TESTP		   ; *** TESTPOINT ***
      MOVZL  0,0 SZC       ; IF STATUS = 1B0
      JMP        TDREP     ; THEN GOTO RETRANSMIT
      MOVZL# 0,0 SZC       ; IF STATUS = 1B1(REJECT)
      JMP        TRCLEAR   ; THEN GOTO CLEAR
      MOVZR  0,0 SZR       ; IF STATUS > 0
      JMP        TRAN6     ; THEN GOTO RETURN TO USER

TRCLEAR:                   ; CLEAR:
      LDA    0   TXFUNC    ; IF FUNCTION = ANSWER THWN
      MOV#   0,0 SZR       ;
      JMP        TRA10     ; BEGIN
      ISZ      @ TX19      ;   NO OF MESSBUFFERS:=NO OF BUFS+1
      LDA    2   TBUF      ;   ADJUST LASTEV
      JSR      @ TX16      ;
      LDA    0   BSPEC,2   ;
      LDA    3   .1B6      ;
      AND#   3,0 SNR       ; IF ANSWER CONVERSION THEN
      JMP        TRA13     ; BEGIN
      LDA    0   MESS0,2   ;      IF STATUS = 0
      MOV#   0,0 SNR       ;      THEN GOTO FREE MESBS
      JMP        TRA12     ;
      LDA    0   BSEND,2   ;
      LDA    1   RECEI,2   ;     RELEASE CONVBUF
      NEG    1,1           ;
      JSR      @ TX27      ;
      JMP        TRA12     ;     GOTO FREE MESBS
TRA13:                     ; END
      LDA    0   BSPEC,2   ;
      LDA    2   BDATA,2   ;
      LDA    1   .1B5      ;; IF NOT ANSWER CAT THEN
      AND#   0,1 SNR       ;;
      MOVZR  2,2           ;;  BUFADR:=BUFADR>1
      MOVZL# 0,0 SZC       ; IF BUFFER RESERVED
      JSR      @ TX20      ;   THEN FREEBUFFER
TRA12:                     ; FREE MESBS:
      LDA    2   TBUF      ;
      WAITANSWER           ;   FREE MESSAGE BUFFER
      JMP        TRA11     ; 
TRA10:                     ; END
      LDA    2   TX30      ; MESSAGE:
      LDA    0   .0        ; IF ENTRY EXIST THEN
      LDA    1   MNAME,2   ;
      MOV#   1,1 SZR       ;
      STA    0 @ MNAME,2   ; CLEAR ENTRY IN COMLIST
      LDA    0   .2        ;
      SUB    0,2           ; FREE OPERATION BUFFER
      JSR      @ TX38      ;
«ff»
;RC3600 PROCESSOR EXPANSION		PAGE..T4A..
; TRANSMITTER COROUTINE

TRA11:                     ; END
      LDA    3 @ TX21      ; RELEASE OPERATION FROM QUEUE
      LDA    0   BCHAIN,3  ;
      STA    0 @ TX21      ;
      LDA    0   .1        ;
      STA    0 @ TX23      ; STATE:= WAIT OPERATION
      LDA    0 @ TX25      ; IF CSTATE = BREAKED
      MOVZL# 0,0 SZC       ;
      JSR      @ TX52      ;
      JMP      @ TX17      ; GOTO EXAMINE QUEUE
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..T5..
; TRANSMITTER COROUTINE          LL 15.2.76


; MESSAGE RECEIVED FROM SENDER PROCESS.

RECMES: 
      TESTP		   ; *** TESTPOINT ***
      STA    2   TX30      ; SAVE ADDRESS OP OPERATION BUFFER
      LDA    2   0,2       ; BUF:=MESSAGE BUFFER
      LDA    0   .1B11     ; FUNCTION:=MESSAGE
      STA    0 @ TX31      ;
      LDA    1 @ TX25      ; IF STATE = INIT
      MOV#   1,1 SZR       ; THEN
      JMP        TRM4      ; BEGIN
      LDA    0   .1B15     ;   SENDANSWER(1B15,0)
      JSR      @ TX16      ;   ADJUST LASTEV
      JMP        TRCLEAR   ; GOTO CLEAR
TRM4:                      ; END
                           ; COMPUTE NO OF BYTES IN DATABLOCK
      LDA    1   .0        ; NO OF BYTES:=0
      LDA    0   MESS0,2   ;
      MOVZR  0,0 SNC       ; IF TRANSPUT THEN
      JMP        TRM0      ; BEGIN
      MOVZR  0,0 SZC       ;   IF OUTPUT THEN
      LDA    1   MESS1,2   ;   NO OF BYTES:=MESS1.BUF
      JMP        TRM1      ; END ELSE
TRM0:                      ; BEGIN
      MOVZR  0,0           ;
      MOVZR  0,0           ;
      LDA    3   MESS2,2   ;   IF CONVERSION BIT
      MOVZR  0,0 SZC       ;
      MOV#   3,3 SNR       ;   AND CONVERSION <> 0
      JMP        TRM1      ;   THEN
      LDA    1   TX51      ;   NO OF BYTES:=512
TRM1:                      ; END
      STA    1 @ TX32      ; DBYTES:=NO OF BYTES
      LDA    3   MESS2,2   ; DADR:=MESS2.BUF
      STA    3 @ TX33      ;
                           ; BUILD HEADER
      LDA    3   TX34      ;
      STA    2  HBUF,3     ; HBUF.THEAD:=BUF
      LDA    0   SENDER,2  ;
      STA    0   HSEND,3   ; HSEND.THEAD:=SENDER.BUF
      JSR      @ TX35      ; MOVE MESSAGE TO HEADER
      LDA    2   TX30      ; MOVE NAME TO HEADER
      LDA    2   MNAME,2   ;
      JSR      @ TX36      ;
      LDA    0   .0        ; SPECIAL:=0
      STA    0 @ TX37      ;

«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..T6..
; TRANSMITTER COROUTINE

; SPECIAL TREATMENT OF MESSAGES TO TTY , CAT AND SUBCAT PROCESSES

      LDA    0   HNAME+2,3 ;;
      LDA    2   .255      ;;
      AND    2,0	   ;; BYTE:=HNAME(6).THEAD;
      LDA    2   .16	   ;;
      ADCZ#  0,2 SNC	   ;; IF BYTE >= 16 THEN !SUBCAT PROCESS!
      JMP        SPCAT	   ;; GOTO CAT-SPECIAL
      LDA    0   TXSPNO    ;; FOR I:=1 STEP 1 UNTIL TXSPNO DO
      STA    0   TXSPCNT   ;;
      LDA    2   TXSPD     ;;
TRM2:                      ;; BEGIN
      LDA    0   HNAME,3   ;;
      LDA    1   +0,2      ;; IF NAME.THEAD
      SUB#   0,1 SZR       ;;      = NAME.SPECIALLIST
      JMP        TRM3      ;;
      LDA    0   HNAME+1,3 ;;
      LDA    1   +1,2      ;;
      SUB#   0,1 SZR       ;;
      JMP        TRM3      ;;
      LDA    0   HNAME+2,3 ;;
      LDA    1   +2,2      ;;
      SUB#   0,1 SNR       ;;
      JMP      @ +3,2      ;; THEN GOTO ACTIVATION ADDRESS
TRM3:                      ;; END
      LDA    0   .4        ;;
      ADD    0,2           ;;
      DSZ        TXSPCNT   ;;
      JMP        TRM2      ;; END
                           ;; NOT FOUND:
      JMP      @ TX39      ; GOTO TRANSMIT HEADER

; TRANSMIT MASTER CLEAR

TMCL:                      ;
      STA    2   TX30      ; SAVE BUF ADDR
      JSR      @ TX49      ; SEND RESET MESSAGE
      LDA    0   TX43      ; STARTCHAR:=MASTER CLEAR
      JMP        TA0       ;

; TRANSMIT ANSWER MASTER CLEAR

TAMCL:                     ;
      STA    2   TX30      ; SAVE BUF ADDR
      LDA    0   .0        ; BLOCKNO:=0
      STA    0 @ TX48      ;
      LDA    0   .1        ; STATE := RUNNING
      STA    0 @ TX47      ;
      LDA    0   .15       ; STARTCHAR:=ANSWER MASTER CLEAR
TA0:                       ;
      STA    0 @ TX46      ; SET START CHARACTER
      LDA    0   .0        ; TDBYTES:=0
      STA    0 @ TX32      ;
      LDA    0   .1B11     ; FUNCTION:=MESSAGE
      STA    0 @ TX31      ;
      JMP      @ TX45      ; GOTO TRHREP
«ff»
; RC3600 PROCESSOR EXPANSION                   PAGE..T6A..
; TRANSMITTER COROUTINE               LL 15.2.76


TX30:	0		; SAVED ADDR OF OPERATION BUFFER
TX31:   TXFUNC
TX32:   TDBYTES
TX33:   TDADR
TX34:   THEAD
TX35:   MOVMES
TX36:   MOVNAME
TX36A:	MOVENTRY
TX37:   TXSPECIAL
TX38:   FREBUF
TX39:   TRHEAD
TX40:   1B7	; INITCAT
TX41:   32
TX43:   1B11+15
TX45:   TRHRET
TX46:   THMES+4
TX47:   XCSTATE
TX48:   SBLNO
TX49:   TRESET
TX50:   NAME
TX51:   512
TX52:   XSTOP
TX53:   -13


; LIST OF SPECIAL DEVICES

TXSPCNT: 0
TXSPNO:  2
TXSPD:   .+1
.TXT     .TTY<0><0>.
         SPTTY
TXR:
.TXT     .CAT<0><0>.
         SPCAT

«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..T7..
; TRANSMITTER COROUTINE          LL 15.2.76

; SPECIAL TTY TREATMENT

SPTTY:                     ;
      LDA    0   .1        ;; SPECIAL:=1
      STA    0 @ TX37      ;;
      LDA    1   TX53      ;; IF CONTROLE MESSAGE THEN
      LDA    0   HMES0,3   ;; BEGIN
      MOVZR# 0,0 SZC       ;;
      JMP        SPTT1     ;;
      AND    1,0           ;;   CLEAR RESERVATION
      STA    0   HMES0,3   ;;      AND CONVERSION;
      SUB    0,0	   ;;   DBYTES:=0;
      STA    0 @ TX32	   ;; END;
SPTT1:LDA    2 @ TX30      ;;
      LDA    2   SENDER,2  ;; GET NAME OF SENDER PROCESS
      LDA    0   TX50      ;;
      ADD    0,2           ;;
      JSR      @ TX36      ;; MOVE NAME TO HNAME.THEAD
      JMP      @ TX39      ;; GOTO TRANSMIT HEADER

;; SPECEAL CAT AND SUBCAT TREATMENT

SPCAT:                     ;;
      LDA    0   HMES0,3   ;; IF MESS0 = 0
      MOV    0,0 SZR
      MOVZR# 0,0 SZC       ;; OR TRANSPUT MESSAGE
      JMP      @ TX39      ;; THEN GOTO TRANSMIT HEADER
      LDA    1   .255      ;;
      AND    0,1 SZR       ;; IF MESS0(8:15) <> 0 THEN
      JMP@       TX39      ;; GOTO TRANSMIT HEADER;
      LDA    1   .0        ;; NO OF BYTES:=0
      STA    1   HDATA,3   ;;
      STA    1 @ TX32      ;;
      LDA    1   TX40      ;; IF INIT CAT
      SUB#   0,1 SNR       ;;
      JMP      @ TX39      ;; THEN GOTO TRANSMIT HEADER
      LDA    0   .2        ;; SPECIAL:=2
      STA    0 @ TX37      ;;
      LDA    2   HMES1,3   ;; MOVE ENTRY TO HCATE.THEAD
      JSR      @ TX36A     ;;
      LDA    3   TX34      ;;
      LDA    0   HMES0,3   ;; IF NOT CHANGE ENTRY OR SET ENTRY
      LDA    1   SP0       ;;
      AND#   0,1 SNR       ;;
      JMP      @ TX39      ;; THEN GOTO TRANSMIT HEADER
      LDA    1   TX41      ;; NO OF BYTES:=32
      STA    1   HDATA,3   ;;
      STA    1 @ TX32      ;; DBYTES:=32
      LDA    1   HMES2,3   ;;
      MOVZL  1,1           ;; DADR:=MESS2.BUF SHIFT 1 (BYTE ADDR)
      STA    1 @ TX33      ;;
      JMP      @ TX39      ;; GOTO TRANSMIT HEADER

SP0:   1B0+1B3             ;; SET ENTRY+CHANGE ENTRY
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..R1..
; RECEIVER COROUTINE               LL 15.2.76


; ENTRY FROM INITIALIZE

RINIT:
      LDA    0   .9        ; OPERATION:=RECEIVE ONLY
      LDA    1   .0        ; STATUS:=0
      STA    1 @ RX00      ;

; RECEIVE HEADER. AC0= OPERATION

RHRECEIVE:                 ;
      LDA    2   RX01      ;
      STA    0   0,2       ; RMES0:=OPERATION
      LDA    0 @ RX00      ; RMES3:=STATUS
      STA    0   3,2       ;
      TESTP		   ; *** TESTPOINT ***
      LDA    1   RX01      ; SENDMESSAGE(RECEIVER,OPERATION
      LDA    2   RX02      ;             SEND STATUS, READ HEADER)
      SENDMESSAGE          ;
      LDA    0   RX08      ; SET ACTIVATION ADDRESS
      STA    0   BACT,2    ;
      JMP      @ RX09      ; GOTO CENTRAL WAIT

RX00:  RSTATUS
RX01:  RHMES+1
RX02:  .RNAM
RX04:  RDADR
RX05:  RDBYTES
RX06:  XCSTATE
RX07:  XSTOP
RX08:  RANSHEAD
RX09:  CW0
RX010: RBSPEC
RX011: RBLCONT
RX012: RHEAD


RANSHEAD:                  ; HEADER RECEIVED:
      LDA    3   RX012     ; HSTART.RHEAD:=MESS3.BUF
      LDA    1   MESS3,2   ;
      STA    1   HSTART,3  ;
      WAITANSWER           ; FREE MESSAGE BUFFER
      LDA    1 @ RX06      ;
      MOVZL# 1,1 SZC       ; IF CSTATE = BREAKED
      JSR      @ RX07      ; THEN STOP
      JSR      @ RX2       ; CHECK TRANSPORT
      LDA    2   RX8       ; ***
      TESTP		   ; *** TESTPOINT ***
      MOV#   0,0 SZR       ; IF STATUS <> 0
      JMP        RHRECEIVE ; THEN GOTO RECEIVE(OPERATION)


«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..R1A..
; RECEIVER COROUTINE               LL 15.2.76


; GET CORRESPONDING DATABLOCK

      LDA    0   .0        ; 
      STA    0 @ RX010     ; RBSPEC:=0
      STA    0 @ RX011     ; BLCONTR:=0
      LDA    3   RX8       ; SAVE MESS2.RHEAD
      LDA    0   HMES2,3   ;
      STA    0 @ RX04      ; DADR:=HMES2.RGEAD
      LDA    0   HDATA,3   ; IF NO OF DATABYTES <> 0 THEN
      STA    0 @ RX05      ; DBYTES:=HDATA.RHEAD
      LDA    1   HSTART,3  ;   IF MESSAGE THEN
      LDA    2   .1B11     ;
      AND#   1,2 SNR       ;
      JMP        RAN0      ;   BEGIN
      DSZ      @ RX18      ; DECREASE NO F MESBUFS
      JMP        .+2       ; IF NO OF MESBUFS =0
      JMP        ERR2      ; THEN GOTO ERROR 2
      LDA    0   HSTART,3  ;
      LDA    1   .13       ; IF SPECIAL = 0 OR SPECIAL=2 !CAT! THEN
      AND#   0,1 SZR       ;
      JMP        RAN3      ; BEGIN
      LDA    1   PROCESS   ;   SEARCHITEM(PROCESS,
      LDA    2   RX9       ;        RECEIVER NAME)
      ADD    3,2           ;
      SEARCHITEM           ;
      MOV#   2,2 SNR       ; IF PROCESS NOT EXIST
      JMP        ERR3      ;   THEN GOTO ERROR 3
      STA    2   RX25      ;
RAN3:                      ; END
      LDA    3   RX8       ;
      LDA    0   HMES0,3   ; IF CONTROL, CONVERSION
      LDA    1   .1B12     ;
      AND#   0,1 SZR       ;
      MOVZR# 0,0 SZC       ;
      JMP        RAN4      ;
      LDA    0   HSEND,3   ;
      LDA    1   RX25      ; RELEASE CONVERSION(SENDER,RECEIVER)
      JSR      @ RX26      ;
RAN4:                      ;
      LDA    0   RDBYTES   ;
      MOV#   0,0 SNR       ; IF NO OF BYTES = 0
      JMP        RAN20     ; THEN GOTO AFTER DATA
      LDA    3   RX8	   ;
      LDA    1   HSTART,3  ; IF SPECIAL = CAT SPECIAL
      LDA    2   .1B14     ;
      AND#   1,2 SZR       ;
      LDA    0   RX27      ; THEN BUF:=CAT ENTRY BUF
      JSR      @ RX5       ;
      MOV#   3,3 SNR       ;      IF NO BUFFER
      JMP        ERR2      ;      THEN GOTO ERROR BLOCKCONTROL2
      STA    3   RDADR     ;      RDADR:=GETBUF(RDBYTES)
      LDA    0   .1B0      ;      RBSPEC:=DATA RESERVED
      STA    0   RBSPEC    ;
      JMP        RAN1      ;      GOTO GET DATA
RAN0:                      ;     END
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..R2..
; RECEIVER COROUTINE               LL 15.2.76


                           ; ANSWER:
      LDA    2   HBUF,3    ; CHECK IF MESSAGE BUFFER IS
      LDA    0   HSEND,3   ; DESTROYED:
      LDA    1   SENDER,2  ; IF HSEND.RHEAD<>SENDER.BUF
      SUB#   0,1 SZR       ;
      JMP        ERR5      ; GOTO ERROR5 (REJECT)
      LDA    0   MESS2,2   ; 
      LDA    1   HSTART,3  ;
      LDA    2   .15       ; DADR:=
      AND    2,1 SZR       ;; IF SPECIAL = 0
      MOVZL  0,0           ;; THEN MESS2.BUF
      STA    0   RDADR     ;; ELSE MES2.BUF < 1
RAN1:                      ; GET DATA
      LDA    0   RDBYTES   ; MESS1.RDMES:=DBYTES
      MOV#   0,0 SNR       ; IF RDBYTES=0
      JMP        RAN20     ; THEN GOTO AFTER DATA
      LDA    0   RBLIDENT  ;
      STA    0   RSTATUS   ;
      LDA    0   .1        ;
RAN2:                      ; SET OPERATION
      STA    0   RDMES+1   ;
      LDA    0   RSTATUS   ; MESS3.RDMES:=STATUS
      STA    0   RDMES+4   ;
      LDA    1   RDMES     ; SENDMESSAGE(RECEIVER, OPERATION,
      LDA    2   RNAME     ;             DBYTES,DADR,STATUS)
      SENDMESSAGE          ;
      LDA    0   RX7       ; SET ACTIVATION ADDRESS
      STA    0   BACT,2    ;
      JMP      @ RX09      ; GOTO CENTRAL WAIT
RANSDATA:                  ;
      WAITANSWER           ; RELEASE MESSAGE BUFFER
      JSR      @ RX2       ; CHECK TRANSPORT
      TESTP		   ; *** TESTPOINT ***
      MOV#   0,0 SZR       ; IF STATUS <> 0 THEN
      JMP        RAN2      ; GOTO SET OPERATION
RAN20:                     ;
      LDA    3   RX8       ; IF ANSWER RECEIVED
      LDA    0   HSTART,3  ;
      LDA    1   .1B11     ;
      AND#   0,1 SNR       ;
      JMP      @ RX22      ; THEN GOTO DELIVER ANSWER TO SEND
                           ; MESSAGE RECEIVED*
      LDA    0   HSTART,3  ; 
      LDA    1   .15       ;
      AND#   0,1 SZR       ; IF SPECIAL.HSTART.RHEAD <> 0
      JMP        RAN22     ; THEN GOTO AFTER CHECKRES
      LDA    0   HSEND,3   ;
      LDA    2   RX25      ;
      JSR      @ RX10      ;
      STA    0   RX13      ;
      MOVZL  0,0           ; IF RESERVED BY ANOTHER COM PROCESS
      MOVZL  0,0 SZC       ;
      JMP        ERR1      ; THEN GOTO ERROR BLOCK CONTROL 1
      STA    2   RX14      ; SAVE RECEIVER ADDRESS
      STA    3   RX15      ; SAVE ENTRY IN RESLIST
      JMP        RAN22     ;
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..R3..
; RECEIVER COROUTINE               LL 15.2.76


ERR5:                      ; REJECT
      ISZ        RBLCONTR  ; BLOCKCONTROL:=5
ERR4:
      ISZ        RBLCONTR  ;           OR  4  
ERR3:
      ISZ        RBLCONTR  ;           OR  3
ERR2:      
      ISZ        RBLCONTR  ;           OR 2
ERR1:
      ISZ        RBLCONTR  ;           OR  1
      LDA    3   RX8       ; CHECK IF BUFFER IS USED:
      LDA    0   RBSPEC    ;
      LDA    2   RDADR     ; IF DATA BUFFER RESERVED
      MOVZR  2,2           ;
      MOVZL  0,0 SZC       ;
      JSR      @ RX17      ; THEN FREEBUF(RDADR>2)
      ISZ      @ RX18      ; INCREASE NO OF MESS BUFS
      LDA    0   RBLCONTR  ; HSTATUS:=
      LDA    1   RBLIDENT
      ADD    0,1           ;    + RBLTYPE
      STA    1   RSTATUS   ;
      LDA    0   .1        ; OPERATION:=SEND STATUS, RECEIVE HEADER
      JMP      @ RX0       ;

«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..R4..
; RECEIVER COROUTINE


RX8:   RHEAD
RX2:   RCHECK
RX0:   RHRECEIVE
RX1:   CW0
RX3:   0
RX5:   GETBUF
RX7:   RANSDATA
RX9:   HNAME
RX10:  CHRES
RX11:  RAN04
RX13:  0
RX14:  0
RX15:  0
RX17:  FREBUF
RX18:  MESNO
RX19:  RHEAD+HMES0
RX20:  RHEAD+HNAME
RX21:  ANS0
RX22:  RANSWER
RX23:  1B0+1B1
RX25:  0		; SAVED ADDR OF RECEIVER PROCESS
RX26:  CRELEASE
RX27:  -2



RBLIDEN:  0
RSTATUS:  0
RBLCONTR: 0
RBSPEC:   0
XCONCH:   0

RNAME:	.RNAM
.NREL
.RNAM:
.TXT	.FPAR<0>.

.XREL

RHMES:  .+1
       0
       26
       RHEAD*2
       0

RDMES: .+1
       0
RDBYT: 0
RDADR: 0
       0

«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..R5..
; RECEIVER COROUTINE               LL 15 2 76


RAN22:
      LDA    3   RX8       ;
      LDA    0   HMES0,3   ;
      MOVZR  0,0 SNC       ; IF TRANSPUT
      JMP        RAN00     ;
      MOVZR  0,0 SZC       ; AND INPUT THEN
      JMP        RAN03     ; BEGIN
      LDA    0   HMES1,3   ;   GETBUF(HMES1)
      JSR      @ RX5       ;
      MOV#   3,3 SNR       ;   IF NO BUFFER
      JMP        ERR2      ;   THEN GOTO ERROR BLOCKCONTROL 2
      STA    3   RDADR     ;   RDADR:=BUFFER
      LDA    0   RX23      ;   RBSPEC:=1B0+1B1
      STA    0   RBSPEC    ;
      JMP        RAN03     ;   GOTO BUILD MESSAGE
RAN00:                     ; END
      MOVZR  0,0           ; IF CONTROL,RESERVATION THEN
      MOVZR 0,0 SNC        ;
      JMP        RAN02     ; BEGIN
      LDA    3   RX8       ;
      LDA    0   HMES1,3   ;
      LDA    1   RX13      ;
      LDA    3   RX15      ;   IF RELEASE RESERVATION
      MOV#   0,0 SZR       ;
      JMP        RAN01     ;
      MOV#   1,1 SZR       ;   AND IN RESLIST THEN
      STA    0   +0,3      ;   RELEASE RESERVATION
      JMP        RAN02     ;
RAN01:                     ; IF   IF SET RESERVATION
      MOV#   1,1 SZR       ;   AND NOT IN RESLIST THEN
      JMP        RAN02     ;   BEGIN
      MOV#   3,3 SNR       ;      IF NO EMPTY SPACE
      JMP        ERR2      ;      THEN GOTO ERROR BLCONTR2
      LDA    2   RX8       ;
      LDA    0   HSEND,2   ;      SENDER.RESLIST:=HSEND.RHEAD
      STA    0   +1,3      ;
      LDA    0   RX14      ;      RECEIVER.RESLIST:=
      STA    0   +0,3      ;           RECEIVER ADDRESS
      LDA    0   .1B3      ;      RBSPEC:= 1B2
      LDA    1   RBSPEC    ;
      ADD    1,0           ;
      STA    0   RBSPEC    ; END END
«ff»
; RC3600 PROCESSOR EXPANSION		PAGE..R5A..
; RECEIVER COROUTINE

RAN02:                     ;
      LDA    3   RX8       ;
      LDA    0   HSTART,3  ;
      LDA    1   .1B14     ; IF SPECIAL = CAT 
      AND    0,1 SZR       ;
      JMP        RAN03     ; THEN GOTO BUILD MESSAGE
      LDA    2   HMES2,3   ;
      LDA    0   HMES0,3   ;
      LDA    1   .1B12     ; IF CONTROL AND NOT CONVERSION
      AND#   0,1 SNR       ;
      STA    2   RDADR     ; THEN RDADR:=HMES2.RHEAD
      AND#   0,1 SNR       ; IF CONVERSION
      JMP        RAN03     ;
      LDA    0   RDBYTES   ; AND RDBYTES <> 0
      MOV#   0,0 SNR       ;
      JMP        RAN03     ;
      LDA    2   RDADR     ;
      MOVZR  2,2           ;
      LDA    0   XCONCH    ; THEN CHAIN CONVBUFFER IN
      STA    0   CCHAIN,2  ; FRONT OF CONVERSION CHAIN
      STA    2   XCONCHAIN ;
      LDA    0   HSEND,3   ; CXSEND.CONVBUF:=HSEND.RHEAD
      STA    0   CXSEND,2  ;
      LDA    0   RX25      ; CRECEI.CONVBUF:=RECEIVER
      STA    0   CREC,2    ;
      LDA    0   RBSPEC    ; RBSPEC:=RBSPEC+1B6
      LDA    1   .1B6      ;
      ADD    0,1           ;
      STA    1   RBSPEC    ;


«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..R6..
; RECEIVER COROUTINE               LL 15.2.76


RAN03:                     ; BUILD MESSAGE:
      LDA    3   RX8       ;
      LDA    1   RDADR     ; HMESS2.RHEAD:=RDADR
      STA    1   HMES2,3   ;
      JMP        RAN06     ; GOTO TEST SPECIAL
RAN04:                     ;
      LDA    2   RX20      ; DELIVER MESSAGE:
      LDA    1   RX19      ; SEND MESSAGE(HNAME.RHEAD,
      SENDMESSAGE          ;              HMES0.RHEAD)
      LDA    3   RX8       ;
      LDA    0   HSEND,3   ; BSEND.BUF:=HSEND.RHEAD
      STA    0   BSEND,2   ;
      LDA    0   RBSPEC    ; BSPEC.BUF:=RBSPEC
      STA    0   BSPEC,2   ;
      LDA    0   HBUF,3    ; BBUF.BUF:=HBUF.RHEAD
      STA    0   BBUF,2    ;
      LDA    0   RX21      ; SET ACTIVATION ADDRESS
      STA    0   BACT,2    ;
      LDA    0   RBLIDENT  ; HSTATUS:=RBLTYPE
      STA    0   RSTATUS
      LDA    0   HMES2,3   ; SAVE DATAAREA
      STA    0   BDATA,2   ;
      LDA    0   RA4       ;
      STA    0   B1DATA,2  ; SAVE CAT OR TTY EXTRA BUFFER
      LDA    0   .1        ;
      JMP      @ .+1       ; GOTO RECEIVE(OPERATION)
RA0:  RHRECEIVE
RA2:  1B0+1B2
RA3:  CEVLAST
RA4:  0
RA5:  RHEAD
SP1:  1B0+1B3		   ; SETENTRY + CHANGEENTRY

; ANSWER RECEIVED

RANSWER:
      LDA    2   HBUF,3    ;
      JSR      @ RA3       ; ADJUST LASTEV
      LDA    3   RA5       ;
      LDA    0   HMES2,3   ; MOVE ANSWER FORM HEADER
      STA    0   MESS2,2   ;
      LDA    0   HMES3,3   ; TO MESSAGE BUFFER
      STA    0   MESS3,2   ;
      LDA    0   HMES0,3   ; SEND ANSWER(HMES0.HEADER,
      LDA    1   HMES1,3   ;             HMES1.HEADER)
      SENDANSWER           ;
      LDA    0   RBLIDENT  ; RSTATUS:=RBLTYPE
      STA    0   RSTATUS   ;
      LDA    0   .1        ;
      JMP      @ RA0       ; GOTO RECEIVE(OPERATION)

«ff»
; RECEIVER COROUTINE               LL 15.2.76


RAN06:                     ; DELIVER MESSAGE:
      LDA    0   HSTART,3  ;
      LDA    1   .1B14     ;; IF SPECIAL=CAT THEN
      AND#   0,1 SNR       ;;
      JMP        RAN07     ;; BEGIN
      LDA    3   RX32      ;;
      LDA    0   HMES0,3   ;;
      LDA    1   SP1       ;;   IF CHANGE ENTRY OR SET ENTRY THEN
      LDA    2   HMES2,3   ;;
      AND#   0,1 SZR       ;;
      MOVZR  2,2           ;;   HMES2.RHEAD:=HMES2.RHEAD SHIFT RIGHT 1
      STA    2   HMES2,3   ;;
      LDA    1   .1B2      ;;   IF LOOKUP ENTRY THEN
      AND#   1,0 SNR       ;;
      JMP        RAN09     ;;   BEGIN
      LDA    0   RX33      ;;
      JSR      @ RX31      ;;      GETBUFFER(CAT-ENTRY)
      MOVZR  3,2 SNR       ;;      IF NO BUFFER
      JMP      @ RX38      ;;      THEN GOTO ERR BLOKCONTR 2
      STA    3 @ RX36      ;;      RDADR:=BUFFER
      LDA    3   RX32      ;;
      STA    2   HMES2,3   ;;      HMES2.RHEAD:=BUFFER SHIFT RIGHT 1
      LDA    0   RA2       ;;      RBSPEC:=1B0+1B2
      STA    0 @ RX35      ;;
RAN09:                     ;; ENDD
      LDA    0   RX40      ;;   GET BUFFER(CAT NAME)
      JSR      @ RX31      ;;
      MOVZR  3,2 SNR       ;;   IF NO BUFFER
      JMP      @ RX38      ;;   THEN GOTO ERROR2
      LDA    3   RX32      ;;
      STA    2   RA4       ;;   SAVE ADDR
      LDA    0 @ RX35      ;;   BSPEC:=BSPEC+1B5
      LDA    1   .1B5      ;;
      ADD    0,1           ;;
      STA    1 @ RX35      ;;
      LDA    0   HCATE,3   ;;   MOVE ENTRY NAME TO BUFFER
      STA    0   +0,2      ;;
      LDA    0   HCATE+1,3 ;;
      STA    0   +1,2      ;;
      LDA    0   HCATE+2,3 ;;
      STA    0   +2,2      ;;
      STA    2   HMES1,3   ;;   HMES1.RHEAD:=BUFFER>1
      JMP        RAN04     ;;      GOTO DEL MES
RAN07:                     ;; END

«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..R8..
; RECEIVER COROUTINE               LL 15.2.76


      LDA    1   .1B15     ; IF SPECIAL=TTY THEN
      AND#   0,1 SNR       ;;
      JMP      @ RX37      ;; BEGIN
      LDA    1   PROCE     ;; CHECK IF PSEUDOSENDER EXIST:
      LDA    2   RX39      ;;
      SEARCHITEM           ;; SEARCH(PROCESS,HNAME.RHEAD)
      MOV#   2,2 SNR       ;; IF PROCESS EXIST THEN 
      JMP        RA075	   ;;
      LDA    0   PROG,2	   ;;    IF PROG.PROCESS <>
      LDA    1   PPTTY	   ;;		PSEUDOPROG THEN
      SUB#   0,1 SZR	   ;;
      JMP@       RX43	   ;;	 GOTO ERROR 1 ELSE
      JMP        RAN08	   ;;	 GOTO INCREASE MESCOUNT;
RA075:LDA    0   .M3       ;;   GETBUFFER(PROCESS DESCRIPTION)
      JSR      @ RX31      ;;
      MOVZR  3,2 SNR       ;;   IF NO BUFFER
      JMP      @ RX38      ;;   THEN GOTO ERR BLOKCONTR 2
      LDA    3   RX32      ;;
      STA    2   RA4       ;;   SAVE BUFFER>1
      LDA    0   HNAME,3   ;;   MOVE NAME FROM HEADER
      STA    0   NAME,2    ;;   TO PROCESS DESCRIPTION
      LDA    0   HNAME+1,3 ;;
      STA    0   NAME+1,2  ;;
      LDA    0   HNAME+2,3 ;;
      STA    0   NAME+2,2  ;;
      LDA    0   .0        ;;   CHAIN.PROCDESCR:=0
      STA    0   CHAIN,2   ;;
      STA    2   RX34+1    ;;
      LDA    0   RX34      ;; SET PROCESS DEWCR IN
      LDA    1   PROCE     ;;   PROCESS CHAIN
      RECHAIN              ;;
      STARTPROCESS         ;;   AND RUNNING QUEUE
      LDA    0   RX42      ;;   MESCOUNT:=MAX MESCOUNT
      STA    0   TTCOUNT,2 ;;
RAN08:                     ;;   INCREASE MESCOUNT:
      STA    2   RA4       ;;   SAVE PROCESS ADDR
      LDA    0 @ RX35      ;;   BSPEC:= BSPEC + 1B4;
      LDA    1   .1B4      ;;
      ADD    0,1           ;;
      STA    1 @ RX35      ;;
      DSZ        TTCOUNT,2 ;;   MESCOUNT:=MESCOUNT-1
      JMP      @ RX37      ;;   GOTO DEL MES
      ISZ        TTCOUNT,2 ;;   IF MESCOUNT=0 THEN
      JMP      @ RX38      ;;   GOTO ERROR2
                           ;; END

«ff»
; RC3600 PROCESSOR EXPANSION		PAGE..R8A..
; RECEIVER COROUTINE

TTCOUNT=SAVE+1
PPTTY: XTY0		   ;; PSEUDO-PROCESS PROGRAM ADDR
RX31:  GETBUF
RX32:  RHEAD
RX33:  -2
RX34:  .+1-CHAIN
       0
RX35:  RBSPEC
RX36:  RDADR
RX37:  RAN04
RX38:  ERR2
RX39:  HNAME+RHEAD
RX40:  -1
RX42:  BTTYMES+1
RX43:  ERR1
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..I1..
; INITIALIZATION                  LL 15.2.76


CBREAK:
      LDA    2   CUR	   ;
      SUB    0,0	   ;
      STA    0   COMLI     ; REMOVE PROCESS ADDRESS FROM PAGE ZERO;
      CLEANPROCESS	   ; IMPLIES BREAK OF PSEUDOPROCESSES;
      STOPPROCESS
      JMP        .-1       ; STOP COM
COMSTART:
COMINIT:                   ;
CREP0:                     ;
      LDA    1   CI5       ; RESERVE TRANSMITTER
      LDA    2   CI4       ; AND SET TIMER
      SENDMESSAGE      
      WAITANSWER           ;
      MOV#   0,0 SZR       ;
      JMP       CREP0      ;
CREP1:                     ;
      LDA    1   CI7       ; RESERVE RECEIVER
      LDA    2   CI6       ; AND SET TIMER
      SENDMESSAGE          ;
      WAITANSWER           ;
      MOV#   0,0 SZR       ;
      JMP        CREP1     ;


      LDA    0   .0        ; STATE := INIT
      STA    0 @ CI9       ;
                           ; SET TRANSMITTER OPERATION
      LDA    0   CI10      ; SEND MASTER CLEAR
      LDA    2   .0        ;
      JSR      @ CI11      ;
      JMP      @ .+1       ; GOTO RECEIVER WAIT
      RINIT
«ff»
; RC3600 PROCESSOR EXPANSION		PAGE..I1A..
; INITIALIZATION      JHA 80.07.25


CI4:	.TNAM
CI5:	.CI5
CI6:	.RNAM
CI7:	.CI7

.IFN	TEST
.NREL
.CI5:	1B12+1B13	; OPEN  MESSAGE
	1		;   TO TRANSMITTER
	.+1*2		;
	6		;
	TTEST		;
	ATTES		;
	TTEST		;

.CI7:	1B12+1B13	; OPEN  MESAGE
	1		;   TO RECEIVER
	.+1*2		;
	250		;
	RTEST		;
	ARTES		;
	RTEST		;
.XREL
.ENDC

.IFE	TEST
.NREL
.CI5:	1B12+1B13	; OPEN  MESSAGE
	1		;   TO TRANSMITTER
	.+1*2		;
	6		;
	0		;
	0		;
	0		;

.CI7:	1B12+1B13	; OPEN  MESSAGE
	1		;   TO RECEIVER
	.+1*2		;
	250		;
	0		;
	0		;
	0		;
.XREL
.ENDC

CI8:    GETBUF
CI9:    XCSTATE
CI10:   TMCL
CI11:   GECHAIN
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..P1..
; PROCEDURES                    LL 15.2.76


; PROCEDURE TO STOP TRANSMITTER AND RECEIVER COROUTINE. IT
; AT FIRST STOP WHEN STOPCOUNT IS 0

XSTOP:                       ;
      DSZ        XSTCNT      ; STOPCOUNT:=STOPCOUNT-1
      JMP      @ XC0         ;
      LDA    1   XC1         ;
      LDA    2   CI4         ; RELEASE RESERVATIONS
      SENDMESSAGE            ;
      WAITANSWER             ;
      LDA    1   XC1         ;
      LDA    2   CI6         ;
      SENDMESSAGE            ;
      WAITANSWER             ;
      LDA    2   XSPMES      ; SENDANSWER(SPMES)
      JSR        CEVLAST     ; 
      SENDANSWER             ;
      LDA    2   CUR         ;
      STOPPROCESS            ; STOPPROCESS
      JMP        COMINIT     ;

XSTCNT:  0
XC0:     CWAIT
XC1:     .+1
         1B13
         0
XSPMES:  0
XC2:     XTSTATE
XC3:     XLASTEV


; PROCEDURE TESTS IF A RECEIVED MESSAGE IS FROM THE FPA LOAD PROG

XSPTEST:                      ;
      LDA    0   MESS0,2      ;
      LDA    1   MESS1,2      ;
      COM#   0,0 SNR          ; IF NOT SPECIAL MESSAGE
      COM#   1,1 SZR          ; (MESS0-MESS3 = -1)
      JMP        0,3          ; THEN
      LDA    0   MESS2,2      ;
      LDA    1   MESS3,2      ;
      COM#   0,0 SNR          ;
      COM#   1,1 SZR          ;
      JMP        0,3        ; RETURN
      LDA    0   .1B0         ; CSTATE:= BREAKED
      STA    0 @ CI9          ;
      LDA    1 @ XC2          ; STOPCOUNT:=
     LDA    0   .2            ;   IF TSTATE<>WAITOP THEN 2
      MOVZR# 1,1 SZC          ;
      LDA    0   .1           ;                    ELSE 1
      STA    0   XSTCNT       ;
      STA    2 @ XC3          ; SAVE LASTEV
      STA    2   XSPMES       ; SAVE ADDR SPEC MES
      JMP      @ XC0          ; GOTO CWAIT
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..P1A..
; PROCEDURES                    LL 15.2.76

; PROCEDURE CHECK RESERVATION
; AC0= SENDER ADR
; AC2= RECEIVER ADR    
; AC3= LINK
; RETURN:
; AC0= 0: NO ENTRY WITH SAME RECEIVER
;         AC3= ADR OF EMPTY ENTRY, 0 MEANS NO MORE SPACE
; AC0= 1B0: ENTRY WITH SAME RECEIVER AND SENDER
; AC0= 1B1: ENTRY WITH SAME RECEIVER BUT ANOTHER SENDER
; AC2= RECEIVER ADDRESS, 0 IF RECEIVER DOES NOT EXIST
; AC3= ADDR OF ENTRY IN RESLIST

CHRES:                     ;
      STA    3   CH3       ; SAVE LINK
      LDA    1   .0        ;
      STA    1   CHEMPTY   ; ENPTY:=0
      LDA    1   CHNO      ;
      STA    1   CHCOUNT   ; FOR I:=1 STEP 1 UNTIL CHNO DO
      LDA    3   CH10      ;
CHR1:                      ; BEGIN
      LDA    1   0,3       ;
      SUB#   1,2 SZR       ;   IF RECEIVER.RESLIST=RECEIVER THEN
      JMP        CHR3      ;   BEGIN
      LDA    1   1,3       ;      IF SENDER.RESLIST=SENDER
      SUB#   0,1 SZR       ;
      JMP        CHR2      ;
      LDA    0   .1B0      ;      THEN RETURN(ENTRY WITH SAME SENDER
      JMP      @ CH3       ;                  AND RECEIVER)
CHR2: LDA@   0   PROG,2    ;      ELSE  IF 
      LDA    1   .1B7      ;        DRIVERBIT.PSPEC.PROGRAM.RECEIVER
      AND    0,1 SNR       ;        = 1 THEN
      SUBZR  0,0 SKP       ;        RETURN(ENTRY WITH SAME RECEIVER
                           ;          BUT ANOTHER SENDER)
      LDA    0   .1B1      ;        ELSE
                           ;        RETURN(ENTRY WITH SENDER
                           ;          AND RECEIVER);
      JMP      @ CH3       ;
CHR3:                      ; END
      MOV#   1,1 SNR       ;   IF EMPTY
      STA    3   CHEMPTY   ;   THEN SAVE ENTRY ADDRESS
      INC    3,3           ;
      INC    3,3           ;
      DSZ        CHCOUNT   ;
      JMP        CHR1      ; END
      LDA    0   .0        ; NOT FOUND:
      LDA    3   CHEMPTY   ; RETURN(NO ENTRY WITH SAME RECEIVER)
      JMP      @ CH3       ;

CH3:      0
CH4:      .+1
          0
          0
CH10:     RESLIST
CHNO:     .RESN
CHCOUNT:  0
CHEMPTY:  0
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..P2..
; PROCEDURES                    LL  15 2 76

; PROCEDURE SET LAST EVENT(BUFFER). AC2=BUFFER TO BE REMOVED
; FROM EVENT QUEUE

CEVLAST:                   ; SET LAST EV:
      STA    3   CEV1      ;
      LDA    1 @ CEV0      ;
      SUB#   1,2 SZR       ; IF BUF <> XLASTEV THEN
      JMP      @ CEV1      ; RETURN
      LDA    1  PREV,2     ;
      LDA    3   NEXT,2    ; 
      SUB#   1,3 SNR       ; XLASTEV:=
      LDA    1   .0        ; IF BUF = PREV.BUF
      STA    1 @ CEV0      ;    THEN 0
      JMP      @ CEV1      ;   ELSE PREV.BUF

CEV0:   XLASTEV
CEV1: 0

; PROCEDURE MOVE MESSAGE. MOVES A MESSAGEBUFFER TO TRANS-
; MITTER HEADER. AC2=BUF

MOVMES:                   ;
      STA    3   M0       ;
      LDA    3   M1       ;
      LDA    0   MESS0,2  ;
      STA    0   HMES0,3  ;
      LDA    0   MESS1,2  ;
      STA    0   HMES1,3  ;
      LDA    0   MESS2,2  ;
      STA    0   HMES2,3  ;
      LDA    0   MESS3,2  ;
      STA    0  HMES3,3   ;
      JMP      @ M0       ;

M0:   0
M1:   THEAD
M2:   THEAD+3

; PROCEDURE MOVENAME. MOVES NAME TO HNAME.HEADER. AC2 POINTS TO NAME.
; PROCEDURE MOVENTRY. MOVES ENTRY TO HCATE.HEADER. AC2 POINTS TO ENTRY.

MOVENTRY:
      STA    3   M0       ;
      LDA    3   M2       ; HCATE=HNAME+3
      JMP        .+3      ;
MOVNAME:                  ;
      STA    3   M0       ;
      LDA    3   M1       ;
      LDA    0   +0,2     ;
      STA    0   HNAME,3  ;
      LDA    0   +1,2     ;
      STA    0   HNAME+1,3;
      LDA    0   +2,2     ;
      STA    0   HNAME+2,3;
      JMP      @ M0       ;

«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..P2A..
; PROCEDURES                   LL 15.2.76


; PROCEDURE TCHAIN. CHAINS OPERATION TO TRANSMITTER
; CHAIN. AC0=ACTIVATION ADDRESS, AC2=BUFFER

TCHAIN:                      ;
      STA    3   TC0         ;
      STA    0   BACT,2      ;
      LDA    0   .0          ; CHAIN.OPERATIN:=0
      STA    0   BCHAIN,2    ;
      LDA    1 @ TC1         ;
      MOV    1,3             ; 
      LDA    1   BCHAIN,3    ; WHILE CHAIN.SEM <> 0 DO;
      MOV#   1,1 SZR         ;
      JMP        .-3         ;
      STA    2   BCHAIN,3    ; CHAIN.SEM:=OPERATION
      JMP      @ TC0         ;

TC0:   0
TC1:   XTRSEM

; PROCEDURE GETCHAIN. GETS AN OPERATION BUFFER AND LINKS
; IT TO TRANSMITTER CHAIN. AC0=ACTIVATION ADDRESS
; RETURN AC2=OPERATIONBUFFER

GECHAIN:                      ;
      STA    3   GE1          ;
      STA    0   GE2
      LDA    0   .0           ;
      JSR        GETBUF       ;
      MOVZR  3,3              ;
      INC    3,3              ;
      INC    3,3              ;
      STA    2   MBUF,3       ; OPERATION(0):=BUF
      LDA    0   .0           ;
      STA    0   MNAME,3      ; MNAME:=UNUSED
      LDA    0   GE2          ; SET ACTIVATION ADDRESS
      MOV    3,2              ;
      JSR        TCHAIN       ;
      JMP      @ GE1          ; RETURN

GE1:   0
GE2:   0

«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..P3..
; PROCEDURES                    LL 15.2.76


; PROCEDURE GETBUF.
; AC0= LENGTH OF BUFFER, AC3:=ADDRESS OF BUFFER ELEMENT.
; AC2 UNCHANGED.

BUFDESCR: .+1
-1              ; FOR CAT NAMES
BUF0            ;
0               ; OPERATION BUFFERS
BUF1            ;
0
0
-2   
BUF3
-3
BUF4
BQ5: BL5*2
BUF5
BQ6: BL6*2
BUF6
BQ7: BL7*2
BUF7

GETBUF:
      STA    3   GB0       ; SAVE RETURN
      STA    2   GB1       ; SAVE AC2
      NEGZL# 0,0 SNC       ; IF LENGTH <= 0
      JMP        GB12      ; THEN GOTO SEARCH
      MOV    0,3           ; SEARCH FOR BEST BUFFER
      LDA    1   BQ5       ;
      SUBZL# 0,1 SNC       ; IF WANTED LENGTH < BUF1
      MOV    1,3           ; THEN BEST:=BUF1
      LDA    1   BQ6       ;
      SUBZL# 0,1 SNC       ; IF WANTED LENGTH < BUF2
      MOV    1,3           ; THEN BEST:=BUF2
      LDA    1   BQ7       ; 
      SUBZL# 0,1 SNC       ; IF WANTED LENGTH < BUF3
      MOV    1,3           ; THEN BEST:=BUF3
      MOV    3,0           ; WANTED BUFFER:=BEST
GB12:                      ; SEARCH:
      LDA    1   GB4       ; GET BUFCHAIN(LENGTH)
      STA    1   GB2       ; FOR I:=1 STEP 1 UNTIL BTYPES DO
      LDA    2   BUFDESCR  ;
GB10:                      ; BEGIN
      LDA    1   +0,2      ;   IF BUFDESCR(I)=BUFFER LENGTH
      SUB#   0,1 SNR       ;
      JMP        GB11      ; THEN GOTO FOUND
      INC    2,2           ;
      INC    2,2           ;
      DSZ        GB2       ;
      JMP        GB10      ; END
                           ; NOT FOUND:
      LDA    3   .0        ;  RETURN NO BUFFER
      JMP      @ GB0       ;
«ff»
; RC3600 PROCESSOR EXPANSION		PAGE..P3A..
; PROCEDURES

GB11:                      ; FOUND:
      TESTP		   ; *** TESTPOINT ***
      LDA    3   +1,2      ; GET HEAD OF CHAIN
      LDA    0   +0,3      ;
      MOV#   3,3 SZR       ; IF CHAIN NOT EMPTY THEN
      STA    0   +1,2      ; HEAD.CHAIN:=CHAIN.HEAD.CHAIN
      LDA    2   GB1       ;
      MOVZL  3,3           ; MAKE IT A BYTE ADDRESS
      JMP     @ GB0        ; RETURN(HEAD.CHAIN)

GB0:   0
GB1:   0
GB2:   0
GB4:   BTYPES+5

«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..P3B..
; PROCEDURES




; PROCEDURE FREEBUF. AC2= ADDRESS OF BUFFER ELEMENT
; AT RETURN: AC1 AND AC2 UNCHANGED.

FREBUF:                    ;
      STA    3   GB0       ; SAVE RETURN
      LDA    3   BUFDESCR  ;
      LDA    0   -1,2       ; GET BUFFER TYPE
      ADD    0,3           ;
      LDA    0   +1,3      ; GET HEAD OF CHAIN(BUFFER TYPE)
      STA    0   +0,2      ; CHAIN.BUF:=HEAD
      STA    2   +1,3      ; HEAD:=BUF
      TESTP		   ; *** TESTPOINT ***
      JMP      @ GB0       ; RETURN

«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..P4..
; PROCEDURES                    LL 15.2.76


; PROCEDURE RCHECK(STATUS,MESBUF). AC0=STATUS, AC2=MESBUF.
; RETURN: AC0= 0, BLOK OK
;         AC0= 1, TRANSMIT STATUS, RECEIVE BLOCK
;         AC0= 9, RECEIVE BLOCK AGAIN

RCHECK:                    ; SAVE LINK
   STA 0 RCH21
      STA    3   RCH0      ;
      LDA    1    RCH1     ;
      AND#   0,1 SNR       ; IF TIMEOUT OR RESET
      JMP        RCH10     ;
      LDA    0   .9        ;
      JMP      @ RCH0      ; THEN RETURN(RECEIVE BLOCK)
RCH10:                     ;
      LDA    1  MESS3,2    ;
      LDA    3   RCH3      ; RBLTYPE:=BLOKTYPE,BLOKNO.STARTBYTE
      AND    1,3           ;
      STA    3 @ RCH4      ;
      LDA    1   .1B10     ; CHECK PARITY ERROR:
      AND#   0,1 SNR       ; IF PARITY ERROR THEN
      JMP        RCH11     ; BEGIN
                           ;   RSTATUS:=PARITY
RCH15:                     ;
      LDA    3 @ RCH4      ;      + RBLTYPE
      ADD    3,1           ;
RCH12:                     ;
      STA    1 @ RCH5      ;
      LDA    0   .1        ;   RETURN(SEND STATUS, RECEIVE BLOCK)
      JMP      @ RCH0      ;
RCH11:                     ; END
      LDA    0   MESS3,2   ; IF ANSWER MASTER CLEAR
      STA    0   RCH22     ; ***
      LDA    1   .15       ; THEN
      SUB#   0,1 SZR       ;
      JMP        RCH13     ; BEGIN
      LDA    0   .1        ; STATE := RUNNING
      STA    0 @ RCH6      ;
      LDA    0   .1B8      ; BLOKNO:=1
      STA    0   RBLNO     ;
      LDA    1   .0        ; STATUS:=0
      JMP        RCH12     ; GOTO SEND STATUS, RC BLOK
RCH13:                     ; END
      LDA    3 @ RCH6      ;
      LDA    1   RCH7      ; IF MASTER CLEAR
      SUB#   0,1 SZR       ; THEN
      JMP        RCH14     ; BEGIN
      MOV#   3,3 SZR       ;   IF STATE = RUNNING
      JMP      @ RCH9      ;   THEN GOTO INIT
      LDA    0   RCH09     ;   CHAIN ANSWER MASTER CLEAR
      LDA    2   .0        ;
      JSR        GECHAIN   ;   TO TRANSMITTER CHAIN
      LDA    1   .0        ;   GOTO SEND STATUS, RC BLOK
      JMP        RCH12     ; END
«ff»
; RC3600 PROCESSOR EXPANSION		PAGE..P4A..
; PROCEDURES

RCH14:                     ;
      LDA    1   .2        ; STATUS:= REJECT BLOCK
      MOV#   3,3 SNR       ; IF STE = INIT THEN
      JMP        RCH15    ; GOTO SEND STATUS, RC BLOK

      LDA    1 @ RCH4      ;
      LDA    2   .1B8      ;
      AND    2,1           ;
      LDA    2   RBLNO     ; IF EXPECTED BLOCKNO <>
      LDA    0   .1        ;    RECEIVED BLOCKNO
      SUB#   2,1 SZR       ; THEN
      JMP      @ RCH0      ; RETURN(RETRANS STATUS,RECEIVE BLOCK)
      LDA    0   RCH21     ; CHECK BLOCK LENGTH ERROR:
      LDA    1   .1B8     ; IF STATUS = BLOCK ERROR
      AND#   0,1 SNR       ;
      JMP        .+3       ;
      LDA    1   .1B11     ; THEN GOTO
      JMP        RCH15     ;   RETTRN STATUS(BLOCK ERROR)
                           ; BLOCK OK:
      LDA    1   .1B8      ; BLOCKNO:=BLOCKNO + 1 MOD 2
      SUB    2,1           ;
      STA    1   RBLNO     ;
      LDA    0 @ RCH4      ; RSTATUS:=RBLTYPE
      STA    0 @ RCH5      ;
      LDA    0   .0        ; RETURN(BLOK OK)
      JMP      @ RCH0      ;

«ff»
; RC3600 PROCESSOR ECPANSION                    PAGE..P5..
; PROCEDURES


RCH0:   0
RCH1:   1B14+1B11
RCH3:   1B8+1B9
RCH4:   RBLIDENT
RCH5:   RSTATUS
RCH6:   XCSTATE
RCH7:   1B11+15
RCH9:   RCH20
RCH09:  TAMCL
RCH20:  JMP @ .+1
        CBREAK
RCH21:  0
RCH22:  0



RBLNO:  0

«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..P6..
; PROCEDURES                    LL 15.2.76


; PROCEDURE TRCHECK(STATUS,BUF). AC0= STATUS, AC2=MESBUF.
; RETURN: AC0= 0, BLOK OK
;         AC0= 1B0, RETRANSMIT
;         AC0 > 0,  ONLY MESSAGES: RETURN ANSWER, STATUS=AC0

TRCHECK:                   ;
      LDA    1 @ TRC8      ; IF CSTATE = BREAKED
      MOVZL# 1,1 SNC       ;
      JMP        TRC13     ;
      LDA    0   .0        ;
      JMP        0,3       ; THEN RETURN OK
TRC13:                     ;
      STA    3   TRC0      ; SAVE RETURN
      LDA    1   TRC3      ; IF STATUS = TIMEOUT
      AND#   0,1 SNR       ;
      JMP        TRC10     ; BEGIN
      JSR        TRESET    ; SEND RESET MESSAGE
      JMP        TRC11     ; GOTO RETRANS
TRC10:                     ; END
      MOV#   0,0 SZR       ;
      JMP        TRC11     ; IF STATUS <> 0 THEN GOTO RETRANS
      LDA    0   MESS3,2   ;
 STA 0 TRC17
      LDA    1 @ TRC8      ; IF STATE <> TUNNING THEN
      MOV#   1,1 SZR       ;
      JMP        TRC12     ;
      MOV#   0,0 SZR       ; IF STATUS <> 0
      JMP        TRC11     ; THEN GOTO RETRANSMIT
      JMP      @ TRC0      ; ELSE RETURN BLOCK OK
TRC12:                     ;
      LDA    1   TRC2      ;
      AND    0,1           ; IF PAR, BLOKL,BLOKID,BLOKNO ERROR
      LDA    3   SNOIDENT  ;
      SUB#   1,3 SZR       ;
      JMP        TRC11     ; THEN GOTO RETRANSMIT
      LDA    1   .15       ;
      AND    1,0           ; GET BLOK CONTROL
      LDA    1   .5        ; IF BLOCKCONTR = 5(REJECT
      SUB#   0,1 SZR       ;
      JMP        .+3       ;
      LDA    0   .1B1      ; THEN RETURN 1B1
      JMP      @ TRC0      ;
      LDA    1   .3        ; IF BLOK CONTROL > 0
      SUBZL# 0,1 SZC       ; THEN GOTO INITIALIZE
      JMP      @ TRC7      ;
      LDA    3   TRC6      ;
      ADD    0,3           ;
      LDA    0   +0,3      ; RETURN(RESULT.BLOKCONTROL)
      JMP      @ TRC0      ;


«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..P6A..
; PROCEDURES


TRC11:                     ; RETRANSMIT
      LDA    0   .1B0      ;
      DSZ        SERCNT    ; ERROR:=ERROR+1
      JMP      @ TRC0      ; IF ERROR <> MAXERROR THEN
                           ; RETURN(1B0)
      LDA    1   PROCE     ; SEARCH ITEM(PROCESS,TTY)
      LDA    2   TRC18     ;
      SEARCHITEM           ;
      MOV#   2,2 SNR       ; IF NO TTY PROCESS
      JMP@       XBREAK	   ; THEN GOTO CBREAK;
      LDA    1   TRC19     ;
      LDA    2   TRC18     ; WRITE(TTY,-FPA ERROR-)
      SENDMESSAGE          ;
      WAITANSWER           ;
      JMP@       XBREAK	   ; GOTO CBREAK;


TRC18:	.TR18
TRC19:	.TR19
.NREL
.TR18:

.TXT    .TTY<0><0>.
.TR19:
        3
         14
         .+1*2
.TXT     .<10><13>FPA ERROR<10><13>.

.XREL
TRC16: 0
TRC17: 0
XBREAK:CBREAK
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..P7..
; PROCEDURES                    LL 15.2.76


TRC0:   0
TRC2:   15B11
TRC3:   1B1+1B14
TRC5:   XTSTATE
TRC6:   .+1
0			   ; RBLCONTR=0
1B6			   ;    -    =1
1B15			   ;    -    =2
1B13			   ;    -    =3
TRC7:   COMINIT
TRC8:   XCSTATE

; PROCEDURE SET STARTCHARACTER(BUF,IDENT)
; AC0=IDENT, AC2=MESSAGE ADDRESS

STCHAR:                    ;
      STA    3   ST0       ;
      LDA    1   SBLNO     ; BLOKNO:=BLOKNO+1MOD2
      LDA    3   .1B8      ;
      SUB    1,3           ;
      STA    3   SBLNO     ;
      ADD    3,0           ; STARTCHAR:=BLOKNO+TYPE
      STA    0   SNOIDENT  ; SAVE BLOKNO+BLOKTYPE
      LDA    1 @ SFUNC     ;
      ADD    1,0           ;     + FUNCTION
      LDA    1 @ ST1       ;
      ADD    1,0           ;     + SPECIAL
      STA    0   +3,2      ;
      LDA    0   SERR      ; ERRORCOUNT:=MAXERROR
      STA    0   SERCNT    ;
      JMP      @ ST0

ST0:    0
ST1:    TXSPEC
SBLNO:  1B8
SFUNC:  TXFUNC
SNOIDE: 0
SERR:   MAXERR
SERCNT: 0
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..P7B..
; PROCEDURES               LL 15.2.76


; PROCEDURE TRANSMIT RESET SIGNAL AND WAIT 60 MSEK

TRESET:                      ;
      STA    3   TRE0      ;
      LDA    1   TRE1      ; SEND RESET MESSAGE TO 
      LDA    2 @ TRE2      ; TRANSMITTER
      SENDMESSAGE          ;
      LDA    0   TRE3      ;
      STA    0   BACT,2    ; SET ACTIVATION ADRESS
      JMP      @ TRE4      ; GOTO CENTRAL WAIT
TR00:                      ; ACTIVATION:
      WAITANSWER           ;
      LDA    1   .0        ; WAIT 100 MSEC
      LDA    2   .5        ;
      WAITINTERRUPT        ;
      JMP      @ TRE0      ; RETURN

TRE0:   0
TRE1:   .+1
        1B11
TRE2:   TNAME
TRE3:   TR00
TRE4:   CWAIT
TRE5:   XTSTATE

«ff»
; RC3600 PROCESSOR EXPANSION		PAGE..P7C..
; PROCEDURES

; PROCEDURE RELEASE CONVERSION BUFFER FROM CONVCHAIN
; AC0=SENDER, AC1=RECEIVER

CRELEASE:                   ;
      STA    3   CRE4       ; SAVE REGISTERS
      STA    0   CRE5       ;
      STA    1   CRE6       ;
      STA    2   CRE7       ;
      LDA    2   XCHEAD     ; ELEM:=XCHEAD
CRE0:                       ;
      MOV    2,3            ;
      LDA    2   CCHAIN,3   ; ELEM:=CCHAIN.ELEM
      MOV#   2,2 SNR        ;
      JMP      @ CRE4       ; IF ELEM=0
      LDA    0   CRE5       ; THEN RETURN
      LDA    1   CXSEND,2   ; IF SENDER= CSEND.ELEM
      SUB#   0,1 SZR        ; AND
      JMP        CRE0       ;     RECEIVER= CREC.ELEM
      LDA    0   CRE6       ;
    LDA    1   CREC,2       ; THEN
      SUB#   0,1 SZR        ;
      JMP        CRE0       ; BEGIN
      MOV    3,1	    ; SAVE PREV ELEM
      JSR      @ CRE3       ; FREE BUFFER
      LDA    2   CCHAIN,2   ;
      MOV    1,3	    ;
      STA    2   CCHAIN,3   ;   CCHAIN.PREV:=
      LDA    2   CRE7       ;   CCHAIN.ELEM
      JMP      @ CRE4       ;   RETURN
                            ; END
CRE3:   FREBUF
CRE4:   0
CRE5:   0
CRE6:   0
CRE7:   0
XCHEAD: XCONCH-CCHAIN
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..P7D..
;

; TEST PROCEDURE. SAVE CONTENT OF REGISTERS AND 5 WORDS
; FROM AC2 AND ON IN A CYCLIC BUFFER.
; CALL:  JSR  XTEST. REGISTERS UNCHANGED

.IFN	TEST

ZQLBNR:  0
ZQFWA:   ZQBUF
ZQLWA:   ZQEND-10
ZQPOINT: ZQBUF
ZQ0:     0
ZQ3:     0

XTEST:
      STA    0   ZQ0
      STA    3   ZQ3
      ISZ        ZQ3
      LDA    3   ZQPOINT
      LDA    0   ZQLWA
      SUBZ#  0,3 SZC
      JMP        ZQCYCLE
ZQZQ1:
      ISZ      ZQLBNR
      LDA    0   ZQLBNR
      STA    0   0,3
      LDA    0   ZQ0
      STA    0   1,3
      STA    1   2,3
      STA    2   3,3
      LDA    0   ZQ3
      STA    0   4,3
      LDA    0   0,2
      STA    0   5,3
      LDA    0   1,2
      STA    0   6,3
      LDA    0   2,2
      STA    0   7,3
      LDA    0   3,2
      STA    0   8,3
      LDA    0   4,2
      STA    0   9,3
      LDA    0   .10
      ADD    0,3
      STA    3   ZQPOINT
      LDA    0   ZQ0
      JMP      @ ZQ3

ZQCYCLE:
      LDA    3   ZQFWA
      STA    3   ZQPOINT
      JMP        ZQZQ1

«ff»
; RC3600 PROCESSOR EXPANSION		PAGE..P7E..
; PROCEDURES

ZQBUF:  0
      .BLK  20
ZQEND: 0

.NREL

TTEST:  .BLK 120
ATTEST: 0
RTEST:  .BLK 120
ARTEST:  0

.ENDC




.NREL
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..P7A..
; TABLES                         LL 15.2.76


; ALLOCATE DATA BUFFERS.

0			; HSTART.THEAD
THEAD:   .BLK 13
0			; HSTART.RHEAD
RHEAD:   .BLK 13

0

BUF0=	0
.DO	B0
	0
	BUF0
.BLK	BL0-1
BUF0=	.-BL0
.ENDC

BUF1=	0
.DO	B1
	2
	BUF1
.BLK	BL1-1
BUF1=	.-BL1
.ENDC

BUF3=	0
.DO	B3
	6
	BUF3
.BLK	BL3-1
BUF3=	.-BL3
.ENDC

BUF5=	0
.DO	B5
.BLK	3
	10
	BUF5
.BLK	BL5-1
BUF5=	.-BL5
.ENDC

BUF6=	0
.DO	B6
	12
	BUF6
.BLK	BL6-1
BUF6=	.-BL6
.ENDC

BUF7=	0
.DO	B7
	14
	BUF7
.BLK	BL7-1
BUF7=	.-BL7
.ENDC
«ff»
; RC3600 PROCESSOR EXPANSION                     PAGE..P8..
; TABLES                        LL 15.2.76


BUF4=	0        ; TTY PROCESS DESCRIPTIONS
.DO	B4
	8
TTMES=	.+24-11
TTPROC=	.+0
	BUF4
	0
	0
	23
.BLK	3
	.+0
	.-1
	B40*11+TTMES
	XTY0
	1B0
	0
	128
	XTY9
.BLK	4
	XTY1
	0
	0
	0
TTMES=	.+1-11
TTBUF=	0
.DO	B40

	0
	.+0
	.-1
	TTBUF
	10
	TTPROC
	0
.BLK	4
TTBUF=	.-10
.ENDC
BUF4=	.-BL4
.ENDC

«ff»
; RC3600 PROCESSOR EXPANSION		PAGE P8A..
; TABLES

XTY0:	1B0+1
	XTY1
	0
	XTY10-XTY0
.TXT	.XTYX<0>.

XTY1:
      LDA    2   .0
XTY2:
      WAITEVENT
      JMP        XTY5
; MESSAGE TO TTY
      LDA    0   SENDER,2	   ;
      LDA    1   .CX10		   ;
      SUB#   0,1 SNR		   ; IF SENDER.BUF <> XCOMX THEN
      JMP        XTY3		   ; BEGIN
      LDA    0   PREV,2		   ;	SENDANSWER(BUF,ILLEGAL);
      STA    0   TYBUF,3	   ;
      LDA    0   .1B6		   ;
      SENDANSWER		   ;
      LDA    2   TYBUF,3	   ;	WAIT FOR NEXT BUFFER;
      JMP	 XTY2		   ; END;
XTY3: MOV    2,0
      LDA    1   XMES0
      ADD    2,1
      LDA    2   XTYNAM
      SENDMESSAGE
      STA    0   TYB,2
      MOV    0,2
      JMP        XTY2
«ff»
; RC3600 PROCESSOR EXPANSION		PAGE..P8B..
; TABLES

; ANSWER

XTY5:
      STA    2   TYBUF,3
      LDA    2   TYB,2
      SENDANSWER
      LDA    2   TYBUF,3
      LDA    0   PREV,2
      LDA    1   NEXT,2
      SUB#   0,1 SNR
      LDA    0   .0
      STA    0   TYBUF,3
      WAITANSWER
      LDA    2   TYBUF,3
      JMP        XTY2
XTY9:				   ; BREAK:
      LDA    2   CUR		   ;
      CLEANPROCESS		   ;
      SUB    0,0		   ;
      STA    0   PX00+1		   ;
      LDA    0   PROCESS	   ;
      LDA    1   PX00		   ; REMOVE PSEUDO PROCESS
      RECHAIN			   ; FROM PROCESS CHAIN;
      STOPPROCESS		   ; STOP PSEUDOPROCESS

PX00: .+1-CHAIN
      0
.CX10:XCX10			   ; XCOMX PROCESS DESC. ADDR.

TYB=    -1
TYBUF=  SAVE+2
XMES0:  MESS0
XTYNAM: .+1
.TXT    .TTY<0><0>.
XTY10:
«ff»
; RC3600 PROCESSOR EXPANSION                    PAGE..P9..
; TABLES                       LL 15.2.76



; COMLIST FOR SEND MESSAGE

.XREL
XCOMLIST:
.DO	XCENT
	0
	0
	0
	0
.ENDC

«ff»
; RC3600 PROCESSOR EXPANSION		PAGE..P10..
; TABLES

; RESERVATION LIST FOR COM
RESLIST:
.DO	.RESN
	0
	0
.ENDC

.NREL

«ff»
; RC3600 PROCESSOR EXPANSION		PAGE..P11..
; TABLES

XCX11=	0
.DO	.MESB
.BLK	7
	.+0
	.-1
	XCX11
	BSIZE
	XCX10
	0
.BLK	4
XCX11=	.-BSIZE
.ENDC




.COMS:
	JMP@ .+1
	COMSTART

.LOC	COMLIST
	XCX10
.LOC	COMNO
	-1

.NREL
«ff»

; RC3600 PROCESSOR EXPANSION                    PAGE..TA2..
; TABLES


      XCOML	   ; -2: COMLIST
      XCENT	   ; -1: COMNO
XCX10:             ; TOP OF PROGRAM
      0            ; NEXT
      0            ; PREV
      0            ; CHAIN
      XCX12-XCX10  ; SIZE
.TXT  .XCOMX.

      .+0          ; EVENT
      .-1          ;
      XCX11        ; FIRST MESSAGE BUFFER
      XCX0         ; PROGRAM ADDRESS
      0            ; STATE
      0            ; TIMER
      1B0          ; PRIORITY
      CBREAK       ; BREAK ADDRESS
      .BLK 4       ; SAVED AC.S
      .COMS*2      ; START ADDRESS
      0            ; SAVE

XCX12:
.END XCX10

«ff»
MER:                    ; TIMER:
26 00307*060277       INTDS                ;  DISABLE INTERRUPT;
27 00310*102000       ADC    0,0           ;  DRIVE:= -1;
28 00311*024126       LDA    1   KTIME     ;  TIMER.CUR:=
29 00312*045014       STA    1   TIMER,2   ;    INITTIME;
30 00313*101400 DTIM3:INC    0,0           ; NEXTDRIVE:
31 00314*006744       JSR@       .DSEARCH  ;  INCR(DRIVE);
32 00315*175005       MOV    3,3 SNR       ;  SEARCH(DRIVE,COROUTINE);
33 00316*002750       JMP@       .DCHECK   ;  IF COROUTINE = 0 THEN
34 00317*025404       LDA    1   CREASON,3 ;    GOTO CHECK;
35 00320*125122       MOVZL  1,1 SZC       ;  IF REASON.COR = INTERRUPT THEN
36 00321*015403       DSZ        CTIME,3   ;    IF DECR(TIMER.COR) = 0 THEN
37 00322*000771       JMP        DTIM3     ;    BEGIN !TIMEOUT!
38 00323*024117       LDA    1   STIME     ;      STATUS.COR:= TIMER;
39 00324*045412       STA    1   CNSTAT,3  ;      TRANSFERED BYTES.COR:= 0;
40 00325*126400       SUB    1,1           ;      !CURRENT PROGRAM COUNT
41 00326*045435       STA    1   CTRANS,3  ;       IS UNDEFINED!
42 00327*045025       STA    1   BUF,2     ;      BUF.CUR:= 0 !TO BE SURE
43                                         ;       THAT ALL MESSAGES ARE HANDLED
44                                         ;       CORRECT, THE EVENT QUEUE IS
45                                         ;       SCANNED FROM THE VERY BEGINNING!;
46 00330*165000       MOV    3,1           ;
47 00331*020101       LDA    0   KICAUSE   ;      CAUSE:= INTERRUPT;
48 00332*006724       JSR@       .DINSERT  ;      INSERT(CAUSE,COROUTINE);
49 00333*006726       JSR@       .DSWAIT   ;      START(WAIT);
50                                         ;    END !TIMEOUT!;
51 00334*000757       JMP        DTIM3     ;  GOTO NEXTDRIVE;
«ff»
!0022 MD005
01              ; CDC DISC DRIVER, 77.05.01 HKM. MODULE COMMANDS ETC. PAGE 18
02              
03              ; CHANNEL PROGRAM COMMANDS:
04 00335*154001 KREAD   :    216B7+1       ; COMMAND(READ DATA);
05 00336*154003 KWRITE  :    216B7+3       ;    -   (WRITE DATA);
06 00337*154002 KWRREAD :    216B7+2       ;    -   (WRITE/READ(SEEK));
07 00340*154031 KREBYTE :    216B7+3B12+1  ;    -   (READ BYTE);
08 00341*154033 KWRBYTE :    216B7+3B12+3  ;    -   (WRITE BYTE);
09       000000 .IFN  MDI                  ;
10              KRADDR  :    216B7+1B12+1  ;    -   (READ ADDRESS FIELD);
11              KWADDR  :    216B7+1B12+3  ;    -   (WRITE ADDRESS FIELD);
12              KWFORM  :    216B7+2B12+2  ;    -   (FORMA«ff»
«nul»