|
|
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: 6912 (0x1b00)
Types: TextFile
Names: »kkauto«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
└─⟦4334b4c0b⟧
└─⟦this⟧ »kkauto«
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◀