Compucolor.org – Virtual Media

Listing of file='SENDB.MAC;01' on disk='vmedia/taylor_5-sector.ccvf'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	SEND A MORSE CHARACTER
;

	ENTRY	SEND
	PUBLIC	DOTTIM,CHSPD

	EXTRN	ENCODE		;ENCODED MORSE TABLE
	EXTRN	SAVE		;CONTEXT SAVE

EXTOT	EQU	7		;EXTERNAL OUTPUT PORT
EXTBUF	EQU	81D6H		;BUFFER FOR EXTRN. OUTPUT
TICKS	EQU	52		;BASIC TIMING UNIT FOR
				;   TIMER #2 = 52*64 MICROSEC
TIMER2	EQU	10		;OUTPUT PORT FOR TIMER #2
TM2INT	EQU	81C8H		;TIMER #2 INTERRUPT VECTOR


SEND:	ANI	7FH		;MAKE SURE IT'S ASCII
	CPI	127		;IS IT DELETE ?
	JZ	ERROR		;YES! OUTPUT ERROR CODE
	LXI	H,ENCODE	;INDEX INTO MORSE CODE TABLE
	MOV	C,A
	MVI	B,0
	DAD	B
	MOV	A,M
	STA	CODE		;SAVE THE MORSE FOR LATER
	ORA	A
	JNZ	XMIT		;NULLS COUNT AS SPACES
	CALL	DOTOFF		;I.E. ANY CHARACTER WITH NO
	JMP	SPACE		;MORSE EQUIVALENT IS A SPACE
;
;	MAIN SENDING LOOP
;
XMIT:	LDA	CODE		;GET NEXT DOT OR DASH
	ADD	A
	STA	CODE
	JZ	SPACE		;FINISHED IF NOTHING LEFT
	LDA	DOTTIM		;GET DOT TIME
	JNC	MARK		;MULTIPLY BY THREE IF A DASH
	MOV	B,A
	ADD	A
	ADD	B
MARK:	STA	ONTIM
	CALL	DOTON		;SEND THE DOT OR DASH
	CALL	DOTOFF		;FOLLOWED BY ONE DOT SPACE
	JMP	XMIT		;AND REPEAT
;
;	SPACE BETWEEN CHARACTERS
;
SPACE:	CALL	DOTOFF		;ALWAYS ONE DOT SPACE
	CALL	CHRSPC		;PLUS INTER-CHARACTER SPACE
	RET

;..............................................................
;
;	OUTPUT 8 DOTS - ERROR CODE
;
ERROR:	MVI	A,8
ERR10:	PUSH	PSW
	LDA	DOTTIM
	STA	ONTIM
	CALL	DOTON
	CALL	DOTOFF
	POP	PSW
	DCR	A
	JNZ	ERR10
	CALL	CHRSPC
	RET

;..............................................................
;
;	GENERATE A TONE - DOT OR DASH
;
DOTON:	LDA	ONTIM		;SET UP COUNTER FOR DELAY
	STA	COUNT
	MVI	A,64		;TURN THE BELL ON
	STA	EXTBUF
	OUT	EXTOT
	CALL	WAIT		;WAIT OUT THE TONE DURATION
	XRA	A		;TURN BELL OFF
	STA	EXTBUF
	OUT	EXTOT
	RET

;..............................................................
;
;	WAIT ONE DOT TIME WITH NO SOUND
;
DOTOFF:	LDA	DOTTIM		;SETUP DELAY COUNTER
	STA	COUNT
	XRA	A
	STA	EXTBUF
	OUT	EXTOT
	CALL	WAIT
	RET

;..............................................................
;
;	WAIT ONE CHARACTER SPACE WITH NO SOUND
;
CHRSPC:	LDA	CHSPD
	PUSH	PSW
CS01:	CALL	DOTOFF
	POP	PSW
	DCR	A
	PUSH	PSW
	JNZ	CS01
	POP	PSW
	RET

;..............................................................
;
;	WAIT - PERFORM A DELAY USING INTERRUPTS
;
;	INTERRUPTS ARE ENABLED I.E. KEYBOARD STILL WORKS
;	DURING THE DELAY.
;
;	DURATION IS STORED IN LOCATION "COUNT".
;	TOTAL DELAY IS COUNT*TICKS*64 MICROSECONDS.
;
WAIT:	DI			;HOLD OFF INTERRUPTS
	MVI	A,0C3H
	STA	TM2INT		;SET UP TIMER #2 JUMP VECTOR
	LXI	H,REPT
	SHLD	TM2INT+1
	MVI	A,TICKS		;START TIMER #2
	OUT	TIMER2
WAIT10:	EI			;LOOP UNTIL COUNTDOWN COMPLETE
	LDA	COUNT
	ORA	A
	JNZ	WAIT10
	RET

REPT:	CALL	SAVE		;SAVE REGISTERS
	LDA	COUNT
	DCR	A		;DECREMENT COUNTER
	STA	COUNT
	RZ			;   AND RETURN IF ZERO
	MVI	A,TICKS		;OTHERWISE, RESTART TIMER
	OUT	TIMER2
	RET

;..............................................................
;
;	DATA STORAGE AREA
;

CODE:	DB	0	;TEMPORARY STAORAGE FOR CHR CODE
DOTTIM:	DB	20
ONTIM:	DB	20
CHSPD:	DB	2
COUNT:	DB	1

	END