DataMuseum.dk

Presents historical artifacts from the history of:

CR80 Hard and Floppy Disks

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

See our Wiki for more about CR80 Hard and Floppy Disks

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦145685bf4⟧ TextFile

    Length: 20480 (0x5000)
    Types: TextFile
    Names: »S8DOC«

Derivation

└─⟦cb65a69e7⟧ Bits:30005484 8" CR80 Floppy CR80FD_0203 ( CR/D/0986 )
    └─⟦990125f75⟧ 
        └─ ⟦this⟧ »JAS.S8DOC« 

TextFile

; CR80 SYSTEM ONE
; DRIVER

; MODULE: DOC - DRIVER, OPERATOR'S CONSOLE (SILENT 700)

BEGIN MODULE MYPROC MESSAGE <:DOC:> ; BEGIN MODULE: DOC;
GLOBAL NL,LF,CR,BYTE,MADDRESS,WORK,PROGRAM,C,DEVICE
GLOBAL BMTIMER,BMERROR,INTERRUPT,ADJUST,CBASE,BS,EM,CAN,DEL
GLOBAL GETBYTE,PUTBYTE,WAITINTERRUPT
GLOBAL CUREVENT,BNIGNR,STATE,NAMEBYTES
USE BASE

OBJECT  S8DOCB
NOLIST  SOURCE S8MNAX LIST
XPD:=   DRIVERLENGTH
NOLIST  SOURCE S8MXPX LIST

DEV:=         1
PR:=          0
MYBASE:=     #1500
MYPROC:=      MYBASE+ITEM

BNINREADY:=   10
BNOUTREADY:=  11
;             12  ; OVERRUN
BNBREAK:=     13  ; DEVICE-FAILURE
;             14  ; PARITY

AHEADS:=      32
ASAVE=        LOC*2
              0 REPEAT (AHEADS-1)/2

LOC=          LOC-WORK
WLINK0:       0
WLINK1:       0
WLINK2:       0
WMODE:        0
WAHEAD:       0
WLAST:        0
WANY:         TRUE
WECHO:        TRUE
WBREAK:       FALSE
WSEARCHED:    FALSE
WINPUT:       FALSE
WBUSY:        FALSE
LOC=          LOC+WORK

WPROMPT:=     LOC-WORK
PROMPT:       0
ZERO:
ATTMESS:      0
OUTUSER:      <:<7>-> :>
WARROW=       OUTUSER*2+1-WORK
USER:         0 REPEAT IDLENGTH-1,0
WIDENT:=      USER+NAMEIDENT-WORK
SEND:         0 REPEAT IDLENGTH-1

USE PROG

; PROCEDURE SENSE DEVICE(STATUS,CHAR),(ERROR);
; SENSES THE DEVICE STATUS AND REFLECTS THE SWOPPED STATUS BACK TO
; THE DEVICE. EXTRACTS THE ACTIVE STATUS BITS. DETECTS A POSSIBLE BREAK.
;       CALL:        EXIT:
; R0                 CHAR
; R1                 STATUS
; R5    LINK         UNDEFINED
; R7    WORK         WORK
; LINK0+1            ERROR
; LINK+0             RETURN
BEGIN USE PROG
EXTERNAL WLINK0,WAHEAD,WBREAK,BNBREAK,BNINREADY,R157
EXTERNAL ASAVE,WLAST,AHEADS
ENTRY P10,G10,P11

USE BASE
LOC=          LOC-WORK
WSAVE6:       0                     ; SAVE R6
LOC=          LOC+WORK
USE PROG

P11:                                ; SENSE DEVICE(*,*,CONTINUE):
        MOV          R5  WLINK0.X7  ;   LINK
        DEC              WLINK0.X7  ;       -1 =>LINK0;
P10:                                ; SENSE DEVICE:
        MOV   CUREVENT-C        R0  ;   CURRENT EVENT.CUR =>EVENT;
        JOZ          R0  A1         ;   IF EVENT<>0 THEN
        SUB   CBASE-C           R0  ;
        IBN   STATE. X0  BNIGNR     ;     IF STATE.EVENT[IGNR] THEN
        JMP              R157       ;       GOTO DUMMY RETURN;
A1:     MOV   DEVICE-C          R0  ;   DEVICE.CUR =>DEVICE;
        SIO          R1         R0  ;   SENSE(STATUS,DEVICE);
        SWP                     R1  ;
        CIO          R1         R0  ;   CONTROL(SWOP(STATUS),DEVICE);
        RIO          R0         R0  ;   READ(CHAR,DEVICE);
        XTR          R0  7          ;   CHAR[6:7] =>CHAR;
        SLL          R1  8          ;   0 =>STATUS[7:8];
        XTR          R1  15         ;   STATUS[14:15] =>STATUS;
        MOV          R6  WSAVE6.X7  ;   SAVE(R6);
        MOV   WAHEAD.X7         R6  ;   AHEAD.WORK =>AHEAD;
        ILO          R6  AHEADS     ;   IF AHEAD<AHEADS
        SBN          R1  BNINREADY  ;       AND STATUS[IN READY] THEN
        JMP              A2         ;     BEGIN
        INC              WAHEAD.X7  ;       INCR(AHEAD.WORK);
        ADD   WLAST. X7         R6  ;       LAST.WORK+AHEAD =>AHEAD;
        IHS          R6  AHEADS     ;       IF AHEAD>=AHEADS THEN
        ADDC -AHEADS            R6  ;         AHEAD-AHEADS =>AHEAD;
        MOVB         R0  ASAVE. X6  ;       CHAR =>BYTE.AHEAD.SAVE
A2:                                 ;     END;
        MOV   WSAVE6.X7         R6  ;   RESTORE(R6);
        SLO          R1  1<12       ;   IF STATUS[15:12]=0
        IBZ          R1  BNINREADY  ;       OR NOT STATUS[IN READY] THEN
        JMP              0.     X5  ;     RETURN;
        JON          R0  G10        ;   IF CHAR=0 THEN
        IBNP         R1  BNBREAK    ;     IF STATUS[BREAK] THEN
                                    ;       BEGIN
        CLR              WAHEAD.X7  ;         0 =>AHEAD.WORK;
        MOV          R7  WBREAK.X7  ;         TRUE =>BREAK.WORK
                                    ;       END;
G10:    MOV   WLINK0.X7         R5  ; ERROR RETURN:
        JMP              1.     X5  ;   GOTO ERROR.LINK0;
END                                 ; END OF SENSE DEVICE;

; PROCEDURE TYPE CHAR(CHAR),(TIMEOUT,ERROR);
; WRITES THE CHARACTER ON THE CONSOLE.
;       CALL:        EXIT:
; R0                 DESTROYED
; R1                 DESTROYED
; R3    CHAR         CHAR
; R4                 DESTROYED
; R5    LINK         DESTROYED
; R7    WORK         WORK
; LINK0+0            TIMEOUT
; LINK0+1            ERROR
; LINK+0             RETURN
BEGIN USE PROG
EXTERNAL P10,P50,P51,P53,P61,G50,WLINK0,WLINK1,BNOUTREADY,WINPOS,WECHO
EXTERNAL WMODE,PROMPT
ENTRY P20,WPOS

USE BASE
LOC=          LOC-WORK
WPOS:         0                     ; POSITION ON LINE
WMAX:         80                    ; MAX POSITION
WSAVE3:       0                     ; SAVE CHAR
LOC=          LOC+WORK
USE PROG

P20:    MOV   WECHO. X7         R0  ; TYPE CHAR:
        JON          R0  A20        ;   IF NOT ECHO.WORK THEN
        JMP              0.     X5  ;     RETURN;
A20:    MOV          R5  WLINK1.X7  ;   SAVE(LINK);
        MOV          R3  WSAVE3.X7  ;   SAVE(CHAR);
        IEQ          R3  NL         ;   IF CHAR=NL THEN
        MOVC  CR                R3  ;     CR =>CHAR;
        IEQP         R3  CR         ;   IF CHAR=CR THEN
                                    ;     BEGIN
        MOVC  8                 R4  ;       8 =>LOOP;
        JMP              L1         ;       GOTO SENSE IT
                                    ;     END;
        MOVC  1                 R4  ;   1 =>LOOP;
        MOV   WPOS.  X7         R0  ;   POS.WORK =>POS;
        JOZ          R3  L11        ;   IF CHAR=0 THEN
                                    ;     GOTO TEST POSITION;
        IEQP         R3  BS         ;   IF CHAR=BS THEN
                                    ;     BEGIN
        DEC              WPOS.  X7  ;       DECR(POS.WORK);
        JON          R0  L11        ;       IF POS<>0 THEN
                                    ;         GOTO TEST POSITION
                                    ;     END;
        INC              WPOS.  X7  ;   INCR(POS.WORK);
L11:                                ; TEST POSITION:
        MOV   WSAVE3.X7         R3  ;   RESTORE(CHAR);
        XCH          R4         R0  ;   SAVE(LOOP);
        MOV          R6         R1  ;   SAVE(R6);
        JON          R4  A12        ;   IF POS=0 THEN
        MOV   WMODE. X7         R4  ;     IF MODE.WORK
        JOZ          R4  A12        ;         <>0 THEN
        MOVC  PROMPT            R6  ;       IF 0.PROMPT
        JOZ   0.     X6  A12        ;           <>0 THEN
        MOV   WLINK0.X7         R4  ;         IF NOT CALLED
        MOVC  G50               R5  ;             FROM
        INE          R4         R5  ;             TYPE TEXT THEN
        JMP          S5  P50        ;           TYPE TEXT(PROMPT);
A12:    MOV   WPOS.  X7         R5  ;   POS.WORK =>POS;
        MOV   WMAX.  X7         R6  ;   MAX.WORK =>MAX;
        SLO          R6         R5  ;   IF POS>MAX THEN
        JMP              A13        ;     BEGIN
        JMP          S5  P53        ;       TYPE NL;
        JMP          S6  A11        ;       RE.
        <:       <92><0>:>          ;           "       <92><0>" =>ADDR;
A11:    JMP          S5  P51        ;       TYPE PROG TEXT(ADDR)
A13:                                ;     END;
        MOV          R1         R6  ;   RESTORE(R6);
        MOV          R0         R4  ;   RESTORE(LOOP);
        MOV          R3  WSAVE3.X7  ;   SAVE(CHAR);
        JON          R3  L1         ;   IF CHAR<>0 THEN
                                    ;     GOTO SENSE IT;
        JMPI             WLINK1.X7  ;   RETURN;
L1:                                 ; SENSE IT:
        JMP          S5  P10        ;   SENSE DEVICE(STATUS,IRR,
                                    ;     ERROR: GOTO ERROR.LINK0);
        IBZP         R1  BNOUTREADY ;   IF NOT STATUS[OUTPUT READY] THEN
                                    ;     BEGIN
        JMP          S5  P61        ;       WAIT IT(50,
                                    ;         TIMOUT: GOTO TIMOUT.LNK0);
        JMP              L1         ;       GOTO SENSE IT
                                    ;     END;
        IEQ          R4  7          ;   IF LOOP=7 THEN
        MOV   WSAVE3.X7         R3  ;     RESTORE(CHAR);
        IEQ          R4  6          ;   IF LOOP=6 THEN
        MOVC  0                 R3  ;     0 =>CHAR;
        MOV   DEVICE-C          R1  ;
        WIO          R3         R1  ;   WRITE(CHAR,DEVICE.CUR);
        SOB          R4  L1         ;   IF DECR(LOOP)<>0 THEN
                                    ;     GOTO SENSE IT;
        JON          R3  A2         ;   IF CHAR<>0 THEN
                                    ;     RETURN;
        MOV   WSAVE3.X7         R3  ;   RESTORE(CHAR);
        MOV   WPOS.  X7         R0  ;
        MODC  WINPOS                ;   INPOS.WORK
        SUB          R0  0.     X7  ;       -POS.WORK =>INPOS.WORK;
        CLR              WPOS.  X7  ;   0 =>POS.WORK;
A2:     JMPI             WLINK1.X7  ;   RETURN;
END                                 ; END OF TYPE CHAR;

; PROCEDURE TYPE IN(COUNT,CHAR,ADDR),(TIMEOUT,ERROR);
; READS A STRING OF CHARACTERS AND STORES THEM AT ADDR AND ON.
; THE VARIABLES, ADDR AND COUNT, ARE INCREMENTED AND DECREMENTED
; ACCORDINGLY. THE CHARACTERS ARE ECHOED BY MEANS OF TYPE CHAR.
; THE FOLLOWING CHARACTERS HAVE SPECIAL MEANINGS:
;   LF  LINE FEED: THE CHARACTER IS REPLACED BY A CR CHARACTER.
;         THE TEXT, "*CR<10>", IS OUTPUT.
;   CR  CARRIAGE RETURN: THE CHARACTER IS REPLACED BY NL(=LF).
; READING IS TERMINATED WHEN COUNT BECOMES ZERO OR WHEN A CR CHARACTER
; IS READ.
;       CALL:        EXIT:
; R0                 DESTROYED
; R1                 DESTROYED
; R2    COUNT        COUNT (UPDATED)
; R3                 CHAR (LAST INPUT)
; R4                 DESTROYED
; R5    LINK         DESTROYED
; R6    ADDR         ADDR (UPDATED)
; R7    WORK         WORK
; LINK+0             TIMEOUT
; LINK+1             ERROR
; LINK+2             RETURN
BEGIN USE PROG
EXTERNAL P10,G10,P11,P20,P51,P51P52,P52,P60,P61
EXTERNAL WLINK0,WBREAK,BNINREADY,WPOS,BNOUTREADY,WAHEAD
EXTERNAL ASAVE,WLAST,AHEADS
ENTRY P30,G30,G31,WINPOS

USE BASE
LOC=          LOC-WORK
WCANCEL:      FALSE                 ; CANCEL
WSAVE3:       0                     ; SAVE R3
WCOUNT:       0                     ; COUNT
WADDR:        0                     ; ADDR
WINPOS:       0                     ; IN POSITION ON LINE
LOC=          LOC+WORK
USE PROG

P30:                                ; TYPE IN:
        MOV          R5  WLINK0.X7  ;   SAVE(LINK);
        MOVC  0                 R3  ;
        JMP          S5  P20        ;   TYPE CHAR(0);
        MOV          R6  WADDR. X7  ;   ADDR =>ADDR.WORK;
        MOV          R2  WCOUNT.X7  ;   COUNT =>COUNT.WORK;
        MOV   WPOS.  X7         R4  ;   POS.WORK
        MOV          R4  WINPOS.X7  ;       =>INPOS.WORK;
L1:                                 ; NEXT IN:
        MOV   WAHEAD.X7         R5  ;   AHEAD.WORK =>AHEAD;
        JOZ          R5  L8         ;   IF AHEAD=0 THEN
                                    ;     GOTO SENSE IT;
        MOV   WLAST. X7         R5  ;   LAST.WORK =>LAST;
        MOVB  ASAVE. X5         R3  ;   BYTE.LAST.SAVE =>CHAR;
        DEC              WAHEAD.X7  ;   DECR(AHEAD.WORK);
        INC              WLAST. X7  ;   INCR(LAST.WORK);
        IEQ          R5  AHEADS-1   ;   IF LAST=AHEADS-1 THEN
        CLR              WLAST. X7  ;     0 =>LAST.WORK;
        JMP              L3         ;   GOTO TEST CHAR;
                                    ;     GOTO TEST CHAR;
L8:     MOV   WLINK0.X7         R4  ;*SENSE IT:
        JMP          S5  P11        ;*  SENSE DEVICE(STATUS,CHAR,
        MOV          R4  WLINK0.X7  ;*    ERROR: CONTINUE);
        CLR              WAHEAD.X7  ;   0 =>AHEAD.WORK;
        MOV          R0         R3  ;
        MOV   WCOUNT.X7         R0  ;   IF COUNT.WORK
        INE          R2         R0  ;       <>COUNT THEN
        MODC #7F00                  ;     #7F00 =>DELAY
        MOVC  50                R0  ;   ELSE 50 =>DELAY;
        IBZP         R1  BNINREADY  ;   IF NOT STATUS[INPUT READY] THEN
                                    ;     BEGIN
        JMP          S5  P60        ;       WAIT IT(DELAY,
                                    ;         TIMOUT: GOTO TIMOUT.LINK);
        JMP              L1         ;       GOTO NEXT IN
                                    ;     END;
L3:                                 ; TEST CHAR:
        MOV   WBREAK.X7         R4  ;   IF BREAK.WORK THEN
        JON          R4  L2         ;     GOTO DELETE;
        IEQ          R3  CAN        ;   IF CHAR=CAN THEN
        JMP              L4         ;     GOTO CANCEL;
        INE          R3  DEL        ;   IF CHAR<>DEL THEN
        JMP              L5         ;     GOTO TEST CANCEL;
L2:                                 ; DELETE:
        JMP          S6  A3         ;   RE.
        <:*DL<10><0>:>              ;       "*DL<10>" =>ADDR;
A3:     MOV   WCOUNT.X7         R5  ;
        INEP         R5         R2  ;   IF COUNT.WORK<>COUNT THEN
                                    ;     BEGIN
        CLR              WPOS.  X7  ;       0 =>POS.WORK;
        JMP          S5  P51        ;       TYPE PROG TEXT(ADDR)
                                    ;     END;
        MOV   WPOS.  X7         R4  ;   POS.WORK
        MOV          R4  WINPOS.X7  ;       =>INPOS.WORK;
        MOV   WADDR. X7         R6  ;   ADDR.WORK =>ADDR;
        MOV   WCOUNT.X7         R2  ;   COUNT.WORK =>COUNT;
        MOV   WBREAK.X7         R3  ;   IF NOT BREAK.WORK THEN
        JOZ          R3  L1         ;     GOTO NEXT IN;
        JMP              G10        ;   GOTO ERROR RETURN;
L4:     MOV   WCOUNT.X7         R1  ; CANCEL:
        IEQ          R1         R2  ;   IF COUNT.WORK=COUNT THEN
        JMP              L1         ;     GOTO NEXT IN;
        MOV   ADJUST-C          R1  ;   IF ADJUST.CUR
        JON          R1  A41        ;       <>0
        IHS          R2 -NAMEBYTES  ;       OR COUNT>=-NAMEBYTES THEN
A41:    ADDC -1                 R6  ;     DECR(ADDR);
        MOV          R6         R1  ;   SAVE(ADDR);
        MON   GETBYTE               ;   GET BYTE(ADDR,CHAR);;
        SNE          R3  BS         ;   IF CHAR<>BS THEN
        JMP              A42        ;     BEGIN
        JMP          S6  A4         ;       RE.
        <:<8>X<8><0>:>              ;           "<BS>X<BS>" =>ADDR;
A4:     MODC             P51P52     ;         TYPE PROG TEXT(ADDR)
A42:                                ;     END
        JMP          S5  P52        ;   ELSE TYPE SPACE;
        MOV          R1         R6  ;   RESTORE(ADDR);
        MOV          R7  WCANCL.X7  ;   TRUE =>CANCEL.WORK;
        ADDC  1                 R2  ;   INCR(COUNT);
        JMP              L1         ;   GOTO NEXT IN;
L5:                                 ; TEST CANCEL:
        MOV   WCANCL.X7         R1  ;   CANCEL.WORK =>CANCEL;
        JOZ          R1  L6         ;   IF NOT CANCEL THEN
                                    ;     GOTO ECHO IT;
        MOV          R3  WSAVE3.X7  ;   SAVE(CHAR);
        MOVC  LF                R3  ;
        MOV   DEVICE-C          R1  ;
        WIO          R3         R1  ;   WRITE(LF,DEVICE.CUR);
        MOV   WSAVE3.X7         R3  ;   RESTORE(CHAR);
        CLR              WCANCL.X7  ;   FALSE =>CANCEL.WORK;
L6:     MOV   WINPOS.X7         R1  ; ECHO IT:
        MOV   WPOS.  X7         R5  ;
        IEQP         R3  BS         ;   IF CHAR=BS THEN
        IGE          R1         R5  ;     IF POS.WORK<=INPOS.WORK THEN
        JMP              L1         ;       GOTO NEXT IN;
        SEQ          R3  LF         ;   IF CHAR=LF THEN
        JMP              A51        ;     BEGIN
        MOV          R6         R1  ;       SAVE(ADDR);
        CLR              WPOS.  X7  ;       0 =>POS.WORK;
        JMP          S6  A5         ;       RE.
        <:*CR<10><0>:>              ;           "*CR<10>" =>ADDR;
A5:     JMP          S5  P51        ;       TYPE PROG TEXT(ADDR);
        CLR              WINPOS.X7  ;       0 =>INPOS.WORK;
        MOV          R1         R6  ;       RESTORE(ADDR);
        MOVC  CR                R3  ;       CR =>CHAR;
        JMP              L7         ;       GOTO PUT IT
A51:                                ;     END;
        IEQ          R3  CR         ;   IF CHAR=CR THEN
        MOVC  NL                R3  ;     NL =>CHAR;
        JMP          S5  P20        ;   TYPE CHAR(CHAR,
                                    ;     TIMEOUT: GOTO TIMEOUT.LINK,
                                    ;     ERROR:   GOTO ERROR.LINK);
L7:                                 ; PUT IT:
        MOV   ADJUST-C          R0  ;   IF ADJUST.CUR
        JON          R0  A7         ;       =0 THEN
        MOV   WADDR. X7         R0  ;     IF ADDR.CUR
        SUB          R6         R0  ;         -ADDR
        IEQP         R0 -NAMEBYTES  ;         <-NAMEBYTES THEN
        INE          R3  NL         ;       IF CHAR<>NL THEN
        ADDC -1                 R6  ;         DECR(ADDR);
A7:     MON   PUTBYTE               ;   PUT BYTE(ADDR,CHAR);
        ADDC  1                 R6  ;   INCR(ADDR);
        SEQ          R3  EM         ;   IF CHAR=EM
        IEQ          R3  NL         ;       OR CHAR=NL THEN
        JMP              G31        ;     GOTO COUNT RETURN;
        SOB          R2  L1         ;   IF DECR(COUNT)<>0 THEN
                                    ;     GOTO NEXT IN;
        JMP              G30        ;   GOTO TYPE RETURN;
G31:                                ; COUNT RETURN:
        ADDC -1                 R2  ;   DECR(COUNT);
G30:                                ; TYPE RETURN:
        JMP          S5  P10        ;   SENSE DEVICE(STATUS,IRR,
                                    ;     ERROR: GOTO ERROR.LINK0);
        IBZ          R1  BNOUTREADY ;   IF NOT STATUS[OUTPUT READY] THEN
        JMP          S5  P61        ;     WAIT IT(50,
                                    ;       TIMEOUT: GOTO TIMEOUT.LINK);
        MOV   WLINK0.X7         R5  ;
        JMP              2     .X5  ;   RETURN(LINK);
END                                 ; END OF TYPE IN;

; PROCEDURE TYPE OUT(COUNT,CHAR,ADDR),(TIMEOUT,ERROR);
; WRITES A STRING OF CHARACTERS FROM ADDR AND ON. THE VARIABLES,
; ADDR AND COUNT, ARE INCREMENTED AND DECREMENTED ACCORDINGLY. THE
; CHARACTERS ARE WRITTEN BY MEANS OF TYPE CHAR.
;       CALL:        EXIT:
; R0                 DESTROYED
; R1                 DESTROYED
; R2    COUNT        COUNT (UPDATED)
; R3                 CHAR (LAST OUTPUT)
; R4                 DESTROYED
; R5    LINK         DESTROYED
; R6    ADDR         ADDR (UPDATED)
; R7    WORK         WORK
; LINK+0             TIMEOUT
; LINK+1             ERROR
; LINK+2             RETURN
BEGIN USE PROG
EXTERNAL P20,G30,G31,WLINK0
ENTRY P40
P40:                                ; TYPE OUT:
        MOV          R5  WLINK0.X7  ;*  SAVE(LINK);
L1:                                 ; NEXT OUT:
        MON   GETBYTE               ;   GET BYTE(ADDR,CHAR);
        JMP          S5  P20        ;   TYPE CHAR(CHAR,
                                    ;     TIMEOUT: GOTO TIMEOUT.LINK,
                                    ;     ERROR:   GOTO ERROR.LINK);
        ADDC  1                 R6  ;   INCR(ADDR);
        JOZ          R3  G31        ;   IF CHAR=0 THEN
                                    ;     GOTO COUNT RETURN;
        SOB          R2  L1         ;   IF DECR(COUNT)<>0 THEN
                                    ;     GOTO NEXT OUT;
        JMP              G30        ;   GOTO TYPE RETURN;
END                                 ; END OF TYPE OUT;

R157:   JMP              L157       ; RE.DUMMY RETURN

; PROCEDURE TYPE NL;
; TYPES A NL CHARACTER, USING TYPE PROG TEXT.
;       CALL:        EXIT:
; R4                 DESTROYED
; R5    LINK         DESTROYED
; R6                 DESTROYED
; R7    WORK         WORK
BEGIN USE PROG
EXTERNAL P51
ENTRY P53
P53:                                ; TYPE NL:
        JMP          S6  P51        ;   RE."<10>" =>ADDR;
        <:<10><0>:>                 ;   GOTO TYPE PROG TEXT;
END                                 ; END OF TYPE NL;

; PROCEDURE TYPE SPACE;
; TYPES A SPACE, USING TYPE PROG TEXT.
;       CALL:        EXIT:
; R4                 DESTROYED
; R5    LINK         DESTROYED
; R6                 DESTROYED
; R7    WORK         WORK
BEGIN USE PROG
EXTERNAL P51
ENTRY P52
P52:                                ; TYPE SPACE:
        JMP          S6  P51        ;   RE." " =>ADDR;
        <: <0>:>                    ;   GOTO TYPE PROG TEXT;
END                                 ; END OF TYPE SPACE;

; PROCEDURE TYPE PROG TEXT(ADDR);
; ADDR IS CHANGED FROM BEING A PROG-RELATIVE WORD-ADDRESS TO A
; BASE-RELATIVE WORD-ADDRESS. THE PROCEDURE CONTINUES WITH TYPE TEXT.
;       CALL:        EXIT:
; R4                 DESTROYED
; R5    LINK         DESTROYED
; R6    ADDR         ADDR (CHANGED AND UPDATED)
; R7    WORK         WORK
BEGIN USE PROG
EXTERNAL
ENTRY P51
P51:                                ; TYPE PROG TEXT:
        MOD   PROGRAM-C             ;   PROGRAM.CUR
        MODN  CBASE-C               ;       -BASE.CUR      ORELSE
                                    ;*  CONTINUE WITH TYPE TEXT;
END                                 ; END OF TYPE PROG TEXT;

P51P52:=P51-P52

; PROCEDURE TYPE TEXT(ADDR);
; ADDR IS CHANGED FROM BEING A WORD-ADDRESS TO A BYTE-ADDRESS. THE
; PROCEDURE TYPES THE TEXT BY MEANS OF TYPE OUT.
;       CALL:        EXIT:
; R4                 DESTROYED
; R5    LINK         DESTROYED
; R6    ADDR         ADDR (CHANGED AND UPDATED)
; R7    WORK         WORK
BEGIN USE PROG
EXTERNAL G4,P40,WLINK0,WLINK2
ENTRY P50,G50

USE BASE
LOC=          LOC-WORK
WSAVEA:       0                     ; SAVE ADJUST
WSAVEL:       0                     ; SAVE LINK0
              0                     ; SAVE LINK1
WSAVE0:       0                     ; SAVE R0
              0                     ; SAVE R1
WSAVE2:       0                     ; SAVE R2
              0                     ; SAVE R3
LOC=          LOC+WORK
USE PROG

P50:                                ; TYPE TEXT:
        MOVC  0                 R4  ;*  0 =>ADJUST;
        MOV          R5  WLINK2.X7  ;   SAVE(LINK);
        MOVL         R01 WSAVE0.X77 ;   SAVE(R0,R1);
        MOVL         R23 WSAVE2.X77 ;   SAVE(R2,R3);
        MOVL  WLINK0.X77        R01 ;   SAVE(LINK0,
        MOVL         R01 WSAVEL.X77 ;       ,LINK1);
        MOV   ADJUST-C          R0  ;
        MOV          R0  WSAVEA.X7  ;   SAVE(ADJUST.CUR);
        MOV          R4  ADJUST-C   ;   ADJUST =>ADJUST.CUR;
        MOVC  100               R2  ;   100 =>COUNT;
        ADD          R6         R6  ;   ADDR+ADDR =>ADDR;
        JMP          S5  P40        ;   TYPE OUT(COUNT,IRR,ADDR,
G50:    JMP              G4         ;     TIMEOUT: GOTO BREAK,
        JMP              G4         ;     ERROR:   GOTO BREAK);
        MOV   WSAVEA.X7         R0  ;
        MOV          R0  ADJUST-C   ;   RESTORE(ADJUST.CUR);
        MOVL  WSAVEL.X77        R01 ;   RESTORE(LINK0,
        MOVL         R01 WLINK0.X77 ;       LINK1);
        MOVL  WSAVE2.X77        R23 ;   RESTORE(R2,R3);
        MOVL  WSAVE0.X77        R01 ;   RESTORE(R0,R1);
        JMPI             WLINK2.X7  ;   RETURN;
END                                 ; END OF TYPE TEXT;

; PROCEDURE WAIT IT(DELAY),(TIMEOUT);
;       CALL:        EXIT:
; R0    DELAY        COUNT
; R1                 INTERRUPT.CUR
; R5    LINK         UNDEFINED
; R7    WORK         WORK
BEGIN USE PROG
EXTERNAL WLINK0
ENTRY P60,P61
P61:                                ; WAIT IT(50,*):
        MOVC  50                R0  ;   50 =>DELAY;
P60:                                ; WAIT IT:
        MOV   INTERRUPT-C       R1  ;   INTERRUPT.CUR =>INTRPT;
        MON   WAITINTERRUPT         ;   WAIT INTERRUPT(DELAY,INTRPT,
        JMPI             WLINK0.X7  ;     TIMEOUT:   GOTO TIMEOUT.LINK0,
        JMP              0.     X5  ;     INTERRUPT: RETURN);
END                                 ; END OF WAIT IT;

; REGISTER USE IN THE DRIVER:
; R0    DESTROYED
; R1    DESTROYED
; R2    COUNT
; R3    CHAR
; R4    LOOP.TYPE CHAR
; R5    LINKS
; R6    ADDR
; R7    WORK

L0:                                 ; INIT:
        MON   INITDEVICE            ;   INIT DEVICE(INTERRUPT,DEVICE);
L1:                                 ; ANY USER:
        MOVL  WSEARD.X77        R01 ;   SEARCHED.WORK =>SEARCHED;
        MOV          R7  WSEARD.X7  ;   TRUE =>SEARCHED.WORK;
        JOZ          R0  L111       ;   IF NOT SEARCHED
        JON          R1  L111       ;       OR INPUT.WORK THEN
                                    ;     GOTO INIT QUEUE;
        MOV   WBUSY. X7         R0  ;
        JOZ          R0  A1         ;   IF BUSY.WORK THEN
        JMP              L171       ;     GOTO BUSY;
A1:     MOV   FIRSTEVENT-C      R0  ;   IF FIRST EVENT.CUR=0 THEN
        JOZ          R0  L10        ;     GOTO READY;
        MOV          R7  WANY.  X7  ;   TRUE =>ANY.WORK;
L10:                                ; READY:
        JMP          S5  P11        ;*  SENSE DEVICE(STATUS,IRR,
                                    ;*    ERROR: CONTINUE);
        MOV   INTERRUPT-C       R1  ;   INTERRUPT.CUR =>INTRPT;
        MON   CLEARINTERRUPT        ;   CLEAR INTERRUPT(INTRPT,IRR);
L11:                                ; INSPECT QUEUE:
        CLR              WSEARD.X7  ;   FALSE =>SEARCHED.WORK;
L111:                               ; INIT QUEUE:
        CLR              WINPUT.X7  ;   FALSE =>INPUT.WORK;
        MON   INITWAIT              ;   INIT WAIT;
L12:    MOV   WBREAK.X7         R0  ; NEXT EVENT:
        JOZ          R0  A12        ;   IF BREAK.WORK THEN
        JMP              G4         ;     GOTO BREAK;
A12:    MOVC  10                R0  ;
        MON   SETDELAY              ;   SET DELAY(10);
        MOV   INTERRUPT-C       R1  ;   INTERRUPT.CUR =>INTRPT;
        MON   SETINTERRUPT          ;   SET INTERRUPT(INTRPT);
        MON   WAITNEXT              ;   WAIT NEXT(EVENT,
        JMP              L1         ;     TIME OUT:  GOTO ANY USER,
        TRP              0          ;     ANSWER:    IMPOSSIBLE,
        JMP              L13        ;     MESSAGE:   GOTO MESSAGE,
                                    ;     INTERRUPT: CONTINUE);
        JMP          S5  P11        ;*  SENSE DEVICE(STATUS,IRR,
                                    ;*    ERROR: CONTINUE);
        JMP              L12        ;   GOTO NEXT EVENT;
L13:                                ; MESSAGE:
        MOV   MCOUNT.X7         R2  ;   COUNT.MESS =>COUNT;
        IBN   MOPERN.X7  BNTPUT     ;   IF OPER.MESS[TRANSPUT] THEN
        JMP              L14        ;     GOTO TRANSPUT;
                                    ; CONTROL:
        IBNP  MOPERN.X7  BNRESERVE  ;   IF OPER.MESS[RESERVE] THEN
        MOVC  ITEM      +KIND   R5  ;     COUNT
        SUB   0.     X5         R2  ;         -KIND.CUR =>COUNT;
A15:    JMP              L15        ;   GOTO DONE;
L14:                                ; TRANSPUT:
        JOZ          R2  A15        ;   IF COUNT=0 THEN
                                    ;     GOTO DONE;
        MOVC  SEND              R0  ;
        MON   GETEVENTNAME          ;   GET EVENT NAME(SEND);
        MOVC  USER              R1  ;
        MON   COMPARENAMES          ;   COMPARE NAMES(SEND,USER,
        JMP              L16        ;     UNEQUAL: NOT USER);
        CLR              WBUSY. X7  ;   FALSE =>BUSY.WORK;
        MOV   WSEARD.X7         R0  ;
        JON          R0  A14        ;   IF NOT SEARCHED.WORK
        SBZ   MOPERN.X7  BNOPUT     ;     IF NOT OPER.MESS[OUTPUT] THEN
        JMP              A14        ;       BEGIN
        MOV          R7  WINPUT.X7  ;         TRUE =>INPUT.WORK;
        MON   RESUMEEVENT           ;         RESUME EVENT;
        JMP              L12        ;         GOTO NEXT EVENT
A14:                                ;       END;
        MOV   MCOUNT.X7         R2  ;   COUNT.MESS =>COUNT;
        MON   GETADDRESS            ;   GET ADDRESS(COUNT,ADDR,
        JMP              L158       ;     ILLEGAL: GOTO ILLEGAL);
        MOV   WPROMT.X7         R1  ;   PROMPT.WORK =>OLD;
        MOV   WMODE. X7         R0  ;   IF MODE.WORK<>0 THEN
        JOZ          R0  A141       ;     BEGIN
        IBN   MOPERN.X7  BNOPUT     ;       IF OPER.MESS[OUTPUT] THEN
        MODC  <:  :>    -<:. :>     ;         "  " =>HEAD
        MOVC  <:. :>            R0  ;       ELSE ". " =>HEAD;
        MOV          R0  WPROMT.X7  ;       HEAD =>PROMPT.WORK;
        JOZ          R1  A141       ;       IF OLD<>0 THEN
        SNE          R1         R0  ;         IF OLD<>HEAD THEN
        JMP              A141       ;           BEGIN
        MOV          R6         R1  ;             SAVE(ADDR);
        MOV   WPOS.  X7         R0  ;             POS.WORK =>POS;
        IEQP         R0  2          ;             IF POS=2 THEN
        JMP          S5  P53        ;               TYPE NL;
        MOV          R1         R6  ;             RESTORE(ADDR)
                                    ;           END
A141:                               ;     END;
        IBN   MOPERN.X7  BNNOEC     ;   IF OPER.MESS[NO ECHO] THEN
        CLR              WECHO. X7  ;     FALSE =>ECHO.WORK;
        IBN   MOPERN.X7  BNOPUT     ;*  IF OPER.MESS[OUTPUT] THEN
        MODC -P30       +P40        ;*      TYPE OUT(COUNT,IRR,ADDR,
                                    ;*        TIMEOUT: GOTO TIMER,
                                    ;*        ERROR:   GOTO ERROR)
        JMP          S5  P30        ;*  ELSE TYPE IN(COUNT,IRR,ADDR,
                                    ;*      TIMEOUT: GOTO TIMER,
                                    ;*      ERROR:   GOTO ERROR);
                                    ;*  GOTO DONE;
                                    ;*TIMER:
        MODC  BMTIMER   -BMERROR    ;*  TIMER        ORELSE
                                    ;*ERROR:
        MODC  BMERROR   -0          ;*  ERROR        ORELSE
L15:                                ;*DONE:
        MODC  0         -BMILLEGAL  ;*  0            ORELSE
L158:                               ; ILLEGAL:
        MOVC  BMILLEGAL  ARESUT.X7  ;   ILLEGAL =>RESULT.ANSWER;
        JMP          S5  P11        ;*  SENSE DEVICE(STATUS,IRR,
                                    ;*    ERROR: CONTINUE);
L157:                               ; DUMMY RETURN:
        MON   RETURNANSWER          ;   RETURN ANSWER(STATUS,COUNT);
        MOV          R7  WECHO. X7  ;   TRUE =>ECHO.WORK;
        JMP              L10        ;   GOTO READY;
G4:     MOVC  10                R0  ; BREAK:
        MON   WAITDELAY             ;   WAIT DELAY(10);
        CLR              WBREAK.X7  ;   FALSE =>BREAK.WORK;
        JMP          S5  P11        ;*  SENSE DEVICE(STATUS,
                                    ;*    ERROR: CONTINUE);
        MOV   WBREAK.X7         R0  ;   IF BREAK.WORK THEN
        JON          R0  G4         ;     GOTO BREAK;
        JMP          S5  P53        ;   TYPE NL;
        CLR   USER      -WORK  .X7  ;   0 =>0.USER;
        CLR   PROMPT    -WORK.  X7  ;   0 =>0.PROMPT;
        MOVC  <:=:>             R0  ;   "="
        MOVB         R0  WARROW.X7  ;       =>ARROW.WORK;
        MOVC  OUTUSER           R6  ;   RE.OUTUSER =>ADDR;
        JMP          S5  P50        ;   TYPE TEXT(ADDR);
        CLR   ADJUST-C  -WORK.  X7  ;   0 =>ADJUST.CUR;
        MOVC  USER*2            R6  ;   RE.USER =>ADDR;
L41:                                ; IN NAME:
        MOVC  0                 R2  ;   0 =>COUNT;
        JMP          S5  P30        ;   TYPE IN(COUNT,CHAR,ADDR,
        JMP              L41        ;     TIMEOUT: GOTO IN NAME,
        JMP              G4         ;     ERROR:   GOTO BREAK);
        CLR              WAHEAD.X7  ;   0 =>AHEAD.WORK;
        ADDC -1                 R6  ;   DECR(ADDR);
        MOVC  USER*2+NAMEBYTES+1R2  ;   RE.USER+NAMEBYTES+1
        SUB          R6         R2  ;       -ADDR =>COUNT;
        MOVC  0                 R3  ;   0 =>CHAR;
L6:                                 ; INSERT ZERO:
        MOVB         R3  BYTE.  X6  ;   CHAR =>BYTE.ADDR;
        ADDC  1                 R6  ;   INCR(ADDR);
        SOB          R2  L6         ;   IF DECR(COUNT)<>0 THEN
                                    ;     GOTO INSERT ZERO;
        CLR              WIDENT.X7  ;   0 =>IDENT.WORK;
        MOVC  USER              R0  ;
        MON   SEARCHPROCESS         ;   SEARCH PROCESS(USER,
        JMP              L9         ;     NOT FOUND: GOTO UNKNOWN);
        CLR              WANY.  X7  ;   FALSE =>ANY.WORK;
        MOD   CBASE-C               ;
        INE          R1  ITEM       ;   IF PROC<>ITEM.BASE.CUR THEN
        JMP              L18        ;     GOTO ATTENTION;
        JMP          S6  A6         ;   RE.
        <:.:<0>:>                   ;       ".:" =>ADDR;
A6:     JMP          S5  P51        ;   TYPE PROG TEXT(ADDR);
L61:                                ; IN MODE:
        MOVC  1                 R2  ;   1 =>COUNT;
        MOVC  USER*2            R6  ;   RE.USER =>ADDR;
        JMP          S5  P30        ;   TYPE IN(COUNT,CHAR,ADDR,
        JMP              L61        ;     TIMEOUT: GOTO IN MODE,
        JMP              G4         ;     ERROR:   GOTO BREAK);
        ADDC -<:0:>             R3  ;   CHAR-"0"
        MOV          R3  WMODE. X7  ;       =>MODE.WORK;
        JMP          S5  P53        ;   TYPE NL;
        JMP              L10        ;   GOTO READY;
L18:    MOVC  USER              R0  ; ATTENTION:
        MOVC  ATTMESS           R1  ;   ATTMESS =>MESS;
        MON   SENDMESSAGE           ;   SEND MESSAGE(USER,MESS,EVENT);
        MOVC  50                R0  ;
        MON   SETDELAY              ;   SET DELAY(50);
        MON   WAITANSWER            ;   WAIT ANSWER(EVENT,
        MON   REGRETMESSAGE         ;     TIMEOUT: REGRET MESS(EVENT));
        MOV          R7  WBUSY. X7  ;   TRUE =>BUSY.WORK;
        JMP              L10        ;   GOTO READY;
L171:                               ; BUSY:
        CLR              WBUSY. X7  ;   FALSE =>BUSY.WORK;
        JMP          S6  L20        ;   RE."BUSY" =>ADDR;
        <:BUSY<0>:>                 ;   GOTO TYPE OWN TEXT;
L16:                                ; NOT USER:
        MOV   EVENTSTATUS-C     R2  ;   EVENT STATUS.CUR =>STATE;
        MON   RESUMEEVENT           ;   RESUME EVENT;
        MOV   WANY.  X7         R5  ;
        ILO          R2 #100        ;   IF PRIORITY.STATE=0 THEN
        JOZ          R5  L12        ;     IF NOT ANY.WORK THEN
                                    ;       GOTO NEXT EVENT;
        MOV   WBUSY. X7         R2  ;   IF BUSY.WORK THEN
        JON          R2  L171       ;     GOTO BUSY;
        MOVC  USER              R1  ;
        MODC  IDLENGTH              ;   IDLENGTH =>LENGTH;
        MOVM         X0         X1  ;   MOVEMULT(LENGTH,SEND,USER);
        CLR              WANY.  X7  ;   FALSE =>ANY.WORK;
        JMP          S5  P53        ;   TYPE NL;
        MOVC  <:-:>             R0  ;   "-"
        MOVB         R0  WARROW.X7  ;       =>ARROW.WORK;
        MOVC  OUTUSER           R6  ;   RE.OUTUSER =>ADDR;
        MODC  P50       -P51        ;   TYPE TEXT(ADDR)     ORELSE
L20:                                ; TYPE OWN TEXT:
        JMP          S5  P51        ;   TYPE PROG TEXT(ADDR);
        JMP          S5  P53        ;   TYPE NL;
        JMP              L10        ;   GOTO READY;
L9:                                 ; UNKNOWN:
        JMP          S6  L20        ;   RE."UNKNOWN" =>ADDR;
        <:UNKNOWN<0>:>              ;   GOTO TYPE OWN TEXT;

USE BASE
XNAME0=       <:OC:>
XKIND=        KINDOC OR BMBYTE OR BMDISP
XPRPC=        L0
XDEVPR=       DEV<2+PR
XREFS=        8
XBUFS=        1

NOLIST  SOURCE S8MXPX LIST

END                                 ; END OF MODULE: DOC;
#
«nul»