|
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 - download
Length: 27136 (0x6a00) Types: TextFile Notes: RCSL-43-GL-8235, RCSL-43-GL-8236 Names: »YTT09«
└─⟦45bd0f8dd⟧ Bits:30000464 DOMUS disk image └─⟦this⟧ └─⟦6dbcc9c03⟧ Bits:30000463 DOMUS disk image └─⟦this⟧ └─⟦a2e222af0⟧ Bits:30001626 DOMUS disk image └─⟦this⟧
; RCSL: 43-GL8236 ; AUTHOR: DHA ; EDITED: 78.12.07 ; TT009 ; KEYWORD: MUS, DRIVER, TTY, CRT, LISTING. ; ABSTRACT: MUS DRIVER FOR OPERATOR DEVICE ; TTY OR CRT. ; ASCII PAPER TAPE RCSL 43-GL8235 ; REL. BINARY PAPER TAPE 43-GL8237 ; ; UNITNUMBER MUST BE DEFINED ON A SEPERATE TAPE AS UNIT= ; DEVICECODE FOR INPUT MUST BE DEFINED TOO AS TTI= ; UNIT=8 IF SPECIAL RC8000 IS USED ; ; SPECIAL FOR OCP : ; 1B1 = DISABLE ALL OUTPUT BUT RETURN NORMAL «ff» .NOCON 1 .NREL .RDX 10 .TXTM 1 CDEL= 127 ; CHAR DELETE CECHO= 95 ; CHAR DELETE ECHO LDEL= 5 ; LINE DELETE LECHO= 94 ; LINE DLETE ECHO .DO UNIT==0 .TITLE TT009 .ENDC .DO UNIT==8 .TITLE TT800 ; UNIT=0 ; RC8000 UNIT=0 CDEL= "& ; CECHO= "& ; CHAR DELETE AND ECHO LDEL= "% ; LECHO= "% ; LINE DELETE AND ECHO .ENDC .DO UNIT==1 .TITLE TT102 .ENDC .DO UNIT==2 .TITLE TT201 .ENDC .DO UNIT==3 .TITLE TT300 .ENDC TTI= TTI ; TTI DEFINED AS TTO= TTI+1 ; TTO UNIT= UNIT ; UNIT NO DEFINED AS ; ****** TELETYPE CONSOLE DRIVER ****** DA4: ; PROGRAM: 1B0+1B1+0B2+1 ; SPECIFICATION DA100 ; START 0 ; CHAIN DA0-DA4 ; SIZE "T*256+"T ; NAME .DO UNIT==0 "Y*256+0 ; 0 ; .ENDC .DO UNIT<>0 ; "Y*256+UNIT+48 ; 0 ; .ENDC DABEL=.7 ; BELL .DO UNIT==0 ..DA221: DA221 .DA211 : DA211 .IDA21 : DA21 .DA22 : DA22 «ff» DA100:MOVL 0,0 SNC ; BREAK ADDRESS: JMP DA101 ; IF BREAK NO>=0 THEN GOTO SETTIME; SUB 1,1 ; STA 1 DASERVER,2; CUR.RESERVER:= UNDEFINED; LDA 2 .64 ; WAITINTERRUPT ; WAITINTERRUPT(0,1.2 S); LDA 0 .15 ; COMMENT POWERBREAK; JMP@ .+1 ; GOTO OUTTEXT(POWER); DA354 ; DA101:LDA 3 .10 ; SETTIME: STA 3 DATIME,2 ; TIME:= 10; DA10: LDA 1 DAIN,2 ; BREAK: SETINTERRUPT ; SET INT(IN.CUR) LDA 1 DAOUT,2 ; SETINTERRUPT ; SET INT(OUT.CUR); DA11: ; START: SUB 0,0 ; BUF:=0; STA 0 RESER,2 ; RESERVER.CUR:= 0 ! USED AS LINK ! STA 0 BUF,2 ; DA12: ; NEXT EVENT: LDA@ 1 DAATT,2 ; MOVZR 1,1 SZC ; IF INTERRUPT(DAIN) THEN JMP DA16 ; GOTO INPUT; LDA 1 DAIN,2 ; LDA 0 .5 ; WAITOPERATION ; WAITOPERATION(5*20 MS,IN.CUR); JMP DA122 ; +0: GOTO TIMEOUT, JMP DA16 ; +1: GOTO INPUT, JMP DA12 ; +2: NEXT EVENT, JMP DA15 ; +3: GOTO DONE; JMP DA152 ; +4: GOTO LINK; ; +5: OUTPUT: LDA 3 SENDER,3 ; SENDER:=SENDER.BUF; LDA 1 DASERVER,2; SUB 3,1 SNR ; IF SENDER<>RESERVER.CUR THEN JMP DA121 ; BEGIN STA 2 DASERVER,2; CUR.RESERVER:= UNDEFINED; LDA 1 NAME,3 ; RESNAME.CUR:= STA 1 RESNA+0,2 ; NAME.SENDER; LDA 1 NAME+1,3 ; STA 1 RESNA+1,2 ; LDA 1 NAME+2,3 ; STA 1 RESNA+2,2 ; LDA 0 .RESM ; ADDZL 2,0 ; ADDRESS.CUR:= ; REF.RESNAME-1 SHIFT 1; JSR@ ..DA221 ; TYPE8; JSR@ .DA211 ; TYPECHAR(NL); LDA 3 BUF,2 ; LDA 3 SENDER,3 ; STA 3 DASERVER,2; CUR.RESERVER:= BUF.SENDER; JMP DA11 ; GOTO START; DA121: SUB 0,0 ; FIRST CHAR := 0; JSR@ .IDA21 ; TYPECHAR(ZERO); JSR@ .DA22 ; END; TYPETEXT; DA15: ; DONE: SUB 0,0 ; STATUS:= 0; DA151: ; RETURN ANSWER: RETURNANSWER ; RETURN ANSWER(STATUS); JMP DA11 ; GOTO START; «ff» DA122: ; TIMEOUT: JSR@ .DA60 ; RETURNTIMEOUTS; JMP DA11 ; GOTO START; .RESM:RESNAME-1 DC1: 17 ; START READER DA152:LDA 1 DAIQ,2 ; LINK: HEAD:=INPUTQUEUE.CUR; LDA 3 .4 ; AND# 0,3 SZR ; IF MODE= ATTENTION THEN LDA 1 DAAQ,2 ; HEAD:= ATTENTIONQUEUE.CUR; LDA 3 BUF,2 ; INTDS ; LDA 2 PREV,3 ; LDA 0 NEXT,3 ; STA 0 NEXT,2 ; BUF.PREV.NEXT:=BUF.NEXT; MOV 0,2 ; LDA 0 PREV,3 ; STA 0 PREV,2 ; BUF.NEXT.PREV:=BUF.PREV; MOV 1,2 ; LDA 0 PREV,2 ; P:=HEAD.PREV; STA 3 PREV,2 ; HEAD.PREV:= BUF; STA 2 NEXT,3 ; BUF.NEXT:=HEAD; STA 0 PREV,3 ; BUF.PREV:= P; MOV 0,2 ; STA 3 NEXT,2 ; HEAD.PREV.NEXT:=BUF; INTEN ; ENABLE INT. ; LDA 2 CUR ; AC2:= CUR; LDA 0 MESS0,3 ; LDA 1 .1B13 ; AND 1,0 SZR ; IF MODE= TIMEOUT THEN LDA 0 MESS3,3 ; MESS0.BUF:= MESS3.BUF; STA 0 MESS0,3 ; ELSE MESS0.BUF:= 0; LDA 3 BUF,2 ; LDA 3 SENDER,3 ; LDA 1 DASERVER,2; SUB 3,1 SZR ; IF BUF.SENDER = CUR.RESERVER THEN JMP DA11 ; BEGIN LDA 0 DC1 ; JSR@ DA.21 ; TYPECHAR(START READER); JSR DANIOS,2 ; NIOS(TTI); ! DGC READER ! JMP DA11 ; END; ; GOTO START; DA.21: DA21 .DA60: DA60 «ff» DA16: LDA 1 DAIQ,2 ; INPUT: JSR@ .DA32 ; IF -,GETBUF THEN JMP .+3 ; BEGIN JSR DA198 ; INCHAR(CHAR); JMP DA10 ; GOTO BREAK MOVOL 2,1 ; END; STA@ 1 DAATT,2 ; DEVTA(DEVIN):=CUR*2+1; DA160:LDA 1 MESS1,3 ; READ: STA 1 COUNT,2 ; COUNT.CUR:=MESS1.BUF; LDA 1 MESS2,3 ; STA 1 ADDRESS,2 ; ADDRESS.CUR:=MESS2.BUF; STA 1 DASAVE,2 ; SAVE.CUR:=MESS2.BUF; STA 3 BUF,2 ; DA.16:LDA 3 BUF,2 ; BUF.CUR:= BUF; LDA 0 MESS0,3 ; CONT.INPUT: MOV 0,0 SNR ; IF MESS0.BUF= 0 THEN MESS3.BUF:= 5 LDA 0 .5 ; ELSE MESS3.BUF:= MESS0.BUF; STA 0 MESS3,3 ; DA161:JSR DA190 ; INTEXT; JMP .+2 ; JMP DA15 ; +1: GOTO DONE; ; +0: TIMEOUT: LDA 3 BUF,2 ; DSZ MESS3,3 ; IF DECR(MESS3.BUF) = 0 THEN JMP DA161 ; BEGIN LDA 3 MESS0,3 ; LDA 0 STIME ; MOV 3,3 SZR ; IF MESS0.BUF<> 0 THEN JMP DA151 ; GOTO RETURN ANSWER(TIMER); LDA 3 .EVENT ; BUF:= HEAD:= EVENT QUEUE; ADD 2,3 ; MOV 3,1 ; REPEAT DA162:LDA 3 NEXT,3 ; BUF:=BUF.NEXT; SUB# 3,1 SNR ; JMP DA.16 ; LDA 2 MESS0,3 ; IF MODE.BUF = OUTPUT THEN LDA 0 .3 ; GOTO START; ANDZR 2,0 ; LDA 2 CUR ; MOV 0,0 SBN ; UNTIL NEXT.BUF= HEAD; JMP DA162 ; GOTO CONT.INPUT; JMP DA11 ; END; GOTO INTEXT; «ff» DA198:STA 3 DALINK,2 ; INCHAR: JSR DADIA,2 ; DIA.CUR(CHAR); LDA 1 .127 ; AND 1,0 ; CHAR:= CHAR(9:15); LDA 3 DABELL ; SUB 0,3 SNR ; IF CHAR= BELL THEN JMP@ .DA40 ; GOTO ATTENTION; LDA 3 DAFS ; SUB 0,3 SNR ; IF CHAR<>ESC AND CHAR<> FS THEN JMP DA199 ; LDA 3 DAESC ; RETURN; SUB 0,3 SZR ; JMP@ DALINK,2 ; DA199:STA 0 DASV2,2 ; LDA 1 DAIN,2 ; SETINTERRUPT ; SETINTERRUPT(IN.CUR); LDA 1 DAAQ,2 ; GETBUF(ATTENTIONQ); JSR@ .DA32 ; IF -,FOUND THEN RETURN; JMP .+2 ; JMP DA202 ; LDA 1 SENDER,3 ; LDA 3 BUF,2 ; BUF:= BUF.CUR LDA 0 SENDER,3 ; IF SENDER.BUF=RESERVER.CUR THEN SUB# 0,1 SNR ; GOTO ATTRETURN JMP DA200 ; ADC 1,1 ; STA 1 DASV1,2 ; MODE:= INPUT; LDA 1 DAIQ,2 ; HEAD:= INPUTQUEUE; JSR@ .DA32 ; GETBUF(INPUTQUEUE); JMP DA197 ; +0: ! INPUTBUFFER FOUND ! LDA 1 DAAQ,2 ; JSR@ .DA32 ; +1: ! NO INPUTBUFFER ! JMP .+1 ; GETBUF(ATTENTIONQ); DA197:LDA 1 MESS2,3 ; ADDRESS.CUR:= MESS2.BUF ; STA 1 ADDRESS,2 ; DA200:STA 3 BUF,2 ; ATTRETURN: BUF.CUR:=BUF; ISZ DASV1,2 ; IF MODE=INPUT THEN JMP DA201 ; BEGIN LDA 0 DASV2,2 ; CHAR:= ATTENTIONCHAR.CUR; LDA 1 ADDRES,2 ; PUTBYTE ; PUTBYTE(ADDRESS.CUR,CHAR); ISZ ADDRES,2 ; ADDRESS:=ADDRESS+1; ; END; DA201:LDA 0 .1B5 ; STATUS:= ATTSTATUS; JMP@ .+1 ; GOTO RETURN ANSWER; DA151 ; DA202:LDA 0 DASV2,2 ; JMP@ DALINK,2 ; DA204:STA 3 DALINK,2 ; LDA 0 DAESC ; JMP DA199 ; .DA40: DA40 .DA32: DA32 DAFS: 28 DAESC: 27 .DA50: DA50 «ff» ; PROCEDURE INTEXT; DA190:STA 3 SAVE,2 ; INTEXT: DA191:LDA 1 DAIN,2 ; REPEAT JSR@ .DA50 ; WAITGEN(IN.CUR); JMP@ SAVE,2 ; +0: RETURN; ADC 3,3 ; STA 3 DASV1,2 ; MODE:= INPUT; JSR DA198 ; INCHAR(CHAR); LDA 1 DARUBOUT ; DELETE:= FALSE; SUB 0,1 SZR ; IF CHAR=RUBOUT THEN JMP DA192 ; BEGIN LDA 0 DALEFTAR ; DELETE:= TRUE; ECHO:= CURSOR LEFT; JMP DA193 ; END ; ELSE DA192:LDA 1 DABACK ; IF CHAR=DELETECHAR THEN SUB 0,1 SZR ; BEGIN JMP DA194 ; DELETE:= TRUE; ECHO:= CHARECHO; LDA 0 DABSP ; END; DA193:LDA 1 DASAVE,2 ; IF DELETE THEN LDA 3 ADDRESS,2 ; BEGIN SUB 3,1 SNR ; IF ADDRESS=SAVE THEN JMP DA191 ; GOTO NEXT; DSZ ADDRESS,2 ; DECR(ADDRESS.CUR); ISZ COUNT,2 ; INCR(COUNT.CUR); JSR DA21 ; TYPECHAR(ECHO); LDA 0 DAEOL ; ERASE END OFF LINE JSR DA21 ; JMP DA191 ; GOTO NEXT; DA194:LDA 1 DALICAN ; END; SUB 0,1 SZR ; IF CHAR=LINECANCELCHAR.CUR THEN JMP DA195 ; BEGIN LDA 0 DALEC ; JSR DA21 ; TYPECHAR( LINE ECHO ); LDA 3 BUF,2 ; INC# 3,3 SZR ; JMP DA160 ; IF ATTENTIONFLAG<>0 THEN JMP@ .DA40 ; GOTO ATTENTION ELSE ; GOTO READ; ; END; «ff» DA195:LDA 3 .32 ; SUBL# 3,0 SNC ; IF CHAR < 32 THEN JMP DA196 ; BEGIN STA 0 COUNT,2 ; LDA 0 DC3 ; TYPCHAR(STOP READER); JSR DA21 ; LDA 0 COUNT,2 ; CUR.COUNT:= 1; SUBZL 1,1 ; STA 1 COUNT,2 ; END; DA196:LDA 1 ADDRESS,2 ; ADDR:= ADDRESS.CUR; PUTBYTE ; PUTBYTE(ADDR,CHAR); LDA 1 ECHTAB ; JSR DA70 ; IF CHAR IN ECHOTAB THEN JMP .+2 ; JSR DA21 ; TYPECHAR(CHAR); ISZ ADDRESS,2 ; INCR(ADDRESS.CUR); DSZ COUNT,2 ; JMP DA191 ; ISZ SAVE,2 ; UNTIL DECR(COUNT.CUR)= 0 ; JMP@ SAVE,2 ; RETURN; DARUBO= .127 DAEOL: 30 DALEFT: 8 DABACK: CDEL ; DALICA: LDEL ; DABSP: CECHO DALEC: LECHO ; DC3: 19 ; STOP READER ECHTAB: .+1 ; ONLY ECHO OF 13,12,14,15 AND 10 .RDX 2 ; ; 11111222223 ; ;1357913579135791 ; 1111110011111111 ; ; ; 11111222223 ; ;0246802468024680 ; 1111100011111111 ; .RDX 10 «ff» ; PROCEDURE TYPETEXT ; DA221:LDA 1 .8 ; TYPE8: STA 1 COUNT,2 ; COUNT.CUR:=8; STA 0 ADDRESS,2 ; SUB 0,0 ; STA 0 DALAST,2 ; LASTCHAR.CUR:=0; DA22: STA 3 DASAVE,2 ; REPEAT DA220:LDA 1 ADDRESS,2 ; ADDR:= ADDRESS.CUR; GETBYTE ; GETBYTE(ADDR,BYTE); LDA 3 DALAST,2 ; STA 0 DALAST,2 ; LAST:= CUR.LASTCHAR; LDA 1 .NL ; CUR.LASTCHAR:= CHAR; SUB 0,1 SZR ; JMP DA223 ; IF CHAR=NL THEN LDA 0 .CR ; SUB 0,3 SNR ; IF LAST=CR THEN GOTO UPDAT; JMP DA25 ; DA223:LDA 1 SKPTAB ; JSR DA70 ; IF -, CHAR IN SKIPCHAR THEN JMP DA25 ; BEGIN LDA 3 .127 ; AND 3,0 SNR ; CHAR:= CHAR EXTRACT 7; JMP@ DASAVE,2 ; LDA@ 3 DAATT,2 ; MOVZR 3,3 SNC ; IF INPUTINTERRUPT THEN JMP DA24 ; BEGIN JSR@ DA.19 ; INCHAR; LDA 1 DAIN,2 ; ! NO ATTENTION ! SETINTERRUPT ; CLEAR INTERRUPT; JMP DA220 ; REPEAT CURRENT CHAR; ; END; DA24: JSR DA21 ; TYPECHAR(CHAR); ; END; ; UPDAT: DA25: ISZ ADDRESS,2 ; INCR(ADDRESS.CUR); DSZ COUNT,2 ; UNTIL DECR(COUNT)=0; JMP DA220 ; JMP@ DASAVE,2 ; RETURN; SKPTAB: .+1 ; SKIPTABLE: .RDX 2 ; 11111222223 ; DO NOT SKIP 5 , 7 , 13 , .... ;1357913579135791 ; 1100110010000000 ; ; ; 11111222223 ; DO NOT SKIP 0 , 6 , 8 , 10 , 16 , ..... ;0246802468024680 ; 0110000000000000 ; .RDX 10 DA.19: DA198 «ff» ; PROCEDURE TYPECHAR(CHAR); ; CALL: RETURN: ; AC0 CHAR CHAR ; AC1 DESTROYED ; AC2 CUR CUR ; AC3 LINK DESTROYED DA211:LDA 0 .CR ; DA21: STA 3 DALINK,2 ; TYPECHAR: LDA 1 .NL ; SUB 0,1 SNR ; LDA 0 .CR ; IF CHAR = NL THEN CHAR:=CR; DA212:LDA 1 DELTAB ; JSR DA70 ; IF CHAR IN DELTAB THEN DELAY; JSR DA75 ; MOVZS 0,1 ; TYPEOUT: ADD 1,1 SZR ; JMP .-1 ; PARITY:=PARITY(CHAR); MOVR 1,1 ; MOVS 1,1 ; ADD 1,0 ; CHAR:=CHAR+PARITY; READS 3 ; IF 1B1 = 1 THEN MOVZL 3,3 ; MOVZL 3,3 SZC ; JMP DA213 ; DISABLE TYPEOUT; JSR DADOAS,2 ; DOAS(CHAR); SUB 1,0 ; REMOVE(PARITY); LDA 1 DAOUT,2 ; JSR DA51 ; WAITGEN(OUT.CUR); SETINTERRUPT ; +0: SETINTERRUPT(DEV.CUR); LDA 1 DELTAB ; IF CHAR IN DELTAB THEN DELAY; JSR DA70 ; JSR DA75 ; DA213:LDA 3 .CR ; INE 0,3 ; IF CHAR<>CR THEN JMP@ DALINK,2 ; RETURN; JSR DA60 ; RETURNTIMEOUTS; LDA 0 .NL ; CHAR:=NL; JMP DA212 ; GOTO TYPEOUT; DELTAB: .+1 ; DELAYTABLE: .RDX 2 ; 11111222223 ; DELAY 31 ;1357913579135791 ; 0000000000000001 ; ; ; 11111222223 ; DELAY 12 , 14 ;0246802468024680 ; 0000001100000000 ; .RDX 10 ; «ff» ;PROCEDURE CHECK IN SET ; ; CALL RETURN ;AC0 CHAR CHAR ;AC1 SET ADDR DEST. ;AC2 CUR CUR ;AC3 LINK DEST. ; ;+0: CHAR IN SET ;+1: CHAR NOT IN SET ; ; THE SET IS DEFINED AS TWO WORDS BIT MASK, WITH ODD VALUES ; REP. IN FIRST WORD, AND EVEN VALUES IN SECOND WORD. DA70: STA 3 DASV3,2 ; MOV 1,3 ; CHECK IN SET: LDA 1 .32 ; SUBL# 1,0 SNC ; IF CHAR < 32 THEN JMP DA72 ; BEGIN LDA 1 +0,3 ; MASK:= 0.SETADDR; MOVZR 0,2 SNC ; IF EVEN(CHAR) THEN MASK:= 1.SETADDR; LDA 1 +1,3 ; LDA 3 BIT,2 ; TEST:= 1 SHIFT (CHAR//2); LDA 2 CUR ; AND 1,3 SNR ; DA72: ISZ DASV3,2 ; IF TEST AND MASK=0 THEN RETURN+1; JMP@ DASV3,2 ; END ELSE RETURN+1; ;RETURN+0; ;PROCEDURE DELAY ; ; CALL RETURN ;AC0 - UNCH. ;AC1 - DEST. ;AC2 CUR CUR ;AC3 LINK DEST. DA75: STA 3 DASV3,2 ; LDA 2 .9 ; WAITINTERRUPT(RTC,180 MS); LDA 1 .0 ; WAITINTERRUPT ; RETURN JMP@ DASV3,2 ; «ff» ; PROCEDURE GETBUF(BUF); ; AC0 - - ; AC1 HEAD HEAD ; AC2 CUR CUR ; AC3 LINK BUF ; RETURN: ; +0: BUFFER, WITH SENDER=DASERVER FOUND. ; +1: BUFFER NOT FOUND DA32: INC 3,3 ; GETBUF: STA 3 DASV3,2 ; CBUF:= HEAD; MOV 1,3 ; DA33: LDA 0 DASERVER,2; REPEAT LDA 3 NEXT,3 ; CBUF:=CBUF.NEXT; SUB# 1,3 SNR ; JMP@ DASV3,2 ; LDA 2 SENDER,3 ; SUB 2,0 ; IF SERVER=SENDER THEN LDA 2 CUR ; RETURN(+0); MOV 0,0 SZR ; JMP DA33 ; UNTIL NEXT.CBUF= HEAD; DSZ DASV3,2 ; JMP@ DASV3,2 ; RETURN(+1); «ff» ;PROCEDURE GENWAIT(DEVICE) ; ; CALL RETURN ; AC0 - UNCH. ; AC1 DEVICE DEST. ; AC2 CUR CUR ; AC3 LINK DEST. ; +0: TIMEOUT AFTER 1 SEK/ 10 SEK (OUTPUT) ; +1: INTERRUPT FROM DEVICE ; DA51: STA 3 DASV1,2 ; WAITGEN2: LDA 3 .120 ; INT.TIME:= 120; JMP DA53 ; DA50: STA 3 DASV1,2 ; WAITGEN1: LDA 3 .10 ; DA53: ISZ DASV1,2 ; INT.TIME:= 10; STA 0 DASV3,2 ; STA 3 DACON,2 ; STA 1 DASV2,2 ; SAVE(DEVICE); DA52: LDA 1 DASV2,2 ; REPEAT LDA 2 .5 ; WAITINTERRUPT ; WAITINTERRUPT(UNSAVE(DEVICE), 5*20 MS); JMP .+2 ; +1: RETURN(+1); JMP @DASV1,2 ; JSR DA60 ; RETURNTIMEOUTS; LDA 0 DASV3,2 ; DSZ DACON,2 ; UNTIL DECR(INT.TIME) = 0; JMP DA52 ; DSZ DASV1,2 ; RETURN(+0); JMP@ DASV1,2 ; «ff» ;PROCEDURE RETURNTIMEOUTS ; ; CALL RETURN ; AC0 - DEST. ; AC1 - DEST. ; AC2 CUR CUR ; AC3 LINK DEST. ; DA60: DSZ DATIME,2 ; RETURNTIMEOUTS: JMP +0,3 ; IF DECR(TIME) = 0 THEN STA 3 RESERVER,2 ; BEGIN LDA 3 DAIQ,2 ; CBUF:= HEAD:= INPUTQUEUE; DA62: LDA 3 NEXT,3 ; REPEAT DA63: LDA 1 DAIQ,2 ; CBUF:= NEXT.CBUF; SUB 3,1 SNR ; JMP DA64 ; LDA 1 BUF,2 ; SUB 3,1 SNR ; IF CBUF<> BUF.CUR THEN JMP DA62 ; DSZ MESS3,3 ; IF DECR(MESS3.BUF) = 0 THEN JMP DA62 ; LDA 0 MESS0,3 ; MOV 0,0 SNR ; IF MESS0.BUF <> 0 THEN JMP DA62 ; BEGIN LDA 1 NEXT,3 ; SAVE(CBUF.NEXT); STA 1 DATIME,2 ; SUB 1,1 ; LDA 0 STIME ; MOV 3,2 ; SENDANSWER(TIMEOUT,0,CBUF); SENDANSWER ; MOV 3,2 ; LDA 3 DATIME,2 ; UNTIL NEXT.CBUF= HEAD; JMP DA63 ; ; DA64: LDA 0 .10 ; STA 0 DATIME,2 ; TIME:= 10; JMP@ RESERVER,2 ; END; RETURN; «ff» DA40: ; ATTENTION: LDA 1 DAIN,2 ; SETINTERRUPT ; SUB 0,0 ; RESNAME.CUR:='0'; STA 0 RESNAME+0,2; STA 0 RESNAME+1,2; STA 0 RESNAME+2,2; LDA 0 .RES1 ; ADDZL 2,0 ; ADDRESS.CUR:= ; REF.RESNAME-1.CUR; JSR@ DA.22 ; TYPE8; LDA 1 ADDRESS,2 ; STA 1 DASAVE,2 ; SAVE.CUR:=ADDRESS.CUR; LDA 3 .128 ; STA 3 DATIME,2 ; ADC 1,1 ; STA 1 BUF,2 ; ATTENTIONFLAG.CUR:= ATTENTION; JSR@ .DA190 ; INTEXT; JMP .-1 ; +0:TIMER IGNORED; DSZ ADDRESS,2 ; +1: LDA 0 .0 ; LDA 1 ADDRESS,2 ; PUTBYTE(0,ADDRESS.CUR-1); PUTBYTE ; LDA 1 .10 ; STA 1 DATIME,2 ; ; CHECK INPUT MESSAGE; LDA 1 .RESNAME ; ADD 1,2 ; NAMEADDRESS:=RESNAME.CUR; LDA 1 PROCESS ; CHAIN:=PROCESS CHAIN; SEARCHITEM ; SEARCHITEM(NAMEADDRESS,CHAIN,ITEM); STA 2 DASERVER,3; RESERVER.CUR:=ITEM; MOV 2,0 SNR ; IF ITEM=0 THEN JMP DA354 ; GOTO UNKNOWN; LDA 2 CUR ; LDA 1 DAIQ,2 ; JSR DA32 ; GETBUF(BUF); JMP@ .DA160 ; +0: GOTO READ; JSR@ .DA204 ; GOTO RETURN ATTENTION; LDA 0 .9 ; ALARM(BUSY); DA354:LDA 3 DA357 ; ALARM: ADD 3,0 ; ADDR:=BASE+CAUSE; LDA 2 CUR ; JSR@ DA.22 ; TYPE8; JMP@ .DA11 ; GOTO CHECK BUFFER; .RESNAME: RESNAME ; .RES1: RESNAME-1 ; .DA204: DA204 .DA11: DA11 DA.22: DA221 .DA160: DA160 .DA190: DA190 DA357: .+1*2 ; .TXT .UNKNOWN<10><0>BUSY<10><0><29><31>POWER<10>. .ENDC «ff» .DO UNIT<>0 DA100: DA101:LDA 1 PROCESS ; START: LDA 2 .TTY ; SEARCHITEM ; REPEAT SEARCHITEM(PROCESS,TTY,PROC) MOV 2,3 SNR ; UNTIL PROC<>0; JMP DA100 ; LDA 3 BREAD,3 ; LDA 2 CUR ; CUR.BREAK:= PROC.BREAK; STA 3 BREAD,2 ; JMP@ BREAD,2 ; GOTO BREAK; .TTY: .+1 ; .TXT .TTY<0><0>. ; TTY NAME .ENDC «ff» DA0: ; PROCESS DESCRIPTOR: 0 ; NEXT 0 ; PREV 0 ; CHAIN DA2-DA0 ; SIZE "T*256+"T ; NAME .DO UNIT==0 ; "Y*256+0 ; 0 ; .ENDC ; .DO UNIT<>0 ; "Y*256+UNIT+48 ; 0 ; .ENDC DA0+EVENT ; FIRST EVENT DA0+EVENT ; LAST EVENT 0 ; BUFFER DA4 ; PROGRAM 0 ; STATE 0 ; TIMER COUNT 1B0+1B1+1 ; PRIORITY DA100 ; BREAK ADDRESS DA0 ; AC0 0 ; AC1 DA0 ; AC2 0 ; AC3 DA101*2 ; PSW 0 ; SAVE ; OPTIONAL: 0 ; BUF 0 ; ADDR 0 ; COUNT 0 ; RESERVER = 0 DAIN=.-DA0 ; TTI ; IN = TTI CLEAR ; INTERRUPT CLEAR 13*256+62 ; CR > RESNAME=.-DA0 ; RESNAME; .BLK 3 DASERVER=.-DA0 ; 0 ; DAOUT=.-DA0 ; TTO ; OUT = TTO DAATT=.-DA0 ; DEVTA+TTI ; ADDR(DEVTA(DAIN) DASAVE=.-DA0 ; SAVECELL 0 ; DALINK=.-DA0 ; LINK 0 ; DANIOS=.-DA0 ; NIOS TTI ; JMP +0,3; DADIAS=.-DA0 ; DIAS 0 TTI ; DIA(TTI,AC0) JMP +0,3 ; RETURN DADOAS=.-DA0 ; DOAS 0 TTO ; DOAS(TTO,AC0) JMP +0,3 ; RETURN DATIME=.-DA0 ; VAR. TIMEOUT; 0 DASV1= .-DA0 ; SAVE NO 1 0 DASV2=.-DA0 ; SAVE NO 2; 0 DASV3=.-DA0 ; SAVE NO 3 0 ; DACON=.-DA0 ; CONTROL TIMER 0 ; DALAST=.-DA0 ; LAST TYPED CHAR 0 ; DAIQ=.-DA0 ; INPUTQUEUE: .+1 ; ADDRESS .+0 ; NEXT .-1 ; PREV DAAQ=.-DA0 ; ATTENTIONQUEUE: .+1 ; ADDRESS .+0 ; NEXT .-1 ; PREV DA2: ; TOP OF PROCESS DESCRIPTOR: ; ****** END OF TELETYPE CONSOLE DRIVER ****** .END DA0 «ff» ; TOP OF PROCESS DESCRIPTOR: ; ****** END OF TELETYPE CONSOLE DRIVER ****** .END DA0 «ff» «nul»