DataMuseum.dk

Presents historical artifacts from the history of:

RC3500

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC3500

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦b20c2e3ae⟧ TextFileVerbose

    Length: 16128 (0x3f00)
    Types: TextFileVerbose
    Names: »lmitxt078«

Derivation

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

TextFileVerbose

;;
;; lmitxt078, set instructions
;;
                              ;
                              ;
;; all the set instructions, except setcr, share a common
;; code part, which takes care of:
;;   1. calculation of the address and length of the setoperand2
;;   2. calculation of the address and length of the setoperand1
;;   3. fetch of the next words from the setoperands
;;   4. finishing of the setinstructions
                              ;
;; the setinstructions are interruptable by higher priority
;; interrupts. if a setinstruction is interrupted, then the
;; internal variables are stored on top of the stack, and
;; the bit "resume instruction" in the registerset is set
;; equal to one. when resuming an interrupted setinstruction
;; the above mentioned point 1 and 2 are replaced by fetching
;; the internal variables.
                              ;
;; after execution of point 1 and 2 it is checked that the
;; lengths are even. at that time a preliminary
;; lastused is also calculated, and it should be tested that
;; there is room enough in the stack. this preliminary lastused
;; will not be changed during the execution of the setinstruction,
;; and it will be high enough, so that the internal variables
;; can be stored in the stack without increasing this lastused.
;; the final lastused will be calculated, when the setinstruction
;; is finished.
.p                            ;
;; parameters and result of the setinstructions:
;;
;; setun, setin, setdi:
;;        entry:    set1, length1, set2, length2
;;        exit:     resultingset, resultinglength
;;
;; seteq, setsb, setsp:
;;        entry:    set1, length1, set2, length2
;;        exit:     boolean
;;
;; setst:
;;        entry:    address1, set2, length2
;;        exit:
;;
;; setre:
;;        entry:    address2, length2
;;        exit:     set2, length2
;;
;; revsm:
;;        entry:    address2, length2
;;        exit:     set2
;;
;; setad:
;;        entry:    set2, length2, newlength
;;        exit:     resultingset, newlength
;;
;; setcr:
;;        entry:    from, to
;;        exit:     resultingset, resultinglength
.p                            ;
;; the slice registers are used as follows during execution
;; of the setinstructions:
;;
;;    w0    counter: counts the byteno(incremented by 2) of
;;            the wordno of the set.
;;    w21   address1: current address of the resulting set, and
;;            of setoperand1 in case of dyadic setinstructions
;;            (f. i. setun and seteq)
;;    w3    setop1: the next word of set1, and the next word of
;;            the resulting set.
;;    w4    setop2: the next word of set2.
;;    w65   address2: current addres of setoperand2.
;;        in case of setcr w5 and w6 are used as follows:
;;    w5    from: start of the interval, which defines the set.
;;    w6    to:   end of the interval, which defines the set.
;;    w7    control bits: a bitmask, that controls the microprogram
;;            flow of the setinstruction(for further explanation, see
;;            below).
;;    w10   length1 ( newlength in case of setad, zero if unused)
;;    w11   length2
;; during the above mentioned point1 and 2 the registers w3 and w4
;; are temporaryly used instead of the registers w5 and w6.
.p                            ;
;; description of the control bits:
;;
;; the control bits, which reside in w7 are used by the common code
;; part to control the microprogram flow. the bits are used as
;; follows:
;;
;; part:   1  2  2  2    3  3  4  4    1
;; bit     8  9 10 11   12 13 14 15    7    hex
;;
;; setun:
;; setin:
;; setdi:  .  1  1  .    .  1  1  .    .     66
;;
;; seteq:
;; setsb:
;; setsp:  .  1  1  .    .  1  .  1    .     65
;;
;; revsm:  .  .  .  .    .  .  1  1    1    103
;;
;; setre:  .  .  .  .    .  .  1  .    1    102
;;
;; setst:  .  1  .  .    .  .  .  .    .     40
;;
;; setad:  1  .  .  .    .  .  1  .    .     82
;;
;;
;; setcr:  1  .  .  1    1  .  1  .    1    19a
;;
;; the bits are used in parts 1 thru 4 of the common code part
;; as indicated above.
.p                            ;
;; part 1, calculate the address and length of setoperand2.
                              ;
prepset:                      ;
   q:=10,,                    ;
   zd1 and q,s,               ; zro:=not resume instruction
   w1:=c:slu,,cjp not zro prepset10; c:=0; c,w1 is used to calculate the preliminary lu
                              ; if resume then jump
   q:=zd1 ior q,,             ; resume:=true
   zd1:=q,,                   ;
   w0:=0,,cjs readlucq        ;
   w7,w10:=0,s,               ; length1:=0;
   w11:=q,,cjp not b15 prepset2; jump if not revsm and not setre and not setcr;
   w4:=w11,,cjs readlucq      ;
   w7,w3:=q,s,                ; w4:=w11; w3:=readlucq;
   bus:=w4,s,cjp b0 prepset1  ; jump if setcr
   w3:=w3--,,cjs readlucq     ; w3:=disp2-1
   w1:=c:w1+w11,,cjp b1 nillerr;
   w4:=q,,cjp prepset4        ; w4:=base2
                              ;
prepset1: ;; setcr
;; w3=from, w4=to
   bus:=w3,s,cjp b0 prepset1b ; if to<0 or from>to then
   w3--w4,s,cjp not b0 prepset1a;   length2:= 0 (*empty set*)
   w3:=,,cjp prepset1c        ; else if from<0 then from:= 0;
prepset1a:                    ;
   ,,cjp not acy prepset1c    ;
prepset1b:                    ;
   w11:=,,cjp prepset4        ;
prepset1c:                    ;
   w11:=c:w11+10,,            ; w11:=to+16
   ir:=2,q:=w1-2,,push 2      ; prepare rotate
   c:=7fc,w11:=>w11 and 7fc,,rfct ; length2:= to // 16 * 2 + 2 ;
   w1:=c:w11+q,,cjp prepset4  ; c,w1:=newlu
                              ;
prepset2: ;; setdyadic, setst, setad
   w4:=slb,,cjp not b0 prepset3; base2:=slb; jump if not setad
   w10:=w11,,cjs readlucq     ; length1:=newlength
   w2:=w10-q,s,               ; length2:=readlucq ; acy:=newlength >= length2
   w11:=q,,cjp not acy prepset3; jump if not newlength >= length2
   w1:=w1+w2,,                ; increment preliminary lu
                              ;
prepset3:                     ;
   slu:=slu-w11,,             ; skip over set2
   w3:=slu,,                  ; disp2:= the beginning of set2
.p                            ;
;; part 2, calculation of the address and length of setoperand1
                              ;
prepset4: ;; read the second operand
;; c,w1 + setworklen = preliminary lu
;; w7= control bits
;; w10=if setad then newlength else 0
;; w43=if setcr then (to,from) else address2
;; w11=length2
;; w0=0
                              ;
;; stack overflow is tested now
   ,,cjp cry stackerror       ; overflow into next memory module
   q:=w1+setworklen,s,        ; q:=preliminary lu
   ,,cjp acy stackerror       ; overflow into next memory module
   zd0-q,s,                   ;
   w7:=w7+w7,s,cjp not acy stackerror; overflow if not lm>=preliminary lu
                              ; set preliminary lu
   zd:=q,,cjp b0 prepset6     ; jump if setdyadic or setst
                              ;
prepset5:                     ;
   w2:=slb,,                  ; address1:=lastused
   w1:=slu,,cjp prepset8      ; 
                              ;
prepset6: ;; setdyadic or setst
   ,,cjs readlucq             ;
   w7,s,                      ;
   w1:=q--,,cjp b1 prepset7   ; jump if setdyadic
   ,,cjs readlucq             ;
   w2:=q,,cjp not b1 prepset8 ; w21:=address1
   ,,cjp nillerr              ;
                              ;
prepset7: ;; setdyadic
   w10:=q,,                   ; length1:=readlucq
   slu:=slu-w10,,cjp prepset5 ; skip over set1
                              ;
prepset8:                     ;
   w7:=<w7+w7,,               ;
   w7:=w7+w7,,                ;
   w10 ior w11,s,             ; b15 means that the addresses are odd
   q:=setodde,,               ;
   w5:=w3,,cjpp b15 xept      ; jump if exception
   w6:=w4,,crtn               ; w65:=w43
                              ;
prepset10: ;; resume the instruction after interrupt
   w7:=<w7+w7,,               ;
   w7:=<w7+w7,,cjs readlucq   ;
   w11:=q,,cjs readlucq       ;
   w10:=q,,cjp stgetadbc      ;
.p                            ;
;; part 3 fetch of the next words from the setoperands
                              ;
getsetop:                     ;
   w0-w10,s,                  ; acy:= w0>=w10
   w0-w11,s,cjp not acy getsetop1;
   ,,cjp acy setfin           ; fin
getsetop1:                    ;
   w0:=w0+2,,                 ; counter:=counter+2
   w7+w7,s,                   ; status of control bits
   w11-w0,s,cjp not acy getsetop3; jump if not setcr
;; setcr
   w4:=w0-2,,push 2           ;
   w4:=w4+w4,,rfct            ; w4:=bitno
   w3:=0,,push 0f             ; w3:=the next bitword of the set
   w3:=w3+w3,,                ; shift w3
   w4-w5,s,                   ; acy:=bitno>=from
   w6-w4,s,cjp not acy getsetop2; acy:=t0>=bitno
   ,,cjp not acy getsetop2    ;
   w3:=w3++,,                 ; set a bit
getsetop2:                    ;
   w4:=w4++,,rfct             ; loop
   w4:=0,,crtn                ;
                              ;
getsetop3: ;; not setcr
;; acy: length2>=counter
   w8:=w0,,                   ;
   w4:=0,,cjp not acy getsetop3a;
   ,,cjs readonext            ;
   w4:=q,,                    ;
getsetop3a:                   ;
   w7+w7,s,                   ;
   w3:=,,cjp not b0 getsetop4 ; jump if not dyadic
;;
;; fetch setoperand1
;;
   w10-w8,s,                  ;
   ,,cjp not acy getsetop4    ; jump if length1>=counter
   w1:=w1++,,cjs reado12      ;
   w1:=w1--,,                 ;
   w3:=q,,                    ;
                              ;
getsetop4:                    ;
   w0:=w8,,crtn               ;
.p                            ;
putsetop:                     ;
   ir:=,,cjs writenext        ; syncronize itr
settestitr:                   ;
   int,,h ,cjs testint1       ;
   w4:=w2,,crtn zro           ; return if no interrupt
                              ;
;; interrupt
   w8:=w1,,                   ; save w21
   w1:=zd,,                   ;
   w2:=zd2,,                  ; w21:=lastused
   w1:=w1-setworklen,,        ;
   w3:=w4,,cjs writenext      ;
   w3:=w8++,,cjs writenext    ; write the internal variables
   w3:=w6,,cjs writenext      ;   to the top of stack
   w3:=w5++,,cjs writenext    ;
   w3:=w0,,cjs writenext      ;
   w3:=w10,,cjs writenext     ;
   w3:=w11,,cjs writenext     ;
   ,,cjpp sfetch              ;
                              ;
advance:                      ;
   w1:=w1+2,,                 ;
   ,,cjp settestitr           ;
.p                            ;
;; part 4, finishing of the setinstructions
                              ;
setfin:                       ;
   w7:=<w7+w7,,loop           ;
   w7,s,                      ;
   w3:=w10,,cjp b0 setfin2    ; jump if setresult on top of stack
                              ;
;; no set result on top of stack
   ,,cjp not b1 setfin1       ; jump if not boolean result
                              ;
;; boolean result
   w3:=1,,                    ; result:=true
   w1:=w1-w0,,cjp setfin3     ;
                              ;
setfin1: ;; setst
   w1:=w5-4,,                 ; unstack
   w1:=w1-w11,,cjp setfin4    ;
                              ;
setfin2: ;; setresult on top of stack
   w10-w11,s,cjp b1 setfin4   ; jump if revsm
   ,,cjp acy setfin3          ;
   w3:=w11,,                  ; w3:=max( length1, length2 )
                              ;
setfin3:                      ;
   ,,cjs writenext            ; write length or boolean result
                              ;
setfin4:                      ;
   q:=zd1,,                   ;
   q:=q clr 10,,              ; resume instruction:=false
   zd1:=q,,                   ;
   zd:=w1,,cjs setslice       ; update lastused
   sic:=sic++,,cjp fetch      ;
                              ;
setfalse:                     ;
   w3:=0,,                    ;
   w0:=w0-2,,                 ; counter:=counter-2
   w1:=w1-w0,,cjp setfin3     ;
.p                            ;
.instruction setun            ; set union
   bus:=66,,,                 ;
setun0:                       ;
   w7:=swp,,cjs prepset       ;
setun1:                       ;
   ,,cjs getsetop             ;
   w3:=w3 ior w4,,cjs putsetop;
   ,,cjp setun1               ;
                              ;
.instruction setin            ; set inclusion
   bus:=66,,,                 ;
   w7:=swp,,cjs prepset       ;
setin1:                       ;
   ,,cjs getsetop             ;
   w3:=w3 and w4,,cjs putsetop;
   ,,cjp setin1               ;
                              ;
.instruction setdi            ; set difference
   bus:=66,,,                 ;
   w7:=swp,,cjs prepset       ;
setdi1:                       ;
   ,,cjs getsetop             ;
   w3:=w3 clr w4,,cjs putsetop;
   ,,cjp setdi1               ;
                              ;
.instruction seteq            ; set equal
   bus:=65,,,                 ;
   w7:=swp,,cjs prepset       ;
seteq1:                       ;
   ,,cjs getsetop             ;
   w3-w4,s,                   ;
   ,,cjp not zro setfalse     ;
   ,,cjs advance              ;
   ,,cjp seteq1               ;
                              ;
.instruction setsb            ; set subset
   bus:=65,,,                 ;
   w7:=swp,,cjs prepset       ;
setsb1:                       ;
   ,,cjs getsetop             ;
   w3 clr w4,s,               ;
   ,,cjp not zro setfalse     ;
   ,,cjs advance              ;
   ,,cjp setsb1               ;
                              ;
.instruction setsp            ; set superset
   bus:=65,,,                 ;
   w7:=swp,,cjs prepset       ;
setsp1:                       ;
   ,,cjs getsetop             ;
   w4 clr w3,s,               ;
   ,,cjp not zro setfalse     ;
   ,,cjs advance              ;
   ,,cjp setsp1               ;
                              ;
.instruction setcr            ; set create
   q:=19a,,                   ;
   q,,cjp setun0              ;
                              ;
.instruction setst            ; set store
   q:=40,,                    ;
   q,,cjp setun0              ;
                              ;
;;.instruction setre ; set retreive
;;  q:=102
;;  q, cjp setun0
                              ;
;;.instruction revsm ; retreive value stack multiple
;;  q:=103
;;  q, cjp setun0
.p                            ;
.instruction setad            ; set adjust
   bus:=82,,,                 ;
   w7:=swp,,cjs prepset       ;
setad1:                       ;
   ,,cjs getsetop             ;
   w10-w0,s,cjs setad2        ; acy:=length1>=counter
   ,,cjp setad1               ;
setad2:                       ;
   w3:=w4,,cjp acy putsetop   ; putsetop if length1>=counter
   w11-w0,s,                  ; zro:=last iteration
   w4,s,cjp not zro setad3    ;
   w11:=0,,                   ; make sure that length1 >= length2 when finishing
setad3:                       ;
   ,,cjp zro settestitr       ;
   q:=setade,,                ;
   ,,cjpp xept                ; exception: the set can not be truncated
.p                            ;
;; the instruction settm does not use the common set
;; code part. it is not interruptable
                              ;
.instruction settm            ; set test membership
   ,,cjs readlucq             ;
   w7:=q,,                    ; w7:=length of the set
   slu:=slu-q,,cjs readlucq   ; skip over the set
   ir:=0f,w1:=q and 0f,,      ; w1:=position in the word; prepare rotate
   w0:=c:q+10,,               ;
   w5:=slu,,push 2            ;
   c:=7fc,w0:=>w0 and 7fc,,rfct ; w0:=wordno
   c:w7-w0,,                  ; cry:= w7>=w0
   w5:=w5+w0,,cjp not cry arit2boo; jump if set too short
   w6:=slb,,cjs readonext     ;
   w3:=q,,                    ; w3:= the word set
   rc:=w1,,                   ;
   w3:=<c<w3,,rpct k          ; cry:=the element is a member of the set
   ir:=,,cjp arit2boo         ;
;;
;; end of lmitxt078
;;
.p                            ;
«eof»