Compucolor.org – Virtual Media

Listing of file='SMART.SRC;0C' on disk='vmedia/terminal_em-sector.ccvf'

;	^EXP>SMART.SRC;2
;
;	1980/12/07	19:00
;
;
;	ROUTINE TO ALLOW THE COMPUCOLOR II
;	TO COMMUNICATE WITH OTHER COMPUTERS
;
;	NOTE:	THE FOLLOWING EXCEPTIONS TO
;		STANDARD COMPUCOLOR AND ASCII
;		USAGE OF CONTROL CHARACTERS
;
;		SEE WHERE TO GO TABLE FOR MORE
;		INFORMATION ON DISCREPANCIES
;
;		CONTROL D ->	HOME CURSOR
;		CONTROL H ->	CURSOR LEFT
;
;
MFIOA	EQU	0
EXTIN	EQU	MFIOA+1
STAT5	EQU	MFIOA+3
COMND	EQU	MFIOA+4
BAUD	EQU	MFIOA+5
TXBUF	EQU	MFIOA+6
EXTOT	EQU	MFIOA+7
MASK	EQU	MFIOA+8
TIME2	EQU	MFIOA+10
TIME3	EQU	MFIOA+11
TIME4	EQU	MFIOA+12
SSOBE	EQU	10H
;
;
RST1J	EQU	81C8H	;TIMER #2 JUMP VECTOR
BASOUT	EQU	0033H	;BASIC OUTPUT ROUTINE
BFILL	EQU	81DCH	;BLIND FILL (+0=A7 BIT, +1=CCI)
BHLAD	EQU	81D4H	;BLIND CURSOR HL ADDRESS
CMASK	EQU	81E0H
CRATE	EQU	81E2H	;CURRENT BAUD RATE
ESCUSE	EQU	33215	;ESCAPE USER JUMP VECTOR
EXTBF	EQU	81D6H	;EXTERNAL OUTPUT PORT BUFFER
INPCRT	EQU	81C5H	;FREE INPUT TABLE JUMP
INPFL	EQU	33251	;RS232 INPUT PORT FLAG
INPUTV	EQU	33221	;USER INPUT ROUTINE JUMP VECTOR
JUMP	EQU	81E7H	;JUMP USED FOR CURSOR POSITIONING
			; LEFT,RIGHT,UP,DOWN
KBDFL	EQU	33247	;KEYBOARD INPUT FLAG
BASFL	EQU	81F1H
LOFL	EQU	81F9H	;SYSTEM OUTPUT FLAG
MS150	EQU	81FDH	;150 MILLISECOND TIMER COUNTER
RCOMD	EQU	0017H	;BAUD	1X=08H	8X=18H
TEMP0	EQU	81F2H	;TEMPORARY LOCATION
TPROG	EQU	001BH	;150MS
X80	EQU	7000H	;START OF DISPLAY MEMORY SLOW RAM
;
;
JPOOPC	EQU	0E2H	;JPO OPCODE

JMPOPC	EQU	0C3H	;JMP OPCODE

JPEOPC	EQU	0EAH	;JPE OPCODE
;
;	LEAVE ROOM FOR BASIC DRIVER
;
;	NOTE:	THE STACK GROWS DOWNWARD
;		FROM HERE TOWARDS BASIC
;
	ORG	09000H
;
;	USER-DEFINED PARAMETERS
;
RATE:	DB	84H	;BAUD RATE
DUPLEX:	DB	1	;DUPLEX FLAG (1=HALF, -1=FULL)
PARITY:	DB	0	;PARITY FLAG (-1=ODD, 0=NONE, 1=EVEN)
REPEAT:	DB	1	;AUTO-REPEAT FLAG (0=OFF, 1=ON)

INIT:
	DI
	LXI	H,0		;SAVE FCS STACK POINTER
	DAD	SP
	SHLD	FCSSP
	LXI	SP,STACK	;SETUP STACK
;
;	SET UP THE JUMP VECTORS
;
	MVI	A,JMPOPC	;JMP OPCODE
	STA	ESCUSE		;ESCAPE USER JUMP VECTOR
	LXI	H,INIT		;INITIALIZATION ROUTINE
	SHLD	ESCUSE+1	;ESCAPE USER JUMP VECTOR
	STA	INPUTV		;USER INPUT ROUTINE JUMP VECTOR
	LXI	H,RS232C
	SHLD	INPUTV+1	;USER INPUT ROUTINE JUMP VECTOR
	LDA	RST1J		;SAVE TIMER #2 INTERRUPT VECTOR
	STA	TMPVEC
	LHLD	RST1J+1
	SHLD	TMPVEC+1
	MVI	A,JMPOPC	;   AND SET UP NEW ONE
	STA	RST1J
	LXI	H,TIM2X
	SHLD	RST1J+1
;
;	SET UP THE FLAGS
;
	MVI	A,31	;USER INPUT ROUTINE VECTOR
	STA	INPFL	;RS232 INPUT PORT FLAG
	MVI	A,12	;SET FCS KEYBOARD ROUTINE
	STA	KBDFL	;   TO DUMP
;
	XRA	A
	STA	BASFL
	STA	EXITFG		;SET NOT READY TO EXIT FLAG
	STA	READY

	LDA	RATE	;SET BAUD RATE
	OUT	BAUD
	STA	CRATE

	MVI	A,0D7H	;NOTE THE INTERRUPT MASK
	OUT	MASK
	STA	CMASK
;
;	SETUP THE PARITY OVERLAYS
;
	LDA	PARITY
	ORA	A
	JNZ	INIT10
	MVI	A,JMPOPC
	JMP	FIXIT
INIT10:	JP	INIT20
	MVI	A,JPOOPC
	JMP	FIXIT
INIT20:	MVI	A,JPEOPC

FIXIT:
	STA	PTYSET
	STA	PTYCHK

	EI

	LXI	H,PROMPT	;"TERMINAL EMULATOR" MESSAGE
	CALL	OSTR

	MVI	A,255	;START THE KEYBOARD SCANNER
	OUT	TIME2

LOOP:
	LDA	EXITFG		;USER WANTS TO EXIT IF <> 0
	CPI	0
	JZ	LOOP1
	XRA	A
	STA	INPFL
	STA	KBDFL
	MVI	A,0DFH	;RESTART FCS KEYBOARD SCANNER
	STA	CMASK
	OUT	MASK
	MVI	A,255
	OUT	TIME3
	XRA	A
	MOV	B,A
	LHLD	FCSSP
	SPHL
	RET		;RETURN TO CALLER
;
;	RESTORE INPUT FLAG (DESTROYED BY CURSOR ROUTINE)
;
LOOP1:
	LDA	INPFL	;GET CURRENT INPUT FLAG
	CPI	0	;SYSTEM DISPLAY ROUTINE
	JNZ	LOOP	;JUMP IF NOT EQUAL
	MVI	A,31	;USER INPUT ROUTINE VECTOR
	STA	INPFL	;RS232 INPUT PORT FLAG
	STA	KBDFL
	MVI	A,0D7H
	OUT	MASK
	STA	CMASK
	JMP	LOOP

;..............................................................
;
;	KEYBOARD INTERRUPT ROUTINE

KEYBRD:
	MOV	A,E
	CPI	1
	JNZ	CONTIN
	STA	EXITFG
	RET
CONTIN:
	CPI	26
	JNZ	NOTBS
	MVI	E,8
NOTBS:
	CPI	8
	JNZ	NOTEOT
	MVI	E,4
;
;	GENERATE PARITY
;
NOTEOT:
	MOV	A,E
	ANI	7FH	;FORCE PARITY BIT OFF

PTYSET:
	DB	JPEOPC	;THIS INSTRUCTION IS
	DW	PAROK	;   OVERLAID TO RUN OTHER
			;   PARITY OPTIONS
	ORI	80H	;SET PARITY BIT ON
PAROK:
	MOV	E,A	;MOVE CHARACTER TO REGISTER E
			;   FOR S1OUT ROUTINE

	LDA	DUPLEX	;CHECK IF ECHO TO SCREEN REQD
	ORA	A
	JM	FULL

	PUSH	D
	CALL	EDIT	;   ECHO
	POP	D
FULL:
	CALL	S1OUT	;TRANSMIT ON RS232
	RET

;..............................................................
;
;	RS232C RECEIVER INTERRUPT ROUTINE
;
RS232C:
	CALL	EDIT
	RET

;..............................................................
;
;	ROUTINE TO EDIT INPUT FROM HOST
;
EDIT:
	MOV	A,E
	ANA	A		;SET PARITY BIT
PTYCHK:	DB	JPEOPC		;CHECK PARITY
	DW	INPOK		;JUMP IF INPUT PARITY OK
	MVI	A,03FH		;"?"
INPOK:
	ANI	7FH
	MOV	E,A		;SAVE CHARACTER WITHOUT PARITY
	CPI	7FH
	JZ	IGNORE		;IGNORE DEL
	CPI	20H
	JNC	ACCEPT		;ACCEPT NON-CONTROL CHARACTERS
	LXI	H,WTGTAB	;WHERE TO GO TABLE BASE ADDRESS
	RLC			;MULTIPLY CHARACTER BY 2
	ADD	L		;LOW ORDER BYTE OF ADDRESS
	MOV	L,A		;UPDATE LOW ORDER BYTE OF HL
	MOV	A,H		;HIGH ORDER BYTE OF ADDRESS
	ACI	0		;ADD IN POSSIBLE CARRY
	MOV	H,A		;UPDATE HIGH ORDER BYTE OF HL
;
;	HL -> WTG FOR THIS CHARACTER
;
	MOV	A,M		;LOW ORDER BYTE OF WTG
	INX	H		;NEXT BYTE OF WTG
	MOV	H,M		;HIGH ORDER BYTE OF WTG
	MOV	L,A		;LOW ORDER BYTE OF WTG
	MOV	A,E		;RESTORE CHARACTER
	PCHL			;GO TO WTG LOCATION
ACCEPT:
	MOV	E,A
	CALL	BASOUT		;ROM ROUTINE TO DISPLAY
				; CHARACTER IN E
	RET
BEL:
	CALL	BELL		;RING THE BELL
IGNORE:
	RET
;
;	BACK SPACE = LEFT CURSOR
;
BS:
	MVI	A,26		;LEFT CURSOR
	JMP	ACCEPT		;TAKE LEFT CURSOR
;
;	CONTROL E = HOME CURSOR
;
RVHOME:	MVI	A,8		;HOME CURSOR
	JMP	ACCEPT		;TAKE HOME CURSOR
;
;
;	WHERE TO GO TABLE
;
WTGTAB:
;			DEC	ASCII	CCII
;
	DW	IGNORE	; 0	NUL @	NULL
	DW	IGNORE	; 1	SOH A	AUTO
	DW	IGNORE	; 2	STX B	PLOT
	DW	ACCEPT	; 3	ETX C	CURSOR X Y
	DW	RVHOME	; 4	EOT D	[ HOME CURSOR ]
	DW	IGNORE	; 5	WRU E
	DW	IGNORE	; 6	ACK F	CCI FOLLOWS
	DW	BEL	; 7	BEL G	BELL
	DW	BS	; 8	BS  H	[ BACK SPACE ]
	DW	ACCEPT	; 9	HT  I	TAB
	DW	ACCEPT	;10	LF  J	LINE FEED
	DW	ACCEPT	;11	VT  K	ERASE LINE
	DW	ACCEPT	;12	FF  L	FORM FEED
	DW	ACCEPT	;13	CR  M	RETURN
	DW	ACCEPT	;14	SO  N	A7 ON
	DW	ACCEPT	;15	SI  O	A7 OFF
	DW	ACCEPT	;16	DLE P	BLACK
	DW	ACCEPT	;17	DC1 Q	RED
	DW	ACCEPT	;18	DC2 R	GREEN
	DW	ACCEPT	;19	DC3 S	YELLOW
	DW	ACCEPT	;20	DC4 T	BLUE
	DW	ACCEPT	;21	NAK U	MAGENTA
	DW	ACCEPT	;22	SYN V	CYAN
	DW	ACCEPT	;23	ETB W	WHITE
	DW	IGNORE	;24	CAN X	XMIT
	DW	ACCEPT	;25	EM  Y	CURSOR RIGHT
	DW	ACCEPT	;26	SUB Z	CURSOR LEFT
	DW	IGNORE	;27	ESC [	ESCAPE
	DW	ACCEPT	;28	FS  \	CURSOR UP
	DW	ACCEPT	;29	GS  ]	FG ON
	DW	ACCEPT	;30	RS  ^	FG OFF
	DW	ACCEPT	;31	US  _	BLINK

;**************************************************************
;
;	THE REST OF THESE ROUTINES HAVE BEEN COPIED FROM ROM.
;	REFER TO FCS LISTINGS FOR DOCUMENTATION.
;
;	ROUTINE TO RING THE BELL - MODIFIED
;
BELL:
	MVI	A,40H
	STA	EXTBF
	OUT	EXTOT
BELL1:
	LDA	TPROG
	STA	MS150
	MVI	A,195
	OUT	TIME4
	RET
;
;	BREAK KEY PROCESSOR - MODIFIED
;
BREAK:
	LDA	RCOMD
	ORI	2
	OUT	COMND
	JMP	BELL1
;
;	COMPARE HL:DE
;
CMPHD:
	MOV	A,H
	CMP	D
	RNZ
	MOV	A,L
	CMP	E
	RET
;
;	SAVE ALL REGISTERS
;
SAVE:
	XTHL		;SAVE HL WHILE LOADING ADDRESS
	PUSH	D	; TO RESUME EXECUTION AT
	PUSH	B	;THEN SAVE ALL REGISTERS
	PUSH	PSW	; AND STATUS
	CALL	JMPHL	;PUSH $+3 AS RETURN ADDRESS
	POP	PSW	; AND RESUME EXECUTION OF CALLER
	POP	B	;THEN RESTORE ALL REGISTERS
	POP	D	; AND STATUS
	POP	H
	EI		;REENABLE INTERRUPTS
	RET		; AND EXIT FROM INTERRUPT

JMPHL:
	PCHL		; JUMP THRU HERE TO ROUTINE

;
;	SEND A BYTE TO THE SCREEN - MODIFIED
;
LO:
	CALL	SAVE	;SAVE ALL REGS
	CPI	7	;BELL IS SPECIAL
	JNZ	NOBELL
	CALL	BELL
	RET
NOBELL:
	CALL	BASOUT
	RET

;
;	OUTPUT A CHARACTER STRING
;
OSTR:
	MOV	A,M	;GET NEXT BYTE
	INX	H
	CPI	237	;SPECIAL CODE ?
	JC	OSTR1	;A<237: GO SEND BYTE
	JZ	OSTR2	;A=237: START REPEAT LOOP
	CPI	239	;SPECIAL CODE ?
	RZ		;A=239: END: RETURN
	JC	OSTR4	;A=238: END OF REPEAT LOOP
OSTR1:	CALL	LO	;SEND BYTE
	JMP	OSTR	;GET NEXT BYTE
OSTR2:	MOV	D,M	;GET REPEAT COUNT
	INX	H
OSTR3:	PUSH	H	;SAVE START POINTER
	JMP	OSTR	;GET NEXT BYTE
OSTR4:	DCR	D	;FINISHED REPEAT ?
	JZ	OSTR5	;YES!
	POP	H	;RESTORE START POINTER
	JMP	OSTR3	;REPEAT AGAIN!
OSTR5:	POP	PSW	;CLEAN THE STACK
	JMP	OSTR	;GET NEXT BYTE

;
;	 TRANSMIT E ON RS232
;
S1OUT:
	IN	STAT5	;GET STATUS
	ANI	SSOBE	;CAN WE SEND ?
	JZ	S1OUT	;NO: WAIT!
	IN	EXTIN	;IS CLEAR TO SEND HIGH ?
	ANI	80H
	JZ	S1OUT
	MOV	A,E	;GET CHARACTER TO SEND
	OUT	TXBUF	;SEND THE CHARACTER
	RET

;
;	KEYBOARD SCANNER - MODIFIED
;
KEDEL	EQU	255
CHTIM	EQU	20	;NOTE: 4 TIMES THE NORMAL REPEAT TIME

TIM2X:
	CALL	SAVE
	LDA	EXITFG
	ORA	A
	JZ	SCAN
	LDA	TMPVEC	;RESTORE TIMER #2 INTERRUPT VECTOR
	STA	RST1J
	LHLD	TMPVEC+1
	SHLD	RST1J+1
	RET		;RETURN WITHOUT RESTARTING TIMER
SCAN:
	CALL	KEYBD
	JNC	KEYCO
	JZ	BREAK
	RET

TMPVEC:	DS	3

KEYCO:
	MOV	E,A
	MVI	A,0D7H
	OUT	MASK
	STA	CMASK
	LXI	H,KBDFL
	LDA	EXTBF
	OUT	EXTOT
	XRA	A
	JMP	KEYBRD

KEYBD:
	MVI	A,KEDEL
	OUT	TIME2	;USES TIMER #2 - NOT #3
Q01:	LXI	B,0FFFH
	MOV	E,C
Q02:	MOV	A,B
	OUT	EXTOT
	IN	EXTIN
	INR	A
	JZ	Q06
	INR	E
	JNZ	ROT
Q03:	DCR	A
	STC
Q04:	INR	E
	RAR
	JC	Q04
	PUSH	PSW
	MOV	A,E
	ADD	A
	ADD	A
	ADD	A
	ADD	A
	ORA	B
	XRI	0FH
	INR	C
	JZ	Q05
	MOV	E,A
	POP	PSW
	INR	A
	JNZ	ROT
	DCR	C
	JMP	Q06
Q05:	MOV	C,A
	POP	PSW
	INR	A
	JNZ	Q03
	MVI	E,-1
Q06:	DCR	B
	JP	Q02
	INR	C
	JNZ	Q08
Q07:	XRA	A
	STA	LKC
	STA	NKC
ROT:	LDA	EXTBF
	OUT	EXTOT
	ORI	1
	STC
	RET

Q08:	DCR	C
	INR	E
	JNZ	Q09
	XRA	A
	STA	NKC
	LDA	LKC
	CMP	C
	JNZ	Q10
;
;	ADDITIONAL AUTO-REPEAT CODE
;
	LDA	REPEAT
	ORA	A
	JNZ	REP
;
;	ORIGINAL COMPUCOLOR CODE
;
	MVI	A,80H
	OUT	EXTOT
	IN	EXTIN
	ANI	40H
	JNZ	ROT
;
REP:	LXI	H,SEC15
	DCR	M
	JNZ	ROT
	MVI	A,CHTIM/4	;ADDED THIS
	JMP	Q11+2		;WAS ... JMP Q11
Q09:	DCR	E
	LDA	LKC
	CALL	Q20
	JZ	ROT
	LDA	NKC
	CALL	Q20
	JNZ	Q07
Q10:	MOV	A,C
	STA	LKC
Q11:	MVI	A,CHTIM		;WAS ... LDA CHTIM
	NOP			;
	STA	SEC15
	MOV	A,C
	CPI	50H
	JC	Q12
	CPI	56H
	JC	Q16
Q12:	RRC
	RRC
	RRC
	RRC
	ANI	7
	MOV	E,A
	MVI	A,80H
	OUT	EXTOT
	IN	EXTIN
	ANI	30H
	RLC
	RLC
	ORA	E
	RLC
	RLC
	MOV	E,A
	MVI	D,0
	LXI	H,KTAB-4
	DAD	D
	MVI	A,0FH
	ANA	C
	ORA	M
	MOV	E,A
	MOV	A,C
	CPI	7CH
	JNC	Q13
	SUI	1CH
	CPI	20H-1CH
	JNC	Q14
Q13:	MVI	A,10H
	XRA	E
	MOV	E,A
Q14:	IN	EXTIN
	ANA	A
	JP	Q15
	MOV	A,E
	SUI	'A'
	CPI	'Z'+20H+1-'A'
	JNC	Q15
	SUI	'Z'+1-'A'
	CPI	'A'+20H-'Z'-1
	JC	Q15
	MVI	A,20H
	XRA	E
	MOV	E,A
Q15:	CALL	ROT
	MVI	A,80H
	STA	READY
	ORA	A
	MOV	A,E
	STA	KBCHA
	RET

Q16:	STA	READY
	SUI	50H
	STC
	RZ
	MVI	E,127
	CPI	4
	JZ	Q15
	MOV	E,A
	MVI	A,6
	SUB	E
	MOV	E,A
	JMP	Q15

Q20:	CMP	C
	JZ	Q21
	MOV	L,C
	MOV	C,E
	MOV	E,L
	CMP	C
	RNZ
Q21:	MOV	A,E
	STA	NKC
	RET

LKC:	DB	0
NKC:	DB	0
SEC15:	DB	0
READY:	DB	0
KBCHA:	DB	0

KTAB:	DB	0A0H
	DB	020H
	DB	0B0H
	DB	030H
	DB	080H
	DB	060H
	DB	000H
	DB	040H
	DB	090H
	DB	070H
	DB	010H
	DB	050H
	DB	0E0H
	DB	0D0H
	DB	0C0H
	DB	0F0H
	DB	080H
	DB	080H
	DB	000H
	DB	000H
	DB	090H
	DB	090H
	DB	010H
	DB	010H
	DB	020H
	DB	020H
	DB	020H
	DB	020H

;
;**************************************************************
;

EXITFG:	DB	0	;EXIT IF <> 0

FCSSP:	DW	0	;THE STACK POINTER USED BY THE CALLER

PROMPT:	DB	6,2,11,29
	DB	19,'TERMINAL EMULATOR'
	DB	22,'VERSION '
	DB	17,'4.0',13,10
	DB	23,'PRESS "AUTO" TO EXIT FROM THIS PROGRAM'
	DB	7,18,13,10,239

	DS	200
STACK:	DS	2

	END	INIT