|
|
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: 150528 (0x24c00)
Types: TextFile
Names: »compress1«
└─⟦2c55ea56f⟧ Bits:30001844 SW-save af projekt 1000, Alarm-system
└─⟦093e2ad1c⟧
└─⟦this⟧ »compress1«
;;
;; begin lmitxt000c
;;
.m rc 3502 micro-program parameters
;;
.m rev: 801009▶05◀ fh/hlv
;;
;
version= 23 ;
;
;; register def
.w0= 0 ;
.w1= 1 ;
.w2= 2 ;
.w3= 3 ;mem read data
.w4= 4 ;
.w5= 5 ;mem read addr, d
.w6= 6 ;mem read addr, b
.w7= 7 ;last read ic word
.w8= 8 ;
.w9= 9 ;
.w10= 0a ;
.w11= 0b ;
.slu= 8 ;
.slb= 9 ; =pb
.spb= 9 ;
.sic= 0a ;
.sib= 0b ;
.reg= 0c ;
.lev= 0d ;
.errd= 0e ;
.errb= 0f ;
;
cow= 3eb ;
puerrmsk= 3fa ;
;
startlevel= 1 ;
monitrlev= 1 ;
firstreg= 0f ;
ramonitor= 3e7 ;
racom8085= 3ef ;
rawork= 3f7 ;
radummy= 3ff ;
;
autobase= 10 ;
autodisp= 2 ;
lubase= 0 ;
;
setworklen= 0e ; no of bytes used by setinstructions
; to store the internal variables.
.p ;
.m incarnation descr
;
puno= 3 ;
level= 4 ;
regbase= 5 ;
shwt= 7 ;
actq= 0b ;
chainhead= 0f ;
excode= 13 ;
exaddr= 15 ;
exic= 19 ;
dumplm= 1d ; lm, ps, lu, sf, ib, ic
timer= 29 ;
maxstack= 2b ;
statistic= 0ff ;?????????????????????????????????????????????
maxstackrel= maxstack - exic ;
;;
;; message head
;;
msgtype= 4 ;
msgsize= 6 ;; must be msgtype + 2
msgsadr= 8 ;; must be msgsize + 2
msgstack= 18 ;; stackchain
;;
;; input/output parameters
;;
;; ditimer1: din busy timer before sup.int.
;; ditimer1 = 0 : 10 mhz version
;; = 7 : 18 mhz version ( = 2.22425 us )
;;
ditimer1= 0 ; 10 mhz version
ditimer2= 8a - ditimer1 ; -,din busy timeout counter = 29.946 us ( 18 mhz )
;;
;; soft (internal) interrupt parameters
;;
sintmax= 7 ; soft interrupts between 0 and 7 incl.
.p ;
;;
;; instruction codes
;;
jmphc= 1 ;
jmphd= 2 ;
.instruction jmphd , jmphc00 , jmphc00 ;; to be removed in rev.3
jmppd= 3 ;
jmprw= 4 ;
jmcht= 5 ;
jmzeq= 6 ;
jmzne= 7 ;
jmzlt= 8 ;
jmzgt= 9 ;
jmzle= 0a ;
jmzge= 0b ;
;
csign= 10 ;
cwait= 11 ;
csens= 12 ;
csell= 13 ;
cstdr= 14 ;
cstop= 15 ;
cllst= 16 ;
cufst= 17 ;
sched= 18 ;
crget= 19 ;
crput= 1a ;
crram= 1e ;
cwram= 1f ;
crele= 20 ;
cwtac= 21 ;
chpro= 22 ;
.instruction chpro , fetch , fetch ;; to be removed in rev.3
cgreg= 24 ;
cslev= 25 ;
cexch= 26 ;
;
iowc= 30 ;
iogo= 31 ;
iors= 32 ;
iorw= 33 ;
ioww= 34 ;
iogi= 35 ;
iorbb= 36 ;
iorbw= 37 ;
iowbb= 38 ;
iowbw= 39 ;
ioctc= 3a ;
iocci= 3b ;
iocda= 3c ;
ioibx= 3e ;
ionci= 3f ;
;
neg= 50 ;
notinstr= 51 ;
tnill= 52 ;
abs= 53 ;
compl= 54 ;
add= 55 ;
sub= 56 ;
mul= 57 ;
div= 58 ;
mod= 59 ;
sha= 5a ;
andinstr= 5b ;
or= 5c ;
shc= 5d ;
ult= 5e ;
eq= 5f ;
ne= 60 ;
lt= 61 ;
gt= 62 ;
le= 63 ;
ge= 64 ;
setcr= 65 ;
setun= 66 ;
setin= 67 ;
setdi= 68 ;
seteq= 69 ;
setsb= 6a ;
setsp= 6b ;
settm= 6c ;
setad= 6d ;
tlock= 6e ;
topen= 6f ;
;
intrs= 70 ;
index= 71 ;
inprs= 72 ;
inpss= 73 ;
;
renpb= 80 ;
renhb= 81 ;
rechw= 82 ;
rechd= 83 ;
reaxd= 84 ;
reaad= 85 ;
.instruction reaad , rechd00 , rechd00 ;; to be removed in rev.3
reard= 86 ;
reald= 87 ;
reagd= 88 ;
reaid= 89 ;
reasd= 8a ;
;
revpw= 90 ;
revpd= 91 ;
revab= 92 ;
revaw= 93 ;
revad= 94 ;
revaf= 95 ;
revlb= 96 ;
revlw= 97 ;
revld= 98 ;
revlf= 99 ;
revgb= 9a ;
revgw= 9b ;
revgd= 9c ;
revgf= 9d ;
revib= 9e ;
reviw= 9f ;
revid= 0a0 ;
revif= 0a1 ;
revsb= 0a2 ;
revsw= 0a3 ;
revsd= 0a4 ;
revsf= 0a5 ;
revsm= 0a7 ;
;
stnhb= 0b0 ;
stvab= 0b1 ;
stvaw= 0b2 ;
stvad= 0b3 ;
stvaf= 0b4 ;
stvlb= 0b5 ;
stvlw= 0b6 ;
stvld= 0b7 ;
stvlf= 0b8 ;
stvgb= 0b9 ;
stvgw= 0ba ;
stvgd= 0bb ;
stvgf= 0bc ;
stvib= 0bd ;
stviw= 0be ;
stvid= 0bf ;
stvif= 0c0 ;
stvsb= 0c1 ;
stvsw= 0c2 ;
stvsd= 0c3 ;
stvsf= 0c4 ;
stwsa= 0c6 ;
stbsa= 0c7 ;
stxsa= 0c8 ;; to be removed in rev.3
stcea= 0c9 ;
setre= 0cb ;
setst= 0cc ;
;
pcals= 0d0 ;
pcald= 0d1 ;
pexit= 0d2 ;
;
lpush= 0e0 ;
lpop= 0e1 ;
;
mnoop= 0f0 ;
mboot= 0f1 ;
mbtes= 0f2 ;
mbset= 0f3 ;
mxept= 0f4 ;
.p ;
;;
;; error codes
;;
csigne= 1 ; signal: reference = nill
renpbe0= 2 ; a number of words is specified by an odd number of bytes
revafe0= 3 ; xxxxf: illegal field (last < first byte)
stvafe0= 4 ; stvxf: field overflow.
iocdae0= 5 ; iocda/ioibx: nill msgptr
iocdae1= 6 ; iocda: not channel msg
ioibxe0= 8 ; ioibx: not data message
ioibxe1= 9 ; ioibx: size too small
ioibxe2= 0a ; ioibx: top <= first
arite= 0b ; arithmetic overflow
indexe= 0c ; index exception
undefins= 0d ; undefined instruction code
setodde= 0e ; odd addresses or lengths in sets
setade= 0f ; setad truncation error
stackovf= 10 ; stack overflow during stack increase
packe= 11 ; intrs, illegal value
nilade= 12 ; sa address nill
lpushe1= 13 ; lpush: nill r1
lpushe2= 14 ; lpush: not empty(r1)
lpushe3= 15 ; lpush: r1 = r2
lpushe4= 16 ; lpush: locked(r2)
lpope1= 17 ; lpop: not nill(r1)
lpope2= 18 ; lpop: nill(r2)
lpope3= 19 ; lpop: locked(r2)
cexche1= 20 ; cexch: locked(r1) or locked(r2)
;;
;; end of parameters
;;
;; end lmitxt000c
;;
;;
;; begin lmitxt001c
;;
.m lmi microprogram version 801009
auto: ;
,,cjp c7 k ;
sic:=autodisp,, ;
racom8085zd0= racom8085 - 7 ;
ra:=racom8085zd0,,,loop ;
rd:=version,,, ;
;
racom8085m4= racom8085 - 4 ;
w0:=racom8085m4,,loop ; clear the registers 3eb thru 3ff
w1:=0,,push 14 ;
ra:=w0,w0:=w0++,, ;
rd:=,,rfct ;
;
,,push 3e7 ;
ra:=w1,w1:=w1++,, ;
rd:=slu:=7ff,,rfct ; set -1 into the registers 0 thru 3e7
;
ir:=ra:=reg:=firstreg,,loop ; sync itr
zd1:=,, ; firstreg.ps:=0
zd2:=slb:=lubase,,loop ;
rd2:=sib:=autodisp,,loop ;
lev:=startlevel,,loop ;
w0:=lev,,cjs setlint ;
,,cjp fetch ;
.p ;
mma: ;proc mma; (*sel. mem-addr*)
bfm:=0c0,,h ,crtn ; msel:= base+addrsel; return;
;
mma1: ;proc seladdr1;
bfm:=0c0,errd:=w1,h ,crtn ; msel:= ba+seladdr; errd:= w1; return;
;
mma5: ;proc seladdr5;
bfm:=0c0,errd:=w5,h ,crtn ; msel:= ba+seladdr; errd:= w5; return;
;
mmaq: ;proc seladdrq;
bfm:=0c0,errd:=q++,h ,crtn ; msel:= ba+seladdr; errd:= q+1; return;
;
mmd: ;proc mmd; (*sel. mem-data*)
bfm:=0c1,,h ,crtn ; msel:= base+datasel; return;
;
thmmd: ;proc thseldata;
bfm:=0c1,,h ,crtn not pty ; msel:= ba+seldata; if not pty then return
,h ,cjpp herror ; else goto herror;
;
.p ;
stopmode: ;
,,cjp not cr mreqq ; if mreq then goto mreqq;
ir:=ra:=radummy,,, ;
;
;;
;; test af 2910 micro-sequencer stack-overflow
;; the stack should be empty at this point.
;;
,,ldct 2 ;
testmovf1: ;
,,cjs testmovf2 ;
sic,,cjp k ; the last instruction didnot unstack all
testmovf2: ;
,,rpct testmovf1 ;
,,cjs testmovf3 ;
,,cjp testmovfok ;
testmovf3: ;
,,cjs k+1 ;
,,crtn ;
testmovfok: ;
q:=zd,s,ldct 4 ;
testmovfus: ;
,,loop ;
,,rpct testmovfus ;
;
,,cjp zro exec ; if stopmode=0 then goto fetch
,,cjp b0 stopmode1 ; jump if breakpoint-mode
zd:=q--,,cjp exec ; countmode
stopmode1: ;; breakpoint mode
sib-zd0,s, ;
,,cjp not zro exec ;
sic-zd1,s, ;
exec: ; from mreqq with zro=false
ra:=reg,,cjp zro fetch ;
ba:=errb:=sib,s,cjs mma ; ba:= sib; seladdr;
c:=bd:=errd:=sic,h r ,cjp fetch0; xbus:= sic; goto fetch0;
.p ;
setslice: ;;
ra:=reg,, ;
setslice1: ;
sic:=rd,, ;
slu:=zd,, ;
setslice2: ;
slb:=zd2,, ;
sib:=rd2,,crtn ;
;; entries into fetch:
;
fetch1: ;; from fetch with zro=false
lev:=lev xor w0,, ;
rd:=sic,, ;
zd:=slu,, ;
;; no savings of the regs
;; set reg and ra according to lev:
reg:=c:lev clr 700,, ; cry:=external interrupt
bus:=lev and lev,,cjp cry fetch3;
ra:=swp,reg:=swp,,cjp fetch4;
fetch3: ;
reg:=reg++reg,,push 1 ;
ra:=reg:=reg++reg,,rfct ;
fetch4: ;; zro means test stopmode, mreqq, and level shift
slu:=zd,,cjs setslice2 ; set slb, sib
sic:=rd,, ;
execnext: ;; no test on stopmode, mreqq, or level shift
ba:=errb:=sib,s,cjs mma ; ba:= sib; seladdr;
c:=bd:=errd:=sic,h r ,cjp b0 dummyregs; xbus:= sic; read; if sib(0) goto dummyregs;
w7:=bd,h w s,cjp not cry fetch7; w7:= waitmem; if odd(sic) goto fetch7
,,cjp fetch5 ; else goto fetch5;
.p ;
;; logical testsequence in fetch:
;; 1. mreqq
;; 2. stopmode
;; 3. level shift
;; 4. mcb, dummy regs
;; the actual test sequence may because of convenience differ from
;; this scheme. the logical testsequence must, however, as a
;; general rule be as outlined above.
;
sfetch: ;
ra:=reg,,cjs setslice1 ;
;
.instruction mnoop ;
;
fetch: ;
ba:=errb:=sib,s,cjp not c7 stopmode; ba:= sib; if -,run goto stopmode;
bfm:=0c0,,h , ; msel:= ba+seladdr;
c:=bd:=sic,h r ,cjp not cr mreqq; xbus:= sic; read; if -,cr goto mreqq;
fetch0: ; (* from exec with readmem started *)
int,,h ,cjp b0 dummyregs ; if sib(0) goto dummyregs; (* nasty bp *)
w0:=int xor lev,h s,cjp not cry fetch6; x:= int xor lev; if odd(sic) goto fetch6;
w7:=bd,h w s,cjp not zro fetch1; w7:= waitmem; if x<>0 goto fetch1;
fetch5: ;(* from execnext *)
ir:=w3:=w7,h ,cjs pty perror; ir:= w7; if pty then perror;
;;cjs statistics
rd:=sic,sic:=sic++,,jmap 8 ; ic:= sic; sic:= sic+1; goto map(ir);
;
fetch6: ;
w7:=bd,h w s,cjp not zro fetch1; w7:= waitmem; if x<>0 goto fetch1;
fetch7: ;(* from execnext *)
ir:=w3:=swp,h ,cjs pty perror; ir:= swap(w7); if pty then perror;
;;cjs statistics
rd:=sic,sic:=sic++,,jmap 8 ; ic:= sic; sic:= sic+1; goto map(ir);
.p ;
;;
;; procedure terror
;; return if no pty error or puerrmask.b1 (*supp. pty err*)
;;
;; entry: errb, errd, stat(pty)= def.;
;; exit : ra= regs, stat= undf;
;;
;; procedure perror
;; return if puerrmask.b1 (*supp. pty err*)
;;
;; entry: errb, errd: def.;
;; exit : ra= regs, stat= undf;
;;
terror: ;proc terror;
,h ,crtn not pty ; if not pty then return;
perror: ;proc perror;
ra:=puerrmsk,,h , ;
rd,,h s, ; if puerrmask.b1 then
ra:=reg,h ,crtn b1 ; return
,h ,cjp herror ; else goto herror;
;;
;; procedure therror
;; return if no pty error
;;
;; entry: errb, errd, stat(pty)= def.;
;; exit : all unch;
;;
therror: ;proc therror;
,h ,crtn not pty ; if not pty then return;
.p ;
;;
;; procedure herror
;; unconditional pty error
;;
;; entry: errb, errd= def.;
;; exit : to fetch;
;;
herror: ;proc herror;
q:=56,h , ; 01010lr0: q:= memory error;
bd,,h w , ; define left and right parity error
,,cjv 3 ptyerror1 ; w5:= (d+1) - 1;
.loc ;
ptyerror1: ;
q:=q-2,, ; remove both left and right parity error
q:=q-2,, ; remove left parity error
q:=q-2,, ; remove right parity error
;
;;send mess to debug console
;;q,errb,errd=message
ra:=racom8085,,,loop ;
rd1:=q,,loop ;
rd2:=errb,,loop ;
rd:=errd,, ;
led:=6,,, ;
sendmess1: ;
,,cjp cr k ;
,,cjs mrequest ;
,,cjp c7 sendmess1 ; wait while run-mode
,,cjp sfetch ;
;
.p ;
;;
.instruction mxept ;
;;
,,cjs readlucq ;
,,cjp xept ;
;;
;; procedure undefined-instruction
;;
.instruction ;
;;
;; procedure xept(error); (* unconditional program exception *)
;;
;; entry: q= error;
;; exit : (* p.t. n.a *) q= stat= undf, ra= regs;
;;
q:=undefins,, ; error:= undefined instruction;
xept: ;proc xept;
;; o b s : changes ir
ra:=reg,,cjs setslice ; p.t. no return;
ir:=300,w2:=spb,,loop ;
w1:=excode--,,loop ;
w1:=w1+rd1,,loop ; d:= pr+excode-1;
w3:=q,,cjs writenext ; writenext(spb,d,error);
w1:=w1+4,,loop ; d:= pr+exic-1;
w3:=rdx,,cjs writenext ; writenext(spb,d,ib);
w3:=rd,,cjs writenext ; writenext(spb,d,ic);
w5:=w1-8,, ; d:= pr+exadr-1;
w6:=spb,,cjs readnext ; readnext(spb,d);
sib:=bd,h w s, ; sib:= waitmem;
rdx:=sib,,cjs readnextt ; ib:=sib; readnextt(spb,d);
sic:=bd,h w s,cjs terror ; test parity; sic:= waitmem;
w5:=w5+maxstackrel,, ;
,,cjs readnext ; readnext(pb,pr+maxstack);
w3:=bd,h w s,cjs terror ; lm:= waitmem; testparity;
zd0:=w3,, ;
,,cjp fetch ; goto fetch
.p ;
;;
;; procedure tstack
;;
;; entry: exit: slu, lm;
;;
tstack: ;proc tstack;
zd0-slu,s, ;
,,crtn acy ;
;;
;; stack overflow
;;
stackerror: ;
q:=stackovf,, ; error:= stack overflow;
,,cjp xept ; goto exception;
.p ;
swap: ;
q:=swp and w4,, ;
swp,q:=q+w0,, ;
w0:=swp and w5,,crtn ;
;
shiftcom: ;
w3,,cjs swap ;
w1,w3:=q,,cjs swap ;
w2,w1:=q,,cjs swap ;
w0,w2:=q,,crtn ;
;
mrqterror: ;
zd0:=w2,,crtn not pty ; zd0:=the read data
ccr,,,cjp herror ;
;
mreqq: ;
zd:=slu,, ;
rd:=sic,,cjs mrequest ;
,,cjp fetch ;
;
mrequest: ;
ir:=300,,, ;
ra:=racom8085,,, ;
w2:=zd0,, ;
w1:=zd1,, ;
w3:=zd2,, ;
w4:=0ff,, ;
w5:=swp,,cjv 6 mrq5 ;
;
.loc ;
;
mrq5: ;
,,cjp mrq7a ; disp:=2; tti interrupt
c:=w5:=w5--w5,,cjp mrq7 ; disp:=0; timer interrupt
c:=w5:=0,,cjp mrq7 ; disp:=1; tto interrupt
,,cjv 5 mreq ; normal request
;
mreq: ;012345
,,cjv 4 mrq1 ;xx0011
,,cjv 4 mrq2 ;xx0111
,,cjv 4 mrq3 ;xx1011
,,cjv 4 mrq4 ;xx1111
;
mrq1: ;
cd,,,cjp putgetdata ;000011 putgetdata
,,cjp k ;010011
w2:=w2-w2,,cjp mrq14 ;100011 read data
,,cjp mrq9 ;110011 write request
;
mrq2: ;
ccr,w0--w0,s,cjpp exec ;000111 execute
,,cjp k ;010111
,,cjp mrq21 ;100111 putmem
,,cjp mrq19 ;110111 getmem
;
mrq3: ;
w2:=cd and w4,,cjp getregaddr;001011 get register address
w0:=w0--w0,,cjp mrq10 ;011011 test level o b s
ccr,,,jz ;101011 autoload
w0:=reg,,cjp getlev ;111011 get lev
;
mrq4: ;
ccr,w0--w0,s,cjpp execnext ;001111 execute on curr. level
bus:=w3,,cjp selftest ;011111 selfdiagnostic test
ra:=w1,,cjp mrq23 ;101111 putreg
ra:=w3,,cjp mrq22 ;111111 getreg
;
mrq7a: ;;set tti interrupt
c:=w5:=1,, ; disp:=2
mrq7: ;;set timer interrupt or console interrupt
w6:=w6-w6,,cjs readnext ;
w3:=bd,h w s,cjs getbyte ;
,,cjs pty mrqterror ;
w0:=w3,,cjs setlint ; set interrupt
,,cjp mrq10 ;
;
mrq9: ;;write request
;; rd1, rd2, rd3 : message
;; zd3 : data byte
;
w0:=rdw,s, ; w021:=message
w2:=rdx,, ;
w1:=rd,,cjp zro mrq9a ; jump if no message
led:=6,,, ; send interrupt
rdw:=,,cjp mrq10a ; send message
mrq9a: ;; send data byte
w0:=zd,, ;
w2:=swp,, ; w02:=data byte
zd:=,,cjp mrq10a ;
;
putgetdata: ;; bus=data to be put
w0:=swp and w5,,cjs shiftcom;
w0:=swp,,cjp mrq10a ;
;
getregaddr: ;
w2:=w2+w2,,push 1 ;
w2:=w2+w2,,rfct ;
;
mrq22a: ;
ra:=racom8085,,, ;
;
mrq10a: ;;update the cyclic buffer
zd0:=w2,, ;
zd1:=w1,, ;
zdx:=w3,,cjp mrq10 ;
;
getlev: ;
ir:=c:=,,push 2 ;
w0:=>w0,,rfct ;
;
mrq10: ;; end session
cd:=w0,, ;
ccr,,,cjp setslice ;
;
mrq14: ;;read data
q:=w3 and 3f,, ;
w3,w1:=q--,, ;
w3:=swp and w4,,cjs writebnext;
,,cjp mrq10 ;
;
mrq19: ;;get mem
w6:=w1,, ; base
w5:=w3--,,cjs readnext ;
0,,h , ; force ones to the backplane bus
w2:=bd,h w s,cjs mrqterror ; zd0:=data
,,cjp mrq10 ;
;
mrq21: ;;putmem
w1:=w1--,,cjs writenext ;
,,cjp mrq10 ;
;
mrq22: ;;get reg
w2:=rd,,cjp mrq22a ;
;
mrq23: ;;put reg
rd:=w3,,cjp mrq10 ;
;
;;
;; end lmitxt001c
;;
;; begin lmitxt002c
;;
;; rev: 801009 hlv
;
;; procedure readcont (* 8x = 1,74us *)
;; procedure readcontt (* 9x = 1,95us *)
;;
;; entry: w7= if odd(sic) then mem(sib,sic-1) else undf; sib, sic= def.;
;; exit : sic= sic+2, w3= mem(sib,sic); stat(w3) def; errb,errd=def;
;; w7= if odd(sic) then mem(sib,sic+1) else unch.;
;;
readcontt: ;proc readcontt;
,h ,cjs pty perror ; if pty then perror;
readcont: ;proc readcont;
ba:=errb:=sib,, ; ba:= errb:= sib;
bfm:=0c0,errd:=sic++,h , ; msel:= seladdr+ba; errd:= sic+1;;
bd:=errd,sic:=errd++,h r s,; xbus:= sic+1; read; sic:= sic+2;
q:=w7 and 0ff,h , ; lb:= w7(8:15); w3:= waitmem; if even(sic) then
w3:=bd,h w s,cjp b15 therror; begin testpty; return; end;
w7:=w3,h ,cjp pty herror ; if pty then harderror;
w3:=w3 and 700,, ; rb:= w3(0:7);
bus:=w3+q,, ;
w3:=swp,s,crtn ; w3:= lb shift 8 + rb; return;
;;
;; procedure readbcont (* 5,25x = 1,14us *)
;; procedure readbcontt (* 6,25x = 1,36us *)
;;
;; entry: w7= if odd(sic) then mem(sib,sic-1) else undf; sib,sic= def;
;; exit : w4= byte(sib,sic); errb, errd= def; sic= sic+1; stat(w4) def;
;; w7= if even(sic) then mem(sib,sic+1) else undf;
;;
readbcontt: ;proc readbcontt;
,h ,cjs pty perror ; if pty then perror;
readbcont: ;proc readbcont;
bus:=sic,sic:=sic++,s, ; sic:= sic+1; if even(sic) then
w4:=w7 and 0ff,s,crtn b15 ; begin w4:= w7(8:15); return; end;
ba:=errb:=sib,,cjs mma ; ba:= errb:= sib; seladdr;
bd:=errd:=sic--,h r , ; xbus:= errd:= sic-1; read;
w4:=0ff,h , ;
w7:=bd,h w s, ; w7:= waitmem;
w4:=w4 and swp,h s,crtn not pty ; w4:= w7(0:7); if not pty then return
,h ,cjp herror ; else harderror;
.p ;
;;
;; procedure readcont34 (* 18x = 3,91us *)
;;
;; entry: sib= b, sic= d, w7= as readcont;
;; exit : sib= b, sic= d+4, w7= as readcont, w3= memword(b,d+2),
;; w4= memword(b,d); errb,errd= def;
;;
readcont34: ;proc readcont34;
,,cjs readcont ; w4:= readcont(b,d);
w4:=w3,,cjp readcont ; w3:= readcont(b,d+2); return;
;;
;; procedure readcown36 (* 18x = 3,91us *)
;;
;; entry: sib, sic;
;; exit : w3= memword(sib,sic+2), w6= memword(sib,sic);
;;
readcown36: ;proc readcown36;
,,cjs readcont ; w6:= readcont;
w6:=w3,,cjp readcont ; w3:= readcont; return;
;;
;; procedure getsa (* 23x = 5,0us *)
;; procedure getsat (* 24x = 5,2us *)
;;
;; entry: -
;; exit : w1= mem(lu) + rel - 1; w2= mem(lu-2); w3= rel; q= w6= undf;
;; read(mem(lu-2)) started;
;;
getsat: ;proc getsat;
,h ,cjs pty perror ; if pty then perror;
getsa: ;proc getsa;
,,cjs readcont ; rel:= readcont;
w1:=w3--,,cjs readluc ; readluc;
w1:=w1+bd,h w s,cjs readluct; d:= rel-1+waitmem; readluct;
w2:=bd,h w s,cjp terror ; b:= waitmem; testpty; return;
.p ;
;;
;; procedure clearbits(mask); (* 2x = 0,43us *)
;;
;; entry: w0= mask;
;; exit : w0= unch, q= old ps;
;;
clearbits: ;proc clearbits;
q:=zd1,, ; ra.ps:= ra.ps and -,mask;
zd1:=q clr w0,,crtn ; return;
;;
;; procedure getbyte; (* 2,5x = 0,54us *)
;; procedure getbytet; (* 2,5x = 0,54us *)
;;
;; entry: c= even(adr); w3= swp= word(adr);
;; exit : b3= byte, w4= swp(word(adr));
;;
getbyte: ;proc getbyte;
w4:=swp,,cjp cry getby10 ; w4:= swap(word(adr));
w3:=w3 and 0ff,,crtn ; w3:= if cry then w4 and rmask
getby10: ; else w3 and r-mask;
w3:=w4 and 0ff,,crtn ; return;
;
getbytet: ;proc getbytet;
w4:=swp,h ,cjp cry getby20 ; w4:= swap(word(addr));
w3:=w3 and 0ff,h ,crtn not pty ; w3:= if cry then w4 and rmask
,h ,cjp perror ; else w3 and rmask;
getby20: ; if pty then perror;
w3:=w4 and 0ff,h ,crtn not pty ; return;
,h ,cjp perror ;
.p ;
;;
;; procedure testint; (* 2x = 0,43us *)
;; procedure testint1; (* 1x = 0,22us *)
;;
;; entry: -
;; exit : stat(zro)= (int=lev);
;;
testint: ;proc testint;
int,,h , ; (* int must be read twice *)
testint1: ;proc testint1;
int xor lev,h s,crtn ; stat:= (int=lev); return;
;;
;; procedure nill (* 1x = 0,22us *)
;;
nill: ;proc nill;
bus:=40,,,crtn ; swap:= nill; return;
;;
;; procedure read12 (* 3x = 0,65us *)
;; procedure read12t (* 4x = 0,78us *)
;;
;; entry: w1= d-1, w2= b;
;; exit : w1= w2= unch; readmem(b,d) started; errb, errd= def;
read12t: ;proc read12t;
,h ,cjs pty perror ; if pty then perror;
read12: ;proc read12;
ba:=errb:=w2,,cjs mma ; ba:= b; seladdr;
bd:=errd:=w1++,h r ,crtn ; xbus:= d; read; return;
.p ;
;;
;; procedure readluc (* 3x = 0,65us *)
;; procedure readluct (* 4x = 0,87us *)
;;
;; entry: -
;; exit : errb= slb, errd= slu-1; slu= slu-2;
;; readmem(slb,slu-1) started;
;;
readluct: ;proc readluct;
,h ,cjs pty perror ; if pty then perror;
readluc: ;proc readluc;
ba:=errb:=slb,, ; ba:= errb:= slb;
bfm:=0c0,errd:=slu--,h , ; msel:= mamadr+ba; errd:= slu-1;
bd:=errd,slu:=errd--,h r ,crtn ; xbus:= errd; slu:= slu-2; read; return;
;;
;; procedure readlucq (* 6,5x = 1,4us *)
;; entry: -
;; exit: q= mem(slb, slu), slu= slu-2, w5= slu, w6= slb, stat(q) def;
;;
readlucq: ;
,,cjs readluc ;
q:=bd,h w s,cjp therror ;
;;
;; procedure readnext (* 3x = 0,65us *)
;; procedure readnextt (* 4x = 0,87us *)
;;
;; entry: w5 = d-1, w6= b
;; exit: w5 = w5+2, w6 = b, errb, errd def;
;;
readnextt: ;proc readnextt;
,h ,cjs pty perror ; if pty then perror;
readnext: ;proc readnext;
ba:=errb:=w6,, ; ba:= errb:= b;
bfm:=0c0,errd:=w5++,h , ; msel:= ba+memadr; errd:= d+1;
bd:=errd,w5:=errd++,h r ,crtn ; xbus:= errd; d:= d+2; read; return;
.p ;
;;
;; procedure writenext (* 7x = 1,51us *)
;; procedure writenextt (* 8x = 1,74us *)
;;
;; entry: w1= disp-1; w2= base; w3= data;
;; exit : w1= disp+1; w2= w3= unch;
;;
writenextt: ;proc writenextt;
,h ,cjs pty perror ; if pty then perror;
writenext: ;proc writenext;
ba:=w2,,cjs mma ; ba:= base; seladdr;
bd:=w1:=w1++,h ,cjs mmd ; xbus:= disp; w1:= disp+1; seldata;
bd:=w3,w1:=w1++,h w ,crtn ; xbus:= w3; write; return;
;;
;; procedure writebnext (* 7x = 1,51us *)
;; procedure writebnextt (* 8x = 1,74us *)
;;
;; entry: w1= disp-1; w2= base; w3= byte;
;; exit : w1= disp; w2= w3= unch;
;;
writebnextt: ;proc writebnextt;
,h ,cjs pty perror ; if pty then perror;
writebnext: ;proc writebnext;
ba:=w2,,cjs mma ; ba:= base; seladdr;
bd:=w1:=w1++,h ,cjs mmd ; xbus:= w1:= disp; seldata;
bd:=w3,h w b ,crtn ; xbus:= byte; writebyte; return;
.p ;
;;
;; procedure wrfetch (* 8x = 1,74us *)
;; procedure wrfetcht (* 9x = 1,95us *)
;;
;; entry: w3= data;
;; exit : to fetch;
;;
wrfetcht: ;proc wrfetcht;
,h ,cjs pty perror ; if pty then perror;
wrfetch: ;proc wrfetch;
slu-zd0,s, ; if slu>=maxstack then goto stackerror;
ba:=slb,slu:=slu++,,cjp acy stackerror; ba:= slb; seladdr;
bfm:=0c0,,h , ; msel:= ba+seladdr;
bd:=slu,slu:=slu++,h ,cjs mmd; xbus:= slu+1; slu:= slu+2; seldata;
bd:=w3,h w ,cjp fetch ; xbus:= data; write; goto fetch;
;;
;; procedure wr34fetch (* 16x = 3,47us *)
;; procedure wr34fetcht (* 17x = 3,69us *)
;;
;; entry: w3= data1; w4= data2;
;; exit : to fetch;
;;
wr34fetcht: ;proc wr34fetcht;
,h ,cjs pty perror ; if pty then perror;
wr34fetch: ;proc wr34fetch;
slu-zd0,s, ; if slu>=maxstack then goto stackerror;
ba:=slb,slu:=slu++,,cjp acy stackerror; ba:= slb;
bfm:=0c0,,h , ; msel:= ba+seladdr;
bd:=slu,slu:=slu++,h ,cjs mmd; xbus:= slu+1; slu:= slu+2; seldata;
bd:=w4,h w ,cjp wrfetch ; xbus:= data2; write; goto wrfetch;
;;
;; procedure write56 (* 7x = 1,52us *)
;;
;; mem(w6,w5-1):= data;
;; entry: w5= d, w6= b, w7= data;
;; exit : unch;
;;
write56: ;proc write56;
ba:=w6,,cjs mma ; ba:= b; seladdr;
bd:=w5--,h ,cjs mmd ; xbus:= d-1; seldata;
bd:=w7,h w ,crtn ; xbud:= data; write; return;
.p ;
;; procedure clear (* ext: 6x = 1,30us, int: 9x = 1,95us *)
;;
;; entry: lev;
;; exit : w0= level, q= undf, ra= unch, ir= 300, stat= undf;
;;
clear: ;proc clear;
w0:=lev and 0ff,s, ; bplevel:= lev(8:15);
q:=w0 ior 200,, ; if bplevel=0 then goto clearown;
bf:=q,h ,cjp zro clearown ; msel:= bplevel + interrupt;
q:=w0 and 7,h , ; chan:= bplevel(13:15);
bd:=q,h w , ; xbus:= chan + clear interrupt;
ir:=300,,,crtn ; sync-intrp; return;
clearown: ;clearown:
ir:=c:=2,w0:=reg,h ,push 2 ;
w0:=>w0,h ,rfct ; ilevel:= reg shift (-3);
bf:=w0,h , ; msel:= ilevel;
ir:=300,,u ,crtn ; setsoft; sync-intrp; return;
;;
;; procedure setlocalint(level) (* 10x = 2,17us *)
;; procedure setown (* 14x = 3,04us *)
;;
;; entry: w0= level; (* setlint only *)
;; exit : w0= level, q= undf, stat= undf, ir:= 320;
;;
setown: ;proc setown;
ir:=c:=2,w0:=reg,,push 2 ;
w0:=>w0,,rfct ; level:= reg shift (-3);
setlint: ;proc setlint;
q:=w0 ior 200,, ; q:= level ior -,iors0;
bf:=q,, ; msel:= q;
q:=q and 7,, ; q:= lev and dev-mask
q:=q ior 20,, ; + setint;
bd:=q,h w , ; xbus:= q;
w0--sintmax,s, ; if level<=softintmax then
ir:=320,,,crtn acy ;
q:=q xor 28,, ; msel:= level(13:15) ior setsoft;
bf:=q,, ;
ir:=320,,u ,crtn ; sync-intrp; return;
;;
;; end of lmitxt002c
;;
;
;;
;; begin lmitxt003c
;;
;; rev: 801006 fh/hlv
;
dumpregs: ;
;; entry: ra = register address
;; exit: ir=300, w0,1,2,5,6 undefined
;
ir:=300,,, ;
w2:=rdx,s, ;
w1:=rd,,crtn b0 ; return if dummyregs
w5:=rdw,, ;
dumplmp8= dumplm + 8 ;
w5:=w5+dumplmp8,, ; address of dumpib
w6:=zdx,,cjs cwrite21 ; dump ib, ic
w5:=w5-4,, ;
w1:=rd0,, ;
w2:=zd,,cjs cwrite21 ; dump lu, sf
w5:=w5-4,, ;
w2:=zd0,, ;
w1:=zdw,,cjs cwrite21 ; dump lm, ps
rdx:=7ff,,,crtn ; indicate dummyregs; return
.p ;
loadregs: ;
;; entry: w43=nbd=üprocess description
;; exit: w0,1,2,5,6 undefined
;; ra=register address
;; w7=nbdü.level
;; ir=300
;
w5:=w3+level,, ;
w6:=w4,,cjs creadbyte1 ;
w0:=w1,,push 2 ;
ra:=w0:=w0++w0,,rfct ; ra:=w0:=register address
w7:=w1,,cjs dumpregs ; w7:=nbdü.level; dumpregs(ra)
rdw:=w5:=w3,, ; pb, gf := nbd
w5:=w5+dumplm,, ;
zdx:=w6:=w4,,cjs cread21 ;
w5:=w5+4,, ;
zd0:=w2,, ;
zdw:=w1,,cjs cread21 ; load lm, ps
w5:=w5+4,, ;
rd0:=w1,, ; load lu, lf
zd:=w2,,cjs cread21 ;
rdx:=w2,, ; load ib, ic; now dr is cleared
rd:=w1,,crtn ; return
.p ;
;; usage of the registerset with base ramonitor:
;; zd0,zd1=zd0,zdw: üactq(0)
;; zd2=zdx: n
;; zd3=zd: m
;; rd0: k
;; rd1=rdw: nxt
;; rd2,rd3=rdx,rd: dummy loop counter
;;
;; the active queue array is declared as
;; var actq: array(m..n) of addr,
;; where n>=0 and either
;; m < 0 and m <= k < 0 or else
;; m = 0 and k = -1.
;; if n=-1 then dummy looping is performed.
;; k may be changed by the time slice scheduler. if the time slice
;; scheduler is not a level 0 process then it must interrupt level 1
;; after having changed k.
;; k defines the priority sequence amongst the active queues as follows:
;; n, n-1, - - - , 0, k, -1, -2, - - - (not k) - - - , m.
;; nxt is used for scanning the active queues. it is reset to the value
;; n before starting scheduling. nxt=m-1 means dummy looping.
.p ;
dummyregs: ;dummyregs: (* from fetch when sib(0) *)
w0:=int xor lev,s, ; x:= int xor lev;
,,cjp not zro fetch1 ; if x<>0 goto fetch1; (* service intrp *)
reg xor 7,s, ;
ra:=ramonitor,,, ;
q:=rd0,, ; q:=k
w0:=rd1,, ; w0:=w7:=nxt
ir:=c:=300,w7:=w0,, ;
zdx++,s,cjp not zro dci ; if reg<>7 then goto dummy clear
zd--w0,s,cjp zro sch20 ; if n=-1 then goto dummy loop
w0,s,cjp zro sch20 ; if nxt=m-1 then goto dummy loop
w0-q,s,cjp not b0 sch1 ; if nxt>=0 then goto ok
w0++,s,cjp not acy sch1 ; if nxt<k then goto ok
w0:=w0++,,cjp b0 sch1 ; w0:=w0+1; if nxt<-1 then goto ok
w0:=q,, ; w0:=k
sch1: ;ok:
w0:=<w0+w0,, ;
w6:=zd0,, ; w65:=üactq(w0)
w5:=zdw+w0,,cjs cread21 ; w21:=cread21(w65)
w2,s, ;
,,cjp not b1 sch10 ; if -,nill(w21) goto startlevel;
rdw:=w7--,,cjp sfetch ; nxt:=nxt-1; goto sfetch
;
sch10: ;; start level 0
;
,,cjs cread65 ; w65:=üfirst
w4:=w6,, ; nbd:=üfirst
w3:=w5,,cjs loadregs ; loadregs(nbd)
,,cjp sfetch ; goto sfetch
.p ;
sch20: ;; dummy loop counter
;
q:=rd++,s, ;
rd:=q,,cjp not acy sfetch ;
q:=rdx++,, ;
rdx:=q,,cjp sfetch ; goto sfetch
;
dci: ;; dummy clear interrupt
ra:=radummy,,, ;
rd0:=lev,, ;
w0:=rdw,, ;
rdw:=w0++,,cjp dci1 ;
;
;
.instruction sched ;
;; this instruction is executed on level 1 and it starts the
;; scheduling
;
ra:=ramonitor,,, ;
q:=zd2,, ; level1.nxt:=level1.n
rd1:=q,, ;
ra:=7,,, ;
,,cjs dumpregs ; dumpregs(0)
dci1: ;
,,cjs clear ; clear
ra:=reg,,cjp fetch ; goto fetch
;
;
.instruction cstdr ;
,,cjs readlucq ; nbd:=üprocess description
w3:=q,,cjs readlucq ;
w4:=q,,cjs loadregs ; loadregs(nbd)
w0:=w7,,cjs setlint ; setlint(nbdü.level)
ra:=reg,,cjp fetch ; goto fetch
;;
.m rc 3502 micro-program - input/output instructions
;;
.m rev: 801007 hlv
;;
;; file: lmitxt040c
;;
;
;;
;; 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;
q:=w0 ior 100,, ; q:= dev ior iors0;
bf:=q,,cjp not st2 k ; repeat msel:= q until -,busy;
q:=w0 and 7,, ; chan:= dev and chan-mask;
bd:=q ior w4,h w , ; xbus:= func ior chan;
bf:=w0,, ; 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;
;;
;; entry: ra= reg;
;; exit : ra= unch, q= 4000;
;;
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;
q:=q ior 2,h , ; ps:= ps ior eoi;
zd1:=q,h ,crtn ; return;
.p ;
;;
;; procedure readlu4c (* 15,5x = 3,36us *)
;;
;; entry: -
;; exit : w0= word(slu), w1= word(slu-2), w2= word(slu-4), read(slu-6) started,
;; slu= slu-8, errb,errd= def;
;;
readlu4c: ;proc readlu4c;
ba:=errb:=slb,,cjs mma ; ba:= errb:= slb; seladr;
bd:=errd:=slu--,h r ,cjs readlu4c20; xbus:= errd:= slu-1; read; startreadnext;
w0:=bd,h w s,cjs readlu4c10; w0:= waitmem; startreadmextt;
w1:=bd,h w s,cjs readlu4c10; w1:= waitmem; startreadnextt;
w2:=bd,h w s,cjp readlu4c10; w2:= waitmem; startreadnextt; return;
;
readlu4c10: ;proc startreadnextt;
bd:=errd:=slu--,h r ,cjp pty readlu4c30; xbus:= errd:= slu-1; read;
; if pty then goto readlu4cpty;
readlu4c20: ;proc startreadnext;
slu:=errd--,h ,crtn ; slu:= slu-2; return;
;
readlu4c30: ;readlu4cpty;
bd,,h w ,loop ; waitmem;
bd:=errd:=slu++,h r ,cjp herror; xbus:= errd:= slu; read; goto herror;
.p ;
;;
;; procedure readluptr (* 18,5x = 4,01us *)
;;
;; 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 therror ; 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);
.p ;
;;
.instruction ioctc ; count timeout
;;
;; param:: none;
;; stack:: level: word -> ;
;;
,,cjs readluc ; readluc;
w0:=bd,h w s, ; l:= waitmem;
w4:=w0,,cjs pty perror ; testpatity;
ir:=c:=81,w4:=w4++w4,, ;
w4:=<w4++w4,, ; r:= l shift 3 + 7;
ra:=w4,, ; ra:= r;
bus:=rd2,,s, ; if r.ib = dr then goto end-ioctc;
w5:=rdx--,,cjp b0 ioctc20 ; d:= r.pr;
w6:=zd2,, ; b:= r.pb;
w5:=w5+timer,, ; d:= d+timer-1;
w1:=w5,,cjs readnext ; readnext(b,d);
w2:=w6,h , ;
w3:=bd,h w s,cjs terror ; t:= waitmem; testparity;
ra:=w4,w3:=w3--,s,cjp zro ioctc20; ra:= r; if t=0 then goto end-ioctc;
,,cjp not zro ioctc10 ; t:= t-1; if t=0 then
w4:=zd1,, ; begin (* timeout *)
w4:=w4 ior 4,, ; r.ps.to:= true;
zd1:=w4,, ;
,,cjs setlint ; setlocalint(l);
ioctc10: ; end;
,,cjs writenext ; writenext(b,d,t);
ioctc20: ;end-ioctc:
ra:=reg,,cjp fetch ; ra:= reg; goto fetch;
.p ;
;;
.instruction iocci ; clear-interrupt;
;;
;; param:: none;
;; stack:: -> ;
;;
w3:=zd1,, ;
w3 and 4,s, ;
,,cjs zro clear ; if not sib.to then clear;
,,cjp fetch ; 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;
,,cjp execnext ; 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 therror; devno:= waitmem and devmask; testpty;
,,cjp not b0 wrfetch ; if waitmem(0)=0 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 readluc ; readluc;
w0:=bd,h w s,cjs terror ; level:= waitmem; testparity;
,,cjs setlint ; setlocalint(level);
,,cjp fetch ; 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 iorbb ;
;;
;; param:: none;
;; stack:: dev: word; faddr: addr; cnt: word -> cnt: word;
;;
,,cjs initiob ; initiob;
w4:=,,cjs readlu4c ; dev,b,d:= readlu4c; func:= readdata;
w3:=w3-w3,h ,ldct iorbb20 ; control:= 0;
w7:=bd,h w s,jsrp not cry xmitwordt; cnt:= waitmem; if to then goto iob-to;
,h ,cjs waitrec ; xmitwordt(dev,func,0); waitrec;
w3:=bd,h w ,cjs seteoi ; byte:= xbus; seteoi;
,h ,cjp not zro iorbb30 ; if eoi or hard-to then goto iob-eoi;
w1:=w1--,,cjs writebnext ; writebnext(b,d-1,byte);
;;
;; entry common-iob;
;;
;; entry: w1= newd-1, w2= b, w5= oldslu-6, w6= slb, w7= newcnt+1,
;; slu= oldslu-8;
;;
iorbb10: ;common-iob:
w7:=w7--,s,ldct write56 ; cnt:= cnt-1; if cnt=0 then iob-cnt
w5:=w5++,,jsrp zro iorbb25 ; else write56(slb,slu+3,cnt);
w5:=slu+6,, ;
w7:=w1++,,cjs write56 ; write56(slb,slu+6,b+1);
slu:=slu+8,, ; slu:= slu + 8;
sic:=sic--,,cjp fetch ; sic:= sic-1; goto fetch;
iorbb20: ;iob-to:
,,cjs pty perror ; testparity;
iorbb25: ;proc iob-cnt;
,,loop ;
iorbb30: ;iob-eoi:
,,cjs setown ; setowninterrupt;
w3:=w7,,cjp wrfetch ; goto wrfetch(cnt);
.p ;
;;
.instruction iorbw ;
;;
;; param:: none;
;; stack:: dev: word; faddr: addr; cnt: word -> cnt: word;
;;
,,cjs initiob ; initiob;
w4:=,,cjs readlu4c ; dev,b,d:= readlu4c; func:= readdata;
w7:=7fe,h , ;
w3:=w3-w3,h ,ldct iorbb20 ; control:= 0;
w7:=bd and w7,h w s,jsrp not cry xmitwordt; cnt:= waitmem; if to then goto iob-to;
,h ,cjs waitrec ; xmitwordt(dev,func,0); waitrec;
w3:=bd,h w ,cjs seteoi ; w:= xbus; seteoi;
w1:=w1--,h ,cjp not zro iorbb30; if eoi or hard-to then goto iob-eoi;
w7:=w7--,,cjs writenext ; cnt:= cnt-1; writenext(b,d-1,w);
,,cjp iorbb10 ; goto common-iob;
;;
;; procedure initiob;
;;
;; entry: -
;; exit : w0= ps, cry= ps.to, level cleared;
;;
initiob: ;proc initiob;
w0:=zd1,, ;
c:w0 and 4,, ; cry:= r.ps.to;
,,cjp clear ; clear; return;
.p ;
;;
.instruction iowbb ;
;;
;; param:: none;
;; stack:: dev: word; faddr: addr; cnt: word -> cnt: word;
;;
,,cjs initiob ; initiob;
w6:=slb,,cjs readlu4c ; dev,b,d:= readlu4c;
w1:=w1--,h ,ldct iorbb20 ;
w7:=bd,h w s,jsrp not cry read12t; cnt:= waitmem; if to then goto iob-to;
c:=w1,w1:=w1++,h , ; read12t(b,d-1);
q:=40,h , ; func:= write data;
w3:=bd,h w s,cjs getbytet ; byte:= getbytet(waitmem);
w4:=q,h ,cjs xmitword ; xmitword(dev,func,byte);
,h ,cjs seteoi ; seteoi;
,h ,cjp st3 iorbb10 ; goto if -,eoi then common-iob
,,cjp iorbb30 ; else iob-eoi;
;;
.instruction iowbw ;
;;
;; param:: none;
;; stack:: dev: word; faddr: addr; cnt: word -> cnt: word;
;;
,,cjs initiob ; initiob;
,,cjs readlu4c ; dev,b,d:= readlu4c;
w1:=w1--,h ,ldct iorbb20 ;
w7:=7fe,h , ;
w7:=bd and w7,h w s,jsrp not cry read12t; cnt:= waitmem; if to then goto iob-to;
w1:=w1+2,h , ; read12t(b,d-1); d:= d+2;
w4:=40,h , ; func:= write data;
w3:=bd,h w s,cjs terror ; data:= waitmem; testparity;
,,cjs xmitword ; xmitword(dev,func,data);
,h ,cjs seteoi ; seteoi;
w7:=w7--,h ,cjp st3 iorbb10; cnt:= cnt-1; goto if -,eoi
,,cjp iorbb30 ; then common-iob else iob-eoi;
.p ;
;;
.instruction ioibx ;
;;
;; param:: none;
;; stack:: dev: word; msg: addr; last, first: word ->
;; dev: word; sad: addr; count, top: word;
;;
slu:=slu-2,, ; slu:= slu-2; (* keep dev *)
,,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;
ir:=20,,h , ; ir.shift:= logical;
w0:=bd,h w s,cjs read12t ; first:= waitmem; read12t(msg.b,msg.d);
w5:=w1+2,h , ; msg.d:= msg.d+2;
w6:=w2,h , ;
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+0a,h , ; slu:= slu + 10;
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 ;
;;
.instruction mboot ;
;;
;; param:: dev:byte; fadr: addr;
;; stack:: -> ;
;;
,,cjs readbcont ; dev:= readbcont;
w0:=w4,,cjs readcont ; b:= readcont;
w2:=w3,,cjs readcont ; d:= readcont - 1;
w1:=w3--,, ;
w4:=80,, ; func:= read status;
,,cjs xmitword ; xmitword(dev,func,dummy);
w4:=3,h i , ;
,h i ,cjs waitrec ; waitrec;
w4:=w4 and bd,, ; stat:= xbus(reader ready + pok);
w4 xor 3,s, ;
,,cjp not zro mboot30 ; if stat<>pok+ready then goto end-mboot;
w7:=40,, ;
mboot10: ; repeat (* skip until 64 or eoi *)
q:=w0-w0,h ,cjs mboot40 ; char:= intpuchar(dev);
w3 xor w7,s,cjp not zro mboot30; if eoi then goto end-mboot;
,,cjp not zro mboot10 ; until char = 64;
mboot20: ; repeat
q:=w0-w0,h ,cjs mboot40 ; char:= inputchar(dev);
,h ,cjp not zro mboot30 ; if eoi then goto end-boot;
,,cjs writebnext ; writebnext(b,d,char);
,,cjp mboot20 ; until 5 = 7;
mboot30: ;end-mboot:
w7:=1,s, ; (* wait 10 msec *)
w7:=w7++,s,cjp not zro k ; for i:= 0 to 2**16 do ;
w0:=w0+200,, ; (* clear(dev) *)
bf:=w0,, ; msel:= dev + iors1;
bd:=w0-w0,,cjp fetch ; xbus:= 0; goto fetch;
mboot40: ;proc inputchar;
w3:=1,s, ; (* wait 10 msec *)
w3:=w3++,s,cjp not zro k ; for i:= 0 to 2**16 do ;
w4:=w4-w4,,cjs xmitword ; xmitword(dev,read data,dummy);
,h ,cjs waitrec ; waitrec;
w3:=bd,h ,crtn ; char:= xbus; return;
;;
;; end of lmitxt040c
;;
;;
.m rc 3502 micro-program - pascal80 part
;;
.m rev: 801003▶05◀ hlv
;;
;; file: lmitxt050c
;;
;; 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;
w0:=rd0,, ; w0:= sf;
,,cjs readbcont ; lev:= readbcont;
w6:=spb,,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;
,,cjs readbcontt ; fb:= readbcontt;
setf05: ;setfield-common:
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*)
setf10: ; while rc>0 do begin
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 readnext ; readnext(b,d-1);
w4:=w4 and w0,h , ; w4:= field and mask;
w4 xor w0,h s, ; mask:= -,mask;
w3:=--w3,h , ;
w3:=w3 and bd,h w s,cjp not zro setf20; w:= -,mash and waitmem;
; if w4<>field then field-ovf;
w3:=w3 ior w4,h ,cjp writenextt; w:= w ior w4,call writenextt; return;
setfield: ;proc setfield;
,,cjs readbcont ; fb:= readbcont;
,,cjp setf05 ; goto setfield-common;
.p ;
;;
;; procedure stgetadbc;
;;
;; 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 stgetad10 ; op1b:= waitmem; readluctnill;
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;
;
stgetad10: ;proc readluctnill:
,h ,cjs pty herror ; testparity;
,,cjp not b1 readluc ; if -,nill(op1b) then readluc; 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= ownb, cry= even(d),
;; readmem(ownb,d) started;
;;
reva: ;reva-common:
,,cjs readcown36 ; b,d:= readcown36;
c:=w5:=w3--,,cjs readnext ; cry:= even(d); readnext(b,d-1);
,h ,jmap not 8 ; goto escmap(ir);
;;
;; common revl prologue
;;
;; exit: w3= rel, w5= sf+rel+1, w6= pb, cry= even(w6,w5),
;; readmem(w6,w5) started;
;;
revl: ;revl-common:
w6:=spb,,cjs readcont ; b:= pb; rel:= readcont;
w5:=rd0--,, ; d:= reg.sf + rel;
c:=w5:=w5+w3,,cjs readnext ; cry:= even(d); readnext(b,d-1);
,h ,jmap not 8 ; goto escmap(ir);
;;
;; common revg prologue
;;
;; exit: w3= rel, w5= pr+rel+1, w6= pb, cry= even(w5-1),
;;
revg: ;revg-common:
w6:=spb,,cjs readcont ; b:= spb; rel:= readcont;
w5:=rd1--,, ; d:= reg.pr + rel;
c:=w5:=w5+w3,,cjs readnext ; cry:= even(d); readnext(b,d-1);
,h ,jmap not 8 ; goto escmap(ir);
.p ;
;;
;; common revi prologue
;;
;; exit: w0= ifdisp, w3= rel, w4= 0, w5= ifdisp+rel+1,
;; w6= ifbase, cry= even(w5-1); readmem(w6,w5-1) started;
;;
revi: ;revi-common:
,,cjs getifrel ; b,d:= getifrel;
c:=w5:=w5--,,cjs readnext ; cry:= even(d); readnext(b,d-1);
,h ,jmap not 8 ; goto escmap(ir);
;;
;; common revs prologue
;;
;; exit: w1= d-1, w2= w6= b, w3= rel, w5= d+1, cry= even(d);
;;
revs: ;revs-common:
,,cjs getsa ; b,d:= getsa;
c:=w5:=w1,,cjp b1 nillerr ; cry:= even(d); if nill(b) then goto nillerror;
w6:=w2,,cjs readnext ; readnext(b,d-1);
,h ,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;
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;
,,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;
;;
rechd00: ;
,,cjs readcont34 ; res.b,res.d:= readcont34;
,,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;
;;
w4:=slb,,cjs readcont ; rel:= readcont;
w3:=w3+rd0,, ;
,,cjp wr34fetch ; goto wr34fetch(slb,sf+rel);
;;
.instruction reagd ;
;;
;; param:: rel: word; stack:: -> gfrel: addr;
;;
w4:=slb,,cjs readcont ; rel:= readcont;
w3:=w3+rd1,, ;
,,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: ;
w3:=bd,h w s,cjs getbytet ; byte:= getbytet(waitmem);
,,cjp wrfetch ; goto wrfetcht(byte);
;;
.instruction revaw , reva , revxwfin ;
;;
;; param:: a: addr; stack:: -> word: word;
;;
revxwfin: ;
w3:=bd,h w s,cjp wrfetcht ; goto wrfetcht(waitmem);
;;
.instruction revad , reva , revxdfin ;
;;
;; param:: a: addr; stack:: -> sa: addr;
;;
revxdfin: ;
w4:=bd,h w s,cjs readnextt ; res.d:= waitmem; readnextt(b,d+1);
w3:=bd,h w s,cjp wr34fetcht; goto wr34fetcht(res.b,waitmem);
;;
.instruction revaf , reva , revxffin ;
;;
;; param:: a: addr, fb: byte; stack:: -> f: word;
;;
revxffin: ;
w3:=bd,h w s,cjs readbcontt; word:= waitmem; fb:= readbcontt;
q:=w3,,cjp getfield ; goto getfield(word,fb);
,,cjp wrfetch ; goto wrfetch(field);
.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 stwsa ;
;;
;; 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, ; cry:= bc(15); wc:= bc(0:14);
,,cjs cry renpb10 ; if cry (*odd(bc)*) then goto garb-error;
stwsa10: ;rep:
ir:=w0,,cjp zro fetch ; if wc=0 then goto fetch;
,,cjs readnext ; readnext(op1b,op1d);
w3:=bd,h w s,cjs writenextt; writenextt(op2b,op2d,waitmem);
int,,h ,cjs testint1 ; wc:= wc - 1;
w0:=w0--,s,cjp zro stwsa10 ; 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;
;;
stwsa20: ;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 stbsa ;
;;
;; param:: none;
;; stack:: bc: word; op,res: addr -> ;
;;
,,cjs stgetadbc ; bc,op1,op2:= stgetadbc;
w5,s, ;
w0,s,cjp b15 stbsa10 ; if even(op1d) then
,,cjs readnext ; begin readnext(op1b,op1d);
w5:=w5-2,h , ; op1d:= op1d-2;
w7:=bd,h w s,cjs terror ; w7:= waitmem; testparity;
w0,s, ; end;
stbsa10: ;rep:
w5,s,cjp zro fetch ; if bc=0 then goto fetch;
ir:=w0,,cjp not b15 stbsa20; if odd(op1d) then
,,cjs readnext ; begin readnext(op1b,op1d);
w5:=w5--,h , ; op1d:= op1d-1; (* +2-1 = +1 *)
w7:=bd,h w s, ; save:= waitmem;
w3:=swp,h ,cjs writebnextt ; writebnextt(op2b,op2d,swap(save));
w0:=w0--,s,cjp stbsa10 ; bc:= bc-1; goto rep;
stbsa20: ; end else
w3:=w7,,cjs writebnext ; begin writebnext(op2b,op2d,save);
w5:=w5++,,cjs testint ; op1d:= op1d + 1;
w0:=w0--,s,cjp zro stbsa10 ; bc:= bc-1; if -,testint then goto rep;
,,cjp stwsa20 ; end; goto new-interrupt;
.p ;
;;
.instruction stcea ;
;;
;; param:: none;
;; stack:: bc: word; op1, op2: addr -> res: word;
;;
,,cjs stgetadbc ; bc,op1,op2:= stgetadbc;
w1,s, ;
c:=w5,,cjp b15 stcea10 ; if even(op2d) then
,,cjs read12 ; begin read12(op2b,op2d);
w4:=bd,h w s,cjs terror ; w3:= waitmem; testparity;
stcea10: ; end;
w0,s,cjp cry stcea20 ; if even(op1d) then
,,cjs readnext ; begin readnext(op1b,op1d);
w5:=w5-2,h , ; op1d:= op1d-2;
w7:=bd,h w s,cjs terror ; w7:= waitmem; testparity;
w0,s, ; end;
stcea20: ;rep:
ir:=w1:=w1++,s,cjp zro stcea60; op2d:= op2d+1; if bc=0 goto end-true;
w3:=w4,,cjp b15 stcea30 ; if even(op2d) then
w1:=w1--,,cjs read12 ; begin
w1:=w1++,h , ; read12(op2b,op2d-1);
w4:=bd,h w s, ; w3:= waitmem;
w3:=swp,h ,cjs pty perror ; w4:= swap(w3); testparity;
stcea30: ; end else w3:= w4;
w5:=w5++,s, ; op1d:= op1d+1;
q:=w7,,cjp b15 stcea40 ; if even(op1d) then
w5:=w5--,,cjs readnext ; begin
w5:=w5--,h , ; readnext(op1b,op1d-1); op1d:= op1d-2;
w7:=bd,h w s, ; w7:= waitmem;
q:=swp,h ,cjs pty perror ; q:= swap(w7); testparity;
stcea40: ; end else q:= w7;
w3:=w3 xor q,, ;
w3:=w3 and 0ff,s, ; w3:= (w3 xor q) and r-mask;
int,,h , ;
lev xor int,h s,cjp not zro stcea50; if w3<>0 then goto end-false;
w0:=w0--,s,cjp zro stcea20 ; bc:= bc-1; goto if lev=int then rep
,,cjp stwsa20 ; else new-interrupt;
stcea50: ;end-false:
w3:=,,cjp wrfetch ; goto wrfetch(false);
stcea60: ;end-true:
w3:=w0++,,cjp wrfetch ; goto wrfetch(true);
.p ;
;;
.instruction revsm ;
;;
;; param:: none;
;; stack:: bc: word; op: addr -> area: array(1..bc/2) of word;
;;
,,cjs readluc ; readluc;
w6:=slb,h , ;
w3:=renpbe0,h , ; err:= odd-byte-count;
c:=w0:=bd,h w s,cjs terror ; bc:= waitmem; cry:= bc(15); testparity;
w5:=w0+4,, ;
q:=w3,,cjp cry xept ; if odd(bc) then expection(err);
,,cjs readluc ; readluc;
w1:=bd,h w s,cjs readluct ; op.d:= waitmem; readluct;
ir:=20,w2:=slb,h , ; ir.shift:= logical;
w3:=bd,h w s,cjs terror ; op.b:= waitmem; testparity;
w5:=w1--,,cjp b1 nillerr ; op.d:= op.d - 1; if nill(op.b) then goto nillerror;
w6:=w3,, ;
w1:=slu,, ;
w0:=>w0,s, ; wc:= bc//2;
setre10: ;rep:
ir:=,,cjp zro fetch ; sync-itr; if wc=0 then goto fetch;
slu:=w1++,,cjs readnext ; readnext(op.b,op.d);
slu:=slu++,h ,cjs tstack ; slu:= slu + 2; tstack;
w3:=bd,h w s,cjs writenextt; writenextt(slb,slu,waitmem);
int,,h ,cjs testint1 ; wc:= wc - 1;
w0:=w0--,s,cjp zro setre10 ; 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:=w1,,cjs tstack ; slu:= workslu; tstack;
sic:=sic--,,cjp fetch ; sic:= sic-1; goto fetch;
.p ;
;; ****** stxsa to be removed in rev.3 ******
.instruction stxsa ;
ir:=c:=w0-w0,,cjs stgetadbc;
w0:=>c>w0,s, ;
w0,s,cjp cry renpb10 ;
stxsa10: ;
,,cjp zro fetch ;
,,cjs readnext ;
w3:=bd,h w s,cjs read12t ;
w7:=bd,h w s,cjs terror ;
,,cjs writenext ;
,,cjs write56 ;
w0:=w0--,s,cjp stxsa10 ;
;;
;; end of lmitxt050c
;;
;;
;; rc3502 sis instructions.
;;
;; file: lmitxt055
;;
;; vers: 801003 hlv
;;
;
;;
.instruction lpush ;
;;
;; param:: none;
;; stack:: r2a, r1a: addr -> ;
;;
,,cjs cget4 ; r1a,r2a:= cget4; (*zrdw=r1a,w87=r2a*)
,,cjs getshare ; r1:= getshare(r1a); (*zrd=r1*)
q:=lpushe1,, ;
zdx:=w6:=w2,,cjp b1 xept ; if nill(r1) or locked(r1) then
,,cjp b0 xept ; exception(lpushe1);
w5:=w1+msgstack,, ; (*zrdx=r1+stack*)
rdx:=w5,,cjs cread1 ; r1stack:= cread1(r1+stack);
bus:=w3:=w1,s,ldct xept ;
w5:=w7,,cjp b1 lpush10 ; if not nill(r1stack)
q:=lpushe2,,jrp b1 ; then exception(lpushe2);
lpush10: ;
w6:=w8,,cjs cread21 ; r2:= cread21(r2a);
w1 xor rd,s,ldct xept ;
w2 xor zd,s,cjp not zro lpush20; if r1 = r2 then
,,cjp not zro lpush20 ; exception(lpushe3);
q:=lpushe3,,jrp not zro ;
lpush20: ;
w4:=w1,, ;
w1:=w3,, ; (*w34=r2*)
w3:=w2,s, ; if locked(r2) then
w6:=zdw,,cjp b0 xept ; exception(lpushe4);
w5:=rdw,,cjs cwrite1 ; cwrite1(r1a,nill);
w1:=w4,, ;
w6:=zdx,, ;
w5:=rdx,,cjs cwrite21 ; cwrite21(r1+stack,r2);
w5:=w5-msgstack,, ;
w2:=w8,, ;
w1:=w7,,cjs cwrite65 ; cwrite65(r2a,r1);
w5:=w5+msgtype,, ;
w8:=w5,,cjs cread1 ; r1kind:= cread1(r1+kind);
bus:=w3,s, ;
bus:=w1,s,cjp b1 cfin4 ; if not nill(r2) and
w6:=w3,,cjp not zro cfin4 ; r1kind = headerkind then
w5:=w4+msgsize,, ; begin (* copy buf. descr. *)
,,cjs cread1 ; size:= cread1(r2+size);
lpushr1= msgsadr - msgsize ;
w5:=w5+lpushr1,, ;
w7:=w1,,cjs cread21 ; addr:= cread21(r2+addr);
lpushr2= msgsadr - msgtype ;
w5:=w8+lpushr2,, ;
w6:=zdx,,cjs cwrite21 ; cwrite(r1+addr,addr);
w5:=w5-lpushr1,, ;
w1:=w7,,cjs cwrite1 ; cwrite1(r1+size,size);
lpush30: ; end; (* copy buf. descr. *)
,,cjp cfin4 ; goto cfin4;
.p ;
;;
.instruction lpop ;
;;
;; param:: none;
;; stack:: r2a, r1a: addr -> ;
;;
,,cjs cget4 ; r1a,r2a:= cget4; (*zrdw=r1a,w87=r2a*)
w6:=zdw,, ;
w5:=rdw,,cjs cread1 ; r1:= cread1(r1a);
bus:=w1,s,ldct xept ; if not nill(r1) then
w2:=w8,,cjp b1 lpop10 ; exception(lpope1);
q:=lpope1,,jrp b1 ;
lpop10: ;
w1:=w7,,cjs cread65 ; r2:= cread65(r2a);
zd:=w6,s,ldct xept ; if locked(r2) then
rd:=w5,,cjp b0 lpop20 ; exception(lpope3);
w2:=zdw,,cjp not b1 lpop30 ; if nill(r2) then
q:=lpope2,,jrp not b1 ; exception(lpope2);
lpop20: ;
q:=lpope3,,jrp b0 ;
lpop30: ;
w1:=rdw,,cjs cwrite65 ; cwrite65(r1a,r2);
w5:=w5+msgstack,, ;
bus:=40,w1:=w1-w1,, ; r2stack:= nill;
w2:=swp,,cjs cexch21 ; r2stack :=: cexch(r2+stack);
w6:=w8,, ;
w5:=w7,,cjs cwrite21 ; cwrite21(r2a,r2stack);
w6:=zd,, ;
w5:=msgtype,, ;
w5:=w5+rd,,cjs cread1 ; r2kind:= cread1(r2+kind);
bus:=40,w1,s, ; if r2kind=headerkind then
w3:=swp,,cjp not zro cfin4 ; begin (*clear buf. descr.*)
lpopr1= msgsize - msgtype ;
w5:=w5+lpopr1,, ;
,,cjs cwrite1 ; cwrite1(r2+size,0);
lpopr2= msgsadr - msgsize ;
w5:=w5+lpopr2,, ;
w1:=w3,,cjs cwrite1 ; cwrite1(r2+addr,nill);
,,cjp cfin4 ; end; goto cfin4;
;;
;; end of lmitxt055c
;;
;;
;; begin lmitxt075
;;
;; usage of registers in process synchronizing instructions
;;
;; generally z means base, and r means disp
;;
;; w2=level
;; w1=pu
;;
;; w21 and w65 are used as addr and data in the read procedures
;; ra=rawork
;; ir=0300: w=01, x=10
;;
;; z/rd0: lbd b
;; z/rd1= z/rdw: shptr
;; z/rd2= z/rdx: lbd a
;; z/rd3= z/rd: share
;; w43: nbd
;; w87: hbd a
;; w109: hbd b
;; w11: share + semrel
;; w0:
;;
.p ;
;;
;; procedure cwrite21 (* 13x = 2,82us *)
;;
;; entry: w6= b; w5= d; w2= db; w1= dd;
;; exit : w5= w6= w2= w1= unch; w0= w5+1; memaddr(w6,w5)= db,dd;
;;
cwrite21: ;proc cwrite21;
ba:=w6,,cjs mma ; ba:= b; seladdr;
bd:=w5,w0:=w5++,h ,cjs mmd ; xbus:= d; seldata;
bd:=w2,h w ,cjs mma ; xbus:= db; write; seladdr;
bd:=w0++,h ,cjs mmd ; xbus:= d+2; seldata;
bd:=w1,h w ,crtn ; xbus:= dd; write; return;
;;
;; procedure cwrite1 (* 7x = 1,52us *)
;;
;; entry: w6= b; w5= d; w1= data;
;; exit : w6= w5= w1= unch; mem(w6,w5)= data;
;;
cwrite1: ;proc cwrite1;
ba:=w6,,cjs mma ; ba:= b; seladdr;
bd:=w5,h ,cjs mmd ; xbus:= d; seldata;
bd:=w1,h w ,crtn ; xbus:= data; write; return;
;;
;; procedure cwrite65 (* 13x = 2,82us *)
;;
;; entry: w2=b; w1= d; w6= db; w5= dd;
;; exit : w2= w1= w6= w5= unch; w0= w5+1; memaddr(w6,w5)= db,dd;
;;
cwrite65: ;proc cwrite65;
ba:=w2,,cjs mma ; ba:= b; seladdr;
bd:=w1,w0:=w1++,h ,cjs mmd ; xbus:= d; seldata;
bd:=w6,h w ,cjs mma ; xbus:= db; write; seladdr;
bd:=w0++,h ,cjs mmd ; xbus:= d+2; seldata;
bd:=w5,h w ,crtn ; xbus:= dd; write; return;
;;
;; procedure cwrite6 (* 7x = 1,52us *)
;;
;; entry: w2= b; w1= d; w6= data;
;; exit : w2= w1= w6= unch; mem(w2,w1)= data;
;;
cwrite6: ;proc cwrite6;
ba:=w2,,cjs mma ; ba:= b; seladdr;
bd:=w1,h ,cjs mmd ; xbus:= d; seldata;
bd:=w6,h w ,crtn ; xbus:= data; write; return;
;;
;; procedure cexch21 (* 17x = 3,69us *)
;;
;; entry: w6= b; w5= d; w2= db; w1= dd;
;; exit : w6= w5= unch; w0= q= undf;
;; mem(w6,w5) :=: db; mem(w6,w5+2) :=: dd;
;;
cexch21: ;proc cexch21;
ba:=errb:=w6,,cjs mma5 ; ba:= b; seladdr5;
bd:=w5,w0:=w5++,h r , ; xbus:= d; read;
q:=bd,h w s,cjs thmmd ; db1:= waitmem; thseldata;
bd:=w2,w2:=q,h w ,cjs mmaq ; xbus:= db; write; db:= db1; seladdrq;
bd:=w0++,h r , ; xbus:= d+2; read;
q:=bd,h w s,cjs thmmd ; dd1:= waitmem; thseldata;
bd:=w1,w1:=q,h w ,crtn ; xbus:= dd; write; dd:= dd1; return;
;;
;; procedure cread65 (* 10x = 2,17us *)
;;
;; entry: w2= b; w1= d;
;; exit : w2= w1= unch; w0= undf; w6= mem(w2,w1); w5= mem(w2,w1+2);
;;
cread65: ;proc cread65;
ba:=errb:=w2,,cjs mma1 ; ba:= b; seladdr1;
bd:=w1,w0:=w1++,h r , ; xbus:= d; read;
w6:=bd,h w s,cjs therror ; w6:= waitmem; therror;
bd:=errd:=w0++,h r , ; xbus:= errd:= d+2; read;
w5:=bd,h w s,cjp therror ; w5:= waitmem; therror; return;
.p ;
;;
;; procedure cread21 (* 10x = 2,17us *)
;;
;; entry: w6= b; w5= d;
;; exit : w6= w5= unch; w0= undf; w2= mem(w6,w5); w1= mem(w6,w5+2);
;;
cread21: ;proc cread21;
ba:=errb:=w6,,cjs mma5 ; ba:= b; seladdr5;
bd:=w5,w0:=w5++,h r , ; xbus:= d; read;
w2:=bd,h w s,cjs therror ; w2:= waitmem; therror;
bd:=errd:=w0++,h r , ; xbus:= d+2; read;
w1:=bd,h w s,cjp therror ; w1:= waitmem; therror; return;
;;
;; procedure cread1 (* 6x = 1,30us *)
;;
;; entry: w6= b, w5= d;
;; exit : w6= w5= unch; w1= mem(w6,w5);
;;
cread1: ;proc cread1;
ba:=errb:=w6,,cjs mma5 ; ba:= b; seladdr5;
bd:=w5,h r , ; xbus:= d; read;
w1:=bd,h w s,cjp therror ; w1:= waitmem; therror; return;
;;
;; procedure creadbyte1 (* 9,5x = 2,06us *)
;;
;; entry: w6= b; w5= d;
;; exit : w6= w5= unch; w1= membyte(w6,w5); q= 0ff;
;;
creadbyte1: ;proc creadbyte1;
c:=w5,,cjs cread1 ; cry:= odd(d); w1:= cread(w6,w5);
q:=0ff,, ; rmask:= 0ff;
w1,w1:=w1 and q,,crtn cry ; w1:= if cry then w1 and rmask
w1:=swp and q,,crtn ; else swap(w1) and mask;
.p ;
cget2: ;;
,,cjs readluc ;
w0:=bd,h w s,cjs readluct ;
w1:=bd,h w s,cjs terror ;
setrair: ;
ra:=rawork,,, ;
ir:=300,,,crtn ;
;;
;; procedure cget4
;;
;; entry: -
;; exit : w10= w87= op1, w32= zrdw= op2, ra= rawork, ir= 300;
;;
cget4: ;;
,,cjs readlu4c ;
w3:=bd,h w s,cjs terror ;
w7:=w0,,cjs setrair ; w87:=hbd:=semaphore
w8:=w1,s, ;
rdw:=w2,, ; shptr
zdw:=w3,,crtn ;
;
cfin4: ;cfin4:
,,cjs setslice ; setslice must not update stat
ir:=8,slu:=slu-8,, ; sync itr; slu:= slu-8;
sic:=sic++,,cjp fetch ; sic:= sic+1; goto fetch;
;
cfin22: ;cfin22:
,,cjs setslice ; setslice must not update stat
ir:=4,slu:=slu-4,, ; sync itr; slu:= slu-4;
sic:=sic+2,, ; sic:= sic+2;
,,cjp fetch ; goto fetch;
;
cfin0: ;cfin0:
ir:=,,cjs setslice ; setslice must not update stat
sic:=sic++,,cjp fetch ; sic:= sic+1; goto fetch;
.p ;
;;
;; procedure getshare
;;
;; entry: rzdw= shptraddr;
;; exit : zrd= w21= mem(shptraddr); stat(w2) set;
;;
getshare: ;;
w5:=rdw,, ; shptr
w6:=zdw,,cjs cread21 ;
zd:=w2,s, ; share
rd:=w1,,crtn ;
;
reservea: ; return: zrdx= w21= lbd a; stat(lb a) set;
w5:=w7,, ; hdb a
w6:=w8,,cjs cread21 ;
zdx:=w2,s, ; lbd a
rdx:=w1,,crtn ;
;
reserveb: ; return: zrd0= w21= ldb b; stat(lb b) set;
w5:=w9,, ;
w6:=w10,,cjs cread21 ;
zd0:=w2,s, ; lbd b
rd0:=w1,,crtn ;
.p ;
setrefshwt: ;; sets ref (share waited) of receiver (=nbd)
w5:=w3+shwt,, ;
w6:=w4,,cjs cread21 ; w21:=ref
w5:=rd,, ; w65:=share
w6:=zd,,cjp cwrite65 ; ref(share waited):=share
;
setchhead: ;; mem(nbd.chainhead):=hbd b
w5:=w3+chainhead,, ;
w6:=w4,, ;
w1:=w9,, ; chainhead:=hbd b
w2:=w10,,cjp cwrite21 ;
;
unchain: ;;
rdx-w3,s, ; test lbd a - nbd
zdx-w4,s,cjp not zro unchain2;
bus:=40,,, ;
w6:=swp,,cjp zro unchain3 ;
;
unchain2: ;;
w5:=w3,, ;
w6:=w4,,cjs cread21 ; w21:=fbd
w5:=rdx,, ; w65:=lbd a
w6:=zdx,,cjp cwrite21 ;mem(lbd a):=fbd; return;
unchain3: ;;
w2:=w8,, ; w21:=hbd a
w1:=w7,,cjp cwrite6 ; sem:= nill; return;
;
changeab: ;;
w9:=w7,, ; hbd b:=hbd a
w10:=w8,, ;
q:=rdx,, ; lbd b:=lbd a
rd0:=q,, ;
q:=zdx,, ;
zd0:=q,,crtn ;
.p ;
chain: ;; chain nbd to hbd b, lbd b
;; if cry and lbd b was nill then setlevel(membyte(nbd+puno),1)
;;
;
w6:=zd0,s, ; w65:=lbd b
w5:=rd0,, ;
w2:=w4,, ; w21:=nbd
w1:=w3,,cjp b1 chain3 ;
,,cjs cexch21 ; w21:=:mem(lbd b)
w6:=w4,, ; w65:=nbd
w5:=w3,,cjs cwrite21 ; mem(nbd):=w21
;
chain2: ;;
w2:=w10,, ; w21:=hbd b
w1:=w9,,cjp cwrite65 ; mem(hbd b):=nbd
;
chain3: ;; sem=nill
w6:=w4,, ;
w5:=w3,,cjs cwrite21 ; mem(nbd):=nbd
,,cjp not cry chain2 ;
; setlevel(monitor);
w0:=monitrlev,, ;
,,cjs setlint ;
ra:=rawork,,, ;
w5:=w3,,cjp chain2 ;
;
chainfirst: ;
w6:=zd0,s, ;
w2:=w4,,cjp b1 chain ; if nil(lbd b) then goto chain
w5:=rd0,, ; w65:=lbd b; w21:=nbd
w1:=w3,,cjs cexch21 ; w21:=:mem(lbd b)
w6:=w4,, ;
w5:=w3,,cjp cwrite21 ; mem(nbd):=w21; return;
;
putelemptr: ;; mem(elemptr):=nbd
w5:=rdw,, ; w65:=elemptr
w6:=zdw,, ;
w1:=w3,, ; w21:=nbd
w2:=w4,,cjp cwrite21 ; mem(elemptr):=nbd
.p ;
signal: ;;
,,cjs reservea ; lbd a:=w21:=mem(hbd a)
rdx,,s,cjp b1 sig5 ; jump if passive
;
,,cjp not b15 sig5 ; jump if open
,,cjs cread65 ; w21=lbd a
w3:=w5,, ; w43=nbd
w5:=w5+level,, ;
w4:=w6,,cjs creadbyte1 ;
w2:=w1,s, ; w2:=level
,,cjp not zro sig4 ; jump if level>0
w5:=w3+actq,, ;
,,cjs cread21 ;
w9:=w1,, ; w109:=hbd b:=active queue
w10:=w2,,cjs reserveb ;
,,cjs setrefshwt ; ref(nbd.shwt):=share
,,cjs setchhead ; mem(nbd.chainhead):=hbd b
,,cjs unchain ; unchain nbd from hbd a, lbd a
c:w0--w0,,cjs chain ; cry means setlevel
,,cjp sig6 ;
sig4: ; signal to receiver on level>0
w10:=w2,,cjs setrefshwt ; save level; ref(nbd.share waited):=share
w6:=w4,,cjs setlint ;
ra:=rawork,,, ;
w5:=w3+chainhead,, ;
bus:=40,,, ;
w1:=swp,,cjs cwrite1 ; mem(nbd.chainhead):=nill
,,cjs unchain ;
,,cjp sig6 ;
sig5: ; signal to an empty or an open semaphore
,,cjs changeab ;
w4:=c:zd,, ; c=0 means no setlevel
w3:=rd,,cjs chain ; nbd:=share
sig6: ;
w5:=rdw,,cjs nill ;
w1:=swp,, ;
w6:=zdw,,cjp cwrite1 ; shptr:=nill
.p ;
wait0: ;;
,,cjs getshare ; share:=mem(shptr)
,,crtn not b1 ; return if shptr not nill
,,cjs reservea ; lbd a:=w21:=mem(hbd a)
rdx,,s,cjp b1 wait2 ; jump if passive
wait1c: ;;
,,cjp b15 wait2 ; jump if locked
wait1a: ; sem open
,,cjs cread65 ; w21=lbdfrom
w3:=w5,, ; w43:=nbd
w4:=w6,,cjs unchain ;
,,cjp putelemptr ; mem(shptr):=share; return;
wait2: ; nill
ra:=reg,, ;
w4:=zd2,, ; w43:=nbd:=this process
w3:=rd1,, ;
ra:=rawork,w6:=w4,, ;
w5:=w3+shwt,, ;
w1:=rdw,,cjs changeab ; w21:=shptr
w2:=zdw,,cjs cwrite21 ; mem(nbd.shwt):=shptr
reg xor 7,s, ;
,,cjp zro wait3 ; jump if lev=0
,,cjs clear ; clear level
,,cjp wait5 ; goto wait5
;
wait3: ; lev=0
w5:=w3+chainhead,, ;
,,cjs cread21 ;
w7:=w1,, ; hbd a:=active queue
w8:=w2,,cjs reservea ; reserve active queue
,,cjs unchain ;
w0:=monitrlev,, ;
,,cjs setlint ;
wait5: ;; chain process to sem
,,cjs setchhead ; mem(nbd.chainhead):=hbd b
c:=,,cjp chain ; return;
.p ;
.instruction csign ;
,,cjs cget4 ;
,,cjs getshare ; share:=mem(shptr)
,,cjp b1 csign1 ;
,,cjs signal ;
,,cjp cfin4 ;
;
csign1: ;;
q:=csigne,, ;
,,cjp xept ;
;
.instruction crele ;
,,cjs readbcont ; w4:=semrel
,,cjs cget2 ;
rdw:=w0,, ; z/rdw := shptr
zdw:=w1,,cjs getshare ; z/rd := share
w7:=rd+w4,, ; hbd a := share + semrel
w8:=zd,,cjp zro csign1 ; jump if shptr=nill
,,cjs reservea ; reserve pointer to sem
w7:=rdx,, ;
w8:=zdx,,cjs signal ; hbd a:=sem
,,cjp cfin22 ;
.instruction cwait ;
,,cjs cget4 ;
,,cjs wait0 ;
,,cjp cfin0 ;
;
.instruction csens ;
,,cjs cget4 ;
,,cjs getshare ;
,,cjp not b1 cfin4 ; if shptr<>nill then goto fin
,,cjs reservea ;
rdx,,s,cjp b1 csens3 ;
,,cjp b15 csens3 ; jump if not open
,,cjp wait1a ;
;
.p ;
.instruction cwtac ;
,,cjs cget4 ;
w6:=zdw,, ; w65:=shptr
w5:=rdw,,cjs cread1 ;
w6:=w8,h ,cjp not b1 cfin4 ; jump if not nill
,h ,cjs clear ;
,,cjp sfetch ;
;
.instruction cllst ;
,,cjs cget4 ;
w10:=w8,, ; hbdb:=hbda
w9:=w7,,cjs reserveb ;
,,cjs getshare ;
w3:=rd,, ; nbd:=share
w4:=c:zd,,cjs chain ; cry:=false
,,cjp cfin4 ;
;
.instruction cufst ;
,,cjs cget4 ;
,,cjs reservea ;
,,cjp not b1 cufst1 ; jump if not nill
csens3: ;
bus:=40,,, ;
w4:=swp,,cjp cufst2 ; nb:=nill
cufst1: ;;
,,cjs cread65 ; w21=lbda
w3:=w5,, ; w43:=nbd
w4:=w6,,cjs unchain ;
cufst2: ;;
,,cjs putelemptr ; mem(elemptr):=nbd
,,cjp cfin4 ;
.p ;
.instruction csell ;
,,cjs readluc ; newlevel:=unstack
w11:=bd,h w s,terror ;
w3:=rd1,, ; nbd:= (spb, pr)
w4:=spb,, ;
w5:=w3+actq,, ;
w6:=w4,,cjs cread21 ; hbd a:=mem2(nbdü.actq);
w7:=w1,,cjs setrair ;
w8:=w2,,cjs reservea ; reserve a
w0:=lev,,cjs clear ; clear(lev)
w11,s, ;
,,cjp not zro csell3 ; jump if newlevel<>0
reg xor 7,s, ;
,,cjp zro csell4 ; jump if lev=0
; newlevel=0, lev<>0
,,cjs changeab ; change a b
,,cjs setchhead ; setchhead
c:=,,cjs chainfirst ; chainfirst(false)
,,cjp csell4 ;
csell3: ; newlevel<>0
w0:=w11,,cjs setlint ; setlint(newlevel)
reg xor 7,s, ;
,,cjp not zro csell4 ; jump if lev<>0
bus:=40,,, ;
; newlevel<>0, lev=0
w10:=swp,,cjs setchhead ; hbd b.base:=nill; setchhead
,,cjs unchain ; unchain
w0:=monitrlev,, ;
,,cjs setlint ; setlint(monitrlev)
.p ;
csell4: ;
w2:=w4,, ;
levelm1= level - 1 ;
w1:=w3+levelm1,, ;
w3:=w11,,cjs writebnext ; membyte(nbdü.level):=newlevel
w3:=w1-level,, ;
ra:=reg,,cjs dumpregs ; dumpregs(reg)
,,cjs loadregs ; loadregs(nbd); w7:=nbdü.level
reg:=w11,,push 2 ;
ra:=reg:=reg++reg,,rfct ;
w0:=4,, ;
,,cjs clearbits ; to:=false
lev:=w11,,cjs setslice ; lev:=newlevel
slu:=slu-2,, ;
sic:=sic++,,cjp fetch ; goto fetch
.p ;
.instruction cstop ;
,,cjs cget4 ; hbda:=addr; shptr:=process descr
w5:=rdw,, ;
w5:=w5+chainhead,, ;
w6:=zdw,,cjs cread21 ;
w10:=w2,s, ; hbdb:=shptr.chainhead
,,cjp b1 cupro20 ; jump if chainhead nill
w9:=w1,,cjs reserveb ;
w8,s, ;
,,cjp not b1 cupro3 ; jump if nill
cupro4: ; first loop
w7:=rd0,, ; hbda:=lbdb
w8:=zd0,, ;
,,cjp cupro5 ;
cupro3: ; not first loop
w5:=w7,, ; test if the process 'hbda' has been moved
w5:=w5+chainhead,, ; away from the semaphore
w6:=w8,,cjs cread21 ;
w10-w2,s, ;
w9-w1,s,cjp not zro cupro4 ; the process has been moved
,,cjp not zro cupro4 ;
cupro5: ;;
w6:=w8,, ;
w5:=w7,, ;
cupro6: ;;
,,cjs cread21 ;
w1-rdw,s, ;
w2-zdw,s,cjp not zro cupro7;
,,cjp zro cupro8 ;
cupro7: ; the process has not been found yet
ir:=300,w6:=w2,, ;
w5:=w1,,cjs testint ;
,,cjp zro cupro6 ; goto cupro6 if no higher interrupts
;
;; higher interrupts pending
;
w4:=w6,,cjs setslice ;
slu:=slu-8,, ;
w3:=w5,,cjp wr34fetch ;
.p ;
cupro8: ;; the process has been found
;; w65= process just before this process
;; w21= z/rdw= this process
;; w109= the semaphore
;; z/rd0= last
w5-w1,s, ;
w6-w2,s,cjp not zro cupro9 ;
,,cjp not zro cupro9 ;
;; only this process in the queue
bus:=40,,, ;
w2:=swp,,cjp cupro11 ; last:=nill
cupro9: ;;
w4:=w6,, ; w43:=the process just before this process
w3:=w5,,cjs cread65 ; w65:= process after this process
w2:=w4,, ;
w1:=w3,,cjs cwrite65 ; unchain
q:=rd0,, ; last process
q-rdw,s, ; this process
q:=zd0,, ;
q-zdw,s,cjp not zro cupro10;
,,cjp zro cupro11 ;
cupro10: ;;
w2:=zd0,, ; w21:= last
w1:=rd0,, ;
cupro11: ;;
w6:=w10,, ; w65:= head
w5:=w9,,cjs cwrite21 ;
cupro20: ;; chainhead=nill
;; you must never stop a level0 process twice
w5:=rdw,, ;
w5:=w5+level,, ;
w6:=zdw,,cjs creadbyte1 ; w1:=level
w1,s,push 2 ;
ra:=w1:=w1++w1,,rfct ;
,,cjs not zro dumpregs ; dumpregs(level * 8 + 7)
,,cjp cfin4 ;
.p ;
;;
.instruction cexch ;
;;
;; param:: none;
;; stack:: ad1, ad2: addr -> ;
;;
,,cjs cget4 ; ad1, ad2:= cget4;
w6:=w3,, ;
w5:=w2,,cjs cread21 ; ref:= cread21(ad2);
w2,s,ldct xept ; if locked(ref) then
w6:=w8,,cjp b0 cexch20 ; exception(locked);
w5:=w7,,cjs cexch ; ref :=: exch(ad1);
w2,s,ldct xept ; if locked(w21) then
w6:=zdw,,cjp b0 cexch10 ; goto cexchxept;
w5:=rdw,,cjs cwrite21 ; cwrite(ad2,ref);
,,cjp cfin4 ; goto cfin4;
cexch10: ;cexchxept:
w6:=w8,,cjs cwrite21 ; cwrite21(ad1,w21); (* reestablish ref *)
cexch20: ;
q:=w0,,jrp not b0 ; goto exception(locked);
;;
;; end lmitxt075c
;;
;;
;; rc3502 debug micro communication instructions
;;
;; rev: 801002 fh/hlv
;;
;; file: lmitxt077c
;;
;
;;
.instruction crram ;
;;
;; param:: none;
;; stack:: ramdisp: word -> rambyte: word;
;;
w6:=0,,cjs readlucq ; ram.base:= 0; ram.disp:= readlucq;
w5:=q,,cjs creadbyte1 ; byte:= creadbyte1(ram.base,ram.disp);
w3:=w1,,cjp wrfetch ; goto wrfetch(byte);
;
;;
.instruction cwram ;
;;
;; param:: none;
;; stack:: byte, ramdisp: word -> ;
;;
w2:=,,cjs readlucq ; ram.base:= 0; byte:= readlucq;
w3:=q,,cjs readlucq ; ram.disp:= readlucq;
ra:=cow,w1:=q--,, ;
rd,rd,s, ;
bus:=w3,,cjp not zro sfetch;
w0:=w1+swp,,cjs writebnext ;
w0:=w0+81,, ;
rd:=w0,, ;
led:=6,,, ;
ra:=reg,,cjp fetch ;
;;
;; end of lmitxt077c
;;
;;
;; lmitxt078c, set instructions
;;
;; rev: 801003 fh/hlv
;
;
;; 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
;; addresses and 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: resulting▶7f◀set, resulting▶7f◀length
;;
;; 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: resulting▶7f◀set, newlength
;;
;; setcr:
;; entry: from, to
;; exit: resulting▶7f◀set, resulting▶7f◀length
.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;
,,cjp b0 prepset1 ; jump if setcr
w3:=w3--,,cjs readlucq ; w3:=disp2-1
w4:=q,,cjp not b1 prepset4 ; w4:=base2
,,cjp nillerr ;
;
prepset1: ;; setcr
;; w3=from, w4=to
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, ;
,,cjp not acy stackerror ; overflow if not lm>=preliminary lu
;
w7:=w7+w7,s, ; 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,s, ; acy:=setcr
w8:=1,, ;
w8:=w8 and w1,,cjp acy prepset9;
w8:=w8 and w3,, ;
prepset9: ;
w8:=w8 clr w10,, ;
w8:=w8 clr w11,s, ; zro means addresses or lengths are odd
q:=setodde,, ;
w5:=w3,,cjpp zro 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 readnext ;
w4:=bd,h w s,cjs terror ;
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
,,cjs read12 ;
w3:=bd,h w s,cjs terror ;
;
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 ;
,,cjp 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 ;
.p ;
;;.instruction revsm ; retreive value stack multiple
;; q:=103
;; q, cjp setun0
;
.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,, ;
,,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
,,cjs readnext ;
w3:=bd,h w s,cjs terror ; w3:=the set word
rc:=w1,, ;
w3:=<c<w3,,rpct k ; cry:=the element is a member of the set
ir:=,,cjp arit2boo ;
;;
;; end of lmitxt078c
;;
;;
;; begin lmitxt079c
;;
;; rev: 801002 fh/hlv
;;
;
;;unsigned div
;;w1q=op1 (unsigned)
;;w2=op2 (unsigned)
;;r,ir,c,s used
;;q:=quotient (op1//op2)
;;w1:=remainder
;
unsdiv: ;;
ir:=60,,, ;prepare double shift left
w1:<<c<w1,,ldct 0f ;
unsdiv0: ;
q:=q--,, ;q15:=0
unsdiv1: ;;
w1-w2,s,cjp cry unsdiv2 ;
,,cjp not acy unsdiv3 ;
;
unsdiv2: ;;
w1:<<c<w1-w2,,rpct unsdiv0 ;
swp,q:=-q,,cjp unsdiv4 ;q15:=0; q:=compl q
unsdiv3: ;;
w1:<<c<w1,,rpct unsdiv1 ;
swp,q:=q equ 0,, ;q:=compl q
unsdiv4: ;
w1:=swp,,crtn ; w1:=remainder
.p ;
;;unsigned mult
;;w3=op1
;;w2=op2
;;w1=op3
;;r,ir,c used
;;w1w3:=op1*op2+op3=w3*w2+w1
;
unsmult: ;;
ir:=c:=,,ldct 10 ;prepare rotate, c:=0
,,cjp unsmult3 ; c is considered bit00 of w1
;
unsmult1: ;;
,,cjp not cry unsmult2 ;
w1:=c:w1+w2,, ; c:=bit00
unsmult2: ;;
w1:=>c>w1,, ;
unsmult3: ;;
w3:=>c>w3,,rpct unsmult1 ; c:=multiplicant bit
,,crtn ;
.p ;
;;dyadic compare, fetch operands
;
prepdyad: ;
,,cjs readluc ;
w2:=bd,h w s,cjs readluct ;
w3:=bd,h w s,cjs terror ;
bus:=w2 xor w3,s,jmap not 8 ;
arit2t: ;;
w3:=w3++,,cjp wrfetch ;
arit2boo: ;;
w3:=0,,cjp not cry wrfetch ;
w3:=w3++,,cjp wrfetch ;
;
;; conditional(pointer) jump, fetch
;
prepbranch1: ;
w4:=0,,cjs readcont ;
w0:=w3,,cjs readluc ;
bd,,h w s,cjs readluct ;
,h ,cjp prepbranch2 ;
;
;;conditional jump, fetch
;
prepbranch: ;
,,cjs readcont ;
w0:=w3,,cjs readluc ;
prepbranch2: ;
w3:=bd,h w s,ldct fetch ;
,h ,cjs pty perror ;
w3,s,jmap not 8 ;
jmt: ;;
sic:=rd+w0,,cjp fetch ;
;
.p ;
;
;;
;; end lmitxt079
;;
;;
;; begin lmitxt080c
;;
;; rev: 801003 fh/hlv
;;
.instruction jmzeq , prepbranch ;
,,jrp zro jmt ;
;
.instruction jmzne , prepbranch ;
,,jrp not zro jmt ;
;
.instruction jmzlt , prepbranch ;
,,jrp b0 jmt ;
;
.instruction jmzge , prepbranch ;
,,jrp not b0 jmt ;
;
.instruction jmzgt , prepbranch ;
,,cjp zro fetch ;
,,jrp not b0 jmt ;
;
.instruction jmzle , prepbranch ;
,,cjp zro jmt ;
,,jrp b0 jmt ;
.p ;
;;
;; prepare tnill, tlock, topen;
;;
tprep: ;
w3:=,,cjs readlucq ; d:= readlucq;
w1:=q,,cjs readlucq ; b:= readlucq;
w2:=q,,cjs cread65 ; base,disp:= cread65(b,d);
w6,s,jmap not 8 ; stat(base); goto escmap(ir);
;;
.instruction tnill , tprep ;
;;
;; param:: none;
;; stack:: ptr: addr -> boolean: word;
;;
w3:=,,cjp not b1 wrfetch ; goto wrfetch(if nill(base) then true
w3:=w3++,,cjp wrfetch ; else false);
;;
.instruction topen , tprep ;
;;
;; param:: none;
;; stack:: ptr: addr -> boolean: word;
;;
w5:=w5++,, ; disp.type:= -,disp.type;
;;
.instruction tlock , tprep ;
;;
;; param:: none;
;; stack:: ptr: addr -> boolean: word;
;;
w5,s,cjp b1 wrfetch ; goto wrfetch(if nill(base) then bool
tlock10: ; else
,,cjp not b15 wrfetch ; if disp.type = msg then bool
w3:=w3++,,cjp wrfetch ; else -,bool;
.p ;
.instruction jmprw ;
,,cjs readcont ;
sic:=w3+rd,,cjp fetch ;
;
.instruction jmphc ;
jmphc00: ;
,,cjs readcown36 ;
q:=w6,,cjp jmp1 ;
;
.instruction jmppd ;
,,cjs readlucq ;
w3:=q,,cjs readlucq ;
;
jmp1: ;;
rd2:=sib:=q,, ;
sic:=w3,,cjp fetch ;
;
.instruction neg ;
,,cjs readlucq ;
w3:=-q,s,cjp testovf ;
;
.instruction compl ;
,,cjs readluc ;
w3:=--bd,h w s,cjp wrfetcht;
;
.instruction abs ;
,,cjs readlucq ;
w3:=q,s, ;
,,cjp not b0 wrfetch ;
w3:=-w3,s,cjp testovf ;
;
.instruction notinstr ;
w3:=,,cjs readlucq ;
bus:=--q,s,cjp tlock10 ;
;
.instruction add , prepdyad ;
w3:=w3+w2,s, ;
;
testovf: ;;
,,cjp not ovf wrfetch ;
;
aritovf: ;;
zd1,,s, ;
,,cjp b15 wrfetch ; ignore
q:=arite,, ;
,,cjp xept ;
;
.instruction sub , prepdyad ;
w3:=w3-w2,s,cjp testovf ;
;
.instruction andinstr , prepdyad ;
w3:=w3 and w2,,cjp wrfetch ;
;
.instruction or , prepdyad ;
w3:=w3 ior w2,,cjp wrfetch ;
.p ;
;
.instruction eq , prepdyad ;
w2-w3,s,ldct wrfetch ;
w3:=0,,jrp zro arit2t ;
;
.instruction ne , prepdyad ;
w2-w3,s,ldct wrfetch ;
w3:=0,,jrp not zro arit2t ;
;
.instruction ult , prepdyad ;
c:w2--w3,,cjp arit2boo ;
;
.instruction lt , prepdyad ;
c:w2--w3,,cjp not b0 arit2boo;
c:w3-w2,,cjp arit2boo ;
;
.instruction le , prepdyad ;
c:w2-w3,,cjp not b0 arit2boo;
c:w3-w2,,cjp arit2boo ;
;
.instruction gt , prepdyad ;
c:w3--w2,,cjp not b0 arit2boo;
c:w2-w3,,cjp arit2boo ;
;
.instruction ge , prepdyad ;
c:w3-w2,,cjp not b0 arit2boo;
c:w2-w3,,cjp arit2boo ;
;
.p ;
;
.instruction sha , prepdyad ;
ir:=60,w0:=<c<w2,h , ;arith shift; c:=right shift
w2+0f,s, ;
,,cjp not cry sha2 ;
;;shift right
w3,s,cjp not acy sha4 ; acy: -15<=w2<= -1
rc:=--w2,, ; b0:=sign of w3
w3:=>w3,,rpct k ;
,,cjp wrfetch ;
;
sha2: ;;shift left
w2,s, ;
w1:=w3,s,cjp zro wrfetch ;finish if operand2=0
,,cjp zro wrfetch ;finish if operand1=0
rc:=w2--,,push ;
w3:=w3+w3,s,twb ovf testovf;
;
;;overflow
;
w3:=w1,s, ;
rc:=w2--,,push ;
w3:=w3+w3,s,twb zro k+1 ;
,,cjp aritovf ;
;
sha4: ;; shift right more than 14 times
w3,s, ;
sha5: ;;
w3:=0,,cjp not b0 wrfetch ;
w3:=w3--w3,,cjp aritovf ;
;
.p ;
;
.instruction shc , prepdyad ;
w2:=w2 and 0f,, ;
rc:=w2--,s, ;
,,cjp b0 wrfetch ;
ir:=40,,, ;cyclic shifting
w3:=<w3,,rpct k ;
,,cjp wrfetch ;
;
;
.instruction mul , prepdyad ;
w1:=0,, ;
w4:=w3,,cjs unsmult ;
bus:=w4,s, ;
bus:=w2,s,cjp not b0 mul1 ;
w1:=w1-w2,, ;multiply by extended sign of w4
mul1: ;;
bus:=w3 xor w1,s,cjp not b0 mul2;
w1:=w1-w4,, ;multiply by extended sign of w2
bus:=w3 xor w1,s, ;
mul2: ;;
bus:=w1,s,cjp b0 aritovf ;
bus:=w1++,s,cjp zro wrfetch;
,,cjp zro wrfetch ;
,,cjp aritovf ;
;
.p ;
;
.instruction mod , prepdyad ;
w0:=,,cjp div1 ;
;
.instruction div , prepdyad ;
w0:=1,, ;
;
div1: ;;
q:=w3,s, ;
w6:=w2,s,cjp not b0 div2 ;
q:=-q,, ;
div2: ;;
w2:=-w2,,cjp b0 div3 ;
w2:=-w2,,cjp zro div6 ;
;
div3: ;;
w1:=0,,cjs unsdiv ;
bus:=w0,s, ;zro:=mod
bus:=w3,s,cjp zro div4 ;
w3 xor w6,s, ;stat:=sign of quotient
;
w3:=-q,,cjp b0 wrfetch ;negative result
w3:=-w3,s,cjp not ovf wrfetch;test overflow
,,cjp aritovf ;
;
div4: ;; mod
w3:=w1,,cjp not b0 wrfetch ;
w3:=-w1,,cjp wrfetch ;
;
div6: ;;division by zero
w3:=0,,cjp aritovf ;ovf:-true
;
.p ;
;
.instruction crget ; if you get lu then it will be the old values of lu
,,cjs readluc ;
ra:=bd,,h w s, ;
w3:=rd,, ;
ra:=reg,,cjp wrfetcht ;
;
.instruction crput ;
,,cjs readlucq ;
w2:=q,,cjs readlucq ;
zd:=slu,, ; you may also put lu and ic
rd:=sic,, ;
ra:=w2,, ;
rd:=q,,cjp sfetch ;
;
;;
;; end lmitxt080c
;;
;
;;
;; begin lmitxt085c: index and case instructions
;;
;; rev: 801002 fh/hlv
;;
;
index0: ;;read the range descriptor and test
,,cjs readlucq ;
w1:=q,,cjs readlucq ; qw1:=dope address
index1: ;
bus:=80,w2:=q,, ; w3:=bit0; w21:=dope address
w3:=swp,,cjs readlucq ;
w0:=q xor w3,, ; w0:=index xor bit0
w6:=w2,, ;w6:=range base
w5:=w1,,cjs readnext ;w5:=range disp
w1:=bd xor w3,h w s,cjs readnextt;w1:=lb xor bit0
w2:=bd xor w3,h w s,cjs terror;w2:=ub xor bit0
w2-w0,s, ;
w0:=w0-w1,s,crtn acy ; w0:=index-lb
clearstat: ;
,s,crtn ;
index2: ;;
q:=indexe,, ;
,,cjs not acy xept ;
,,cjs readnext ;
w3:=bd,h w s,cjp terror ;w3:=the third word of the d op vector
index3: ;;w3=position
,,cjs readluc ;
w3:=bd+w3,h w s,cjs readluct;
w4:=bd,h w s,cjp terror ;
;
index4: ;;calculate packed array
q:=0ff,, ;
w3,w3:=w3 and q,, ;w3:=size
w2:=swp and q,, ;w2:=no pr word
q:=w0,,cjs unsdiv ;w0:=wordno
w0:=q,,cjs readluc ;w1:=pos in the word
w2:=bd--,h w s,cjs readluct;
w4:=bd,h w s, ;
w0:=w0+w0,h , ;
w2:=w2+w0,h ,cjs pty perror;
w6:=w4,,cjp b1 nillerr ;w56:=addr of indexed word
w5:=w2,,cjs readnext ;
w0:=bd,h w s, ;w0:=indexed word
w2:=0,h ,cjs pty perror ;
ir:=60,q:=w0,, ;q:=indexed word
w4:=10,s, ;counter:=10(hex)
;; now w2q:=w2q shift w0*w3
;; w4:=10-w1*w3
index5: ;;
bus:=w1:=w1--,s, ;
rc:=w3--,,crtn b0 ;
index6: ;;
w4:=w4--,, ;w4:=no of shifts made
w2:<<w2,,rpct index6 ;
,,cjp index5 ;
;
.p ;
;
.instruction intrs ;
,,cjs index0 ;
slu:=slu+2,, ; don't unstack the index
,,cjp acy fetch ;
q:=packe,, ;
,,cjp xept ;
;
.instruction index ;
,,cjs index0 ;
w1:=0,,cjs index2 ;read length
w2:=w0,,cjs unsmult ;w3:=position
,,cjs index3 ;w34:=resulting address
,,cjp wr34fetch ;
;
.instruction inprs ;
,,cjs index0 ;w0:=index-ln
,,cjs index2 ;w3:=no, size
w1:=0,,cjs index4 ;
;; now the data is left justified in q
rc:=w3--,, ;rc:=length-1
w3:=0,, ;
w3:<<w3,,rpct k ;
,,cjp wrfetch ;
;
.instruction inpss ;
,,cjs readluc ;
w7:=bd,h w s,cjs terror ;w7:=value to be stored
,,cjs index0 ;w0:=index-lb
,,cjs index2 ;w3:=no, size
w1:=0,,cjs index4 ;
;; now the data is left justified in q
;; w2=the data in front of the element
;; w4=16 - the number of shifts already performed
;; w65=the address of the word + 1
;; w7=the value to be stored
;; w3=the size
w0:=0,, ;
rc:=w3--,,push ;
w0:=w0++w0,, ;w0:=mask
w2:<<w2,, ;w2:=front data
w2:=w2 and 7fe,,rfct ;
rc:=w4--w3,s, ;
w7:=w7 and w0,, ;
w3:=w7,, ;the value to be packed
w3:=w3+w2,,cjp b0 inpss1 ;
w3:<<w3,,rpct k ;
inpss1: ;
w1:=w5-2,, ;
w2:=w6,,cjs writenext ;
,,cjp fetch ;
;
.p ;
;
.instruction jmcht ;
,,cjs readcown36 ;
q:=w6,, ; qw1:=dope address
w1:=w3,,cjs index1 ;
w0:=w0++w0,,cjp not acy jmcht1;
w0:=w0++w0,, ;
w5:=w5++w0,, ;
;
jmcht1: ;;
,,cjs readnext ;
w4:=bd,h w s,cjs readnextt ;
w3:=bd,h w s,cjs terror ;
q:=w4,,cjp jmp1 ;
;
;;
;; end lmitxt085
;;
;;
;; begin lmitxt087c: procedure call instructions
;;
;; rev: 801003 fh/hlv
;;
.instruction pcald ;
,,cjs readluc ;
w1:=bd++,h w s,cjs readluct;w1:=distance+1
w2:=bd,h w s,cjs readluct ;
w0:=bd,h w s,cjs readluct ;w02:=link
w3:=bd,h w s,cjs readluct ;
w4:=bd,h w s,cjs terror ; w34:= entry point;
,,cjp pcals1 ;
;
.instruction pcals ;
,,cjs readcont ;
w1:=w3++,,cjs getif ;w1:=distance+1
w2:=w0,, ;w02:=link
w0:=w6,,cjs readcown36 ;w43:=entry point
w4:=w6,, ;
;
pcals1: ;;
w5:=w3,, ;w45=entry point
w1:=slu--w1,, ;
w6:=w2,, ;w06=dynamic link
w2:=slb,, ;
w3:=w0,,cjs writenext ;link
w0:=rd0,, ;w0:=sf
rd0:=w1,, ;
w3:=w6,,cjs writenext ;
w3:=spb,,cjs writenext ;dynamic lic
w3:=w0,,cjs writenext ;
w3:=sib,,cjs writenext ;return point
w3:=sic,,cjs writenext ;
q:=w4,, ;
w3:=w5,,cjp jmp1 ;
.p ;
.instruction pexit ;
w5:=rd0++,, ;w65:=sf
w0:=w5-3,, ;calculate new lastused
w6:=spb,, ;
w5:=w5++,,cjs readnext ;
w2:=bd,h w s,cjs readnextt ;w21:=link
w1:=bd,h w s,cjs readnextt ;
w4:=bd,h w s,cjs readnextt ;w43:=return point
q:=w4,h , ;
w3:=bd,h w s,cjs terror ;
rd0:=w1,, ;update sf
zd:=slu:=w0,,cjp jmp1 ;update lastused
;
;;
;; end lmitxt087c
;;
;;
;; selfdiagnostic test routines.
;;
;; file: lmitxt090
;; rev.: 800807 hlv
;;
;; the test routines are executed as responce to
;; commands recieved from the 8085 debug micro.
;; after each test has been executed, an answer
;; is returned to the debug micro. below is a
;; short description of test commands and answers:
;;
;;fifo: 0 1 2 3 4 5 description
;;*) w3.l w3.r w1.l w1.r w2.l w2.r
;;
;; c: 1 - - - - - xmit 7.5 intrp
;; a: 1 - - - - - to 8085.
;;-------------------------------------------------------------------
;; c: 2 - - - - - w-reg addr. test.
;; a: 2 - - - - 0 test ok.
;; a: 0 read data errorra error error found.
;;-------------------------------------------------------------------
;; c: 3 test pattern - - - w-reg data test.
;; a: 3 - - - - 0 test ok.
;; a: 0 read data error ra error error found.
;;-------------------------------------------------------------------
;; c: 4 module no - - - mem. addr. test.
;; a: 4 - - - - 0 test ok.
;; a: 0 read data error addr error error found.
;;-------------------------------------------------------------------
;; c: 5 module no test pattern - mem. data test.
;; a: 5 - - - - 0 test ok.
;; a: 0 read data error addr error error found.
;;-------------------------------------------------------------------
;;
;; error= +1: left parity, +2: right parity, +4: data error;
;;
;; *) the w-reg bytes refers to the shiftcom fifo:
;; input -> w3.l -> w3.r -> w1.l -> w1.r -> w2.l -> w2.r -> output
.p ;
;;
;; select test
;;
;; entry: w3,w1,w2= microcom fifo; swap= w3; w4= 0ff; w5= 0ff00;
;;
selftest: ;selftest:
w0:=swp,, ;
w3:=w3 and w4,, ;
w6:=w1 and 700,, ;
bus:=w3 ior w6,, ;
w7:=swp,, ; w7:= fifo(1) shift 8 + fifo(2);
w0:=w0 and 7,, ; test:= fifo(0) and 7;
w0:=w0--,s,ldct mrq10 ; goto case test of (
w0:=w0--,s,cjp zro selft100; 1: selftest1;
w0:=w0--,s,cjp zro selft200; 2: selftest2;
w0:=w0--,s,cjp zro selft300; 3: selftest3;
w0:=w0--,s,cjp zro selft400; 4: selftest4;
,,jrp zro selft500 ; 5: selftest5;)
; otherwise end session;
;;
;; at entry to test routine:
;; wo= fifo(0) = test no; w1= fifo(2,3); w2= fifo(4,5);
;; w3= fifo(1); w4= 000ff; w5= 0ff00;
;; w6= fifo(2) shift 8; w7= fifo(1,2);
;;
.p ;
;;
;; selftest 1: generate 7.5 interrupt to 8085.
;;
selft100: ;selftest1:
led:=6,,, ; set8085;
,,cjp mrq10 ; goto end-session;
;;
;; selftest 2: register address test.
;;
selft200: ;selftest2:
w5:=3ff,s, ;
selft210: ; for i:= 1023 step (-1)
ra:=w5,, ; until 0 do
rd:=w5,w5:=w5--,s,cjp not zro selft210; regs(i):= i;
ra:=w5:=w5-w5,,push 3ff ; for i:= 0 step 1
w4:=rd,, ; until 1023 do
w5 xor w4,s, ;
ra:=w5:=w5++,,twb not zro selftok; if regs(i)<>i then goto error;
;;
;; selftest error, deliver errormessage to 8085.
;;
;; entry: w5= addr, w4= read data, q= error;
;;
selfterr4: ;selftesterror4:
q:=4,, ; error:= data error;
selftderr: ;selftestdataerror:
w5:=w5--,, ; addr:= addr-1;
selfterr: ;selftesterror:
bus:=w6:=0ff,, ; w6:= rmask;
w7:=swp,, ; w7:= lmask;
bus:=w5 and w6,, ;
w2:=swp ior q,, ; w2:= addr shift 8 + error;
w5:=w5 and w7,, ;
w1:=w4 and 0ff,, ;
bus:=w5 ior w1,, ; w1:= addr shift (-8) +
w1:=swp,, ; data shift 8;
bus:=w4,, ; w3:= data shift (-8);
w3:=swp and w6,,cjp mrq22a ; goto update-cyclic;
.p ;
;;
;; selftest 3 : register data test.
;;
selft300: ;selftest3:
w4:=w7,, ; d:= testpattern;
w0:=,,push 3ff ; for r:= 0 step 1 until 1023 do
ra:=w0,w0:=w0++,, ; begin
rd:=w4,w4:=--w4,,rfct ; regs(r):= d; d:= -,d;
; end;
w5:=w5-w5,,push 3ff ; for r:= 0 step 1 until 1023 do
ra:=w5,w5:=w5++,, ; begin
w4:=rd,, ; if regs(r)<>testpattern
w4 xor w7,s, ; then goto selftestdataerror;
w7:=--w7,,twb not zro selftok; testpattern:= -,testpattern;
,,cjp selftderr ; end; goto selftestok;
;;
;; selftest 4 : memory address test.
;;
selft400: ;selftest4:
w2:=w7,, ; b:= modulebase;
w3:=,, ; for d:= 0 step 2 until -2 do
selft410: ;
w1:=w3--,,cjs writenext ; writenext(b,d-1,d);
w3:=w3+2,s, ;
w6:=w7,,cjp not zro selft410;
selft420: ; for d:= 0 step 2 until -2 do
w5:=w3--,,cjs readnext ; begin
w4:=bd,h w s, ; readnext(b,d-1); d1:= waitmem;;
,h , ;
bd,,h w ,cjp pty selft430 ; if pty then goto t4parity;
w4 xor w3,s, ;
w3:=w5++,s,cjp not zro selfterr4; if d1<>d then goto selftesterror4;
,,cjp not zro selft420 ; end;
selftok: ;selftestok:
w2:=,,cjp mrq22a ; result:= ok; goto updatecyclic;
.p ;
selft430: ;t4parity:
q:=w0-w0,,cjv 3 selft435 ; error:= 0; case parity of
.loc ;
selft435: ;
,,cjp selft440 ; no pty error: goto testdata;
q:=q++,, ; r pty error: error:= error + 2;
q:=q++,,cjp selft440 ; l pty error: error:= error + 1; goto testdata;
q:=3,, ; lr pty error: error:= 3;
selft440: ;testdata:
w4 xor w3,s,ldct selfterr ; if dataerror then
w5:=w5--,,cjp zro selfterr ; error:= error + 4;
q:=q+4,,jrp zro ; goto selftesterror;
;;
;; selftest 5 : memory data test.
;;
selft500: ;selftest5:
w1:=w1 and w4,, ;
w2:=w2 and w5,, ;
bus:=w1 ior w2,, ; testpattern:=
w3:=swp,, ; fifo(3) shift 8 + fifo(4);
w2:=w7,, ; b:= module no;
w1:=,, ; for d:= 0 step 2 until -2 do
selft510: ; begin
w1:=w1--,,cjs writenext ; writenext(b,d-1,testpattern);
w1:=w1+1,s, ; testpattern:= -,testpattern;
w3:=--w3,,cjp not zro selft510; end;
w6:=w7,, ;
selft520: ; for d:= 0 step 2 until -2 do
w5:=w1--,,cjs readnext ; begin
w4:=bd,h w s, ; readnext(b,d-1);
w1:=w1+2,h , ; t:= waitmem;
bd,w4 xor w3,h w s,cjp pty selft430; if pty then goto t4parity;
w1,s,cjp not zro selfterr4 ; if t<>testpattern then goto selfterror4;
w3:=--w3,,cjp not zro selft520; testpattern:= -,testpattern;
,,cjp selftok ; end; goto selftestok;
;;
;; end of lmitxt090: selfdiagnostic routines
;;
▶EOF◀