|
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: 96000 (0x17700) Types: TextFile Names: »cgdump«, »tcgorder010«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ. └─⟦b2ec5d50f⟧ └─⟦this⟧ »cgdump« └─⟦this⟧ »tcgorder010«
*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. ; ; C(<number>) = contents of memory location <number>, ; <number> can in this case also ; be a register. ; ; 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 octet 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 disable 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'. ; 810814/1750: ; channel input/output logic changed, so it now ; accepts negative length buffers. ; 810824/0930: ; entry for external interupt fetch with a ; generel get instruction (gg 94) is inserted. ; 810824/0930: ; all generel get (gg) and generel put (gp) ; instrcution is allowed in rh8000, but ; their function is different. ; 810827/1500: ; dump of ic after evry instruction fetch ; introduced. gp 64 gives the address at which ; the dump schould start. gp 64 with the contents ; zero stops the dump. ; only in rh8000. ; 810903/1130: ; in rh8000 the start stop reset furnction send ; from hc8000 is changed so start after stop ; is a specific operation, and not mixed in with ; start interupt. ;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. ; 005: check for parity error schould be performed ; after memory data out and memory data in ; the time out function in the memory data out ; and memory data in schould also be finishd. ;PROJECT: ;------------------------------------------------------ ; ----------------------------------------- ; 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 *const: intimo,100 ; no. of micro instrcutions before ; time out for wait for ; pause signal in the amd9519 ; interupt controler. *const: sendto,4095 ; no of mic. instr. before sender ; 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) *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. reset: cont set(14) ; power reset jmp(rc80in) ; address 4 ; interupt from rc8000. *until: rh8000 *onlyin:hc8000 ; local dma only in hc8000 jmp(dmain) ; entry micro program address 1. jmp(choint) ; address 2, ; channel out interupt. cont ; not used address 3. 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 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 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 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. e01di1/:jmp(dichst) ; channel input start. e01di2/:jmp(dintus) ; data in not used. e01di3/:jmp(dichre) ; channel input reset. *onlyin:hc8000 e01di4/:jmp(dichde) ; read external chararcter device. *until: hc8000 *onlyin:rh8000 e01di4/:jmp(dintus) ; data in not used. *until: rh8000 e01di5/:jmp(dintus) ; data in not used. e01di6/:jmp(dintus) ; data in not used. 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. e01rtc/:jmp(gng100) ; gg(100) get real time clock. e01rtr/:jmp(geng64) ; gg test register with no wait. e01wtr/:jmp(genp64) ; gp test register. e01rtw/:jmp(geng66) ; gg test register with wait. ; rh8000: wait start by rc8000, and send ; interupt register to hc2903. 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. e01cil/:jmp(geng94) ; entry gg (94) get interupt level from ; amd9511 interupt controler, ; not on rh8000. ; 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 channel 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. ;. temp test. mzero(ictsad) ; clear instrcution test address. *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). *onlyin:rh8000: init6: ; wait for start by rc8000. ; only control word with address bit(21:22) = 00 ; accepted as start. cjmp(re8000,init6) not; wait for data word from rc8000. move(wrk0,rc80cn) ; get control word form rc8000 into wrk0. mzero(clrf80) ; clear flag indicating that ; word was send from hc8000. and(wrk0,wrk2) noload ; if bit(21) <> 0 then cjmp(zero,init6) not ; goto wait for data word start. and(q,wrk0) noload ; if bit(22) <> 0 then cjmp(zero,init6) not ; goto wait for data word start. *until: rh8000 move(wrk2,wrk2) sl ; wrk2 := wrk2*2 ( 8). *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. 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: 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 *onlyin:hc8000 ; 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. *until: hc8000 ; 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. *onlyin:rh8000 ; jsb(ictst) . call subroutine for posible writing ; of instrcution counter out in ; in memory for test purposes. *until: rh8000 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 ; set interupt. move(hc2903,pir) cl2903; move prefetched instrcution to ; hc2903 and clock ready. *onlyin:rh8000 move(wrk0,ic) ; wrk0 := ic of instruction +2. sub(wrk0,q) ; wrk0 := wrk0 - 2. ; jsb(ictst) . call subroutine ic test. *until: rh8000. 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 ; ----------------------------- *onlyin:rh8000 ictst: move(ictsad,ictsad) ; if ic test address = 0 then crtn(zero) ; then return from subroutine. move(medata,wrk0) ; send wrk0 to memory. move(meaddr,ictsad) ; send instrcution test address to ; memory address register and start write cycle. add(ictsad,q) ; calc. next ic test address. ictsw1: cjmp(rememo,ictsw1) not; wait for memory ready. rtn ; retrun from subroutine. *until: rh8000 *onlyin:rh8000 ; special functions in rh8000 ; ---------------------------- ; subroutine control address from rc8000 ; -------------------------------------- ; the 2 second last bit of the instrcution ; controls the function of the control address. ; inst(21:22) = 00 => start after init and ; give interupt. ; inst(21:22) = 01 => reset ( goto init). ; inst(21:22) = 10 => stop imidiatly ( micro tempi stop). ; inst(21:22) = 11 => start after stop ( micro tempi start). 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,reset) not ; then goto reset rtn move(wrk2,wrk2) sl; else wrk2 := 8 , start. cnrc82: and(q,wrk0) noload ; if control bits '10' then cjmp(zero,gewwri) not ; goto generel wait with init else cnrc83: cjmp(re8000,cnrc83) not; wait until signal from rc8000. move(wrk0,rc80cn) ; get control bits into wrk0. mzero(clrf80) ; clear flag indicating word ; send from rc8000. and(wrk0,wrk2) noload ; if bit(21) <> 1 then cjmp(zero,cnrc83) ; then goto wait for start ( stop). and(q,wrk0) noload ; if bit(22) <> 1 then cjmp(zero,cnrc83) ; then goto wait for start ( stop). jmp(gewwri) ; else start met goto ; generel wait with init. *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. ; ------------------------------------------------- ; 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 first interupt controler. ; create 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) ; write charakter device for disarment ; of interupt controler. modec(wrk1,q) ; wrk1 := const(1). move(extreg,wrk1) oprama opdirz trnbus readch; ; start read device 0, without selecting of ; timer device. push move(extreg,wrk1) oprama opdirz trnbus readch clexde; ; push next micro instr and start read ; device 0, send iack puls to interupt ; controler. loop(wainle) move(extreg,wrk1) oprama opdirz trnbus readch clexde; ; repeat read and sen iack pulse to ; interupt controler until pause signal ; from the interupt controler is finished. move(extreg,wrk1) oprama opdirz clexde trnbus readch; ; read response level from interupt controler. ; amd9519 interupt controler ; to answer. ; 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: jmp(cnrc83) cl2903 ; goto wait signal from ; rc8000 and check control bits. geng64: ; generel get 64. ; --------------- ; get test register. move(hc2903,intreg) cl2903; send interupt register to ; hc2903 and clock hc2903 ready. jmp(gewait) ; goto generel wait. geng94: ; generel get 94. ; --------------- ; get interupt controler interupt. move(hc2903,intlev) cl2903; send interupt level to hc2903 ; and clock hc2903 ready. jmp(gewait) ; goto generel wait. gng100: ; generel get 100 ; --------------- ; get real time clock. move(hc2903,intlim) cl2903; send interupt limit register ; to hc2903 and clokc hc2903 ready. jmp(gewait) ; goto generel wait. genp64: ; generel put 64 ; --------------- ; generel put test register. jsb(ge03w0) cl2903 ; get word from hc2903 to wrk0. move(ictsad,wrk0) ; move data word to ; ic test address register. 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. *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 ). 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 disable 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 disable 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 . *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) writch sltiml; send data and address to move(extreg,wrk1) writch sltiml; char io bus register and move(extreg,wrk1) writch sltiml; set clok external device signal move(extreg,wrk1) writch sltiml; (valid memory address in ; motorola move(extreg,wrk1) 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) 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) opdirz oprama sltiml trnbus; move(extreg,wrk1) opdirz oprama sltiml trnbus; move(extreg,wrk1) 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 *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). ; 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 ; octet. 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 ; 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/: move(dochwc,dochwc) cl2903; clock hc2903 ready to recieve ; address, ; if word counter <> 0 then cjmp(zero,bucow0) not ; then goto bus cummunication error. dochw1: cjmp(re2903,dochw1) not; wait for hc2903 ready to sned address. move(wrk0,hc2903) cl2903; wrk0 := address, clock hc2903 ready ; to recieve data word. dochw2: cjmp(re2903,dochw2) not; wait for hc2903 to revieve data word. move(dochwc,hc2903) cl2903; get data word form hc2903, clock ; hc2903 ready to accept not used ; data word. negadd(dochwc,q) noload; if word counter < 2 then cjmp(neg,dochs3) ; then goto dochs3, ( send message). jsb(gedvbl) ; call subroutine to get device block ; address. add(wrk0,q) ; divice block address := device ; block address + 2. move(meaddr,wrk0) ; send adrress of word counter to ; memory and start read cycle. dochs1: cjmp(rememo,dochs1) not; wait for memory ready. move(dochad,medata) ; get channel block address. sub(dochad,wrk2) noload; if address of data block < 8 cjmp(neg,bucow2) ; 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 add(dochwc,q) ; data out channel word counter := ; data out channel word counter +2, ; (after a subtraction by 2 in start of ; channel input interupt fetch, docchwc ; contain the number of bytes left to send, ; i.e. dochwc gives the no of bytes which ; their is not recieved a interupt answer ; for, that includes the first control word.) jmp(noraw2) ; goto normal answer 1. dochs3: ; entry word counte < 2. ; only word counter is send. cont stwrch ; clock start write channel. move(chdata,dochwc) ; send word counter. cont fiwrch ; clcok finis write channel. jmp(noraw2) ; goto to normal answer. ; 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,dochni) ; if word counter < 0 ; then goto answer message▶16◀▶16◀▶16◀▶16◀ ; with no interrupt move(dochwc,dochwc) ; if data out channel word counter = 0 then cjmp(zero,dochfi) ; send channel output finis interupt ; to hc2903. 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. docht1: cjmp(rememo,docht1) 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. dochni: mzero(dochwc) ; reset data word couter, and goto jmp(gewait) ; general wait without interrupt. dochfi: ; data out channel finis interuot. ; -------------------------------- mzero(dochwc) ; reset data word counter. ldct('chofil) ; load mic. counterwith 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. cont strech cl2903 ; clock start reading of channel, ; clock hc2903 ready to get recieve ; not used data word. move(dichwc,chdata) ; get first data word. cont firech ; click finis reading of channel. negadd(dichwc,q) noload; if data word < 2 then cjmp(neg,dichs3) ; then goto dichs3, ( message arrived). jsb(gedvbl) ; 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. 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. dichs3: ; message word revieved through channel. cjmp(re2903,dichs3) not; wait for acccepting not used ; data word. move(hc2903,dichwc) cl2903; send message word to ; hc2903 and clock data word ready ; from input. mzero(dichwc) ; reset data channel input word counter. jmp(noraw2) ; goto normal answer 2. 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◀