|
|
DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 39296 (0x9980)
Types: TextFile
Names: »S8DOCM«
└─⟦cb65a69e7⟧ Bits:30005484 8" CR80 Floppy CR80FD_0203 ( CR/D/0986 )
└─⟦990125f75⟧
└─⟦this⟧ »JAS.S8DOCM«
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»