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

⟦6b02440eb⟧ TextFile

    Length: 6912 (0x1b00)
    Types: TextFile
    Names: »kkauto«

Derivation

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

TextFile

s. a50,i25,h20,p5 w.


; autoload program for hc8000
;
;                   communication between
;      rh8000                 and              hc8000
; 1    send autoload command  -->
; 2                                            initialisize and
; 3                           <--              send hresponse(addr1)
; 4    send hmess(addr2)      -->
; 5                           -->              input(addr2,addr2+32)
; 6    input monitorcode
;      to buf1 and buf2
; 7    (addr2):=1
; 8                           -->              if (addr)<>0 then
;                                              input(buf(addr2))
; 9                                            (addr1):=(addr2)
;10    if (addr1)<>0 then     <--
;11    if (addr1)=1 then
;12    input monitorcode to buf1
;13    and (addr2):=2 else
;14    input monitorcode to buf2
;15    (addr2):=1
;16                           -->              while (addr2)=0 goto 16
;17                                            if (addr)<3 then goto 8
;18                                            start monitor
;
;    addr2-->info block
;            *------------------*
; a20:       !   comm reg(rh)   !
; a21:       !   comm reg(rc)   !
; a22:       !  monitor length  !
;            !   not used       !
;            *------------------*
; a25:       !        0         !
;            !  length(buf1)    !
;            !  addr(buf1)      !
;            !        0         !
;            *------------------*
; a26:       !        0         !
;            !  length(buf2)    !
;            !  addr(buf2)      !
;            !        0         !
;            *------------------*
;
a0= 20      ; interrupt level for rh8000
a1=  0      ; dev no for rh8000
a2=100      ; hmess stack start addr
;
;             dma record format
a10= 0      ; device no
a12= 2      ; halfwords to transfer
a14= 4      ; first addres (other computer)
a16= 6      ; first address (this computer)
a20=10      ; comm reg(rh)  addr2
a21=12      ; comm reg(rc)  addr1
a22=14      ; addr of monitor length

;  dma records    abs addresses         used to
a25=20      ;   20-26                  buf1
a26=28      ;   28-34                  buf2
a27=34      ; last off inf block

a30= 51     ; inf reg
a31= 80     ; reg dump addr
a40=256     ; first input addr
;   entry from rh8000
     al. w0     i20.   ; w0:=interrupt table addr
     rs  w0     8      ; set interrupt table addr
     al  w1     a2     ; first addr of hmess stack
     al  w2  x1+4      ; last addr of hmess stack
     ds  w2  x1+2      ; init hmess record
     al  w2     2      ; stack length (words)
     al  w3     0      ;
     ds  w3  x1+6      ;
     ls  w1     3      ;
     lo. w1     h0.    ; w1:=dev addr
     di      x1        ; reset hmess stack
;
; init. inf reg and system table
;
     al  w3     a30    ;
     rl. w2     h3.    ; mode
     al  w1     a31    ; w1:=reg dump addr
     ds  w2  x3+1      ;
     al. w1     i0.    ; mon call addr
     al  w2     0      ;
     ds  w2  x3-3      ;
     al  w1     0      ;
     ds  w2  x3+5      ; exc. and esc. address
     gp  w3     26     ; inf-reg:=a30
     rs  w1     a21    ; clear comm-reg
     jd         1<11   ; start
i0:  rl. w1     h5.    ;
     do. w1    (h4.)   ; send hresponse(addr1)
     jl.        0      ; wait
;
; interrupt: hmess arrived
;
i21: rl. w1     h1.    ;
     di  w2  x1        ; w2:=addr(next hmess record)
     sx         2.111  ; if buserror then
     jl.        p0.    ; send hresponse(error)
     bz  w0  x2+1      ; w0:=sender
     se  w0     a1     ; if not rh8000 then
     jl.        p0.    ; send hresponse(error)
     al  w1     a27-a20; halfwords to be transferred
     ds  w1     a26+a12;
     rl  w0  x2+2      ; address word from hmess
     ls  w0     1      ;
     ls  w0    -4      ; w0:=addr2
     al  w1     a20    ; first addr (this computer)
     ds  w1     a26+a16;
     al  w1     a26    ;
     do. w1    (h2.)   ; input info-block
     sx         2.111  ; if buserror then
     jl.        p0.    ; send hresponse(error)
     al  w1     a40    ; first input addr
     ws  w1     a25+a12; - buffer length
     rs  w1     a26+a16; simulate first addr of last input
     jl.        0      ; wait


i20: 0,r.(:a0-1:)      ;
     i21               ; interrupt addres for hmess interrupt
     i22               ; interrupt address for dma-trans completed


i22:  ; interrupt: dma trans completed
     rs  w0     a21    ; comm-reg:=w0  (=1 for buf1 and 2 for buf2 2)


i4:  rl  w0     a20    ; comm addr
     di. w0    (h7.)   ; w0:=comm inf
     sx         2.111  ; if busserror then
     jl.        p0.    ; send hresponse(error)
     sn  w0     0      ; if wait then
     jl.        i4.    ; goto i4
     al  w1     0      ;
     rs  w1     a21    ; clear own comm reg
     se  w0     1      ; if not input to buf1 then
     jl.        i7.    ; goto i7
     rl  w2     a26+a16; w2:=first address(buff2)
     wa  w2     a25+a12;     +buffer length
     rs  w2     a25+a16; first address(buff1):=w2
     al  w2     a25    ;
     do. w2     (h2.)  ; input from buff1(rh8000)
     sx         2.111  ; if buserror then
     jl.        p0.    ; send hresponse(error)
     jl.        0      ; goto wait
;
i7:  se  w0     2      ; if not input from buff2 then
     jl.        i9.    ; goto i9
     rl  w2     a25+a16; w2:=first address(buf1)
     wa  w2     a26+a12;     +length(buf2)
     rs  w2     a26+a16; first address(buf2):=w2
     al  w2     a26    ;
     do. w2     (h2.)  ; input from buf2
     sx         2.111  ; if buserror then
     jl.        p0.    ; send hresponse(error)
     jl.        0      ; wait

i9:  al  w3     10     ;
     al  w2     a40    ; first of monitorcode
i10: dl  w1  x2        ; move monitor code
     ds  w1  x3        ;
     al  w2  x2+4      ; count
     al  w3  x3+4      ;
     sh  w2     (a22)  ; if more to move then
     jl.        i10.   ; goto i10
     jl         8      ; else start monitor

p0:  rl. w1     h6.    ; hresponse(error)
     do. w1    (h4.)   ; send hresponse
     jl.        0      ; wait


h0:  1<23 +0<3 + 2.011 ;reset hmess stack
h1:  1<23 +0<3 + 2.001 ;next from hmess stack
h2:  1<23+a1<3 + 2.001 ;start dma trans
h3 :  1<23             ;monitor mode
h4:  1<23+a1<3 + 2.101 ;hmess to rh8000
h5:  1<23+a21<3+ 2.010 ;hresponse
h6:  1<23 +0<3 + 2.000 ;hresponse errror
h7:  1<23+a1<3 + 2.101 ;read in rh8000
e.
▶EOF◀