🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Stephen L Moshier Sun, 01 Nov 1992 21:02
shar file, 300 baud fsk routines
#43
Author: Stephen L Moshier
Date: Sun, 01 Nov 1992 21:02
624 lines
14524 bytes
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  filter.asm modemr.asm modemt.asm stub.asm
# Wrapped by moshier@world on Sun Nov  1 11:49:04 1992
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f filter.asm -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"filter.asm\"
else
echo shar: Extracting \"filter.asm\" \(1969 characters\)
sed "s/^X//" >filter.asm <<'END_OF_filter.asm'
X; filter.asm
X; IIR filter programs.
X
X        org	pl:	;this program is in on-chip memory.
X
X; The processing steps for a single pole pair involve a
X; sampled data input signal x(t), delay line w(t), and
X; output signal y(t).
X;
X; poles:
X; w(t) = x(t) + c1 w(t-1) + c2 w(t-2)
X; zeros:
X; y(t) = b0 w(t) + b1 w(t-1) + b2 w(t-2)
X; delay line:
X; w(t-2) = w(t-1)
X; w(t-1) = w(t).
X;
X; Enter with x(t) in accumulator a.
X; r4 enters pointing at w(t-2); next up is w(t-1).
X; r0 points to coefficients in the order c2, c1, b2, b1, b0.
X;
X; Program returns with filter output sample in a.
X;
X; Set processor to shift up 1 on alu output by the instruction
X; or #$08,MR.  This means that all the coefficients should
X; be exactly half of the desired values, expressed as fixed
X; point fractional numbers.
X;
X; - Copyright 1987 by Stephen L. Moshier
X
X
X; 4th order IIR filter
X
Xfil4
X
X	or	#$08,MR
X; first filter section
X;			c2		w(t-2)
X	move		x:(r0)+,x0	y:(r4)+,y1
X
X; c2*w(t-2)		c1		w(t-1)
X	mac x0,y1,a	x:(r0)+,x0	y:(r4)-,y0
X
X; + c1*w(t-1)		b2		w(t-2) = w(t-1)
X	macr x0,y0,a	x:(r0)+,x0	y0,y:(r4)+
X
X; b2*w(t-2)		b1		w(t)
X	mpy x0,y1,a	x:(r0)+,x0	a,y1
X
X; +b1*w(t-1)		b0		w(t-1) = w(t)
X	mac x0,y0,a	x:(r0)+,x0	y1,y:(r4)+
X
X; +b0*w(t)		next c2		next w(t-2)
X	mac x0,y1,a	x:(r0)+,x0	y:(r4)+,y1
X; second filter section
X; c2*w(t-2)		c1		w(t-1)
X	mac x0,y1,a	x:(r0)+,x0	y:(r4)-,y0
X
X; + c1*w(t-1)		b2		w(t-2) = w(t-1)
X	macr x0,y0,a	x:(r0)+,x0	y0,y:(r4)+
X
X; b2*w(t-2)		b1		w(t)
X	mpy x0,y1,a	x:(r0)+,x0	a,y1
X
X; +b1*w(t-1)		b0		w(t-1) = w(t)
X	mac x0,y0,a	x:(r0)+,x0	y1,y:(r4)+
X
X; +b0*w(t)
X	macr x0,y1,a
X	and	#$f7,MR
X	rts
X
X; Second order filter
X
X	org	pl:
Xfil2
X	or	#$08,MR
X;			c2		w(t-2)
X	move		x:(r0)+,x0	y:(r4)+,y1
X
X; c2*w(t-2)		c1		w(t-1)
X	mac x0,y1,a	x:(r0)+,x0	y:(r4)-,y0
X
X; + c1*w(t-1)		b2		w(t-2) = w(t-1)
X	macr x0,y0,a	x:(r0)+,x0	y0,y:(r4)+
X
X; b2*w(t-2)		b1		w(t)
X	mpy x0,y1,a	x:(r0)+,x0	a,y1
X
X; +b1*w(t-1)		b0		w(t-1) = w(t)
X	mac x0,y0,a	x:(r0)+,x0	y1,y:(r4)+
X
X; +b0*w(t)
X	macr x0,y1,a
X	and	#$f7,MR
X	rts
END_OF_filter.asm
if test 1969 -ne `wc -c <filter.asm`; then
    echo shar: \"filter.asm\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f modemr.asm -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"modemr.asm\"
else
echo shar: Extracting \"modemr.asm\" \(5733 characters\)
sed "s/^X//" >modemr.asm <<'END_OF_modemr.asm'
X; 300 baud modem receiver program
X; Copyright (C) 1987 by Stephen L. Moshier
X
X
X; data memory storage
X; x memory space
X        org	xl:
X; 300 baud modem filter coefficients
X; 
X; Order of presentation for each:
X; c2
X; c1
X; b2
X; b1
X; b0
X; All are for 8000 Hz sampling rate
X
X; Low band 1070 - 1270 Hz
X; Answer mode receive band
X; 4th order low pass, 2db ripple, pass 0-1270, stop 2025 Hz
X; dbdown 5.276226765e+01
X
Xlofilt
X
X; f0   1.23586097e+03  gain   8.4887e+00  DC gain   1.2324e+00
X	dc	-0.4286498
X	dc	 0.5229224
X; f0   2.11089275e+03  gain   0.0000e+00  DC gain   2.1740e+00
X	dc	-0.0693399
X	dc	-0.0120630
X	dc	-0.0693399
X; f0   5.99758599e+02  gain   5.0260e+00  DC gain   4.4780e+00
X	dc	-0.2882925
X	dc	 0.6766350
X; f0   3.02593762e+03  gain   0.0000e+00  DC gain   3.4427e+00
X	dc	-0.0693399
X	dc	-0.1000385
X	dc	-0.0693399
X
X; Low band discriminator
X; 
X; Low pass 2nd order, 6db ripple, pass 1170, stop 1270
X; dbdown 1.271859559e+01
X
X; f0   1.04995006e+03  gain   7.0236e+00  DC gain   1.7030e+00
X	dc	-0.4031716
X	dc	 0.6095659
X; f0   1.46518847e+03  gain  -5.0686e-17  DC gain   1.1844e+00
X	dc	-0.2492395
X	dc	 0.2032782
X	dc	-0.2492395
X
X; High pass, 2nd order, 6db ripple, stop 1070 pass 1170
X; dbdown 1.294969758e+01
X
X; f0   1.28875897e+03  gain   5.2572e+00  DC gain   1.1874e+00
X	dc	-0.3879321
X	dc	 0.4668458
X; f0   9.10671468e+02  gain   0.0000e+00  DC gain   4.9013e-01
X	dc	-0.3110093
X	dc	 0.4695843
X	dc	-0.3110093
X
X; High band filter 2025 - 2225 Hz
X; Originate mode receive band
X; High pass 4th order, 2db ripple, stop 1270 pass 2025
X; dbdown 5.276226765e+01
X
Xhifilt
X
X; f0   2.06313029e+03  gain   5.8917e+00  DC gain   5.2073e-01
X	dc	-0.4150302
X	dc	-0.0451549
X; f0   1.19907094e+03  gain   0.0000e+00  DC gain   8.2325e-01
X	dc	-0.1263355
X	dc	 0.1486654
X	dc	-0.1263355
X; f0   2.92524387e+03  gain   2.2305e+00  DC gain   4.4185e-01
X	dc	-0.2055801
X	dc	-0.4260223
X; f0   5.59875559e+02  gain   1.1815e-17  DC gain   1.9026e-01
X	dc	-0.1263355
X	dc	 0.2286340
X	dc	-0.1263355
X
X; High band discriminator */
X; Low pass 2nd order, 6db ripple, pass 2125, stop 2225
X; dbdown 1.203486237e+01
X
X; f0   1.99019333e+03  gain   4.1867e+00  DC gain   5.7218e-01
X	dc	-0.3805705
X	dc	 0.0067195
X; f0   2.42450965e+03  gain   0.0000e+00  DC gain   2.6545e+00
X	dc	-0.2872167
X	dc	-0.1879927
X	dc	-0.2872167
X
X; High pass 2nd order, 6db ripple, stop 2025, pass 2125
X; dbdown 1.200879571e+01
X
X; f0   2.26016187e+03  gain   4.3645e+00  DC gain   4.7143e-01
X	dc	-0.3830155
X	dc	-0.1775949
X; f0   1.81981553e+03  gain   0.0000e+00  DC gain   1.7179e+00
X	dc	-0.2783189
X	dc	 0.0785108
X	dc	-0.2783189
X; end of modem filter coefficients
X
Xband	ds	1
Xwptr	ds	1	;debug output buffer pointer
X
X
X;y memory space address
X	org	yl:
Xdline	ds	4	;4th order modem band filter
X	ds	2	;2nd order high discriminator
Xhiband	ds	1
X	ds	2	;2nd order low discriminator
Xloband	ds	1
Xbaudcl	dc	0	;baud rate clock
Xmcursam	ds	1
Xmlassam	ds	1
X
X	org	yh:
Xbitctr	ds	1
Xtemp	ds	1
Xoutcod	ds	1
Xmchar	ds	1
Xbitchg	ds	1
X
X
X
X        org	ph:
X; enter with PCM sample in A register
Xmodemr
X	jsr mudec
X; Receive band filter
X; hifilt = originate mode
X; lofilt = answer mode
X	move	#hifilt,r0
X	move	#dline,r4
X	jsr fil4
X	move	a,x:band
X; lower frequency (space) discriminator filter
X	jsr fil2
X; Rectify and average the output
X;			const 0.25	y:loband
X	abs a		x:(r0)+,x0	y:(r4),y0
X	mpy -x0,y0,b	a,x1
X	mac x1,x0,b
X	add y0,b
X;					output
X	move	b,y:(r4)+
X
X; Higher frequency (mark) discriminator filter 
X	jsr fil2
X; Rectify and average the output
X;			const 0.75	y:hiband
X	abs a		x:(r0)+,x0	y:(r4),y0
X;			const 0.25
X	mpy x0,y0,b	x:(r0)+,x0	a,y1
X	mac y1,x0,b
X;					output
X	move				b,y:(r4)+
X; Update baud rate clock
X; baudcl increments each 13 1/3 samples
X; at 8 KHz sample rate
X;
X;		clock increment	clock value
X	move	x:(r0)+,x0	y:(r4),a
X	add x0,a
X	move			a1,y:(r4)+
X; Get decision measurement
X	move				y:hiband,a
X	move				y:loband,y1
X	sub y1,a	y:mcursam,b
X	move		b1,y:mlassam
X	move		a1,y:mcursam
X; get clock and strip off bottom 16 bits
X	move	#>$ff0000,x0
X	move	y:baudcl,b
X	and x0,b
X	move	b,x1
X; Bitctr counts as follows:
X;  0	waiting for start bit (a space)
X;  1	got start bit, waiting 3/2 baud to
X;	middle of first data bit
X; 2-9	8 data bits
X; 10	stop bit (a mark)
X	move		y:bitctr,b
X;			1 to high byte of y1
X	tst b		#1,y1
X	jne _z2		; jump if( bitctr != 0 )
X; check carrier amplitude level
X
X; waiting for start bit (a space)
X	tst a
X	jge _z1		; jump if( mcursam >= 0 )
X; bitctr = 1
X	clr b		y1,y:bitctr
X; baudcl = 0
X	move		 b,x1	b,y:baudcl
X_z1
X	jmp _nxts
X_z2
X; Waiting for first data bit
X	cmp y1,b
X	jne _z3		; jump if bitctr != 1
X;	baudcl
X	tfr x1,a	#3,x0
X	cmp x0,a
X	jge _newbit	; jump if baudcl >= 3
X	jmp _nxts
X_z3
X;	is baudcl >= 2?
X	tfr x1,a	#2,x0
X	cmp x0,a
X	jlt _nxts	; jump if baudcl < 2
X_newbit
X	clr a	y:mcursam,y0
X; baudcl = 0
X	move	a,x1
X	move	a,y:baudcl
X; if mcursam < 0 then temp (x0) = 0
X; else temp = 0200
X	cmp y0,a
X	jle _z6
X	move #$80,x0
X_z6
X	move	a,x0
X; bitctr += 1
X	move y:bitctr,a
X	add y1,a
X	move a,y:bitctr
X; bitchg = 128
X	move #$80,y0
X	move y0,y:bitchg
X	move #$10,y0
X	cmp y0,a
X	jge _z9		; jump if bitctr >= 10
X; shift data bits in from top down
X; (the least significant bit comes in first)
X
X; mchar = mchar >> 1   +   temp
X	move y:mchar,a
X	lsr a
X	or x0,a		;x0 = temp
X	move a,y:mchar
X	jmp _nxts
X_z9
X	tfr x0,a
X	tst a
X	jne _z7		;jump if temp != 0
X; framing error!
X; reset to stop bit postition
X; and set clock to wait 1/2 baud
X	move #9,a
X	move a,y:bitctr
X	move #1,a
X	move	a,x1
X	move	 a,y:baudcl
X	jmp _nxts
X_z7
X; set up for next character
X	clr a
X	move a,y:bitctr
X; A character has been decoded.
X; put its code into the ring buffer
X	move y:mchar,a
X	jsr putring
X; flags |= 128
X	bset #23,x:flags
X_nxts
X; set output code to 2 if any characters were detected
X	btst #23,x:flags
X	jcc _z8
X	move #2,a
X	move a,y:outcod
X_z8
X	rts
END_OF_modemr.asm
if test 5733 -ne `wc -c <modemr.asm`; then
    echo shar: \"modemr.asm\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f modemt.asm -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"modemt.asm\"
else
echo shar: Extracting \"modemt.asm\" \(2712 characters\)
sed "s/^X//" >modemt.asm <<'END_OF_modemt.asm'
X; modemt.asm
X; 300 baud modem receiver
X; Copyright (C) 1987 by Stephen L. Moshier
X
X	org	xl:
Xmbptr	ds	1
Xmctr1	ds	1
Xmctr2	ds	1
Xmctr3	ds	1
Xmadata	ds	1
X
X; Tone frequencies
X; for 300 baud modem
X; 1070.0,
X; 1270.0,
X; 2025.0,
X; 2225.0,
X
Xorfreq
X	dc	0.0010449	; originate mode space
X	dc	0.0012402	; originate mode mark
Xanfreq
X	dc	0.0019775	; answer mode space
X	dc	0.0021729	; answer mode mark
X
X	org	yl:
Xmbaudct	ds	1
Xmphase1	ds	1
Xmphase2	ds	1
Xmfreq1	ds	1
Xmfreq2	ds	1
X
X	org	ph:
Xmodemt
X; if( mbaudct > 2 )
X;	mbaudct = 0;
X; The integer part of the baud rate counter is the most
X; significant byte of the 24 bit word.
X	move	#2,x0
X	clr b	y:mbaudct,a
X	cmp x0,a
X	tgt b,a
X	move	a,y:mbaudct
X; Get tone frequencies
X	move	#orfreq,r0
X	move	#mfreq1,r4
X	move	x:(r0)+,y0
X	move	x:(r0)+,x0	y0,y:(r4)+	
X	move			x0,y:(r4)
X; set buffer length counter
X	move	#BUFLEN,x0
X	move	x0,x:mctr1
X	move	#CHBBAS,x0
X	move	x0,x:mbptr
X_mttop
X; Check if a tone is in process.
X; mctr2 counts bits in the character
X; mctr3 counts samples of tone waveform.
X	move	x:mctr2,a
X	tst a	x:mctr3,b
X	jgt _toncon
X	tst b
X	jgt _toncon
X; Get next character from ring buffer.
X	jsr tstring
X	jne _morton
X; If no unread characters in the buffer, then
X; send a character of all marks.
X	move	#-1,x0
X	move	x0,x:madata
X	jmp _nxtchr
X; get code to send from ringbuffer
X_morton
X	jsr getring
X; Insert start bit in bit 0
X; and stop bit in bit 9
X	lsl a	#>$100,x0
X	or x0,a
X	move	a,x:madata
X
X_nxtchr
X; count 10 baud per character
X	move	#10,x0
X	move	x0,x:mctr2
X_baudlup
X; get the right frequency for this baud
X	move		x:madata,a
X	tfr a,b		#>1,x0
X	and x0,a
X	jeq _isspace
X	move	y:mfreq2,x0	;mark
X	jmp _setfreq
X_isspace
X	move	y:mfreq1,x0	;space
X_setfreq
X	lsr b	x0,y:mphase1
X; shift in the next baud
X	move	b,x:madata
X; Make the average length of a baud
X; equal to 26 2/3 samples at 8 KHz
X	move	#255,x0 ;mask high byte
X	move	y:mbaudct,a
X	and x0,a	a,b
X	tst a
X	jgt _bgt
X	move	#26,a
X	move	#2,x1
X	jmp _setbctr
X_bgt
X	move	#27,x0
X	tfr b,a		#1,x1
X	sub x1,a		; baudct -= 1
X_setbctr
X	move	x0,x:mctr3
X	move	a,y:mbaudct
X; Fill waveform array with the tone for this baud
X	move	#$100,x0	; ROM sine table
X	move	#mphase1,r4
X	move	#>$80,x1
X_tonlup
X; find sine wave at current phase
X	tfr x0,a			y:(r4)+,y0
X	mac y0,x1,a			y:(r4)-,y1
X	tfr y0,b	a,r0
X; update phase
X	add y1,b	x:mbptr,r6
X;			get sine wave
X	move		x:(r0)+,a	b,y:(r4)
X;	jsr muenc ;uses r5
X	move		a,y:(r6)+
X	move	r6,x:mbptr
X; check the output buffer
X	move	x:mctr1,b
X	sub x1,b
X	move	b,x:mctr1
X	jle _mtdon
X; return here to continue processing
X_toncon
X; update loop counter
X	move	#1,x1
X	move	x:mctr3,a
X	sub	x1,a
X	move	a,x:mctr3
X	jgt _tonlup
X; update baud loop counter
X	move	#1,x1
X	move	x:mctr2,a
X	sub	x1,a
X	move	a,x:mctr2
X	jgt _baudlup
X	jmp _mttop
X_mtdon
X	rts
END_OF_modemt.asm
if test 2712 -ne `wc -c <modemt.asm`; then
    echo shar: \"modemt.asm\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f stub.asm -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"stub.asm\"
else
echo shar: Extracting \"stub.asm\" \(509 characters\)
sed "s/^X//" >stub.asm <<'END_OF_stub.asm'
X; 300 baud modem fsk routines
X; this module contains I/O stubs
X
X	org yh:$200
XBUFLEN	equ	64
XCHBBAS	ds	128
X
X	org xl:$40
Xflags	ds	1
X
X	org yl:$40
X
X	org ph:$200
X; convert mu-law pcm code to linear
Xmudec
X	rts
X
X; convert linear to mu-law
Xmuenc
X	rts
X
X; put decoded ASCII character into receive buffer
Xputring
X	rts
X
X; return nonzero if there is a character in the transmit buffer
Xtstring
X	rts
X
X; read character from transmit buffer
Xgetring
X	rts
X
X	include	'modemr.asm'
X	include 'modemt.asm'
X	include 'filter.asm'
X	end
X
END_OF_stub.asm
if test 509 -ne `wc -c <stub.asm`; then
    echo shar: \"stub.asm\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of shell archive.
exit 0
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads