DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦8d238ff58⟧ TextFile

    Length: 35328 (0x8a00)
    Types: TextFile
    Names: »monmaster«

Derivation

└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
    └─⟦4334b4c0b⟧ 
        └─⟦84635a524⟧ »kkmon4filer« 
            └─⟦this⟧ 

TextFile

\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◀