|
|
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: 27136 (0x6a00)
Types: TextFile
Notes: RCSL-43-GL-8235, RCSL-43-GL-8236
Names: »YTT09«
└─⟦45bd0f8dd⟧ Bits:30000464 DOMUS disk image
└─⟦this⟧ »/YTT09«
└─⟦6dbcc9c03⟧ Bits:30000463 DOMUS disk image
└─⟦this⟧ »/YTT09«
└─⟦a2e222af0⟧ Bits:30001626 DOMUS disk image
└─⟦this⟧ »/YTT09«
; 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»