|
|
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: 35328 (0x8a00)
Types: TextFile
Names: »monmaster«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
└─⟦4334b4c0b⟧
└─⟦84635a524⟧ »kkmon4filer«
└─⟦this⟧
\f
m. monmaster - hcmasterprocess
b.i30 w.
i0=80 12 30, i1=12 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.
s. c70,d70
w. b127=k,c70,k=k-2
;
c69=k
; systrm
;
s. a50,h20,i20 w.
; format of message buffer
a40=-10 ; message buffer address(other computer) or result
a38= -8 ; receiver<12+sender (computer numbers)
a36= -6 ; process description addr for receiver other computer
a34= -4 ; - - - - sender - -
a32= -2 ; w2
a0 = 0 ; next buffer
a2 = 2 ; prev buffer
a4 = 4 ; receiver
a6 = 6 ; sender
; i-o (normal) i-o (other com) mon call
a8 = 8 ; message op<12 +mode 3<12 1<22+m_p_n
a10= 10 ; - first address first addr w0
a12= 12 ; - last address last addr w1
a14= 14 ; - 1. segment first addr(oc) w2
a16= 16 ; - comp no w3
a18= 18 ; -
a20= 20 ; -
a22= 22 ; -
;
; format of message to another computer:
;
; do w(i) addr
;
; w(i): 1<23 + 0<3 + 2.000 hresponse ok
; 1<23 + 0<3 + 2.010 hresponse not ok
; 1<23 + addr<3 + 2.100 message buffer address
; 1<23 + op<3 + 2.110 immediately operation without hresponce
;
rl w3 66 ;
rs. w3 h7. ; own proc desr addr
al w0 4 ;
jd 1<11+32; set own process descr addr in monitor
jd 1<11+28; set monitor mode
al. w3 h10. ;
jd 1<11+4 ; w0:=process descr addr(master)
rs. w0 h6. ;
i0: al w2 0 ;
jd 1<11+24; wait event
rl. w3 h2. ;
se w3 0 ; if wait hresponce then
jl. i0. ; goto wait else
se w0 0 ; if not message then
jl. i2. ; goto i2
rs. w2 h2. ; else save buf addr
rl w3 x2+a4 ; w3:=receiver
bz w1 x2+a38 ; w1:=receiver (other computer)
sn. w3 (h6.) ; if receiver=masterproc then
bz w2 x2+a8 ; w2:=operation else w2:=buffer address
ls w1 3 ;
wa. w1 h1. ; w1:=sender addr (as device addr)
ls w2 3 ;
sn. w3 (h6.) ; if receiver = masterprocess then
am 2 ; immediately operation
lo. w2 h3. ; hmess
i1: do w2 x1 ; send hmess
sx 2.111 ; if buserror then
jl. i3. ; goto i3 else
jl. i4. ; goto i4
i3: rl. w0 h8. ; w0:=counter
ba. w0 1 ; counter:=counter+1;
rs. w0 h8. ; save counter
sh w0 10 ; if counter<=10 then
jl. i1. ; repeat data out
jl. i7. ; else goto result 2
i4: se. w3 (h6.) ; if receiver<>masterproc then
jl. i0. ; goto wait
jl. i9. ; return buffer
i2: se w0 6 ; if not hresponse then
jl. i0. ; goto i0.
se. w2 (h5.) ; if hresponse not ok then
jl. i7. ; goto result 2
rl. w2 h2. ; w2:=buf
jl. i11. ; goto movebuf
i7: rl. w2 h2. ; w2:=buf
rl w1 x2+a4 ; w1:=receiver
se. w1 (h7.) ; if receiver<>this proc then
jl. i10. ; goto i10
jd 1<11+26; get event
al w0 3 ; result=3 (unintelligible)
al. w1 h9. ; mess addr
jd 1<11+22; send message
jl. i12. ; goto i12
i9: am -3 ; result=1 (command is sended)
i10: am 1 ; set result 4
i11: al w0 1 ; set result 3
al. w3 h10. ;
jd 1<11+34; move buf to master proc
i12: al w0 0 ;
rs. w0 h2. ; clear buffer addr
rs. w0 h8. ; clear counter
jl. i0. ; goto wait
h1: 1<23 + 0<3 + 2.101; send hmess
h2: 0 ; buffer addr
h3: 1<23 + 0<3 + 2.100; hmess
h4: 1<23 + 0<3 +2.110 ; immediately operation
h5: 1<23 + 0<3 +2.010 ;
h7: 0 ; own proc descr addr
h8: 0 ; counter for max data out error
h9: 0,r.8 ; message
h6: 0,0
h10: <:hcmaster:>,0,0,0,0
e.
;
c68=k
; sysrec
;
s. a50,h20,i20 w.
; format of message buffer
a50=-10 ; top of buffer
a40=-10 ; message buffer address(other computer) or result
a38=- 8 ; receiver<12+sender (computer numbers)
a36=- 6 ; process description addr for receiver other computer
a34= -4 ; - - - - sender - -
a32= -2 ; w2
a0 = 0 ; next buffer
a2 = 2 ; prev buffer
a4 = 4 ; receiver
a6 = 6 ; sender
; i-o (normal) i-o (other com) mon call
a8 = 8 ; message op<12 +mode 3<12 1<22+m_p_n
a10= 10 ; - first address first addr w0
a12= 12 ; - last address last addr w1
a14= 14 ; - 1. segment first addr(oc) w2
a16= 16 ; - comp no w3
a18= 18 ; -
a20= 20 ; -
a22= 22 ; -
a49=a22-a50 ; buffer size
;
;
; format of message arrived in fifo(this computer)
;
; 1<23 +addr<3 +2.100 message buffer address
; 1<23 +aadr<3 +2.110 answer buffer address
;
;
rl w3 66 ;
rs. w3 h10. ; own process
al w0 6 ;
jd 1<11+32; set own process desription address in monitor
jd 1<11+28; set monitor mode
di. w1 (h14.) ; w1:=own computer number
rs. w1 h17. ;
i0: al w2 0 ;
rs. w2 h11. ; counter:=0;
jd 1<11+24; wait event
se w0 6 ; if not hmess then
jl. i3. ; goto i3.
ds. w2 h8. ; save(sender,hmess)
sz w2 2.100 ; if not message or answer then
am 2.010 ; set hresponse error else
al w3 2.000 ; hresponse ok
wa. w3 h4. ; set hresponse
ls w1 3 ;
wa. w1 h0. ; w1:= 1<23 +dev<3 +2.101
i1: do w3 x1 ; send message to other computer
sx 2.111 ; if buserror then
jl. i5. ; goto i5 else
jl. i2. ; goto i2
i5: rl. w0 h11. ; w0:=counter
ba. w0 1 ; counter:=counter+1;
rs. w0 h11. ;
sh w0 10 ; if counter<10 then
jl. i1. ; repeat data out else
jl. i0. ; goto wait
i2: dl. w2 h8. ; load(sender,hmess)
rs. w1 h8. ; h8:=sender
ls w2 1 ;
ls w2 -4 ; w2:=buffer address
al w2 x2+a50 ; w2:=first of buff
rs. w2 h7. ;
al. w1 h15. ; mess addr
al. w3 h16. ; name
jd 1<11+16; catch buff
al w1 x2+a50 ; first address
al w2 x2+a22 ; last address
ds. w2 h6. ;
al. w1 h5. ; sendmessage(message,
al. w3 h19. ; <:sysdma:>,buff)
jd 1<11+16;
jl. i0. ; goto wait
i3: se w0 1 ; if not answer then
jl. i4. ; goto i4
al. w3 h18. ; w3:=master proc
jd 1<11+34; movebuff to master proc
jl. i0. ; goto wait
i4: se w0 0 ; if not message then goto wait
jl. i0. ;
rl w1 x2+a4 ; w1:=receiver
sn. w1 (h10.) ; if receiver is not this proc then
jl. i0. ; goto wait
jd 1<11+26 ; get event (release buffer)
jl. i0. ; goto wait
h0: 1<23 + 0 <3 + 2.101; start dma trans
h4: 1<23 ;
h5: 3<12 ; mess: input
0 ; first address (this computer)
h6: 0 ; last address (this computer)
h7: 0 ; first address (other computer)
h8: 0,r.3 ; computer number (other computer)
h9: 1<23 + 0 <3 + 2.001; start dma input command
h10: 0 ; own process descr addr
h11: 0 ; counter for max data out repeat
h14: 1<23 + 0 <3 + 2.111;
h15: 0,r.8 ; pseudo message
h16: 0,r.5 ; - name
h17: 0 ;
h18: <:hcmaster:>,0,0
h19: <:sysdma:>,0,0,0
e.
c67=k
; sysdma
;
; format of input message to other computers
; mess +0 3<12
; +2 first address (this computer)
; +4 last address (this computer)
; +6 first address (other computer)
; +8 computer number (other computer)
s. a50,h20,i20 w.
; format of message buffer
a40=-10 ; message buffer address(other computer) or result
a38=- 8 ; receiver<12+sender (computer numbers)
a36=- 6 ; process description addr for receiver other computer
a34= -4 ; - - - - sender - -
a32= -2 ; w2
a0 = 0 ; next buffer
a2 = 2 ; prev buffer
a4 = 4 ; receiver
a6 = 6 ; sender
; i-o (normal) i-o (other com) mon call
a8 = 8 ; message op<12 +mode 3<12 1<22+m_p_n
a10= 10 ; - first address first addr w0
a12= 12 ; - last address last addr w1
a14= 14 ; - 1. segment first addr(oc) w2
a16= 16 ; - comp no w3
a18= 18 ; -
a20= 20 ; -
a22= 22 ; -
rl w3 66 ;
rs. w3 h10. ; own process
al w0 8 ;
jd 1<11+32; set own process description address in monitor
jd 1<11+28; set monitor mode
i0: al w2 0 ;
jd 1<11+24; wait event
rl. w3 h11. ; w3:=buffer addr
sn w0 8 ; if dma-transfer completed then
jl. i1. ; goto i1.
sn w0 0 ; if not message
se w3 0 ; or wait dma-transfer completed then
jl. i0. ; goto i0
bz w0 x2+a8 ; w0:=message type
se w0 3 ; if not input message then
jl. i3. ; goto result 3
rs. w2 h11. ; save buffer address
rl w0 x2+a16 ; w0:=other computer number
rl w1 x2+a12 ; w1:=last addr
ws w1 x2+a10 ; w1:=last addr-first addr
al w1 x1+2 ; w1:=number of halfwords to transfer
sh w1 0 ; if nothing to transfer then
jl. i3. ; then goto result 3
ds. w1 h1. ; else set dma input message
rl w1 x2+a10 ; w1:=first addr (this computer)
rl w0 x2+a14 ; w0:=first addr (other computer)
ds. w1 h3. ;
al. w3 h1. ; input message address
ls w3 3 ;
wa. w3 h4. ; w3:=1<23+addr<3+2.010
do x3 ; start dma-transfer
sx 2.111 ; if buserror then
jl. i2. ; goto result 2
jl. i0. ; else goto wait
i1: sn w3 0 ; if no waiting buffer then
jl. i0. ; goto wait
am -1 ; result 1
i2: am -1 ; result 2
i3: al w0 3 ; result 3
rl. w2 h11. ; buffer addr
jd 1<11+26; get event
se w0 1 ; if not result ok then
jl. i7. ; goto to send answer
rs. w0 h8. ;
rl. w1 h1. ; w1:=number of halfwords
rs. w1 h6. ;
ls w1 -1 ; w1:=number of words transfered
wm. w1 h9. ; w1:=number of chars
rs. w1 h7. ;
rl. w0 h8. ; w0:=result
i7: al. w1 h5. ; w1:=message address
jd 1<11+22; send answer
al w2 0 ;
rs. w2 h11. ; ready
jl. i0. ; goto wait
0 ; used (cpu)
h0: 0 ; number (other computer)
h1: 0 ; number of halfwords to transfer
h2: 0 ; first address (other computer)
h3: 0 ; first address (this computer)
h12: 20 ; interrupt level
h4:1<23 + 0 <3 + 2.010 ; device address
h5: 0 ; answer: status
h6: 0 ; halfwords
h7: 0 ; chars
h8: 0 ;
h9: 3 ; constant
h10: 0 ; own process
h11: 0 ; bufferaddress or zero for no waiting buffer
e.
\f
c66=k ; start of hcmaster
rl. w0 d11. ;
rl. w1 d11. ;
jd 1<11+38 ; set clock
al. w3 d0.
rs w3 100
jl. w3 d0. ; dump core
al w3 2047 ;
ls w3 6 ;
al w3 x3-1 ;
sl w3 0 ; wait
jl. -4 ;
al. w1 d23. ;
al. w3 d25. ;
jl. w2 d1. ; send message(clock)
al. w1 d26. ; param addr
al. w3 d27. ; process name addr
jd 1<11+56; create child process
jl. w3 d0. ; save
al. w3 d27. ;
al. w1 d28. ; reg area
jd 1<11+62; modify ip
jl. w3 d0. ; save
al. w3 d27. ;
jd 1<11+58; start ip
jl. w3 d0. ; save
al. w3 d27. ;
jd 1<11+64; remove
jl. w3 d0. ; save
d10:jl -1 ; hard stop
b. i10 w.
d1: rs. w2 i0. ; save(return)
jd 1<11+16; send message
jl. w3 d0. ; dump core
al w1 x1+10 ;
jd 1<11+18; wait answer
jl. w3 d0. ; dump core
jl. (i0.) ; return
i0: 0
e.
b. i10 w.
d0: am. (i0.) ;
ds w1 2 ;
am. (i0.) ;
ds w3 6 ; save(w0,w1,w2,w3)
al w1 8 ;
i5: dl w0 x1+2 ;
am. (i0.) ;
ds w0 x1+2 ;
al w1 x1+4 ;
sh w1 199 ;
jl. i5. ;
wa. w1 i0. ;
rs. w1 i0. ;
dl w3 x1-194 ;
dl w1 x1-198 ;
jl x3 ; return
d11:
i0: 20000 ;
e.
d23: 2,0,5000,0,0 ; message
d24: 0,r.8
d25: <:clock:>,0,0,0,0
d26: c60 ; + 0 first addr.
c61 ; + 2 last addr
h.
4,0 ; + 4 buff,area
0,8.7777 ; + 6 ip,func. mask
0,0 ; + 8 pr,pk
w.
10000 ; +10 max lower base
20000 ; +12 max upper base
10000 ; +14 std lower base
20000 ; +16 std max base
d27: <:hcchild:>,0,0,0
d28: 0,0,0,0 ; w0,w1,w2,w3
0 ; exc. reg
c60 ; ic
0,r.20
c60=k ; hcchild
al w2 0 ;
jd 1<11+24; wait event
c61=k
b. i24 w.
; table of preoccupied claims:
; mess buf area internal
i0=1 , i1=0 , i2=1 ; proc func
i3=6 , i4=0 , i5=1 ; std driver, systrm, sysrec, sysdma
i6=a5-i0-24 , i7=0 , i8=a3-i2-3 ; hcmaster
i10: rs. w3 i12. ; save return to autoloader;
al. w3 d0.
rs w3 100
; process description for process functions:
;
; rel address contents
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 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)
; 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 , <:hcm:> ; name = <:hcmaster:>
a11+2 , <:ast:> ;
a11+4 , <:er:> ;
a11+6 , 0 ;
a17 , c66 ; first address
;*** a18 , core size ; top address
a301 , 0 ; priority
a26 , a89 ; interrupt mask
a27 , d10 ; 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 , c66 ; 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 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 systrm:
;
; rel address contents
al w1 x1 +a4 ; proc := next internal;
jl. w2 i18. ; init description;
a48 , a107 ; interval low
a49 , a108-1 ; - high
a11 , <:sys:> ; name 0-4 : <:systrm:>
a11+2 , <:trm:> ;
a11+4 , 0 ;
a11+6 , 0 ;
a17 , c69 ; first address
a18 , c68-2 ; 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 ; initial base
a173 , c69 ; initial lower write linit
a174 , c68-2 ; initial upper write limit
a175 , b54<12+b54 ; interrupt levels
a32 , 0 ; status = not monitor mode
a33 , c69 ; ic = waiting point
;***a181 , core size ; current cpa
a182 , 0 ; current base
a183 , c69 ; lower write limit
a184 , c68-2 ; top write limit
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 - low
a45 , a108-1 ; - - high
a302 , 0 ; save area address
a10 , 0;(end of words) ; kind = 0
a12 , 0 ; stop count
a13 , a104 ; state = waiting for event
a19 , i3 ; buf claim
a20 , i4 ; area claim
a22 , 8.7777 ; function mask
a10 , 0;(end of bytes) ; (kind = 0)
rs w0 x1+a171 ; initial cpa(systrm)=core size
rs w0 x1+a181 ; current cpa(systrm):=core size
; process description for initial sysrec
al w1 x1 +a4 ; proc := next internal;
jl. w2 i18. ; init description;
a48 , a107 ; interval low
a49 , a108-1 ; - high
a11 , <:sys:> ; name = <:sysrec:>
a11+2 , <:rec:> ;
a11+4 , 0 ;
a11+6 , 0 ;
a17 , c68 ; first address
a18 , c67-2 ; 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 ; initial base
a173 , c68 ; initial lower write linit
a174 , c67-2 ; initial upper write limit
a175 , b54<12+b54 ; - interrupt levels
a32 , 0 ; status = not monitor mode
a33 , c68 ; ic = start init
;***a181 , core size ; current cpa
a182 , 0 ; current base
a183 , c68 ; lower write limit
a184 , c67-2 ; 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 = waiting for event
a19 , i3 ; buf claim
a20 , i4 ; area claim
a22 , 8.7777 ; function mask
a10 , 0;(end of bytes) ; (kind = 0)
rs w0 x1+a171 ; initial cpa(sysrec):=core size
rs w0 x1+a181 ; current cpa(sysrec):=core size
; process description for sysdma
al w1 x1 +a4 ; proc := next internal;
jl. w2 i18. ; init description;
a48 , a107 ; interval low
a49 , a108-1 ; - high
a11 , <:sys:> ; name = <:sysdma:>
a11+2 , <:dma:> ;
a11+4 , 0 ;
a11+6 , 0 ;
a17 , c67 ; first address
a18 , c66-2 ; 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 ; initial base
a173 , c67 ; initial lower write linit
a174 , c66-2 ; initial upper write limit
a175 , b54<12+b54 ; - interrupt levels
a32 , 0 ; status = not monitor mode
a33 , c67 ; ic = central waiting point
;***a181 , core size ; current cpa
a182 , 0 ; current base
a183 , c67 ; lower write limit
a184 , c66-2 ; upper write limit
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
a10 , 0 ;(end of words) ; kind = 0
a12 , 0 ; stopcount
a13 , a104 ; state = waiting for event
a19 , i3 ; buf claim
a20 , i4 ; area claim
a21 , i5-1 ; internal claim
a22 , 8.7777 ; function mask
a10 , 0 ;(end of bytes) ; (kind = 0)
rs w0 x1+a171 ; initial cpa(sysdma):=core size
rs w0 x1+a181 ; current cpa(sysdma):=core size
\f
al w2 x1+a16 ; w2:=addr(internal.sysdma.timer q)
rl w1 b2 ;
al w2 x2 -a4 ; w2:=addr(internal.sysrec.timer q)
al w2 x2 -a4 ; w2:=addr(internal.systrm.timer q)
al w2 x2 -a4 ; w2:=addr(internal.hcmaster.timer q)
jl w3 b36 ; link(timer q,internal.hcmaster)
al w2 x2 -a4 ; w2:=addr(internal.driver proc.timer q)
jl w3 b36 ; link(timer q, internal.driver proc);
jl. w3 i14. ; take control
b3 ; (first name table entry,
b6 ; first internal,
b29+1*a4 ; driver proc);
jl. w3 i14. ; take control
b76 ; (first secondary interrupt,
k ; irrellevant,
b29+1*a4 ; driver proc);
jl (10) ; goto start
; 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 masterproc
\f
; segment 10
; rc 05.08.70 bjørn ø-thomsen
;
; this segment moves segment 2 - 9 in this way:
;
; segment 2 is moved to cell 8 and on, after which
; control is transferred to the last moved word with the
; following parameters:
; w2 = top load address (= new address of last moved
; word + 2)
; w3 = link
;
; after initializing itself, the program segment returns
; to this segment with:
; w2 = load address of next segment
;
; the next segment will then be moved to cell(w2) and on,
; after which it is entered as described above.
;
; when initialize catalog (segment 9) is entered, the values
; of the two switches (writetext, medium) may be found in
; the words x3-4 and x3-2.
;
; segment 10 is entered from segment 1 in its last word
; entry conditions:
; w0,w1 = init catalog switches
; w2 = start address of segment 2
s. i10, j10
w.
j3. ; length of segment 10
j0: 0 ; init cat switch: writetext
j1: 0 ; init cat switch: medium
; return point from initializing of some segment
i0: rl. w1 j2. ; get load address;
i1: wa w1 x1+0 ; calculate top address:
rx. w1 j2. ; change(old load address, top address);
al w1 x1+2 ; skip segment length;
; now w1, w2 = old, new load address
; move segment:
sh w2 x1 ; if new addr > old addr then
jl. i2. ; begin
ds. w2 j5. ; save (old, new);
ws w2 2 ; diff := new - old;
sh w2 i5 ; (at least size of move loop);
al w2 i5 ;
al. w1 j2. ; from := last of segment;
; move to higher:
i4: rl w0 x1 ; move word(from)
am x2 ; to word(from + diff);
rs w0 x1 ;
al w1 x1-2 ;
sn. w1 j0. ; if exactly all moveloop moved then
jl. x2+i4. ; goto the moved moveloop...
sl. w1 (j4.) ; if not all moved then
jl. i4. ; goto move to higher;
rl. w1 j4. ; old := old + diff;
wa w1 4 ;
wa. w2 j2. ; top address := top address + diff;
rs. w2 j2. ;
rl. w2 j5. ; restore(new);
; end;
i2: rl w0 x1+0 ; move word from old
rs w0 x2+0 ; to new address;
al w1 x1+2 ; update old addr;
al w2 x2+2 ; update new addr;
se. w1 (j2.) ; if old addr <> top addr
jl. i2. ; then goto move segment;
; now the segment has been moved
; jump to the last moved word
al. w3 i0. ; insert return;
jl x2-2 ; goto word(top addr - 2);
; comment: jump to last loaded word with
; w2 = top load address
; w3 = link
; word(x3-4) = init cat switch, writetext
; word(x3-2) = init cat switch, medium
; initialize segment 10
i3: ds. w1 j1. ; save init cat switches
rs. w2 j2. ;
; get monitor mode and clear all interrupts
gg w3 b91 ; w3 := inf;
rl. w0 j6. ; w0 := monitor mode;
al. w1 i6. ; w1 := new entry;
al. w2 j7. ; w2 := regdump;
rs w2 x3+a326 ; user regdump := regdump;
rs w0 x3-a325+a328+6; monitor status := monitor mode;
rs w1 x3-a325+a328+2; monitor call entry := new entry;
jd 1<11+0 ; call monitor; i.e. enter below, in monitor mode;
i6: al w0 1 ; after monitor mode got:
gp w0 b91 ; inf := 1; i.e. prevent any response;
al w1 1<3 ; device := 1;
i7: am. (j8.) ; next device:
do x1+2 ; reset device (device);
al w1 x1+1<3 ; increase (device);
sh w1 255<3 ; if device <= 255 then
jl. i7. ; goto next device;
al w2 8 ; new load address := 8;
jd. i0. ; goto get load address;
j6: 1 < 23 ; monitor mode;
j7: 0, r. a180>1 ; regdump
j8: 1 < 23 ; device address bit
j4: 0 ; saved old
j5: 0 ; saved new
i5 = k - j0 ; aproximate size of moveloop
j2: 0 ; top address
jl. i3. ; goto initialize segment 10
j3: ; top address of segment 10:
e. ; end segment 10
i.
; last segment
s.w.
0 ; last segment empty
e. ; end of last segment
m. end of monitor
e. ; end of global block
e.
▶EOF◀