; TITLE 'MEX Overlay for Apple ][ / IIgs port / Smartmodem' ; ; MXO-GS10.ASM created 11/11/88 by Nick Sayer ; REV EQU 10 ; Nov 11, 1988 ; ; ; This overlay is specific for the following hardware: ; ; Apple ][ +/e with PCPI Applicard ; Apple IIgs Modem Port ; Hayes compatible intelligent modem ; ; - Nick Sayer (N6QQQ) ; November 11, 1988 ; ; Kudos to Henry Middlebrook for this overlay. I used his overlay outline, ; deleted his most of the hardware specific code and replaced it with a ; fleshed out version of a similar overlay I wrote for IMP245.COM. ; ; This overlay is written in three distinct parts as a "MIXED" type of ; overlay for MEX. The parts follow the guidelines available in the ; MEX OVERLAY LIST #2 (01/06/85 -- Ron Fowler, NightOwl Software) with ; reference to the PORT, MODEM, and PATCH overlay types. Thus, you ; should be able to remove or add any one of the three parts without ; severely affecting the overlay operation. Naturally, removing the ; first section (PORT) will completely disable MEX; however, removing ; or changing the the MODEM (derived from MXO-SM13.ASM) section or ; the PATCH (MEXPAT11.ASM) will minimally affect operation (see LSTST ; and SSET). ; ; >>>> NOTE: Previous versions of MXO-APxx do NOT properly support ; the PCPI Applicard. You may not like this overlay; ; however, you can use it as a reliable guide. ; ; HM 02/04/85 ; ; To use this overlay just set equates as you see fit, assemble with ; ASM.COM then using MLOAD21.COM and MEX112.COM create running MEX: ; ; A>MLOAD21 MEX.COM=MEX112.COM,MXO-AP50 ; ;---------------------------------------------------------------------- ; ; Overlay Update History ; ; 11/11/88 - Coded for Apple IIgs I/O -GS10 - Nick Sayer ; 02/06/85 - Coded for Apple SSC I/O -AP50 - Henry Middlebrook ; 01/28/85 - Created MXO original overlay -AP30 - Henry Middlebrook ; ;====================================================================== ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; PORT OVERLAY SECTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BELL EQU 07H ;bell CR EQU 0DH ;carriage return ESC EQU 1BH ;escape LF EQU 0AH ;linefeed TAB EQU 09H ;tab YES EQU 0FFH NO EQU 0 ; ;---------------------------------------------------------------------- ; ; MEX Service Processor Calls ; 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 PRNTBL EQU 237 ;print command table in columns (HL=addr) PRID EQU 236 ;print MEX ID string on console ; 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 ; ; ;====================================================================== ; ORG 100H ;we begin ; DS 3 ;MEX has a JMP START here 100H ; ; The following variables are located at the beginning of the program ; to facilitate modification without the need of re-assembly. They will ; be moved in MEX 2.0. ; PMODEM: DB YES ;\ / These two locations are 103H SMODEM: DB NO ;/ \ not referenced by MEX. 104H TPULSE: DB 'T' ;Tone/Pulse (used only in Smodem overlay) 105H CLOCK: DB 60 ;clock speed x .1, up to 25.5 mhz. 106H MSPEED: DB 6 ;sets display time for sending a file 107H ;0=110 1=300 2=450 3=600 4=710 ;5=1200 6=2400 7=4800 8=9600 9=19200 BYTDLY: DB 1 ;default time to send character in 108H ;terminal mode file transfer (0-9) ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms CRDLY: DB 1 ;end-of-line delay in terminal 109H ;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 10AH SETFL: DB YES ;yes=user-defined SET command 10BH SCRTST: DB YES ;yes=if home cursor and clear screen 10CH ;routine at CLRSCRN DB 0 ;was once ACKNAK, now spare 10DH BAKFLG: DB NO ;yes=make .BAK file 10EH CRCDFL: DB YES ;yes=default to CRC checking 10FH ;no=default to Checksum checking TOGCRC: DB YES ;yes=allow toggling of Checksum to CRC 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 TRNLOG: DB NO ;yes=allow transmission of logon 115H ;write logon sequence at location LOGON SAVCCP: DB YES ;yes=do not overwrite CCP 116H LOCNXT: DB NO ;yes=local cmd if EXTCHR precedes 117H ;no=not local cmd if EXTCHR precedes TOGLOC: DB YES ;yes=allow toggling of LOCNXTCHR 118H LSTTST: DB YES ;yes=allow toggling of printer on/off 119H ;in terminal mode. Set to no if using ;the printer port for the modem XOFTST: DB YES ;yes=allow testing of XOFF from remote 11AH ;while sending a file in terminal mode XONWT: DB NO ;yes=wait for XON after sending CR while 11BH ;transmitting a file in terminal mode TOGXOF: DB YES ;yes=allow toggling of XOFF testing 11CH IGNCTL: DB NO ;yes=do not send control characters 11DH ;above CTL-M to CRT in terminal mode ;no=send any incoming CTL-char to CRT EXTRA1: DB 0 ;for future expansion 11EH EXTRA2: DB 0 ;for future expansion 11FH BRKCHR: DB 'B'-40H ;^@ = Send a 300 ms. break tone 120H NOCONN: DB 'N'-40H ;^N = Disconnect from phone line 121H LOGCHR: DB 'L'-40H ;^L = Send logon 122H LSTCHR: DB 'P'-40H ;^P = Toggle printer 123H UNSVCH: 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 ; ; Equates used only by PMMI routines grouped together here. ; PRATE: DB 125 ;125=20pps dialing, 250=10pps 128H DB 0 ;not used 129H ; ; Jump table accessed by MEX to write/read serial port ; IN$MODSTAP: JMP RD$MODSTAP ;read ACIA status port 12AH DS 7 OUT$MODDATP: JMP WR$MODDATP ;send character to ACIA 134H DS 7 IN$MODDATP: JMP RD$MODDATP ;read character from ACIA 13EH DS 7 ; ; Bit-test routines. These will be merged with the above ; routines in MEX 2.0 to provide a more reasonable format ; MASKR: ANI MDRCVB ! RET ;bit to test for receive ready 148H TESTR: CPI MDRCVR ! RET ;value of rcv. bit when ready 14BH MASKS: ANI MDSNDB ! RET ;bit to test for send ready 14EH TESTS: CPI MDSNDR ! RET ;value of send bit when ready 151H ; ; Unused area: was once used for special PMMI functions, now used only ; to retain compatibility with MDM overlays. You may use this area for ; any miscellaneous storage you'd like but the length of the area ; >> MUST << be 12 bytes. ; DS 12 ;PMMI only calls 154H ; ; Special modem function jump table: if your overlay cannot handle ; some of these, change the jump to "DS 3", so the code present in ; MEX will be retained. Thus, if your modem can't dial, change the ; JMP PDIAL at DIALV to DS 3, and MEX will print a "not-implemented" ; diagnostic for any commands that require dialing. ; ; LOGON: DS 2 ;not used by MEX 160H DIALV: JMP DIAL ;dial a digit in A (ref SMOVL) 162H DISCV: JMP DISCON ;drops DTR to hang-up fast! 165H GOODBV: JMP GOODBYE ;called before exit to CPM 168H INMODV: JMP INITMOD ;go to user written routine 16BH NEWBDV: JMP PBAUD ;changes baud with phone # 16EH NOPARV: RET ! NOP ! NOP ;set modem for no-parity 171H PARITV: RET ! NOP ! NOP ;set modem parity 174H SETUPV: JMP SETCMD ; 177H SPMENV: DS 3 ;not used by MEX 17AH VERSNV: JMP SYSVER ; 17DH BREAKV: JMP SENDBRK ; 180H ; ; The following jump vector provides the overlay with access to special ; routines in the main program (retained and supported in the main pro- ; gram for MDM overlay compatibility). These should not be modified by ; the overlay. ; ; Note that for MEX 2.0 compatibility, you should not try to use these ; routines, since this table will go away with MEX 2.0 (use the MEX ; service call processor instead). ; ILPRTV: DS 3 ;replace with MEX function 9 183H INBUFV: DS 3 ;replace with MEX functin 10 186H ILCMPV: DS 3 ;replace with table lookup funct 247 189H INMDMV: DS 3 ;replace with MEX function 255 18CH NXSCRV: DS 3 ;not supported by MEX 18FH TIMERV: DS 3 ;replace with MEX function 254 192H ; ; Clear/screen and clear/end-of-screen. Each routine must use the ; full 9 bytes alloted (may be padded with nulls). ; ; CLREOS: LXI D,EOSMSG ; 195H MVI C,PRINT CALL MEX RET ; 19DH ; CLS: LXI D,CLSMSG ; 19EH MVI C,PRINT CALL MEX RET ; 1A6H ; ; ; *** END OF FIXED FORMAT AREA *** ; ;********************************************************************** ; ; Overlay Fixed Messages Area ; EOSMSG: DB ESC,0D9H,0,0,'$' ;clear to end of screen message ;for Videx Videoterm / SOROC ; CLSMSG: DB ESC,0AAH,0,0,'$' ;clear screen message ;for Videx Videoterm / SOROC ; VERMSG: DB CR,LF,TAB,TAB,' Version for Apple ][ / Applicard' DB CR,LF DB TAB,TAB,'IIgs modem port ' DB 'Overlay Version ',REV/10+'0','.' DB REV MOD 10+'0' DB CR,LF,LF,'$' DB 0,'Overlay by Nick Sayer (N6QQQ)',0,'$' ; ;---------------------------------------------------------------------- ; ; These routines are specific to the Apple ][+ with Applicard. The ; routines read modem hardware (Apple Super Serial Card ACIA) directly ; from the Applicard. ; ;====================== CUSTOMIZATION EQUATES ========================== ; SLOT EQU 2 ; Slot of serial interface SLOTOFF EQU 16*SLOT ; Hardware offset for $C0(8+n)0 SLOTOF2 EQU 256*SLOT ; Firmware offset for $Cn00 ; MDRCVR EQU 1 ; Bit to test for char present MDRCVB EQU 1 ; Compare mask to test for char present MDSNDR EQU 4 ; Bit to test for send ready MDSNDB EQU 4 ; Compare mask to test for send ready ;----------------------------------------------------------------------- ; ; This routine sends a break tone for 300 ms ; SENDBRK: MVI B,0 ; Param doesn't matter MVI C,'S' ; Ctrl-A + S is send break JMP GSCMD ; Send it out ; ; CALL CMDENA ; Enable Ctrl-A commands ; MVI A,01H ; Ctrl-A ; CALL GSSEND ; Send it out ; MVI A,'S' ; Ctrl-A + S is send-break command ; CALL GSSEND ; Send it out ; JMP CMDDIS ; Disable Ctrl-A commands and return ; ; ; This routine sets DTR low for 300 ms to disconnect the phone ; DISCON: MVI A,0FFH ; Lower DTR CALL CMDDTR ; Set DTR status MVI B,3 MVI C,TIMER ; Delay 300 ms CALL MEX MVI A,00H ; Bring DTR back CALL CMDDTR ; Set DTR status RET ; ;..... ; GOODBYE: RET ; Nothing to do when exiting ; ;..... ; ; ;=========================== INITMOD =================================== ; ; INITMOD: CALL GSINIT ; Init via 6502 routines ; MVI A,0 STA PARSV STA WRDSV ; 8N1 LDA MSPEED ; Get default speed JMP PBAUD ; Let PBAUD do the work ; INITMOD1: LDA BAUDSV ; Get baud chars MOV B,A MVI C,'B' ; Baud setting char CALL GSCMD ; Do it LDA PARSV ; Get parity value MOV B,A MVI C,'P' ; Parity command CALL GSCMD ; Do it LDA WRDSV ; Get word format char MOV B,A MVI C,'D' ; Fall into GSCMD ; ; GSCMD takes a BCD number in B and an ascii character in C and sends ; them out with a ctrl-A and enabled commands. ; GSCMD: PUSH H PUSH D PUSH B CALL CMDENA ; Enable Ctrl-A commands MVI A,81H ; Send a Ctrl-A CALL GSSEND ; Send it POP B ; Get Char back PUSH B ; And save it again MOV A,B RAR RAR RAR RAR CALL SENDHX POP B PUSH B MOV A,B CALL SENDHX POP B PUSH B MOV A,C CALL GSSEND CALL CMDDIS ; Disable Ctrl-A cmds and return POP B POP D POP H RET SENDHX: ANI 0FH ORI 0B0H ; Make it a number JMP GSSEND ; Send it and ret ; ;..... ; ; ;========================== APPLE I/O ================================== ; RDBYTE: EQU 0FFE0H ; Read 1 byte from Apple (A = byte) WRBYTE: EQU 0FFE3H ; Write 1 byte to Apple (C = byte) RDWORD: EQU 0FFE6H ; Read 2 bytes from Apple (DE = word) WRWORD: EQU 0FFE9H ; Write 2 bytes to Apple (DE = word) WRLOTS: EQU 0FFEFH ; FROM (HL), SEND NUM BYTES IN DE TO HOST POKLOT: EQU 2 CALL1: EQU 3 PEEK1: EQU 6 ; Command POKE1: EQU 7 ; Command ; POKE: MOV B,A MVI C,POKE1 CALL WRBYTE CALL WRWORD MOV C,B CALL WRBYTE RET ; PEEK: MVI C,PEEK1 CALL WRBYTE CALL WRWORD CALL RDBYTE RET ; CALL65: MVI C,CALL1 CALL WRBYTE CALL WRWORD RET ; GSINIT: ; Initialize and move 6502 code in ; LXI D,0C00DH+SLOTOF2 CALL PEEK STA INITPT ; LXI D,0C00FH+SLOTOF2 CALL PEEK STA WRITPT ; LXI D,0C00EH+SLOTOF2 CALL PEEK STA READPT ; LXI D,0C012H+SLOTOF2 CALL PEEK STA EXTPT ; MVI C,POKLOT ; Going to put the 6502 code in place CALL WRBYTE LXI D,0300H ; Put it at 300H CALL WRWORD LXI D,END65-ST65+1 ; Length CALL WRWORD LXI H,ST65 LXI D,END65-ST65+1 CALL WRLOTS ; Put it in place ; LXI D,INIT65 CALL CALL65 RET ; ST65: DB 04CH,013H,003H ; JMP INIT DB 04CH,01AH,003H ; JMP READ DB 04CH,024H,003H ; JMP WRITE DB 04CH,02FH,003H ; JMP SETDTR DB 04CH,03EH,003H ; JMP SETCMD DB 04CH,06AH,003H ; JMP STATUS DS 1 ; DATA DFS 1 DB 0A2H,0C0H+SLOT ; INIT LDX #Cn DB 0A0H,SLOTOFF ; LDY #n0 DB 04CH INITPT DS 1 ; DB 0C0H+SLOT ; JMP CARD_INIT DB 0ADH,012H,003H ; WRITE LDA DATA DB 0A2H,0C0H+SLOT ; LDX #Cn DB 0A0H,SLOTOFF ; LDY #n0 DB 04CH WRITPT DS 1 DB 0C0H+SLOT ; JMP CARD_WRIT DB 0A2H,0C0H+SLOT ; READ LDX #Cn DB 0A0H,SLOTOFF ; LDY #n0 DB 020H READPT DS 1 DB 0C0H+SLOT ; JSR CARD_READ DB 08DH,012H,003H ; STA DATA DB 060H ; RTS DB 0ADH,012H,003H ;SETDTR LDA DATA DB 08DH,07EH,003H ; STA DTRBYT DB 0A9H,07AH ; LDA #>DTRBUF DB 0A2H,003H ; LDX #CMDBUF DB 0A2H,003H ; LDX #CMDBUF DB 0A2H,003H ; LDX #STATBUF DB 0A2H,003H ; LDX #: print current statistics ; SETSHO: LXI H,SHOTBL ;get table of SHOW subroutines SETSLP: MOV E,M ;get table address INX H MOV D,M INX H MOV A,D ;end of table? ORA E RZ ;exit if so PUSH H ;save table pointer XCHG ;adrs to HL CALL GOHL ;do it CALL CRLF ;print newline MVI C,CHEKCC ;check for console abort CALL MEX POP H ;it's done JNZ SETSLP ;continue if no abort RET ; GOHL: PCHL ; ; Table of SHOW subroutines ; SHOTBL: DW BDSHOW ;displays current baud DW PSWSHOW ;displays current PSW DW TPSHOW ;displays current TPULSE byte (0105H) DW CRLF DW 0 ;<<== table terminator ; ; SET ? processor ; STHELP: CALL CLS ;clear screen LXI D,HLPMSG MVI C,PRINT CALL MEX RET ; ; The help message ; HLPMSG: DB CR,LF,'SET Commands available are:',CR,LF,LF DB 'SET BAUD <110, 300, 600, 1200, 2400, 4800,' DB ' 9600, or 19200>',CR,LF DB 'SET PSW <8N1, 7E1, 7O1, or 7N1> -- Word Length,' DB ' Parity, Stop Bits',CR,LF DB 'SET TONE (Sets flag for TONE dialing)',CR,LF DB 'SET PULSE (Sets flag for PULSE dialing)' DB CR,LF,LF,'$' ; ; SET BAUD processor ; STBAUD: MVI C,BDPARS ;function code CALL MEX JC SETERR ;invalid code CALL PBAUD ;try to set it JC SETERR ;unsupported code BDSHOW: CALL ILPRT ;display baud DB 'Baud rate:',TAB,' ',0 LDA MSPEED MVI C,PRBAUD ;use MEX routine CALL MEX RET ; ; SET PSW processor ; STPSW: MVI C,SBLANK CALL MEX JC SETERR ;SET PSW should have had argument LXI D,PSWTBL ;look for PSW match in table CALL TSRCH JC SETERR ;not there, so report error CALL FIXPSW ;routine to set PARSV and WRDSV CALL INITMOD1 ;now fix ACIA registers ; PSWSHOW: CALL ILPRT DB 'PSW setting:',TAB,' ',0 LDA PSWSET CPI P8N1 JNZ PSW1 CALL ILPRT DB '8N1',0 RET PSW1: CPI P7E1 JNZ PSW2 CALL ILPRT DB '7E1',0 RET PSW2: CPI P7O1 JNZ PSW3 CALL ILPRT DB '7O1',0 RET PSW3: CPI P7N1 JNZ PSW4 CALL ILPRT DB '7N1',0 RET PSW4: CALL ILPRT DB '<< ERROR >>',0 RET ; ; PSWSET: DB 00H ;storage and default (8N1) PARSV: DB 00H ;storage and default (no parity) WRDSV: DB 00H ;storage and default (8 data, 1 stop bits) ; FIXPSW: MOV A,L ;PSW byte from table STA PSWSET ;save it ANI 0FH ;mask low for parity bits STA PARSV ;put in storage LDA PSWSET ;get back PSW byte RAR ;first shift into lower nibble.. RAR ;...away we go... RAR ;.....and go... RAR ;......and done ANI 0FH ;mask for word bits STA WRDSV ;put in storage RET ; PSWTBL: DB '8N','1'+80H DW P8N1 ;filled in with equ's DB '7E','1'+80H DW P7E1 ; - ditto - DB '7O','1'+80H DW P7O1 ; - ditto - DB '7N','1'+80H DW P7N1 ; - ditto - DB 0 ;<<==== table terminator ; ;..... ; ; These routines set TPULSE flag at 0105H to either 'T' or 'P' so that ; MODEM (specifically MXO-SM13.ASM) overlay will dial in TONE or PULSE ; mode. The settings are mutually exclusive. ; STTONE: MVI A,'T' ;get T flag STA TPULSE ;put into proper place JMP TPSHOW ;display dial mode ; STPULSE: MVI A,'P' ;get P flag STA TPULSE ; TPSHOW: CALL ILPRT DB 'Dial Mode:',TAB,' ',0 LDA TPULSE CPI 'T' JNZ TP1 CALL ILPRT DB 'TONE',0 RET TP1: CPI 'P' JNZ TP2 CALL ILPRT DB 'PULSE',0 RET TP2: CALL ILPRT DB '<< ERROR >>',0 RET ; ;...... ; ; Compare next input-stream item in table @DE; CY=1 if not found, ; else HL = matched data item ; TSRCH: MVI C,LOOKUP ;get function code JMP MEX ;pass to MEX processor ; ; Print in-line message ... blows away C register ; ILPRT: MVI C,ILP ;get function code JMP MEX ;go do it ; ; ; >>>> End of PORT specific overlay section <<<< ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MODEM SPECIFIC OVERLAY SECTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MEX SMARTMODEM OVERLAY V1.3 ; ; Smartmodem overlay for MEX: revision 1.3 ; ; Adapted by Henry Middlebrook (1/85) ; ; NOTE: Some redundant parts of the V1.3 overlay were removed when this ; section was pulled into MXO-SS30. See the original overlay for ; additional information on the history and use of this MODEM ; specific overlay. -HM- 2/4/85 ; ; Written 04/16/84 by Ronald G. Fowler (V1.0) ; ; ORG 0B00H ;maintain official MEX origin ; DIAL: LHLD DIALPT ;FETCH POINTER CPI 254 ;START DIAL? JZ STDIAL ;JUMP IF SO CPI 255 ;END DIAL? JZ ENDIAL ;JUMP IF SO ; ; Not start or end sequence, must be a digit to be sent to the modem ; MOV M,A ;PUT CHAR IN BUFFER INX H ;ADVANCE POINTER SHLD DIALPT ;STUFF PNTR RET ;ALL DONE ; ; Here on a start-dial sequence ; STDIAL: LXI H,DIALBF ;SET UP BUFFER POINTER SHLD DIALPT RET ; ; Here on an end-dial sequence ; ENDIAL: MVI M,CR ;STUFF END-OF-LINE INTO BUFFER INX H ;FOLLOWED BY TERMINATOR MVI M,0 LDA TPULSE ;GET OVERLAY'S TOUCH-TONE FLAG STA SMDIAL+3 ;PUT INTO STRING LXI H,SMDIAL ;POINT TO DIALING STRING CALL SMSEND ;SEND IT WAITSM: MVI C,INMDM CALL MEX ;CATCH ANY OUTPUT FROM THE MODEM JNC WAITSM ;LOOP UNTIL NO MORE CHARACTERS ; ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM (UP TO ; 60 SECONDS: YOU MAY CHANGE THIS VALUE IN THE FOLLOWING LINE). ; NOTE THAT THE SMARTMODEM HAS AN INTERNAL 30 SECOND TIMEOUT WHILE ; FOR A CARRIER ON THE OTHER END. YOU CAN CHANGE BY PLAYING WITH THE ; S7 VARIABLE (I.E. SEND THE SMARTMODEM "AT S7=20" TO LOWER THE 30 SECOND ; WAIT TO 20 SECONDS). ; RESULT: MVI C,60 ;<<== MAXIMUM TIME TO WAIT FOR RESULT SMWLP: PUSH B MVI B,1 ;CHECK FOR A CHAR, UP TO 1 SEC WAIT MVI C,TMDINP ;DO TIMED INPUT CALL MEX POP B JNC SMTEST ;JUMP IF MODEM HAD A CHAR PUSH B ;NO, TEST FOR CONTROL-C FROM CONSOLE MVI C,CHEKCC CALL MEX POP B JNZ SMNEXT ;IF NOT, JUMP MVI B,CR ;YES, SHUT DOWN THE MODEM MVI C,SNDCHR CALL MEX MVI A,3 ;RETURN ABORT CODE RET SMNEXT: DCR C ;NO JNZ SMWLP ;CONTINUE ; ; ONE MINUTE WITH NO MODEM RESPONSE (OR NO CONNECTION) ; SMTIMO: MVI A,2 ;RETURN TIMEOUT CODE RET ; ; MODEM GAVE US A RESULT, CHECK IT ; SMTEST: ANI 7FH ;IGNORE ANY PARITY CALL SMANAL ;TEST THE RESULT MOV A,B ;A=RESULT (CY SIGNIFICANT HERE TOO) PUSH PSW ;SAVE IT SMTLP: MVI C,INMDM ;FLUSH ANY REMAINING COMMAND LINE CALL MEX JC SMCHEK ;JUMP IF NO INPUT CPI LF ;GOT SOME ... WAITING FOR EOL JNZ SMTLP ;EAT ANY IN-BETWEEN SMCHEK: POP PSW ;A HAS MEX RETURN-CODE, CY=1 IF UNKNOWN JC RESULT ;IF RESULT UNKNOWN, IGNORE IT RET ; SMANAL: MVI B,0 ;PREP CONNECT CODE CPI 'C' ;"CONNECT"? RZ CPI '1' ;NUMERIC VERSION OF "CONNECT" RZ CPI '5' ;NUMERIC VERSION OF "CONNECT 1200" RZ INR B ;PREP BUSY CODE B=1 CPI 'B' RZ INR B ;PREP NO CONNECT MSG B=2 CPI 'N' ;N=NO CONNECT RZ CPI '3' ;NUMERIC VERSION OF "NO CONNECT" RZ MVI B,4 ;PREP MODEM ERROR CPI 'E' ;E=ERROR RZ CPI '4' ;NUMERIC VERSION OF "ERROR" RZ STC ;UNKNOWN... RET ; ;..... ; ; SMARTMODEM UTILITY ROUTINE: SEND STRING TO 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 ; SMDIAL: DB 'ATDT ' DIALBF: DS 52 ;2* 24 CHAR MAX, + CR + NULL + SLOP DIALPT: DS 2 ;DIAL POSITION POINTER ; ; ; >>>> End of MODEM Specific Overlay