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

⟦8a060528f⟧ TextFile

    Length: 9216 (0x2400)
    Types: TextFile
    Names: »lmitxt040«

Derivation

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

TextFile

;;
.m           rc 3502 micro-program - input/output instructions
;;
;;
;; file: lmitxt040
;;
                              ;
;;
;; procedure xmitwordt(dev,func,data);
;; procedure xmitword (dev,func,data);
;;
;; entry: w0= dev, w3= data, w4= func:
;;                                00: read data,
;;                                40: write data,
;;                                80: read status,
;;                                c0: write control;
;; exit : w0= w3= w4= unch, q= chan= dev and 7;
;;
xmitwordt:                    ;proc xmitwordt;
   ,h ,cjs pty perror         ; testparity;
xmitword:                     ;proc xmitword;
   bf:=w0,h ,                 ; select the i/o module
xmitword1:                    ;
   q:=w0 ior 100,h ,          ; q:= dev ior iors0;
   bf:=q,h ,cjp not st2 k     ; repeat msel:= q until -,busy;
   q:=w0 and 7,h ,            ; chan:= dev and chan-mask;
   bd:=q ior w4,h w ,         ; xbus:= func ior chan;
   bf:=w0,h ,                 ; msel:= dev + iors0 + iors1;
   bd:=w3,h w ,crtn           ; xbus:= data; return;
.p                            ;
;;
;; procedure waitrec;
;;
;; entry: -
;; exit : stat(zro)= -,(timeout or eoi);
;;
waitrec:                      ;proc waitrec;
   ,h ,push ditimer1          ; rc:= ditimer1;
   ,h ,twb st5 waitr05        ; repeat
   ,h i ,cjp waitr07          ;   if -,dibusy then goto testeoi
waitr05:                      ;   else rc:= rc-1 until rc=0;
   ,h i ,push ditimer2        ; rc:= ditimer2;
   ,h i ,twb st5 waitr10      ; repeat if rc=0 then goto eoi
                              ;        else rc:= rc-1 until -,dibusy;
waitr07:                      ;testeoi:
   w0-w0,h i s,crtn st3       ; stat(zro):= true; if -,eoi then return;
waitr10:                      ;eoi:
   w0--w0,h i s,crtn          ; stat(zro):= false; return;
;;
;; procedure seteoi;
;; contains h in all words
;;
;; entry: ra= reg;
;; exit : ra= unch, q= undf;
;;
seteoi:                       ;proc seteoi;
   q:=--2,h ,                 ; q:= fffd; (* = -,eoi *)
   q:=q and zd1,h ,           ; ps:= ps and -,eoi;
   zd1:=q,h ,crtn st3         ; if -,eoi then return;
seteoi1:                      ;
   q:=q ior 2,h ,             ; ps:= ps ior eoi;
   zd1:=q,h ,crtn             ; return;
.p                            ;
;;
;; procedure readluptr  (* 22,5x = 4,9us *)
;;
;; entry: -
;; exit : w1= q= undf, w2= m.b, readmem56 started;
;;
readluptr:                    ;proc readluptr;
   ,,cjs readluc              ; readluc;
   w5:=bd--,h w s,cjs readluct; d:= waitmem; readluct;
   w6:=bd,h w s,cjs readnextt ; b:= waitmem; readnextt(b,d);
   w1:=iocdae0,h ,            ;
   w2:=bd,h w s,cjs rterror   ; m.b:= waitmem; testhparity;
   ,,cjp not b1 readnext      ; if -,nill(m.b) begin readnext(b,d+2); return; end;
   q:=w1,,cjp xept            ; exception(nill-ptr);
;;
.instruction iocci            ; clear-interrupt;
;;
;; param:: none;
;; stack:: -> ;
;;
   w3:=zd1,,                  ;
   w3 and 4,s,                ;
   ,,cjs zro clear            ; if not sib.to then clear;
   ,,cjp fetch0               ; goto fetch;
;;
.instruction ionci            ; clear interrupt after next instruction;
;;
;; param:: none;
;; stack:: -> ;
;;
   w3:=zd1,,                  ;
   w3 and 4,s,                ;
   ,,cjs zro clear            ; if not sib.to then clear;
   c:w0-w0,,cjp execnext      ; cry:=1; goto non-interrupt-fetch;
.p                            ;
;;
.instruction iocda            ; get devno;
;;
;; param:: none;
;; stack:: msgprt: addr -> devno: word;
;;
   ,,cjs readluptr            ; m.b:= readluptr;
   w1:=msgtype--,h ,          ;
   w1:=w1+bd,h w s,cjs read12t; m.d:= waitmem+msgkind; read12t(m.b,m.d);
   w3:=7f,h ,                 ; devmask:= 07f;
   w3:=w3 and bd,h w s,cjs rterror; devno:= waitmem and devmask; testpty;
   ,,cjp b0 wrfetch           ; if waitmem(0)=1 then goto wrfetch(devno)
   q:=iocdae1,,               ;                 else exception(msg-type-error);
   ,,cjp xept                 ;
;;
.instruction cgreg            ;
;;
;; param:: none;
;; stack:: -> regno: word;
;;
   w3:=reg,,cjp wrfetch       ; goto wrfetch(regno);
;;
.instruction cslev            ;
;;
;; param:: none;
;; stack:: level: word -> ;
;;
   ,,cjs readlucq             ; readlucq;
   w0:=q,,cjs setlint         ; level:=q setlocalint(level);
   ,,cjp fetch0               ; goto fetch
.p                            ;
;;
.instruction iowc             ;
;;
;; param:: none;
;; stack:: dev, control: word -> ;
;;
   ,,cjs readluc              ; readluc;
   w4:=0c0,h ,                ; func:= writecontrol;
   w0:=bd,h w s,cjs readluct  ; dev:= waitmem; readluct;
   w3:=bd,h w s,cjs xmitwordt ; xmitwordt(dev,func,waitmem);
   ,,cjp fetch                ; goto fetch;
;;
.instruction iors             ;
;;
;; param:: none;
;; stack:: dev, control: word -> status: word;
;;
   ,,cjs readluc              ; readluc;
   w4:=80,h ,                 ; func:= read status;
   w0:=bd,h w s,cjs readluct  ; dev:= waitmem; readluct;
   w3:=bd,h w s,cjs xmitwordt ; xmitwordt(dev,func,waitmem);
   ,h ,cjs waitrec            ; waitrec;
   w3:=bd,h w ,cjp wrfetch    ; stat:= xbus; goto wrfetch(stat);
;;
.instruction iogo             ; general output
;;
;; param:: none;
;; stack:: dev, func, data: word -> ;
;;
   ,,cjs readluc              ; readluc;
   w0:=bd,h w s,cjs readluct  ; dev:= waitmem; readluct;
   w4:=bd,h w s,cjs readluct  ; func:= waitmem; readluct;
   ,h ,cjp ioww10             ; goto common-write;
.p                            ;
;;
.instruction iorw             ;
;;
;; param:: none;
;; stack:: dev: word -> w: word;
;;
   ,,cjs readluc              ; readluc;
   w4:=0,h ,                  ; func:= read data;
   w3:=0,h ,                  ; control:= 0;
   w0:=bd,h w s,cjs xmitwordt ; xmitwordt(waitmem,func,control);
iorw10:                       ;common-read:
   ,h ,cjs waitrec            ; waitrec;
   w3:=bd,h w ,cjs seteoi     ; w:= xbus; seteoi;
   ,,cjp wrfetch              ; goto wrfetch(w);
;;
.instruction ioww             ;
;;
;; param:: none;
;; stack:: dev, w: word -> ;
;;
   ,,cjs readluc              ; readluc;
   w4:=40,h ,                 ; func:= write data;
   w0:=bd,h w s,cjs readluct  ; dev:= waitmem; readluct;
ioww10:                       ;common-write:
   w3:=bd,h w s,cjs xmitwordt ; xmitwordt(dev,func,waitmem);
   ,h ,cjs seteoi             ; seteoi;
   ,,cjp fetch                ; goto fetch;
;;
.instruction iogi             ; general input;
;;
;; param:: none;
;; stack:: dev, func, dataout: word -> datain: word;
;;
   ,,cjs readluc              ; readluc;
   w0:=bd,h w s,cjs readluct  ; dev:= waitmem; readluct;
   w4:=bd,h w s,cjs readluct  ; func:= waitmem; readluct;
   w3:=bd,h w s,cjs xmitwordt ; xmitwordt(dev,func,waitmem);
   ,h ,cjp iorw10             ; goto common-read;
.p                            ;
;;
.instruction ioibx            ;
;;
;; param:: none;
;; stack:: msg: addr; last, first: word ->
;;         sad: addr; count, top: word;
;;
   ,,cjs readluptr            ; msg.b:= readluptr;
   w1:=msgtype--,h ,          ;
   w1:=w1+bd,h w s,cjs readluct; msg.d:= waitmem+msgtype-1; readluct;
   w7:=ioibxe0,h ,            ;
   w3:=bd++,h w s,cjs readluct; top:= waitmem+1 (*last+1*); readluct;
   w0:=bd,h w s,cjs read12t   ; first:= waitmem; read12t(msg.b,msg.d);
   w5:=w1+2,h ,               ; msg.d:= msg.d+2;
   ir:=20,w6:=w2,h ,          ; ir.shift:=logical
   w4:=bd,h w s,cjs terror    ; type:= waitmem; testparity;
   q:=w7,,cjp b0 xept         ; if type = chtype then exception(datamsg error);
.p                            ;
   ,,cjs readnext             ; readnext(msg.b,msg.d);
   w1:=ioibxe1,h ,            ; err:= size error;
   w4:=>w3++,h ,              ; wtop:= (top+1) // 2;
   w4--bd,h w s,cjs terror    ; stat(acy):= (size < wtop); testparity;
   q:=w1,,cjs acy xept        ; if size<wtop then exception(err);
   w1:=slu,,cjs readnext      ; readnext(msg.b,msg.d);
   c:w3--w0,h ,               ; cry:= (top > first);
   w2:=ioibxe2,h ,            ; err:= first not less then top;
   w7:=bd,h w s,cjs terror    ; sad.b:= waitmem; testparity;
   q:=w2,,cjs not cry xept    ; if top<=first then exception(err);
   w2:=slb,,cjs readnext      ; readnext(msg.b,msg.d);
   w4:=w3,h ,                 ; b:= slb; d:= slu;
   w4:=w4-w0,h ,              ; count:= top - first;
   slu:=slu+8,h ,             ; slu:= slu + 8;
   w0:=w0+bd,h w s,cjs writenextt; sad.d:= waitmem+first; writenextt(b,d,top);
   w3:=w4,,cjs writenext      ; writenext(b,d,count);
   w3:=w7,,cjs writenext      ; writenext(b,d,sad.b);
   w3:=w0,,cjs writenext      ; writenext(b,d,sad.d);
   ,,cjp fetch                ; goto fetch;
.p                            ;
;;
;; end of lmitxt040
;;
.p
▶EOF◀