Compucolor.org – Virtual Media

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	MORSE CODE PRACTISE PROGRAM
;	(TWO VERSIONS - USING THE BELL AND SOUNDWARE)
;
	TITLE	MORSE

;	READS IN AN ASCII FILE AND SENDS IT AS MORSE CODE
;
;	THE USER CAN SPECIFY THE SPEED IN WORDS/MINUTE, THE
;	SPACING BETWEEN CHARACTERS, AND OF COURSE THE FILE.
;	SPEED CAN BE ALTERED DYNAMICALLY BY USE OF THE UP-
;	AND DOWN-ARROW KEYS. THE BREAK KEY SUSPENDS SENDING
;	UNTIL ANOTHER KEY IS STRUCK, AND THE ESCAPE KEY
;	ABORTS THE PROGRAM.

	PUBLIC	FCSSP

	EXTRN	DECOUT
	EXTRN	SCND,DECIN
	EXTRN	SEND,DOTTIM,CHSPD
	EXTRN	CPYRGT

;	FCS ROUTINES

	EXTRN	JMPVEC,CO,OSTR,SAVE
	EXTRN	FILVEC,EMESS,RESET,OPEN,PFSPC
	EXTRN	RWSEQI
	EXTRN	GTBYT,ADHLA

;	MAXIMUM WORDS/MINUTE

MAX	EQU	30

;	SYSTEM ADDRESSES

INPCRT	EQU	81C5H		;JUMP VECTOR NUMBER 31
KBDFL	EQU	81DFH		;HOLDS NUMBER OF JUMP VECTOR
READY	EQU	81FFH		;KEYBOARD READY FLAG
KBCHA	EQU	81FEH		;KEYBOARD CHARACTER BUFFER

;	OFFSETS IN FILE PARAMETER BLOCK

FOPT	EQU	0
FATR	EQU	1
FNAM	EQU	2
FTYP	EQU	8
FVER	EQU	11
FSBK	EQU	12
FSIZ	EQU	14
FLBC	EQU	16
FLAD	EQU	17
FSAD	EQU	19
FSPR	EQU	21
FDBK	EQU	22
FDEN	EQU	23
FAUX	EQU	24
FHAN	EQU	26
FFCN	EQU	28
FDRV	EQU	29
FBLK	EQU	30
FBUF	EQU	32
FXBC	EQU	34
FPTR	EQU	36

;	SPECIAL CONTROL CHARACTERS

CR	EQU	13
LF	EQU	10
FF	EQU	12

;
;..............................................................
;
;	START OF PROGRAM
;

MORSE:	DI
	LXI	H,0		;SAVE FCS STACK POINTER
	DAD	SP
	SHLD	FCSSP
	LXI	SP,STACK	;SETUP PROGRAM STACK
	MVI	A,31		;SET UP VECTOR
	STA	KBDFL		;TO INPCRT
	MVI	A,0C3H		;LITERALLY JMP
	STA	INPCRT
	LXI	H,CHRINT	;INPCRT:   JMP	CHRINT
	SHLD	INPCRT+1
	LXI	H,INBUF		;POINT TO COUNTER
	MVI	M,0		;CLEAR COUNTER
	CALL	JMPVEC		;SET UP I/O JUMP VECTORS
	CALL	FILVEC
	EI

	LXI	H,MSG00		;PRINT STARTUP MESSAGE
	CALL	OSTR
	CALL	CPYRGT		;COPYRIGHT MESSAGE

	CALL	SETUP		;INITIALIZE FILE AND SPEED
	CALL	SPEED		;DISPLAY THE SPEED

;
;	MAIN SENDING LOOP
;

LOOP:	LXI	H,FPB		;GET NEXT CHARACTER FROM FILE
	CALL	GTBYT
	JC	LOOPE1
	CPI	26		;MIGHT BE SCROLL
	JZ	LOOPE1
	CALL	SEND		;XMIT MORSE CHARACTER
;
;	CHECK FOR SPEED ADJUSTMENT
;
;	THE KEYBOARD IS INTERROGATED DIRECTLY
;	UP-ARROW MEANS INCREASE, AND DOWN-ARROW DECR.
;	CHANGES ONLY TAKE PLACE AT THE END OF A CHARACTER.
;

	DI
	MVI	A,05		;CHECK DOWN-ARROW (LINE-FEED)
	OUT	07
	IN	01
	CPI	0EFH
	JNZ	CHKUP
	EI
	LDA	WPM		;DECREMENT THE WORDS/MIN
	DCR	A
	JNZ	GTHAN
	MVI	A,1		;CANNOT GO BELOW 1 WPM
GTHAN:	STA	WPM
	CALL	SPEED
	JMP	ABTEST

CHKUP:	MVI	A,03		;CHECK FOR UP-ARROW
	OUT	07
	IN	01
	CPI	0DFH
	JNZ	ABTEST
	EI
	LDA	WPM
	INR	A
	CPI	MAX+1		;CANNOT BE ABOVE MAX WORDS/MIN
	JC	LTHAN
	MVI	A,MAX
LTHAN:	STA	WPM
	CALL	SPEED

;
;	SEE IF SENDING IS TO BE SUSPENDED
;

ABTEST:	EI
	LDA	READY		;SEE IF BREAK
	CPI	50H
	JZ	ABTEST		;HANG UNTIL ANOTHER IS STRUCK
	CPI	80H
	JNZ	LOOP
	XRA	A
	STA	READY
	LDA	KBCHA
	CPI	27		;ESCAPE CAUSES PROGRAM ABORT
	JNZ	LOOP
	JMP	BAILOUT

;
;	EXIT MAIN LOOP
;

LOOPE1:	JZ	EOF		;AT END OF FILE - CLOSE OUTPUT
	JMP	ERROR

;..............................................................
;
;	SETUP THE FILE FOR INPUT AND THE SPEED AND SPACING
;
;	THE USER ENTERS: FILENAME,SPEED,SPACING
;	WHERE FILENAME IS ANY VALID FCS FILE
;	      SPEED    IS IN WORDS/MINUTE (1-MAX)
;	      SPACING  IS NORMALLY 2
;
;	DEFAULT VALUES EXIST IF THE USER DOES NOT
;	ENTER THE SPEED AND SPACING: 15,2
;
;	THE SPACING IS THE NUMBER OF DOT LENGTHS
;	BETWEEN CHARACTERS. THIS ALLOWS FAST CHARACTERS
;	WITH A LONG TIME BETWEEN THEM.
;

SETUP:	LXI	H,MSG01		; DISPLAY PROMPT
	CALL	OSTR
	CALL	RESET		; RESET DISK IF ERROR
	LXI	H,BUFFER	; POINT AT BUFFER
L02:	CALL	CI		; READ FROM CONSOLE
	CPI	13		; IS IT CR ?
	JZ	X02		; YES, GO PROCESS CR
	CPI	26		; IS IT BS ?
	JZ	G021		; YES, GO PROCESS BACKSPACE
	MOV	M,A		; STORE CHARACTER
	INX	H		; BUMP POINTER
	JMP	L02		; CONTINUE LOOP
G021:	MOV	A,L		; TEST LO BYTE OF POINTER
	ORA	A		; IF ZERO THEN RESTART READ
	JZ	SETUP
	MVI	A,' '		; ELSE SPACE OVER
	CALL	CO
	MVI	A,26		; TYPED DATA
	CALL	CO
	DCX	H
	JMP	L02		; CONTINUE LOOP
X02:	MVI	M,0		; INSERT TERMINATOR
	INX	H
	MVI	M,0
	MVI	A,CR		; PRINT CARRIAGE RETURN
	CALL	CO
	MVI	A,LF		; LINEFEED SEQUENCE
	CALL	CO

	LXI	H,BUFFER	; POINT AT BUFFER
	LXI	D,FPB		; POINT AT INPUT FPB
	LXI	B,DEFAULT	; POINT AT DEFAULT TYPE
	CALL	PFSPC		; PARSE FILE SPEC
	JC	E02		; IF CARRY THEN ERROR

	CALL	SCND		;GET SPEED
	JNC	CHKEND		;USE DEFAULT IF NOT PRESENT
	CALL	DECIN
	CPI	MAX+1		;MUST BE < MAX WPM
	JC	STORE
	MVI	A,MAX
STORE:	STA	WPM		;STORE WPM

	CALL	SCND		;GET SPACING FACTOR
	JNC	CHKEND		;USE DEFAULT IF NOT FOUND
	CALL	DECIN
	CPI	1		;SPACING MUST BE >= 2
	JNZ	STORIT
	MVI	A,2
STORIT:	STA	CHSPD

CHKEND:	MOV	A,M		; TEST FOR END
	MVI	B,9		; SETUP SYNTAX ERROR
	ORA	A
	JNZ	E02

	LXI	H,FPB		; POINT AT INPUT FPB
	MVI	A,0		; SETUP AS OLD FILE
	MOV	M,A
	CALL	OPEN		; OPEN THE FILE
	JC	E02
	LXI	H,IBUF		; POINT AT INPUT BUFFER
	SHLD	FPB+FBUF	; SAVE INPUT BUFFER ADDRESS
	LXI	H,1024		; SETUP BUFFER SIZE
	SHLD	FPB+FXBC	; SAVE INPUT BUFFER SIZE
	LXI	H,FPB		; POINT AT INPUT FPB
	CALL	RWSEQI		; REWIND INPUT FILE
	RET			; RETURN

;..............................................................
;
;	CHARACTER INTERRUPT ROUTINE
;
;	THIS SHOWS HOW TO READ A CHARACTER
;	AND ESCAPE FROM A HUNG PROGRAM

;	CHRINT IS CALLED WHENEVER A KEY IS STRUCK.
;	THE JUMP IS FROM INPCRT.

CHRINT:	PUSH	H	;SAVE REGISTERS
	PUSH	PSW
	LXI	H,INBUF
	MVI	A,30	;LENGTH OF BUFFER
	CMP	M	;SEE IF BUFFER IS FULL
	JC	INTEXT	;IF IT IS IGNORE CHARACTER
	INR	M	;INCREMENT COUNTER
	MOV	A,M	;PUT COUNT IN A
	CALL	ADHLA	;ADD COUNTER TO BEGINNING OF BUFFER
	MOV	A,E	;CHARACTER IS IN E
	CPI	27	;SEE IF ESCAPE HAS BEEN HIT
	JZ	BREAK	;USER WANTS TO EXIT
	ANI	127	;MAKE SURE ITS ASCII
	MOV	M,A	;STORE IT
INTEXT:	POP	PSW
	POP	H	;RESTORE REGISTERS
	EI		;REENABLE INTERUPT
	RET
;
;	BREAK ALLOWS THE USER TO BRANCH TO A LOCATION WHEN THE
;	ESCAPE KEY IS STRUCK.  IN THIS CASE THE LOCATION IS
;	CALLED BAILOUT
;

BREAK:	POP	PSW
	POP	H
	POP	H
	JMP	BAILOUT

INBUF:	DS	32	;STORAGE  AREA FOR TYPE AHEAD

;
;..............................................................
;
;	CI READS AND ECHOS ONE CHARACTER FROM THE KEYBOARD
;

CI:	PUSH	H	;SAVE H
	LXI	H,INBUF
CI1:	MOV	A,M	;READ COUNTER
	ANA	A	;SEE IF ZERO
	JZ	CI1	;LOOK AND WAIT IF ZERO
	DI		;HOLD OFF INTERRUPTS WHILE PROCESSING
	PUSH	D	;SAVE D
	DCR	M	;REDUCE BUFFER COUNTER
	MOV	D,M
	INX	H	;POINT TO CHARACTER
	MOV	A,M	;READ IT
	CALL	CO	;ECHO IT
	PUSH	PSW	;STACK IT
CI2:	DCR	D	;SHIFT COUNTER
	JM	CI3	;WHEN DONE
	INX	H	;CHARACTER TO BE SHIFTED
	MOV	A,M
	DCX	H	;POINT TO NEW HOME
	MOV	M,A	;NEW HOME
	INX	H
	JMP	CI2	;LOOP UNTIL DONE
CI3:	EI		;ENABLE INTERRUPTS
	POP	PSW	;THE CHARACTER
	POP	D
	POP	H
	RET
;
;..............................................................
;
;	ERROR AND EXIT
;

E02:	CALL	EMESS		; EMIT ERROR MESSAGE
	JMP	SETUP		; READ NEW LINE


ERROR:	LXI	H,ERRMSG	; PRINT ERROR MESSAGE
	CALL	OSTR
BAILOUT:
EXIT:	MVI	B,0		; SETUP NO ERROR
	LHLD	FCSSP		; RESTORE FCS STACK
	SPHL
	RET			; AND EXIT TO FCS

EOF:	JMP	EXIT


;
;..............................................................
;
;	OUTPUT THE SPEED MESSAGE AND ADJUST DOT TIME
;
SPEED:	LDA	WPM		;GET WORDS/MIN
	LXI	H,SPDTAB	;INDEX INTO SPEED TABLE
	MOV	C,A
	MVI	B,0
	DAD	B		;DOUBLE THE OFFSET
	DAD	B		;BECAUSE ENTRIES ARE 2 BYTES
	MOV	E,M
	INX	H
	MOV	D,M
	XCHG
	SHLD	DOTTIM		;AND STORE NEW DOT TIME
	LXI	H,HIDIG		;CONVERT TO ASCII FOR DISPLAY
	CALL	DECOUT		;AND PRINT WPM
	LXI	H,MSG02
	CALL	OSTR
	RET
;
;	TABLE OF DOT TIMES FOR SPEEDS IN WORDS/MINUTE
;
;	THE DOT TIME IS THE DURATION OF A DOT, SO THEIR IS A
;	RECIPROCAL RELATIONSHIP BETWEEN SPEED IN WPM AND DOT
;	TIME. 10 WPM = 155 "CYCLES", AND ANY OTHER SPEED CAN
;	BE FOUND FROM:  "CYCLES" = 1550 / WPM
;
;	THE TABLE RANGES FROM 0 TO 30 WPM (0 = 1). MORE CAN BE
;	ADDED. CHANGE THE VALUE OF 'MAX' AT THE TOP IF THIS
;	IS DONE.
;
SPDTAB:	DW	1550,1550,775,517,388,310,259,221,194,172
	DW	155,141,129,119,111,103,97,91,86,82
	DW	78,74,70,67,65,62,60,57,55,53,52

WPM:	DB	15

;
;..............................................................
;
;	MESSAGES
;
MSG00:	DB	30,16,29,18,12,'COMPUCOLOR ',19,'II ',21
	DB	'MORSE CODE PRACTISE ',22,'V5.80',13,10,10,239
MSG01:	DB	19,11,'FILENAME,SPEED(WPM),SPACING FACTOR>',18,239
MSG02:	DB	3,20,16,17,'SPEED = ',23
HIDIG:	DB	'   '
	DB	' WPM',239
ERRMSG:	DB	17,'HARDWARE ERROR !',13,10,239

DEFAULT:DB	'TXT'		;DEFAULT FILE TYPE IS TXT
;
;..............................................................
;
;	DATA AREAS
;

BUFFER:	DS	256
IBUF:	DS	1024	;INPUT BUFFER

	DS	150	;STACK AREA
STACK:	DS	2

FCSSP:	DS	2	;FCS STACK POINTER
FPB:	DS	38	;INPUT FPB

	END	MORSE