TITLE 'MEX Overlay for Apple ][ / SSC / Smartmodem' ; ; MXH-AP55.ASM ; REV EQU 55 ; 3 May 1987 ; ; This overlay is specific for the following hardware: ; ; Apple ][ +/e with PCPI Applicard ; Apple Super Serial Card ; ; Important Note: ; Rev 5.5 introduces the Interrupt/Buffer concept. This requires ; the use of an Applicard driver, in this case RINGBUF.DVR. Operation ; in this mode eliminates the infamous character loss on scroll problem ; up to 2400 baud. SET INTerrupt control has been added to this official ; release to allow bypassing the INT mode if the INT/Buffer is found to ; be buggy or as I found, I had two SuperSerial cards in, 1 with and 1 w/0 ; interrupts and this was a problem. (By the way I used the 2nd card for ; a network I/O). In any event, it's handy have the set feature and the ; default can be CLONEed in. -Jim ;------------------------------------------------------------------ ; REVISION HISTORY: ;------+---------+----------------+-------------------------------- ; Rev. | Date | Author | Description ;------+---------+----------------+-------------------------------- ; 5.5 | 3 May 87| Bob Sass/ | - added support for RINGBUF.DVR ; | | Jim Lill | See note above, Tested with //e ;------+---------+----------------+-------------------------------- ; 5.4 |16 Apr 87| Jim Lill | -speeded up calls to the Modem ; | | | Port by recoding PEEK and POKE and ; | | | changing CALLs to JMPs. Picked ; | | | up 19 bytes. ;------------------------------------------------------------------ ; 5.3 |13 Dec 86| Jim Lill | -added SET WAIT code for use with ; | | | MXO-SM14 and cleaned up SET displays ;------+---------+----------------+-------------------------------- ; 5.2 | 1 Nov 86| Jim Lill | -eliminated Modem specific section ; | | | requires use of Modem overlay ; | | | such as MXO-SM14 or MXM-2413 ; | | | This seems to solve a timing problem ; | | | that occurred when loading 2413 ; | | | over AP51 ;------+---------+----------------+-------------------------------- ; 5.1 | 5 Apr 86| Jim Lill | -changed CLSMSG and EOSMSG ; | | | -added INITBAUD equate for setting ; | | | MSPEED and baud in INITPORT ;------+---------+----------------+-------------------------------- ; 5.0 |1 Apr 86 | Jim Lill | created adaption, includes DCD ; | | | and a spot for RNG detect. ;------+---------+----------------+-------------------------------- ; IMPORTANT NOTE: ; This overlay is based on MXO-AP50.ASM by Henry Middlebrook ; Refer to it for additional info. The changes in this overlay ; could be easily adapted to other Middlebrook work like AP34 ; To find changes, search for "MEXplus" ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ YES EQU 0FFH NO EQU 0 ;--------------------------------------------------------------------- ; Options.... INITBAUD EQU 5 ;Initial Baud Rate ; 0=110 5=1200 ; 1=300 6=2400 ; 450 7=4800 ; 3=610 8=9600 ; 4=710 9=19200 Z80XTAL EQU 73 ;set to Z80 CPU crystal MHz ;times correction factor ;e.g: 6Mhz * 12.16666= 73 WAIT EQU YES ;set to YES if you use the ;SET WAIT command and MXO-SM14 etc WAITSEC EQU 45 ;default wait time ;--------------------------------------------------------------------- BELL EQU 07H ;bell CR EQU 0DH ;carriage return ESC EQU 1BH ;escape LF EQU 0AH ;linefeed TAB EQU 09H ;tab ; ;---------------------------------------------------------------------- ; Apple Super Serial Card equates ; ------------------------------- ; SSCSLOT EQU 2 ;Slot of Super Serial Card MODDATP EQU 0C088H + (SSCSLOT*10H) ;data port of ACIA MODSTAP EQU 0C089H + (SSCSLOT*10H) ;status port of ACIA MODCTLP EQU 0C08BH + (SSCSLOT*10H) ;control port of ACIA MODCMDP EQU 0C08AH + (SSCSLOT*10H) ;command port of ACIA ; ; RDBYTE EQU 0FFE0H ;Read a Byte from Apple (A = BYTE) WRBYTE EQU 0FFE3H ;Write a Byte to Apple (C = BYTE) RDWORD EQU 0FFE6H ;Read 2 Bytes from Apple (DE = BYTES) WRWORD EQU 0FFE9H ;Write 2 Bytes to Apple (DE = BYTES) RDNBYTS EQU 0FFECH ;Read N Bytes (DE = COUNT, HL = BUFFER) WRNBYTS EQU 0FFEFH ;Write N Bytes (DE = COUNT, HL = BUFFER) ; PEEK1BYTE EQU 6 ;Command to Peek 1 Byte in the Apple POKE1BYTE EQU 7 ;Command to Poke 1 Byte to the Apple ; ; New DCD routine equate MEXplus ; CTSMSK EQU 00100000B ;mask to test for carrier ; ; Status bit equates for SSC serial port ; MDSNDB EQU 10H MDSNDR EQU 10H MDRCVB EQU 08H MDRCVR EQU 08H ; ; Equates for PSW (Parity, Stop Bit, Word Length) used by SSC ACIA ; In these bytes the high nibble is the Word Length mask, the low ; nibble is the Parity mask for the ACIA PSWFIX routine. ; P8N1 EQU 010H ;8 NONE 1 P7E1 EQU 036H ;7 EVEN 1 P7O1 EQU 032H ;7 ODD 1 P7N1 EQU 030H ;7 NONE 1 ; BRKMSK EQU 0CH ;mask byte for BREAK function DISCB EQU 0AH ;command byte for ACIA to drop DTR ; ;---------------------------------------------------------------------- ; ; 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 ; ; changed jumps for MEXplus ; DB 0C3H ;flags a LOADable file (for 8080) DS 2 ;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 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 Z80XTAL ;CPU speed 106H MSPEED: DB INITBAUD;sets display time for sending a file 107H ;uses INITBAUD equate, changes during ;use via PBAUD routine 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 WAITSEC ;passes wait time to modem overlay EXTRA2: DB 0 ;for future expansion 11FH BRKCHR: DB '@'-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 ; DS 2 ;unused in this overlay ; ; 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 ;--------------------------------------------------------------------------- ; MEXplus changes: ; - was unused area. >>> MUST total 12bytes <<< ; - now used for the Ringing and Carrier Detect jumps ; DCDTEST: JMP DCDVEC ;jump to carrier-detect routine 154H RNGTEST: JMP RNGVEC ;jump to ring detect routine 157H ; DS 6 ;remainder of space ; ;--------------------------------------------------------------------------- ; LOGON: DS 2 ;not used by MEX 160H DIALV: DS 3 ;used by Modem overlay 162H DISCV: JMP DISCON ;drops DTR to hang-up fast! 165H GOODBV: JMP GOODBYE ;called before exit to CPM 168H INMODV: JMP INITPORT ;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 ; CLS: LXI D,CLSMSG ; 19EH MVI C,PRINT CALL MEX RET ; ; *** END OF FIXED FORMAT AREA *** ;-------------------------------------------------------------------------- ; Make sure MEXplus has all of its' reserved area.. ; ORG 0200H ;-------------------------------------------------------------------------- ; Overlay Fixed Messages Area ; ; these codes changed to match PCPI CONFIGSV values for Televideo 950 ; ; EOSMSG: DB ESC,89,0,0,'$' ;clear to end of screen message ; CLSMSG: DB ESC,42,0,0,'$' ;clear screen message ; VERMSG: DB CR,LF,'MEX for Apple ][ / PCPI / SSC',CR,LF DB ' Version: ',REV/10+'0','.' DB REV MOD 10+'0' DB CR,LF,LF,'$' DB 0,'Overlay by Middlebrook/Lill',0,'$' ; ;---------------------------------------------------------------------- ; These routines are specific to the Apple ][+ with Applicard. The ; routines read modem hardware (Apple Super Serial Card ACIA) directly ; from the Applicard. ; ; Read the Command Port of ACIA ; RD$MODCMDP: PUSH D LXI D,MODCMDP JMP PEEK ; ; Write to the Command Port of ACIA ; WR$MODCMDP: PUSH D LXI D,MODCMDP JMP POKE ; ; Write to the Control Port of the ACIA ; WR$MODCTLP: PUSH D LXI D,MODCTLP JMP POKE ; ; Read the Control Port of the ACIA ; RD$MODCTLP: PUSH D LXI D,MODCTLP JMP PEEK ;................................. ; ; Read Data Port of ACIA ; RD$MODDATP: LDA INTFLG ;get the INT flag ORA A ;test it JZ NONINTDATP ;it not set jump to non-irq read INTDATP: PUSH B ; MVI C,0F1H ;Device 28 (read) CALL WRBYTE CALL RDBYTE POP B RET NONINTDATP: PUSH D ;non-irq read LXI D,MODDATP JMP PEEK ;................................. ; ; Read the Status Port of the ACIA ; RD$MODSTAP: LDA INTFLG ;see if in INT mode ORA A ; JZ NONINTSTAP ;if not use non-INT INTSTAP: PUSH B ;INT method MVI C,0F3H ;Device 28 (other) CALL WRBYTE MVI C,1 CALL WRBYTE CALL RDBYTE POP B RET NONINTSTAP: PUSH D ;non-INT method LXI D,MODSTAP JMP PEEK ;............................... ; ; Write to the Serial Data Port of the ACIA ; WR$MODDATP: PUSH D LXI D,MODDATP JMP POKE ;............................. ; ; Peek at 1 byte from Apple 6502 address space ; ENTRY: DE = Address in Apple ; EXIT: A = Data ; PEEK: PUSH B MVI C,PEEK1BYTE CALL WRBYTE CALL WRWORD CALL RDBYTE POP B POP D RET ; ; Poke 1 byte to Apple 6502 address space ; ENTRY: DE = Address in Apple ; EXIT: A = Data ; POKE: PUSH B MOV B,A MVI C,POKE1BYTE CALL WRBYTE CALL WRWORD MOV C,B CALL WRBYTE POP B POP D RET ; ;---------------------------------------------------------------------- ; The new stuff for MEXplus ; ; Data Carrier Detect Routine ; DCDVEC: CALL RD$MODSTAP ;read SSC status port ANI CTSMSK ;isolate carrier bit JNZ NOCARR ;0=carrier detected CMA ;make it 0ffh RET ; NOCARR: XRA A ;make it 0 RET ; ; ; Ring Detect Routine ; RNGVEC: JMP DCDVEC ;overlay doesn't know ; ;---------------------------------------------------------------------- ; ; This routine sends a timed Break to modem from SSC card. ; SENDBRK:CALL RD$MODCMDP ;get current command status STA CMDSV ORI BRKMSK ;mask to make ACIA send BREAK CALL WR$MODCMDP ;send command MVI B,5 MVI C,TIMER ;wait 500 msecs CALL MEX LDA CMDSV ;get old command state JMP WR$MODCMDP ;put it back ; ;..... ; You can add your own routine here to set DTR low and/or send a break ; tone to disconnect when exiting to CPM. ; GOODBYE: LDA INTFLG ;get the INT flag ORA A ;is it set? JZ BYE ;jump if not CALL INTOFF BYE: RET ;................................ ; ; Turn off 6502 interrupts. ; INTOFF: MVI C,0F3H ;Device 28 (other) CALL WRBYTE MVI C,20 CALL WRBYTE CALL RDBYTE RET ;................................. ; ; Turn On 6502 Interrupts ; INTON: MVI C,0F3H ;Device 28 (other) CALL WRBYTE MVI C,21 CALL WRBYTE CALL RDBYTE RET ;..... ; INITPORT: ;set up the default port conditions ; The following is used to initialize memory locations to eight data bits, ; no parity, one stop bit, and baud=INITBAUD LDA INTFLG ;get the INT flag ORA A ;test it JZ SETIT ;go set-up for non-INT MVI A,09H ;no parity, w/INT JMP SETIT ;go do it NONINT: MVI A,0BH ;no parity, w/o INT SETIT: STA PARSV ;save it MVI A,10H ;default 8 Data, 1 Stop Bits for ACIA STA WRDSV ;save it MVI A,INITBAUD ;set to initial baud equate JMP PBAUD ;let PBAUD setup ACIA (PBAUD will call ;CHNGPORT below to actually setup ACIA) ;.............................. ; ; This is the secondary entry used by the overlay to set baud, ; parity, and stop bit parameters of ACIA. ; CHNGPORT: LDA INTFLG ;get the INT flag ORA A ;test it JZ NOTINT ;go do non-INT stuff CALL INTON ;turn int on LDA PARSV ;get current parity byte ORI 09H ;req'd for int JMP DOIT ;go set up w/int NOTINT: CALL INTOFF ;turn int off LDA PARSV ;get current parity byte ORI 0BH ;w/o int DOIT: STA CMDSV ;save byte for other uses CALL WR$MODCMDP ;send to command port PUSH H LXI H,BAUDSV LDA WRDSV ORA M STA CTLSV ;...and save for other uses POP H JMP WR$MODCTLP ;now send to control port ; CMDSV: DB 0 ;temporary storage CTLSV: DB 0 ;temporary storage ; ;..... ; ; This routine drops DTR to force modem to disconnect. Does NOT do ; any initialization. ; DISCON: CALL RD$MODCMDP ;get current command status STA CMDSV ;save it MVI A,DISCB ;get disconnect byte (drops DTR) CALL WR$MODCMDP ;send to ACIA MVI B,10 MVI C,TIMER ;wait 1 second CALL MEX LDA CMDSV ;get back command status CALL WR$MODCMDP ;put it back in ACIA register MVI B,10 MVI C,TIMER ;wait another second JMP MEX ;..... ; ; This routine changes the modem baud rate with phone list entry ; ; Set baud-rate code in A (if supported by your modem overlay). PMMI ; supports only five rates, which are validated here. 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. ; PBAUD: PUSH H ;don't alter anybody PUSH D PUSH B MOV E,A ;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 JZ PBEXIT ;exit if so STA BAUDSV ;good rate, save it for CHNGPORT CALL CHNGPORT ;set baud (and PSW) MOV A,E ;get speed code back STA MSPEED ;make it current JMP PBEXIT + 1 ;jump error flag set PBEXIT: STC ;set return error for STBAUD caller POP B ;all done POP D POP H RET ; ; Table of baud rate parameters for supported rates ; BAUDSV: DB 0 ;current baud byte BAUDTB: DB 03H,06H,0,07H,0 ;110,300,450,610,710 DB 08H,0AH,0CH,0EH,0FH ;1200,2400,4800,9600,19200 ;..... ; ; Sign-on message ; SYSVER: LXI D,VERMSG MVI C,PRINT JMP MEX ;..... ; ; 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 ; -- if you prefer not to write a SET for your modem, you may delete the ; code from here to the END statement. Control is passed here after ; MEX parses a SET command. ; ; SETCMD: 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 JMP MEX ; 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 'WP','S'+80H ;"set PSW" DW STPSW DB 'TON','E'+80H ;'set TONE/PULSE byte to 'T' DW STTONE DB 'PULS','E'+80H ;'set TONE/PULSE byte to 'P' DW STPULSE DB 'WAI','T'+80H ;'set WAIT' DW SETDLY DB 'IN','T'+80H ;'set INT' DW SETINT 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 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 DLYSHO ;displays current wait time DW INTSHO ;displays current INT status DW CRLF DW 0 ;<<== table terminator ; ; SET ? processor ; STHELP: CALL CLS ;clear screen LXI D,HLPMSG MVI C,PRINT JMP MEX ; ; 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 WPS <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)',CR,LF IF WAIT DB 'SET WAIT "n" Seconds for Modem Result',CR,LF ENDIF DB 'SET INTerrupts or ',CR,LF 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:',TAB,TAB,TAB,0 LDA MSPEED MVI C,PRBAUD ;use MEX routine JMP MEX ; ; 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 CHNGPORT ;now fix ACIA registers ; PSWSHOW: CALL ILPRT DB '(W)ord(P)arity(S)top:',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 010H ;storage and default (8N1) PARSV: DB 0BH ;storage and default (no parity) WRDSV: DB 010H ;storage and default (8 data, 1 stop bits) ; FIXPSW: MOV A,L ;PSW byte from table STA PSWSET ;save it ANI 0F0H ;mask for word length bits STA WRDSV ;put in storage LDA PSWSET ;get back PSW byte ANI 0FH ;mask for parity bits RLC ;first shift into upper nibble.. RLC ;...away we go... RLC ;.....and go... RLC ;......and done ORI 0BH ;mask needed for ACIA command register STA PARSV ;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:',TAB,TAB,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 ; ;------------------------------------------------- ; SET WAIT processor IF WAIT SETDLY: MVI C,EVALA CALL MEX MOV A,H ORA A JNZ SETERR MOV A,L STA EXTRA1 DLYSHO: CALL ILPRT DB 'WAIT:',TAB,TAB,TAB,0 LDA EXTRA1 MOV L,A MVI H,0 MVI C,DECOUT CALL MEX CALL ILPRT DB ' Seconds',0 RET ENDIF ;...... ; ; SET INT Processor controls interrupt mode ; SETINT: LXI D,INTTBL ;point to argument table CALL TSRCH ;look for match with allowed arguments JC SETERR ;process error if found MOV A,L ; STA INTFLG ; INTSHO: CALL ILPRT ;show current status DB 'INTerrupt:',TAB,TAB,0 LDA INTFLG ;get current mode word ORA A ; JNZ INT ;skip if it is CALL ILPRT ; DB 'OFF',0 ; JMP CHNGPORT ; ; INT: CALL ILPRT ;print it DB 'ON',0 ; JMP CHNGPORT ; ; ;INT argument table ; INTTBL: DB 'OF','F'+80H DB 0,0 DB 'O','N'+80H DB 0FFH,0 DB 0 ; INTFLG: DB no ;.............................. ; ; 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 MXH-APnn <<<<