home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
mex
/
mxo-bb11.asm
< prev
next >
Wrap
Assembly Source File
|
1994-07-13
|
28KB
|
946 lines
; MXO-BBI0.ASM --
; Big Board I (& incidentally XEROX 820, II) overlay file for
; MEX10. 16 June 1985
;
; You will want to look this file over carefully. There are a number of
; options that you can use to configure the program to suit your taste.
; This file adapts the Big Board I to MEX Version 1.0. This overlay
; is not intended to support MDM7xx in any of it's incarnations.
;
; Edit this file for your preferences then follow the "TO USE:" example
; shown below.
;
; Use the "SET" command to change the baudrate when desired. It starts
; out at 300 baud when the program is first called up. Please note the
; extensions to the SET command below. You may now set the parity,
; word size, & number of stop bits in addition to the baud rate. The
; SET command also implements a local help file.
;
; TO USE: First edit this file filling in answers for your own
; equipment. Then assemble with ASM.COM or equivalent
; assembler. Then use MLOAD to overlay the the results
; of this program to the original .COM file.
;
; = = = = = = = = = = = = = = = = = =
; 06/18/85 - Removed auto-baud bug & added - Richard Williams
; help file.
; 06/16/85 - Expanded SET command & cleaned - Richard Williams
; up listing for 80 columns.
; 11/12/84 - Addapted to Big Board I - Richard Williams
; 05/24/84 - MEXified overlay - Biff Bueffel
; 11/11/83 - Renamed to M7XE-1.ASM, no changes - Irv Hoff
; 07/27/83 - Renamed to work with MDM712 - Irv Hoff
; 07/01/83 - Revised to work with MDM711 - Irv Hoff
; 06/22/83 - Revised to work with MDM710 - Irv Hoff
; 05/27/83 - Updated to work with MDM709 - Irv Hoff
; 05/15/83 - Revised to work with MDM708 - Irv Hoff
; 04/11/83 - Updated to work with MDM707 - Irv Hoff
; 04/04/83 - Updated to work with MDM706 - Irv Hoff
; 03/03/83 - Modified MDM705KP for XEROX
; 820-II computers with external
; modems - David Wurz
;
; = = = = = = = = = = = = = = = = = =
;
; The obligatory equates...
;
YES: EQU 0FFH
NO: EQU 0
;
; = = = = = = = = = = = = = = = = = =
;
; Here are the equates for the conditional assembly switches...
;
; Two serial ports are available. See initialization area for info.
; Port A is the commonly used port.
PORT$A EQU YES ;set to no for Port B
PORT$B EQU NOT PORT$A
;
; This overlay can display the port status on every invocation of the
; set baud routine (ALWAYS = YES) or will display the status on a null
; argument SET command and/or a SET command with only the expanded
; arguments (ALWAYS =NO). If ALWAYS = YES, then the port status will
; also be displayed on an auto baud rate change from the phone
; directory.
ALWAYS EQU NO ;do not display port status
; ; on every change.
;
; = = = = = = = = = = = = = = = = = =
;
; Instruction equates...
;
IN$RET EQU 0C9H ;unconditional return
IN$MVI EQU 03EH ;move immediate to reg. A
IN$ANI EQU 0E6H ;AND immediate with reg. A
IN$ORI EQU 0F6H ;OR immediate with reg. A
IN$LHLD EQU 02AH ;load reg. HL at address
IN$EOC EQU 076H ;End Of Coffee
;
; Character equates...
;
BELL: EQU 007H ;bell
CR: EQU 00DH ;carriage return
ESC: EQU 01BH ;escape
LF: EQU 00AH ;linefeed
;
; MEX service processor stuff...
;
MEX EQU 0D00H ;address of the service processor.
INMDM EQU 255 ;get char from port to A, CY=no more within 100 ms.
TIMER EQU 254 ;delay 100ms * reg B.
TMDINP EQU 253 ;B=# secs to wait for char, cy=no char.
CHEKCC EQU 252 ;check for ^C from KBD, Z=present.
SNDRDY EQU 251 ;test for modem-send ready.
RCVRDY EQU 250 ;test for modem-receive ready.
SNDCHR EQU 249 ;send a character to the modem (after sndrdy).
RCVCHR EQU 248 ;receive a char from the modem (after rcvrdy).
LOOKUP EQU 247 ;table search: see CMDTBL comments for info.
PARSFN EQU 246 ;parse filename from input stream.
BDPARS EQU 245 ;parse baud-rate from input stream.
SBLANK EQU 244 ;scan input stream to next non-blank.
EVALA EQU 243 ;evaluate numeric from input stream.
LKAHED EQU 242 ;get next char w/o removing from input.
GNC EQU 241 ;get char from input, cy=1 if none.
ILP EQU 240 ;inline print.
DECOUT EQU 239 ;decimal output.
PRBAUD EQU 238 ;print baud rate.
;
PRINT EQU 9 ;MEX/BDOS print-string function call.
;
; MEX baud rate command numbers...
;
C110 EQU 000H ; 110 baud
C300 EQU 001H ; 300 baud
C450 EQU 002H ; 450 baud ** not supported on this machine **
C600 EQU 003H ; 600 baud
C710 EQU 004H ; 710 baud ** not supported on this machine **
C1200 EQU 005H ; 1200 baud
C2400 EQU 006H ; 2400 baud
C4800 EQU 007H ; 4800 baud
C9600 EQU 008H ; 9600 baud
C19200 EQU 009H ; 19200 baud
CERROR EQU 0FFH ; for `unrecognized' baud rates.
;
ORG 100H
DS 3 ;(for "JMP START" instruction)
;
; MEX variables, constants, flags, & what have you...
;
PMMI: DB NO ;yes=PMMI S-100 Modem 103H
SMDM: DB YES ;yes=HAYES Smartmodem, no=non-PMMI 104H
TORP: DB 'T' ;T=touch, P=pulse (Smartmodem-only) 105H
;
; Change the clock speed to suit
; your system...
CLOCK: DB 40 ;clock speed in MHz x10, 25.5 MHz max. 106H
;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
MSPEED: DB 1 ;0=110 1=300 2=450 3=600 4=710 5=1200 107H
;6=2400 7=4800 8=9600 9=19200 default
BYTDLY: DB 5 ;0=0 delay 1=10ms 5=50 ms - 9=90 ms 108H
;default time to send character in ter-
;minal mode file transfer for slow BBS.
CRDLY: DB 5 ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
;default time for extra wait after CRLF
;in terminal mode file transfer
;
NUMCOL: DB 5 ;number of DIR columns shown 10AH
USET: DB YES ;yes=user-added Setup routine 10BH
SCRN: DB YES ;Cursor control routine 10CH
;
ACKNAK: DB YES ;yes=resend a record after any non-ACK 10DH
;no=resend a record after a valid NAK
BAKUP: DB NO ;yes=change any file same name to .BAK 10EH
CRCDEF: DB YES ;yes=default to CRC checking 10FH
CRCTOG: DB YES ;yes=allow toggling of CRC to Checksum 110H
;
CNVRUB: DB NO ;yes=convert backspace to rub 111H
TOGRUB: DB YES ;yes=allow toggling of bksp to rub 112H
ADDLF: DB NO ;no=no LF after CR to send file in 113H
;terminal mode (added by remote echo)
TOGLF: DB YES ;yes=allow toggling of LF after CR 114H
TRNLOG: DB YES ;yes=allow transmission of logon 115H
;write logon sequence at location LOGON
SAVCCP: DB YES ;yes=do not overwrite CCP 116H
LCLNXT: DB NO ;yes=local command if EXTCHR precedes 117H
;no=external command if EXTCHR precedes
LCLTGL: DB YES ;yes=allow toggling of LCLNXT 118H
LSTTST: DB YES ;yes=printer available on printer port 119H
XOFFT: DB YES ;yes=check for XOFF from remote while 11AH
;sending a file in terminal mode
XONWT: DB NO ;yes=wait for XON after CR while 11BH
;sending a file in terminal mode
TGXOFF: DB YES ;yes=allow toggling of XOFF checking 11CH
IGNCTL: DB YES ;yes=CTL-chars above ^M not displayed 11DH
;
EXTRA1: DB 0 ;for future expansion 11EH
EXTRA2: DB 0 ;for future expansion 11FH
;
BRKCHR: DB '@'-40H ;^@ = Send a 300 ms. break tone 120H
HANGUP: DB 'N'-40H ;^N = Disconnect from the phone line 121H
LOGCHR: DB 'L'-40H ;^L = Send logon 122H
LSTCHR: DB 'P'-40H ;^P = Toggle printer 123H
UNSAVE: DB 'R'-40H ;^R = Close input text buffer 124H
TRANS: DB 'T'-40H ;^T = Transmit file to remote 125H
SAVE: DB 'Y'-40H ;^Y = Open input text buffer 126H
EXTCHR: DB '^'-40H ;^^ = Send next character 127H
DS 2 ; 128H
;
; MEX jump vectors (& such)...
;
ICTL1: MVI A,00$010$000B ;,reset latched status bits,. 12AH
OUT CTL1
IN CTL1 ;get the status bits
RET
DS 3
;
ODATP: OUT DATP ! RET ;out modem data port 134H
DS 7
;
IDATP: IN DATP ! RET ;in modem data port 13EH
DS 7
;
ARCVB: ANI RCVB ! RET ;bit to test for receive ready 148H
CRCVR: CPI RCVR ! RET ;value of receive bit when rdy 14BH
;
ASNDB: ANI SNDB ! RET ;bit to test for send ready 14EH
CSNDR: CPI SNDR ! RET ;value of send bit when ready 151H
DS 6 ; 154H
;
OCTL1: OUT CTL1 ! RET ;out modem control port 15AH
OCTL2: OUT CTL2 ! RET ;out modem status port 15DH
DS 2 ;Not used by MEX 160H
DS 6 ; 162H
;
GBYEV: JMP GBYE ;hang up. 168H
;
INITV: JMP INIT ;go to user written routine 16BH
;
NEWBV JMP NEWB ;Change baudrate 16EH
RET ! NOP ! NOP ;(by-passes PMMI routine) 171H
RET ! NOP ! NOP ;(by-passes PMMI routine) 174H
;
SETBV: JMP SETB ;user `SET' baud rate 177H
DS 3 ; 17AH
;
SYSVV: JMP SYSV ;display system version 17DH
;
BRKV: JMP SNDBRK ;send break 180H
;
; Do not change the following six lines.
;
ILPRTV: DS 3 ;in line print 183H
INBUFV DS 3 ;input buffer 186H
ILCMPV: DS 3 ;in line comparison 189H
INMDMV DS 3 ;input from modem 18CH
NSCRNV: DS 3 ;new screen 18FH
TIMERV: DS 3 ;timer 192H
;
; Clear sequences -- CLREOS is clear to end of screen, CLRSCN is clear
; entire screen.
;
CLREOS: LXI D,EOSMSG ; 195H
MVI C,PRINT
CALL MEX
RET
;
CLRSCN: LXI D,CLSMSG ; 19EH
MVI C,PRINT
CALL MEX
RET
;....
;
; Display system version...
;
SYSV: MVI C,ILP ; 1A7H
CALL MEX
DB CR,LF
DB 'Version for Big Board I Serial Port A [004H]'
DB CR,LF,0
RET
;....
;
; This routine allows a 300 ms. break tone to be sent to reset some
; time-shar computers.
;
SNDBRK: MVI A,XMTREG
OUT CTL1
MVI A,BRK ;send a break tone.
JMP GBYE1
;.....
;
; This routine sends a 300 ms. break tone and sets DTR low for the same
; length of time to disconnect some modems such as the Bell 212A, etc.
;
GBYE: MVI A,XMTREG
OUT CTL1 ;send to the status port
MVI A,DISCON ;turn off dtr
;
GBYE1: OUT CTL1 ;set RS-232 bits
MVI B,3 ;wait for 300 ms.
MVI C,TIMER
CALL MEX
CALL SETXMT ;restore the transmitter to normal
RET
;.....
;
; Big Board I initialization -- sets up Z80 SIO & the COM8116...
;
; Serial Port A = 004H <=- the prefered choice.
; Serial Port B = 005H
;
; Either port is acceptable & the usage will depend upon the
; configuration of your system. If you are using an external
; terminal, you will need to use Serial Port A. If you are
; using the on board video & a serial printer, then you will
; need to use Serial Port B. If you are using an external
; terminal and a serial printer, check into obtaining a port
; expansion board. The jumper boards for the serial channels
; will need to be set. The following table lists the jumpers:
;
; Signal <pt A> <pt B> Direction
; JB4 JB5
; ====== ====== ====== ======================
; TxD 7- 8 7- 8 from computer to modem
; RxD 11-12 11-12 from modem to computer
; RTS 15-16 15-16 from computer to modem
; CTS 19-20 19-20 from modem to computer
; DTR 23-24 23-24 from computer to modem
; DCD 27-28 27-28 from modem to computer
; RxC 31-32 (Port A receive baud rate clock)
; TxC 35-36 (Port A transmit baud rate clock)
;
IF PORT$A
PORT EQU 004H ;Big Board I Serial Output Port A.
GENR EQU 000H ;Big Board I Baud Rate Generator for Port A.
ENDIF ;Port A
;
IF PORT$B
PORT EQU 005H ;Big Board I Serial Output Port B.
GENR EQU 00CH ;Big Board I Baud Rate Generator for Port B.
ENDIF ;Port B
;
CTL1: EQU PORT+2 ;Modem control port.
DATP: EQU PORT ;Modem data port.
CTL2: EQU PORT+2 ;Modem status port.
;
CMDREG EQU 000H ;SIO command register.
FMTREG EQU 004H ;SIO serial format register.
RCVREG EQU 003H ;SIO receiver control register.
XMTREG EQU 005H ;SIO transmitter control register.
;
RCVB: EQU 01H ;Your bits to test for receive.
RCVR: EQU 01H ;Your value when receive ready.
SNDB: EQU 04H ;Your bits to test for send.
SNDR: EQU 04H ;Your value when send ready.
DCDB EQU 08H ;Your bit to test for Data Carrier Detect.
DCDR EQU 08H ;Your value when Data Carrier Detect(ed).
;
; The following values are sent to the Transmitter Control
; (Reg. 5) of the SIO.
;
NORMAL: EQU 1$11$0$1$0$1$0B ;Your value for normal comm'n mode.
BRK: EQU 1$11$1$1$0$1$0B ;Your value for send break.
DISCON: EQU 0$11$0$0$0$0$0B ;Your value for disconnection.
;
; Baud rate constants for the COM8116 baud rate generator...
;
G50 EQU 000H ; 50 baud
G75 EQU 001H ; 75 baud
G110 EQU 002H ; 110 baud
G135 EQU 003H ; 135 baud
G150 EQU 004H ; 150 baud
G300 EQU 005H ; 300 baud
G600 EQU 006H ; 600 baud
G1200 EQU 007H ; 1200 baud
G1800 EQU 008H ; 1800 baud
G2000 EQU 009H ; 2000 baud
G2400 EQU 00AH ; 2400 baud
G3600 EQU 00BH ; 3600 baud
G4800 EQU 00CH ; 4800 baud
G7200 EQU 00DH ; 7200 baud
G9600 EQU 00EH ; 9600 baud
G19200 EQU 00FH ; 19200 baud
GERROR EQU 0FFH ; baud rate error code
;
; Initialize the Z80 SIO...
;
INIT: MVI A,CMDREG ;select the command register
OUT CTL1
MVI A,00$011$000B ;& ,reset the port,.
OUT CTL1
CALL SETFMT ;set the serial format
CALL SETRCV ;set & enable the receiver
CALL SETXMT ;set & enable the transmitter
;
; and the COM8116 baud rate generator.
;
CRATE: MVI A,C300 ;`default' transfer time to 300 baud.
STA MSPEED
MVI A,47H ;generator set up
OUT GENR ;send to baud rate generator
GRATE: MVI A,G300 ;initialized at 300 baud.
OUT GENR ;send to baud rate generator
RET
;
; SIO register set routines...
;
SETFMT: MVI A,FMTREG ;select the format register
OUT CTL1
SFRMT: MVI A,01$00$01$00B ;& set clock rate,, 1 stop bit, no parity.
OUT CTL1
RET
;
SETRCV: MVI A,RCVREG ;select receiver control register
OUT CTL1
SRCVR: MVI A,11$00000$1B ;& set 8 bit character,, enable receive.
OUT CTL1
RET
;
SETXMT: MVI A,XMTREG ;select transmit control register
OUT CTL1
SXMTR: MVI A,NORMAL ;& enable send, 'dtr', 'rts'
OUT CTL1
RET
;.....
;
; Setup routine to allow changing modem speed with the SET command.
;
; As documented, SET either displays the baud rate settings (with a null
; argument) or is used to set the baud rate. The expanded SET now
; allows the parity, word size, & stop bits to be set. These additional
; arguments may occur singly or in combination with other parameters.
; If multiple arguments are used with the set command, then spaces must
; separate them. Command arguments may occur in any order as long as
; the baud rate is the last argument. All arguments after the baud rate
; are ignored. The serial parameters are displayed at the end of each
; routine invocation if ALWAYS = YES and are always displayed if the
; arguments do not include a baud rate setting.
;
; The SET command also includes a local help screen that lists the
; arguments that affect the port status. The help screen is invoked
; by a `?' or `HELP' argument.
;
; Included in the table of allowable arguments are some null arguments
; intended for documentation purposes. These arguments have no effect
; on the port status.
;
; The following is a table of the available options:
;
; Type Value Setting
; ============= ======= =======
; Baud Rate- 50 50 baud
; 75 75 baud
; 110 110 baud
; 134.5 134.5 baud
; 150 150 baud
; 300 300 baud <=- default value
; 600 600 baud
; 1200 1200 baud
; 1800 1800 baud
; 2000 2000 baud
; 2400 2400 baud
; 3600 3600 baud
; 4800 4800 baud
; 7200 7200 baud
; 9600 9600 baud
; 19200 19200 baud
;
; Parity- NO no parity <=- default value
; ODD odd parity
; EVEN even parity
;
; Word Size- 8 8 bits per char <=- default value
; 7 7 bits per char
;
; Stop Bits- 1 1 stop bit <=- default value
; 1.5 1.5 stop bits
; 2 2 stop bits
;
; Null Args.- BPS null
; BAUD "
; PARITY "
; WORD "
; SIZE "
; STOP "
; BIT "
; BITS "
;
; For example,
;
; SET NO 8 2 110 <=- note: baud rate last
; or
; SET NO PARITY 8 BIT CHAR 2 STOP BITS 110 BAUD
;
; Sets 110 baud, no parity, 8 bit character size, & 2 stop bits. If
; ALWAYS = YES, then the port status will be displayed. If ALWAYS = NO,
; then the port status will not be displayed. Note thet the second
; command line has the same result as the first.
;
; SET 7 BIT WORD SIZE ODD PARITY 1.5 STOP BITS
;
; Doesn't change the baud rate (from whatever it was before) and
; sets the parity to odd, 7 bit character size, & 1.5 stop bits. The
; port status will be displayed because the baud rate was not specified.
;
; SET 2 STOP BITS
;
; Changes the number of stop bits to 2. Again, the port status will
; be displayed.
;
; This expansion is entirely compatable with read files. Auto setting
; of the baud rate from the phone directory is still limited to the
; recognized baud rates of MEX (i.e. 110,300,600,1200,2400,4800,9600,
; & 19200). 450 baud and 710 baud cannot be supported on this machine.
; Serial format parameters cannot be set from the phone directory.
;
; SET command extension types...
;
PARITY EQU 0FEH ; set parity command
WORDSZ EQU 0FDH ; set word size
STOPBT EQU 0FCH ; set stop bits
HELP EQU 0FBH ; call for help
TRASH EQU 0FAH ; null arguments
;
RMASK EQU 00$111111B ;receiver char size clearing mask
RBITS EQU 11$000000B ;I wish I was a real live assembler
TMASK EQU 1$00$11111B ;transmitter char size clearing mask
CHAR7B EQU 01$000000B ;7 bits per character value
CHAR8B EQU 11$000000B ;8 bits per character value
;
PMASK EQU 111111$00B ;parity enable clearing mask
PBITS EQU 000000$11B ;I wish I was a real live assembler
PAROFF EQU 000000$00B ;bits to set for parity off
PARODD EQU 000000$01B ;bits to set for odd parity
PAREVN EQU 000000$11B ;bits to set for even parity
;
SMASK EQU 1111$00$11B ;stop bits clearing mask
SBITS EQU 0000$11$00B ;I wish I was a real live assembler
STOP10 EQU 0000$01$00B ;bits to set for one stop bit
STOP15 EQU 0000$10$00B ;bits to set for one and a half stop bits
STOP20 EQU 0000$11$00B ;bits to set for two stop bits
;
SETB: MVI C,SBLANK ;Any arguments?
CALL MEX
JC TELL ;If not, go display baud
LXI D,CMDTBL
MVI C,LOOKUP
CALL MEX ;Parse argument
JC CMDERR ;If not found then proclaim goof
MOV A,H ;Get the command number
;
CPI PARITY ;Check for parity set
JZ PARSET ;If so, go set the parity
;
CPI WORDSZ ;Check for word size
JZ WRDSET ;If so, go set the word size
;
CPI STOPBT ;Check for stop bits
JZ STPSET ;If so, go set stop bits
;
CPI TRASH ;Check for null argument
JZ SETB ;If so, continue parsing
;
CPI HELP ;Check for help command
JZ HELPUS ;If so, print help file
;
CPI CERROR ;Check for unsupported command rate
JNZ LOADBD ;Continue if supported
;
PUSH H ;else, save the generator rate
MVI C,ILP ;& print warning message.
CALL MEX
DB CR,LF,'-=*=- WARNING -=*=-',CR,LF
DB 'MEX does not recognize this baud rate !!',CR,LF,LF,0
POP H ;restore the generator rate
JP GENSET ;& go set it
;
LOADBD: STA CRATE+1 ;change time-to-send to match baudrate
GENSET: MOV A,L ;get baudrate byte
STA GRATE+1 ;send to COM8116 timer for new baudrate
CALL CRATE ;reinitialize to new baudrate
;
IF NOT ALWAYS
RET ;then done!
ENDIF ;show only on null set or format set.
;
IF ALWAYS
JMP TELL ;then done!
ENDIF ;always show parameters on baud set.
;
CMDERR: MVI C,ILP
CALL MEX ;Tell user input not valid
DB CR,LF,'-=*=- Undefined SET argument -=*=-',CR,LF,LF,0
JMP TELL ;abort the balance of the SET command
;& display the current status
;
PARSET: LDA SFRMT+1 ;get the format byte
ANI PMASK ;clear the parity bits
ORA L ;install the new bits
STA SFRMT+1
CALL SETFMT ;set the SIO
JMP DONSET
;
STPSET: LDA SFRMT+1 ;get the format byte
ANI SMASK ;clear the stop bits
ORA L ;install the new bits
STA SFRMT+1
CALL SETFMT ;set the SIO
JMP DONSET
;
WRDSET: LDA SRCVR+1 ;get the receiver byte
ANI RMASK ;clear the word size bits
ORA L ;install the new word size
STA SRCVR+1
CALL SETRCV ;set the SIO
MOV A,L ;get the word size
RRC ;move to proper position for
MOV L,A ; transmitter byte
LDA SXMTR+1 ;get the transmitter byte
ANI TMASK ;clear the word size bits
ORA L ;install the new word size
STA SXMTR+1
CALL SETXMT ;set the SIO
;
DONSET: JMP SETB ;go look for more parameters
;....
;
; Display the current baud rate.
;
TELL: MVI C,ILP ;get ready...
CALL MEX
DB CR,LF,'-=*=- Port Status -=*=-',CR,LF,' ',0
LDA GRATE+1 ;get the current baud rate
ANI 00FH ;set limit (safety factor)
ADD A ; times two...
LXI H,CNVTBL ;get the conversion table base
ADD L ;add generator code to table base
MOV L,A
MVI A,000H
ADC H
MOV H,A
SHLD BPNTR ;get the source address
DB IN$LHLD ;LHLD instruction
BPNTR: DS 2 ;(vector to where the pointer is)
LXI D,BDMSG ;get the destination buffer
DCX H ;pre-decrement addresses
DCX D
;
; move the command from the table to the print buffer
;
MOVCMD: INX H ;point to the next addresses
INX D
MOV A,M ;get a byte
ORA A ;set/clear the negative flag
PUSH PSW ;& save it
ANI 07FH ;strip high bit
STAX D ;store the byte
POP PSW ;restore flags
JP MOVCMD ;continue if high bit not set
;
INX D ;point to the last byte
XRA A ;make a zero to end data field
STAX D ;& store it
INX D ;point to where an instruction should be
MVI A,IN$RET ;make a return instruction
STAX D ;& store it
CALL PRNTBD ;go print the baud rate command
;
MVI C,ILP ;print english stuff...
CALL MEX
DB ' baud',CR,LF,0
;
; Display the parity
;
LDA SFRMT+1 ;get the format byte
ANI PBITS ;select the bits for parity
CPI PAROFF ;check for parity off
JNZ PCKODD ;if not off, see if odd
MVI C,ILP ;else, proclaim no parity
CALL MEX
DB ' NO parity',CR,LF,0
JMP PROWRD ;go tell about the char size
PCKODD: CPI PARODD ;check for parity odd
JNZ PCKEVN ;if not odd, then call it even
MVI C,ILP ;else, proclaim odd parity
CALL MEX
DB ' ODD parity',CR,LF,0
JMP PROWRD ;go tell about the char size
PCKEVN: MVI C,ILP ;should be even parity
CALL MEX
DB ' EVEN parity',CR,LF,0
;
; Display the character size
;
PROWRD: LDA SRCVR+1 ;get the receiver byte
ANI RBITS ;& mask out unneeded bits
CPI CHAR7B ;see if 7 bits per char
JNZ PCK8BT ;if not, then use 8 bits
MVI C,ILP
CALL MEX
DB ' 7 bit char',CR,LF,0
JMP PROSTP ;go tell how many stop bits
PCK8BT: MVI C,ILP
CALL MEX
DB ' 8 bit char',CR,LF,0
;
; Display the number of stop bits
;
PROSTP: LDA SFRMT+1 ;get format byte
ANI SBITS ;mask off unneeded bits
CPI STOP10 ;check for 1 stop bit
JNZ PCKS15 ;if not, try 1.5 bits
MVI C,ILP
CALL MEX
DB ' 1 stop bit',CR,LF,0
RET
PCKS15: CPI STOP15 ;check for 1.5 stop bits
JNZ PCKS20 ;if not, then 2 stop bits
MVI C,ILP
CALL MEX
DB ' 1.5 stop bits',CR,LF,0
RET
PCKS20: MVI C,ILP
CALL MEX
DB ' 2 stop bits',CR,LF,0
RET
;
; Help section...
;
HELPUS: MVI C,ILP ;print the help message
CALL MEX
DB CR,LF
DB 'The set command takes the following arguments:',CR,LF,LF
DB ' Baud Rates: 50 75 110 134.5',CR,LF
DB ' 150 300 600 1200',CR,LF
DB ' 1800 2000 2400 3600',CR,LF
DB ' 4800 7200 9600 19200',CR,LF,LF
DB ' Parity: NO ODD EVEN',CR,LF,LF
DB ' Stop Bits: 1 1.5 2',CR,LF,LF
DB ' Word Size: 7 8',CR,LF,LF
DB 'If baud rate is specified, then it must be the',CR,LF
DB 'last argument in the command string. Example:',CR,LF,LF
DB ' SET NO 8 2 110',CR,LF,LF
DB 'This sets no parity, 8 bits per word, 2 stop bits,',CR,LF
DB 'and 110 baud rate. SET with no arguments displays',CR,LF
DB 'the current status.',CR,LF,0
RET ;return
;
; Command table lists what's ok & what values to use...
;
CMDTBL:
;
; Baud Rates...
;
P300: DB '30','0'+80H ; 300 baud command
DB G300 ; L reg
DB C300 ; H reg
P1200: DB '120','0'+80H ; 1200 baud command
DB G1200
DB C1200
P2400: DB '240','0'+80H ; 2400 baud command
DB G2400
DB C2400
P110: DB '11','0'+80H ; 110 baud command
DB G110
DB C110
;
; Baud rates not Smart Modem compatible
;
P600: DB '60','0'+80H ; 600 baud command
DB G600
DB C600
P4800: DB '480','0'+80H ; 4800 baud command
DB G4800
DB C4800
P9600: DB '960','0'+80H ; 9600 baud command
DB G9600
DB C9600
P19200: DB '1920','0'+80H ; 19200 baud command
DB G19200
DB C19200
;
; baud rates unrecognized by MEX
;
P50: DB '5','0'+80H ; 50 baud command
DB G50
DB CERROR
P75: DB '7','5'+80H ; 75 baud command
DB G75
DB CERROR
P135: DB '134.','5'+80H ; 134.5 baud command
DB G135
DB CERROR
P150: DB '15','0'+80H ; 150 baud command
DB G150
DB CERROR
P1800: DB '180','0'+80H ; 1800 baud command
DB G1800
DB CERROR
P2000: DB '200','0'+80H ; 2000 baud command
DB G2000
DB CERROR
P3600: DB '360','0'+80H ; 3600 baud command
DB G3600
DB CERROR
P7200: DB '720','0'+80H ; 7200 baud command
DB G7200
DB CERROR
;
; Parity commands
;
DB 'N','O'+80H ; set no parity
DB PAROFF
DB PARITY
DB 'OD','D'+80H ; set odd parity
DB PARODD
DB PARITY
DB 'EVE','N'+80H ; set even parity
DB PAREVN
DB PARITY
;
; Word Size commands
;
DB '7'+80H ; set 7 bit character
DB CHAR7B
DB WORDSZ
DB '8'+80H ; set 8 bit character
DB CHAR8B
DB WORDSZ
;
; Stop Bits commands
;
DB '1'+80H ; set 1 stop bit
DB STOP10
DB STOPBT
DB '1.','5'+80H ; set 1.5 stop bits
DB STOP15
DB STOPBT
DB '2'+80H ; set 2 stop bits
DB STOP20
DB STOPBT
;
; Help commands
;
DB 'HEL','P'+80H ; help
DB 0
DB HELP
DB '?'+80H ; ?
DB 0
DB HELP
;
; Null arguments
;
DB 'BP','S'+80H ; 'bps'
DB 0
DB TRASH
DB 'BAU','D'+80H ; 'baud'
DB 0
DB TRASH
DB 'PARIT','Y'+80H ; 'parity'
DB 0
DB TRASH
DB 'CHA','R'+80H ; 'char'
DB 0
DB TRASH
DB 'WOR','D'+80H ; 'word'
DB 0
DB TRASH
DB 'SIZ','E'+80H ; 'size'
DB 0
DB TRASH
DB 'STO','P'+80H ; 'stop'
DB 0
DB TRASH
DB 'BI','T'+80H ; 'bit'
DB 0
DB TRASH
DB 'BIT','S'+80H ; 'bits'
DB 0
DB TRASH
;
; Command Table end
;
DB 0 ; end of comparision list.
;
; Backwards Conversion Table - this table is used to report the
; current baud rate from the byte used to set the generator. This
; bypasses the MEX print baud rate function.
;
CNVTBL: DW P50
DW P75
DW P110
DW P135
DW P150
DW P300
DW P600
DW P1200
DW P1800
DW P2000
DW P2400
DW P3600
DW P4800
DW P7200
DW P9600
DW P19200
;
PRNTBD: MVI C,ILP
CALL MEX
BDMSG: DS 10 ; to print baud rate command string
;....
;
; Set new modem port baud rate. This routine is used to auto set the
; baud rate from the phone directory and as such is limited to only
; the baud rates that MEX recognizes. No provisions are made here to
; set the parity, word size, or stop bits.
;
NEWB: PUSH PSW ; save the rate code
LXI H,GTABLE ; get vector to lookup table
ADD L ; add rate code to table base
MOV L,A
MVI A,000H
ADC H
MOV H,A
MOV L,M ; get generator rate from table
MOV A,L ; test for valid rate
CPI GERROR
JNZ OKBAUD ; continue if valid
;
MVI C,ILP ; else print error message
CALL MEX
DB CR,LF,'-=*=- ',0
POP PSW
MVI C,PRBAUD
CALL MEX
MVI C,ILP
CALL MEX
DB ' -=*=- is not supported - no change.',CR,LF,0
RET
;
OKBAUD: POP PSW ; restore rate code
JMP LOADBD ; & go set the baud rate.
;
GTABLE: DB G110 ;`0' - 110 baud
DB G300 ;`1' - 300 baud
DB GERROR ;`2' - 450 baud *** not supported ***
DB G600 ;`3' - 600 baud
DB GERROR ;`4' - 710 baud *** not supported ***
DB G1200 ;`5' - 1200 baud
DB G2400 ;`6' - 2400 baud
DB G4800 ;`7' - 4800 baud
DB G9600 ;`8' - 9600 baud
DB G19200 ;`9' - 19200 baud
;
;
EOSMSG: DB 017H,0,0,0,'$'
CLSMSG: DB 01AH,0,0,0,'$'
;
; NOTE: MUST TERMINATE PRIOR TO 0B00H (with Smartmodem)
; 0D00H (without Smartmodem)
;
END
code
LXI H,GTABLE ; get vector to lookup table
ADD L ; add rate code to table base
MOV L,A
MVI A,00