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

⟦9b0844ac6⟧ TextFile

    Length: 21504 (0x5400)
    Types: TextFile
    Names: »monmaster«

Derivation

└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ.  Detaljer om "HC8000" projekt.
    └─⟦0364f57e3⟧ 
        └─⟦80d78256e⟧ »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. c120,d70
w. b127=k,c70,k=k-2
;
c101=k        ; start of rhmaster mirror
0,r.1
c102 =k
c105=k        ; start of hcdriver mirror
0,r.1
c106=k
c110=k        ; start of hcdriver
p.<:rhdr:>
c111=k
c115=k        ; start of hcmaster
p.<:hcmt:>
\f



b. i24,n20
 w.

; table of preoccupied claims:
; mess buf      area          internal
n0=0             , n1=0            , n2=1            ; proc func
n3=6             , n4=0            , n5=1            ; std driver
                                                     ; rhmaster mirror
                                                     ; hcdriver mirror
n6=20            , n7=0            , n8=1            ; rhdriver
n9=a5-n0-n3-n6-24, n10=a4-n1-n4-n7 , n11=a3-n2-n5-n8-2 ; hcmaster

i10: rs. w3     i12.     ;    save return to autoloader;

; 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    , n0                ; buf claim
a20    , n1                ; 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    , n3                ; buf claim
a20    , n4                ; area claim
a21    , n5-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 rhdriver

     al  w1  x1 +a4      ;    proc := next internal;
     jl. w2     i18.     ;    init description;

a48    , a107              ; interval low
a49    , a108-1            ;    -     high
a11    , <:rhm:>           ;  name = rhdriver
a11+2  , <:ast:>           ; 
a11+4  , <:erm:>           ;
a11+6  , <:i:>             ;
a17    , c101              ; first address
a18    , c102              ; top address
a301   ,  0                ; priority
a26    , a89               ; interrupt mask
a27    ,   0               ; user exception address
a170   , 0                 ; user escape address
a171   ,   c102            ; initial cpa
a172   , 0                 ;    -    base
a173   , c101              ;    -    lower write limit
a174   , c102              ;    -    upper   -     -
a175   , b54<12+b54        ;   -    interrupt levels
a32    , 0                 ; status = not monitor mode
a33    , c101              ; ic = central waiting point
a34    , 0                 ; parent = undef
a181   , c102               ; current cpa
a182   , 0                 ;    -    base
a183   , c101              ;    -    lower write limit
a184   , c102               ;    -    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    , a99               ; state = running
a19    , 0                 ; buf claim
a20    , 0                 ; area claim
a21    , 0                 ; 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 rhdriver mirror

     al  w1  x1 +a4      ;    proc := next internal;
     jl. w2     i18.     ;    init description;

a48    , a107              ; interval low
a49    , a108-1            ;    -     high
a11    , <:rhd:>           ;  name = rhdriver
a11+2  , <:riv:>           ; 
a11+4  , <:erm:>           ;
a11+6  ,  <:i:>            ;
a17    , c105              ; first address
a18    , c106              ; top address
a301   ,  0                ; priority
a26    , a89               ; interrupt mask
a27    ,   0               ; user exception address
a170   , 0                 ; user escape address
a171   ,   c106            ; initial cpa
a172   , 0                 ;    -    base
a173   , c105              ;    -    lower write limit
a174   , c106              ;    -    upper   -     -
a175   , b54<12+b54        ;   -    interrupt levels
a32    , 0                 ; status = not monitor mode
a33    , c105              ; ic = central waiting point
a34    , 0                 ; parent = undef
a181   , c106               ; current cpa
a182   , 0                 ;    -    base
a183   , c105              ;    -    lower write limit
a184   , c106               ;    -    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    , a99               ; state = running
a19    , 0                 ; buf claim
a20    , 0                 ; area claim
a21    , 0                 ; 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 rhdriver

     al  w1  x1 +a4      ;    proc := next internal;
     jl. w2     i18.     ;    init description;

a48    , a107              ; interval low
a49    , a108-1            ;    -     high
a11    , <:rhd:>           ;  name = rhdriver
a11+2  , <:riv:>           ; 
a11+4  , <:er:>            ;
a11+6  ,  0                ;
a17    , c110              ; first address
a18    , c111              ; top address
a301   ,  0                ; priority
a26    , a89               ; interrupt mask
a27    ,   0               ; user exception address
a170   , 0                 ; user escape address
a171   ,   c111            ; initial cpa
a172   , 0                 ;    -    base
a173   , 8                 ;    -    lower write limit
a174   , c111              ;    -    upper   -     -
a175   , 6<12+b54          ;   -    interrupt levels
a32    , 0                 ; status = not monitor mode
a33    , c110              ; ic = central waiting point
a34    , 0                 ; parent = undef
a181   , c111               ; current cpa
a182   , 0                 ;    -    base
a183   , 8                 ;    -    lower write limit
a184   , c111               ;    -    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   ,   0               ; save area address

a10    , 0 ;(end of words) ; kind = 0

a12    , 0                 ; stopcount
a13    , a95               ; state = running
a19    , n6                ; buf claim
a20    , n7                ; area claim
a21    , n8-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 hcmaster

     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    , c115              ; first address
;*** a18    , core size         ; top address
a301   , 0                 ; priority
a26    , a89               ; interrupt mask
a27    , c115              ; 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   , 6<12+b54         ;    -    interrupt levels
a32    , 0                 ; status = not monitor mode
a33    , c115              ; 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   , 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   , 0                 ; save area address

a10    , 0;(end of words)  ; kind = 0

a12    , 0                 ; stopcount
a13    , a95               ; state = running
a19    , n9                ; buf claim
a20    , n10               ; area claim
a21    , n11-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;
     al  w2  x1+a16      ;
     rl  w1      b2      ;
     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.rhdriver);
     al  w2  x2-(:a4*3:) ;
     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◀