On Sep 9, 2025, at 8:52 PM, Martin Eberhard via cctalk
<cctalk(a)classiccmp.org> wrote:
 I just love the PDP11's assembly language. I needed a super-tight
 subroutine to print a 16-bit value as 6 octal digits. This is as tight as I
 could make it, 16 words (including writing to the serial port, which takes
 5 words). Can you beat it?
 ;*** Subroutine *************************
 ;Print a 16-bit value as 6 octal digits
 ;Calling Sequence:
 ;  jsr     PC,PROCT6
 ;On Entry:
 ;  R2 = value to print
 ;Trashes R1,R2
 ;****************************************
 PROCT6: mov     #100030,R1      ;Digit loop ends when '1' lands in C
                                ;..'30' makes it ASCII
        sec                     ;All done when this is in C again
 ;Extract a digit and convert it to ASCII. Check for done.
 1$:     rol     R2              ;Shift digit out of R2 & into R1
        beq     3$              ;Return when done
        rol     r1              ;Build next octal digit
        bcc     1$              ;Done when c = shift pattern bit
 ;Write digit to the serial port
 2$:     tstb    @#CTXSTA        ;Wait for transmitter (clears C)
        bpl     2$
        movb    R1,@#CTXDAT     ;Transmit now
 ;Next digit
        mov     #020006,R1      ;Digit ends when "2" lands in C.
                                ;Printing ends when "sec" bit
                                ;..leaves R2. '6' makes ASCII
        br      1$
 3$:    rts PC
 Martin E. 
Very nice.  Here is the code used in the KMON (resident part of the keyboard monitor,
i.e., CLI) of RT-11 V2.  I think it was created by Anton Chernoff.
OPRINT: MOV     #30,R0          ;CONVERT WORD TO OCTAL AND PRINT IT
        SEC
4$:     ROL     R2              ;DON'T TRY TO UNDERSTAND THIS ROUTINE
        ROLB    R0              ;  JUST USE IT & LOVE IT
        .TTYOUT
        MOV     #206,R0
5$:     ASL     R2              ;DONE YET ?
        BEQ     6$              ;YES
        ROLB    R0
        BCS     5$
        BR      4$
6$:     <exit>
Same approach but yours is shorter because it forms the next digit in one place rather
than two.  Interesting that was missed in the earlier version.
        paul