Compucolor.org – Virtual Media

Listing of file='XMT300.SRC;07' on disk='vmedia/comm_pgms_source_code-sector.ccvf'

;^ASSEM PROG>XMT300.SRC;7	1981/03/11	2230
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	TRANSMIT AN ASCII FILE @ 300 BITS PER SECOND
;
;
;	SYSTEM ADDRESSES (FCS VERSION 6.78)
;

CO	EQU	3392H	;SEND CHARACTER TO SCREEN
S1OUT	EQU	33C3H	;SEND CHARACTER TO RS-232 PORT
OS	EQU	33F4H	;SEND STRING ENDING WITH 239
SVCHA	EQU	39DCH	;SEND CHARACTER TO SCREEN
WATL	EQU	3429H	;LONG WAIT: 20 MS / COUNT
BRATE	EQU	81E2H	;CURRENT BAUD RATE

EMESS	EQU	262DH	;FCS ERROR SUBROUTINE
PFSPC	EQU	3077H	;PARSE FILE SPEC
RESET	EQU	26A5H
OPEN	EQU	2DABH	;OPENS A FILE
			;HL=>FPB

RWSEQI	EQU	30C6H	;'REWINDS' A SEQUENTIAL FILE
			;INPUTS:	HL=>FPB
			;OUTPUTS:	A-LOST
			;		BC,DE UNCHANGED
			;		HL=>FPB
INSEQO	EQU	30E7H	;INITIALIZES A SEQUENTIAL OUTPUT FILE
			;INPUTS:	HL=>FPB
			;OUTPUTS:	A-LOST
			;		BC,DE UNCHANGED
			;		HL=>FPB
CLSEQO	EQU	3136H	;CLOSES A NEWLY CREATED SEQUENTIAL FILE
			;INPUTS:	HL=>FPB
			;OUTPUTS:	A-LOST
			;		BC,DE LOST
			;		HL=>FPB IF NO ERRORS
			;STATUS:	<NC> NO ERRORS
			;		<C> ERROR
			;		B=ERROR CODE
GTBYT	EQU	322CH	;GETS A SINGLE BYTE FROM FILE
			;INPUT HL=>FPB
			;OUTPUTS	A=BYTE
			;		BC,DE UNCHANGED
			;STATUS:	NC=NO ERRORS
			;		C,Z=END OF FILE
			;		C,NZ,M=ERROR

PTBYT	EQU	324AH	;PUTS A BYTE ON A FILE
			;INPUTS HL=>FPB,A=THE BYTE
			;OUTPUTS	A=THE BYTE
			;		BC,DE UNCHANGED
			;STATUS:	SAME AS GTBYT

ADHLA	EQU	3518H	;ADDS A TO HL WITH CARRYS
INPCRT	EQU	81C5H	;JUMP VECTOR NUMBER 31
KBDFL	EQU	81DFH	;KEYBOARD INPUT FLAG
INPFL	EQU	81E3H	;RS232 INPUT FLAG
READY	EQU	81FFH	;KEYBOARD READY FLAG
KBCHA	EQU	81FEH	;KEYBOARD CHARACTER
CMPHD	EQU	344DH	;COMPARE HL:DE REGISTERS
;
;	DEFINITION OF 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
;
LF	EQU	10		;LINE FEED
CR	EQU	13		;CARRIAGE RETURN
;
RATE	EQU	84H		;300 BAUD (88H = 1200)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	START OF PROGRAM
;
	ORG	8200H

START:	LXI	H,0		; SAVE FCS STACK POINTER
	DAD	SP
	SHLD	FCSSP
	LXI	SP,STACK	;SETUP RUNOFF STACK

	MVI	A,RATE		;GET BAUD RATE CODE
	OUT	5		;LOAD 5501
	STA	BRATE		;STORE SO FCS WILL KNOW

	MVI	A,31		;SET UP INPUT FLAGS
	STA	KBDFL		;KEYBOARD FLAG
	STA	INPFL		;INPUT FLAG
	MVI	A,0C3H		;LITERALLY JMP
	STA	INPCRT
	LXI	H,WHICH		;THUS
				;INPCRT:	JMP	WHICH
	SHLD	INPCRT+1
	LXI	H,INBUF		;POINT TO COUNTER
	MVI	M,0		;CLEAR COUNTER

	LXI	H,MSG00		;PRINT STARTUP MESSAGE
	CALL	OS

	CALL	SETUP		;INITIALIZE FILES

LOOP:	LXI	H,FPB1
	CALL	GTBYT
	JC	LOOPE1
	CPI	26		;^Z=END-OF-FILE, SO EXIT
	JZ	LOOPE1
	CPI	CR
	JZ	DELAY
	CPI	LF		;IGNORE LF
	JZ	LOOP
	MOV	E,A
	CALL	PARITY
	JMP	LOOP

DELAY:
	MOV	E,A
	CALL	PARITY
	MVI	A,10
	CALL	WATL		;WAIT 20 MS / COUNT IN A
	JMP	LOOP
;
;	PARITY	- GENERATE PARITY AND TRANSMIT TO RS232 PORT
;
PARITY:
	MOV	A,E		;PUT DATA IN REGISTER
	ANI	07FH		;FORCE PARITY BIT OFF
	JPE	POK		;TEST FOR EVEN PARITY
	ORI	080H		;FORCE PARITY BIT ON
POK:	MOV	E,A		;PUT DATA IN E FOR S1OUT
	CALL	S1OUT		;TRANSMIT ON RS232 PORT
	RET			;RETURN TO CALLER

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

SETUP:	LXI	H,MSG01		; DISPLAY PROMPT
	CALL	OS
	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
	MVI	A,CR		; PRINT CARRIAGE RETURN
	CALL	CO
	MVI	A,LF		; LINEFEED SEQUENCE
	CALL	CO

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

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

	LXI	H,FPB1		; 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	FPB1+FBUF	; SAVE INPUT BUFFER ADDRESS
	LXI	H,1024		; SETUP BUFFER SIZE
	SHLD	FPB1+FXBC	; SAVE INPUT BUFFER SIZE
	LXI	H,FPB1		; POINT AT INPUT FPB
	CALL	RWSEQI		; REWIND INPUT FILE
	RET			; RETURN

;
;
;	ROUTINE TO DETERMINE WHICH SOURCE
;	OF DATA HAS PROVIDED A CHARACTER
;
;
WHICH:
	PUSH	PSW	;SAVE MACHINE STATE
	PUSH	D	;SAVE DE
	LXI	D,KBDFL	;ADDRESS OF KEYBOARD INPUT FLAG
	CALL	CMPHD	;CALL HL:DE COMPARE
	JZ	KEYHIT	;JUMP IF CALLED FOR KEYBOARD CHARACTER

;	ASSUME CHARACTER FROM INPUT PORT

	POP	D	;RESTORE DE
	MOV	A,E
	ANI	7FH	;DROP PARITY BIT
	MOV	E,A
	CPI	7FH
	JZ	IGNORE
	POP	PSW
	JMP	SVCHA	;DISPLAY ON SCREEN

IGNORE:
	POP	PSW
	RET

KEYHIT:
	POP	D	;RESTORE DE
	POP	PSW	;RESTORE PSW

;	CHRINT IS CALLED WHENEVER A KEY IS STRUCK

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 INTERRUPTS
	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:	LXI	H,4	;POINT TO RETURN ADDRESS
	DAD	SP	;NOW H POINTS TO RETURN ADDRESS
	MVI	M,BAILOUT AND 255	;STORE LOW ORDER BYTE
	INX	H
	MVI	M,BAILOUT/256	;STORE HIGH ORDER BYTE
	JMP	INTEXT		;EXIT INTO EXIT

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

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


ERROR:	LXI	H,MSG02		; PRINT ERROR MESSAGE
	CALL	OS
BAILOUT:
EXIT:	MVI	B,0		; SETUP NO ERROR
	MVI	A,CR		; OUTPUT A CR TO FINISH
	MOV	E,A
	CALL	PARITY
	LHLD	FCSSP		; RESTORE FCS STACK
	SPHL
	RET			; AND EXIT TO FCS

EOF:	JMP	BAILOUT

;	MESSAGES

MSG00:	DB	18,11,'COMPUCOLOR ',19,'II '
	DB	21,'TRANSMIT @ '
	DB	20,' 300 BITS PER SECOND '
	DB	22,'11Mar81 2230',13,10,239
MSG01:	DB	19,11,'XMT300>',18,239
MSG02:	DB	17,'*** HARDWARE ERROR',13,10,239

DEFAULT:DB	'SRC'

;	DATA AREAS


BUFFER:	DS	256
IBUF:	DS	1024	;INPUT BUFFER

	DS	200	;STACK AREA
STACK:	DS	2

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

	END	START