|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 127488 (0x1f200)
Types: TextFile
Names: »ms2 «
└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer
└─⟦2ba378e4a⟧
└─⟦this⟧ »ms2 «
\f
m. mons2 - monitor operatins system s, part 2 17.0 beta
;
;88.05.11 15.45 kak connect ida changed
;88.05.20 15.11 kak new text output in connect (g112);
;88.05.24 09.30 kak change of cpa and address base included
;88.06.07 10.20 kak prepare dump and dump commands included
;88.08.16 11.38 kak connect/disconnect changed to createlink/removelink
; including a new param format
;88 09 19 17.39 hsi error in createlink spec for floppy (h15:)
;88 10 12 09.55 kak two new commands: privileged and unprivileged introducted
; and including privileged consoles from options is removed
;88 11 09 08.02 kak error in linkall corrected
;88 11 25 11.27 kak protection against unprivileged mainconsole
;89 01 27 13.00 kak removelink corrected
;89 02 22 12.52 kak accepting of capitol letters included
;89 03 14 08.50 kak the last char read is saved, and may be used to detect end of line
; in commands with a variable number of paramters
; the last name read in createlink is saved in work, to prevent overwrite
;89 03 15 16.22 kak driverproc is started locked
; and inserted in running queue
;89 03 30 12.00 kak stepping stone (step 2) out of conditional block
;--------------------------------------------------------------------------
; START OF RELEASE 16.0
;89 04 11 14.12 hsi unlink: reset output buffer after each parameter
;89 05 25 15.06 kak the last free consolebuffer cannot be privileged
;--------------------------------------------------------------------------
; START OF RELEASE 17.0
;90 10 23 12.34 kak a new s-command: setprio introducted
; who did it possible to changed the priority of a running child
;91 01 15 14.00 kak ths s-command create child is changed: in the monitor call
; modify child the first logical addr is used as IC (before it was the physical addr)
;91 01 30 13.51 kak message received from internal process changed:
; the device address is replaced with the core table address at the call of find console.
b.i30 w.
i0=91 01 30 , i1=13 51 00
; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime;
c.i0-a133
c.i0-a133-1, a133=i0, a134=i1, z.
c.i1-a134-1, a134=i1, z.
z.
i10=i0, i20=i1
i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000
i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000
i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000
i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100
i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10
i2:<: date :>
(:i15+48:)<16+(:i14+48:)<8+46
(:i13+48:)<16+(:i12+48:)<8+46
(:i11+48:)<16+(:i10+48:)<8+32
(:i25+48:)<16+(:i24+48:)<8+46
(:i23+48:)<16+(:i22+48:)<8+46
(:i21+48:)<16+(:i20+48:)<8+ 0
i3: al. w0 i2. ; write date:
rs w0 x2 +0 ; first free:=start(text);
al w2 0 ;
jl x3 ; return to slang(status ok);
jl. i3. ;
e.
j.
w.
e0: c0 ; <first addr>
;e1 ; defined below
e2:c4 ; <own buf>
e3:c5 ; <own area>
e4:0 ; <max device>
e5:h0 ; <char table>
e6:h1 ; <param table>
e7:h2 ; <first command>
e12:h3 ; <top command table>
e9:h4 ; <first console>
e10:h5 ; <last console>
e11:h6 ; <first device>
e13:h8 ; <first work>
e14:h9 ; <last work>
e33:h10 ; fictive element before first core table
e15=k-c20
e15,e15
e16:0-0-0 ; <first core - last of init cat code>
e17:0 ; <top core>
e18:0 ; <param type>
e19:0 ; <integer>
e24:h8 ; <work> ( initially: first work )
; *** the following variables must match part of work-area
e20:0 ; <name>
e21:0 ;
e22:0 ;
e23:0 ;
0
e78:0 ; used in list and link and removelink and initkit
e79:-1 ; segment in susercat or -1
e81:0 ;continue indicator
; text addr: odd = continue, even = no continue
e83:0 ; <subroutine return address>
0 ; <cur catalog base, lower limit >
e75:0 ; < upper limit >
e25:h21 ; <console> ( initially: first console )
e26:0 ; <console buf> or <last addr>
e27:8 ; <char shift> (initially: prepared for empty char buf)
e28:0 ; <char addr>
e29:0 ; <child>
e90:0 ; <terminal address>
e101:0 ; <device no of disc containing description>
e102:0 ; <device no of physical disc>
e103:0 ; <pointer in disc description>
e105:0 ; <size of logical disc description>
e30:0 ; <core addr>
; *** end of work-area match
e104:0 ; <user of disc description buffer identified by work>
e31:h21
e34:0
e35=k-c20
h4,h22
e36:
e37:0
e38:0
e32:0,r.8 ; <message>
e88:0 ; expected answer
e89:0 ; executing reentrant code: 0=false, -1=true (initially = false)
c.(:a399>21a.1:)-1
e106:0 ; pp_buff: buffer addres from prepare dump
z.
e109: ; last char read;
e39:0 ; <event>
e40:0 ; <receiver>
e41:0 ;
0 ;
e43:0,0 ;
e55:0 ; <write shift>
e44:5<12 ; <type mess>
e45:0 ; <line addr>
e46:0 ; <write addr>
0 ; <segment or unused>
e42:0 ; <top of writebuffer>
e53:0 ; <write mode: 0=terminal, 1=memory>
e47:3<12 ; <area mess> or <input mess>
e48:0 ; <first addr>
e49:0 ; <last addr>
e50:0 ; <segment>
e87: 0 ; areabuf state: 0=defined, else undef (initially defined)
e51:0 ; <entry tail> or <answer> or <message>
e52:0 ;
0 ;
e54:0 ; <convert area>
0
e56:0 ; <read shift> or <radix> or <start>
e57:0 ; <read addr> or <state> or <size>
e58:0 ; <save w1> or <first segment>
e59:0 ; <save w2> or <content> or <keys> or <result>
e60:0 ; <link> or <bytes to load>
e61:0 ; <child w0>
e62:0 ; <child w1>
e63:0 ; <child w2>
e64:0 ; <child w3>
e65:0 ; <child ex>
e66:0 ; <child ic>
e67=e59+1 ; <ic in entry>
e68=e66+2
0,0
e69:0 ;jobcount
a107 ;<max catalog base, lower limit>
e76:a108-1 ;< upper limit>
e77: 0 ; increase access indicator
e70:h19
e71:h20
e72: -1 ; first logic address (default value)
m. s lock indicator.
c.(:c23>13 a.1:)-1 ; if teminals shal be blocked after start up
e80: -1 ; then e80=-1, else
z.
c.-(:c23>13 a.1:) ;
e80: 0 ; e80=0
z.
c.(:a399>22a.1:)-1
e82: 0 ; max r.size : max space between monitor table and start of process description
z.
e85:0 ; used in job command
b1: b29+1*a4 ; own process description (second internal)
; end line:
e1=e17-a17;********************
g1: jl. w1 g28. ;
g48=k+4
<:ready **date not initialized <0>:> ; text until date initialized
g2: jl. w1 g28. , <:syntax error:<0>:>
g3: jl. w1 g28. , <:not allowed<0>:>
g4: jl. w1 g103. , <:no core<0>:>
g5: jl. w1 g103. , <:no buffers<0>:>
g6: jl. w1 g103. , <:no areas<0>:>
g7: jl. w1 g103. , <:no internals<0>:>
g8: jl. w1 g28. , <:illegal cpa<0>:>
g9: jl. w1 g103. , <:process unknown<0>:>
g10: jl. w1 g103. , <:process exists<0>:>
g11: jl. w1 g28. , <:catalog error<0>:>
g12: jl. w1 g28. , <:area unknown<0>:>
g13: jl. w1 g28. , <:area reserved<0>:>
g14: jl. w1 g103. , <:program too big<0>:>
g15: jl. w1 g28. , <:area error<0>:>
g16: jl. w1 g103. , <:device unknown<0>:>
g17: jl. w1 g103. , <:device reserved<0>:>
g18: jl. w1 g28. , <:not implemented<0>:>
g19: jl. w1 g103. , <:base illegal<0>:>
g20: jl. w1 g103. , <:bs claims exceeded<0>:>
g21: jl. w1 g103. , <:bs device unknown<0>:>
g22: jl. w1 g103. , <:unknown<0>:>
g23: <:message<0>:>
g24: <:pause<0>:>
g25: jl. w1 g103. , <:no entries in maincat<0>:>
g26: <:max<0>:>
g27: jl. w1 g103. , <:illegal priority<0>:>
g29: jl. w1 g103. , <:prog name unknown<0>:>
g47: jl. w1 g28. , <:input aborted<0>:>
g101:jl. w1 g103. , <:illegal relocation<0>:>
g111:jl. w1 g103. , <:illegal old contents<0>:>
g126:jl. w1 g103. , <:no consol buffers<0>:>
g120: <:warning: susercat not updated<0>:>
g105: ; write message: (w1 text addr, w3 link)
b. i10 w. ; local write routine used after endline or error.
rs. w3 i1. ;
al w2 x1 ; save textaddr;
jl. w3 d19. ; init write;
jl. w3 d21. ; write text;
se. w2 g2.+2 ; if syntax error then
jl. i5. ;
al. w1 e20. ; write last read parameter;
jl. w3 d21. ;
rl. w1 e19. ;
rl. w0 e20. ;
sn w0 0 ;
jl. w3 d22. ;
;
i5: al w0 10 ; write newline;
jl. w3 d20. ;
jl. w3 d23. ; type line;
jl. (i1.) ; return;
;
i1: 0 ;save return addr
e.
;
;
g110: ;test area and continue indicator;
b. i10 w. ; local procedure used to test if continuation
; can take place (only after error and when
; reading from an area).
; return:
; link : continue and reading from area
; link+2 : no continue and reading from area
; link+4 : not reading from area
; w0, w1, w2: unchanged
ds. w1 i5. ;
rs. w2 i6. ;
rl. w2 e81. ;
rl. w1 e24. ;
rl w0 x1+c58 ; if inputstack = stack base then
sn w0 x1+c73 ;
jl. i4. ; goto not reading from area;
;
so w2 1 ; if continue = false then
jl. i2. ; goto no continue and reading from area
jl. i0. ; else goto continue and reading from area;
;
i4: am 4-2 ;not reading from area:
i2: am 2-0 ;no continue but reading from area:
i0: al w3 x3+0 ;continue and reading from area:
dl. w1 i5. ;
rl. w2 i6. ;
jl x3 ; return;
0 ;
i5: 0 ;
i6: 0 ;
e.
g103: ; continue command interpretation:
am 1 ; continue:= true;
g28: ; terminate command interpretation:
al w2 x1 ; continue:= false; (w2 := text address, even or odd)
rs. w2 e81. ;
al w3 0 ;
rs. w3 e77. ; increase access indicator := false;
; <* true after error in all, get or new commands *>;
se w3 (b13) ; if high part of clock <> 0 then
rs. w3 g48. ; remove warning;
al w3 -1 ;
rs. w3 e89. ; executing reentrant code := true;
rs. w3 e79. ; reset segment no in susercat
rl. w3 e25. ;
rl w3 x3+c28 ; if access count = 0 then
se w3 0 ;
jl. g106. ;
; begin
jl. w3 g105. ; write message(message);
jl. w3 d42. ; save work;
jl. g108. ;+0: error: goto release link
;+2: ok:
jl. w3 g110. ; test area and continue indicator;
jl. g35. ;+0: area and continue: goto next command;
jl. 2 ;+2: area and no continue:
jl. g108. ;+4: no area: goto release link;
; end
g106: ; else begin <* access count = 1 *>
sn. w1 g1.+2 ; if text = 'ready' then
jl. g46. ; goto send input;
;
jl. w3 g105. ; write message;
jl. w3 d42. ; save work;
jl. g107. ;+0: error: goto decrease access, release link;
;+2: ok:
jl. w3 g110. ; test area and continue indicator;
jl. g35. ;+0: area and continue: goto next command;
jl. g107. ;+2: area and no continue: goto decrease acces, release
jl. g46. ;+4: no area: send input;
; end;
;
;
g107: ; decrease access:
rl. w1 e25. ;
jl. w3 d10. ; decrease access(console);
;
;
g108: ; release link:
rl. w2 e25. ;
rl w2 x2+c25 ;
jl. w3 d48. ; release temp link(console);
am 0 ;+0: error: ignore (usually privileged consoles);
;+2: ok:
;
g109: ; link console buffer:
rl. w1 e25. ; if console buffer<>privileged then
al. w2 e35. ; link element(console, free chain);
zl w0 x1+c27 ;
so w0 1<3 ;
jl. w3 d18. ;
;
;
g30: al w2 0 ; exam first:
jl. g32. ; event:=0;
g31: rl. w2 e39. ; exam next:
g32: jd 1<11+24 ; wait event(event,next,result);
rs. w2 e39. ; event:=next;
rl w1 x2 +6 ; sender:=word(event+6);
sz. w2 (e89.) ; if executing non-reentrant code
jl. g41. ; and
se. w2 (e88.) ; event <> expected answer then
jl. g32. ; goto exam next;
g41: ;
sn w0 0 ; if result=0 then
jl. g34. ; goto message received;
jl. w3 d41. ; find work(event,old work);
jl. g31. ;+0: not found: let the answer be - should not happened
;+2: found:
al. w1 e51. ; answer received:
jd 1<11+18 ; wait answer(event,answer,result)
al w3 1 ; w1 := logical status
ls w3 (0) ; := 1 shift result
sn w3 1<1 ; + maybe status.answer;
lo w3 x1 ;
rs. w3 e59. ;
jl. w3 d43. ; restore work(work,event);
g33: rl. w2 e39. ; reject message:
jd 1<11+26 ; get event(event);
al w0 2 ;
al. w1 e51. ;
jd 1<11+22 ; send answer(event,answer,2);
jl. g30. ; goto exam first;
g34: rl. w3 e2. ; message received:
sh w3 1 ; if own buf<=1
jl. g31. ; then goto exam next;
sh w1 -1 ; if sender<0
jl. g33. ; then goto reject message;
sn w0 (x1 +0) ; if kind(sender)=0
jl. g50. ; then goto internal message;
rs. w1 e90. ; terminal:= sender;
al w0 x1 ;
jl. w3 d24. ; find_and_select_console_1(device,console,
jl. g33. ; reject message);
rs. w1 e25. ; console:= new console
al w0 x2 ; save w2 (buffer address);
jl. w3 d17. ; remove element(console);
; <* maybe the console was in the free chain *>
al w2 (0) ; restore w2
jd 1<11+26 ; get event(console buf);
al w0 1 ;
al. w1 e51. ;
jd 1<11+22 ; send answer(console)
g46: al w2 0 ;
jl. w3 d41. ; find work(0,new work);
jl. g108. ;+0: not found: goto release link, link console;
;+2: found:
al w0 x1+c73 ; input stack pointer := stack base;
rs w0 x1+c58 ;
g39: ; end;
al w2 x1+c66 ; first addr:= work+linebuf;
al w3 x1+c67 ; last addr:= work+outputlinebuf-2;
ds. w3 e49. ;
al. w1 e47. ;
jl. w3 d26. ; send buf (input mess, buf);
jl. w3 d42. ; save work(buf);
jl. g107. ;+2: error: goto decrease access and release link;
al w2 x1+c66-2 ; char shift := > 0; (* i.e. change word *)
ds. w2 e28. ; char addr := work + linebuf - 2;
wa. w2 e52. ;
rs. w2 e26. ; last addr := char addr + bytes;
; next command:
g35: jl. w3 d2. ; next param(type);
g36: ; exam command:
rl. w1 e25. ; if increase access indicator then
rl. w3 e77. ; <* after a call of new, all or get *>
sn w3 1 ;
jl. w3 d9. ; increase access(console);
;
al w3 0 ;
rs. w3 e77. ; increase access indicator := false;
;
sn w0 0 ; <* w0: type of next item *>
jl. g98. ; if type=0
se w0 1 ; or type<>1
jl. g2. ; then goto end line;
jl. w3 d19. ; init write;
al w3 -1 ;
rs. w3 e89. ; executing reentrant code := true;
rl. w3 e7. ; w3 := base of command table;
g37:; next command:
al w3 x3 +6 ; increase (command pointer);
dl w2 x3 +2 ; w1w2 := command name;
sh w1 0 ; if first of command <= 0 then
jl. g38. ; goto test end;
sn. w1 (e20.) ; if command.table <> name then
se. w2 (e21.) ;
jl. g37. ; goto next command;
; notice: only 6 first characters tested
; command found in table:
; test that it is allowed to call this command from this console
al w2 0 ;
rl w3 x3 +4 ;
ld w3 10 ; w0:= command mask.console
ls w3 -10 ; w1:= console
rl. w1 e25. ; w2:= command bits.command table
bz w0 x1+c27 ; w3:= relative command address
ls w2 -1 ;
ls w2 3 ;
sz w0 1<3 ; if console privileged then
jl. g40. ; goto command base
so w0 x2 ; if command not allowed(console) then
jl. g3. ; goto end line
so. w2 (e80.) ; if locked and not a bit 3 command then
jl. g3. ; goto end line
g40: jl. x3+g45. ; goto command-action;
; init write has been called
; w0 = command mask(console)
; w1 = console
g38: ; test found:
sn w1 0 ; if continuation = 0 then
jl. g2. ; goto end line; i.e. all commands tested
; all commands, not contained in primary part of command table, are
; considered non-reentrant
al w3 0 ;
rs. w3 e89. ; executing reentrant code := false;
ac w3 x1 +6 ; w3 := continuation address for more commands;
; (notice w3 = base of commands)
jl. g37. ; goto next command;
g98: rl. w1 e24. ; if stack=stackbase then
rl w2 x1+c58 ; goto endline else
sn w2 x1+c73 ; goto next command
jl. g1. ;
jl. g35. ;
;
b. i5 w.
g50: ; message:
; ---------
dl w0 x2 +10 ;
ds. w0 e32.+2 ; move message from buffer to <message>;
dl w0 x2 +14 ;
ds. w0 e32.+6 ;
dl w0 x2 +18 ;
ds. w0 e32.+10 ;
dl w0 x2 +22 ;
ds. w0 e32.+14 ;
al w2 x1 +0 ;
jl. w3 d25. ; find parent(sender,parent,
jl. g33. ; reject message);
rs. w1 e90. ; terminal:=child.terminal;
al w0 x3+c18 ;
jl. w3 d24. ; find_and_select_console_1(terminal_name.core_table, console);
jl. g33. ;+0: error: reject message;
rs. w1 e25. ;+2: ok: console:=new or old console;
rs. w2 e29. ; child:= sender;
dl w0 x2+a43 ; cur catalogbase:=child.catalogbase;
ds. w0 e75. ; <* save in case of newjob or replace *>;
jl. w3 d17. ; remove element(console);
al w2 0 ;
jl. w3 d41. ; find work(0,new work);
jl. g31. ;+0: not found:
; <* let the message be - try to find an answer which
; will release a workarea *>
;+2: found:
jl. w3 d19. ; init write;
rl. w3 e32. ; if message(0)(23)=1 then
so w3 2.1 ; begin stop child;
am d33-d39 ; writetext(<:pause:>)
jl. w3 d39. ; end
se. w3 0 ; else
am g24-g23 ; begin child name;
al. w1 g23. ; writetext(<:message:>)
jl. w3 d21. ; end;
rl. w2 e39. ;
jd 1<11+26 ; get event(event);
al w0 1 ;
al. w1 e32. ;
jd 1<11+22 ; send answer(event,message,1);
al. w1 e40. ;
jl. w3 d21. ; writetext(receiver);
al. w2 e32.+2 ; index:= 2;
g43: rl w1 x2 +0 ; next word:
bl. w3 e32.+1 ; word:= message(index);
ls w3 1 ; bits:= message(1);
hs. w3 e32.+1 ; message(1):= bits shift 1;
sh w3 -1 ; if bits(0)=1 then
jl. g44. ; goto number;
sn w1 0 ; if word=0 then
jl. g42. ; goto test more;
al w0 0 ; char:= word(0:7);
ld w1 8 ; word:= word shift 8;
jl. w3 d20. ; writechar(char);
al w0 0 ; char:= word(0:7);
ld w1 8 ; word:= word shift 8;
jl. w3 d20. ; writechar(char);
al w0 0 ; char:= word(0:7);
ld w1 8 ; word:= word shift 8;
am d20-d22 ; writechar(char);
; goto test more;
; number:
; writeinteger(word);
g44: jl. w3 d22. ; test more:
g42: al w2 x2 +2 ; index:= index+2;
sh. w2 e32.+14 ; if index<=14 then
jl. g43. ; goto next word;
al w0 10 ;
jl. w3 d20. ; writechar(10);
jl. w3 d23. ; typeline(buf);
zl. w1 e32. ; save function
rs. w1 e23.+2 ;
rl. w3 e24. ; save name in input buffer
al w3 x3+c66 ;
dl. w1 e32.+10 ;
ds w1 x3+2 ;
dl. w1 e32.+14 ;
ds w1 x3+6 ; end
dl. w1 e26. ; simulate empty input string
ds. w1 e28. ; ( after unstack command)
jl. w3 d42. ; save work
am 0 ; +2 error (dont care)
rl. w3 e23.+2 ; if function = newjob then
sn w3 12 ; goto stack-input
jl. g97. ; else
se w3 10 ; if function = finis or replace then
sn w3 2 ;
sz ;
jl. g108. ;
jl. w3 d39. ; stop process(child); c. if stopbit was off;
jl. w3 (i0.) ; adjust bs claim
jl. w3 d40. ; remove process
rl. w3 e23.+2 ; if function =replace then
se w3 10 ;
jl. g108. ;
g97: rl. w2 e24. ;
al w2 x2+c66 ;
dl. w1 e75. ; stack input(child.catalogbase, areaname);
jl. w3 d79. ; goto next command
jl. g35. ;
;
i0: d76 ; adjust bs-claims
e. ; end message;
g45: ; base for command-relatives
; define pseudo-entries for conditinally-assembled commands
g70: ; break
g72: ; include
g73: ; exclude
g74: ; call
g75: ; list
g76: ; max
g77: ; replace
g83: ; all
g89: ; job
g90: ; print
g91: ; modify
jl. g18. ; goto not implemented;
; command syntax: read <area name>
; ---------------------------------
g57: ; read:
jl. w3 d15. ; next name;
al. w2 e20. ;
dl. w1 e76. ; catalogbase := max catalogbase;
jl. w3 d79. ; stack input (name);
jl. g35. ; goto next command;
; command syntax: unstack
; ------------------------
g58: ; unstack:
jl. w2 d80. ; unstack input;
jl. g35. ; goto next command;
; command syntax: date <year> <month> <date> <hour> <min> <sec>
; --------------------------------------------------------------
b. i20, j30 w. ;
j0: ; minimum values:
82 , 1 , 1 , 0 , 0 , 0
j1: ; top values:
99+1, 12+1, 31+1, 23+1, 59+1, 59+1
j2: ; year,month,day,hour,min,sec
0 , 0 , 0 , 0 , 0 , 0
j5: ; month table: jan, ..., dec
h. 365, 396, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
w.
j11: 4 ; minutes per four minutes
j13: 24 ; hours per day
j14: 60 ; minutes per hour
j17: 365*3+366 ; days per four years (inclusive leap year)
j18: 10000 ; units per second
j20: 60*4 * 10000 ; units per four minutes
j30: <:oldcat:> ; name of successor-command
g49: ; date:
al w1 0 ; for i := 0 step 2 until 10 do
i0: ; begin
jl. w3 d16. ; next integer;
sl. w0 (x1+j0.) ; if number < min value
sl. w0 (x1+j1.) ; or number >= top value then
jl. g2. ; goto syntax error; (* i.e. illegal date *)
rs. w0 x1+j2. ; save number;
al w1 x1+2 ;
se w1 12 ;
jl. i0. ; end;
dl. w2 j2.+2 ; w1 := year; w2 := month;
sh w2 2 ; if month > february then
al w1 x1-1 ; year := year - 1;
al w1 x1-68 ; days := (year - 68)
wm. w1 j17. ; * days in four years
as w1 -2 ; / 4
ba. w1 x2+j5.-1 ; + month table (month)
wa. w1 j2.+4 ; + day;
wm. w1 j13. ; w1 := hours := days * 24
wa. w1 j2.+6 ; + hour;
al w2 0 ; w2w3 := min;
rl. w3 j2.+8 ;
wm. w1 j14. ; w0w1 := minutes := hours * 60
aa w1 6 ; + min;
wd. w1 j11. ; w1 := fourmin := minutes / 4;
wm. w0 j14. ; seconds := minutes mod 4 * 60
wa. w0 j2.+10 ; + sec;
wm. w0 j18. ; msec := seconds * 10000;
rl w3 0 ; (w2=0) w3 := msec;
wm. w1 j20. ; clock := fourmin * 2400000
aa w1 6 ; + msec;
jd 1<11+38; set clock (clock);
dl. w1 j30.+2 ; name := successor command name;
ds. w1 e21. ;
al w0 1 ; type := 1; <* i.e. pretend that 'oldcat' has been read *>
sl w0 (b25) ; if maincat not defined yet then
jl. g36. ; goto next command; <* i.e. interpret 'oldcat' *>
jl. g35. ; goto next command;
e. ;
b.i30 w. ; new:
; --------
g51:
la. w0 i0. ; abs addr(console):= all bs(console):=
; abs protection(console):=false;
rs w0 x1+c26 ; prio(console):= 0;
hs w0 x1+c37 ; pr(console):=illegal pr;
dl. w3 i2. ; buf claim(console):=standard buf;
ds w3 x1+c34 ; area claim(console):=standard area;
rl. w3 i3. ; internal claim(console):=standard int;
rs w3 x1+c39 ; cat mask(console):=standard cat;
rl. w0 i9. ;
rl. w3 i9. ;
ds w0 x1+c41+2 ; max interval(console):=max interval(s)
ds w0 x1+c42+2 ; standard interval(s)
ds w0 x1+c43+2 ;
jl. w3 d46. ; reset last of console;
rl. w2 i25. ; get work device name
jl. w3 d61. ; get devno*8
jl. g16. ; sorry goto end line
wa. w2 e25. ;
dl. w0 i6. ; perm claim(work device) :=
ds w0 x2+c44+6 ; standard segment,entries;
i10: dl. w3 i4. ; size(console):=standard size;
rl. w1 e25. ;
ds w3 x1+c40+2 ;
dl. w3 i5. ;
ds w3 x1+c40+6 ; prog(console):=standard prog;
al w3 1 ; <* for both 'new' and 'all' *>
rs. w3 e77. ; increase access indicator := true;
jl. g52. ; goto process;
i0:8.1771 ;
c7<12+c8 ; standard buf and area:
i2:c9<12+c10 ; standard int and func:
i3:c12 ; standard size:
i4=k+2, i5=k+6 ; standard prog:
<:fp:>,0,0,0 ;
c13 ; standard segment claim
i6:c14 ; standard entry claim
i8:8.2000 ; all bs resources bit
i9:8388605
i25: c15 ; work device name
c. (:c23>16a.1:)-1 ;
g83 = k ; all:
; ---------
la. w0 i0. ; abs addr(console):=
lo. w0 i8. ; abs prot(console):= false
rs w0 x1+c26 ; all bs(console):= true
rl. w2 b1. ;
dl w0 x2+a45 ;
ds w0 x1+c41+2 ; maxbase:=standardbase(s)
ds w0 x1+c42+2 ; standardbase:= ------
ds w0 x1+c43+2 ; userbase:= -------
bz w0 x2+a19 ; bufclaims(s)
ws. w0 e2. ; - ownbuf
hs w0 x1+c32 ; =: bufclaims(console)
bz w0 x2+a20 ; areaclaims(s)
ws. w0 e3. ; - own area
hs w0 x1+c33 ; =: areaclaims(console)
bz w0 x2+a21 ; internalclaims(s)
bs. w0 1 ; -1
hs w0 x1+c34 ; =:internalclaims(console)
bz w0 x2+a22 ; functionmask(s)
hs w0 x1+c35 ; =: functionmask(console)
al w0 0 ; size(console) := 0; <* i.e. max, see create child *>
rs w0 x1+c39 ;
jl. w3 d46. ; clear claimlist;
jl. i10. ;
z. ;
e.
b. j5 w.
g94: am c95-c96 ; i:
; -------
g95: al w1 x1+c96+2 ; o:
; -------
jl. w3 d16. ; get kind
rs w0 x1-2 ;
jl. j1. ; continue with get name
g52: am c29-c40 ; process:
; ---------
g53: al w1 x1+c40 ; program:
; ---------
j1: jl. w3 d15. ; next name;
rl. w3 j2. ; test name
sn. w3 ( e20.) ; if name="s"
jl. g3. ; then goto error : not allowed
dl. w3 e21. ;
ds w3 x1 +2 ;
dl. w3 e23. ;
ds w3 x1 +6 ; name(console):=name;
jl. g35. ; goto next command;
j2: <:s<0>:> ; (prevent blocking communication with s)
e.
;
m. step 1
;
; stepping stones
; ---------------
;
jl. (2) , l2 , d2 = k-4
jl. (2) , l15 , d15 = k-4
jl. (2) , l14 , d14 = k-4
jl. (2) , l16 , d16 = k-4
jl. (2) , l17 , d17 = k-4
jl. (2) , l18 , d18 = k-4
jl. (2) , l19 , d19 = k-4
jl. (2) , l20 , d20 = k-4
jl. (2) , l21 , d21 = k-4
jl. (2) , l22 , d22 = k-4
jl. (2) , l23 , d23 = k-4
jl. (2) , l24 , d24 = k-4
jl. (2) , l27 , d27 = k-4
jl. (2) , l34 , d34 = k-4
jl. (2) , l39 , d39 = k-4
jl. (2) , l41 , d41 = k-4
jl. (2) , l42 , d42 = k-4
jl. (2) , l44 , d44 = k-4
jl. (2) , l46 , d46 = k-4
jl. (2) , l51 , d51 = k-4
jl. (2) , l52 , d52 = k-4
jl. (2) , l53 , d53 = k-4
jl. (2) , l54 , d54 = k-4
jl. (2) , l55 , d55 = k-4
jl. (2) , l56 , d56 = k-4
jl. (2) , l57 , d57 = k-4
jl. (2) , l58 , d58 = k-4
jl. (2) , l61 , d61 = k-4
jl. (2) , l64 , d64 = k-4
jl. (2) , l74 , d74 = k-4
jl. (2) , l77 , d77 = k-4
jl. (2) , l78 , d78 = k-4
jl. (2) , g1 , g1 = k-4
jl. (2) , g3 , g3 = k-4
b.i24
w.g54:lo. w0 i0. ; address:
; ---------
hs w0 x1+c27 ; abs addr(console):=true;
am c30-c39 ;
g56: al w2 x1+c39 ; size:
; ---------
jl. w3 d16. ; next integer(integer);
sz w0 2.1 ;
bs. w0 1 ; integer(23):= 0;
c.(:a399>23a.1:)-1
al w1 0 ;
ld w0 -11 ;
se w1 0 ; if integer mod 2k <>0 then
ea. w0 1 ; round up
ls w0 11 ;
z.
rs w0 x2 +0 ; word param(console):=integer;
jl. g35. ; goto next command;
i0:1<1
e.
b.i10
w.
; mode :
; ----------
; syntax mode <short integer>
g55: la. w0 i2. ; abs protection=false
rs w0 4 ; w2=command mask
jl. w3 d16. ; next integer
sn w0 0 ; if mode=0 then
lo. w2 i3. ; abs protection=true
rs w2 x1+c26 ;
jl. g35. ; next command
g60: am c32-c33 ; buffer claim:
; -------------
g61: am c33-c34 ; area claim:
; -------------
g62: al w2 x1+c34 ; internal claim:
; ---------------
i1: jl. w3 d16. ; next integer(integer);
hs w0 x2 +0 ; byte param(console):=integer;
jl. g35. ; goto next command;
i2:8.7773
i3:1<2
e.
; cpa <cpavalue> or 0 or 1 :
; --------------------------
g59: jl. w3 d16. ; next integer
sh w0 -1 ; if < 0 then
jl. g8. ; write : illegal cpa
c.(:a399>23a.1:)-1
sz w0 (b216) ; if new cpa mod 2k<>0 then
jl. g8. ; write: illegal cpa
z.
rs w0 x1+c98 ;
jl. g35. ; goto next command
; function mask:
; --------------
g63: jl. w3 d45. ; next bitnumbers(bits, type);
ls w2 -12 ;
hs w2 x1+c35 ; function mask(console):=bits(0:11);
jl. g36. ; goto exam command;
; create:
; --------
b. i5 w.
i0: <:link<0>:>
g64: rl. w3 e22. ;
sn. w3 (i0.) ; if command=createlink then
jl. g112. ; goto createlink
jl. w3 d35. ;
rl. w2 e29. ; create child;
rl w0 x2+a17 ;
; wa w0 x2+a182
jl. w3 d36. ; modify child(first addr(child));
jl. g35. ; goto next command;
e.
; init:
; -------
g65: jl. w3 d35. ; create child;
jl. w3 d37. ; load child;
jl. g35. ; goto next command;
; run:
; -------
g66: rl. w1 e25. ;
jl. w3 d10. ; decrease access(console);
jl. w3 d35. ; create child;
jl. w3 d37. ; load child;
jl. w3 d38. ; start child;
jl. g35. ; goto next command;
; load:
; --------
g67: jl. w3 d34. ; check child;
jl. w3 d37. ; load child;
jl. g35. ; goto next command;
; start:
; ---------
g68: rl. w1 e25. ;
jl. w3 d10. ; decrease access(console);
jl. w3 d34. ; check child;
jl. w3 d38. ; start child;
jl. g35. ; goto next command;
; stop:
; --------
g69: jl. w3 d34. ; check child;
jl. w3 d39. ; stop child;
jl. g35. ; goto next command;
c.(:c23>22a.1:)-1 ; if break option then
g70 = k ; break:
; ---------
jl. w3 d34. ; begin check child;
jl. w3 d39. ; stop child;
rl. w2 e29. ;
rl w3 x2+a27 ; addr:=interrupt addr(child);
sn w3 0 ; if addr<>0 then
jl. g35. ; begin
wa w3 x2+a182 ; addr:=addr + base (physical)
dl w1 x2+a29 ; word(addr):=save w0(child);
ds w1 x3 +2 ; word(addr+2):=save w1(child);
dl w1 x2+a31 ; word(addr+4):=save w2(child);
ds w1 x3 +6 ; word(addr+6):=save w3(child);
dl w1 x2+a33 ; word(addr+8):=save ex(child);
ds w1 x3 +10 ; word(addr+10):=save ic(child);
al w1 8 ; word(addr+12):=8;
rs w1 x3 +12 ;
ws w3 x2+a182 ; addr:=addr - base (logical)
al w0 x3+a180 ; modify child(addr+a180);
jl. w3 d36. ; start child;
jl. w3 d38. ; end;
jl. g35. ; goto next command;
z.
; remove:
; ---------
b. i24 w.
i0: <:link<0>:>
g71: rl. w3 e22. ;
sn. w3 (i0.) ; if command=removelink then
jl. g113. ; goto removelink
jl. w3 d34. ; check child;
jl. w3 d39. ; stop child;
jl. w3 (i1.) ; adjust bs-claims
jl. w3 d40. ; remove child;
jl. g35. ; goto next command;
; cleanup:
g104: ; cleanup:
; ----------
rl. w3 e15.+c20 ; while first of core table <> core table head do
sn. w3 e15. ; begin
jl. g35. ; done: goto next command;
rs. w3 e30. ; coretable element:=first of coretable;
rl w0 x3+c17 ; child:= child(first of core table);
rs. w0 e29. ;
jl. w3 d39. ; stop process;
jl. w3 (i1.) ; adjust bs-claims;
jl. w3 d40. ; remove child;
jl. g104. ; end;
i1: d76
e.
c.(:c23>21a.1:)-1 ; if include/exclude option then
g72 = k ; include:
; ------------
am 2 ;
g73 = k ; exclude:
; ------------
b.i24 w. ; begin
rl. w3 i2. ;
rs. w3 i1. ;
jl. w3 d34. ; check child;
i0: jl. w3 d2. ; more:
se w0 2 ; next param(type);
jl. g36. ; if type<>2
rl. w1 e25. ; then goto exam command;
al w3 x1+c29 ;
rl. w1 e19. ; include/exclude(name(console),
i1: am 0 ; integer,result);
se w0 0 ; if result=0
jl. g16. ; then goto more
jl. i0. ; else goto end line;
i2: jd 1<11+14 ;
jd 1<11+12 ;
e.z.
c.(:c23>20a.1:)-1 ; if call option then
g74 = k ; call:
; --------
b.i24 w. ; begin
i0: jl. w3 d2. ; more: next param(type);
se w0 2 ; if type<>2
jl. g36. ; then goto exam command;
rl. w1 e19. ; device:=integer;
jl. w3 d15. ; next name;
al. w3 e20. ; create peripheral process(
jd 1<11+54 ; name,device,result);
sn w0 3 ; if result=3
jl. g10. ;
sn w0 4 ; or result=4
jl. g16. ;
sn w0 5 ; or result=5
jl. g17. ; then goto end line
jl. i0. ; else goto more;
e.
z.
c.(:c23>19a.1:)-1 ; if list option then
b.i24 w. ; begin
g75 = k ; list:
; ---------
rl w2 b6 ;
i1: sl w2 (b7) ; for i:=first internal step 1
jl. g35. ; until last internal do
rl w1 x2 ;
rl w0 x1+a11 ; if name=0
rl w3 x1+a34 ; or
al w2 x2 +2 ; parent=0
rs. w2 e78. ;
se w0 0 ;
sn w3 0 ; else
jl. i1. ; begin
jl. w3 d19. ; initwrite
rl w2 x2 -2 ;
al w1 x2+a11 ;
jl. w3 d21. ; writetext(processname)
ac w1 x1 -12 ;
jl. w3 d70. ; writespace(no af spaces)
rl w1 x2+a17 ;
wa w1 x2+a182
al w0 8 ;
jl. w3 d71. ; writeint(first core,8)
rl w1 x2+a18 ;
ws w1 x2+a17 ;
al w0 8 ;
jl. w3 d71. ; writeint(coresize,8)
rl w1 x2+a301 ;
al w0 4 ;
jl. w3 d71. ; writeint(priority,8)
zl w1 x2+a12 ;
al w0 4 ;
jl. w3 d71. ; writeint(stopcount,4)
bl w0 x2+a13 ; w0 := process state;
;
al. w3 i9. ; write process state:
sz w0 2.10000000 ; if not waiting then
jl. i3. ; begin
sz w0 2.00000011 ; if not running then
jl. i2. ;
jl. w1 d21. ; writetext(<:error :>)
<: error :> ;
i2: jl. w1 d21. ; else
<: running :> ; writetext(<:running :>;
i3: ; end else
so w0 2.10100000 ; if waiting for stop or start then
jl. i4. ; writetext(<:stop :>)
jl. w1 d21. ;
<: stopped :> ; else
i4: sz w0 2.00000111 ; if waiting for cpu then
jl. i5. ; writetext(<:waiting cpu :>)
jl. w1 d21. ;
<: wait cpu :> ; else
i5: so w0 2.00000011 ; if waiting for event then
jl. i6. ; writetext(<:waiting event :>)
jl. w1 d21. ;
<: wait evnt :> ; else
i6: sz w0 2.00000011 ; if waiting for procfunc then
jl. i7. ; writetext(<:waiting proc :>)
jl. w1 d21. ;
<: wait proc :> ; else
i7: so w0 2.00000001 ; if waiting for message then
jl. i8. ; writetext(<:waiting mess :>)
jl. w1 d21. ;
<: wait mess :> ; else
i8: jl. w1 d21. ; writetext(<:waiting answ :>);
<: wait answ :> ;
i9: ; comment: return from writetext;
rl w1 x2+a34 ;
al w1 x1+a11 ;
jl. w3 d21. ; writetext(parent)
al w0 10 ;
jl. w3 d20. ; writechar(nl)
jl. w3 d23. ; typeline(buf)
jl. w3 d42. ; save work(buf)
jl. g47. ; +2 error goto end line
rl. w2 e78. ;
jl. i1. ;
e.
z.
c.(:c23>18a.1:)-1 ; if max option then
g76 = k ; max:
b.i24 w. ; begin
al. w1 g26. ;
jl. w3 d21. ; writetext(<:max:>);
am -2048 ;
jl. w3 d29.+2048; find max(size);
jl. w3 d22. ; writeinteger(size);
al w0 32 ;
jl. w3 d20. ; writechar(32);
rl. w2 b1. ;
bz w1 x2+a19 ;
ws. w1 (v2.) ; writeinteger(buf claim(s)
jl. w3 d22. ; -own buf);
al w0 32 ;
jl. w3 d20. ; writechar(32);
bz w1 x2+a20 ;
ws. w1 (v3.) ; writeinteger(area claim(s)
jl. w3 d22. ; -own area);
al w0 32 ;
jl. w3 d20. ; writechar(32);
bz w1 x2+a21 ;
jl. w3 d22. ; writeinteger(internal claim(s));
al w0 32 ;
jl. w3 d20. ; writechar(32);
c.-4000
al w2 8 ; keys:=8;
jl. w3 d32. ; find keys(keys,pr,pk,
jl. i0. ; typekeys);
am 0 ;
i0: ac w1 x2 -8 ; typekeys:
jl. w3 d22. ; writeinteger(8-keys);
z.
al w0 10 ;
jl. w3 d20. ; writechar(10);
jl. w3 d23. ; typeline(buf);
jl. w3 d42. ; save work(buf);
jl. g47. ;+2: error: goto end line;
jl. g35. ; goto next command;
e.
z.
c.(:c23>17a.1:)-1 ; if replace option then
g77 = k ; replace:
; ----------
b.i24 w. ; begin
jl. w3 d15. ; next name;
rl. w3 v20. ;
jd 1<11+52 ; create area process(name,result);
sn w0 2 ;
jl. g11. ; if result=2
se w0 3 ; or result=3
sn w0 4 ; or result=4 then
jl. g12. ; goto end line;
al. w1 e51. ;
rl. w3 b1. ; next buffer:
i0: al w2 0 ; buf:=0;
jd 1<11+24 ; wait event(buf);
jd 1<11+26 ; get event(buf);
ba. w0 1 ; result:=result+1;
sn w0 1 ; if result=1 then
jd 1<11+22 ; send answer(buf,answer,result);
rl w0 x3+a15 ; next:=word(event q(proc));
se w0 x3+a15 ; if next<>event q(proc) then
jl. i0. ; goto next buffer;
al. w3 (v20.) ;
jd 1<11+8 ; reserve process(name,result);
sn w0 1 ; if result=1 then
jl. i2. ; goto give up;
al. w1 e51. ;
jd 1<11+42 ; lookup entry(name,tail,result);
sn w0 2 ; if result=2 then
jl. i3. ; goto give up;
bz. w0 e59. ;
se w0 8 ; if content<>8 then
jl. i4. ; goto give up;
rl. w1 e60. ;
al w1 x1+511 ;
ls w1 -9 ; load size:=
ls w1 9 ; (bytes(tail)+511)/512*512;
jl. w3 d27. ; find size(start,size,give up);
jl. i6. ;
wa w1 0 ; last addr(area mess):=
al w1 x1 -2 ; first addr+load size-2;
ds. w1 (v49.) ; first addr(area mess):= first addr;
rl. w1 (v58.) ; segment(area mess):=
rs. w1 (v50.) ; segment(tail);
bz. w1 (v67.) ;
wa w1 0 ;
rs. w1 i20. ; entry:= first addr+entry(tail);
rl. w3 (v49.) ;
sh w1 x3 ; if entry>last addr(area mess) then
jl. 4 ;
jl. i5. ; goto give up;
al. w1 (v47.) ;
rl. w3 v20. ;
jd 1<11+16 ; send mess(name,area mess,buf);
al. w1 (v51.) ;
jd 1<11+18 ; wait answer(buf,answer,result);
rl. w1 (v51.) ;
lo w1 0 ; res:= status or result;
jd 1<11+64 ; remove process(name,result);
se w1 1 ; if res <> 1 then
jl. g15. ; goto sorry;
rl. w0 i22. ;
rs. w0 g30. ;
jl. g1. ;
i12: rl. w1 (v24.) ; ok:
rl w2 x1+c50 ; buf:= state(work);
jd 1<11+18 ; wait answer(buf,work,result);
ld w1 -100 ; w0:= w1:= 0;
rl. w2 (v25.) ;
rl w2 x2+c25 ; w2:=process descr.(console)
xl. 0 ; ex:= 0;
jl. (i20.) ; goto entry;
i2: am g13-g11;
i3: am g11-g12;
i4: am g12-g14;
i5:
i6: al. w2 g14. ; give up:
rl. w3 v20. ;
jd 1<11+64 ; remove process(name,result);
jl x2 +0 ; goto end line;
i20: 0 ; entry
i22: jl. i12-g30 ; return to ok
e.
z.
; closecatopr
; -----------
;
; closecatopr
;
b. i5, j5 w.
g119: ; closecatopr
; begin
rl. w1 i0. ; first core := first free core;
rs. w1 (v16.) ;
al w1 0 ;
rl. w3 (v12.) ; command table end := 0;
rs w1 x3 ;
jl. g35. ; goto next command;
i0: h11 ; top of resident commands;
e. ; end;
; priviliged
; -----------
;
; priviliged
;
b. i5, j5 w.
g124: ; priviliged
; begin
jl. w3 d15. ; next_name;
rl. w1 v20. ; begin
rl. w3 (v35.) ;
rl w2 x3+c20 ;
sn w2 (x3+c21) ; if number of free consolbuffs < 2 then
jl. g126. ; write 'no free';<* dont use the last one *>
al w0 x1-2 ; pseudo_pd:=name area address -2
jl. w3 d64. ; find_and_select_console_2(pseudo_pd_addr,consol_buf);
jl. g126. ; not_found: goto no consolbuffers;
al w3 2.1000 ;
lo w3 x1+c27 ;
hs w3 x1+c27 ; set(privileged);
jl. w3 d17. ; remove_element(console);
jl. g35. ; else goto next command;
; end;
; unprivileged
; -----------
;
; unprivileged
;
g125: ; unprivileged
; begin
jl. w3 d15. ; next_name;
rl. w1 v20. ; begin
al w0 x1-2 ; pseudo_pd:=name area address -2
jl. w3 d44. ; find_console(pseudo_pd_addr,console_buf);
jl. g22. ;not_found: goto unknown;
am (b4) ;found:
rl w3 a199<1 ;
se w3 (x1+c25) ; if console = mainconsole or
se w1 (x1+2) ; not unlinked then
jl. g3. ; goto not allowed;
zl w3 x1+c27 ;
al w3 x3-2.1000 ; remove privileged;
hs w3 x1+c27 ;
rl. w2 v35. ;
jl. w3 d18. ; insert_in_free(console);
jl. g35. ; else goto next command;
e. ; end;
;
m. step 2 g-names
;
; stepping stone
;
jl. (2), g2, g2=k-4
jl. (2), g9, g9=k-4
jl. (2), g11, g11=k-4
jl. (2), g15, g15=k-4
jl. (2), g16, g16=k-4
jl. (2), g19, g19=k-4
jl. (2), g20, g20=k-4
jl. (2), g21, g21=k-4
jl. (2), g22, g22=k-4
jl. (2), g27, g27=k-4
jl. (2), g31, g31=k-4
jl. (2), g35, g35=k-4
jl. (2), g36, g36=k-4
jl. (2), g47, g47=k-4
jl. (2), g66, g66=k-4
c.(:a80>16a.1:)-1 ; <* include connect, disconnect, link, unlink, linkall
; and initkit if itc device drivers are included *>
b. p21 w. ; itc controller command block
p0 = 6 ; size of logical disc description
c. -1
p1: <:connect error <0>:>
p2: <: connected to<0>:>
p3: <:disconnect error <0>:>
p4: <:link error <0>:>
p5: <:logical disc linked on<0>:>
p6: <:unlink error <0>:>
p7: <:disc error <0>:>
p8: <:illegal devno<0>:>
p9: 0,0,0,0 ; name save area
p10: 0 ; param area: cm / log devno
0 ; unit / phys devno
0 ; devno or -1 / first segment
0 ; kind, type / no of segments
5 ; max outstanding operations
p11: h23 ; first of disc buffer
p12: h24 ; last of disc buffer
p13: <:unknown <0>:> ; device name table
p14: <:disc <0>:>
p15: <:terminal<0>:>
p16: <:printer <0>:>
p17: <:tape <10>:>
p18: <:idamain <0>:>
p19: <:ifpmain <0>:>
p20: <:gsd<0>:>
; connect:
; --------
;
; connect <name of itcmain> <device kind> <device type> <cm> <unit> (<device no>)
;
b. i5, j5 w.
g112: ; connect
; begin
jl. w3 d15. ; next name; <* itc main process name *>
dl. w0 (v21.) ; <* move name to local save area *>
ds. w0 p9.+2 ;
dl. w0 (v23.) ;
ds. w0 p9.+6 ;
al. w1 p10. ;
jl. w3 d16. ; param.device type := next integer;
hs w0 x1+6+0 ;
jl. w3 d16. ; param.device kind := next integer
hs w0 x1+6+1 ;
;
jl. w3 d16. ; param.cm := next integer;
rs w0 x1+0 ;
jl. w3 d16. ; param.unit := next integer;
rs w0 x1+2 ;
;
jl. w3 d2. ; param.devno :=
rs. w0 (v78.) ; if next param = integer then param
al w1 -1 ; else -1;
sn w0 2 ;
rl. w1 (v19.) ; <* type of param is saved for later use
al. w2 p10. ; to determine whether the next command
rs w1 x2+4 ; has been read or not *>
al. w1 p9. ;
jl. w3 d51. ; connect(itcmain, param);
jl. j1. ; +0:
; +2: if not error then
jl. w3 d19. ; begin initwrite;
rl. w2 v51. ;
rl w1 x2+2 ;
ls w1 +1 ; connection :=
wa w1 b4 ; name table(answer.devno);
rl w2 x1 ;
al. w1 p13. ;
rl w0 x2 ; text:=
; device name table(answer.device kind);
sn w0 q6 ;
al. w1 p14. ;
sn w0 q8 ;
al. w1 p15. ;
sn w0 q14 ;
al. w1 p16. ;
sn w0 q18 ;
al. w1 p17. ;
sn w0 q20 ;
al. w1 p18. ;
sn w0 q26 ;
al. w1 p19. ;
sn w0 q28 ;
al. w1 p20. ;
jl. w3 d21. ; write(text);
rl w1 x2+a67 ;
jl. w3 d22. ; writeinteger(connection.cm);
rl w1 x2+a68 ;
jl. w3 d22. ; writeinteger(connection.unit);
al. w1 p2. ;
jl. w3 d21. ; write(<:connected to:>);
am. (v51.) ;
rl w1 +2 ;
jl. w3 d22. ; writeinteger(answer.devno);
jl. j2. ; end
j1: ; else begin
rl w2 0 ; <*save logical status*>
jl. w3 d19. ; initwrite;
al. w1 p1. ;
jl. w3 d21. ; write(<:connect error:>);
al w1 x2 ;
jl. w3 d14. ; writebits(logical status);
; end;
j2: ;
al w0 10 ;
jl. w3 d20. ; writechar(nl);
jl. w3 d23. ; type line(buf);
jl. w3 d42. ; save work(buf);
am 0 ; +0 ignore output error
rl. w0 (v78.) ; +2: else <get type of last read param >;
sn w0 2 ; if last read param = integer then
jl. g35. ; goto next command
jl. g36. ; else goto exam command;
;
i1: 0 ;
e. ; end;
; disconnect:
; -----------
; *
; disconnect (<device number>)
; 0
b. i5, j5 w.
g113: ; disconnect
jl. w3 d2. ; if next param <> integer then
se w0 2 ; goto exam command
jl. g36. ; else begin
rl. w0 (v19.) ; deviceno := read integer;
jl. w3 d52. ; disconnect(deviceno, logical status);
sz ; +0: if error then goto error
jl. g113. ; +2: else goto disconnect;
;
rl w2 0 ; error:
al. w1 p3. ; save error cause;
jl. w3 d21. ; writetext(<:disconnect error:>;
al w1 x2 ;
jl. w3 d14. ; writebits(logical status);
al w0 10 ;
jl. w3 d20. ; writechar(nl);
jl. w3 d23. ; type line(buf);
jl. w3 d42. ; save work(buf);
jl. g47. ; +0: if error then goto endline
jl. g113. ; +2: else goto disconnect
;
e. ; end;
z.
p1: <:createlink error <0>:>
p2: <: linked to<0>:>
p3: <:removelink error <0>:>
p4: <:link error <0>:>
p5: <:logical disc linked on<0>:>
p6: <:unlink error <0>:>
p7: <:disc error <0>:>
p8: <:illegal devno<0>:>
0,0,0,0 ;
p9: 0,0,0,0 ; name save area
; param area
; create link link logical disk
; disk/tape console/floppy
p10: 0 ; slave no kind log devno
0 ; facility no unused phys devno
0 ; devno or -1 devno or -1 first segment
0 ; kind, type unused no of segments
5 ; max outstanding operations
;
p11: h23 ; first of disc buffer
p12: h24 ; last of disc buffer
p13: <:unknown <0>:> ; device name table
p14: <:disc <0>:>
p15: <:console <0>:>
p16: <:printer <0>:>
p17: <:tape <0>:>
p20: <:gsd<0>:>
; createlink:
; --------
;
; createlink <main> <device type> <devicename>.<device no> (<slave> <facility>)
;
b. i5, j5 w.
i4=10 ; size of one element in create link param list
i5= 8 ; position of kind,modif in create link param list
g112: ; create link
; begin
jl. w3 d15. ; next name; <* main process name *>
dl. w0 (v21.) ; <* move name to local save area *>
ds. w0 p9.+2 ;
dl. w0 (v23.) ;
ds. w0 p9.+6 ;
jl. w3 d15. ; next_name;
dl. w0 (v21.) ;
rl. w1 i2. ;
al w1 x1-i4 ;
j0: al w1 x1+i4 ; pointer:=next_from_list;
sl. w1 (i3.) ; if not end of list then
jl. g2. ; begin
sn w3 (x1) ; if param.name<>name.list then
se w0 (x1+2) ;
jl. j0. ; goto next;
al. w2 p10. ;
rl w1 x1+i5 ; else c_param.device_kind:=kind;
rs w1 x2+6 ; c_param.type:=type;
; end else goto syntax error;
jl. w3 d15. ; next_name;
dl. w0 (v21.) ; <* move name to local save area *>
ds. w0 p9.-6 ;
dl. w0 (v23.) ;
ds. w0 p9.-2 ;
jl. w3 d16. ; next_integer;
rs w0 x2+4 ; c_param.device_no:=param.device_no;
zl w0 x2+6+0 ;
se w0 18 ; if tape or
sn w0 6 ; disc then
sz ;
jl. j3. ; begin
;
jl. w3 d16. ; c_param.slave:= param.slave;
rs w0 x2+0 ;
jl. w3 d16. ; c_param.unit := param.slave;
am 2 ; end else
j3: rs w0 x2+0 ; c_param.kind:=param:=kind;
dl. w0 p9.-6 ; move name to work
ds. w0 (v21.) ;
dl. w0 p9.-2 ;
ds. w0 (v23.) ;
al. w1 p9. ;
jl. w3 d51. ; create_link(main, c_param);
jl. j1. ; +0:
; +2: if not error then
al. w3 (v20.) ;
;
al w1 x2 ;
jd 1<11+54; create_peripheral_process(name,dev_no);
se w0 0 ; if result<>ok then
jl. 2 ; no action
jl. w3 d19. ; begin initwrite;
rl. w2 v51. ;
rl w1 x2+2 ;
ls w1 +1 ; link :=
wa w1 b4 ; name table(answer.devno);
rl w2 x1 ;
al. w1 p13. ;
rl w0 x2 ; text:=
; device name table(answer.device kind);
sn w0 q6 ;
al. w1 p14. ;
sn w0 q8 ;
al. w1 p15. ;
sn w0 q14 ;
al. w1 p16. ;
sn w0 q18 ;
al. w1 p17. ;
sn w0 q28 ;
al. w1 p20. ;
jl. w3 d21. ; write(text);
rl w1 x2+a67 ;
jl. w3 d22. ; writeinteger(link.slaveno);
rl w1 x2+a68 ;
jl. w3 d22. ; writeinteger(link.unit);
al. w1 p2. ;
jl. w3 d21. ; write(<:linked to:>);
am. (v51.) ;
rl w1 +2 ;
jl. w3 d22. ; writeinteger(answer.devno);
jl. j2. ; end
j1: ; else begin
rl w2 0 ; <*save logical status*>
jl. w3 d19. ; initwrite;
al. w1 p1. ;
jl. w3 d21. ; write(<:link error:>);
al w1 x2 ;
jl. w3 d14. ; writebits(logical status);
; end;
j2: ;
al w0 10 ;
jl. w3 d20. ; writechar(nl);
jl. w3 d23. ; type line(buf);
jl. w3 d42. ; save work(buf);
am 0 ; +0 ignore output error
jl. g35. ; goto next command
;
i1: 0 ;
i2: h14 ; start of name list
i3: h15 ; end of name list
e. ; end;
; removelink:
; -----------
; * *
; removelink (<device number>) (<device name>)
; 0 0
b. i5, j5 w.
g113: ; removelink
jl. w3 d2. ;
sn w0 0 ; if empty then
jl. g35. ; goto next param;
sn w0 1 ; if next param=name then
jl. j3. ; goto find_devno else
; if next param <> integer then
se w0 2 ; goto exam command
jl. g36. ; else begin
rl. w0 (v19.) ; deviceno := read integer;
j0: rl. w3 (v109. ; save last read char
rs. w3 (v78.) ; in work;
jl. w3 d52. ; removelink(deviceno, logical status);
jl. j4. ; +0: if error then goto error
rl. w3 (v78.) ; +2: else test next;
se w3 10 ; if not end of line then
jl. g113. ; goto get next param;
jl. g35. ; else goto next command;
j4:
rl w2 0 ; error:
al. w1 p3. ; save error cause;
jl. w3 d21. ; writetext(<:removelink error:>;
al w1 x2 ;
jl. w3 d14. ; writebits(logical status);
j2: al w0 10 ;
jl. w3 d20. ; writechar(nl);
jl. w3 d23. ; type line(buf);
jl. w3 d42. ; save work(buf);
jl. g47. ; +0: if error then goto endline
jl. g35. ; +2: else goto next param
; end;
j3: jl. w3 g123. ; find_devno(name);
jl. j2. ; error: goto out line;
jl. j0. ; ok: goto removelink
e. ; end;
; link logical disc
; -----------------
;
; link <devno of phys. disc> <first segment> <no of segm.> (<devno of log. disc>)
;
b. i5, j5 w.
g114: ; link
al. w2 p10. ; begin
jl. w3 d16. ; param.physical disc devno := next integer;
rs w0 x2+2 ;
jl. w3 d16. ; param.first segment := next integer;
rs w0 x2+4 ;
jl. w3 d16. ; param.no of segments:= next integer;
rs w0 x2+6 ;
;
jl. w3 d2. ; param.log-devno :=
rs. w0 (v78.) ; if next param = integer then
al w1 -1 ; integer
sn w0 2 ; else -1;
rl. w1 (v19.) ;
rs w1 x2+0 ;
;
jl. w3 d53. ; link(param, logical status, devno);
am p4.-p5.; +0: text := if error then <:link error:>
al. w1 p5. ; +2: else <:logical disc...:>;
rs. w0 i1. ;
jl. w3 d21. ; writetext(text);
rl. w1 i1. ;
se w1 1<1 ; if logical status = ok then
jl. j1. ; writeinteger(devno)
al w1 x2 ; else writebits(logical status);
jl. w3 d22. ;
sz ;
j1: jl. w3 d14. ;
al w0 10 ;
jl. w3 d20. ; writechar(nl);
jl. w3 d23. ; typeline(buf);
jl. w3 d42. ; save work(buf);
jl. g47. ; +0: if error then goto end line
rl. w0 (v78.) ; +2: else <get type of last read param>;
sn w0 2 ; if last read param = integer then
jl. g35. ; goto next command
jl. g36. ; else goto exam command;
;
i1: 0 ;
e. ; end;
; unlink logical disc
; -------------------
; *
; unlink (<device number>)
; 0
b. i5, j5 w.
j0: jl. w3 d19. ; init write
g115: ; unlink
jl. w3 d2. ; if next param <> integer then
se w0 2 ; goto exam command
jl. g36. ; else begin
rl. w0 (v19.) ; devno := read integer;
jl. w3 d54. ; unlink(devno);
sz ; +0: if error then goto error
jl. g115. ; +2: else goto unlink;
; error:
al w2 x1 ;
al. w1 p6. ;
jl. w3 d21. ; writetext(<:unlink error:>);
al w1 x2 ;
jl. w3 d14. ; writebits(logical status);
al w0 10 ;
jl. w3 d20. ; writechar(nl);
jl. w3 d23. ; typeline(buf);
jl. w3 d42. ; save work(buf);
jl. g47. ; +0: if error then goto endline
jl. j0. ; +2: else goto next unlink;
;
e. ; end;
z.
;
m. step 2
;
; stepping stones
;
jl. (2) , l2 , d2 = k-4
jl. (2) , l15, d15= k-4
jl. (2) , l16, d16= k-4
jl. (2) , l34, d34= k-4
jl. (2) , l39, d39= k-4
jl. (2) , l42, d42= k-4
jl. (2) , l46, d46= k-4
jl. (2) , l61, d61= k-4
jl. (2) , l74, d74= k-4
jl. (2) , l77, d77= k-4
jl. (2) , l78, d78= k-4
jl. (2) , g2, g2 = k-4
jl. (2) , g11, g11= k-4
jl. (2) , g12, g12= k-4
jl. (2) , g13, g13= k-4
jl. (2) , g15, g15= k-4
jl. (2) , g35, g35= k-4
jl. (2), g111, g111= k-4
c.(:a80>16a.1:)-1
; linkall
; -------
;
; linkall <devno of phys. disc> / <name of phys. disc>
;
b. i5, j15 w.
g116: ; linkall <main entrypoint>
jl. w3 d2. ;
sn w0 1 ; if next param=name then
jl. j11. ; goto find_devno else
; if next param <> integer then
se w0 2 ; goto exam command
jl. g36. ; else begin
rl. w0 (v19.) ; deviceno := read integer;
j0: al w3 0 ; execute reentrant code := false;
rs. w3 (v89.) ; <nessesary as kiton is called>
al. w3 g35. ; <return address := next command>
;
g118: ; linkall <2nd entrypoint>
rs. w3 (v83.) ; begin
rs. w0 (v101.) ; w0: devno of link
rs. w0 (v102.) ; w3: link
rl w1 0 ;
jl. w3 d56. ; check device(devno);
jl. j9. ; +0: if error or
sn w0 6 ; +2: not (kind of device = idadisc and
se w3 0 ; type of device = physical disc) then
jl. j9. ; goto <illegal devno>;
;
rl. w1 (v24.) ;
rs. w1 (v104.) ; user of buffer := current work;
rl. w1 (v101.) ;
al w0 0 ;
jl. w3 d55. ; read segment(0,devno of readdevice);
jl. j10. ; +0: if error then goto disc error;
; +2:
rl. w1 p11. ; pointer :=
rl w2 x1+0 ; (buffer.no of files * 2 + 1) * 2;
ls w2 +1 ;
al w2 x2+1 ;
ls w2 +1 ;
am x1 ; pointer :=
al w2 x2+2 ; pointer + buffer.start + 2; <skip 'no of log discs'>
rs. w2 (v103.) ;
sl. w2 (p11.) ; if not pointer within buffer then goto finis;
sl. w2 (p12.) ; <*uninitialized description*>
jl. j7. ;
zl w0 x2-2 ; size of log disc description :=
sn w0 0 ; if buffer(pointer - 2)=0 then default size
al w0 p0 ; else
rs. w0 (v105.) ; buffer(pointer - 2);
;
j3: jl. w3 d19. ; while true do
rl. w0 (v24.) ; begin
sn. w0 (v104.) ; init write;
jl. j4. ;
rs. w0 (v104.) ; if user of buffer <> current work then
al w0 0 ; begin user of buffer := current work;
rl. w1 (v101.) ;
jl. w3 d55. ; read segment(0, devno of read device);
jl. j10. ; +0: if error then goto disc error;
rl. w2 (v103.) ; +2:
; end;
j4: ;
dl w0 x2+2 ; if buffer(pointer).first segment = -1 then
sn w3 -1 ; goto finis;
jl. j7. ;
ds. w0 p10.+6 ; param.first segment := buffer(pointer+0);
; param.no of segments:= buffer(pointer+2);
el w3 x2+5 ; param.log devno := buffer(pointer+5);
rl. w0 (v102.) ; param.phys devno:= devno;
ds. w0 p10.+2 ;
al. w2 p10. ;
jl. w3 d53. ; link(param, devno);
jl. j1. ; +0: if error then goto linkerror;
rl. w1 (v103.) ; +2:
zl w1 x1+4 ;
ls w1 -1 ; if buffer (pointer).type = rc8000 catalog and
rl. w3 (v12.) ; kiton-command still valid then
rl w3 x3 ;
sn w1 1 ; kiton(devno)
sn w3 0 ;
jl. j2. ;
jl. w3 (i2.) ;
jl. j6. ; else
j1: am p4-p5 ; begin
j2: al. w1 p5. ; text := if linkerror then <:link error:>
rs. w0 i1. ; else <:logical disc..:>;
jl. w3 d21. ; write(text);
rl. w1 i1. ;
se w1 1<1 ; if logical status = ok then
jl. j5. ; begin
rl. w1 (v54.) ; if answer.first segment = 0 then
sn w1 0 ; devno of read device := devno;
rs. w2 (v101.) ;
al w1 x2 ;
jl. w3 d22. ; writeinteger(devno);
sz ; end
j5: jl. w3 d14. ; else writebits(logical status);
al w0 10 ;
jl. w3 d20. ; writechar(nl);
jl. w3 d23. ; typeline(buf);
jl. w3 d42. ; save work(buf);
am 0 ; +0: error:
; +2:
j6: ; end;
rl. w2 (v103.) ;
wa. w2 (v105.) ; pointer := pointer + size of log disc descrp;
rs. w2 (v103.) ;
jl. j3. ; end ***while true do***;
;
j7: ; finis:
rl. w3 (v83.) ; return;
jl x3 ;
;
j9: ; illegal devno:
al. w1 p8. ; writetext(<illegal devno>);
jl. w3 d21. ;
jl. j8. ; goto writebuf;
;
j10: ; disc error:
al w2 x1 ;
al. w1 p7. ;
jl. w3 d21. ; write(<:disc error:>);
al w1 x2 ;
jl. w3 d14. ; writebits(logical status);
j8: al w0 10 ; writebuf:
jl. w3 d20. ; writechar(nl);
jl. w3 d23. ; typeline(buf);
jl. w3 d42. ; save work(buf);
am 0 ; +0:
jl. j7. ; +2: goto finis;
; end;
j11:
al. w3 g35. ; <return address := next command>
rs. w3 (v83.) ; used at error return
jl. w3 g127. ; find_devno;
jl. j8. ; error: goto out line;
jl. j0. ; ok: goto linkall
;
i1: 0 ;
i2: 0 ; kiton entry point
b135 = i2 ; <initialized in init part of the next slang segm.>
;
e. ;
;
; initkit
; -------
;
; *
; initkit <devno of physical device> (<size> <devno of logical disc>)
; 0
b. i5, j10 w.
g117: ; initkit
jl. w3 d16. ; begin
rs. w0 (v102.) ; physical disc := next integer;
rl w1 0 ;
jl. w3 d56. ; check device(physical disc);
jl. g16. ; +0: if error or
sn w0 6 ; +2: not (kind of device = idadisc and
se w3 0 ; type of device = physical disc) then
jl. g16. ; goto <device unknown>;
;
rl. w0 (v24.) ; user of buffer := current work;
rs. w0 (v104.) ;
;
al w0 -1 ; clear the buffer:
rl. w1 p11. ; for i := buffer.first step 2 until buffer.top do
j1: rs w0 x1+0 ; buffer(i) := -1;
al w1 x1+2 ;
sh. w1 (p12.) ;
jl. j1. ;
;
rl. w1 p11. ; init buffer:
rl. w2 i3. ; displace := 0;
j2: rl w0 x2+0 ; while more in default desc do
rs w0 x1+0 ; begin
al w1 x1+2 ; buffer(buffer.first+displace) :=
al w2 x2+2 ; default(default.start+displace);
se. w2 (i4.) ; displace := displace + 2;
jl. j2. ; end;
;
rl. w1 p11. ; displace :=
rl w2 x1+0 ; (buffer.no of files * 2 + 1) * 2;
ls w2 +1 ;
al w2 x2+1 ;
ls w2 +1 ;
am x1 ; pointer := buffer.start + displace;
al w2 x2 ;
rs. w2 (v103.) ; <save pointer to 'no of log discs'>
zl w1 x2+1 ; no of log disc := buffer.no of log discs;
al w2 x2+2 ; pointer :=
al w0 p0 ; pointer + 2 + (no of log discs * size of descrip);
wm w0 2 ;
wa w2 0 ;
;
j3: jl. w3 d2. ;
se w0 2 ; while next param = integer do
jl. j4. ; begin
rl. w0 (v19.) ; cur desc := buffer(pointer);
rs w0 x2+2 ; cur desc.no of segments := integer;
al w0 0 ; cur desc.first segment :=
se w1 0 ; if no of log discs = 0 then 0
rl w0 x2-p0 ; else
se w1 0 ; prev desc.first segment +
wa w0 x2-p0+2 ; prev desc.no of segments;
rs w0 x2+0 ;
jl. w3 d16. ; cur desc.type := data_disc,
ls w0 +12 ; include sender as user;
ls w0 -12 ; cur desc.rc8000devno := next integer;
rs w0 x2+4 ;
al w1 x1+1 ; no of log discs := no of log discs + 1;
al w2 x2+p0 ; pointer := pointer + size of descrip;
jl. j3. ; end <*.while *>;
;
j4: ;
rl. w2 (v103.) ; buffer.no of log disc := no of log discs;
hs w1 x2+1 ;
al w1 p0 ; buffer.size of log disc descrp := size of disc descr;
hs w1 x2+0 ;
rs. w0 (v78.) ; <save kind of param>
al w0 0 ;
rl. w1 (v102.) ;
jl. w3 d57. ; write segment(0, device no);
jl. j5. ; +0: if error then goto disc error
rl. w0 (v78.) ; +2: else goto exam command
jl. g36. ; <with restored param type>
;
j5: ; disc error:
rl w2 0 ;
al. w1 p7. ;
jl. w3 d21. ; write text(:disc error:);
al w1 x2 ;
jl. w3 d14. ; writebits(logical status);
al w0 10 ;
jl. w3 d20. ; writechar(nl);
jl. w3 d23. ; type line(buf);
jl. w3 d42. ; save work(buf);
jl. g47. ; +0: if error then goto endline
rl. w0 (v78.) ; +2: else goto exam command;
jl. g36. ; <with restored param type>
;
i3: h25 ;
i4: h26 ;
e. ; end;
;
; find devno
;
; reg call return ok return not ok
; w0 devno undef
; w1 unchanged -
; w2 unchanged -
; w3 link unchanged -
;
; return:
; link+2 ok: device with kind 6,8,14,18 or 28 found
; link+0 not ok: an error text is written in the output buffer
; if the device is not found
b. j5,i5 w.
i0:<: unknown<0>:>
i1:<: illegal kind<0>:>
i4=k+4
i2:<:removelink error <0>:>
i3: 0 ; return
i5: 0 ; text address
g123:am i2-i4 ;
g127:al. w0 i4. ;
ds. w0 i5. ;
rl. w3 v20. ;
jd 1<11+4 ; process_description(name,pda);
sn w0 0 ;
jl. j2. ; goto unknown;
rl w3 (0) ;
se w3 q6 ; if proc<>disc and
sn w3 q8 ; proc<>console and
jl. j0. ;
se w3 q14 ; proc<>printer and
sn w3 q18 ; proc<>tape and
jl. j0. ;
se w3 q28 ; proc<>gsd then
jl. j1. ; goto illegal kind else
j0: am (0) ; devno:=devno.proc;
rl w0 +a59 ;
rl. w3 i3. ;
jl x3+2 ; return;
j2: am i0-i1 ;
j1: al. w2 i1. ;
rl. w1 i5. ;
jl. w3 d21. ; write(remove link error);
rl. w1 v20. ;
jl. w3 d21. ; write_text(name);
al w1 x2 ;
jl. w3 d21. ; write(unknown/illegal devno);
jl. w3 (i3.) ; return sorry;
e.
;
c.(:a399>21a.1:)-1
; prepare dump <name> <low.first> <low.last> <high.first> <high.last>
b. i0,j0 w.
i0:<:prepare dump error<0>:>;
g121: jl. w3 d15. ; next name
dl. w0 (v21.) ;
ds. w0 p9.+2 ; move_name(param_list,name area);
dl. w0 (v23.) ;
ds. w0 p9.+6 ;
al. w1 p10. ;
jl. w3 d16. ; next integer;
rs w0 x1+0 ; low.first:=next integer
jl. w0 d16. ;
rs w0 x1+2 ; low.last:=next integer
ea w0 1 ;
sh w0 (x1+0) ; if low.first>low.last then
jl. g47. ; goto endline;
jl. w3 d16. ; next integer;
rs w0 x1+4 ; high.first:=next integetr
jl. w0 d16. ;
rs w0 x1+6 ; high.last:=next integer
ea w0 1 ;
sh w0 (x1+4) ; if high.first>high.last then
jl. g47. ; goto endline;
al. w3 p9. ;
jd 1<11+52; create area process;
jd 1<11+4 ; process description;
sh w0 0 ; if no process then
jl. g47. ; goto end line
rl w1 0 ;
al. w2 p10. ;
jl. w3 d58. ; prepare_dump(pda_ext/area_proc,address_buff);
jl. j0. ; error: goto write text;
jl. g35. ; goto next command
j0: al. w1 i0. ;
jl. w3 d21. ; write_text;
al w0 10 ;
jl. w3 d20. ; write(nl);
jl. w3 d23. ; type_line;
jl. w3 d42. ; save_buffer;
jl. g47. ; error: goto end line
jl. g35. ; goto next command
e.
;
; memory dump
;
b. j2 ,i5 w.
i3:<:prepare dump not performed <0>:>
i4:<:dump memory status <0>:>
i5:<:prepare dump status <0>:>
g122: rl. w2 (v106.) ;
sn w0 0 ;
jl. j0. ; goto prepare dump not performed
rl w2 x2+a141 ;
sh w2 0 ;
ac w2 x2 ;
al. w3 p9. ;
dl w1 x2+a11+2 ;
ds w1 x3+2 ; move_name(receiver_name,name area);
dl w1 x2+a11+6 ;
ds w1 x3+6 ;
rl. w1 v32. ;
al w0 0 ;
hs w0 x1+0 ; mess.op:=0;
jd 1<11+16;
rl. w1 v51. ;
jd 1<11+18;
rl. w2 (v51.) ;
sn w0 1 ; if result<>1
se w2 0 ; or status(answer)<>0 then
jl. j1. ; give up: dump error
al w2 0 ;
rx. w2 (v106.) ;
jd 1<11+18 ; wait answer(buf,answer,result);
rl. w2 (v51.) ;
sn w0 1 ; if result<>1
se w2 0 ; or status(answer)<>0 then
jl. j2. ; give up: prepare dump error
jl. g35. ; goto next command;
j0: am i3-i4 ;
j1: am i4-i5 ; prepare dump error:
j2: al. w1 i5. ; dump error:
al w2 1 ;
ls w2 (0) ;
sn w2 1<1 ; if result<>1 then
lo. w2 (v51.) ; status:=answer.status + 1 shift result;
jl. w3 d21. ; write_text;
al w1 x2 ;
sz w1 2.111111;if answer result then
jl. w3 d14. ; write status;
al w0 10 ;
jl. w3 d20. ; write(nl);
jl. w3 d23. ; type_line;
jl. w3 d42. ; save_buffer;
jl. g47. ; error: goto end line
jl. g35. ; goto next command;
e. ;
z.
c.-(:a399>21a.1:)
g121:
g122: jl. g2. ;
z.
e. ; end of itc controller command block
z.
c.-(:a80>16a.1:) ; if not itc devices included then
g112: ;
g113: ;
g114: ;
g115: ;
g116: ;
g117: ;
g118: ;
g121: ;
g122: ;
jl. g2. ; goto endline;
z. ;
;
m. v block
; indirect adressing of all e-names
;
v2: e2
v3: e3
v12: e12
v16: e16
v19: e19
v20: e20
v21: e21
v23: e23
v24: e24
v25: e25
v29: e29
v30: e30
v32: e32
v35: e35
v37: e37
v38: e38
v44: e44
v46: e46
v47: e47
v49: e49
v50: e50
v51: e51
v52: e52
v54: e54
v56: e56
v58: e58
v59: e59
v67: e67
v70: e70
v71: e71
v72: e72
v77: e77
v78: e78
v79: e79
v83: e83
v85: e85
v87: e87
v89: e89
v101: e101
v102: e102
v103: e103
v104: e104
v105: e105
c.(:a399>21a.1:)-1
v106: e106
z.
v109: e109
b.i24 w. ; dump:
; ---------
g79: ;
jl. w3 d15. ; next name;
jl. w3 d34. ; check child;
dl w1 x2+a43 ; get catbase of pr descr(child)
al. w3 i1. ; name=0
jd 1<11+72 ; catbase(s)=catbase(child)
se w0 0 ; if not ok then
jl. g19. ; goto end line: base illegal
rl. w3 v20. ; name adr
jd 1<11+52 ; create area process(name)
al. w3 i1. ; (prevent remove process(name))
sn w0 2 ; if result=2 or
jl. i10. ;
sl w0 2 ; result>2 then
jl. i11. ; goto give up
rl. w3 v20. ;
jd 1<11+8 ; reserve process(name,result);
se w0 0 ; if result<>0 then
jl. i12. ; goto give up;
jl. w3 d39. ; stop child;
rl. w2 (v29.) ;
al w1 0 ;
am. e46.+2000;
rs w1 +2-2000; segmentno(mess)=0
rl w1 x2+a182 ; load base (child)
dl w3 x2+a18 ;
wa w2 2 ; add base
wa w3 2 ;
al w3 x3 -2 ; line addr:= first addr(child);
ds. w3 (v46.) ; write addr:= top addr(child)-2;
rl. w3 v20. ;
rl. w1 v44. ;
jd 1<11+16 ; send mess(name,output,buf);
rl. w1 v51. ;
jd 1<11+18 ; wait answer(buf,answer,result);
rl. w2 (v51.) ;
sn w0 1 ; if result<>1
se w2 0 ; or status(answer)<>0 then
jl. i9. ; give up: area error
jd 1<11+42 ; lookup entry (area)
se w0 0 ; if not ok then
jl. i9. ; goto area error
al w0 7 ; else
hs. w0 (v59.) ; contents key(area):= core dump
jd 1<11+36 ; get clock
ld w1 5 ;
rs. w0 (v56.) ; set shortclock(area)
rl. w1 v51. ;
jd 1<11+44 ; change entry
se w0 0 ; if not ok then
i9: am g15-g35 ; give up: area error
am g35-g11 ; goto next command
i10: am g11-g12 ; give up: catalog error
i11: am g12-g13 ; - - - : area unknown
i12: am -2000 ; - - - : area reserved
al. w2 g13.+2000 ;
jd 1<11+64 ; remove area process
al. w3 i1. ;
dl. w1 i2. ;
jd 1<11+72 ; reset catalogbase(s)
jl x2+ 0 ; exit ,
i1: 0
a107
i2: a108-1
e.
b. i4
w. ;
; command syntax: user <lower> <upper>
; --------------------
; command syntax: login <lower> <upper>
; --------------------
; command syntax: project <lower> <upper>
; ----------------------
g86: am c43-c42; user: update userbase;
g82: am c42-c41; login: update loginbase;
g80: al w2 x1+c41 ; project: update projectbase;
jl. w3 d16. ; next integer
rs w0 x2+0 ; lower := integer;
jl. w3 d16. ; next integer
rs w0 x2+2 ; upper := integer;
jl. g35. ; next command
e.
b.i12 w. ; bs:
; --------
i2: dl. w2 (v21.) ;
ds. w2 i4. ;
dl. w2 (v23.) ;
ds. w2 i5. ;
jl x3 ;
g81: jl. w3 d34. ; check child
jl. w3 d15. ;
jl. w3 i2. ;
jl. w3 d16. ; next integer
i0: rs. w0 (v52.) ; more:
jl. w3 d16. ; next integer
rs. w0 (v51.) ;
dl. w0 (v52.) ;
am. (v51.) ;
al w1 +a110*4; index:= claim list end
i1: ds w0 x1 +2 ; repeat begin
al w1 x1 -4 ; claimlist(index):=claimchange
se. w1 (v51.) ; index:= index-4
jl. i1. ; until index = claim list start
al. w2 i3. ;
rl. w3 (v25.) ;
al w3 x3+c29 ; w3 = process name(console)
jd 1<11+78 ; set bs claims
sn w0 1 ; if result = 1
jl. g20. ; then goto end line
se w0 0 ; if result <> 0
jl. g21. ; then goto end line
jl. g35. ; then goto exam command
; command syntax: temp <docname> <segments> <entries>
; ------------------------------------
g84: ; temp:
am c45-c47; (update temp claims)
; command syntax: perm <docname> <segments> <entries>
; -------------------------------------
g85: ; perm:
al w3 c47 ; (update perm claims)
wa. w3 (v25.) ;
rs. w3 i6. ; save abs addr of claim;
jl. w3 d15. ;
jl. w3 i2. ;
jl. w3 d16. ; get segments
rs. w0 (v52.) ;
jl. w3 d16. ; get entries
rs. w0 (v51.) ;
al. w2 i3. ; name adr.
jl. w3 d61. ; get devno*8
jl. g16. ; sorry goto end line
dl. w1 (v52.) ;
am. (i6.) ; update segments and entries;
ds w1 x2 ;
jl. g35. ; next command
i3:0
i4:0
0
i5:0
i6:0 ; abs addr of claim (in console descr)
e.
b.i40,j10
w.
c.(:c23>14a.1:)-1
g96 = k ; get:
; --------------
al w0 1 ; increase access indicator := true;
rs. w0 (v77.) ;
am -1 ;
g89 = k ; job:
; --------------
al w0 0 ; set startflag
rs. w0 i16. ;
al w3 0 ;
rs w3 x1+c95+2 ; clear primin and primout
rs w3 x1+c96+2 ;
jl. w3 d46. ; clear claimlist;
jl. w3 d15. ; get jobname
al w1 0 ; then get segment(0)
rl. w2 (v70.) ;
jl. w3 d77. ;
rl. w1 (v70.) ;
rl w3 x1+6 ; get no. of segments
rs. w3 i14. ;
rl w1 x1 +2 ;
rs. w1 i12. ;
al w2 0 ; find number of
al w3 512 ; entries in one
wd w3 2 ; susercatentry
al w3 x2-510 ; w3 := last used in segment;
rs. w3 (v85.) ;
j8: dl. w2 (v21.) ;
aa. w2 (v23.) ; compute hashvalue
wa w2 2 ;
al w1 0 ;
sh w2 -1 ;
ac w2 x2 ;
wd. w2 i14.
rs. w1 i13. ;
j3: rl. w2 (v71.) ;
rs. w1 (v79.) ;
jl. w3 d77. ; get segment
jl. w3 d78. ; find entry
sl w2 0 ; if entry address then
jl. j4. ; copy information
se w2 -10 ; if entry ndon' excist then
jl. g22. ; goto end line
rl. w1 (v79.) ; if entry not found on this segment
al w1 x1+1 ; then increase segment no.
sn. w1 (i14.) ; search cyclical through
al w1 0 ;
se. w1 (i13.) ;
jl. j3.
jl. g22.
j4: rl w1 4 ;
wa. w1 i12. ; last adr. +2 in userentry
rs. w1 i15.
rl. w1 (v25.) ;
rl w3 x2+2 ; command mask(job) :
rl w0 x1+c26 ; if abs.protection, abs.addr or
la. w0 i17. ;
la. w3 i10. ; all bs= true then
lo w0 6 ; 'or' these bits to
rs w0 x1+c26 ; command mask(console)
al w3 x1+c29 ; copy job to console buffer
al w2 x2+4 ; from process name
j5: rl w0 x2 ; to claim list
rs w0 x3 ;
al w2 x2+2 ;
al w3 x3+2 ;
se w3 x1+c95 ; (until i and o are defined in susercat) end
jl. j5. ;
;
; create claim list(console)
;
rs. w2 i1. ;
rl. w2(v70.) ;
al w2 x2+8 ; name adr. first dev(entry0)
rs. w2 i2. ;
al w2 x1+c44 ; start of claim list(console)
rs. w2 i0. ;
j0: rl. w2 i2. ;
sl. w2 (i15.) ; kan fjernes nar newcat er rettet !!!!!!!!!!!!!
jl. j2. ; ---------""---------""-------""!!!!!!!!!!!
jl. w3 d61. ; get devno*8(next dev)
jl. j1. ; not found: goto next dev.
rl. w3 i1. ; found: copy claim list:
dl w1 x3+2 ; begin
wa. w2 i0. ;
ds w1 x2+2 ;
dl w1 x3+6 ;
ds w1 x2+6 ; end
j1: dl. w3 i2. ; next device: get claim list adr.(userentry)
al w3 x3+12 ; and dev. name adr.(entry0)
al w2 x2+8 ;
ds. w3 i2. ;
se. w2 (i15.) ;
jl. j0. ; then find next dev.
j2: ;
rl. w1 (v25.) ; restore console
al w2 -1 ; areabuf := undef;
rs. w2 (v87.) ;
se. w2 (i16.) ; if job command then
jl. g66. ; goto run
jl. g35. ; else goto next command;
; end;
;
i0: 0 ; claim list start(console)
i1: 0 ; -2 claim list adr(userentry)
i2: 0 ; +0 dev. name adr.(entry0)
i10: 8.77772006 ; prio+all bs, abs. protc., abs. addr.
i12: 0 ; entry lenght
i13: 0 ; name key
i14: 0 ; catalog lenght
i15: 0 ; last adr.+2(userentry)
i16: 0 ; job indicator : 0=job command
i17: 8.1770
z.e.
b.i24
w.
g87: am 1<8 ; lock: lock := true;
; -------------------
g88: al w0 0 ; unlock:lock := false;
; ---------------------
rs. w0 (i0.) ;
jl. g35. ; goto next command;
i0: e80 ; lock indicator
e.
c. (:c23>15a.1:)-1
b. i30, j10 ;
w. ;
; command syntax: modify <addr> <old contents> <new contents>
; -------------------------------------------
g91 = k ; modify:
jl. w3 (i22.) ; addr := next integer;
sl w0 0 ; if illegal core-address then
sl w0 (116) ;
jl. g111. ; goto end line;
rl w2 0 ;
jl. w3 (i22.) ;
se w0 (x2) ; if next integer <> core(addr) then
jl. g111. ; goto end line;
jl. w3 (i22.) ;
rs w0 x2 ; core(addr) := next integer;
jl. g35. ; goto next command;
g90 = k ; print:
; --------------
jl. w3 (i22.) ; next integer
rs. w0 (v37.) ;
jl. w3 (i22.) ; next integer
rs. w0 (v38.) ;
al. w3 i11. ;
jd 1<11+8 ; reserve printer
se w0 0 ; if result <> 0
jl. (i23.) ; then goto end line
j0: dl. w1 i12. ; next: init output area
ds. w1 i1. ;
ds. w1 i3. ;
ds. w1 i7. ;
dl. w1 i13. ;
ds. w1 i4. ;
ds. w1 i5. ;
rl. w1 i14. ;
rs. w1 i2. ;
rs. w1 i6. ;
rl. w1 (v37.) ; print address(decimal)
al w0 10 ;
al. w2 i1. ;
jl. w3 j3. ;
rl. w2 (v37.) ; print word(octal)
rl w1 x2 ;
al w0 8 ;
al. w2 i3. ;
jl. w3 j3. ;
al w1 -2 ;
la. w1 (v37.) ;
bz w1 x1 ; print byte 1(decimal)
al w0 10 ;
al. w2 i4. ;
jl. w3 j3. ;
al w1 -2 ;
la. w1 (v37.) ;
bz w1 x1 +1 ; print byte 2(decimal)
al w0 10 ;
al. w2 i5. ;
jl. w3 j3. ;
rl. w2 (v37.) ;
rl w1 x2 ; print word(decimal)
sl w1 0 ; if word < 0
jl. j2. ; then begin
ac w1 x1 ; change sign
rl. w0 i15. ;
rs. w0 i6. ; set minus
j2: al w0 10 ; end
al. w2 i7. ;
jl. w3 j3. ;
rl. w1 (v37.) ;
rl w2 x1 ; print word(text)
rl. w1 i26. ;
j1: ld w2 8 ;
sz w1 8.340 ;
sz w1 8.200 ;
la. w1 i25. ;
sz w1 8.177 ;
sz ;
al w1 x1 +32 ;
sh w1 0 ;
jl. j1. ;
rs. w1 i8. ;
al. w1 i10. ;
al. w3 i11. ;
jd 1<11+16 ; send message
jl. w3 d42. ; save work(buf);
jl. j6. ;+2: error: goto end print;
rl. w1 (v37.) ; first addr
al w1 x1 +2 ; +2
rs. w1 (v37.) ; =: first addr
rl. w2 (v38.) ;
sh w1 x2 ; if first addr<=last addr
jl. j0. ; then goto next
j6: ; end print:
al. w3 i11. ;
jd 1<11+10 ; release printer
jl. (i24.) ; goto next command
j3: ds. w0 i19. ; save return and radix
j4: al w3 0 ; next word: s:= 0
j5: al w0 0 ; next char:
wd. w1 i19. ;
wa. w0 i16. ;
as w0 x3 ; remainder shift s
wa w0 x2 ; + word(i)
rs w0 x2 ; =: word(i)
sn w1 0 ; if quotient = 0
jl. (i18.) ; then return
al w3 x3 +8 ; s:= s+8
se w3 24 ; if s<>24
jl. j5. ; then goto next char
al w2 x2 -2 ; i:=i-2
jl. j4. ; goto next word
i0:0 ;
i1:0 ; addr
<: :> ;
i6:0 ;
0 ;
i7:0 ; decimal
0 ;
i4:0 ; byte 1
0 ;
i5:0 ; byte 2
<: :> ;
i2:0 ;
0 ;
i3:0 ; octal
<: :> ;
i8:0 ; text
i9:<:<10>:> ;
i10:5<12 ; message
i0 ;
i9 ;
0 ;
i11:<:printer:>,0,0 ; name
<: :> , i12=k-2
<: :> , i13=k-2
<: :> , i14=k-2
<:- :> , i15=k-2
<:<0><0><16>:> , i16=k-2
i18:0 ; link
i19:0 ; radix
i22:d16 ; next integer
i23:g1 ; error
i24:g35 ; next command
i25:8.7777 7400 ;
i26:128<16+128<8+128 ;
z.
e.
b. i24,j4 w.
g128:am 1 ; set priority
g93: al w2 0 ; prio:
;--------------
jl. w3 d16. ; read priority
sz. w0 (i1.) ; if prio < 0 or prio >= 4096 then
jl. g27. ; goto end line: illegal priority
se w2 0 ; if prio then
jl. j0. ; begin
hs w0 x1+c26 ; insert prio in console buffer and
jl. g35. ; goto next command
j0: ; end else
al w3 x1+c29 ; begin <* set priority *>
al w2 x1 ; save address of console buffer
rl w1 0 ;
jd 1<11+94 ; set_priority(prio,child,res);
se w0 0 ; if error result then
jl. g27. ; goto end line: illegal priority
hs w1 x2+c26 ; insert priority in console buffer and
jl. g35. ; goto next command
; end;
i1: -1<12
e.
b.i10 w.
g99: ; jobremove
; --------------
jl. w3 (i1.) ; check child
al w2 -1 ;
rs w2 x3+c22 ; coretableelement:=not job
jl. (i2.) ; goto remove
i1: d34
i2: g71
e.
b.i3 w.
g100: ; base
; -------------
jl. w3 d16. ; next integer
rs. w0 i3. ;
jl. w3 d16. ; next integer
rl. w3 i3. ;
ds w0 x1+c42+2 ; set bases
ds w0 x1+c41+2 ;
ds w0 x1+c43+2 ;
jl. g35. ;
i3:0
e.
; autorel and relocate
; ---------------------
; yes
; syntax: command <first logic address>
; no
; --------------------------------------
b. i10, j10 w.
g92: rl. w3 v72. ; autorel
jl. j0. ; set destination address
g102:al w3 x1+c97 ; relocate :
j0: rs. w3 i1. ;
jl. w3 d2. ; examine next param
se w0 1 ; if name then
jl. j1. ; begin
rl. w2 (v20.) ; if name:= <:no :> then
al w3 -1 ; first logic address :=
se. w2 (i0.) ; -1 (no relocation)
jl. j2. ; else
rl. w3 (v16.) ; set first logic address
jl. j2. ; top of s own code
j1: se w0 2 ; if not integer then
jl. g2. ; syntax
rl. w3 (v19.) ; integer:
sh w3 -1 ; if <0 then write
jl. g2. ; syntax
c.(:a399>23a.1:)-1
sz w0 (b214) ; if integer mod 8k <>0 then
jl. g2. ; syntax
z.
j2: rs. w3 (i1.) ;
jl. g35. ; goto next command
i0: <:yes:> ;
i1: 0 ;
e.
; adjust rest claims in usercat.
; comment: change the perm rest claims in susercat
; to the value given by the internal process descr. for key=3.
; temp claims are unchanged.
;
; call return
; w0 destroyed
; w1 destroyed
; w2 destroyed
; w3 link destroyed
;
b.i20, j10
w.
d76: rs. w3 i10. ; store return in save area
rl. w3 (v30.) ;
rl w1 x3+c22 ; if segmentno= -1 then
sh w1 -1 ; return: no susercatjob
jl. (i10.) ;
c.(:c23>14 a.1 :)-1
rl. w2 i2. ;
jl. w3 d77. ; get segment
rl. w1 (v30.) ;
rl w1 x1+c22 ;
am. (v46.) ;
rs w1 +2 ; store segmentno in output mess
rl. w1 (v29.) ; get procname(child)
al w2 x1+a11 ; and store in name area
rl. w3 v20. ;
dl w1 x2+2 ;
ds w1 x3+2 ;
dl w1 x2+6 ;
ds w1 x3+6 ;
j0: jl. w3 d78. ; find entry
sh w2 -1 ; if entry not found then
jl. j7. ; goto write warning
al w2 x2+50 ;
rs. w2 i3. ; perm claim adr(userentry)+2
rl. w2 i1. ;
al w2 x2+8 ;
rs. w2 i4. ;
j1: rl. w2 i4. ; adjust rest claims
rl. w3 v20. ; for i=0 step 1 until last dev.(entry0) do
jl. w1 d74. ; begin
se w0 0 ; lookup bs claims(dev,process)
jl. j2. ; if not-ok goto next device
dl w3 x1+4*a110+2 ; perm(entryes, segments) := entryes ,segments(key=max-key
ds. w3 (i3.) ;
j2: dl. w2 i4. ; next device:
al w2 x2+12 ;
al w1 x1+8 ;
ds. w2 i4. ;
rl. w1 i1. ;
rl w1 x1+4
am. ( i1.) ; if dev.name.adr. <
sh w2 x1 ; last used of entry0 then
jl. j1. ; goto next , else
rl. w2 i2. ; store segment:
al w3 x2+510 ; create output mess.
; first adr. h20
ds. w3 (v46.) ; last adr. h20+510
rl. w3 i5. ; segment no:stored above
jd 1<11+52 ; create area.susercat
jd 1<11+8 ; reserve(susercat)
sn w0 0 ;
jl. j5. ;
; if error then
jl. g15. ; write: area error
j5: ;
rl. w1 v44. ;
jd 1<11+16 ; send mess.
rl. w1 i11. ;
jd 1<11+18 ; wait answer
lo. w0 (i11.) ; 'or' status and result
sn w0 1 ; if <> 1 then goto error
jl. j6. ;
j4: ; error
al. w1 g11. ; write catalog error
rs. w1 i10. ;
j6: rl. w3 i5. ;
jd 1<11+64 ; remove area susercat
rs. w3 (v87.) ; areabuf := undef;
jl. (i10.) ; return
;
j7: rl. w1 i7. ; entry not found error:
jl. w3 (i8.) ; write warning;
jl. w3 d42. ; save work;
jl. +2 ; +0: error: ignore;
jl. j6. ; +2: goto remove susercat area
i0: 0 ; pr.descr.adr(procname)
i1: h19 ; entry0 adr.
i2: h20 ; user segment adr.
i7: g120 ; address of warning text
i8: g105 ;
z.
c.-(:c23>14 a.1 :)
jl. (2), g18
z.
i3: 0 ; -2, perm claim list adr(userentry)
i4: 0 ; +0, dev.name adr(entry0)
i5: c69 ; susercat name adr.
i6: 0 ; segmentno in susercat
i10: 0 ; return adr.
i11: e51 ; answer status adr.
e.
; character table:
; contains an entry of 3 bits defining the type of each
; character in the iso 7 bit character set.
w.h0: 8.7777 7777 ; nul soh stx etx eot enq ack bel
8.7757 7777 ; bs ht nl vt ff cr so si
8.7777 7777 ; dle dc1 dc2 dc3 dc4 nak syn etb
8.7667 7777 ; can em sub esc fs gs rs us
8.3666 6666 ; sp
8.6636 4244 ; ( ) * + , - . /
8.1111 1111 ; 0 1 2 3 4 5 6 7
8.1125 6466 ; 8 9 : ; < = >
8.6000 0000 ; A B C D E F G
8.0000 0000 ; H I J K L M N O
8.0000 0000 ; P Q R S T U V W
8.0000 0066 ; X Y Z Æ Ø Å _
8.6000 0000 ; a b c d e f g
8.0000 0000 ; h i j k l m n o
8.0000 0000 ; p q r s t u v w
8.0000 0067 ; x y z æ ø å del
; command table:
; each entry consists of two words defining the name of the
; command, a eigth bits defining a bit to test in the console mask,
; and a sixteen bits defining the address of the command action
; relative to g45.
w.h2 = k-6 ; base of command:
<:all<0>:> , 1<17+g83-g45
<:addr:> , 1<17+g54-g45
<:area:> , 1<17+g61-g45
<:autore:> , 1<15+g92-g45
<:base:> , 1<18+g100-g45
<:break:> , 1<20+g70-g45
<:bs<0><0>:>, 1<17+g81-g45
<:buf<0>:> , 1<17+g60-g45
<:call:> , 1<17+g74-g45
<:closec:> , 1<15+g119-g45
<:connec:> , 1<17+g112-g45
<:cpa<0>:> , 1<17+g59-g45
<:create:> , 1<16+g64-g45 ; <:createlink:> --> g64 --> g112
<:date:> , 1<21+1<14+g49-g45
<:discon:> , 1<17+g113-g45
<:dump:> , 1<20+g79-g45
<:exclud:> , 1<19+g73-g45
<:i:>,0 , 1<20+g94-g45
<:functi:> , 1<17+g63-g45
<:includ:> , 1<19+g72-g45
<:init:> , 1<16+g65-g45
<:initki:> , 1<17+g117-g45
<:intern:> , 1<17+g62-g45
<:job<0>:> , 1<20+g89-g45
<:get<0>:> , 1<20+g96-g45
<:link:> , 1<17+g114-g45
<:linkal:> , 1<17+g116-g45
<:list:> , 1<20+1<14+g75-g45
<:load:> , 1<20+g67-g45
<:lock:> , 1<15+g87-g45
<:login:> , 1<18+g82-g45
<:max<0>:> , 1<20+1<14+g76-g45
<:modify:> , 1<21+1<14+g91-g45
<:memdum:> , 1<17+g122-g45
<:new<0>:> , 1<16+g51-g45
<:jobrem:> , 1<15+g99-g45
<:o:>,0 , 1<20+g95-g45
<:perm:> , 1<17+g85-g45
<:prepar:> , 1<17+g121-g45
<:prio:> , 1<18+g93-g45
<:privil:> , 1<15+g124-g45
<:proc:> , 1<20+g52-g45
<:prog:> , 1<20+g53-g45
<:projec:> , 1<18+g80-g45
<:read:> , 1<20+1<14+g57-g45
<:reloca:> , 1<18+g102-g45 ;
<:remove:> , 1<20+g71-g45 ; <:removelink:> -->g71 --> g113
<:setpri:> , 1<15+g128-g45
<:unpriv:> , 1<15+g125-g45
<:cleanu:> , 1<15+g104-g45
c.(:c23>17a.1:)-1
<:replac:> , 1<15+g77-g45
z.
<:run<0>:> , 1<16+g66-g45
<:size:> , 1<18+g56-g45
<:start:> , 1<20+g68-g45
<:stop:> , 1<20+g69-g45
<:temp:> , 1<17+g84-g45
<:unlink:> , 1<17+g115-g45
<:unlock:> , 1<15+g88-g45
<:unstac:> , 1<20+1<14+g58-g45
<:user:> , 1<18+g86-g45
<:mode:> , 1<21+g55-g45
c.-4000
<:key<0>:> , 1<17+g57-g45
<:pk<0><0>:> , 1<18+g59-g45
<:pr<0><0>:> , 1<18+g58-g45
z.
<:print:> , 1<21+1<14+g90-g45
h3:h13 ; continue command list
; create link param list
h14: ; type kind<12+modifier
<:disc<0>:>,0,0, 6 < 12 + 0 ; reserved
<:disk<0>:>,0,0, 6 < 12 + 0 ; reserved
<:discneutral<0>:>, 6 < 12 + 4 ; neutral
<:diskneutral<0>:>, 6 < 12 + 4 ; neutral
<:discforce<0>:>, 6 < 12 + 8 ; override
<:diskforce<0>:>, 6 < 12 + 8 ; override
<:tape<0>:>,0,0, 18 < 12 + 0 ; reserved
<:tapeneutral<0>:>, 18 < 12 + 4 ; neutral
<:tapeforce<0>:>, 18 < 12 + 8 ; override
<:tapek2<0>:>,0, 18 < 12 + 2 ; keystone 2
<:tapek3<0>:>,0, 18 < 12 + 3 ; keystone 3
<:tapeperte<0>:>, 18 < 12 + 1 ; 3715
<:console:>,0, 1 < 12 + 0 ;
<:floppy:>,0,0, 7 < 12 + 0 ;
h15:
; define b-name for transferring variables to mons2-text
b110 = g45 ; command base
b112 = d2 ; call next param
b113 = d15 ; call next name
b114 = d16 ; call next integer
b115 = g2 ; goto syntax error
b116 = g35 ; goto next command
b117 = g36 ; goto exam command
b118 = e19 ; integer just read
b119 = e20 ; name just read
b120 = e16 ; pointer to: first addr
b121 = d19 ; call init write
b122 = d20 ; call write char
b123 = d21 ; call write text
b124 = d23 ; call type line
b125 = d42 ; call save work
b126 = g47 ; goto input aborted
b129 = g11 ; goto catalog error
b130 = d79 ; call stack input
b131 = d22 ; call write integer;
b132 = e90 ; pointer to: terminal
b133 = d51 ; call connect;
b134 = g118 ; call linkall;
b136 = c84 ; devno of 1st connection;
b137 = d55 ; call read segment;
b138 = d57 ; call write segment;
b139 = 0 ; default definition. redefined below if itc included (dirty)
b140 = d14 ; call writebits;
b141 = e72 ; pointer to: first logical address
b142 = e17 ; memory buffer (first free and top of core e16+e17)
b143 = d12 ; change write mode
b144 = e53 ; write mode
b145 = e44 ; output message
b146 = e40 ; name (receiver)
b147 = e32 ; answer area
b148 = c36 ; s log area name
b149 = e42 ; top of write buffer
b150 = d58 ; prepare dump
c.(:a399>21a.1:)-1
b151 = c107 ; default dump area size
z.
b152 = e102 ; device number for 1. physical disc
b153 = d59 ; initialize main
e86: 0,r.(:a110+1:)*2 ; bs claim store;
; console table:
h4:0, r.c81*c1>1 ; lay out standard console descriptions
h22=k-c1 ; last description
; initialize standard console descriptions.
; c20, c21 queue element (queued up on the queue head)
; c27 command mask (standard mask)
b.i4,j2 w.
i0:0 ; saved link
h4+c1 ; next element
i1:h4-c1 ; last element
i2:e35 ; queue head
i3: h4. ;
j0: rs. w3 i0. ; start:
al. w1 i0. ;
rs w1 x2 +0 ; first free:=start of init code;
al w0 c82 ;
dl. w2 i1. ;
al. w3 i3. ;
wa. w3 i3. ; al. w3 h4.
j1: rs w0 x3+c27 ; for console desc:=first stop 1 until last do
ds w2 x3+c21 ; mask(console desc):=standard mask;
al w1 x1 +c1 ; next,last queue element:=next, last console desc;
al w2 x2 +c1 ;
al w3 x3 +c1 ;
sh. w3 h22. ;
jl. j1. ;
rl. w2 i2. ; insert queue head in first and last console des;
al. w3 i3. ;
wa. w3 i3. ; al. w3 h4.
rs w2 x3+c21 ;
rs. w2 h22.+c20 ;
al w0 0 ;
al w2 0 ;
jl. (i0.) ; return to slang;
jl. j0. ; goto start;
e.j.
h21=k ; main console
m. s main console included
k, k-2, 0, 2, 8.1770, <:console1:>,0, 0, r.c1>1-9
h. h5=k-c1 ; last console
; device exception table (devices not automatically included with users )
; the numbers in order of increasing value:
h6: ; start(table)
t.m. s device exclusion table included
2047 ; last(table)
w.
w.
; work table:
h. h8: ; first work:
0,r.c2*c3
h9=k-c2 ; last work:
h. h19: -1,r.c89
h20:-1,r.512
c.(:a80>16a.1:)-1 ; if ida device drivers included then
w. ;
h23=k ; first of disc desc buffer
-1, r.256 ; disc buffer = one segment
h24=k-2 ; last of disc desc buffer
;
b139 = h23 ;
;
h25: ; initkit disc description:
6 ; + 0: no of files
866 ; + 2: first segment of rc8000 coredump
500 ; + 4: no of segments in coredump
5 ; + 6: first segment of ida801 fw
60 ; + 8: no of segments in ida801 fw
65 ; +10: first segment of bootloader
1 ; +12: no of segments in bootloader
66 ; +14: first segment of rc8000 monitor
500 ; +16: no of segments in monitor
566 ; +18: first segment of 1st fe program
300 ; +20: no of segments in 1st fe program
1366 ; +22: first segment of dummy file
0 ; +24: no of segments in dummy file
;
0, 0 ; +26,+27: size of log disc descrp, no of log disc descrp
h26=k ; top of default kit description
; format of log disc description:
; +28: first segment of 1st disc
; +30: no of segments in 1st disc
; +32: type: include sender, data disc
; +33: devno: select a free
;
z. ;
; core table:
; contains an entry for each storage area allocated to a child.
; an entry defines the address of a child description within the
; monitor. the entries are arranged in the same order as the
; storage areas from low towards high addresses. the table is
; terminated by a zero.
w.
h10 = k - c11 ; base of core table:
-1, r.(:a3-2:)*c11>1 ; lay out core table
h11=k ; top of coretable
m. first free addr
; initialize core table.
; all entries in the core table is initialised to this values-
; k, k-2, -1, r.5
b.i1,j1 w.
i0:h10+c11 ; absolute addr of core table
i1:h10.+c11 ; relative addr of core table
j0: al. w1 i0. ; start:
rs w1 x2 +0 ; first free:=start of init code;
rl. w1 i0. ;
al. w2 i1. ;
wa. w2 i1. ;
j1: rs w1 x2 +0 ; for entry:=first stop 1 until last do
rs w1 x2 +2 ; word(entry+0,+2):=k, k-2;
al w1 x1+c11 ;
al w2 x2+c11 ;
se. w2 h11. ;
jl. j1. ;
al w0 0 ;
al w2 0 ; status:=ok;
jl x3 ; return to slang;
jl. j0. ; goto start;
e.j.
; * * * obs do not place any data between h12 and i10 !
c.(:a399>23a.1:)-1
h.
0,r.(:(:(:(:k+2047:)/2048:)*2048:) - k:); (first address:=(first address+2047)//2048)*2048;
w.
m. first free mod 2k
z.
h12:
h13 = - (:h12 + 2:) ; command table continues in second word of next text
b. i29 w.
; table of preoccupied claims:
; mess buf area internal
i0=1 , i1=a112+1 , i2=1 ; proc func
i3=1+a117 , i4=0 , i5=1 ; std driver
i6=a5-i0-i3 , i7=a1-i1-i4 , i8=a3-i2-i5 ; s
c.(:a399>22a.1:)-1
i25=2 , i26=0 , i27=1 ; monitor
i6=i6-i25 , i7=i7-i26 , i8=i8-i27 ; s
z.
i10: rs. w3 i12. ; save return to autoloader;
; initialize work table
b. j1 w.
rl. w3 i20. ;
j0: ; rep:
al w1 x3+c73 ; for all work table entries do
rs w1 x3+c58 ; stack pointer := stack base;
al w3 x3+c2 ;
sh. w3 (i21.) ;
jl. j0. ;
e. ;
; initialize special console descriptions.
b.j10 w.
al. w3 (j2.) ;
jl. j1. ;
j0: rl w1 x3+c25 ; for console desc:=first step 1 until last do
ls w1 1 ; proc desc addr(console):=
wa w1 b4 ; word(base name table(dev)+2*devno);
rl w1 x1 ;
rs w1 x3+c25 ;
al w3 x3 +c1 ;
j1: sh. w3 (j3.) ;
jl. j0. ;
c.(:a399>22a.1:)-1
dl w1 b27+2 ;
ws w1 0 ; max r.size:=max space allowing visibilty monitor tables and area for process dscriptions
ls w1 -11 ; max r.size mod 2k :=0;
ls w1 11 ;
rs. w1 (i29.) ;
z.
jl. i9.
j2: h21
j3: h5
i20: h8
i21: h9
c.(:a399>22a.1:)-1
i28: d30
i29: e82
z.
e.
; process description for process functions:
;
; rel address contents
i9: rl w1 (b6) ; proc := first internal;
jl. w2 i18. ; init description;
a48 , a107 ; interval low
a49 , a108 ; - high
a11 , 0 ; name 0 : zero
a11+2 , <:pro:> ; name 2-6: <:procfunc>
a11+4 , <:cfu:> ;
a11+6 , <:nc:> ;
a17 , b60-b60+a398 ; first address
a18 , b61 ; top address
a301 , 0 ; priority
a26 , a89 ; interrupt mask
a27 , b62 ; user exception address
a170 , 0 ; user escape address
a32 , 1<23 ; status = monitor mode
a33 , b63 ; ic = waiting point
a182 , 0 ; base = no relocation
a183 , a398 ; lower write limit = first core
;*** a184 , core size ; top write limit: special
a185 , 6<12+b54 ; interrupt levels
a42 , a107 ; catalog base low
a43 , a108 ; - - high
a44-2 , a107 ; max interval low
a44 , a108 ; - - high
a45-2 , a107 ; std - low
a45 , a108 ; - - high
a302 , 0 ; save area address
a10 , 0;(end of words) ; kind = 0
a12 , 0 ; stop count
a13 , a102 ; state = waiting for message
a19 , i0 ; buf claim
a20 , i1 ; area claim
a22 , 8.7777 ; function mask
a10 , 0;(end of bytes) ; (kind = 0)
rs w0 x1+a184 ; top write limit(proc func) := core size;
c.(:a399>22a.1:)-1
; process description for monitor
al w1 x1 +a4 ; proc := second internal;
jl. w2 i18. ; init description;
a48 , a107 ; interval low
a49 , a108 ; - high
a11 , <:mon:> ; name = <:monitor:>
a11+2 , <:ito:> ;
a11+4 , <:r:> ;
a11+6 , 0 ;
a17 , b160 ; first address
a18 , 8.3777 7777 ; top address
a301 , 0 ; priority
a26 , a89 ; interrupt mask
a27 , 0 ; user exception address
a170 , 0 ; user escape address
;*** a171 , core size ; initial cpa
a172 , 0 ; - base
a173 , a398 ; - lower write limit
;*** a174 , core size ; - upper - -
a175 , b54<12+b54 ; - interrupt levels
a32 , 0 ; status = not monitor mode
a33 , b160 ; ic = start init
a34 , 0 ; parent = undef
;*** a181 , core size ; current cpa
a182 , 0 ; - base
a183 , a398 ; - lower write limit
;*** a184 , core size ; - upper - -
a185 , b54<12+b54 ; - interrupt levels
a42 , a107 ; catalog base low
a43 , a108-1 ; - - high
a44-2 , a107 ; max interval low
a44 , a108-1 ; - - high
a45-2 , a107 ; std interval low
a45 , a108-1 ; - - high
a302 , 0 ; save area address
a10 , 0;(end of words) ; kind = 0
a12 , 0 ; stopcount
a13 , a104 ; state = wait for event
a19 , i25 ; buf claim
a20 , i26 ; area claim
a21 , i27-1 ; internal claim
a24 , 1<7 ; (protection register, for compatibility reasons)
a25 , 0 ; (protection key, for compatibility reasons)
a22 , 8.7777 ; function mask
a10 , 0;(end of bytes) ; (kind = 0)
sl w0 0 ; if montop<8MHW then
rs w0 x1+a18 ; top address(s) :=montop
rs w0 x1+a171 ; initial cpa(s) :=
rs w0 x1+a174 ; initial upper write limit(s) :=
rs w0 x1+a181 ; current cpa(s) :=
rs w0 x1+a184 ; current upper write limit(s) := core size;
al w0 x1 ;
al w2 0 ;
jl. w3 (i28.) ; reserve core
rl w1 0 ;
z.
; process description for initial operating system, s
al w1 x1 +a4 ; proc := second internal;
jl. w2 i18. ; init description;
a48 , a107 ; interval low
a49 , a108 ; - high
a11 , <:s:> ; name = <:s:>
a11+2 , 0 ;
a11+4 , 0 ;
a11+6 , 0 ;
a17 , c0 ; first address
;*** a18 , core size ; top address
a301 , 0 ; priority
a26 , a89 ; interrupt mask
a27 , d0 ; user exception address
a170 , 0 ; user escape address
;*** a171 , core size ; initial cpa
a172 , 0 ; - base
a173 , a398 ; - lower write limit
;*** a174 , core size ; - upper - -
a175 , b54<12+b54 ; - interrupt levels
a32 , 0 ; status = not monitor mode
a33 , h12 ; ic = start init
a34 , 0 ; parent = undef
;*** a181 , core size ; current cpa
a182 , 0 ; - base
a183 , a398 ; - lower write limit
;*** a184 , core size ; - upper - -
a185 , b54<12+b54 ; - interrupt levels
a42 , a107 ; catalog base low
a43 , a108-1 ; - - high
a44-2 , a107 ; max interval low
a44 , a108-1 ; - - high
a45-2 , a107 ; std interval low
a45 , a108-1 ; - - high
a302 , 0 ; save area address
a10 , 0;(end of words) ; kind = 0
a12 , 0 ; stopcount
a13 , a95 ; state = running
a19 , i6 ; buf claim
a20 , i7 ; area claim
a21 , i8-1 ; internal claim
a24 , 1<7 ; (protection register, for compatibility reasons)
a25 , 0 ; (protection key, for compatibility reasons)
a22 , 8.7777 ; function mask
a10 , 0;(end of bytes) ; (kind = 0)
rs. w0 (4) ; top core :=
jl. 4 ;
e17 ;
rs w0 x1+a18 ; top address(s) :=
rs w0 x1+a171 ; initial cpa(s) :=
rs w0 x1+a174 ; initial upper write limit(s) :=
rs w0 x1+a181 ; current cpa(s) :=
rs w0 x1+a184 ; current upper write limit(s) := core size;
; process description for std driver
al w1 x1 +a4 ; proc := next internal;
jl. w2 i18. ; init description;
a48 , a107 ; interval low
a49 , a108-1 ; - high
a11 , <:dri:> ; name = <:driver proc:>
a11+2 , <:ver:> ;
a11+4 , <:pro:> ;
a11+6 , <:c:> ;
a17 , a398 ; first address
a18 , b60 ; top address
a301 , -1 ; priority
a26 , a89 ; interrupt mask
a27 , b87 ; user exception address
a170 , 0 ; user escape address
a171 , b60 ; initial cpa
a172 , 0 ; - base
a173 , a398 ; - lower write limit
a174 , b60 ; - upper - -
a175 , 6<12+8 ; - interrupt levels
a32 , 1<23+1<6 ; status = monitor mode,locked
a33 , b77 ; ic = before central waiting point one call of lock
a34 , 0 ; parent = undef
a181 , b60 ; current cpa
a182 , 0 ; - base
a183 , a398 ; - lower write limit
a184 , b60 ; - upper - -
a185 , 6<12+8 ; - interrupt levels
a42 , a107 ; catalog base low
a43 , a108-1 ; - - high
a44-2 , a107 ; max interval low
a44 , a108-1 ; - - high
a45-2 , a107 ; std interval low
a45 , a108-1 ; - - high
a302 , b86 ; save area address
a10 , 0 ;(end of words) ; kind = 0
a12 , 0 ; stopcount
a13 , a95 ; state = running
a19 , i3 ; buf claim
a20 , i4 ; area claim
a21 , i5-1 ; internal claim
a24 , 1<7 ; (protection register)
a25 , 0 ; (protection key)
a22 , 8.7777 ; function mask
a10 , 0 ;(end of bytes) ; (kind = 0)
al w0 0 ;
rs w0 x1+a30 ; driverproc.save w2 := 0;
al w2 x1+a16 ;
rl w1 b2 ;
jl w3 b36 ; link(timer q,driverproc)
al w2 x2-a4 ;
jl w3 b36 ; link(timer q, s);
jl. w3 i14. ; take control
b3 ; (first name table entry,
b6 ; first internal,
b29+2*a4 ; driver proc);
jl. w3 i14. ; take control
b76 ; (first secondary interrupt,
k ; irrellevant,
b29+2*a4 ; driver proc);
al. w2 i10. ;
jl. (i12.) ; autoloader(first core);
i13:e4 ;
; take control
; comment: searches through the specified part of name table and initializes driver
; proc address.
i14: rl w1 (x3) ; entry := param 1;
i15: am (x3 +2) ; next:
sn w1 (0) ; if entry = top entry (i.e. param 2)
jl x3 +6 ; then return;
rl w2 x1 +0 ; proc := nametable(entry);
sn w2 0 ; if end of table then
jl x3 +6 ; then return;
rl w0 x3 +4 ; if driverproc(proc) = 0 then
rx w0 x2+a250 ; driverproc(proc) := param 3;
se w0 0 ;
rs w0 x2+a250 ;
al w1 x1 +2 ; entry := entry + 2;
jl. i15. ; goto next;
; procedure init description
; call: w1 = process description address, w2 = init table
; exit: w0 = core size, w1 = unchanged
i18: dl w0 x2 +2 ; move words:
al w2 x2 +4 ; move contents to outpointed
am x1 ; relatives in process description
rs w0 x3 ;
se w3 a10 ; until kind is moved;
jl. i18. ;
i19: dl w0 x2 +2 ; move bytes:
al w2 x2 +4 ; move contents to outpointed
am x1 ; relatives in process description
hs w0 x3 ;
se w3 a10 ; until kind is moved;
jl. i19. ;
rl w0 b12 ;
jl x2 ;
i12:0 ; after loading:
jl. i10. ; goto initialize segment;
c70= k-b127 + 2
k=i10 ;
e. ;
i.
e. ; end of operating system s
▶EOF◀