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 / ENTERPRS / CPM / SIGM / SIGMV800.ARK / MXM-C128.ASM < prev    next >
Assembly Source File  |  1986-02-01  |  18KB  |  810 lines

  1.  
  2.  
  3.  
  4.     TITLE    'Commodore Modem Overlay V1.0    19 Nov 85'
  5. ;
  6. $*MACRO        ; have MAC only display CODE not MACRO expansion
  7. ;
  8. ;    This overlay was created for the C128
  9. ;    by  Von Ertwine    19 Nov 85
  10. ;
  11. ; SYSTEM CONSTANTS
  12. ;
  13. mdm$tp    equ    0104h        ; 7    (1670 if set)
  14.                 ; 6    (1650 or 1660 if set)
  15.                 ; 5    (1660 if set)
  16.                 ; 4    (supports CD if clear)
  17.                 ; 3    (set if 1200 baud is supported)
  18.                 ; 2    (set if  600 baud is supported)
  19.                 ; 1    (set if  300 baud is supported)
  20.                 ; 0    (set if  110 baud is supported)
  21. TPULSE    EQU    0105h        ;TONE/PULSE FLAG IN MODEM OVERLAY
  22. MSPEED    EQU    0107h        ; current baud rate
  23. MDM$ST    EQU    012Ah        ; normal status call
  24. SHOWBD    EQU    012Eh        ; show current baud rate
  25. out$mdm    equ    0134h
  26. mask$s    equ    014eh
  27. test$s    equ    0151h
  28.  
  29.  
  30. DIALV    EQU    0162h        ;LOCATION OF DIAL VECTOR IN OVERLAY
  31. DISCV    EQU    0165h        ;LOCATION OF DISCONNECT VECTOR IN OVERLAY
  32. NEWBDV    EQU    016Eh        ;change baud rate (value in A)
  33.  
  34. DIALOC    EQU    0800h        ;DIALING CODE GOES HERE
  35. MEX    EQU    0D00h        ;"CALL MEX"
  36. SMINIT    equ    0d55h        ; modem init vector
  37. ssetv    equ    0d57h        ; sset cmd vector
  38. smexit    equ    0d59h        ; modem exit vector
  39.  
  40.     page
  41. ;
  42. ; FOLLOWING ARE FUNCTION CODES FOR THE MEX SERVICE CALL PROCESSOR
  43. ;
  44. INMDM    EQU    255        ;RETURN CHAR FROM MDM IN A, CY=NO CHR IN 100MS
  45. TIMER    EQU    254        ;DELAY 100MS * REG B
  46. TMDINP    EQU    253        ;B=# SECS TO WAIT FOR CHAR, CY=NO CHAR
  47. CHEKCC    EQU    252        ;CHECK FOR ^C FROM KBD, Z=PRESENT
  48. SNDRDY    EQU    251        ;TEST FOR MODEM-SEND READY
  49. RCVRDY    EQU    250        ;TEST FOR MODEM-RECEIVE READY
  50. SNDCHR    EQU    249        ;SEND A CHARACTER TO THE MODEM (AFTER SNDRDY)
  51. RCVCHR    EQU    248        ;RECV A CHAR FROM MODEM (AFTER RCVRDY)
  52. lookup    equ    247        ; table search
  53. parsfn    equ    246        ; parse filename from input stream
  54. bdpars    equ    245        ; parse baud-rate from input stream
  55. sblank    equ    244        ; scan input stream to next non-blank
  56. evala    equ    243        ; evaluate numeric from input stream
  57. lkahed    equ    242        ; get nxt char w/o removing from input
  58. gnc    equ    241        ; get char from input, cy=1 if none
  59. ilp    equ    240        ; inline print
  60. decout    equ    239        ; decimal output
  61. prbaud    equ    238        ; print baud rate
  62. ;
  63. ;
  64.  
  65. eom        equ    00H
  66. bell        equ    07H        ;bell
  67. lf        equ    0AH        ;linefeed
  68. cr        equ    0DH        ;carriage return
  69. esc        equ    1BH        ;escape
  70. ;
  71. no        equ    0
  72. yes        equ    not(no)
  73.  
  74.     page
  75.  
  76. XxD$config:    equ    0fd4Eh
  77. ;        bit 7    0=no parity    1=parity
  78. ;        bit 6    0=mark/space    1=odd/even
  79. ;        bit 5    0=space/even    1=mark/odd
  80. ;        bit 1    0=1 stop bit    1=2 stop bits
  81. ;        bit 0    0=7 data bits    1=8 data bits
  82.  
  83. RS232$status:    equ    XxD$config+1
  84. ;        bit 7    0=no data    1=send data
  85. ;        bit 6    1=sending data now
  86. ;        bit 5    1=recv queue active
  87. ;        bit 4    1=parity error
  88. ;        bit 3    1=framing error
  89. ;        bit 2    not used
  90. ;        bit 1    receiving data now
  91. ;        bit 0    data byte ready
  92.  
  93. xmit$data:    equ    RS232$status+1
  94. recv$data:    equ    xmit$data+1
  95. modrcvb        equ    01H        ; bit to test for receive
  96. modrcvr        equ    01H        ; value when receive ready
  97. modsndb:    equ    80H        ; bit to test for send
  98. modsndr:    equ    00H        ; value when send ready        
  99.  
  100. data$port$a    equ    0DD00h
  101. ;        bit 2    TxD Data (output)
  102.  
  103. data$port$b    equ    data$port$a+1
  104. data$port$b$dir    equ    data$port$b+2
  105. ;        bit 7    Data Set Ready (input)
  106. ;        bit 6    Clear to Send (input)
  107. ;        bit 5    Place Phone On Hook (active low output)
  108. ;        bit 4    Carrier Detect (active low input)
  109. ;        bit 3    Ring Indicator (active low input)
  110. ;        bit 2    Data Terminal Ready (active hi output)
  111. ;        bit 1    Request to Send (active hi output)
  112. ;        bit 0    Received Data (input)
  113.  
  114.     page
  115.  
  116. bit    macro    ?N,?R
  117.     db    0cbh,?N*8+?R+40h
  118.     endm
  119.  
  120. setb    macro    ?N,?R
  121.     db    0cbh,?N*8+?R+0C0h
  122.     endm
  123.  
  124. res    macro    ?N,?R
  125.     db    0cbh,?N*8+?R+80h
  126.     endm
  127.  
  128. @chk    macro    ?DD
  129.     if (?DD GT 7Fh) and (?DD LT 0FF80h)
  130.     'Displacement Error'
  131.     endif
  132.     endm
  133.  
  134. jr    macro    ?N
  135.     db    18h,?N-$-1
  136.     @chk    ?N-$
  137.     endm
  138. jrz    macro    ?N
  139.     db    28h,?N-$-1
  140.     @chk    ?N-$
  141.     endm
  142. jrnz    macro    ?N
  143.     db    20h,?N-$-1
  144.     @chk    ?N-$
  145.     endm
  146. jrc    macro    ?N
  147.     db    38h,?N-$-1
  148.     @chk    ?N-$
  149.     endm
  150. jrnc    macro    ?N
  151.     db    30h,?N-$-1
  152.     @chk    ?N-$
  153.     endm
  154.  
  155. inp    macro    ?R
  156.     db    0EDh,?R*8+40h
  157.     endm
  158.  
  159. outp    macro    ?R
  160.     db    0EDh,?R*8+41h
  161.     endm
  162.  
  163. exx    macro
  164.     db    0d9h
  165.     endm
  166.  
  167.     page
  168. ;
  169. ;
  170. ;
  171.     org    mdm$st
  172.     jmp    mdm$stat        ; default as 1670 and 1011A status
  173. ;    
  174.     org    dialv
  175.     jmp    dial            ; point system to dialer routine
  176. ;
  177.     org    discv
  178.     jmp    discon            ; point disconect to modem disconect
  179. ;
  180.     org    SMINIT
  181.     dw    init$mod        ; install modem init vector
  182. ;
  183.     org    ssetv
  184.     dw    do$sset            ; install SSET comand vector
  185. ;
  186. ;
  187. ;
  188.     org    dialoc
  189. do$sset:
  190.     mvi    c,sblank
  191.     call    mex            ; any arguments?
  192.     jrc    disp$options
  193.     lxi    d,opt$tbl
  194.     mvi    c,lookup
  195.     call    mex
  196.     jrnc    ipchl
  197. disp$options:
  198.     call    initmod
  199.     mvi    c,ilp
  200.     call    mex
  201.     db    cr,lf,'Select 1011A, 1650, 1670, 1660 or'
  202.     db    ' 1660CD (if Carrier Detect is supported)'
  203.     db    cr,lf,eom
  204.     ret
  205.  
  206. ipchl:
  207.     pchl
  208.  
  209.     page
  210.  
  211. opt$tbl:
  212.     db    '1011','A'+80h
  213.     dw    set$1011
  214.     db    '165','0'+80h
  215.     dw    set$1650
  216.     db    '1660C','D'+80h
  217.     dw    set$1660cd
  218.     db    '166','0'+80h
  219.     dw    set$1660
  220.     db    '167','0'+80h
  221.     dw    set$1670
  222.     db    0
  223.  
  224.  
  225. set$1670:
  226.     mvi    a,10001010b
  227.     db    21h            ; lxi h,(mvi a,0Fh)
  228. set$1011:
  229.     mvi    a,00001111b
  230.     db    21h            ; lxi h,(mvi a,42h)
  231. set$1650:
  232.     mvi    a,01000010b
  233.     db    21h            ; lxi h,(mvi a,72h)
  234. set$1660:
  235.     mvi    a,01110010b
  236.     db    21h            ; lxi h,(mvi a,62h)
  237. set$1660cd:
  238.     mvi    a,01100010b
  239.     sta    mdm$tp
  240.  
  241.     page
  242.  
  243.     mvi    c,sblank
  244.     call    mex            ; any arguments?
  245.     jrc    no$parm
  246.     ani    01011111b        ; make upper case
  247.     cpi    'T'            ; user select Tone?
  248.     jrz    save$T$P        ; yes, go set it
  249.     cpi    'P'            ; no, user select Pluse
  250.     jrnz    no$parm            ; no, use old parameter
  251. save$T$P:                ; yes, select Pluse
  252.     sta    TPULSE            ; change to PLUSE or TONE
  253. no$parm:
  254.     lda    mspeed
  255.     cpi    0            ; 110 baud
  256.     jrz    ck$110
  257.     cpi    1            ; 300 baud
  258.     jrz    ck$300
  259.     cpi    3            ; 600 baud
  260.     jrz    ck$600
  261.     cpi    5            ; 1200 baud
  262.     jrnz    change$baud
  263.  
  264.     mvi    a,00001000b
  265.     db    21h            ; lxi h,mvi a,4
  266. ck$600:
  267.     mvi    a,00000100b
  268.     db    21h            ; lxi h,mvi a,2
  269. ck$300:
  270.     mvi    a,00000010b
  271.     db    21h            ; lxi h,mvi a,1
  272. ck$110:
  273.     mvi    a,00000001b
  274.  
  275.     lxi    h,mdm$tp        ; point to allowed rates
  276.     ana    m            ; is baud rate allowed for
  277.     jrnz    initmod            ; ..this modem ? yes, go do it
  278.  
  279.     page
  280. ;
  281. ;
  282. ;
  283. change$baud:                ; no, adjust to lowest allowed rate
  284.     mvi    a,-1
  285. try$next:
  286.     inr    a
  287.     sta    mspeed
  288.     call    NEWBDV            ; change the baud rate 
  289.     lda    mspeed            ; ..(Cy set if bad rate)
  290.     jrc    try$next
  291.     lxi    h,showbd        ; tell user the new baud rate
  292.     push    h            ; ..after we are done
  293. ;
  294. ; C128 initialization -- set baudrate.
  295. ;
  296. INITMOD:
  297.     mvi    c,ilp
  298.     call    mex
  299.     db    cr,lf,'Current Device type is: ',eom
  300.     call    show$device
  301.     shld    MDM$ST+1
  302.     mvi    c,ilp
  303.     call    mex
  304.     db    cr,lf,eom
  305.  
  306.     lxi    b,data$port$b$dir
  307.     lda    mdm$tp            ; get current modem type
  308.     ani    40h            ; 1650, 1660 modem?
  309.     jrz    init$no$dial
  310.     mvi    a,26h            ; set data dir to output
  311.     outp    a
  312.  
  313.     lda    on$hook$flag        ; =FF if on hook
  314.     ora    a
  315.     cnz    phone$on$hook        ; hang-up the phone (only if on hook)
  316.     mvi    c,low(data$port$b)
  317.     inp    a
  318. init$no$dial:
  319.     ori    6            ; set DTR and CTS (active hi)
  320.     outp    a
  321.     ret
  322.  
  323.     page
  324. ;
  325. ;
  326. ;
  327. show$device:
  328.     mvi    c,ilp
  329.     lxi    h,mdm$stat
  330.     lda    mdm$tp            ; get current type
  331.     bit    7,a
  332.     jrz    test$1660$50
  333.     lda    tpulse
  334.     sta    msg$tpulse
  335.     call    mex
  336.     db    '1670 '
  337. msg$tpulse:
  338.     db    'x',eom
  339.     ret
  340. ;
  341. test$1660$50:
  342.     bit    6,a
  343.     jrnz    test$1650
  344.     call    mex
  345.     db    '1011A - RS232 interface',eom
  346.     ret
  347. ;
  348. test$1650:
  349.     lxi    h,mdm$stat$1650$60
  350.     bit    5,a
  351.     jrnz    show$1660
  352.     call    mex
  353.     db    '1650',eom
  354.     ret
  355. ;
  356. show$1660:
  357.     bit    4,a
  358.     jrnz    show$1660$no$CD
  359.     call    mex
  360.     db    '1660 with CD',eom
  361.     ret
  362. ;
  363. show$1660$no$CD:
  364.     call    mex
  365.     db    '1660 with-out CD',eom
  366.     ret
  367.  
  368.     page
  369. ;
  370. ; FOLLOWING ROUTINE DISCONNECTS THE MODEM USING SMARTMODEM
  371. ; CODES. ALL REGISTERS ARE AVAILABLE FOR THIS FUNCTION.
  372. ; NOTHING RETURNED TO CALLER.
  373. ;
  374. DISCON:
  375.     lda    mdm$tp
  376.     ani    80h
  377.     jrz    phone$on$hook        ; go place phone on hook if not 1670
  378.  
  379.     call    wait$2$sec        ; 1670,  send hayes disconnect seq.
  380.     call    mdm$snd$msg
  381.     db    '+++',eom
  382.     call    wait$2$sec
  383.     call    mdm$snd$msg
  384.     db    'ATH',cr,eom        ; not needed by 1670 but req for hayes
  385.     ret
  386.  
  387. wait$2$sec:
  388.     mvi    b,20
  389.     mvi    c,timer
  390.     jmp    mex            ; delay 2 seconds
  391.  
  392.     page
  393. ;
  394. ;    Place phone on hook (This routine is used if 1650 or 1660)
  395. ;
  396. phone$on$hook:
  397.     mvi    a,yes
  398.     sta    on$hook$flag
  399.     lxi    b,data$port$b
  400.     lda    mdm$tp
  401.     ani    20h            ; bit 5=1 if 1660, =0 if 1650
  402.     jrz    type$1650
  403.     
  404. type$1660:
  405.     inp    a
  406.     ori    20h            ; set, phone on hook (1660)
  407.     jr    on$hook$cont
  408.  
  409. type$1650:
  410.     inp    a
  411.     ani    not(20h)        ; set, phone on hook (1650)
  412. on$hook$cont:
  413.     outp    a
  414.     ret
  415.  
  416.     page
  417. ;
  418. ; This is the DIAL routine called by MEX to dial a digit. The digit
  419. ; to be dialed is passed in the A register.  Note that two special
  420. ; codes must be intercepted as non-digits: 254 (start dial sequence)
  421. ; and 255 (end-dial sequence).  Mex will always call DIAL with 254
  422. ; in the accumulator prior to dialing a number.  Mex will also call
  423. ; dial with 255 in A as an indication that dialing is complete. Thus,
  424. ; the overlay may use these values to "block" the number, holding it
  425. ; in a buffer until it is completely assembled (in fact, that's the
  426. ; scheme employed here for the Smartmodem).
  427. ;
  428. ; After the 254-start-dial sequence, MEX will call the overlay with
  429. ; digits, one-at-a-time.  MEX will make no assumptions about the dig-
  430. ; its, and will send each to the DIAL routine un-inspected (some modems,
  431. ; like the Smartmodem, allow special non-numeric characters in the
  432. ; phone number, and MEX may make no assumptions about these).
  433. ;
  434. ; After receiving the end-dial sequence (255) the overlay must take
  435. ; whatever end-of-dial actions are necessary *including* waiting for
  436. ; carrier at the distant end.  The overlay should monitor the keyboard
  437. ; during this wait (using the MEX keystat service call), and return
  438. ; an exit code to MEX in the A register, as follows:
  439. ;
  440. ;    0 - Carrier detected, connection established
  441. ;    1 - Far end busy (only for modems that can detect this condition)
  442. ;    2 - No answer (or timed out waiting for modem response)
  443. ;    3 - Keyboard abort (^C only: all others should be ignored)
  444. ;    4 - Error reported by modem
  445. ;
  446. ; <No other codes should be returned after an end-dial sequence>
  447. ;
  448. ; The overlay should not loop forever in the carrier-wait routine, but
  449. ; instead use either the overlay timer vector, or the INMDMV (timed 100
  450. ; ms character wait) service call routine.
  451. ;
  452. ; The DIAL routine is free to use any of the registers, but must return
  453. ; the above code after an end-dial sequence
  454. ;
  455. next$dial$state    equ    $+1
  456. dial:
  457.     jmp    dial$idle
  458.  
  459.     page
  460. ;
  461. ;
  462. ;
  463. dial$idle:
  464.     cpi    -2            ; start dial sequence?
  465.     mvi    a,4            ; dial error code (valid if last state)
  466.     rnz                ; exit if not (this is the start state)
  467.     lda    mdm$tp            ; get the modem type byte
  468.     bit    7,a            ; is device a Commodore 1670 ?
  469.     jrz    dl$tst$1650$60        ; no, go test 1650 and 1660
  470. ;
  471. ;    user has a Hayes compadable modem (1670)
  472. ;
  473.     lda    tpulse            ; GET OVERLAY'S TOUCH-TONE FLAG
  474.     sta    ATDx            ; PUT INTO STRING
  475.     call    mdm$snd$msg        ;
  476.     db    'ATD'
  477. ATDx:    db    'T ',eom
  478.     call    set$next$state
  479. ;
  480. ;    at this point we should recieve numbers to dial or exit code (-1)
  481. ;
  482.     cpi    -1
  483.     jnz    mdm$snd$A        ; send it (do not change states)
  484.  
  485.     call    mdm$snd$CR        ; send CR to modem to end input
  486.     mvi    b,-1
  487.     call    strip$mdm        ; remove any modem input
  488.     call    result            ; returns with result is A
  489.     push    psw            ; save result
  490.     call    mdm$snd$CR        ; send CR to the modem
  491.     pop    psw            ; ..will abort if error else
  492.                     ; ..just send CR to host.
  493. set$start$state:
  494.     lxi    h,dial$idle
  495.     push    h
  496. set$next$state:
  497.     pop    h
  498.     shld    next$dial$state
  499.     ret
  500.  
  501.     page
  502. ;
  503. ;    User has selected the 1011A or EQV. device. No dialing.
  504. ;
  505. dial$1011a:
  506.     mvi    a,4            ; device error code (1011A
  507.     ret                ; ..can not dial)
  508. ;
  509. ;
  510. ;
  511. dl$tst$1650$60:
  512.     bit    6,a            ; test if commodore 1650 or 1660 modem
  513.     jrz    dial$1011A        ; if not 1650 or 1660 must be 1011A
  514. ;
  515. ;    User has selected Commodore 1650 or 1660 modem
  516. ;
  517.     call    phone$on$hook
  518.     xri    20h            ; toggle on/off hook bit
  519.     outp    a            ; take phone off hook
  520.     call    wait$2$sec
  521.     call    set$next$state
  522. ;
  523. ;
  524. ;
  525.     cpi    -1
  526.     jrz    done$1650$60
  527.     cpi    ','
  528.     jrz    delay$1$sec
  529.     cpi    '-'
  530.     rz
  531.     sui    '0'
  532.     jrc    send$responce
  533.     jrnz    not$10
  534.     mvi    a,10
  535. not$10:
  536.     cpi    10+1
  537.     mov    d,a
  538.     jrnc    send$responce
  539.  
  540.     page
  541. ;
  542. ;    dial number in D
  543. ;
  544. dial$digit:
  545.     lxi    b,data$port$b        ; point to CIA
  546.     inp    a            ; get phone off hook value
  547.     mov    e,a
  548. dial$digit$cont:
  549.     xri    20h            ; toggle dial port bit
  550.     outp    a            ; output phone on hook value
  551.     mvi    a,6
  552.     call    delay            ; delay 0.06 seconds
  553.     outp    e            ; phone back off hook
  554.     mvi    a,4
  555.     call    delay            ; delay 0.04 seconds
  556.     mov    a,e
  557.     dcr    d
  558.     jrnz    dial$digit$cont
  559. delay$1$sec:
  560.     mvi    a,100            ; delay 1 second
  561. ;
  562. ;    delay for the number of 0.01 seconds in A
  563. ;        20,455 T states per 10 mSecond
  564. ; 10+7ah+7ahl+4ahl+12ahl-5ah+4ah+12ah-5a+4a+12a-5+10+4+10=23ahl+18ah+11a+29
  565. ;    if H=19, L=46 then
  566. ;        # T states = 20455a+33
  567. delay:
  568.     di                ;4
  569.     push    h            ;10
  570. delay$more:
  571.     mvi    h,19            ;7ah
  572. outer$delay:
  573.     mvi    l,46            ;7ahl
  574. inter$delay:
  575.     dcr    l            ;4ahl
  576.     jrnz    inter$delay        ;12ah(l-1)+7ah = 12ahl-5ah
  577.     dcr    h            ;4ah
  578.     jrnz    outer$delay        ;12a(h-1)+7a = 12ah-5a
  579.     dcr    a            ;4a
  580.     jrnz    delay$more        ;12(a-1)+7 = 12a-5
  581.     pop    h            ;10
  582.     ei                ;4
  583.     ret                ;10
  584.  
  585.     page
  586.  
  587. ;
  588. ;
  589. ;
  590. done$1650$60:
  591.     lda    mdm$tp
  592.     cma
  593.     ani    10h            ; bit 4=0 if it supports CD
  594.     jrz    send$responce        ; send A=0 (connected)
  595.     lxi    h,45000
  596. wait$carrier:
  597.     lxi    b,data$port$b
  598.     inp    a
  599.     ani    10h            ; test carrier detect
  600.     jrz    send$responce        ; send A=0 (connected)
  601.  
  602.     call    test$abort        ; user request abort ?
  603.     jrz    send$responce        ; yes, send A=3 (abort code)
  604.     dcx    h
  605.     mov    a,h
  606.     ora    l
  607.     jrnz    wait$carrier
  608.     mvi    a,2            ; send - NO CARRIER code
  609. send$responce:
  610.     lxi    h,on$hook$flag
  611.     mvi    m,no
  612.     jmp    set$start$state
  613.  
  614.  
  615.     page
  616. ;
  617. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM (UP TO
  618. ; 60 SECONDS: YOU MAY CHANGE THIS VALUE IN THE FOLLOWING LINE).
  619. ; NOTE THAT THE SMARTMODEM HAS AN INTERNAL 30 SECOND TIMEOUT WHILE
  620. ; FOR A CARRIER ON THE OTHER END.  YOU CAN CHANGE BY PLAYING WITH THE
  621. ; S7 VARIABLE (I.E. SEND THE SMARTMODEM "AT S7=20" TO LOWER THE 30 SECOND
  622. ; WAIT TO 20 SECONDS).
  623. ;
  624. result:
  625.     mvi    c,60            ; wait 60 seconds for a responce
  626. result$loop:
  627.     push    b            ; save current time
  628.     lxi    b,1*256+tmdinp        ; wait for up to 1 second for input
  629.     call    mex            ; any modem responce yet?
  630.     pop    b            ;  recover current time
  631.     jrnc    test$responce        ; yes, go test it
  632.     call    test$abort        ; no, user wish to abort
  633.     rz                ;  yes, exit (A=3)
  634.     dcr    c            ;  no, 60 second over yet?
  635.     jrnz    result$loop        ;   no, test again
  636.     mvi    a,2            ;   yes, return timeout code
  637.     ret
  638. ;
  639. ;
  640. ;
  641. test$responce:
  642.     call    test$code        ; check responce Cy=1 if unknown
  643.     mov    a,b            ; place responce code in A
  644.     push    psw            ; save responce and Cy flag
  645.     mvi    b,lf            ; remove characters from modem until
  646.     call    strip$mdm        ; ..none in 100MS or a LF
  647.     pop    psw            ; recover responce and Cy flag
  648.     jrc    result            ; start over if bad responce
  649.     ret
  650.  
  651.     page
  652. ;
  653. ;
  654. ;
  655. test$abort:
  656.     push    h
  657.     push    b            ; save count (in C)
  658.     mvi    c,chekcc
  659.     call    mex            ; user type a ^C ?
  660.     pop    b
  661.     pop    h
  662.     mvi    a,3            ; return abort code (only
  663.     ret                ; ..used if abort)
  664. ;
  665. ;
  666. ;
  667. strip$mdm:
  668.     mvi    c,inmdm            ; get modem character (Cy=1 if
  669.     push    b            ; ..none in 100Ms)
  670.     call    mex
  671.     pop    b
  672.     rc                ; return if Modem is empty
  673.     cmp    b            ; test for end character
  674.     rz                ; found user char, return
  675.     jr    strip$mdm        ; get next character
  676.  
  677. ;
  678. ;    check modems responce against legal ones, return carry set if
  679. ;      not a legal responce, else return code for responce
  680. ;
  681. test$code:
  682.     ani    7FH            ; strip parity bit
  683.     mvi    b,0            ; start with connect code
  684.     cpi    'C'            ; Connect?
  685.     rz                ; yes, ret
  686.     cpi    '1'            ; # code for Connect?
  687.     rz                ; yes, ret
  688.     cpi    '5'            ; # code for Connect 1200?
  689.     rz                ; yes, ret
  690.     mvi    b,2            ; no connect code
  691.     cpi    'N'            ; No Connect?
  692.     rz                ; yes, ret
  693.     cpi    '3'            ; # code for No Connect?
  694.     rz                ; yes, ret
  695.     mvi    b,4            ; modem error code
  696.     cpi    'E'            ; Error ?
  697.     rz                ; yes, ret
  698.     cpi    '4'            ; #code for Error?
  699.     rz                ; yes, ret
  700.     stc                ; set carry if none of above
  701.     ret
  702.  
  703.     page
  704. ;
  705. ;    send string following CALL to the modem (to EOM)
  706. ;
  707. mdm$snd$msg:
  708.     xthl
  709.     call    mdm$snd$HL
  710.     xthl
  711.     ret
  712. ;
  713. ;    send string pointed to by HL to modem (ended with a zero (EOM))
  714. ;
  715. mdm$snd$HL:
  716.     mov    a,m            ; FETCH NEXT CHARACTER
  717.     ora    a            ; END?
  718.     rz                ; DONE IF SO
  719.     call    mdm$snd$A
  720.     inx    h
  721.     jr    mdm$snd$HL
  722. ;
  723. ;    send a CR to the modem
  724. ;
  725. mdm$snd$CR:
  726.     mvi    a,cr
  727. ;
  728. ;    send character in A to modem
  729. ;
  730. mdm$snd$A:
  731.     push    psw            ; save char to send
  732. mdm$snd$bzy:
  733.     mvi    c,snd$rdy        ; test if modem is ready for a byte
  734.     call    mex            ; 
  735.     jrnz    mdm$snd$bzy        ; if not ready loop back
  736.     pop    psw            ; recover char to send
  737.     jmp    out$mdm
  738.  
  739.     page
  740. ;    
  741. ;
  742. ;
  743. mdm$stat$1650$60:
  744.     lda    on$hook$flag
  745.     ora    a
  746.     jrz    read$status        ; return modem status if off hook
  747. ;
  748. ;    test if modem is ringing
  749. ;
  750.     exx                ; save HLDEBC
  751.     lxi    b,data$port$b
  752.     inp    a
  753.     bit    3,a            ; ring indicator bit (active low)
  754.     jrnz    ring$cont        ; exit if not ringing
  755. ;
  756. ;    ringing, take phone off hook and wait for CD (if used)
  757. ;
  758.     xri    20h            ; toggle on/off hook bit
  759.     outp    a            ; take off hook
  760.     mvi    a,no            ; set phone off hook
  761.     sta    on$hook$flag
  762.     lda    mdm$tp            ; bit 4=0 if supports CD
  763.     ani    10h            ; =10h if no support
  764.     jrz    ring$cont
  765.     mvi    l,0
  766. carrier$yet:
  767.     dcr    l
  768.     jrz    ring$cont
  769.     inp    a
  770.     ani    10h            ; test if carrier present
  771.     jrz    ring$cont        ; 
  772.     call    delay            ; delay .16 seconds
  773.     jr    carrier$yet        ; will wait .16*255 = 40.8 seconds
  774.  
  775.     page
  776. ;
  777. ;
  778. ;
  779. read$status:
  780.     lda    mdm$tp            ; bit 4=0 if supports CD
  781.     ani    10h
  782.     jrnz    mdm$stat        ; exit if CD is not supported
  783. ;
  784. ;    make sure that the carrier is still present (hang up if not)
  785. ;
  786.     exx                ; save HLDEBC
  787.     lxi    b,data$port$B
  788.     inp    a
  789.     ani    10h            ; test if carrier present
  790.     cnz    phone$on$hook        ; lost carrier, hang up the phone
  791. ring$cont:
  792.     exx                ; restore HLDEBC
  793. ;
  794. ;
  795. ;
  796. mdm$stat:
  797.     lda    RS232$status
  798.     ret
  799.  
  800.  
  801.  
  802. ;
  803. ;    data area
  804. ;
  805. on$hook$flag:
  806.     db    yes            ; yes=0FFh=on hook, no=00=off hook
  807.  
  808.     end
  809.  
  810.