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 >
Assembly Source File  |  2000-06-30  |  40KB  |  1,112 lines

  1. ;    Title    'MEX overlay for the Sanyo MBC-1200/1250 Computer'
  2. ;
  3. ;     This file adapts the Sanyo MBC-1200/1250 to the MEX modem program.
  4. ;
  5. ;    Created:    06/15/87    Last Modification:  06/15/87
  6. ;
  7. ;    NOTE:    Once you get this overlay into MEX, I heartily recommend
  8. ;        that you adjust the page size and clock speed in the running
  9. ;        program. To do the former, type 'STAT PAGE 33' and hit 
  10. ;        <ENTER> at the MEX:A0>> prompt. To do the latter, time 
  11. ;        a 60 second or so MEX 'SLEEP' command and adjust the 
  12. ;        clock speed with 'STAT CLOCK'. Once you've got it right,
  13. ;        use the 'CLONE' command to make a permanent version.  
  14. ;
  15. ;     You will want to look this file over carefully. There are a number of
  16. ;     options that you can use to configure the program to suit your taste.;
  17. ;     Edit for your preferences, reassemble, and MLOAD the *.HEX file into
  18. ;    MEX as described in its documentation.
  19. ;____________________________________________________________________________
  20. ;
  21. ;    SOME GENERAL NOTES:
  22. ;
  23. ;    There are a variety of notes regarding how the overlay works, why it
  24. ;    is the way it is, what you can and can't do with it included here.
  25. ;
  26. ;    This overlay is intelligent regarding the SANYO 12## and stupid
  27. ;    regarding any specific modems. It has been debugged using a
  28. ;    SANYO 1250.
  29. ;
  30. ;    If you need to add code for your particular modem, likely spots for
  31. ;    its inclusion are after the 8215 chip mode initialization in the
  32. ;    NITMOD (initialize modem) routine and in the SET command handler
  33. ;    routine. You can get some general ideas from the Sanyo 1000 overlay
  34. ;    source by scanning for their SmartModem equate in IF clauses with
  35. ;    your editor and looking at what is done there. Most modem support
  36. ;    above and beyond initialization and SET command support seems more
  37. ;    appropriate in a separate overlay...
  38. ;
  39. ;    Relatively complete documentation of the 8251 usart used is included
  40. ;    in comments preceding the fixed format data area, along with equates
  41. ;    for the various mode word fields, etc. You can use this information
  42. ;    and the equates to adjust the operation of the overlay and to modify
  43. ;    any routines you want to...
  44. ;
  45. ;    If you wish to use this overlay with some SmartModem overlay, bear
  46. ;    in mind that it must end before that one starts.
  47. ;
  48. ;    The SET command implemented in this overlay gives relatively full
  49. ;    control of the 8251 usart used by the Sanyo 12##'s for RS232C
  50. ;    interface imlementation. More than you are likely to use. The modem
  51. ;    specific stuff is pretty much up to you. Code for a "SET DIAL"
  52. ;    command that sets the TPULSE flag byte (location 105H) used by
  53. ;    SmartModem overlays for TOUCH/PULSE dialing control was left in
  54. ;    IF clauses controlled by the DIALSET equate. This command does
  55. ;    nothing but set the flag one way or another. You need more code
  56. ;    to actually make it do something useful (such code might live in
  57. ;    a separate overlay source code fiel such as the one(s) for the
  58. ;    SmartModem), but it's there if you want it. Set the DIALSET equate
  59. ;    to YES if you do.
  60. ;
  61. ;    Further information on the SET command can be found near the code
  62. ;    actually implements it. Search for the string "SET COMMAND" and
  63. ;    you shall be rewarded...
  64. ;____________________________________________________________________________
  65. ;
  66. ;    BAUD RATE NOTES:
  67. ;
  68. ;     Use the "SET" command to change the baudrate when desired.  It starts
  69. ;     out at 1200 baud when the program is first called up.
  70. ;
  71. ;     Only 300 & 1200 Baud are enabled. Due to the way the Sanyo 12##'s are
  72. ;    designed, anything else requires modifying the positions of baud rate
  73. ;    jumpers in the box.
  74. ;
  75. ;    *********************************************************************
  76. ;    NOTE:    Since the Sanyos basically control the baud rate thru
  77. ;        jumpering, it follows that there is a right way and a wrong
  78. ;        way for those jumpers to be set when using this program. It
  79. ;        just so happens that the default factory setting is 1200 baud
  80. ;        in the 8251 usart chip 16x mode, which is exactly what we want
  81. ;        here. This allows us to go to 64x mode and get 300 baud on
  82. ;        those unfortunate and unusual occasions when we want it.
  83. ;        Since the 8251 clock rate divisor modes are in multiples of
  84. ;        four, there is no way I know of to get both 2400 and 1200
  85. ;        baud out of the same jumper setting. You could wire in a
  86. ;        switch... Nonetheless, one of these days, if you still have
  87. ;               this box when 4800 baud becomes the vogue, the code changes
  88. ;               will be simplicity itself.
  89. ;    *********************************************************************
  90. ;____________________________________________________________________________
  91. ;
  92. ;    CREDIT WHERE CREDIT IS DUE DEPARTMENT:
  93. ;
  94. ;    This overlay file originated in the overlay for the SANYO 1000
  95. ;    called MXO-SY21.ASM, which in turn originated someplace else....
  96. ;
  97. ;    The hardware is different enough that quite a large portion of the
  98. ;    code here is either new or re-arranged to suit my quirky mentality.
  99. ;    Nonetheless, much has been retained, and never having done any code
  100. ;    of this variety before, my thanks to Bob Sandel, who wrote the
  101. ;    overlay for the 1000.
  102. ;
  103. ;____________________________________________________________________________
  104. ;
  105. REV    EQU    10        ; Overlay revision level
  106. ;
  107. ;     Miscellaneous equates
  108. ;
  109. YES    EQU    0FFH
  110. NO    EQU    0
  111. ALLBITS EQU    11111111B
  112. ;
  113. ;    ASCII character equates
  114. ;
  115. BELL    EQU    07H        ; Bell
  116. TAB    EQU    09H        ; Tab
  117. LF    EQU    0AH        ; Line feed
  118. CR    EQU    0DH        ; Carriage return
  119. ESC    EQU    1BH        ; Escape
  120. ;
  121. ;     Note that all overlays may freely use memory up to 0CFFH.  If your
  122. ;     overlay must work with the MEX Smartmodem overlay (MXO-SMxx.ASM) or
  123. ;     the MEX DATEC 212 overlay (MXO-DT10.ASM), the physical modem overlay
  124. ;     should terminate by 0AFFH. Refer to the docs for any others.
  125. ;
  126. TPA    EQU    0100H        ; Transient Program Area
  127. MEX    EQU    0D00H        ; Address of the service processor
  128. ;
  129. ;    The following equate determines whether code is included to 
  130. ;    set the TPULSE dial flag that I must assume is used by some 
  131. ;    modem overlays. I have no use for it. You may.
  132. ;
  133. DIALSET EQU    NO        ; Include SET DIAL command?
  134. ;
  135. PORT    EQU    0EDH        ; Sanyo 8251 modem USART control port
  136. MODCTL    EQU    PORT        ; MODEM CONTROL PORT
  137. MODDAT    EQU    PORT-1        ; MODEM DATA PORT
  138. ;____________________________________________________________________________
  139. ;
  140. ;    SOME DOCUMENTATION ON THE 8251 USART USED IN THE SANYO(S)
  141. ;    and equates usable for controlling most of the stuff...
  142. ;____________________________________________________________________________
  143. ;
  144. ;    8251A chip mode word bit definitions
  145. ;
  146. ;    The initial data used to construct a mode word for the 8251
  147. ;    chip in default operation is located in the overlay data area
  148. ;    that follows the first fixed data area that is understood by MEX.
  149. ;    This area starts around address 01A7H and has a comment containing
  150. ;    the string "OVERLAY DATA AREA" if you want to scan for it...
  151. ;
  152. ;    +------+------+------+------+------+------+------+------+
  153. ;    | DB7  | DB6  | DB5  | DB4  | DB3  | DB2  | DB1  | DB0  |
  154. ;    +------+------+------+------+------+------+------+------+
  155. ;    | S2   | S1   | EP   | PEN  | L2   | L1   | B2   | B1   |
  156. ;    +------+------+------+------+------+------+------+------+
  157. ;    |      |      |      |      |      |      |      |
  158. ;     |+-----+      |      |      |      |      |      |
  159. ;    ||+-----------+      |      |      |      |      |
  160. ;    |||+-----------------+      |      |      |      |
  161. ;    ||||+-----------------------+      |      |      |
  162. ;    |||||+-----------------------------+      |      |
  163. ;    ||||||+-----------------------------------+      |
  164. ;    |||||||+-----------------------------------------+
  165. ;    ||||||||
  166. ;    ||||||||
  167. ;    |||||||+---------> 0    1    0    1
  168. ;    ||||||+----------> 0    0    1    1
  169. ;    ||||||       MODE: SYNC 1X   16X  64X
  170. ;    ||||||
  171. ;    |||||+-----------> 0    1    0    1
  172. ;    ||||+------------> 0    0    1    1
  173. ;    ||||         CHAR: 5    6    7    8  (BITS)
  174. ;    ||||
  175. ;    |||+-------------> PARITY: 1=ENABLE, 0=DISABLE
  176. ;    |||
  177. ;    ||+--------------> PARITY: 1=EVEN,   0=ODD
  178. ;    ||
  179. ;    |+---------------> 0    1    0    1
  180. ;    +----------------> 0    0    1    1
  181. ;             STOP: N/A  1    1.5  2  (BITS)
  182. ;
  183. ;    Most of the above is self-explanatory. One comment on the MODE
  184. ;    settings 1x, 16, 64x. These are specifications that essentially
  185. ;    tell the usart chip, "the clock input you are getting is this
  186. ;    many times faster than it should be..." What this means is that
  187. ;    the 1, 16 or 64 that you specify is used by the chip to divide
  188. ;    the clock rate before using it. That is why using 16x as standard
  189. ;    for 1200 baud, we can goto 300 baud by switching to 64x, since:
  190. ;         1200/300=4=64/16 or (1200*16)=(300*64)
  191. ;    Since I have no idea what or if the minimum usable clock rate is,
  192. ;    all bets are off if you rejumper your box and/or use 1x mode.
  193. ;    But by all means try it, if you need to...
  194. ;
  195. ;    Some mode equates:
  196. ;
  197. ;    Internal clock rate divisor
  198. ;
  199. SYNC    EQU    00000000B    ; SYNC MODE (NOT USED)
  200. X01    EQU    00000001B    ;   1X MODE (NOT USED)
  201. X16    EQU    00000010B    ;  16X MODE 1200 BAUD
  202. X64    EQU    00000011B    ;  64X MODE  300 BAUD
  203. ;
  204. ;    Character size
  205. ;
  206. CHRLEN5 EQU    00000000B    ; CHAR = 5 BITS
  207. CHRLEN6 EQU    00000100B    ; CHAR = 6 BITS
  208. CHRLEN7 EQU    00001000B    ; CHAR = 7 BITS
  209. CHRLEN8 EQU    00001100B    ; CHAR = 8 BITS
  210. ;
  211. ;    Parity enable/disable, even/odd
  212. PTYENBL EQU    00010000B    ; ENABLE
  213. PTYDSBL EQU    00000000B    ; DISABLE
  214. PTYEVEN EQU    00100000B    ; EVEN
  215. PTYODD    EQU    00000000B    ; ODD
  216. ;
  217. ;    Stop bit settings
  218. ;
  219. STPB1    EQU    01000000B    ; 1 STOP BIT
  220. STPB1H    EQU    10000000B    ; 1 1/2 STOP BITS
  221. STPB2    EQU    11000000B    ; 2 STOP BITS
  222. ;
  223. ;    8251A chip command word bit definitions
  224. ;    +------+------+------+------+------+------+------+------+
  225. ;    | DB7  | DB6  | DB5  | DB4  | DB3  | DB2  | DB1  | DB0  |
  226. ;    +------+------+------+------+------+------+------+------+
  227. ;    | EH   | IR   | RTS  | ER   | SBRK | RXE  | DTR  | TXEN |
  228. ;    +------+------+------+------+------+------+------+------+
  229. ;    |      |      |      |      |      |      |      |
  230. ;     |+-----+      |      |      |      |      |      |
  231. ;    ||+-----------+      |      |      |      |      |
  232. ;    |||+-----------------+      |      |      |      |
  233. ;    ||||+-----------------------+      |      |      |
  234. ;    |||||+-----------------------------+      |      |
  235. ;    ||||||+-----------------------------------+      |
  236. ;    |||||||+-----------------------------------------+
  237. ;    ||||||||
  238. ;    ||||||||
  239. ;    |||||||+---------> TRANSMIT: 1=ENABLE, 0=DISABLE
  240. ;    |||||||
  241. ;    ||||||+----------> DATA TERMINAL READY:  1=FORCE (NOT DTR) TO ZERO
  242. ;    ||||||
  243. ;    |||||+-----------> RECEIVE:  1=ENABLE, 0=DISABLE
  244. ;    |||||
  245. ;    ||||+------------> SEND BREAK CHARACTER: 1=FORCE (TXD) TO ZERO
  246. ;    ||||
  247. ;    |||+-------------> ERROR RESET:      1=RESET FLAGS PE, OE, FE
  248. ;    |||
  249. ;    ||+--------------> REQUEST TO SEND:     1=FORCE (NOT RTS) TO ZERO
  250. ;    ||
  251. ;    |+---------------> INTERNAL RESET:     1=GOTO MODESET MODE
  252. ;    |
  253. ;    +----------------> ENTER HUNT MODE:     1=ENABLE SEARCH FOR SYNC CHRS
  254. ;                         (NO EFFECT IN ASYNC MODE)                    
  255. ;    
  256. ;    NOTE: MUST PERFORM ERROR RESET WHENEVER RXE AND EH ARE PROGRAMMED.
  257. ;
  258. ;    Some command equates
  259. ;    
  260. EH    EQU    10000000B    ; ENTER  HUNT MODE
  261. IR    EQU    01000000B    ; INTERNAL RESET
  262. RTS    EQU    00100000B    ; REQUEST TO SEND
  263. ER    EQU    00010000B    ; ERROR RESET
  264. SBRK    EQU    00001000B    ; SEND BREAK CHARACTER 
  265. RXE    EQU    00000100B    ; RECEIVE ENABLE
  266. DTR    EQU    00000010B    ; DATA TERMINAL READY
  267. TXEN    EQU    00000001B    ; TRANSMIT ENABLE
  268. ;
  269. ;    8251A chip status word bit definitions
  270. ;    +-------+-------+-------+-------+-------+-------+-------+-------+
  271. ;    | DB7   | DB6   | DB5   | DB4   | DB3   | DB2   | DB1   | DB0   |
  272. ;    +-------+-------+-------+-------+-------+-------+-------+-------+
  273. ;    | DSR   | SYNDET| FE    | OE    | PE    |TXEMPTY| RXRDY | TXRDY |
  274. ;    +-------+-------+-------+-------+-------+-------+-------+-------+
  275. ;    |       |       |       |       |       |       |       |
  276. ;     |+------+       |       |       |       |       |       |
  277. ;    ||+-------------+       |       |       |       |       | 
  278. ;    |||+--------------------+       |       |       |       | 
  279. ;    ||||+---------------------------+       |       |       |
  280. ;    |||||+----------------------------------+       |       |
  281. ;    ||||||+-----------------------------------------+       |
  282. ;    |||||||+------------------------------------------------+
  283. ;    ||||||||
  284. ;    ||||||||
  285. ;    |||||||+---------> BIT HAS DIFFERENT MEANING FROM TXRDY OUTPUT PIN
  286. ;    |||||||           BIT NOT CONDITIONED BY (NOT CTS) AND TXEN.
  287. ;    |||||||               MEANS: DB BUFFER EMPTY
  288. ;    |||||||           PIN IS CONDITIONED BY POTH OF THE ABOVE.
  289. ;    |||||||               MEANS: DB BUFFER EMPTY * (CTS=0) * (TXEN=1)
  290. ;    |||||||
  291. ;    ||||||+----------> SAME AS I/O PIN
  292. ;    ||||||
  293. ;    |||||+-----------> SAME AS I/O PIN
  294. ;    |||||
  295. ;    ||||+------------> PARITY ERROR: SET WHEN A PARITY ERROR IS DETECTED.
  296. ;    ||||           RESET BY COMMAND WORD ER BIT. DOESN'T INHIBIT 8251
  297. ;    ||||
  298. ;    |||+-------------> OVERRUN ERROR: SET WHEN CPU DOESN'T READ A CHAR 
  299. ;    |||           BEFORE NEXT IS AVAILABLE. RESET BY ER BIT OF
  300. ;    |||           COMMAND WORD. DOESN'T INHIBIT 8251 OPERATION.
  301. ;    |||
  302. ;    ||+--------------> FRAMING ERROR: SET WHEN VALID STOP BIT IS NOT 
  303. ;    ||           DETECTED AT THE END OF EVERY CHARACTER. RESET BY
  304. ;    ||           ER BIT OF COMMAND WORD. DOESN'T INHIBIT 8251.
  305. ;    ||
  306. ;    |+---------------> SAME AS I/O PIN.
  307. ;    |
  308. ;    +----------------> DATA SET READY: INDICATES DSR IS AT ZERO 
  309. ;
  310. ;    Some status equates
  311. ;
  312. DSR    EQU    10000000B    ; DATA SET READY
  313. SYNDET    EQU    01000000B    ; 
  314. FE    EQU    00100000B    ; FRAMING ERROR
  315. OE    EQU    00010000B    ; OVERRUN ERROR 
  316. PE    EQU    00001000B    ; PARITY ERROR
  317. TXEMPTY EQU    00000100B    ; 
  318. RXRDY    EQU    00000010B    ; 
  319. TXRDY    EQU    00000001B    ; 
  320. ;
  321. ;    Various byte equate values constructed from the above follow..
  322. ;
  323. RESET1    EQU    EH+RXE+DTR+TXEN    ; Initialize UART
  324. RESET2    EQU    IR        ; Internal reset
  325. CHIPSET EQU    RTS+RXE+DTR+TXEN ; DTR, RTS, RE, TE
  326. DISCNT    EQU    ER+RXE+DTR+TXEN    ; No DTR, RTS, RE, TE
  327. ;
  328. ;  Progammable Baud Rate factors (theoretical)        
  329. ;
  330. NA    EQU    0FFH        ; Value for baud rate not available
  331. ;
  332. BD110    EQU    NA        ; NO 110    BAUD RATE 0    
  333. BD300    EQU    X64        ; <300>         BAUD RATE 1
  334. BD450    EQU    NA        ; NO 450        BAUD RATE 2
  335. BD600    EQU    NA        ; NO 600        BAUD RATE 3
  336. BD710    EQU    NA        ; NO 710        BAUD RATE 4
  337. BD1200    EQU    X16        ; <1200>    BAUD RATE 5
  338. BD2400    EQU    NA        ; NO 2400       BAUD RATE 6
  339. BD4800    EQU    NA        ; NO 4800       BAUD RATE 7
  340. BD9600    EQU    NA        ; NO 9600       BAUD RATE 8
  341. BD19K    EQU    NA        ; NO 19200      BAUD RATE 9
  342. ;____________________________________________________________________________
  343. ;
  344. ;     MEX service processor stuff ... MEX supports an overlay service
  345. ;     processor, located at 0D00H (and maintained at this address from
  346. ;     version to version).  If your overlay needs to call BDOS for any
  347. ;     reason, it should call MEX instead; function calls below about
  348. ;     240 are simply passed on to the BDOS (console and list I/O calls
  349. ;     are specially handled to allow modem port queueing, which is why
  350. ;     you should call MEX instead of BDOS).  MEX uses function calls
  351. ;     above about 244 for special overlay services (described below).
  352. ;
  353. ;     Some sophisticated overlays may need to do file I/O; if so, use
  354. ;     the PARSFN MEX call with a pointer to the FCB in DE to parse out
  355. ;     the name.  This FCB should support a spare byte immediately pre-
  356. ;     ceeding the actual FCB (to contain user # information).  If you've
  357. ;     used MEX-10 for input instead of BDOS-10 (or you're parsing part
  358. ;     of a SET command line that's already been input), then MEX will
  359. ;     take care of DU specs, and set up the FCB accordingly.  There-
  360. ;     after all file I/O calls done through the MEX service processor
  361. ;     will handle drive and user with no further effort necessary on
  362. ;     the part of the programmer.
  363. ;
  364. INMDM    EQU    255        ; Get char from port to A, CY=no more in 100 ms
  365. TIMER    EQU    254        ; Delay 100ms * reg B
  366. TMDINP    EQU    253        ; B=# secs to wait for char, cy=no char
  367. CHEKCC    EQU    252        ; Check for ^C from KBD, Z=present
  368. SNDRDY    EQU    251        ; Test for modem-send ready
  369. RCVRDY    EQU    250        ; Test for modem-receive ready
  370. SNDCHR    EQU    249        ; Send a character to the modem (after sndrdy)
  371. RCVCHR    EQU    248        ; Recv a char from modem (after rcvrdy)
  372. LOOKUP    EQU    247        ; Table search: see CMDTBL comments for info
  373. PARSFN    EQU    246        ; Parse filename from input stream
  374. BDPARS    EQU    245        ; Parse baud-rate from input stream
  375. SBLANK    EQU    244        ; Scan input stream to next non-blank
  376. EVALA    EQU    243        ; Evaluate numeric from input stream
  377. LKAHED    EQU    242        ; Get nxt char w/o removing from input
  378. GNC    EQU    241        ; Get char from input, cy=1 if none
  379. ILP    EQU    240        ; Inline print
  380. DECOUT    EQU    239        ; Decimal output
  381. PRBAUD    EQU    238        ; Print baud rate
  382. ;
  383. CONOUT    EQU    2        ; Simulated BDOS function 2: console char out
  384. PRINT    EQU    9        ; Simulated BDOS function 9: print string
  385. INBUF    EQU    10        ; Input buffer, same structure as BDOS 10
  386. ;_____________________________________________________________________________
  387. ;
  388. ;    BEGIN FIXED FORMAT DATA AREA 
  389. ;    This data area is layed out in a format understood by MEX. 
  390. ;    Don't mess with the ordering of data here, as it is used to 
  391. ;    synchronize the operations of MEX with this and any other 
  392. ;    overlay(s) you may be using.
  393. ;
  394.     ORG    TPA        ; We begin
  395. ;
  396.     DS    3        ; MEX has a JMP START here
  397. ;
  398. ;     The following variables are located at the beginning of the program
  399. ;     to facilitate modification without the need of re-assembly. They will
  400. ;     be moved in MEX 2.0.
  401. ;
  402. PMODEM:    DB    NO        ; Yes=PMMI modem   (not referenced by MEX)
  403. SMODEM:    DB    NO        ; Yes=Smartmodem   (not referenced by MEX)
  404. TPULSE:    DB    'P'        ; T=touch, P=pulse (not referenced by MEX)
  405.  
  406. ;    NOTE:    This peculiar clock speed was set by timing the 
  407. ;        MEX 'SLEEP' command on my box. If yours is different,
  408. ;        just change it with 'STAT CLOCK' and 'CLONE' MEX.
  409. CLOCK:    DB    47        ; Clock speed x .1, up to 25.5 mhz.
  410. MSPEED:    DB    5        ; Sets initial baud rate
  411.                 ; 0=110    1=300  2=450  3=600  4=710
  412.                 ; 5=1200 6=2400 7=4800 8=9600 9=19200
  413. BYTDLY:    DB    5        ; Default time to send character in
  414.                 ; Terminal mode file transfer (0-9)
  415.                 ; 0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  416. CRDLY:    DB    5        ; End-of-line delay after CRLF in terminal
  417.                 ; Mode file transfer for slow BBS systems
  418.                 ; 0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  419. COLUMS:    DB    5        ; Number of directory columns
  420. SETFL:    DB    YES        ; Yes=user-defined SET command
  421. SCRTST:    DB    YES        ; Yes=if home cursor and clear screen
  422.                 ; Routine at CLRSCRN
  423.     DB    0        ; Was once ACKNAK, now spare
  424. BAKFLG:    DB    NO        ; Yes=make .BAK file
  425. CRCDFL:    DB    YES        ; Yes=default to CRC checking
  426.                 ; No=default to Checksum checking
  427. TOGCRC:    DB    YES        ; Yes=allow toggling of Checksum to CRC
  428. CVTBS:    DB    NO        ; Yes=convert backspace to rub
  429. TOGLBK:    DB    YES        ; Yes=allow toggling of bksp to rub
  430. ADDLF:    DB    NO        ; No=no LF after CR to send file in
  431.                 ; Terminal mode (added by remote echo)
  432. TOGLF:    DB    YES        ; Yes=allow toggling of LF after CR
  433. TRNLOG:    DB    NO        ; Yes=allow transmission of logon
  434.                 ; Write logon sequence at location LOGON
  435. SAVCCP:    DB    YES        ; Yes=do not overwrite CCP
  436. LOCNXT:    DB    NO        ; Yes=local cmd if EXTCHR precedes
  437.                 ; No=not local cmd if EXTCHR precedes
  438. TOGLOC:    DB    YES        ; Yes=allow toggling of LOCNXTCHR
  439. LSTTST:    DB    YES        ; Yes=allow toggling of printer on/off
  440.                 ; In terminal mode. Set to no if using
  441.                 ; The printer port for the modem
  442. XOFTST:    DB    NO        ; Yes=allow testing of XOFF from remote
  443.                 ; While sending a file in terminal mode
  444. XONWT:    DB    NO        ; Yes=wait for XON after sending CR while
  445.                 ; Transmitting a file in terminal mode    
  446. TOGXOF:    DB    YES        ; Yes=allow toggling of XOFF testing
  447. IGNCTL:    DB    YES        ; Yes=do not send control characters
  448.                 ; Above CTL-M to CRT in terminal mode
  449.                 ; No=send any incoming CTL-char to CRT
  450. EXTRA1:    DB    0        ; For future expansion
  451. EXTRA2:    DB    0        ; For future expansion
  452. BRKCHR:    DB    '@'-40H        ; ^@ = Send a 300 ms. break tone
  453. NOCONN:    DB    'N'-40H        ; ^N = Disconnect from phone line
  454. LOGCHR:    DB    'L'-40H        ; ^L = Send logon
  455. LSTCHR:    DB    'P'-40H        ; ^P = Toggle printer
  456. UNSVCH:    DB    'R'-40H        ; ^R = Close input text buffer
  457. TRNCHR:    DB    'T'-40H        ; ^T = Transmit file to remote
  458. SAVCHR:    DB    'Y'-40H        ; ^Y = Open input text buffer
  459. EXTCHR:    DB    '^'-40H        ; ^^ = Send next character
  460. ;
  461.     DS    2        ; Not used - only for PMMI routines
  462. ;
  463. ;     Low-level modem I/O routines: this will be replaced with
  464. ;     a jump table in MEX 2.0 (you can insert jumps here to longer
  465. ;     routines if you'd like ... I'd recommend NOT putting part of
  466. ;     a routine in this area, then jumping to the rest of the routine
  467. ;     in the non-fixed area; that will complicate the 2.0 conversion)
  468. ;
  469. INCTL:    IN    MODCTL        ; In modem control port
  470.     RET
  471.     DB    0,0,0,0,0,0,0    ; Spares if needed
  472. ;
  473. OTDATA:    OUT    MODDAT        ; Out modem data port
  474.     RET
  475.     DB    0,0,0,0,0,0,0    ; Spares if needed
  476. ;
  477. INPORT:    IN    MODDAT        ; In modem data port
  478.     RET
  479.     DB    0,0,0,0,0,0,0    ; Spares if needed
  480. ;
  481. ;     Bit-test routines.  These will be merged with the above
  482. ;     routines in MEX 2.0 to provide a more reasonable format
  483. ;
  484. MASKR:    ANI    RXRDY        ; Bit to test for receive ready
  485.     RET
  486. ;
  487. TESTR:    CPI    RXRDY        ; Value of receive bit when ready
  488.     RET
  489. ;
  490. MASKS:    ANI    TXRDY        ; Bit to test for send ready
  491.     RET
  492. ;
  493. TESTS:    CPI    TXRDY        ; Value of send bit when ready                
  494.     RET
  495. ;
  496. ;     Unused area: was once used for special PMMI functions.
  497. ;     Now used only to retain compatibility with MDM overlays.
  498. ;     You may use this area for any miscellaneous storage you'd
  499. ;     like but the length of the area *must* be 12 bytes.
  500. ;
  501.     DS    12
  502. ;
  503. ;     Special modem function jump table: if your overlay cannot handle
  504. ;     some of these, change the jump to "DS 3", so the code present in
  505. ;     MEX will be retained.
  506. ;
  507. LOGON:    DS    2        ; Needed for MDM compat, not ref'd by MEX
  508. DIALV:    DS    3        ; Dial digit in A (see info at PDIAL)
  509. DISCV:    DS    3        ; Disconnect the modem
  510. GOODBV:    JMP    CPMEXT        ; Called before exit to CP/M
  511. INMODV:    JMP    NITMOD        ; Initialization. Called at cold-start
  512. NEWBDV:    JMP    SBAUD        ; Set baud rate
  513. NOPARV:    DS    3        ; Set for no parity (called after transfer)
  514. PARITV:    DS    3        ; Set modem parity (called before transfer)
  515. SETUPV:    JMP    SETCMD        ; SET command
  516. SPMENV:    DS    3        ; Not used with MEX
  517. VERSNV:    JMP    SYSVER        ; Overlay's voice in the sign-on message
  518. BREAKV:    JMP    SBREAK        ; Send a break
  519. ;
  520. ;     The following jump vector provides the overlay with access to special
  521. ;     routines in the main program (retained and supported in the main pro-
  522. ;     gram for MDM overlay compatibility). These should not be modified by
  523. ;     the overlay.
  524. ;
  525. ;     Note that for MEX 2.0 compatibility, you should not try to use these
  526. ;     routines, since this table will go away with MEX 2.0 (use the MEX
  527. ;     service call processor instead).
  528. ;
  529. ILPRTV:    DS    3        ; Replace with MEX function 9
  530. INBUFV:    DS    3        ; Replace with MEX function 10
  531. ILCMPV:    DS    3        ; Replace with table lookup funct. 247
  532. INMDMV:    DS    3        ; Replace with MEX function 255
  533. NXSCRV:    DS    3        ; Not supported by MEX (returns w/no action)
  534. TIMERV:    DS    3        ; Replace with MEX function 254
  535. ;
  536. ;     Clear/screen and clear/end-of-screen. Each routine must use the
  537. ;     full 9 bytes alloted (may be padded with nulls).
  538. ;
  539. ;     These routines (and other screen routines that MEX 2.0 will sup-
  540. ;     port) will be accessed through a jump table in 2.0, and will be
  541. ;     located in an area that won't tie the screen functions to the
  542. ;     modem overlay (as the MDM format does).
  543. ;
  544. CLREOS:    LXI    D,EOSMSG    ; Null: no clear to end of screen
  545.     MVI    C,PRINT
  546.     CALL    MEX
  547.     RET
  548. ;
  549. CLS:    LXI    D,CLSMSG    ; Clear screen, home cursor
  550.     MVI    C,PRINT
  551.     CALL    MEX
  552.     RET
  553. ;
  554. ;    END OF FIXED FORMAT AREA 
  555. ;
  556. ;____________________________________________________________________________
  557. ;
  558. ;    BEGIN OVERLAY DATA AREA
  559. ;    
  560. ;    The following data areas are used by the overlay code for various
  561. ;    operations MEX calls on it to perform. The ordering is not important
  562. ;    except where noted in the comments. 
  563. ;
  564. ;    Some other data areas are scattered thruout the remainder of the file.
  565. ;    These are mostly tables referenced from discrete routines and are thus
  566. ;    most conveniently kept in the vicinity of those routines.
  567. ;    
  568. ;    Sign-on Message
  569. ;    You can use this as an "eye-catcher" when debugging or patching
  570. ;    this file. Marks the beginning of the overlay data area.
  571. ;
  572. SOMESG:
  573.     DB    'Sanyo MBC-1200/1250 computer 300/1200 BAUD Version '
  574.     DB    REV/10+'0','.'
  575.     DB    REV MOD 10+'0',CR,LF
  576.     DB    '$'
  577. ;
  578. ;     Strings to clear-to-end-of-screen, and clear-screen
  579. ;
  580. EOSMSG:    DB    0,0,0,0,0,0,'$'    ; Clear to end-of-screen (0 for pause)
  581. CLSMSG:    DB    1AH,0,0,0,0,0,'$' ; Clear whole screen (0 for pause)
  582. ;
  583. ;     Baud rate table
  584. ;
  585. BTABL:    DB    BD110        ; The byte called MSPEED is used to 
  586.     DB    BD300        ;  index into this table to find the 
  587.     DB    BD450        ;   current baud rate. For example, if 
  588.     DB    BD600        ;    MSPEED equals 5, then the baud rate
  589.     DB    BD710        ;     is 1200, since thatis the fifth entry 
  590.     DB    BD1200        ;      PAST the entry at BTABL. 
  591.     DB    BD2400        ;     To reset the baud rate, simply 
  592.     DB    BD4800        ;      MSPEED to the offset of the desired
  593.     DB    BD9600        ;       baud and calling the SBAUD routine 
  594.     DB    BD19K        ;        suffices.
  595. ;
  596. ;    8251 mode bits, saved by bit group
  597. ;    The current values of the following bytes are or'ed together
  598. ;    to form an 8251 mode word and output to the chip in the MODESET
  599. ;    routine. Each byte represents certain bit positions in the mode 
  600. ;    word, and no attempt at error checking is made in the MODESET
  601. ;    routine. The CLKMOD byte represents the baud rate used (300 or 1200)
  602. ;    and is only updated thru use of the SBAUD routine, which chooses
  603. ;    from the baud rate table above based on the MSPEED byte. It will 
  604. ;    not update the baud if the value is bad. 
  605. ;
  606. CLKMOD:    DB    X16        ; Mode bits: CLOCK DIVISOR (X16=1200 baud)
  607. CHRLEN:    DB    CHRLEN8        ; Mode bits: CHARACTER LENGTH
  608. PARITY:    DB    PTYDSBL        ; Mode bits: PARITY
  609. STOP:    DB    STPB1        ; Mode bits: STOP BITS
  610. ;
  611. ;    END OVERLAY DATA AREA
  612. ;
  613. ;____________________________________________________________________________
  614. ;
  615. ;    BEGIN EXECUTABLE CODE
  616. ;
  617. ;    Carrier Show and Carrier Detect deleted.
  618. ;    No carrier detect capability.
  619. ;
  620. CARRSH:    
  621. CARRCK:    
  622. ;
  623. ;     Exit routine --  called just before MEX exits to CP/M
  624. ;
  625. CPMEXT:
  626. ;
  627. ;    DUMMY routine for calls that are not implemented.
  628. ;
  629. DUMMY:    RET            ; We don't need one
  630. ;____________________________________________________________________________
  631. ;
  632. ;     Modem initialization.
  633. ;
  634. NITMOD:    LDA    MSPEED        ; Get current baud rate setting 
  635.     CALL    SBAUD        ; Set the baudrate
  636.     RET
  637. ;
  638. ;     Send-break routine
  639. ;
  640. SBREAK:    MVI    A,SBRK+CHIPSET    ; Break control byte
  641.     OUT    MODCTL        ; Output
  642.     MVI    B,2        ; Wait 200 ms
  643.     MVI    C,TIMER        ; MEX fcn code
  644.     CALL    MEX        ; Time out
  645.     MVI    A,CHIPSET    ; Reset break
  646.     OUT    MODCTL        ; Output
  647.     RET            ; Return to caller
  648. ;
  649. ;     Set Baud Rate
  650. ;
  651. ;     New baud-rate code in A.
  652. ;     NOTE: this routine (ie, the one vectored through NEWBDV) should
  653. ;     update MSPEED with the passed code, but ONLY if that rate is
  654. ;     supported by the hardware.
  655. ;
  656. ;     A=0:   110 baud       A=1:   300 baud      A=2:   450 baud
  657. ;     A=3:   600 baud       A=4:   710 baud      A=5:  1200 baud
  658. ;     A=6:  2400 baud       A=7:  4800 baud      A=8: 19200 baud
  659. ;
  660. ;    The only baud rates supported are 300 and 1200.
  661. ;
  662. SBAUD:    PUSH    H        ; Don't alter anybody
  663.     PUSH    D
  664.     PUSH    B
  665.     MOV    C,A        ; Save baud rate code  
  666.     MVI    B,0
  667.     LXI    H,BTABL        ; Get baudrate value
  668.     DAD    B        ; HL now contains address of baudrate number
  669.     MOV    A,M        ; A  now contains baudrate n
  670.     CPI    NA        ; See if baud rate valid
  671.     STC            ; Set for not valid
  672.     JZ    NOTVAL        ; Not valid: bypass setting it
  673. ;    
  674. ;    Baud rate ok so set it
  675. ;
  676.     STA    CLKMOD        ; Put new baud code in clock rate byte
  677.     MOV    A,C        ; Get baud rate code  (for MEX)
  678.     STA    MSPEED        ; Save baud rate code (for MEX)
  679.     CALL    MODESET        ; Call routine to tell 8251 about it
  680.     XRA    A        ; Clear carry flag
  681. ;
  682. ;    Return point for valid and not valid calls
  683. ;
  684. NOTVAL:    POP    B        ; Restore registers and return
  685.     POP    D
  686.     POP    H
  687.     RET
  688. ;
  689. ;    This code sets the 8251 chip mode from the mode bytes.
  690. ;    Multiple bytes, each representing certain bit positions 
  691. ;    of the mode word are or'ed together here. MODESET is 
  692. ;    intended to be called from setup routines.
  693. ;
  694. ;    The accumulator is trashed, flags are arbitrary.
  695. ;
  696. MODESET:
  697.     PUSH    H        ; HL is all we save here... 
  698.     MVI    A,RESET1    ; Insure out-of-mode state
  699.     OUT    MODCTL        ; Modem control port
  700.     MVI    A,RESET1    ; Do it again
  701.     OUT    MODCTL        ; For slight extra delay
  702.     MVI    A,RESET2    ; Then reset the USART 
  703.     OUT    MODCTL        ; Modem control port
  704.     XTHL            ; Delay -- must be in pairs
  705.     XTHL            ; Restore the glory that once was...
  706.     LDA    CLKMOD        ; Get 8251 clock mode
  707.     LXI    H,CHRLEN    ; Point at character length byte
  708.     ORA    M        ; Set bits
  709.     LXI    H,PARITY    ; Point at parity setting byte 
  710.     ORA    M        ; Set bits
  711.     LXI    H,STOP        ; Point at stop bit setting byte
  712.     ORA    M        ; Set bits
  713.     OUT    MODCTL        ; 8251 Mode now set
  714.     MVI    A,CHIPSET    ; Set chip for I/O
  715.     OUT    MODCTL        ; 8251 Command now set
  716.     IN    MODDAT        ; Clear data port
  717.     POP    H        ; Get it back...
  718.     RET            ; Return to caller
  719. ;     Sign-on message
  720. SYSVER:    
  721.     CALL    CRLF        ; Skip a line
  722.     LXI    D,SOMESG    ; Point to signon message
  723.     MVI    C,PRINT        ; MEX print string
  724.     CALL    MEX        ; Print message on term
  725.     CALL    CRLF        ; Skip a line
  726.     CALL    SETSH2        ; Show settings w/o scrn clr
  727. ;
  728. ;     Newline on console
  729. ;
  730. CRLF:    MVI    A,CR
  731.     CALL    TYPE
  732.     MVI    A,LF        ; Fall into TYPE
  733. ;
  734. ;     type char in A on console
  735. ;
  736. TYPE:    PUSH    H        ; Save 'em
  737.     PUSH    D
  738.     PUSH    B
  739.     MOV    E,A        ; Align output character
  740.     MVI    C,CONOUT    ; Print via MEX
  741.     CALL    MEX
  742.     POP    B
  743.     POP    D
  744.     POP    H
  745.     RET
  746. ;____________________________________________________________________________
  747. ;
  748. ;    SET COMMAND NOTES (as implemented by this overlay):
  749. ;
  750. ;    SET STOPBIT <1/1.5/2>
  751. ;    SET CHARLEN <5/6/7/8>
  752. ;    SET BAUD    <1200/300>
  753. ;    SET PARITY  <EVEN/ODD/NONE>
  754. ;
  755. ;    Optional:
  756. ;    SET DIAL    <TOUCH/PULSE>
  757. ;____________________________________________________________________________
  758. ;
  759. ;     SET COMMAND processor and data - the rest of this overlay is 
  760. ;    devoted to the implementation of the command and its options.
  761. ;    
  762. ;     Control is passed here after MEX parses a SET command.
  763. ;
  764. SETCMD:    CALL    CRLF        ; For better readability
  765.     MVI    C,SBLANK    ; Any arguments?
  766.     CALL    MEX
  767.     JC    SETSHO        ; If not, go print out values
  768.     LXI    D,CMDTBL    ; Parse command
  769.     CALL    TSRCH        ; From table
  770.     PUSH    H        ; Any address on stack
  771.     RNC            ; If we have one, execute it
  772.     POP    H        ; Nope, fix stack
  773. SETERR:    LXI    D,SETEMS    ; Print error
  774.     MVI    C,PRINT
  775.     CALL    MEX
  776.     RET
  777. ;
  778. SETEMS:    DB    CR,LF,'SET command error',CR,LF,'$'
  779. ;
  780. ;     SET command table ... note that tables are constructed of command-
  781. ;     name (terminated by high bit=1) followed by word-data-value returned
  782. ;     in HL by MEX service processor LOOKUP.  Table must be terminated by
  783. ;     a binary zero.
  784. ;
  785. ;     Note that LOOKUP attempts to find the next item in the input stream
  786. ;     in the table passed to it in HL ... if found, the table data item is
  787. ;     returned in HL; if not found, LOOKUP returns carry set.
  788. ;
  789. CMDTBL:    DB    '?'+80H        ; SET ?
  790.     DW    STHELP
  791.     DB    'BAU','D'+80H    ; SET BAUD <300/1200>
  792.     DW    STBAUD
  793.     DB    'PARIT','Y'+80H    ; SET PARITY <EVEN/ODD/NONE>
  794.     DW    STPAR
  795.     DB    'CHARLE','N'+80H ; SET CHARLEN <5/6/7/8>        
  796.     DW    SETCLN
  797.     DB    'STOPBI','T'+80H ; SET STOPBIT <1/1.5/2>
  798.     DW    SETSB
  799. ;
  800.      IF    DIALSET        ; (OPTIONAL)
  801.     DB    'DIA','L'+80H    ; SET DIAL <TOUCH/PULSE>
  802.     DW    STDIAL
  803.      ENDIF
  804. ;
  805.  
  806.     DB    0        ; <<=== table terminator
  807. ;
  808. ;     SET <no-args>: print current statistics
  809. ;
  810. SETSHO:    
  811.     CALL    CLS        ; Clear screen
  812. SETSH2:
  813.     LXI    H,SHOTBL    ; Get table of SHOW subroutines
  814. SETSLP:    MOV    E,M        ; Get table address
  815.     INX    H
  816.     MOV    D,M
  817.     INX    H
  818.     MOV    A,D        ; End of table?
  819.     ORA    E
  820.     JZ    SETSHX        ; Exit if so
  821.     PUSH    H        ; Save table pointer
  822.     XCHG            ; Adrs to HL
  823.     CALL    GOHL        ; Do it
  824.     CALL    CRLF        ; Print newline
  825.     MVI    C,CHEKCC    ; Check for console abort
  826.     CALL    MEX
  827.     POP    H        ; It's done
  828.     JNZ    SETSLP        ; Continue if no abort
  829. SETSHX:    CALL    CRLF        ; Skip a line
  830.     RET
  831. ;
  832. GOHL:    PCHL
  833. ;
  834. ;     table of SHOW subroutines
  835. SHOTBL:    DW    BDSHOW        ; BAUD
  836.     DW    PSHOW        ; PARITY
  837.     DW    CLSHOW        ; CHARACTER LENGTH
  838.     DW    SBSHOW        ; STOP BIT(S)
  839. ;
  840.      IF    DIALSET        ; (OPTIONAL)
  841.     DW    DISHOW        ; DIAL
  842.      ENDIF
  843. ;
  844.     DW    0        ; <<== table terminator
  845. ;
  846. ;     SET ?  processor
  847. ;
  848. STHELP:    LXI    D,HLPMSG
  849.     MVI    C,PRINT
  850.     CALL    MEX
  851.     RET
  852. ;
  853. ;     The help message
  854. ;
  855. HLPMSG:    DB    CR,LF,'SET commands:',CR,LF
  856. ;
  857.     DB    CR,LF,'SET BAUD 300 <or> 1200'
  858. ;
  859.     DB    CR,LF,'SET PARITY EVEN <or> ODD <or> NONE'
  860. ;
  861.     DB    CR,LF,'SET STOPBIT 1 <or> 1.5 <or> 2'
  862. ;
  863.     DB    CR,LF,'SET CHARLEN 5 <or> 6 <or> 7 <or> 8'
  864.      IF    DIALSET        ; (OPTIONAL)
  865.     DB    CR,LF,'SET DIAL <TOUCH> or <PULSE>'
  866.      ENDIF
  867. ;
  868.     DB    CR,LF,LF,'$'
  869. ;
  870. ;     SET BAUD processor
  871. ;
  872. STBAUD:    MVI    C,BDPARS    ; Function code
  873.     CALL    MEX        ; Let MEX look up code
  874.     JC    SETERR        ; Invalid code
  875.     CALL    SBAUD        ; No, try to set it
  876.     JC    SETERR        ; Not-supported code
  877.     JMP    SETSHO        ; Review parameters
  878. ;
  879. BDSHOW:    CALL    ILPRT        ; Display baud
  880.     DB    'Baud rate: ',0
  881.     LDA    MSPEED
  882.     MVI    C,PRBAUD    ; Use MEX routine
  883.     CALL    MEX
  884.     RET
  885. ;
  886. ;     SET PARITY processor
  887. ;    NOTE:    Since zero is one of the valid possible values for 
  888. ;        the parity bytes and the table scanning routines use
  889. ;        that as an end of table error marker, the bits of the
  890. ;        actual parity byte are "flipped" using an XOR previous
  891. ;        to searching the table for it, then flipped back before 
  892. ;        updating the parity byte. Thus the values in the table
  893. ;        are one's complements or "negative logic" relative to 
  894. ;        the byte saved as parity and used to set the 8251 chip.
  895. ;
  896. STPAR:    LXI    D,PARTBL    ; Lookup next input item in table
  897.     CALL    TSRCH
  898.     JC    SETERR        ; If not found, error
  899.     MOV    A,L        ; Get parity code
  900.     XRI    11111111B    ; Flip the bits ... see note above
  901.     STA    PARITY        ; Store it 
  902.     CALL    MODESET        ; Set parity
  903.     JMP    SETSHO        ; Review parameters
  904. ;
  905. PSHOW:    CALL    ILPRT        ; Show parity
  906.     DB    'Parity:    ',0
  907.     LXI    H,PARFND    ; Find proper message
  908.     LDA    PARITY        ; Get parity value
  909.     XRI    11111111B    ; Flip the bits ... see note above
  910.     MOV    B,A        ; Second copy for SHWSCN routine
  911.     JMP    SHWSCN        ; Goto show value scan routine
  912. ;
  913. ;     PARITY argument table
  914. ;    Table format: starting at PARFND, each entry has the one byte
  915. ;        code followed by the name string terminating with a 
  916. ;        high bit set in the last character, followed by the
  917. ;        one byte code again. The last entry is followed by zero.
  918. ;    This odd format allows the table to be used for multiple purposes.
  919. ;
  920. ;    NOTE:    Since zero is one of the valid possible values for 
  921. ;        the parity bytes and the table scanning routines use
  922. ;        that as an end of table error marker, the bits of the
  923. ;        actual parity byte are "flipped" using an XOR previous
  924. ;        to searching the table for it, then flipped back before 
  925. ;        updating the parity byte. Thus the values in the table
  926. ;        are one's complements or "negative logic" relative to 
  927. ;        the byte saved as parity and used to set the 8251 chip.
  928. ;
  929. TPEVEN    EQU    ALLBITS-(PTYEVEN+PTYENBL) ; EVEN PARITY ENABLED (INVERSE BITS)
  930. TPODD    EQU    ALLBITS-(PTYODD+PTYENBL) ; ODD  PARITY ENABLED (INVERSE BITS)
  931. TPNONE    EQU    ALLBITS-(PTYDSBL) ; PARITY DISABLED     (INVERSE BITS)
  932. ;
  933. PARFND:    DB    TPEVEN
  934. PARTBL:    DB    'EVE','N'+80H    ; Even parity
  935.     DB    TPEVEN,TPODD
  936.     DB    'OD','D'+80H    ; Odd  parity
  937.     DB    TPODD,TPNONE
  938.     DB    'NON','E'+80H    ; No   parity
  939.     DB    TPNONE,0
  940. ;
  941.     DB    0        ; <<== table terminator
  942. ;
  943. ;     SET STOPBIT processor
  944. ;
  945. SETSB:    LXI    D,SBTBL        ; Lookup next input item in table
  946.     CALL    TSRCH
  947.     JC    SETERR        ; If not found, error
  948.     MOV    A,L        ; Get stopbit code
  949.     STA    STOP        ; Store it 
  950.     CALL    MODESET        ; Set stopbit
  951.     JMP    SETSHO        ; Review parameters
  952. ;
  953. SBSHOW:    CALL    ILPRT        ; Show stopbit
  954.     DB    'Stop bits: ',0
  955.     LXI    H,SBFIND    ; Find proper message
  956.     LDA    STOP        ; Get stopbit value
  957.     MOV    B,A        ; Second copy for SHWSCN routine
  958.     JMP    SHWSCN        ; Goto show value scan routine
  959. ;
  960. ;     STOPBIT argument table
  961. ;     Format of the table is identical to that of parity table
  962. ;    except that no "negative logic" is necessary or used.
  963. ;
  964. SBFIND:    DB    STPB1
  965. SBTBL:    DB    '1'+80H        ; One stop bit
  966.     DB    STPB1,STPB1H
  967.     DB    '1.','5'+80H    ; One and a half stop bits
  968.     DB    STPB1H,STPB2
  969.     DB    '2'+80H        ; Two stop bits
  970.     DB    STPB2,0
  971. ;
  972.     DB    0        ; <<== table terminator
  973. ;
  974. ;     SET CHARLEN processor
  975. ;    NOTE:    Since zero is one of the valid possible values for 
  976. ;        the charlen bytes and the table scanning routines use
  977. ;        that as an end of table error marker, the bits of the
  978. ;        actual charlen byte are "flipped" using an XOR previous
  979. ;        to searching the table for it, then flipped back before 
  980. ;        updating the charlen byte. Thus the values in the table
  981. ;        are one's complements or "negative logic" relative to 
  982. ;        the byte saved as charlen and used to set the 8251 chip.
  983. ;
  984. SETCLN:    LXI    D,CLNTBL    ; Lookup next input item in table
  985.     CALL    TSRCH
  986.     JC    SETERR        ; If not found, error
  987.     MOV    A,L        ; Get charlen code
  988.     XRI    11111111B    ; Flip the bits ... see note above
  989.     STA    CHRLEN        ; Store it 
  990.     CALL    MODESET        ; Set stopbit
  991.     JMP    SETSHO        ; Review parameters
  992. ;
  993. CLSHOW:    CALL    ILPRT        ; Show charlen
  994.     DB    'Char len:  ',0
  995.     LXI    H,CLFIND    ; Find proper message
  996.     LDA    CHRLEN        ; Get charlen value
  997.     XRI    11111111B    ; Flip the bits ... see note above
  998.     MOV    B,A        ; Second copy for SHWSCN routine
  999.     JMP    SHWSCN        ; Goto show value scan routine
  1000. ;
  1001. ;     CHARLEN argument table
  1002. ;     Format of the table is identical to that of parity table
  1003. ;
  1004. ;    NOTE:    Since zero is one of the valid possible values for 
  1005. ;        the charlen bytes and the table scanning routines use
  1006. ;        that as an end of table error marker, the bits of the
  1007. ;        actual charlen byte are "flipped" using an XOR previous
  1008. ;        to searching the table for it, then flipped back before 
  1009. ;        updating the charlen byte. Thus the values in the table
  1010. ;        are one's complements or "negative logic" relative to 
  1011. ;        the byte saved as charlen and used to set the 8251 chip.
  1012. ;
  1013. TCLEN5    EQU    ALLBITS-(CHRLEN5) ; CHARACTER LENGTH = 5 (INVERSE BITS)
  1014. TCLEN6    EQU    ALLBITS-(CHRLEN6) ; CHARACTER LENGTH = 6 (INVERSE BITS)
  1015. TCLEN7    EQU    ALLBITS-(CHRLEN7) ; CHARACTER LENGTH = 7 (INVERSE BITS)
  1016. TCLEN8    EQU    ALLBITS-(CHRLEN8) ; CHARACTER LENGTH = 8 (INVERSE BITS)
  1017. ;
  1018. CLFIND:    DB    TCLEN5
  1019. CLNTBL:    DB    '5'+80H        ; 5 bits
  1020.     DB    TCLEN5,TCLEN6
  1021.     DB    '6'+80H        ; 6 bits
  1022.     DB    TCLEN6,TCLEN7
  1023.     DB    '7'+80H        ; 7 bits
  1024.     DB    TCLEN7,TCLEN8
  1025.     DB    '8'+80H        ; 8 bits
  1026.     DB    TCLEN8,0
  1027. ;
  1028.     DB    0        ; <<== table terminator
  1029. ;
  1030.      IF    DIALSET
  1031. ;
  1032. ;     SET DIAL processor
  1033. ;
  1034. STDIAL:    LXI    D,DIATBL    ; lookup next input item in table
  1035.     CALL    TSRCH        ; search for parameter value
  1036.     JC    SETERR        ; if not found, error
  1037.     STA    TPULSE        ; store the dial command
  1038.     JMP    SETSHO        ; review parameters
  1039. ;
  1040. DISHOW:    CALL    ILPRT        ; show dial mode
  1041.     DB    'Dial:      ',0
  1042.     LDA    TPULSE        ; get dial byte
  1043.     CPI    'T'
  1044.     JZ    TTONE        ; touch tone 
  1045. ;
  1046. PDIAL:    CALL    ILPRT
  1047.     DB    'Pulse',0
  1048.     RET
  1049. ;
  1050. TTONE:    CALL    ILPRT
  1051.     DB    'Touch Tone',0
  1052.     RET
  1053. ;
  1054. ;     DIAL argument table
  1055. ;
  1056. DIATBL:    DB    'TOUC','H'+80H    ; touch tone
  1057.     DB    'T',0
  1058.     DB    'PULS','E'+80H    ; pulse dial
  1059.     DB    'P',0
  1060.     DB    0        ; <<=== table terminator
  1061.      ENDIF
  1062. ;
  1063. ;    Show set value scan routine
  1064. ;
  1065. SHWSCN:    MOV    A,M        ; See if parity value matches
  1066.     ORA    A        ; First see if zero
  1067.     JZ    SETERR        ; Should never get here
  1068.     CMP    B        ; Match?
  1069.     INX    H        ; Point to first letter of message
  1070.     JZ    CDISP        ; Matches, type message
  1071. FNDNXT:    MOV    A,M
  1072.     ORA    A        ; See if end of last message
  1073.     INX    H
  1074.     JP    FNDNXT        ; Not finished
  1075.     INX    H        ; Increment past parity byte
  1076.     JMP    SHWSCN
  1077. ;
  1078. ;      Print message ending with 80H bit set
  1079. ;
  1080. CDISP:    MOV    A,M        ; Get character to print
  1081.     INX    H        ; Point to next character
  1082.     PUSH    PSW        ; Save 80H bit
  1083.     ANI    7FH        ; Strip 80H bit just in case
  1084.     CALL    TYPE
  1085.     POP    PSW
  1086.     ORA    A
  1087. ;------    JP    M,CRLF        ; Finished
  1088.     RM            ; Finished
  1089.     JMP    CDISP
  1090. ;
  1091. ;     Compare next input-stream item in table @DE; CY=1
  1092. ;     if not found, else HL=matched data item
  1093. ;
  1094. TSRCH:    MVI    C,LOOKUP    ; Get function code
  1095.     JMP    MEX        ; Pass to MEX processor
  1096. ;
  1097. ;     Print in-line message ... blows away C register
  1098. ;
  1099. ILPRT:    MVI    C,ILP        ; Get function code
  1100.     JMP    MEX        ; Go do it
  1101. ;
  1102. ;     End of Sanyo MBC-1200/1250 MEX modem overlay
  1103. ;
  1104. ;____________________________________________________________________________
  1105. ;
  1106.     END
  1107.  
  1108.