		NAME	VDB
;
;
; 		VIDEO DISPLAY BOARD CONTROL SOFTWARE
;		VERSION 1.6		2/14/79
;
;		VERSION 1.6 ADDED THE CURSOR HOME CONTROL
;		FUNCTION
;
;
REG0	EQU	80H		;HORIZONTAL LINE COUNT
REG1	EQU	81H		;MODE/HSYNC WIDTH/HSYNC DELAY
REG2	EQU	82H		;SCANS PER DATA ROW/CHARS PER DATA ROW
REG3	EQU	83H		;SKEW BITS/DATA ROWS PER FRAME
REG4	EQU	84H		;SCAN LINES PER FRAME
REG5	EQU	85H		;VERTICAL DATA START
REG6	EQU	86H		;LAST DISPLAYED DATA ROW
RESET	EQU	8AH		;RESET 5027
SCRLL	EQU	8BH		;UP SCROLL INCREMENT ADDR OF FIRST DISP ROW
WCCHAR	EQU	8CH		;WRITE CURSOR CHARACTER/COLUMN ADDRESS
WCLINE	EQU	8DH		;WRITE CURSOR LINE ADDRESS
STIME	EQU	8EH		;START TIMING CHAIN
;
VBCTL	EQU	10H
VDBIN	EQU	20H		;INPUT PORT FOR CHARACTERS FROM SYSTEM
KBSTAT	EQU 30H		;KEYBOARD STATUS PORT
;
ROWS	EQU	24		;NUMBER OF ROWS
COLUMN	EQU	80		;NUMBER OF COLUMNS
STACK	EQU	2000H		;STACK TOP
SCREEN	EQU	1000H		;START OF DISPLAY MEMORY
;
SPACE	EQU	20H		;ASCII BLANK
;
;
;	POWER UP INITIALISATION
;
	ORG	0
START:
	LD	SP,STACK
	IN	A,(VDBIN)	;CLEAR INTERUPT FLIP FLOP
	IN	A,(KBSTAT)	;CLEAR KEYBOARD READY
	EXX
	LD	L,0
	EXX
	CALL	INIT
	CALL	CLEAR
	CALL	FAST
	CALL	STDN
	LD	HL,SCREEN	;DISPLAY MEMORY ADDRESS
	IM	1
	SCF
	EI
	HALT
;
;
;	START OF INTERUPT DRIVEN PROGRAM
;
;
	ORG	0038H
;
	RET	NC			; RETURN ON NO CARRY
	POP	IY
	EXX
	BIT	7,L
	EXX
	IN	A,(VDBIN)	; INPUT CHARACTER
	RES	7,A
	JR	Z,NEXT
	OR	080H
NEXT:
	BIT	6,A			; TEST FOR CONTROL CHARACTER ?
	JP	NZ,TDIS
	BIT	5,A
	JP	Z,CTR
TDIS:
	CALL	DELAY
	CALL	PROTECT
;
;
;	DISPLAY A CHARACTER
;
;
DISPLAY:
	LD	(HL),A			;MOVE CHAR TO DISPLAY MEMORY
NODIS:
	INC	D
CHECK:
	LD	A,COLUMN
	CP	D			;END OF LINE ?
	JP	Z,LFCR
	INC	HL
	LD	A,D
	OUT	(WCCHAR),A	;MOVE CURSOR TO NEXT SPACE
	SCF
	EI
	HALT
;
;
;	BRANCH ON CONTROL CHARCTERS
;
;
CTR:
	LD	IY,HLT
	PUSH	IY		;PUSH RETURN ADDRESS
	RES	7,A
	CP	0AH			;LINE FEED
	JP	Z,LF
	CP	0DH			;CARRIAGE RETURN
	JP	Z,CR
	CP	01H			;SCROLL UP
	JP	Z,STDN
	CP	02H			;SCROLL DOWN
	JP	Z,STUP
	CP	03H			;SPECIAL CHARACTER
	JP	Z,SPCH
	CP	04H			;SET CONTROL BIT #1
	JP	Z,SC1
	CP	05H			;RESET CONTROL BIT #1
	JP	Z,RC1
	CP	06H			;SET CONTROL BIT #2
	JP	Z,SC2
	CP	07H			;RESET CONTROL BIT #2
	JP	Z,RC2
	CP	08H			;BACKSPACE
	JP	Z,CTRH
	CP	09H			;TAB MODULO 8
	JP	Z,TAB
	CP	0BH			;CURSOR UP
	JP	Z,UPLINE
	CP	0CH			;CURSOR RIGHT
	JP	Z,RIGHT
	CP	0EH			;SLOW DISPLAY SPEED
	JP	Z,SLOW
	CP	0FH			;MEDIUM DISPLAY SPEED
	JP	Z,MED
	CP	10H			;FAST DISPLAY SPEED
	JP	Z,FAST
	CP	11H			;STOPS SPECIAL FIELDS
	JP	Z,QUIT
	CP	12H			;STARTS REVERSE FIELD
	JP	Z,RVS
	CP	13H			;STARTS REVERSE BLINKING FIELD
	JP	Z,RVB
	CP	14H			;STARTS BLINKING FIELD
	JP	Z,BLINK
	CP	15H			;STARTS UNDERLINE FIELD
	JP	Z,UND
	CP	16H			;STARTS UNDERLINE BLINKING FIELD
	JP	Z,UNB
	CP	17H			;STARTS NO ENHANSMENT OR PROTECTION FIELD
	JP	Z,NFD
	CP	18H			;ENTER PROTECTION MODE
	JP	Z,PFD
	CP	19H			;EXIT PROTECTION MODE
	JP	Z,UNPFD
	CP	01AH		;CLEAR SCREEN
	JP	Z,CLEAR
	CP	01BH		;ESCAPE=XY DIRECT CURSOR ADDRESS
	JP	Z,ESC
	CP	01EH		;HOME CURSOR
	JP	Z,HOME
	POP	IY
	JP	DISPLAY
;
;	INITIALISE CRT 5027 VIDEO CHIP
;
INIT:
	OUT	(STIME),A		;Start Timing Chain
	OUT	(RESET),A		;Reset Timing Chain
	LD	A,065H			;101 Horizontal Lines
	OUT	(REG0),A		;Set Control Register 0 Horizontal Line Count
	LD	A,04BH			;Non-Interlaced, Sync=9 Char Times, Delay 3 Char Times
	OUT	(REG1),A		;Set Control Register 1 Mode & HSYNC
	LD	A,04DH			;9 Scans/Row, 80 Chars/Row
	OUT	(REG2),A		;Set Control Register 2 Scan & Data Rows
	LD	A,0D7H			;2 Char Sync Delay, 2 Char Cursor Delay
	OUT	(REG3),A		;Set Control Register 3 Skew and Frame Rows
	LD	A,03H			;262 Scans/Frame 60HZ=03H, 50HZ=1DH
	OUT	(REG4),A		;Set Control Register 4 Scan Lines / Frame
	LD	A,0BH			;Vertical Data Delay after Sync LE 60HZ=0BH, 50HZ=25H (14H in ROM)
	OUT	(REG5),A		;Set Control Register 5 Vertical Data Start
	LD	A,017H			;Last Displayed Data Row (23)
	LD	B,A
	OUT	(REG6),A		;Set Control Register 6 Last Displayed Data Row
	LD	A,0
	OUT	(WCCHAR),A		;Set Control Register 7 Cursor Column Address
	OUT	(WCLINE),A		;Set Control Register 8 Cursor Row Address
	OUT	(STIME),A
	LD	DE,0
	RET
;
;	NEW LINE
;
LFCR:
	CALL	LF
	CALL	CR
;
;
;
HLT:
	SCF			;RETURN FROM CONTROLS
	EI
	HALT
;
;	LINE FEED
;
LF:
	EXX
	BIT	1,L		;TEST FOR SCROLL DIRECTION
	EXX
	JP	Z,LFDN
;
;
;	Line Feed goes up
;
;
LFUP:
	LD	A,E
	DEC	A
	CP	0FFH
	JP	NZ,LFCS
	LD	A,23
	
LFCS:
	CP	B
	LD	E,A
	CALL	Z,SCRDN
	JP	LFRT
	
LFDN:
	LD	A,E
	CP	B
	CALL	Z,SCRUP
	INC	A
	CP	24
	JP	NZ,LFRT
	LD	A,0
;
;
;	In Scroll Down Mode Line Feel moves cursor up
;
;
LFRT:
	LD	E,A		;REG E HAS LINE NUMBER
	OUT	(WCLINE),A
	LD	L,D
	LD	H,E
	RL	L
	RR	H
	RR	L
	SET	4,H
	RET
;
;	CARRIAGE RETURN
;
CR:
	LD	D,0
	LD	A,D
	OUT	(WCCHAR),A
	LD	A,080H
	AND	L
	LD	L,A
	RET
;
;	BACKSPACE (CURSOR LEFT)
;
CTRH:
	LD	A,0
	CP	D
	RET	Z
	DEC	D
	DEC	HL
	LD	A,D
	OUT	(WCCHAR),A
	RET
;
;	SCROLL SCREEN UP
;
SCRL:
	CALL	SCROLL
	JP	PLACE
;
SCROLL:
	EXX
	BIT	1,L
	EXX
	JP	Z,SCRUP
;
;
;	SCROLL DOWN MODE
;
;
SCRDN:
	DEC	B
	LD	A,B
	CP	0FFH
	JP	NZ,SCRD2
	LD	B,23
;
SCRD2:
	LD	L,0
	LD	H,B
	RR	H
	RR	L
	SET	4,H
	LD	C,SPACE
	LD	A,80H
	ADD	A,L
SCRDLP:
	LD	(HL),C
	INC	HL
	CP	L
	JP	NZ,SCRDLP
	LD	A,B
	OUT	(REG6),A
	LD	A,E
	RET
;
;
;	SCROLL UP MODE
;
;
SCRUP:
	INC	B
	LD	A,B
	CP	24
	JP	NZ,SCR2
	LD	B,0
;
SCR2:
	LD	L,0
	LD	H,B
	RR	H
	RR	L
	SET	4,H
	LD	C,SPACE
	LD	A,COLUMN
	ADD	A,L
SCRLP:
	LD	(HL),C
	INC	HL
	CP	L
	JP	NZ,SCRLP
	LD	A,B
	OUT	(REG6),A
	LD	A,E
	RET
;
;
;	FILL SCREEN WITH BLANK CHARACTERS
;
;
CLEAR:
	LD	A,008H
	OUT	(VBCTL),A
	LD	HL,SCREEN
	LD	C,SPACE
CLR1:
	LD	A,COLUMN
CLR:
	LD	(HL),C
	INC	HL
	CP	L
	JP	NZ,CLR
	LD	A,0D0H
CLR2:
	LD	(HL),C
	INC	HL
	CP	L
	JP	NZ,CLR2
	LD	A,01BH
	CP	H
	JP	NZ,CLR1
	CALL	HOME
	LD	A,SPACE
	OUT	(VBCTL),A
	EX	AF,AF'
	RET
;
;	MOVE CURSOR UP ONE LINE
;
UPLINE:
	LD	A,E
	CP	0
	JP	NZ,UPLP
	LD	A,ROWS
;
UPLP:
	DEC	A
	CP	B
	RET	Z
	LD	E,A
;
;
;	PLACE CURSOR AT POSITION SPECIFIED IN DE
;
;
PLACE:
	LD	H,E
	LD	L,D
	RL	L
	RR	H
	RR	L
	SET	4,H
	LD	A,D
	OUT	(WCCHAR),A
	LD	A,E
	OUT	(WCLINE),A
	RET
;
;	CURSOR RIGHT
;
RIGHT:
	INC	D
	POP	IX
	JP	CHECK
;
;	HOME CURSOR
;
HOME:
	LD	D,0
	LD	A,B
	INC	A
	CP	ROWS
	JP	NZ,HOLP
	LD	A,0
;
HOLP:
	LD	E,A
	CALL	PLACE
	RET
;
;	ESCAPE SEQUENCES - CURSOR PLACEMENT ESC=YX
;
ESC:
	SCF
	CCF			;CLEAR CARRY FLAG, WILL CAUSE
	EI			;RETURN AFTER INTERUPT
	HALT
;
	IN	A,(VDBIN)	;GET A CHARACTER
	RES	7,A
	CP	'='		;POSITION CURSOR?
	RET	NZ
	SCF
	CCF
	EI
	HALT

	IN	A,(VDBIN)	;GET Y VALUE
	RES	7,A
	SUB	20H
	RET	M
	CP	24			;TEST FOR VALUE > 24
	RET	P
	ADD	A,B
	INC	A
	CP	24
	JP	M,ESLP
	SUB	24
;
ESLP:
	LD	C,A
	SCF
	CCF
	EI
	HALT
	
	IN	A,(VDBIN)	;GET X VALUE
	RES	7,A
	SUB	SPACE
	RET	M
	CP	COLUMN			;TEST FOR VALUE > 80
	RET	P
	LD	E,C
	LD	D,A
	CALL	PLACE	; PLACE CURSOR AT NEW POSITION
	RET
;
;
;	TAB SET EVERY 8 SPACES
;
;
TAB:
	LD	A,0F8H
	AND	D
	ADD	A,008H
	CP	COLUMN
	JP	Z,TED
	LD	D,A
	CALL	PLACE
TED:
	RET
;
;
;	AF' REG CONTAINS SPECIAL CONTROL STATUS
;	ENHANCEMENT FUNCTION, CONTROLLED THROUGH PORT 10H
;
;
;	BIT 7	CONTROLS ENHANCEMENT FIELD
;	BIT 6	CONTROLS SPECIAL BIT #1
;	BIT 5	CONTROLS RUNNING TIME
;	BIT 4	CONTROLS UNDERLINE
;	BIT 3	CONTROLS BLANKING
;	BIT 2	CONTROLS REVERSE
;	BIT 1	CONTROLS BLINKING
;	BIT 0	CONTROLS SPECIAL BIT #2
;
;
BLINK:
	EX	AF,AF'
	AND	069H
	OR	022H
	OUT	(VBCTL),A
	EX	AF,AF'
	JR	ENHANC
;
RVS:
	EX	AF,AF'
	AND	069H
	OR	024H
	OUT	(VBCTL),A
	EX	AF,AF'
	JR	ENHANC
;
RVB:
	EX	AF,AF'
	AND	069H
	OR	026H
	OUT	(VBCTL),A
	EX	AF,AF'
	JR	ENHANC
;
UND:
	EX	AF,AF'
	AND	069H
	OR	34H
	OUT	(VBCTL),A
	EX	AF,AF'
	JR	ENHANC
	
;
QUIT:
	EX	AF,AF'
	RES	7,A
	OUT	(VBCTL),A
	EX	AF,AF'
;
QUIT1:
	EXX
	RES	7,L
	EXX
	RET
;	
UNB:
	EX	AF,AF'
	AND	069H
	OR	36H
	OUT	(VBCTL),A
	EX	AF,AF'
;
ENHANC:
	EXX
	SET	7,L
	EXX
	RET
;
;
;	SPECIAL CHARACTER FUNCTION
;
;
SPCH:
	SCF
	CCF
	EI
	HALT
;
	IN	A,(VDBIN)	;GET CHAR TO CONVERT
	RES	7,A
	SUB	40H
	RET	M
	POP	IY
	CP	20H
	JP	M,TDIS
	SUB	20H
	JP	TDIS
;
;
;	SETTING AND RESETTING OF CONTROL BITS
;
;
SC1:
	EX	AF,AF'
	SET	6,A
	OUT	(VBCTL),A
	EX	AF,AF'
	RET
RC1:
	EX	AF,AF'
	RES	6,A
	OUT	(VBCTL),A
	EX	AF,AF'
	RET
SC2:
	EX	AF,AF'
	SET	0,A
	OUT	(VBCTL),A
	EX	AF,AF'
	RET
RC2:
	EX	AF,AF'
	RES	0,A
	OUT	(VBCTL),A
	EX	AF,AF'
	RET
;
;
;	SOFTWARE DELAY LOOP
;
;
DELAY:
	EXX
	PUSH	DE
DLP:
	DEC	D
	JP	NZ,DLP
	DEC	E
	JP	NZ,DLP
	POP	DE
	EXX
	RET
;
;
;	SET DISPLAY SPEED
;	REG DE' CONTAIN DELAY
;
SLOW:
	EXX
	LD	D,0FFH
	LD	E,01H
	EXX
	RET
;
MED:
	EXX
	LD	D,05FH
	LD	E,01H
	EXX
	RET
;
FAST:
	EXX
	LD	D,01H
	LD	E,01H
	EXX
	RET
;
;
;	PROTECTED FIELD MODE
;
PROTECT:
	EXX
	BIT	0,L			;BIT 0 OF REG L' SETS PROTECT
	EXX
	RET	Z
	BIT	7,(HL)		;BIT 7 OF MEMORY IS PROTECT BIT
	RET	Z
	POP	IY
	JP	NODIS
;
NFD:
	EX	AF,AF'
	AND	069H
	SET	7,A
	OUT	(VBCTL),A
	EX	AF,AF'
	JP	QUIT1
;
PFD:
	EXX
	SET	0,L
	EXX
	RET
;
UNPFD:
	EXX
	RES	0,L
	EXX
	RET
;
;
;	SET SCROLL MODE
;
;
STUP:
	EXX
	SET	1,L
	EXX
	RET
;	
STDN:
	EXX
	RES	1,L
	EXX
	RET

	END	START

