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

⟦fe11f72f8⟧ TextFile

    Length: 36864 (0x9000)
    Types: TextFile
    Names: »cgrht«

Derivation

└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ.  Detaljer om "HC8000" projekt.
    └─⟦0364f57e3⟧ 
        └─⟦this⟧ »cgrht« 

TextFile

(kkrh=slang list.no xref.no;
)
\f


s.   a60,b20,c60 w.    ;
p.   <:fpnames:>       ;
     k=h55             ;
     0                 ;
a16: a14               ;
     al  w3  x1        ;
     wa. w3     a16.   ;
     jl  w2  x3        ;  start init
     jl.        b0.    ;
a50: 0,r.20            ;
                       ; start exekvering
b0:  jl. w3     h25.-2 ; input next command
     se  w2     114    ; if not r(eset) then
     jl.        b1.    ; goto b1
     jl. w3     a22.   ; else reset cpu1
     jl.        b0.    ; goto input next command
b1:  se  w2     97     ; if not (st)a(rt)
     jl.        b2.    ; goto b
     jl. w3     a24.   ; else start cpu1
     jl.        b0.    ; goto input next command
b2:  se  w2     111    ; if not (st)o(p) then
     jl.        b3.    ; goto b3
     jl. w3     a23.   ; else stop cpu1
     jl.        b0.    ; goto input next command
b3:  se  w2     105    ; if interrupt then
     jl.        b4.    ; goto b4
     jl. w3     a21.   ; else interrupt
     jl.        b0.    ; goto input next command
b4:  se  w2     102    ; if not f(inis) then
     jl.        b0.    ; goto input next command
     al  w0     0      ;
     rs  w0     100    ;
     jl. w3     a20.   ;
     al  w2     0      ;
     jl. w3     h7.    ;
b.   j1 w.             ;
                       ;
                       ;
                       ;
a20:                   ; venteprocedure
     rs. w3     j0.    ;
     al. w3     a6.    ;
     al. w1     a7.    ;
     jd         1<11+16;
     al. w1     a8.    ;
     jd         1<11+18;
     al. w2     a50.   ;
j1:  rl  w0  x2        ;
     jl. w3     h32.-2 ;
     1<23+32<12 +8     ;
     al  w2  x2+2      ;
     sh. w2     a50.+16;
     jl.        j1.    ;
     al  w2     10     ;
     jl. w3     h33.-2 ;
     jl.        (j0.)  ;
j0:  0                 ;
e.                     ;
b.   j0 w.             ;
a24: am         1<1    ; start
a23: am         1<1    ; stop
a22: am         1<1    ; reset
a21: al  w0     a0     ; interrupt
     wa. w0     a5.    ;
     rs. w3     j0.    ;
     al  w3     8      ;
     do  w3     (0)    ;
     jl. w3     a20.   ; goto vent
     jl.        (j0.)  ;
j0:  0                 ;
e.                     ;


     c0=+1             ; c0>0 for test af ri-ordren
     a0=20<3           ;
a5:  1<23              ;
a6:  <:clock:>,0,0,0,0 ;
a7:  0,1,0,0,0,0       ;
a8:  0,r.10            ;
                       ;
a11:                   ;  start test
c.   -c0               ;
     al  w2     0      ;
     al  w3     20     ;
     al  w0     0      ;
     al  w1     19     ;
     ds  w3     1194   ;
     ds  w1     1190   ;
     ss  w1     1194   ;
     ds  w1     1186   ;
     rl. w1     -4     ;
     jl.        a12.   ;
m.   wait cpu1         ;
a12: ls  w1     -18    ;
     rs  w1     1198   ;
     rl  w1     1196   ;
     al  w1  x1+1      ;
     rs  w1     1196   ;
     gg  w3     66     ;
     jl.        a11.   ;
                       ;
                       ;
c27:                   ;
b.   h20,i12 w.        ;
z.                     ;
c.   c0                ;
     jl.        c26.   ;
c27:                   ;
     rl. w1     a50.   ;
     al  w1  x1+1      ;
     rs. w1     a50.   ;
     ri         16     ;


b.   h20,i12  w.       ;
c26: al. w3     h0.    ;#1   init cpu1
     gp  w3     26     ;#1   set inf register addr;
     rl  w3     8      ;#1   base of controller descr addr
     al. w1     c27.   ;#1
     rs  w1  x3+a0+0   ;#1    set start addr


     ri         16     ;#1    return interrupt;
     ;;
     ; testoutput
     ;  antal ri - i type - antal int - int level - di - tl - tl - tl
     ;
     ;  interrupt 16:  input finis
     ;            18:  input request
     ;            20:  output finis
     ;

     ;#1 system table: monitor mode
h.                     ;

     0                 ;
h0:                    ;
     0,r.6             ;
w.                     ;
     0                 ; -5  monitor call service addr
i0:  h6                ; -3  interrupt service addr
     1<23+0            ; -1  status  interrupt limit
i1:  h3                ; +1  register dump addr
     0                 ; +3  exception service addr
     0                 ; +5  escape service addr

                       ;#1 system table: user mode
i2:  h4                ; -5  monitor call service addr
i3:  h5                ; -3  interrupt       -      -
     1<23 + 6          ; -1  status < 12 + interrupt limit
i5:  h7                ; +1  register dump addr
     0                 ; +3  exception service addr
     0                 ; +5  escape service addr

                       ;#1  monitor register dump addr
h3:  0                 ;  w0
     0                 ;  w1
     0                 ;  w2
     0                 ;  w3
     1<23              ;  status       monitor mode
i4:  c27               ;  ic           start cpu1 process
     0                 ;  cause
     0                 ;  sb

     8                 ;  cpa
     0                 ;  base
     8                 ;  lower write limit
     8.3777 7777       ;  upper write limit
     0<12 + 6          ;  interrupt limits


                       ;#1 interrupt service cpu1
h4:  am         1      ;#1  monitor call service addr
h5:  am         1      ;#1  interrupt service addr (level 1)
h6:  al  w3     1      ;#1  interrupt service addr (level 2)
     rs. w3     a50.+2 ;
     rl. w1     a50.+4 ;
     al  w1  x1+1      ;
     rs. w1     a50.+4 ;
     sh  w2     14     ;
     jl.        c27.   ;
     rs. w2     a50.+6 ;
     rs. w2     i10.   ;
     jl.        c27.   ;
h7:  0                 ; w0
     0                 ; w1
     0                 ; w2
     0                 ; w3
     1<23              ; status
i6:  h8                ; ic
     0                 ; cause
     0                 ; sb
     8                 ; cpa
     0                 ; base
     8                 ;
     8.3777 7777       ; upper write limit
     0<12+20           ;
h8:                    ;
     al  w2     0      ;
     do. w2     (a2.)  ; start HC8000
     al. w3     a49.   ; output addr
     ws. w3     a40.   ;
     rl  w1     8      ;  w1:= base of controller table
     rs  w3  x1+a0+1<3+2;
     jl.        h12.   ; goto wait
h14: rl. w2     a41.   ; w2:=share count
     rl. w0  x2+a40.   ; w0:=length of next share
     wa  w3     0      ;
     al  w2  x2+2      ;
     rs. w2     a41.   ;
     rl. w0  x2+a40.   ;
     sh  w0     0      ; if no more to output then
     jl.        h9.    ; goto wait
     ds  w3  x1+a0+1<3+2; buff:= length,addr
     al  w2     0      ;
     rs. w2     i10.   ;
     do. w0     (a2.)  ; send data transfer request
     al  w2     0      ;
     rs. w2     a50.+10;
h15: rl. w2     a50.+10;
     al  w2  x2+1      ;
     rs. w2     a50.+10;
     rl. w2     i10.   ;
     se  w2     20     ; wait for data tranfer completed
     jl.        h15.   ;
     al  w3     0      ;
     rx. w3     i10.   ;
     se  w3  x2        ; if a new interrupt already is arrieved then
     jl.        h13.   ; goto h13
h12: al  w2     0      ;
     rs. w2     a50.+12;
h11: rl. w2     a50.+12;
     al  w2  x2+1      ;
     rs. w2     a50.+12;
     sl. w2     (a3.)  ; if time out then
     jl.        h8.    ; goto restart on HC8000
     rl. w2     i10.   ;
     se  w2     18     ; wait for ready signal from hc
     jl.        h11.   ;
     al  w2     0      ;
     rs. w2     i10.   ; clear interrupt signal
h13: al  w3     40      ;
     di. w3     (a2.)  ;
     rs. w3     a50.+8 ;
     rl  w3  x1+a0+1<3+2;
     jl.        h14.   ;
h9:                    ;
     al  w2      0
     rs. w2     i10.
h16: rl. w2     i10.
     sn  w2     0
     rl. w2     a50.+16
     al  w2  x2+1
     rs. w2     a50.+16
     jl.        h16.
     al  w2      0
     rs. w2     i10.
     al  w3      30
     di. w3     (a2.)
     rl. w2     i10.
     sn  w2     0
     jl.        -4
     al  w2      0
     rs. w2     i10.
     rl. w2     i10.
     sn  w2     0
     jl.        -4
     di. w3     (a2.)
     rs. w3     a50.+2
     rl. w2     a50.+14;
     al  w2  x2+1      ;
     rs. w2     a50.+14;
     jl.        h9.    ;
i10: 0                 ;
z.                     ;

a1:  0                 ;
a2:  1<23+21<3+2.001   ;
a3:  100000            ;
a4:  0                 ;
a9:  1<23+21<3+ 2.010  ; reset
a14:                   ;  start init
     rs. w2     a4.    ; save return
     rs. w1     a14.   ;  save fp base
     rl  w3     8      ; base of controller tabel
     al  w3  x3+a0     ;
     rs. w3     a1.    ; addr of contr. table for cpu1
     al. w1     a11.   ;
     al  w0  x1        ;
     ds  w1  x3+2      ;
     ds  w1  x3+10     ;
     ds  w1  x3+18     ;
     ds  w1  x3+26     ;
     jd         1<11+28;
c.   c0                ;
     rl. w1     i0.    ;
     wa. w1     a14.   ;
     rs. w1     i0.    ;
     rl. w1     i1.    ;
     wa. w1     a14.   ;
     rs. w1     i1.    ;
     rl. w1     i2.    ;
     wa. w1     a14.   ;
     rs. w1     i2.    ;
     rl. w1     i3.    ;
     wa. w1     a14.   ;
     rs. w1     i3.    ;
     rl. w1     i4.    ;
     wa. w1     a14.   ;
     rs. w1     i4.    ;
     rl. w1     i5.    ;
     wa. w1     a14.   ;
     rs. w1     i5.    ;

     rl. w1     i6.    ;
     wa. w1     a14.   ;
     rs. w1     i6.    ;
                       ;
                       ;
                       ;     rl. w1  i7.
                       ;     wa. w1  a14.
                       ;     rs. w1  i7.
z.                     ;
     jl.        (a4.)  ; return
a40: 4,4,20,a46,0      ;
a41: 0                 ;
a49:                   ;
     2                 ;
     2                 ;
a47: 1<23+0<3+2.001    ;
b.   a50,b122,c35,d120,f120,i25,h20,p5 , g100 w.;
    al   w1 -500
    al   w1 1000
    al    w1 2000
    al. w3 b122.
    al  w1 0
b122: al w1 x1+1     ;
      gp w1  64
      jl.    b122.
    jl.     b120.     ; goto start.
     ;; reg. dump addrs + 0 = w0
     ;;                         2 = w1
     ;;                         4 = w2
     ;;                         6 = w3
     ;;                         8 = status
     ;;                        10 = ic
     ;;                        12 = cause
     ;;                        14 = addrs.
     ;;
     ;; process definition reg.s.
     ;; reg. dump adress + efective addrs of 'ri' instr.
     ;;   + 0 = cpa ( common protected area ).
     ;;   + 2 = base 
     ;;   + 4 = lowlim
     ;;   + 6 = uplim
     ;;   + 8 = intlim.
        ; device channel address blocks.
      0,r.20
b30: 0,r.5             ; 1. static definition
                       ; process definition addrs.
                       ;
b10: 0,r.8             ; 1. reg dump addrs
b31: 0,r.5             ; 2. process definition reg. addrs.
b11: 0,r.8             ; 2. reg dump addrs
b32: 0,r.5             ; 3. proces definition regisster addrs.
b12: 0,r.8             ; 3. reg dump addrs
   0,r.6
b33:                   ; 4. process definition reg. addrs.
    0                 ; cpa should be set to b90
    0                 ; base = 0
    0                 ; low lim schold be set to b100
    0                 ; upper lim schold be set to b101.
    256               ; interupt limit.
b13: 0,r.8             ; 4. reg dump addrs.
                       ; + 10 schould be set to b100.

     ;; sys information reg. inf, points to 2.
     ;; half word of status/intlim initialisatiosation in
     ;; sys tab entry.
     ;; the sys tab entry consist of 6 consequtive words
     ;; with the following contents:
     ;; inf - 5 = monitor call service addrs
     ;; inf - 3 = interupt service addrs
     ;; inf - 1 = status/intlim initialisation.
     ;; inf + 1 = reg. dump addrs.
     ;; inf + 3 = exeption service addrs
     ;; inf + 5 = escape service addrs
b20: 0,r.6             ; 1. sys tab entry
                       ;
b21: 0,r.6             ; 2. sys tab entry
b22: 0,r.6             ; 3. sys tab entry, monitor table.
b23:                   ; 4. sys tab entry.
     0                 ; monitor call service addrs
     0                 ; interupt service addrs.
     0                 ; status interupt limit addrs
     0                 ; reg dump addrs.
     0                 ; exeption service addrs
     0                 ; escape service addrs.
     ;; status reg. constant.
h.                     ;
d10: 0,256             ; status 0, interupt limit 0
d13: 6,6               ; monitor process interupt limit.
d14: 256,256           ; user process interupt limit
w.                     ;
d11: 1<23+6            ; monitor mode , interupt limit 6
d12: 1<23              ; monitor mode.
d5:  5                 ; relative inf init from sys tab start.
b66: 0                 ; addrs of current sys tab.
b68: 0                 ; addrs of next sys tab.
     -1                ; last in systam tab.

 d80: ;et current process register dump place.
   ; call w3 = return address.
   ;      
   ; result: w2 = tart of dynamic register dump area.
   rl. w2  b66.   ; could be taken from
                  ; information register instead.
   al  w2 x2+12   ; get from monitor to process table.
   al  w2 x2+1    ; get to reg dump address.
   rl  w2 x2      ; load reg dump address.
   jl     x3      ; return.

d20: ; data out channel start.
     ; w0 = address of buffer.
     ; w3 = no af half words to be transferred.
     ;
     ; device no is 1 is used.
     ; device 1 is part of the rh device number.
     al w2     1   ; get device number.
     ls w2     3         ; device number times 8.
     al w2 x2+2          ; second word of device block.
     wa w2     8         ; add address of device base.
     ds w0 x2            ; save buffer address and no of 
                         ; words transferred.
     rs. w0     d23.     ; save buffer address.
     al  w2     -2
     wa  w2      0       ; get buffer state address.
     al  w1      2       ; save state data out channel
     rs  w1   x2         ; in buffer state.
     rl. w2    b117.     ; get flag data out in progress.
     al  w2  x2+2        ; in crease flag counter.
     rs. w2    b117.     ; save flag data out .
     do. w2    (d22.     ; data out channel start.
     rs. w2     d25.     ; save result word.
     jl.        i2.      ; goto start next process.
d22: 1<23+1<3+2.001     ; effective address for start
                         ; of channel data in as device 22.
d23:         0           ; buffer address.
d25:       -22222        ; return word from data out insttr.

d30:                     ;  data in channel  start.
    ; w0 = address of buffer
    ; w3 = no of half words transferred ( not used).
    ;
    ; device no 2 is used.
    ; device 2 is part of the rh device number.
    rl. w2   b116.    ; 
    al  w2 x2-2       ;
    rs. w2  b116.     ; decrease input interupt counter.
    rl.  w2  b112.  ; set flag indicating data in
    al  w2 x2+2       ; channel operation in
    rs. w2 b112.   ; progress.
    al w2 2           ; get device number.
    ls w2    3           ; device number := device number * 8;
    al w2 x2+2           ; get address of second word in device block.
    wa w2    8           ; add address of bevice blocks base.
    ds w0    x2          ; save buffer address and 
                         ; no of words transferred.
    rs. w0    d33.       ; save  current buffer address.
    rl  w2    0          ; get buffer state address.
    al  w2 x2-2          ;
    al  w1    1          ;  state channel data input.
    rs  w1 x2            ; save buffer state.
    di. w2   (d31.       ; data in channel start.
   rs.  w2   d35.    ; save word.
    jl.      i2.        ; goto start next process.
d31: 1<23+2<3+2.001      ; effective address for start
                         ; of channel data out as device 6.
d33:   -2
d35:   -2
d36:   -2     ; interupt cause.
    
   ; reset charakter device
d50:
    ; call w0 = undifined
    ;      w2 = return address.
    ;      w1 = destroyed.
    ;      w3 = charakter device no.
    ; for all acia : eaual address = status address.
    ;                device address + 1 = data address.
    rl  w1  6      ; w1 := charakter device no.
    al  w1  x1 + 1  ; get charakter device data address.
     ls  w1  3       ; shift device data address 3.
    ls  w3  3      ; shirft device no 3 left.
    lo.  w1  d51.   ; create device data address.
    lo. w3  d51.   ; create device address.
    rl. w0  d52.   ; load reset command.
    do  w0  x3     ; write out reset command.
    rl. w0  d59.  ; load charakter disable mask.
    do  w0  x3     ; write charakter initialisation.
    di  w0  x3     ; read charakter device status.
    di  w0  x1     ; read charakter device data.
    rl.  w0   d53.  ; load charakter enable mask.
    do  w0  x3    ; write acia enable.
    jl    x2        ; return from subroutine.
d51: 1<23+0<3+2.100 ; charakter device no 0.
d52: 2.00000011     ; charakter device master reset command.
d59: 2.00000001     ; load acia diable mask.
d53: 2.10100001     ; charakter device init:
                     ; bit 7 = recieve interupt enable.
                    ; bit 6 and 5 = -, trh low, interupt
                    ; enabled.
                    ; bit 2 3 4 = 7 bits even parity 2 stop bit.
                    ; bit 0 1 = divide counter witth 16.
d54: 2.00000010     ; status mask.
                    ; bit 1 is transmit data register
                    ;       empty.
d55: 2.00000001      ; status mask.
                     ; bit 0 is  recieve data register full.
d58: 2.00000011      ; mask for boyh transmit and recieve.
d57:  0              ; return address.

d56: ;; read charakter device status.
     ;; w0 = status word.
     ;; w1 = 0 = no care.
     ;;      1 = recieve data full.
     ;;      2 = transmit data empty.
     ;;      3 = both.
     ;; w2 = return address.
     ;; w3 = device no. ( saved).
     rs. w3  d57. ; save devcice no.
      sh  w3   63  ; if device address < 63 
     al   w3  x3+1 ; device address + 1 ( interupt controlers).
     ls  w3  3    ; device no * 3.
     lo. w3 d51.  ; or in device base 0.
     di  w0  x3   ; load status word.

     rl  w1  0    ; move status word to w1.
     la. w1  d58. ; add trinsmit and send bit out.
     rl. w3   d57. ; reestablish w3.
     jl     x2     ; return from subtoutine.
    ;; charakter output.
    ;; call w0 = charakter.
    ;;      w1 = result no.
    ;;           0 = data charakter read.
    ;;           2 = data charakter not read.
    ;;      w2 = retrun address.
    ;;      w3 = device no.
d40:
     rs. w3  d42.  ; save device address        
     sl  w3  64  ; if device address > 63 then
     al  w3 x3+1 ; device no := device no + 1,
                 ; so the charakter device data channel
                 ; is selected.
     ls  w3  3   ; shift device no 3 to left.
     lo. w3  d51.; or device base no 0.
     do  w0  x3  ; output dcharakter on device.
     rl. w3  d42. ; reestablish device address.
     jl    x2 ; return from subroutine.
d42:   0 ; return address.



d60: ;; read data char.
     ;; w0 = return charakter read.
     ;; w1 = result 0 = charakter read
     ;;             2 = charakter not read.
     ;; w2 = return address.
     ;; w3 = device address.
     rs. w2   d61.  ; ave return address.
     rl  w2    6    ; get device address.
     al  w3    x3+1    ; add 1 to device address to calculate
                    ; data address.
     ls  w2    3    ; shift device addreess 3. left.
     lo. w2   d51.  ; or device base 0.
     di  w1 x2      ; read status word from acia.
     la. w1   d62.  ; if status register signal no 
                    ; data word then
     sn  w1   0     ; goto return no read data
     jl.      d63.  ;else
     rl  w2    6    ; get device address.
     ls  w2    3    ; device address * 8.
     lo. w2    d51. ; or device base.
     di  w0  x2   ; read data word.
     al  w1    0    ; signal transport ok.
     jl.       (d61. ; return from subroutine.
d63: al  w1    2     ; signal no read.
     jl.       (d61. ; return fom subroutine.
d61:    0 ; return address
d62:   2.00000001 ; status word mask for read.
d67: 0           ; return address.

d65: ;; read data char with no check.
     ;; w0 = result data word.
     ;; w1 = unchanged.
     ;; w2 = return address.
     ;; w3 = device address unchanged.
     ;; 
      rs. w3   d67.   ; save device address.
       sl  w3     64   ; if device address > 63 then_
       al  w3   x3+1  ; add  1 to get data address.
      ls  w3    3     ; divece address timews 8.
      lo. w3   d51.   ; or device base 0.
      di  w0  x3      ; read data word.
      rl. w3   d67.   ; restablish device address.
      jl     x2       ; return from subroutinr.
     

d70: ; init of interupt controler.
        ; call w2 = address of controler.
        ;      w1 = level no of first level.
        ;      w3 = return address.
        rs. w3    d71. ; save retune address.
        al  w3  x2     ; get interupt controler address into w3.
        al  w2  x2+1   ; increment device address to get
                       ; get data address.
        ls  w3  3      ; device address times 8
        ls  w2  3      ; device control address times 3.
        lo. w3  d51.   ; or ddevice base to address of
                       ; data address.
        lo. w2  d51.   ; or device base to address of
                        ; control.
        al  w0  0      ; set master reset control wrord.
         gp  w2  64
        do  w0  x2   ; send master reset to device.
         gp  w2 64
        ds. w3  d73.   ; save device addresses.
        al  w3   0     ; counter := 0.
d75:    rl. w0  d74.   ; get preselect response memory
                       ; for writing.
         wa  w0   6    ; increment response memory address.
        do. w0  (d72.  ; output preselect word
        al  w0  x1     ; get level data.
        do. w0  (d73.  ; output level.
        al  w1  x1+1   ; nextlevel.
        al  w3  x3+1   ; next 
        se  w3     8   ; if -, last level then
        jl.     d75.   ; goto repeat.
        rl. w0 d78.  ; get control word for preselecting
                     ; auto clear for writing.
        do. w0  (d72.  ; send control word.
        al  w0    255  ; load auto clear mask all bits.
        do. w0  (d73.  ; send data word , set auto clear on
                       ; on all interupt bits.
       rl.  w0   d76. ; get clear interupt mask
                      ; and request bits.
      do.  w0  (d72.  ; send clear interupt mask 
                      ; and request to controler.
       rl.  w0   d77.  ; get mask for arm interupt controler
                       ; and preselect interupt request for
                       ; reading.
       do.  w0   (d72. ; write control word.
        jl.     (d71.  ; return form subroutine.
d71: 0      ; return address.
d72: 0      ; device address.
d73: 0      ; device data address.
d74: 2.11100000 ; preselect response memory
d76: 2.00010000  ; clear all imr bits.
d77: 2.10101001 ; set preselect interupt request register
                ; for reading , and arm chip.
d78: 2.11000000 ; preselect auto clear register for writing.



b40:  ;; monitor call addrs.
b.  c20   w.   ; monitor call block.
      al   w1    0
      rs.  w1    b112.
      jl.    x2+f120.  ; switch to function.
f120: jl          10      ; 1<11+0 monitor 0 goto init.    
      jl.        i2.     ; 1<11+2  swop process.
      jl.        c2.       ; 1<11+4.
      jl.        f120.     ; entry 1 < 11 + 6  can not be used.
      jl.        d20.     ; 1<11+8 data out channel start.
      jl.        d30.     ; 1<11+10 data in channel start.
       ; jd 1<11 + 12 
      jl.        c0.      ; charakter devisce reset.
      ; jd 1<11+14
      jl.         c1.    ; charakter device write.


c0: ;; reset charakter device.
    jl.  w2    d50.       ; reset charakter device.
     jl.       i15.       ; same process.

c1: ;; write char on charakter device
b. i0 w.
i1: jl.  w2    d40.       ; call write charakter device.
    jl.       i17.    ; swop process.
c2:
     al   w3    64
     jl.  w2    d56.   ; read status.
      rs.   w0   b119.
      al  w3     8     ; ask for interupt controler
     jl.  w2     d56.  ; status.
     rs.  w0    b117.  ; save staus  tus.
     jl.          i15.  ; call same.
e. ;; end block write char.
e. ;; end monitor block.
b41:  ; interupt tab intry.
     ;; w2 = cause.
     ;; cause 14 = timer interupt (or from rc8000)
     ;;       16 = channel in put finis
     ;;       18 = channel input start
     ;;       20 = channel output finis
     ;;       22 = local dma device interupt.
     ;;       24 = charakter device interupt ( not in rh8000).
b. c20   w.   ;; interupt handling block.
     rl.  w1   b112. ; load idle loop counter.
     gp   w1    64   ; show idle loop counter.
     al   w1    0    ; reser idle loop counter.
     rs.  w1   b112. ;
     sn w2 18       ; if interupt cause = channel input start
     jl.   c1.      ; then start channel input .    
     sn w2 16       ; if interupt cause = channel input finis
     jl.   c2.       ; then goto input channel finis control.
     sn w2  20      ; if interupt is data out channel finis
     jl.    c0.     ; then goto c0.
     sn w2  14      ; if interupt = rh8000 interupt then
     jl.    i2.     ;  next process.
                    ; else
     sn  w2   24   ; if interupt = 24 then
     jl.       c4.  ; goto handel charakter interupt.
                    ; else
     jl.    i15.    ; then same process.

c0:   ; interupt data out channel stop.
    rl. w2    b117. ; decrease dataout in progress 
    al  w2  x2-2    ; counter.
    rs. w2   b117.;
    rl.  w2   d23.  ; get buffer address.
    al   w2 x2-2    ; calculate state address.
    al   w1    4    ; save state after data out, i.e ready
                    ; for data in.
    rs   w1  x2     ; after data out.
    jl.       i2.   ; goto swop process.
c2:   ; input channel finis.                
    rl. w2 d33.      ; get buffer address.
    al  w2  x2-2     ; calculate buffer state address.
    al  w1    3      ; save state indicating
    rs  w1  x2       ; after data in.
    rl.  w1  b112.   ; clear flag indicating data in
    al   w1  x1-2    ; data in channel operation
    rs.  w1  b112.   ; in progress.
    jl.        i2.   ; goto swop process.
c1: ; handling of channel input start interupt.
    rl.  w2   b116. ; get input channel flag.
    al   w2 x2+2    ; increase flag counter.
    rs.  w2   b116. ; save flag counter.
    jl.       i2.   ; goto swop process.
c3:      0          ; flag indicating that interupt channel 
                    ; input had been handled.
g1:

c4: ;handling of charakter device interupt.
    ;
b. c20 w.  ;; blovk handle charakter device.
    gg w3 94        ; get interpt  level.
    se  w3    64   ; if interupt no <> 64 then
    jl.       0    ;  same process.
    jl.  w2   d56.  ; call read charakter status.
     rs.  w1   c3.  ; save status.
      rs.   w1 b119.
      gp  w0   64   ; show status.
     sn  w1    2  ; if sttus = 2 then
     jl.       i16.  ;  next process.
     se  w1    1    ; if 1 or
     sn   w1  3     ; 3 then
     jl.      c2.   ; goto c2.
     gp  w0  64     ; 
     gg  w0  66     ; wait
     jl.     0    ; next process.
c2:
     jl. w2 d65.    ; read data char.
     rs. w0  b118.  ; save data char.
     rl. w1  c3.    ; restablis status.
      gp  w1   64
     se  w1   3     ; if status was 3 then
     jl.     i16.   ; same 
     jl.     i16.    ; else next.
c3: 0 ; save d status.
c4: 0 ; saved device no.
    
 e. ;; end bloch handle char interupt.

  ;; exeption address and escape address.
   ;;
b42:                   ;; exeption address.
b43:                   ;; escape address.
       jl.    0
e.                     ; end monitor jump table , and monitor
                       ;procedure block.



b120:                  ; start
                       ; init of user proc in b100.
     al. w1  b33.      ; addrs of process definition reg.s
     al. w0  b90.      ; addrs of cpa.
     rs  w0  x1        ; save cpa in user pt roc def. reg.
     al. w3  b100.     ; get addrs of low lim.
                       ;
     al. w0  b101.     ; get upper limit.
     ds  w0  x1+6      ; save upper limit.
     rl. w0  d14.      ; interupt limit
     rs  w0  x1+8      ; save interupt limit

                       ; init of 2. user process.
     al. w1  b31.      ; addrs of 2. user process
                       ; process definition reg.s.
     al. w0  b90.      ; addrs of cpa.
     rs  w0  x1        ; save cpa.
     al. w3  b110.     ; get lower limit.
     al. w0  b111.     ; get upper limit.
     ds  w0  x1+6      ; save upper limit.
     rl. w0  d14.      ; get inter limit.
     rs  w0  x1+8      ; save interupt limit.

                       ; init of first user proc reg. (ic).
     al. w2  b13.      ; get reg. addrs.
     al. w0  b100.     ; get user proc start addrs.
                       ; set user proc in monitor mode.
     rl. w3  d12.      ; get status reg contents for monitor
                       ; mode.
     ds  w0  x2+10      ; save monitor mode in user proc st
                       ; status register.

                       ; init of 2. user proc reg. (ic).
     al. w2  b11.      ; get reg addrs
     al. w0  b110.     ; get user proc start addrs.
                       ; set user proc in monitor mode.
     rl. w3  d12.      ; get status register contents
                       ; for monitor mode.
     ds  w0  x2+10      ; save monitor mode in user proc.

                       ; init of first user proc sys tab.
     al. w2  b23.      ; get addrs of sys tab to user program.
     rl. w0  d11.      ; get status/ interupt limit init.
     al. w1  b13.      ; get addrs of reg dump addrs
     jl. w3  b50.      ; call init of sys tab.
     rl. w0  d11.      ; get status and inter limit .
     al. w2  b21.      ; addrs of 2. suer proc sys tab.
     al. w1  b11.      ; reg. dump addrs of 2. user proc.    
     jl. w3  b50.      ; call init of sys tab.
     jl.     b80.      ; goto continue.
b50:                   ;; subroutine init of sys tab.
     ;; w2 = addrs of sys tab.
     ;; w1 = addrs of reg dumb addrs of user proc.
     ;;  w0 = status interupt limit initialisation.
     ;; w3 = return addrs.
     rs  w0  x2+4      ; save status and interupt limit.
                       ;
     al. w0  b40.      ; get addrs of monitor call.
     rs  w0  x2        ; save monitor call addrs in syetm tab.
     al. w0  b41.      ; get addrs of interupt servece.
     rs  w0  x2+2      ; save interupt service addrs in sys tab.
     rs  w1  x2+6      ; save reg dump addrs of user process in
                       ; sys tab.
     al. w0  b116.     ;
                       ; al  w0      0     ; get std exeption
                       ;address.
     rs  w0  x2+8      ; save  exeption
     al  w0  0         ; get std escape address.
     rs  w0  x2+10     ; save  escape.
     jl      x3        ; return from subroutine.


b51:                   ;; subroutine init of process definition
     ;; registers for a monitor process.
     ;; call: w2 = address of 1. process definition register.
     ;;       w3 = return address.
     ;;       
     ;; return w0 = destroyed.
     al  w0  0         ; w0 := 0.
     rs  w0  x2        ; cpa := 0.
     rs  w0  x2+2      ; base := 0.
     al  w0  8         ; w0 := 8.
     rs  w0  x2+4      ; lowerlimit := 8.
     rl. w0  b52.      ; get max upper limit.
     rs  w0  x2+6      ; upperlimit := max.
     rl. w0  b53.      ; get interupt limit 6,6
     rs  w0  x2+8      ; save interupt limit
     jl      x3        ; return from subroutine.
b52: 8000000           ; upper limit
b53: 6<12+6            ; disable level + enable level.
                       ;
b80:                   ; continue.
                       ; init of first monitor tab.
     rl. w0  d12.      ; status and interupt limit init for
                       ; monitor     
                       ; process. status := monitor mode
                       ; interupt limit :=0.

     al. w1  b10.      ; reg dump addres.
     rl. w3  d12.      ; get monitor mode init.
     rs  w3  x1+8      ; save monitor mode.
     al. w2  b20.      ; sys tab addrs.
     jl. w3  b50.      ; call init of sys tab.
                       ; init of 2. monitor tab.
     rl. w0  d12.      ; status := monitor mode interupt limit
                       ; := 0.
     al. w1  b12.      ; reg dum addrs.
     rl. w3  d12.      ; get monitor mode.
     rs  w3  x1+8      ; init reg dump status.
     al. w2  b22.      ; sys tab addrs.
     jl. w3  b50.      ; call init of sys tab.
     al. w2  b30.      ; w0 := address of process definition 
                       ; register for monitor proc 1.
     jl. w3  b51.      ; call subroutine init of monitor
                       ; process definition registers.
     al. w2  b32.      ; w0 := address of process definition
                       ; registers for monitor proc 2.
     jl. w3  b51.      ; call subroutine init of monitor
                       ; process definition registers.
                       ; b22 = process in b100
                       ; b20 = process in b110.
b121:al. w3  b20.+5    ; get addrs of 1 monitor sys tab.
                       ; address of process in b110.
     al. w2  b22.+5    ; get addrs of 2. monitor sys tab.
                       ; address of process in b100.
     ds. w3  b68.      ; save addrs of next and current.
     gp  w2  26        ; init of information reg.
     al  w2      8     ; w2 := interupt controler address.
     al  w1      64    ; w1 := first interupt level value.
     jl. w3      d70.  ; call init of interupt controler.
    gg w3     66
   ; jl. w2  g0.       ; call subroutine init of timer
     jd      1<11+2    ; start
c.-1
p.<:hctimerinit:> ; load timer  init code.
l.
z.


                       ; interupt and monitor call service.
i17: ;; start process in b110.
     al. w3  b22.+5   ;
      al.  w2 b20.+5  ; get addres of monitor tab for process
                      ; in b110.
        ds. w3  b68.  ; save address of next and current.
      jl.       i15.  ; goto start same.

i16: ;; start process in b100.
     al. w2 b22.+5   ; load address of process in b100.
     al. w3  b20.+5  ; load address of montab of process in b110.
     ds. w3  b68.    ; save mon tab address.
                     ; continue in start same.

i15:                   ;
     ; same process
     rl. w3   b66.     ; get address of system table of current.
     gp  w3   26       ; init information register with
                       ; value of current system table.
     ri      -10       ; return from interupt to n
                       ; last current.
i2:                    ; monitor call service.
                       ; from  call 2.
     dl. w3  b68.      ; get addrs of current and next.
     rs. w2  b68.      ; next := current.
     rs. w3  b66.      ; current := next.
     gp  w3  26        ; inf reg := symbol tab of next.
     ri      -10       ; call return from intprt effective addrs
b90:                   ; cpa limit
b. c10 w.
b100:
     al  w3  64       ; load device address.
     jd 1<11+12       ; call init of terminal driver.
c1:  rl.  w0  b118.  ; get char.
     al  w3  64      ; get device address
     jd 1<11+14      ; call outchar
     jl.    c1.      ; 
     jl.    b100. ; goto start of inpu process.
b110:
b.   c20   w.
      ;; block second process.
       jd   1<11+2   ; next process.
c0:    rl.   w1    b112.  ; get loop counter.
       al    w1  x1+1     ; increment loop counter.
       rs.   w1    b112.  ; save loop counter.
       sl    w1   2000
       jd 1<11+4
c11:    rl.   w1    b119.
        ls    w1     12
        gp    w1    64
       rl.   w1     b117.
       gp    w1     64
       jl.         c11.
       jl.         c0.    ; goto repeat.
e. ;; end block second process.

b112: 0
b116: 0
b117: 0
b118:  95     ; char to be output.
b119: 0

b101: 
b111: jl. 0          ; end of 2. and first user program.
e.
                       ; end of 2. user program.
e.                     ;
a60:
     a46=k-a49-24      ;
e.                     ;
e.                     ;
e.                     ;
▶EOF◀