|
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: 132864 (0x20700) Types: TextFile Names: »ticcnbus«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ. └─⟦4334b4c0b⟧ └─⟦this⟧ »ticcnbus«
; hc2901 *test: off ; -------------------------------------------------- ; 810730/1130: ; stwrch and fiwrch defined as clocking registers. ; substitutes recvst and recvcl from iccn bus ; logic. ; NEXT. ; ---------------------------------------------------- ; mask *mask: regsrc,21,(36:39) ; full register source mask. *mask: cndslc,(6:10) ; condition select mask. *mask: aludst,23,24,25 ; alu destination select mir (23:25). *mask: alufnc,26,27,28 ; alu function select mir (26:28). *mask: alusrc,29,30,31 ; alu source select mir (29:31). ; clear ready bit hc2903 mir(15). ; jump addrs codes ; use full sekvens mask. ; type = 12. ; bit(1:4) in instr. format is the sekvens kontrol, ; bit(5) in instr. format is condition enable. *name: cjsb,12,1,0 ; conditional jump to subroutine *name: jsb,12,1,1 ; jump to subroutine *name: cjmp,12,3,0 ; conditional jump addrs. *name: jmp,12,3,1 ; jump addrs unconditional. *name: cjsrp,12,4,0 ; conditional jump to subroutine conditional addrs. ; from sekvenser reg. or direct. *name: cjmrd,12,7,0 ; jump to addrs. conditional ; from secvenser register or direct. *name: rpct,12,9,0 ; repeat direct and derease counter until ; counter = 0. *name: cjmpp,12,11,0 ; conditional: if pass then ; pop stack and jump to direct addrs. ; else continue. *name: twb,12,15,0 ; tree way branch ; jump sekvens codes. *name: jmpz,14,0,0 ; jump to addrs. zero, ; clear stack. *name: jmap,14,2,0 ; jump to addrs. given by map prom *name: push,14,4,1 ; push addrs of next mic. instr to ; micro secvens stack and continue. *name: cjvt,14,6,0 ; jump to addrs. given by vektor prom *name: rep,14,8,0 ; if counter <> 0 then goto first in stack ; else pop stack and continue. *name: crtn,14,10,0 ; conditional: if pass then ; jump to first in stack and pop stack ; else continue. *name: rtn,14,10,3 ; return: jump to first in stack ; and pop stack. *name: loop,14,13,0 ; conditional loop: ; if pass then pop sctak and continue ; else jump to first in stack. *name: pop,14,13,3 ; pop stack and continue. *name: sync,14,14,0 ; dummy syncronotation instruction. *name: cont,14,14,0 ; continue to next micro instr. ; type 15 load counter types. *name: ldct,15,12,0 ; load counter whit addrs. field and continue. *name: clcpu,15,4,0 ; pusch mic. program counter to stack and ; if pass then load counter whit addrs. field ; else hold counter. *name: lcpu,15,4,1 ; load counter with address field and ; push address of next mic. instr. to stack. ; alu function codes. *name: add,11,0,1 ; add: a+b , internal reg. carry = 0. *name: add1,11,0,2 ; add1: a+b+1 , internal reg. carry = 1. *name: sub,11,1,2 ; sub: b-a , int. reg. carry = 1. *name: sub1,11,1,1 ; sub1: b-1a-1 , int. reg. carry = 0 *name: negadd,11,2,2 ; nadd: -b+a , int. reg. carry = 1 *name: negad1,11,2,1 ; nadd1: -b+a-1 , int. reg. carry = 0 *name: and,11,4,1 ; and: a and b , int. reg. carry = don't care. *name: or,11,3,1 ; or: a or b, int. reg. crrry = don't care. *name: xor,11,6,1 ; xor: a xor b, int. reg. carry = don't care *name: nxor,11,7,1 ; nxor: not(a xor b), int. reg. carry = don't care. *name: andinv,11,5,1 ; andinv: not(a) and b, int. reg. carry = ; don't care. *name: andn,11,5,1 ; andn: not(a) and b, int. reg. carry = don't care. ; inc and dec instr whit one internal op. *name: inc,11,0,7 ; increase a register. *name: dec,11,1,6 ; decease. ; move and move zero instr. *name: move,11,3,3 *name: mzero,11,4,5 ; *name: moinc,11,0,4 ; move and increment. *name: modec,11,1,3 ; move adn decrement. *name: moinv,11,7,3 ; move invert ; the nonaddressable q-register. *name: q,30,-1 ; the negative value to ; destingues from the others . ; internal register definitions. ; ------------------------------ *name: status,30,7 ; rc2901 status bit register ; same as int reg, mus corrospon with ; hc2903 buffer register. *name: wrk0,30,2 ; working register 0. *name: intreg,30,7 ; interupt register, part of status register. ; must correspond whit hc2903 buffer ; register. *name: intlev,30,0 ; current interupt level number. *name: pctst,30,3 ; temp. pc test register. ; used to stop hc2901 when ; when pctst ( from manual test ; register) is equal ic. *name: iccnch,30,3 ; interupt enablet level. *name: intlim,30,4 ; interupt limit register. *name: ic,30,5 ; instruction counter (absolute address) *name: pir,30,8 ; prefetched instruction register. *name: wrk1,30,6 ; working register 1. *name: wrk2,30,1 ; working register 2. ; iccn bus not used until futher *name: icmas,30,9 ; iccn dma master memory address. *name: icwoco,30,10 ; iccn word counter. *name: icsla,30,11 ; iccn dma slave memory address. *name: icdev,30,12 ; iccn dma reciever ; dev. no<12 + send dev. no. ; channel register same as iccn bus registers. *name: dichwc,30,9 ; data in channel word counter. *name: dichad,30,10 ; data in channel block address. *name: dochwc,30,11 ; data out channel word counter. *name: dochad,30,12 ; data out channel block address. *name: c66,30,13 ; in rh8000 this reg. ; contain the constant 66. *name: lmem,30,13 ; local dma memory address. *name: lwco,30,14 ; local dma word counter. *name: icbiba,30,15 ; iccn bus informaiton block address. ; -- - - - - ; internal names or internal registers. *name: r0,30,0 ; internal register. *name: r1,30,1 ; internal register. *name: r2,30,2 ; internal register. *name: r3,30,3 ; internal register. *name: r4,30,4 ; internal register. *name: r5,30,5 ; internal register. *name: r6,30,6 ; internal register. *name: r7,30,7 ; internal register. *name: r8,30,8 ; internal register. *name: r9,30,9 ; internal register. *name: r10,30,10 ; internal register. *name: r11,30,11 ; internal register. *name: r12,30,12 ; internal register. *name: r13,30,13 ; internal register. *name: r14,30,14 ; internal register. *name: r15,30,15 ; internal register. ; external registers. *name: tstreg,30,16 ; dest: write hc2903 ; source: read hc2903 *name: r16,30,16 ; external reg 16. *name: medata,30,17 ; dest: write hc memory data ; source: read hc memory data. *name: r17,30,17 ; external reg 17. *name: meaddr,30,18 ; dest: write hc memory addrs. ; => start read cyc. ; source: in hc8000 not meaningfull *name: rc80cn,30,18 ; source: in rh8000 last 4 bit from ; address in data out instruction ; from rc8000. *name: r18,30,18 ; external reg18. *name: dmada,30,19 ; dest: write dma data. ; source: read dma data *name: r19,30,19 ; external reg 19. *name: dmaadr,30,20 ; dest in hc2901: write dma addrs. *name: clrf80,30,20 ; dest in rh2901: clear flag from rc8000. *name: iccnid,30,20 ; source: device number of this system ; as functioning in ; the iccn bus system, ; does not function on rh8000, ; only on hc8000. ; iccn bus not used until futher. *name: iccn,30,21 ; dest: write iccn register. ; source: read iccn register. ; channel bus data register. *name: chdata,30,21 ; dest: write channel bus ; read channel bus . *name: hc2903,30,23 ; dest: write hc2903 buffer register. ; source: read hc2903 buffer register. *name: extreg,30,22 ; external reg. no. 6. ; must correspond with register no ; wrk1. ; realy not a register but only ; used for clocking of external ; devices in connection with ; opening of external devices. ; dest: read and write external char device. ; source: not meaning full. *name: intprm,30,22 ; address the init prom in hc8000. ; works as extreg but without opening ; of external devices. ; the iccn bus is not used until futher. ; iccn bus control ; implemented as specials but is acutally ; unused source in alufunction. *name: burqst,16,24,1,regsrc ; ask for iccn bus request. *name: burels,16,25,1,regsrc ; release iccn bus ( i.e not master on bus any ; more). *name: slctst,16,26,1,regsrc ; set iccn bus device select logic. *name: slctcl,16,27,1,regsrc ; clear iccn bus device select logic. *name: sendst,16,28,1,regsrc ; set iccn bus send control logic. *name: sendcl,16,29,1,regsrc ; clear iccn bus send control logic. *name: recvst,16,30,1,regsrc ; set iccn bus recieve control. *name: recvcl,16,31,1,regsrc ; clear iccn bus recieve control. ; channel control registers. ; implemented as specials but is actually ; unused source in alufunction. *name: clchii,16,25,1,regsrc ; clear channel input interupt. ; same as clear master request. *name: clchoi,16,29,1,regsrc ; clear channel output interupt. ; same as clear sender control. *name: strech,16,26,1,regsrc ; start read channel. *name: firech,16,27,1,regsrc ; finis read channel. *name: stwrch,16,30,1,regsrc ; start write channel. *name: fiwrch,16,31,1,regsrc ; finis write channel. ; hc2901 status register ( condition code bits) ; type is condition type = 40 ; format is: <name>/40/<value>/<not used>,<mask name> ; *name: ovrun,40,16,0,cndslc ; overrun on alu function. *name: neg,40,17,0,cndslc ; negative alu output. *name: zero,40,18,0,cndslc ; zero alu output. *name: carry,40,19,0,cndslc ; carry on alu function. *name: vect,40,20,0,cndslc ; vector interupt *name: rememo,40,21,0,cndslc ; memory ready *name: npmem,40,22,0,cndslc ; parity error (memory) *name: re2903,40,23,0,cndslc ; hc2903 ready *name: re8000,40,11,0,cndslc ; wait for ready from bit 11 only in rh8000 *name: reldma,40,11,0,cndslc ; wait for ready from bit 11, local dma ; only in initial version. *name: icsic,40,8,0,cndslc ; iccn sender input control *name: icric,40,9,0,cndslc ; iccn receive input control *name: nabrqi,40,10,0,cndslc ; -, iccn bus request init *name: chioin,40,13,0,cndslc ; timerdivice interupt. *name: chiosy,40,14,0,cndslc ; character divice clock syncronation signal. *name: tstrdy,40,15,0,cndslc ; wait manual test *name: wainle,40,12,0,cndslc ; wait interupt level ; form external interupr device to ; be ready on charakter data bus. *name: icmabu,40,12,0,cndslc ; wait until master on bus. ; ; ; ; ; specials ; ; ; ; ; ; type 4 gives the actuel no of the bit. *name: noint,16,0,4,13 ; clear interupt enable bit ; mir(13) := 0 ( normaly 1). *name: not,16,1,2,5 ; change polarity of condition *name: setcar,16,1,2,13 ; set carry bit in micro instr. *name: clcar,16,0,2,13 ; clear carry bit in micro instr. ; specials in alu. destinaliton field *name: onlyq,16,0,1,aludst ; store output from alu. only in q_reg. *name: noload,16,1,1,aludst ; do not store result from alu. in ; intern reg. *name: soout,16,2,1,aludst ; send reg. contents pointed by a_addrs ; to extern bus, store result from ; alu. in intern reg. pointed by b_addrs. *name: stddes,16,3,1,aludst ; std. destinaltion control. ; store result from alu in ; intern registe pointed out by ; b_addrs field. *name: sraq,16,4,1,aludst ; shift alu_result rigth 1 bit and ; shift contents of q_reg rigth 1 bit. ; store alu_result after shift in ; register stack pointed out by b_addrs ; field. *name: sr,16,5,1,aludst ; shift alu_reult rigth 1 bit. ; store alu_result after shift in reg. ; register stack pointed out by b_addrs ; field. *name: slaq,16,6,1,aludst ; shift alu_result left 1 bit and ; and store shifted result in reg. ; in internal register stack pointed ; out by b_addrs field, shift also ; contents of q_reg left 1 bit. *name: sl,16,7,1,aludst ; shift alu_result left 1 bit, ; and store shifted result in reg. *name: cl2903,16,1,4,15 ; clear bit indicating that ; the reg to the hc 2903 is ready ; mir(15) := 1. *name: clexde,16,1,4,18 ; clock external dev. clock bit, ; also callsed valid memory address in ; the motorola pia system, mir(18) = 1. *name: trnbus,16,1,4,19 ; turn bus direction for 1 third of ; the bus so bus(0.7) is input ; and bus(8.23) is output of control and ; device number, used by reading of charakter ; type devices, ( set mir(19)). *name: opdira,16,5,1,alusrc ; open for direct and a ram source. *name: opdirz,16,7,1,alusrc ; open for direct and zero source. *name: opinde,16,3,1,alusrc ; open for zero and internal source. ; the internal source is the same as destination. *name: opramf,16,3,1,aludst ; open for internal registers. *name: oprama,16,2,1,aludst ; open for internal reg. and ; move a bus to out port. *name: clkint,16,1,4,14 ; clock interupt logic ; for reading of ; external interupt level. *name: readch,16,1,4,16 ; select read from external char device , ; mir(16) = 1, schould be set together with ; bit(1) in the bus word. *name: writch,16,0,4,16 ; select write from external char device, ; mir(16) = 1, normaly allways cleared. *name: sltiml,16,1,4,17 ; select timer divice or other divice no less ; from deivce no 0 to device no 7, ; mir(17) = 1. *name: init03,16,1,4,17 ; set mir(17) , cause hc2903 to ; start initialize, schould be send ; at least 3 times following ; each other. only functioning ; in rh8000. *name: intr03,16,1,4,0 ; set mir(0), which interupt the ; hc2903 ; open for interupt group 0, ; dev on 2901 board. *name: opexde,16,1,2,11 ; open fore xtern destination registers. ; set or clear selected bit or bits ; selected from the argument. *name: set,16,-1,3,1 ; set one bit *name: clear,16,0,3,1 ; clear one bit *name: setall,16,-1,3,2 ; set all bit from arg1 to arg2 *name: clall,16,0,3,2 ; clear all bit from arg1 to arg2 ; in internal register stack pointed ; out by b_addrs field. *save: m2901 *end: *load: m2901 ; ----------------------------------------------- ; generel abrivations: ; ; msw = most significant word. ; lsw = least significant word. ; msh = most significant halfword. ; lsh = least significant halfword. ; mso = most significant octet. ; ino = intermidiate octet. ; lso = least significant octet. ; msb = most significatnt bit. ; lsb = least significatnt bit. ; ; dot notation examples: ; wrk0.msh.lsb = bit 11 inwrk0 register. ; wrk0.lso.msb = bit 16 in wrk0 register. ; ; octet = 8 bits. ; halfword = 12 bits. ; word = 24 bit. ; ; the words is numbered so bit 0 is the most ; significant bit ( sign bit) and bit 23 is ; the least significant bit ( one bit). ; note: this is completely oposite from ; the normal rc8000 notation, but is ; due to some numbering facts in the bits ; bitslices. ; ------------------------------------------------ ; ----------------------------------------- ; 19810505: ; temporary the iccn bus is skipped ; with the skip construction 'iccnx', ; or 'iccn'. ; procedures only used by the iccn bus logic ; is also skipped. ; channel bus logic inserted. ; 810722/1600: ; status/interupt level fetch is changed, ; in module 'ansin'. ; only checked for rh2901. ; instead for two call of hlfwrd move ; subroutines the extraction of the interupt ; level is performed on the spot. ; constant 'hlfwdm1' declered for this ; purpose. ; 810722/1607: ; all occurences of the word byte is ; changed to octet. ; 810722/1645: ; the set disable/enable module is changed ; so halfword move subroutines is not called. ; 810722/1650: ; sobroutines 'hwmrtl' and 'hwmltr' is skipped ; with the controlwords 'hlfwds'. ; 810722/1650: ; return form interupt module is changed so ; half word move is not called, new entry ; in set level module. ; level is noe in intrupt level register ; and not in wrk0. ; 810723/1230: ; error corrected: interupt bit in intreg cleared ; in set diable module. ; error corrected: answer interupt calls set disable ; for exit ; module for control of interupt of lower level. ; 810730/1100: ; only relewant for hc2901. ; generel wait with x modification after fetch of ; instruction is deleted from the fetch routines. ; the generel wait logic is skipped out with ; the control word gewax. ; 810730/1130: ; only in rh8000. ; clock before and after evry channel output ; opration. ; 810730/1200: ; the subroutine entry for init orf wrk ; registers is changed so it continues ; directly to generel wait. ; init of wrk registers is introduced ; as seperate code in the init 2901 ; sequence. ; 810803/1500: ; init from prom instead from local dma ; insertet in hc8000 text. ; 810805/1200: ; generel get instruction inserted ; to recieve level from external ; interupt devices. am9519. ; introduced as register 100, ; bu schould be changed to register ; 94. therefor the generel get instruction ; with effective address 94 schould only ; be allowed in monitor mode. ; 810807/1406: ; disarming of charakter interupt controler ; after interupt and arm after generel get 94. ; ; 810810/1749: ; no prefetch module changed so the subroutine ; call of ge03w0 is removed. this can be done ; in the rh2901 because the 2903 never sends ; a uneven instruction address. ; 810810/1750: ; all iccn bus logic and definition is now removed. ; the definition and the version up to this date ; can be found in the file 'ticcnbus'. ;NEXT ;-------------------------------------------------------- ; ------------------------------------------------------ ; project to be made in the future. ; ; 001: thre entry jump table schould be removed, ; and the hc2903 schould jump direcly to ; funtions mudoules wanted. ; before doing this subroutines and things ; which differ in length schoul be moved to ; the back of the program, so the rh and the hc ; version get the same entry addrress if possible. ; if that is not possible it dosent matter. ; ; 002: if it is decided to keep the entry jump table ; then some call of cl2903 schoud be moved up ; to the table. ; ; 003: it schould be tried to ballance the time ; from call of a memory acces to the acces ; is finished, so their is as little waste time ; as possible. ; ; 004: change of the interupt signal from the ; timer so it comes in as a seperate ; condition from the charakter device interupt. ;PROJECT: ;------------------------------------------------------ ; ----------------------------------------- ; the status regsister in hc2901 and rh2901 ; declared as status(0:23). ; status(23) = interupt set. ; status(22) = 1 indicating that the simulated message ; 'fifo' is full, can be refferenced by the standard ; initialisation of the q register ( value 2). ; status(21) = 1 test after fetch and prefetch ( not in final ; version ). ; status(20:6) interupt register. ; status(20) the first interupt bit can be ; refferenceded by the standard value initialisation ; of the wrk2 register ( value 8 ), ; the first bit is in fact interupt 3, ; and correspond to interupt level 3. ; status(0) ; status(1) ; status(2) ; helping logical table. ; after the operation ; sub(op1,op2) op1 - op2 ; ; cjmp(neg,l) . op1 < op2 ; cjmp(neg,l) not. op1 >= op2 ; cjmp(zero,l) . op1=op2 ; cjmp(zero,l) not. op1 <> op2 *const: metimo,200 ; no. of micro instructions before ; memory timeout. *const: butimo,200 ; no of micro instructions before ; iccn bus time out. *const: sendto,4095 ; no of mic. instr. before sender ; on iccn bus has detected that ; reciever has send timeout. *const: intsta,6 ; least significant bit in status reg that ; contains the interupt bits. *const: rc80le,3 ; interupt from rc8000 level, ; same as timer interupt level. *const: timele,3 ; timer interupt level - (1+3). *const: chifil,4 ; channel input finis ; interupt level. ( 8) *skip: iccnx *const: icfile,4 ; iccn message fifo full - (1+3). *until: iccnx *const: chisil,5 ; channel input start ; interupt level (9). *const: chofil,6 ; channel output finis ; interupt level (10). *const: lodmle,7 ; local dma interupt level. *const: chdele,8 ; charakter device interupt level -(1+3). *const: intno,9 ; no of allowed interupt bits ; in the interupt register. *const: hlfwrd,11 ; halfword, ; no of bits - 1 in a half word. *const: hfwdm1,10 ; halfword - 1, ; no of bits - 2 in halfword. *const: octet,7 ; no of bits - 1 in a data octet. *const: dyreno,7 ; number of allowed dynamic registers ; to be transferred to hc2903 - 1. ; power on logic starts microprogram in address 0 e01ini/:jmp(init) ; program should start with a jump ; for hardware reasons ; also entry address of init from hc2903. *onlyin:rh8000 jmp(choint) ; address 1 ; channel out interupt. jmp(chiint) ; address 2 ; channel in interupt. cont ; address 3 ; not used. jmp(rc80in) ; address 4 ; interupt from rc8000. *until: rh8000 *onlyin:hc8000 ; local dma only in hc8000 jmp(dmain) ; entry micro program address 1. *until: hc8000 *skip: iccnx jmp(iccnma) ; entry micro program address 2. *origo: 4 jmp(iccnin) ; goto iccn bus interupt. ; entry jump table from hc2903. ; only in use until final version. ; if vect=true *until: iccnx *onlyin:hc8000 jmp(choint) ; address 2, ; channel out interupt. cont ; not used address 3. *origo: 4 jmp(chiint) ; address 4, ; channel in interupt. *until: hc8000 ; entry address in hc2901 from hc2903 e01dob/: ; data out function jump table base. e01dom/:jmp(dowrme) ; write data word direct to memory. *onlyin:hc8000 e01do0/:jmp(dontus) ; own dma start *until: hc8000 *onlyin:rh8000 e01do0/:jmp(douni0) ; data out on unibus control 0. *until: rh8000 *skip: iccnx e01do1/:jmp(doicst) ; iccn bus dma start. *until: iccnx e01do1/:jmp(dochst) ; channel output start *onlyin:hc8000 e01do2/:jmp(dontus) ; own dma reset. *until: hc8000 *onlyin:rh8000 e01do2/:jmp(douni1) ; unibus reset. *until: rh8000 *skip: iccnx e01do3/:jmp(doreic) ; iccn bus reset. *until: iccnx e01do3/:jmp(dochre) ; channel output reset. *onlyin:rh8000 e01do4/:jmp(dontus) ; not used. *until: rh8000 *onlyin:hc8000 e01do4/:jmp(dochde) ; write external char device. *until: hc8000 *skip: iccnx e01do5/:jmp(doiswc) ; iccn bus send message ; use iccn singele word communication. *until: iccnx e01do5/:jmp(dontus) ; data out not used. e01do6/:jmp(dontus) ; data out not used. e01do7/:jmp(dontus) ; data out not used. e01dib/: ; data in functon jump table base. e01dim/:jmp(direme) ; read data word direct form memory. e01di0/:jmp(dintus) ; data in not used. *skip: iccnx e01di1/:jmp(dintus) ; iccn bus fifo read. *until: iccnx e01di1/:jmp(dichst) ; channel input start. e01di2/:jmp(dintus) ; data in not used. *skip: iccnx e01di3/:jmp(direfi) ; iccn bus fifo reset. *until: iccnx e01di3/:jmp(dichre) ; channel input reset. *onlyin:hc8000 e01di4/:jmp(dichde) ; read external chararcter device. *until: hc8000 *onlyin:rh8000 *skip: iccnx e01di4/:jmp(doiswc) ; data in readuword from iccn bus, ; use single word communication. *until: iccnx e01di4/:jmp(dintus) ; data in not used. *until: rh8000 *until: iccnx e01di5/:jmp(dintus) ; data in not used. e01di6/:jmp(dintus) ; data in not used. *skip: iccnx e01di7/:jmp(diicoi) ; read own iccn bus identification. ; limit control *until: iccnx e01di7/:jmp(dontus) ; data out not used. e01inp/:jmp(npref0) ; get instr with no prefetch e01ip/: jmp(prftc0) ; get instr with prefetch e01gmw/:jmp(rem0) ; get data word from memory. e01pmw/:jmp(wrm0) ; put data word to memory. e01gdw/:jmp(drem0) ; get double data word from memory. e01pdw/:jmp(dwrm0) ; put double data word to memory. *onlyin:hc8000 ; real time clock is substituted with external interupt ; level. ;e01rtc/:jmp(gng100) . gg(100) get real time clock. e01rtc/:jmp(geng94) ; gg external interupt level. e01rtr/:jmp(geng64) ; gg test register with no wait. e01wtr/:jmp(genp64) ; gp test register. e01rtw/:jmp(geng66) ; gg test register with wait. *until: hc8000 *onlyin:rh8000 cont ; dummy entries for test register and cont ; real time clock. cont e01rtw/:jmp(geng66) ; wait start by rc8000, send ; interupt register to hc2903. *until: rh8000 e01drd/:jmp(sadyre) ; entry save dynamic registers. e01sel/:jmp(stenle) ; entry set enable level. e01sdl/:jmp(stdile) ; entry set disable level. e01drr/:jmp(redyre) ; entry reestablish dynamic registers. e01rin/:jmp(rtrnpr) ; entry return to next process. e01aci/:jmp(ansin) ; entry answer and clear interupt. e01is1/:jmp(intser) ; entry goto interupt service 1. e01skn/:jmp(sknin0) ; entry skip next instruction and fetch. ; init of wrk1, wrk2 and q reg before entr&ering ; generel wait loop. ; standard init of wrk registers is ; wrk0 = 0, but presently expected. ; wrk1 = 1. ; wrk2 = 8. ; q = 2. ; use of the working registers schold be ; done in the following order wrk0,wrk1,wrk2,q. gewwri: iniwrk: mzero(wrk0) ; wrk0 := 0. moinc(wrk1,wrk0) ; wrk1 := 1. moinc(q,wrk1) ; q := 2. move(wrk2,q) sl ; wrk2 := 4. move(wrk2,wrk2) sl ; wrk2 := 8. gewait: ; generel wait loop. ;=================== *onlyin:hc8000 cjmp(chioin,gewai1) not; if charakter interupt then goto ; gewwai1, this is done because ; the hc2903 cpu or the iccn bus ; otherwise could delay the timer ; interupt. ( not used yet). *until: hc8000 cjvt(vect) and(wrk1,hc2903) noload noint opinde; ; hc2903 schould be addressed as source ; because this allowes the the clocking ; of the hc2903 data buffer into the ; vector prom, the hc2903 register no ; is equivalent with the register no ; of the internal register intreg so ; because intreg(0) tells if an ; interupt schold be send to the hc2903 ; the alu operation will result in ; zero if no interupt an not zero if ; interupt, this is used in fetch ; and in prefetch. *onlyin:rh8000 jmp(gewait) ; goto generel wait. *until: rh8000 *onlyin:hc8000 cjmp(chioin,gewait) ; if no interupt from char device then ; goto generel wait . ; if char device interupt then gewai1: moinc(wrk1,q) ; wrk1 := divice 1 + read bit. jsb(rechd0) ; call subroutine read char device ; special device 0 to 7. ; if sign bit set in the data word read cjmp(neg,timein) ; then goto timer interupt. ; disArment of first interupt controler. mzero(wrk1) ; wrk1 := 0. move(wrk0,q) ; wrk0 := const(2). lcpu(3) ; for 0 to 3 do move(wrk1,wrk1) sraq ; wrk1.msb := q.lsb. move(wrk1,wrk1) sraq ; wrk1.msb := q.lsb. rep move(q,wrk0) ; q := const(2). ; end; moinc(wrk0,wrk2) sl ; wrk0 := const(9) shift 1, ; control device no of first ; interupt controler. or(wrk1,wrk0) ; wrk1 := dataword + device address. jsb(wrchde) ; call subtroutine write charakter ; device. lcpu('chdele) ; counter := cha device interupt level. modec(wrk1,q) ; wrk1 := 1. jmp(clcint) ; goto calculate interupt . *skip: gewaix ; skip general wait x entry. gewaix: move(wrk0,q) sl ; wrk0 := 4. and(status,wrk0) noload; if bit 4 is set in cjmp(zero,gewaxx) ; then goto gewaxx. geww1: jsb(waitst) ; wait for test register. move(wrk2,tstreg) ; if test register <> 0 then move(wrk2,wrk2) ; cjmp(zero,gewwri) not ; goto generel wait. andn(status,wrk0) ; clear bit 4 in status reg. jmp(gewwri) ; goto generel wait with init. gewaxx: ; program counter test. sub(ic,pctst) noload ; if current ic <> program counter cjmp(zero,gewwri) not ; test reg. then goto generel wait. or(status,wrk0) ; set bit 4 in status. jmp(geww1) ; goto wait for test reg. *until: hc8000 *until: gewaix ; skip of genarel wait with x entry. ; initialize. ; ----------- init: *onlyin:rh8000 mzero(clrf80) ; clear flag bit signal from ; rc8000. cont init03 ; reset hc2903 cont init03 cont init03 ; hc2903 now goes to init. *until: rh8000 mzero(intreg) ; init of wrk registers. ; interupt bit register := 0. moinc(wrk1,intreg) ; wrk1 := intreg+1 ( 1). moinc(q,wrk1) ; q := wrk1 + 1 ( 2). move(wrk2,q) sl ; wrk2 := q*2 ( 4). move(wrk2,wrk2) sl ; wrk2 := wrk2*2 ( 8). *onlyin:rh8000 jsb(cnrc81) ; call subroutine to wait for ; signal from rc8000 and check of ; control bits. *until: rh8000 *skip: newint *onlyin:hc8000 ; init of hc8000 from 512 k octet prom. ;*skip: intprm . skip init of hc8000 from prom ;. init of hc8000 from prom. ;. not used wrk2 = r1. ;. intreg = r7. ;. q. ;. destroyed: ;. wrk1 = r6. ;. prom word counter = r11. ;. memory storage address = r12. ;. data mask ( 255) = r8. ;. prom address counter = r9. ;. prom address address incrementer = r10. ;. memory data word = r14. ;. memory octet counter = r15. mzero(r9) ; reset prom address counter. mzero(q) ; reset q register. moinc(r10,r9) sl ; r10 := constant 2. moinc(wrk2,r9) sl ; wrk2 := 1 shift left 1 ( 2). add(wrk2,wrk2) sl ; wrk2 := wrk2 + wrk2 ) shift left 1, ; C(2). move(r12,wrk2) ; memory address := first memory address C(8). move(r11,wrk2) sl ; prom octet counter := wrk2 shift 1 C(16). lcpu(4) ; for 0 to 4 do rep move(r11,r11) sl ; proc octet counter := prom octet counter ; shift 1 C(512). sub(r11,r10) ; decrease prom octet counter with 2, ; C(510) used memory location. nxtwrd: move(r15,r10) ; octet in word counter := 2. nxtoct: dec(r11) ; decrement prom octet counter. cjmp(neg,intfin) ; i negative then goto init finis. move(wrk1,r9) ; wrk1 := prom octet address. move(extreg,wrk1) opdirz oprama readch trnbus sltiml; ; read prom at adress in mso snd ino of ; wrk1. lcpu(7) ; for 0 to 7 do rep move(wrk1,wrk1) slaq; ( q.mso := q.ino, q.ino := q.lso, ; q.lso := wrk1.mso) C(shift ; recived data octet into q reg.). add(r9,r10) ; increment prom address counter, ; by 2. dec(r15) ; decrement octet in word counter. cjmp(neg,nxtoct) not ; if not negative then ; nextoctet. move(meaddr,r12) ; send memory data address at memory add(r12,r10) ; calculate next memory address. ; C(C()+2). intw1: cjmp(rememo,intw1) not; wait for memory ready. move(medata,q) ; send data word to memory. intw2: cjmp(rememo,intw2) not; wait for memory write cycle ; finis. jmp(nxtwrd) ; goto next word. intfin: ; finis of init. mzero(q) ; reset q register. mzero(intreg) ; clear interupt register. *until: hc8000 *until: newint mzero(intlev) ; clear current interupt level. mzero(intlim) ; clear disable level and ; enable level. mzero(dichwc) ; clear data in channel word counter. mzero(dochwc) ; clear data out channel word counter. ; init of channel interupt. cont firech ; clock finis read channel. cont fiwrch ; ckock finis write channel. cont clchii ; clear channel input interupt. cont clchoi ; clear channel output interupt. ;*skip: oldint *onlyin:hc8000 ; program is loaded from dma. move(lmem,wrk2) ; local dma memory address := 8. move(lwco,wrk2) sl ; local dma word counter := 16 ( 8 words.) lcpu(5) ; rep move(lwco,lwco) sl; lwco := 1 (segm ) * 256 (words) ; * 2 halfwords (lwco = 512) init7: cjmp(reldma,init7) not; wait for signal from local dma. init6: jsb(ipldma) ; call subroutne input local dma. cjmp(zero,init7) not; if lat word in memeory counter ; then goto continue init. *onlyin:hc8000 ; only in test version. jsb(waitst) ; call subroutine wait for test register. *until: oldint. *onlyin:hc8000 ; reset of first interupt controler. moinc(wrk1,wrk2) sl ; wrk1 := 9 shift 1. jsb(wrchde) ; goto write charakter device. init5: move(meaddr,wrk2) ; send address of word 8 to memory. *until: hc8000 *onlyin:rh8000 init5: move(wrk0,wrk2) opexde sl; send addrs or word 8 to memory. ; and load 8 shift 1 (i.e.16 ) to wrk0. move(wrk0,wrk0) sl ; wrk0 := 32. move(c66,wrk0) sl ; generate contant 66 in local dma ; addrs register. c66 := 64. move(wrk2,c66) sl ; wrk2 := c66( 64) * 2, ; ( wrk2 is now 128 ; i.e. device 16*8). add(wrk2,wrk0) ; wrk2 := wrk2 + wrk0, ( i.e. ; wrk2 := 128 + 32 ( device 20 * 8)), ; now wrk2 points to the relative ; distance from device table 0 to ; device table 20. add(c66,q) ; c66 := c66 (64) + q (2). init3: cjmp(rememo,init3) not; wait for memory ready ; get word 8 from memory. add(wrk2,medata) ; wrk1 := word8 or memory ; ( device base) + wrk2 ; (device no 20 * 8)) move(meaddr,wrk2) ; move addrs of device table to memory. *until: rh8000 ; no 66 setting in hc8000. init2: cjmp(re2903,init2) not; nb: for sync of memory, ; wait for hc2903 ready. init4: cjmp(rememo,init4) not; wait for ready of memory. move(hc2903,medata) ; send memory data to hc2903. *skip: iccnx mzero(iccnch) ; clear iccn chain. *until: iccnx jmp(gewwri) cl2903 ; goto generel wait ; and clock hc2903. ;*page: XX tcgorder01 ; generel subroutine section ; -------------------------- ; subroutine get a word from hc2903 to wrk0. ; ========================================== ge03w0: cjmp(re2903,ge03w0) not; wait until ready. rtn move(wrk0,hc2903) ; move word from hc2903 to wrk0. ; subroutine get a word from hc2903 ; ================================== ; to wrk0 and memory address register, ; =================================== ; usualy called as : jmp(ge03a0) cl2903 ge03a0: cjmp(re2903,ge03a0) not; wait loop until hc2903 is ready. *onlyin:hc8000 rtn move(meaddr,hc2903) opramf; return from subroutine and ; move the word recieved from hc2903 ; to the memory address register ; and start ; memory read cycle, and open for ; internal registers so the address ; also is moved to wrk0, ( does ; only function because the value ; the value of reg.address = the value ; of reg.wrk0 mod 16). *until: hc8000 *onlyin:rh8000 move(wrk0,hc2903) ; get word form hc2903. andinv(wrk0,wrk1) ; clear possibly bit ( 23). rtn move(meaddr,wrk0) ; send addrs to memory. ; the trick with word 66 is only ; performed in rh8000. ; subroutine get a word from hc2903 ; ================================= ; to wrk0 and control that if the word is ; equal to 66 then send 132 to memory address ; else send thw word to memory address register. ge03a6: cjmp(re2903,ge03a6) not; wait loop until hc2903 ready. move(wrk0,hc2903) ; get address to wrk0. andinv(wrk0,wrk1) ; clear bit(23) in address. ge03ad: sub(wrk0,c66) noload ; entry for read double word: ; if address of data word = 66 then crtn(zero) move(meaddr,wrk0) not; return and send address to ; memory , and clock memory read cycle. ge03aw: cjmp(rememo,ge03aw) not; else wait for memory. rtn add(wrk0,c66) noload opexde; send 132 to memory addrs register ; and start memory read cycle. *until: rh8000 ; *skip: iccn ; subroutine get word from memory ;-=============================== ; pointed out by wrk0, if not memory ready ; then goto timeout0. gemewo: move(meaddr,wrk0) ; send send address of memory word ; to memory, and clock memory ; read cycle. lcpu('metimo) ; load counter with timeout twb(rememo,iotmo0) ; while not memory ready do ; if memory ready then next mic. instr. ; else if counter = 0 then goto iotmot. ; decrease(counter) ; od. rtn add(wrk0,q) ; increase wrk0 to point to next mic. instr ; and return from subroutine. ;*until: iccn ; in rh 8000 in address 132. ; subroutine put data from wrk1 to memory addressed by wrk0. ; ========================================================== *onlyin:hc8000 puw1w0: move(meaddr,wrk0) ; send address to memory. cont ; sync of memory. puwww0: cjmp(rememo,puwww0) not; wait for memory. *until: hc8000 *onlyin:rh8000 puw1w0: ; *until: rh8000 move(medata,wrk1) ; send data word to memory. *onlyin:rh8000 move(meaddr,wrk0) ; send address to memory. *until: rh8000 *onlyin:hc8000 cont ; sync of memory. *until: hc8000 puwww1: cjmp(rememo,puwww1) not; wait for memory ready. rtn add(wrk0,q,wrk0) ; wrk0 := next memory address, ; return from subroutine. *until: iccn ; puw1w0 only used in iccn bus service. *skip: hlfwds ; subroutine halfword move left to rigth. ; ======================================= ; left half word of wrk0 is moved to rigth half word, ; and left half word is set to 0. ; entry call: ; q(23) = 0. hwmltr: lcpu('hlfwrd) ; load counter with length of half word. rep move(wrk0,wrk0) sr; wrk0 := wrk0 shift (-1), ; if counter = 0 then next mic. instr. ; else counter := counter -1 and ; repeat this micro instruction. rtn ; return from subroutine. ; subroutine halfword move rigth to left. ; ======================================= ; rigth half word of wrk0 is moved to left half word, ; and rigth half wrod is set to 0. ; entry call ; q(0) := 0. hwmrtl: lcpu('hlfwrd) ; load counter with length of half word. rep move(wrk0,wrk0) sl; wrk0 := wrk0 shift 1. ; if counter = 0 then next mic. instr. ; else counter := counter -1 and ; repeat this micro instr. rtn ; return from subroutine. *until: hlfwds ; subroutine divide wrk0 with 8 , 4 or 2. ;======================================== ; entry call: ; q(23) = 0. ; their is no reasonto use divide by 2, ; as a subroutine call. divw08: move(wrk0,wrk0) sr ; wrk0 := wrk0 / 2. divw04: move(wrk0,wrk0) sr ; wrk0 := wrk0 / 2. divw02: rtn move(wrk0,wrk0) sr; wrk0 := wrk0 / 2. ; end of generel subroutine section. ; ---------------------------------- ;*page: XX ; read memory section. ; -------------------- ; read data word from memory to hc2903. ; ------------------------------------ *onlyin:rh8000 rem0: jsb(ge03a6) cl2903 ; clock the hc2903, and call subroutine ; with control of address 66. *until: rh8000 *onlyin:hc8000 rem0: jsb(ge03a0) cl2903 ; clock the hc2903, and call subroutine ; to get address of data word to ; to memory and wrk0 (not used here). cont ; nb: sync of memory. *until: hc8000 rlt2: cjmp(rememo,rlt2) not ; wait until memory ready move(hc2903,medata) cl2903; move data from memory to hc2903. jmp(gewait) ; goto wait cyclus. ; read double word from memory to hc2903. ; --------------------------------------- *onlyin:rh8000 drem0/: jsb(ge03a6) cl2903 ; clock hc2903, and call subroutine *until: rh8000 ; to get address of data word with ; control of address 66. *onlyin:hc8000 drem0/: jsb(ge03a0) cl2903 ; clock hc2903, and call subroutine ; to get address of data word to memory ; and start memory read cycle. *until: hc8000 negadd(wrk0,q) ; wrk0 := address of second data word ; ( wrk0 - 2). drlt2: cjmp(rememo,drlt2) not; wait for first address fecth is ready. move(hc2903,medata) cl2903; hc2903 := memory'first data word, ; and clock hc2903. *onlyin:rh8000 jsb(ge03ad) ; call subroutine for control of ; address 66 and start memory read cycle. *until: rh8000 *onlyin:hc8000 move(meaddr,wrk0) ; memory'address := second word address. *until: hc8000 drlt4: cjmp(re2903,drlt4) not; wait forhc2903. drlt3: cjmp(rememo,drlt3) not; wait for memory address cycle. move(hc2903,medata) cl2903; hc2903 := memory'second data word, ; clock hc2903. jmp(gewait) ; clock hc2903, goto wait cycle. ; end of read memory section ; -------------------------- ; write memory section ; --------------------- ; write to memory from hc2903. ; ---------------------------- *onlyin:rh8000 wrm0: jsb(ge03w0) cl2903 ; clock hc2903, and call subroutine ; to get address into wrk0. *until: rh8000 *onlyin:hc8000 wrm0/: jsb(ge03a0) cl2903 ; clock hc2903, and call subroutine ; to get address of data word to ; memeory address register and ; to wrk0. *until: hc8000 *onlyin:hc8000 cont cl2903; clock ready for data word. *until: hc8000 *onlyin:rh8000 andinv(wrk0,wrk1) cl2903; clear bit(23) of address and ; clock hc2903 ready. *until: rh8000 wlt3: cjmp(re2903,wlt3) not ; wait for memory data word. *onlyin:hc8000 wlt2: cjmp(rememo,wlt2) not ; wait for memory ready *until: hc8000 move(medata,hc2903) cl2903; memory := hc2903.data, clock ready ; the hc2903. *onlyin:rh8000 move(meaddr,wrk0) ; memory address reg. := address ; of data word. *until: rh8000 *onlyin:hc8000 cont ; sync of memory *until: hc8000 wlt4: cjmp(rememo,wlt4) not ; wait for memory write cycle. jmp(gewait) ; goto wait cyclus. ; write double word to memory from hc2903. ; ---------------------------------------- *onlyin:rh8000 dwrm0/: jsb(ge03w0) cl2903 ; clock hc2903, and call subroutine ; to get address into wrk0. andinv(wrk0,wrk1) cl2903; clock ready for recieve first data ; word. *until: rh8000 *onlyin:hc8000 ; next instead of above dwrm0/: jsb(ge03a0) cl2903 ; clock hc2903, and call subroutine to get ; to get address of data word to ; memory address register and wrk0. negadd(wrk0,q) cl2903; wrk0 := wrk0 - 2, ( calc. of ; next memory addrs., clock hc2903 ready ; for recieve data word. *until: hc8000 dwlt3: cjmp(re2903,dwlt3) not; wait for ready hc2903. *onlyin:hc8000 dwlt5: cjmp(rememo,dwlt5) not; wait for memory ready. *until: hc8000 move(medata,hc2903) cl2903; memory := hc2903'data. ; clock hc2903 ready. *onlyin:rh8000 move(meaddr,wrk0) ; move address of data word to address re ; register and clock memory. negadd(wrk0,q) ; wrk0 := wrk0 - q, ( next address). *until: rh8000 *onlyin:hc8000 cont ; nessecary fo sync of ; memory. *until: hc8000 dwlt4: cjmp(rememo,dwlt4) not; wait for memory ready. *onlyin:hc8000 move(meaddr,wrk0) ; memory'address := calculated ; next address. *until: hc8000 jmp(wlt3) ; goto last of write single word ; to memory for continuation. ; end of write memory section. ; ---------------------------- ;*page: XX ; fetch instruction section. ; -------------------------- ; after one of the fetch entries ; contains pir ( prefetched instruction) ; the next instrcution and ic the address of the next ; after pir. ; fetch instruction with no prefetch. ; ----------------------------------- ; subroutine send interupt to hc2903. ; ----------------------------------- sndint: rtn intr03 ; return and set interupt bit to ; hc2903. npref0/:and(wrk1,intreg) noload; temporary test entry. nprftc/:cjsb(zero,sndint) not cl2903 ; normal no prefetch entry: ; if intreg(23) = 1 ; (i.e. interupt bit set ; then call subroutine send interupt, ; clock hc2903 ready to accept data. npref1: cjmp(re2903,npref1) not ; wait for ic from hc2903. move(meaddr,hc2903) opramf ; move the address to memory and start ; memory addres cycle, and open for ; internal registers so the address ; also is moved to ; to work 0. (does only function because ; the value off reg.addrs = the value ; of reg.wrk0 mod 16 ). sknin1: move(ic,q) ; entry from skip next, ; sync. of memory, ic := 2 . ; ( prepered for calculation of ; next next instr in prefetch logic.) npref2: cjmp(rememo,npref2) not; wait for memory address cycle. move(hc2903,medata) cl2903; move memory data word to hc2903, ; and clock hc2903. add(wrk0,q) opexde ; wrk0 := wrk0 + 2, wrk0 is now ; pointing to next instruction, ; open also to extern registers ; which will cause a move of ; wrk0 to memory address register ; and start memory read cycle. add(ic,wrk0) ; calculate address of next instr. npref3: cjmp(rememo,npref3) not; wait for memory ready. move(pir,medata) ; move prefetched instruction to ; prefetch register from memory. jmp(gewait) ; goto wait cycle. ; skip next instrcution. ; entry for skip instructions. ; ============================ sknin0/:and(wrk1,intreg) noload; temporary test entry: sknins/:cjsb(zero,sndint) not ; if bit(23) intreg = 1 then goto ; send interupt to hc2903. move(wrk0,ic) opexde ; move address of next instr to wrk0, ; open also ; the external registers which will ; cause a move of wrk0 to the memory ; address register and start a read ; cycle. jmp(sknin1) ; continue in fetch next instruction ; with no prefetch. ; get prefetched instruction. ; ---------------------------- prftc0/:and(wrk1,intreg) noload; temporary test entry: prftch/:cjsb(zero,sndint) not ; normal entry for prefetch next ; instruction: ; if intreg(23)<>0 (i.e. ; interupt set) then call subroutine ; send interupt. move(hc2903,pir) cl2903; move prefetched instruction ; to hc2903, and clock hc2903. move(lwco,pir) move(meaddr,ic) ; move address of next prefetched ; instruction ; to memory. add(ic,q) ; calculate address of next instruction ; to be prefetched. prftc1: cjmp(rememo,prftc1) not; wait for memory address cycle. move(pir,medata) ; move prefetched instruction from memory ; to prefetch register. jmp(gewait) ; goto wait cycle. ; end fetch instruction section ; ----------------------------- ;test subroutine ;pud132: move(c66,c66) sl ; move(meaddr,c66) ; move(c66,c66) sr ;pud133: cjmp(rememo,pud133) not ; rtn *onlyin:rh8000 ; special functions in rh8000 ; ---------------------------- ; subroutine control address from rc8000 ; -------------------------------------- cnrc81: cjmp(re8000,cnrc81) not; wait for addressing from rc8000. cnrc80: move(wrk0,rc80cn) ; get control bits into wrk0. mzero(clrf80) ; clear flag bit indicating ; word send from rc8000. move(wrk2,wrk2) sr ; wrk2 := 4. and(wrk0,wrk2) noload ; if control bits '1x' then cjmp(zero,cnrc82) not ; goto control ( '11' or '10'). and(q,wrk0) noload ; if control bits is '01' then cjmp(zero,init) not ; then goto init rtn move(wrk2,wrk2) sl; else wrk2 := 8 , start. cnrc82: move(wrk2,wrk2) sl ; wrk2 := 8. and(q,wrk0) noload ; if control bits '10' then cjmp(zero,cnrc81) ; goto stop else rtn ; not used ( work as start). *until: rh8000 *notin: rh8000 ; write data in testregister. Startaddress by hardware. ; ----------------------------------------------------- genp64: jsb(ge03w0) cl2903 ; call subroutine to get word to wrk0, ; and clock hc2903. move(tstreg,wrk0) cl2903; testregister:= wrk0 (hc290.data) jmp(gewait) ; goto generel wait. ; Wait manual test and read testreg. geng66: jsb(waitst) ; call subroutine wait test register. geng64: ; entry generel get with no wait. lab5: move(hc2903,tstreg) cl2903; move test register to hc2903, ; clock hc2903 ready. jmp(gewait) ; goto generel wait. ; subroutine wait manuel signal from test register. ; ------------------------------------------------- waitst: cjmp(tstrdy,waitst) not; wait for test register in read mode. waits1: cjmp(tstrdy,waits1) ; wait for test register in write mode. rtn ; return from subroutine. ; get real time clock, genereal get 100. ;--------------------------------------- ; real time clock is not fixed yet. 800505 ; real time clock is there for used for different test ; purposes. gng100: move(hc2903,intreg) cl2903; move contents of real time clock jmp(gewait) ; to hc2901, goto generel wait. ; get interupt level from external interupt device. ; generel get 94. ; ------------------------------------------------- ; 810805: temp. instead of gg 100. ; when an internal interupt is detected the ; true level can be optaind with gg 94. ; see: advanced micro device 9519 for ; detailed and complete description. geng94: ; arm fisrt interupt controler. ; cretae data word for arming. move(wrk0,q) ; wrk0 := const(2). move(q,wrk1) ; q := const(1). lcpu(3) ; for 0 to 3 do begin move(wrk1,wrk1) sraq ; wrk1.msb := q.lsb. move(wrk1,wrk1) sraq ; wrk1.msb := q.lsb. rep move(q,wrk0) ; q := cost(2). ; end; moinc(wrk0,wrk2) sl ; wrk0 := const(9) shift 1, ; device address of first ; interupt controler. or(wrk1,wrk0) ; wrk1 := data word + device address. jsb(wrchde) modec(wrk1,q) ; wrk1 := const(1). jsb(gng941) ; push next mic. address into ; stack. gng941: move(extreg,wrk1) clkint ; send writebit (lsb=0) to ; external device bus and send clock ; interupt acknowlege. loop(wainle) move(extreg,wrk1) clkint; wait for level to apear on ; external device bus. ( amd9519.pause ; to go high). move(extreg,wrk1) oprama opdirz clkint trnbus readch; ; read level from external device bus. ; into mso of wrk1. mzero(q) ; clear q register. lcpu(7) ; for 0 to 7 do rep move(wrk1,wrk1) slaq; q.lsb := wrk1.msb. move(hc2903,q) cl2903 ; send data word to hc2903. jmp(gewwri) ; goto generel wait. *until: rh8000 ; ;*page: XX *onlyin:rh8000 ; generel get 66 ; -------------- ; wait for start by rc8000, send intreg to hc2903. geng66: jsb(cnrc81) ; call subroutine wait signal from ; rc8000 and check control bits. ; bits from rc8000. move(hc2903,medata) cl2903; send word from data bus to ; hc2903 and clock ready. jmp(gewait) ; goto generel wait. *until: rh8000 ; set interupt bit in interupt register. ; ------------------------------------ ; call : ; wrk1 = std init 1. ; wrk2 = std init 2. ; q = std init 2. ; wrk2 values init. no interupt indication. ; 1 3 system table interupt, ; and signal auto load. ; 2 4 ; 4 5 ; 8 6 ; 16 7 timer interupt. ; 32 8 iccn bus interupt. ; 64 9 local dma interupt, or in rh8000 interupt ; from rc8000. ; 128 10 iccn message interupt. ; 256 11 ; 512 12 char device bus interupt. *skip: iccnx inicme: ; message from iccn bus. inldma: ; interupt from local dma, only in ; hc8000. inicff: ; interupt iccn fifo full. *until: iccnx *onlyin:hc8000 timein: ; timer interupt. add(wrk1,q,wrk1) ; wrk1 := 2 shift 1 + 1. jsb(rechd0) ; call subroutine read char device no 0 ; to 7. modec(wrk1,q) ; wrk1 := 1. ldct(timele) ; load counter with timer interupt ; level. *until: hc8000 *onlyin:rh8000 rc80in: ; interupt from rc8000 ; the interupt is clocked direct into address location 4. jsb(cnrc80) ; call subroutine to check control ; bit from rc8000. ldct(rc80le) ; load counter with interupt level ; from rc8000. *until: rh8000 clcint: jsb(clcin1) ; push address of next micro instr. clcin1: move(wrk2,wrk2) sl ; wrk2 := wrk2 * 2, ( interupt bit). rep inc(wrk1) ; wrk1 := wrk1 + 1 ( interupt no ). inauto: ; interupt entry auto load. enin03: ; entry for interupt bit 0, interupt 3, ; or entry with initialised interupt ; values in wrk1 (interupt no) and ; wrk2 ( the interupt bit in the ; interupt register). add(wrk1,q) ; wrk1 := wrk1 + q ( the first inetrupt ; no is infact level 3). ; entry intrs1: ; entry when wrk2 and wrk1 is defined. intrs1: or(intreg,wrk2) ; set interupt bit in interupt register. sub(wrk1,intlev) noload; if interupt no > current interupt cjmp(neg,gewwri) not ; level then goto generel wait. intsr2: move(intlev,wrk1) ; interupt level := interupt no as ; new level. modec(wrk0,q) ; wrk0 := 1 ( bit 23). or(intreg,wrk0) ; intreg(23) := 1 ( interupt schold ; be send to hc2903). jmp(gewwri) ; goto general wait. *onlyin:rh8000 ; interupt service ; ================ ; entry from monitor call and exeptions. intser/: jmp(intse4) cl2903 ; goto intse4, clock hc2903 ready ; to recieve information register. *until: rh8000 ; answer interupt cause and clear interupt bit ;============================================= ; in interupt register, continue in interupt ; service. ; interupt cause is current level. ; call: ; wrk0,wrk1,kwr2,q = std. reg. init. ansin/: move(hc2903,intlev) cl2903; send level to hc2903, and clock ; hc2903 ready to recieve data. negadd(intlev,q) ; justifi intlev because the dec(intlev) ; first interupt bit corrospond ; with intlev 3. ansin3: andinv(intreg,wrk2) ; clear interupt bit. move(wrk2,wrk2) sl ; wrk2 := wrk2 * 2 (next interupt bit). dec(intlev) ; intlev := intlev - 1. cjmp(neg,ansin3) not ; if interupt level > 0 then got ansin3. *onlyin:hc8000 jsb(ge03a0) ; call subroutine to get address ; of status and interupt limit ; initialisation and start memory ; ready cycle. jmp(intse4) ; continue in interupt service 4. ; interupt service. ;================== intser/:jsb(ge03a0) cl2903 ; call subroutine to get address to wrk0 ; and memory address register and start ; memory read cycle, ( wrk0 := inf ) intse4: move(wrk2,wrk0) ; wrk2 := wrk0 ( inf ). ; this mic. instr is nessecary for memory ; syncronitation. andinv(intreg,wrk1) ; clear possible interupt bit in ; interupt register. *until: hc8000 *onlyin:rh8000 intse4: andinv(intreg,wrk1) ; clear possible interupt bit ; in interupt register. cjmp(re2903,intse4) not; wait for hc2903 ready. move(wrk2,hc2903) ; get address of status and interupt ; limit initialisation. move(intlev,wrk2) ; remove possible last bit andinv(intlev,wrk1) ; in address. move(meaddr,intlev) ; send address to memory and ; start read cycle. *until: rh8000 moinv(wrk0,wrk1) sr ; start make bit in last halfword. ; wrk0 := -1 ( all bits) shift -1. lcpu(hfwdm1) ; load counter with no of bits in ; a halfword minus 1 ( first shift ; made when negating wrk1 into wrk0). rep move(wrk0,wrk0) sr; repeat until counter = 0 do ; wrk0 := wrk0 shift -1. ; counter := counter -1. ; end. intse1: cjmp(rememo,intse1) not; wait for memory ready cycle. move(hc2903,medata) cl2903; send status/intlim to ; hc2903 data register ; and clock hc2903. move(intlim,medata) ; intlim := status/intlim. *onlyin:hc8000 add(meaddr,q,wrk2) ; send wrk2 + 2 (inf + 2) ; to memory address ; and start memory read cycle. *until: hc8000 *onlyin:rh8000 add(meaddr,q,intlev) ; send inf+2 to memory address ; register and start read cycle. *until: rh8000 and(intlim,wrk0) ; intlev := intlev(12:23), ; only last 12 bits contain ; interupt limit. move(intlev,intlim) ; interupt level := interupt limit. negadd(wrk2,q) ; nessecary for sunc of memory, ; wrk2 (inf) := wrk2 - 2. dec(wrk2) ; wrk2 := wrk2 -1. ; ( totaly inf := inf - 3). *onlyin:rh8000 andinv(wrk2,wrk1) ; clear bit(23) in address. *until: rh8000 intsw2: cjmp(re2903,intsw2) not; wait for hc2903. intse2: cjmp(rememo,intse2) not; wait for memory ready. move(hc2903,medata) cl2903; send reg. dump. addr to hc2903, ; and clock hc2903 ready move(wrk1,medata) ; wrk1 := reg. dump. addrs. jsb(dmp8w) ; call subroutine to dump 8 words from ; hc2903 to memory, first word addresed by ; by wrk1. move(meaddr,wrk2) ; sedn addres of new ic to memory. intsw3: cjmp(re2903,intsw3) not; wait for hc2903 ready. ; ness. sync. of mem. intse3: cjmp(rememo,intse3) not; wait for memory ready. move(hc2903,medata) cl2903; send new ic to hc2903, ; and clock hc2903 ready. jmp(stdil3) ; continue in set diable level ; entry 3, for control of ; possible interupts with ; lover level. ; set current interupt level. ; ----------------------------- ; entry select interupt enable level. ; disable level and enable level is in intlim register. ; current level is intlev register. ; entry call: ; wrk1 := 1. ; q := 2. stenle/:moinv(intlev,wrk1) sr cl2903; intlev := -1 (allbits) shift -1, ; clock hc2903 ready. lcpu('hfwdm1) ; load counter with no of ; bits in a halfword minus 1, and ; push next micro instr address. rep move(intlev,intlev) sr; intlev := intlev(0:11), all bits ; in rigth halfword. and(intlev,intlim) ; interupt level := enable level. jmp(stdil1) ; goto set disable level entry 1. stdile/:move(intlev,intlim) sr cl2903; intlev := interupt limit, ; clock hc2903 ready. lcpu('hfwdm1) ; load counter with no of bits ; in half word and push next address. rep move(intlev,intlev) sr; interupt limit := interupt limit(0:11). ; ( disable level). stdil1: stdil2: ; entry from return from interupt. andinv(intreg,wrk1) ; clear possible interupt bit. stdil3: ; entry from answer interupt. move(wrk1,q) ; wrk1 := q (2). move(wrk2,wrk1) sl ; wrk2 := wrk1*2 (4). lcpu('intno) ; load counter with max no of interupt ; allowed. inc(wrk1) ; wrk1 := next interupt no. move(wrk2,wrk2) sl ; wrk2 := next interupt bit. and(intreg,wrk2) noload; if interupt bit is set then cjmpp(zero,intsr2) not; pop counter and goto intse2 ( entry ; in interupt routine. sub(wrk1,intlev) noload; if interupt no > new level then twb(neg,gewwri) not ; pop counter and continue in next ; micro instr, else invistigate ; next interupt bit while not all interupt ; is examinied. jmp(gewwri) ; goto generel wait. ; entry function restore 8 dynamic registers to hc2903. ; ----------------------------------------------------- redyre/:jsb(ge03w0) cl2903 ; get address of first dynamic register. ; into w0. jsb(lodyre) ; call subroutine load dynamic registers. jmp(gewait) ; goto generel wait. ; subroutine load 8 registers. ; ---------------------------- lodyre: ldct('dyreno) ; load counter with no of dynamic register ; entry load any number of registers, ; from hc2901 to hc2903. lonore: jsb(lonor1) ; push address of next micro instr. lonor1: move(meaddr,wrk0) ; send wrk0 to memory address regsiter and ; start memory read cycle. add(wrk0,q) ; memory address pointer := memory ; address pointer + 2. redyr1: cjmp(re2903,redyr1) not; wait until hc2903 is ready. redyr2: cjmp(rememo,redyr2) not; wait for memory ready. rep move(hc2903,medata) cl2903; move word from memory to hc2903, ; clock hc2903 ready, repeat loop. rtn ; return from subroutine. ; entry function return from interupt select next process registers. ; ------------------------------------------------------------------ rtrnpr/:jsb(ge03a0) cl2903 ; get address of system table ; register dump addressfrom hc2903 ; to memory and start read cycle. *onlyin:hc8000 cont ; sync of memory. *until: hc8000 rtnnp2: cjmp(rememo,rtnnp2) not; wait for memory ready. move(hc2903,medata) cl2903; send reg dump address to hc2903. move(wrk0,medata) ; get register dump address to wrk0. *onlyin:rh8000 andinv(wrk0,wrk1) ; clear bit(23) in address. *until: rh8000 jsb(lodyre) ; call subroutine load dynamic registers. rtnnp3: cjmp(re2903,rtnnp3) not; wait for hc2903 to recieve address ; of process definition registers. move(wrk0,hc2903) ; move address of register definition ; registers to wrk0. *onlyin:rh8000 andinv(wrk0,wrk1) ; clear bit(23) of address. *until: rh8000 ldct(3) ; load counter with number of process ; definition registers. jsb(lonore) ; call subroutine load nomber of ; registers. move(meaddr,wrk0) ; send wrk0 to memory address. moinv(intlev,wrk1) sr ; intlev := -1 ( all bits) shift -1. lcpu('hfwdm1) ; load counter with no of bits in ; a halfword minus 1, and push ; next address. rep move(intlev,intlev) sr; intlev := intlev(0:11) ; all last 12 bit set. rtnnp4: cjmp(rememo,rtnnp4) not; wait for memory ready. move(intlim,medata) ; load interupt limit. ; set enable level. and(intlev,intlim) ; intlev := intlim(12:23). ; last halfword of interupt limit. jmp(stdil1) ; goto set diable level entry 1. ; entry functionsave 8 dynamic registers. ; --------------------------------------- sadyre/:jsb(ge03w0) cl2903 ; get address whereto the registers ; is to be written. move(wrk1,wrk0) cl2903; wrk1 := wrk0, clock hc2903 to continue. jsb(dmp8w) ; call subruotine to dump 8 words ; from hc2903 . jmp(gewwri) ; goto generel wait with init. ; subroutine dump 8 words from hc2903 to memory. ; entry wrk1 := address. ; entry q := 2. dmp8w: lcpu('dyreno) ; load counter with number of ; registers to be saved, and clock hc2903 ; ready to accept 1. data word. ; repeat: *onlyin:hc8000 move(meaddr,wrk1) ; send address of data word to be ; dumped to memory address register ; and start memory write cycle. ; of dumped word to memory address ; and start memory write cycle. *until: hc8000 dmp8w1: cjmp(re2903,dmp8w1) not; wait until hc2903 ready to send data ; word. *onlyin:hc8000 dmp8w2: cjmp(rememo,dmp8w2) not; wait for memory write cycle. *until: hc8000 move(medata,hc2903) cl2903; send data word from hc2903 to memory, ; and clock hc2903 ready to accept ; next data word. *onlyin:rh8000 move(meaddr,wrk1) ; send address to memory ; address register and ; start memory write cycle. *until: rh8000 *onlyin:hc8000 cont ; sync. of memory. *until: hc8000 dmp8w3: cjmp(rememo,dmp8w3) not; wait for memory ready. rep add(wrk1,q) ; increase memory address pointer ; by to and repeat loop. rtn ; return from subroutine. ; data in and data out section. ; ----------------------------- ; time out and other exceptions to hc2903. ; ========================================= ; time out from data in and data out. ; ----------------------------------- iotmo0: cont cl2903 ; clock hc2903 for dummy address. iotmw0: cjmp(re2903,iotmw0) not; wait for hc2903 ready. iotmo1: cont cl2903 ; send dummy data word to hc2903. iotmw1: cjmp(re2903,iotmw1) not; wait for hc2903 ready. iotmo2: move(hc2903,q) cl2903; send status bit 2 ( time out ) ; to hc2903 jmp(gewwri) ; goto general wait. ; entry for not used data in and dataout instructions. dintus: ; data in functions not used. dontus: ; data out functions not used. ; bus comunication error in data in and data out. ; ----------------------------------------------- bucoe0: cont cl2903 ; clock hc2903 and wait. bucow0: cjmp(re2903,bucow0) not; wait for ready. bucoe1: cont cl2903 ; clock hc2903 for dummy data word. bucow1: cjmp(re2903,bucow1) not; wait for ready. bucoe2: cont cl2903 ; clock hc2903 for data word recieve. bucow2: cjmp(re2903,bucow2) not; wait for hc2903 to accept status word. bucoer: move(hc2903,wrk1) cl2903; send a one or what ever the ; contents of wrk1 is as status word ; to hc2903 and clock ; the hc2903 ( the bus communication ; error bit). jmp(gewwri) ; goto general wait with init. ; normal answer from data in and data out. ; ---------------------------------------- noran0: cont cl2903 ; clock hc2901 for dummy addrs. noraw0: cjmp(re2903,noraw0) not; wait for hc2903 ready to send addrs. noran1: cont cl2903 ; clock hc2903 , for dummy ; address word. noraw1: cjmp(re2903,noraw1) not; wait for hc2903to send data. noran2: cont cl2903 ; return data word to hc2901 and wait. noraw2: cjmp(re2903,noraw2) not; wait for hc2901 to accept data word ; and be ready to accept status bits. norans: mzero(hc2903) cl2903 ; send a zero to hc2903 indicating ; that no exceptions bit are set. jmp(gewwri) ; goto generel wait with init. ; subroutine wait for hc2903. wa0300: cjmp(re2903,wa0300) not; wait for hc2903 cont cl2903 ; clock hc2903 wa0301: cjmp(re2903,wa0301) not; wait for hc2903 rtn ; return form subroutine. ; subroutine get device block address. ; ------------------------------------ ; call w0 = divice no*8. ; wrk2 = 8. gedvbl: move(meaddr,wrk2) ; start memeory read cycle in word 8. gedvb1: cjmp(rememo,gedvb1) not; wait for memory ready. move(wrk1,medata) ; get device base. add(wrk0,wrk1) ; wrk0 := wrk0 ( device no * 8) + ; device address base. rtn modec(wrk1,q) ; wrk1 := 1, return . *skip: iccnx ; subroutine get own iccn identification into wrk1. ;-------------------------------------------------- geicid: *onlyin:hc8000 move(wrk1,iccnid) ; the iccn id is in the 12 most significant ; bit in the iccn register, the least ; significant bit is undefined. lcpu('hlfwrd) ; load counter with half word. rep move(wrk1,wrk1) sr; wrk1 := wrk1 shift (-12). rtn ; return from subroutine. *until: hc8000 *onlyin:rh8000 rtn mzero(wrk1) ; own iccn id is zero in rh8000 *until: rh8000 *until: iccnx *onlyin:hc8000 ; subroutine write character device, no 0 to 7. ; ================================== ; wrk1 = data octet shift 16 + device address shift 1 + 0. ; wrchd0: cjmp(chiosy,wrchd0) not; wait for char io clock tom go ; low. wrchd7: cjmp(chiosy,wrchd7) ; wait for char io clock to go ; high. (now it is syncroniced ; with the data bus clock pulse). sync ; wait for syncr. move(extreg,wrk1) writch sltiml; sync move(extreg,wrk1) clexde writch sltiml; send data and address to move(extreg,wrk1) clexde writch sltiml; char io bus register and move(extreg,wrk1) clexde writch sltiml; set clok external device signal move(extreg,wrk1) clexde writch sltiml; (valid memory address in ; motorola move(extreg,wrk1) clexde writch sltiml; ; terminology) 4 times, ; clear the rtn move(extreg,wrk1) writch sltiml; return after a addressing ; sending the addres out ; on the bus with out clocking ; the external device. ; read bit and return ; from subroutine. ; subroutine read character divice, for dev. no 0. to 7. ; ================================= ; wrk1 = data octet shift 16 + divice address shift 1 + 1. ; rechd0: cjmp(chiosy,rechd0) not; wait for char io clock to go low. rechd7: cjmp(chiosy,rechd7) ; wait for char io clock to go high. sync ; wait for syncronation. move(extreg,wrk1) opdirz oprama sltiml trnbus; sync. and start signal. move(extreg,wrk1) clexde opdirz oprama sltiml trnbus ; send divice and read bit to ; char io bus and clock the bus, ; open for direct and zero input to ; the alu, and open for wrk1 as des ; destination, four times. move(extreg,wrk1) clexde opdirz oprama sltiml trnbus; move(extreg,wrk1) clexde opdirz oprama sltiml trnbus; move(extreg,wrk1) clexde opdirz oprama sltiml trnbus; rtn move(extreg,wrk1) noload sltiml trnbus; ; return from subroutine. ; subroutine write character device. ; ================================== ; wrk1 = data octet shift 16 + device address shift 1 + 0. ; wrchde: cjmp(chiosy,wrchde) not; wait for char io clock tom go ; low. wrchd1: cjmp(chiosy,wrchd1) ; wait for char io clock to go ; high. (now it is syncroniced ; with the data bus clock pulse). sync ; wait for sync. move(extreg,wrk1) writch; sync. and start signal. move(extreg,wrk1) clexde writch; send data and address to move(extreg,wrk1) clexde writch; char io bus register and move(extreg,wrk1) clexde writch; set clok external device signal move(extreg,wrk1) clexde writch; (valid memory address in motorola move(extreg,wrk1) clexde writch; terminology) 4 times , clear the ; read bit . rtn move(extreg,wrk1) writch; sync addressing of external ; bus and return. ; subroutine read character divice. ; ================================= ; wrk1 = data octet shift 16 + divice address shift 1 + 1. ; rechde: cjmp(chiosy,rechde) not; wait for char io clock to go low. rechd1: cjmp(chiosy,rechd1) ; wait for char io clock to go high. sync ; wait for syncronation. move(extreg,wrk1) opdirz oprama readch trnbus; sync. and start ; signal. move(extreg,wrk1) clexde opdirz oprama readch trnbus ;send divice and read bit to ; char io bus and clock the bus, ; open for direct and zero input to ; the alu, and open for wrk1 as des ; destination, four times. move(extreg,wrk1) clexde opdirz oprama readch trnbus; move(extreg,wrk1) clexde opdirz oprama readch trnbus; move(extreg,wrk1) clexde opdirz oprama readch trnbus rtn move(extreg,wrk1) noload readch trnbus; ; retrun from subroutine. *until: hc8000 *skip: iccnx ; subroutine dump iccn block transport. ; ===================================== dmictn: add(wrk0,q,iccnch) ; wrk0 := address of current iccn block ; word counter. move(wrk1,icwoco) ; wrk1 := iccn word counter. jsb(puw1w0) ; write iccn word counter to ; tranport block. move(wrk1,icsla) ; dump iccn slave address. jsb(puw1w0) ; move(wrk1,icmas) ; dump iccn master address. jsb(puw1w0) ; rtn move(wrk0,iccnch) ; wrk0 := address of iccn transport ; block. ; subroutine load iccn block transport. ; ===================================== loictn: negadd(wrk0,q,wrk0) ; wrk0 := iccn block chain address. move(wrk1,iccnch) ; wrk1 := old chain. jsb(puw1w0) ; save chain address. move(iccnch,wrk0) ; chain := wrk0 ( new iccn block address). jsb(geicid) ; get own iccnid to wrk1. move(icdev,wrk1) ; icdev := own iccn id. jsb(gemewo) ; get memory word ( reciever iccn dev no.). move(wrk0,medata) ; wrk0 := iccn reciever dev no. jsb(hwmltr) ; call subroutine half word move. jsb(hwmrtl) ; call subroutine halword move. or(icdev,wrk0) ; ic dev := sender dev + reciever dev. add(wrk0,q,iccnch) ; reestablish wrk0. jsb(gemewo) ; get next memory word. move(icwoco,medata) ; get iccn word counter. jsb(gemewo) ; get next memory word. move(icsla,medata) ; get iccn slave address. jsb(gemewo) ; get next memory word. rtn move(icmas,medata); get iccn master address, ; return from subroutine. *until: iccnx *onlyin:rh8000 ; data out unibus reset and start. ; -------------------------------- douni1: ; data out on unibus reset command. jsb(ge03w0) cl2903 ; get address from hc2903. or(wrk0,q) ; set reset control bit an address. jmp(dounix) ; continus in data out unibus start. douni0: ; data out on unibus start command. ; --------------------------------- jsb(ge03w0) cl2903 ; get address from hc2903 into wrk0. dounix: move(wrk1,wrk1) sraq ; set sign bit in wrk1 by shifting move(wrk1,wrk1) sraq ; the contents of q register ( 2) ; into bit 23. or(wrk0,wrk1) ; set sign bit in address. move(wrk1,wrk1) slaq ; reestablish wrk1 and q. move(wrk1,wrk1) slaq ; jmp(dowmw3) cl2903 ; continue in data out ; write memory word. *until: rh8000 ; data out, write data word in own memory. ; ---------------------------------------------- *onlyin:hc8000 ; dowrme: jsb(ge03a0) cl2903 ; clock hc2903 and call subroutine to get ; get address of memory word. *until: hc8000 ; *onlyin:rh8000 ; dowrme: jsb(ge03w0) cl2903 ; get address of memory word to ; wrk0. *until: rh8000 cont cl2903 ; clock hc2903 to accept data word. dowmw3: cjmp(re2903,dowmw3) not; wait for hc2903 ready sen data word. *onlyin:hc8000 dowmw2: cjmp(rememo,dowmw2) not; wait for memory ready. *until: hc8000 move(medata,hc2903) ; move data word to memory data register. *onlyin:rh8000 move(meaddr,wrk0) ; move addrs of memory data word to ; memory address register and clock memory. *until: rh8000 lcpu('metimo) ; load counter and pusch next micro instr. ; into micro stack. twb(rememo,iotmo2) ; repeat ; if counter = 0 then goto iotmo1. ; micro counter := micro counter. ; until memory ready. jmp(noraw1) ; goto normal answer, ( wait for data ; ready). *skip: iccnx ; data out, start iccn block transport. ;-------------------------------------- ; from hc2903 entry e01do1. doicst/: move(iccnch,iccnch) ; if iccn chain address <> 0 then cjsb(zero,dmictn) not ; call dump current iccn transport. ; ( i.e. iccn bus allready in use for ; a block transport). jsb(ge03w0) cl2903 ; call subroutine to get iccn block ; transport, information block into wrk0. jsb(divw08) ; call subroutine to divide wrk0 ; by 8 to get rigth address. jsb(loictn) ; load iccn transport. ; (wrk0 = new addres block ). cont burqst ; send bus reguest signal to iccn logic. jmp(noraw0) ; go to normal answer with 1 dummy clear ; of hc2903. ( the unused data word.) *until: iccnx ; data in, read data word from memory. ; ---------------------------------------- direme: jsb(ge03a0) cl2903 ; clock hc2903, and call subroutine ; to get word from hc2903 to memory ; address register and clock memory. lcpu('metimo) ; load micro counter with ; 200 and push next micro instr to ; micro stack. twb(rememo,iotmo0) ; wait for memory ready 200 cycles. ; if not memory ready then goto iotmo0. jsb(wa0300) ; call subroutine to accept dummy ; data word and wait ready. move(hc2903,medata) cl2903; move data word to hc2903, and clock ; hc2903. jmp(noraw2) ; goto normal answer with 1 wait. *notin: rh8000 ; no external char device in rh8000. ; data out, write external character device. ; -------------------------------------------- ; entry gendo4. dochde: jsb(ge03w0) cl2903 ; clock hc2903, and call subroutine ; to device no into wrk0. ; if dev no < 8 ). jsb(divw08) ; call subroutine to divide wrk0 by 8 ; to get rigth address. move(wrk1,wrk0) sl ; wrk1 := wrk0 shift 1 ( bit 0 = 0 signifi ; write function ). negadd(wrk2,wrk0) ; wrk2 := dev no - 8. (result used to ; test which dev write routine to ; be used). jsb(ge03w0) cl2903 ; call subroutine to get data word into ; wrk0. lcpu('octet) ; load counter with length of data ; bute. rep move(wrk0,wrk0) sraq; q(0..8) := wrk0(16.23) ( shift data ; octet into q reg as the most significant ; octet). or(wrk1,q,wrk1) ; wrk1 := q ( data) or wrk1 ( device addrs ; addrs +device funtion). move(wrk2,wrk2) ; if wrk2 < 0 then goto cjmp(neg,dochd1) ; dochd1. jsb(wrchde) ; call subroutine write char. devices. ; dev no from 8 , 9 , 10 ...... jmp(noran2) ; goto send normal answer, with 1 wait. dochd1: jsb(wrchd0) ; call subroutine write char devices, ; dev. no from 0 to 7. jmp(noran2) ; goto normal answer, with 1 wait. ; data in, read external character device. ; ---------------------------------------- ; entry gendi4. dichde: jsb(ge03w0) cl2903 ; clock the hc2903, and call subroutine ; to get divice no into wrk0. jsb(divw08) ; call subroutine to divide address ; by 8 to get rigth device address. negadd(wrk2,wrk0) ; wrk2 := dev no - 8 ( used to ; find out which read routine to be ; used). move(wrk0,wrk0) sl ; wrk0 := device address shift 1. or(wrk1,wrk0) ; wrk1 := device address shift 1 + 1 ; (signifieng the read bit). move(wrk2,wrk2) ; if wrk2 < 0 then goto cjmp(neg,dichd1) ; dichd1. jsb(rechde) ; call subroutine read char device. dichd2: mzero(q) ; q reg := 0. lcpu('octet) ; load counter with octet length. rep move(wrk1,wrk1) slaq; q(16.23) := data octet. jsb(wa0300) ; call subroutine to accept dummy ; word. move(hc2903,q) cl2903 ; send data octet to hc2903, and ; clock hc2903 ready. jsb(noraw2) ; goto normal answer with 1 wait. dichd1: jsb(rechd0) ; call subroutine read char dev ; dev no 0 to 7. jmp(dichd2) ; goto send data word back to hc2903. *until: rh8000 *skip: iccnx ; data out, reset iccn blok transport. ; ------------------------------------ ; entry e01do3 from hc2903. doreic: mzero(icwoco) ; clear icword counter. jmp(noran0) ; go to normal answer entry 0 to ; hc2903 ( neither address or data word ; is used). ; data in, get fifo message ; the effektive address form hc2903 is used to ; address a double word wrere the message is stored. digefi/:move(wrk0,icbiba) ; get address of current fifo word. jsb(gemewo) ; move(wrk1,medata) ; negadd(wrk1,q,wrk1) ; update current fifo address. negadd(wrk1,q,wrk1) ; move(wrk0,icbiba) ; dump updated fifo address. jsb(puw1w0) ; move(wrk0,wrk1) ; wrk0 := address of current fifo message. jsb(gemewo) ; get fifo message divice part. move(wrk1,medata) ; jsb(gemewo) ; get fifo message message part. move(wrk1,medata) ; jsb(ge03w0) cl2903 ; get address of messsge dump from hc2903. jsb(puw1w0) ; put memory word. jsb(wa0300) ; call subroutine to wait dummy data word. move(hc2903,wrk1) cl2903; send iccn device no to hc2903 and clock ; data ready. move(wrk1,wrk2) ; wrk1 := fifo message divice address part. negadd(wrk0,q,wrk0) ; wrk0 := q - 4. negadd(wrk0,q,wrk0) ; jsb(puw1w0) ; dump fifo message dev address field. jmp(noraw2) ; goto normal answer with 1 wait. ; data in, reset fifo. ; --------------------- ; entry e01di3 from hc2903. direfi: jsb(ge03w0) cl2903 ; get address of simulated fifo from ; hc2903. move(icbiba,wrk0) ; moinc(wrk0,wrk1) ; wrk0 := 2. andn(status,wrk0) ; clear status(22) , indicating fifo full. jmp(noraw0) ; goto normal answer. *skip: rh8000 ; interupt level set. ; =================== intlev: cont cl2903 ; clock hc2903. intle1: cjmp(re2903,intle1) not; wait for hc2903. move(wrk1,hc2903) ; jsb(wrin0) jsb(dochw1) ; jmp(gewait) ; *until rh8000 ; ; answer address of iccn bus interupt. ; ------------------------------------- iccnin: move(wrk0,iccn) ; wrk0 := sender reciever address word. ; (reciever shift 12 + sender) recvst ; set iccn bus logic in reciever control ; status. iccni1: lcpu('butimo) ; mic. sekvence conter := iccn bus timeout ; push address af next micro instr. twb(icsic,iccni1) ; no timeout in test version. ; next deleted in test version ; twb(icsic,iccnit) . wait iccn sender in control ; or if not recevied in butimo ; micro instr. then goto iccnit ( time out) move(wrk2,iccn) ; if data word from iccn bus < 0 then cjmp(neg,iccnrm) ; goto iccnrm ( recieve message) ; (data word is a message) else move(meaddr,iccn) ; send data word to memory address register ; and start memory read cycle. lcpu('metimo) ; load counter with no of micro ; instruction before timeout. twb(rememo,iccnit) ; if memory not ready in 'metimo ; micro instr. then goto timeout ; after iccn bus interupt. move(iccn,medata) ; send word read from memory ; out on the iccn bus. recvcl ; clear iccn bus reciever contol logic. jmp(gewwri) ; goto generel wait with init. iccnit: lcpu('sendto) ; load counter with number of ; instructions before it is sure ; taht the iccn bus sender has ; found out that there is timeout. twb(icsic,iccntt) ; wait for sender to clear sender control ; to signal that time out is detected ; if not recieved in 'sendto instr, ; then continue uncunditionaly. iccntt: cont recvcl ; clear reciever control to indicate ; end of timeout on iccn bus. jmp(gewwri) ; goto generel wait with init. ; recive message from iccn bus. ; ------------------------------ ; wrk0 = sender + reciever identificatin. ; wrk1(0) = 1 ( the sign bit) indicates that that the word ; recievved through ; iccn bus is a message. ; if wrk1(23) is set then it is a interupt message. iccnrm: ; message recieved from iccn bus ; to simulated fifo, or interupt message. ; interupt message is treated on a special ; way in the rh8000. *onlyin:hc8000 and(wrk2,wrk1) noload ; if last bit is set in message then ; the message is interpreted as a ; interupt signal, so goto iccn interupt, cjmp(zero,iccnim) ; goto iccn interupt message. *until: hc8000 and(q,status) noload ; if status (22) = 1 then ; (i.e. fifo is full) cjmp(zero,iccnit) not ; goto answer timeout. cont recvcl; if not fifo full send signal ok to sender. ; by clearing recive control logic. move(wrk1,wrk0) ; wrk1 := sender dev. + reciever dev. move(wrk0,icbiba) ; wr0 := iccn bus information block. jsb(gemewo) ; get memory word. move(wrk0,medata) ; get address of next free in fifo. jsb(puw1w0) ; put sender dev and reciever dev into fif ; fifo. move(wrk1,wrk2) ; wrk1 := message word. jsb(puw1w0) ; put message word into fiffo. move(wrk1,wrk0) ; wrk0 := next address in fifo. move(wrk0,icbiba) ; wrk0 := address of next infifo. jsb(puw1w0) ; write new next in fifo to memory. jsb(gemewo) ; get max fifo adddress. move(wrk0,medata) ; sub(wrk1,wrk0) noload ; if last in fifo is greate in fifo level cjmp(neg,inicme) not ; if posetive then goto set interupt ; iccn message. ; interupt no 10. and(status,q,status) ; status(22) := 1. (i.e. fifo full) ldct('icfile) ; load counter with iccn fifo full ; interupt level. jmp(clcint) ; goto calculate interupt no. ; innc interupt message is recieved. iccnim: cont recvcl ; clear recieve iccn logic. *onlyin:rh8000 ; autoload message to hc8000 is not allowed ; autoload is given from rc8000. jmp(iccnit) ; goto iccn time out. *until: rh8000 ; *onlyin:hc8000 ; only auto load through iccn bus ; in hc8000 not in rh8000. jmp(inauto) ; goto set interupt autoload ( answer 2) *until: hc8000 ; ; (last befor close interupt) ; subroutine read from iccn bus or ; send message word through iccn bus. ; call wrk1 = reciver dev. shift 12 + sender device. ; wrk0 = address to be read from reciever. ; return wrk0 = data word readif not iccn bus time out ; else unchanged. ; wrk1 = 0 => transport ok. ; wrk1 = 1 => iccn bus communication error, ; ( i e time out and no answer or ; just no answer ) ; wrk1 = 2 => transport time out, ; ( i.e. reciever message buffer full, ; or reciever illegal address). iccnre: cont slctst ; set device select logic. move(iccn,wrk1) ; send reciever dev and sender dev. mzero(wrk1) slctcl ; clear device select logic, ; and set wrk2 to normal answer. iccnr1: lcpu('butimo) ; load conter with iccn bus read ; time out length. ; next is cleared in testversion twb(icric,iccnr1) ; no time out in test wersion ; twb(icric,icrece) . wait iccn bus reciever in control ; otherwise goto iccn read ; communication error. move(iccn,wrk0) ; send address of data word to ; iccn bus. cont sendst ; set iccn bus send logic. iccnr2: lcpu('butimo) ; load counter with iccn bus read ; time out length. twb(icric,iccnr2) not ; no time out in testversion ; next cleared in test version ; twb(icric,icreto) not . wait iccn bus reciever out of control ; otherwise goto iccn read timeout. cont sendcl; clear iccn bus send logic, ; which also turns direction on the bus. move(wrk0,iccn) ; get data word from iccn bus. rtn burels; return and release bus master request. ; and clear wrk1 indicating that ; bus transport ended ; without timeout. ; iccn bus read or send message timeout. icreto: cont sendcl ; clear send iccn logic, which also ; signal to sender that timeout is ; detected. lcpu('butimo) ; load bus timeout. twb(icric,icrece) not ; if reciever is not clered in ; 'butimo instructions then goto ; set iccn bus read comunication errror. rtn move(wrk1,q) burels; else send timeout and return. icrece: rtn mzero(wrk1) burels; set wrk1 to transport ok. ; and release from master on iccn bus ; and return from subroutine. ; entry ask for bus request. ; -------------------------- asbur0: cont burqst ; ask for a bus request jmp(gewwri) ; and goto general wait. ; data in and data out iccn bus single word communnication ;--------------------------------------------------------- ; on the iccn bus. doiswc: cjmp(nabrqi,doiswc) not; if asked for bus request then cont burqst ; ask for bus request. doisw1: jsb(ge03w0) cl2903 ; get iccn bus identicication ; ( reciever address). jsb(divw08) ; call divide w0 with 8. jsb(hwmrtl) ; call move rigth halfword of wrk0 to ; left halfword of wrk0. jsb(geicid) ; get own iccn id into rigth half word ; of wrk1. or(wrk1,wrk0) ; wrk1 := reciever shift 12 + sender. jsb(ge03w0) cl2903 ; get either message word or ; address in other computers memory. move(wrk2,wrk0) ; save message. doisw2: cjmp(icmabu,doisw2) not; wait until master on iccn bus. jsb(iccnre) ; call read a word from iccn bus ; or write a message. move(wrk2,wrk2) ; if it was a message then cjmp(neg,doisw3) ; goto reestablish data word send move(hc2903,wrk0) cl2903; send data word from iccn bus to ; hc2903. jmp(doisw4) ; goto control for iccn block transport. doisw3: move(hc2903,wrk2) cl2903; reestablis message to hc2903. doisw4: move(icwoco,icwoco) ; if icwoco <> 0 then cjmp(zero,bucow2) ; ask for bus request before jmp(bucow2) ; entering bus cumunication errro, ; the status of the operation is in the ; wrk1 register. ; entry when master on bus. ; ========================= iccnma: iccnrb: ; iccn bus read block. move(wrk1,icdev) ; wrk2 := iccn bus block read device ; reciever shift 12 + sender device. move(wrk0,icsla) ; addess of data in iccn bus slave computer. jsb(iccnre) ; call iccn read bus. cjmp(zero,stburq) not ; if not ok then goto do it again. ; (i.e. start bus request.) *onlyin:rh8000 move(medata,wrk0) ; move read data word to memory. *until: rh8000 move(meaddr,icmas) ; send address of data in own memory ; to memory address register and clock ; memory write. icblr1: cjmp(rememo,icblr1) not; wait for memory ready. *onlyin:hc8000 move(medata,icmas) ; send address of data in own memory. *until: hc8000 sub(icwoco,q) ; iccn bus block word counter := ; iccn bus block word counter -2. cjmp(zero,icblr2) ; if last word read then goto ; finis block transport. add(icmas,q) ; iccn master memory addres + 2. add(icsla,q) ; iccn slave memory address + 2. stburq: cont burqst ; start bus request. jmp(gewwri) ; goto general wait 0. ; last of a block transport, ; interupt hc2903. icblr2: jsb(dmictn) ; call subroutine dump current ; iccn transport blovk. negadd(wrk0,q,iccnch) ; get addres of iccn transport chain. jsb(gemewo) ; get memory word. move(wrk0,medata) ; get memory data word. move(wrk0,wrk0) ; for control cjmp(zero,icblr3) ; if chain empty then goto send ; interupt to hc2903 from iccn transport. jsb(loictn) ; else call subroutine load iccn ; transport. cont burqst ; ask for bus request. icblr3: move(wrk0,wrk2) ; wrk0 := interupt level address. jsb(gemewo) ; call subroutine get memory word. move(wrk0,medata) ; wrk0 := medata. move(wrk2,q) sl icblr4: move(wrk2,wrk2) sl ; wrk2 := 8. dec(wrk0) ; interupt level := interupt level - 1. cjmp(neg,icblr4) not ; if not negative then contiue. jmp(intrs1) ; else goto intrs1. ; get own iccn bus id. ;===================== diicoi: jsb(geicid) cl2903 ; call own iccn bus id into wrk1. ; to hc2903,( get address, not used). jsb(wa0300) ; call subroutine dor dummy data wait. move(hc2903,wrk1) cl2903; send own iccn bus id to hc2903 and ; clock ready the hc2903. jmp(noraw1) ; goto normal answer. *until: iccnx ; section channel input output. ; ============================= ; data out, channal reset. dochre: mzero(dochwc) ; reset data out word counter. jmp(noran0) ; goto normal answer. ; NOTE: after the resetting it ; is possibly that ; a data out finis interupt ; will be given. ; data out, channel start. ; ------------------------ dochst/: jsb(ge03w0) cl2903 ; get device address from hc2903. move(dochwc,dochwc) ; if word counter <> 0 then cjmp(zero,bucoe1) not ; then goto bus cummunication error. jsb(gedvbl) ; call subroutine to get device block ; address. move(meaddr,wrk0) ; send adrress of word counter to ; memory and start read cycle. add(wrk0,q) ; wrk0 := wrk0 + 2 . dochs1: cjmp(rememo,dochs1) not; wait for memory ready. move(dochwc,medata) ; get channel output wordcounter. move(meaddr,wrk0) ; send address of data block address to ; memory and start read cycle. negadd(dochwc,q) noload; if channel out put word counter < 2 cjmp(neg,bucoe1) ; then goto bus communication error. dochs2: cjmp(rememo,dochs2) not; wait for memory ready. move(dochad,medata) ; get channel block address. sub(dochad,wrk2) noload; if address of data block < 8 cjmp(neg,bucoe1) ; then goto bus communication error. *onlyin:rh8000 cont stwrch ; clock start write channel. *until: rh8000 move(chdata,dochwc) ; send channel output word counter ; to channal data buffer as first ; word. *onlyin:rh8000 cont fiwrch ; clock finis write channel. *until: rh8000 jmp(noran1) ; goto normal answer 1. ; entry interupt from channel output buffer. ; ------------------------------------------ choint: cont clchoi ; clear channel output interupt. negadd(dochwc,q) ; channel word counter := channel word ; counter -2. cjmp(neg,dochfi) ; if word counter < 0 ; then goto channel output finis ; interupt. move(meaddr,dochad) ; send channel output block address ; to memory and start read cycle. add(dochad,q,dochad) ; block address counter := ; block address counter + 2. dochs3: cjmp(rememo,dochs3) not; wait for memory ready. *onlyin:rh8000 cont stwrch ; clock start write channel. *until: rh8000 move(chdata,medata) ; send memory data word to channel ; data word. *onlyin:rh8000 cont fiwrch ; finis write channel. *until: rh8000 jmp(gewait) ; goto generel wait. dochfi: ; channel output finis interupt. ; ------------------------------ mzero(dochwc) ; reset word counter. ldct('chofil) ; load counter with channel output ; finis interupt level. jmp(clcint) ; goto calculate and set interupt. ; data in, channel reset. ; ----------------------- dichre/:mzero(dichwc) ; reset data in word counter. jmp(noran0) ; goto normal answer. ; if given in the middle of in input ; input operation the output opration ; from the other computer is migth ; not finis. ; data in, channel start ; ---------------------- dichst/: jsb(ge03w0) cl2903 ; get device address from hc2903. jsb(gedvbl) cl2903 ; call subroutine to get divice block ; address, and clock hc2903 ready to recieve dummy ; data word. add(wrk0,q) ; device block address + 2 to get ; data block address, ( word counter is ; not used). move(meaddr,wrk0) ; send address of data block address to memory ; memory and start read cycle. cont strech ; clock start reading of channel. move(dichwc,chdata) ; get first data word to ; data in channel word counter. cont firech ; clock finis read channel. dichs1: cjmp(re2903,dichs1) not; wait for accept not used data word. move(hc2903,dichwc) cl2903; send word counter to hc2903, ; ( goes to the data in instruction ; w register), and clock hc2903 ready. dichs2: cjmp(rememo,dichs2) not; wait for memory ready. move(dichad,medata) ; get channel block address. negadd(dichwc,q) noload; if data in channel word counter < 2 cjmp(neg,dichei) ; goto data in channel error in start. jmp(noraw2) ; else goto normal answer. dichei: ; error at start of data in instruction. mzero(dichwc) ; clear data in word counter. jmp(bucow2) ; goto bus communication error. ; entry: interupt from channel input buffer. ; ------------------------------------------ chiint: cont clchii ; clear channel input interupt. move(dichwc,dichwc) ; data in word counter = 0 then cjmp(zero,dichsi) ; goto data in channel interupt start. *onlyin:hc8000 move(meaddr,dichad) ; send data block address to memory ; and start read cycle. cont strech ; clock start reading of channel. move(wrk0,chdata) ; sync of memory, get channel data to ; wrk0 ( schold all clock ready in rh8000). cont firech ; clock finis reading of channel. chiin1: cjmp(rememo,chiin1) not; wait for memory ready. move(medata,wrk0) ; send channel data to memory. *until: hc8000 *onlyin:rh8000 cont strech ; clock start reading of channel move(medata,chdata) ; send channel data to memory cont firech ; clock finis reading of channel. move(meaddr,dichad) ; send channel data in data block ; address to memory and start ; write cycle. *until: rh8000 chiin2: cjmp(rememo,chiin2) not; wait for memory ready. negadd(dichwc,q) ; decrease word counter with 2. cjmp(zero,dichfi) ; if word counter = 0 then ; goto data in channel interupt finis. add(dichad,q) ; increase data in channel block address ; with 2. jmp(gewait) ; goto generel wait. dichfi: ; data in channel input finis transport interupt. ; ----------------------------------------------- ldct('chifil) ; load counter with channel input finis ; level. jmp(clcint) ; goto calcuæate and set interupt bit. dichsi: ; data in channel input start transport interupt. ; ----------------------------------------------- ldct('chisil) ; load counter with channel input start ; interupt level. jmp(clcint) ; goto calculate interupt. *onlyin:hc8000 ; local dma not in rh8000. ; local dma interupt service. ;---------------------------- dmain: ; select from status if it is ; input or output. jsb(ipldma) ; goto input dma from local dma. ; if local memory counter <> 0 then cjmp(zero,gewait) not; then generel wait else ldct('lodmle) ; load counter with local dma interupt ; level. jmp(clcint) ; goto clock interupt. ; subroutine input local dma. ; ---------------------------- ipldma: move(meaddr,lmem) ; addrs:= local dma memory addres reg. ; clock memory. move(wrk0,dmada) set(14); wrk0:= dma data, clock dma control ipldm1: cjmp(rememo,ipldm1) not; loop while memory not rteady move(medata,wrk0) ; memory := wrk0. add(lmem,q) ; local dam mem addrs :=+2. dmain2: cjmp(rememo,dmain2) not; wait memory ready rtn negadd(lwco,q) ; return from subroutine, decrease local ; dma word counter with 2. *until: hc8000 ; end version hc8000 ;*page: XX ;*page: XX *skip: gengp ; entry generel put instr ; ----------------------- genp00: cont cl2903 ; ready set hc2903. wait00: cjmp(re2903,wait00) not; loop until hc2903 is ready. move(r0,hc2903) ; r0 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. genp01: cont cl2903 ; ready set hc2903. wait01: cjmp(re2903,wait01) not; loop until hc2903 is ready. move(r1,hc2903) ; r1 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. genp02: cont cl2903 ; ready set hc2903. wait02: cjmp(re2903,wait02) not; loop until hc2903 is ready. move(r2,hc2903) ; r2 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. genp03: cont cl2903 ; ready set hc2903. wait03: cjmp(re2903,wait03) not; loop until hc2903 is ready. move(r3,hc2903) ; r3 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. genp04: cont cl2903 ; ready set hc2903. wait04: cjmp(re2903,wait04) not; loop until hc2903 is ready. move(r4,hc2903) ; r4 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. genp05: cont cl2903 ; ready set hc2903. wait05: cjmp(re2903,wait05) not; loop until hc2903 is ready. move(r5,hc2903) ; r5 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. genp06: cont cl2903 ; ready set hc2903. wait06: cjmp(re2903,wait06) not; loop until hc2903 is ready. move(r6,hc2903) ; r6 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. genp07: cont cl2903 ; ready set hc2903. wait07: cjmp(re2903,wait07) not; loop until hc2903 is ready. move(r7,hc2903) ; r7 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. genp08: cont cl2903 ; ready set hc2903. wait08: cjmp(re2903,wait08) not; loop until hc2903 is ready. move(r8,hc2903) ; r8 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. genp09: cont cl2903 ; ready set hc2903. wait09: cjmp(re2903,wait09) not; loop until hc2903 is ready. move(r9,hc2903) ; r9 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. genp10: cont cl2903 ; ready set hc2903. wait10: cjmp(re2903,wait10) not; loop until hc2903 is ready. move(r10,hc2903) ; r10 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. genp11: cont cl2903 ; ready set hc2903. wait11: cjmp(re2903,wait11) not; loop until hc2903 is ready. move(r11,hc2903) ; ready set hc2903. wait11: cjmp(re2903,wait11) not; loop until hc2903 is ready. move(r11,hc2903) ; r11 := hc2903. jmp(gewait) cl2903 ; ready set hc2903. wait12: cjmp(re2903,wait12) not; loop until hc2903 is ready. move(r12,hc2903) ; r12 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. genp13: cont cl2903 ; ready set hc2903. wait13: cjmp(re2903,wait13) not; loop until hc2903 is ready. move(r13,hc2903) ; r13 := hc2903. move(r14,hc2903) ; r14 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. genp15: cont cl2903 ; ready set hc2903. wait15: cjmp(re2903,wait15) not; loop until hc2903 is ready. move(r15,hc2903) ; r15 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. genp16: cont cl2903 ; ready set hc2903. wait16: cjmp(re2903,wait16) not; loop until hc2903 is ready. move(r16,hc2903) ; r16 := hc2903. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. ;*page: XX tcgorder01 ; entry generel get instr. ; ------------------------ geng00: move(hc2903,r0) ; entry get reg 0: hc2903 := r0. jmp(gewait) cl2903 ; ready set hc2903, goto wait loop geng01: move(hc2903,r1) ; entry get reg 00, hc2903 := r0 jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng02: move(hc2903,r2) ; entry get reg 02, hc2903 := r2 jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng03: move(hc2903,r3) ; entry get reg 03, hc2903 := r3 jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng04: move(hc2903,r4) ; entry get reg 04, hc2903 := r4 jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng05: move(hc2903,r5) ; entry get reg 05, hc2903 := r5 jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng06: move(hc2903,r6) ; entry get reg 06, hc2903 := r6 jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng07: move(hc2903,r7) ; entry get reg 07, hc2903 := r7 jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng08: move(hc2903,r8) ; entry get reg 08, hc2903 := r8 jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng09: move(hc2903,r9) ; entry get reg 09, hc2903 := r9 jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng10: move(hc2903,r10) ; entry get reg 10, hc2903 := r10 jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng11: move(hc2903,r11) ; entry get reg 11, hc2903 := r11, jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng12: move(hc2903,r12) ; entry get reg 12, hc2903 := r12, jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng13: move(hc2903,r13) ; entry get reg 13, hc2903 := r13, jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng14: move(hc2903,r14) ; entry get reg 14, hc2903 := r14, jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng15: move(hc2903,r15) ; entry get reg 15, hc2903 := r15, jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. geng16: move(hc2903,r16) ; entry get reg 16, hc2903 := r16, jmp(gewait) cl2903 ; ready set hc2903, goto wait loop. ;*page: XX ; end of micro program for the hc2901 *until: gengp *end: ▶EOF◀