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

⟦fabb7b270⟧ TextFile

    Length: 23808 (0x5d00)
    Types: TextFile
    Names: »mondef«

Derivation

└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ.  Detaljer om "HC8000" projekt.
    └─⟦0364f57e3⟧ 
        └─⟦3b4b74406⟧ »kkmon3filer« 
            └─⟦this⟧ 
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
    └─⟦4334b4c0b⟧ 
        └─⟦b8ddea98b⟧ »kkmon3filer« 
            └─⟦this⟧ 

TextFile

b.a800,b200 w.

m.                mondef - monitor definitions

; release number and date of monitor base text:
  a133=79 07 24   ; date of monitor
  a134=12 00 00   ; time of monitor
  a135=7          ; release number
  a136=0          ; version number

b.i30 w.
i0=81 08 01, 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.


; rc 4000 system tape
; per brinch hansen
;     this tape is an autoload version of the rc 4000 multiprogramming
; system. it is written in the slang 3 language and consists of
; 10 segments surrounded by a global block:
;
; global block, definitions:
;     a names define system constants;
;     b names define entries in the monitor table;
; segment 1; start monitor segment 10:
;     contains a jump to segment 10;
; segment 2, monitor:
;     contains interrupt response code and monitor procedures;
; segment 3, external processes:
;     contains send message and code for input/output;
; segment 4, process descriptions:
;     contains name table, process descriptions, and message buffers;
; segment 5, initialize monitor:
;     executed and removed immediately after loading;
; segment 6, process functions:
;     contains code for catalog administration and the
;     creation and removal of processes;
; segment 7, initialize process functions:
;     executed and removed immediately after loading;
; segment 8, operating system s:
;     contains code which allows the operators to
;     create and control new process from consoles;
; segment 9, initialize catalog
;     starts the multiprogramming system and is
;     itself immediately executed as a part of the
;     process s; it can initialize the backing store
;     with catalog entries and binary programs
;     input from paper tape or magnetic tape;
; segment 10: move monitor:
;     allocates segment 2 - 9 after autoloading


; global block, definitions

; size options:
; a1 = no of area processes
; a3 = no of internal processes
; a5 = no of message buffers
; a7 = no of pseudoprocesses
; a87 = inspection interval
; a109 = min aux-cat key
; a110 = max cat key
; a111 = min key for entries between standard and max interval
; a112 = no. of bs-devices
; a113 = no. of drum chains
; a114 = size of drum chains
; a115 = no. of disc chains
; a116 = size of disc chains
; a117 = no of messagebuffers assigned to consoles
; a118 = update aux cat 


; predefinition of option variables:
a1=0           ;
a3=0           ;
a5=0           ;
a9=0           ; number of subdevices
a80=-1-1<11    ; all drivers included excl. rc8601
a82=-1         ; ... with statistics on
a84=-1         ; ... and test on
a85=256        ; max time slice in 0.1 ms
a89=8.4777 7777; standard interrupt mask
a90= 1<0        ; special facility mask : fpacoredump 1<0
a91=0          ;
a92=1<10+1<21  ;
a93=1<23       ;
a109=2         ;
a110=3         ;
a111=2         ;
a113=0         ; number of drums
a114=0         ;
a116=0         ;
a128=0         ; a128=0 : std monitor gen.
               ;     >0 : option gen.
               ;  a128 o. 1<1 : read special s size options in segment 6
               ;  a128 o. 1<2 : rc 6000 monitor
a123=0         ; net-identification(jobhost)
a124=0         ; home-region(jobhost)
; a125=        ; job host identification
a130=00 00 00  ; date, time of options
a131=00 00 00  ;   (yy mm dd, hh mm ss)
a198=1<23+0<3  ; device addr of cpu
a199=2         ; device number of mainconsole
a400=0         ; coroutine monitor inclusion (default no)
  
; **** definition of coroutine monitor formats:
;
; coroutine description;
a694 = -6         ; next in semaphore queue
a696 = -4         ; previous in semaphore queue
a698 = -2         ; priority
a700 =  0         ; save ic (return)
a702 =  2         ; next coroutine
a704 =  4         ; prev coroutine
a706 =  6         ; timer
a708 =  8         ; mask f. waitchained
a710 =  10        ; save w0(for test purposes only) or result
a712 =  12        ; save w1
a714 =  14        ; save w2
a716 =  16        ; testmask
a718 =  18        ; ident
a720 =  20        ; user exit (0 or exit addr)
a722 =  22        ; return address for waitsem,waitchained,cwaitanswer
a724 =  24        ; ref. to operation (waitchained) or buf (cwaitanswer)
  
; operation:
a670 = +0         ; next operation
a672 = +2         ; prev operation
a674 = +4         ; type
  
; chained semaphore:
a650 = +0         ; next coroutine
a652 = +2         ; prev coroutine
a654 = +4         ; next operation
a656 = +6         ; prev operation
  
; simple semaphore:
a660 = +0         ; next coroutine
a662 = +2         ; prev coroutine
a664 = +4         ; count
  
  
; second process extension.
; contains key variables of the coroutine system .
a538 = -12        ; start of testbuffer
a540 = -10        ; start of next record in test buffer
a542 = -8         ; top of test buffer
a544 = -6         ; test output flag (1 = on)
  
a546 = -4         ; next in active queue
a548 = -2         ; prev in active queue
a550 =  0         ; current coroutine
a552 =  2         ; next in timer queue
a554 =  4         ; prev in timer queue
a556 =  6         ; name of the testoutput process 
a566 =  16        ; start of testoutput message
a582 =  32        ; last event pointer
a584 =  34        ; message decriptor pointer(cur)
a586 =  36        ; start of table containing references to user defined procedures
a588 =  38        ; first message buffer extension
a590 =  40        ; start of common message-answer  area
a616 =  56        ; name of 'clock'
a626 =  66        ; start of 'clock'-message
a630 =  70        ; answer descriptor for answer from 'clock'
t.m.                monitor size options included

; a2 = size of area process description
; a4 = size of internal process description
; a8 = size of pseudoprocesses

   a112 = a113 + a115
   a8=0
   a118 = a112-2,  a119 = a118

; a88 = size of catalog entry
; a89 = standard interrupt mask
; a85 = max time slice in 0.1 msec
; a107 = min lower limit in bases
; a108 = max upper limit in bases

   a88=34, a107=8.4000 0001, a108=8.3777 7776

; driver options.
; the inclusion of drivers is controlled by the parameters a80, a82 and a84.
; a80 determines whether a driver shall be included, and a82 and a84 whether
; it shall be included with statistics and/or testoutput.
;
;  a80 = driver inclusion
;  a82 = statistics
;  a84 = testoutput
;
; the function of the bits in the parameters are -
;  1<0  : clock
;  1<1  : disc (dsc 801)
;  1<2  : mainproc
;  1<3  : receiver (fpa 801)
;  1<4  : transmitter (fpa 801)
;  1<5  : hostproc
;  1<6  : subprocs
;  1<7  ; host, subhost
;  1<11 : rc8601
;  1<12 ; subdriver terminal
;  1<13 ;     -     magtape
;  1<14 ;     -     disc
;  1<15 ;     -     flexible disc


; testoptions:
; testoptions are used during debugging of the system.
; they are defined by bits in the identifier a92 as follows:
;    testcase i               a92=a92 o. 1<i   0<=i<=17
;    teststatus               a92=a92 o. 1<18
;    testcall                 a92=a92 o. 1<19
;    testoutput               a92=a92 o. 1<20
;    print w, type w
;    procfunc interrupt       a92=a92 o. 1<21
;    procfunc testbuffer      a92=a92 o. 1<22
; testoptions in s are defined by bits in the identifier a93
; as explained in s.
a48 = -4           ;  lower limit(interval)
a49 = -2           ;  upper limit(interval)
a10 =  0           ;  kind
a11 =  2           ;  name
a12 = 10, a13 = 11 ;  stop count, state
a14 = 12           ;  identification bit
a15 = 14           ;  next event
                   ;  last event
a16 = 18           ;  next process
                   ;  last process
a17 = 22           ;  first address (logical)
a18 = 24           ;  top address (logical)
a19 = 26, a20 = 27 ;  buffer claim, area claim
a21 = 28, a22 = 29 ;  internal claim, function mask
a301= 30           ;  priority
a24 = 32, a25 = 33 ;  mode (= protection register, protection key)
a26 = 34           ;  interrupt mask
a27 = 36           ;  user exception address (interrupt address) (logical)
a170= 38           ;   user escape address (logical)
a171= 40           ;  initial cpa
a172= 42           ;     -    base
a173= 44           ;     -     lower write limit (physical)
a174= 46           ;     -    top     -     -    (physical)
a175= 48           ;     -    interrupt levels
a34 = 50           ;  parent description address
a35 = 52           ;  quantum
a36 = 54           ;  run time
a38 = 58           ;  start run
a39 = 62           ;  start wait
a40 = 66           ;  wait address
a42 = 68, a43 = 70 ;  catalog base
a44 = 74           ;  max interval
a45 = 78           ;  standard interval
a28 = 80           ;  save w0, = first of regdump
a29 = 82           ;   -   w1
a30 = 84           ;   -   w2
a31 = 86           ;   -   w3
a32 = 88           ;   -   status
a33 = 90           ;   -   ic (logical)
a176= 92           ;   -   cause
a177= 94           ;   -   sb
  a176= 96         ;  top of regdump
a181= 96           ;  current cpa = first of fixed parameters
a182= 98           ;     -    base
a183= 100          ;     -    lower write limit (physical)
a184= 102          ;     -    top     -     -   (physical)
a185= 104          ;     -    interrupt levels
  a179= a181-a28   ;  (displacement between fixed params and first of regdump)
;  a180:           ;  see c29
a302= 106          ;  save area address
                   ;  save area for g20-g24, b18, b19
  a303= 124        ;  top of save area
a46 = 124          ; bs claims start
                   ;    chain0:  key0:   slices , entries
                   ;             key1:     -    ,    -
                   ;             key2:     -    ,    -
                   ;             key3:     -    ,    -
                   ;            (........................)
                   ;    chain1:  key0:     -    ,    -
                   ;            (........................)
                   ;  bs claims top
; calculate size of process-
  a4=a46+(:a110<1+2:)*a112-a48
a4 = a4            ; size of internal process
a35 = 52           ; <quantum>
a36 = 54           ; <run time>
a38 = 58           ; <start run>
a39 = 62           ; <start wait>
a40 = 66           ; <wait address>
a42 = 68, a43 = 70 ; <catalog base>
a44 = 74           ; <max interval>
a45 = 78           ; <standard interval>
b. j0 w.
j0 = 80
a28 = j0, j0 = j0+2 ; save w0, = first of regdump
a29 = j0, j0 = j0+2 ;  -   w1
a30 = j0, j0 = j0+2 ;  -   w2
a31 = j0, j0 = j0+2 ;  -   w3
a32 = j0, j0 = j0+2 ;  -   status
a33 = j0, j0 = j0+2 ;  -   ic
a176= j0, j0 = j0+2 ;  -   cause
a177= j0, j0 = j0+2 ;  -   sb
a178= j0            ; top of regdump
a181= j0, j0 = j0+2 ; current cpa = first of fixed parameters
a182= j0, j0 = j0+2 ;    -    base
a183= j0, j0 = j0+2 ;    -    lower write limit
a184= j0, j0 = j0+2 ;    -    top     -     -
a185= j0, j0 = j0+2 ;    -    interrupt levels
a179= a181-a28      ; (displacement between fixed params and first of regdump)
; a180: see c29
a302= j0, j0 = j0+2 ; save area address
          j0 = j0+14; save area for g20-g24, b18, b19
a303= j0            ; top of save area
a305= j0, j0 = j0+2 ; first process extension
a306= j0, j0 = j0+2 ; second process extension
a46 = j0            ; bs claims start
  j0=j0+(:a110<2+4:)*a112 ;KK top of bs-claims list
; a48 = first of internal process
; j0 = top    -     -        -
a4 = j0-a48         ; size of internal process
e.
a23 = 27           ; use area processes as pseudoprocesses

; format of save area:
;   8 words, used by deliver-result-procedures
a304 = 16  ; address of wait first event

; internal process states:

; actual bitpatterns are relevant to process functions only
a95 = 2.01001000 ; running
a96 = 2.00001000 ; running after error
a97 = 2.10110000 ; waiting for stop by parent
a98 = 2.10100000 ; waiting for stop by ancestor
a99 = 2.10111000 ; waiting for start by parent
a100= 2.10101000 ; waiting for start by ancestor
a101= 2.11001100 ; waiting for process function
a102= 2.10001101 ; waiting for message
a103= 2.10001110 ; waiting for answer
a104= 2.10001111 ; waiting for event


; bit patterns used to test or change the above states:
a105 = 2.00100000; waiting for stop or start
a106 = 2.00001000; waiting for start

\f

; format of area process description:

a401=(:a3+23:)/24     ; number of words in user bittable
a403=a401*2           ; number of bytes in bit table

b.j0, j0=0

a349= j0              ; <start of process>
a250= j0 , j0=j0+2    ; <driver proc descr address>
a402= j0 , j0=j0+a403 ; <user bit table>
a48 = j0 , j0=j0+2    ; <lower limit>
a49 = j0 , j0=j0+2    ; <upper limit>
a10 =  0              ; <kind>
a11 =  2              ; <name>
a50 = 10, a51 = 11    ; <process descr addr of bs device>
a52 = 12              ; <reserved>
a53 = 14              ;******** <users>
a60 = 16              ; <first slice>
a61 = 18              ; <number of segments>
a62 = 20              ; <document name>
a411= 28              ; number of times written
a412= 30              ; number of times read

a349=a349-j0, a250=a250-j0 , a402=a402-j0,  a48=a48-j0, a49=a49-j0

e.

a2  = a412+2-a349     ; size of area process

; format of pseudo process
a48 = -4            ; <lower limit>
a49 = -2            ; <upper limit>
a10 =  0            ; <kind>
a11 =  2            ; <name>
a50 = 10            ; <main process>
a60 = 16           ; <mess descr>

\f

; format of device description:

; definition of device-dependant part of device-description

b. j0 w.

j0 = 0              ; (used to set up the definitions)

; pointers to private area in device descriptor, used by driver and start-io:

a220= j0, j0 = j0+2 ; first of private area, rel to a10
a221= j0, j0 = j0+2 ; top   of private area, rel to a10

; the following word is used to indicate a transfer in progress
;   (sender descr) a.1 = 1 : transfer to driver process
;   (sender descr) a.(-2)>0: transfer to sender process
;   (sender descr)     = 0 : no transfer
a225= j0, j0 = j0+2 ; transfer code

; pointers to channel program area, in device descriptor, used by start-io:

a226= j0, j0 = j0+2 ; first of channel program area, rel to a10
a227= a226+2,j0=j0+2; top   of channel program area, rel to a10

; standard status area: used when the controller delivers an interrupt:

a230= j0, j0 = j0+8 ; channel program address
a231= a230+2        ; remaining character count
a232= a230+4        ; current status
a233= a230+6        ; event status

; device address, also used as index to controller table:

a235= j0, j0 = j0+2 ; device address

; interrupt operation, as needed by monitor interrupt response:

a240= j0, j0 = j0+2 ; <jl w2 c51> (monitor service instruction)
a241= a240+2        ; <after jl w2 ...>
a242= a241, j0=j0+2 ; next operation link
a243= a242+2,j0=j0+2; prev operation link
a244= j0, j0 = j0+2 ; timeout / result from start-io

; interrupt operation, as needed by driver process:

a245= a244+2,j0=j0+2; interrupt address in driver code (logic addr)
a246= j0, j0 = j0+2 ; <jl w1 c30> (driver service instruction)
a247= a246+2        ; <after jl w1 ...>

; which driver process governs this device ? (used by monitor):

a250= j0, j0 = j0+2 ; driver description addr (abs addr)
a410=j0, j0=j0+a403 ; <user bit table>

; the last of these fields should have been adjacent to the
; field 'interval low' i.e. relative to a48:

j0 = j0 - a48
a220=a220-j0, a221=a221-j0
a225=a225-j0, a226=a226-j0, a227=a227-j0
a230=a230-j0, a231=a231-j0, a232=a232-j0, a233=a233-j0
a235=a235-j0
a240=a240-j0, a241=a241-j0, a242=a242-j0, a243=a243-j0,
a244=a244-j0, a245=a245-j0, a246=a246-j0, a247=a247-j0,
a250=a250-j0, a410=a410-j0

; some of the above given field were known under another name
; in the earlier versions of this monitor:

; a50 = a235 ; device address
; a56 = a245 ; interrupt address

e.

; a48        lower interval
; a49        upper interval
; a10        kind
; a11        name
; a52        reserver
; a53        users
a54 = 16   ; next message
a55 = 18   ; previous message
; a70        optional parameters
; etc



; format of peripheral process description:

; a402       start of user table
; a250       driver process description address
a48 = -4, a49 = -2  ; <interval>

a10 = 0  ; <kind>
a11 = 2  ; <name>
a50 = 10 ; <device number*64>
a52 = 12 ; <reserved>
a53 = 14 ; <users>
a54 = 16 ; <next message>
a55 = 18 ; <last message>
a56 = 20 ; <interrupt address>

; optional parameters for peripheral devices:
a70 = 22 ; <parameter 0>
a71 = 24 ; <parameter 1>
a72 = 26 ; <parameter 2>
a73 = 28 ; <parameter 3>
a74 = 30 ; <parameter 4>
a75 = 32 ; <parameter 5>
a76 = 34 ; <parameter 6>
a77 = 36 ; <parameter 7>
a78 = 38 ; <parameter 8>

; parameters used in connection with subprocesses:
a63 = a70+14
a64 = a63+2

; format of controller description

a310= 0             ; first of channel program
a311= 2             ; first of std status
a312= 4             ; interrupt destination
a313= 6             ; interrupt number
a314= 8             ; size of controller description

; format of std status

a315= 0             ; top of last executed command
a316= 2             ; remaining character count
a317= 4             ; current status
a318= 6             ; event status

; format of logic channel program (as demanded by the start i/o procedure)

a321= 0             ; address code < 12 + command < 8 + modif
a322= 2             ; param 1
a323= 4             ; param 2

a320= 6             ; size of channel program entry

\f

; format of message buffer:

a139=-2             ;   mess flag (saved w2 in send message)
a140= 0             ; links: next buffer, previous buffer
a141= 4             ; receiver (or result)
a142= 6             ; sender
a145= 8             ; start of message/answer
a150= a145          ; operation < 12 + mode      status word
a151= a145+2        ; first storage address      number of bytes
a152= a145+4        ; last storage address       number of chars
a153= a145+6        ; first segment number
a146= 24            ; top of message/answer
a6  = a146-a139      ; size of message buffer


; message buffer states:

; the possible states of a message buffer are defined by the
; values of the sender and receiver parameters:
;
; sender param:  receiver param:  state:
;       0               0         buffer available
; sender descr   receiver descr   message pending from existing sender
; sender descr  -receiver descr   message received from existing sender
;-sender descr   receiver descr   regretted message pending
;-sender descr  -receiver descr   regretted message received
; sender descr          1         normal answer pending
; sender descr          2         dummy answer pending (message rejected)
; sender descr          3         dummy answer pending (message unintelligible)
; sender descr          4         dummy answer pending (receiver malfunction)
; sender descr          5         dummy answer pending (receiver does not exist)



; the possible states of a message buffer are defined by the values of the sender and
; receiver fields in the buffer:
;
;         sender:        receiver:          state:
;   1.       0              0               free
;   2.    sender addr    receiver addr      message pending
;   3.    sender addr   -receiver addr      message received
;   4.   -sender addr    receiver addr      (not possible)
;   5.   -sender addr   -receiver addr      message received, but regretted by sender
;   6.    sender addr   -receiver addr - 1  immediate-message received
;   7.   -sender addr   -receiver addr - 1  immediate-message received, but regretted by sender ('s parent)
;   8.    sender addr       1               pending answer,  result = normal
;   9.    sender addr       2                  -       -     result = rejected
;  10.    sender addr       3                  -       -     result = unintelligible
;  11.    sender addr       4                  -       -     result = malfunction
;  12.    sender addr       5                  -       -     result = unknown
;
; explanations:
;  sender addr   > 0 :  message buffer claim of the sender has been decreased
;  receiver addr > 0 :  message buffer has not been detected by the receiver, i.e. mess
;                       buf claim of sender is untouched. the message buffer may be removed
;                       from the receivers queue without further actions.
;  receiver addr < 0 :  mess buf claim of receiver has been decreased, indicating that the
;                       receiver has deposited a mess buff in the pool, while the receiver
;                       is processing the original one.
;  sender addr   < 0 :  the sender has regretted the message, or has been removed. the mess buf
;                       claim of the sender has been increased, i.e. the sender may now use
;                       the deposited message buffer.
;  1 <= receiver <= 5 : the mess buf claim of the receiver has been readjusted, i.e. the
;                       receiver has regained its deposited mess buf claim
;  receiver addr odd :  immediate message
;
;
; the following table shows how the different monitor procedures react upon the possible
; bufferstates. the table contains the new state.
;
;                      <-----------------sender/parent----------------->
;                               remove                     <-------------receiver-------------><---drivers--->
;                               process/
;                      send     regret    wait     stop     wait     get      wait     send     link     next
;                      message  message   answer   process  event    event    message  answer     operation
;
; 1 free                  2     illegal   illegal     3     illegal  illegal    -      illegal  illegal    -
; 2 message pending       -        1       unch.      -        3        3       3      illegal     2       2
; 3 message received      -        5       unch.      -       2-3       3       -        8-12      2       -
; 5 mess rec, but regr.   -     illegal   illegal     -        1        5       -         1       1       -
; 8-12 pending answer     -        1         1        -      unch.      1       -      illegal  illegal    -
;
;                               modify/
;                               remove
;                               process
;
; 6 imm. mess received    -        7      illegal     -     illegal  illegal    -         1     illegal    -
; 7 imm. mess rec.,regr   -        -      illegal     -     illegal  illegal    -         1     illegal    -
;
▶EOF◀