home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
mex
/
mxh-kp53.asm
< prev
next >
Wrap
Assembly Source File
|
1994-07-13
|
26KB
|
948 lines
Title 'MexPlus Overlay for Kaypros Version 5.3'
;
REV EQU 53 ;OVERLAY REVISION LEVEL
;
;
; MexPlus Hardware (MXH) Overlay for Kaypro Computers
; using an external smartmodem.
;
; NOTE: To fully implement MEXPLUS you need also get:
;
; MXT-KP*.OVR Kaypro termcap (video) overlay
; MXM-SM*.OVR Smartmodem dialing overlay
; MXC-K484.OVR For Kaypro Internal factory clock, or
; MXC-LG10.OVR Legacy KP10 clock overlay
;
; MEXPLUS uses the following conventions:
;
; MXH-*.OVR Hardware overlay for computer
; MXT-*.OVR Terminal capability overlay
; MXC-*.OVR Real-time clock overlay for 8080/Z80 vers
; MXM-*.OVR Modem overlay
;
; These overlays are available from The NightOwl Connection
; if you are subscriber or thru The DatCOM Super System
; (813) 937-3608 300/1200 bps (annual fee also req'd).
;
; //////////////////////////////////////////////////////////
;
; A full-featured SET command processor is implemented.
; The following table outlines the SET command options:
;
;
; SET Command
;
; BAUD <RATE> Set modem to Baud rate specified.
; Baud rates supported are 110, 300,
; 600, 1200, 2400, 4800, 9600, 19200
;
; ORIG Set modem to Originate mode
; ANSWER Set modem to Auto-answer mode
; TONE Set modem to Tone dialing
; PULSE Set modem to Pulse dialing
; MONITOR Turn Hayes monitor ON
; QUIET Turn Hayes monitor OFF
; PARITY Set Parity to Odd, Even, or Off
; STOPBITS Set number of Stop Bits to 1, 1.5, 2
; LENGTH Set word length to 5, 6, 7, 8
;
; MANUAL ORIG <or> ANSWER Place modem in active state and
; generate Answer or Originate
; carrier tone
;
;
; History:
; 08/12/85 v5.3 Trimmed down the code, it was 7 bytes too long.
; Remember, this thing HAS to end by 0AFF!; Also,
; all the Smartmodem code that's still here (I
; thought somebody removed all that???) induced me
; to do a new Kaypro overlay, MXH-KG10 (Kaypro Gen-
; eric), with no Smartmodem code. I've been able
; to test it only on a couple of Kaypro models -- I
; think it should work for all -- I'd appreciate any
; feedback from people using the KG10 overlay.
; --Ron Fowler
;
; 07/12/85 v5.2 Removed and rewote code for 'eye wash' as it made a
; nice generic kp overlay kp-video dependent. Changed
; code to enter mex's video attribute routines the way
; its supposed to be done. Also changed modem init to
; wait 30 sec before timout. Was hanging up prematurely
; on many long distance calls.
; -- Mike Woodward
;
; 05/28/85 v5.1 Added some video 'eye-wash' to the console
; displays to make em look nicer.
; -- Steve Sanders
;
; 05/26/84 v5.0 Modified MXO-KPS4 for MexPlus compatibility.
; -- Terry Carroll
;
;------------------------------------------------------------
;
; Kaypro port definitions
;
EXPORT EQU 04H ;base external port
EXTCT1 EQU EXPORT+2 ;external modem status port
EXTDAT EQU EXPORT ;external modem data port
BAUDRP EQU 00H ;external modem baud rate port
;
; Kaypro bit definitions
;
MDRCVB EQU 01H ;modem receive bit (DAV)
MDRCVR EQU 01H ;modem receive ready
MDSNDB EQU 04H ;modem send bit
MDSNDR EQU 04H ;modem send ready bit
;
;
; MEX service processor equates
;
MEX EQU 0D00H ;address of the service processor
INMDM EQU 255 ;get char from port to A, CY=no more in 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 ;recv a char from 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 nxt 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
;
; MEX TERMINAL OVERLAY VECTORS
CLS EQU 140FH ;clear screen
ENTREV EQU 1415H ;enter rev video
EXREV EQU 1418H ;exit rev video
ENTBRT EQU 141BH ;enter bright (exit dim?)
EXBRT EQU 141EH ;exit bright (enter dim?)
;
PRINT EQU 9 ;BDOS/MEX print-string function call
;
BELL EQU 7 ;bell
TAB EQU 9
CR EQU 13 ;carriage return
LF EQU 10 ;linefeed
ESC EQU 1BH ;escape
YES EQU 0FFH
NO EQU 0
;
I8080 EQU YES ;FOR TRANSLATOR - DO NOT CHANGE
I8086 EQU NO
CPM EQU YES
PCDOS EQU NO
;
;
; ## The following JUMP instruction is necessary for MEXPLUS loadable overlays
;
ORG 100H
DB 0C3H ;##JMP INSTRUCTION (MEX 1.2)
;
; Change the clock speed to suit your system
;
DS 2 ;(for "JMP START" instruction)
DB NO ;yes=PMMI S-100 Modem 103H
DB YES ;yes=HAYES Smartmodem, no=non-PMMI 104H
TPULSE: DB 'T' ;T=touch, P=pulse (Smartmodem-only) 105H
CLOCK: DB 50 ;clock speed in MHz x10, 25.5 MHz max. 106H
;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
MSPEED: DB 5 ;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
COLUMS: DB 5 ;number of DIR columns shown 10AH
SETFLG: DB YES ;yes=user-added Setup routine 10BH
SCRTST: DB YES ;Cursor control routine 10CH
DB YES ;yes=resend a record after any non-ACK 10DH
;no=resend a record after a valid-NAK
BAKFLG: DB YES ;yes=change any file same name to .BAK 10EH
CRCDFL: DB YES ;yes=default to CRC checking 10FH
TOGCRC: DB YES ;yes=allow toggling of CRC to Checksum 110H
CVTBS: DB NO ;yes=convert backspace to rub 111H
TOGLBK: 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
DB YES ;yes=allow transmission of logon 115H
;write logon sequence at location LOGON
SAVCCP: DB YES ;yes=do not overwrite CCP 116H
DB NO ;yes=local command if EXTCHR precedes 117H
;no=external command if EXTCHR precedes
DB YES ;yes=allow toggling of LOCONEXTCHR 118H
LSTTST: DB YES ;yes=printer available on printer port 119H
XOFTST: DB NO ;yes=checks 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
TOGXOF: DB YES ;yes=allow toggling of XOFF checking 11CH
IGNCTL: DB NO ;yes=CTL-chars above ^M not displayed 11DH
EXTRA1: DB 0 ;for future expansion 11EH
EXITCHR DB 'E'-40H ;^E = Exit to main menu 11FH
BRKCHR: DB '@'-40H ;^@ = Send 300 ms. break tone 120H
NOCONN: 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
TRNCHR: DB 'T'-40H ;^T = Transmit file to remote 125H
SAVCHR: DB 'Y'-40H ;^Y = Open input text buffer 126H
EXTCHR: DB '^'-40H ;^^ = Send next character 127H
DS 2 ;unused by MEX 128H
;
;
; Low-level modem I/O routines.
;
INCTL1: JMP INCTRL ;in modem control port
DB 0,0,0,0,0,0,0 ;spares if needed for non-PMMI
;
OTDATA: JMP OUTDTA ;out modem data port
DB 0,0,0,0,0,0,0 ;spares if needed for non=PMMI
;
INPORT: JMP INDATA ;in modem data port
DB 0,0,0,0,0,0,0 ;spares if needed for non-PMMI
;
; Bit-test routines.
;
MASKR: ANI MDRCVB ;bit to test for receive ready
RET
TESTR: CPI MDRCVR ;value of receive bit when ready
RET
MASKS: ANI MDSNDB ;bit to test for send ready
RET
TESTS: CPI MDSNDR ;value of send bit when ready
RET
;
;
; ## Following are two new entrie points for MEXPLUS
; DCDTST returns data-carrier detect in A: 0 if no carrier
; present, 0FFH if carrier is present, and 0FEH if overlay
; doesn't know (i.e., doesn't support carrier detect)
; RNGDET works similarly for ring-detect.
;
DCDTST: JMP DCDVEC ;data carrier detect 154H
RNGDET: JMP RNGVEC ;ring-detect 157H
;
; End of MEXPLUS added vectors
;
DB 0,0,0,0,0 ;reserved space, assumed 0
; 15FH
SMDISC: DS 3 ;software disconnect (in smartmodem overlay)
;
DS 3 ;DIALV: not done here (maybe MXO-SM) 162H
DISCV: JMP DISCON ;disconnect (if not used, should be JMP SMDISC)
GOODBV: JMP GOODBYE ; 168H
INMODV: JMP NITMOD ;go to user written routine 16BH
JMP PBAUD ;NEWBDV 16EH
RET ;NOPARV 171H
NOP
NOP
RET ;PARITV 174H
NOP
NOP
SETUPV: JMP SETCMD ; 177H
DS 3 ;not used by MEX 17AH
VERSNV: JMP SYSVER ; 17DH
BREAKV: JMP SBREAK ; 180H
;
; Do not change the following six lines (they provide access to routines
; in MEX that are present to support MDM7 overlays -- they will likely
; be gone by MEX v2.0).
;
ILPRTV: DS 3 ; 183H
INBUFV DS 3 ; 186H
ILCMPV: DS 3 ; 189H
INMDMV: DS 3 ; 18CH
DS 3 ; 18FH
TIMERV DS 3 ; 192H
;
;
ORG 200H ;## NEW BOUNDARY FOR MEX1.2
;------------------------------------------------------------
;
; end of fixed area
;
;------------------------------------------------------------
;
; Low level modem routine area
;
INCTRL: MVI A,10H
OUT EXTCT1
IN EXTCT1
RET
;
INDATA: IN EXTDAT
RET
;
OUTDTA: OUT EXTDAT
RET
;
; Print out the overlay version
;
SYSVER: CALL MILP
DB CR,LF
DB 'KAYPRO MexPlus Overlay --- Version '
DB REV/10+'0'
DB '.'
DB REV MOD 10+'0'
DB CR,LF,CR,LF
DB 0
RET
;
; Break, disconnect and goodbye routines
;
SBREAK: MVI A,5
OUT EXTCT1
LDA REG5
ORI 9AH ;Send a break
OUT EXTCT1
MVI B,3 ;DELAY 300 MS.
CALL MTIME
MVI A,5
OUT EXTCT1
LDA REG5
OUT EXTCT1 ;stop break
RET
;
; ## return data carrier detect status
; 0 = no carrier
; 255 = carrier present
; 254 = we don't know (DCD not supported)
;
DCDVEC: MVI A,0FEH ;get status port
RET ;return "we don't know" detect
;
; ## return ring-detect status:
;
; 0 = not ringing
; 255 = ring detected
; 254 = we don't kno
;
RNGVEC: MVI A,0FEH ;return "we don't know"
RET
;
; Disconnect Hayes, etc.
;
DISCON: MVI A,5
OUT EXTCT1 ;SEND TO THE STATUS PORT
MVI A,68H ;TURN OFF DTR/RTS
OUT EXTCT1
MVI B,10 ;DELAY 1 SEC.
CALL MTIME
MVI A,5
OUT EXTCT1
MVI A,0EAH ;TURN 'EM BACK ON AGAIN
OUT EXTCT1
RET
;
; GOODBYE routines are called by MEX prior to exit to CP/M
;
GOODBYE: RET ;NOTE: EXIT TO CP/M WITH NO CHANGE TO
;CONNECT STATUS OR SETTINGS (PARITY, ETC)
;
; Initialize RS-232 port, Smartmodem, and default modes.
;
NITMOD: CALL INCTRL ;SEE IF MODEM IS CONNECTED, I.E., RETURNING
ANI 08H ; TO ACTIVE MODEM FROM CPM
RNZ ;SKIP IF CONNECTED
CALL NITSIO
LDA MSPEED ;GET DEFAULT BAUD RATE
CALL PBAUD ;SET IT
LDA MONFLG ;GET MONITOR DEFAULT
ORA A
MVI A,'0' ;SPEAKER OFF
JZ NITMOD4
MVI A,'1' ;SPEAKER ON
NITMOD4: STA SMINIT+3 ;PUT IT IN SMINIT STRING
LDA ANSFLG ;GET MODE DEFAULT
ORA A
MVI A,'0' ;ORIGINATE
JZ NITMOD5
MVI A,'1' ;ANSWER
NITMOD5: STA SMINIT+8 ;PUT IT IN SMINIT STRING
LXI H,SMINIT
SINIT: CALL SMSEND ;SEND THE INIT STRING
SMTLP1: MVI C,INMDM ;WAIT FOR MODEM RESPONSE
CALL MEX
JNC SMTLP1 ;EAT EVERYTHING UNTIL SILENCE FOR
RET ; 100 MSEC
;
; Initialize the Zilog SIO chip
;
NITSIO: MVI A,00H ;Select reg. 0
OUT EXTCT1
LDA REG0 ;Command byte
OUT EXTCT1
MVI A,04H ;Select reg. 4
OUT EXTCT1
LDA REG4 ;Receive/transmit control byte
OUT EXTCT1
MVI A,03H ;Select reg. 3
OUT EXTCT1
LDA REG3 ;Receiver logic byte
OUT EXTCT1
MVI A,05H ;Select reg. 5
OUT EXTCT1
LDA REG5 ;Transmitter logic byte
OUT EXTCT1
RET
;
; Set command processor
;
SETCMD: MVI C,SBLANK ;ANY ARGUMENTS?
CALL MEX
JC SETSHO ;IF NOT, DISPLAY DEFAULT(S)
LXI D,CMDTBL
MVI C,LOOKUP
CALL MEX ;PARSE THE ARGUMENT
PUSH H ;SAVE ANY PARSED ARGUMENTS ON STACK
RNC ;IF WE HAVE ONE, RETURN TO IT
POP H ;OOPS, INPUT NOT FOUND IN TABLE
SETERR: CALL ENTREV ;TERMINAL OVERLAY ENTER REV VIDEO
LXI D,SETEMS
MVI C,PRINT
CALL MEX
CALL EXREV ;TERMINAL OVERLAY EXIT REV VIDEO
CALL CRLF
RET
SETEMS: DB CR,LF,'=> SET command error <='
db CR,LF,'$'
;
; Argument table
;
CMDTBL: DB '?'+80H ; HELP
DW SETHELP
DB 'ORI','G'+80H ; ORIGINATE MODE
DW ORIG
DB 'ANSWE','R'+80H ; ANSWER MODE
DW ANS
DB 'TON','E'+80H ; TONE DIALING
DW STTONE
DB 'PULS','E'+80H ; PULSE DIALING
DW STPULSE
DB 'MONITO','R'+80H ; MONITOR ON
DW MONIT
DB 'QUIE','T'+80H ; MONITOR OFF
DW QUIET
DB 'BAU','D'+80H ; SET BAUD
DW STBAUD
DB 'PARIT','Y'+80H ; SET PARITY
DW STPRTY
DB 'STOPBIT','S'+80H ; SET STOPBITS
DW STSTOP
DB 'LENGT','H'+80H ; SET LENGTH
DW STBITS
DB 'MANUA','L'+80H ; SET TO MANUAL MODE
DW MANUAL
DB 0 ;TABLE TERMINATOR
;
;
; "SET (no args): PRINT CURRENT STATISTICS
;
SETSHO: CALL ENTREV ;TERMINAL OVERLAY ENTER REV VIDEO
CALL MILP
DB ' Current SET values: '
db CR,LF,0
CALL EXREV ;TERMINAL OVERLAY EXIT REV VIDEO
CALL CRLF
CALL MDSHOW
CALL TPSHOW
CALL BDSHOW
CALL MONSHO
CALL CRLF
CALL SHPRTY
CALL SHSTOP
CALL SHBITS
CALL CRLF
CALL CRLF
RET
;
; "SET ?" processor
;
SETHELP: CALL CLS
CALL ENTREV
CALL MILP
db ' Available SET Commands: '
db CR,LF,0
CALL EXREV
CALL MILP
DB CR,LF,'SET ORIG - Set modem to Originate mode'
DB CR,LF,' (Disable auto-answer mode)'
DB CR,LF,'SET ANSWER - Set modem to auto-answer mode'
DB CR,LF,'SET TONE - Set modem for Touchtone dialing'
DB CR,LF,'SET PULSE - Set modem for Pulse dialing'
DB CR,LF,'SET PARITY - OFF, EVEN or ODD'
DB CR,LF,'SET STOPBITS - 1, 1.5 or 2'
DB CR,LF,'SET LENGTH - 5, 6, 7 or 8'
DB CR,LF,'SET QUIET - Turn Modem monitor OFF'
DB CR,LF,'SET MONITOR - Turn Modem monitor ON'
DB CR,LF,'SET BAUD - 300, 1200, 2400, 4800, 9600, 19200'
DB CR,LF,'SET MANUAL - ORIG or ANSWER'
DB CR,LF,' Manually generate Answer or Originate '
DB 'carrier tone'
DB CR,LF,CR,LF,0
RET
;
; Set manual processor
; Note: manual mode does not change the auto-answer status of the modem
;
MANUAL: MVI C,SBLANK ;check for ORIG <or> ANSWER
CALL MEX ;
JC SETERR ;if none, print error
LXI D,MANTBL ;check for proper syntax
MVI C,LOOKUP
CALL MEX
PUSH H ;match found, go do it!
RNC ;
POP H ;no match: fix stack and
JMP SETERR ; print error
;
MANORIG: MVI B,30 ;FORCE 3 SECOND DELAY ON ORIGINATE END
CALL MTIME
LXI H,SMATD ;SEND OUT 'ATD'
CALL SINIT
CALL MILP
DB CR,LF,'Manual originate mode......',CR,LF
DB 'Modem now awaiting detection of an answer tone......'
DB CR,LF,CR,LF,CR,LF,0
JMP GOMAN
MANANS: LXI H,SMATA ;SEND OUT 'ATA'
CALL SINIT
CALL MILP
DB CR,LF,CR,LF,'Manual answer mode -- carrier tone sent',CR,LF
DB CR,LF,0
JMP GOMAN
;
SMATD: DB 'ATD',CR,0
SMATA: DB 'ATA',CR,0
;
GOMAN: MVI B,20
CALL MTIME
CALL MILP
DB 'Enter Terminal Mode at next command prompt',CR,LF
DB 'to check status of connection',CR,LF,CR,LF
DB 'To return to voice mode,',CR,LF
DB 'disconnect from within terminal mode <ESC N>,',CR,LF
DB 'or from command line <DSC>',CR,LF,CR,LF,CR,LF,0
RET
;
; Manual originate / answer command table
;
MANTBL: DB 'ORI','G'+80H ;MANUAL ORIGINATE MODE
DW MANORIG
DB 'ANSWE','R'+80H ;MANUAL ANSWER MODE
DW MANANS
DB 0
;
; "SET BAUD" processor
;
STBAUD: MVI C,BDPARS ;FUNCTION CODE: PARSE A BAUDRATE
CALL MEX ;LET MEX LOOK UP CODE
JC SETERR ;JUMP IF INVALID CODE
CALL PBAUD ;NO, TRY TO SET IT
JC SETERR ;IF NOT ONE OF OURS, BOMB OUT
BDSHOW: LDA MSPEED ;GET CURRENT BAUD RATE
MVI C,PRBAUD ;LET MEX PRINT IT
CALL MEX
CALL CRLF
RET
;
; This routine sets baud rate passed as MSPEED code in A.
; Returns CY=1 if baud rate not supported.
;
PBAUD: PUSH H ;DON'T ALTER ANYBODY
PUSH D
PUSH B
MOV E,A ;MSPEED CODE TO DE
MVI D,0
LXI H,BAUDTB ;OFFSET INTO TABLE
DAD D
MOV A,M ;FETCH CODE
ORA A ;0 MEANS UNSUPPORTED CODE
STC ;PREP CARRY IN CASE UNSUPPORTED
JZ PBEXIT ;EXIT IF BAD
OUT BAUDRP ;IF OK, SET IT
MOV A,E ;GET MSPEED CODE BACK
STA MSPEED ;SET IT
ORA A ;RETURN NO ERRORS
PBEXIT: POP B
POP D
POP H
RET
;
BAUDTB: DB 02H ;110
DB 05H ;300
DB 0 ;450 (not supported)
DB 06H ;600
DB 0 ;710 (not supported)
DB 07H ;1200
DB 0AH ;2400
DB 0CH ;4800
DB 0EH ;9600
DB 0FH ;19200
;
; SET MODEM STATUS TO ENABLE OR DISABLE AUTO-ANSWER
;
ORIG: XRA A
STA ANSFLG ;SET ORIG FLAG
LXI H,SMO ;SEND OUT ATS0=0
CALL SINIT
JMP MDSHOW
;
SMO: DB 'ATS0=0',CR,0
SMA: DB 'ATS0=1',CR,0
;
ANS: MVI A,0FFH
STA ANSFLG ;SET ANS FLAG
LXI H,SMA ;SEND OUT ATS0=1
CALL SINIT
;
MDSHOW: LDA ANSFLG
ORA A
JZ MDORIG
CALL MILP
DB 'Auto-answer mode',CR,LF,0
RET
MDORIG: CALL MILP
DB 'Originate mode',CR,LF,0
RET
;
;
; Monitor control processor
;
QUIET: XRA A
STA MONFLG
LXI H,SMQT
CALL SINIT
JMP MONSHO
;
MONIT: MVI A,0FFH
STA MONFLG
LXI H,SMMON
CALL SINIT
;
MONSHO: LDA MONFLG
ORA A
JZ MONOFF
CALL MILP
DB 'Monitor Speaker ON',CR,LF,0
RET
;
MONOFF: CALL MILP
DB 'Monitor Speaker OFF',CR,LF,0
RET
;
SMQT: DB 'ATM0',CR,0
SMMON: DB 'ATM1',CR,0
;
; Set dial processor
;
STTONE: MVI A,'T'
STA TPULSE
JMP TPSHOW
;
STPULSE: MVI A,'P'
STA TPULSE
;
TPSHOW: LDA TPULSE
CPI 54H
JZ TPTONE
CALL MILP
DB 'Pulse Dialing',CR,LF,0
RET
TPTONE: CALL MILP
DB 'Touchtone Dialing',CR,LF,0
RET
;
; SET PARITY command: reset transmit/receive parity
;
; Parity is controlled by bits 0 and 1 of
; the byte sent to the SIO write-register
; 4 as follows:
;
; Parity Bit 1 Bit 0
; Off - 0
; Odd 0 1
; Even 1 1
;
STPRTY: MVI C,SBLANK ;check for parity code
CALL MEX ;
JC SETERR ;if none, print error
LXI D,PARTBL ;check for proper syntax
MVI C,LOOKUP
CALL MEX
PUSH H ;match found, go do it!
RNC ;
POP H ;no match: fix stack and
JMP SETERR ; print error
;
PROFF: LDA REG4 ;get register 4 byte
ANI 0FEH ;reset bit 0
JMP PARTB1 ;
PREVEN: LDA REG4 ;
ORI 003H ;set bits 0 & 1
JMP PARTB1 ;
PRODD: LDA REG4 ;
ORI 001H ;set bit 0
ANI 0FDH ;reset bit 1
PARTB1: STA REG4 ;
CALL NITSIO ;re-initialize the USART
CALL SHPRTY ;print the result
RET ;
SHPRTY: CALL MILP ;display parity
DB 'Parity: ',TAB,' ',0
LDA REG4 ;
ANI 001H ;test bit 0
CPI 0 ;if bit0=0 then parity off
JNZ SHPRT1 ;
CALL MILP ;
DB 'Off',CR,LF,0 ;
RET
SHPRT1: LDA REG4 ;
ANI 002H ;test bit 1
CPI 0 ;if bit1=0 then parity odd
JNZ SHPRT2 ;
CALL MILP ;
DB 'Odd',CR,LF,0 ;
RET ;
SHPRT2: CALL MILP ;
DB 'Even',CR,LF,0 ;
RET
;
; SET PARITY command table
;
PARTBL: DB 'OF','F'+80H ;"set parity off"
DW PROFF
DB 'EVE','N'+80H ;"set parity even"
DW PREVEN
DB 'OD','D'+80H ;"set parity odd"
DW PRODD
DB 0 ;<<== end of parity table
;
; SET STOPBITS command: reset number of stop bits
;
; The number of stop bits is controlled by bits
; 2 and 3 of the byte sent to the SIO write-
; register 4, as follows:
;
; Stop bits Bit 3 Bit 2
; 1 0 1
; 1.5 1 0
; 2 1 1
;
;
STSTOP: MVI C,SBLANK ;check for stop bits
CALL MEX ;
JC SETERR ;if none, print error
LXI D,STPTBL ;check for proper syntax
MVI C,LOOKUP
CALL MEX ;
PUSH H ;match found, go do it!
RNC ;
POP H ;no match: fix stack and
JMP SETERR ; print error
;
STOP01: LDA REG4 ;get register 4 byte
ANI 0F7H ;reset bit 3
ORI 004H ;set bit 2
JMP STSTP1 ;
STOP02: LDA REG4 ;
ORI 00CH ;set bits 2 and 3
JMP STSTP1 ;
STOP15: LDA REG4 ;
ORI 008H ;set bit 3
ANI 0FBH ;reset bit 2
STSTP1: STA REG4 ;
CALL NITSIO ;
CALL SHSTOP ;print the result
RET
SHSTOP: CALL MILP ;display stop-bits
DB 'Stop bits:',TAB,' ',0
LDA REG4 ;
ANI 004H ;test bit 2
CPI 0 ;if bit2=0 then 1.5
JNZ SHSTP1 ;
CALL MILP ;
DB '1.5',CR,LF,0 ;
RET
SHSTP1: LDA REG4 ;
ANI 008H ;test bit 3
CPI 0 ;if bit3=0 then 1
JNZ SHSTP2 ;
CALL MILP ;
DB '1',CR,LF,0 ;
RET
SHSTP2: CALL MILP ;
DB '2',CR,LF,0 ;
RET
;
; SET STOPBITS command table
;
STPTBL: DB '1'+80H ;"set stop 1"
DW STOP01
DB '2'+80H ;"set stop 2"
DW STOP02
DB '1.','5'+80H ;"set stop 1.5"
DW STOP15
DB 0 ;<<== End of stop-bits table
;
; SET LENGTH command: set bits per character
;
; The number of bits per character is controlled for
; the receiver circuit by bits 6 and 7 of the byte
; sent to the SIO write-register 3 and for the trans-
; mitter circuit by bits 5 and 6 of the byte sent to
; the SIO write-register 5. The assumption has been
; made here that both transmission and reception will
; be carried on at the same number of bits per charac-
; ter. The bit configurations are shown for register
; 3 only, but are the same for register 5:
;
; BPC Bit 7 Bit 6
; 5 0 0
; 6 1 0
; 7 0 1
; 8 1 1
;
STBITS: MVI C,SBLANK ;check for bits/char
CALL MEX ;
JC SETERR ;if none, print error
LXI D,BITTBL ;check for proper syntax
MVI C,LOOKUP
CALL MEX
PUSH H ;match found, go do it!
RNC ;
POP H ;no match: fix stack and
JMP SETERR ; print error
;
BIT5: LDA REG3 ;
ANI 0BFH ;reset bit 6
ANI 07FH ;reset bit 7
STA REG3 ;
LDA REG5 ;
ANI 0DFH ;reset bit 5
ANI 0BFH ;reset bit 6
JMP STBTS1 ;
BIT6: LDA REG3 ;
ANI 0BFH ;reset bit 6
ORI 080H ;set bit 7
STA REG3 ;
LDA REG5 ;
ANI 0DFH ;reset bit 5
ORI 040H ;set bit 6
JMP STBTS1 ;
BIT7: LDA REG3 ;
ORI 040H ;set bit 6
ANI 07FH ;reset bit 7
STA REG3 ;
LDA REG5 ;
ORI 020H ;set bit 5
ANI 0BFH ;reset bit 6
JMP STBTS1 ;
BIT8: LDA REG3 ;
ORI 040H ;set bit 6
ORI 080H ;set bit 7
STA REG3 ;
LDA REG5 ;
ORI 020H ;set bit 5
ORI 040H ;set bit 6
STBTS1: STA REG5 ;
CALL NITSIO ;
CALL SHBITS ;print the result
RET
SHBITS: CALL MILP ;display bits/char
DB 'Bits/char:',TAB,' ',0
LDA REG5 ;
ANI 040H ;test bit 6
CPI 0 ;if bit6=0 then 6 bpc
JNZ SHBTS2 ;
LDA REG5 ;
ANI 020H ;test bit 5
CPI 0 ;if bit5=0 then 5 bpc
JNZ SHBTS1 ;
CALL MILP ;
DB '5',CR,LF,0 ;
RET ;
SHBTS1: CALL MILP ;
DB '7',CR,LF,0 ;
RET ;
SHBTS2: LDA REG5 ;
ANI 020H ;test bit 5
CPI 0 ;if bit5=0 then 6 bpc
JNZ SHBTS3 ;
CALL MILP ;
DB '6',CR,LF,0 ;
RET ;
SHBTS3: CALL MILP ;
DB '8',CR,LF,0 ;
RET
;
; SET LENGTH command table
;
BITTBL: DB '5'+80H ;"set bits 5"
DW BIT5
DB '6'+80H ;"set bits 6"
DW BIT6
DB '7'+80H ;"set bits 7"
DW BIT7
DB '8'+80H ;"set bits 8"
DW BIT8
DB 0 ;<<== end of bpc table
;
; General utility routines
;
MILP: MVI C,ILP ;IN-LINE PRINT
JMP MEX
RET
;
MTIME: MVI C,TIMER ;MEX TIMER
JMP MEX
RET
;
CRLF: CALL MILP ;PRINT CARRIAGE RETURN, LINE FEED
DB CR,LF,0
RET
;
; Send string to the External Modem
;
SMSEND: MVI C,SNDRDY ;WAIT FOR MODEM READY
CALL MEX
JNZ SMSEND
MOV A,M ;FETCH NEXT CHARACTER
INX H
ORA A ;END?
RZ ;DONE IF SO
MOV B,A ;NO, POSITION FOR SENDING
MVI C,SNDCHR ;NOPE, SEND THE CHARACTER
CALL MEX
JMP SMSEND
;
;==========================================================================
; Data Area
;==========================================================================
;
; Default UART parameters (Initalized for External RS-232)
;
REG0: DB 00011000B ;RESET CHANNEL A
REG3: DB 11000001B ;ENABLE RECEIVE AT 8 BITS/CHAR
REG4: DB 01000100B ;NO PARITY, 1 STOP BIT, CLOCK X16
REG5: DB 11101010B ;ENABLE TRANSMIT AT 8 BITS/CHAR
;
; Miscellaneous Default Data
;
MSPDSV: DB 0 ;SAVE EXTERNAL MODEM MSPEED
MONFLG: DB 0FFH ;0: MONITOR OFF - 0FFH: MONITOR ON
ANSFLG: DB 0 ;0: ORIGINATE - 0FFH: ANSWER
SMINIT: DB 'ATM1 S0=0 S7=30 Q0 X1',CR,0 ;MODEM INIT STRING
END