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

⟦b7f0fa8c9⟧ TextFile

    Length: 39296 (0x9980)
    Types: TextFile
    Names: »S8DOCM«

Derivation

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

TextFile

LIST 78.04.07 09.47
; 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

NOLIST
; S8MNAX
;
; CR80 SYSTEM ONE, NAMES
;
; GENERATED AT 78.04.05
; 00151000 0 000E  LEVEL 2  NAMES:
  ITEMLH=  #0005
  C=       #000D
  BMERRR=  #0020
  BMFULL=  #0400
  BNLOCT=  #000B
  BMSPEL=  #0009
  BNERRR=  #0005
  BNFULL=  #000A
  DISKDS=  #0002
  REALTK=  #0000
  BMBYTE=  #0004
  BMDIST=  #0100
  BMREJT=  #0004
  PROGLH=  #000E
  BNBYTE=  #0002
  BMCONV=  #0010
  BNDIST=  #0008
  BNREJT=  #0002
  BNCONV=  #0004
  TIMEMK=  #6800
  CONTLH=  #0005
  TIMESE=  #0064
  BMINPT=  #0001
  BMWORD=  #0000
  BMTIMR=  #0002
  BMPARY=  #0080
  BMPROM=  #0002
  BNTIMR=  #0001
  BNPARY=  #0007
  BNPROM=  #0001
  TERMIL=  #0001
  N=       #0004
  BMUNKN=  #2000
  DISABD=  #E000
  POWERE=  #0001
  BMSTEP=  #0020
  BNUNKN=  #000D
  BMWRIR=  #0200
  BNSTEP=  #0005
  BNWRIR=  #0009
  BMREST=  #0002
  BMPOSN=  #0010
  BMERAE=  #0020
  BNREST=  #0001
  BNPOSN=  #0004
  BNERAE=  #0005
  BMNORS=  #4000
  BNNORS=  #000E
  EVERSN=  #0006
  IDLENH=  #0004
  BMBUSY=  #8000
  BMCLEN=  #0000
  BNBUSY=  #000F
  EAREAS=  #000A
  BMNOEC=  #0040
  NAMELH=  #0003
  BNNOEC=  #0006
  BMOPUT=  #0002
  BMCLER=  #0040
  MAXDEE=  #003F
  BNOPUT=  #0001
  BNCLER=  #0006
  BMRELE=  #0004
  BMNOTY=  #0001
  ETYPE=   #0007
  BNRELE=  #0002
  BNNOTY=  #0000
  BMREAR=  #0100
  BNREAR=  #0008
  NAMEBS=  #0006
  BMOUTT=  #0003
  BMTPUT=  #0001
  BMSPEC=  #0008
  BMCONL=  #0000
  BMUNCE=  #0010
  BMEOF=   #0040
  BNTPUT=  #0000
  BNSPEC=  #0003
  BNUNCE=  #0004
  BNEOF=   #0006
  BMILLL=  #0008
  BNILLL=  #0003
  BNMUTX=  #0000
  BMNOCP=  #0080
  BMRESE=  #0008
  BNNOCP=  #0007
  BNRESE=  #0003
  BMTERE=  #0080
  BMDISP=  #0001
  BMREET=  #0001
  BNTERE=  #0007
  BNDISP=  #0000
  BNREET=  #0000
USE BASE
  BMWAC:=  #0080
  OLDPRC:= #001B
  SAVE3:=  #0029
  SSAVE1:= #0019
  BNWAC:=  #0007
  SAVE4:=  #002A
  SSAVE2:= #001A
  SAVE5:=  #002B
  SBLOCK:= #000C
  SSAVE3:= #001B
  TERMIE:= #0031
  SAVE6:=  #002C
  STACKH:= #0005
  SSAVE4:= #001C
  BMPLSB:= #0100
  NEXT:=   #0002
  SAVE7:=  #0040
  PROCLH:= #0052
  CATSLH:= #0040
  SSAVE5:= #001D
  BS:=     #0008
  BMWDE:=  #0008
  BNPLSB:= #0008
  WARNIG:= #0030
  DELAY:=  #0033
  SAVE8:=  #0041
  MESSAG:= #004D
  SSAVE6:= #001E
  BNWDE:=  #0003
  CLINK:=  #0014
  SAVE9:=  #0042
  SSAVE7:= #001F
  DLINK:=  #0027
  WORK:=   #0040
  SACTIN:= #0008
  SSAVE8:= #0020
  BMCHAE:= #0049
  BM1:=    #FFFF
  ELINK:=  #0056
  ANS0:=   #0000
  SSAVE9:= #0021
  NL:=     #000A
  BM2:=    #FFFF
  WORKAA:= #0295
  ANS1:=   #0001
  SFILE:=  #000D
  ESEGMS:= #000B
  EVENTC:= #003D
  ANS2:=   #0002
  EATTRE:= #0006
  EAREAE:= #0008
  MES0:=   #0000
  ANS3:=   #0003
  CR0:=    #000D
  EVENTE:= #0037
  MES1:=   #0001
  ANS4:=   #0004
  SIDENT:= #0003
  BMLOOP:= #0019
  CR1:=    #000E
  DATE:=   #0024
  MES2:=   #0002
  BOPER:=  #0000
  PARENT:= #0001
  CR2:=    #000F
  SAVE10:= #0043
  MES3:=   #0003
  NAME:=   #0007
  CR3:=    #0010
  CAUSE:=  #001E
  EMRETN:= #001E
  SAVE11:= #0044
  MES4:=   #0004
  SSTACD:= #0013
  BFIRST:= #0006
  CR4:=    #0011
  SAVE12:= #0045
  BSTATE:= #0005
  CR5:=    #0012
  CBASED:= #0016
  SAVE13:= #0046
  WRK:=    #004D
  SNAME:=  #0000
  BMWAN:=  #0001
  CR6:=    #0013
  SAVE14:= #0047
  STOP:=   #000F
  EFIRST:= #001A
  BNWAN:=  #0000
  BMMESS:= #0001
  CR7:=    #0014
  RESTIG:= #0038
  SAVE15:= #0048
  SBLOCT:= #000B
  BMWPA:=  #0040
  BNMESS:= #0000
  BMANSW:= #0002
  KIND:=   #0006
  SAVE16:= #0049
  UTILIH:= #02A1
  MOPERN:= #0000
  BNWPA:=  #0006
  BNANSW:= #0001
  BMCHAL:= #00F0
  PROCIT:= #0004
  SAVE17:= #004A
  SMODE:=  #0005
  SBUFSE:= #0011
  BNCHAL:= #0004
  SAVE18:= #004B
  ACOUNT:= #0001
  SKIND:=  #0006
  BMPRIY:= #FF00
  AREACM:= #002E
SAVE19:= #004C
  RESERR:= #0052
  WORKIG:= #005E
  BCOUNT:= #0001
  BNPRIY:= #0008
  CATWRK:= #0005
  PPROGM:= #000C
  EBLOCE:= #0009
  CONTET:= #0004
  CAN:=    #0018
  BMWIN:=  #0004
  PROGRM:= #0017
  EOFACN:= #0059
  EBLOCG:= #000E
  BMNEXT:= #0029
  BNWIN:=  #0002
  BMRECD:= #000A
  BMPER0:= #0069
  BNRECD:= #0001
  ANSWER:= #004D
  BMCREE:= #0009
  BMPER1:= #0079
  DEL:=    #007F
  PREFS:=  #0001
  CURSLH:= #00B2
  EVT0:=   #0000
  EHIBLK:= #000C
  EDUMMY:= #001F
  BMPER2:= #0089
  KINDFD:= #0400
  TIMER:=  #0019
  DEVPR:=  #001F
  CURIN:=  #005A
  EVT1:=   #0001
  BMPER3:= #0099
  BMWC:=   #003F
  PSW:=    #001A
  PRESET:= #0020
  ADJUST:= #0035
  DEVICE:= #0053
  ENTRYA:= #0275
  USERLH:= #02F0
  EVT2:=   #0002
  BUFFEH:= #0008
  BMPER4:= #00A9
  BNWC:=   #0006
  CURSIN:= #005F
  EVT3:=   #0003
  BMPER5:= #00B9
  PPRPC:=  #000D
  MSAVE:=  #0026
  CENTRY:= #005D
  ABLOCK:= #0003
  EVT4:=   #0004
  ERECOE:= #000A
  BMPER6:= #00C9
  BMACTE:= #BFC0
  INTERT:= #0054
  CATALG:= #0057
  WORKLH:= #000C
  BBLOCK:= #0003
  CATALH:= #0058
  BMXCU:=  #4000
  BNSSI:=  #0001
  REF:=    #0003
  REFLEH:= #0004
  BADDR:=  #0002
  BMPER9:= #00D9
  BNXCU:=  #000E
  PBUFS:=  #0002
  ITEM:=   #FFF3
  LOCACN:= #001C
  TIME:=   #0021
  EAREA:=  #000F
  BMWEV:=  #0002
  BMPR:=   #3F00
  ERROR:=  #002F
  REFS:=   #0036
  W:=      #0040
  BNEXT:=  #0007
  ENTRYH:= #0020
  BNWEV:=  #0001
  CATBIN:= #0003
  EVENT:=  #004D
  STREAT:= #000A
  BMRUN:=  #8000
  RECEIR:= #0001
  ARESUT:= #0000
  AFILE:=  #0004
  BNRUN:=  #000F
  PROC:=   #000D
  EVENTS:= #003C
  MCOUNT:= #0001
  BFILE:=  #0004
  EPAGE:=  #001B
  CHAIN:=  #0005
  PRPC:=   #0018
  ESC:=    #001B
  BMPEND:= #0009
  CHILD:=  #0003
  SMASK:=  #0007
  BNPEND:= #0000
  PCOUNT:= #0006
  FREEAS:= #002A
  NEXTET:= #003B
  BUFLEH:= #0009
  ASTATS:= #0002
  BUF:=    #0003
  FF:=     #000C
  KINDOC:= #0100
  CBASE:=  #0015
  CUREVT:= #003A
  ECHART:= #001C
  BMREME:= #0059
  BNWAIG:= #0008
  CATCAT:= #0006
  STATE:=  #0000
  BUFS:=   #0037
  CURWOK:= #005C
  SPROCT:= #0004
  BMRENE:= #0039
  CATDAT:= #0001
  WCATS:=  #02B0
  SFIRST:= #000E
  EIDENT:= #0003
  EBASE:=  #0019
  KINDCR:= #0200
  CATOBJ:= #0004
  PSIZE:=  #000B
  FIRSTT:= #0039
  BMPRCH:= #FFF0
  SUSED:=  #0012
  SHAREH:= #0022
  BMWSM:=  #0010
  PWORDS:= #0003
  EDATE:=  #0004
  BNWSM:=  #0004
  WSAVE:=  #02A1
  WPROG:=  #02A2
  BMIGNR:= #000C
  CATTXT:= #0002
  INTRPT:= #0034
  MBLOCK:= #0003
  SREM:=   #0010
  ENAME:=  #0000
  BMWSP:=  #0020
  BNIGNR:= #0002
  EDRIVE:= #0007
  BNWSP:=  #0005
  BNRSU:=  #0000
  BMRX:=   #C000
  DRIVEH:= #0055
  MADDRS:= #0002
  EMODE:=  #001E
  WORD:=   #0000
  SIZE:=   #0004
  PRICHN:= #0032
  ESPECL:= #0055
  SEOFAN:= #0009
  EKIND:=  #001D
  LF:=     #000A
  EM:=     #0019
  BMDYNC:= #C03F
  BMREF:=  #0008
  CURSWK:= #01C3
  BNREF:=  #0003
  NAMEIT:= #0003
  ACTION:= #0058
  CURSOT:= #0111
  MFILE:=  #0004
  CR:=     #000D
  BMSIGN:= #0004
  SAVE0:=  #003E
  CUROUT:= #005B
  SSSIZE:= #0017
  BMWS:=   #00C0
  BNSIGN:= #0002
  KINDLP:= #0300
  SAVE1:=  #003F
  SENDER:= #0001
  ERECOS:= #000D
  BMSTAC:= #FFC0
  LOCREN:= #001D
  SAVE2:=  #0028
  SSAVE0:= #0018

  MTESTS=  #0000-128*BASE-128*(PROG-1)
  MMODES=  #FFFF-128*BASE-128*(PROG-1)
  MCHECS=  #FFFF-128*BASE-128*(PROG-1)
  BYTE=    #0000+  2*BASE+  0*(PROG-1)
  PRIOR0=  #0000-128*BASE-128*(PROG-1)
  PRIOR1=  #0000-128*BASE-128*(PROG-1)
  PRIOR2=  #0000-128*BASE-128*(PROG-1)
USE #0
; 00175900 0 0100  LEVEL 4  NAMES:
  INSPEE=  #0070
  ENDPRM=  #0041
  INPARM=  #0068
  STARTS=  #006C
  OUTNL=   #005D
  COMPAS=  #0045
  CREATS=  #006A
  OUTTET=  #005C
  MPER00=  #0051
  OUTHEA=  #0064
  STOPPS=  #006D
  CREATY=  #004A
  RENAMY=  #004D
  GETPON=  #0058
  REMOVE=  #0072
  CLOSE=   #0054
  INWORD=  #007C
  OUTNAE=  #0085
  PUTARA=  #0074
  STACK=   #0055
  OUTEND=  #005E
  LINKNT=  #006E
  SETDEY=  #0077
  BACKSE=  #0063
  OUTCHR=  #005F
  REMOVM=  #0071
  INNEXT=  #0069
  INCHAR=  #0061
  OUTBLK=  #0060
  INTYPE=  #0066
  OPEN=    #0053
  OUTTEB=  #005B
  COMPAE=  #0046
  INIT=    #0052
  LINKCD=  #006F
  GETARA=  #0073
  FREE01=  #0089
  SETINT=  #0078
  SETPON=  #0057
  PUTBYE=  #0049
  INNAME=  #007B
  NEXTON=  #0043
  REMOVS=  #006B
  SETPRN=  #0076
  INCOMD=  #0086
  CHANGY=  #004E
  NEXTEY=  #004C
  UNSTAK=  #0056
  INITDE=  #0042
  WAIT=    #0059
  INITWT=  #0075
  OUTINR=  #0065
  REMOVY=  #004F
  FINDEY=  #0050
  GETADS=  #0047
  RETURR=  #0044
  INBLOK=  #0062
  OUTTEP=  #005A
  LOOKUY=  #004B
  GETBYE=  #0048
  INELET=  #0067
USE #0
; 00197700 0 0040  LEVEL 4  NAMES:
  GETINL=  #0007
  GIVEUE=  #0018
  SEARCS=  #001A
  WAITAR=  #000D
  ENTERL=  #0006
  WAITIL=  #0008
  GETINT=  #0004
  REGISS=  #0013
  SENDSL=  #000A
  WAITET=  #000F
  WAITIT=  #0005
  WAITDY=  #0019
  INSERT=  #0001
  RESERT=  #0003
  REGREE=  #0010
  MEMARA=  #0014
  CREATE=  #001C
  WAITNT=  #000E
  LEAVEL=  #0009
  TRANST=  #0012
  CLEART=  #0000
  SENDME=  #000B
  RELEAT=  #0002
  SENDAR=  #000C
  RESUMT=  #0011
  GETEVE=  #001B
USE #0
; 00199200 0 0040  LEVEL 3  NAMES:
USE PROG
  LOCINT:= #026F
  LOCACT:= #826F
USE #0
LIST
XPD:=   DRIVERLENGTH
NOLIST

; CR80 SYSTEM ONE
; MONITOR

; MASTER: XPD - PROCESS DESCRIPTION (PART 1)


IF XPD EQ UTILITYLENGTH OR XPD EQ PROGLENGTH THEN
IF WORDS NE 0 THEN MESSAGE WORDS FI
AREASWITCH=1
USE PROG
LOC=PROG-1
        XPSTATE
        XREFS
        XBUFS
        XWORDS
        XPSIZE
        XCHAIN
        XPCOUNT
IF LOC NE NAME THEN MESSAGE <:ERROR: PROG NAME:> FI
XPNAME: XPNAME0
IF NAMELENGTH GT 1 THEN
        XPNAME1
IF NAMELENGTH GT 2 THEN
        XPNAME2
IF NAMELENGTH GT 3 THEN
        0 REPEAT NAMELENGTH-3-1
FI FI FI
IF LOC-XPNAME NE NAMELENGTH THEN MESSAGE <:ERROR: XPNAME LENGTH:> FI
        XIDENT
        XSIZE
        XPROGRAM
        XPRPC
IF LOC NE PROGLENGTH THEN MESSAGE <:ERROR: PROG LENGTH:> FI
FI

IF XPD GT PROGLENGTH THEN
USE BASE
LOC=BASE
        XSTATE
        XPARENT
        XNEXT
        XCHILD
        XSIZE
        XCHAIN
        XKIND
XNAME:  XNAME0
IF NAMELENGTH GT 1 THEN
        XNAME1
IF NAMELENGTH GT 2 THEN
        XNAME2
IF NAMELENGTH GT 3 THEN
        0 REPEAT NAMELENGTH-3-1
FI FI FI
IF LOC-XNAME NE NAMELENGTH THEN MESSAGE <:ERROR: XNAME LENGTH:> FI
        XIDENT
        XPROCIDENT
        XDEBUG
IF LOC NE PROC THEN MESSAGE <:ERROR: XPROC LOCATION:> FI
        0 REPEAT 7 ; REGISTERS
        XCBASE
        XCBASEMOD
        XPROGRAM
        XPRPC
        XTIMER
        XPSW
        XOLDPROC
        XLOCACTION
        XLOCRETURN
        XCAUSE
        XDEVPR
        XPRESET
        0 REPEAT 12 ; TIME0 - FREEAREAS
       #FFFF
        XERROR
        XWARNING
        XTERMINATE
        0 REPEAT 3 ; PRICHN - ADJUST
        XREFSX
        XBUFSX
IF XPD NE UTILITYLENGTH THEN
        XREFS=0
        XBUFS=1
FI
        0 REPEAT 20 ; RESTING - SAVE19
XWRK:   0
IF CONTLENGTH GT 1 THEN
        0
IF CONTLENGTH GT 2 THEN
        0
IF CONTLENGTH GT 3 THEN
        0
IF CONTLENGTH GT 4 THEN
        0
IF CONTLENGTH GT 5 THEN
        0 REPEAT CONTLENGTH-5-1
FI FI FI FI FI
IF LOC-XWRK NE CONTLENGTH THEN MESSAGE <:ERROR: XWRK LENGTH:> FI
LOC=    LOC-C
IF LOC NE PROCLENGTH-C THEN MESSAGE <:ERROR: XPROC LENGTH:> FI

IF XPD GT PROCLENGTH THEN
        XRESERVER
        XDEVICE
        XINTERRUPT
IF LOC NE DRIVERLENGTH-C THEN MESSAGE <:ERROR: XDRIVER LENGTH:> FI

IF XPD GT DRIVERLENGTH THEN
        0 REPEAT 2 ; ESPECIAL - CATALOG
IF LOC NE CATALOGLENGTH-C THEN MESSAGE <:ERROR: XCATALOG LENGTH:> FI

IF XPD GT CATALOGLENGTH THEN
        XACTION
        XEOFACTION
        XCURIN
        XCUROUT
        XCURWORK
        XCENTRY
        XWORKING
FI FI FI FI

XLOC=   LOC

LIST

DEV:=         1
PR:=          0
MYBASE:=     #18D0
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,L157
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              L157       ;       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;


; 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

; CR80 SYSTEM ONE
; MONITOR

; MASTER: XPD - PROCESS DESCRIPTION (PART 2)

IF XPD EQ UTILITYLENGTH OR XPD EQ PROGLENGTH THEN
USE PROG
        XPSTATE=      BMREENTRANT
        XREFS=        0
        XBUFS=        1
        XWORDS=       0
        XPSIZE=       LOC
        XCHAIN=       0
        XPCOUNT=      1
        XPNAME0=      0
        XPNAME1=      0
        XPNAME2=      0
        XIDENT=       0
        XPRPC=        PROGLENGTH
FI

USE BASE
IF XPD GT PROGLENGTH THEN
XLOC=   LOC-XLOC-C
        XSTATE=       0
        XPARENT=      0
        XNEXT=        0
        XCHILD=       0
        XCHAIN=       0
        XKIND=        0
        XNAME0=       0
        XNAME1=       0
        XNAME2=       0
        XIDENT=       0
        XPROCIDENT=   0
        XDEBUG=       0
        XCBASE=       0
        XCBASEMOD=    0
        XPRPC=        0
        XTIMER=       100
        XPSW=         0
        XOLDPROC=     0
        XLOCACTION=   LOCACT
        XLOCRETURN=   0
        XCAUSE=       0
        XDEVPR=       0
        XPRESET=      100
        XERROR=       0
        XWARNING=     0
        XTERMINATE=   0
        XRESERVER=    0
        XDEVICE=      0
        XINTERRUPT=   0
        XACTION=      LOCACT
        XEOFACTION=   LOCACT

IF XPD GT CURSIN THEN
IF LOC NE CURSIN+XLOC THEN MESSAGE <:ERROR: XCURSIN LENGTH:> FI
XCURIN=       LOC
BEGIN USE BASE
XSHARE:
XSNAME: XSNAME0
IF NAMELENGTH GT 1 THEN
        XSNAME1
IF NAMELENGTH GT 2 THEN
        XSNAME2
IF NAMELENGTH GT 3 THEN
        0 REPEAT NAMELENGTH-3-1
FI FI FI
IF LOC-XSNAME NE NAMELENGTH THEN MESSAGE <:ERROR: XSNAME LENGTH:> FI
        XSIDENT
        0 ; SPROCIDENT
        XSMODE
        XSKIND
        0 REPEAT 6 ; SMASK - SFILE
        XSFIRST
        XSTOP
        XSREM
        XSBUFSIZE
        XSUSED
XSSID:  0
IF IDLENGTH GT 1 THEN
        0
IF IDLENGTH GT 2 THEN
        0
IF IDLENGTH GT 3 THEN
        0 REPEAT IDLENGTH-3-1
FI FI FI
IF LOC-XSSID NE IDLENGTH THEN MESSAGE <:ERROR: XSSID LENGTH:> FI
        0
IF LOC-XSSID NE STACKLENGTH THEN MESSAGE <:ERROR: STACK LENGTH:> FI
        0 REPEAT 9 ; SSAVE0 - SSAVE9
IF LOC-XSHARE NE SHARELENGTH THEN MESSAGE <:ERROR: XSHARE LENGTH:> FI

        XSBUFFERS=    1
XSNAME0=      <:OC:>
XSMODE=       BMINPUT OR BMBYTE
XSKIND=       KINDOC OR BMBYTE OR BMDISP
XSBUFSIZE=    128
XSBUFFERS=    2
        IF XSMODE>BNBYTE THEN XSFACTOR=2
          IF XSBUFSIZE THEN   XSFILL=1
          ELSE                XSFILL=0
          FI
        ELSE                  XSFACTOR=1
                              XSFILL=0
        FI
        XSNAME0=      0
        XSNAME1=      0
        XSNAME2=      0
        XSIDENT=      0
        XSFIRST=      (LOC+XSBUFFERS*BUFFERLENGTH)*XSFACTOR
        XSTOP=        XSFIRST
        IF XSMODE>BNOPUT THEN XSREM= XSBUFSIZE
        ELSE                  XSREM= 0
        FI
        XSUSED=       LOC

        XSBUFFER=     XSBUFFERS*(XSBUFSIZE+XSFILL)
        XSBUFAREA=    (XSUSED+XSBUFFERS*BUFFERLENGTH)*XSFACTOR
IF XSBUFFERS GT 0 THEN
        0 REPEAT BFIRST-1
        XSBUFAREA,    XSBUFAREA=XSBUFAREA+XSBUFSIZE+XSFILL
        IF XSBUFFERS GT 1 THEN
                      LOC-BNEXT+BUFFERLENGTH
        ELSE          XSUSED
        FI
        XSBUFFERS=XSBUFFERS-1
FI
IF XSBUFFERS GT 0 THEN
        0 REPEAT BFIRST-1
        XSBUFAREA,    XSBUFAREA=XSBUFAREA+XSBUFSIZE+XSFILL
        IF XSBUFFERS GT 1 THEN
                      LOC-BNEXT+BUFFERLENGTH
        ELSE          XSUSED
        FI
        XSBUFFERS=XSBUFFERS-1
FI

IF XSMODE>BNBYTE AN (NT XSKIND>BNBYTE) AN XSBUFAREA>15 THEN
  MESSAGE <:ADDR TOO BIG:>
FI

IF XSBUFFER GT 0 THEN
        0 REPEAT (XSBUFFER-1)/XSFACTOR
FI
END

IF XPD GT CURSOUT THEN
IF LOC NE CURSOUT+XLOC THEN MESSAGE <:ERROR: XCURSOUT LENGTH:> FI
XCUROUT=      LOC
BEGIN USE BASE
XSHARE:
XSNAME: XSNAME0
IF NAMELENGTH GT 1 THEN
        XSNAME1
IF NAMELENGTH GT 2 THEN
        XSNAME2
IF NAMELENGTH GT 3 THEN
        0 REPEAT NAMELENGTH-3-1
FI FI FI
IF LOC-XSNAME NE NAMELENGTH THEN MESSAGE <:ERROR: XSNAME LENGTH:> FI
        XSIDENT
        0 ; SPROCIDENT
        XSMODE
        XSKIND
        0 REPEAT 6 ; SMASK - SFILE
        XSFIRST
        XSTOP
        XSREM
        XSBUFSIZE
        XSUSED
XSSID:  0
IF IDLENGTH GT 1 THEN
        0
IF IDLENGTH GT 2 THEN
        0
IF IDLENGTH GT 3 THEN
        0 REPEAT IDLENGTH-3-1
FI FI FI
IF LOC-XSSID NE IDLENGTH THEN MESSAGE <:ERROR: XSSID LENGTH:> FI
        0
IF LOC-XSSID NE STACKLENGTH THEN MESSAGE <:ERROR: STACK LENGTH:> FI
        0 REPEAT 9 ; SSAVE0 - SSAVE9
IF LOC-XSHARE NE SHARELENGTH THEN MESSAGE <:ERROR: XSHARE LENGTH:> FI

        XSBUFFERS=    1
XSNAME0=      <:OC:>
XSMODE=       BMOUTPUT OR BMBYTE
XSKIND=       KINDOC OR BMBYTE OR BMDISP
XSBUFSIZE=    128
XSBUFFERS=    2
        IF XSMODE>BNBYTE THEN XSFACTOR=2
          IF XSBUFSIZE THEN   XSFILL=1
          ELSE                XSFILL=0
          FI
        ELSE                  XSFACTOR=1
                              XSFILL=0
        FI
        XSNAME0=      0
        XSNAME1=      0
        XSNAME2=      0
        XSIDENT=      0
        XSFIRST=      (LOC+XSBUFFERS*BUFFERLENGTH)*XSFACTOR
        XSTOP=        XSFIRST
        IF XSMODE>BNOPUT THEN XSREM= XSBUFSIZE
        ELSE                  XSREM= 0
        FI
        XSUSED=       LOC

        XSBUFFER=     XSBUFFERS*(XSBUFSIZE+XSFILL)
        XSBUFAREA=    (XSUSED+XSBUFFERS*BUFFERLENGTH)*XSFACTOR
IF XSBUFFERS GT 0 THEN
        0 REPEAT BFIRST-1
        XSBUFAREA,    XSBUFAREA=XSBUFAREA+XSBUFSIZE+XSFILL
        IF XSBUFFERS GT 1 THEN
                      LOC-BNEXT+BUFFERLENGTH
        ELSE          XSUSED
        FI
        XSBUFFERS=XSBUFFERS-1
FI
IF XSBUFFERS GT 0 THEN
        0 REPEAT BFIRST-1
        XSBUFAREA,    XSBUFAREA=XSBUFAREA+XSBUFSIZE+XSFILL
        IF XSBUFFERS GT 1 THEN
                      LOC-BNEXT+BUFFERLENGTH
        ELSE          XSUSED
        FI
        XSBUFFERS=XSBUFFERS-1
FI

IF XSMODE>BNBYTE AN (NT XSKIND>BNBYTE) AN XSBUFAREA>15 THEN
  MESSAGE <:ADDR TOO BIG:>
FI

IF XSBUFFER GT 0 THEN
        0 REPEAT (XSBUFFER-1)/XSFACTOR
FI
END

IF XPD GT CURSWORK THEN
IF LOC NE CURSWORK+XLOC THEN MESSAGE <:ERROR: XCURSWORK LENGTH:> FI
XCURWRK=      LOC
BEGIN USE BASE
XSHARE:
XSNAME: XSNAME0
IF NAMELENGTH GT 1 THEN
        XSNAME1
IF NAMELENGTH GT 2 THEN
        XSNAME2
IF NAMELENGTH GT 3 THEN
        0 REPEAT NAMELENGTH-3-1
FI FI FI
IF LOC-XSNAME NE NAMELENGTH THEN MESSAGE <:ERROR: XSNAME LENGTH:> FI
        XSIDENT
        0 ; SPROCIDENT
        XSMODE
        XSKIND
        0 REPEAT 6 ; SMASK - SFILE
        XSFIRST
        XSTOP
        XSREM
        XSBUFSIZE
        XSUSED
XSSID:  0
IF IDLENGTH GT 1 THEN
        0
IF IDLENGTH GT 2 THEN
        0
IF IDLENGTH GT 3 THEN
        0 REPEAT IDLENGTH-3-1
FI FI FI
IF LOC-XSSID NE IDLENGTH THEN MESSAGE <:ERROR: XSSID LENGTH:> FI
        0
IF LOC-XSSID NE STACKLENGTH THEN MESSAGE <:ERROR: STACK LENGTH:> FI
        0 REPEAT 9 ; SSAVE0 - SSAVE9
IF LOC-XSHARE NE SHARELENGTH THEN MESSAGE <:ERROR: XSHARE LENGTH:> FI

        XSBUFFERS=    1
XSMODE=        BMWORD
XSKIND=           BMWORD
XSBUFSIZE=    64
XSBUFFERS=    2
        IF XSMODE>BNBYTE THEN XSFACTOR=2
          IF XSBUFSIZE THEN   XSFILL=1
          ELSE                XSFILL=0
          FI
        ELSE                  XSFACTOR=1
                              XSFILL=0
        FI
        XSNAME0=      0
        XSNAME1=      0
        XSNAME2=      0
        XSIDENT=      0
        XSFIRST=      (LOC+XSBUFFERS*BUFFERLENGTH)*XSFACTOR
        XSTOP=        XSFIRST
        IF XSMODE>BNOPUT THEN XSREM= XSBUFSIZE
        ELSE                  XSREM= 0
        FI
        XSUSED=       LOC

        XSBUFFER=     XSBUFFERS*(XSBUFSIZE+XSFILL)
        XSBUFAREA=    (XSUSED+XSBUFFERS*BUFFERLENGTH)*XSFACTOR
IF XSBUFFERS GT 0 THEN
        0 REPEAT BFIRST-1
        XSBUFAREA,    XSBUFAREA=XSBUFAREA+XSBUFSIZE+XSFILL
        IF XSBUFFERS GT 1 THEN
                      LOC-BNEXT+BUFFERLENGTH
        ELSE          XSUSED
        FI
        XSBUFFERS=XSBUFFERS-1
FI
IF XSBUFFERS GT 0 THEN
        0 REPEAT BFIRST-1
        XSBUFAREA,    XSBUFAREA=XSBUFAREA+XSBUFSIZE+XSFILL
        IF XSBUFFERS GT 1 THEN
                      LOC-BNEXT+BUFFERLENGTH
        ELSE          XSUSED
        FI
        XSBUFFERS=XSBUFFERS-1
FI

IF XSMODE>BNBYTE AN (NT XSKIND>BNBYTE) AN XSBUFAREA>15 THEN
  MESSAGE <:ADDR TOO BIG:>
FI

IF XSBUFFER GT 0 THEN
        0 REPEAT (XSBUFFER-1)/XSFACTOR
FI
END

IF XPD GT ENTRYAREA THEN
IF LOC NE ENTRYAREA+XLOC THEN MESSAGE <:ERROR: XENTRYAREA LENGTH:> FI
XCENTRY=      LOC
              0 REPEAT ENTRYLENGTH-1

IF XPD GT WORKAREA THEN
IF LOC NE WORKAREA+XLOC THEN MESSAGE <:ERROR: XWORKAREA LENGTH:> FI
XWORKING=     LOC
              0 REPEAT WORKLENGTH-1
IF LOC NE UTILITYLENGTH+XLOC THEN MESSAGE <:ERROR: XUTILITY LENGTH:> FI
FI FI FI FI FI

        XCURIN=       0
        XCUROUT=      0
        XCURWORK=     0
        XCENTRY=      0
        XWORKING=     0

        IF XREFS EQ 0 THEN XREFSX=0
        ELSE               XREFSX:
        XREFS=XREFS-1
        IF XREFS EQ 0 THEN
          0 REPEAT REFLENGTH-1
        ELSE
          0,0,LOC+REFLENGTH-NEXT,0 REPEAT REFLENGTH-4
        XREFS=XREFS-1
        IF XREFS EQ 0 THEN
          0 REPEAT REFLENGTH-1
        ELSE
          0,0,LOC+REFLENGTH-NEXT,0 REPEAT REFLENGTH-4
        XREFS=XREFS-1
        IF XREFS EQ 0 THEN
          0 REPEAT REFLENGTH-1
        ELSE
          0,0,LOC+REFLENGTH-NEXT,0 REPEAT REFLENGTH-4
        XREFS=XREFS-1
        IF XREFS EQ 0 THEN
          0 REPEAT REFLENGTH-1
        ELSE
          0,0,LOC+REFLENGTH-NEXT,0 REPEAT REFLENGTH-4
        XREFS=XREFS-1
        IF XREFS EQ 0 THEN
          0 REPEAT REFLENGTH-1
        ELSE
          0,0,LOC+REFLENGTH-NEXT,0 REPEAT REFLENGTH-4
        XREFS=XREFS-1
        IF XREFS EQ 0 THEN
          0 REPEAT REFLENGTH-1
        ELSE
          0,0,LOC+REFLENGTH-NEXT,0 REPEAT REFLENGTH-4
        XREFS=XREFS-1
        IF XREFS EQ 0 THEN
          0 REPEAT REFLENGTH-1
        ELSE
          0,0,LOC+REFLENGTH-NEXT,0 REPEAT REFLENGTH-4
        XREFS=XREFS-1
        IF XREFS EQ 0 THEN
          0 REPEAT REFLENGTH-1
        ELSE
          0,0,LOC+REFLENGTH-NEXT,0 REPEAT REFLENGTH-4
        XREFS=XREFS-1
        IF XREFS EQ 0 THEN
          0 REPEAT REFLENGTH-1
        ELSE
          0,0,LOC+REFLENGTH-NEXT,0 REPEAT REFLENGTH-4
        XREFS=XREFS-1
        IF XREFS EQ 0 THEN
          0 REPEAT REFLENGTH-1
        ELSE
          0,0,LOC+REFLENGTH-NEXT,0 REPEAT REFLENGTH-4
        FI FI FI FI FI FI FI FI FI FI FI 
        IF XBUFS EQ 0 THEN XBUFSX=0
        ELSE               XBUFSX:
        XBUFS=XBUFS-1
        IF XBUFS EQ 0 THEN
          0 REPEAT BUFLENGTH-1
        ELSE
          0,0,LOC+BUFLENGTH-NEXT,0 REPEAT BUFLENGTH-4
        XBUFS=XBUFS-1
        IF XBUFS EQ 0 THEN
          0 REPEAT BUFLENGTH-1
        ELSE
          0,0,LOC+BUFLENGTH-NEXT,0 REPEAT BUFLENGTH-4
        XBUFS=XBUFS-1
        IF XBUFS EQ 0 THEN
          0 REPEAT BUFLENGTH-1
        ELSE
          0,0,LOC+BUFLENGTH-NEXT,0 REPEAT BUFLENGTH-4
        XBUFS=XBUFS-1
        IF XBUFS EQ 0 THEN
          0 REPEAT BUFLENGTH-1
        ELSE
          0,0,LOC+BUFLENGTH-NEXT,0 REPEAT BUFLENGTH-4
        XBUFS=XBUFS-1
        IF XBUFS EQ 0 THEN
          0 REPEAT BUFLENGTH-1
        ELSE
          0,0,LOC+BUFLENGTH-NEXT,0 REPEAT BUFLENGTH-4
        XBUFS=XBUFS-1
        IF XBUFS EQ 0 THEN
          0 REPEAT BUFLENGTH-1
        ELSE
          0,0,LOC+BUFLENGTH-NEXT,0 REPEAT BUFLENGTH-4
        XBUFS=XBUFS-1
        IF XBUFS EQ 0 THEN
          0 REPEAT BUFLENGTH-1
        ELSE
          0,0,LOC+BUFLENGTH-NEXT,0 REPEAT BUFLENGTH-4
        XBUFS=XBUFS-1
        IF XBUFS EQ 0 THEN
          0 REPEAT BUFLENGTH-1
        ELSE
          0,0,LOC+BUFLENGTH-NEXT,0 REPEAT BUFLENGTH-4
        XBUFS=XBUFS-1
        IF XBUFS EQ 0 THEN
          0 REPEAT BUFLENGTH-1
        ELSE
          0,0,LOC+BUFLENGTH-NEXT,0 REPEAT BUFLENGTH-4
        XBUFS=XBUFS-1
        IF XBUFS EQ 0 THEN
          0 REPEAT BUFLENGTH-1
        ELSE
          0,0,LOC+BUFLENGTH-NEXT,0 REPEAT BUFLENGTH-4
        FI FI FI FI FI FI FI FI FI FI FI 

FI

        XSIZE=        LOC-ITEM
        XPROGRAM=     LOC

USE PROG
IF LOC+XSIZE NE WORDS THEN MESSAGE <:ERROR: LOC+XSIZE<>WORDS:> FI

IF XPD NE PROGLENGTH THEN
USE BASE
FI
LIST

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