home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
MEX
/
MXO-SN10.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-06-30
|
40KB
|
1,112 lines
; Title 'MEX overlay for the Sanyo MBC-1200/1250 Computer'
;
; This file adapts the Sanyo MBC-1200/1250 to the MEX modem program.
;
; Created: 06/15/87 Last Modification: 06/15/87
;
; NOTE: Once you get this overlay into MEX, I heartily recommend
; that you adjust the page size and clock speed in the running
; program. To do the former, type 'STAT PAGE 33' and hit
; <ENTER> at the MEX:A0>> prompt. To do the latter, time
; a 60 second or so MEX 'SLEEP' command and adjust the
; clock speed with 'STAT CLOCK'. Once you've got it right,
; use the 'CLONE' command to make a permanent version.
;
; 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, reassemble, and MLOAD the *.HEX file into
; MEX as described in its documentation.
;____________________________________________________________________________
;
; SOME GENERAL NOTES:
;
; There are a variety of notes regarding how the overlay works, why it
; is the way it is, what you can and can't do with it included here.
;
; This overlay is intelligent regarding the SANYO 12## and stupid
; regarding any specific modems. It has been debugged using a
; SANYO 1250.
;
; If you need to add code for your particular modem, likely spots for
; its inclusion are after the 8215 chip mode initialization in the
; NITMOD (initialize modem) routine and in the SET command handler
; routine. You can get some general ideas from the Sanyo 1000 overlay
; source by scanning for their SmartModem equate in IF clauses with
; your editor and looking at what is done there. Most modem support
; above and beyond initialization and SET command support seems more
; appropriate in a separate overlay...
;
; Relatively complete documentation of the 8251 usart used is included
; in comments preceding the fixed format data area, along with equates
; for the various mode word fields, etc. You can use this information
; and the equates to adjust the operation of the overlay and to modify
; any routines you want to...
;
; If you wish to use this overlay with some SmartModem overlay, bear
; in mind that it must end before that one starts.
;
; The SET command implemented in this overlay gives relatively full
; control of the 8251 usart used by the Sanyo 12##'s for RS232C
; interface imlementation. More than you are likely to use. The modem
; specific stuff is pretty much up to you. Code for a "SET DIAL"
; command that sets the TPULSE flag byte (location 105H) used by
; SmartModem overlays for TOUCH/PULSE dialing control was left in
; IF clauses controlled by the DIALSET equate. This command does
; nothing but set the flag one way or another. You need more code
; to actually make it do something useful (such code might live in
; a separate overlay source code fiel such as the one(s) for the
; SmartModem), but it's there if you want it. Set the DIALSET equate
; to YES if you do.
;
; Further information on the SET command can be found near the code
; actually implements it. Search for the string "SET COMMAND" and
; you shall be rewarded...
;____________________________________________________________________________
;
; BAUD RATE NOTES:
;
; Use the "SET" command to change the baudrate when desired. It starts
; out at 1200 baud when the program is first called up.
;
; Only 300 & 1200 Baud are enabled. Due to the way the Sanyo 12##'s are
; designed, anything else requires modifying the positions of baud rate
; jumpers in the box.
;
; *********************************************************************
; NOTE: Since the Sanyos basically control the baud rate thru
; jumpering, it follows that there is a right way and a wrong
; way for those jumpers to be set when using this program. It
; just so happens that the default factory setting is 1200 baud
; in the 8251 usart chip 16x mode, which is exactly what we want
; here. This allows us to go to 64x mode and get 300 baud on
; those unfortunate and unusual occasions when we want it.
; Since the 8251 clock rate divisor modes are in multiples of
; four, there is no way I know of to get both 2400 and 1200
; baud out of the same jumper setting. You could wire in a
; switch... Nonetheless, one of these days, if you still have
; this box when 4800 baud becomes the vogue, the code changes
; will be simplicity itself.
; *********************************************************************
;____________________________________________________________________________
;
; CREDIT WHERE CREDIT IS DUE DEPARTMENT:
;
; This overlay file originated in the overlay for the SANYO 1000
; called MXO-SY21.ASM, which in turn originated someplace else....
;
; The hardware is different enough that quite a large portion of the
; code here is either new or re-arranged to suit my quirky mentality.
; Nonetheless, much has been retained, and never having done any code
; of this variety before, my thanks to Bob Sandel, who wrote the
; overlay for the 1000.
;
;____________________________________________________________________________
;
REV EQU 10 ; Overlay revision level
;
; Miscellaneous equates
;
YES EQU 0FFH
NO EQU 0
ALLBITS EQU 11111111B
;
; ASCII character equates
;
BELL EQU 07H ; Bell
TAB EQU 09H ; Tab
LF EQU 0AH ; Line feed
CR EQU 0DH ; Carriage return
ESC EQU 1BH ; Escape
;
; 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. Refer to the docs for any others.
;
TPA EQU 0100H ; Transient Program Area
MEX EQU 0D00H ; Address of the service processor
;
; The following equate determines whether code is included to
; set the TPULSE dial flag that I must assume is used by some
; modem overlays. I have no use for it. You may.
;
DIALSET EQU NO ; Include SET DIAL command?
;
PORT EQU 0EDH ; Sanyo 8251 modem USART control port
MODCTL EQU PORT ; MODEM CONTROL PORT
MODDAT EQU PORT-1 ; MODEM DATA PORT
;____________________________________________________________________________
;
; SOME DOCUMENTATION ON THE 8251 USART USED IN THE SANYO(S)
; and equates usable for controlling most of the stuff...
;____________________________________________________________________________
;
; 8251A chip mode word bit definitions
;
; The initial data used to construct a mode word for the 8251
; chip in default operation is located in the overlay data area
; that follows the first fixed data area that is understood by MEX.
; This area starts around address 01A7H and has a comment containing
; the string "OVERLAY DATA AREA" if you want to scan for it...
;
; +------+------+------+------+------+------+------+------+
; | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
; +------+------+------+------+------+------+------+------+
; | S2 | S1 | EP | PEN | L2 | L1 | B2 | B1 |
; +------+------+------+------+------+------+------+------+
; | | | | | | | |
; |+-----+ | | | | | |
; ||+-----------+ | | | | |
; |||+-----------------+ | | | |
; ||||+-----------------------+ | | |
; |||||+-----------------------------+ | |
; ||||||+-----------------------------------+ |
; |||||||+-----------------------------------------+
; ||||||||
; ||||||||
; |||||||+---------> 0 1 0 1
; ||||||+----------> 0 0 1 1
; |||||| MODE: SYNC 1X 16X 64X
; ||||||
; |||||+-----------> 0 1 0 1
; ||||+------------> 0 0 1 1
; |||| CHAR: 5 6 7 8 (BITS)
; ||||
; |||+-------------> PARITY: 1=ENABLE, 0=DISABLE
; |||
; ||+--------------> PARITY: 1=EVEN, 0=ODD
; ||
; |+---------------> 0 1 0 1
; +----------------> 0 0 1 1
; STOP: N/A 1 1.5 2 (BITS)
;
; Most of the above is self-explanatory. One comment on the MODE
; settings 1x, 16, 64x. These are specifications that essentially
; tell the usart chip, "the clock input you are getting is this
; many times faster than it should be..." What this means is that
; the 1, 16 or 64 that you specify is used by the chip to divide
; the clock rate before using it. That is why using 16x as standard
; for 1200 baud, we can goto 300 baud by switching to 64x, since:
; 1200/300=4=64/16 or (1200*16)=(300*64)
; Since I have no idea what or if the minimum usable clock rate is,
; all bets are off if you rejumper your box and/or use 1x mode.
; But by all means try it, if you need to...
;
; Some mode equates:
;
; Internal clock rate divisor
;
SYNC EQU 00000000B ; SYNC MODE (NOT USED)
X01 EQU 00000001B ; 1X MODE (NOT USED)
X16 EQU 00000010B ; 16X MODE 1200 BAUD
X64 EQU 00000011B ; 64X MODE 300 BAUD
;
; Character size
;
CHRLEN5 EQU 00000000B ; CHAR = 5 BITS
CHRLEN6 EQU 00000100B ; CHAR = 6 BITS
CHRLEN7 EQU 00001000B ; CHAR = 7 BITS
CHRLEN8 EQU 00001100B ; CHAR = 8 BITS
;
; Parity enable/disable, even/odd
PTYENBL EQU 00010000B ; ENABLE
PTYDSBL EQU 00000000B ; DISABLE
PTYEVEN EQU 00100000B ; EVEN
PTYODD EQU 00000000B ; ODD
;
; Stop bit settings
;
STPB1 EQU 01000000B ; 1 STOP BIT
STPB1H EQU 10000000B ; 1 1/2 STOP BITS
STPB2 EQU 11000000B ; 2 STOP BITS
;
; 8251A chip command word bit definitions
; +------+------+------+------+------+------+------+------+
; | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
; +------+------+------+------+------+------+------+------+
; | EH | IR | RTS | ER | SBRK | RXE | DTR | TXEN |
; +------+------+------+------+------+------+------+------+
; | | | | | | | |
; |+-----+ | | | | | |
; ||+-----------+ | | | | |
; |||+-----------------+ | | | |
; ||||+-----------------------+ | | |
; |||||+-----------------------------+ | |
; ||||||+-----------------------------------+ |
; |||||||+-----------------------------------------+
; ||||||||
; ||||||||
; |||||||+---------> TRANSMIT: 1=ENABLE, 0=DISABLE
; |||||||
; ||||||+----------> DATA TERMINAL READY: 1=FORCE (NOT DTR) TO ZERO
; ||||||
; |||||+-----------> RECEIVE: 1=ENABLE, 0=DISABLE
; |||||
; ||||+------------> SEND BREAK CHARACTER: 1=FORCE (TXD) TO ZERO
; ||||
; |||+-------------> ERROR RESET: 1=RESET FLAGS PE, OE, FE
; |||
; ||+--------------> REQUEST TO SEND: 1=FORCE (NOT RTS) TO ZERO
; ||
; |+---------------> INTERNAL RESET: 1=GOTO MODESET MODE
; |
; +----------------> ENTER HUNT MODE: 1=ENABLE SEARCH FOR SYNC CHRS
; (NO EFFECT IN ASYNC MODE)
;
; NOTE: MUST PERFORM ERROR RESET WHENEVER RXE AND EH ARE PROGRAMMED.
;
; Some command equates
;
EH EQU 10000000B ; ENTER HUNT MODE
IR EQU 01000000B ; INTERNAL RESET
RTS EQU 00100000B ; REQUEST TO SEND
ER EQU 00010000B ; ERROR RESET
SBRK EQU 00001000B ; SEND BREAK CHARACTER
RXE EQU 00000100B ; RECEIVE ENABLE
DTR EQU 00000010B ; DATA TERMINAL READY
TXEN EQU 00000001B ; TRANSMIT ENABLE
;
; 8251A chip status word bit definitions
; +-------+-------+-------+-------+-------+-------+-------+-------+
; | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
; +-------+-------+-------+-------+-------+-------+-------+-------+
; | DSR | SYNDET| FE | OE | PE |TXEMPTY| RXRDY | TXRDY |
; +-------+-------+-------+-------+-------+-------+-------+-------+
; | | | | | | | |
; |+------+ | | | | | |
; ||+-------------+ | | | | |
; |||+--------------------+ | | | |
; ||||+---------------------------+ | | |
; |||||+----------------------------------+ | |
; ||||||+-----------------------------------------+ |
; |||||||+------------------------------------------------+
; ||||||||
; ||||||||
; |||||||+---------> BIT HAS DIFFERENT MEANING FROM TXRDY OUTPUT PIN
; ||||||| BIT NOT CONDITIONED BY (NOT CTS) AND TXEN.
; ||||||| MEANS: DB BUFFER EMPTY
; ||||||| PIN IS CONDITIONED BY POTH OF THE ABOVE.
; ||||||| MEANS: DB BUFFER EMPTY * (CTS=0) * (TXEN=1)
; |||||||
; ||||||+----------> SAME AS I/O PIN
; ||||||
; |||||+-----------> SAME AS I/O PIN
; |||||
; ||||+------------> PARITY ERROR: SET WHEN A PARITY ERROR IS DETECTED.
; |||| RESET BY COMMAND WORD ER BIT. DOESN'T INHIBIT 8251
; ||||
; |||+-------------> OVERRUN ERROR: SET WHEN CPU DOESN'T READ A CHAR
; ||| BEFORE NEXT IS AVAILABLE. RESET BY ER BIT OF
; ||| COMMAND WORD. DOESN'T INHIBIT 8251 OPERATION.
; |||
; ||+--------------> FRAMING ERROR: SET WHEN VALID STOP BIT IS NOT
; || DETECTED AT THE END OF EVERY CHARACTER. RESET BY
; || ER BIT OF COMMAND WORD. DOESN'T INHIBIT 8251.
; ||
; |+---------------> SAME AS I/O PIN.
; |
; +----------------> DATA SET READY: INDICATES DSR IS AT ZERO
;
; Some status equates
;
DSR EQU 10000000B ; DATA SET READY
SYNDET EQU 01000000B ;
FE EQU 00100000B ; FRAMING ERROR
OE EQU 00010000B ; OVERRUN ERROR
PE EQU 00001000B ; PARITY ERROR
TXEMPTY EQU 00000100B ;
RXRDY EQU 00000010B ;
TXRDY EQU 00000001B ;
;
; Various byte equate values constructed from the above follow..
;
RESET1 EQU EH+RXE+DTR+TXEN ; Initialize UART
RESET2 EQU IR ; Internal reset
CHIPSET EQU RTS+RXE+DTR+TXEN ; DTR, RTS, RE, TE
DISCNT EQU ER+RXE+DTR+TXEN ; No DTR, RTS, RE, TE
;
; Progammable Baud Rate factors (theoretical)
;
NA EQU 0FFH ; Value for baud rate not available
;
BD110 EQU NA ; NO 110 BAUD RATE 0
BD300 EQU X64 ; <300> BAUD RATE 1
BD450 EQU NA ; NO 450 BAUD RATE 2
BD600 EQU NA ; NO 600 BAUD RATE 3
BD710 EQU NA ; NO 710 BAUD RATE 4
BD1200 EQU X16 ; <1200> BAUD RATE 5
BD2400 EQU NA ; NO 2400 BAUD RATE 6
BD4800 EQU NA ; NO 4800 BAUD RATE 7
BD9600 EQU NA ; NO 9600 BAUD RATE 8
BD19K EQU NA ; NO 19200 BAUD RATE 9
;____________________________________________________________________________
;
; 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
;_____________________________________________________________________________
;
; BEGIN FIXED FORMAT DATA AREA
; This data area is layed out in a format understood by MEX.
; Don't mess with the ordering of data here, as it is used to
; synchronize the operations of MEX with this and any other
; overlay(s) you may be using.
;
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 (not referenced by MEX)
SMODEM: DB NO ; Yes=Smartmodem (not referenced by MEX)
TPULSE: DB 'P' ; T=touch, P=pulse (not referenced by MEX)
; NOTE: This peculiar clock speed was set by timing the
; MEX 'SLEEP' command on my box. If yours is different,
; just change it with 'STAT CLOCK' and 'CLONE' MEX.
CLOCK: DB 47 ; Clock speed x .1, up to 25.5 mhz.
MSPEED: DB 5 ; 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
;
DS 2 ; Not used - only for PMMI routines
;
; 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 RXRDY ; Bit to test for receive ready
RET
;
TESTR: CPI RXRDY ; Value of receive bit when ready
RET
;
MASKS: ANI TXRDY ; Bit to test for send ready
RET
;
TESTS: CPI TXRDY ; Value of send bit when ready
RET
;
; 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 CPMEXT ; 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 ; Null: no clear to end of screen
MVI C,PRINT
CALL MEX
RET
;
CLS: LXI D,CLSMSG ; Clear screen, home cursor
MVI C,PRINT
CALL MEX
RET
;
; END OF FIXED FORMAT AREA
;
;____________________________________________________________________________
;
; BEGIN OVERLAY DATA AREA
;
; The following data areas are used by the overlay code for various
; operations MEX calls on it to perform. The ordering is not important
; except where noted in the comments.
;
; Some other data areas are scattered thruout the remainder of the file.
; These are mostly tables referenced from discrete routines and are thus
; most conveniently kept in the vicinity of those routines.
;
; Sign-on Message
; You can use this as an "eye-catcher" when debugging or patching
; this file. Marks the beginning of the overlay data area.
;
SOMESG:
DB 'Sanyo MBC-1200/1250 computer 300/1200 BAUD Version '
DB REV/10+'0','.'
DB REV MOD 10+'0',CR,LF
DB '$'
;
; 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)
;
; Baud rate table
;
BTABL: DB BD110 ; The byte called MSPEED is used to
DB BD300 ; index into this table to find the
DB BD450 ; current baud rate. For example, if
DB BD600 ; MSPEED equals 5, then the baud rate
DB BD710 ; is 1200, since thatis the fifth entry
DB BD1200 ; PAST the entry at BTABL.
DB BD2400 ; To reset the baud rate, simply
DB BD4800 ; MSPEED to the offset of the desired
DB BD9600 ; baud and calling the SBAUD routine
DB BD19K ; suffices.
;
; 8251 mode bits, saved by bit group
; The current values of the following bytes are or'ed together
; to form an 8251 mode word and output to the chip in the MODESET
; routine. Each byte represents certain bit positions in the mode
; word, and no attempt at error checking is made in the MODESET
; routine. The CLKMOD byte represents the baud rate used (300 or 1200)
; and is only updated thru use of the SBAUD routine, which chooses
; from the baud rate table above based on the MSPEED byte. It will
; not update the baud if the value is bad.
;
CLKMOD: DB X16 ; Mode bits: CLOCK DIVISOR (X16=1200 baud)
CHRLEN: DB CHRLEN8 ; Mode bits: CHARACTER LENGTH
PARITY: DB PTYDSBL ; Mode bits: PARITY
STOP: DB STPB1 ; Mode bits: STOP BITS
;
; END OVERLAY DATA AREA
;
;____________________________________________________________________________
;
; BEGIN EXECUTABLE CODE
;
; Carrier Show and Carrier Detect deleted.
; No carrier detect capability.
;
CARRSH:
CARRCK:
;
; Exit routine -- called just before MEX exits to CP/M
;
CPMEXT:
;
; DUMMY routine for calls that are not implemented.
;
DUMMY: RET ; We don't need one
;____________________________________________________________________________
;
; Modem initialization.
;
NITMOD: LDA MSPEED ; Get current baud rate setting
CALL SBAUD ; Set the baudrate
RET
;
; Send-break routine
;
SBREAK: MVI A,SBRK+CHIPSET ; Break control byte
OUT MODCTL ; Output
MVI B,2 ; Wait 200 ms
MVI C,TIMER ; MEX fcn code
CALL MEX ; Time out
MVI A,CHIPSET ; Reset break
OUT MODCTL ; Output
RET ; Return to caller
;
; 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
;
; The only baud rates supported are 300 and 1200.
;
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: bypass setting it
;
; Baud rate ok so set it
;
STA CLKMOD ; Put new baud code in clock rate byte
MOV A,C ; Get baud rate code (for MEX)
STA MSPEED ; Save baud rate code (for MEX)
CALL MODESET ; Call routine to tell 8251 about it
XRA A ; Clear carry flag
;
; Return point for valid and not valid calls
;
NOTVAL: POP B ; Restore registers and return
POP D
POP H
RET
;
; This code sets the 8251 chip mode from the mode bytes.
; Multiple bytes, each representing certain bit positions
; of the mode word are or'ed together here. MODESET is
; intended to be called from setup routines.
;
; The accumulator is trashed, flags are arbitrary.
;
MODESET:
PUSH H ; HL is all we save here...
MVI A,RESET1 ; Insure out-of-mode state
OUT MODCTL ; Modem control port
MVI A,RESET1 ; Do it again
OUT MODCTL ; For slight extra delay
MVI A,RESET2 ; Then reset the USART
OUT MODCTL ; Modem control port
XTHL ; Delay -- must be in pairs
XTHL ; Restore the glory that once was...
LDA CLKMOD ; Get 8251 clock mode
LXI H,CHRLEN ; Point at character length byte
ORA M ; Set bits
LXI H,PARITY ; Point at parity setting byte
ORA M ; Set bits
LXI H,STOP ; Point at stop bit setting byte
ORA M ; Set bits
OUT MODCTL ; 8251 Mode now set
MVI A,CHIPSET ; Set chip for I/O
OUT MODCTL ; 8251 Command now set
IN MODDAT ; Clear data port
POP H ; Get it back...
RET ; Return to caller
;
; Sign-on message
;
SYSVER:
CALL CRLF ; Skip a line
LXI D,SOMESG ; Point to signon message
MVI C,PRINT ; MEX print string
CALL MEX ; Print message on term
CALL CRLF ; Skip a line
CALL SETSH2 ; Show settings w/o scrn clr
;
; 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
;____________________________________________________________________________
;
; SET COMMAND NOTES (as implemented by this overlay):
;
; SET STOPBIT <1/1.5/2>
; SET CHARLEN <5/6/7/8>
; SET BAUD <1200/300>
; SET PARITY <EVEN/ODD/NONE>
;
; Optional:
; SET DIAL <TOUCH/PULSE>
;____________________________________________________________________________
;
; SET COMMAND processor and data - the rest of this overlay is
; devoted to the implementation of the command and its options.
;
; 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 <300/1200>
DW STBAUD
DB 'PARIT','Y'+80H ; SET PARITY <EVEN/ODD/NONE>
DW STPAR
DB 'CHARLE','N'+80H ; SET CHARLEN <5/6/7/8>
DW SETCLN
DB 'STOPBI','T'+80H ; SET STOPBIT <1/1.5/2>
DW SETSB
;
IF DIALSET ; (OPTIONAL)
DB 'DIA','L'+80H ; SET DIAL <TOUCH/PULSE>
DW STDIAL
ENDIF
;
DB 0 ; <<=== table terminator
;
; SET <no-args>: print current statistics
;
SETSHO:
CALL CLS ; Clear screen
SETSH2:
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 SETSHX ; 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
SETSHX: CALL CRLF ; Skip a line
RET
;
GOHL: PCHL
;
; table of SHOW subroutines
;
SHOTBL: DW BDSHOW ; BAUD
DW PSHOW ; PARITY
DW CLSHOW ; CHARACTER LENGTH
DW SBSHOW ; STOP BIT(S)
;
IF DIALSET ; (OPTIONAL)
DW DISHOW ; DIAL
ENDIF
;
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 <or> 1200'
;
DB CR,LF,'SET PARITY EVEN <or> ODD <or> NONE'
;
DB CR,LF,'SET STOPBIT 1 <or> 1.5 <or> 2'
;
DB CR,LF,'SET CHARLEN 5 <or> 6 <or> 7 <or> 8'
;
IF DIALSET ; (OPTIONAL)
DB CR,LF,'SET DIAL <TOUCH> or <PULSE>'
ENDIF
;
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
RET
;
; SET PARITY processor
; NOTE: Since zero is one of the valid possible values for
; the parity bytes and the table scanning routines use
; that as an end of table error marker, the bits of the
; actual parity byte are "flipped" using an XOR previous
; to searching the table for it, then flipped back before
; updating the parity byte. Thus the values in the table
; are one's complements or "negative logic" relative to
; the byte saved as parity and used to set the 8251 chip.
;
STPAR: LXI D,PARTBL ; Lookup next input item in table
CALL TSRCH
JC SETERR ; If not found, error
MOV A,L ; Get parity code
XRI 11111111B ; Flip the bits ... see note above
STA PARITY ; Store it
CALL MODESET ; 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
XRI 11111111B ; Flip the bits ... see note above
MOV B,A ; Second copy for SHWSCN routine
JMP SHWSCN ; Goto show value scan routine
;
; PARITY argument table
; Table format: starting at PARFND, each entry has the one byte
; code followed by the name string terminating with a
; high bit set in the last character, followed by the
; one byte code again. The last entry is followed by zero.
; This odd format allows the table to be used for multiple purposes.
;
; NOTE: Since zero is one of the valid possible values for
; the parity bytes and the table scanning routines use
; that as an end of table error marker, the bits of the
; actual parity byte are "flipped" using an XOR previous
; to searching the table for it, then flipped back before
; updating the parity byte. Thus the values in the table
; are one's complements or "negative logic" relative to
; the byte saved as parity and used to set the 8251 chip.
;
TPEVEN EQU ALLBITS-(PTYEVEN+PTYENBL) ; EVEN PARITY ENABLED (INVERSE BITS)
TPODD EQU ALLBITS-(PTYODD+PTYENBL) ; ODD PARITY ENABLED (INVERSE BITS)
TPNONE EQU ALLBITS-(PTYDSBL) ; PARITY DISABLED (INVERSE BITS)
;
PARFND: DB TPEVEN
PARTBL: DB 'EVE','N'+80H ; Even parity
DB TPEVEN,TPODD
DB 'OD','D'+80H ; Odd parity
DB TPODD,TPNONE
DB 'NON','E'+80H ; No parity
DB TPNONE,0
;
DB 0 ; <<== table terminator
;
; SET STOPBIT processor
;
SETSB: LXI D,SBTBL ; Lookup next input item in table
CALL TSRCH
JC SETERR ; If not found, error
MOV A,L ; Get stopbit code
STA STOP ; Store it
CALL MODESET ; Set stopbit
JMP SETSHO ; Review parameters
;
SBSHOW: CALL ILPRT ; Show stopbit
DB 'Stop bits: ',0
LXI H,SBFIND ; Find proper message
LDA STOP ; Get stopbit value
MOV B,A ; Second copy for SHWSCN routine
JMP SHWSCN ; Goto show value scan routine
;
; STOPBIT argument table
; Format of the table is identical to that of parity table
; except that no "negative logic" is necessary or used.
;
SBFIND: DB STPB1
SBTBL: DB '1'+80H ; One stop bit
DB STPB1,STPB1H
DB '1.','5'+80H ; One and a half stop bits
DB STPB1H,STPB2
DB '2'+80H ; Two stop bits
DB STPB2,0
;
DB 0 ; <<== table terminator
;
; SET CHARLEN processor
; NOTE: Since zero is one of the valid possible values for
; the charlen bytes and the table scanning routines use
; that as an end of table error marker, the bits of the
; actual charlen byte are "flipped" using an XOR previous
; to searching the table for it, then flipped back before
; updating the charlen byte. Thus the values in the table
; are one's complements or "negative logic" relative to
; the byte saved as charlen and used to set the 8251 chip.
;
SETCLN: LXI D,CLNTBL ; Lookup next input item in table
CALL TSRCH
JC SETERR ; If not found, error
MOV A,L ; Get charlen code
XRI 11111111B ; Flip the bits ... see note above
STA CHRLEN ; Store it
CALL MODESET ; Set stopbit
JMP SETSHO ; Review parameters
;
CLSHOW: CALL ILPRT ; Show charlen
DB 'Char len: ',0
LXI H,CLFIND ; Find proper message
LDA CHRLEN ; Get charlen value
XRI 11111111B ; Flip the bits ... see note above
MOV B,A ; Second copy for SHWSCN routine
JMP SHWSCN ; Goto show value scan routine
;
; CHARLEN argument table
; Format of the table is identical to that of parity table
;
; NOTE: Since zero is one of the valid possible values for
; the charlen bytes and the table scanning routines use
; that as an end of table error marker, the bits of the
; actual charlen byte are "flipped" using an XOR previous
; to searching the table for it, then flipped back before
; updating the charlen byte. Thus the values in the table
; are one's complements or "negative logic" relative to
; the byte saved as charlen and used to set the 8251 chip.
;
TCLEN5 EQU ALLBITS-(CHRLEN5) ; CHARACTER LENGTH = 5 (INVERSE BITS)
TCLEN6 EQU ALLBITS-(CHRLEN6) ; CHARACTER LENGTH = 6 (INVERSE BITS)
TCLEN7 EQU ALLBITS-(CHRLEN7) ; CHARACTER LENGTH = 7 (INVERSE BITS)
TCLEN8 EQU ALLBITS-(CHRLEN8) ; CHARACTER LENGTH = 8 (INVERSE BITS)
;
CLFIND: DB TCLEN5
CLNTBL: DB '5'+80H ; 5 bits
DB TCLEN5,TCLEN6
DB '6'+80H ; 6 bits
DB TCLEN6,TCLEN7
DB '7'+80H ; 7 bits
DB TCLEN7,TCLEN8
DB '8'+80H ; 8 bits
DB TCLEN8,0
;
DB 0 ; <<== table terminator
;
IF DIALSET
;
; 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
ENDIF
;
; Show set value scan routine
;
SHWSCN: 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 SHWSCN
;
; 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
;------ JP M,CRLF ; Finished
RM ; 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-1200/1250 MEX modem overlay
;
;____________________________________________________________________________
;
END