home *** CD-ROM | disk | FTP | other *** search
- ; 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