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

⟦4251235fa⟧ TextFile

    Length: 7680 (0x1e00)
    Types: TextFile
    Names: »lmitxt030«

Derivation

└─⟦2c55ea56f⟧ Bits:30001844 SW-save af projekt 1000, Alarm-system
    └─⟦093e2ad1c⟧ 
        └─⟦this⟧ »lmitxt030« 

TextFile

;;
;; 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◀