;
;	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
