|
|
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: 18432 (0x4800)
Types: TextFile
Names: »trhtst5«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
└─⟦4334b4c0b⟧
└─⟦this⟧ »trhtst5«
s. a50,b121,c35,d120,f120,i25,h20,p5 w.
;
k= 0 ;
jl. b120. ; goto start.
a1: 0 ; saved interupt register.
; 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.
b30: 0 ; 1. static definition
0
0
0
0
; process definition addrs.
b10: 0
0
0
0
0
0
0
0 ; 1. reg dump addrs
b31: 0
0
0
0
0 ; 2. process definition reg. addrs.
b11: 0
0
0
0
0
0
0
0 ; 2. reg dump addrs
b32: 0
0
0
0
0 ; 3. proces definition regisster addrs.
b12: 0
0
0
0
0
0
0
0 ; 3. reg dump addrs
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
0
0
0
0
0
0
0 ; 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
0
0
0
0
0 ; 1. sys tab entry
b21: 0
0
0
0
0
0 ; 2. sys tab entry
; system table error entry.
b22: 0
0
0
0
0
0 ; 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: 0,0 ; monitor process interupt limit.
d14: 256,256 ; user process interupt limit
w.
d11: 1<23+0 ; 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.
-1,r.6 ; make roome for 6 more process.
d20: ; data out channel start.
; w0 = address of buffer.
; w3 = no af half words to be transferred.
;
; device no is 22 is used.
; device 22 is part of the rh device number.
al w2 22 ; 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 current 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+22<3+2.001 ; effective address for start
; of channel data in as device 22.
d23: 0 ; current buffer address.
d25: -222222 ; retrun word from data out.
d30: ; data in channel start.
; w0 = address of buffer
; w3 = no of half words transferred ( not used).
;
; device no 21 is used.
; device 21 is part of the rh device number.
rl. w2 b116.
al w2 x2-2
rs. w2 b116. ; decrease input interupt counter.
rl. w2 b112. ;
al w2 x2+2 ; set flag indicating data in
rs. w2 b112. ; channel operation in progress.
al w2 21 ; 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 w3 x2-2 ;
al w1 1 ; state channel data input.
rs w1 x3 ; save buffer state.
di. w2 (d31. ; data in channel start.
rs. w2 d35. ; save word.
jl. i2. ; goto start next process.
d31: 1<23+21<3+2.001 ; effective address for start
; of channel data out as device 6.
d33: -2
d35: -2
d36: -2 ; interupt cause.
d37: -2 ; instr counter at interupt.
jl. 0
b40: ; monitor call addrs.
jl. x2+f120. ; switch to function.
f120: jl. i10. ; monitor 0 goto init.
jl. i2. ; swop process.
jl. i13. ; wrong entry.
jl. i14. ; entry 1 < 11 + 3 can not be used.
jl. d20. ; data out channel start.
jl. d30. ; data in channel start.
b. c20 w. ; interupt handlimg 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 = charekter device interupt ( not in rh8000).
rs. w2 d36. ; save interupt cause no.
rs. w1 d37. ; save instr at interupt.
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
gg w2 66 ; wait for next interupt from rc8000.
jl. i15. ; then same process.
c0: ; interupt data out channel stop.
rl. w2 b117. ; clear flag data out in progress.
al w2 x2-2 ;
rs. w2 b117. ;
rl. w2 d23. ; get buffer address.
al w2 x2-2 ; calculate state address.
al w1 4 ; save state indicating
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. ;
al w1 x1-2 ; clear flag indicating data in
rs. w1 b112. ; channel operation 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.
e. ; end interupt handling.
b42: ; exeption address.
jl. i16.
b43: ; escape address.
i10:
i13:
i14:
i3:
i16:
i17:
jl. i17.
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. w0 b100. ; get addrs of low lim.
rs w0 x1+4 ; save lower limit.
al. w0 b101. ; get upper limit.
rs 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. w0 b110. ; get lower limit.
rs w0 x1+4 ; save lower limit.
al. w0 b111. ; get upper limit.
rs 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.
rs w0 x2+10 ; save start addrs ( ic.)
; set user proc in monitor mode.
rl. w0 d12. ; get status reg contents for monitor mode.
rs w0 x2+8 ; 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.
rs w0 x2+10 ; save start addrs.
; set user proc in monitor mode.
rl. w0 d12. ; get status register contents
; for monitor mode.
rs w0 x2+8 ; 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 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.
b121:al. w2 b20.+5 ; get addrs of 1 monitor sys tab.
; process in b110.
al. w3 b22.+5 ; get addrs of 2. monitor sys tab.
; process in b100.
rs. w2 b68.-2 ; current
rs. w3 b68. ; save addrs of next.
; after return from interupt next is current.
; i.e. b100 is started first.
gp w2 26 ; init of information reg.
; no init of timer in rh8000
;jl. w2 i0. ; call subroutine init of timer
; al w2 2
; jl. b40. ; start first process.
jd 1<11+2 ; start
; interupt and monitor call service.
b. a10 w. ; block start process.
i20: ; start process in b110.
al. w2 b20.+5 ; get address system table in b110
al. w3 b22.+5 ; get address of system table in b100
rs. w2 b66.
rs. w3 b68.
i15: ;
rl. w3 b66. ; get address of current.
gp w3 26 ; init information with address
; of current system table.
ri -10 ; return from interupt with same current.
i2: ; monitor call service.
; delay current process.
; start next process.
al. w1 b68. ; w1 := address of next.
; (x1-2) := addressof current.
dl w3 x1 ; get addrs of current and next.
a1: sh w3 8 ; if next = empty then
jl. a0. ; goto save current and start
rs w3 x1-2 ; current := next.
al w1 x1+2 ; get next process.
rl w3 x1 ; get next.
jl. a1. ; goto select next.
a0: ds w3 x1 ; save current and stop.
jl. i15. ; goto start current.
e. ; end block select process to run
b90: jl. 0 ; cpa
b. c10 w.
b100: ; channel input process.
rl. w2 b118.
al w2 x2+2
rs. w2 b118. ; increase activating counter.
rl. w0 b112. ; if data in channel operation
se w0 0 ; allready in progress then
jl. c0. ; goto next process.
rl. w0 b116. ; if no input interupt waiting
sn w0 0 ; then goto
jl. c0. ; call nextprocess.
al. w2 b114. ; else get address of first buffer.
rl w1 x2-2 ; get buffer state
sn w1 4 ; if buffer state = data out channel finis
jl. c1. ; then goto service.
al. w2 b115. ; else get address of second buffer.
rl w1 x2-2 ; get buffer state.
sn w1 4 ; if buffer state = data out channel finis
jl. c1. ; then goto service.
c0: jd 1<11+2 ; else next process.
jl. b100.; goto start input buffer.
c1: ; input buffer service.
rl w0 4 ; get buffer address.
al w3 128 ; get nof of half words in buffer.
jd 1<11+10 ; start input buffer process.
jl. b100. ; goto start of inpu process.
b110: ; output channel process.
rl. w2 b119. ;
al w2 x2+2
rs. w2 b119. ; increase activating counter.
rl. w1 b117. ; if data out in progress
se w1 0 ; then goto
jl. c3. ; call next process.
al. w2 b114. ; get address of first data buffer.
rl w1 x2-2 ; get buffer state
sn w1 3 ; if buffer state = data out finis
jl. c4. ; then goto output service.
al. w2 b115.; get address of second buffer.
rl w1 x2-2 ; get buffer state.
sn w1 3 ; if buffer state = data out finis then
jl. c4. ; goto data out service.
c3: ; no buffer or output in progress.
jd 1<11+2 ; call next process.
jl. b110. ; goto start or output process.
c4: ; data out service.
rl w0 4 ; w0 = buffer address.
al w3 x2+126; get address of last buffer.
al w2 x2+64; get address of second half of buffer.
rl w1 x2 ; get 1. word of 2. half of buffer.
c5: al w1 x1-1 ; decrease data word.
rs w1 x2 ; saev data word.
al w2 x2+2 ; increase buffer pointer.
se w2 x3 ; if not end of buffer then
jl. c5. ; repeat in c5.
al w3 128 ; else get no of half words.
jd 1<11+8 ; call monitor start out process.
jl. b110.; goto start of output process.
b118: 0
b119: 0 ; activating times.
b116: 0 ; input channel interupt status,
; 0 = idle , >0 = interupt pending.
b117: 0 ; output channel status. 0 = idle, 0> data out in progress.
b112: 0 ; input channel status. 0 = idle, 0> data in channel
; in progress.
7777 ; buffer state 1 state.
b115:
0,r.64 ; channel buffer 2.
4 ; channel buffer 2 state.
; ( initial state after output is simulated).
b114:
c2: 0,r.64 ; channel buffer 2.
b101:
b111: jl. 0 ; end of 2. and first user program.
e.
0,r.(:2048-k:)>1
e.
▶EOF◀