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-AX11.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  35KB  |  1,402 lines

  1. ;==========================================================================
  2. ;
  3. ;                               MXO-AX10.ASM
  4. ;
  5. ;   This file is an extended and upgraded version of the MEX overlay
  6. ;   MXO-KP30.ASM designed for use with MEX10.COM, the Modem EXecutive
  7. ;   communications program and the Actrix computer.  
  8. ;
  9. ;   To use:  Check carefully through the following equates and defines
  10. ;   to make sure the various options are set to your particular in-
  11. ;   stallation requirements and personal tastes.  This file may be
  12. ;   modified with any word processor such as ED or WordStar.  Once all
  13. ;   desired modifications have been entered, the .ASM file must be
  14. ;   assembled to a .HEX file using ASM, LINKASM, or the MAC assembler.
  15. ;   Use the MLOAD program distributed with MEX10 to generate a working
  16. ;   copy of MEX as follows:
  17. ;
  18. ;              MLOAD MEXNEW.COM=MEX10.COM,MXO-KP30.HEX
  19. ;
  20. ;
  21. REV        EQU    11        ;overlay revision level
  22. ;
  23. ;==========================================================================
  24. ;
  25. ;     Ver AX1.1        Added capability to use NEW 300+ internal modem
  26. ;            board that will operate at 300/1200 baud.
  27. ;
  28. ;     Ver AX1.0        Converted from the KayPro II overlay to Axtrix
  29. ;            computer. Designed to use either port J5 or J6
  30. ;            for external modem. Has either Hayes SmartModem 
  31. ;            or Ven-Tel modem protocols for dialling. 
  32. ;            Modified 03/09/84 by Bill Rink
  33. ;
  34. ;     Ver KP3.0        Combined the primarily modem-oriented commands
  35. ;            from the Smith-Quinn MXO-KP25 with the SIO-
  36. ;            oriented commands from the Saunders MXO-KP14
  37. ;            overlay -- 7/23/84 (Norm Saunders)
  38. ;
  39. ;     Ver KP1.4        Tightened the code a bit more and added the
  40. ;            code to automatically print the revision number
  41. ;            from the variable REV -- 6/26/84 (Norm Saunders)
  42. ;
  43. ;     Ver KP1.3        Fixed a bug in the SHDLY subroutine and added
  44. ;            code for automatic initialization of the
  45. ;            modem if it's a Hayes.  Also added Mark Pulver's
  46. ;            fix to the Hayes SMANAL subroutine -- 6/2/84
  47. ;            (Norm Saunders)
  48. ;
  49. ;     Ver KP1.2           Fixed a minor bug in the 'set bits' command,
  50. ;               tightened up the code in the 'set baud' command,
  51. ;            and incorporated Ver 1.1 of the Hayes Smart-
  52. ;            modem overlay -- 5/24/84 (Norm Saunders)
  53. ;
  54. ;     Ver KP1.1        Implemented the PBAUD; vector, added an expanded
  55. ;            SET command, and incorporated the Hayes Smart-
  56. ;            modem overlay with conditional assembly commands
  57. ;            -- 5/19/84 (Norm Saunders)
  58. ;
  59. ;     Ver KP1.0        Translated M7KP-1.ASM to conform to the mnemonics
  60. ;             and service processor calls of MEX10 -- 5/7/84
  61. ;            (Norm Saunders)
  62. ;
  63. ;==========================================================================
  64. ;
  65. ;    Miscellaneous equates
  66. ;
  67. BELL        EQU    07H        ;bell
  68. CR        EQU    0DH        ;carriage return
  69. ESC        EQU    1BH        ;escape
  70. LF        EQU    0AH        ;linefeed
  71. TAB        EQU    09H        ;tab
  72. NO        EQU    0        ;
  73. YES        EQU    0FFH        ;
  74. FALSE        EQU    0        ;
  75. TRUE        EQU    NOT FALSE    ;
  76. TPA        EQU    0100H        ;
  77. MEXLOC        EQU    0D00H        ;start of MEX service processor
  78. BDOS        EQU    05H        ;BDOS call
  79. ;
  80. ;    Actrix port definitions
  81. ;
  82. PORT1        EQU    040H        ;Base serial input/output port J5
  83. MODCTL1        EQU    PORT1+2        ;Modem control port
  84. MODDAT1        EQU    PORT1        ;Modem data port
  85. BAUD1        EQU    5        ;SET BUAD RATE FOR PORT J5
  86. ;
  87. PORT2        EQU    041H        ;Base serial input/output port J6
  88. MODCTL2        EQU    PORT2+2        ;Modem control port
  89. MODDAT2        EQU    PORT2        ;Modem data port
  90. BAUD2        EQU    6        ;SET BUAD RATE FOR PORT J6
  91. ;
  92. ;    Actrix bit definitions
  93. ;
  94. MDRCVB        EQU    01H        ;Your bit to test for receive
  95. MDRCVR        EQU    01H        ;Your value when receive ready
  96. MDSNDB        EQU    04H        ;Your bit to test for send
  97. MDSNDR        EQU    04H        ;Your value when send ready        
  98. ;
  99. ;    MEX service processor functions
  100. ;
  101. MEX    EQU    MEXLOC        ;address of the service processor
  102. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  103. TIMER    EQU    254        ;delay 100ms * reg B
  104. TMDINP    EQU    253        ;B=# secs to wait for char, CY=no char
  105. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  106. SNDRDY    EQU    251        ;test for modem-send ready
  107. RCVRDY    EQU    250        ;test for modem-receive ready
  108. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  109. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  110. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  111. PARSFN    EQU    246        ;parse filename from input stream
  112. BDPARS    EQU    245        ;parse baud-rate from input stream
  113. SBLANK    EQU    244        ;scan input stream to next non-blank
  114. EVALA    EQU    243        ;evaluate numeric from input stream
  115. LKAHED    EQU    242        ;get nxt char w/o removing from input
  116. GNC    EQU    241        ;get char from input, CY=1 if none
  117. ILP    EQU    240        ;inline print
  118. DECOUT    EQU    239        ;decimal output
  119. PRBAUD    EQU    238        ;print baud rate
  120. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  121. PRINT    EQU    9        ;simulated BDOS function 9: print string
  122. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  123. ;
  124. ;    Smart Modem Definition Flags
  125. ;
  126. HAYES    EQU    FALSE        ;set if a Hayes smartmodem is used
  127. VENTEL    EQU    TRUE        ;set if Ven-Tel smartmodem is used
  128. ;
  129.         ORG    TPA
  130. ;
  131.         DS    3    ;(for  "JMP   START" instruction)
  132. ;
  133. ; The following variables are located at the beginning of the program
  134. ; to facilitate modification without the need of re-assembly.  They will
  135. ; be moved in MEX 2.0.
  136. ;
  137. SMODEM:        DW    TRUE    ;true= smartmodem, false=non-dialing    103H
  138. TPULSE:        DB    'T'    ;T=touch, P=pulse (Smartmodem-only)    105H
  139. CLOCK:        DB    40    ;clock speed in MHz x10, 25.5 MHz max.    106H
  140.                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  141. MSPEED:        DB    5    ;0=110 1=300 2=450 3=600 4=710 5=1200    107H
  142.                 ;6=2400 7=4800 8=19200 default display
  143.                 ;time for sending a file
  144. BYTDLY:        DB    1    ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108H
  145.                 ;default time to send character in ter-
  146.                 ;minal mode file transfer for slow BBS.
  147. CRDLY:        DB    9    ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  148.                 ;default time for extra wait after CRLF
  149.                 ;in terminal mode file transfer
  150. COLUMS:        DB    5    ;number of DIR columns shown        10AH
  151. SETFL:        DB    YES    ;yes=user-added SET command        10BH
  152. SCRTST:        DB    YES    ;yes=user-added cursor control routine     10CH
  153.         DB    0    ;spare (replaces ACKNAK)        10DH
  154. BAKFLG:        DB    NO    ;yes=change any file same name to .BAK    10EH
  155. CRCDFL:        DB    YES    ;yes=default to CRC checking        10FH
  156. TOGCRC:        DB    YES    ;yes=allow toggling of CRC to Checksum    110H
  157. CVTBS:        DB    NO    ;yes=convert backspace to rub        111H
  158. TOGLBK:        DB    YES    ;yes=allow toggling of bksp to rub    112H
  159. ADDLF:        DB    NO    ;no=no LF after CR to send file in    113H
  160.                 ;terminal mode (added by remote echo)
  161. TOGLF:        DB    YES    ;yes=allow toggling of LF after CR    114H
  162. TRNLOG:        DB    NO    ;yes=allow transmission of logon    115H
  163.                 ;write logon sequence at location LOGON
  164. SAVCCP:        DB    YES    ;yes=do not overwrite CCP        116H
  165. LOCNXT:        DB    NO    ;yes=local command if EXTCHR precedes    117H
  166.                 ;no=external command if EXTCHR precedes
  167. TOGLOC:        DB    YES    ;yes=allow toggling of LOCNXT        118H
  168. LSTTST:        DB    YES    ;yes=printer available on printer port    119H
  169. XOFTST:        DB    NO    ;yes=chcks for XOFF from remote while    11AH
  170.                 ;sending a file in terminal mode
  171. XONWT:        DB    NO    ;yes=wait for XON after CR while    11BH
  172.                 ;sending a file in terminal mode
  173. TOGXOF:        DB    YES    ;yes=allow toggling of XOFF checking    11CH
  174. IGNCTL:        DB    YES    ;yes=CTL-chars above ^M not displayed    11DH
  175. EXTRA1:        DB    0    ;for future expansion            11EH
  176. EXTRA2:        DB    0    ;for future expansion            11FH
  177. ;
  178. CTLPORT        DB    MODCTL2    ; init for J6 port            120H
  179. DATPORT        DB    MODDAT2    ;                    121H
  180. BAUDPT        DB    BAUD2    ;                    122H
  181. INTERN        DB    NO    ; set modem to external use        123
  182.         DS    6
  183. ;
  184. ;    Low-level modem I/O routines
  185. ;
  186. INCTRL:        JMP    INSTAT        ;read USART status        12AH
  187.         DS    7        ;
  188. OTDATA:        JMP    OUTDAT        ;out modem data port        134H
  189.         DS    7        ;
  190. INPORT:        JMP    INDAT        ;in modem data port        13EH
  191.         DS    7        ;
  192. ;
  193. ;    Bit-test routines
  194. ;
  195. MASKR:        ANI    MDRCVB ! RET    ;bit to test for receive ready    148H
  196. TESTR:        CPI    MDRCVR ! RET    ;value of receive bit when rdy    14BH
  197. MASKS:        ANI    MDSNDB ! RET    ;bit to test for send ready    14EH
  198. TESTS:        CPI    MDSNDR ! RET    ;value of send bit when ready    151H
  199.         DS    12        ;
  200. ;
  201. ;    MEX10 vector to overlay-provided functions
  202. ;
  203. LOGON:        DS    2        ;not implemented in MEX        160H
  204. ;
  205.         IF  NOT SMODEM
  206. DIALV:        DS    3        ;dummied out for non-dialing    162H
  207. DISCV:        DS    3        ;modems                165H
  208. GOODBV:        JMP    GDBY        ;disconnect 212-type modems    168H
  209.         ENDIF
  210. ;
  211.         IF SMODEM
  212. DIALV:        JMP    DIAL        ;Hayes dialing routine        162H
  213. DISCV:        JMP    DISCON        ;Hayes disconnect routine    165H
  214. GOODBV:        JMP    GDBY        ;                168H
  215.         ENDIF
  216. ;
  217. INMODV:        JMP    NITMOD        ;UART initialization        16BH
  218. NEWBDV:        JMP    PBAUD        ;Reset baud rate from library    16EH
  219. NOPARV:        RET  !    NOP  !    NOP    ;(by-passes PMMI routine)    171H
  220. PARITV:        RET  !    NOP  !    NOP    ;(by-passes PMMI routine)    174H
  221. SETUPV:        JMP    SETCMD        ;Actrix SET command        177H
  222. SPMENV:        DS    3        ;not implemented in MEX        17AH
  223. VERSNV:        JMP    SYSVER        ;print signon message        17DH
  224. BREAKV:        JMP    BREAK        ;send a break tone        180H
  225. ;
  226. ; The following jump vector provides the overlay with access to special
  227. ; routines in MEX10 provided to maintain compatibility with MDM7 over-
  228. ; lays.  It is recommended that these routines be avoided as they will
  229. ; disappear in future versions of MEX.
  230. ;
  231. ILPRTV:        DS    3    ;replaced with MEX function 9        183H
  232. INBUFV:        DS    3    ;replaced with MEX function 10        186H
  233. ILCMPV:        DS    3    ;replaced with table lookup fnc 247    189H
  234. INMDMV:        DS    3    ;replaced with MEX function 255        18CH
  235. NXSCRV:        DS    3    ;not supported by MEX            18FH
  236. TIMERV:        DS    3    ;replaced with MEX function 254        192H
  237. ;
  238. ;    Clear-screen and clear-to-end-of-screen functions
  239. ;
  240. SCRN1:        JMP    CLREOS    ;clear to end of screen            195H
  241.         DS    6    ;                    198H
  242. ;
  243. SCRN2:        JMP    CLS    ;clear screen, home cursor        19EH
  244.         DS    6    ;                    1A1H
  245. ;
  246. ;---------------------------------------------------------------------------
  247. ;
  248. ;    *** End of fixed format area ***
  249. ;
  250. ;---------------------------------------------------------------------------
  251. ;
  252. ;    Modem I/O routines
  253. ;
  254. INSTAT:        PUSH    B
  255.         LDA    CTLPORT
  256.         MOV    C,A
  257.         MVI    A,10H        ;channel 0, reset interrupts.    
  258.         DB    0EDH,79H    ;OUT    MODCTL
  259.         DB    0EDH,78H    ;IN    MODCTL, get the status bits
  260.         POP    B
  261.         RET            ;
  262. OUTDAT:        PUSH    B 
  263.         MOV    B,A        ;SAVE OUTPUT CHAR
  264.         LDA    DATPORT
  265.         MOV    C,A
  266.         MOV    A,B        ;RETURN
  267.         DB    0EDH,79H    ;OUT    MODDAT, out modem data port
  268.         POP    B 
  269.         RET            ;
  270. INDAT:        PUSH    B 
  271.         LDA    DATPORT
  272.         MOV    C,A
  273.         DB    0EDH,78H    ;IN    MODDAT,    in modem data port
  274.         POP    B 
  275.         RET            ;
  276. ;
  277. ;    Screen-handling routines
  278. ;
  279. CLREOS:        LXI    D,EOSMSG    ;
  280.         MVI    C,PRINT        ;
  281.         CALL    MEX        ;
  282.         RET            ;
  283. ;
  284. CLS:        LXI    D,CLSMSG    ;
  285.         MVI    C,PRINT        ;
  286.         CALL    MEX        ;
  287.         RET            ;
  288. ;
  289. ;    Print system version message
  290. ;
  291. SYSVER:        CALL    ILPRT        ;
  292.         DB    CR,LF,'Custom Actrix Overlay -- Ver. '
  293.         DB    REV/10+'0'
  294.         DB    '.'
  295.         DB    REV MOD 10 + '0'
  296.         DB    CR,LF
  297.         DB    '(type SET for Set Command syntax)',CR,LF,LF,0
  298.         RET
  299. ;
  300. ;    Put Internal Modem OFFHOOK
  301. OFFHK:        LDA    MSPEED
  302.         CPI    1
  303.         JZ    OFF300
  304.         MVI    A,0B0H
  305.         JMP    OFFMDM
  306. OFF300:        MVI    A,0BAH
  307. OFFMDM:        CALL    CTLOUT
  308.         LDA    CTLPORT
  309.         MOV    C,A
  310.         MVI    A,5        ;select SIO write-register 5
  311.         DB    0EDH,79H    ;OUT MODCTL        ;
  312.         LDA    REG5        ;get the register 5 control byte
  313.         ORI    80H        ;set bit 7 (pulls DTR high)
  314.         JMP    GDBY1
  315.  
  316. ;
  317. ;    Send BREAK function
  318. ;
  319. BREAK:        LDA    CTLPORT
  320.         MOV    C,A
  321.         MVI    A,5        ;select SIO register 5
  322.         DB    0EDH,79H    ;OUT MODCTL
  323.         LDA    REG5        ;get the register 5 control byte
  324.         ORI    010H        ;set bit 4 (sends a break signal)
  325. ;
  326.         JMP    GDBY1
  327. ;
  328. ;    Set DTR low for 300ms (disconnects some modems)
  329. ;
  330. GDBY:        LDA    INTERN
  331.         ORA    A
  332.         JZ    GDBY1
  333.         LDA    CTLPORT
  334.         MOV    C,A
  335.         MVI    A,5        ;select SIO write-register 5
  336.         DB    0EDH,79H    ;OUT MODCTL        ;
  337.         LDA    REG5        ;get the register 5 control byte
  338.         ANI    07FH        ;reset bit 7 (pulls DTR low)
  339.  
  340. ;
  341. GDBY1:        DB    0EDH,79H    ;OUT MODCTL
  342.         MVI    B,3        ;Delay 300 ms.
  343.         MVI    C,TIMER
  344.         CALL    MEX
  345.         LDA    INTERN
  346.         ORA    A
  347.         JNZ    GDBY2
  348.         LDA    CTLPORT
  349.         MOV    C,A
  350.         MVI    A,5
  351.         DB    0EDH,79H    ;OUT MODCTL
  352.         LDA    REG5        ;Restore to normal
  353.         DB    0EDH,79H    ;OUT MODCTL
  354. GDBY2:        RET
  355. ;
  356. ;    Actrix initialization routines
  357. ;
  358. NITMOD:        CALL    NTBAUD        ;initialize the baud rate
  359. ;
  360.     IF SMODEM
  361.         CALL    NITMDM        ;initialize the smartmodem
  362.     ENDIF
  363. ;
  364.         RET            ;
  365. ;
  366. ;    Initialize the Zilog SIO chip
  367. ;
  368. NITSIO:        LDA    CTLPORT
  369.         MOV    C,A
  370.         MVI    A,00H        ;Select reg. 0
  371.         DB    0EDH,79H    ;OUT MODCTL
  372.         LDA    REG0        ;Command byte
  373.         DB    0EDH,79H    ;OUT MODCTL
  374.         MVI    A,04H        ;Select reg. 4
  375.         DB    0EDH,79H    ;OUT MODCTL
  376.         LDA    REG4        ;Receive/transmit control byte
  377.         ANI    3FH        ;reset bit 7 and 6
  378.         ORI    40H        ;set bit 6
  379.         MOV    B,A        ;save reg. 4
  380.         LDA    MSPEED        ;get modem speed
  381.         CPI    1        ;300 BAUD
  382.         MOV    A,B        ;restore A
  383.         JNZ    NITCTL
  384.         ORI    0C0H        ;set bit 7 and 6
  385. NITCTL:        STA    REG4
  386.         DB    0EDH,79H    ;OUT MODCTL
  387.         MVI    A,03H        ;Select reg. 3
  388.         DB    0EDH,79H    ;OUT MODCTL
  389.         LDA    REG3        ;Receiver logic byte
  390.         DB    0EDH,79H    ;OUT MODCTL
  391.         MVI    A,05H        ;Select reg. 5
  392.         DB    0EDH,79H    ;OUT MODCTL
  393.         LDA    INTERN
  394.         ORA    A
  395.         LDA    REG5        ;Transmitter logic byte
  396.         JNZ    NITEXT
  397.         ORI    80H
  398. NITEXT:        DB    0EDH,79H    ;OUT MODCTL
  399.         RET
  400. ;
  401. ;    Wait for Dial Tone (Internal Modem)
  402. ;
  403. WAITON:    MVI    B,10            ;WAIT 1 SEC FOR TONE
  404.     MVI    C,TIMER
  405.     CALL    MEX
  406.     LDA    10H
  407.     OUT    43H
  408.     IN    43H
  409.     ANI    20H            ;GOT A DIAL TONE?
  410.     RET    
  411. ;
  412. ;    Control Bits out to Internal Modem
  413. ;
  414. CTLOUT:    OUT    30H
  415.     IN    21H
  416.     ORI    20H            ;STROBE DATE OUT
  417.     OUT    21H
  418.     ANI    0DFH
  419.     OUT    21H
  420.     RET
  421. ;
  422. ;    Initialize the baudrate generator
  423. ;
  424. NTBAUD:        LDA    MSPEED        ;get the speed code
  425.         CALL    PBAUD        ;go set it
  426.         RET
  427. ;
  428. ;    Initialize the modem
  429. ;
  430.     IF SMODEM
  431. NITMDM:        CALL    SHPORT
  432.     IF HAYES
  433.         CALL    STSPK1        ;
  434.         CALL    CRLF        ;
  435.         CALL    STDL15        ;
  436.         CALL    CRLF        ;
  437.         CALL    STMOD1        ;
  438.         CALL    CRLF        ;
  439.         CALL    SHDIAL        ;
  440.         CALL    CRLF        ;
  441.     ENDIF
  442.         CALL    SHBAUD        ;
  443.         CALL    CRLF        ;
  444.         RET            ;
  445. ;
  446. ;    Send a string to the modem
  447. ;
  448. MDMSET:        CALL    SMSEND        ;send a string to the modem
  449. NITMD1:        MVI    C,INMDM        ;eat all feedback from the modem
  450.         CALL    MEX        ;
  451.         JNC    NITMD1        ;
  452.         RET            ;
  453.     ENDIF
  454. ;
  455. ;    Actrix SET command processor
  456. ;
  457. SETCMD:        MVI    C,SBLANK    ;check for SET arguments
  458.         CALL    MEX        ;
  459.         JC    SETHLP        ;if none, print help message
  460.         LXI    D,CMDTBL    ;parse the command
  461.         CALL    TSRCH        ;
  462.         PUSH    H        ;put returned address on stack
  463.         RNC            ;go there if table match found
  464.         POP    H        ;if no match, fix the stack and
  465. SETERR:        LXI    D,SETEMS    ;print an error message
  466.         MVI    C,PRINT        ;
  467.         CALL    MEX        ;
  468.         RET            ;
  469. ;
  470. ;    SET <no arguments>: print help message
  471. ;
  472. SETHLP:        LXI    D,HLPMSG    ;
  473.         MVI    C,PRINT        ;
  474.         CALL    MEX        ;
  475.         RET            ;
  476. ;
  477. HLPMSG:        DB    CR,LF,'SET command - Actrix version:',CR,LF,LF
  478.         DB    CR,LF,'SET BAUD <300> <600> <1200> <2400>'
  479.         DB    ' <4800> <9600>'
  480.         DB    CR,LF,'SET PARITY <OFF> <EVEN> <ODD>'
  481.         DB    CR,LF,'SET STOPBITS <1> <1.5> <2>'
  482.         DB    CR,LF,'SET LENGTH <5> <6> <7> <8>'
  483.         DB    CR,LF,'SET PORT <J5> <J6>'
  484.         DB    CR,LF,'SET MODEM <EXT> <INT>'
  485. ;
  486.     IF HAYES
  487.         DB    CR,LF,'SET MONITOR ON <or> OFF'
  488.         DB    CR,LF,'SET DELAY 15 <or> 30 <or> 45 <or> 60'
  489.         DB    CR,LF,'SET MODE ORIG <or> ANSWER'
  490.         DB    CR,LF,'SET DIAL PULSE <or> TONE'
  491.     ENDIF
  492. ;
  493.         DB    CR,LF,LF,'SET ?  (show current settings)'
  494.         DB    CR,LF,'$'
  495. ;
  496. ;    SET BAUD command: reset the baudrate generator
  497. ;
  498. STBAUD:        MVI    C,SBLANK    ;check for baudrate
  499.         CALL    MEX        ;
  500.         JC    SETERR        ;if none, print error message
  501.         LXI    D,BDTBL        ;check for acceptable rate
  502.         CALL    TSRCH        ;
  503.         JC    SETERR        ;if no match, print error
  504.         MOV    A,L        ;get file speed parameter
  505.         CALL    PBAUD        ;set the baudrate
  506.         CALL    SHBAUD        ;show the baud rate
  507.         JMP    CRLF
  508. SHBAUD:        CALL    ILPRT        ;display current baudrate
  509.         DB    'Baud rate:',TAB,' ',0
  510.         LDA    MSPEED
  511.         MVI    C,PRBAUD
  512.         JMP    MEX
  513. ;
  514. ;    Set the baud rate from the MSPEED code in reg. A
  515. ;    CY set if the specified rate is unsupported
  516. ;
  517. PBAUD:        PUSH    H        ;save all the registers
  518.         PUSH    D        ;
  519.         PUSH    B        ;
  520.         PUSH    PSW        ;
  521.         MVI    E,1BH        ;send ESCAPE code to monitor
  522.         MVI    C,6        ;do a direct conout
  523.         CALL    BDOS        ;
  524.         MVI    E,0F0H        ;send SET BAUD RATE code to monitor
  525.         MVI    C,6        ;do a direct conout
  526.         CALL    BDOS        ;
  527.         LDA    BAUDPT        ;GET CURRENT BUAD PORT
  528.         MOV    E,A        ;OUTPUT TO PROPER PORT
  529.         MVI    C,6        ;do a direct conout
  530.         CALL    BDOS        ;
  531.         POP    PSW        ;restore Areg
  532.         MOV    E,A        ;put MSPEED in DE
  533.         MVI    D,0        ;
  534.         LXI    H,BDTBL2    ;offset into the table
  535.         DAD    D        ;
  536.         MOV    A,M        ;get the baud-generator code
  537.         ORA    A        ; test for zero value
  538.         JZ    PBAUD2        ; EXIT if so
  539.         PUSH    D        ; SAVE E
  540.         MOV    E,A        ;output the baud rate
  541.         MVI    C,6        ;do a direct conout
  542.         CALL    BDOS        ;
  543.         POP    D        ;
  544.         MOV    A,E        ;get MSPEED code back
  545.         STA    MSPEED        ;save it
  546.         ORA    A        ;return, no errors
  547. PBAUD1:
  548.         POP    B        ;
  549.         POP    D        ;
  550.         POP    H        ;
  551.         CALL    NITSIO        ;reset SIO
  552.         RET            ;
  553.  
  554. PBAUD2:        MVI    A,28H        ;put out a standard baud rate
  555.         MOV    E,A        ;output the baud rate
  556.         MVI    C,6        ;do a direct conout
  557.         CALL    BDOS        ;
  558.         CTC            ; If Error
  559.         JP    PBAUD1
  560. ;
  561. ;    SET ? command: show all current settings
  562. ;
  563. STSHOW:        CALL    CRLF        ;
  564.         LXI    H,SHOTBL    ;get table of SHOW routines
  565. STSHW1:        MOV    E,M        ;get address of a routine
  566.         INX    H        ;
  567.         MOV    D,M        ;
  568.         INX    H        ;
  569.         MOV    A,D         ;
  570.         ORA    E        ;end of table?
  571.         RZ            ;if yes, we're done
  572.         PUSH    H        ;save the table pointer
  573.         XCHG            ;put address in HL
  574.         CALL    GOHL        ;go do it!
  575.         CALL    CRLF        ;print newline
  576.         MVI    C,CHEKCC    ;console abort?
  577.         CALL    MEX        ;
  578.         POP    H        ;
  579.         JNZ    STSHW1        ;if no abort then continue
  580.         RET            ;
  581. ;
  582. GOHL:        PCHL            ;
  583. ;
  584. ;    SET PARITY command: reset transmit/receive parity
  585. ;
  586. ;        Parity is controlled by bits 0 and 1 of
  587. ;        the byte sent to the SIO write-register
  588. ;        4 as follows:
  589. ;
  590. ;           Parity    Bit 1       Bit 0
  591. ;                 Off          -          0
  592. ;              Odd      0         1
  593. ;             Even      1         1
  594. ;
  595. STPRTY:        MVI    C,SBLANK    ;check for parity code
  596.         CALL    MEX        ;
  597.         JC    SETERR        ;if none, print error
  598.         LXI    D,PARTBL    ;check for proper syntax
  599.         CALL    TSRCH        ;
  600.         PUSH    H        ;match found, go do it!
  601.         RNC            ;
  602.         POP    H        ;no match: fix stack and
  603.         JMP    SETERR        ;  print error
  604. ;
  605. PROFF:        LDA    REG4        ;get register 4 byte
  606.         ANI    0FEH        ;reset bit 0
  607.         JMP    PARTB1        ;
  608. PREVEN:        LDA    REG4        ;
  609.         ORI    003H        ;set bits 0 & 1
  610.         JMP    PARTB1        ;
  611. PRODD:        LDA    REG4        ;
  612.         ORI    001H        ;set bit 0
  613.         ANI    0FDH        ;reset bit 1
  614. PARTB1:        STA    REG4        ;
  615.         CALL    NITSIO        ;re-initialize the USART
  616.         CALL    SHPRTY        ;print the result
  617.         JMP    CRLF        ;
  618. SHPRTY:        CALL    ILPRT        ;display parity
  619.         DB    'Parity:  ',TAB,' ',0
  620.         LDA    REG4        ;
  621.         ANI    001H        ;test bit 0
  622.         CPI    0        ;if bit0=0 then parity off
  623.         JNZ    SHPRT1        ;
  624.         CALL    ILPRT        ;
  625.         DB    'Off',0        ;
  626.         RET
  627. SHPRT1:        LDA    REG4        ;
  628.         ANI    002H        ;test bit 1
  629.         CPI    0        ;if bit1=0 then parity odd
  630.         JNZ    SHPRT2        ;
  631.         CALL    ILPRT        ;
  632.         DB    'Odd',0        ;
  633.         RET            ;
  634. SHPRT2:        CALL    ILPRT        ;
  635.         DB    'Even',0    ;
  636.         RET
  637. ;
  638. ;    SET STOPBITS command: reset number of stop bits
  639. ;
  640. ;        The number of stop bits is controlled by bits
  641. ;        2 and 3 of the byte sent to the SIO write-
  642. ;        register 4, as follows:
  643. ;
  644. ;            Stop bits       Bit 3    Bit 2
  645. ;            1         0            1
  646. ;               1.5         1          0
  647. ;            2         1          1
  648. ;
  649. ;
  650. STSTOP:        MVI    C,SBLANK    ;check for stop bits
  651.         CALL    MEX        ;
  652.         JC    SETERR        ;if none, print error
  653.         LXI    D,STPTBL    ;check for proper syntax
  654.         CALL    TSRCH        ;
  655.         PUSH    H        ;match found, go do it!
  656.         RNC            ;
  657.         POP    H        ;no match: fix stack and
  658.         JMP    SETERR        ;  print error
  659. ;
  660. STOP01:        LDA    REG4        ;get register 4 byte
  661.         ANI    0F7H        ;reset bit 3
  662.         ORI    004H        ;set bit 2
  663.         JMP    STSTP1        ;
  664. STOP02:        LDA    REG4        ;
  665.         ORI    00CH        ;set bits 2 and 3
  666.         JMP    STSTP1        ;
  667. STOP15:        LDA    REG4        ;
  668.         ORI    008H        ;set bit 3
  669.         ANI    0F8H        ;reset bit 2
  670. STSTP1:        STA    REG4        ;
  671.         CALL    NITSIO        ;
  672.         CALL    SHSTOP        ;print the result
  673.         JMP    CRLF        ;
  674. SHSTOP:        CALL    ILPRT        ;display stop-bits
  675.         DB    'Stop bits:',TAB,' ',0
  676.         LDA    REG4        ;
  677.         ANI    004H        ;test bit 2
  678.         CPI    0        ;if bit2=0 then 1.5
  679.         JNZ    SHSTP1        ;
  680.         CALL    ILPRT        ;
  681.         DB    '1.5',0        ;
  682.         RET
  683. SHSTP1:        LDA    REG4        ;
  684.         ANI    008H        ;test bit 3
  685.         CPI    0        ;if bit3=0 then 1
  686.         JNZ    SHSTP2        ;
  687.         CALL    ILPRT        ;
  688.         DB    '1',0        ;
  689.         RET
  690. SHSTP2:        CALL    ILPRT        ;
  691.         DB    '2',0        ;
  692.         RET
  693. ;
  694. ;    SET LENGTH command: set bits per character
  695. ;
  696. ;        The number of bits per character is controlled for
  697. ;        the receiver circuit by bits 6 and 7 of the byte
  698. ;        sent to the SIO write-register 3 and for the trans-
  699. ;        mitter circuit by bits 5 and 6 of the byte sent to
  700. ;        the SIO write-register 5.  The assumption has been
  701. ;        made here that both transmission and reception will
  702. ;        be carried on at the same number of bits per charac-
  703. ;        ter.  The bit configurations are shown for register
  704. ;        3 only, but are the same for register 5:
  705. ;
  706. ;            BPC        Bit 7        Bit 6
  707. ;             5          0          0
  708. ;             6          1             0
  709. ;             7          0          1
  710. ;             8          1          1
  711. ;
  712. STBITS:        MVI    C,SBLANK    ;check for bits/char
  713.         CALL    MEX        ;
  714.         JC    SETERR        ;if none, print error
  715.         LXI    D,BITTBL    ;check for proper syntax
  716.         CALL    TSRCH        ;
  717.         PUSH    H        ;match found, go do it!
  718.         RNC            ;
  719.         POP    H        ;no match: fix stack and
  720.         JMP    SETERR        ;  print error
  721. ;
  722. BIT5:        LDA    REG3        ;
  723.         ANI    0BFH        ;reset bit 6
  724.         ANI    07FH        ;reset bit 7
  725.         STA    REG3        ;
  726.         LDA    REG5        ;
  727.         ANI    0DFH        ;reset bit 5
  728.         ANI    0BFH        ;reset bit 6
  729.         JMP    STBTS1        ;
  730. BIT6:        LDA    REG3        ;
  731.         ANI    0BFH        ;reset bit 6
  732.         ORI    080H        ;set bit 7
  733.         STA    REG3        ;
  734.         LDA    REG5        ;
  735.         ANI    0DFH        ;reset bit 5
  736.         ORI    040H        ;set bit 6
  737.         JMP    STBTS1        ;
  738. BIT7:        LDA    REG3        ;
  739.         ORI    040H        ;set bit 6
  740.         ANI    07FH        ;reset bit 7
  741.         STA    REG3        ;
  742.         LDA    REG5        ;
  743.         ORI    020H        ;set bit 5
  744.         ANI    0BFH        ;reset bit 6
  745.         JMP    STBTS1        ;
  746. BIT8:        LDA    REG3        ;
  747.         ORI    040H        ;set bit 6
  748.         ORI    080H        ;set bit 7
  749.         STA    REG3        ;
  750.         LDA    REG5        ;
  751.         ORI    020H        ;set bit 5
  752.         ORI    040H        ;set bit 6
  753. STBTS1:        STA    REG5        ;
  754.         CALL    NITSIO        ;
  755.         CALL    SHBITS        ;print the result
  756.         JMP    CRLF
  757. SHBITS:        CALL    ILPRT        ;display bits/char
  758.         DB    'Bits/char:',TAB,' ',0
  759.         LDA    REG5        ;
  760.         ANI    040H        ;test bit 6
  761.         CPI    0        ;if bit6=0 then 6 bpc
  762.         JNZ    SHBTS2        ;
  763.         LDA    REG5        ;
  764.         ANI    020H        ;test bit 5
  765.         CPI    0        ;if bit5=0 then 5 bpc
  766.         JNZ    SHBTS1        ;
  767.         CALL    ILPRT        ;
  768.         DB    '5',0        ;
  769.         RET            ;
  770. SHBTS1:        CALL    ILPRT        ;
  771.         DB    '7',0        ;
  772.         RET            ;
  773. SHBTS2:        LDA    REG5        ;
  774.         ANI    020H        ;test bit 5
  775.         CPI    0        ;if bit5=0 then 6 bpc
  776.         JNZ    SHBTS3        ;
  777.         CALL    ILPRT        ;
  778.         DB    '6',0        ;
  779.         RET            ;
  780. SHBTS3:        CALL    ILPRT        ;
  781.         DB    '8',0        ;
  782.         RET
  783. ;
  784. ;    Set Port Address for Modem
  785. ;
  786.  
  787. STPORT:        MVI    C,SBLANK    ;check for parity code
  788.         CALL    MEX        ;
  789.         JC    SETERR        ;if none, print error
  790.         LXI    D,PORTBL    ;check for proper syntax
  791.         CALL    TSRCH        ;
  792.         PUSH    H        ;match found, go do it!
  793.         RNC            ;
  794.         POP    H        ;no match: fix stack and
  795.         JMP    SETERR        ;  print error
  796. ;
  797. PORTJ5:        MVI    A,MODCTL1
  798.         STA    CTLPORT        ;DEFINE CONTROL PORT
  799.         MVI    A,MODDAT1    ;
  800.         STA    DATPORT        ;DEFINE DATA PORT
  801.         MVI    A,BAUD1        ;
  802.         STA    BAUDPT        ;DEFINE BAUD PORT
  803.         JMP    SPORT        ;
  804. PORTJ6:        MVI    A,MODCTL2
  805.         STA    CTLPORT        ;DEFINE CONTROL PORT
  806.         MVI    A,MODDAT2    ;
  807.         STA    DATPORT        ;DEFINE DATA PORT
  808.         MVI    A,BAUD2        ;
  809.         STA    BAUDPT        ;DEFINE BAUD PORT
  810. SPORT:        CALL    NTBAUD
  811.         CALL    NITSIO
  812. SHPORT:        CALL    CRLF        ;
  813.         CALL    ILPRT        ;
  814.         DB    'Initializing modem for port J',0
  815.         LDA    BAUDPT        ;get the port number
  816.         CPI    5
  817.         JNZ    SHPJ6
  818.         MVI    A,'5'
  819.         JMP    SHPOUT
  820. SHPJ6:        CPI    6
  821.         JNZ    SHPU
  822.         MVI    A,'6'
  823.         JMP    SHPOUT
  824. SHPU:        MVI    A,'?'
  825. SHPOUT:        CALL    TYPE
  826.         LDA    INTERN
  827.         ORA    A
  828.         JZ    SHEXT
  829.         CALL    ILPRT
  830.         DB    CR,LF,'USING Internal 300/1200 Modem',0
  831.         JMP    SHEXIT
  832. SHEXT:        CALL    ILPRT
  833.         DB    CR,LF,'USING External Modem',0
  834. SHEXIT:        CALL    ILPRT
  835.         DB    CR,LF,LF,0
  836.         RET
  837. ;
  838. STMDM:        MVI    C,SBLANK    ;check for parity code
  839.         CALL    MEX        ;
  840.         JC    SETERR        ;if none, print error
  841.         LXI    D,MDMTBL    ;check for proper syntax
  842.         CALL    TSRCH        ;
  843.         PUSH    H        ;match found, go do it!
  844.         RNC            ;
  845.         POP    H        ;no match: fix stack and
  846.         JMP    SETERR        ;  print error
  847. ;
  848. EXTMDM:        XRA    A
  849.         JMP    SETINT    
  850. INTMDM:        MVI    A,0FFH
  851. SETINT:        STA    INTERN
  852.         JMP    SHPORT
  853.  
  854.  
  855. ;
  856.     IF HAYES
  857. ;
  858. ;    SET MONITOR command: turn Hayes speaker on and off
  859. ;                 to monitor dialing
  860. ;
  861. STSPKR:        MVI    C,SBLANK    ;
  862.         CALL    MEX        ;
  863.         JC    SETERR        ;
  864.         LXI    D,MONTBL    ;
  865.         CALL    TSRCH        ;
  866.         JC    SETERR        ;
  867.         MOV    A,L        ;
  868.         ADI    '0'        ;
  869.         STA    MONMSG+3    ;
  870. STSPK1:        LXI    H,MONMSG    ;
  871.         CALL    MDMSET        ;
  872. SHSPKR:        CALL    ILPRT        ;
  873.         DB    'Modem monitor:',TAB,' ',0
  874.         LDA    MONMSG+3    ;
  875.         CPI    0+'0'        ;if monflg=0 then speaker is off
  876.         JNZ    SHSPK1        ;
  877.         CALL    ILPRT        ;
  878.         DB    'Off',0        ;
  879.         RET            ;
  880. SHSPK1:        CALL    ILPRT        ;
  881.         DB    'On',0        ;
  882.         RET            ;
  883. ;
  884. ;    SET DELAY command: set wait-time for 'no answer'
  885. ;
  886. STDLY:        MVI    C,SBLANK    ;check for delay parameter
  887.         CALL    MEX        ;
  888.         JC    SETERR        ;
  889.         LXI    D,DLYTBL    ;
  890.         CALL    TSRCH        ;
  891.         PUSH    H        ;
  892.         RNC            ;
  893.         POP    H        ;
  894.         JMP    SETERR        ;
  895. STDL15:        LXI    H,DL15MS    ;delay 15 seconds
  896.         CALL    MDMSET        ;
  897.         MVI    A,15        ;
  898.         STA    NDELAY        ;
  899.         JMP    SHDLY        ;
  900. STDL30:        LXI    H,DL30MS    ;
  901.         CALL    MDMSET        ;
  902.         MVI    A,30        ;
  903.         STA    NDELAY        ;
  904.         JMP    SHDLY        ;
  905. STDL45:        LXI    H,DL45MS    ;
  906.         CALL    MDMSET        ;
  907.         MVI    A,45        ;
  908.         STA    NDELAY        ;
  909.         JMP    SHDLY        ;
  910. STDL60:        LXI    H,DL60MS    ;
  911.         CALL    MDMSET        ;
  912.         MVI    A,60        ;
  913.         STA    NDELAY        ;
  914. SHDLY:        CALL    ILPRT        ;
  915.         DB    'Modem delay:',TAB,' ',0
  916.         LDA    NDELAY        ;
  917.         CPI    15        ;
  918.         JNZ    SHDLY1        ;
  919.         CALL    ILPRT        ;
  920.         DB    '15 seconds',0
  921.         RET
  922. SHDLY1:        CPI    30        ;
  923.         JNZ    SHDLY2        ;
  924.         CALL    ILPRT        ;
  925.         DB    '30 seconds',0
  926.         RET
  927. SHDLY2:        CPI    45        ;
  928.         JNZ    SHDLY3        ;
  929.         CALL    ILPRT        ;
  930.         DB    '45 seconds',0
  931.         RET
  932. SHDLY3:        CALL    ILPRT        ;
  933.         DB    '60 seconds',0
  934.         RET            ;
  935. ;
  936. ;    SET MODE command (answer or originate)
  937. ;
  938. STMODE:        MVI    C,SBLANK    ;
  939.         CALL    MEX        ;
  940.         JC    SETERR        ;
  941.         LXI    D,MODTBL    ;
  942.         CALL    TSRCH        ;
  943.         JC    SETERR        ;
  944.         MOV    A,L        ;
  945.         ADI    '0'        ;
  946.         STA    MODMSG+5    ;
  947. STMOD1:        LXI    H,MODMSG    ;
  948.         CALL    MDMSET        ;
  949. SHMODE:        CALL    ILPRT        ;
  950.         DB    'Mode:   ',TAB,' ',0
  951.         LDA    MODMSG+5    ;
  952.         CPI    0+'0'        ;if zero, then originate mode
  953.         JNZ    SHMOD1        ;
  954.         CALL    ILPRT        ;
  955.         DB    'Originate',0    ;
  956.         RET            ;
  957. SHMOD1:        CALL    ILPRT        ;
  958.         DB    'Answer',0    ;
  959.         RET            ;
  960. ;
  961. ;    SET DIAL command (touch or pulse)
  962. SETDIA:        MVI    C,SBLANK    ;
  963.         CALL    MEX        ;
  964.         JC    SETERR        ;
  965.         LXI    D,DIALTB    ;
  966.         CALL    TSRCH        ;
  967.         JC    SETERR        ;
  968.         MOV    A,L        ;
  969.         STA    TPULSE        ;
  970. SHDIAL:        CALL    ILPRT        ;
  971.         DB    'Phone type:',TAB,' ',0
  972.         LDA    TPULSE        ;
  973.         CPI    'T'        ;
  974.         JNZ    SHDIL1        ;
  975.         CALL    ILPRT        ;
  976.         DB    'Touchtone',0
  977.         RET            ;
  978. SHDIL1:        CALL    ILPRT        ;
  979.         DB    'Pulse-dial',0    ;
  980.         RET            ;
  981.     ENDIF
  982. ;
  983. ; Newline on console
  984. ;
  985. CRLF:        MVI    A,CR
  986.         CALL    TYPE
  987.         MVI    A,LF        ;fall into TYPE
  988. ;
  989. ; type char in A on console
  990. ;
  991. TYPE:        PUSH    H        ;save 'em
  992.         PUSH    D
  993.         PUSH    B
  994.         MOV    E,A        ;align output character
  995.         MVI    C,CONOUT    ;print via MEX
  996.         CALL    MEX
  997.         POP    B
  998.         POP    D
  999.         POP    H
  1000.         RET
  1001. ;
  1002. ; Compare next input-stream item in table @DE; CY=1
  1003. ; if not found, else HL=matched data item
  1004. ;
  1005. TSRCH:        MVI    C,LOOKUP    ;get function code
  1006.         JMP    MEX        ;pass to MEX processor
  1007. ;
  1008. ; Print in-line message ... blows away C register
  1009. ;
  1010. ILPRT:        MVI    C,ILP        ;get function code
  1011.         JMP    MEX        ;go do it
  1012. ;
  1013.     IF SMODEM
  1014. ;
  1015. ;    Hayes Smartmodem 1200 dialling routines
  1016. ;
  1017. DIAL:        LHLD    DIALPT        ;Fetch pointer
  1018.         CPI    254        ;Start dial?
  1019.         JZ    STDIAL        ;jump if so
  1020.         CPI    255        ;end dial?
  1021.         JZ    ENDIAL        ;jump if so
  1022. ;
  1023. ; Not start or end sequence, must be a digit to be sent to the modem
  1024. ;
  1025.         MOV    M,A        ;put char in buffer
  1026.         INX    H        ;advance pointer
  1027.         SHLD    DIALPT        ;stuff pntr
  1028.         RET            ;all done
  1029. ;
  1030. ; Here on a start-dial sequence
  1031. ;
  1032. STDIAL:        LXI    H,DIALBF    ;set up buffer pointer
  1033.         SHLD    DIALPT
  1034.         LDA    INTERN        ; USING INTERNAL MODEM?
  1035.         JZ    STDRET        ; NOPE
  1036.         CALL    OFFHK
  1037. STDRET:        RET
  1038. ;
  1039. ; Here on an end-dial sequence
  1040. ;
  1041. ENDIAL:        MVI    M,CR        ;stuff end-of-line into buffer
  1042.         INX    H        ;followed by terminator
  1043.     IF VENTEL
  1044.         LDA    INTERN
  1045.         ORA    A
  1046.         JNZ    ENDL        ;DON'T NEED THIS FOR INTERNAL
  1047.         MVI    M,'>'        ;end bufffered command string
  1048.         INX    H        ;
  1049.     ENDIF
  1050. ENDL:        MVI    M,0
  1051.     IF HAYES
  1052.         LDA    TPULSE        ;get overlay's touch-tone flag
  1053.         STA    SMDIAL+3    ;put into string
  1054.     ENDIF
  1055.         LXI    H,SMDIAL    ;point to dialing string
  1056.         CALL    SMSEND        ;send it
  1057. WAITSM:        MVI    C,INMDM
  1058.         CALL    MEX        ;catch any output from the modem
  1059.         JNC    WAITSM        ;loop until no more characters
  1060. ;
  1061. ; The following loop waits for a result from the modem (up to
  1062. ; 60 seconds: you may change this value in the following line)
  1063. ;
  1064. RESULT:        MVI    C,60        ;<<== maximum time to wait for result
  1065. SMWLP:        PUSH    B
  1066.         MVI    B,1        ;check for a char, up to 1 sec wait
  1067.         MVI    C,TMDINP    ;do timed input
  1068.         CALL    MEX
  1069.         POP    B
  1070.         JNC    SMTEST        ;jump if modem had a char
  1071.         PUSH    B        ;no, test for control-c from console
  1072.         MVI    C,CHEKCC
  1073.         CALL    MEX
  1074.         POP    B
  1075.         JNZ    SMNEXT        ;if not, jump
  1076.         MVI    B,CR        ;yes, shut down the modem
  1077.         MVI    C,SNDCHR
  1078.         CALL    MEX
  1079.         MVI    A,3        ;return abort code
  1080.         RET
  1081. SMNEXT:        DCR    C        ;no
  1082.         JNZ    SMWLP        ;continue
  1083. ;
  1084. ; One minute with no modem response (or no connection)
  1085. ;
  1086. SMTIMO:        MVI    A,2        ;return timeout code
  1087.         RET
  1088. ;
  1089. ; Modem gave us a result, check it
  1090. ;
  1091. SMTEST:        ANI    7FH        ;ignore any parity
  1092.         CALL    SMANAL        ;test the result
  1093.         JC    RESULT        ;go try again if unknown response
  1094.         MOV    A,B        ;a=result 
  1095.         PUSH    PSW        ;save it
  1096. SMTLP:        MVI    C,INMDM        ;eat any additional chars from smartmodem
  1097.         CALL    MEX
  1098.         JNC    SMTLP        ;until 100ms of quiet time
  1099.         POP    PSW        ;return the code
  1100.         RET
  1101. ;
  1102. SMANAL:
  1103.     IF HAYES
  1104.         MVI    B,0        ;prep connect code
  1105.         CPI    'C'        ;"connect"?
  1106.         RZ
  1107.         CPI    '1'        ;numeric version of "connect"
  1108.         RZ
  1109.         CPI    '5'        ;or "connect 1200"
  1110.         RZ
  1111.         INR    B        ;prep busy code B=1
  1112.         CPI    'B'
  1113.         RZ
  1114.         INR    B        ;prep no connect msg B=2
  1115.         CPI    'N'        ;n=no connect
  1116.         RZ
  1117.         CPI    '3'        ;numeric version of "no connect"
  1118.         RZ
  1119.         MVI    B,4        ;prep modem error
  1120.         CPI    'E'        ;e=error
  1121.         RZ
  1122.         CPI    '4'        ;numeric version of "error"
  1123.         RZ
  1124.     ENDIF
  1125.  
  1126.     IF VENTEL
  1127.         MVI    B,0        ;prep connect code
  1128.         CPI    'O'        ;"connect"?
  1129.         RZ
  1130.         INR    B        ;prep busy code B=1
  1131.         CPI    'B'
  1132.         RZ
  1133.         INR    B        ;prep no connect msg B=2
  1134.         CPI    'N'        ;n=no connect
  1135.         RZ
  1136.         MVI    B,4        ;prep modem error
  1137.         CPI    'D'        ;e=error
  1138.         RZ
  1139.     ENDIF
  1140.  
  1141. ;
  1142. ; Unknown response, return carry to caller. But first,
  1143. ; flush the unknown response line from the modem.
  1144. ;
  1145. WTLF:        CPI    LF        ;linefeed?
  1146.         STC
  1147.         RZ            ;end if so
  1148.         MVI    C,INMDM        ;no. get next char
  1149.         CALL    MEX
  1150.         JNC    WTLF        ;unless busy, loop
  1151.         RET
  1152. ;
  1153. ; Following routine disconnects the modem using smartmodem
  1154. ; codes. All registers are available for this function.
  1155. ; Nothing returned to caller.
  1156. ;
  1157. ;
  1158. DISCON:
  1159.     IF HAYES
  1160.         MVI    B,20
  1161.         MVI    C,TIMER        ;wait 2 seconds
  1162.         CALL    MEX
  1163.         LXI    H,SMATN        ;send '+++'
  1164.         CALL    SMSEND
  1165.         MVI    B,20        ;wait 2 more seconds
  1166.         MVI    C,TIMER
  1167.         CALL    MEX
  1168.         LXI    H,SMDISC    ;send 'ATH'
  1169.         CALL    SMSEND
  1170.         MVI    B,1        ;wait 1 second
  1171.         MVI    C,TIMER
  1172.         CALL    MEX
  1173.     ENDIF
  1174.         RET
  1175. ;
  1176. ; Smartmodem utility routine: send string to modem
  1177. ;
  1178. SMSEND:        MVI    C,SNDRDY    ;wait for modem ready
  1179.         CALL    MEX
  1180.         JNZ    SMSEND
  1181.         MOV    A,M        ;fetch next character
  1182.         INX    H
  1183.         ORA    A        ;end?
  1184.         RZ            ;done if so
  1185.         MOV    B,A        ;no, position for sending
  1186.         MVI    C,SNDCHR    ;nope, send the character
  1187.         CALL    MEX
  1188.         JMP    SMSEND
  1189. ;
  1190.     ENDIF
  1191. ;
  1192. ;    Data area
  1193. ;
  1194. EOSMSG:        DB    1BH,'Y$'        ;clear-to-end-of-screen
  1195. CLSMSG:        DB    1BH,'*$'        ;clear-screen-home-cursor
  1196. ;
  1197. ; Default UART parameters in the following table
  1198. ;
  1199. REG0:        DB    00011000B    ;Reset channel A
  1200. REG3:        DB    11000001B    ;Enable receive at 8 bits/char
  1201. REG4:        DB    01000100B    ;No parity, 1 stop bit, clock X16
  1202. REG5:        DB    01101010B    ;Enable transmit at 8 bits/char
  1203. ;
  1204. SETEMS:        DB    CR,LF,'SET command error',CR,LF,'$'
  1205. ;
  1206.     IF HAYES
  1207. MONMSG:        DB    'ATM0',CR,0
  1208. NDELAY:        DB    15        ;delay-time in seconds
  1209. DL15MS:        DB    'ATS7=15',CR,0
  1210. DL30MS:        DB    'ATS7=30',CR,0
  1211. DL45MS:        DB    'ATS7=45',CR,0
  1212. DL60MS:        DB    'ATS7=60',CR,0
  1213. MODMSG:        DB    'ATS0=0',CR,0
  1214. SMATN:        DB    '+++',0
  1215. SMDISC:        DB    'ATH',CR,0
  1216. SMDIAL:        DB    'ATDT '
  1217.     ENDIF
  1218.  
  1219.     IF    VENTEL
  1220. SMDIAL:        DB    '<K'
  1221.     ENDIF
  1222.  
  1223. DIALBF:        DS    52        ;2* 24 char max, + CR + NULL + slop
  1224. DIALPT:        DS    2        ;dial position pointer
  1225.  
  1226. ;
  1227. ;
  1228. ;
  1229. ;    SET command -- master command table
  1230. ;
  1231. CMDTBL:        DB    '?'+80H        ;"set ?"
  1232.         DW    STSHOW        ;
  1233.         DB    'BAU','D'+80H    ;"set baud"
  1234.         DW    STBAUD        ;
  1235.         DB    'PARIT','Y'+80H    ;"set parity"
  1236.         DW    STPRTY        ;
  1237.         DB    'STOPBIT','S'+80H    ;"set stopbits"
  1238.         DW    STSTOP        ;
  1239.         DB    'LENGT','H'+80H    ;"set length"
  1240.         DW    STBITS        ;
  1241.         DB    'POR','T'+80H    ;"set port for modem"
  1242.         DW    STPORT
  1243.         DB    'MODE','M'+80H    ;set modem as internal or external
  1244.         DW    STMDM
  1245. ;
  1246.     IF HAYES
  1247.         DB    'MONITO','R'+80H;"set monitor"
  1248.         DW    STSPKR
  1249.         DB    'DELA','Y'+80H    ;"set delay"
  1250.         DW    STDLY
  1251.         DB    'MOD','E'+80H    ;"set mode"
  1252.         DW    STMODE
  1253.         DB    'DIA','L'+80H    ;"set dial"
  1254.         DW    SETDIA
  1255.     ENDIF
  1256. ;
  1257.         DB    0        ;<<== end of CMDTBL
  1258. ;
  1259. ;    SET BAUD command table
  1260. ;
  1261. BDTBL:        DB    '30','0'+80H    ;"set baud 300"
  1262.         DW    0001H        ;
  1263.         DB    '60','0'+80H    ;"set baud 600"
  1264.         DW    0003H        ;
  1265.         DB    '120','0'+80H    ;"set baud 1200"
  1266.         DW    0005H        ;
  1267.         DB    '240','0'+80H    ;"set baud 2400"
  1268.         DW    0006H        ;
  1269.         DB    '480','0'+80H    ;"set baud 4800"
  1270.         DW    0007H        ;
  1271.         DB    '960','0'+80H    ;"set baud 9600"
  1272.         DW    0008H        ;
  1273.         DB    0        ;<<== end of baudrate table
  1274. ;
  1275. ;    PBAUD baudrate generator lookup table
  1276. ;
  1277. BDTBL2:        DB    0H        ;110 baud (not supported)
  1278.         DB    28H        ;300 baud
  1279.         DB    0        ;450 baud (not supported)
  1280.         DB    4FH        ;600 baud
  1281.         DB    0        ;710 baud (not supported)
  1282.         DB    28H        ;1200 baud
  1283.         DB    14H        ;2400 baud
  1284.         DB    0AH        ;4800 baud
  1285.         DB    5H        ;9600 baud
  1286.         DB    0H        ;19200 baud (not supported)
  1287. ;
  1288. ;    Table of SHOW subroutine addresses
  1289. ;
  1290. SHOTBL:        DW    SHBAUD        ;show baud rate
  1291.         DW    SHPRTY        ;show parity setting
  1292.         DW    SHSTOP        ;show no. of stop bits
  1293.         DW    SHBITS        ;show bits/character
  1294.         DW    SHPORT        ;show port address
  1295. ;
  1296.     IF HAYES
  1297.         DW    SHSPKR        ;show modem speaker status
  1298.         DW    SHDLY        ;show hangup delay
  1299.         DW    SHMODE        ;show answer or originate
  1300.         DW    SHDIAL        ;show pulse or tone
  1301.     ENDIF
  1302. ;
  1303.         DW    0        ;<<== end of show address list
  1304. ;
  1305. ;    SET PARITY command table
  1306. ;
  1307. PARTBL:        DB    'OF','F'+80H    ;"set parity off"
  1308.         DW    PROFF
  1309.         DB    'EVE','N'+80H    ;"set parity even"
  1310.         DW    PREVEN
  1311.         DB    'OD','D'+80H    ;"set parity odd"
  1312.         DW    PRODD
  1313.         DB    0        ;<<== end of parity table
  1314. ;
  1315. ;    SET STOPBITS command table
  1316. ;
  1317. STPTBL:        DB    '1'+80H        ;"set stop 1"
  1318.         DW    STOP01
  1319.         DB    '2'+80H        ;"set stop 2"
  1320.         DW    STOP02
  1321.         DB    '1.','5'+80H    ;"set stop 1.5"
  1322.         DW    STOP15
  1323.         DB    0        ;<<== End of table
  1324. ;
  1325. ;    SET PORT command table
  1326. ;
  1327. PORTBL:        DB    'J','5'+80H    ;"set J5"
  1328.         DW    PORTJ5
  1329.         DB    'J','6'+80H    ;"set J6"
  1330.         DW    PORTJ6
  1331.         DB    0        ;<<== End of stop-bits table
  1332. ;
  1333. MDMTBL:        DB    'EX','T'+80H    ;"EXTERANL MODEM"
  1334.         DW    EXTMDM
  1335.         DB    'IN','T'+80H    ;"INTERNAL MODEM"
  1336.         DW    INTMDM
  1337.         DB    0        ;<<== End of table
  1338.  
  1339. ;
  1340. ;    SET LENGTH command table
  1341. ;
  1342. BITTBL:        DB    '5'+80H        ;"set bits 5"
  1343.         DW    BIT5
  1344.         DB    '6'+80H        ;"set bits 6"
  1345.         DW    BIT6
  1346.         DB    '7'+80H        ;"set bits 7"
  1347.         DW    BIT7
  1348.         DB    '8'+80H        ;"set bits 8"
  1349.         DW    BIT8
  1350.         DB    0        ;<<== end of bpc table
  1351. ;
  1352.     IF HAYES
  1353. ;
  1354. ;    SET MONITOR command table
  1355. ;
  1356. MONTBL:        DB    'O','N'+80H    ;"set monitor on"
  1357.         DW    0001H
  1358.         DB    'OF','F'+80H    ;"set monitor off"
  1359.         DW    0000H
  1360.         DB    0        ;<<== end of monitor table
  1361. ;
  1362. ;    SET DELAY command table
  1363. ;
  1364. DLYTBL:        DB    '1','5'+80H    ;"set delay 15"
  1365.         DW    STDL15
  1366.         DB    '3','0'+80H    ;"set delay 30"
  1367.         DW    STDL30
  1368.         DB    '4','5'+80H    ;"set delay 45"
  1369.         DW    STDL45
  1370.         DB    '6','0'+80H    ;"set delay 60"
  1371.         DW    STDL60
  1372.         DB    0        ;<<== end of delay table
  1373. ;
  1374. ;    SET MODE command table
  1375. ;
  1376. MODTBL:        DB    'ORI','G'+80H    ;"set mode orig"
  1377.         DW    0000H
  1378.         DB    'ANSWE','R'+80H    ;"set mode answer"
  1379.         DW    0001H
  1380.         DB    0        ;<<== end of mode table
  1381. ;
  1382. ;    SET DIAL command table
  1383. ;
  1384. DIALTB:        DB    'TON','E'+80H    ;"set dial tone"
  1385.         DW    0054H
  1386.         DB    'PULS','E'+80H    ;"set dial pulse"
  1387.         DW    0050H
  1388.         DB    0        ;<<== end of dial table
  1389.     ENDIF
  1390. ;
  1391.     END
  1392.  
  1393.  
  1394.  
  1395. ;
  1396. BITTBL:        DB    '5'+80H        ;"set bits 5"
  1397.         DW    BIT5
  1398.         DB    '6'+80H        ;"set bits 6"
  1399.         DW    BIT6
  1400.         DB    '7'+80H        ;"set bits 7"
  1401.         DW    B