Compucolor.org – Virtual Media

Listing of file='DUMB.SRC;01' on disk='vmedia/terminal_em-sector.ccvf'

;	^EXP>TERM.SRC;2
;
;	1980/12/05	19:00
;
;
;	ROUTINE TO ALLOW THE COMPUCOLOR II
;	TO COMMUNICATE WITH OTHER COMPUTERS
;	USING THE INDUSTRY STANDARD OF EVEN PARITY
;	FOR FULL DUPLEX ASYNCHRONOUS COMMUNICATIONS
;
;
;	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
COMND	EQU	MFIOA+4
BAUD	EQU	MFIOA+5
EXTIN	EQU	MFIOA+1
EXTOT	EQU	MFIOA+7
MASK	EQU	MFIOA+8
SSOBE	EQU	10H
STAT5	EQU	MFIOA+3
TIME2	EQU	MFIOA+10
TIME4	EQU	MFIOA+12
TXBUF	EQU	MFIOA+6
;
;
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
COLFL	EQU	81E6H	;FLAG (FG/BG)	0=OFF	1=ON
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
READY	EQU	81FFH
NOCHA	EQU	64	;64 CHARACTERS / LINE
NOLIN	EQU	32	;32 LINES / DISPLAY
RCOMD	EQU	0017H	;BAUD	1X=08H	8X=18H
ROLFL	EQU	81DCH	;ROLL FLAG => 0= NO ROLL 1= ROLL
ROLLN	EQU	81CDH	;ROLL COUNT (0=NO ROLL)
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	0FFH	;DUPLEX FLAG (1=HALF, -1=FULL)
PARITY:	DB	0	;PARITY FLAG (-1=ODD, 0=NONE, 1=EVEN)


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,WHICH
	SHLD	INPUTV+1	;USER INPUT ROUTINE JUMP VECTOR
;
;	SET UP THE FLAGS
;
	MVI	A,31		;USER INPUT ROUTINE VECTOR
	STA	INPFL		;RS232 INPUT PORT FLAG
	STA	KBDFL
;
	XRA	A
	STA	BASFL
	STA	EXITFG		;SET NOT READY TO EXIT FLAG
	STA	READY

	LDA	RATE		;SET BAUD RATE
	OUT	BAUD
	STA	CRATE

;
;	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"
	CALL	OSTR		;DISPLAY MESSAGE

LOOP:
	LDA	READY
	CPI	50H
	JNZ	LOOP1
	XRA	A
	STA	READY
	CALL	BREAK
	JMP	LOOP

LOOP1:
	LDA	EXITFG		;USER WANTS TO EXIT IF <> 0
	CPI	0
	JZ	LOOP3
	MVI	A,0
	STA	INPFL
	STA	KBDFL
	MOV	B,A
	LHLD	FCSSP
	SPHL
	RET			;RETURN TO CALLER
;
;	RESTORE INPUT FLAG	(DESTROYED BY CURSOR ROUTINE)
;
LOOP3:
	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
	JMP	LOOP

WHICH:
	PUSH	PSW
	PUSH	D
	LXI	D,KBDFL
	CALL	CMPHD
	JZ	KEYBRD
	LXI	D,INPFL
	CALL	CMPHD
	JZ	RS232C

	POP	D
	POP	PSW
	RET
;
;	KEYBOARD INTERRUPT ROUTINE

KEYBRD:
	POP	D
	POP	PSW
	CALL	SAVE
	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
NOTEOT:
	LDA	DUPLEX
	ORA	A
	JM	FULL

	PUSH	D
	CALL	EDIT
	POP	D
FULL:
	CALL	XMIT
	RET

;	RS232C RECEIVER INTERRUPT ROUTINE

RS232C:
	POP	D
	POP	PSW
	CALL	SAVE
	CALL	EDIT
	RET
;
;	ROUTINE TO GENERATE PARITY FOR HOST COMPUTERS
;
XMIT:
	MOV	A,E
	ANI	7FH		;FORCE PARITY BIT OFF

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

	CALL	S1OUT		;TRANSMIT E ON RS232
				; OUTPUT PORT
	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
;
;
;**************************************************************
;
;	THE REST OF THESE ROUTINES HAVE BEEN COPIED FROM ROM
;
;	ROUTINE TO RING THE BELL	(FROM ROM)
;
BELL:
	MVI	A,40H
	STA	EXTBF
	OUT	EXTOT
BELL1:
	LDA	TPROG
	STA	MS150
	MVI	A,195
	OUT	TIME4
	RET
;
;	BREAK KEY PROCESSOR		(FROM ROM)
;
BREAK:
	LDA	RCOMD
	ORI	2
	OUT	COMND
	JMP	BELL1
;
;	COMPARE HL:DE			(FROM ROM)
;
CMPHD:
	MOV	A,H
	CMP	D
	RNZ
	MOV	A,L
	CMP	E
	RET
;
;	SAVE ALL REGISTERS		(FROM ROM)
;
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	(FROM ROM)
;
LO:
	CALL	SAVE		;SAVE ALL REGS
	CPI	7
	JNZ	NOBELL
	CALL	BELL
	RET
NOBELL:
	CALL	BASOUT
	RET

;
;	SEND A STRING TO THE SCREEN.	(FROM ROM)
;	BYTE VALUE OF 239 DECIMAL
;	TERMINATES THE STRING.
;	ALSO SUPPORTS REPEAT LOOPS
;	OF THE FORM:
;	...,237,N,D1,D2,...,DM,238,...
;	WHERE N IS THE REPEAT COUNT
;	FOR THE STRING OF BYTES:
;	D1,D2,...,DM
;
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		(FROM ROM)
;
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			;RETURN
;
;
;**************************************************************
;
;	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
;
;
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 '
	DB	20,'EMULATOR '
	DB	23,'VERSION '
	DB	17,'2.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