|
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: 30720 (0x7800) Types: TextFile Names: »kkmonret3«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt. └─⟦0364f57e3⟧ └─⟦3b4b74406⟧ »kkmon3filer« └─⟦this⟧
; bs disc3 2000 40 ( message monchange release 7.0 to 7.13 clear temp mondef moncentral monprocs mondisc monfpaline monhost monfpasub, montabinit monprocfnc1 monprocfnc2 mons1 mons2 moncatinit, mdef mcentral mprocs mdisc mfpaline mhost mfpasub, mtabinit mprocfnc1 mprocfnc2 ms1 ms2 mcatinit contract entry.kkmon3filer mondef moncentral monprocs mondisc monfpaline, monhost monfpasub montabinit monprocfnc1 monprocfnc2 mons1 mons2 moncatinit skip 36.1 c=copy mess.no 1 mdef=set 1 disc3 mdef=edit mondef skip 36.1 c=copy mess.no 1 mcentral=set 1 disc3 mcentral=edit moncentral skip 36.1 c=copy mess.no 1 mprocs=set 1 disc3 mprocs=edit monprocs skip 36.1 c=copy mess.no 1 mdisc=assign mondisc skip 36.1 c=copy mess.no 1 mfpaline=assign monfpaline skip 36.1 c=copy mess.no 1 mhost=assign monhost skip 36.1 c=copy mess.no 1 mfpasub=assign monfpasub skip 36.1 c=copy mess.no 1 mtabinit=set 1 disc3 mtabinit=edit montabinit skip 36.1 c=copy mess.no 1 mprocfnc1=assign monprocfnc1 skip 36.1 c=copy mess.no 1 mprocfnc2=set 1 disc3 mprocfnc2=edit monprocfnc2 skip 36.1 c=copy mess.no 1 ms1=assign mons1 skip 36.1 c=copy mess.no 1 ms2=assign mons2 skip 36.1 c=copy mess.no 1 mcatinit=assign moncatinit head cpu finisb end) $def ;******************** l./a48=-4/,i/ a200= -14 ; first of internal process description a194= -14 ; process descr addr(other comp) if mirror proc exist a192= -12 ; process type 0 useal internal process ; 2 master process (this computer) ; 3 master mirror process ; 5 mirror process a190= -10 ; process description addr of master process a188= -8,a189= -7 ; computer number<12 + internal claim (other computer) a186= -6, a187= -5 ; cpu running mask,allowed cpu mask /,l./-a48/,r/a48/a200/,l./a48=first/,g 2/a48/a200/, l./a104=/,l1,i/ a94 = 2.11111000 ; waiting for external interrupt /,l./a139=-2/,i/ a158=-10 ; buffer state a156=-8 ; reciever <12 + sender (computer numbers) a155=-6 ; process descr addr receiver (other computer) a154=-4 ; process descr addr sender (other computer) /,l./a6=/,r/a139/a158/, f $central ;******************** l./,f20,e/,r/f20/f23/,r/e62/e64/, l./b76:/, l./b26=b5/,l1,i/ c. a430 0,r.(:66<1 -k +2:) > 1 ; b56: 0,r.a350 ; current process (cpu(i)) i=1,...,last cpu z. /,l./c0:/,r/c0:/c0: c. a430 jl w3 d35 ; stop cpu(i), i=1, ,last cpu; z. /,l./c99:/,l1,i/ c. a430 jl w3 d36 ; start cpu(i), i=1,...,last cpu; z. /,l./h0:/,l1,i/ h1: d140 ; addr(dump core procedure) /,l1,l./d140/,r/d140./(h1) /,r/./ /,r/);/) ;/, l2,i/ c. a430 jl w3 d37 ; init cpu1 z. /,l./c50:/,r/:/: c. a430 jl w3 d35 ; stop(i), i=1,2,3,...,last cpu z./,l./d13:/,l./c.(/,i/ rs w1 x2+a158 ; clear buffer state /,l./d104:/,l2,r/ /d114:/, l./d10:/,l./i3:/,l./(x1-a16+a301)/,r/x1-a16+a301/i6/,l./i5:/,l2,i/ i6: a249+1 ; max number for priority except for a dummy process /,l./e./,l1,i/ ; bitpatterns: g48: 3 ; constant 3 (= number of chars per word) g50: 8.7777 7776 ; first 23 bits g51: 8.7777 0000 ; first 12 bits g52: 8.0000 7777 ; last 12 bits g53: 8.0000 0377 ; last 8 bits g49: 1<23 ; bit 0 g62: 1<18 ; bit 5 g65: 8.3777 7777 ; last 23 bits g63: 1 ; bit 23 /,l./b52:/,l./comment:the/, l./g34:/,l./i0/,r/s /s./,r/0 /0./, l./i0)/,r/l /l./,r/) /.)/,l1,l./i0)/,r/l /l./,r/) /.)/, l1,r/l /l./,r/0 /0./, l./d74:/,r/s /s./,r/i3 /i3./, l./i3)/,r/l /l./,r/3) /3.)/,l./;bit/,d./g63:/,i/ c. a430 d35: jl. (2),d25 ; d36: jl. (2),d26 ; d37: jl. (2),d27 ; b55: 0 ; interrupt addr for cpu1 b57: 0 ; cur proc(cpu0) (when b1 is cur proc(cpu1)) b58: 0 ; relative addr of curr proc at cpu1 f23: 1<23 +20 < 3 + 0 ; device addr for device 20 (cpu1) z. b105: 0 ; master process description addr b106: 0 ; proc descr addr(hcdriver) b109: 0 ; computer number (this computer) /,f $procs ;******************** l./b16:/,l./;30:(type/,d2,i/ e15 ; 30: set cpu mask (or lookup cpu mask) 'cpumask' e16 ; 32: select or remove master process 'systemaddr' e17 ; 34: move-buff 'sendfurther' /,l./e62;124/,l1,i/ e63 ; 126 : select or remove buff e64 ; 128 : start cpu(1) /,l./d15:/,l./x1+a250/,l1,i/ rl w3 x1+a192 ; process type sl w3 3 ; if mirror proc then rl w1 x1+a190 ; calling proc:=master proc /,l./d16:/,l./x1+a250/,l1,i/ rl w0 x1+a192 ; process type sl w0 3 ; if mirror proc then rl w1 x1+a190 ; calling proc:=master proc /,l./e0:/,l-20,l./i40:/,l./e./,l2,i/ ; ; procedure test other computers ; if current proces has performed a call of ; create internal process (other computers) ; start internal process (other computers) ; stop internal process (other computers) ; modify internal process (other computers) ; remove internal process (other computers or own computer) ; then there is selected and initialized a message buffer ; ; - 10 0 ; - 8 0 - 6 0 ; - 4 0 ; - 2 0 ; buf + 0 next buf ; + 2 prev buff ; + 4 receiver (=master process) ; + 6 sender (=calling process) ; + 8 1<22 + monitor procedure number (56,58,60,62 or 64) ; +10 saved w0 (from calling process) ; +12 - w1 - ; +14 - w2 - ; +16 - w3 - ; ; and the buffer is linked to the master process (this computer) ; ; call w2=curr+a16 w3 =return ; return: w2 is unchanged ; b. h10,i10 w. ; d40: rl w1 b105 ; w1:= master se w1 0 ; if master not present sn w1 x2-a16 ; or calling proc =master proc then jl x3 ; return rl w1 x2-a16+a33; w1:=ic.cur al w0 2.11111111; la w0 x1-2 ; w1:= monitor procedure number sh w0 64 ; if number > 64 or sh w0 55 ; number <56 then jl x3 ; return rs. w0 h1. ; save monitor procedure number ds. w3 h3. ; save(w2,w3) se w0 56 ; if not create internal process then jl. i0. ; goto search name rl w1 x2-a16+a29; w1:=saved w1 rl w1 x1+8 ; w1:=mode se w1 -8 ; if mode<>-8 then jl x3 ; return jl. i2. ; else goto select buff i0: rl w2 x2-a16+a31; w2:=saved w3 jl w3 d11 ; search name jl. i5. ; if not found then return rl w3 x3 ; else w3:=proc rl w0 x3 ; w0:=kind se w3 (b105) ; if masterproc or se w0 0 ; not internal proc then jl. i5. ; return rl w0 x3+a194 ; w0:=proc addr other comp. sh w0 0 ; if not mirror process or a proc with mirror proc thenen jl. i5. ; return i2: rl w1 b105 ; w1:=master proc rl w2 b8 ; w2:=next buff al w0 -2 ; set up message buff rs w0 x2+a158 ; buf -10 := -2 (mon call buff) ld w0 -100 ; buf - 8 := 0 rs w0 x2+a156 ; buf - 6 := 0 ds w0 x2+a154 ; buf - 4 := 0 rl. w3 h2. ; al w3 x3-a16 ; rs w3 x2+a142 ; + 6 :=sender rs w1 x2+a141 ; + 4 :=receiver rl. w0 h0. ; wa. w0 h1. ; rs w0 x2+a145 ; + 8 := 1<22 + monitor procedure no dl w1 x3+a29 ; +10 := w0.sender ds w1 x2+a145+4 ; +12 := w1.sender dl w1 x3+a31 ; +14 := w2.sender ds w1 x2+a145+8 ; +16 := w3.sender rs w0 x2+a139 ; w2.sender jl w3 d5 ; remove buf al w3 c99 ; jl. d16. ; deliver message and goto interrupt return i5: dl. w3 h3. ; jl x3 ; return h0: 1<22 h1: 0 h2: 0 h3: 0 e. /,l./e10:/,l-1,r/i8/i20/,l./e11:/,l1,i/ rl w3 x2+a158 ; w3:=buffer type se w3 -2 ; if it is not a moncall buffer then jl. i9. ; goto i9 rl w3 b105 ; se w3 0 ; if rhdriver exist then jl. i12. ; goto i12 i9: /,l./jl.d15./,l1,i/ ; ; if the buffer contain an answer from mon call other computer then ; set result in calling proc i12: dl w1 x2+a142 ; w0:=receiver w1:=sender ds. w1 i11. ; ld w0 -100 ; ds w0 x2+a156 ; clear buff(other comp),receiver-sender, rs w0 x2+a154 ; proc descr addr jl w3 d106 ; remove buff rl. w1 i11. ; restore sender sh w1 0 ; if regretted then jl c99 ; return rl. w3 i10. ; w3:=receiver sh w3 0 ; ac w3 x3 ; bz w0 x3+a19 ; ba. w0 1 ; increase bufferclaim.master hs w0 x3+a19 ; rl w0 x3+a28 ; w0:=answer rs w0 x1+a28 ; set result al w3 c99 ; and return interrupt jl d10 ; i10: 0 ; receiver i11: 0 ; sender /,l./e57:/,l./rlw1(b6)/,i/ jl. w3 d40. ; check mirror process /,l./e35:/,l./jlr3/,l1,i/ rl w3 x2+6 ; w3:=sender rl w0 x3+a192 ; sl w0 3 ; if sender is a mirror process then jl. i14. ; goto move to master /,l./i3./,l1,i/ ; w1 = cur ; w2 = buf ; w3 = sender i14: ; move buf to master rl w3 x3+a190 ; w3:=master rl w0 x3+a19 ; bs. w0 1 ; rs w0 x3+a19 ; decrease bufferclaim.master ds. w3 j1. ; save buf, master jl w3 d5 ; remove buf bz w3 x1+a19 ; al w3 x3+1 ; increase bufferclaim.cur hs w3 x1+a19 ; al w0 a101 ; jl w3 d9 ; remove calling proc rl. w1 j1. ; w1:=master al w1 x1+a15 ; jl w3 d6 ; link buf al w1 x1-a15 ; am (b1) ; rl w0 a29 ; w0:=first addr rl w3 b109 ; w3:=computer number rl. w2 j0. ; w2:=buf ds w3 x2+a153+2 ; al w0 -1 ; set buffer state to rs w0 x2+a158 ; copy buffer rl w0 x1+a13 ; w0:=state sn w0 a104 ; if waiting for event then jl w3 d10 ; link proc and jl c99 ; and return /,l./e47:/,l-6,i/ ; set cpu mask ; saved w0 new cpu mask result=if new cpu mask=0 then old cpu mask else ; new cpu mask ; saved w1 ; saved w2 ; saved w3 b. w. e15: rl w2 x1+a28 ; w2:=new cpu mask se w2 0 ; if new cpu mask<>0 then hs w2 x1+a187 ; set new cpu mask bz w2 x1+a187 ; load result rs w2 x1+a28 ; jl c99 ; return e. ; ; procedure select or remove masterproc ; saved w0=0 for remove ; 2 for select ; 4 for select hcdriver process addr ; saved w3= proc addr (in the 3 last cases) b. i5 w. e16: rl w2 x1+a28 ; w2:=saved w0 sl w2 3 ; if set proc addr then jl. i0. ; goto i0 rs w2 x1+a192 ; select or remove master se w2 0 ; if select then al w2 x1 ; set current master rs w2 b105 ; else remove current master jl c99 ; return interrupt i0: rs w1 b106 ; set proc addr jl c99 ; return interrupt e. ; ; procedure move buff(sender,receiver); ; saved w0 return: =0 buffer claim execeeded (receiver) ; =1 buffer moved ; saved w1 ; saved w2 buf ; saved w3 receiver ; b. h5,i5 w. e17: jl w3 d101 ; check and search name jl r3 ; if process do not exist then result 3 rs. w3 h0. ; save receiver jl w3 d12 ; check buf rl. w3 (h0.) ; w3:=receiver bz w0 x3+a19 ; sh w0 0 ; jl. i0. ; bs. w0 1 ; hs w0 x3+a19 ; jl w3 d5 ; remove buf al w0 1 ; rs w0 x1+a28 ; set result ba w0 x1+a19 ; increase buffer claim(sender) hs w0 x1+a19 ; rl. w1 (h0.) ; w1:=reciever al w1 x1+a15 ; jl w3 d6 ; link buf al w1 x1-a15 ; bz w0 x1+a13 ; w0:=state rl w3 b1 ; w3:=sender sn w0 a102 ; if waiting for message jl. i1. ; goto message se w0 a104 ; if not waiting for event then jl c99 ; return from interrupt al w3 0 ; else set result i1: rs w3 x1+a28 ; =0 (i.e. message) or proc addr rs w2 x1+a30 ; saved w2:=buf al w3 c99 ; jl d10 ; and link proc i0: al w0 0 ; rs w0 x3+a28 ; set result jl c99 ; and return h0: 0 e. /,l./e50:/,l./i55:/,l./end of start i/,l1,i? ; ; ; procedure get or release buf ; if w20=0 a free buffer is selected and the bufferclaim of the calling ; process is decreased by one ; else it is checked that w2 is a buffer address and the buffer is then ; released and the buffer claim of the calling process is increased by ; one. ; ; call return ; saved w0 ; saved w1 ; saved w2 0/bufferaddress buffer address ; saved w3 ; b. i4 w. e63: rl w2 x1+a30 ; saved w2 se w2 0 ; if remove buffer then jl. i1. ; goto i1 ; else select: rl w2 b8 ; w2:=first buffer bz w0 x1+a19 ; sh w0 0 ; if bufferclaim<= 0 then jl. i0. ; goto i0 al w0 x1 ; ds w1 x2+6 ; save calling proc both as sender and receiver i0: jl w3 d108 ; and goto claim buffer rs w2 x1+a30 ; jl w3 d5 ; remove buf from free queue jl. i2. ; i1: jl w3 d12 ; check buf jl w3 d109 ; increase claim, remove and release buf i2: jl c99 ; goto return from interrupt e. ; ; ; ; start cpu(1) e64: al w2 0 ; select cpu(1) c. a430 jl. w1 d23. ; reset cpu(1) jl. w3 d27. ; start cpu(1) z. jl c99 ; ; ; ; c. a430 m. start of cpu(i) service ; ; ; the following procedures are all used to service other cpu's ; than the commen cpu (cpu0) b. i20,h20 w. ; data-out instruction at cpu(i); ; ; interrupt cpu1 1<23 + 20<3 + 0<1 ; reset cpu1 1<23 + 20<3 + 1<1 ; stop cpu1 1<23 + 20<3 + 2<1 ; start cpu1 1<23 + 20<3 + 3<1 ; ; call: w2=relative addr of cpu(i), w1=return ; return: w2,w3 are unchanged, w0 are changed ; if cpu(i) is started then w1<h9 else w1=h9 h9=2 d21: am 1<1 ; start cpu(x2) d20: am 1<1 ; stop cpu(x2) d23: am 1<1 ; reset cpu(x2) d22: al w0 0<1 ; interrupt cpu(x2) wa w0 x2+f23 ; interrupt address(cpu(i)) rs. w1 h1. ; ds. w3 h3. ; al w1 0 ; do_count:=0; i0: do w3 (0) ; data_out(cpu(i)) sx 2.111 ; if buserror then jl. i2. ; goto count; i1: dl. w3 h3. ; jl. (h1.) ; return; i2: al w1 x1+1 ; do_count:=do_count+1; se w1 h9 ; if do_count<h9 then jl. i0. ; goto repeat data_out instruction else ls w2 -1 ; set cpu(x2) as not able to use; al w3 2.10 ; w3=mask for cpu(1) ls w3 x2 ; w3=2**(x2//2) ; mask for cpu(i) ac w3 x3+1 ; la. w3 b59. ; remove bit for cpu(i) rs. w3 b59. ; jl. i1. ; return h1: 0 h2: 0 h3: 0 b59: 2.000 000 000 011 ; mask for cpu's in use b51: 0,r.a350 ; b51+2*i = 0 cpu(i) is not initialisized ; = 1 a interrupt is send to cpu0, but ; not recieved. ; (special meaning at init cpu(i)) ; = 2 cpu(i) is ready for start ; = 4 cpu(i) is running or stopped ; without reg. dump ; ; ; stop cpu(i) i=1,...,last cpu ; call: w3=return ; return: all reg unchanged d25: ds. w1 h5. ; ds. w3 h7. ; al w2 -2 ; i5: al w2 x2+2 ; next cpu sl w2 a351+1 ; if all cpu's is stopped then jl. i6. ; return rl w1 x2+b56 ; sn w1 0 ; if no proc then jl. i5. ; goto next proc al w0 0 ; hs w0 x1+a186 ; clear cpu running mask rl. w0 x2+b51. ; sn w0 4 ; if a proc is running then jl. w1 d22. ; interrupt at cpu(x2) jl. i5. ; goto next cpu i6: dl. w1 h5. ; dl. w3 h7. ; jl x3 ; return ; start cpu(i) i=1,...,last cpu ; call: w1=curr int proc at cpu0 before interrupt, w3=return ; return: all reg. are changed d26: rs. w3 h7. ; jl. w3 d28. ; error test at cpu1 rl w0 b57 ; w0:=cur proc(cpu0) sl w0 1 ; if current proc at cpu0 is not restored then rs w0 b1 ; restore cur proc(cpu0) al w2 -2 ; rs w2 b57 ; no proc to restore before a new interrupt at cpu(i) al w3 1 ; w3:=mask(cpu0); i10: ls w3 1 ; w3:=mask(next cpu); al w2 x2+2 ; w2:=addr(next cpu); sl w2 a351+1 ; if all cpu is started then jl. i13. ; goto test first proc al w0 a353 ; w0:=mask for allowed cpu; rl. w1 b59. ; w1:=mask for cpu in use; sz w1 x3 ; if the cpu can not be used or so w0 x3 ; the cpu is not allowed then jl. i10. ; goto next cpu else rl. w0 x2+b51. ; sh w0 1 ; if cpu(x2) is not waiting for cpu0-interrupt then jl. i10. ; and goto next cpu al w1 b2 ; w1:=chain head i11: rl w1 x1 ; w1:=next proc in time slice queue; al w0 x1-a16 ; process addr rs w0 x2+b56 ; rl w0 x1-a16+a186; w0:=mask for allowed cpu; sh w0 2047 ; if cpu(x2) is started or so w0 x3 ; this cpu can not be used then jl. i11. ; goto next proc; i12: rl w1 x2+b56 ; else hs w3 x1+a186 ; set cpu running mask; i14: al w0 4 ; rs. w0 x2+b51. ; set start signal jl. i10. ; goto next cpu i13: al w2 b2 ; i16: rl w2 x2 ; w2:= next proc rl w0 x2-a16+a186; w0:=cpu-mask so w0 2.1 ; if cpu0 is not allowed then jl. i16. ; goto next proc else sl w0 2047 ; if proc is started then jl. i16. ; goto next proc else sn w2 (b2) ; if proc already is in front then jl. (h7.) ; return jl w3 d5 ; else remove proc rl w1 b2 ; and jl w3 d6 ; link proc in front jl. (h7.) ; return ; init cpu1 d27: rs. w3 h7. ; rl w3 b65 ; w3:=base of controller descr table; al. w1 c26. ; w1:=power up entry for cpu1; rs w1 x3+20<3+a310; al w2 0 ; select cpu1 jl. w1 d22. ; start cpu(i) sl w1 h9 ; if cpu1 is not ready then jl. i17. ; return i15: rl. w0 b51. ; wait for ready signal sh w0 0 ; from cpu1 jl. i15. ; al w0 2 ; rs. w0 b51.+0; i17: jl. (h7.) ; h4: 0 h5: 0 h6: 0 h7: 0 d28: ; error test at cpu1 rl w0 b55 ; w0:=last service addr.cpu1 se w0 c99 ; if no errors then jl x3 ; return al. w2 i18. ; else restart cpu1 rs w2 b55 ; jl. w3 e64. ; and init cpu1 i18: jl c99 ; if not init then return e. ; b. h16,i10 w. c15: ; interrupt at cpu1 al w1 0 ; rx w1 b56 ; w1:=current process cpu1 rx w1 b1 ; b1:=current process cpu1 rs w1 b57 ; save(current process) al w1 2 ; rs. w1 b51.+0 ; set after intterupt dl. w2 h7. ; w1:=top reg dump; w2:= 2*interrupt number jl (b55) ; goto interrupt service for cpu1-process 0 ; w1 = top reg. dump h7: 0 ; w2 = 2*interrupt number ; c26: al. w3 h0. ;#1 init cpu1 gp w3 b91 ;#1 set inf register addr; rl w3 b65 ;#1 base of controller descr addr al. w1 c27. ;#1 rs w1 x3+20<3+a310;#1 set start addr ri a179 ;#1 return interrupt; h9: am 1 ;#1 c27: ;#1 al w3 1 ;#1 rs. w3 b51.+0 ;#1 h8: rl. w2 b51.+0 ;#1 se w2 4 ;#1 if cpu0 is not ready then jl. h8. ;#1 goto test and wait else c28: gg w1 b91 ;#1 w1:=inf reg(cpu1) rl w2 b56 ;#1 w2:=proc addr(cpu1) dl w0 x2+a170 ;#1 set user exception addr and ds w0 x1+a325+a328;#1 user escape addr al w0 x2+a28 ;#1 rs w0 x1+a325+a326;#1 set register dump addr; ri a179 ;#1 return interrupt; ;#1 system table: monitor mode 0 ; -5 monitor call service addr h6 ; -3 interrupt service addr 1<23+0 ; -1 status interrupt limit h0=k-13 h1=k-1 ; inf addr: monitor mode h2=k+11 ; inf addr: user mode h3 ; +1 register dump addr 0 ; +3 exception service addr 0 ; +5 escape service addr ;#1 system table: user mode h4 ; -5 monitor call service addr h5 ; -3 interrupt - - 1<23 + 6 ; -1 status < 12 + interrupt limit 0 ; +1 register dump addr 0 ; +3 exception service addr 0 ; +5 escape service addr ;#1 monitor register dump addr h3: 0 ; w0 0 ; w1 0 ; w2 0 ; w3 1<23 ; status monitor mode c27 ; ic start cpu1 process 0 ; cause 0 ; sb 0 ; cpa 0 ; base 8 ; lower write limit 8.3777 7777 ; upper write limit 0<12 + 6 ; interrupt limits ;#1 interrupt service cpu1 ;#1 interrupt level = 14 timer interrupt (or interrupt from cpu0) ;#1 = 16 channel input finis ;#1 = 18 channel input start ;#1 = 20 channel output finis ;#1 = 22 character device interrupt ;#1 ;#1 h6: am c99-c0 ;#1 internal interrupt level 2 h4: am c0-c1 ;#1 internal interrupt w3:=monitor call service addr ;#1 external interrupt h5: al w3 c1 ;#1 w3:=interrupt service addr (level 1) ds. w2 h7. ;#1 save (w1,w2) sn w3 c0 ;#1 if internal interrupt then jl. i6. ;#1 goto i6 sn w2 14 ;#1 if cpu(i) is interrupted from cpu0 then jl. h9. ;#1 goto start sl w2 14 ;#1 if interruptlevel > 7 then jl. c20. ;#1 go interruptservice for other computers i6: rs w3 b55 ;#1 set interrupt service addr al w0 1 ;#1 rs. w0 b51.+0 ;#1 rl w1 b56 ;#1 adrr of curr.cpu1 al w0 0 ;#1 hs w0 x1+a186 ;#1 clear cpu user bit am -3<3 ;#1 level20 i8: al w3 23<3 ;#1 level23 wa w3 b65 ;#1 base of controller table i7: rl w1 x3+a313 ;#1 w1:=interrupt level do w1 (x3+a312) ;#1 interrupt(cpu0) sx 2.111 ;#1 if buserror then jl. i7. ;#1 repeat data out; jl. h8. ;#1 goto wait for interrupt ; ; interrupt service for interrupt caused of data out instructions on ; other computers (HC8000's) ; ; do wreg addr ; wa 1<23+level<3+ 2.001 send data transfer request ; wa>= 0 contents irr ; request to send data specified by level location ; wa =1<23 + message ; ; ; ; di wreg addr ; wb 1<23+level<3+ 2.001 start input ; wb >=0 input to addr specified in level location ; wb = 1<23 + message ; ; level location (8) + level < 3 ; *----------*----------*----------*----------* ; ! number of! input or ! interrupt! ! ; ! bytes to ! output ! address ! level ! ; ! transfer ! address ! ! ! ; *----------*----------*----------*----------* ; c20: ; interrupt 16 channel input finis ; interrupt 18 channnel input start (input request) ; interrupt 20 channel output finis ; interrupt 22 character device interrupt rl w1 b106 ; w1:=addr(hcdriver) sn w1 0 ; if no proc then jl. c28. ; ri(cpu1) bz w0 x1+a13 ; w0:=state se w0 a94 ; if the proc is waiting for external interrupt or sn w0 a104 ; waiting for event then jl. i9. ; goto start proc am x2-16 ; else rs w2 x1+a302+2 ; save interrupt level jl. c28. ; and goto ri(cpu1) i9: al w0 1 ; rs. w0 b51.+0 ; rh.state:=wait interrupt service rs w2 x1+a28 ; saved w0:=interrupt level jl. i8. ; goto interrupt cpu0 ; ; ; z. c21: ; interrupt received at cpu(0) level23 c. a430 al w0 2 ; rs. w0 b51.+0 ; rh.state:= interrupt served z. rl w1 b106 ; w1:=addr of hcdriver proc al w3 c99 ; insert proc and return to start jl d10 ; c. a430 e. m. end of service for cpu(i) z. ?,l./b087:/,l1,i/ jl. 0 ; wait forever c.-1 /,l./b.e10/,i/ z. /, f $disc ;******************** $fpaline ;******************** $host ;******************** $fpasub ;******************** $tabinit ;******************** l./f5=k/,i/ 2.000 000 000 001 ; cpu mask: only cpu(0) allowed 0,r.(:a16-a48:)>1 /,l./b2,b2/,d,i/ c. a430 f22,b2 z. c. -a430 b2,b2 z. /,l./h2=k/,l1,i/ c. a430 m. dummy internal process(cpu1): 2.000 000 000 010 ; cpu mask: only cpu(1) allowed 0,r.(:a16-a48:)>1 f22=k f21=k-a16 ; start of dummy process(cpu1) b2, f5+a16 ; timer q links: initially single in queue r.(:a17-a16-2:)>1 f21-6, h12 ; first, top of process r.(:a19-a18:)>1 0<12+0 ; claims 0<12+0 ; r.(:a301-a21:)>1 1<23 - 2 ; priority = almost greatest integer r.(:a27-a301:)>1 h11 ; interrupt address r.(:a170-a27:)>1 h11 ; escape address 0 ; all params r.(:a28-a171:)>1 c. -1 ; must be used later rl w3 132 ; dummy loop rs w3 x3 ; jl 0 ; 0 ; w3 z. 0,0,0,0 r.(:a32-a31:)>1 1<23 ; status r.(:a33-a32:)>1 h13 ; ic r.(:a181-a33:)>1 8 ; cpa 0 ; base 8 ; lower write limit 8388607 ; upper write limit b54 ;+0<12 ; interrupt levels r.(:a302-a185:)>1 0 ; save area address r.(:a303-a302:)>1 ; (fill up for save area, used during upstart) m. dummy internal reg dump(cpu1) b. i9 w. h11: ; register dump 0,r.a180>1 ; h13: rl. w1 f21.-2 al w1 x1+2 rs. w1 f21.-2 ; rl w1 112 ; last sensed clock value rs. w1 f21.+6 ; jl. h13. ; e. w. h12=k ; top addr of dummy proc(cpu1) z. /,l./segment5:i/,l./g5:/,l1,i/ rs. w2 g17. ; al w2 a352 ; rs w2 x3+a186 ; set cpu mask; rl. w2 g17. ; /,l./g13:/,l1,i/ g17: 0 ; name table entry /, l./g10:/,l./b2+2/,d,i/ c. a430 b2+2 , f21+a16 z. c. -a430 b2+2 , f5+a16 z. /,f $procfnc1 ;******************** $procfnc2 ;******************** l./m22:/,l./common variables:/,r/;/m./, l./m151:/,l./a27/,d,i/ al w1 x2+a200 ; index:=first of internal proc /,l./a4-4/,r/-4;/+a200;/,i/ sn w1 x2 ; if index = internal.kind then al w1 x2+a27 ; index:=internal.interrupt_addr /,l./d1./,i/ al w0 1 ; rs w0 x2+a186 ; allowed cpu := cpu0 /,l./rl.w1d2./,i/ rl w0 x1+8 ; w0:=proc type /,l./dlw0x2+a44/,i/ sh w0 -1 ; if mirror proc jl. g0. ; goto g0 else /,l./g3:/,l1,r/rl/dl/,r/a19/a21/,r/w3/w0/,l1,i/ so. w0 (c6.) ; /,l3,d8,i/ dl w0 x1+a21 ; ss w0 x2+a21 ; decrease claims hl w0 x1+a22 ; set functions mask so. w0 (c6.) ; sz. w3 (c4.) ; /,l2,d1,i/ ds w0 x1+a21 ; g0: al w0 -1 ; ba w0 x1+a21 ; sh w0 -1 ; jl. j1. ; hs w0 x1+a21 /, l./m155:/,l./g16:/,l./dlw1/,i/ rx w2 x3+a34 ; rl w0 x3+a192 ; w0:= proc type sl w0 3 ; if mirror proc then jl. g18. ; skip add claim /,l./rxw2/,r/rxw2x3+a34/ /, l./a4-4/,r/-4 /+a200/, l./f26/,i/ jl. g9. g18: bz w0 x2+a21 ; ba. w0 1 ; hs w0 x2+a21 ; g9: /,l./c7:/,i/ c6: 1<23 /, f $s1 ;******************** $s2 ;******************** $catinit ;******************** ▶EOF◀