; Title 'MEX Overlay for the SB180 Version SM 4.0' ; REV EQU 40 ;OVERLAY REVISION LEVEL ; .HD64 ; ; Because the HD64180 adds several instructions not found in the Z80, ; the ZAS (2.0 or later) assembler from Echelon is required for assembly. ; ; MEX Overlay for the Micromint SB180, external smartmodems, ; either Anchor or Hayes-compatible. ; (Based on the Kaypro overlay version SM4.0) ; ; NOTE: Because of a peculiarity in the way serial communication is ; implemented in the HD64180 microprocessor, the modem DIP switches ; must be set to assert carrier detect (DCD) high for the overlay to ; function properly. Consult your modem manual for the correct ; setting. No special cabling is required. Because MEX114 does not ; refer to the ZCPR3 termcap for terminal characteristics, the user ; must alter the terminal-dependent macros CLRCRT and CLREND, which ; currently are set up for an ADM-3A terminal. ; ; A full-featured SET command processor is implemented. ; The following table outlines the SET command options: ; ; ; SET Command ; ; ANCHOR Sets modem to respond to ; Anchor modem commands; although ; Anchor modems are considered Hayes ; compatible, there ARE a few ; differences which require special ; processing considerations. ; ; DELAY Number of seconds to wait before ; aborting a call in progress ; ; BAUD Set modem to Baud rate specified. ; Baud rates supported are 300, 600 ; 1200, 2400, 4800, 9600, 19200 ; ; MODE ANS ORIG Set modem to Originate mode or ; Set modem to Auto-answer mode ; DIAL PULSE TONE Set modem to Tone dial mode ; or to Pulse dialing mode ; MONITOR ON OFF Turn Hayes monitor ON/OFF ; PARITY Set Parity to Odd, Even, or Off ; STOPBITS Set number of Stop Bits to 1 or 2 ; LENGTH Set word length to 7 or 8 ; ; MANUAL ORIG ANS Place modem in active state and ; generate Answer or Originate ; carrier tone ; ; ; This overlay includes the smartmodem dialing routine from ; MXO-SM13.ASM by Ron Fowler which has been slightly modified ; to allow programmable delay for answer. (Note that this is ; different from the "ATS7=nn".). ; ; This overlay is intended to be fully compatible with the ; MEX structure and should be readily upward compatible with ; the predicted MEX 2.0. ; ; Calling conventions for the various overlay entry points ; are detailed more fully in the PMMI overlay (MXO-PMxx.ASM, ; where xx=revision number). ; ; History: ; ; SB180 versions: ; ; 03/04/87 4.0 Added CPU speed option at assembly time. This ; will allow the use of the 9.216 speed upgrade ; other wise MEX will not work. Also added for ; 12.288 MHz upgrade (I have no way of testing it). ; This may work on the SB180FX. ; - Steve Mendelson, Toronto ; ; 10/21/86 3.0 Removed Modem type from the Set Commands & made it ; an assembly time option. Numeric return codes are ; initialized for DCH modems, and provision for ; autobaud response has been included for DCH modems. ; -Inserted code in NITMOD: to detect the situation ; in which the modem is disconected or not turned on. ; Prevents MEX from 'hanging' the system while trying ; to initialize a non-existant modem. ; --Al Hawley, (213)670-9465 ; ; 01/20/86 2.0 Code cleaned up, routines condensed and regrouped ; Set commands changed a bit. (Maintenance update) ; It had to happen. ; -- Rob Milette, Montreal ; ; 10/09/85 1.0 Original SB180 version adapted from the Kaypro ; version SM4.0. ; -- Ken Davidson ; ; Kaypro versions: ; ; 12/20/84 4.0 Fixed buctive state and ; generate Answer or Originate ; carrier tone ; ; ; This overlay includes the smartmodem dialing routine from ; MXO-SM13.ASM by Ron Fowler which has been slightly modified ; to allow programmable delay for answer. (Note that this is ; different from the "ATS7=nn".). ; ; This overlay is intended to be fully compatible with the ; MEX structure and should be readily upward compatible with ; the predicted MEX 2.0. ; ; Calling conventions for the various overlay entry points ; are detailed more fully in the PMMI overlay (MXO-PMxx.ASM, ; where xx=revision number). ; ; ; Credits: ; ; M7KP-1 overlay structure by Irv Hoff ; Smartmodem dialing routine by Ron Fowler ; Parity, Length and Stopbits routines by Norm Saunders ; MXO-KP overlay structure by John Smith ; Art work by Terry Carroll ; Bug fix/feature added by Kim Levitt ; Adapted for the SB180 by Ken Davidson ; ;---------------------------------------------------------------------- ; ; ; Miscellaneous equates ; NO EQU 0 YES EQU 0FFH ; TPA EQU 100H ; CR EQU 13 LF EQU 10 TAB EQU 9 BELL EQU 7 ; ; ; Terminal-dependent macros (the SB180 can use any RS232-serial terminal) ; CLRCRT MACRO DB 1AH ;;byte or string to clear entire CRT ENDM ;; alter as required (^Z) ; CLREND MACRO DB 1BH,59H ;;byte or string to clear to bottom of CRT ENDM ;; alter as required (ESC Y) ; ; Don't change this... Have fun with the stuff up there... ; GETTBL MACRO PUSH DE ;used to get and save table address then JP SETTHAT ;jump to routine for lookup table... huh? ENDM ; ; Modem related options: ; ; (set only one of the following to YES) DCH EQU YES ;for DC Hayes or SmarTeam modems ANCHOR EQU NO ;for ANCHOR modem ; TOPSPD EQU 6 ;Maximum Baud supported by modem, ;..see MSPEED below.... ; ; Silent dial option: ; SILENT EQU NO ;if YES, speaker is silenced during dial ; ; (NOTE: This may not work on all "smart" modems, it works on the ; Hayes.. Set it to NO if it doesn't dial out ok...) ; ; HD64180 port definitions ; EXPORT EQU 00H ;base external port EXTCTL EQU EXPORT ;external modem control port EXSTAT EQU EXPORT+4 ;external modem status port EXDATO EQU EXPORT+6 ;external modem data out port EXDATI EQU EXPORT+8 ;external modem data in port BAUDRP EQU EXPORT+2 ;external modem baud rate port ; ; HD64180 bit definitions ; MDRCVB EQU 80H ;modem receive bit (DAV) MDRCVR EQU 80H ;modem receive ready MDSNDB EQU 02H ;modem send bit MDSNDR EQU 02H ;modem send ready bit ; ; ;***** HD64180 CPU speed ***** ; (Set only ONE of the following to YES) ; ; NOTE: If your CPU's clock is not one of the following, you ; will not be able to SET your baud rate without ; changing the baud rate table (BAUDTB). ; CPU12 EQU NO ;12.288 MHz clock CPU9 EQU YES ; 9.216 MHz clock CPU6 EQU NO ; 6.144 MHz clock CPU4 EQU NO ; 4.608 MHz clock CPU3 EQU NO ; 3.072 MHz clock ; MEX Service Processor ; 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 ; CONOUT EQU 2 ;simulated BDOS function 2: console char out PRINT EQU 9 ;simulated BDOS function 9: print string INBUF EQU 10 ;input buffer, same structure as BDOS 10 ; DCONIO EQU 6 ;BDOS Direct Console IO function # DCONIN EQU 0FFH ;BDOS DCONIO Flag for input BDOS EQU 5 ;BDOS Function caller ; ; ; ASEG ORG TPA ;we begin ; DS 3 ;MEX has a JMP START here ; DS 2 ;not used by MEX TPULSE: DB 'T' ;T=touch, P=pulse (Used by this overlay) CLOCK: DB 92 ;clock speed x .1, up to 25.5 mhz. MSPEED: DB topspd ;sets display time for sending a file ;0=110 1=300 2=450 3=600 4=710 ;5=1200 6=2400 7=4800 8=9600 9=19200 BYTDLY: DB 5 ;default time to send character in ;terminal mode file transfer (0-9) ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms CRDLY: DB 5 ;end-of-line delay after CRLF in terminal ;mode file transfer for slow BBS systems ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms COLUMS: DB 5 ;number of directory columns SETFL: DB YES ;yes=user-defined SET command SCRTST: DB YES ;yes=if home cursor and clear screen ;routine at CLRSCRN DB 0 ;was once ACKNAK, now spare BAKFLG: DB YES ;yes=make .BAK file CRCDFL: DB YES ;yes=default to CRC checking ;no=default to Checksum checking TOGCRC: DB YES ;yes=allow toggling of Checksum to CRC CVTBS: DB NO ;yes=convert backspace to rub TOGLBK: DB YES ;yes=allow toggling of bksp to rub ADDLF: DB NO ;no=no LF after CR to send file in ;terminal mode (added by remote echo) TOGLF: DB YES ;yes=allow toggling of LF after CR TRNLOG: DB NO ;yes=allow transmission of logon ;write logon sequence at location LOGON SAVCCP: DB YES ;yes=do not overwrite CCP LOCNXT: DB NO ;yes=local cmd if EXTCHR precedes ;no=not local cmd if EXTCHR precedes TOGLOC: DB YES ;yes=allow toggling of LOCNXTCHR LSTTST: DB YES ;yes=allow toggling of printer on/off ;in terminal mode. Set to no if using ;the printer port for the modem XOFTST: DB NO ;yes=allow testing of XOFF from remote ;while sending a file in terminal mode XONWT: DB NO ;yes=wait for XON after sending CR while ;transmitting a file in terminal mode TOGXOF: DB YES ;yes=allow toggling of XOFF testing IGNCTL: DB NO ;yes=do not send control characters ;above CTL-M to CRT in terminal mode ;no=send any incoming CTL-char to CRT EXTRA1: DB 0 ;for future expansion EXTRA2: DB 0 ;for future expansion BRKCHR: DB '@'-40H ;^@ = Send a 300 ms. break tone NOCONN: DB 'N'-40H ;^N = Disconnect from phone line LOGCHR: DB 'L'-40H ;^L = Send logon LSTCHR: DB 'P'-40H ;^P = Toggle printer UNSVCH: DB 'R'-40H ;^R = Close input text buffer TRNCHR: DB 'T'-40H ;^T = Transmit file to remote SAVCHR: DB 'Y'-40H ;^Y = Open input text buffer EXTCHR: DB '^'-40H ;^^ = Send next character ; DS 2 ;not used ; ; Low-level modem I/O routines. ; INCTL1: JP INC ;in modem control port DB 0,0,0,0,0,0,0 ;spares if needed for non-PMMI ; OTDATA: JP OUTD ;out modem data port DB 0,0,0,0,0,0,0 ;spares if needed for non=PMMI ; INPORT: JP IND ;in modem data port DB 0,0,0,0,0,0,0 ;spares if needed for non-PMMI ; ; Bit-test routines. ; MASKR: AND MDRCVB ;bit to test for receive ready RET TESTR: CP MDRCVR ;value of receive bit when ready RET MASKS: AND MDSNDB ;bit to test for send ready RET TESTS: CP MDSNDR ;value of send bit when ready RET ; DS 12 ; LOGON: DS 2 ;needed for MDM compat, not ref'd by MEX DIALV: JP DIAL DISCV: JP DISCON GOODBV: JP GOODBYE ;called before exit to CP/M INMODV: JP NITMOD ;initialization. Called at cold-start ; RET ;Replace canceled routine ; NOP ; NOP NEWBDV: JP PBAUD ;set baud rate NOPARV: RET ;set modem for no-parity NOP NOP PARITV: RET ;set modem parity NOP NOP SETUPV: JP SETCMD ;SET cmd: jump to a RET if you don't write SET SPMENV: RET ;not used with MEX NOP NOP VERSNV: JP SYSVER ;Overlay's voice in the sign-on message BREAKV: JP SBREAK ;send a break ; ; MDM calls supported in MEX 1.0 but not recommended for use. ; ILPRTV: DS 3 ;replace with MEX function 9 INBUFV: DS 3 ;replace with MEX function 10 ILCMPV: DS 3 ;replace with table lookup funct. 247 INMDMV: DS 3 ;replace with MEX function 255 NXSCRV: DS 3 ;not supported by MEX (returns w/no action) TIMERV: DS 3 ;replace with MEX function 254 ; CLREOS: LD DE,EOSMSG LD C,PRINT CALL MEX RET ; CLS: LD DE,CLSMSG LD C,PRINT CALL MEX RET ;------------------------------------------------------------ ; ; end of fixed area ; ;------------------------------------------------------------ ; ; Low level modem routine area ; INC: IN0 A,(EXSTAT) RET ; IND: IN0 A,(EXDATI) RET ; OUTD: OUT0 (EXDATO),A RET ; ; Print out the overlay version ; SYSVER: CALL MILP DB 'SB180 Overlay (Hitachi HD64180)' IF DCH DB CR,LF,' Hayes Smartmodem Version SM' ENDIF IF ANCHOR DB CR,LF,' Anchor Smartmodem Version SM' ENDIF DB REV/10+'0' DB '.' DB REV MOD 10+'0' DB CR,LF,LF DB 0 RET ; ; Break, disconnect and goodbye routines ; (The HD64180 doesn't support break transmit or receive.) ; SBREAK: RET ; ; Disconnect Routine ; DISCON: IF ANCHOR ; ; Disconnect Anchor Modem. ; Anchor does not respond to DTR so the only way to disconnect is through ; standard Smartmodem disconnect commands ; LD B,20 CALL MTIME ;wait 2 seconds LD HL,SMATN ;send '+++' CALL SMSEND LD B,40 ;wait 4 more seconds (Anchor is slow) CALL MTIME LD HL,SMDISC ;send 'ATH' CALL SMSEND LD B,10 ;wait 1 second CALL MTIME RET ENDIF ;ANCHOR MODEM ; IF DCH ; Disconnect Hayes, etc. ; IN0 A,(EXTCTL) ;Get current setting OR 10H ;Turn off DTR/RTS OUT0 (EXTCTL),A LD B,10 ;DELAY 1 SEC. CALL MTIME IN0 A,(EXTCTL) AND 0EFH ;Turn 'em back on again OUT0 (EXTCTL),A RET ENDIF ;DCH MODEM ; ; 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 NITSIO CALL INC ;TEST FOR MODEM CONNECTED...AEH ; bit 2 of the modem status word reflects DCD. It is high (1) ; when the modem is first turned on, and goes low after ; the status word is accessed. Thereafter, a low status means ; that the modem is connected and turned on (power applied). ; AND 4 ;if you wish to test for first turn-on ; LD C,A ;uncomment these & compare C with.. CALL INC ;the next masked value obtained. AND 4 JR Z,NITMD1 ;IF NZ, MODEM IS NOT TURNED ON CALL MILP DB '** THE MODEM IS OFF OR DISCONNECTED **',CR,LF,0 RET NITMD1: LD A,(MSPEED) ;GET DEFAULT BAUD RATE CALL PBAUD ;SET IT LD A,(MONFLG) ;GET MONITOR DEFAULT OR A LD A,'0' ;SPEAKER OFF JP Z,NITMOD4 LD A,'1' ;SPEAKER ON UNTIL CARRIER RCD NITMOD4: LD (SMINIT+3),A ;PUT IT IN SMINIT STRING LD A,(ANSFLG) ;GET MODE DEFAULT OR A LD A,'0' ;ORIGINATE JP Z,NITMOD5 LD A,'1' ;ANSWER NITMOD5: LD (SMINIT+8),A ;PUT IT IN SMINIT STRING LD HL,SMINIT SINIT: CALL SMSEND ;SEND THE INIT STRING SMTLP1: LD C,INMDM ;WAIT FOR MODEM RESPONSE CALL MEX JP NC,SMTLP1 ;EAT EVERYTHING UNTIL SILENCE FOR RET ; 100 MSEC ; ; Initialize the HD64180 chip ; NITSIO: IN0 A,(EXTCTL) AND 0EFH ;Turn on RTS OR 68H ;Enable xmit, recv, clr errors OUT0 (EXTCTL),A RET ; ; Set command processor ; SETCMD: LD C,SBLANK ;ANY ARGUMENTS? CALL MEX JP C,SETSHO ;IF NOT, DISPLAY DEFAULT(S) LD DE,CMDTBL LD C,LOOKUP CALL MEX ;PARSE THE ARGUMENT PUSH HL ;SAVE ANY PARSED ARGUMENTS ON STACK RET NC ;IF WE HAVE ONE, RETURN TO IT POP HL ;OOPS, INPUT NOT FOUND IN TABLE SETERR: LD DE,SETEMS LD C,PRINT CALL MEX CALL CRLF RET SETEMS: DB CR,LF,BELL,'SET command error',CR,'$' ; ; Argument table ; CMDTBL: DB '?'+80H ; HELP DW SETHELP DB 'MOD','E'+80H ; SET AUTO-ANSWER/ORIGINATE MODE DW STMODE DB 'DIA','L'+80H ; SET PULSE/TONE DIALING DW DIALMOD DB 'MONITO','R'+80H ; SET MONITOR OFF/ON DW STMON DB 'BAU','D'+80H ; SET BAUD DW STBAUD DB 'DELA','Y'+80H ; SET DELAY DW DELAY 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 MILP DB CR,LF,0 CALL SYSVER CALL MILP DB 'SET values:',CR,LF,0 CALL CRLF CALL MDMSHOW CALL CRLF CALL MDSHOW CALL CRLF CALL TPSHOW CALL CRLF CALL BDSHOW CALL CRLF CALL DLSHOW CALL CRLF CALL MONSHO CALL CRLF CALL SHPRTY CALL CRLF CALL SHSTOP CALL CRLF CALL SHBITS CALL CRLF CALL CRLF RET ; ; "SET ?" processor ; SETHELP: CALL MILP DB CR,LF,'SB180 (Hitachi HD64180) Smartmodem SM Overlay' DB CR,LF,LF,'SET command options:',CR,LF DB CR,LF,TAB,'ANCHOR - Set modem for Anchor modem commands' DB CR,LF,TAB,'MODE - ORIG, Originate mode ' DB '(Disable auto-answer)' DB CR,LF,TAB,' - ANS, Set modem to auto-answer mode' DB CR,LF,TAB,'DIAL - TONE, Set modem for Touchtone dialing' DB CR,LF,TAB,' - PULSE, Set modem to Pulse dialing' DB CR,LF,TAB,'DELAY - seconds to wait for answer' DB CR,LF,TAB,'PARITY - OFF, EVEN or ODD' DB CR,LF,TAB,'STOPBITS - 1 or 2, Set number of stop bits' DB CR,LF,TAB,'LENGTH - 7 or 8, Set word length' DB CR,LF,TAB,'MONITOR - ON or OFF, Modem monitor speaker' DB CR,LF,TAB,'BAUD - 300, 600, 1200, 2400, ' DB '4800, 9600 or 19200 bps' DB CR,LF,TAB,'MANUAL - ORIG or ANS Manual Answer ' DB 'or Originate carrier' DB CR,LF,LF,0 RET ; ; Common code segment used for routines using lookup tables.. ; SETTHAT: LD C,SBLANK ;check for code... What? CALL MEX ; POP DE ;get ADDR of table, will get destroyed ;if error detected on JP below JP C,SETERR ;if none, print error LD C,LOOKUP ;check for syntax CALL MEX PUSH HL ;match found, go do it! RET NC ; POP HL ;no match: fix stack and JP SETERR ; print error ; ; SET ANCHOR processor ; ;SETANCH: ; LD A,041H ; LD (DIALAB),A ; LD A,00H ; LD (MONFLG),A MDMSHOW: CALL MILP DB 'Modem: ',0 CALL MILP IF ANCHOR DB 'Anchor Modem',0 ENDIF ;ANCHOR IF DCH DB 'Hayes Smartmodem',0 ENDIF ;DC Hayes RET ; ; Set manual processor ; Note: manual mode does not change the auto-answer status of the modem ; MANUAL: LD DE,MANTBL ;check for proper syntax GETTBL ;*** ; MANORIG: LD B,20 ;FORCE 2 SECOND DELAY ON ORIGINATE END CALL MTIME LD HL,SMATD ;SEND OUT 'ATD' CALL SINIT CALL MILP DB CR,'Manual originate mode - Carrier sent',CR,LF,0 RET MANANS: LD HL,SMATA ;SEND OUT 'ATA' CALL SINIT CALL MILP DB CR,'Manual answer mode - Carrier sent',CR,LF,0 RET ; SMATD: DB 'ATD',CR,0 SMATA: DB 'ATA',CR,0 ; ; Manual originate / answer command table ; MANTBL: DB 'ORI','G'+80H ;MANUAL ORIGINATE MODE DW MANORIG DB 'AN','S'+80H ;MANUAL ANSWER MODE DW MANANS DB 0 ; ; "SET BAUD" processor ; STBAUD: LD C,BDPARS ;FUNCTION CODE: PARSE A BAUDRATE CALL MEX ;LET MEX LOOK UP CODE JP C,SETERR ;JUMP IF INVALID CODE CALL PBAUD ;NO, TRY TO SET IT JP C,SETERR ;IF NOT ONE OF OURS, BOMB OUT BDSHOW: CALL MILP DB 'Modem Speed: ',0 LD A,(MSPEED) ;GET CURRENT BAUD RATE LD C,PRBAUD ;LET MEX PRINT IT CALL MEX RET ; ; This routine sets baud rate passed as MSPEED code in A. ; Returns CY=1 if baud rate not supported. ; PBAUD: PUSH HL ;DON'T ALTER ANYBODY PUSH DE PUSH BC LD E,A ;MSPEED CODE TO DE LD D,0 LD HL,BAUDTB ;OFFSET INTO TABLE ADD HL,DE LD A,(HL) ;FETCH CODE OR A ;0 MEANS UNSUPPORTED CODE SCF ;PREP CARRY IN CASE UNSUPPORTED JP Z,PBEXIT ;EXIT IF BAD OUT0 (BAUDRP),A ;IF OK, SET IT LD A,E ;GET MSPEED CODE BACK LD (MSPEED),A ;SET IT OR A ;RETURN NO ERRORS PBEXIT: POP BC POP DE POP HL RET ; ; ; table of baud rate divisors for supported rates ; IF CPU12 ; 12.288 MHz clock BAUDTB: DB 0,0EH,0,0DH,0 ;110,300,450,600,710 DB 06H,05H,04H,03H,02H ;1200,2400,4800,9600,19200 ENDIF ; IF CPU9 ; 9.216 MHz clock BAUDTB: DB 0,26H,0,25H,0 ;110,300,450,600,710 DB 24H,23H,22H,21H,20H ;1200,2400,4800,9600,19200 ENDIF ; IF CPU6 ; 6.144 MHz clock BAUDTB: DB 0,0DH,0,06H,0 ;110,300,450,600,710 DB 05H,04H,03H,02H,01H ;1200,2400,4800,9600,19200 ENDIF ; IF CPU4 ; 4.608 MHz clock BAUDTB: DB 0,25H,0,24H,0 ;110,300,450,600,710 DB 23H,22H,21H,20H,0 ;1200,2400,2400,4800,9600,19200 not supported ENDIF ; IF CPU3 ; 3.072 MHz clock BAUDTB: DB 0,6,0,5,0 ;110,300,450,600,710 DB 4,3,2,1,80H ;1200,2400,2400,4800,9600,19200 ENDIF ; ; SET modem status, to enable or disable Auto-answer and originate ; STMODE: LD DE,MODETBL ;check for proper syntax GETTBL ;*** ; MODETBL: DB 'ORI','G'+80H ;"set monitor off" DW ORIG DB 'AN','S'+80H ;"set monitor on" DW ANS DB 0 ;<<== end of monitor table ; ORIG: XOR A LD (ANSFLG),A ;SET ORIG FLAG LD HL,SMO ;SEND OUT ATS0=0 CALL SINIT JP MDSHOW ; SMO: DB 'ATS0=0',CR,0 SMA: DB 'ATS0=1',CR,0 ; ANS: LD A,0FFH LD (ANSFLG),A ;SET ANS FLAG LD HL,SMA ;SEND OUT ATS0=1 CALL SINIT ; MDSHOW: LD A,(ANSFLG) OR A JP Z,MDORIG CALL MILP DB 'Auto-answer mode (Originate disabled)',0 RET MDORIG: CALL MILP DB 'Originate mode (Auto-answer disabled)',0 RET ; ; ; Monitor control processor ; STMON: LD DE,MONTBL ;check for proper syntax GETTBL ;*** ; MONTBL: DB 'OF','F'+80H ;"set monitor off" DW QUIET DB 'O','N'+80H ;"set monitor on" DW MONIT DB 0 ;<<== end of monitor table ; QUIET: XOR A ;Monitor off LD (MONFLG),A LD HL,SMQT CALL SINIT JP MONSHO ; MONIT: LD A,0FFH ;Monitor on LD (MONFLG),A LD HL,SMMON CALL SINIT ; MONSHO: CALL MILP DB 'Monitor Speaker ',0 LD A,(MONFLG) OR A JP Z,MONOFF CALL MILP DB 'ON',0 RET ; MONOFF: CALL MILP DB 'OFF',0 RET ; SMQT: DB 'ATM0',CR,0 SMMON: DB 'ATM1',CR,0 ; ; Set dial processor ; DIALMOD: LD DE,DIALTBL GETTBL ; DIALTBL: DB 'PULS','E'+80H ;"set pulse dial mode" DW STPULSE DB 'TON','E'+80H ;"set touchtone dial mode" DW STTONE DB 0 ;<<== end of Dial mode table ; STTONE: LD B,'T' JP SDIAL1 ; STPULSE: LD B,'P' ; SDIAL1: LD A,(TPULSE) CP B JP Z,TPSHOW LD A,B LD (TPULSE),A CP 'P' LD A,01010000B ;PULSE DIAL JP Z,SDIAL2 LD A,01000000B ;TONE DIAL ; SDIAL2: LD (DIALWD),A ; TPSHOW: CALL MILP DB 'Dialing Mode: ',0 LD A,(DIALWD) AND 00010000B JP Z,TPTONE CALL MILP DB 'Pulse',0 RET TPTONE: CALL MILP DB 'Touchtone',0 RET ; ; Set delay processor ; DELAY: LD C,EVALA CALL MEX LD A,H OR A JP NZ,SETERR LD A,L LD (NDELAY),A DLSHOW: CALL MILP DB 'Answer Delay is ',0 LD A,(NDELAY) LD L,A LD H,0 LD C,DECOUT CALL MEX CALL MILP DB ' seconds',0 RET ; ; SET PARITY command: reset transmit/receive parity ; ; Parity is controlled by bit 1 of EXTCTL and ; bit 4 of BAUDRP as follows: ; ; BAUDRP EXTCTL ; Parity Bit 4 Bit 1 ; Off - 0 ; Odd 1 1 ; Even 0 1 ; STPRTY: LD DE,PARTBL ;check for proper syntax GETTBL ;*** ; PROFF: IN0 A,(EXTCTL) AND 0FDH ;reset bit 1 PUSH AF ;save IN0 A,(BAUDRP) ;just load other reg JP PARTB1 ; PREVEN: IN0 A,(EXTCTL) OR 02H ;set bit 1 PUSH AF ;save IN0 A,(BAUDRP) AND 0EFH ;reset bit 4 JP PARTB1 ; PRODD: IN0 A,(EXTCTL) OR 02H ;set bit 1 PUSH AF ;save IN0 A,(BAUDRP) OR 10H ;set bit 4 PARTB1: OUT0 (BAUDRP),A ;set even/odd POP AF OUT0 (EXTCTL),A ;set parity/noparity CALL NITSIO ;re-initialize the USART CALL SHPRTY ;print the result RET ; SHPRTY: CALL MILP ;display parity DB 'Parity: ',0 IN0 A,(EXTCTL) ; AND 02H ;test bit 1 CP 0 ;if bit1=0 then parity off JP NZ,SHPRT1 ; CALL MILP ; DB 'Off',0 ; RET SHPRT1: IN0 A,(BAUDRP) ; AND 10H ;test bit 4 CP 0 ;if bit4=0 then parity even JP Z,SHPRT2 ; CALL MILP ; DB 'Odd',0 ; RET ; SHPRT2: CALL MILP ; DB 'Even',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 bit ; 0 of EXTCTL, as follows: ; ; Stop bits Bit 0 ; 1 0 ; 2 1 ; ; STSTOP: LD DE,STPTBL ;check for proper syntax GETTBL ;*** ; STOP01: IN0 A,(EXTCTL) ;get ctrl register AND 0FEH ;reset bit 0 JP STSTP1 ; STOP02: IN0 A,(EXTCTL) ; OR 01H ;set bit 0 STSTP1: OUT0 (EXTCTL),A ; CALL NITSIO ; CALL SHSTOP ;print the result RET SHSTOP: CALL MILP ;display stop-bits DB 'Stop bits: ',0 IN0 A,(EXTCTL) ; AND 01H ;test bit 0 CP 0 ;if bit0=0 then 1 JP NZ,SHSTP1 ; CALL MILP ; DB '1',0 ; RET SHSTP1: CALL MILP ; DB '2',0 ; RET ; ; SET STOPBITS command table ; STPTBL: DB '1'+80H ;"set stop 1" DW STOP01 DB '2'+80H ;"set stop 2" DW STOP02 DB 0 ;<<== End of stop-bits table ; ; SET LENGTH command: set bits per character ; ; The number of bits per character is controlled by ; bit 2 of EXTCTL as follows: ; ; BPC Bit 2 ; 7 0 ; 8 1 ; STBITS: LD DE,BITTBL ;check for proper syntax GETTBL ;*** ; BIT7: IN0 A,(EXTCTL) ; AND 0FBH ;reset bit 2 JP STBTS1 ; BIT8: IN0 A,(EXTCTL) ; OR 04H ;set bit 2 STBTS1: OUT0 (EXTCTL),A ; CALL NITSIO ; CALL SHBITS ;print the result RET SHBITS: CALL MILP ;display bits/char DB 'Bits/char: ',0 IN0 A,(EXTCTL) ; AND 04H ;test bit 2 CP 0 ;if bit2=0 then 7 bpc JP Z,SHBTS1 ; CALL MILP ; DB '8',0 ; RET ; SHBTS1: CALL MILP ; DB '7',0 ; RET ; ; ; SET LENGTH command table ; BITTBL: DB '7'+80H ;"set bits 7" DW BIT7 DB '8'+80H ;"set bits 8" DW BIT8 DB 0 ;<<== end of bpc table ; ; Smartmodem dialing routine from Ron Fowler's MXO-SM10.ASM ; DIAL: LD HL,(DIALPT) ;FETCH POINTER CP 254 ;START DIAL? JP Z,STDIAL ;JUMP IF SO CP 255 ;END DIAL? JP Z,ENDIAL ;JUMP IF SO ; ; Not start or end sequence, must be a digit to be sent to the modem ; LD (HL),A ;PUT CHAR IN BUFFER INC HL ;ADVANCE POINTER LD (DIALPT),HL ;STUFF PNTR RET ;ALL DONE ; ; Here on a start-dial sequence ; STDIAL: LD HL,DIALBF ;SET UP BUFFER POINTER LD (DIALPT),HL RET ; ; Here on an end-dial sequence ; ENDIAL: ; IF SILENT LD A,(MONFLG) ;check monitor speaker flag OR A ;to see if on or off JP Z,LEAVOFF ;if off, leave it off LD (HL),'M' ;if we silenced speaker to dial, INC HL ;turn it on again LD (HL),'1' INC HL LEAVOFF: ENDIF ; LD (HL),CR ;STUFF END-OF-LINE INTO BUFFER INC HL ;FOLLOWED BY TERMINATOR LD (HL),0 LD A,(TPULSE) ;GET OVERLAY'S TOUCH-TONE FLAG ; IF SILENT LD (SMDIAL+5),A ENDIF ; IF NOT SILENT LD (SMDIAL+3),A ;PUT INTO STRING ENDIF ; LD HL,SMDIAL ;POINT TO DIALING STRING CALL SMSEND ;SEND IT ; WAITSM: LD C,INMDM CALL MEX ;CATCH ANY OUTPUT FROM THE MODEM JP NC,WAITSM ;LOOP UNTIL NO MORE CHARACTERS ; ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM. ; RESULT: LD A,(NDELAY) ;GET DELAY COUNT LD C,A SMWLP: PUSH BC LD B,1 ;CHECK FOR A CHAR, UP TO 1 SEC WAIT LD C,TMDINP ;DO TIMED INPUT CALL MEX POP BC JP NC,SMTEST ;JUMP IF MODEM HAD A CHAR PUSH BC ;NO, TEST FOR CONTROL-C FROM CONSOLE LD C,DCONIO LD E,DCONIN ;USE BDOS DIRECT CONSOLE INPUT FUNCTION CALL BDOS POP BC CP 'C'-40H ;^C? JP NZ,SMNEXT ;IF NOT, JUMP CALL SMDMOFF ;YES, SHUT DOWN THE MODEM LD A,3 ;RETURN ABORT CODE RET SMNEXT: CP 0 ;ANY OTHER KEY JP NZ,SMTIMO ;YES, TREAT LIKE TIMEOUT DEC C ;NO JP NZ,SMWLP ;CONTINUE ; ; NO MODEM RESPONSE WITHIN THE TIME SPECIFIED IN SET DELAY COMMAND ; SMTIMO: CALL SMDMOFF LD A,2 ;RETURN TIMEOUT CODE RET ; ; MODEM GAVE US A RESULT, CHECK IT ; SMTEST: AND 7FH ;IGNORE ANY PARITY CALL SMANAL ;TEST THE RESULT JP C,RESULT ;GO TRY AGAIN IF UNKNOWN RESPONSE LD A,B ;A=RESULT PUSH AF ;SAVE IT SMTLP: LD C,INMDM ;EAT ANY ADDITIONAL CHARS FROM SMARTMODEM CALL MEX JP NC,SMTLP ;UNTIL 100MS OF QUIET TIME POP AF ;RETURN THE CODE RET ; ; Analyze character returned from External Modem ; IF ANCHOR ; ; Analyze Modem response codes for Anchor modems. ; Anchor echoes the digits as they are being dialed. The returned digits ; are interpreted as call return codes, shutting down the modem too early. ; SMANAL: LD B,0 ;PREP CONNECT CODE CP 'C' ;"CONNECT"? RET Z INC B ;PREP BUSY CODE B=1 CP 'B' RET Z INC B ;PREP NO CONNECT MSG B=2 CP 'N' ;N=NO CONNECT RET Z LD B,4 ;PREP MODEM ERROR CP 'E' ;E=ERROR RET Z JP WTLF ; ; UNKNOWN RESPONSE, RETURN CARRY TO CALLER. BUT FIRST, ; FLUSH THE UNKNOWN RESPONSE LINE FROM THE MODEM. ; WTLF: CP LF ;LINEFEED? SCF RET Z ;END IF SO LD C,INMDM ;NO. GET NEXT CHAR CALL MEX JP NC,WTLF ;UNLESS BUSY, LOOP RET ;CY set indicates Unknown response ENDIF ;ANCHOR modem IF DCH ;if DC Hayes or SmarTeam ; ; Analyze Modem response codes for Hayes, etc. ; (init string sets numeric response only) SMANAL: LD B,0 ;PREP CONNECT CODE CP '1' ;NUMERIC VERSION OF "CONNECT" JP Z,ANAL1 ;CONNECT 300 OR CONNECT 2400 B=0 ; RET Z CP '5' ;NUMERIC VERSION OF "CONNECT 1200" JP Z,ANAL5 ; RET Z INC B ;PREP BUSY CODE B=1 CP '7' RET Z INC B ;PREP NO CONNECT MSG B=2 CP '3' ;NUMERIC VERSION OF "NO CONNECT" RET Z LD B,4 ;PREP MODEM ERROR CP '4' ;NUMERIC VERSION OF "ERROR" RET Z ; ; UNKNOWN RESPONSE, RETURN CARRY TO CALLER. BUT FIRST, ; FLUSH THE UNKNOWN RESPONSE LINE FROM THE MODEM. ; WTLF: CP CR ;END OF RESPONSE? SCF RET Z ;END IF SO LD C,INMDM ;NO. GET NEXT CHAR CALL MEX JP NC,WTLF ;UNLESS BUSY, LOOP RET ;CY set indicates Unknown response ANAL5: ; here on response code 5 (1200 baud connect) PUSH BC LD C,5 ;NEW SPEED IN C JR ANAL6 ;..CHANGE IF REQUIRED ANAL1: ; here on connect code '1x' -get next char to ; distinguish between 1 and 10, and change baud ; if required. PUSH BC LD C,INMDM ;GET NEXT CHAR CALL MEX CP '0' LD C,6 ;ASSUME '10' JR Z,ANAL6 ;JUMP IF 2400 BAUD LD C,1 ;MUST BE 300 BAUD ANAL6: LD A,(MSPEED) ;GET CURRENT BAUD RATE CP C ;ANY CHANGE? LD A,C ;GET NEW MSPEED CALL NZ,NEWBDV ;SET NEW BAUD IF CHANGED POP BC RET ENDIF ;DC Hayes or SmarTeam modem ; ; Send string to the External Modem ; SMSEND: LD C,SNDRDY ;WAIT FOR MODEM READY CALL MEX JP NZ,SMSEND LD A,(HL) ;FETCH NEXT CHARACTER INC HL OR A ;END? RET Z ;DONE IF SO LD B,A ;NO, POSITION FOR SENDING LD C,SNDCHR ;NOPE, SEND THE CHARACTER CALL MEX JP SMSEND ; ; Shut down (disconnect) External Modem ; SMDMOFF: LD A,(DIALAB) LD B,A LD C,SNDCHR CALL MEX LD B,20 ;TWO SECOND WAIT TO SETTLE DOWN CALL MTIME IF DCH JP DISCON ;IF HAYES TYPE, JUMP TO DISCON ENDIF ;DCH IF ANCHOR RET ;IF ANCHOR, RETURN ENDIF ;ANCHOR ; ; General utility routines ; MILP: LD C,ILP ;IN-LINE PRINT JP MEX RET ; MTIME: LD C,TIMER ;MEX TIMER JP MEX RET ; CRLF: CALL MILP ;PRINT CARRIAGE RETURN, LINE FEED DB CR,LF,0 RET ; ;========================================================================== ; Data Area ;========================================================================== ; ; Miscellaneous Default Data ; SMDIAL: DB 'AT' ; IF SILENT DB 'M0' ;Turn off speaker during dialing ENDIF ; DB 'DT' ;Smartmodem dial prefix ; DIALBF: DS 52 ;2* 24 CHAR MAX, + CR + NULL + SLOP DIALPT: DS 2 ;DIAL POSITION POINTER DIALWD: DB 01000000B ;PULSE/TONE DIAL WORD DIGIT DB 0 ;SAVE DIALED DIGIT MSPDSV: DB 0 ;SAVE EXTERNAL MODEM MSPEED MONFLG: DB 0FFH ;0: MONITOR OFF - 0FFH: MONITOR ON ANSFLG: DB 0 ;0: ORIGINATE - 0FFH: ANSWER NDELAY: DB 30 ;NO. SECONDS FOR ANSWER ;MODMTYP: DB 0 ;0=HAYES, ETC., - 0FFH=ANCHOR MODEM DIALAB: DB CR ;CHARACTER TO USE TO ABORT DIAL SEQUENCE ; SMATN: DB '+++',0 ;Smartmodem online 'attention' SMDISC: DB 'ATH',CR,0 ;Smartmodem disconnect (used by Anchor) IF ANCHOR SMINIT: DB 'ATM1 S0=0 S7=60 Q0 X1',CR,0 ;MODEM INIT STRING ENDIF IF DCH SMINIT: DB 'ATM1 S0=0 S7=60 Q0 X1 V0',CR,0 ;MODEM INIT STRING ENDIF ; EOSMSG: CLREND ;CLEAR TO END-OF-SCREEN DB '$' CLSMSG: CLRCRT ;CLEAR WHOLE SCREEN DB '$' ; END