home *** CD-ROM | disk | FTP | other *** search
- 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 <no-args>: 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 <ON> or <OFF>',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 <<<<
-
-