;
;       DURA-SELECTRIC I/O DRIVER
;
;       4/21/79    J. A. PREST
;
;       THIS IS A SIMPLE CODE CONVERTER FOR THE DURA MACH 10
;       I/O TYPEWRITER.  THIS MACHINE IS SIMILAR TO THE
;       IBM SELECTRIC AND USES THE SAME TYPE ELEMENTS.
;       THE PROGRAM IS SET UP WITH TWO CODE TABLES ONE FOR
;       THE COURIER 12, 12-PITCH (PART #132) BALL AND ONE FOR
;       THE MANIFOLD 72, 10-PITCH (PART #019) BALL.  THE
;       COURIER CAN BE USED FOR CORRESPONDENCE AND REPORT
;       WRITING.  THE MANIFOLD BALL IS USED FOR HEX PRINTOUTS
;       SINCE THERE IS NO NEED TO SWITCH CASE WHEN GOING FROM
;       ALPHA TO NUMERIC.  THIS WILL SAVE WEAR AND TEAR ON THE
;       PRINTER.
;
STATUS: EQU     2       ;DURA STATUS PORT
SELSTA: EQU     2       ;DURA READY FLAG
SELDTA: EQU     1       ;DURA DATA PORT
UCSHFT: EQU     88H     ;SELECTRIC UP-SHIFT CODE
LCSHFT: EQU     90H     ;    "    DOWN  "    "
CASE:   EQU     0FB4FH  ;RAM FOR CASE FLAG
COURIER:   EQU  1       ;1=COURIER   0=MANIFOLD
MANIFOLD:  EQU  NOT COURIER
;
;       UNIVERSAL SELECTRIC OUTPUT
;
        ORG    0E100H  ;COURIER 12 ROM
SELCONC: MOV    A,C     ;ENTER HERE WITH DATA IN REG C
        DB     0FEH    ;DUMMY CPI TO GET AROUND NEXT BYTE
SELCONB: MOV    A,B     ;ENTER HERE WITH DATA IN REG B
SELCONA: PUSH   H       ;ENTER HERE WITH DATA IN REG A
        PUSH   B       ;SAVE HL AND BC
        CALL   SELCON  ;CONVERT AND PRINT
        POP    B
        POP    H
        RET            ;BACK WE GO
;
SELCON: CPI     ' '+1   ;SPACE IS A CONTROL CHAR
       JC      CTLCHR
       LXI     H,TABLE-20H
       ANI     7FH     ;STRIP OFF MSB
       MVI     B,0
       MOV     C,A
       DAD     B
       MOV     A,M
       ANI     0C0H    ;SAVE 2 MSB'S
       RZ              ;IF BOTH BIT 6&7 ARE 0 NO CONVERSION
       CPI     0C0H
       JZ      NOSHFT  ;PRINT IN ANY CASE
       CPI     80H
       LDA     CASE
       JNZ     UPPER   ;AN UPPER CASE CHAR
LOWER:  CPI     LCSHFT
       JZ      NOSHFT
       MVI     A,LCSHFT
LOWER2: STA     CASE
       CALL    PRINT
NOSHFT: MOV     A,M     ;GET THE CHAR BACK
       ORI     0C0H    ;SET 2 MSB = 1
PRINT:  PUSH    H
       PUSH    PSW
PRINT4: IN      STATUS
       ANI     SELSTA
       JZ      PRINT4
PRINT6: POP     PSW
       OUT     SELDTA
       POP     H
       RET
;
CTLCHR: LXI     H,FNTABL-1
CTLCH2: INX     H
       CMP     M
       INX     H
       RC
       JNZ     CTLCH2
       MOV     A,M
       JMP     PRINT
;
UPPER:  CPI     UCSHFT
       JZ      NOSHFT
       MVI     A,UCSHFT
       JMP     LOWER2
;
;       FUNCTION TABLE
;
FNTABL: DB      9,81H     ;TAB
       DB      0DH,82H   ;RETURN
       DB      1AH,0A0H  ;BACKSPACE
       DB      1CH,88H   ;SHIFT UP
       DB      1DH,90H   ;SHIFT DOWN
       DB      20H,84H   ;SPACE
       DB      0FFH      ;END OF TABLE
;
;       LOOK-UP TABLES FOR TYPE ELEMENTS
;       BIT 6&7 ARE USED AS FLAGS:
;
;       BIT 7     BIT 6      CHARACTERISTICS
;         0        0         NO CONVERSION
;         0        1         UPPER CASE
;         1        0         LOWER CASE
;         1        1         PRINTS IN EITHER CASE
;
       IF      COURIER
;
;       COURIER 12 TYPE ELEMENT
;       UPPER AND LOWER CASE ALPHA, NUMERALS AND MOST
;       PUNCTUATION MARKS.  BRACKETS AND BRACES CONVERT
;       TO ( AND ).
;
TABLE:  DB      4,7FH,55H,7EH        ;SPACE EX.PT   "     #
       DB      79H,75H,7DH,95H      ;  $     %     &     '
       DB      70H,71H,7CH,46H      ;  (     )     *     +
       DB      0CCH,80H,0D6H,89H    ;  ,     -     .     /
       DB      0B1H,0BFH,0B6H,0BEH  ;  0     1     2     3
       DB      0B9H,0B5H,0B4H,0BDH  ;  4     5     6     7
       DB      0BCH,0B0H,4DH,8DH    ;  8     9     :     ;
       DB      70H,86H,71H,49H      ;  (     =     )     ?
       DB      76H,5CH,60H,6CH      ;  @     A     B     C
       DB      6DH,65H,4EH,4FH      ;  D     E     F     G
       DB      61H,54H,47H,64H      ;  H     I     J     K
       DB      69H,5FH,66H,59H      ;  L     M     N     O
       DB      45H,44H,5DH,51H      ;  P     Q     R     S
       DB      67H,6EH,5EH,50H      ;  T     U     V     W
       DB      6FH,41H,77H,70H      ;  X     Y     Z     (
       DB      89H,71H,97H,40H      ;  /     )    1/2    US
       DB      95H,9CH,0A0H,0ACH    ;  '     A     B     C
       DB      0ADH,0A5H,8EH,8FH    ;  D     E     F     G
       DB      0A1H,94H,87H,0A4H    ;  H     I     J     K
       DB      0A9H,9FH,0A6H,99H    ;  L     M     N     O
       DB      85H,84H,9DH,91H      ;  P     Q     R     S
       DB      0A7H,0AEH,9EH,90H    ;  T     U     V     W
       DB      0AFH,81H,0B7H,70H    ;  X     Y     Z     (
       DB      7FH,71H,57H,0        ;EX.PT   )    1/4    NC
       ENDIF
;
;
       IF MANIFOLD
;
;       MANIFOLD 72 TYPE ELEMENT
;       UPPER CASE ALPHA, NUMERALS, AND MOST PUNCTUATION
;
TABLE:  DB      0,97H,55H,7EH        ;SPACE EX.PT   "     #
       DB      79H,75H,7DH,95H      ;  $     %     &     '
       DB      70H,71H,7CH,46H      ;  (     )     *     +
       DB      0CCH,80H,0D6H,89H    ;  ,     -     .     /
       DB      0B1H,0BFH,0B6H,0BEH  ;  0     1     2     3
       DB      0B9H,0B5H,0B4H,0BDH  ;  4     5     6     7
       DB      0BCH,0B0H,4DH,8DH    ;  8     9     :     ;
       DB      70H,86H,71H,49H      ;  (     =     )     ?
       DB      76H,0DCH,0E0H,0ECH   ;  @     A     B     C
       DB      0EDH,0E5H,0CEH,0CFH  ;  D     E     F     G
       DB      0E1H,0D4H,0C7H,0E4H  ;  H     I     J     K
       DB      0E9H,0DFH,0E6H,0D9H  ;  L     M     N     O
       DB      0C5H,0C4H,0DDH,0D1H  ;  P     Q     R     S
       DB      0E7H,0EEH,0DEH,0D0H  ;  T     U     V     W
       DB      0EFH,0C1H,0F7H,70H   ;  X     Y     Z     (
       DB      89H,71H,57H,40H      ;  /     )    DEG    US
       DB      95H,0DCH,0E0H,0ECH   ;  '     A     B     C
       DB      0EDH,0E5H,0CEH,0CFH  ;  D     E     F     G
       DB      0E1H,0D4H,0C7H,0E4H  ;  H     I     J     K
       DB      0E9H,0DFH,0E6H,0D9H  ;  L     M     N     O
       DB      0C5H,0C4H,0DDH,0D1H  ;  P     Q     R     S
       DB      0E7H,0EEH,0DEH,0D0H  ;  T     U     V     W
       DB      0EFH,0C1H,0F7H,70H   ;  X     Y     Z     (
       DB      97H,71H,7FH,0        ;EX.PT   )     +-    NC
       ENDIF
       END     START