|
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: 70656 (0x11400) Types: TextFile Names: »mons2«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt. └─⟦0364f57e3⟧ └─⟦87223b8a0⟧ »kkrcmonfil« └─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ. └─⟦b2ec5d50f⟧ └─⟦87223b8a0⟧ »kkrcmonfil« └─⟦this⟧
\f m. mons2 - monitor operatins system s, part 2 b.i30 w. i0=81 05 05 , i1=13 00 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> e8:0-0-0 ; <last of initcat code> 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:h11 ; <first core> 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 e79:-1 ; segment in susercat or -1 e81:0 ;remove,1<21 indicator 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> e30:0 ; <core addr> ; *** end of work-area match 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) e39:0 ; <event> e40:0 ; <receiver> e41:0 ; e42:0 ; e43:0,0 ; e55:0 ; <write shift> e44:5<12 ; <type mess> e45:0 ; <line addr> e46:0 ; <write addr> 0 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 ; e53: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 c.(:c23>14 a.1:)-1 e70:h19 e71:h20 z. 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. e85:0 ; used in job command ; 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 g28. ; <:no core<0>:> g5: jl. w1 g28. ; <:no buffers<0>:> g6: jl. w1 g28. ; <:no areas<0>:> g7: jl. w1 g28. ; <:no internals<0>:> g8: jl. w1 g28. ; <:key trouble<0>:> g9: jl. w1 g28. ; <:process unknown<0>:> g10: jl. w1 g28. ; <: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 g28. ; <:program too big<0>:> g15: jl. w1 g28. ; <:area error<0>:> g16: jl. w1 g28. ; <:device unknown<0>:> g17: jl. w1 g28. ; <:device reserved<0>:> g18: jl. w1 g28. ; <:not implemented<0>:> g19: jl. w1 g28. ; <:base illegal<0>:> g20: jl. w1 g28. ; <:bs claims exceeded<0>:> g21: jl. w1 g28. ; <:bs device unknown<0>:> g22: jl. w1 g28. ; <:name unknown<0>:> g23:<:message<0>:> g24:<:pause<0>:> g25: jl. w1 g28. ; <:no entries in maincat<0>:> g26:<:max<0>:> g27: jl. w1 g28. ; <:illegal priority<0> :> g29: jl. w1 g28. ; <:prog name unknown<0>:> g47: jl. w1 g28. ; <:input aborted<0>:> g28: ld w3 -100 ; w2=w3=0 se w3 (b13) ; if clock initialized then rs. w3 g48. ; remove warning sn. w1 g2.+2 ; if 'syntax' then al w2 10 ; set w2=10 se. w1 g1.+2 ; else hs. w3 e81. ; reset remove indicator al w3 -1 ; rs. w3 e89. ; executing reentrant code := true; rs. w3 e79. ; reset segment no in susercat jl. w3 d19. ; init write jl. w3 d21. ; write text se w2 10 ; if syntax error then jl. g46. ; al. w1 e20. ; write last read parameter jl. w3 d21. ; rl. w1 e19. ; rl. w0 e20. ; sn w0 0 jl. w3 d22. ; g46: al w0 10 ; jl. w3 d20. ; write <nl> jl. w3 d23. ; type line jl. w3 d42. ; save work(buf); jl. 2 ;+2: error rl. w1 e25. ; jl. w3 d10. ; decrease access g30: al w2 0 ; exam first: rs. w2 e81. ; reset remove list indicator 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); c.(:c24>20a.1:)-1 ; if event testoutput then jd 1<11+30 ; begin type w1(sender); jd 1<11+32 ; type w2(event); z. ; end; 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); 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; al w0 x1 ; jl. w3 d24. ; find console(device,console, jl. g33. ; reject message); rs. w1 e25. ; console:= new console jl. w3 d9. ; increase access jd 1<11+26 ; get event(console buf); al w0 1 ; al. w1 e51. ; jd 1<11+22 ; send answer(console) al w2 0 ; jl. w3 d41. ; find work(0,new work); 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. g47. ;+2: error: goto end line; 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: sn w0 0 ; exam command: 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 so w2 1 ; if command not list max print or modify then hs. w2 e81.+1 ; remove console=false 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. ; 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 e25. ; console:= parent; rs. w2 e29. ; child:= sender; al w2 0 ; jl. w3 d41. ; find work(0,new work); 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); rs. w2 e23.+2 ; clear function zl. w1 e32.+1 ; if stop bit on then so w1 8.200 ; begin jl. g97. ; zl. w1 e32. ; save function rs. w1 e23.+2 ; se w1 10 ; if function = replace then jl. g97. ; save areaname 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) g97: jl. w3 d42. ; save work am 0 ; +2 error (dont care) rl. w3 e23.+2 ; if function =finis or replace then se w3 10 ; sn w3 2 ; sz ; jl. g30. ; jl. w3 d76. ; adjust bs claim jl. w3 d40. ; remove process rl. w3 e23.+2 ; if function =replace then se w3 10 ; jl. g30. ; rl. w2 e24. ; stack input and al w2 x2+c66 ; jl. w3 d79. ; goto next command jl. g35. ; 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. ; am -2048 ; jl. w3 d79.+2048; stack input (name); jl. g35. ; goto next command; ; command syntax: unstack g58: ; unstack: am -2048 ; jl. w2 d80.+2048; unstack input; jl. g35. ; goto next command; ; command syntax: date <year> <month> <date> <hour> <min> <sec> b. i20, j30 w. ; j0: ; minimum values: 81 , 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. ; clear claimlist; 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 w0 0 ; rs w0 x1+c95+2 ; clear primary input name; rs w0 x1+c96+2 ; clear primary output name; 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) jl. w3 d29. ; find max(size) sn w1 0 ; if max size =0 then jl. g4. ; return "no core " rl. w2 e25. ; rs w1 x2+c39 ; size(console):= size c.-4000 ; only in rc4000: al w2 8 ; keys:= 8 jl. w3 d32. ; find keys(keys,pr,pk,notused) am 0 ; ac w0 x2 -8 ; rl. w1 e25. ; hs w0 x1+c26 ; keys(console):= 8-keys z. ; ; ; 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; c.(:c24>18a.1:)-1 ; if console testoutput jl. w3 d44. ; then type description; z. jl. g35. ; goto next command; j2: <:s<0>:> ; (prevent blocking communication with s) e. 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; rs w0 x2 +0 ; word param(console):=integer; c.(:c24>18a.1:)-1 ; if console testoutput jl. w3 d44. ; then type description; z. jl. g35. ; goto next command; i0:1<1 e. c.8000 ; in rc8000: 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 z. c.-4000 ; only in rc4000 g57:al w2 x1+c26 ; key claim: la. w0 i2. ; abs protection(console):=false; jl. i0. ; goto set param; g59: al w2 x1+c38 ; pk: lo. w0 i3. ; abs protection(console):=true; i0: hs w0 x1+c27 ; set param: jl. i1. ; z. 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; c.(:c24>18a.1:)-1 ; if console testoutput jl. w3 d44. ; then type description; z. jl. g35. ; goto next command; i2:8.7773 i3:1<2 e. c.-4000 b.i24 ; pr: w.g58:jl. w3 d45. ; next bitnumbers(bits, type); ls w2 -16 ; bits:=bits shift -16; lx. w2 i0. ; bits:=bits exor 8.377; lo. w2 i1. ; bits(16):=1; hs w2 x1+c37 ; pr(console):=bits(12:23); c.(:c24>18a.1:)-1 ; if console testoutput jl. w3 d44. ; then type description; z. jl. g36. ; goto exam command; i0:8.377 i1:1<7 e. z. ; function mask: g63: jl. w3 d45. ; next bitnumbers(bits, type); ls w2 -12 ; hs w2 x1+c35 ; function mask(console):=bits(0:11); c.(:c24>18a.1:)-1 ; if console testoutput jl. w3 d44. ; then type description; z. jl. g36. ; goto exam command; g64:; create: jl. w3 d35. ; rl. w2 e29. ; create child; rl w0 x2+a17 ; wa w0 x2+a182 jl. w3 d36. ; modify child(first addr(child)); c.(:c24>18a.1:)-1 ; if console testoutput jl. w3 d44. ; then type description; z. jl. g35. ; goto next command; ; init: g65: jl. w3 d35. ; create child; jl. w3 d37. ; load child; jl. g35. ; goto next command; ; run: g66: 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: 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 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 ; 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. g71: ; jl. w3 d34. ; check child; al w0 1 ; hs. w0 e81. ; jl. w3 d39. ; stop child; jl. w3 d76. ; adjust bs-claims jl. w3 d40. ; remove child; jl. g35. ; goto next command; i1:0 ; e. c.(:c23>21a.1:)-1 ; if include/exclude option then g72 = k ; include: am 2 ; g73 = k ; exclude: b.i24 ; begin w. 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 ; begin w.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 i7: <: error <0>:> i8: <: stop <0>:> i9: <: run <0>:> i10: <: wait <0>:> 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) zl w1 x2+a25 ; al w0 3 ; jl. w3 d71. ; writeint(key,4) zl w1 x2+a12 ; al w0 4 ; jl. w3 d71. ; writeint(stopcount,4) bl w0 x2+a13 ; w0 := process state; al. w1 i7. ; sz w0 2.10000000; al. w1 i10. ; sz w0 2.00100000; al. w1 i8. ; sz w0 2.01000000; al. w1 i9. ; jl. w3 d21. ; writetext(process state); 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 ; begin w. 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 e2. ; writeinteger(buf claim(s) jl. w3 d22. ; -own buf); al w0 32 ; jl. w3 d20. ; writechar(32); bz w1 x2+a20 ; ws. w1 e3. ; 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 ; begin w. am d15-e0 ; jl. w3 e0. ; next name; al. w3 e20. ; 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 e20. ; 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 e49. ; first addr(area mess):= first addr; rl. w1 e58. ; segment(area mess):= rs. w1 e50. ; segment(tail); bz. w1 e67. ; wa w1 0 ; rs. w1 i20. ; entry:= first addr+entry(tail); sh. w1 (e49.) ; if entry>last addr(area mess) then jl. 4 ; jl. i5. ; goto give up; al. w1 e47. ; al. w3 e20. ; jd 1<11+16 ; send mess(name,area mess,buf); al. w1 e51. ; jd 1<11+18 ; wait answer(buf,answer,result); rl. w1 e51. ; 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 e24. ; 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 e25. ; 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: al. w3 e20. ; 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. ; ; stepping stone ; jl. d15., d15=k-2 jl. d16. d16=k-2 jl. g27., g27=k-2 jl. d34. d34=k-2 jl. d42. d42=k-2 jl. d46., d46=k-2 jl. d61. d61=k-2 jl. d77. ; d77=k-2 jl. d78. ; d78=k-2 b.i24 ; dump: w.g79:am d15-e0 jl. w3 e0. ; 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 al. w3 e20. ; 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 al. w3 e20. ; 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 e29. ; al w1 0 ; rs. w1 e46.+2 ; 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 e46. ; write addr:= top addr(child)-2; al. w3 e20. ; al. w1 e44. ; jd 1<11+16 ; send mess(name,output,buf); al. w1 e51. ; jd 1<11+18 ; wait answer(buf,answer,result); rl. w1 e51. ; sn w0 1 ; if result<>1 se w1 0 ; or status(answer)<>0 then 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: al. w2 g13. ; - - - : area reserved 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 ; bs: w. ; i2: dl. w2 e21. ; ds. w2 i4. ; dl. w2 e23. ; 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 e52. ; more: jl. w3 d16. ; next integer rs. w0 e51. ; dl. w0 e52. ; al. w1 e51.+a110*4; index:= claim list end i1: ds w0 x1 +2 ; repeat begin al w1 x1 -4 ; claimlist(index):=claimchange se. w1 e51. ; index:= index-4 jl. i1. ; until index = claim list start al. w2 i3. ; rl. w3 e25. ; 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 e25. ; rs. w3 i6. ; save abs addr of claim; jl. w3 d15. ; jl. w3 i2. ; jl. w3 d16. ; get segments rs. w0 e52. ; jl. w3 d16. ; get entries rs. w0 e51. ; al. w2 i3. ; name adr. jl. w3 d61. ; get devno*8 jl. g16. ; sorry goto end line dl. w1 e52. ; 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: 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 e70. ; jl. w3 d77. ; rl. w1 e70. ; 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 e85. ; j8: dl. w2 (i6.) ; aa. w2 (i7.) ; compute hashvalue wa w2 2 ; al w1 0 ; sh w2 -1 ; ac w2 x2 ; wd. w2 i14. rs. w1 i13. ; j3: rl. w2 e71. ; rs. w1 (i5.) ; 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 (i5.) ; 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 (i3.) ; 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 e70. ; 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 (i3.) ; restore console al w2 -1 ; areabuf := undef; rs. w2 (i4.) ; sn. w2 (i16.) ; if only load then jl. g35. ; goto next command; jl. g66. ; else goto run ; i0: 0 ; claim list start(console) i1: 0 ; -2 claim list adr(userentry) i2: 0 ; +0 dev. name adr.(entry0) i3: e25 i4: e87 i5: e79 i6: e21 i7: e23 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. g15. ; goto end line; rl w2 0 ; jl. w3 (i22.) ; se w0 (x2) ; if next integer <> core(addr) then jl. g15. ; 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 am -500 ; rs. w0 e37.+500 ; jl. w3 (i22.) ; next integer am -500 ; rs. w0 e38.+500 ; 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. ; am -500 ; rl. w1 e37.+500 ; print address(decimal) al w0 10 ; al. w2 i1. ; jl. w3 j3. ; am -500 ; rl. w2 e37.+500 ; print word(octal) rl w1 x2 ; al w0 8 ; al. w2 i3. ; jl. w3 j3. ; al w1 -2 ; am -500 ; la. w1 e37.+500 ; bz w1 x1 ; print byte 1(decimal) al w0 10 ; al. w2 i4. ; jl. w3 j3. ; al w1 -2 ; am -500 ; la. w1 e37.+500 ; bz w1 x1 +1 ; print byte 2(decimal) al w0 10 ; al. w2 i5. ; jl. w3 j3. ; am -500 ; rl. w2 e37.+500 ; 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. ; am -500 ; rl. w1 e37.+500 ; 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; am -500 ; rl. w1 e37.+500 ; first addr al w1 x1 +2 ; +2 am -500 ; rs. w1 e37.+500 ; =: first addr am -500 ; rl. w2 e38.+500 ; 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 w. g93: ; prio: jl. w3 d16. ; read priority sz. w0 (i1.) ; if prio < 0 or prio >= 4096 then jl. g27. ; goto end line: illegal priority hs w0 x1+c26 ; jl. g35. ; else goto next command i1: -1<12 e. b.i10 w.g99: ; jobremove am -2046 ; jl. w3 d34.+2046 ; check child al w2 -1 ; rs w2 x3+c22 ; coretableelement:=not job jl. g71. ; goto remove 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. ; 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 am -2046 ; rl. w3 e30.+2046 ; 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 am -2046 rl. w1 e30.+2046 ; rl w1 x1+c22 ; am -2046 ; rs. w1 e46.+2+2046 ; store segmentno in output mess am -2046 ; rl. w1 e29.+2046 ; get procname(child) al w2 x1+a11 ; and store in name area am -2046 ; al. w3 e20.+2046 ; dl w1 x2+2 ; ds w1 x3+2 ; dl w1 x2+6 ; ds w1 x3+6 ; jd 1<11+4 ; get pr descr.(proc name) rs. w0 i0. ; se w0 0 ; jl. j0. ; am -2046 ; if error then jl. g9.+2046 ; goto end line: process unknown j0: jl. w3 d78. ; find entry sh w2 -1 ; if entry not found then jl. j4. ; goto end line: catalog error al w2 x2+48 ; rs. w2 i3. ; perm claim adr(userentry) rl. w2 i1. ; al w2 x2+8 ; rs. w2 i4. ; j1: rl. w2 i4. ; adjust rest claims jl. w3 d61. ; for i=0 step 1 jl. j2. ; until last dev.(entry0) rl w2 x3-a88-2 ; begin wa. w2 i0. ; find chaintable(dev.) al w2 x2+6 ; if not found goto next device zl w0 x2 ; perm entries(suserentry) rl. w1 i3. ; = entry claim(pr.descr.) , key=3 rs w0 x1 ; zl w0 x2+1 ; perm segments wm w0 x3-a88+26 ; = slicelenght(dev)*slice claim(pr.descr.) rs w0 x1+2 ; end 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. am -2046 ; first adr. h20 ds. w3 e46.+2046 ; 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. ; am -2046 ; if error then jl. g15.+2046 ; write: area error j5: am -2046 ; al. w1 e44.+2046 ; 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: am -2046 ; error al. w1 g11.+2046 ; write catalog error rs. w1 i10. ; j6: rl. w3 i5. ; jd 1<11+64 ; remove area susercat am -2048 ; rs. w3 e87.+2048; areabuf := undef; jl. (i10.) ; return ; i0: 0 ; pr.descr.adr(procname) i1: h19 ; entry0 adr. i2: h20 ; user segment adr. z. am -2046 jl. g18.+2046 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.6666 4244 ; ( ) * + , - . / 8.1111 1111 ; 0 1 2 3 4 5 6 7 8.1125 6466 ; 8 9 : ; < = > 8.6666 6666 ; a b c d e f g 8.6666 6666 ; h i j k l m n o 8.6666 6666 ; p q r s t u v w 8.6666 6666 ; 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 <: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 <:create:> , 1<16+g64-g45 <:date:> , 1<21+1<14+g49-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 <:intern:> , 1<17+g62-g45 <:job<0>:>,1<20+g89-g45 <:get<0>:> , 1<20+g96-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 <:new<0>:> , 1<16+g51-g45 <:jobrem:>, 1<15+g99-g45 <:o:>,0 , 1<20+g95-g45 <:perm:>,1<17+g85-g45 <:prio:>,1<18+g93-g45 <:proc:> , 1<20+g52-g45 <:prog:> , 1<20+g53-g45 <:projec:>,1<18+g80-g45 <:read:> , 1<20+1<14+g57-g45 <:remove:> , 1<20+g71-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 <: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 ; define b-names 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 = e8 ; pointer to: last of init code 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 ; 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 j0: rs. w3 i0. ; start: al. w1 i0. ; rs w1 x2 +0 ; first free:=start of init code; al w0 c82 ; dl. w2 i1. ; am -2046 ; al. w3 h4.+2046 ; 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; am -2046 rs. w2 h4.+c21+2046 ; rs. w2 h22.+c20 ; al w0 0 ; al w2 0 ; jl. (i0.) ; return to slang; jl. j0. ; goto start; e.j. h21=k ; start of special console descriptions t.m. s console table included 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: c.(:c23>14a.1:)-1 h. h19: -1,r.c89 h20:-1,r.512 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. h12: h13 = - (:h12 + 2:) ; command table continues in second word of next text b. i24 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 i10: rs. w3 i12. ; save return to autoloader; ; initialize work table b. j1 w. al. w3 h8. ; 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 h9. ; jl. j0. ; e. ; ; initialize special console descriptions. b.j3 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. ; jl. i9. j2: h21 j3: h5 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+8 ; first address a18 , b61 ; top address a301 , 0 ; priority a26 , a89 ; interrupt mask a27 , b62 ; user exception address a170 , 0 ; user escape address a32 , 0 ; status = not monitor mode a33 , b63 ; ic = waiting point a182 , 0 ; base = no relocation a183 , 8 ; 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; ; 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 , 8 ; - 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 , 8 ; - 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 , 8 ; 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 , 8 ; - lower write limit a174 , b60 ; - upper - - a175 , 6<12+b54 ; - interrupt levels a32 , 0 ; status = not monitor mode a33 , b85 ; ic = central waiting point a34 , 0 ; parent = undef a181 , b60 ; current cpa a182 , 0 ; - base a183 , 8 ; - lower write limit a184 , b60 ; - upper - - a185 , 6<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 , 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) \f al w2 x1+a16 ; rl w1 b2 ; link(timer q, internal); jl w3 b36 ; al w2 x2 -a4 ; link(timer q, previous internal); jl w3 b36 ; 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◀