	TITLE	RCANSI - CRT DRIVER FOR ANSI STANDARD TERMINAL
;**********************************************************************
;***    CDANSI                                                      ***
;***	COPYRIGHT (C) 1980, MICROSOFT                               ***
;***                                                                ***
;**********************************************************************

	ENTRY	$CRWID,$CRLEN,$CURON,$CUROF,$CURBK
	ENTRY	$SETCR,$ERASE,$ALARM
	ENTRY	$EOL,$HILIT,$LOLIT
	ENTRY	$CLIST,$TLIST,$FLIST
	ENTRY	$INCRT,$OUCRT

	EXT	$OUTCH,$INKEY

;****************************************************
; KEYBOARD CODE DEFINITIONS
;****************************************************
;

$CLIST:				;EDITING KEY DEFINITIONS
	DB	X'15'		;LINE DELETE (CTL-U)
	DB	X'7F'		;CHAR DELETE (DEL,RUB)
	DB	X'06'		;FORWARD SPACE (CTL-F)
	DB	X'08'		;BACK SPACE (CTL-H)
	DB	X'2B'		;PLUS SIGN
	DB	X'2D'		;MINUS SIGN
	DB	0		;END OF LIST

$TLIST:				;TERMINATOR KEY DEFINITIONS
	DB	X'02'		;BACKTAB (CTL-B)
	DB	X'1B'		;ESCAPE KEY (ESC)
	DB	X'09'		;FORWARD TAB (CTL-I)
	DB	X'0D'		;CARRIAGE RETURN
	DB	X'0A'		;LINE FEED
	DB	0		;END OF LIST

$FLIST:				;FUNCTION KEY DEFINITIONS
	DB	X'01'		;CTL-A
	DB	X'03'		;CTL-C
	DB	X'18'		;CTL-X
	DB	0

;****************************************************
; TERMINAL SCREEN DIMENSIONS
;****************************************************
;
$CRLEN:	DB	24D	;24 LINES
$CRWID:	DB	80D	;80 COLUMNS

;****************************************************
; TERMINAL OUTPUT CODES
;****************************************************
;
ESCAPE	EQU	X'1B'
BSPACE	EQU	X'08'
BELL	EQU	X'07'

;****************************************************
;	O U T P U T   F U N C T I O N S
;****************************************************
; SET CURSOR POSITION
;	[H] = ROW NUMBER
;	[L] = COLUMN NUMBER
;****************************************************
;
$SETCR:
	CALL	SETUP		;SEND ESC [
	MOV	A,H
	CALL	SEND2		;SEND LINE
	MVI	A,";"
	CALL	$OUTCH		;SEND SEPARATOR
	MOV	A,L
	CALL	SEND2		;SEND COLUMN
	MVI	A,"f"
	JMP	$OUTCH		;SEND END CODE AND RETURN

;****************************************************
; BACKSPACE CURSOR
;****************************************************
;
$CURBK:	MVI	A,BSPACE	;BACKSPACE
	JMP	$OUTCH

;****************************************************
; CURSOR ON/OFF
;****************************************************
; Anpassung sc114 - rc2014 cpm 2.2
; 12.12.2021 Kurt Pieper
;****************************************************

$CURON:	MVI	A,"h"		;RESET MODE
	JMP	CURSW
$CUROF:	MVI	A,"l"		;SET MODE
CURSW:	PUSH	PSW
       CALL    SETUP           ;SEND ESC [
        MVI     A,"?"
        CALL    $OUTCH          ;SEND
        MVI     A,"2"
        CALL    $OUTCH          ;SEND
        MVI     A,"5"           ;MODE NUMBER 5
	CALL	$OUTCH
	POP	PSW
	JMP	$OUTCH		;SEND SET/RESET

;****************************************************
; ERASE TO END OF SCREEN
;	[HL] = SEQUENTIAL CURSOR POSITION
;****************************************************
;
$ERASE:	MVI	A,"J"		;ERASE EOS CODE
ERASE:	PUSH	PSW
	CALL	SETUP		;SEND ESC [
	MVI	A,"0"
	CALL	$OUTCH		;SEND 0
	POP	PSW
	JMP	$OUTCH		;SEND EOS/EOL CODE AND RETURN

;****************************************************
; ERASE TO END OF LINE
;	[H] = CURRENT ROW NUMBER
;	[L] = CURRENT COLUMN NUMBER
;****************************************************
;
$EOL:	MVI	A,"K"		;ERASE EOL CODE
	JMP	ERASE

;****************************************************
; SOUND AUDIBLE TONE
;****************************************************
;
$ALARM:	MVI	A,BELL
	JMP	$OUTCH		;SEND BELL CODE AND RETURN

;****************************************************
; SET/RESET HIGHLIGHTED VIDEO MODE
;****************************************************
;
$HILIT:	MVI	A,"7"		;REVERSE VIDEO CODE
	JMP	LITE
$LOLIT:	MVI	A,"0"		;STOP REVERSE CODE
LITE:	PUSH	PSW
	CALL	SETUP		;SEND ESC [
	POP	PSW
	CALL	$OUTCH		;SEND SET/RESET REVERSE
	MVI	A,"m"
	JMP	$OUTCH		;SEND END CODE AND RETURN

;****************************************************

SETUP:	MVI	A,ESCAPE
	CALL	$OUTCH
	MVI	A,"["
	JMP	$OUTCH

;****************************************************

SEND2:	CALL	BTOA		;CONVERT BINARY TO 2 ASCII DIGITS
	PUSH	B		;SAVE RESULT
	MOV	A,B
	CALL	$OUTCH		;SEND HIGH-ORDER DIGIT
	POP	B
	MOV	A,C
	JMP	$OUTCH		;SEND LOW-ORDER DIGIT

;****************************************************

BTOA:	MVI	B,"0"
BTOA1:	SUI	10
	JC	BTOA2		;IF < 0
	INR	B		;INCREMENT HIGH DIGIT
	JMP	BTOA1
BTOA2:	ADI	10+"0"		;RESTORE & CONVERT LOW DIGIT
	MOV	C,A
	RET

;****************************************************
; INPUT CHARACTER FROM TERMINAL
;****************************************************
;
$INCRT:	JMP	$INKEY		;GET KEY AND RETURN

;****************************************************
; OUTPUT CHARACTER TO TERMINAL
;****************************************************
;
$OUCRT:	JMP	$OUTCH		;PUT CHARACTER AND RETURN

	END
