.TITLE MURRAY CODE CONVERSION .IDENT /V1.01/ .NLIST TOC,SYM .ENABL LC ; Part of Sira Paper Tape Punch Despooler. ; ; COPYRIGHT(C) 1981,1982 Sira Institute Ltd., ; South Hill, Chislehurst, Kent, BR7 5EH, England. ; ; Author: C.J. Doran ; ; Assemble as: ; >MAC PPPMURRAY=PPPMURRAY ;+ ; Convert ASCII string addressed by %3, length %4, to 5-bit Murray code. ; It may be necessary to insert letters/figures shift characters, so start ; the output string in AUXBUF, which precedes the normal string buffer. ; Return with new string descriptor in %3,%4. ;- .PSECT CODE,I,RO LETSHF=37 ; Letters shift select FIGSHF=33 ; Figures shift select MURRAY::JSR PC,CARIAG ; Add carriage control bytes to buffer CLR %5 ; Clear printing character counter MOV #AUXBUF,%2 ; Address auxiliary conversion buffer 10$: MOVB (%3)+,%0 ; Fetch an ASCII character BIC #^C177,%0 ; Strip parity bits and hi byte INC %5 ; Assume a printing char, so note column CMPB %0,#<' > ; But is it? BHIS 14$ ; Yes, branch DEC %5 ; No, decrement col count again CMPB %0,#FF ; Form feed? BNE 11$ ; No, branch ; Make form feed four line feeds. MOVB #10,@%2 ; Load Murray LF .REPT 3 ; Copy 3 more times MOVB (%2)+,@%2 .ENDR INC %2 ; Advance pointer for next time ADD #4,CHKSUM+4 ; Note 4 more bit 3's BR 40$ ; Go get next character 11$: CMPB %0,#HT ; Tab? BNE 14$ ; No, look up in table ; Expand tabs with spaces, outputting until %5 is a multiple of 8. 12$: MOVB #4,(%2)+ ; Put in a Murray space INCB CHKSUM+5 ; Include its one bit in checksum INC %5 ; Count char BIT #7,%5 ; Is position a multiple of 8? BNE 12$ ; No, do it again BR 40$ ; Yes, go for next char 14$: CMPB %0,#'a ; Code>'a' (mostly lc)? BLO 15$ ; No, OK SUB #'a-'A,%0 ; Yes, map these onto upper case 15$: MOVB ASCMUR(%0),%0 ; Fetch Murray code equivalent BEQ 10$ ; Ignore non-printing control codes BITB SHIFT,%0 ; Are we in the right shift already? BNE 30$ ; Yes, OK MOV %0,-(SP) ; No, save %0 MOVB #FIGSHF,%0 ; Load figures shift character ASLB SHIFT ; Test if it's needed -- 100->200? BMI 20$ ; Yes, output figures shift MOVB #LETSHF,%0 ; No, need letters shift MOVB #SH.LET,SHIFT ; Note we are now in letters shift 20$: MOVB %0,(%2)+ ; Save shift character JSR PC,UPCSUM ; Include it in checksum MOVB (SP)+,%0 ; Restore required character 30$: BIC #^C37,%0 ; Strip unwanted flag bits MOVB %0,(%2)+ ; Store character JSR PC,UPCSUM ; Include it in checksum 40$: DEC %4 ; Repeat for all buffer BGT 10$ ; (SOB won't fit) MOV #AUXBUF,%3 ; Load new buffer start address MOV %2,%4 ; and compute SUB %3,%4 ; byte count RTS PC ; Return with converted buffer .PSECT STATIC,D,RO,LCL ; ASCII to Murray code conversion table. Bits 0-4 are the Murray code ; of the ASCII equivalent. Bit 6 (SH.LET) is set if the character is in ; letters shift; bit 7 (SH.FIG) if in figures shift. Note that a few ; codes are in both. SH.LET==100 ; Letters shift mask SH.FIG==200 ; Figures shift mask BOTH=SH.LET!SH.FIG ; Murray ; ASCII (nearest eqvt) ASCMUR: .BYTE 0 ; nul .BYTE 0 ; soh .BYTE 0 ; stx .BYTE 0 ; etx .BYTE 0 ; eot .BYTE 22!SH.FIG ; enq = who are you .BYTE 0 ; ack .BYTE 32!SH.FIG ; bel .BYTE 0 ; bs .BYTE 4!BOTH ; tab (spaced out) .BYTE 10!BOTH ; lf .BYTE 0 ; vt .BYTE 10!BOTH ; ff (4*lf) .BYTE 2!BOTH ; cr .REPT 18. ; so - us .BYTE 0 .ENDR .BYTE 4!BOTH ; sp .BYTE 24!SH.FIG ; ! (') .BYTE 24!SH.FIG ; " (') .BYTE 5!SH.FIG ; # (pound) .BYTE 5!SH.FIG ; $ (pound) .BYTE 26!SH.FIG ; % .BYTE 21!SH.FIG ; & (+) .BYTE 24!SH.FIG ; ' .BYTE 36!SH.FIG ; ( .BYTE 11!SH.FIG ; ) .BYTE 13!SH.FIG ; * (@) .BYTE 21!SH.FIG ; + .BYTE 6!SH.FIG ; , .BYTE 30!SH.FIG ; - .BYTE 7!SH.FIG ; . .BYTE 27!SH.FIG ; / .BYTE 15!SH.FIG ; 0 .BYTE 35!SH.FIG ; 1 .BYTE 31!SH.FIG ; 2 .BYTE 20!SH.FIG ; 3 .BYTE 12!SH.FIG ; 4 .BYTE 1!SH.FIG ; 5 .BYTE 25!SH.FIG ; 6 .BYTE 34!SH.FIG ; 7 .BYTE 14!SH.FIG ; 8 .BYTE 3!SH.FIG ; 9 .BYTE 16!SH.FIG ; : .BYTE 6!SH.FIG ; ; (,) .BYTE 36!SH.FIG ; < (() .BYTE 17!SH.FIG ; = .BYTE 11!SH.FIG ; > ()) .BYTE 23!SH.FIG ; ? .BYTE 13!SH.FIG ; @ .BYTE 30!SH.LET ; A .BYTE 23!SH.LET ; B .BYTE 16!SH.LET ; C .BYTE 22!SH.LET ; D .BYTE 20!SH.LET ; E .BYTE 26!SH.LET ; F .BYTE 13!SH.LET ; G .BYTE 5!SH.LET ; H .BYTE 14!SH.LET ; I .BYTE 32!SH.LET ; J .BYTE 36!SH.LET ; K .BYTE 11!SH.LET ; L .BYTE 7!SH.LET ; M .BYTE 6!SH.LET ; N .BYTE 3!SH.LET ; O .BYTE 15!SH.LET ; P .BYTE 35!SH.LET ; Q .BYTE 12!SH.LET ; R .BYTE 24!SH.LET ; S .BYTE 1!SH.LET ; T .BYTE 34!SH.LET ; U .BYTE 17!SH.LET ; V .BYTE 31!SH.LET ; W .BYTE 27!SH.LET ; X .BYTE 25!SH.LET ; Y .BYTE 21!SH.LET ; Z .BYTE 36!SH.FIG ; [ (() .BYTE 27!SH.FIG ; \ (/) .BYTE 11!SH.FIG ; ] ()) .BYTE 24!SH.FIG ; ^ (') .BYTE 30!SH.FIG ; _ (-) .BYTE 24!SH.FIG ; ` (') .IIF NE .-ASCMUR-'`-1 .ERROR .-ASCMUR-'`-1 ; BYTES MISSING IN ASCII-MURRAY TABLE .EVEN .END