|
DataMuseum.dkPresents historical artifacts from the history of: RegneCentralen RC3600/RC7000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RegneCentralen RC3600/RC7000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 70144 (0x11200) Types: TextFile Notes: RCSL-43-GL-10024, RCSL-43-GL-11023, RCSL-43-GL-11025 Names: »SXCOM«
└─⟦a59f0a452⟧ Bits:30000472 DOMUS disk image └─⟦this⟧ »/SXCOM«
; 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»