home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / modems / modem7 / m7vio-2.asm < prev    next >
Assembly Source File  |  1994-07-13  |  18KB  |  512 lines

  1. ; M7VIO-2.ASM -- Ithaca VIO w/ 2651 overlay.  06/30/85.
  2. ;
  3. ; Replaces M7VIO-1.ASM and supports the SET command at 2400 Baud.
  4. ; It starts out at 1200 baud when the program is first called up.
  5. ; Tested with the Hayes Smartmodem 1200 and US Robotics Courier 2400.
  6. ;
  7. ; One small problem surfaced. When calling with the Courier at 2400,
  8. ; if the other end answers at 1200, the Courier resets to 1200 and
  9. ; expects you to do the same with the UART. That code was not added
  10. ; here and if it happens to you, the simplest recovery is to get out
  11. ; of MODEM and start over.
  12. ;
  13. ; TO USE: First edit this file filling in answers for your own
  14. ;      equipment. Then assemble with ASM.COM or equivalent
  15. ;      assembler. Then use DDT to overlay the the results
  16. ;      of this program to the original .COM file:
  17. ;
  18. ;        A>DDT MDM729.COM
  19. ;        DDT VERS 2.2
  20. ;        NEXT  PC
  21. ;        4A00 0100
  22. ;        -IM7VIO-1.HEX        (note the "I" command)
  23. ;        -R            ("R" loads in the .HEX file)
  24. ;        NEXT  PC
  25. ;        4A00 0000        (MDM729 is 73 sectors)
  26. ;        -G0            (return to CP/M)
  27. ;        A>SAVE 73 MODEM.COM    (now have a modified .COM file)
  28. ;
  29. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  30. ;
  31. ; 06/30/85 - Added 2400 Baud support - Dave Crane
  32. ; 03/24/84 - Added SMODEM commands - Dave Crane
  33. ; 09/18/83 - MDM711HZ modified for Ithaca VIO+2651 - Dave Crane
  34. ; 07/01/83 - Revised to work with MDM711 - Irv Hoff
  35. ; 06/22/83 - Revised to work with MDM710 - Irv Hoff
  36. ; 05/27/83 - Revised to work with MDM709 - Irv Hoff
  37. ; 05/15/83 - Revised to work with MDM708 - Irv Hoff
  38. ; 04/11/83 - Updated to work with MDM707 - Irv Hoff
  39. ; 04/04/83 - Updated to work with MDM706 - Irv Hoff
  40. ; 02/27/83 - Updated to work with MDM705 - Irv Hoff
  41. ; 02/17/83 - Modified MDM703CF to work with
  42. ;         Heath/Zenith -100 series com-
  43. ;         puters with 2661B I/O        - Irv Hoff
  44. ;
  45. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  46. ;
  47. BELL:        EQU    07H        ;bell
  48. CR:        EQU    0DH        ;carriage return
  49. ESC:        EQU    1BH        ;escape
  50. LF:        EQU    0AH        ;linefeed
  51. ;
  52. YES:        EQU    0FFH
  53. NO:        EQU    0
  54. ;
  55. ; Modem cable assumed set up as follows:
  56. ;
  57. ;    Modem        Ithaca VIO board    Function
  58. ;    2        3            TXD    ->    RXD
  59. ;    3        2            RXD    <-    TXD
  60. ;            4-\            RTS    -\    (jumpered)
  61. ;            5-/            CTS    -/    (together)
  62. ;    8        20        Carrier=DCD    ->    DSR
  63. ;    7        7            Ground    --    Ground
  64. ;    22        22            RI    ->    not used
  65. ;    20        8            DTR    <-    DTR
  66. ;
  67. ; Be certain the 2651 pin 16 (DCD) is tied to ground. If it floats, the
  68. ; chip will never indicate data available. This was a flaw in several
  69. ; Rev/B boards tested, even though the documentation indicates Rev/B fixed
  70. ; the problem.
  71. ;
  72. ; This diagram and logic also applies to BYEII and XMODEM but note that data-
  73. ; set ready, not the ring indicator, is the signal that a call is coming in.
  74. ; SmartModem switches are assumed to be UUDU DUUD for BYE. XMODEM doesn't care.
  75. ; USR Courier 2400 switches are assumed UUDD DUDD DU; it will work with the
  76. ;     same switch settings as the Hayes 1200.
  77. ;
  78. ;        DCC 3/26/84
  79. ;
  80. ;=======================================================================
  81. ;
  82. MODDATP:  EQU    20H        ;BASE PORT = Data Port
  83. MODSTAT:  EQU    MODDATP+1    ;STATUS PORT
  84. MODMODE:  EQU    MODDATP+2    ;MODE PORT
  85. MODCTLP:  EQU    MODDATP+3    ;CONTROL PORT
  86.  
  87. BASEP    EQU    MODDATP     ;Base port for Intersystems VIO
  88. DPORT    EQU    BASEP        ;Modem data port
  89. SPORT    EQU    BASEP+1     ;Modem status port
  90. MPORT    EQU    BASEP+2     ;Modem mode select port
  91. CPORT    EQU    BASEP+3     ;Modem control port
  92. ;
  93. ;    Modem status port equates
  94. ;
  95. TBMT    EQU    00000001b        ;Transmit buffer empty
  96. DAV    EQU    00000010b        ;Data available
  97. PE    EQU    00001000b        ;Parity error
  98. OE    EQU    00010000b        ;Overrun error
  99. FE    EQU    00100000b        ;Framing error
  100. DCD    EQU    01000000b        ;Carrier detect
  101. RDET    EQU    10000000b        ;Ring detect
  102. ;  (In this configuration RDET is actually data set ready)
  103. ;
  104. ;    Mode port equates
  105. ;
  106. E8NO1    EQU    01001110b        ;8 data bits, no p, 1 stop, 16x rate
  107. EBASE    EQU    00110000b        ;Mode register 2 base
  108. B110    EQU    EBASE+2         ;110 baud (not implemented)
  109. B300    EQU    EBASE+5         ;300 baud
  110. B600    EQU    EBASE+6         ;600 baud (not implemented)
  111. B1200    EQU    EBASE+7         ;1200 baud
  112. B2400    EQU    EBASE+10        ;2400 baud
  113. B4800    EQU    EBASE+12        ;4800 baud (not implemented)
  114. B9600    EQU    EBASE+14        ;9600 Baud
  115. ;
  116. ;    Command port equates
  117. ;
  118. CBASE    EQU    00000101b        ;Command base
  119. RISET    EQU    00010000b        ;Reset errors
  120. DTR    EQU    00000010b        ;Turn on DTR
  121. RTS    EQU    00100000b        ;Turn on RTS
  122. ;
  123.         ORG    100H
  124. ;
  125.         DS    3    ;(for  "JMP   START" instruction)
  126. ;
  127. PMMIMODEM:    DB    NO    ;yes=PMMI S-100 Modem            103H
  128. SMARTMODEM:    DB    YES    ;yes=HAYES Smartmodem, no=non-Hayes    104H
  129. TOUCHPULSE:    DB    'T'    ;T=touch, P=pulse (Smartmodem-only)    105H
  130. ;
  131. CLOCK:        DB    57    ;clock speed in MHz x10, 25.5 MHz max.    106H
  132.                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  133. MSPEED:     DB    5    ;0=110 1=300 2=450 3=600 4=710 5=1200    107H
  134.                 ;6=2400 7=4800 8=9600 9=19200 default
  135. BYTDLY:     DB    5    ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108H
  136.                 ;default time to send character in ter-
  137.                 ;minal mode file transfer for slow BBS.
  138. CRDLY:        DB    5    ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  139.                 ;default time for extra wait after CRLF
  140.                 ;in terminal mode file transfer
  141. NOOFCOL:    DB    5    ;number of DIR columns shown        10AH
  142. SETUPTST:    DB    YES    ;yes=user-added Setup routine        10BH
  143. SCRNTEST:    DB    NO    ;Cursor control routine         10CH
  144. NORETRY:    DB    YES    ;yes=resend a record after any non-ACK    10DH
  145.                 ;no=resend a record after a valid NAK
  146. BAKUPBYTE:    DB    YES    ;yes=change any file same name to .BAK    10EH
  147. CRCDFLT:    DB    YES    ;yes=default to CRC checking        10FH
  148. TOGGLECRC:    DB    YES    ;yes=allow toggling of CRC to Checksum    110H
  149. CONVBKSP:    DB    NO    ;yes=convert backspace to rub        111H
  150. TOGGLEBK:    DB    NO    ;yes=allow toggling of bksp to rub    112H
  151. ADDLF:        DB    NO    ;no=no LF after CR to send file in    113H
  152.                 ;terminal mode (added by remote echo)
  153. TOGGLELF:    DB    YES    ;yes=allow toggling of LF after CR    114H
  154. TRANLOGON:    DB    YES    ;yes=allow transmission of logon    115H
  155.                 ;write logon sequence at location LOGON
  156. SAVCCP:     DB    YES    ;yes=do not overwrite CCP        116H
  157. LOCONEXTCHR:    DB    NO    ;yes=local command if EXTCHR precedes    117H
  158.                 ;no=external command if EXTCHR precedes
  159. TOGGLELOC:    DB    YES    ;yes=allow toggling of LOCONEXTCHR    118H
  160. LSTTST:     DB    NO    ;yes=printer available on printer port    119H
  161. XOFFTST:    DB    YES    ;yes=checks for XOFF from remote while    11AH
  162.                 ;sending a file in terminal mode
  163. XONWAIT:    DB    NO    ;yes=wait for XON after CR while    11BH
  164.                 ;sending a file in terminal mode
  165. TOGXOFF:    DB    YES    ;yes=allow toggling of XOFF checking    11CH
  166. IGNORCTL:    DB    YES    ;yes=CTL-chars above ^M not displayed    11DH
  167. EXTRA1:     DB    0    ;for future expansion            11EH
  168. EXTRA2:     DB    0    ;for future expansion            11FH
  169. BRKCHR:     DB    '@'-40H ;^@ = Send a 300 ms. break tone     120H
  170. NOCONNCT:    DB    'N'-40H ;^N = Disconnect from the phone line    121H
  171. LOGCHR:     DB    'O'-40H ;^O = Send logon            122H
  172. LSTCHR:     DB    'P'-40H ;^P = Toggle printer            123H
  173. UNSAVE:     DB    'R'-40H ;^R = Close input text buffer        124H
  174. TRANCHR:    DB    'T'-40H ;^T = Transmit file to remote        125H
  175. SAVECHR:    DB    'Y'-40H ;^Y = Open input text buffer        125H
  176. EXTCHR:     DB    '^'-40H ;^^ = Send next character        126H
  177. ;
  178.         DS    2        ;                128H
  179. ;
  180. IN$MODSTAT:    IN    MODSTAT ! RET    ;in modem status port        12AH
  181.         DS    7
  182. OUT$MODDATP:    OUT    MODDATP ! RET    ;out modem data port        134H
  183.         DS    7
  184. IN$MODDATP:    IN    MODDATP ! RET    ;in modem data port        13EH
  185. ;--->        DS    31
  186.         DS    7
  187. ;--->
  188. ;
  189. ANI$MODRCVB:    ANI    DAV    ! RET    ;bit to test for receive ready    148H
  190. CPI$MODRCVR:    CPI    DAV    ! RET    ;value of rcv. bit when ready    14BH
  191. ANI$MODSNDB:    ANI    TBMT    ! RET    ;bit to test for send ready    14EH
  192. CPI$MODSNDR:    CPI    TBMT    ! RET    ;value of send bit when ready    151H
  193.         DS    6        ;                156H
  194. OUT$MODCTL1:    OUT    MODCTLP ! RET    ;out modem control port #2    15AH
  195. OUT$MODCTL2:    OUT    MODCTLP ! RET    ;out modem control port #1    15DH
  196. ;
  197. ;--->
  198. ;
  199. LOGONPTR:    DW    LOGON        ;for user message.        160H
  200.         DS    6        ;                162H
  201. JMP$GOODBYE:    JMP    GOODBYE     ;                168H
  202. JMP$INITMOD:    JMP    INITMOD     ;go to user written routine    16BH
  203.         RET  !    NOP  !    NOP    ;(by-passes PMMI routine)    16EH
  204.         RET  !    NOP  !    NOP    ;(by-passes PMMI routine)    171H
  205.         RET  !    NOP  !    NOP    ;(by-passes PMMI routine)    174H
  206. JMP$SETUPR:    JMP    SETUPR        ;                177H
  207. JMP$SPCLMENU:    JMP    SPCLMENU    ;                17AH
  208. JMP$SYSVER:    JMP    SYSVER        ;                17DH
  209. JMP$BREAK:    JMP    SENDBRK     ;                180H
  210. ;
  211. ; Do not change the following six lines.
  212. ;
  213. JMP$ILPRT:    DS    3        ;                183H
  214. JMP$INBUF    DS    3        ;                186H
  215. JMP$INLNCOMP:    DS    3        ;                189H
  216. JMP$INMODEM    DS    3        ;                18CH
  217. JMP$NXTSCRN:    DS    3        ;                18FH
  218. JMP$TIMER:    DS    3        ;                192H
  219. ;
  220. ;        TVI, Lear Siegler, etc.
  221. ;
  222. CLREOS:     CALL    JMP$ILPRT    ;                195H
  223.         DB    ESC,79H,0,0,0    ;                198H
  224.         RET            ;                19DH
  225. ;
  226. CLRSCRN:    CALL    JMP$ILPRT    ;                19EH
  227.         DB    ESC,3AH,0,0,0    ;CLEAR ENTIRE SCREEN        1A1H
  228.         RET            ;                1A6H
  229. ;
  230. ;
  231. SYSVER:     CALL    JMP$ILPRT    ;                1A7H
  232.         DB    'Version for Ithaca VIO/2651 at port 20H'
  233.         DB    CR,LF,0
  234.         DB    RET
  235. ;.....
  236. ;-----------------------------------------------------------------------
  237. ;
  238. ; NOTE:  You can change the SYSVER message to be longer or shorter.  The
  239. ;     end of your last routine should terminate by 0400H (601 bytes
  240. ;     available after start of SYSVER) if using the Hayes Smartmodem
  241. ;     or by address 0C00H (2659 bytes available) otherwise.
  242. ;
  243. ;-----------------------------------------------------------------------
  244. ;
  245. ; You can put in a message at this location which can be called up with
  246. ; CTL-O if TRANLOGON has been set YES.    You can put in several lines if
  247. ; desired.  End with a 0.
  248. ;
  249. LOGON:      DB    'DAVE;CRANE',CR,LF,0
  250. ;.....
  251. ;
  252. ; This routine allows a 300 ms. break tone to be sent to reset some
  253. ; time-share computers.
  254. ;
  255. SENDBRK:  MVI    A,3DH        ;SEND A BREAK TONE FOR 300 MS.
  256.       MVI    B,3        ;DELAY FOR 300 MS.
  257.       CALL    JMP$TIMER
  258.       MVI    A,CBASE+RISET+DTR+RTS
  259.       OUT    MODCTLP     ;Xmit, Recv, DTR, RTS on, reset.
  260.       IN    MODDATP     ;CLEAR ANY INCOMING CHARS.
  261.       IN    MODDATP     ;TRY ONCE MORE
  262.       RET
  263. ;
  264. ; This routine sends a 300 ms. break tone and sets DTR low for the same
  265. ; length of time to disconnect some modems such as the Bell 212A, etc. 
  266. ;
  267. GOODBYE:  CALL    SENDBRK     ;SEND 300MS BREAK TONE
  268.       MVI    A,CBASE     ;SET BREAK, DTR & RTS LOW
  269.       OUT    MODCTLP     ;PUT COMMAND REGISTER OUT OF MODE
  270.       MVI    B,3        ;DELAY FOR 300 MS.
  271.       CALL    JMP$TIMER
  272.       MVI    A,CBASE+RISET+DTR+RTS
  273.       OUT    MODCTLP     ;SEND TO COMMAND REGISTER
  274.       IN    MODDATP     ;CLEAR ANY INCOMING CHARS.
  275.       IN    MODDATP     ;TRY ONCE MORE
  276.       XRA    A        ;CLEAR THE 'A' REG.
  277.       RET
  278. ;
  279. ; The following are used in setting up the 2651 I/O port.
  280. ;
  281. INITMOD:  MVI    A,5        ;START WITH 1200 BAUD
  282.       STA    MSPEED        ;DEFAULT TRANSFER TIME
  283.       IN    MODCTLP     ;Clear/Reset Mode toggle on port
  284.       MVI    A,E8NO1     ;1 STOP, NO PARITY, 8 BITS, ASYNC 16X
  285.       OUT    MODMODE     ;SEND TO MODE REGISTER 1
  286. INITMOD1: MVI    A,B1200     ;START WITH 1200 BAUD
  287.       OUT    MODMODE     ;SEND TO MODE REGISTER 2
  288.       MVI    A,CBASE+RISET+DTR+RTS
  289.                 ;RESET RTS, FLAGS, DTR LOW, ENABLE R/T
  290.       OUT    MODCTLP     ;SEND TO COMMAND REGISTER
  291.       CALL    SMINIT        ;Reinitialize the SmartModem to this rate.
  292.       RET
  293. ;.....
  294. ;
  295. ; The following changes the baud rate with the SET command.
  296. ;
  297. SETUPR:   LXI    D,BAUDBUF
  298.       CALL    JMP$ILPRT
  299.       DB    'Input Baud Rate (300, 1200, 2400, 9600): ',0
  300.       CALL    JMP$INBUF
  301.       LXI    D,BAUDBUF+2
  302.       CALL    JMP$INLNCOMP    ;COMPARE BAUDBUF+2 WITH CHARACTERS BELOW
  303.       DB    '300',0
  304.       JNC    OK300        ;GO IF GOT MATCH
  305.       CALL    JMP$INLNCOMP
  306.       DB    '1200',0
  307.       JNC    OK1200
  308.       CALL    JMP$INLNCOMP
  309.       DB    '2400',0
  310.       JNC    OK2400
  311.       CALL    JMP$INLNCOMP
  312.       DB    '4800',0
  313.       JNC    OK4800
  314.       CALL    JMP$INLNCOMP
  315.       DB    '9600',0
  316.       JNC    OK9600
  317.       CALL    JMP$ILPRT    ;ALL MATCHES FAILED, ASK AGAIN
  318.       DB    '++ Incorrect entry ++',CR,LF,BELL,0
  319.       JMP    SETUPR        ;TRY AGAIN
  320. ;
  321. OK300:      MVI    A,1
  322.       LHLD    BD300
  323.       JMP    LOADBD
  324. ;
  325. OK1200:   MVI    A,5
  326.       LHLD    BD1200
  327.       JMP    LOADBD
  328. ;
  329. OK2400:   MVI    A,6
  330.       LHLD    BD2400
  331.       JMP    LOADBD
  332. ;
  333. OK4800:   MVI    A,6        ;See comments after next Baud rate:
  334.       LHLD    BD4800
  335.       JMP    LOADBD
  336. ;
  337. OK9600:   MVI    A,6        ;Obviously this won't work with a slower
  338.       LHLD    BD9600        ; modem. It's intended for null modems.
  339.       JMP    LOADBD
  340. ;
  341. LOADBD:   STA    INITMOD+1    ;Store in INITMOD instruction
  342.       MOV    A,L        ;get least significant baud rate byte
  343.       STA    INITMOD1+1    ;store in INITMOD1
  344.       JMP    INITMOD     ;reset 2651
  345. ;.....
  346. ;
  347. ; TABLE OF BAUDRATE PARAMETERS FOR 2651 I/O
  348. ;
  349. BD110    DB    EBASE+2         ; 110 BAUD
  350. BD300    DB    EBASE+5         ; 300 BAUD
  351. BD1200    DB    EBASE+7         ;1200 BAUD
  352. BD2400    DB    EBASE+10        ;2400 BAUD
  353. BD4800    DB    EBASE+14        ;4800 BAUD
  354. BD9600    DB    EBASE+14        ;9600 BAUD 
  355. ;
  356. BAUDBUF:  DB    10,0
  357.       DS    10
  358. ;
  359. ;
  360. SPCLMENU: RET        ; Not used
  361.  
  362. ; NOTE:  MUST TERMINATE PRIOR TO 0400H (with Smartmodem)
  363. ;                 0C00H (without Smartmodem)
  364. ;
  365. ;          D.C. Hayes Smartmodem 300/1200 'Modem Control'
  366. ;    From:        BY2+SMDM.ASM  by Don Brown
  367. ;             Version 1.1    04/24/83
  368. ;    Mods: Dave Crane, Dallas RCP/M
  369. ;
  370. ; These routines may be used along with the more specific modem/
  371. ; serial port/baud rate routines commonly found in BY2-MOD.LBR.
  372. ;
  373. ; The following Smartmodem Default switches are assumed:
  374. ;  A. Switches 'Not' configurable by Software Control:
  375. ;    1=Up, DTR supported, do Not force to always logic true.
  376. ;    6=Up, DCD supported, do Not force to always logic true.
  377. ;    7=Up, Single Line RJ11 Telephone connection to Smartmodem.
  378. ;    8=Down, Enables modem command recognition, when in Command State.
  379. ;  B. Switches 'configurable' by Software Control:
  380. ;    2=Up, Send English result codes when in Command State.
  381. ;    3=Down, Result Codes are sent to the Terminal.
  382. ;    4=Down, Do not echo characters when in Command State.
  383. ;    5=Down, Do not answer the telephone.
  384. ;
  385. ; The USR Courier 2400 switches are almost identical to the Hayes 1200.
  386. ; We run the RCP/M with 1,2,6, and 10 UP and the rest DOWN (except "11").
  387. ;
  388. ; Notes:
  389. ;    USR Courier will automatically set itself to the speed of the
  390. ;    calling modem, provided the speed is 300 -> 2400 baud.    This
  391. ;    relieves us of the need to set the modem (still have to check and
  392. ;    set the USART/baud), via software instructions.  110 baud is not
  393. ;    supported because Smartmodem cannot differentiate between 110-300
  394. ;    baud and will not set itself automatically.
  395. ;
  396. ;    Code causes DTR to go false in order to Hang-Up the phone.  When
  397. ;    DTR goes false, smartmodem will automatically drop the line and go
  398. ;    to Local Command State.  However, DTR must be true for Smartmodem
  399. ;    to receive and execute commands.  Further, when you turn DTR on, for
  400. ;    this purpose, Smartmodem is still set at the Baud rate of the last
  401. ;    call and is still in auto answer mode.    If the telephone is ringing
  402. ;    when DTR goes true and the number of rings stored in smartmodem
  403. ;    register S0 is 1 (and possibly even 2), there may not be enough time
  404. ;    to send the first command string before smartmodem goes off the hook
  405. ;    into a carrier wait state.  If you send any characters to smartmodem
  406. ;    during this carrier wait state (before it has recognizes an incoming
  407. ;    carrier and goes On Line), the smartmodem will hang-up the line and
  408. ;    return to local command state.    Also, all characters received by it,
  409. ;    after this first key character (ie. the 'A' of the required 'AT..'),
  410. ;    after in local command state, will be received as random data and
  411. ;    may confuse smartmodem's baud rate detector and command decoder,
  412. ;    leaving smartmodem in an unpredictable state (which may keep your
  413. ;    system down till you manually reset it).  If the command string is
  414. ;    sent after smartmodem has recognized carrier and gone on line, it
  415. ;    goes out the modem port to the calling modem as data (garbage).
  416. ;    Consequently, it is extremely important that smartmodem register S0
  417. ;    be set to at least 3 if not 4 rings and the smartmodem command string
  418. ;    'ATZ' be executed immediately after DTR is set true!!
  419. ;
  420. ;    The first command string sent to smartmodem ie. 'ATZ', will set the
  421. ;    smartmodem baud rate to the speed at which it was sent (the speed or
  422. ;    baud of your USART which was just set in the initialization routines).
  423. ;    This command will also cause the Smartmodem to do its own software
  424. ;    reset (return to default switch settings).  Note that switch 5 is
  425. ;    down so that modem does Not default to auto Answer.  We set auto
  426. ;    when we're ready, with the second command string we send.
  427. ;
  428. ;    The Smartmodem needs at least 250msecs. delay between commands, in
  429. ;    order to execute the command and be ready to receive the next command
  430. ;    or between data and a command (sometimes longer).
  431. ;
  432. ; Initialize the Smartmodem.
  433. ; DTR must be logic true for Smartmodem to receive and process a command.
  434. ; The S0 modem register setting should not be less than 2 and should be the
  435. ; last command in the command string.
  436. ;
  437. PSPEED:     EQU    6    ;Processor speed - MHz
  438. ;
  439. SMINIT:
  440.     CALL    MDMRST        ;Reset with 'ATZ'
  441.     CALL    SMDELAY     ;One second delay needed by Smartmodem
  442.     CALL    SMSEND        ;Initialize Smartmodem
  443.     DB    'ATQ1E0M1S2=128S7=11S9=6S10=60S0=255',CR,0
  444.     CALL    SMDELAY     ;One second delay needed by Smartmodem
  445.     RET            ;Return
  446. ;
  447. ; Initialize the SmartModem to virgin state
  448. ;
  449. MDMRST:
  450.     CALL    SMSEND
  451.     DB    'ATZ',CR,0    ; set SmardModem to no auto answer
  452.     RET
  453. ;
  454. ; Let the Smartmodem have one second before receiving a command.
  455. ; ie. one second to process a Command or before any other data
  456. ; is sent to it.  DTR must be On for Smartmodem to receive and process
  457. ; a command when it is local command state.
  458. ;
  459. SMDELAY:
  460.     PUSH    B        ;Preserve in case it's in use elsewhere
  461.     MVI    B,10        ;Wait one second
  462. DLP1:
  463.     CALL    DELAY
  464.     DCR    B
  465.     JNZ    DLP1        ;Keep looping till done
  466.     POP    B        ;Done, restore BC
  467.     RET            ;Return
  468. ;
  469. ; Send the Command String to the Smartmodem
  470. ; Similiar to how ILPRT sends to console
  471. ;
  472. SMSEND:
  473.     XTHL            ;Save HL, get address of message
  474.     PUSH    B        ;Save BC
  475. ;
  476. SMPLP:
  477.     IN    SPORT        ;Get modem output status
  478.     ANI    TBMT        ;mask junk
  479.     JZ    SMPLP        ;Not ready to send yet...
  480.     MOV    A,M        ;Ready, get the character..
  481.     OUT    DPORT        ;Send the character
  482.     INX    H        ;Point to next character
  483.     MOV    A,M        ;Get next character
  484.     ORA    A        ;Delimiter ? All sent ?
  485.     JNZ    SMPLP        ;..No, go send another
  486.     POP    B        ;..Yes, restore BC
  487.     XTHL            ;...restore HL, get return Address
  488.     RET            ;Return
  489. ;
  490. ;.1 sec delay routine
  491. ;
  492. DELAY:
  493.     PUSH    B
  494.     LXI    B,417*PSPEED    ;timing constant * speed in MHz
  495. ;
  496. DELAY1:
  497.     DCX    B
  498.     MOV    A,B
  499.     ORA    C
  500.     JNZ    DELAY1
  501.     POP    B
  502.     RET
  503. ;
  504.     END
  505. 
  506.     LXI    B,417*PSPEED    ;timing constant * speed in MHz
  507. ;
  508. DELAY1:
  509.     DCX    B
  510.     MOV    A,B
  511.     ORA    C
  512.     JNZ