DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦b105c6e71⟧ TextFile

    Length: 16128 (0x3f00)
    Types: TextFile
    Names: »ttesthc01o«

Derivation

└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
    └─⟦4334b4c0b⟧ 
        └─⟦this⟧ »ttesthc01o« 

TextFile

*load:  m2901
        jmp(recont)                   ; by some stange reason the
                                      ; micro program schall start with
                                      ; a jump.
*origo: 1
        ; entry address from vector 
        ; from local dma.
        jmp(dmasel)                   ; goto select dma operation.
*origo: 18
recont: jsb(wacont)                   ; call wait control register.
        move(r0,tstreg)               ; move control word from testregister
                                      ; to r0.
        cjmp(zero,recont)             ; if control word = 0 then goto 
                                      ; read control word.
cont1:                                ; detect control word.
        mzero(r4)                     ;
        inc(r4)                       ; r4 := 1
        sub(r0,r4) noload             ; if control word = 1 then
        cjmp(zero,rwtst)              ;  goto read and write test reg.
        inc(r4)                       ; r4 := 2.
        sub(r0,r4) noload             ; if control word = 2 then
        cjmp(zero,rwsft)              ; goto read and write test reg with shift.
        inc(r4)                       ; r4 := 3.
        sub(r0,r4) noload             ; if control word is 3 then
        cjmp(zero,wrmewo)             ; goto write and read memory word.
        inc(r4)                       ; r4 := 4.
        sub(r0,r4) noload             ; if control word = 4  then
        cjmp(zero,remewo)             ; goto read memory word .
        inc(r4)                       ; r4 := 5.
        sub(r0,r4) noload             ; ic control word = 5 then goto
        cjmp(zero,wralme)             ; write and read all memory.
        inc(r4)                       ; r4 := 6.
        sub(r0,r4) noload             ; if control word is 4 then
        cjmp(zero,dmain)              ; goto dmmain.
        inc(r4)                       ; r4 := 7
        sub(r0,r4) noload             ; if control word is 7 then
        cjmp(zero,dmaout)             ; goto damout.
        inc(r4)                       ; r4 := 8.
        sub(r0,r4) noload             ; if control word = 4 then goto
        cjmp(zero,rwsftq)             ;   shift q and ram.


        jmp(func9)                   ;  else if control word is unknown
                                        ; goto bottom for extensions.




        ; function wait vektor.
        ;=====================
wavek:  cjvt(vect) move(r8,hc2903) noload noint; wait vektor interupt
        jmp(wavek)                    ; 



       ; subroutine move r12 to r3 and show r3.
shwr12:    move(r3,r12)   ; move r12 to r3 and continue in next subroutine.
       ; subroutine show contents of r3 in test reg.
showr3: rtn   move(tstreg,r3)       ; move r3 to test register and return.

       ; subroutine move r11 to r3 and show r3.
shwr11:       move(r3,r11)          ; move r11 to r3.
        rtn   move(tstreg,r3)       ; show r3 in testregister and return.

       ; subroutne move r10 to r3 and show r3.
shwr10:       move(r3,r10)          ; move r10 to r3.
        rtn   move(tstreg,r3)       ; show r3 in testreg and return.

       ; subroutine move r4 to r3 and show r3.
showr4:      move(r3,r4)           ; move r4 to r3.
       rtn   move(tstreg,r3)       ; show r3 in test register and return.

       ; subroutine move q to r3 and show r3.
showq:       move(r3,q)            ; move q to r3.
       rtn  move(tstreg,r3)        ; show r3 in test register an return.
        


       ; subroutine wait control word command.




        ; subroutine wait for control.
wacont:  move(r0,tstreg)            ; read test register.
         cjmp(tstrdy,wacont) not    ; wait for test flag to be high.
wacon1:  move(r0,tstreg)            ; read test register.
         cjmp(tstrdy,wacon1)        ; wait for test flag to be low.
         rtn                        ; return from subroutine.




        ; subroutine wait for testreg.
        ; ============================
waitst: cjmp(tstrdy,waitst) not       ; wait for testflag to be high
watst2: cjmp(tstrdy,watst2)           ; wait for test flag to go low
        rtn                           ; return from subroutine
         ; the next subroutine is deleted cause of error


        ; subroutine write mememory.
        ; ==========================
        ; addr in r12
        ; data in r10
        move(addrs,r12)               ;
        cjmp(rememo,wrwa1) not        ; wait for mememory
        move(memory,r10)              ; move data to memory
        cjmp(rememo,wrwa2) not        ; wait for memory write cycle.
        rtn                           ; return from subroutine.
       ; *** the next subroutine is not used cause of error




        ; subroutine read memory word.
        ; =============================
        ; addr in r12
        ; return data in r11
        move(addrs,r12)               ;
        cjmp(rememo,rewa1) not        ; wait for memory ready
        rtn move(r11,memory)          ; move data from memory to r11 and return






      ; write and read a memory word.
      ; first param is address
      ; second is data.
      ; continu reading the address until testreg is set 
      ; into manual mode.
      ; the data word which is read is shown in the
      ; testreg.


wrmewo: jsb(waitst)                   ; call wait test register.
        move(r12,tstreg)              ; get data from testreg.
wait3:  jsb(waitst)                   ; call wait test register.
        move(r10,tstreg)              ; get data word.

        jsb(wrmem)                    ; call write memory.
recon1: jsb(remem)                    ; call read memory
        jsb(shwr11)                   ; show data read from memory.
        cjmp(tstrdy,recont)           ; if testreg. flag is set then
                                      ; goto read control word.
        jmp(recon1)                   ; else goto read  memory and continue
        ; read test regisster and write the
        ; data inverted into the testregister until
        ; the test register is set into manual mode.
rwtst:  jsb(waitst)                   ; wait test register.
rwtst1: move(r12,tstreg)              ; get word from test reg.
        move(r10,r12)                 ; r12 :=
        moinv(r12,r12)                ; invert data word read.
        jsb(shwr12)                   ; show r12 in testreg.
        cjmp(tstrdy,recont)            ; if test register is set then goto
                                       ; goto read control word.
        jmp(rwtst1)                    ; continue.
      ; double shift a test pattern into q and ram




rwsftq:                               ; read and write test reg with shift.
        mzero(q)                      ; q := 0.
        mzero(r4)                     ; r4 := 0
        moinc(r5,r4)                  ; r5 := 1.
        lcpu(24)                      ;
        move(r4,r4) sraq              ;
        add(q,r5)                     ;

        rep move(r4,r4) sraq         ;
        jsb(showr4)                   ; show r4 in test register.
        jsb(waitst)                   ;
        jsb(showq)                    ; show q reg. in testregister.
        jsb(recont)                   ;



        ; read test reg shift 12 left and write
        ; wait test shift 12 rigth and write
        ; continue until data word is zero.
rwsft:  mzero(q)                      ; q := 0
        inc(q)                        ; q := 1.


        jsb(waitst)                   ; wait test register.
        move(r12,tstreg)              ; get data word from testreg.
        lcpu(12)                      ;
        rep move(r12,r12) sl          ;
        jsb(shwr12)                   ;  show r10 in testregister.
        jsb(waitst)                   ; call wait testreg.
        lcpu(12)                      ;
        rep move(r12,r12) sr          ;
        jsb(shwr12)                   ; show r10 in test register.
        jmp(recont)                    ; goto read ccontrol word.




        ; write the inverted address to the memory word
        ; and read it again, if is dir_fferent from the
        ; word which was read then the program is stoppep and
        ; the last succesfull address is shown on the test register.

wralme: mzero(r12)                    ; r12 := 0.
wralm1: moinv(r10,r12)                ; r10 := not ( r12)
        jsb(wrmem)                    ; call write memory
        jsb(remem)                    ; call read memory.
        cjmp(npmem,wralm3) not        ; if parrity error then goto show data word.
        sub(r11,r10) noload           ; if word read <> word written then
        cjmp(zero,wralm2)not          ; stop loop.
        inc(r12)                      ;
        inc(r12)                      ; r12 := next address.
        jsb(shwr12)                   ; show current address in test reg.
        jmp(wralm1)                   ; repeat with next address.

wralm2: dec(r12)                      ;
        dec(r12)                      ; r12 := next address.
wralm3: jsb(shwr12)                   ;  show r12 in test register.
        jmp(recont)                   ; goto read control word.



        ; read memory word an show contents in test register.
        ; ===================================================

remewo: jsb(waitst)                   ; call subroutine wait test register.
        move(r12,tstreg)              ; move addrers tto r12.
remem1: jsb(remem)                    ; call subroutine read mememory.
        jsb(shwr11)                   ; show r11 in test register.
        cjmp(tstrdy,recont)           ; if test register clocked then 
                                      ; goto read control word.
        jmp(remem1)                   ; repeat with same addrs.


        ; select dam operation.
        ; =====================
dmasel: move(r15,r15)                 ; if r15 = 0 then goto
        cjmp(zero,dmain1)             ; goto continue damin operation
        jmp(dmaou1)                   ; else continue dmaout operation.



        ; local dma input operation.
        ; ==========================
        ; get memory address from test reg and no of words
        ; and control word to the dma channel
        ; and perform a block input operation on the local dma
        ; show the data word in the test register.
        ; clear r15 to indicate that we are performing a
        ; dma input operation.
        ; return to read control word mode.
dmain:  jsb(waitst)                   ; wait test register.
        move(r12,tstreg)              ; get first address to memory.
        jsb(waitst)                   ; wait test register.
        move(r14,tstreg)              ; get no of words.
        jsb(waitst)                   ; wait test register.
        move(r7,tstreg)               ; get control word to dma addr reg.
        move(r14,r14)                 ; test of no of words.
        cjmp(neg,recont)              ; if word counter < 0 then goto read control word.
        mzero(r15)                    ; clear r15 to indicat a dma input operation.
        move(dmaadr,r7)               ; clock the dma channal wit the control word.
dmain1: move(r14,r14)                 ; if word counter > 0 then
        cjmp(zero,recont)             ; goto read control word.
        move(r10,dmada) set(14)     ; get data word from dma channel.
        jsb(shwr10)                   ; show data word in test register.
        jsb(wrmem)                    ; call write memory.
        inc(r12)                      ; block addresss := block address + 2.
        inc(r12)                      ;
        dec(r14)                      ; word counter := word counter - 2.
        dec(r14)                      ;
        jmp(wavek)                    ; goto function wait vektor.
                                      ; dma channnal.
        ; local dma output.
        ; =================
        ; get address of block and no of word from test regsiter
        ; and control word to the dma channal
        ; and perform a dma output operation,
        ; show tthe data wordin the test register.
        ; set r15 to 1 to indicate that a out put operation is per
        ; performed.
        ; return to read control word mode.
dmaout: jsb(waitst)                   ; wait test register.
        move(r12,tstreg)             ; get first memory addess
        jsb(waitst)                   ; wait test register.
        move(r14,tstreg)              ; get no of words.
        jsb(waitst)                 ; wait test register.
        move(r7,tstreg)               ; get dma address word.
        move(r14,r14)                 ;test of no of words.
        cjmp(neg,recont)              ; if data length word is negative
                                      ; then goto read control, word.
        mzero(r15)                    ; r15 := 1 to indicat that we are
        inc(r15)                      ; performing a dma data out.
        move(dmaadr,r7)               ; send dma addrs word to dma channal.
dmaou1: move(r14,r14)                 ; if word counter = 0 then goto 
        cjmp(zero,recont)             ; read control.
*test: biton
        jsb(remem)                   ; call read memory word.
        jsb(shwr11)                   ; show data word in test reg.
        move(dmada,r11) set(14)     ; move data word to dma channal
                                      ; and clock dam.
        inc(r12)                      ; data pointer := data pointer + 2.
*test: bitoff
        inc(r12)                      ;
        dec(r14)                      ; word counter := word counter - 2.
        dec(r14)                      ;
        jmp(wavek)                    ; goto wait vektor.


        ; subroutine write mememory.
        ; ==========================
        ; addr in r12
        ; data in r10
wrmem:  move(addrs,r12)               ;
        cont                           ; important continue for sync of memory.
wrwa1:  cjmp(rememo,wrwa1) not        ; wait for mememory
        move(memory,r10)              ; move data to memory
        cont                          ; important sync of memory.
wrwa2:  cjmp(rememo,wrwa2) not        ; wait for memory write cycle.
        rtn                           ; return from subroutine.




        ; subroutine read memory word.
        ; =============================
        ; addr in r12
        ; return data in r11
remem:  move(addrs,r12)               ;
        cont                          ; important sync. of memory.
rewa1:  cjmp(rememo,rewa1) not        ; wait for memory ready
        rtn move(r11,memory)          ; move data from memory to r11 and return
        ; first read control word to signifi function
func9:
      inc(r4)                        ; r4 := 9.
      sub(r0,r4) noload              ; if control word <> 9 then
      cjmp(zero,func10) not          ; then goto function 10.
     ; function 9.
     ; read a word from testregister
     ; and write it at the 2903 until
     ; the test register is clocked then
     ; return to read continue.
     jsb(waitst)                     ; wait for test register.
     move(r12,tstrdy)                ; get data word from test register.
wr2903: move(hc2903,r12)             ; send data word to hc2903.
     cjmp(tstrdy,recont)             ; if test register clocked then
                                     ; goto read control word.
     jmp(wr2903)                     ; else goto write to hc2903.

*end:   
▶EOF◀