home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
rcpm
/
newbd22.asm
< prev
next >
Wrap
Assembly Source File
|
1994-07-13
|
7KB
|
339 lines
; NEWBAUD.ASM ver 2.2
; (revised 08/14/82)
; by Keith Petersen and Dave Hardy
;
;REMOTE BAUD RATE CHANGE UTILITY FOR PMMI MODEMS and external
; modems that use a WD8250 chip.
;
;Allows a remote user to change baud rate without
;having to call back.
;
;This program is compatible with CP/M 1.4, 2.x., and MP/M
;
;11/15/82 Added equates for WD8250. rlb
;
;08/14/82 Added LSPEED and MSPEED equates so versions of
; XMODEM (5.0 and up) that examine address 03dh to
; get the baud rate for calculating send time and
; marking the LOG.SYS file will work properly if this
; program is run. Set LSPEED true only if your BYE
; program sets the baud rate at address 03dh. XMODEM
; will now have the correct baud rate available.
; (0=110,1=300,2=450,3=600,4=710) Tim Cannon.
;
;12/27/80 Added code to set new stack because some systems
; require more stack space than available in CP/M's
; default stack. (KBP)
;
TRUE EQU 0FFFFH
FALSE EQU 0
;
PMMI EQU FALSE ;TRUE PMMI MODEM
WD8250 EQU TRUE ;TRUE EXTERNAL MODEM USING A 8250 CHIP
;
IF PMMI
;
;PMMI modem port equates
;
;Set TPORT to the base address of your PMMI modem
;(all other modem equates are based on this value).
;
TPORT EQU 0C0H ;UART CONTROL/STATUS PORT
DPORT EQU TPORT+1 ;MODEM DATA PORT
RPORT EQU TPORT+2 ;RATE GEN/MODEM STATUS
CPORT EQU TPORT+3 ;MODEM CONTROL
;
;The following equates are used to set up the PMMI modem
;
P08BIT EQU 0CH ;8 DATA BITS
P0NOPY EQU 10H ;NO PARITY
P0TSB EQU 40H ;2 STOP BITS
P0NORM EQU P08BIT+P0NOPY ;USE 8 BITS, NO PARITY
P0110 EQU P08BIT+P0NOPY+P0TSB ;SAME W/2 STOP BITS
;
;Baud rate divisors
;
B110 EQU 142 ;110 BAUD
B300 EQU 52 ;300 BAUD
B450 EQU 35 ;450 BAUD
B600 EQU 26 ;600 BAUD
B710 EQU 22 ;710 BAUD
ENDIF
;
IF WD8250
;
DPORT EQU 0D8H ;DATA PROT
LPORT EQU DPORT+3 ;LINE COONTROL
CPORT EQU DPORT+4 ;MODEM CONTROL
;
;****************LINE STATUS MASKS*****************************
;
P0TBMT EQU 20H ;XMIT BUFFER EMPTY
P0DAV EQU 01H ;DATA AVAILABLE
;
*****************BAUD RATE DIVISORS****************************
;
BR110LS EQU 017H ;110 BAUD
BR110MS EQU 004H
BR300LS EQU 080H ;300 BAUD
BR300MS EQU 001H
BR450LS EQU 000H ;450 BAUD
BR450MS EQU 001H
BR600LS EQU 0C0H ;600 BAUD
BR600MS EQU 000H
BR120LS EQU 060H ;1200 BAUD
BR120MS EQU 000H
ENDIF
;
;Equates for XMODEM version 5.0 and up.
;
LSPEED EQU TRUE ;True if your BYE pgm. sets baud rate.
MSPEED EQU 03DH ;location of current baud rate.
;
BDOS EQU 5 ;BDOS ENTRY ADDRESS
CR EQU 0DH ;CARRIAGE RETURN
LF EQU 0AH ;LINEFEED
PRINT EQU 9 ;PRINT STRING FUNCTION
;
ORG 100H
;
;Save old stack pointer and set new one
;
START: LXI H,0
DAD SP ;GET OLD STACK
SHLD STACK ;SAVE IT
LXI SP,STACK ;SET NEW STACK
;
;Print sign-on message
LXI D,MSG ;SEND MESSAGE TO CONSOLE
MVI C,PRINT ;VIA BDOS "PRINT STRING" FUNCTION
CALL BDOS
;
;Now wait until last character of message
;is finished before changing baud rate
LXI H,0
LXI D,1 ;DELAY VALUE
;
SLO: DAD D ;ADD ONE
JNC SLO ;NO CARRY YET, COUNT MORE
;
;Get new baud rate, then return to CP/M
CALL CHANGE ;CHANGE TO NEW BAUD RATE
LHLD STACK ;GET OLD STACK POINTER
SPHL ;RESTORE IT
RET ;RETURN TO CP/M
;
;Read the modem at different baud rates until a CR is found
;
CHANGE: IN DPORT ;CLEAR ANY GARBAGE FROM MODEM PORT
IN DPORT ;CLEAR IT TWICE JUST TO BE SURE
;
;
IF PMMI
MVI A,B110 ;SELECT 110 BAUD INITIALLY
OUT RPORT ;SET BAUD RATE IN MODEM
MVI A,P0110 ;SELECT 8 DATA, NO PARITY, 2 STOP BITS FOR 110 BAUD
OUT TPORT
MVI A,7FH ;SET MODEM FILTER FOR <300
OUT CPORT
CALL TSBAUD ;SEE IF BAUD = 110
;
IF LSPEED
MVI A,0 ;store a 0 for 110 baud
STA MSPEED
ENDIF
;
RZ ;YES, EXIT
;
MVI A,P0NORM ;SET FOR 1 STOP BIT, ETC., FOR >110 BAUD
OUT TPORT
MVI A,B300 ;SET MODEM TO 300 BAUD
OUT RPORT
CALL TSBAUD ;SEE IF BAUD = 300
;
IF LSPEED
MVI A,1 ;store a 1 for 300 baud
STA MSPEED
ENDIF
;
RZ ;YES, EXIT
;
MVI A,B450 ;SET MODEM TO 450 BAUD
OUT RPORT
MVI A,5FH ;SET MODEM FILTER FOR >300
OUT CPORT
CALL TSBAUD ;SEE IF BAUD = 450
;
IF LSPEED
MVI A,2 ;store a 2 for 450 baud
STA MSPEED
ENDIF
;
RZ ;YES, EXIT
;
MVI A,B600 ;SET MODEM TO 600 BAUD
OUT RPORT
CALL TSBAUD ;SEE IF BAUD = 600
;
IF LSPEED
MVI A,3 ;store a 3 for 600 baud
STA MSPEED
ENDIF
;
RZ ;YES, EXIT
;
MVI A,B710 ;SET MODEM TO 710 BAUD
OUT RPORT
CALL TSBAUD ;SEE IF BAUD = 710
;
IF LSPEED
MVI A,4 ;store a 4 for 710 baud
STA MSPEED
ENDIF
;
RZ ;YES, EXIT
;
ENDIF
;
IF WD8250
TST110 PUSH D
MVI D,BR110MS
MVI E,BR110LS
IF LSPEED
MVI A,0
STA MSPEED
ENDIF
CALL SETBAUD
POP D
CALL TSTBAUD
JNZ TST300
CALL TSTBAUD
RZ
TST300 PUSH D
MVI D,BR300MS
MVI E,BR300LS
IF LSPEED
MVI A,1
STA MSPEED
ENDIF
CALL SETBAUD
POP D
CALL TSTBAUD
JNZ TST450
CALL TSTBAUD
RZ
TST450 PUSH D
MVI D,BR450MS
MVI E,BR300LS
IF LSPEED
MVI A,2
STA MSPEED
ENDIF
CALL SETBAUD
POP D
CALL TSTBAUD
JNZ TST600
CALL TSTBAUD
RZ
TST600 PUSH D
MVI D,BR600MS
MVI E,BR600LS
IF LSPEED
MVI A,3
STA MSPEED
ENDIF
CALL SETBAUD
POP D
CALL TSTBAUD
JNZ TST1200
CALL TSTBAUD
RZ
TST1200 PUSH D
MVI D,BR120MS
MVI E,BR120MS
IF LSPEED
MVI A,5
STA MSPEED
ENDIF
CALL SETBAUD
POP D
CALL TSTBAUD
JNZ CHANGE
CALL TSTBAUD
RZ
JMP CHANGE ;KEEP TRYING UNTIL CR IS FOUND
;
SETBAUD MVI A,0
OUT DPORT+1
MVI A,10H
OUT CPORT
MVI A,80H
OUT LPORT
MOV A,E ;GET LSB
OUT DPORT
MOV A,D ;GET MSB
OUT DPORT+1
CPI 4
JNZ ONSTOP
MVI A,07H
OUT LPORT
JMP DLOOP
ONSTOP: MVI A,03
OUT LPORT
DLOOP XCHG ;PUT DIVISOR IN HL
DAD H !DAD H !DAD H !DAD H ;MULTIPLY BY 16
; SO WE DELAY APPROX 2 CHARS TIMES
DLOOP1 DCX H
MOV A,L
ORA H
JNZ DLOOP1
XCHG
MVI A,1
OUT CPORT
IN DPORT
IN DPORT
RET
;
TSTBAUD CALL CONIN ;GET CHARACTER FROM MODEM
CPI CR ;IF A CARRAIAGE RETURN...
RZ ;.. RETURN
CPI LF ;IF A LINEFEED...
RZ
CPI 'C'-40H ;IF A CONTROL C
RET ;RET ZERO FLAG, ELSE NOT ZERO
;
ENDIF
;
IF PMMI
;TSBAUD reads one character from console input and returns
;with the zero flag set if the character is a CR.
;
TSBAUD: CALL CONIN ;GET CHARACTER DIRECT FROM CONSOLE
CPI CR ;SET ZERO FLAG IF CHARACTER IS CR
RET ;THEN RETURN
ENDIF
;
;This routine does a direct console input without echo
;
CONIN: LHLD 1 ;GET CBIOS VECTOR
LXI D,6 ;ADD OFFSET TO CONIN VECTOR
DAD D ;HL NOW = CONIN VECTOR
PCHL ;GO THERE
;
MSG: DB CR,LF,'NEWBAUD ver 2.2 - '
DB 'Change to new Baud rate,',CR,LF
DB 'THEN type RETURNs until the system responds.'
DB CR,LF,LF,'$'
;
;Temporary storage
;
DS 60 ;ROOM FOR STACK
STACK: DS 2 ;OLD STACK SAVED HERE
;
END START