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

⟦c9452b566⟧ TextFile

    Length: 15360 (0x3c00)
    Types: TextFile
    Names: »hcrhcomt«

Derivation

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

TextFile

(hcrhcom=slang list.no xref.no
hcrhcom)
b.  g2 w.
s.  a50,b10,h20,i20 w.

    ;; format of message buffer
    a40=-10         ; message buffer address(other computer) or result
    a38= -8         ; receiver<12+sender (computer numbers)
    a36= -6         ; process description addr for receiver other computer
    a34= -4         ;    -         -       -    -  sender     -      -
    a32= -2         ; w2
    a0 =  0         ; next buffer
    a2 =  2         ; prev buffer
    a4 =  4         ; receiver
    a6 =  6         ; sender
                    ;               i-o (normal)    i-o (other com)   mon call
    a8 =  8         ; message       op<12 +mode       3<12            1<22+m_p_n
    a10= 10         ;    -          first address     first addr      w0
    a12= 12         ;    -          last  address     last  addr      w1
    a14= 14         ;    -          1. segment        first addr(oc)  w2
    a16= 16         ;    -                            comp no         w3
    a18= 18         ;    -
    a20= 20         ;    -
    a22= 22         ;    -
    a48=10          ; max number of buserrors
    a49=a22-a40+2   ; buffer length
    a50= 21<3       ; level
    ;;
    ; format of message to another computer:
    ;
    ;
    ; do     wreg             addr
    ;        wa        1<23+level<3+ 2.001  send data transfer request
    ;                  wa>= 0 contents irr
    ;                       request to send data specified by level location
    ;                  wa =1<23 + message
    ;
    ;
    ;
    ; di    wreg              addr
    ;       wb         1<23+level<3+ 2.001  start input
    ;                  wb >=0 input to addr specified in level location
    ;                  wb  =  1<23 + message
    ;
    ;                   level location   (8) + level < 3
    ;                   *----------*----------*----------*----------*
    ;                   ! number of! input or ! interrupt!          !
    ;                   ! bytes to ! output   ! address  ! level    !
    ;                   ! transfer ! address  !          !          !
    ;                   *----------*----------*----------*----------*
    ;
    ;
    ;
    ; external interrupt  16 :  channel input finis
    ;    -         -      18 :  channel input start (input request)
    ;    -         -      20 :  channel output finis
    ;    -         -      22 :  character device interrupt(not used)
    ;
    ;

    rs. w3  h7.     ; own proc desr addr
    al  w0  4       ;
    jd      1<11+32 ; set own process descr addr in monitor
    jd      1<11+28 ; set monitor mode
    al. w3  h10.    ;
    jd      1<11+4  ; w0:=process descr addr(master)
    rs. w0  h6.     ;
    rl  w3  8       ; base of controller table
    al  w3  x3+a50+2; +rel addr(level21)
    rs. w1  h1.     ;
i0: al  w2  0       ;
    jd      1<11+24 ; wait event
    jd.     2       ; set interrupt level=6
    sn  w0  18      ; if interrupt from hc8000 then
    jl.     i4.     ; goto i4 else
    se  w0  0       ; if not message then
    jl.     i8.     ; goto i8
    rs. w2  h2.     ; else save buf addr
    ;; ************************************************************
    ;
    ;          start moving a buffer from rh8000 to hc8000
    ;
    ;; ************************************************************
    al  w3  a49     ; w3:=buffer length
    al  w0  x2+a40  ; w0:= first addr of buff
    ds. w0  (h1.)   ; set(byte,addr)
    jl. w3  b0.     ; send output request to hc8000
    jl.     i7.     ; if buserror then goto result 2
    al  w0  20      ; else
    jl. w3  b2.     ; goto wait ext interrupt(level20)
    rl. w2  h2.     ; w2=buffer addr
    bz  w0  x2+a8   ; w0:=op
    sn  w0  3       ; if op=input then
    jl.     i1.     ; goto i1
    se  w0  5       ; else if op<>output then
    jl.     i9.     ; goto return buffer
    ;; ************************************************************
    ;         start output to hc8000
    ;; ************************************************************
    rl  w3  x2+a12  ; last addr
    ws  w3  x2+a10  ; w3:=last addr-first addr
    al  w3  x3+2    ;+2
    al  w0  x2+a10  ; w0:=first addr
    ds. w0  (h1.)   ;
    jl. w3  b0.     ; send output request
    jl.     i7.     ; if buserror then goto result 2
    al  w0  20      ; wait
    jl. w3  b2.     ;
    jl.     i9.     ; goto return buffer
    ;; ************************************************************
    ;          start input from hc8000
    ;; ************************************************************
i1:                 ;
    al  w0  18      ;
    jl. w3  b2.     ; wait for output request from hc8000
    rl  w3  x2+a12  ; last addr
    ws  w3  x2+a10  ; w3:=last addr-first addr
    al  w3  x3+2    ;+2
    al  w0  x2+a10  ; w0:=first addr
    ds. w0  (h1.)   ;
    jl. w3  b1.     ; send input request
    jl.     i7.     ; if buserror then goto i7
    al  w0  16      ; wait
    jl. w3  b2.     ;
    jl.     i9.     ; goto return buffer
    ;; ************************************************************
    ;
    ;          start moving af buffer from hc8000 to rh8000
    ;
    ;; ************************************************************

i4: al. w3  h11.    ; buff addr
    al  w0  a49     ; buff length
    ds. w3  (h1.)   ; to controller table
    jl. w3  b1.     ; input request
    jl.     i2.     ; if buserror then goto i2
    al  w0  16      ;
    jl. w3  b2.     ; wait interrupt 16
    al. w2  h11.    ;
    al  w2  x2-a40  ;
    bz  w0  x2+a8   ; w0:=op
    sn  w0  3       ; if op=input then
    jl.     i5.     ; goto i5 (start input  rh --> hc)
    se  w0  5       ; else if not output then
    jl.     i6.     ; goto i6 (send message to masterproc)
    ;; ************************************************************
    ;          start output to hc8000
    ;; ************************************************************
    rl  w0  x2+a14  ; w0:=first addr(rh8000)
    rl  w3  x2+a12  ;
    ws  w3  x2+a10  ;
    al  w3  x3+2    ; w3:=last addr- first addr+2
    ds. w0  (h1.)   ; byte,addr to controller table
    jl. w3  b1.     ; input request
    jl.     i2.     ; if buserror then goto i2
    al  w0  16      ;
    jl. w3  b2.     ; wait interrupt 16;
    jl.     i0.     ; goto wait
    ;; ************************************************************
    ;          start input from hc8000 to rh8000
    ;; ************************************************************
i5:                 ;
    rl  w0  x2+a14  ; w0:=first addr(rh8000)
    rl  w3  x2+a12  ; w3:=
    ws  w3  x2+a10  ; last addr - first addr +2
    al  w3  x3+2    ;
    ds. w0  (h1.)   ; byte,addr to controller table
    jl. w3  b0.     ; start output to hc8000
    jl.     i2.     ; if buserror then goto i2
    al  w0  20      ;
    jl. w3  b2.     ; wait ext. int. 20
    jl.     i0.     ; goto wait
    ;; ************************************************************
    ;          message buffer
    ;          move buffer to master proc
    ;; ************************************************************

i6:                 ;
    al. w1  h12.    ; mess addr
    al. w3  h13.    ; name addr
    jd      1<11+16 ; catch buff
    al. w1  h11.    ; buff addr(hc)
    al  w2  x2+a40  ; buff addr(rh)
    al  w0  a49     ; buffer length
    wa  w0  2       ;  w0:= last addr
i3: rl  w3  x1      ;
    rs  w3  x2      ; move buff hc--->rh
    al  w1  x1+2    ;
    al  w2  x2+2    ;
    sh  w1  (0)     ;
    jl.     i3.     ;
    al  w2  x2-a50  ;
    jl.     i13.    ; goto move buff
    ;; ************************************************************
    ;          send aswer and/or move buffer
    ;; ************************************************************
i2:
    jl.     i0.     ; goto wait

i7: rl. w2  h2.     ; w2:=buf
    rl  w1  x2+a4   ; w1:=receiver
    se. w1  (h7.)   ; if receiver<>this proc then
    jl.     i10.    ; goto i10
i8: jd      1<11+26 ; get event
    al  w0  2       ; result=2 (rejected)
    al. w1  h9.     ; mess addr
    jd      1<11+22 ; send message
    jl.     i12.    ; goto i12
i9: am      3       ; result=1 (command is sended)

i10:am       1      ; set result 2
i11:al  w0   1      ; set result 1
    rs  w0  x2+a40  ; set result
i13:al. w3  h10.    ;
    jd      1<11+34 ; move buf to master proc
i12:al  w0  0       ;
    rs. w0  h2.     ; clear buffer addr
    jl.     i0.     ; goto wait

h1: 0               ; controller table addr(level(21))
h2: 0               ; buffer addr
h7: 0               ; own proc descr addr
h9: 0,r.8           ; message
h6: 0,0             ;
h10:<:masterproc:>,0,0;
h11:0,r.(:a49>1 +2:);
h12:0,r.8           ; pseudo message
h13:0,r.5           ; pseudo name
                    ;
    ;; ************************************************************
    ;
    ;
    ; send output request to hc8000
b.  f5,g5 w.        ;
b0:                 ;
    rs. w3  g3.     ; save return
    al  w3  0       ;
    rs. w3  g1.     ; reset counter
f0: do. w3  (g0.)   ; send output request to hc8000
    sx      2.111   ; if buserror then
    jl.     f2.     ; goto f2 else
    jl.     f3.     ; goto f3
f2: rl. w0  g1.     ; w0:=counter
    ba. w0  1       ; counter:=counter+1;
    rs. w0  g1.     ; save counter
    sh  w0  a48     ; if counter<=max number of buserrors then
    jl.     f0.     ; repeat data out
    rl. w3  g3.     ; else return+0
    jl      x3+0    ;
f3: rl. w3  g3.     ; return+2
    jl      x3+2    ;
g0: 1<23 + a50 +2.001;
g1: 0               ;
g3: 0               ; return addr
e.                  ;
                    ;
    ;; ************************************************************
    ;
    ;
    ; send input request to hc8000
b.  f5,g5 w.        ;
b1:                 ;
    rs. w3  g3.     ; save return
    al  w3  0       ;
    rs. w3  g1.     ; reset counter
f0: di. w3  (g0.)   ; send input request to hc8000
    sx      2.111   ; if buserror then
    jl.     f2.     ; goto f2 else
    jl.     f3.     ; goto f3
f2: rl. w0  g1.     ; w0:=counter
    ba. w0  1       ; counter:=counter+1;
    rs. w0  g1.     ; save counter
    sh  w0  a48     ; if counter<=max number of buserrors then
    jl.     f0.     ; repeat data out
    rl. w3  g3.     ; else return+0
    jl      x3+0    ;
f3: sh  w0  -1      ; if message then
    jl.     b4.     ; goto test for autoload
    rl. w3  g3.     ; return+2
    jl      x3+2    ;
g0: 1<23 + a50 +2.001;
g1: 0               ;
g3: 0               ; return addr
e.                  ;
                    ;
    ;; ************************************************************
    ;
    ;
    ;
    ;  wait external interrupt
    ;
b.  f5,g5 w.        ;
b2:                 ;
    ds. w1  g1.     ;
    ds. w3  g3.     ;
    al. w2  g5.     ; wait buffer addr
f0: jd      1<11+116; wait ext. interrrupt
    se. w0  (g0.)   ;
    jl.     f0.     ;
    dl. w1  g1.     ;
    dl. w3  g3.     ;
    jd      x3      ; return
g0: 0               ;
g1: 0               ;
g2: 0               ;
g3: 0               ;
g5: 0,r.4           ; wait buff
e.                  ;
;; ***********************************************************
;
;
; test buffer
; test first.buff and last.buff in case of input buffer
; call: w2=buffer addr
; return 1 if first or last is not within proc
; return 2 else
; return: w0,w2  unchanged, w3 return addr, w1 proc addr
b. f5,g5 w.
b3:
     ds. w0  g0.    ;
     bz  w0  x2+a8  ;
     se  w0  3      ; if not input buffer then
     jl.     f0.    ; return
     rl  w1  x2+a6  ; w1:=sender 
     dl  w0  x2+a12 ; w3,w0:=first,last addr
     ba. w0  1      ;
     sl  w3  x1+24  ; if first.buf<first.proc or
     sl  w0  x1+22  ; last.buf >= last.proc then
     am      2      ; return 2
     al  w3  2      ; else return 1
f0:  rl. w0  g0.    ;
     wa. w3  g3.    ;
     jl      x3     ;
g3:0
g0:0
e.
;
;
b. f10,g10 w.
b4:
    al. w1  g0.          ;
    al. w3  g1.          ;
    jd      1<11+42      ; lookup(<:kkmon8004:>)
    se  w0  0            ; if not found then
    jl.     h5.          ; goto h5
    rl. w1  h7.          ; w1:=own process desc addr
    rl  w2  x1+24        ; w2:=last byte
    al. w1  h20.         ; first byte
    rs. w1  g3.          ;
    ws  w2  2            ; w2:=buffer length
    ls  w2  -9           ; in segments
    rs. w2  g9.          ;
    rl. w1  g0.          ; w:=monitor length
    al  w0  0            ;
    wd  w1  4            ; w1:=number af shares
    se  w0  0            ;
    al  w1  x1+1         ; round
    rs. w1  g6.          ;
    al. w1  g6.          ;
    al  w0  2            ;
    ds. w1  (h0.)        ; set(byte,addr)
    jl. w3  b0.          ; send output request to HC8000
    jl.     h5.          ; if buserror then goto h5
    al  w0  20           ;
    jl. w3  b2.          ; wait for channel output finis
    al. w1  h20.         ;
    rl. w0  g9.          ; w0:=share length
    ls  w0  9            ; in halfwords
    ds. w1  (h0.)        ; set(byte,addr)
    al. w3  g1.          ;
    jd      1<11+52      ;
    jd      1<11+8       ; create and reserve(<:kkmon8004:>)
    se  w0  0            ; if error then
    jl.     h5.          ; goto h5
h1: al. w3  g1.          ;
    al. w1  g2.          ;
    jd      1<11+16      ; input next share
    al. w1  g8.          ;
    jd      1<11+18      ;  wait for input finis
    se  w0  1            ; if error then
    jl.     h5.          ; goto h5
    jl. w3  b0.          ; send output request
    jl.     h5.          ; if buserror then
    al  w0  20           ; else wait
    jl. w3  b2.          ; for output finis
    rl. w3  g3.          ;
    wa. w3  g9.          ;
    rs. w3  g3.          ; count segments
    sl. w3 (g0.)         ; if no more then
    jl.     h3.          ; goto stop
    jl.     h1.          ; else start input
h3: al. w3  g1.          ;
    jl.     h6.          ; goto remove process
h5: al. w3  g1.          ;
    jd      1<11+4       ; if process exist then
    se  w0  0            ;
h6: jd      1<11+64      ; remove process
    jl.     i0.          ; goto wait
g0: 0,r.10               ; tail
g1: <:kkmon8004:>,0,0
g2: 3<12 + 0             ; input message
g3: 0                    ; first addr
g4: 0                    ; last addr
g5: 0,r.5                ; segment
g6: 0                    ; number of shares
g7: 1<23                 ; message
g8: 0,r.8                ;
g9: 0                    ; share length
e.
h20:                ; buffer start addr
e.                  ;

    g2=k            ;
g1:                 ;
g0: 1               ; size
    0,r.4           ; name
    s2              ; clock
    0               ; file
    0               ; block
    3<12+0          ; contents
    g2              ; size

d.                  ;
p.  <:fpnames:>     ;
p.  <:insertproc:>  ;
▶EOF◀