.TITLE EIA CONVERSION .IDENT /V1.01/ .NLIST TOC,SYM .ENABL LC ; Part of Sira Paper Tape Punch Despooler. ; ; COPYRIGHT(C) 1982 Sira Institute Ltd., ; South Hill, Chislehurst, Kent, BR7 5EH, England. ; ; Author: C.J. Doran ; ; Assemble as: ; >MAC PPPEIA=PPPEIA ;+ ; Output ASCII to EIA (RS244), with conversion as required. EIA has upper ; case letters only, and not all ASCII characters are available. Change ; invalid ones to something close, or / if there isn't anything. Note that ; LF, and many other controls, do not exist, and are deleted altogether. ; ; On entry: %3-> start of buffer, ; %4 is no of bytes, ; %2-> next character space after end of buffer. ; Adjust these on exit to describe the new buffer. ; ; MODIFICATIONS RECORD ; ==================== ;- .PSECT CODE,I,RO EIATAB=76 ; EIA tab character EIACR=200 ; EIA carriage-return PARITY=100 ; Parity is bit 6 (I think) EIA:: JSR PC,CARIAG ; Put in carriage-control ; Convert buffer to EIA code. 10$: MOV %3,%1 ; Copy pointer. %1 will be input, MOV %3,%4 ; %4 will be output 20$: MOVB (%1)+,%0 ; Get character BICB #^C177,%0 ; Clear unwanted bits CMPB %0,#<' > ; Control character? BHIS 30$ ; No, branch ; Only valid control chars are CR and horiz tab. Ignore others. MOVB #EIACR,(%4)+ ; Load EIA's CR CMPB %0,#CR ; ASCII CR? BEQ 40$ ; Yes, store it MOVB #EIATAB,-(%4) ; Tab? CMPB %0,#HT ; But was it? BNE 40$ ; No, ignore any other controls INC %4 ; Yes, advance output pointer BR 40$ ; and go see if more ; Printing character. Adjust range if lower case, and convert using table. 30$: CMPB %0,#'a ; <'a'? BLO 35$ ; Yes, don't change SUB #'a-'A,%0 ; No, change lower case to upper 35$: MOVB ASCEIA-<' >(%0),(%4)+ ; Store converted character 40$: CMP %1,%2 ; Reached end of buffer? BLO 20$ ; No, go for next character MOV %3,%1 ; Reset buffer pointer MOV %4,%2 ; Correct end-of-buffer pointer SUB %3,%4 ; and count ; Buffer converted to EIA. Now set parity as required. All characters ; in the lookup table have ODD parity. 50$: CMPB FORM,#E.ODD ; Odd parity required? BEQ 70$ ; Yes, all done CMPB FORM,#E.EVEN ; No, even required? BNE 60$ ; No, branch for set or clear ; Flip bit 6 to change odd parity to even. BITB #PARITY,@%1 ; Is bit now set? BEQ 65$ ; No, go set it 55$: BICB #PARITY,@%1 ; Yes, clear bit BR 70$ ; Rejoin common code ; Not odd or even, must be set or clear. 60$: CMPB FORM,#E.CLR ; Clear required? BEQ 55$ ; Yes, go clear 65$: BISB #PARITY,@%1 ; No, must be set 70$: MOVB (%1)+,%0 ; Fetch revised char JSR PC,UPCSUM ; Update checksum CMP %1,%2 ; Reached end of buffer? BLO 50$ ; No, repeat RTS PC ; Yes, done .PSECT STATIC,D,RO,LCL ; Lookup table for ASCII-EIA conversion. All values are in odd parity. NONE=61 ; No near equivalent -- use EAI / ASCEIA: .BYTE 076 ; space -> tab .BYTE NONE ; ! .BYTE NONE ; " .BYTE NONE ; # .BYTE NONE ; $ .BYTE 013 ; % .BYTE NONE ; & .BYTE NONE ; ' .BYTE NONE ; ( .BYTE NONE ; ) .BYTE NONE ; * .BYTE 160 ; + .BYTE 073 ; , .BYTE 100 ; - .BYTE 153 ; . .BYTE 061 ; / .BYTE 040 ; 0 .BYTE 001 ; 1 .BYTE 002 ; 2 .BYTE 023 ; 3 .BYTE 004 ; 4 .BYTE 025 ; 5 .BYTE 026 ; 6 .BYTE 007 ; 7 .BYTE 010 ; 8 .BYTE 031 ; 9 .BYTE 153 ; : -> . .BYTE 073 ; ; -> , .BYTE NONE ; < .BYTE 100 ; = -> - .BYTE NONE ; > .BYTE NONE ; ? .BYTE NONE ; @ .BYTE 141 ; A .BYTE 142 ; B .BYTE 163 ; C .BYTE 144 ; D (?) .BYTE 165 ; E .BYTE 166 ; F .BYTE 147 ; G .BYTE 150 ; H .BYTE 171 ; I .BYTE 121 ; J .BYTE 122 ; K .BYTE 103 ; L .BYTE 124 ; M .BYTE 105 ; N .BYTE 106 ; O .BYTE 127 ; P .BYTE 130 ; Q .BYTE 111 ; R .BYTE 062 ; S .BYTE 043 ; T .BYTE 064 ; U .BYTE 045 ; V .BYTE 046 ; W .BYTE 067 ; X .BYTE 070 ; Y .BYTE 051 ; Z .BYTE NONE ; [ .BYTE NONE ; \ .BYTE NONE ; ] .BYTE NONE ; ^ .BYTE 100 ; _ -> - .BYTE NONE ; ` .IIF NE <.-ASCEIA>-<'`-' +1> .ERROR <.-ASCEIA>-<'`-' +1> ; BYTES MISSING IN ASCII-EIA TABLE .EVEN .END