|
|
DataMuseum.dkPresents historical artifacts from the history of: RC3500 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC3500 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 13824 (0x3600)
Types: TextFileVerbose
Names: »lmitxt001«
└─⟦2c55ea56f⟧ Bits:30001844 SW-save af projekt 1000, Alarm-system
└─⟦093e2ad1c⟧
└─⟦this⟧ »lmitxt001«
;;
;; begin lmitxt001
;;
auto: ;
,,cjp c7 k ;
ir:=300,,, ;
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
;
ra:=reg:=firstreg,,loop ;
zdx:=slb:=lubase,,loop ;
rdx:=sib:=autobase,,loop ;
lev:=startlevel,,loop ;
w0:=lev,,cjs setlint ;
zdw:=,,cjp fetch0 ; firstreg.ps:=0
.p ;
stopmode: ;
ir:=ra:=w0:=radummy,, ;
w1:=zd,s, ;
ra:=reg,w2:=c:q+0,s,cjp zro fetch; cry:=0
w1,s,cjp not zro fetch1 ; jump if level shift
ra:=w0,,cjp b0 stopmode1 ;
zd:=w1--,,cjp stopmode2 ; countmode, zro=false
stopmode1: ;; breakpointmode
sib-zd0,s, ;
,,cjp not zro stopmode2 ;
sic-zd1,s, ;
stopmode2: ;
ra:=reg,,cjp zro fetch ; goto if zro then fetch else
c:w0-w0,,cjp execnext ; execnext, with cry=1
;
setslice: ;;
ra:=reg,, ;
setslice1: ;
sic:=rd,, ;
slu:=zd,, ;
slb:=zd2,, ;
sib:=rd2,,crtn ;
.p ;
;; entries into fetch:
;
exec: ;; from mreqq: execute
int,c:w0-w0,h , ; cry:=1
q:=int xor lev,h ,cjs setslice; ra:=reg
;
fetch1: ;; from fetch with cry=1; from stopmode (*breakpointmode *) with cry=0
;; cry=0 means level shift during breakpointmode
w6:=lev xor q,s, ; w6:=int
rd:=sic,w4:=0,,cjp zro lev0; jump if int=0
w7:=w6 clr 700,s, ;
zd:=slu,,cjp zro internal ; jump if no external
;; external interrupt:
w0:=w7,, ; w0:=extlevel;
w7:=w7++w7,,push 1 ;
ra:=w7:=w7++w7,,rfct ; w7:=calculated reg addr
ir:=rd2,w3:=,s, ;
w1:=zd,,cjp b0 dummyoriob ; return to fetch2 if dummyreg
fetch2: ;
ra:=reg:=w7,,cjp fetch3 ; update reg and lev
internal: ;
bus:=w6,, ; update reg and lev
ra:=reg:=swp,,cjp fetch3 ;
lev0: ;
ra:=reg:=7,, ; update reg and lev
fetch3: ;
lev:=w6,,cjs setslice1 ;
;
execnext: ;; from execnext, ionci, with cry=1
bf:=errb:=sib,s,cjp cry fetch5; goto if cry then fetch5 else
fetch0: ;; delay, goto fetch
,,cjp fetch ; fetch (* level shift during breakpointmode *)
;
.instruction mnoop , fetch0 ;
.p ;
dummyoriob: ;; from fetch; entry into the block i/o instructions
;; for further explanation, see lmitxt030c.
;
q:=zdw,,cjp b1 fetch2 ; jump if dummy interrupt
q and 4,s, ; zro := -, to
w2:=rd0,, ; w21:=next addr
w5:=c:rd,,cjp not zro iobto; cry:=false; w5:=count; if to then goto iobto
q:=w0 ior 200,, ; clear level w0:
w7--sregmax,s, ; if this level <= sregmax then
bf:=q,,cjp acy iob1 ;
,h u , ; clear internal
iob1: ;
q:=q and 7,h , ;
bd:=q,h w ,jmap not 8 ; clear external; goto instruction
.p ;
;; logical testsequence in fetch:
;; 1. mreqq
;; 2. stopmode
;; 3. breakpointmode and level shift
;; 4. level shift
;; 5. 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 ;
;
fetch: ; time without interrupt: 9,5x = 2,06us
int,c:w0-w0,h ,cjp not cr mreqq; cry:=1
q:=int xor lev,h s,cjp not c7 stopmode;
bf:=errb:=sib,h s,cjp not zro fetch1;
fetch5: ;
zd:=slu,w3:=,h ,cjp b0 dummyregs; jump if ib.bit0
c:=bd:=errd:=sic,h r ,ldct herror;
w7:=bd,h w s,cjp not cry fetch6; w7:=readbyte; jump if even addr
ir:=w0:=w7,h ,jrp not pty fetch7; jump to herror or fetch7
fetch6: ;; even address
ir:=w0:=swp,h ,jrp not pty fetch7; jump to herror or fetch7
;
;; lmitxt20 contains either dynamic statistics collection, or
;; the following two lines:
;;
;;fetch7:
;; rd:=sic, sic:=sic++, jmap 8 ; switch to the instruction
.p ;
;;
;; procedure herror
;;
;; entry: errb, errd= def.;
;; exit : to fetch;
;;
herror: ;proc herror;
errd:=errd and 7fe,h , ; disp:=disp and 0fffe
q:=56,h , ; 01010lr0: q:= memory error;
bf:=errb,h , ;
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
debugmess: ;
ra:=racom8085,,,loop ;
rd1:=q,,loop ;
rd2:=errb,,loop ;
rd:=errd,,cjs setslice ;
led:=6,,,loop ;
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 ;
q:=undefins,, ; error:=undefined instruction;
;
;;
;; procedure xept(error); (* unconditional program exception *)
;;
;; entry: q= error;
;;
xept: ;proc xept;
w3:=q,,cjs setslice ;
ir:=300,w2:=spb,,loop ;
w1:=excode--,,loop ;
w1:=w1+rdw,,cjs writenext ; d:= pr+excode-1; 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,,loop ; d:= pr+exadr-1;
w6:=spb,,cjs readnext ; readnext(spb,d);
sib:=bd,h w s, ; sib:= waitmem;
rdx:=sib,h ,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,, ;
w0:=,,cjs setpswait ; setpswait((..));
,,cjp fetch ; goto fetch
.p ;
;;
;; 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 ;
;
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
,,cjp mrq14 ;100011 read data
,,cjp mrq9 ;110011 write request
;
mrq2: ;
ccr,,,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,c:w0-w0,,cjpp mrq8 ;001111 execute on curr. level; cry:=1
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:=basedata,, ;
,,ldct mrqerror ;
w7:=w5++,,cjs readb65n1 ; w3:=readbyte
w0:=w3,,cjs setlint ; setlocalinterrupt(w3)
,,cjp mrq10 ; goto end session
;
mrq8: ; execute on curr. level:
ra:=c:reg-0,,cjp execnext ; cry:=1 ; ra:= reg; goto execnext;
;
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 ; ra:=reg
;
mrq14: ;;read data
w2:=basedata,, ;
q:=w3 and 3f,, ;
w3,w1:=q--,, ;
w3:=swp and w4,,cjs writebnext;
,,cjp mrq10 ;
.p ;
mrq19: ;get mem
;;
;; due to the intel multibus memory data are read
;; as two bytes supplying
;; a zero value when no module is answering selection.
;;
q:=,,ldct err19 ; q remembers any error
w6:=w1,, ;
w5:=w3--,,cjs readb65n1 ; w3:=the first byte
bus:=w3,, ;
w2:=swp,,cjs readb65n1 ; w3:= the next byte
q,s, ; zro:=no error
zd0:=w2:=w2+w3,, ; zd0 := w2 := the word read
,,cjp zro mrq10a ; goto mrq10a in case of no errors
;
mrqerror: ;; parity error; addr=w6,w7; q=54;
ccr,errd:=w7,,cjp errw6b ;
;
err19: ;; remember the displacement in case of error
w7:=errd,,crtn ;
;
mrq21: ;;putmem
w1:=w1--,,cjs writenext ;
,,cjp mrq10 ;
;
mrq22: ;;get reg
w2:=rd,,cjp mrq22a ;
;
mrq23: ;;put reg
rd:=w3,,cjp mrq10 ;
;
;;
;; end lmitxt001
;;
.p ;
«eof»