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

⟦07c27b61a⟧ TextFile

    Length: 27136 (0x6a00)
    Types: TextFile
    Notes: RCSL-43-GL-8235, RCSL-43-GL-8236
    Names: »YTT09«

Derivation

└─⟦45bd0f8dd⟧ Bits:30000464 DOMUS disk image
    └─ ⟦this⟧ »/YTT09« 
└─⟦6dbcc9c03⟧ Bits:30000463 DOMUS disk image
    └─ ⟦this⟧ »/YTT09« 
└─⟦a2e222af0⟧ Bits:30001626 DOMUS disk image
    └─ ⟦this⟧ »/YTT09« 

TextFile

;					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»