home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
MODEMS
/
MODEM
/
MDMBRATE.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-06-30
|
12KB
|
330 lines
************************************************************************
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