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-TSA.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  34KB  |  1,270 lines

  1. ;//////////////////////////////////////////////////////////////////////////////
  2. ;
  3.      TITLE  'MEX Overlay for Toshiba T100 and Serial Interface Adapter '
  4. ;
  5. ;    NOTE - this overlay is designed to be specific for a Toshiba T00
  6. ;    together with a Hayes Smartmodem 300/1200 driven in conjunction with
  7. ;    a Toshiba Support Group Serial Async Interface Adapter. 
  8. ;
  9. ;    --- A very good starting point for ANY 2651 usart IO device, however.
  10. ;     
  11. ;//////////////////////////////////////////////////////////////////////////////
  12. ;
  13. REV    EQU    10        ; revision number * 10
  14. ;
  15. ;******************************************************************************
  16. ;
  17. ;    One problem with the Toshiba T100 is the inabillity to do 1200
  18. ;    bps. This is due to the fact that Toshiba, for some reason - which is
  19. ;    completely beyond comprehension of civilized man - had decided to 
  20. ;    implement a software usart on an 8255 PIA. It is impossible to get 
  21. ;    1200 bps out of the infernal thing. Need I say that 300 bps gets
  22. ;    a bit frustrating to sysops, including myself. Well, to solve the
  23. ;    problem, I've designed a serial interface with a National INS2651 
  24. ;    usart to get up to 19.2K baud out of the Tosh. (I don't own a Tosh, 
  25. ;    but I got tired of all of the bitching about not being able to do 
  26. ;    1200 with the thing). Tha adapter plugs into the rampack 2 expansion 
  27. ;    slot. You still can use slot 1 for the prom expansion. 
  28. ;
  29. ;    Tosh does furnish a serial port adapter - matter of fact, they are 
  30. ;    glad to sell you one. So would I at $400.00+ - arrghhhh ... gag me with
  31. ;    a microchip.... whats that old saying coined by Ward.....
  32. ;
  33. ;               Sempus Non Rippus Offis
  34. ;
  35. ;    My adapter goes for about 40 bucks (+/-) in small quanity. If there 
  36. ;    is a demand for it, this will be reduced as it costs a lot less to 
  37. ;    build 100 of 'em than it does 10. If you are 1) a poor soul with a 
  38. ;    Tosh, 2) are tired of paying Ma Bell and 3) would really like to do 
  39. ;    1200/2400 all the way up to 19,200 (dream on, we all wish...) baud on 
  40. ;    dialups, then contact me, the Sysop at Smokin Silicon RCP/M to leave 
  41. ;    a private message in 'TOS' - Ill get back to you. Smokin Silicon is 
  42. ;    the central point for the Toshiba Support group. If Toshiba won't 
  43. ;    support it at a reasonable price, We will. I'll be happy to fill yall 
  44. ;    in on the details. Flawless performance in computer <=> computer batch 
  45. ;    xfers with MEX at 9600 bps. This is the first in a series of RCPM 
  46. ;    overlays to support the serial adapter and the machine. 
  47. ;
  48. ;                        modem to the max / happy hacking
  49. ;            
  50. ;                            JP Sojak - sysop -
  51. ;                               Smokin Silicon RCP/M
  52. ;                               (312)941-0049 24 hrs 
  53. ;
  54. ;  ps - if you have a special problem with your machine, Ill try to help out.
  55. ;       By helping you out, many benifit. (Sempus Non Rippus Offis - FIGHT
  56. ;    BACK - don't put up with the garbage many manufactures try to feed 
  57. ;    you) 
  58. ;    
  59. ;******************************************************************************
  60. ;
  61. ;  02/24/84 ... mxo-tsa.asm   (for TS A-dapter)
  62. ;
  63. ;        Base version for a Toshiba T100 and a serial adapter. Roots
  64. ;        are everywhere by a cast of thousands. Thanks all... 
  65. ;        - Especially Ron Fowler for doing the single most important
  66. ;        public domain work since the original Modem7
  67. ;        
  68. ;                                    JP Sojak 
  69. ;
  70. ;//////////////////////////////////////////////////////////////////////////////
  71. ;
  72. ;    There is a Zilog SIO style full featured SET command implemented on
  73. ;    the INS2651 USART device ... The SET is specific to Smartmodem 
  74. ;    compatables. The available commands are:
  75. ;
  76. ;    delay <n> (seconds) .... SET the delay between dial and "NO CARRIER"
  77. ;    baud <rate> 110-19.2k .. SET the baud rate 110-19.2K, no 450 and 710
  78. ;    orig (originate mode) .. SET the modem originate (callout) carrier 
  79. ;    answer    (answer mode) .. SET the modem answer (callin) carrier 
  80. ;    tone ................... SET touch tone dialing
  81. ;    pulse .................. SET pulse dialing
  82. ;       monitor ................ SET the speaker ON
  83. ;    quiet .................. SET the speaker OFF
  84. ;    parity ................. SET the parity to odd, even, or none
  85. ;    stop ................... SET 1, 1.5, or 2 stopbits
  86. ;    bits ................... SET 5, 6, 7, or 8 bit data word length
  87. ;    digit .................. SET the interdigit dial time in mS 
  88. ;
  89. ;    "SET" <cr> will bring up the current settings.
  90. ;    "SET ?"<cr> will bring up the syntax for the SET commands available. 
  91. ;    And additionally, all 'SET'tings are 100% cloneable to new defaults.
  92. ;
  93. ;//////////////////////////////////////////////////////////////////////////////
  94. ;
  95. ; adapter port definitions
  96. ;
  97. BASEP    EQU    018H        ; port base address
  98. DATAPT    EQU    BASEP        ; serial data port
  99. SPORT    EQU    BASEP+1        ; status register
  100. MODE1    EQU    BASEP+2        ; first mode register
  101. MODE2    EQU    BASEP+2        ; second mode register
  102. CPORT    EQU    BASEP+3        ; command register
  103. ;    
  104. ;
  105. ; 2651 usart bit definitions
  106. ;
  107. MDRCVB    EQU    00000010B    ; modem receive bit (dav)
  108. MDRCVR    EQU    00000010B    ; modem receive ready
  109. MDSNDB    EQU    00000001B    ; modem send bit
  110. MDSNDR    EQU    00000001B    ; modem send ready bit
  111. MDMDTR    EQU    00000010B    ; modem data trm ready bit
  112. ;
  113. ; PLEASE NOTE ... The use of DCD (Data Carrier Detect) status register bit
  114. ; within the USART should be avoided. It is actually a Tx enable for the
  115. ; hardware. It MUST be pulled high on the EIA cable or the USART will seem
  116. ; to "hang". When it is active, the initialization routine thinks there 
  117. ; is returning from CP/M with a carrier present even when there isnt - 
  118. ; improper switch settings could unconditionally force an active (HIGH) state 
  119. ; - and abort the routine. The adapter has been defaulted with a pullup to 
  120. ; avoid "hanging" the hardware if the DCD #8 is left unconnected. It is 
  121. ; desirable to redefine the carrier sence bit to DSR #6 (Data Set Ready). It 
  122. ; is customary to leave DCD #8 open on the interface side and connect DCD #8 
  123. ; from the modem to DSR #6 (Data Set Ready) on the interface side. In this 
  124. ; way, the USART will never "hang". If you wish to use DCD then by all means 
  125. ; do so. As a matter of fact, ANY rcpm work REQUIRES it, but if you do not
  126. ; follow what all of this is about, then it is best to leave the equate as 
  127. ; is and prepare a cable as follows.... 
  128. ;
  129. ;    MODEM             INTERFACE
  130. ;    (DCE)               (DTE)
  131. ;
  132. ;    #1 <------------------------> #1  water pipe ground (optional)
  133. ;    #2 <------------------------> #2  \
  134. ;                       (Tx and Rx data)
  135. ;    #3 <------------------------> #3  / 
  136. ;
  137. ;    #7 <------------------------> #7  Signal Ground
  138. ; (DCD)    #8 <------------------------> #6  Data Set Ready
  139. ;      #20 <------------------------> #20 Data Terminal Ready
  140. ;
  141. ;
  142. ;MDMDCD    EQU    01000000B    ; DCD used to sence carrier present 
  143. ;
  144. MDMDCD    EQU    10000000B    ; DSR used to sence a carrier present     
  145. ;
  146. ;
  147. ;******************************************************************************
  148. ;
  149. ; Status register definitions within the 8251 USART device:
  150. ;
  151. ;    MODE 0 REGISTER (base + 2)
  152. ;  +--------+--------+--------+--------+--------+--------+--------+--------+
  153. ;  | 00 - invalid    | X0 - no parity  | 00 - 5 bits     |     must be     |
  154. ;  | 01 - 1 stop     | 01 - odd        | 01 - 6 bits     |   1    |   0    |
  155. ;  | 10 - 1.5 stop   | 10 - no parity  | 10 - 7 bits     | for the adapter |
  156. ;  | 11 - 2 stops    | 11 - even       | 11 - 8 bits     |        |        |
  157. ;  +--------+--------+--------+--------+--------+--------+--------+--------+
  158. ;
  159. ;    MODE 1 REGISTER (base + 2)
  160. ;  +--------+--------+--------+--------+--------+--------+--------+--------+
  161. ;  |        |        |     must be     | internal baud rate select register|
  162. ;  |   X    |   X    |   1    |   1    |        +        +        +        |
  163. ;  |        |        |  for the adapter|   B3   |   B2   |   B1   |   B0   |
  164. ;  +--------+--------+--------+--------+--------+--------+--------+--------+
  165. ;
  166. ; Where the internal generator is selected and is represented by:
  167. ;
  168. ;    NOTE - some of these are NOT supported by MEX - the USART does em,
  169. ;        but MEX has no idea they exist.
  170. ;    
  171. ;   Bx=    3 2 1 0            |  3 2 1 0
  172. ;   ----------------------------+-------------------------------
  173. ;    0 0 0 0 .... 50 baud    |  0 0 0 1 .... 75 baud
  174. ;    0 0 1 0 .... 110 baud    |  0 0 1 1 .... 134.5 baud
  175. ;    0 1 0 0 .... 150 baud    |  0 0 0 1 .... 300 baud
  176. ;    0 1 1 0 .... 600 baud    |  0 1 1 1 .... 1200 baud
  177. ;    1 0 0 0 .... 1800 baud    |  1 0 0 1 .... 2000 baud
  178. ;    1 0 1 0 .... 2400 baud    |  1 0 1 1 .... 3600 baud
  179. ;    1 1 0 0 .... 4800 baud  |  1 1 0 1 .... 7200 baud
  180. ;    1 1 1 0 .... 9600 baud    |  1 1 1 1 .... 19.2K baud
  181. ;     
  182. ;    COMMAND    REGISTER (base + 3)
  183. ;  +--------+--------+--------+--------+--------+--------+--------+--------+
  184. ;  | 00 - normal     | RTS    | ERROR  | FORCE  | RECV   | DTR    | TRNSMT |
  185. ;  | 01 - auto echo  | CTRL   | RESET  | BREAK  | CTRL   | CTRL   | CTRL   |
  186. ;  | 10 - lcl lopbak | 0 - hi | 0 -norm| 0 -norm| 0 -dsbl| 0 -hi  | 0 -dsbl|
  187. ;  | 11 - rmt lopbak | 1 - lo | 1 -rst | 1 -brk | 1 -enbl| 1 -lo  | 1 -enbl|
  188. ;  +--------+--------+--------+--------+--------+--------+--------+--------+
  189. ;
  190. ;    STATUS REGISTER (base + 1)
  191. ;  +--------+--------+--------+--------+--------+--------+--------+--------+
  192. ;  |        |        | FRAME  | OVERRUN| PARITY |Tx SHIFT| Rx CHAR| Tx BUFR|
  193. ;  | DSR lo | DCD lo | ERROR  | ERROR  | ERRORY |REGISTER| READY  |  EMPTY |
  194. ;  |        |        |        |        |        | EMPTY  |        |        |
  195. ;  +--------+--------+--------+--------+--------+--------+--------+--------+
  196. ;
  197. ;    MODE 1 register must be written into before MODE 2 - it is a toggle 
  198. ;    type operation. a COMMAND register <read> operation will reset the
  199. ;    toggle so the next MODE operation will be performed on the first 
  200. ;    register - REGISTER 1.
  201. ;
  202. ;******************************************************************************
  203. ;
  204. ; standard mex service processor hooks
  205. ;
  206. MEX    EQU    0D00H        ;address of the service processor
  207. INMDM    EQU    255        ;get char from port to a, cy=no more in 100 ms
  208. TIMER    EQU    254        ;delay 100ms * reg b
  209. TMDINP    EQU    253        ;b=# secs to wait for char, cy=no char
  210. CHEKCC    EQU    252        ;check for ^c from kbd, z=present
  211. SNDRDY    EQU    251        ;test for modem-send ready
  212. RCVRDY    EQU    250        ;test for modem-receive ready
  213. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  214. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  215. LOOKUP    EQU    247        ;table search: see cmdtbl comments for info
  216. PARSFN    EQU    246        ;parse filename from input stream
  217. BDPARS    EQU    245        ;parse baud-rate from input stream
  218. SBLANK    EQU    244        ;scan input stream to next non-blank
  219. EVALA    EQU    243        ;evaluate numeric from input stream
  220. LKAHED    EQU    242        ;get nxt char w/o removing from input
  221. GNC    EQU    241        ;get char from input, cy=1 if none
  222. ILP    EQU    240        ;inline print
  223. DECOUT    EQU    239        ;decimal output
  224. PRBAUD    EQU    238        ;print baud rate
  225. ;
  226. CONOUT    EQU    2        ;simulated bdos function 2: console char out
  227. PRINT    EQU    9        ;simulated bdos function 9: print string
  228. INBUF    EQU    10        ;input buffer, same structure as bdos 10
  229. ;
  230. ; msc crud
  231. ;
  232. TPA    EQU    100H
  233. CR    EQU    13
  234. LF    EQU    10
  235. TAB    EQU    9
  236. DING    EQU    'G'-40H
  237. ;
  238. YES    EQU    0FFFFH        ;it is so
  239. NO    EQU    NOT YES     ;it is not so
  240. ;
  241. ;//////////////////////////////////////////////////////////////////////////////
  242. ;
  243.     ORG    TPA
  244. ;
  245. ;//////////////////////////////////////////////////////////////////////////////
  246. ;
  247.     DS    3        ;mex has a jmp start here
  248.     DS    2        ;not used by mex
  249. TPULSE:    DB    'T'        ;t=touch, p=pulse (used by this overlay)
  250. CLOCK:    DB    40        ;clock speed x 10 (up to 25.5 mhz.)
  251. MSPEED:    DB    5        ;sets display time for sending a file
  252.                 ;0=110    1=300  2=450  3=600  4=710
  253.                 ;5=1200 6=2400 7=4800 8=9600 9=19200
  254. BYTDLY:    DB    5        ;default time to send character in
  255.                 ;terminal mode file transfer (0-9)
  256.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  257. CRDLY:    DB    5        ;end-of-line delay after crlf in terminal
  258.                 ;mode file transfer for slow bbs systems
  259.                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  260. COLUMS:    DB    5        ;number of directory columns
  261. SETFL:    DB    YES        ;yes=user-defined set command
  262. SCRTST:    DB    YES        ;yes=if home cursor and clear screen
  263.                 ;routine at clrscrn
  264.     DB    0        ;was once acknak, now spare
  265. BAKFLG:    DB    YES        ;yes=make .bak file
  266. CRCDFL:    DB    YES        ;yes=default to crc checking
  267.                 ;no=default to checksum checking
  268. TOGCRC:    DB    YES        ;yes=allow toggling of checksum to crc
  269. CVTBS:    DB    NO        ;yes=convert backspace to rub
  270. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub
  271. ADDLF:    DB    NO        ;no=no lf after cr to send file in
  272.                 ;terminal mode (added by remote echo)
  273. TOGLF:    DB    YES        ;yes=allow toggling of lf after cr
  274. TRNLOG:    DB    NO        ;yes=allow transmission of logon
  275.                 ;write logon sequence at location logon
  276. SAVCCP:    DB    YES        ;yes=do not overwrite ccp
  277. LOCNXT:    DB    NO        ;yes=local cmd if extchr precedes
  278.                 ;no=not local cmd if extchr precedes
  279. TOGLOC:    DB    YES        ;yes=allow toggling of locnxtchr
  280. LSTTST:    DB    YES        ;yes=allow toggling of printer on/off
  281.                 ;in terminal mode. set to no if using
  282.                 ;the printer port for the modem
  283. XOFTST:    DB    NO        ;yes=allow testing of xoff from remote
  284.                 ;while sending a file in terminal mode
  285. XONWT:    DB    NO        ;yes=wait for xon after sending cr while
  286.                 ;transmitting a file in terminal mode    
  287. TOGXOF:    DB    YES        ;yes=allow toggling of xoff testing
  288. IGNCTL:    DB    NO         ;yes=do not send control characters
  289.                 ;above ctl-m to crt in terminal mode
  290.                 ;no=send any incoming ctl-char to crt
  291. EXTRA1:    DB    0        ;for future expansion
  292. EXTRA2:    DB    0        ;for future expansion
  293. BRKCHR:    DB    '@'-40H        ;^@ = send a 300 ms. break tone
  294. NOCONN:    DB    'N'-40H        ;^n = disconnect from phone line
  295. LOGCHR:    DB    'L'-40H        ;^l = send logon
  296. LSTCHR:    DB    'P'-40H        ;^p = toggle printer
  297. UNSVCH:    DB    'R'-40H        ;^r = close input text buffer
  298. TRNCHR:    DB    'T'-40H        ;^t = transmit file to remote
  299. SAVCHR:    DB    'Y'-40H        ;^y = open input text buffer
  300. EXTCHR:    DB    '^'-40H        ;^^ = send next character
  301. ;
  302.     DS    2        ;not used
  303. ;
  304. ; low-level modem i/o routines.
  305. ;
  306. INCTL1:    JMP    INC        ;in modem control port
  307.     DB    0,0,0,0,0,0,0    ;spares if needed for non-pmmi
  308. ;
  309. OTDATA:    JMP    OUTD        ;out modem data port
  310.     DB    0,0,0,0,0,0,0    ;spares if needed for non=pmmi
  311. ;
  312. INPORT: JMP    IND        ;in modem data port
  313.     DB    0,0,0,0,0,0,0    ;spares if needed for non-pmmi
  314. ;
  315. ; bit-test routines. 
  316. ;
  317. MASKR:    ANI MDRCVB ! RET    ;bit to test for receive ready
  318. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready
  319. MASKS:    ANI MDSNDB ! RET    ;bit to test for send ready
  320. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready
  321. ;
  322.     DS    12
  323. ;
  324. LOGON:    DS    2        ;needed for mdm compat, not ref'D BY MEX
  325. DIALV:    JMP    DIAL
  326. DISCV:    JMP    DISCON
  327. GOODBV:    JMP    GOODBYE        ;called before exit to cp/m
  328. INMODV:    JMP    NITMOD        ;initialization. called at cold-start
  329. NEWBDV:    JMP    PBAUD        ;set baud rate
  330. NOPARV:    RET!NOP!NOP        ;set modem for no-parity
  331. PARITV:    RET!NOP!NOP        ;set modem parity
  332. SETUPV:    JMP    SETCMD        ;set cmd: jump to a ret if you don'T WRITE SET
  333. SPMENV:    RET!NOP!NOP        ;not used with mex
  334. VERSNV:    JMP    SYSVER        ;overlay'S VOICE IN THE SIGN-ON MESSAGE
  335. BREAKV:    JMP    SBREAK        ;send a break
  336. ;
  337. ; mdm calls supported in mex 1.0 but not recommended for use.
  338. ;
  339. ILPRTV:    DS    3        ;replace with mex function 9
  340. INBUFV:    DS    3        ;replace with mex function 10
  341. ILCMPV:    DS    3        ;replace with table lookup funct. 247
  342. INMDMV:    DS    3        ;replace with mex function 255
  343. NXSCRV:    DS    3        ;not supported by mex (returns w/no action)
  344. TIMERV:    DS    3        ;replace with mex function 254
  345. ;
  346. ; terminal specific control sequences
  347. ;
  348. ; if you wish to use the terminal screen operations, uncomment the code below 
  349. ; and insert your terminal specific routines at the clsmsg and eosmsg string 
  350. ; areas.
  351. ;    
  352. CLREOS:        
  353. ;    lxi    d,eosmsg
  354. ;    mvi    c,print
  355. ;    call    mex
  356.     RET
  357. ;
  358. CLS:    
  359. ;    lxi    d,clsmsg
  360. ;    mvi    c,print
  361. ;    call    mex
  362.     RET
  363. ;
  364. ; put your terminal specific strings here ... (I don't know what they are) 
  365. ;    ... dont forget the '$'
  366. ;
  367. EOSMSG:      DB    17H,'$'        ;clear to end-of-screen
  368. CLSMSG:      DB    1AH,'$'        ;clear whole screen
  369. ;
  370. ;------------------------------------------------------------
  371. ;
  372. ; input control/status port
  373. ;
  374. INC:    IN    SPORT        ; get the status bits
  375.     RET
  376. ;
  377. ; input data port
  378. ;
  379. IND:    IN    DATAPT        
  380.     RET
  381. ;
  382. ; output data port
  383. ;
  384. OUTD:    OUT    DATAPT
  385.     RET
  386. ;
  387. ; print out the overlay version
  388. ;
  389. SYSVER:      CALL    MILP
  390.       DB    'Toshiba Support Group Serial Interface',CR,LF
  391. ;      DB    'Trashiba T100 - V'     ;he.. he.. he...
  392.       DB    'Toshiba T100 - V'    
  393.       DB    REV/10+'0'
  394.       DB    '.'
  395.       DB    REV MOD 10+'0'
  396.       DB    CR,LF
  397.       DB    0
  398.       RET
  399. ;
  400. ; send break routine
  401. ;
  402. SBREAK: 
  403. ;
  404. ; disconnect routine
  405. ;
  406. DISCON:   
  407. ;
  408. ; goodbye routines are called by mex prior to exit to cp/m
  409. ;
  410. GOODBYE:MVI    A,00011101B    ; drop cts, dtr and force break a
  411.     OUT    CPORT
  412.     MVI    B,3        ; 300 ms
  413.     CALL    MTIME
  414.     MVI    A,00100111B    ; initial default
  415.     OUT    CPORT
  416.     RET
  417. ;
  418. ; initialize rs-232 to default modes.
  419. ;
  420. NITMOD: CALL    INC        ;see if carrier ie returning to mex with
  421.     ANI    MDMDCD        ;a call active 
  422.     RNZ            ;skip if connected
  423.  
  424.     LDA    SPEED        ; load default ascii baud rate 
  425.     STA    MSPEED        ;and keep it current
  426.     CALL    PBAUD        ;set the baud rate
  427. ;
  428. ; default the modem to either speaker ON or OFF - as CLONED
  429. ;
  430.     LDA    MONFLG        ;get monitor default
  431.     ORA    A
  432.     MVI    A,'0'        ;speaker off
  433.     JZ    NIT4
  434.     MVI    A,'1'        ;speaker on
  435.  
  436. NIT4:      STA    SMINIT+3    ;put it in sminit string
  437. ;
  438. ; default the modem mode to either answer or originate - as CLONED
  439.     LDA    ANSFLG        ;get mode default
  440.     ORA    A
  441.     MVI    A,'0'        ;originate
  442.     JZ    NIT5
  443.     MVI    A,'1'        ;answer
  444.  
  445. NIT5:      STA    S0NIT+3        ;put it in sminit string
  446. ;
  447. ; set up the modem with the initial string 
  448. ;    
  449.     LXI    H,SMINIT
  450. SINIT:    CALL    SMSEND        ;send the init string
  451. SMTLP1:    MVI    C,INMDM        ;wait for modem response
  452.     CALL    MEX
  453.     JNC    SMTLP1        ;eat everything until silence for
  454.     RET            ; 100 msec
  455. ;
  456. ; set command processor
  457. ;
  458. SETCMD:      MVI    C,SBLANK    ;any arguments?
  459.       CALL  MEX
  460.       JC    SETSHO        ;if not, display default(s)
  461.       LXI    D,CMDTBL
  462.           MVI    C,LOOKUP
  463.       CALL  MEX        ;parse the argument
  464.       PUSH    H        ;save any parsed arguments on stack
  465.       RNC            ;if we have one, return to it
  466.       POP    H        ;oops, input not found in table
  467. SETERR:      LXI    D,SETEMS
  468.       MVI    C,PRINT
  469.       CALL    MEX
  470.       CALL  CRLF
  471.       RET
  472. SETEMS:      DB    CR,LF,'Unrecognized SET command',DING,CR,LF,'$'
  473. ;
  474. SETBAD:      LXI    D,SETBMS
  475.       MVI    C,PRINT
  476.       CALL    MEX
  477.       RET
  478. SETBMS:      DB    CR,LF,'Invalid SET parameter',DING,CR,LF,'$'
  479. ;
  480. ; argument table
  481. ;
  482. CMDTBL:   DB    '?'+80H            ; help
  483.       DW    SETHELP
  484.       DB    'ORI','G'+80H        ; originate mode
  485.       DW    ORIG
  486.       DB    'ANSWE','R'+80H        ; answer mode
  487.       DW    ANS
  488.       DB    'TON','E'+80H        ; tone dialing
  489.       DW    STTONE
  490.       DB    'PULS','E'+80H        ; pulse dialing
  491.       DW    STPULSE
  492.       DB    'MONITO','R'+80H    ; monitor on
  493.       DW    MONIT
  494.       DB    'QUIE','T'+80H        ; monitor off
  495.       DW    QUIET
  496.       DB    'BAU','D'+80H        ; set baud
  497.       DW    STBAUD
  498.       DB    'DELA','Y'+80H        ; set delay
  499.       DW    DELAY
  500.       DB    'PARIT','Y'+80H        ; set parity
  501.       DW    STPRTY
  502.       DB    'STO','P'+80H        ; set stopbits
  503.       DW    STSTOP
  504.       DB    'BIT','S'+80H        ; set length
  505.       DW    STBITS
  506.       DB    'DIGI','T'+80H        ; set inter-digit delay
  507.       DW    SDIGIT
  508.       DB    0            ;table terminator
  509. ;
  510. ;  "set (no args): print current statistics
  511. ;
  512. SETSHO:      CALL  MILP
  513.       DB    CR,LF
  514.       DB    'Current settings:',CR,LF,0
  515.       CALL    CRLF
  516.       CALL    TPSHOW
  517.       CALL    CRLF
  518.       CALL    BDSHOW
  519.       CALL  CRLF
  520.       CALL    MONSHO
  521.       CALL    CRLF
  522.       CALL  SHOWP
  523.       CALL    CRLF
  524.       CALL    SHOWS
  525.       CALL    CRLF
  526.       CALL  SHOWBT
  527.       CALL  CRLF
  528.       CALL    DLSHOW
  529.       CALL    CRLF
  530.       CALL    DDSHOW
  531.       CALL  CRLF
  532.       CALL  CRLF
  533.       RET
  534. ;
  535. ; "set ?" processor
  536. ;
  537. SETHELP:  CALL    MILP
  538.       DB    CR,LF,'SET ORIG      - Modem Originate mode'
  539.       DB    CR,LF,'SET ANSWER    - Modem Answer mode'
  540.       DB    CR,LF,'SET TONE      - Touch Tone dial'
  541.       DB    CR,LF,'SET PULSE     - Dial Pulse dial'
  542.       DB    CR,LF,'SET PARITY    - None, Even or Odd'
  543.       DB    CR,LF,'SET STOP      - 1, 1.5 or 2'
  544.       DB    CR,LF,'SET BITS      - 5, 6, 7 or 8'
  545.       DB    CR,LF,'SET QUIET     - Speaker Off'
  546.       DB    CR,LF,'SET MONITOR   - Speaker On'
  547.       DB    CR,LF,'SET BAUD <X>  - <X> = 110, 300, 600, 1200, 2400, '
  548.       DB    '4800, 9600, 19200'
  549.       DB    CR,LF,'SET DELAY <X> - <X> seconds'
  550.       DB    CR,LF,'SET DIGIT <X> - <X> 0-99 mS'    
  551.       DB    CR,LF,CR,LF,0
  552.       RET
  553. ;
  554. ; "set baud" processor
  555. ;
  556. STBAUD:          MVI    C,BDPARS    ;function code: parse a baudrate
  557.           CALL    MEX        ;let mex look up code
  558.           JC    SETERR        ;jump if invalid code
  559.           CALL    PBAUD        ;no, try to set it
  560.           JC    SETERR        ;if not one of ours, bomb out
  561. ;
  562. ; let MEX print the baud rate
  563. ;
  564. BDSHOW:          LDA    MSPEED        ;get current baud rate
  565.           MVI    C,PRBAUD    ;let mex print it
  566.           CALL    MEX
  567.           RET 
  568. ;
  569. ; this routine sets baud rate passed as mspeed code in a.
  570. ; returns cy=1 if baud rate not supported.
  571. ;
  572. PBAUD:          PUSH    H        ;don't alter anyboby
  573.           PUSH    D
  574.           PUSH     B
  575. ;
  576.         LXI    H,BAUDS        ; get the table base
  577.         MOV    E,A
  578.         MVI    D,00
  579.         DAD    D        ; offset it
  580.         MOV    A,M
  581.         CPI    11111111B    ; is it bad ?
  582.         STC
  583.         JZ    BADEX        ; yup - quit now
  584. ;
  585. ; selected rate is good ... save parameters
  586. ;
  587.         STA    DFTBAUD        ; setup for reinitialization
  588.         MOV    A,E
  589.         STA    SPEED        ; save it in case of CLONE command
  590.         STA    MSPEED
  591.         CALL    SINITL        ; reinitialize the usart
  592.         STC        
  593.         CMC            ; no error here
  594. BADEX:        POP    B
  595.           POP    D
  596.           POP    H
  597.         RET
  598. ;
  599. ; lookup table for all of the valid bit rates 
  600. ;
  601. BAUDS:        DB    00000010B    ; 110 baud
  602.         DB    00000101B    ; 300 baud
  603.         DB    11111111B    ; 450 baud    
  604.         DB    00000110B    ; 600 baud
  605.         DB    11111111B    ; 710 baud
  606.         DB    00000111B    ; 1200 baud
  607.         DB    00001010B    ; 2400 baud
  608.         DB    00001100B    ; 4800 baud
  609.         DB    00001110B    ; 9600 baud
  610.         DB    00001111B    ; 19.2k baud
  611. ;
  612. ; "set mode" processor
  613. ;
  614. ORIG:    XRA    A
  615.     STA    ANSFLG        ;set orig flag
  616.     LXI    H,SMO        ;send out ats0=0
  617.     CALL    SINIT
  618.     CALL    MILP
  619.     DB    'Originate mode',0
  620.     RET
  621. ;
  622. ANS:    MVI    A,0FFH
  623.     STA    ANSFLG        ;set ans flag
  624.     LXI    H,SMA        ;send out ats0=1
  625.     CALL    SINIT
  626.     CALL    MILP
  627.     DB    'Answer mode',0
  628.     RET
  629. ;
  630. SMO:    DB    'ATS0=0',CR,0
  631. SMA:    DB    'ATS0=1',CR,0
  632. ;
  633. ;
  634. ; "monitor" processor
  635. ;
  636. QUIET:    XRA    A
  637.     STA    MONFLG
  638.     LXI    H,SMQT
  639.     CALL    SINIT
  640.     JMP    MONSHO
  641.  
  642. MONIT:    MVI    A,0FFH
  643.     STA    MONFLG
  644.     LXI    H,SMMON
  645.     CALL    SINIT
  646.  
  647. MONSHO:    LDA    MONFLG
  648.     ORA    A
  649.     JZ    MONOFF
  650.     CALL    MILP
  651.     DB    'Speaker On',0
  652.     RET
  653.  
  654. MONOFF:    CALL    MILP
  655.     DB    'Speaker Off',0
  656.     RET
  657.  
  658. SMQT:    DB    'ATM0',CR,0
  659. SMMON:    DB    'ATM1',CR,0
  660. ;
  661. ; "dial" processor
  662. ;
  663. STTONE:    MVI    B,'T'
  664.     JMP    SDIAL1
  665. STPULSE:MVI    B,'P'
  666.  
  667. SDIAL1: LDA    TPULSE
  668.     CPI    B
  669.     JZ    TPSHOW
  670.     MOV    A,B
  671.     STA    TPULSE
  672.     CPI    'P'
  673.     MVI    A,01010000B    ;pulse dial
  674.     JZ    SDIAL2
  675.     MVI    A,01000000B    ;tone dial
  676. SDIAL2: STA    DIALWD
  677.  
  678. TPSHOW:    LDA    DIALWD
  679.     ANI    00010000B
  680.     JZ    TPTONE
  681.  
  682.     CALL    MILP
  683.     DB    'Pulse Dial',0
  684.     RET
  685.  
  686. TPTONE:    CALL    MILP
  687.     DB    'Tone Dial',0      
  688.     RET
  689. ;
  690. ; "delay" processor
  691. ;
  692. DELAY:    MVI    C,EVALA
  693.     CALL    MEX
  694.     MOV    A,H
  695.     ORA    A
  696.     JNZ    SETERR
  697.     MOV    A,L
  698.     CPI    100        ;too big ?
  699.     JNC    SETERR
  700.  
  701.     PUSH    D        ; convert binary to ascii
  702.     CALL    CVDCML
  703.     MOV    A,D
  704.     STA    S7NIT+3        ; 10's digit
  705.     STA    LDSTR+5
  706.     MOV    A,E
  707.     STA    S7NIT+4        ; 1's digit
  708.     STA    LDSTR+6
  709.     POP    D
  710.  
  711.     LXI    H,LDSTR        ; send the local string to the modem
  712.     CALL    SMSEND
  713.  
  714. DLSHOW:    CALL    MILP        ;finally tell the user about it
  715.     DB    'Answer delay is ',0
  716. ;
  717.     LDA    S7NIT+3        ;print 10'S DIGIT
  718.     MOV    E,A    
  719.     MVI    C,CONOUT
  720.     CALL    MEX
  721. ;
  722.     LDA    S7NIT+4        ;print 1'S DIGIT
  723.     MOV    E,A    
  724.     MVI    C,CONOUT    
  725.     CALL    MEX
  726. ;
  727.     CALL    MILP        ;print units
  728.     DB    ' Seconds.',0
  729.     RET
  730.  
  731. LDSTR:    DB    'ATS7=30',CR,0
  732.  
  733. ;
  734. ; "digit" processor - interdigit time 
  735.  
  736. SDIGIT:    MVI    C,EVALA
  737.     CALL    MEX
  738.     MOV    A,H
  739.     ORA    A
  740.     JNZ    SETERR
  741.     MOV    A,L
  742.     CPI    100        ;too big ?
  743.     JNC    SETERR
  744. ;
  745.     PUSH    D        ; convert binary to ascii
  746.     CALL    CVDCML
  747.     MOV    A,D
  748.     STA    S11NIT+4    ; 10's digit
  749.     STA    LSTR+6
  750.     MOV    A,E
  751.     STA    S11NIT+5    ; 1's digit
  752.     STA    LSTR+7
  753.     POP    D
  754. ;
  755.     LXI    H,LSTR        ; send the local string to the modem
  756.     CALL    SMSEND
  757.  
  758. DDSHOW:    CALL    MILP        ;finally tell the user about it
  759.     DB    'Dial digit time is ',0
  760. ;
  761.     LDA    S11NIT+4        ;print 10'S DIGIT
  762.     MOV    E,A    
  763.     MVI    C,CONOUT
  764.     CALL    MEX
  765. ;
  766.     LDA    S11NIT+5        ;print 1'S DIGIT
  767.     MOV    E,A    
  768.     MVI    C,CONOUT    
  769.     CALL    MEX
  770. ;
  771.     CALL    MILP        ;print units
  772.     DB    ' Ms.',0
  773.     RET
  774.  
  775. LSTR:    DB    'ATS11=40',CR,0
  776. ;
  777. ; convert to ascii the hard way
  778. ;
  779. CVDCML:    MVI    B,0        ; make ascii out of 7 bit binary 
  780. TENS:    SUI    10
  781.     JC    ONES        ; gone negative yet ?
  782.     INR    B
  783.     JMP    TENS        ; nope... keep bumping the 10'S DIGIT
  784. ;
  785. ONES:    ADI    10        ; fix it
  786.     PUSH    PSW        ; save the number for a sec
  787.     MOV    A,B
  788.     ADI    '0'        ; add in the ascii bias
  789.     MOV    D,A
  790.     POP    PSW
  791.      ADI    '0'        ; add in the ascii bias - must be 0-9
  792.     MOV    E,A
  793.     RET
  794.  
  795. ;
  796. ;    set parity command: reset transmit/receive parity
  797. ;
  798. ;        parity is controlled by bits 4 and 5 of mode register 1
  799. ;        for the 2651 
  800. ;
  801. ;           parity    bit 5       bit 4
  802. ;                 off          -          0
  803. ;              odd      0         1
  804. ;             even      1         1
  805. ;
  806. STPRTY:    MVI    C,SBLANK    ;check for parity code
  807.     CALL    MEX        ;
  808.     JC    SETERR        ;if none, print error
  809.     LXI    D,PARTBL    ;check for proper syntax
  810.     MVI    C,LOOKUP
  811.     CALL    MEX
  812.     PUSH    H        ;match found, go do it!
  813.     RNC            ;
  814.     POP    H        ;no match: fix stack and
  815.     JMP    SETERR        ;  print error
  816. ;
  817. PROFF:    MVI    A,00000000B
  818.     STA    DFTPAR
  819.     JMP    SHOWP1
  820.  
  821. PREVEN:    MVI    A,00110000B
  822.     STA    DFTPAR
  823.     JMP    SHOWP1
  824.  
  825. PRODD:    MVI    A,00010000B
  826.     STA    DFTPAR
  827.  
  828. SHOWP1:    CALL    SINITL
  829.  
  830. SHOWP:    LDA    DFTPAR
  831.     RRC
  832.     RRC    
  833.     RRC
  834.     RRC
  835.     ANI    00000011B
  836.     ADD    A
  837.     MOV    E,A
  838.     MVI    D,00
  839.     PUSH    D
  840.     CALL    MILP        ;display parity
  841.     DB    'Parity is ',0
  842.     POP    D
  843.     LXI    H,PVECT
  844.     DAD    D
  845.     MOV    A,M
  846.     INX    H
  847.     MOV    H,M
  848.     MOV    L,A
  849.     PCHL
  850.  
  851. PVECT:    DW    OFFMSG
  852.     DW    ODDMSG
  853.     DW    OFFMSG        
  854.     DW    EVNMSG
  855.     
  856. OFFMSG:    CALL    MILP        ;
  857.     DB    '(None)',0    ;
  858.     RET
  859.  
  860. ODDMSG:    CALL    MILP        ;
  861.     DB    'Odd',0        ;
  862.     RET            ;
  863.  
  864. EVNMSG:    CALL    MILP        ;
  865.     DB    'Even',0    ;
  866.     RET
  867. ;
  868. ;    set parity command table
  869. ;
  870. PARTBL:      DB    'NON','E'+80H    ;"set parity off"
  871.       DW    PROFF
  872.       DB    'EVE','N'+80H    ;"set parity even"
  873.       DW    PREVEN
  874.       DB    'OD','D'+80H    ;"set parity odd"
  875.       DW    PRODD
  876.       DB    0        ;<<== end of parity table
  877. ;
  878. ;    set stopbits command: reset number of stop bits
  879. ;
  880. ;        the stop bits are controlled by bits 7 and 8 of mode register 
  881. ;        1 for the 2651 
  882. ;
  883. ;            stop bits       bit 7    bit 8
  884. ;            1         0            1
  885. ;               1.5         1          0
  886. ;            2         1          1
  887. ;
  888. ;
  889. STSTOP:      MVI    C,SBLANK    ;check for stop bits
  890.       CALL    MEX
  891.       JC    SETERR        ;if none, print error
  892.       LXI    D,STPTBL    ;check syntax
  893.       MVI   C,LOOKUP
  894.       CALL    MEX
  895.       PUSH    H        ;match found, go do it!
  896.       RNC    
  897.       POP    H        ;no match: fix stack and
  898.       JMP    SETERR        ;print error
  899. ;
  900. STOP01:    MVI    A,01000000B    ; 1 stop bit
  901.     STA    DFTSTP
  902.     JMP    SHOWS
  903. ;
  904. STOP02:    MVI    A,11000000B    ; 2 stop bits
  905.     STA    DFTSTP
  906.     JMP    SHOWS
  907. ;
  908. STOP15:    MVI    A,10000000B    ; 1 1/2 stop bits
  909.     STA    DFTSTP
  910. ;
  911. SHOWS:    LDA    DFTSTP        ; print the current setting
  912.     RRC
  913.     RRC
  914.     RRC
  915.     RRC
  916.     RRC
  917.     RRC
  918.     ANI    00000011B    ; mask any possible crap    
  919.     ADD    A        ; <a> * 2
  920.     MOV    E,A
  921.     MVI    D,00
  922.     PUSH    D
  923.     CALL    SINITL        ; reinit the usart
  924.     CALL    MILP
  925.     DB    'There ',0
  926.     POP    D
  927.     LXI    H,SVECT
  928.     DAD    D
  929.     MOV    A,M        ; dispatch
  930.     INX    H
  931.     MOV    H,M
  932.     MOV    L,A
  933.     PCHL
  934.  
  935. SVECT:    DW    MSG0
  936.     DW    MSG1
  937.     DW    MSG15
  938.     DW    MSG2
  939.  
  940. MSG0:    CALL    MILP
  941.     DB    'is an INVALID MODE COMMAND - UNKNOWN ERROR in MEX'
  942.     DB    DING,CR,LF,0
  943.     RET
  944.  
  945. MSG1:    CALL    MILP        ; display '1'    
  946.     DB    'is 1 stop bit',0        ;
  947.     RET
  948.  
  949. MSG2:     CALL    MILP        ; display '2' 
  950.      DB    'are 2 stop bits',0        ;
  951.      RET
  952.  
  953. MSG15:    CALL    MILP        ; display '1.5'
  954.     DB    'are 1.5 stop bits',0
  955.     RET
  956.  
  957. ;    set stopbits command table
  958. ;
  959. STPTBL:      DB    '1'+80H        ;"set stop 1"
  960.       DW    STOP01
  961.       DB    '2'+80H        ;"set stop 2"
  962.       DW    STOP02
  963.       DB    '1.','5'+80H    ;"set stop 1.5"
  964.       DW    STOP15
  965.       DB    0        ;<<== end of stop-bits table
  966. ;
  967. ;    set length command: set bits per character
  968. ;
  969. ;        the number of bits per character is controlled by 
  970. ;        bits 3 and 2 of mode register 1 for the 2651
  971. ;        3 only, but are the same for register 5:
  972. ;
  973. ;            bpc        bit 3        bit 2
  974. ;             5          0          0
  975. ;             6          0             1
  976. ;             7          1          0
  977. ;             8          1          1
  978. ;
  979. STBITS:      MVI    C,SBLANK    ;check for bits/char
  980.       CALL    MEX
  981.       JC    SETERR        ;if none, print error
  982.       LXI    D,BITTBL    ;check syntax
  983.       MVI    C,LOOKUP
  984.       CALL    MEX
  985.       PUSH    H        ;match found, go do it!
  986.       RNC    
  987.       POP    H        ;no match: fix stack and
  988.       JMP    SETERR        ;print error
  989. ;
  990. BIT5:    MVI    A,00000000B
  991.     STA    DFTBITS
  992.     JMP    SHOWBT
  993.  
  994. BIT6:    MVI    A,00000100B
  995.     STA    DFTBITS
  996.     JMP    SHOWBT
  997.  
  998. BIT7:    MVI    A,00001000B
  999.     STA    DFTBITS
  1000.     JMP    SHOWBT
  1001.  
  1002. BIT8:    MVI    A,00001100B
  1003.     STA    DFTBITS
  1004.  
  1005. SHOWBT:    LDA    DFTBITS        ; get default setting
  1006.     RRC
  1007.     RRC
  1008.     ANI    00000011B    ; mask garbage if any
  1009.     ADD    A        ; <a> * 2
  1010.     MOV    E,A
  1011.     MVI    D,00
  1012.     PUSH    D
  1013.     CALL    SINITL        ; reinit the usart
  1014.     CALL    MILP
  1015.     DB    'There are ',0
  1016.     POP    D
  1017.     LXI    H,BVECT
  1018.     DAD    D
  1019.     MOV    A,M
  1020.     INX    H
  1021.     MOV    H,M
  1022.     MOV    L,A
  1023.     PCHL
  1024.  
  1025. BVECT:    DW    BITS5
  1026.     DW    BITS6
  1027.     DW    BITS7
  1028.     DW    BITS8
  1029.  
  1030. BITS5:      CALL    MILP        ; display '5'
  1031.       DB    '5 bits/char',0        
  1032.       RET            
  1033. BITS6:      CALL    MILP        ; display '6'
  1034.       DB    '6 bits/char',0        
  1035.       RET            
  1036. BITS7:      CALL    MILP        ; display '7'
  1037.       DB    '7 bits/char',0        
  1038.       RET            
  1039. BITS8:      CALL    MILP        ; display '8'
  1040.       DB    '8 bits/char',0        
  1041.       RET            
  1042. ;
  1043. ;    set length command table
  1044. ;
  1045. BITTBL:      DB    '5'+80H        ;"set bits 5"
  1046.       DW    BIT5
  1047.       DB    '6'+80H        ;"set bits 6"
  1048.       DW    BIT6
  1049.       DB    '7'+80H        ;"set bits 7"
  1050.       DW    BIT7
  1051.       DB    '8'+80H        ;"set bits 8"
  1052.       DW    BIT8
  1053.       DB    0        ;<<== end of bpc table
  1054. ;
  1055. ;
  1056. ; build the default initialization from ram so as to be cloneable
  1057. ;
  1058. SINITL:    IN    CPORT        ; reset the mode registers    
  1059.     LDA    DFTSTP        ; get default stop bits
  1060.     MOV    B,A
  1061.     LDA    DFTPAR        ; get default parity
  1062.     ORA    B
  1063.     MOV    B,A
  1064.     LDA    DFTBITS        ; get default character length
  1065.     ORA    B
  1066.     ORI    00000010B    ; force divide by 16 - use internal baud gen
  1067.     OUT    MODE1        ; set the register
  1068.  
  1069.     LDA    DFTBAUD        ; get the default baud rate
  1070.     ORI    00110000B    ; force internal clocks
  1071.     OUT    MODE2        ; set the register
  1072.  
  1073.     MVI    A,00100111B    ; force dtr, cts, async, txe, rxe, no loopbak
  1074.     OUT     CPORT
  1075.     RET
  1076. ;
  1077. ;
  1078. ; smartmodem dialing routine ... by a "cast of thousands"
  1079. ;
  1080. DIAL:      LHLD    DIALPT        ;fetch pointer
  1081.       CPI    254        ;start dial?
  1082.       JZ    STDIAL1        ;jump if so
  1083.       CPI    255        ;end dial?
  1084.       JZ    ENDIAL1        ;jump if so
  1085. ;
  1086. ; not start or end sequence, must be a digit to be sent to the modem
  1087. ;
  1088.       MOV    M,A        ;put char in buffer
  1089.       INX    H        ;advance pointer
  1090.       SHLD    DIALPT        ;stuff pntr
  1091.       RET            ;all done
  1092. ;
  1093. ; here on a start-dial sequence
  1094. ;
  1095. STDIAL1:  LXI    H,DIALBF    ;set up buffer pointer
  1096.       SHLD    DIALPT
  1097.       RET
  1098. ;
  1099. ; here on an end-dial sequence
  1100. ;
  1101. ENDIAL1:  MVI    M,CR        ;stuff end-of-line into buffer
  1102.       INX    H        ;followed by terminator
  1103.       MVI    M,0
  1104.       LDA    TPULSE        ;get overlay'S TOUCH-TONE FLAG
  1105.       STA    SMDIAL+3    ;put into string
  1106.       LXI    H,SMDIAL    ;point to dialing string
  1107.       CALL    SMSEND        ;send it
  1108. WAITSM:      MVI    C,INMDM
  1109.       CALL    MEX        ;catch any output from the modem
  1110.       JNC    WAITSM        ;loop until no more characters
  1111. ;
  1112. ; the following loop waits for a result from the modem.
  1113. ;
  1114. RESULT:      MVI    A,60        ; dont hang longer than a minute
  1115.       MOV    C,A
  1116.  
  1117. SMWLP:      PUSH    B
  1118.       MVI    B,1        ;check for a char, up to 1 sec wait
  1119.       MVI    C,TMDINP    ;do timed input
  1120.       CALL    MEX
  1121.       POP    B
  1122.       JNC    SMTEST        ;jump if modem had a char
  1123.       PUSH    B        ;no, test for control-c from console
  1124.       MVI    C,CHEKCC
  1125.       CALL    MEX
  1126.       POP    B
  1127.       JNZ    SMNEXT        ;if not, jump
  1128.       CALL    SMDMOFF        ;yes, shut down the modem
  1129.       MVI    A,3        ;return abort code
  1130.       RET
  1131. SMNEXT:      DCR    C        ;no
  1132.       JNZ    SMWLP        ;continue
  1133. ;
  1134. ; no modem response within the time specified in set delay command
  1135. ;
  1136. SMTIMO:    CALL    SMDMOFF
  1137.     MVI    A,2        ;return timeout code
  1138.     RET
  1139. ;
  1140. ; modem gave us a result, check it
  1141. ;
  1142. SMTEST:      ANI    7FH        ;ignore any parity
  1143.       CALL    SMANAL        ;test the result
  1144.       JC    RESULT        ;go try again if unknown response
  1145.       MOV    A,B        ;a=result 
  1146.       PUSH    PSW        ;save it
  1147. SMTLP:      MVI    C,INMDM        ;eat any additional chars from smartmodem
  1148.       CALL    MEX
  1149.       JNC    SMTLP        ;until 100ms of quiet time
  1150.       POP    PSW        ;return the code
  1151.       RET
  1152. ;
  1153. ; analyze character returned from modem
  1154. ;
  1155. SMANAL:      MVI    B,0        ;prep connect code
  1156.       CPI    'C'        ;"connect"?
  1157.       RZ
  1158.       CPI    '1'        ;numeric version of "connect"
  1159.       RZ
  1160.       CPI    '5'        ;numeric version of "connect 1200"
  1161.       RZ
  1162.       INR    B        ;prep busy code b=1
  1163.       CPI    'B'
  1164.       RZ
  1165.       INR    B        ;prep no connect msg b=2
  1166.       CPI    'N'        ;n=no connect
  1167.       RZ
  1168.       CPI    '3'        ;numeric version of "no connect"
  1169.       RZ
  1170.       MVI    B,4        ;prep modem error
  1171.       CPI    'E'        ;e=error
  1172.       RZ
  1173.       CPI    '4'        ;numeric version of "error"
  1174.       RZ
  1175. ;
  1176. ; unknown response, return carry to caller. but first,
  1177. ; flush the unknown response line from the modem.
  1178. ;
  1179. WTLF:      CPI    LF        ;linefeed?
  1180.       STC
  1181.       RZ            ;end if so
  1182.       MVI    C,INMDM        ;no. get next char
  1183.       CALL    MEX
  1184.       JNC    WTLF        ;unless busy, loop
  1185.       RET
  1186. ;
  1187. ; send string to the external modem
  1188. ;
  1189. SMSEND:      MVI    C,SNDRDY    ;wait for modem ready
  1190.       CALL    MEX
  1191.       JNZ    SMSEND
  1192.       MOV    A,M        ;fetch next character
  1193.       INX    H
  1194.       ORA    A        ;end?
  1195.       RZ            ;done if so
  1196.       MOV    B,A        ;no, position for sending
  1197.       MVI    C,SNDCHR    ;nope, send the character
  1198.       CALL    MEX
  1199.       JMP    SMSEND
  1200. ;
  1201. ; disconnect smodem - if DTR didnt, this will...
  1202. ;
  1203. SMDMOFF:  MVI    B,CR
  1204.       MVI    C,SNDCHR
  1205.       CALL    MEX
  1206.       MVI    B,10        ;one second wait for hayes, etc
  1207.            CALL    MTIME
  1208.       JMP    DISCON        ;make sure it is off
  1209. ;
  1210. ; general utility routines
  1211. ;
  1212. MILP:      MVI    C,ILP        ;in-line print
  1213.       JMP    MEX
  1214.       RET
  1215. ;
  1216. MTIME:      MVI    C,TIMER        ; mex timer
  1217.       JMP    MEX
  1218.       RET
  1219. ;
  1220. CRLF:      CALL    MILP        ; print carriage return, line feed
  1221.       DB    CR,LF,0
  1222.       RET
  1223.  
  1224. DONEW:      PUSH    H        ; save the new command string fro a sec 
  1225.       LXI    H,ATNSTR
  1226.       CALL    SMSEND        ; wake up the modem with 'AT'
  1227.       POP    H
  1228.       JMP    SINIT        ; now send the new parameter
  1229.  
  1230. ATNSTR:      DB    'AT',0
  1231. ;
  1232. ;==========================================================================
  1233. ;                            data area
  1234. ;==========================================================================
  1235. ;
  1236. ; default uart parameters 
  1237. ;
  1238. DFTSTP:       DB     01000000B    ; default stop bits - 1
  1239. DFTPAR:       DB     00000000B    ; default parity - none
  1240. DFTBITS:   DB     00001100B    ; default character length - 8 bits
  1241. DFTBAUD:   DB    00000000B    ; default baud rate scratch area 
  1242. ;
  1243. SMDIAL:      DB    'ATDT '        ; smartmodem dial prefix
  1244. DIALBF:      DS    52        ; 2* 24 char max, + cr + null + slop
  1245. DIALPT:      DS    2        ; dial position pointer
  1246. DIALWD:      DB    01000000B    ; pulse/tone dial word
  1247. DIGIT      DB    0        ; save dialed digit
  1248. SPEED:      DB    5        ; default baud rate 
  1249.                 ; 0=110,1=300,3=600,5=1200,6=2400
  1250.                 ; 7=4800,8=9600,9=19200 
  1251. MONFLG:      DB    0FFH        ; 0: monitor off - 0ffh: monitor on
  1252. ANSFLG:      DB    0        ; 0: originate   - 0ffh: ans
  1253. ;
  1254. SMATN:    DB    '+++',0        ; smartmodem online 'ATTENTION'
  1255. SMDISC:      DB    'ATH',CR,0    ; smartmodem disconnect 
  1256. SMINIT:   DB    'ATM1 '        ; speaker
  1257. S0NIT:      DB    'S0=0 '        ; answer ring counter
  1258. S7NIT:      DB    'S7=30'        ; carrier wait delay seconds
  1259. XNIT:      DB    'X1'        ; result code mode 
  1260. S11NIT:      DB    'S11=40 '    ; interdigit delay in ms
  1261.       DB    CR,0        ; modem init string
  1262.  
  1263. ;
  1264. ;******************************************************************************
  1265. ;
  1266.                   END
  1267. ;
  1268. ;******************************************************************************
  1269.