|
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: 7680 (0x1e00) Types: TextFile Names: »lmitxt030«
└─⟦2c55ea56f⟧ Bits:30001844 SW-save af projekt 1000, Alarm-system └─⟦093e2ad1c⟧ └─⟦this⟧ »lmitxt030«
;; ;; begin lmitxt030 ;; ;; input/output block instructions ;; ;; the i/o block instructions are highly integrated into fetch. ;; once these instructions are executed, they will dump the ;; registerset of the corresponding level. thereafter they will ;; set up pointers, counters, a.s.o. in the register set. they ;; will further set an indication in rd2 telling that the ;; registerset is in block i/o mode. ultimately reg and lev ;; will be changed to point to the registerset of level 0. when ;; a registerset is performing block input/output, then reg and ;; lev must never point to that registerset. ;; ;; each time an interrupt arrives for a registerset performing ;; input/output, fetch will recognize the indication in rd2. ;; fetch will thereafter set up pointers, counters, a.s.o. in ;; the slice registers. thereafter it will clear the interrupt ;; and jump (by "jmap not 8") to the secondary part of the i/o ;; block instruction. this part will perform the input/output ;; and terminate by jumping to fetch. lev and reg will not be ;; changed. when, however, the block input/output is finished, ;; then the registerset will be loaded; lev and reg will be ;; updated, and the registerset will thereafter be working in ;; normal (i.e. not block i/o) mode. ;; ;; if a driver is stopped during block i/o mode, then the ;; registerset will not be dumped, but the i/o block transfer ;; will be stopped. if the monitor later sets the time-out bit ;; in the dumped registerset and starts the driver, it will ;; repeat the i/o block instruction, which in turn will terminate ;; because of time-out. unless the parameters to the block ;; instruction have been modified by the monitor, the i/o block ;; instruction will tell that no data has been input/output. .p ; ;; usage of the register set and the slice registers during ;; block i/o mode: ;; ;; zd0 top=last+1 ;; zd1=zdw ps ;; zd2=zdx process base ;; w1= zd3=zd next address.disp - 1 ;; w2= rd0 next address.base ;; rd1=rdw process disp ;; rd2=rdx 83xx, where xx=instruction code (which is <= 7f ) ;; w5= rd3=rd count ;; ;; w0= level = device no ;; w3=0 intended for the data to be output ;; w4=0 intended for the function code ;; w6= int for this register set ;; w7= the register address ; ;; the above slice registers have been defined, when fetch performs ;; "jmap not 8". furthermore the following holds: ;; bf = level ior 200 ;; the interrupt has been cleared. .p ; ;; common entry into the block i/o instructions: ; initiob: ; reg-7,s, ; q:=ioblev0e,, ; w7:=w0,,cjp zro xept ; exception if level=0 w0:=2,, ; ,,cjs clearbits ; clear eoi ,,cjs dumpregs ; w7:=w7 and 7f,, ; 83,,, ; w7 := 83xx, where xx=instr code w7:=w7 ior swp,,cjs readlucq; rd2:=w7,, ; 83xx zd:=q--,,cjs readlucq ; zd := disp-1 rd0:=q,, ; rd0 := base ,,cjs readlucq ; rd:=q,,cjs readlucq ; rd := count zd0:=q,, ; zd0 := top ra:=reg:=7,, ; set reg and lev to level0 lev:=swp,,cjp sfetch ; .p ; ;; from block i/o mode back to normal mode: ; iobeoi1: ; w5:=w5++,h , ; count:=count+1 iobeoi: ; q:=zdw,h ,cjs not st3 seteoi1; if eoi then ps.eoi:=1 c:w0--w0,s,cjp iobeoi2 ; cry:=false; b15:=true; iobfin: ; rdx,c:w0--w0,s, ; cry:=false; b15:=odd(instr code) iobxept: ;; from iorbw/iowbw with cry=true; b15=true; iobeoi2: ; ,,cjs b15 setlint ; if b15 then setinterrupt(w0); ; iobto: ;; from fetch with cry=false in case of time out w3:=zd0-w5,, ; w3 := top - count reg:=w7,, ; update reg and lev lev:=w6,, ; w5:=rdw,, ; w5:=w5+dumplm,, ; w6:=zdx,,cjs cread1 ; zd0:=w1,, ; zd0:=maxstack w5:=w5+4,, ; spb:=w6,,cjs cread21 ; spb:=fprocess base slu:=w2-8,, ; slu:=old lastused - 8 rd0:=w1,, ; rd0 := local frame w5:=w5+4,, ; ,,cjs cread21 ; rd2:=sib:=w2,, ; rd2 := sib := instruction counter base rd:=w1,sic:=w1++,,cjp not cry wrfetch; sic := old instruction counter disp + 1 ;; exception: slu:=slu+8,, ; reset rd q:=ioibxe1,, ; zd:=slu,,cjp xept ; exception(ioibxe1) .p ; ;; the block i/o part of the block input/output instructions: ; .instruction iorbb , initiob ; .instruction iorbbc , initiob ; ,h ,cjs xmitword1 ; zd:=w1++,h ,cjs waitrec ; update next addr.disp w3:=bd,h w ,cjp not zro iobeoi; jump if eoi or hard-to ir:=rdx,w5:=w5--,s,cjs writebnext; sync itr; count:=count-1; write the byte iorbb1: ;; from iowbb rd:=w5,,cjp zro iobfin ; update count; jump if count=0 ra:=reg,,cjp fetch ; reset ra; goto fetch ; .instruction iowbb , initiob ; .instruction iowbbc , initiob ; w4:=40,, ; ir:=rdx,,,cjs readb21next ; sync itr bf:=w0,h ,cjs xmitword1 ; select io module zd:=w1,w5:=w5--,s,cjp st3 iorbb1; update addr.disp; count:=count-1; ; jump to iorbb1 if no eoi w5:=w5++,,cjp iobeoi ; count:=count+1; goto iobeoi .p ; .instruction iorbw , initiob ; .instruction iorbwc , initiob ; c:=1,w5:=w5--,s, ; count:=count-1; cry:=b15:=true; ,,cjp zro iobxept ; exception if count was one ir:=rdx,,h ,cjs xmitword1 ; sync itr ,h ,cjs waitrec ; w3:=bd,h w ,cjp not zro iobeoi1; jump if eoi or hard-to rd:=w5:=w5--,,cjs writenext; rd:=count:=count-1 iorbw2: ;; from iowbw w5 and 7fe,s, ; zd:=w1,,cjp zro iobfin ; zd:=nextaddr.disp; jump if count <= 1 ra:=reg,,cjp fetch ; reset reg; goto fetch ; .instruction iowbw , initiob ; .instruction iowbwc , initiob ; c:=1,w5:=w5--,s, ; count:=count-1; cry:=b15:=true; ir:=rdx,w1:=w1++,,cjp zro iobxept; sync itr; disp:=disp+1; exception if count was one rd:=w5:=w5--,,cjs reado12 ; rd:=count:=count-1 w4:=40,, ; function code bf:=w0,w3:=q,h ,cjs xmitword1; zd:=w1:=w1++,h ,cjp st3 iorbw2; zd:=disp:=disp+1; jump if eoi w5:=w5++,h ,cjp iobeoi1 ; count:=count+1; goto iobeoi1 .p ; ;; ;; end of lmitxt030 ;; .p ; ▶EOF◀