; NEWBAUD.ASM ver 2.0
; (revised 12/27/80)
; by Keith Petersen and Dave Hardy
;
;REMOTE BAUD RATE CHANGE UTILITY FOR PMMI MODEMS
;
;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
;
;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)
;
;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
;
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
;
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
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
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
RZ ;YES, EXIT
;
MVI A,B600 ;SET MODEM TO 600 BAUD
OUT RPORT
CALL TSBAUD ;SEE IF BAUD = 600
RZ ;YES, EXIT
;
MVI A,B710 ;SET MODEM TO 710 BAUD
OUT RPORT
CALL TSBAUD ;SEE IF BAUD = 710
RZ ;YES, EXIT
;
JMP CHANGE ;KEEP TRYING UNTIL CR IS FOUND
;
;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
;
;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.0 - '
DB 'Change to new Baud rate,',CR,LF
DB 'THEN type RETURNs until the system responds.'
DB CR,LF,CR,LF,'$'
;
;Temporary storage
;
DS 60 ;ROOM FOR STACK
STACK: DS 2 ;OLD STACK SAVED HERE
;
END START