• Please review our updated Terms and Rules here

PDP 11/45, Part 4

Here's a simple non interrupt driven cross port (TTY rx to TU58 tx, TU58 rx to TTY tx) echo program. You only need to deposit locations 2010 thru 2126, and then start at 2010.

This program assumes the rx/tx baud rates are the same on both cards, and it will not detect or handle an occasional character overrun (ie there is only one character of buffer in each direction). If you are just typing characters by hand to each port this is sufficient, but if you are blasting characters at maximal rate (eg, by using a PC to send text as fast as possible) then characters may get dropped.

As far as using vectored interrupts this simple program could be extended to do that without too much effort, but the overflow limitation would still be an issue. Solving that would mean implementing multi-character buffers in each direction, and some type of flow control (like XON/XOFF). As they say that would be left as an exercise for the reader ...

Don

Code:
       1                                .title  DL11 Tester
       2
       3                                .sbttl  DL11 definitions
       4
       5        177560                  ttbase  =177560
       6        176500                  dlbase  =176500
       7
       8        000000                  rcsr    =0
       9        000002                  rbuf    =2
      10        000004                  tcsr    =4
      11        000006                  tbuf    =6
      12
      13                                .sbttl  low memory
      14
      15                                        .enabl  ama                     ; change all mode 67 references to 37
      16                                        .asect                          ; absolute load image
      17
      18                                        .=200
      19 000200 000137  002010                  jmp     @#start                 ; standard diagnostic entry
      20
      21                                .sbttl  global variables
      22
      23                                        .=2000
      24                                stack:  .blkw   4                       ; top of stack plus some space
      25
      26                                .sbttl  program start
      27
      28 002010 012706  002000          start:  mov     #stack,sp               ; setup a stack
      29 002014 000005                          reset                           ; reset the world
      30
      31 002016 005000                          clr     r0                      ; clear TTY flag and char
      32 002020 005001                          clr     r1                      ; clear TU58 flag and char
      33 002022 012702  100000                  mov     #100000,r2              ; bit15 flag set plus zeroes
      34 002026 012704  177560                  mov     #ttbase,r4              ; console DL11 base
      35 002032 012705  176500                  mov     #dlbase,r5              ; TU58 DL11 base
      36
      37 002036 105764  000000          loop:   tstb    rcsr(r4)                ; check TTY rcv char done
      38 002042 100003                          bpl     10$                     ; br if none
      39 002044 010200                          mov     r2,r0                   ; set rcv flag <15>
      40 002046 156400  000002                  bisb    rbuf(r4),r0             ; yes, get the char, clr rcv char done
      41
      42 002052 105765  000000          10$:    tstb    rcsr(r5)                ; check TU58 rcv char done
      43 002056 100003                          bpl     20$                     ; br if none
      44 002060 010201                          mov     r2,r1                   ; set rcv flag <15>
      45 002062 156501  000002                  bisb    rbuf(r5),r1             ; yes, get the char, clr rcv char done
      46
      47 002066 005700                  20$:    tst     r0                      ; check char avail to xmt
      48 002070 100006                          bpl     30$                     ; br if not
      49 002072 105765  000004                  tstb    tcsr(r5)                ; check TU58 xmt char ready
      50 002076 100003                          bpl     30$                     ; br if not ready
      51 002100 110065  000006                  movb    r0,tbuf(r5)             ; yes, sent TTY char to TU58
      52 002104 005000                          clr     r0                      ; clear flag and char
      53
      54 002106 005701                  30$:    tst     r1                      ; check char avail to xmt
      55 002110 100006                          bpl     40$                     ; br if not
      56 002112 105764  000004                  tstb    tcsr(r4)                ; check TTY xmt char ready
      57 002116 100003                          bpl     40$                     ; br if not ready
      58 002120 110164  000006                  movb    r1,tbuf(r4)             ; yes, send TU58 char to TTY
      59 002124 005001                          clr     r1                      ; clear flag and char
      60
      61 002126 000743                  40$:    br      loop                    ; back to top
      62
      63                                .end

FYI here is the source file:

Code:
.title	DL11 Tester

.sbttl	DL11 definitions

ttbase	=177560
dlbase	=176500

rcsr	=0
rbuf	=2
tcsr	=4
tbuf	=6

.sbttl	low memory

	.enabl	ama			; change all mode 67 references to 37
	.asect				; absolute load image

	.=200
	jmp	@#start			; standard diagnostic entry

.sbttl	global variables

	.=2000
stack:	.blkw	4			; top of stack plus some space

.sbttl	program start

start:	mov	#stack,sp		; setup a stack
	reset				; reset the world

	clr	r0			; clear TTY flag and char
	clr	r1			; clear TU58 flag and char
	mov	#100000,r2		; bit15 flag set plus zeroes
	mov	#ttbase,r4		; console DL11 base
	mov	#dlbase,r5		; TU58 DL11 base

loop:	tstb	rcsr(r4)		; check TTY rcv char done
	bpl	10$			; br if none
	mov	r2,r0			; set rcv flag <15>
	bisb	rbuf(r4),r0		; yes, get the char, clr rcv char done

10$:	tstb	rcsr(r5)		; check TU58 rcv char done
	bpl	20$			; br if none
	mov	r2,r1			; set rcv flag <15>
	bisb	rbuf(r5),r1		; yes, get the char, clr rcv char done

20$:	tst	r0			; check char avail to xmt
	bpl	30$			; br if not
	tstb	tcsr(r5)		; check TU58 xmt char ready
	bpl	30$			; br if not ready
	movb	r0,tbuf(r5)		; yes, sent TTY char to TU58
	clr	r0			; clear flag and char

30$:	tst	r1			; check char avail to xmt
	bpl	40$			; br if not
	tstb	tcsr(r4)		; check TTY xmt char ready
	bpl	40$			; br if not ready
	movb	r1,tbuf(r4)		; yes, send TU58 char to TTY
	clr	r1			; clear flag and char

40$:	br	loop			; back to top	

.end
 
Last edited:
Hi All;

Don, Thank You very Much.. You are the Man..
I will put it in and try it tomorrow.. And study it and see How it works..
I will add it to my NoteBook..

If You haven't guessed by now, What I am trying to do is Find where my Problem is with making my system able to use the Tu58 Second Serial Port correctly..
What I need to do after I have this working is find what is the difference between this and Your Boot program as far as the Second Serial Port is Concerned.. And why it doesn't work, especially with streaming characters..
And How Overflow/overRun is handled..

THANK YOU Marty
 
Last edited:
Here is a slight update to the test. Added a configuration word to be able to set the "far-end" TU58 serial interface into maintenance loopback mode (set the highlighted RED word value at location 2006 to 000004 instead of 000000). Tested working on my 11/34 with DL11-W @ 9600 for console, and DL11-W @ 115200 for TU58 interface.

Don

Code:
       1                                .title  DL11 Tester
       2
       3                                .sbttl  DL11 definitions
       4
       5        177560                  ttbase  =177560
       6        176500                  dlbase  =176500
       7
       8        000000                  rcsr    =0
       9        000002                  rbuf    =2
      10        000004                  tcsr    =4
      11        000006                  tbuf    =6
      12
      13                                .sbttl  low memory
      14
      15                                        .enabl  ama                     ; change all mode 67 references to 37
      16                                        .asect                          ; absolute load image
      17
      18                                        .=200
      19 000200 000137  002010                  jmp     @#start                 ; standard diagnostic entry
      20
      21                                .sbttl  global variables
      22
      23                                        .=2000
      24                                stack:  .blkw   3                       ; top of stack plus some space
      25 002006 000000                  [COLOR="#FF0000"]switch: .word   000000                  ; 0=straight thru, 4=loopback in TU58 interface[/COLOR]
      26
      27                                .sbttl  program start
      28
      29 002010 012706  002000          start:  mov     #stack,sp               ; setup a stack
      30 002014 000005                          reset                           ; reset the world
      31
      32 002016 005000                          clr     r0                      ; clear TTY flag and char
      33 002020 005001                          clr     r1                      ; clear TU58 flag and char
      34 002022 012702  100000                  mov     #100000,r2              ; bit15 flag set plus zeroes
      35 002026 012704  177560                  mov     #ttbase,r4              ; console DL11 base
      36 002032 012705  176500                  mov     #dlbase,r5              ; TU58 DL11 base
      37
      38 002036 053765  002006  000004          bis     switch,tcsr(r5)         ; set MAINT loopback in TU58 interface?
      39
      40 002044 105764  000000          loop:   tstb    rcsr(r4)                ; check TTY rcv char done
      41 002050 100003                          bpl     10$                     ; br if none
      42 002052 010200                          mov     r2,r0                   ; set rcv flag <15>
      43 002054 156400  000002                  bisb    rbuf(r4),r0             ; yes, get the char, clr rcv char done
      44
      45 002060 105765  000000          10$:    tstb    rcsr(r5)                ; check TU58 rcv char done
      46 002064 100003                          bpl     20$                     ; br if none
      47 002066 010201                          mov     r2,r1                   ; set rcv flag <15>
      48 002070 156501  000002                  bisb    rbuf(r5),r1             ; yes, get the char, clr rcv char done
      49
      50 002074 105764  000004          20$:    tstb    tcsr(r4)                ; check TTY xmt char ready
      51 002100 100005                          bpl     30$                     ; br if not ready
      52 002102 005701                          tst     r1                      ; check char avail to xmt
      53 002104 100003                          bpl     30$                     ; br if not
      54 002106 110164  000006                  movb    r1,tbuf(r4)             ; yes, send TU58 char to TTY
      55 002112 005001                          clr     r1                      ; clear flag and char
      56
      57 002114 105765  000004          30$:    tstb    tcsr(r5)                ; check TU58 xmt char ready
      58 002120 100005                          bpl     40$                     ; br if not ready
      59 002122 005700                          tst     r0                      ; check char avail to xmt
      60 002124 100003                          bpl     40$                     ; br if not
      61 002126 110065  000006                  movb    r0,tbuf(r5)             ; yes, sent TTY char to TU58
      62 002132 005000                          clr     r0                      ; clear flag and char
      63
      64 002134 000137  002044          40$:    jmp     loop                    ; back to top
      65
      66                                .end
      66

and the source code:

Code:
.title  DL11 Tester

.sbttl  DL11 definitions

ttbase  =177560
dlbase  =176500

rcsr    =0
rbuf    =2
tcsr    =4
tbuf    =6

.sbttl  low memory

        .enabl  ama                     ; change all mode 67 references to 37
        .asect                          ; absolute load image

        .=200
        jmp     @#start                 ; standard diagnostic entry

.sbttl  global variables

        .=2000
stack:  .blkw   3                       ; top of stack plus some space
switch: .word   000000                  ; 0=straight thru, 4=loopback in TU58 interface

.sbttl  program start

start:  mov     #stack,sp               ; setup a stack
        reset                           ; reset the world

        clr     r0                      ; clear TTY flag and char
        clr     r1                      ; clear TU58 flag and char
        mov     #100000,r2              ; bit15 flag set plus zeroes
        mov     #ttbase,r4              ; console DL11 base
        mov     #dlbase,r5              ; TU58 DL11 base

        bis     switch,tcsr(r5)         ; set MAINT loopback in TU58 interface?

loop:   tstb    rcsr(r4)                ; check TTY rcv char done
        bpl     10$                     ; br if none
        mov     r2,r0                   ; set rcv flag <15>
        bisb    rbuf(r4),r0             ; yes, get the char, clr rcv char done

10$:    tstb    rcsr(r5)                ; check TU58 rcv char done
        bpl     20$                     ; br if none
        mov     r2,r1                   ; set rcv flag <15>
        bisb    rbuf(r5),r1             ; yes, get the char, clr rcv char done

20$:    tstb    tcsr(r4)                ; check TTY xmt char ready
        bpl     30$                     ; br if not ready
        tst     r1                      ; check char avail to xmt
        bpl     30$                     ; br if not
        movb    r1,tbuf(r4)             ; yes, send TU58 char to TTY
        clr     r1                      ; clear flag and char

30$:    tstb    tcsr(r5)                ; check TU58 xmt char ready
        bpl     40$                     ; br if not ready
        tst     r0                      ; check char avail to xmt
        bpl     40$                     ; br if not
        movb    r0,tbuf(r5)             ; yes, sent TTY char to TU58
        clr     r0                      ; clear flag and char

40$:    jmp     loop                    ; back to top

.end
 
Hi All;

Don, Your the Man !!!!!!!!!!!!
WOW !!!!!!!!
I think Tomorrow I will be feeling much better, and I will try to Assemble and UpLoad this to the PDP 11/45..
I will let You know what happens after I try it out..

THANK YOU Marty
 
Ok, here is a fancier version. This one is all interrupt driven, for all traffic in both directions.

Location 2006 option word operates the same way as the previous test. Start address is 200(8) or 2010(8). It is a lot longer than the other version, if you get this far I would recommend assembling it to a .bin file and downloading it thru the TT: absloader, or by PDP11GUI. It will be way too painful to even attempt to toggle in by hand...

This program was tested on SIMH and functions as expected. I could telnet into the TU58 DL11 emulated port, and use TeraTerm to blast a text file. It appears on the console terminal. And vice versa. Have not had the occasion to test this one on real hardware (yet). Maybe later today.

Here is the listing:

Code:
       1                                .title  DL11 Tester - interrupt I/O
       2
       3                                .sbttl  DL11 definitions
       4
       5        177560                  ttbase  =177560
       6        176500                  dlbase  =176500
       7
       8        000060                  ttvect  =60
       9        000300                  dlvect  =300
      10
      11        000000                  rcsr    =0
      12        000002                  rbuf    =2
      13        000004                  tcsr    =4
      14        000006                  tbuf    =6
      15
      16                                .sbttl  low memory
      17
      18                                        .enabl  ama                     ; change all mode 67 references to 37
      19 000000                                 .asect                          ; absolute load image
      20
      21        000060                          .=ttvect
      22 000060 002460                          ttrint                          ; tt rx interrupt
      23 000062 000240                          <5>*40                          ; ipl<5>
      24 000064 002630                          tttint                          ; tt tx interrupt
      25 000066 000240                          <5>*40                          ; ipl<5>
      26
      27        000300                          .=dlvect
      28 000300 002544                          dlrint                          ; dl rx interrupt
      29 000302 000240                          <5>*40                          ; ipl<5>
      30 000304 002702                          dltint                          ; dl tx interrupt
      31 000306 000240                          <5>*40                          ; ipl<5>
      32
      33        000200                          .=200
      34 000200 000137  002010                  jmp     @#start                 ; standard diagnostic entry
      35
      36                                .sbttl  global variables
      37
      38        000100                  datlen  =64.                            ; size of buffers to use
      39
      40        000400                          .=400
      41 000400 177560                  ttrcsr: .word   ttbase+rcsr             ; tt rx csr
      42 000402 177562                  ttrbuf: .word   ttbase+rbuf             ; tt rx buf
      43 000404 177564                  tttcsr: .word   ttbase+tcsr             ; tt tx csr
      44 000406 177566                  tttbuf: .word   ttbase+tbuf             ; tt tx buf
      45
      46 000410 004000                  ttript: .word   ttrdat                  ; tt rx input ptr
      47 000412 004000                  ttropt: .word   ttrdat                  ; tt rx output ptr
      48 000414 004000                  ttrmin: .word   ttrdat                  ; tt rx buffer start
      49 000416 004077                  ttrmax: .word   ttrdat+datlen-1         ; tt rx buffer end
      50
      51 000420 004100                  tttipt: .word   tttdat                  ; tt tx input ptr
      52 000422 004100                  tttopt: .word   tttdat                  ; tt tx output ptr
      53 000424 004100                  tttmin: .word   tttdat                  ; tt tx buffer start
      54 000426 004177                  tttmax: .word   tttdat+datlen-1         ; tt tx buffer end
      55
      56        000500                          .=500
      57 000500 176500                  dlrcsr: .word   dlbase+rcsr             ; dl rx csr
      58 000502 176502                  dlrbuf: .word   dlbase+rbuf             ; dl rx buf
      59 000504 176504                  dltcsr: .word   dlbase+tcsr             ; dl tx csr
      60 000506 176506                  dltbuf: .word   dlbase+tbuf             ; dl tx buf
      61
      62 000510 004200                  dlript: .word   dlrdat                  ; dl rx input ptr
      63 000512 004200                  dlropt: .word   dlrdat                  ; dl rx output ptr
      64 000514 004200                  dlrmin: .word   dlrdat                  ; dl rx buffer start
      65 000516 004277                  dlrmax: .word   dlrdat+datlen-1         ; dl rx buffer end
      66
      67 000520 004300                  dltipt: .word   dltdat                  ; dl tx input ptr
      68 000522 004300                  dltopt: .word   dltdat                  ; dl tx output ptr
      69 000524 004300                  dltmin: .word   dltdat                  ; dl tx buffer start
      70 000526 004377                  dltmax: .word   dltdat+datlen-1         ; dl tx buffer end
      71
      72        002000                          .=2000
      73        002000                  stack:  .blkw   3                       ; top of stack plus some space
      74 002006 000000                  option: .word   000000                  ; 0=straight thru, 4=loopback in TU58 interface
      75
      76                                .sbttl  program start
      77
      78                                        ; initialization
      79
      80 002010 012706  002000          start:  mov     #stack,sp               ; setup a stack
      81 002014 000005                          reset                           ; reset the world
      82 002016 012746  000340                  mov     #<7>*40,-(sp)           ; ipl 7
      83 002022 012746  002030                  mov     #1$,-(sp)               ; address
      84 002026 000002                          rti                             ; go there
      85 002030 000240                  1$:     nop                             ; placeholder
      86
      87                                        ; setup tt rx
      88
      89 002032 013700  000414                  mov     ttrmin,r0               ; start of buffer
      90 002036 012701  000100                  mov     #datlen,r1              ; length of buffer
      91 002042 105020                  2$:     clrb    (r0)+                   ; zap
      92 002044 077102                          sob     r1,2$                   ; loop
      93 002046 013737  000414  000410          mov     ttrmin,ttript           ; setup tt rx in/out pointers
      94 002054 013737  000414  000412          mov     ttrmin,ttropt           ;
      95 002062 105777  000402'                 tstb    @ttrbuf                 ; discard anything there
      96 002066 012777  000100  000400'         mov     #100,@ttrcsr            ; set interrupt enable
      97
      98                                        ; setup dl rx
      99
     100 002074 013700  000514                  mov     dlrmin,r0               ; start of buffer
     101 002100 012701  000100                  mov     #datlen,r1              ; length of buffer
     102 002104 105020                  3$:     clrb    (r0)+                   ; zap
     103 002106 077102                          sob     r1,3$                   ; loop
     104 002110 013737  000514  000510          mov     dlrmin,dlript           ; setup dl rx in/out pointers
     105 002116 013737  000514  000512          mov     dlrmin,dlropt           ;
     106 002124 105777  000502'                 tstb    @dlrbuf                 ; discard anything there
     107 002130 012777  000100  000500'         mov     #100,@dlrcsr            ; set interrupt enable
     108
     109                                        ; setup tt tx
     110
     111 002136 013700  000424                  mov     tttmin,r0               ; start of buffer
     112 002142 012701  000100                  mov     #datlen,r1              ; length of buffer
     113 002146 105020                  4$:     clrb    (r0)+                   ; zap
     114 002150 077102                          sob     r1,4$                   ; loop
     115 002152 013737  000424  000420          mov     tttmin,tttipt           ; setup tt tx in/out pointers
     116 002160 013737  000424  000422          mov     tttmin,tttopt           ;
     117 002166 012777  000100  000404'         mov     #100,@tttcsr            ; set interrupt enable
     118
     119                                        ; setup dl tx
     120
     121 002174 013700  000524                  mov     dltmin,r0               ; start of buffer
     122 002200 012701  000100                  mov     #datlen,r1              ; length of buffer
     123 002204 105020                  5$:     clrb    (r0)+                   ; zap
     124 002206 077102                          sob     r1,5$                   ; loop
     125 002210 013737  000524  000520          mov     dltmin,dltipt           ; setup dl tx in/out pointers
     126 002216 013737  000524  000522          mov     dltmin,dltopt           ;
     127 002224 012777  000100  000504'         mov     #100,@dltcsr            ; set interrupt enable
     128
     129                                        ; finish initialization
     130
     131 002232 053777  002006  000504'         bis     option,@dltcsr          ; TU58 interface option(s) [MAINT mode]
     132
     133 002240 012746  000000                  mov     #<0>*40,-(sp)           ; ipl 0
     134 002244 012746  002252                  mov     #loop,-(sp)             ; start of loop
     135 002250 000002                          rti                             ; go there
     136
     137                                        ; process characters
     138
     139 002252 000240                  loop:   nop                             ; check TTY rcv char done
     140
     141                                        ; check tt rx char available
     142
     143 002254 023737  000412  000410  10$:    cmp     ttropt,ttript           ; compare char ptrs
     144 002262 001434                          beq     20$                     ; br if equal, no chars avail
     145 002264 117700  000412'                 movb    @ttropt,r0              ; get character
     146 002270 023737  000412  000416          cmp     ttropt,ttrmax           ; at maximum ?
     147 002276 103003                          bhis    11$                     ; br if yes
     148 002300 005237  000412                  inc     ttropt                  ; no, bump ptr
     149 002304 000403                          br      12$                     ;
     150 002306 013737  000414  000412  11$:    mov     ttrmin,ttropt           ; wrap to start
     151 002314 000240                  12$:    nop                             ; placeholder
     152
     153                                        ; send tt rx char to dl tx char
     154
     155 002316 110077  000520'                 movb    r0,@dltipt              ; store char to buffer
     156 002322 023737  000520  000526          cmp     dltipt,dltmax           ; at maximum ?
     157 002330 103003                          bhis    13$                     ; br if yes
     158 002332 005237  000520                  inc     dltipt                  ; no, bump ptr
     159 002336 000403                          br      14$                     ;
     160 002340 013737  000524  000520  13$:    mov     dltmin,dltipt           ; wrap to start
     161 002346 052777  000100  000504' 14$:    bis     #100,@dltcsr            ; enable tx intr
     162
     163                                        ; check dl rx char available
     164
     165 002354 023737  000512  000510  20$:    cmp     dlropt,dlript           ; compare char ptrs
     166 002362 001434                          beq     30$                     ; br if equal, no chars avail
     167 002364 117701  000512'                 movb    @dlropt,r1              ; get character
     168 002370 023737  000512  000516          cmp     dlropt,dlrmax           ; at maximum ?
     169 002376 103003                          bhis    21$                     ; br if yes
     170 002400 005237  000512                  inc     dlropt                  ; no, bump ptr
     171 002404 000403                          br      22$                     ;
     172 002406 013737  000514  000512  21$:    mov     dlrmin,dlropt           ; wrap to start
     173 002414 000240                  22$:    nop                             ; placeholder
     174
     175                                        ; send dl rx char to tt tx char
     176
     177 002416 110177  000420'                 movb    r1,@tttipt              ; store char to buffer
     178 002422 023737  000420  000426          cmp     tttipt,tttmax           ; at maximum ?
     179 002430 103003                          bhis    23$                     ; br if yes
     180 002432 005237  000420                  inc     tttipt                  ; no, bump ptr
     181 002436 000403                          br      24$                     ;
     182 002440 013737  000424  000420  23$:    mov     tttmin,tttipt           ; wrap to start
     183 002446 052777  000100  000404' 24$:    bis     #100,@tttcsr            ; enable tx intr
     184
     185                                        ; loop
     186
     187 002454 000137  002252          30$:    jmp     loop                    ; back to top
     188
     189                                .sbttl  tt rx interrupt
     190
     191 002460 117777  000402' 000410' ttrint: movb    @ttrbuf,@ttript         ; store char in buffer
     192 002466 005237  000410                  inc     ttript                  ; bump pointer
     193 002472 023737  000410  000416          cmp     ttript,ttrmax           ; above maximum ?
     194 002500 101403                          blos    1$                      ; br if ok
     195 002502 013737  000414  000410          mov     ttrmin,ttript           ; yes, wrap to start
     196 002510 023737  000410  000412  1$:     cmp     ttript,ttropt           ; ptr collision?
     197 002516 001011                          bne     2$                      ; br if not
     198 002520 005337  000410                  dec     ttript                  ; yes, backoff ptr
     199 002524 023737  000410  000414          cmp     ttript,ttrmin           ; below minimum ?
     200 002532 103003                          bhis    2$                      ; br if ok
     201 002534 013737  000416  000410          mov     ttrmax,ttript           ; yes, wrap to end
     202 002542 000002                  2$:     rti                             ; return
     203
     204                                .sbttl  dl rx interrupt
     205
     206 002544 117777  000502' 000510' dlrint: movb    @dlrbuf,@dlript         ; store char in buffer
     207 002552 005237  000510                  inc     dlript                  ; bump pointer
     208 002556 023737  000510  000516          cmp     dlript,dlrmax           ; above maximum ?
     209 002564 101403                          blos    1$                      ; br if ok
     210 002566 013737  000514  000510          mov     dlrmin,dlript           ; yes, wrap to start
     211 002574 023737  000510  000512  1$:     cmp     dlript,dlropt           ; ptr collision?
     212 002602 001011                          bne     2$                      ; br if not
     213 002604 005337  000510                  dec     dlript                  ; yes, backoff ptr
     214 002610 023737  000510  000514          cmp     dlript,dlrmin           ; below minimum ?
     215 002616 103003                          bhis    2$                      ; br if ok
     216 002620 013737  000516  000510          mov     dlrmax,dlript           ; yes, wrap to end
     217 002626 000002                  2$:     rti                             ; return
     218
     219                                .sbttl  tt tx interrupt
     220
     221 002630 023737  000422  000420  tttint: cmp     tttopt,tttipt           ; ptr collision
     222 002636 001415                          beq     1$                      ; br if yes, nothing in buffer
     223 002640 117777  000422' 000406'         movb    @tttopt,@tttbuf         ; output char from buffer
     224 002646 005237  000422                  inc     tttopt                  ; bump ptr
     225 002652 023737  000422  000426          cmp     tttopt,tttmax           ; above maximum ?
     226 002660 101407                          blos    2$                      ; br if ok
     227 002662 013737  000424  000422          mov     tttmin,tttopt           ; yes, wrap to start
     228 002670 000403                          br      2$                      ; done
     229 002672 042777  000100  000404' 1$:     bic     #100,@tttcsr            ; turn off intr enable
     230 002700 000002                  2$:     rti                             ; return
     231
     232                                .sbttl  dl tx interrupt
     233
     234 002702 023737  000522  000520  dltint: cmp     dltopt,dltipt           ; ptr collision
     235 002710 001415                          beq     1$                      ; br if yes, nothing in buffer
     236 002712 117777  000522' 000506'         movb    @dltopt,@dltbuf         ; output char from buffer
     237 002720 005237  000522                  inc     dltopt                  ; bump ptr
     238 002724 023737  000522  000526          cmp     dltopt,dltmax           ; above maximum ?
     239 002732 101407                          blos    2$                      ; br if ok
     240 002734 013737  000524  000522          mov     dltmin,dltopt           ; yes, wrap to start
     241 002742 000403                          br      2$                      ; done
     242 002744 042777  000100  000504' 1$:     bic     #100,@dltcsr            ; turn off intr enable
     243 002752 000002                  2$:     rti                             ; return
     244
     245                                .sbttl  data buffers
     246
     247        004000                          .=4000
     248
     249        004000                  ttrdat: .blkb   datlen                  ; tt rx buffer
     250        004100                  tttdat: .blkb   datlen                  ; tt tx buffer
     251
     252        004200                  dlrdat: .blkb   datlen                  ; dl rx buffer
     253        004300                  dltdat: .blkb   datlen                  ; dl tx buffer
     254
     255                                .end
     255

and here is the source file:

Code:
.title  DL11 Tester - interrupt I/O

.sbttl  DL11 definitions

ttbase  =177560
dlbase  =176500

ttvect  =60
dlvect  =300

rcsr    =0
rbuf    =2
tcsr    =4
tbuf    =6

.sbttl  low memory

        .enabl  ama                     ; change all mode 67 references to 37
        .asect                          ; absolute load image

        .=ttvect
        ttrint                          ; tt rx interrupt
        <5>*40                          ; ipl<5>
        tttint                          ; tt tx interrupt
        <5>*40                          ; ipl<5>

        .=dlvect
        dlrint                          ; dl rx interrupt
        <5>*40                          ; ipl<5>
        dltint                          ; dl tx interrupt
        <5>*40                          ; ipl<5>

        .=200
        jmp     @#start                 ; standard diagnostic entry

.sbttl  global variables

datlen  =64.                            ; size of buffers to use

        .=400
ttrcsr: .word   ttbase+rcsr             ; tt rx csr
ttrbuf: .word   ttbase+rbuf             ; tt rx buf
tttcsr: .word   ttbase+tcsr             ; tt tx csr
tttbuf: .word   ttbase+tbuf             ; tt tx buf

ttript: .word   ttrdat                  ; tt rx input ptr
ttropt: .word   ttrdat                  ; tt rx output ptr
ttrmin: .word   ttrdat                  ; tt rx buffer start
ttrmax: .word   ttrdat+datlen-1         ; tt rx buffer end

tttipt: .word   tttdat                  ; tt tx input ptr
tttopt: .word   tttdat                  ; tt tx output ptr
tttmin: .word   tttdat                  ; tt tx buffer start
tttmax: .word   tttdat+datlen-1         ; tt tx buffer end

        .=500
dlrcsr: .word   dlbase+rcsr             ; dl rx csr
dlrbuf: .word   dlbase+rbuf             ; dl rx buf
dltcsr: .word   dlbase+tcsr             ; dl tx csr
dltbuf: .word   dlbase+tbuf             ; dl tx buf

dlript: .word   dlrdat                  ; dl rx input ptr
dlropt: .word   dlrdat                  ; dl rx output ptr
dlrmin: .word   dlrdat                  ; dl rx buffer start
dlrmax: .word   dlrdat+datlen-1         ; dl rx buffer end

dltipt: .word   dltdat                  ; dl tx input ptr
dltopt: .word   dltdat                  ; dl tx output ptr
dltmin: .word   dltdat                  ; dl tx buffer start
dltmax: .word   dltdat+datlen-1         ; dl tx buffer end

        .=2000
stack:  .blkw   3                       ; top of stack plus some space
option: .word   000000                  ; 0=straight thru, 4=loopback in TU58 interface

.sbttl  program start

        ; initialization

start:  mov     #stack,sp               ; setup a stack
        reset                           ; reset the world
        mov     #<7>*40,-(sp)           ; ipl 7
        mov     #1$,-(sp)               ; address
        rti                             ; go there
1$:     nop                             ; placeholder

        ; setup tt rx

        mov     ttrmin,r0               ; start of buffer
        mov     #datlen,r1              ; length of buffer
2$:     clrb    (r0)+                   ; zap
        sob     r1,2$                   ; loop
        mov     ttrmin,ttript           ; setup tt rx in/out pointers
        mov     ttrmin,ttropt           ;
        tstb    @ttrbuf                 ; discard anything there
        mov     #100,@ttrcsr            ; set interrupt enable

        ; setup dl rx

        mov     dlrmin,r0               ; start of buffer
        mov     #datlen,r1              ; length of buffer
3$:     clrb    (r0)+                   ; zap
        sob     r1,3$                   ; loop
        mov     dlrmin,dlript           ; setup dl rx in/out pointers
        mov     dlrmin,dlropt           ;
        tstb    @dlrbuf                 ; discard anything there
        mov     #100,@dlrcsr            ; set interrupt enable

        ; setup tt tx

        mov     tttmin,r0               ; start of buffer
        mov     #datlen,r1              ; length of buffer
4$:     clrb    (r0)+                   ; zap
        sob     r1,4$                   ; loop
        mov     tttmin,tttipt           ; setup tt tx in/out pointers
        mov     tttmin,tttopt           ;
        mov     #100,@tttcsr            ; set interrupt enable

        ; setup dl tx

        mov     dltmin,r0               ; start of buffer
        mov     #datlen,r1              ; length of buffer
5$:     clrb    (r0)+                   ; zap
        sob     r1,5$                   ; loop
        mov     dltmin,dltipt           ; setup dl tx in/out pointers
        mov     dltmin,dltopt           ;
        mov     #100,@dltcsr            ; set interrupt enable

        ; finish initialization

        bis     option,@dltcsr          ; TU58 interface option(s) [MAINT mode]

        mov     #<0>*40,-(sp)           ; ipl 0
        mov     #loop,-(sp)             ; start of loop
        rti                             ; go there

        ; process characters

loop:   nop                             ; check TTY rcv char done

        ; check tt rx char available

10$:    cmp     ttropt,ttript           ; compare char ptrs
        beq     20$                     ; br if equal, no chars avail
        movb    @ttropt,r0              ; get character
        cmp     ttropt,ttrmax           ; at maximum ?
        bhis    11$                     ; br if yes
        inc     ttropt                  ; no, bump ptr
        br      12$                     ;
11$:    mov     ttrmin,ttropt           ; wrap to start
12$:    nop                             ; placeholder

        ; send tt rx char to dl tx char

        movb    r0,@dltipt              ; store char to buffer
        cmp     dltipt,dltmax           ; at maximum ?
        bhis    13$                     ; br if yes
        inc     dltipt                  ; no, bump ptr
        br      14$                     ;
13$:    mov     dltmin,dltipt           ; wrap to start
14$:    bis     #100,@dltcsr            ; enable tx intr

        ; check dl rx char available

20$:    cmp     dlropt,dlript           ; compare char ptrs
        beq     30$                     ; br if equal, no chars avail
        movb    @dlropt,r1              ; get character
        cmp     dlropt,dlrmax           ; at maximum ?
        bhis    21$                     ; br if yes
        inc     dlropt                  ; no, bump ptr
        br      22$                     ;
21$:    mov     dlrmin,dlropt           ; wrap to start
22$:    nop                             ; placeholder

        ; send dl rx char to tt tx char

        movb    r1,@tttipt              ; store char to buffer
        cmp     tttipt,tttmax           ; at maximum ?
        bhis    23$                     ; br if yes
        inc     tttipt                  ; no, bump ptr
        br      24$                     ;
23$:    mov     tttmin,tttipt           ; wrap to start
24$:    bis     #100,@tttcsr            ; enable tx intr

        ; loop

30$:    jmp     loop                    ; back to top

.sbttl  tt rx interrupt

ttrint: movb    @ttrbuf,@ttript         ; store char in buffer
        inc     ttript                  ; bump pointer
        cmp     ttript,ttrmax           ; above maximum ?
        blos    1$                      ; br if ok
        mov     ttrmin,ttript           ; yes, wrap to start
1$:     cmp     ttript,ttropt           ; ptr collision?
        bne     2$                      ; br if not
        dec     ttript                  ; yes, backoff ptr
        cmp     ttript,ttrmin           ; below minimum ?
        bhis    2$                      ; br if ok
        mov     ttrmax,ttript           ; yes, wrap to end
2$:     rti                             ; return

.sbttl  dl rx interrupt

dlrint: movb    @dlrbuf,@dlript         ; store char in buffer
        inc     dlript                  ; bump pointer
        cmp     dlript,dlrmax           ; above maximum ?
        blos    1$                      ; br if ok
        mov     dlrmin,dlript           ; yes, wrap to start
1$:     cmp     dlript,dlropt           ; ptr collision?
        bne     2$                      ; br if not
        dec     dlript                  ; yes, backoff ptr
        cmp     dlript,dlrmin           ; below minimum ?
        bhis    2$                      ; br if ok
        mov     dlrmax,dlript           ; yes, wrap to end
2$:     rti                             ; return

.sbttl  tt tx interrupt

tttint: cmp     tttopt,tttipt           ; ptr collision
        beq     1$                      ; br if yes, nothing in buffer
        movb    @tttopt,@tttbuf         ; output char from buffer
        inc     tttopt                  ; bump ptr
        cmp     tttopt,tttmax           ; above maximum ?
        blos    2$                      ; br if ok
        mov     tttmin,tttopt           ; yes, wrap to start
        br      2$                      ; done
1$:     bic     #100,@tttcsr            ; turn off intr enable
2$:     rti                             ; return

.sbttl  dl tx interrupt

dltint: cmp     dltopt,dltipt           ; ptr collision
        beq     1$                      ; br if yes, nothing in buffer
        movb    @dltopt,@dltbuf         ; output char from buffer
        inc     dltopt                  ; bump ptr
        cmp     dltopt,dltmax           ; above maximum ?
        blos    2$                      ; br if ok
        mov     dltmin,dltopt           ; yes, wrap to start
        br      2$                      ; done
1$:     bic     #100,@dltcsr            ; turn off intr enable
2$:     rti                             ; return

.sbttl  data buffers

        .=4000

ttrdat: .blkb   datlen                  ; tt rx buffer
tttdat: .blkb   datlen                  ; tt tx buffer

dlrdat: .blkb   datlen                  ; dl rx buffer
dltdat: .blkb   datlen                  ; dl tx buffer

.end
 
Last edited:
Hi All;

Don, all I can say Is WOW and THANK YOU !!!
So, Yes, I will Have three Programs to assemble and Load, each in Increasing complexity..
That should Pinpoint where the trouble Exists.. If it is in the 11/45 itself, or in one of the Serial Boards..

THANK YOU Marty
 
Hi All;

Patrick, "" Have one for sale with tape transporter and controller. ""
One What ???
A Picture and Details would be nice..

THANK YOU Marty
 
Hi All;

I am Temporarily Putting away my PDP 11/45, and I am getting out my Digital Group System..
I am going to try and get the Digital Group machine to Run again, mostly the 64K memory Board..
So that I can then go and Sell it..
After that I will Re-get out the PDP 11/45..

THANK YOU Marty
 
Hi All;

Jack, No and Yes..
Actually, I grew up in Denver, But When Digital Group was Run by Dr. Suding, I Didn't know of it..
But, After it got Sold to Ron Struthers, is when I heard of it, and got my First System, the one Shown in the Digital Group posting by Falter..
Which is when I moved to Boulder and I got My First Real System from Ron which I already have Sold, along With the ByteMaster that I also had to sell I got from Ron.. I had not talked to Ron in a few years, and I don't know what He has Left in Boards and such..
The company I worked for in Boulder, which was from the Guy who worked for Dr. Suding, and and It was from His brother who worked for Ron, and I was having trouble getting my Digital Group Working..
So I brought it in, He Helped me get it going, and I was Looking for a Job at the Time and Recommended His Brother who had a Company in Boulder, which I worked for, for about 10 Years.. And All of His Early People who worked in the Boulder Company all Had Digital Group Systems..
So this is a quick synopsis of my relationship with Digital Group..

THANK YOU Marty
 
Last edited:
Hi All;

Thank You, Jack for asking..
But, that is not the end of the Story..
In the early days of Working at the Boulder Company, I met Bruce Ray of Wild Hare Fame, and I have had numerous Data General Machines, many of which I got from Him..
So, I have worked with Little DG and Big DG..
But, while at the Boulder Company, I mostly worked with TI 990/10 and TI 990/12 machines, Testing the Boards that the Company made for 990's..
I have a few Boards from that time period, and a 990/12 Front Panel..
So, I have had or worked on
Altair 8800's, Altair 8800, Altair 8800b,
Digital Group, 8080, Z80,
Data General, Nova, Nova 1200, Eclipse S130,
TI 990's, 990/10, 990/12,
Charles Rivers Universe 68000..
The only machines I have left are the Altair 8800, Digital Group 8080 and Z-80 CPU, Data General Eclipse S130, and the Charles Rivers Universe 68000 Machines..

THANK YOU Marty
 
Hi All;

M-Thompson, I doubt I could ever get out that way, too far away.. But, Thank You for the Offer..
What I would suggest, is sort the various Boards out by Kind, and if the Power Supply is Working, first get just a basic machine to respond to/with the Front Panel, and then just sub out Your Boards until it looks like You have a working system..
They were a fairly simple design, and should not be too hard to get working..

THANK YOU Marty
 
Hi All;

I have the PDP 11/45 out and up here on the Kitchen Table..
My Gremlins, must not have been working very hard, to fix it or they were working too hard and now it still Doesn't work, And it's been up on the shelf since March..
I have to find my NoteBook and my other 11/45 manual, before I can get much more Done..
I also, will need to re-Read my previous Posting to find out what I blew up, hopefully.. No clue from Previous Postings..

THANK YOU Marty
 
Last edited:
Marty,

How the **** do you get an 11/45 on a kitchen table?! It must be a bit more sturdy than our kitchen table - that's all I can say :).

I have our lab. technician at work going to rewire the mains side of my H742 - a very nice man...

Dave
 
Hi All;

Remember, I do all of my Projects on the Kitchen table..
Also, Remember that I have only the 28 slot Main MotherBoard and the four slot UniBus MotherBoard..
A PC Power Supply and a wooden Frame.. Look at the Pictures from the first entries..
The same Kitchen Table that I did the PDP 8i clone on..
Have Fun at school, are You taking the 11/45 there to do the complex math problems ??

I Found the Problem, one of the Connectors was not well connected or before not connected at all..
Once it was connected back (I still need to DeOxidize it).. I worked, at least I have been able to Deposit "0000 to the first 8 memory Locations..

I Found my notebook with Schematics and such in it, so I can now proceed with things..

THANK YOU Marty
 
Last edited:
Hi All;

I Found my first confirmed problem, when trying to Enter in Bill's Echo Problem..
I have NO Deposit at '1000 , I can't say about return, but Definitely No Deposit..
No Deposit at all, I had it previously..

I got the Deposit to work, I had undid a wire, when I deoxidized the connector, and so connecting it back and to a good Ground, seemed to fix it..

I ran Bill's Echo Program and I have Success with that..
Next I need to make the Console Mode work with one of the Boards..
I got Board #2 of the three M9312's to work in Console mode, and it is Running Don's ZZ (Top) program..
I have run 2000 Octal passes of the ZZ Program..
So this means, that I can Now at least Load things from that Board, and have some Memory, and it Executing at least part of it correctly..

THANK YOU Marty
 
Last edited:
Hi All;

Ok, I got the process documented for Loading Programs from the M9301..
Now, I need to do the same for the M9312..
I can Start the M9312, at 165020, and get the Console prompt, so far so good..

After Typing in 'TT' and a Cr.. What Program should I be Loading in -- The Absolute Loader or The Program itself like CQKCG1.BIC ??
Also, after trying the Absolute Loader, If I look at the Addresses of the Bootstrap Loader, they all match, till I get to the last two addresses and then it doesn't match.. At '157774 it shows '177556 where it should be '000765 and at the last address '157776, it shows '177556, instead of '177560..
I am going to try Manual loading with out 'TT' , but first, I am going to try and change those last two address, and see if they are changeable or if it's a Memory Board Problem, I suspect not since it Passes the ZZ Test..

I was able to change both Addresses, but then after running that and trying to Load the Absolute Loader, the Bootstrap Loader space is Totally Corrupted..

At this point, I am Not sure where to go from Here with the M9312 Board for Loading programs from.. But, I know I can Load them with the M9301..
So, in summary of what I remember from before and at present, I can Load in Programs with the M9301, but not get a console Prompt..
With the M9312, I can Run 'ZZ', But I cannot use 'DD' or 'TT' and I cannot Load in Programs..

THANK YOU Marty
 
Last edited:
Back
Top