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-II13.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  20KB  |  576 lines

  1. ;MXO-II13.ASM-- InterSysytems VIO and H-Z19/29/49 file for MEX.  06/02/85
  2. ;
  3. ; This is a MEX overlay used to configure MEX for a specific hardware set-up.
  4. ; This file places particular emphasis on using the InterSystems VIO with
  5. ; the 2651 PCI and the H-Z19.  Much of the information contained here is
  6. ; not in the main file.  If you're not using the above named equipment,
  7. ; some of the routines here may give you some hints for your MEX patch.
  8. ;
  9. ; Use the "SET" command to change baud rate when desired.
  10. ;
  11. ; Edit this file for your preferences then follow the "TO USE:" example
  12. ; shown below.
  13. ;
  14. ;
  15. ;    TO USE: First edit this file filling in answers for your own
  16. ;        equipment.  Then assemble with ASM.COM or equivalent
  17. ;        assembler. Then use MLOAD to overlay the the results
  18. ;        of this program to the original .COM file.
  19. ;
  20. ;
  21. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  22. ; 06/02/85 - Added J-Cat dial/hangup routines   - Len Moskowitz
  23. ; 06/08/84 - Changed to MEX labels MXO-II12.ASM - Len Moskowitz
  24. ; 06/04/84 - Changed to VIO/Z19 - MXO-II11.ASM  - Len Moskowitz
  25. ; 05/23/84 - Corrected clear-screen error    - Biff Bueffel
  26. ; 05/19/84 - Converted for MEX10 - MXO-H811.ASM    - Biff Bueffel
  27. ; 11/11/83 - Renamed to M7H8-1.ASM, no changes    - Irv Hoff
  28. ; 07/27/83 - Renamed to work with MDM712    - Irv Hoff
  29. ; 07/01/83 - Revised to work with MDM711    - Irv Hoff
  30. ; 06/22/83 - Revised to work with MDM710    - Irv Hoff
  31. ; 05/27/83 - Revised to work with MDM709    - Irv Hoff
  32. ; 05/15/83 - Revised to work with MDM708    - Irv Hoff
  33. ; 04/17/83 - Revised to work with MDM707    - Irv Hoff
  34. ; 04/04/83 - Updated to work with MDM706    - Irv Hoff
  35. ; 02/27/83 - Updated to work with MDM705    - Irv Hoff
  36. ; 02/17/83 - Updated to work with MDM704    - Irv Hoff
  37. ; 02/07/83 - Updated to work with MDM703    - Irv Hoff
  38. ; 01/27/83 - Updated to work with MDM702    - Irv Hoff
  39. ; 01/10/83 - Updated to work with MDM701    - Irv Hoff
  40. ; 10/03/82 - First version of this file
  41. ;
  42. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  43. ;
  44. BELL:        EQU    07H        ;bell
  45. CR:        EQU    0DH        ;carriage return
  46. ESC:        EQU    1BH        ;escape
  47. LF:        EQU    0AH        ;linefeed
  48. ;
  49. YES:        EQU    0FFH
  50. NO:        EQU    0
  51. ;
  52. ;
  53. ; VIO base address and port offsets. Set PORT to either PORTA or PORTB
  54. ;
  55. VIOBASE        EQU    0        ;set this to the base address of
  56.                     ; your VIO board
  57. PORTA        EQU    0        ;serial port A is at base+0
  58. PORTB        EQU    4        ;serial port B is at base+4
  59. PORT        EQU    VIOBASE+PORTB    ;We use serial port B for the modem    
  60. ;
  61. ;
  62. MODDAT:        EQU    PORT        ;data port for VIO
  63. MODCT1:        EQU    PORT+1        ;status port for VIO
  64. MDRCVB:        EQU    02        ;bit to test for received data
  65. MDRCVR:        EQU    02        ;modem receive ready
  66. MDSNDB:        EQU    01        ;bit to test for ready to send
  67. MDSNDR:        EQU    01        ;modem send ready bit
  68. ;
  69. ; MEX service processor stuff.  Use instead of BDOS calls.  More detail
  70. ; in PM overlay.
  71. ;
  72. MEX    EQU    0D00H        ;address of the service processor
  73. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  74. TIMER    EQU    254        ;delay 100ms * reg B
  75. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  76. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  77. SNNDRDY    EQU    251        ;test for modem-send ready
  78. RCVRDY    EQU    250        ;test for modem-receive ready
  79. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  80. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  81. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  82. PARSFN    EQU    246        ;parse filename from input stream
  83. BDPARS    EQU    245        ;parse baud-rate from input stream
  84. SBLANK    EQU    244        ;scan input stream to next non-blank
  85. EVALA    EQU    243        ;evaluate numeric from input stream
  86. LKAHED    EQU    242        ;get nxt char w/o removing from input
  87. GNC    EQU    241        ;get char from input, cy=1 if none
  88. ILP    EQU    240        ;inline print
  89. DECOUT    EQU    239        ;decimal output
  90. PRBAUD    EQU    238        ;print baud rate
  91. ;
  92. PRINT    EQU    9        ;BDOS print-string function
  93.  
  94. ;
  95. ; modem control equates
  96. ;
  97.  
  98. offonhookport    equ    08h    ;I/O port used to command OHK signal
  99. onhook      equ    0feh    ;mask used reset OHK to 0. All bits set to 1
  100.                 ; except the bit that controls OHK
  101. offhook     equ    01h    ;mask used to set OHK to 1
  102. milliconstant    equ    165    ;delay constant for millisecond delay loop.
  103.                 ; correct for 4 megaHertz Z80A.  halve it
  104.                 ; for 2 megaHertz cpu or adjust per your
  105.                 ; cpu requirements.  a good way to check how
  106.                 ; accurate it is, is to set the three second 
  107.                 ; delay, after the phone is taken off hook, 
  108.                 ; to 60 seconds and time it carefully, and then
  109.                 ; adjust this constant.
  110. cardetectport    equ    05h    ;I/O port used to read CAR signal
  111. carriermask    equ    80h    ;mask used to check carrier detect bit. if this
  112.                 ; bit is a zero, the carrier was detected.
  113. length        equ    25    ;the maximum number of digits allowed in a 
  114.                 ; phone number plus a null
  115. portdefault    equ    00h    ;you might use a port that controls other
  116.                 ; things too. since we don't want to disturb
  117.                 ; them, store the default setting for the port,
  118.                 ; with OHK set to zero, here
  119. dialtonewait    equ    3    ;number of seconds we wait for a dial tone
  120. carrierwait    equ    15    ;number of seconds we wait for a carrier
  121.  
  122. ;    This section has logicals.
  123.  
  124. true        equ    0ffh        ;true
  125. false        equ    0        ;false
  126.  
  127.  
  128. ;
  129.         ORG    100H
  130. ;
  131. ; Change the clock speed if needed, to match your system
  132. ;
  133.         DS    3    ;(for  "JMP   START" instruction)
  134. ;
  135. PMODEM:        DB    NO    ;not used by MEX            103H
  136. SMODEM:        DB    NO    ;not used by MEX            104H
  137. TPULSE:        DB    'T'    ;T=touch, P=pulse (Smartmodem-only)    105H
  138. CLOCK:        DB    40    ;clock speed in MHz x10, 25.5 MHz max.    106H
  139.                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  140. MSPEED:        DB    1    ;0=110 1=300 2=450 3=600 4=710 5=1200    107H
  141.                 ;6=2400 7=4800 8=9600 9=19200 default
  142. BYTDLY:        DB    5    ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108H
  143.                 ;default time to send character in ter-
  144.                 ;minal mode file transfer for slow BBS.
  145. CRDLY:        DB    5    ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  146.                 ;default time for extra wait after CRLF
  147.                 ;in terminal modNe file transfer
  148. COLUMS:        DB    5    ;number of DIR columns shown        10AH
  149. SETFL:        DB    YES    ;yes=user-added Setup routine        10BH
  150. SCRTST:        DB    YES    ;Cursor control routine         10CH
  151.         DB    YES    ;spare
  152. BAKFLG:        DB    NO    ;yes=change any file same name to .BAK    10EH
  153. CRCDFL:        DB    YES    ;yes=default to CRC checking        10FH
  154.                 ;no=default to Checksum checking
  155. TOGCRC:        DB    YES    ;yes=allow toggling of CRC to Checksum    110H
  156. CVTBS:        DB    NO    ;yes=convert backspace to rub        111H
  157. TOGLBK:        DB    YES;    ;yes=allow toggling of bksp to rub    112H
  158. ADDLF:        DB    NO    ;no=no LF after CR to send file in    113H
  159.                 ;terminal mode (added by remote echo)
  160. TOGLF:        DB    YES    ;yes=allow toggling of LF after CR    114H
  161. TRNLOG:        DB    NO    ;yes=allow transmission of logon    115H
  162.                 ;write logon sequence at location LOGON
  163. SAVCCP:        DB    YES    ;yes=do not overwrite CCP        116H
  164. LOCNXT:        DB    NO    ;yes=local command if EXTCHR precedes    117H
  165.                 ;no=external command if EXTCHR precedes
  166. TOGLOC:        DB    YES    ;yes=allow toggling of LOCONEXTCHR    118H
  167. LSTTST:        DB    NO    ;yes=printer available on printer port    119H
  168. XOFTST:        DB    YES    ;yes=checks for XOFF from remote while    11AH
  169.                 ;sending a file in terminal mode
  170. XONWT:        DB    NO    ;yes=wait for XON after CR while    11BH
  171.                 ;sending a file in terminal mode
  172. TOGXOF:        DB    YES    ;yes=allow toggling of XOFF checking    11CH
  173. IGNCTL:        DB    YES    ;yes=CTL-chars above ^M not displayed    11DH
  174. EXTRA1:        DB    0    ;for future expansion            11EH
  175. EXTRA2:        DB    0    ;for future expansion            11FH
  176. BRKCHR:        DB    '@'-40H    ;^@ = Send a 300 ms. break tone        120H
  177. NOCONN:        DB    'N'-40H    ;^N = Disconnect from the phone line    121H
  178. LOGCHR:        DB    'L'-40H    ;^L = Send logon            122H
  179. LSTCHR:        DB    'P'-40H    ;^P = Toggle printer            123H
  180. UNSVCH:        DB    'R'-40H    ;^R = Close input text buffer        124H
  181. TRNCHR:        DB    'T'-40H ;^T = Transmit file to remote        125H
  182. SAVCHR:        DB    'Y'-40H    ;^Y = Open input text buffer        126H
  183. EXTCHR:        DB    '^'-40H    ;^^ = Send next character        127H
  184. ;
  185. ;
  186. PRATE:        DS    2    ;PMMI equates (see PMMI overlay)    128H
  187. ;
  188. INCTL1:        IN    MODCT1         ;in modem control port        12AH
  189.         RET
  190.         DS    7        ;spares
  191. OTDATA:        OUT    MODDAT         ;out modem data port        134H
  192.         RET
  193.         DS    7
  194. INPORT:        IN    MODDAT        ;in modem data port        13EH
  195.         RET
  196.         DS    7
  197. MASKR:        ANI    MDRCVB ! RET    ;bit to test for receive ready    148H
  198. TESTR:        CPI    MDRCVR ! RET    ;value of rcv. bit when ready    14BH
  199. MASKS:        ANI    MDSNDB ! RET    ;bit to test for send ready    14EH
  200. TESTS:        CPI    MDSNDR ! RET    ;value of send bit when ready    151H
  201.         DS    12        ;unused                154H
  202. ;
  203. ;
  204.         DS    2        ;Not used by MEX        160H
  205. DIALV        JMP    DIAL        ;Dials digit             162H
  206. DISCV        JMP    HANGUP        ;Disconnects modem         165H
  207. GOODBV:        JMP    GOODBYE        ;called before exit to CP/M    168H
  208. INMODV:        JMP    INITMOD        ;go to user written routine    16BH
  209. NEWBDV:        JMP    NEWBAUD        ;Change baudrate        16EH
  210. NOPARV:        DS    3        ;set modem for no-parity    171H
  211. PARITV:        DS    3        ;set modem parity        174H
  212. SETUPV:        JMP    SETCMD        ;overlay implemented function    177H
  213. SPMENV:        DS    3        ;Not used by MEX        17AH
  214. VERSNV:        JMP    SYSVER        ;overlay's voice in sign-on    17DH
  215. BREAKV:        DS    3        ;send break (not implemented)    180H
  216. ;
  217. ;
  218. ; These six lines are an artifact of MDMXXX.  They are not used with MEX.
  219. ;
  220. ILPRTV:        DS    3    ;replace with MEX function 9        183H
  221. INBUFV:        DS    3    ;replace with MEX function 10        186H
  222. ILCMPV:        DS    3    ;replace with table lookup funct. 247    189H
  223. INMDMV:        DS    3    ;replace with MEX function 255        18CH
  224. NXSCRV:        DS    3    ;not supported by MEX             18FH
  225. TIMERV:        DS    3    ;replace with MEX function 254        192H
  226. ;
  227. ;
  228. ; The following clears the screen for the H19/29/49 terminal.
  229. ; Each of the two routines must be exactly 9 bytes long.
  230. ;
  231. CLREOS:        LXI    D,EOSMSG
  232.         MVI    C,PRINT
  233.         CALL    MEX
  234.         RET            
  235. ;
  236. CLRSCRN:    LXI    D,CLSMSG
  237.         MVI    C,PRINT
  238.         CALL    MEX
  239.         RET            
  240. ;
  241. ;
  242. ;  End of the fixed format area.
  243. ;
  244. ;
  245. SYSVER:        MVI    C,ILP
  246.         CALL    MEX
  247.         DB    'Version for InterSystems VIO and Z19/29/49'
  248.         DB    CR,LF,0
  249.         RET
  250. ;.....
  251. ;
  252. ;
  253. ;-----------------------------------------------------------------------
  254. ;
  255. ; NOTE:  You can change the SYSVER message to be longer or shorter.  The
  256. ;     end of your last routine should terminate by 0B00H (601 bytes
  257. ;     available after start of SYSVER) if using the Hayes Smartmodem
  258. ;     or by address 0D00H (2659 bytes) otherwise.
  259. ;
  260. ;-----------------------------------------------------------------------
  261. ;
  262. ; This routine can be used to make any necessary changes before exiting
  263. ; back to CP/M.  If you share a VIO port between a printer and a modem,
  264. ; you can use this routine to change the baud rate and other port 
  265. ; characteristics back to what the printer requires.
  266. ;
  267. GOODBYE:  RET
  268. ;.....
  269. ;
  270. ;
  271. ; The following is used to initialize the VIO 2651 Modem I/O port
  272. ;
  273. INITMOD:  call  clrscrn        ;added 6/2/85
  274.       MVI    A,1        ;default transfer speed to 300 baud
  275.       STA    MSPEED
  276.       MVI    A,04EH        ;Mode Register 1 word - 
  277.                 ; 1 stop bit, no parity, 8 bits, Async * 16
  278.       OUT    PORT+2        ;2651 mode port address
  279. MODREG2:  MVI    A,35H        ;Mode Register 2 word -
  280.                 ; internal clocks, 300 Baud
  281.       OUT    PORT+2        ;2651 mode port address
  282.       MVI    A,27H        ;Command Register word - 
  283.                 ; normal operation, RTS* forced low, reset
  284.                 ; error normal, force break normal, receive
  285.                 ; control enabled, DTR* forced low, transmit
  286.                 ; control enabled
  287.       OUT    PORT+3        ;2651 command port address
  288.       RET
  289. ;.....
  290. ;
  291. ;
  292. ; The following routine changes the baud rate for the VIO with the SET
  293. ; command.
  294. ;
  295. ;
  296. SETCMD:      MVI    C,SBLANK    ;Any arguments?
  297.       CALL    MEX
  298.       JC    TELL        ;If not, go display baud
  299.       LXI    D,CMDTBL
  300.       MVI    C,LOOKUP
  301.       CALL    MEX        ;Parse argument
  302.       PUSH    H        ;Save any parsed argument addrs on stack
  303.       RNC            ;If we have one, return to it
  304.       POP    H        ;Oops, input not found in table
  305.       MVI    C,ILP
  306.       CALL    MEX        ;Tell user input not valid
  307.       DB    CR,LF,'Only 300 or 1200 allowed on SET command',CR,LF,0
  308.       RET
  309. ;
  310. CMDTBL:      DB    '30','0'+80H
  311.       DW    OK300
  312.       DB    '120','0'+80H
  313.       DW    OK1200
  314.       DB    0
  315. ;
  316. TELL:      MVI    C,ILP
  317.       CALL    MEX        ;Print current baud rate
  318.       DB    CR,LF,'Baud rate is now: ',0
  319.       LDA    MSPEED
  320.       MVI    C,PRBAUD
  321.       CALL    MEX
  322.       RET
  323. ;
  324. ;
  325. ;
  326. OK300:      MVI    A,1        ;MSPEED 300 baud value
  327.       LXI    H,BD300        ;get pointer to 300 baud parameter in HL
  328.       JMP    LOADBD        ;go load them
  329. ;
  330. OK1200:      MVI    A,5        ;MSPEED 1200 baud value
  331.       LXI    H,BD1200    ;get pointer to 1200 baud parameter in HL
  332. ;
  333. LOADBD:      STA    INITMOD+1    ;store speed to show transfer time
  334.       MOV    A,M        ;get mode register 2 word for new baud rate
  335.       STA    MODREG2+1    ;store in INITMOD
  336.       JMP    INITMOD        ;reinitialize VIO 2651
  337. ;
  338. ;
  339. NEWBAUD:  CPI    1
  340.       JZ    OK300
  341.       CPI    5
  342.       JZ    OK1200
  343.       RET
  344. ;
  345. ;
  346. ; Table of baud rate parameters
  347. ;
  348. BD300:      DB    35H
  349. BD1200:      DB    37H
  350. ;
  351. ;
  352. EOSMSG:      DB    ESC,'J',0,0,0,'$'              
  353. CLSMSG:      DB    ESC,'E',0,0,0,'$'
  354. ;
  355. ;*******
  356. ; DIAL *
  357. ;*******
  358. ;
  359. ; This routine dials the Novation J-Cat.  Mex starts the dial routine
  360. ; by calling this subroutine with a 254 (FE hex) in register A.  Each time 
  361. ; it is called again A has the next digit of the telephone number.  We
  362. ; store the numbers at "number" until the entire number is sent.
  363. ; Mex signals that it has sent the entire number by calling this subroutine 
  364. ; with a 255 (FF hex) in A.  Once the entire number has been received
  365. ; we take the phone off-hook, wait for a dial tone, and dial the number.
  366. ; if after 15 seconds we don't detect a carrier, we return to mex with a 2
  367. ; in A.  If a carrier is detected, we return with a 0 in A.  If he pressed
  368. ; control-c during the dial, we return immediately with a 3 in A.
  369.  
  370. dial:    cpi    0feh        ;see if MEX wants to start a call
  371.     jnz    dial0        ;jump if not
  372.     mvi    a,true        ;set the entry-in-progress flag
  373.     sta    entryinprogressflag    
  374.     lxi    h,number    ;initialize the pointer to the phone number
  375.     shld    numpointer
  376.     ret
  377. dial0:    cpi    0ffh        ;see if it's the end-dial code
  378.     jz    dial0a        ;jump if it is
  379.                 ;otherwise A must hold one digit of the phone
  380.                 ; number
  381.     mov    e,a        ;store the value Mex passed us via A in E
  382.     lda    entryinprogressflag    ;check and see if it's legal to be
  383.     cpi    true        ; here by seeing if the flag is set.
  384.     jz    dial00a        ;jump if we're legal
  385.     mvi    c,ilp        ;we're not legal. tell him that we've received
  386.     call    mex        ; a digit before a start-dial code
  387.     db    'We''ve got a problem.  I received a digit before getting'
  388.     db    cr,lf,'a "Start-dial" code (254).',0
  389.     mvi    a,3        ;make it look like a control-c abort to MEX
  390.     ret
  391. dial00a:mov    a,e        ;get the digit back in A
  392.     cpi    '9' + 1        ;make sure it's between 0 and 9
  393.     rnc            ;return if it's too big
  394.     sui    '0'
  395.     rc            ;return if it's too big
  396.     adi    '0'        ;restore it if it's ok
  397.     call    getnumber    ;get the next digit in the phone number from 
  398.                 ; MEX
  399.     ret
  400. dial0a:    lda    entryinprogressflag    ;see if we've received a "start-call"
  401.     cpi    true 
  402.     jz    dial0b        ;jump if we are in the middle of a call
  403.     mvi    c,ilp        ;tell him that we received an end-dial    code
  404.     call    mex        ; before a start-dial code
  405.     db    'We''ve got a problem.  I received an "End-dial" code (255)'
  406.     db    cr,lf,'before getting a "Start-dial" code (254).',0
  407.     mvi    a,3        ;make it look like a control-c abort to MEX
  408.     ret
  409. dial0b:    mvi    a,0        ;mark the end of the number
  410.     call    getnumber    ;store a null at the end of the number
  411.     lda    false
  412.     sta    entryinprogressflag    ;reset the flag
  413.     mvi    a,portdefault    ;get the default setting for the port we use
  414.     ori    offhook        ; to control OHK and set OHK to 1
  415.     out    offonhookport    ;take the phone off hook
  416.     mvi    c,ilp        ;tell him we're waiting 3 seconds
  417.     call    mex
  418.     db    cr,lf,'Waiting for a dial tone...',0
  419.     mvi    d,dialtonewait
  420. dial0c:    lxi    b,1000        ;wait 3 seconds for a dial tone
  421.         call    delay
  422.     call    keycheck    ;see if a key was pressed
  423.     dcr    d        ;decrement the wait counter
  424.     jnz    dial0c        ;jump if we haven't waited long enough
  425.     mvi    c,ilp
  426.     call    mex        ;tell him we're starting to dial
  427.     db    cr,lf,'Dialing...',0
  428.     lxi    h,number    ;point to the number he just typed
  429.     mov    a,m        ;load it into A and check if it's zero
  430. dial1    ora    a        ;set the flags. Z set to 1 means A is a zero.
  431.     jz    done        ;jump if we finished dialing
  432.     sui    '0'        ;otherwise, subtract out the ASCII offset
  433.     jnz    dial1a        ;check if it's zero. jump if it's not
  434.     mvi    a,10        ;it was zero, so convert it to ten
  435. dial1a    mov    e,a        ;keep the digit we're dialing in E
  436. dial2    mvi    a,portdefault    ;get the default setting for the port
  437.     ani    onhook        ;set OHK to 0 for 60 milliseconds
  438.     out    offonhookport
  439.     lxi    b,60
  440.     call    delay
  441.     mvi    a,portdefault    ;get the default setting again
  442.     ori    offhook        ;set OHK to 1 for 40 milliseconds
  443.     out    offonhookport
  444.     lxi    b,40
  445.     call    delay
  446.     dcr    e        ;decrement E. if E is zero go on to next digit
  447.     jnz    dial2        ;jump if it's not zero yet
  448.     lxi    b,900        ;it was zero, so wait for 700 to 900 
  449.     call    delay        ; milliseconds before we dial the next digit
  450.     call    keycheck    ;see if a key was pressed
  451.     inx    h        ;get the next digit
  452.     mov    a,m        ;put it in A
  453.     jmp    dial1        ;jump back to the zero check
  454. done    mvi    c,ilp
  455.     call    mex        ;print a crlf
  456.     db    cr,lf,0
  457.     mvi    d,carrierwait    ;wait for a carrier "carrierwait" seconds
  458. done1    lxi    b,1000        ;wait 1 second for a carrier
  459.     call    delay
  460.     call    carriercheck    ;see if we connected with a modem
  461.     jnz    yescarrier    ;jump if we connected
  462.     call    keycheck    ;see if a key was pressed
  463.     dcr    d
  464.     jnz    done1        ;jump if we haven't waited long enough
  465.     call    hangup        ;hangup the phone 
  466.     mvi    a,2        ;tell MEX we didn't detect a carrier
  467.     ret
  468.  
  469. yescarrier:mvi    a,0        ;tell MEX we detected a carrier
  470.     ret
  471.  
  472.  
  473. number:    ds    length
  474. entryinprogressflag db    0
  475. numpointer    ds    2
  476.  
  477. ;
  478. ;************
  479. ; GETNUMBER *
  480. ;************
  481. ;    Getnumber gets the telephone number we will dial from the user.
  482. ;    C holds the maximum number of characters to be accepted.
  483.  
  484. getnumber:lhld    numpointer        ;get the pointer to the next position
  485.                     ; to be loaded into the number storage
  486.                     ; location
  487.     mov    m,a            ;move the number MEX sent us to 
  488.                     ; storage
  489.     inx    h            ;increment the pointer to the storage
  490.     shld    numpointer        ;save it
  491.  
  492. ;
  493. ;***************
  494. ; CARRIERCHECK *
  495. ;***************
  496. ;
  497. ;     Check if we have a carrier.  Return with the zero flag set if not.
  498. ;
  499.  
  500. carriercheck:     in    cardetectport    ;check if a carrier was detected
  501.     ani    carriermask    ;mask off the "carrier detect" bit
  502.     ret
  503.  
  504. ;
  505. ;***********
  506. ; KEYCHECK *
  507. ;***********
  508. ;    See if he pressed control-c.  If yes, zero flag is set.
  509.  
  510. keycheck:push    d        ;save DE
  511.     push    h        ;save HL
  512.     mvi    c,chekcc    ;see if control-c was pressed
  513.     call    mex
  514.     pop    h        ;restore HL
  515.     pop    d        ;restore DE
  516.     rnz    
  517.     call    hangup
  518.     mvi    a,3        ;tell MEX we were aborted form the keyboard
  519.     pop    h        ;pop the normal return address and throw it
  520.                 ; away
  521.     ret            ;return to MEX instead
  522.  
  523. ;
  524. ;*********
  525. ; HANGUP *
  526. ;*********
  527. ;    Hangup puts the phone on hook in the strange way the J-Cat requires
  528. ;    to avoid going into self-test.
  529.  
  530. hangup:    mvi    a,portdefault    ;get the default settings again
  531.         ani     onhook        ;put the phone on hook (hang up) for 25 msec.
  532.         out     offonhookport
  533.         lxi     b,25
  534.         call    delay
  535.         mvi    a,portdefault    ;get the default setting again
  536.         ori     offhook        ;take the phone off hook for 20 milliseconds
  537.         out     offonhookport
  538.         lxi     b,20
  539.         call    delay
  540.         mvi    a,portdefault    ;get the default setting again
  541.         ani     onhook        ;put it on hook again for good this time
  542.         out     offonhookport
  543.     ret
  544.  
  545.  
  546. ;
  547. ;********
  548. ; DELAY *
  549. ;********
  550. ;    Delay is a  delay loop that last BC milliseconds.  Doesn't touch
  551. ;    DE and HL.
  552.  
  553. delay:    push    d        ;save DE and HL
  554.     push    h
  555.     inr    b        ;Set B to 1 higher, since we decrement it
  556.                 ; later before we test it
  557. delay1    lxi    d,milliconstant    ;load DE with the delay constant
  558. delay2    dcx    d        ;inner loop until DE goes to zero
  559.     mov    a,e
  560.     ora    d
  561.     jnz    delay2
  562.     dcr    c        ;middle loop until C goes to zero
  563.     jnz    delay1
  564.     dcr    b        ;outer loop until B goes to zero too
  565.     jnz    delay1
  566.     pop    h        ;restore HL and DE
  567.     pop    d
  568.     ret            ; and return
  569.  
  570. ;------------------------------------------------------------------
  571. ;
  572. ; NOTE:  MUST TERMINATE PRIOR TO 0B00H (with Smartmodem)
  573. ;
  574.       END
  575. ;
  576.