************************************************************************

        UNIVERSAL BAUD RATE SELECTION ROUTINE FOR MODEM PROGRAMS
                          By: Rory Jan (6/82)
                             Rexdale, Ont.

Note:  This is not a stand alone program,  it is merely an upgrade  that 
can be incorporated into most MODEM/XMODEM programs.

This  file  contains  a new GETBAUD subroutine (S/R) for  use  with  the 
series of MODEM/XMODEM programs. This S/R uses look-up tables to preform 
it's  wonders (instead of hardware dependent  calculations).  What  this 
means  is  no  matter what type of programable baud rate  generator  you 
have,  you will now be able to use the option of specifying a baud  rate 
when you invoke the modem program.  Of course, if you're lucky enough to 
already  be able to do that,  then this file is of ALMOST no use to  you 
(read on).

The  format  of  the baud rate selection option on the command  line  is 
slightly different,  it must be entered in 100's of baud instead of just 
baud (eg.  MODEM T.6 means 600 baud).  This allows the specification  of 
baud  rates up to 25500 as opposed to 999 max using the previous  format 
(this  is due to the 3 baud rate char limit on the command line).  Along 
with the new GETBAUD S/R,  this file also contains a debugged CVBIN  S/R 
(the  CVBIN S/R found in MODEM217 doesn't work but may have already been 
corrected  by  now) and updated HELP and EXAM S/R's  which  reflect  the 
slightly  different  baud  rate  selection  format  (using  IF/ENDIF's). 
Although CVBIN,  HELP & EXAM were taken from MODEM217, they should still 
be  direct  replacements  for  the corresponding  S/R's  in  most  MODEM 
programs.

This  MODEM/XMODEM  update  is  provided  in the form  of  S/R's  to  be 
incorporated  into your own modem program simply because there  are  too 
many versions of MODEM to provide diff files for (and if you altered the 
program  much,  you couldn't use the diff file anyway).  Therefore,  you 
must  at least know roughly what 8080 (blaaaa) assembly language is  all 
about to stick this routine in (it's veeeeery easy).

It would be a great service to all new Modemites if some generous person 
would  take  the latest and greatest MODEM program and replace  all  the 
IF/ENDIF'd  stuff  in the GETBAUD S/R with this universal  S/R  and  put 
EQU's near the start of the file to specify allowable baud rates and the 
corresponding  baud rate gen.  (or modem or serial interface or...) data 
required.  This  way  most  people could avoid the hastle  of  having  3 
versions of their modem  program for 3 different baud rates.

Now for the routines...

************************************************************************

                         SETTING UP THE TABLES

The  tables are presently set up for a COM5016 dual baud rate generator. 

Table 1 (BRTBL1) simply contains the baud rate that would be entered  on 
the  command  line (actual values,  not ASCII),  see present set-up  for 
example.

Table  2  (BRTBL2)  contains  the  corresponding  baud  rate   generator 
programing data (eg.  in the present set-up, 0EEH is brate gen. data for 
9600 baud).

The  2  tables can be changed to any length as long as size of BRTBL1  = 
size of BRTBL2 (obviously...).

************************************************************************

                          ROUTINE (???) NOTES

- If  you know the CVBIN S/R in your MODEM  prog.  works,  don't  bother 
replacing it with this one.
- If you aren't worried about the 'help' and 'example' information being 
completely correct, don't replace (or update) it either.
- The  S/R ERXIT CALLed from BADRATE simply prints the message  directly 
following  the  call,  then exits the prog.  I'm sure you have the  same 
routine, but the name could be different (not likely).
- If it's not already in your prog, put a DEFBAUD EQU 0XXH ;DEFAULT BAUD 
RATE  GEN  DATA statement near the start of the file and set it  to  the 
BAUD RATE GEN data for your default baud rate.
- Add  the statement BRGNLUP EQU TRUE ;TRUE,  USES LOOK-UP  TABLE  BRATE 
SELECT near the modem type select options at the beginning of the file. 
- The INITREQ label should be set TRUE (else how else can you init  your 
baud  rate  gen).  If  you  normally  set  it  FALSE,  you  can  prevent 
initialization  of everything but the baud rate buy removing all but the 
two statements shown below from the INITMD (INITMOD) S/R.
- Replace your similar statements:
	MVI	A,DEFBAUD	;INIT TO DEFAULT BAUD RATE
	OUT	BAUDRP
  with:
	CALL	GETBAUD		;GET BAUD RATE GEN DATA
	OUT	BAUDRP

************************************************************************

                            INSTALLING S/R'S

- Depending  on your style (or your mood),  you may want to install  the 
new GETBAUD S/R using IF/ENDIF's, or you may just feel like removing the 
original  stuff (it isn't used anyway) and putting this one straight in. 
Which ever way you do it,  make sure it (and only it) gets assembled.  I 
used a new label (BRGNLUP - baud rate gen look-up) and IF/ENDIF's myself 
(IF/ENDIF's in S/R's below are for MODEM217).
- If  your CVBIN S/R needs to be corrected,  simply substitute this  one 
for  your infested one (or if you don't have one at all,  stick this one 
in immediately after the GETBAUD S/R).
- If you want to replace your HELP & EXAM S/R's, do just that.

That's all folks...
WOW! What a massive amount of typing for such a pitifully small routine.
					R. Jan

************************************************************************
                              S/R GETBAUD
************************************************************************
;      
;---->	GETBAUD: GETS BAUD RATE FROM COMMAND
;
;	THIS ROUTINE CHECKS IF A BAUD RATE HAS BEEN
;	ASKED FOR, (SUCH AS MODEM T.6 FOR 600 BAUD),
;	AND IF SO, CALCULATES THE BAUD RATE GENERATOR
;	VALUE TO BE RETURNED (IN A), ELSE DEFAULTS
;	TO 'DEFBAUD'.
;
	IF	BRGNLUP
;
GETBAUD	LDA	FCB+9		;GET 'FILETYPE'
	CPI	' '		;USE DEFAULT?
	MVI	A,DEFBAUD	;JUST IN CASE
	RZ			;USE 'DEFBAUD'
;
	CALL	CVBIN		;GET BAUD RATE IN BINARY (/100)
;
	MOV	A,H		;INVALID BAUD RATE?
	CPI	0		;(I.E > 25500)
	JNZ	BADRATE		;INVALID
;
	LXI	D,BRTBL1-1	;INIT PTR TO BRATE TABLE
GETBD2	INX	D		;UPDATE PTR
	MOV	A,E		;END OF TABLE 1?
	CPI	BRTBL2 MOD 256
	JZ	BADRATE		;YES, INVALID BAUD RATE
	LDAX	D		;GET VAL FROM TABLE 1
	CMP	L		;MATCH?
	JNZ	GETBD2		;NOT YET, CONTINUE
	LXI	H,BRTBL2-BRTBL1	;SET HL TO POINT TO CORRESPONDING
				;VAL IN TABLE 2
	DAD	D
	MOV	A,M		;GET BRATE GEN DATA
	RET
;
; COM5016 BAUD RATE TABLE (IN HUNDREDS OF BAUD)
;
BRTBL1	DB	1		;110 BAUD
	DB	3		;300 BAUD
	DB	6		;600 BAUD
	DB	12		;1200 BAUD, ETC.
	DB	18
	DB	20
	DB	24
	DB	36
	DB	48
	DB	72
	DB	96
	DB	192		;19200 BAUD
;
; CORRESPONDING CONTROL VALUES FOR ABOVE BAUD RATES
;
BRTBL2	DB	22H		;110 BAUD
	DB	55H		;300 BAUD, ETC.
	DB	66H
	DB	77H
	DB	88H
	DB	99H
	DB	0AAH
	DB	0BBH
	DB	0CCH
	DB	0DDH
	DB	0EEH
	DB	0FFH		;19200 BAUD
;
	ENDIF			;BRGNLUP
************************************************************************
                               S/R CVBIN
(don't  forget  to  make sure things are assembled  if  you  stick  them 
between IF/ENDIF's)
************************************************************************
;                                       
; ROUTINE TO CONVERT BAUD RATE SPECIFIED ON COMMAND
; LINE TO BINARY (HEX). VAL RETURNED IN HL
;
	IF	PMMI OR DCH OR BRGNLUP	;(eg. as in MODEM217)
;
CVBIN	LXI	D,FCB+9		;PNT TO ASCII VAL
	LXI	H,0		;INIT BINARY RESULT
;
DECLP	MOV	A,E		;DONE?
	CPI	FCB+12 MOD 256
	RZ			;YEP, RETURN HEX IN HL
	LDAX	D		;GET ASCII DIGIT
	INX	D		;PNT TO NEXT DIGIT
	CPI	' '		;BLANK ONE?
	JZ	DECLP		;..YES, SKIP IT
	CPI	'0'		;VALIDATE IT
	JC	BADRATE 	;ERROR
	CPI	'9'+1		;VALIDATE
	JNC	BADRATE 	;ERROR
	SUI	'0'		;MAKE DIGIT BINARY
;
; MULTIPLY PREV VALUE BY 10
;
	MOV	B,H		;SET UP FOR
	MOV	C,L		;MULTIPLY BY 10
	DAD	H		;MULTIPLY BY 2
	DAD	H		;X 2 = 4
	DAD	B		;+ 1 = 5
	DAD	H		;X 2 = 10
	ADD	L		;ADD IN DIGIT
	MOV	L,A		;SAVE BACK
	JNZ	DECLP		;NO CARRY?
	INR	H		;ADD IN CARRY
	JMP	DECLP		;NEXT DIGIT
;
; INVALID BAUD RATE
;
BADRATE CALL	ERXIT
	DB	'++INVALID BAUD RATE++$'
;
	ENDIF			;PMMI OR DCH OR BRGNLUP
************************************************************************
                           S/R'S HELP & EXAM
************************************************************************
;
; ROUTINES TO GIVE HELP AND EXAMPLES
; HELP/EXAMPLE DATA IS AUTOMATICALLY ADJUSTED USING
; IF/ENDIF'S TO SHOW CORRECT BAUD RATE SELECT FORMAT
;
HELP	CALL	ILPRT
	DB	'(T)erminal and (E)cho mode commands:',CR,LF
	DB	'   Ctl-A = Ascii capture enable/disable toggle',CR,LF
	DB	'   Ctl-E = Exit to CP/M',CR,LF
	DB	'   Ctl-D = Disconnect phone',CR,LF
	DB	'   Ctl-P = Printer enable/disable toggle',CR,LF,CR,LF
	DB	'Format for command is:',CR,LF,CR,LF
	DB	'MODEM # Filename',CR,LF,CR,LF
	DB	'Where # is a 1 character primary option,',CR,LF
	DB	' which may be followed by sub-options,',CR,LF
	DB	' and by ".xxx" to set baud rate to'
	IF	BRGNLUP
	DB	CR,LF,' xxx*100 (i.e. enter baud rate in 100''s)'
	ENDIF
	IF	NOT BRGNLUP
	DB	' xxx'
	ENDIF
	DB	CR,LF,CR,LF,1
	DB	'Primary Options:',CR,LF
	DB	'   S to send a file',CR,LF
	DB	'   R to receive a file',CR,LF
	DB	'   T to act as a terminal',CR,LF
	DB	'   E to act as a computer (echo data)',CR,LF
	DB	'   D to disconnect the phone',CR,LF
	DB	'   H to print this help file',CR,LF,CR,LF,1
	DB	'Secondary options:',CR,LF
	DB	'   A answer mode',CR,LF
	DB	'   O originate mode',CR,LF
	DB	'   D disconnect after execution',CR,LF
	DB	'   T go to terminal mode after file xfer',CR,LF
	DB	'   E go to echo mode after file xfer',CR,LF
	DB	'   Q quiet mode - no status msgs',CR,LF
	DB	'   R show chars received',CR,LF
	DB	'   S show chars sent',CR,LF
	DB	'   V view file sent/received (no status)',CR,LF
	DB	'   C request CRC option for file xfers',CR,LF
	DB	'     Note: request made from receiving end',CR,LF
	DB	CR,LF,'For examples, type: MODEM X',CR,LF,0
	JMP	EXIT
;
EXAM	CALL	ILPRT
	DB	'Send file, originate mode, 300 baud:',CR,LF
	DB	'   MODEM SO fn.ft',CR,LF
	DB	'Send another file:',CR,LF
	DB	'   MODEM S fn.ft',CR,LF
	DB	'Then send a third file at '
	IF	BRGNLUP
	DB	'9600'
	ENDIF
	IF	NOT BRGNLUP
	DB	'600'
	ENDIF
	DB	' baud and disconnect:'CR,LF
	IF	BRGNLUP
	DB	'   MODEM SD.96 fn.ft'
	ENDIF
	IF	NOT BRGNLUP
	DB	'   MODEM SD.600 fn.ft'
	ENDIF
	DB	CR,LF,CR,LF
	DB	'Act as a terminal, originate mode, at 110 baud:',CR,LF
	IF	BRGNLUP
	DB	'   MODEM TO.1'
	ENDIF
	IF	NOT BRGNLUP
	DB	'   MODEM TO.110'
	ENDIF
	DB	CR,LF
	DB	'   (Use ctl-D to disconnect)',CR,LF,CR,LF,1
	DB	'Receive file, answer mode, view it, 600 baud:',CR,LF
	IF	BRGNLUP
	DB	'   MODEM RAV.6 fn.ft'
	ENDIF
	IF	NOT BRGNLUP
	DB	'   MODEM RAV.600 fn.ft'
	ENDIF
	DB	CR,LF
	DB	'Receive file, request cyclic redundancy check, 600 baud:',CR,LF
	IF	BRGNLUP
	DB	'   MODEM RC.6 fn.ft',
	ENDIF
	IF	NOT BRGNLUP
	DB	'   MODEM RC.600 fn.ft',
	ENDIF
	DB	CR,LF,CR,LF
	DB	'Turn printer mode on/off in terminal or echo mode:',CR,LF
	DB	'   ^P	 (printer now toggled)',CR,LF,CR,LF
	DB	'Turn on ascii capture mode:',CR,LF
	DB	'   ^A ',CR,LF
	DB	'   FILE NAME --> b:test.doc [CR] (file now open)',CR,LF
	DB	'Turn off ascii capture mode:',CR,LF
	DB	'   ^A	(ascii capture disabled, file closed)',CR,LF,0
	JMP	EXIT
