|
|
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: 21504 (0x5400)
Types: TextFile
Names: »kkmm4«, »monmaster«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦this⟧ »k/monmaster«
└─⟦this⟧ »kkmm4«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦bc086f659⟧ »k«
└─⟦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. 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 w.
; table of preoccupied claims:
; mess buf area internal
i= 0 , i1=0 , i2=1 ; proc func
i3=6 , i4=0 , i5=1 ; std driver
; rhmaster mirror
; hcdriver mirror
i6=20 , i7=0 , i8=1 ; rhdriver
i9=a5-i0-i3-i6-24, i11=a4-i1-i4-i7 , i12=a3-i2-i5-i8-2 ; 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 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
a12+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
a12+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
a12+2 , <:riv:> ;
a11+4 , <:er:> ;
a11+6 , ;
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 , i6 ; buf claim
a20 , i7 ; area claim
a21 , i8-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 , i9 ; buf claim
a20 , i11 ; area claim
a21 , i12-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◀