|
DataMuseum.dkPresents historical artifacts from the history of: RC3500 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC3500 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 26880 (0x6900) Types: TextFileVerbose Names: »lmitxt050«
└─⟦2c55ea56f⟧ Bits:30001844 SW-save af projekt 1000, Alarm-system └─⟦093e2ad1c⟧ └─⟦this⟧ »lmitxt050«
;; .m rc 3502 micro-program - pascal80 part ;; ;; ;; file: lmitxt050 ;; ;; each instruction is described by: ;; ;; param:: 1.st param, 2.nd param, ... ; ;; (* ascending core => *) ;; ;; stack:: lu-elem before, (lu-n) elem before, ... -> ;; lu-elem after, (lu-m) elem after, ... ; ;; (* descending core => *) ;; .p ; ;; ;; common procedures ;; ; ;; ;; procedure get-if-rel; ;; ;; entry: - ;; exit : w0= ifdisp, w3= rel, w4= 0, w5= ifdisp+rel, w6= ifbase; ;; getif: ;proc getifrel; w6:=spb,,cjs readbcont ; lev:=readbcont; w0:= sf; w0:=rd0,,crtn zro ; while lev<>0 do getif10: ; begin w5:=w0,,cjs readnext ; w5:= w0-1; readnext(spb,w5); w0:=bd,h w s, ; w0:= waitmem; w4:=w4--,h s,cjp pty herror; lev:= lev-1; ,,cjp not zro getif10 ; end while; ,,crtn ; getifrel: ; ,,cjs getif ; w5:=w0,,cjs readcont ; rel:= readcont; w5:=w5+w3,,crtn ; w5:= ifdisp + rel; return; ;; ;; procedure getfield(word,fbyte); ;; ;; entry: w4= fbyte, q= word; ;; exit : w3= field, w6= w8= rc= undf, q= unch, cry= 1; ;; getfield: ;proc getfield; c:=3,,,ldct 3 ; cry:= 1; rc:= 3; ,,cjs unpack ; f,l:= unpack(fbyte); ,,cjs not acy getfie10 ; if f>l then ill-field; ir:=w3:=0,,cjs makemask ; w3:= 0; makemask; rc:=w0,, ; rc:= 14-l; w4:=q,,cjs acy rshift ; w6:= word shift (l-15); w3:=w3 and w4,,cjp wrfetch ; goto wrfetch(w6 and mask); getfie10: ;ill-field; q:=revafe0,, ; w0:=w4,,cjp xept ; l:= f; goto exception(field-error); .p ; ;; ;; procedure unpack(fbyte); ;; ;; entry: w4= fbyte, rc= 3; ;; exit : f= w4= fbyte shift (-4), l= w0= fbyte and 0f, ir:= 20, ;; stat(acy)= (l>=f), rc= l-f; ;; unpack: ;proc unpack; w0:=w4 and 0f,, ; l:= fbyte and 0f; ;; ;; procedure rshift(word); ;; ;; entry: w4= word, rc= shifts - 1; ;; exit : w4= word shift (-shifts), stat(acy)= (w4<w0), rc= w0-w4; ;; rshift: ;proc rshift; ir:=20,,, ; ir.shift:= logic; rshift10: ; w4:=>w4,,rpct rshift10 ; word:= word shift (1-rc); rc:=w0-w4,s,crtn ; rc:= stat:= w0-w4-1; return; ;; ;; procedure makemask(bno); ;; ;; entry: w3= 0, rc= bno-1, ir.shift= 0, cry= shiftin; ;; exit : w3= 2**(bno) - 1, stat= w0= 14-w0, rc= 0; ;; makemask: ;proc makemask; w3:=<w3,,rpct makemask ; while bno<>0 do begin ; bno:= bno-1; w3:= w3 shift 1 + cry; end; w0:=0e-w0,s,crtn ; stat:= w0:= 0e-w0; return; .p ; ;; ;; procedure setfieldt(word); ;; procedure setfield(word); ;; ;; entry: w1= d-1, w2= b, w3= field, stat(pty) defined; ;; exit : w0= w4= q= ir= rc= cry= undf, w1= w5= d+1, w2= w6= b, w3= res; ;; setfieldt: ;proc setfieldt; ,h ,cjs pty rerror ; test parity error setfield: ;proc setfield ,,cjs readbcont ; fb:= readbcont; c:=3,,,ldct 3 ; cry:= 1; rc:= 3; w6:=w2,,cjs unpack ; f,l:= unpack(fb); q:=w3,,cjs not acy getfie10; if f>l then ill-field; ir:=w3:=0,,cjs makemask ; ir.shift:= cyclic; w3:= 0; makemask; w5:=w1,,cjp not acy setf25 ; if l>14 then goto noshift; rc:=w0,, ; rc:= 14-l; ir:=20,w0:=q,,push not cry ; ir.shift:= logic; w0:= q; (*field*) w0:=<c<w0,s, ; field:= field shift 1; cry:= field(-1); w3:=<w3,,twb cry setf30 ; mask:= mask shift 1; if cry then field-ovf; ; end while; goto endshift; setf20: ;field-ovf: q:=stvafe0,, ; field:= 0; w0:=0,,cjs xept ; exception(field-ovf); setf25: ;noshift: w0:=q,, ; w0:= q; (* field *) setf30: ;endshift: (*w0=field,w3=mask*) w4:=w3,,cjs readonext ; w:= readonext(b,d-1); w4:=w4 and w0,, ; w4:= field and mask; w4 xor w0,s, ; mask:= -,mask; w3:=--w3,, ; w3:=w3 and q,,cjp not zro setf20; w:= -,mash and w; ; if w4<>field then field-ovf; w3:=w3 ior w4,,cjp writenext; w:= w ior w4,call writenext; return; .p ; ;; ;; procedure stgetadbc; ;; ;; time : 32x = 6,9us ;; entry: - ;; exit : w0= bc, w1= op2d-1, w2= op2b, w3= w5= op1d-1, w4= w6= op1b; ;; stgetadbc: ;proc stgetadbc; ,,cjs readluc ; readluc; w0:=bd,h w s,cjs readluct ; bc:= waitmem; readluct; w3:=bd--,h w s,cjs readluct; op1d:= waitmem-1; readluct; w4:=bd,h w s,cjs readluct ; op1b:= waitmem; readluct; w1:=bd--,h w s,cjs readluct; op2d:= waitmem-1; readluct; w2:=bd,h w s,cjs terror ; op2b:= waitmem;testparity; w5:=w3,,cjp b1 nillerr ; if nill(op2b) then goto nillerror; w6:=w4,,crtn ; return; ; nillerr: ;nillerror: q:=nilade,, ; error:= nill address; ,,cjp xept ; exception(error); .p ; ;; ;; instruction prologues: address calculations and ;; operand retreval. ;; ;; common reva prologue ;; ;; exit: w3= d, w5= d-1, w6= b; ;; reva: ;reva-common: ,,cjs readcown36 ; b,d:= readcown36; w5:=w3--,,jmap not 8 ; goto escmap(ir); ;; ;; common revl prologue ;; ;; exit: w3= rel, w5= sf+rel-1, w6= pb; ;; revl: ;revl-common: w6:=spb,,cjs readcont ; b:= pb; rel:= readcont; revls1: ; w5:=rd0--,, ; d:= reg.sf + rel; w5:=w5+w3,,jmap not 8 ; goto escmap(ir); ;; ;; common revg prologue ;; ;; exit: w3= rel, w5= pr+rel-1, w6= pb; ;; revg: ;revg-common: w6:=spb,,cjs readcont ; b:= spb; rel:= readcont; revgs1: ; w5:=rd1--,, ; d:= reg.pr + rel; w5:=w5+w3,,jmap not 8 ; goto escmap(ir); .p ; ;; ;; common revi prologue ;; ;; exit: w0= ifdisp, w3= rel, w4= 0, w5= ifdisp+rel-1, w6= ifbase; ;; revi: ;revi-common: ,,cjs getifrel ; b,d:= getifrel; w5:=w5--,,jmap not 8 ; goto escmap(ir); ;; ;; common revs prologue ;; ;; exit: w1= d-1, w2= w6= b, w3= rel, w5= d-1; ;; revs: ;revs-common: ,,cjs getsa ; b,d:= getsa; revss1: ; w5:=w1,,cjp b1 nillerr ; if nill(b) then goto nillerror; w6:=w2,,jmap not 8 ; goto escmap(ir); ;; ;; common stva prologue ;; ;; exit: w1= d-1, w2= ownb, w56= lubd, readluc started; ;; stva: ;stva-common: ,,cjs readcown36 ; b,d:= readcown36; w1:=w3--,,cjs readluc ; readluc; w2:=w6,h ,jmap not 8 ; b:= b ior pu; goto escmap(ir); ;; ;; common stvl prologue ;; ;; exit: w1= d-1, w2= b, w3= rel-1, readmem(w2,w1) started; ;; stvl: ;stvl-common: w2:=slb,,cjs readcont ; b:= lb; rel:= readcont; stvls1: ; w3:=w3--,,cjs readluc ; readluc; w1:=rd0+w3,h , ; d:= reg.sf + rel - 1; ,h ,jmap not 8 ; goto escmap(ir); .p ; ;; ;; common stvg prologue ;; ;; exit: w1= d-1, w2= b, w3= rel-1, readmem(w2,w1) started; ;; stvg: ;stvg-common: w2:=slb,,cjs readcont ; b:= lb; rel:= readcont; w3:=w3--,,cjs readluc ; readluc; w1:=rd1+w3,h , ; d:= reg.pr + rel - 1; ,h ,jmap not 8 ; goto escmap(ir); ;; ;; common stvi prologue ;; ;; exit: w1= d-1, w2= b, w56= lubd, readlu started; ;; stvi: ;stvi-common: w2:=spb,,cjs getifrel ; b:= pb; d:= getifrel - 1; w1:=w5--,,cjs readluc ; readluc; ,h ,jmap not 8 ; goto escmap(ir); ;; ;; common stvs prologue ;; ;; exit: w0= res.d, w1= d-1, w2= b, w3= w4= res.d or res; ;; stvsd1: ;stvsd-prologue: ,,cjs readluc ; readluc; w0:=bd,h w s,cjs terror ; res.d:= waitmem; testparity; stvs: ;stvs-common: ,,cjs readluc ; readluc; w4:=bd,h w s,cjs getsat ; res:= waitmem; b,d:= getsat; stvss1: ; ,,cjp b1 nillerr ; if nill(b) then goto nillerror; w3:=w4,,jmap not 8 ; goto escmap(ir); .p ; ;; .instruction renpb ; ;; ;; param:: none; ;; stack:: no: word -> garbage: array(1..no/2) of word; ;; ir:=,,cjs readluc ; ir.x:= 0; readluc; c:=w3:=bd,h w s,cjs terror ; bc:= waitmem(0:15); cry:= waitmem(15); renpb05: ;comm-push-garb: (* w3= bc *) slu:=slu+w3,s,cjp cry renpb10; slu:= slu + bc; if odd(bc) then goto garb-error; zdx-slu,s,cjp acy stackerror; if ovf then goto stackerror; ,,cjp acy fetch ; if slu<=maxstack then goto fetch ,,cjp stackerror ; else goto stackerror; renpb10: ;garb-error: q:=renpbe0,, ; ,,cjp xept ; goto exception(odd-byte-count); ;; .instruction renhb ; ;; ;; param:: no: word; ;; stack:: -> garbage: array(1..no/2) of word; ;; ir:=,,cjs readcont ; ir.x:= 0; bc:= readcont; c:=w3,,cjp renpb05 ; bc:= bc(0:15); cry:= bc(15); goto comm-push-garb; ;; .instruction rechw ; ;; ;; param:: const: word; stack:: -> const: word; ;; ,,cjs readcont ; const:= readcont; ,,cjp wrfetch ; goto wrfetch(const); ;; .instruction rechd ; ;; ;; param:: const: addr; stack:: -> const: addr; ;; ,,cjs readcown36 ; res.b,res.d:= readcont34; w4:=w6,,cjp wr34fetch ; goto wr34fetch(res.b,res.d); .p ; ;; .instruction reaxd ; ;; ;; param:: none; stack:: -> lu: addr; ;; w3:=slu,, ; w4:=slb,,cjp wr34fetch ; goto wr34fetch(slb,slu); ;; .instruction reard ; ;; ;; param:: rel: word; stack:: -> icrel: addr; ;; w4:=sib,,cjs readcont ; rel:= readcont; w3:=w3+rd,,cjp wr34fetch ; goto wr34fetch(sib,ic+rel); ;; .instruction reald ; ;; ;; param:: rel: word; stack:: -> lfrel: addr; ;; ,,cjs readcont ; rel:= readcont; realds1: ; w3:=w3+rd0,, ; w4:=slb,,cjp wr34fetch ; goto wr34fetch(slb,sf+rel); ;; .instruction reagd ; ;; ;; param:: rel: word; stack:: -> gfrel: addr; ;; ,,cjs readcont ; rel:= readcont; reagds1: ; w3:=w3+rd1,, ; w4:=slb,,cjp wr34fetch ; goto wr34fetch(slb,pr+rel); .p ; ;; .instruction reaid ; ;; ;; param:: lev: byte, rel: word; ;; stack:: -> ifrel: addr; ;; ,,cjs getifrel ; b,d:= getifrel; w4:=w6,, ; w3:=w5,,cjp wr34fetch ; goto wr34fetch(b,d); ;; .instruction reasd ; ;; ;; param:: rel: word; ;; stack:: ad: addr-> adr: addr; ;; ,,cjs getsa ; b,d:= getsa; w3:=w1++,, ; w4:=w2,,cjp wr34fetch ; goto wr34fetch(b,d+1); ;; .instruction revpw ; ;; ;; param:: none; stack:: w: word -> w, w: word; ;; ,,cjs readluc ; readluc; slu:=slu+2,h , ; slu:= slu+2; (* keep w *) w3:=bd,h w s,cjp wrfetcht ; goto wrfetcht(waitmem); ;; .instruction revpd ; ;; ;; param:: none; stack:: a: addr -> a, a: addr; ;; ,,cjs readluc ; readluc; w3:=bd,h w s,cjs readluct ; d1:= waitmem; readluct; slu:=slu+4,h , ; slu:= slu+4; w4:=bd,h w s,cjp wr34fetcht; goto wr34fetcht(waitmem,d1); .p ; ;; .instruction revab , reva , revxbfin ; ;; ;; param:: a: addr; stack:: -> byte: word; ;; revxbfin: ; ,,cjs readb65next ; w3:=readb65next ,,cjp wrfetch ; goto wrfetch(byte); ;; .instruction revaw , reva , revxwfin ; ;; ;; param:: a: addr; stack:: -> word: word; ;; revxwfin: ; ,,cjs readonext ; w:= readonext(b,d-1); w3:=q,,cjp wrfetch ; goto wrfetch(w); ;; .instruction revad , reva , revxdfin ; ;; ;; param:: a: addr; stack:: -> sa: addr; ;; revxdfin: ; ,,cjs readonext ; w1:= readonext(b,d-1); w4:=q,,cjs readonext ; w2:= readonext(b,d+1); w3:=q,,cjp wr34fetch ; goto wrfetch34(w1,w2); ;; .instruction revaf , reva , revxffin ; ;; ;; param:: a: addr, fb: byte; stack:: -> f: word; ;; revxffin: ; ,,cjs readbcont ; fb:= readbcont; ,,cjs readonext ; word:= readonext(b,d-1); ,,cjp getfield ; goto getfield(word,fb); .p ; ;; .instruction revlb , revl , revxbfin ; ;; ;; param:: lrel: word; ;; stacl:: -> byte: word; ;; ; ;; .instruction revlw , revl , revxwfin ; ;; ;; param:: lrel: word; ;; stack:: -> w: word; ;; ; ;; .instruction revld , revl , revxdfin ; ;; ;; param:: lrel: word; ;; stack:: -> d: addr; ;; ; ;; .instruction revlf , revl , revxffin ; ;; ;; param:: lrel: word, fb: byte; ;; stack:: -> f: word; ;; .p ; ;; .instruction revgb , revg , revxbfin ; ;; ;; param:: grel: word; ;; stack:: -> byte: word; ;; ; ;; .instruction revgw , revg , revxwfin ; ;; ;; param:: grel: word; ;; stack:: -> res: word; ;; ; ;; .instruction revgd , revg , revxdfin ; ;; ;; param:: grel: word; ;; stack:: -> res: addr; ;; ; ;; .instruction revgf , revg , revxffin ; ;; ;; param:: grel: word, fb: byte; ;; stack:: -> f: word; ;; .p ; ;; .instruction revib , revi , revxbfin ; ;; ;; param:: lev: byte, irel: word; ;; stack:: byte: word; ;; ; ;; .instruction reviw , revi , revxwfin ; ;; ;; param:: lev: byte, irel: word; ;; stack:: res: word; ;; ; ;; .instruction revid , revi , revxdfin ; ;; ;; param:: lev: byte, irel: word; ;; stack:: res: addr; ;; ; ;; .instruction revif , revi , revxffin ; ;; ;; param:: lev: byte, irel: word, fb: byte; ;; stack:: -> f: word; ;; .p ; ;; .instruction revsb , revs , revxbfin ; ;; ;; param:: rel: word; ;; stack:: a: addr -> byte: word; ;; ; ;; .instruction revsw , revs , revxwfin ; ;; ;; param:: rel: word; ;; stack:: a: addr -> res: word; ;; ; ;; .instruction revsd , revs , revxdfin ; ;; ;; param:: rel: word; ;; stack:: a: addr -> res: addr; ;; ; ;; .instruction revsf , revs , revxffin ; ;; ;; param:: rel: word, fb: byte; ;; stack:: a: addr -> f: word; ;; .p ; ;; .instruction mbtes ; test selected reg.ps bits ;; ;; param:: mask: word; ;; stack:: -> boolean: word; ;; ,,cjs readcont ; mask:= readcont; w3 and zd1,s, ; if reg.ps and mask = 0 w3:=,,cjp zro wrfetch ; then goto wrfetch(0) w3:=w3++,,cjp wrfetch ; else goto wrfetch(1); ;; .instruction mbset ; set selected reg.ps bits ;; ;; param:: mask: word; ;; stack:: boolean: word -> ; ;; ,,cjs readcont ; mask:= readcont; ,,cjs readluc ; readluc; ir:=80,w4:=--w3,h , ; ir.x:= 1; w0:=bd,h w s,cjs terror ; boolean:= waitmem; testparity; w4:=w4 and zdx,,cjp not b15 mbset10; reg.ps:= if boolean w4:=w4 ior w3,, ; then reg.ps and -,mask + mask mbset10: ; else reg.ps and -,mask; zdx:=w4,,cjp fetch ; goto fetch; .p ; ;; .instruction stnhb ; ;; ;; param:: bc: word; ;; stack:: garbage: array (1..bc/2) of word ->; ;; ir:=,,cjs readcont ; ir.x:= 0; bc:= readcont; c:=w3,, ; cry:= bc(15); slu:=slu-w3,,cjp not cry fetch; goto if even(bc) then fetch ,,cjs renpb10 ; else garb-error; ;; .instruction stvab , stva , stvxbfin ; ;; ;; param:: a: addr; ;; stack:: byte: word -> ; ;; stvxbfin: ; w3:=bd,h w s,cjs writebnextt; writebnextt(b,d,waitmem); ,,cjp fetch ; goto fetch; ;; .instruction stvaw , stva , stvxwfin ; ;; ;; param:: a: addr; ;; stack:: w: word -> ; ;; stvxwfin: ; w3:=bd,h w s,cjs writenextt; writenextt(b,d,waitmem); ,,cjp fetch ; goto fetch; .p ; ;; .instruction stvad , stva , stvxdfin ; ;; ;; param:: a: addr; ;; stack:: d: addr -> ; ;; stvxdfin: ; w4:=bd,h w s,cjs readluct ; res.d:= waitmem; readluct; w3:=bd,h w s,cjs writenextt; writenextt(b,d-1,waitmem); w3:=w4,,cjs writenext ; writenext(b,d+1,res.d); ,,cjp fetch ; goto fetch; ;; .instruction stvaf , stva , stvxffin ; ;; ;; param:: a: addr, fb: byte; ;; stack:: f: word -> ; ;; stvxffin: ; w3:=bd,h w s,cjs setfieldt ; setfieldt(b,d-1,waitmem); ,,cjp fetch ; goto fetch; .p ; ;; .instruction stvlb , stvl , stvxbfin ; ;; ;; param:: rel: word; ;; stack:: byte: word -> ; ;; ; ;; .instruction stvlw , stvl , stvxwfin ; ;; ;; param:: rel: word; ;; stack:: w: word -> ; ;; ; ;; .instruction stvld , stvl , stvxdfin ; ;; ;; param:: rel: word; ;; stack:: d: addr -> ; ;; ; ;; .instruction stvlf , stvl , stvxffin ; ;; ;; param:: rel: word, fbyte: byte; ;; stack:: f: word -> ; ;; .p ; ;; .instruction stvgb , stvg , stvxbfin ; ;; ;; param:: rel: word; ;; stack:: byte: word -> ; ;; ; ;; .instruction stvgw , stvg , stvxwfin ; ;; ;; param:: rel: word; ;; stack:: w: word -> ; ;; ; ;; .instruction stvgd , stvg , stvxdfin ; ;; ;; param:: rel: word; ;; stack:: d: addr -> ;; ; ;; .instruction stvgf , stvg , stvxffin ; ;; ;; param:: rel: word, fbyte: byte; ;; stack:: field: word -> ;; .p ; ;; .instruction stvib , stvi , stvxbfin ; ;; ;; param:: lev: byte, rel: word; ;; stack:: byte: word -> ; ;; ; ;; .instruction stviw , stvi , stvxwfin ; ;; ;; param:: lev: byte, rel: word; ;; stack:: w:word -> ; ;; ; ;; .instruction stvid , stvi , stvxdfin ; ;; ;; param:: lev: byte, rel: word; ;; stack:: d: addr -> ; ;; ; ;; .instruction stvif , stvi , stvxffin ; ;; ;; param:: lev: byte, rel: word, fbyte: byte; ;; stack:: field: word -> ; ;; .p ; ;; .instruction stvsb , stvs , stvsbfin ; ;; ;; param:: rel: word; ;; stack:: byte: word; a: addr -> ; ;; stvsbfin: ; ,,cjs writebnext ; writebnext(b,d,byte); ,,cjp fetch ; goto fetch; ;; .instruction stvsw , stvs , stvswfin ; ;; ;; param:: rel: word; ;; stack:: w: word; a: addr -> ; ;; stvswfin: ; ,,cjs writenext ; writenext(b,d,w); ,,cjp fetch ; goto fetch; ;; .instruction stvsd , stvsd1 , stvsdfin ; ;; ;; param:: rel: word; ;; stack:: res, a: addr -> ; ;; stvsdfin: ; ,,cjs writenext ; writemext(b,d,res.b); w3:=w0,,cjs writenext ; writenext(b,d,res.d); ,,cjp fetch ; goto fetch; ;; .instruction stvsf , stvs , stvsffin ; ;; ;; param:: rel: word, fbyte: byte; ;; stack:: f: word, a: addr -> ; ;; stvsffin: ; ,,cjs setfield ; setfield(b,d,f); ,,cjp fetch ; goto fetch; .p ; ;; .instruction moveg ; ;; ;; param:: none; ;; stack:: bc: word; op,res: addr -> ; ;; ir:=c:=w0-w0,,cjs stgetadbc; cry:= 0; ir.shift:= cyclic; ; bc,op1,op2:= stgetadbc; w0:=>c>w0,s,cjp b1 nillerr ; cry:= bc(15); wc:= bc(0:14); w0,s,cjp not cry moveg10 ; if odd(bc) then ,,cjs readb65next ; begin w3:=readb65next; (* move one byte first *) ,,cjs writebnext ; writebnext(op2,w3) w0,s, ; end; moveg10: ;rep: ,,cjp zro fetch ; sync-intrp; if wc=0 then goto fetch; ,,cjs readonext ; w:= readonext(op1b,op1d); ir:=w3:=q,,cjs writenext ; writenext(op2b,op2d,w); int,,h ,cjs testint1 ; wc:= wc - 1; w0:=w0--,s,cjp zro moveg10 ; if -,testint then goto rep; w0:=w0+w0,, ; bc:= wc * 2; ;; ;; the interrupt situation has changed, the stack is reestablished ;; and fetch is entered without incremented ic. ;; ;; entry: w0= bc, w1= op2d-1, w2= op2b, w5= op1d-1, w6= op1b; ;; exit : to fetch; ;; moveg20: ;new-interrupt: w3:=w1++,, ; (* op1b and op2b are not written back to *) w1:=slu+2,, ; (* the stack,as they are always unchanged *) w2:=slb,,cjs writenext ; writenext(slb,slu+2,op2d+1); w1:=w1+2,, ; w3:=w5++,,cjs writenext ; writenext(slb,slu+7,op1d+1); w3:=w0,,cjs writenext ; writenext(slb,slu+9,bc); slu:=slu+0a,, ; slu:= slu+10; sic:=sic--,,cjp fetch ; sic:= sic-1; goto fetch; .p ; ;; .instruction moveb ; ;; ;; param:: none; ;; stack:: bc: word; op,res: addr -> ; ;; ,,cjs stgetadbc ; bc,op1,op2:= stgetadbc; w0,s,cjp b1 nillerr ; moveb10: ;rep: ,,cjp zro fetch ; sync-intrp; if bc=0 then goto fetch; ,,cjs readb65next ; w3:=readb65next ir:=,,cjs writebnext ; writebnext(op2,b); int,,h ,cjs testint1 ; goto w0:=w0--,s,cjp zro moveb10 ; if -,testint then rep ,,cjp moveg20 ; else new-interrupt; .p ; ;; .instruction stcea ; ;; ;; time : 49,5x + (17x * bc) = 10,74us + (3,69us * bc) ;; param:: none; ;; stack:: bc: word; op1, op2: addr -> res: word; ;; ,,cjs stgetadbc ; bc,op1,op2:= stgetadbc; w0,s,cjp b1 nillerr ; stcea10: ;rep: ,,cjp zro stcea20 ; if bc=0 then goto endtrue; ,,cjs readb65next ; w7:=readb65next w7:=w3,,cjs readb21next ; w7:= w7 xor readb21next; int,w7:=w7 xor w3,h s, ; if w7<>0 then goto endfalse lev xor int,h s,cjp not zro stcea30; w0:=w0--,s,cjp zro stcea10 ; bc:=bc-1; goto if testinterrupt ,,cjp moveg20 ; then newinterrupt else rep; stcea20: ;endtrue: w3:=w0++,,cjp wrfetch ; goto wrfetch(true); stcea30: ;endfalse: w3:=,,cjp wrfetch ; goto wrfetch(false); .p ; ;; .instruction revsm ; ;; ;; param:: none; ;; stack:: bc: word; op: addr -> area: array(1..bc/2) of word; ;; ,,cjs readluc ; readluc; w3:=renpbe0,h , ; err:= odd-byte-count; c:=w0:=bd,h w s,cjs terror ; bc:= waitmem; cry:= bc(15); testparity; q:=w3,,cjp cry xept ; if odd(bc) then expection(err); ,,cjs readluc ; readluc; w5:=bd--,h w s,cjs readluct; op.d:= waitmem; readluct; ir:=20,w2:=slb,h , ; ir.shift:= logical; w6:=bd,h w s,cjs terror ; op.b:= waitmem; testparity; w1:=slu,,cjp b1 nillerr ; sslu:= slu; if nill(op.b) goto nillerror; slu:=slu+6,s, ; (* test stackoverflow *) slu:=slu+w0,s,cjp acy stackerror; slu:= slu + bc + 6; (* incl. intrp-save *) zdx-slu,s,cjp acy stackerror; if ovf or slu > lm goto stackerror; w0:=>w0,s,cjp not acy stackerror; wc:= bc//2; revsm10: ;rep: slu:=w1,,cjp zro fetch ; if wc=0 then goto fetch; ir:=,,cjs readonext ; sync-itr; w:= readonext(op.b,op.d); w3:=q,,cjs writenext ; writenext(slb,slu,w); int,slu:=w1,h ,cjs testint1; slu:= slu+2; wc:= wc - 1; w0:=w0--,s,cjp zro revsm10 ; if -,testint then goto rep; ;; ;; the interrupt situation has changed, the stack operands for the ;; instruction are written on top of stack and ftchl is entered ;; without incremented ic. ;; entry: w0= wc, w1= slu, w2= slb, w5= op.d-1, w6= op.b; ;; w3:=w6,,cjs writenext ; writenext(slb,slu,op.b); w3:=w5++,,cjs writenext ; writenext(slb,slu,op.d); w3:=w0,, ; w3:=w3+w0,,cjs writenext ; writenext(slb,slu,wc+wc (* bc *)); slu:=slu+6,, ; slu:= slu+6; sic:=sic--,,cjp fetch ; sic:= sic-1; goto fetch; .p ; .instruction readb prepdyad ; w5:=w2--,,ldct puterraddr ; w6:=w3,,cjs readb65n1 ; return to readberror if error ,,cjp wrfetch ; parity ok ; puterraddr: ;; put w6,w5 into the dummy register set ra:=radummy,,, ; rd2:=w6,, ; rd:=w5,, ; ra:=reg,,cjpp wrfetch ; ra:=reg ; .instruction readw prepdyad ; w5:=w2 and 7fe,, ; make the address even w5:=w5--,, ; w6:=w3,,cjs readnext ; ,h ,ldct righterror ; w1:=bd,h w s,cjs testbyte ; return to righterror if right error; w3:=w1,,cjp not pty wrfetch; w3:=saved data; goto wrfetch if no parity error; w5:=w5--,, ; only left parity error: disp:=disp-1 righterror: ; w3:=w1,,cjp puterraddr ; w3:=saved data; goto puterraddr .p ; ;; ;; end of lmitxt050 ;; .p ; «eof»