; Title 'MEX overlay for the Sanyo MBC-1000 Computer' ; ; ; This file adapts the Sanyo MBC-1000 computer to the MEX modem program. ; ; REV EQU 21 ;overlay revision level ; ; 09/15/84: Revision 2.1 A major revision. Added features of SET SPKR, ; SET WAIT, and SET DIAL, and disable auto-answer. All the routines ; were borrowed from MXM-US13.ASM but with great difficulty and much ; alteration. Added conditional assembly for smartmodem (SMMODEM) & ; ANCHOR, added DELAY to slow modem commands where the Anchor can ; catch them, and fixed a revision 2.0 bug where the SET status would ; lose the current baudrate info. This revision tested with an Anchor ; Mark XII Smartmodem until all works. Other smartmodems may require ; revision of delays and timing constants. Sanyo does not make pin 8 ; of the RS-232C connector available so the DCD (Data Carrier Detect) ; cannot be sensed and the Carrier Check and Carrier Show (CARRCK and ; CARRSH) portions were eliminated. Altered the SET status display to ; suit my taste and always provide status with help commands. Other ; modems are cautioned that their unique portions are essentially ; untested. Tested with MX-SM13A & MEX111. ((Bob Sandel)) ; ; 08/09/84: Revision 2.0 Combined MXO-SY11 and M7SY-3.ASM ; Added variables PTIMER, PBAUD, SQWV2 & N8251. Cleaned up some minor bugs ; in the OR routine for the 8251 output & insured out of mode state always ; occurs in SBAUD. Added comments where changes were made. (Bob Sandel) ; ;-------------------------------------------------------------------- ; ; THIS MODIFICATION MAKES USE OF TIMER 2 OF THE 8253 PROGRAMMABLE ; INTERVAL TIMER (IC4) ON THE SERIAL I/O BOARD OF THE SANYO MBC-1000. ; ; To use this program, the serial I/O board must be modified as follows: ; ; 1. Cut etch from IC18 Pin 1 to JP2 Pin 8. ; 2. Install jumper from IC18 Pin 1 to IC4 Pin 18. ; 3. Install jumper from IC4 Pin 17 to JP2 Pin 8. ; 4. Install jumper from IC4 Pin 16 to IC4 Pin 14. ; 5. Move jumper strap to JP2 Pin 8 for programmable baud rate, other ; pins (1-7) can still be used for standard baud rate selections. ; 6. Hardware modification is now complete. ; ; 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.; ; Edit 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 1200 baud when the program is first called up. Because of tem- ; perature and component variations, you mave have to alter the timing ; parameters BD110-BD19K, plus or minus 1 or 2 numbers, if CRC errors ; occur frequently during transmission and reception. ; ; Only 300 & 1200 Baud are enabled; info for other baudrates is located ; in table form above INITBD. For full capability, N8251 would have to ; be implemented via a second lookup table. ; ; ; _______________________________________________________________________ ; ; Note that all overlays may freely use memory up to 0CFFH. If your ; overlay must work with the MEX Smartmodem overlay (MXO-SMxx.ASM) or ; the MEX DATEC 212 overlay (MXO-DT10.ASM), the physical modem overlay ; should terminate by 0AFFH. ; ; The SET command allows the user to change the baud rates, and the ; parity. The parity options are: No parity (NONE); Even parity (EVEN); ; Even parity with 8 data bits (EVEN8); Odd parity (ODD); and Odd parity ; with 8 data bits (ODD8). EVEN8 and ODD8 are for special purposes and ; will most likely never be used. ;_______________________________________________________________________ ; ; Misc equates ; YES EQU 0FFH NO EQU 0 NA EQU 0FFH ;Value for baud rate not available ; SMMODEM EQU YES ;Yes=Smartmodem ANCHOR EQU YES ;Anchor has no speaker or programmable wait ;No=Hayes, U.S. Robotics BELL EQU 07H ;bell TAB EQU 09H ;tab LF EQU 0AH ;line feed CR EQU 0DH ;carriage return ESC EQU 1BH ;escape TPA EQU 0100H ;Transient Program Area MEX EQU 0D00H ;Address of the service processor ; ; ; The following information was altered for the Sanyo MBC-1000 ; PORT: EQU 0A5H ;Sanyo 8251 modem USART control port PTIMER EQU 0A3H ;8253 programmable interval timer control PBAUD EQU 0A2H ;8253 data port (square wave, n/2+n/2) ; MODCTL: EQU PORT ;MODEM CONTROL PORT MODDAT: EQU PORT-1 ;MODEM DATA PORT ; MDRCVB: EQU 00000010B ;bit to test for RECEIVE MDRCVR: EQU 00000010B ;value when READY MDSNDB: EQU 00000001B ;bit to test for SEND MDSNDR: EQU 00000001B ;value when READY EVEN EQU 01111000B ;EVEN parity, 7 data bits EVEN8 EQU 01111100B ;EVEN parity, 8 data bits ODD EQU 01011000B ; ODD parity, 7 data bits ODD8 EQU 01011100B ; ODD parity, 8 data bits NONE EQU 01001100B ; no parity, 8 data bits = NONE ; ; SQWV2 EQU 10010110B ;Configures 8253 Timer-2 for square waves N8251 EQU 00000010B ;See 8251 lookup table below (150-1200 baud) ; ; Progammable Baud Rate factors (theoretical) ; ; Minor adjustment of 8253 n +1,-1 may be required 8253 8251 ; ---- ---- BD110: EQU NA ;NO 110 | 2C 03 BD300: EQU 041H ; <300> | 40 02 BD450: EQU NA ;NO 450 | 2B 02 BD600: EQU NA ;NO 600 | 20 02 BD710: EQU NA ;NO 710 | 1B 02 BD1200: EQU 010H ;<1200> | 10 02 BD2400: EQU NA ;NO 2400 | 80 01 BD4800: EQU NA ;NO 4800 | 40 01 BD9600: EQU NA ;NO 9600 | 20 01 BD19K: EQU NA ;NO 19200 | 10 01 ; ; INITBD: EQU 5 ;Initial baud rate (1200) ; ; Control bytes ; RESET1 EQU 10000111B ;Initialize UART RESET2 EQU 01000000B ;Internal reset CHIPSET EQU 00100111B ;DTR, RTS, RE, TE DISCNT EQU 00010111B ;no DTR, RTS, RE, TE ; BREAK EQU CHIPSET OR 8H ;BREAK character ; ; ; MEX service processor stuff ... MEX supports an overlay service ; processor, located at 0D00H (and maintained at this address from ; version to version). If your overlay needs to call BDOS for any ; reason, it should call MEX instead; function calls below about ; 240 are simply passed on to the BDOS (console and list I/O calls ; are specially handled to allow modem port queueing, which is why ; you should call MEX instead of BDOS). MEX uses function calls ; above about 244 for special overlay services (described below). ; ; Some sophisticated overlays may need to do file I/O; if so, use ; the PARSFN MEX call with a pointer to the FCB in DE to parse out ; the name. This FCB should support a spare byte immediately pre- ; ceeding the actual FCB (to contain user # information). If you've ; used MEX-10 for input instead of BDOS-10 (or you're parsing part ; of a SET command line that's already been input), then MEX will ; take care of DU specs, and set up the FCB accordingly. There- ; after all file I/O calls done through the MEX service processor ; will handle drive and user with no further effort necessary on ; the part of the programmer. ; 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 ; ORG TPA ;we begin ; ; DS 3 ;MEX has a JMP START here ; ; 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 NO ;yes=PMMI modem \ / These 2 locations are not SMODEM: DB SMMODEM ;yes=Smartmodem / \ referenced by MEX TPULSE: DB 'P' ;T=touch, P=pulse (not referenced by MEX) CLOCK: DB 40 ;clock speed x .1, up to 25.5 mhz. MSPEED: DB INITBD ;sets initial baud rate ;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 NO ;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 YES ;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 ; ; Equates used only by PMMI routines grouped together here. ; DS 2 ;not used ; ; Low-level modem I/O routines: this will be replaced with ; a jump table in MEX 2.0 (you can insert jumps here to longer ; routines if you'd like ... I'd recommend NOT putting part of ; a routine in this area, then jumping to the rest of the routine ; in the non-fixed area; that will complicate the 2.0 conversion) ; INCTL: IN MODCTL ;in modem control port RET DB 0,0,0,0,0,0,0 ;spares if needed ; OTDATA: OUT MODDAT ;out modem data port RET DB 0,0,0,0,0,0,0 ;spares if needed ; INPORT: IN MODDAT ;in modem data port RET DB 0,0,0,0,0,0,0 ;spares if needed ; ; 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 TESTR: CPI MDRCVR ! RET ;value of receive bit when ready MASKS: ANI MDSNDB ! RET ;bit to test for send ready TESTS: CPI MDSNDR ! RET ;value of send bit when ready ; ; ; 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 ; ; 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. ; LOGON: DS 2 ;needed for MDM compat, not ref'd by MEX DIALV: DS 3 ;dial digit in A (see info at PDIAL) DISCV: DS 3 ;disconnect the modem GOODBV: JMP DUMMY ;called before exit to CP/M INMODV: JMP NITMOD ;initialization. Called at cold-start NEWBDV: JMP SBAUD ;set baud rate NOPARV: DS 3 ;set for no parity (called after transfer) PARITV: DS 3 ;set modem parity (called before transfer) SETUPV: JMP SETCMD ;SET command SPMENV: DS 3 ;not used with MEX VERSNV: JMP SYSVER ;Overlay's voice in the sign-on message BREAKV: JMP SBREAK ;send a break ; ; 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 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 ; ; ; Clear/screen and clear/end-of-screen. Each routine must use the ; full 9 bytes alloted (may be padded with nulls). ; ; These routines (and other screen routines that MEX 2.0 will sup- ; port) will be accessed through a jump table in 2.0, and will be ; located in an area that won't tie the screen functions to the ; modem overlay (as the MDM format does). ; CLREOS: LXI D,EOSMSG MVI C,PRINT CALL MEX RET ; ; CLS: LXI D,CLSMSG ;null unless patched MVI C,PRINT CALL MEX RET ; ;------------------------------------------------------------ ; ; *** END OF FIXED FORMAT AREA *** ; ;------------------------------------------------------------ ; ; strings to clear-to-end-of-screen, and clear-screen ; EOSMSG: DB 0,0,0,0,0,0,'$' ;clear to end-of-screen (0 for pause) CLSMSG: DB 1AH,0,0,0,0,0,'$' ;clear whole screen (0 for pause) ; ; Modem initialization. ; NITMOD: MVI A,SQWV2 ;Initialize 8253 chip so counter 2 becomes OUT PTIMER ;baud rate programmable clock (square wave) LDA MSPEED CALL SBAUD ;set the baudrate ; IF SMMODEM ;if smartmodem, send start-up cmd(s) INITSM: LXI H,INISTR ;point to initialization string SENDLP: MVI C,SNDRDY ;MEX service function # 251 CALL MEX ;test for modem-send-ready JNZ SENDLP ;loop if not ready MOV A,M ;get character INX H ;increment to next character address CPI '$' ;end-of-string ? JZ INITEX ;Yes, exit MOV B,A ;No, put character in B MVI C,SNDCHR ;MEX service function # 249 CALL MEX ;let MEX output character to modem CALL DELAY ;needed for Anchor: others ??? JMP SENDLP ;loop 'til end-of message ; INITEX: MVI B,5 ;wait 0.5 sec for modem to say "OK" MVI C,TIMER ;MEX service function # 254 CALL MEX ;kill time ; ENDIF ;Smartmodem ; RET ; DELAY: MVI B,1 ;now set for 100 milliseconds MVI C,TIMER ;play with values until modem works CALL MEX RET ; ; You may define an intialization string in INISTR to set up smartmodem ; in any configuration desired. String must end with a '$' ; ; ; Command string sent to modem after I/O initialization ; IF SMMODEM ; INISTR: DB 'ATV0',CR ; Disable verbose mode DB 'ATS0=0',CR ; Disable auto-answer ENDIF ; Smartmodem ; IF SMMODEM AND NOT ANCHOR ; Pls check that your modem supports DB 'ATX1',CR ; Send extended result codes SPBYTE: DB 'ATM1',CR ; Speaker on 'til connect WABYTE: DB 'ATS7=30',CR ; Wait 30 seconds for carrier ENDIF ; END of smartmodem AND not Anchor ; IF SMMODEM ; continuation after Anchor part DB 'ATV1',CR ; Set verbose result codes DB '$' ; end-of-string :Must be here ; ENDIF ;Smartmodem ; RET ; ; Send-break routine ; SBREAK: MVI A,BREAK OUT MODCTL MVI B,2 ;wait 200 ms MVI C,TIMER CALL MEX MVI A,CHIPSET ;reset break OUT MODCTL RET ; ; Exit routine -- called just before MEX exits to CP/M ; DUMMY: RET ;we don't need one ; ; ; Set Baud Rate ; ; New baud-rate code in A. ; NOTE: this routine (ie, the one vectored through NEWBDV) should ; update MSPEED with the passed code, but ONLY if that rate is ; supported by the hardware. ; ; A=0: 110 baud A=1: 300 baud A=2: 450 baud ; A=3: 600 baud A=4: 710 baud A=5: 1200 baud ; A=6: 2400 baud A=7: 4800 baud A=8: 19200 baud ; SBAUD: PUSH H ;don't alter anybody PUSH D PUSH B MOV C,A ;save baud rate code MVI B,0 LXI H,BTABL ;Get baudrate value DAD B ;HL now contains address of baudrate number MOV A,M ;A now contains baudrate n CPI NA ;See if baud rate valid STC ;set for not valid JZ NOTVAL ;not valid ; ;Set hardware/software implemented baudrate OUT PBAUD ;8253 now set ; MVI A,RESET1 ;Insure out-of-mode state OUT MODCTL ;Modem status port MVI A,RESET1 ;Do it again OUT MODCTL ;For slight extra delay MVI A,RESET2 ;Then reset the USART OUT MODCTL ;Modem status port XTHL ;delay -- must be in pairs XTHL MVI A,N8251 ;This factor works for the range 150-1200 baud LXI H,PARITY ;A contains baudrate factor ORA M ;OR parity and data length w baudrate factor OUT MODCTL ;8251 Mode now set MOV A,C ; get baud rate code STA MSPEED ;save baud rate code MVI A,CHIPSET ;set chip for I/O OUT MODCTL ;8251 Command now set IN MODDAT ;Clear data port XRA A ;clear carry flag NOTVAL: POP B POP D POP H RET ; ; Parity control byte location ; PARITY: DB NONE ; ; Baud rate table ; BTABL: DB BD110 DB BD300 DB BD450 DB BD600 DB BD710 DB BD1200 DB BD2400 DB BD4800 DB BD9600 DB BD19K ; ; Sign-on message ; SYSVER: LXI D,SOMESG ; Point to signon message MVI C,PRINT ; MEX print string CALL MEX ; Print message on term ; CARRSH: ; Carrier Show & Carrier Detect deleted CARRCK: RET ; No carrier detect capability ; ; SOMESG: DB 'Sanyo MBC-1000 programmable baudrate version ' DB REV/10+'0','.' DB REV MOD 10+'0',CR,LF,'$' ; ; ; Newline on console ; CRLF: MVI A,CR CALL TYPE MVI A,LF ;fall into TYPE ; ; type char in A on console ; TYPE: PUSH H ;save 'em PUSH D PUSH B MOV E,A ;align output character MVI C,CONOUT ;print via MEX CALL MEX POP B POP D POP H RET ; ;------------------------------------------------------------ ; ; The remainder of this overlay implements a very versatile ; SET command ; ; Control is passed here after MEX parses a SET command. ; SETCMD: CALL CRLF ;for better readability MVI C,SBLANK ;any arguments? CALL MEX JC SETSHO ;if not, go print out values LXI D,CMDTBL ;parse command CALL TSRCH ;from table PUSH H ;any address on stack RNC ;if we have one, execute it POP H ;nope, fix stack SETERR: LXI D,SETEMS ;print error MVI C,PRINT CALL MEX RET ; SETEMS: DB CR,LF,'SET command error',CR,LF,'$' ; ; SET command table ... note that tables are constructed of command- ; name (terminated by high bit=1) followed by word-data-value returned ; in HL by MEX service processor LOOKUP. Table must be terminated by ; a binary zero. ; ; Note that LOOKUP attempts to find the next item in the input stream ; in the table passed to it in HL ... if found, the table data item is ; returned in HL; if not found, LOOKUP returns carry set. ; CMDTBL: DB '?'+80H ;"set ?" DW STHELP DB 'BAU','D'+80H ;"set baud" DW STBAUD DB 'PARIT','Y'+80H ;"set parity" DW STPAR ; IF NOT ANCHOR ; Anchor has no speaker or prog. wait DB 'SPK','R'+80H ; "set spkr" DW STSPKR DB 'WAI','T'+80H ; "set wait" DW STWAIT ENDIF ;not Anchor modem ; DB 'DIA','L'+80H ; "set dial" DW STDIAL ; DB 0 ;<<=== table terminator ; ; SET : 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 JZ sthelp ;exit with help menu 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 DW PSHOW IF NOT ANCHOR ;Anchor has no speaker or prog. wait DW SPSHOW DW WASHOW ENDIF ;not Anchor DW DISHOW DW 0 ; <<== table terminator ; ; ; SET ? processor ; STHELP: LXI D,HLPMSG MVI C,PRINT CALL MEX RET ; ; The help message ; HLPMSG: DB CR,LF,'SET commands:',CR,LF ; DB CR,LF,'SET BAUD 300 1200' ; DB CR,LF,'SET PARITY EVEN[8] ODD[8] NONE' ; IF NOT ANCHOR ; Anchor has no speaker or prog.wait ; DB CR,LF,'SET SPKR or or ' DB CR,LF,'SET WAIT <30> or <60> or <90>' ENDIF ; not Anchor ; DB CR,LF,'SET DIAL or ' ; DB CR,LF,LF,'$' ; ; SET BAUD processor ; STBAUD: MVI C,BDPARS ;function code CALL MEX ;let MEX look up code JC SETERR ;invalid code CALL SBAUD ;no, try to set it JC SETERR ;not-supported code JMP SETSHO ;review parameters ; BDSHOW: CALL ILPRT ;display baud DB 'Baud rate: ',0 LDA MSPEED MVI C,PRBAUD ;use MEX routine CALL MEX CALL CRLF RET ; ; SET PARITY processor ; STPAR: LXI D,PARTBL ;lookup next input item in table CALL TSRCH JC SETERR ;if not found, error MOV A,L ;get parity code STA PARITY ;store it LDA MSPEED ;get baud rate code CALL SBAUD ;set parity JMP SETSHO ;review parameters ; PSHOW: CALL ILPRT ;show parity DB 'Parity: ',0 LXI H,PARFND ;find proper message LDA PARITY ;get parity value MOV B,A FNDP: MOV A,M ;see if parity value matches ORA A ;first see if zero JZ SETERR ;should never get here CMP B ;match? INX H ;point to first letter of message JZ CDISP ;matches, type message FNDNXT: MOV A,M ORA A ;see if end of last message INX H JP FNDNXT ;not finished INX H ;increment past parity byte JMP FNDP ; ; PARITY argument table ; Format of the table is: Starting at PARTBL, the name is ; given (ending with 80H bit set), then the one byte code ; for setting that parity. The next byte duplicates the ; NEXT parity code (used in PSHOW). The byte at PARFND ; duplicates the first parity code. ; PARFND: DB EVEN PARTBL: DB 'EVE','N'+80H ;even parity, 7 data bits DB EVEN,EVEN8 DB 'EVEN','8'+80H ;even parity, 8 data bits DB EVEN8,ODD DB 'OD','D'+80H ; odd parity, 7 data bits DB ODD,ODD8 DB 'ODD','8'+80H ; odd parity, 8 data bits DB ODD8,NONE DB 'NON','E'+80H ; no parity, 8 data bits DB NONE,0 ; DB 0 ;<<== table terminator ; ; ; IF NOT ANCHOR ; Anchor does not have speaker ; ; SET SPKR processor ; STSPKR: LXI D,SPKTBL ; lookup next input item in table CALL TSRCH JC SETERR ; if not found, error STA SPBYTE+1 ; store the spkr command CALL NITMOD ; (re)initialize modem JMP SETSHO ; review parameters ; SPSHOW: CALL ILPRT ; show spkr mode DB 'Speaker: ' ,0 LDA SPBYTE+1 ; get spkr byte CPI '1' JZ SPONPT ; spkr on part-time CPI '2' JZ SPON ; spkr on continuously ; SPOFF: CALL ILPRT DB 'OFF',0 RET ; SPONPT: CALL ILPRT DB 'ON until connect',0 RET ; SPON: CALL ILPRT DB 'ON always',0 RET ; SPKTBL: DB 'OF','F'+80H ; set spkr off DB '0',0 DB 'O','N'+80H ; set spkr on 'til connect DB '1',0 DB 'DEBU','G'+80H ; set spkr on continuously DB '2',0 DB 0 ; <<=== table terminator ; ; ; ; SET WAIT processor ; STWAIT: LXI D,WAITBL ; lookup next input item in table CALL TSRCH ; search for parameter value JC SETERR ; if not found, error STA WABYTE+5 ; store the wait msb value MVI A,'0' ; fake lsbyte STA WABYTE+6 ; store the wait lsb value CALL NITMOD ; (re)initialize modem JMP SETSHO ; review parameters ; WASHOW: CALL ILPRT DB 'Wait: ',0 LDA WABYTE+5 CALL TYPE ; show msb LDA WABYTE+6 CALL TYPE ; show lsb CALL ILPRT DB ' seconds for carrier',0 RET ; WAITBL: DB '3','0'+80H ; "set wait 30" DB '3',0 DB '6','0'+80H ; "set wait 60" DB '6',0 DB '9','0'+80H ; "set wait 90" DB '9',0 DB 0 ; <<=== table terminator ; ENDIF ;not Anchor ; ; ; ; SET DIAL processor ; STDIAL: LXI D,DIATBL ; lookup next input item in table CALL TSRCH ; search for parameter value JC SETERR ; if not found, error STA TPULSE ; store the dial command JMP SETSHO ; review parameters ; DISHOW: CALL ILPRT ; show dial mode DB 'Dial: ',0 LDA TPULSE ; get dial byte CPI 'T' JZ TTONE ; touch tone ; PDIAL: CALL ILPRT DB 'Pulse',0 RET ; TTONE: CALL ILPRT DB 'Touch Tone',0 RET ; ; DIAL argument table ; DIATBL: DB 'TOUC','H'+80H ; touch tone DB 'T',0 DB 'PULS','E'+80H ; pulse dial DB 'P',0 DB 0 ; <<=== table terminator ; ; ; ; Print message ending with 80H bit set ; CDISP: MOV A,M ;get character to print INX H ;point to next character PUSH PSW ;save 80H bit ANI 7FH ;strip 80H bit just in case CALL TYPE POP PSW ORA A JM CRLF ;finished JMP CDISP ; ; 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 Sanyo MBC-1000 MEX modem overlay ; ;------------------------------------------------------------ ; END