home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug047.ark / DIAL6_23.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  22KB  |  868 lines

  1. ;
  2. ;DIAL.ASM  V2.0   BY JEFF HAMMERSLEY
  3. ;                    7738 MIDDLEPOINTE
  4. ;                    DEARBORN,MI  48126
  5. ;                    313-935-1716
  6. ;
  7. ;(WRITTEN 9/21/79)
  8. ;MODIFIED BY KEITH PETERSEN 
  9. ;  11/21/79  BASIC TIMING MODS.
  10. ;  12/04/79  EQUATE AND LABEL FOR 20PPS DIALING
  11. ;NUMBER LIST ASCII INFO. EXTENDED 12/16/79
  12. ;RINGBACK REWRITTEN 3/8/80
  13. ;      (BY COMMITTEE DECISION, THE FANCY FOOTWORK PREVIOUSLY
  14. ;    DONE TO IDENTIFY BUSY AND FAR END RINGING HAVE BEEN
  15. ;    REMOVED IN FAVOR OF A MORE RELIABLE, SIMPLE CARRIER OR TONE
  16. ;    IDENTIFICATION.)
  17. ;
  18. ;UPDATE 6/22/80
  19. ;CORRECTED ERROR IN SELECTING 'A' (REQUIRES NO OFFSET) 
  20. ;ALSO CLEANED UP PHONELIST, NOLONGER LEAVES 'GARBAGE' IN AREA.
  21. ;AND IT IS EASIER TO KEEP TRACK OF DATA AREA.....
  22. ;    HANK SZYSZKA
  23. ;    PO BOX 6
  24. ;    BEARSVILLE NEW YORK 12409
  25. ;       1-914-679-6559 (MODEM)
  26. ;
  27. ;06/23/80 CORRECTED EDITING ERRORS IN COMMENTS AND
  28. ;      SET MODEM PORT NUMBERS TO PMMI STANDARD. (KBP)
  29. ;
  30. ;CP/M - PMMI CONSOLE, STORED, AND PRESET AUTODIALING
  31. ;PROGRAM.
  32. ;
  33. ;  THIS PROGRAM CONTAINS MANY FEATURES FOUND IN WARD
  34. ;CHRISTENSEN'S MODEM PROGRAM 8/6/79 AND THE ORIGINATE-
  35. ;ANSWER DEMO. PROGRAM DISTRIBUTED BY PMMI FOR THEIR
  36. ;MM103 MODEM (4/2/79). FULL CREDIT MUST BE GIVEN TO
  37. ;THESE INDIVIDUALS FOR THEIR GROUND WORK.
  38. ;
  39. ;***********************************************************
  40. ;   EQUATES
  41. ;
  42. MCTLP     EQU    0C0H    ;PMMI VALUES
  43. MSNDB    EQU    1    ;BIT TO TEST FOR SEND
  44. MSNDR     EQU    1    ;VALUE WHEN READY
  45. MRCVB    EQU    2    ;BIT TO TEST FOR RECEIVE
  46. MRCVR     EQU    2    ;VALUE WHEN READY
  47. MDATP    EQU    0C1H    ;DATA PORT
  48. BAUDRP     EQU    0C2H    ;BAUD RATE OUTPUT
  49. MCTL2     EQU    0C3H    ;SECOND CTL PORT
  50. ;
  51. ORIGM     EQU    1DH    ;8 DATA, NO PARITY, ORIG
  52. ;
  53. NUMPPS     EQU    125    ;125=20PPS, 250=10PPS
  54. PULSE     EQU    80H    ;TIMER PULSE MASK
  55. MAKE     EQU    01H    ;TEL LINE MAKE (OFF HOOK)
  56. BRK     EQU    00H    ;TEL LINE BREAK (ON HOOK)
  57. INTER     EQU    7    ;INTERDIGIT TIME
  58. CLEAR     EQU    3FH    ;CLEAR MODEM TO IDLE
  59. DTDET     EQU    2FH    ;SWITCH ON DIAL TONE DETECT
  60. DTMSK     EQU    01H    ;DIAL TONE MASK
  61. DTR3     EQU    07FH    ;DATA TERMINAL READY (300 baud)
  62. CTSBT     EQU    04H    ;CLEAR TO SEND BIT
  63. BAUDRT     EQU    52    ;BAUD RATE = 300
  64. TRATE     EQU    255    ;TIMER RATE = 0.1 SEC/PULSE
  65. ;
  66. ;** RINGBACK TIMING EQUATES **
  67. ;(MAY REQUIRE OPTIMIZATION TO YOUR LOCAL OR LONG DISTANCE SITUATION)
  68. ;
  69. ;ROUTINE DIALING
  70. NATOUT     EQU    200    ;# OF SEC*10 TO WAIT BEFORE GIVING NO ANSWER MESSAGE
  71. ;
  72. ;RINGBACK
  73. RBLMT     EQU    70    ;# OF SEC*10 TO WAIT BEFORE GIVING NO RING HEARD MESS.
  74. RBWAIT     EQU    50    ;# OF SEC*10 DELAY BEFORE REDIALING NUMBER
  75. ;
  76. ;
  77. DISCCH     EQU    'D'-40H    ;CTL-D DISCONNECTS MODEM RTN TO CP/M
  78. RESTAR   EQU    'C'-40H    ;CTL-C ABORT TO CONSOLE PHONE # ENTRY
  79. ESCTCP   EQU    'E'-40H    ;CTL-E RTN TO CPM WITHOUT DISCONNECT
  80. LSTCHR     EQU    'P'-40H    ;CTL-P TURN ON/OFF LIST DEVICE (SPEED >300 BAUD)
  81. RBKCHA     EQU    'R'    ;RINGBACK SEQUENCE
  82. ;
  83. TIMESH     EQU    0    ;PUT 1 HERE TO PULL BIT 7 HIGH
  84. LSTDEV     EQU    1    ;PUT 1 HERE IF YOU HAVE A LIST DEVICE CAPABLE
  85.             ; OF SPEED >300 BAUD
  86. ;
  87. ;DEFINE ASCII CHARACTERS USED
  88. ;
  89. LF       EQU    10    ;LINEFEED
  90. CR     EQU    13    ;CARRIAGE RETURN
  91. BELL     EQU    07    ;BELL
  92. ;*********************************************************
  93. ;
  94.     ORG    100H
  95. ;
  96. ;INIT PRIVATE STACK
  97.     LXI    H,0    ;HL=0
  98.     DAD    SP    ;HL=STACK FROM CP/M
  99.     SHLD    STACK    ;..SAVE IT
  100. ;
  101. RESTRT    LXI    SP,STACK ;SP=MY STACK
  102.     CALL    START    ;GO PRINT ID
  103.     DB    1AH,0,0,0,0,0 ;ADM-3 SCREEN CLEAR 
  104.     DB    0,0,0,0,0,0    ;NULLS FOR SCREEN CLEAR
  105.     DB    'DIAL PROGRAM as of '
  106.     DB    '6/22/80',CR,LF,CR,LF,'$'
  107. ;
  108. START    POP    D    ;GET ID MESSAGE
  109.     CALL    PRTMSG    ;PRINT IT
  110. ;
  111. ;INITIALIZE JUMPS TO CP/M CBIOS
  112. ;
  113.     CALL    INITAD
  114. ;
  115. ;CHECK FOR PRIMARY OPTIONS OF EITHER X OR #
  116.     LXI    D,FCB+1    ;GET FIRST OPTION
  117.     LDAX    D
  118.     CPI    'X'    ;IS IT 'X' ?
  119.     JZ    EXAM    ;YES, EXAMPLE PRINT
  120.     CPI    '#'    ;IS IT '#' ?
  121.     JZ    DISCON    ;YES, DISCONNECT
  122. ;
  123. ;CLEAR MODEM TO IDLE
  124.     MVI    A,CLEAR
  125.     OUT    MCTL2
  126.     MVI    A,BRK    ;GO ON HOOK IF NOT ALREADY THERE
  127.     OUT    MCTLP
  128.     MVI    B,25    ;SET UP TIMER
  129.     CALL    TIMER
  130. ;
  131. ;HELP PRINT
  132.     LXI    D,MENU    ;PRINT CTRL-CHAR. CODES
  133.     CALL    PRTMSG
  134. ;
  135. ;EVALUATE OPTION SELECTED
  136.     JMP    PRIOPT
  137. ;
  138. ;
  139. ;  GO TO ORIGINATE MODE AND IDENTIFY THE DIAL TONE
  140. ;***********************************************************
  141. ;
  142. ORIGMD:    MVI    A,MAKE    ;GO OFF HOOK IN ORGINATE MODE
  143.     OUT    MCTLP    ;
  144.     MVI    A,DTDET    ;SWITCH IN DIAL TONE DETECT FILTERS
  145.     OUT    MCTL2
  146. ; WAIT FOR DIAL TONE (TIME OUT)
  147.     MVI    D,DTMSK    ;LOAD MASK FOR DIAL TONE PRESENCE
  148.     CALL    WAT15
  149.     LXI    D,DMESS    ;DIAL TONE DETECTED MESSAGE
  150.     CALL    PRTMSG    ;PRINT ROUTINE
  151.     RET
  152. ;
  153. ;
  154. ;   EVALUATE OPTION AFTER DIAL COMMAND
  155. ;**********************************************************
  156. ;
  157. PRIOPT:    XRA    A
  158.     STA    NFLAG    ;ZERO NUMBER FLAG
  159.     LXI    D,FCB+1    ;GET 1ST OPTION CHAR.
  160.     LDAX    D    ; FOUND IN FCB
  161.     STA    OPTION    ;SAVE IT
  162.     CPI    40H    ;IS IT >= A
  163.     JNC    GTHAN    ;YES (IT MAY BE A LETTER)
  164.     JMP    CKNUM    ;NO, SEE IF A NUMBER
  165. ;
  166. GTHAN    CPI    5BH    ;IF <= Z THEN IT IS A LETTER
  167.     JC    LETTER
  168.     JMP    CKNUM    ;SEE IF IT IS ANOTHER CHAR. > Z
  169. ;
  170. LETTER    CALL    ORIGMD    ;GO OFF HOOK, IDENT. DIAL TONE
  171.     LXI    H,00    ;LOAD H-L RESET TO ZERO
  172.     LDA    OPTION    ;GET OPTION CHAR.
  173.     CPI    'A'    ;IS IT AN 'A' (NO  OFFSET REQ)
  174.     JZ    NOFFS    ;YES, THE BYPASS OFFSET.
  175.     LXI    D,30    ;SET D-E TO OFFSET VALUE
  176.     SUI    41H    ;SUBTRACT 41H FROM LETTER TO GET #
  177.             ; OF 30 BYTE BLOCKS TO SKIP
  178.     MOV    B,A    ;MOVE TO B
  179. ;
  180. LOOP    DAD    D    ;ADD OFFSET
  181.     DCR    B
  182.     JNZ    LOOP    ;ADD APPROPRIATE # UNTIL DONE
  183. ;
  184. NOFFS    LXI    D,NUMLST ;GET PHONE NUMBER LIST ORIGIN
  185.     DAD    D    ;ADD TO OFFSET IN H-L
  186.     XCHG        ;MOVE RESULT TO D-E
  187.     JMP    PROCS    ;READ AND DIAL PRESET NUMBER
  188. ;
  189. CKNUM    CALL    ORIGMD    ;GO OFF HOOK, IDENT. DIAL TONE
  190.     LXI    H,NUMBR    ;LOAD H-L WITH LOCATION OF CURRENT # BUFF
  191.     SHLD    NBP    ;SAVE IN BUFF POINTER
  192.     LDA    FCB+1    ;GET FIRST CHARACTER AGAIN
  193.     LXI    D,DBUF+2
  194. ;
  195. CKNM    CPI    'R'    ;IS IT RINGBACK?
  196.     JZ    RINGBK    ;YES
  197.     CPI    2FH    ;IF CHAR. >='0'
  198.     JNC    GT0    ;YES
  199.     CPI    ' '    ;IS IT A SPACE?
  200.     JZ    QDONE    ;YES, CK IF DONE OR CONSOLE ENTRY
  201.     ORA    A    ;IS IT BINARY 0? (END OF DBUF)
  202.     JZ    QDONE    ;YES, DONE
  203.     CPI    '-'    ;IS IT DASH?
  204.     JZ    IGN    ;IGNORE
  205.     JMP    BDCHR    ;NO, MUST BE A BAD CHAR.
  206. ;
  207. GT0    CPI    3AH    ;IS IT <= 9 ?
  208.     JC    NUM    ;YES
  209.     JMP    BDCHR    ;MUST BE A BAD CHAR.
  210. ;
  211. NUM    CALL    TYPE    ;PRINT DIGIT
  212.     CALL    DIAL    ;DIAL THE DIGIT
  213.     MVI    A,0FFH    ; FLIP NUMBER FLAG (NOTES IF ANY # DIALED)
  214.     STA    NFLAG    ;
  215. ;
  216. IGNRE    INX    D    ;GET ANOTHER CHAR. FROM DBUF
  217.     LDAX     D    ;
  218.     JMP    CKNM    ;IF FIRST CHARACTER IS A NUMBER ASSUME THAT THE REST
  219.             ;ARE AND SO GO GET ANOTHER.
  220. IGN    CALL    TYPE    ;PRINT '-'
  221.     JMP    IGNRE
  222. ;
  223. QDONE    LDA    NFLAG    ;IS THIS THE FIRST CHAR. POSITION?
  224.     ORA    A    ; IF SO, AND IT IS A BLANK, ASSUME
  225.     JZ    CNSLE    ; THAT WE WANT CONSOLE INPUT
  226.     JMP    DIALE    ;NO, IT ISN'T- SO STORE AN EOF CHAR. IN
  227.             ; CURRENT NUMBER BUFFER
  228.             ;DIALING ENDED WAIT FOR ANSWER
  229. ;
  230. CNSLE:    LXI    D,PMESS    ;ENTER PHONE NUMBER MESSAGE
  231.     CALL    PRTMSG
  232.     MVI    D,255    ;25 SECONDS - TOTAL DIALING TIME ALLOWED
  233. ;
  234. CNSL1    CALL    STAT    ;CHAR. ENTERED?
  235.     JNZ    CNSL2    ;YES
  236. ;
  237. ;ALLOW ONLY 255 TIME ELEMENTS TO DIAL
  238.     MVI    B,1
  239.     CALL    TIMER
  240.     DCR    D
  241.     JZ    HEXIT    ;ABORT- TAKING TOO LONG TO DIAL
  242.     JMP    CNSL1
  243. ;
  244. CNSL2    CALL    KEYIN    ; GET IT
  245.     CALL    SPECL    ;ABORT?, REDIAL? etc.
  246.     CALL    TYPE    ; PRINT IT ON TERMINAL
  247.     CPI    2FH    ; >=0 ?
  248.     JNC    NM0    ;YES
  249.     CPI    ' '    ;IGNORE SPACES
  250.     JZ    CNSL1    ;
  251.     CPI    '-'    ;IGNORE DASHES
  252.     JZ    CNSL1    ;
  253.     CPI    CR    ;IF 'CR', THEN END OF NUMBER
  254.     JZ    NEND    ;
  255.     JMP    BDCHR    ;MUST BE A BAD CHAR.
  256. ;
  257. NEND    CALL    CRLF    ;PRINT A CRLF
  258.     JMP    DIALE    ;END OF DIALING
  259. ;
  260. NM0    CPI    3AH    ; <= 9 ?
  261.     JC    CSLE    ;FOUND A NUM. 0-9
  262.     CPI    'R'    ;RINGBACK MODE
  263.     JZ    RINGBK    ;
  264.     JMP    BDCHR    ;MUST BE A BAD CHAR.
  265. ;
  266. CSLE    CALL    DIAL    ;DIAL DIGIT
  267.     JMP    CNSL1    ;GET ANOTHER
  268. ;
  269. ;  DIAL STORED NUMBER REFERENCED BY D-E, THEN
  270. ;   PRINT TRAILING INFO.
  271. PROCS:    XRA    A    ;ZERO    ACC.
  272.     STA    PFLAG    ;ZERO PRINT FLAG
  273.     LXI    H,NUMBR    ;GET NUM BUFF START
  274.     SHLD    NBP    ;SAVE IN POINTER
  275. ;
  276. PRCS1    LDA    PFLAG    ;IS PRINT FLAG ON ?(=FFH)
  277.     CPI    0FFH
  278.     LDAX    D    ;LOAD ACC WITH 1ST CHARACTER REF. BY D-E
  279.     JZ    INCR    ;IF PFLAG ON THEN PRINT ONLY
  280.     CPI    '*'    ;EMPTY NUMBER SLOT
  281.     JZ    NONUM
  282.     CPI    ' '    ;BLANK?
  283.     JZ    INCR    ;PRINT AND ADVANCE
  284.     CPI    '-'    ;DASH?
  285.     JZ    INCR    ;PRINT AND ADVANCE
  286.     CPI    '"'    ;REST TO BE PRINT ONLY?
  287.     JZ    PSET    ;YES
  288.     CPI    2FH    ; >=0
  289.     JNC    GTH    ;YES
  290.     CPI    '$'    ;EOF ?
  291.     JZ    DIALE    ;END OF DIALING
  292.     JMP    BDCHR    ;MUST BE A BAD CHAR.
  293. ;
  294. DIGIT    CALL    TYPE    ;PRINT DIGIT
  295.     CALL    DIAL    ;DIAL IT
  296.     JMP    INCR1
  297. ;
  298. GTH    CPI    3AH    ;<=9 ?
  299.     JC    DIGIT    ;DIAL THE NUMBER
  300.     DCX    D    ;ADJUST POINTER TO 1 LESS
  301.             ; THAN LOC. OF 'R'
  302.     CPI    'R'    ;RINGBACK?
  303.     JZ    RBPRT    ;YES
  304.     JMP    BDCHR    ;BAD CHARACTER
  305. ;
  306. RBPRT    INX    D    ;RINGBACK PRINT SEQ.
  307.     LDAX    D    ;GET CHAR.
  308.     CPI    '"'    ;NON-PRINTING
  309.     JZ    RBPRT
  310.     CPI    '$'    ;END?
  311.     JZ    RBPR1    ;YES
  312.     CALL    TYPE    ;PRINT IT
  313.     JMP    RBPRT    ;GET ANOTHER
  314. ;
  315. RBPR1    MVI    A,LF    ;
  316.     CALL    TYPE
  317.     JMP    RINGBK    ;TO RINGBACK ROUTINE
  318. ;
  319. INCR    CPI    '$'    ;EOF CHAR.?
  320.     JZ    DIALE    ;DIALEND
  321.     CALL    TYPE
  322. ;
  323. INCR1    INX    D
  324.     JMP    PRCS1
  325. ;
  326. NONUM    LXI    D,NMESS    ;NO NUMBER LISTED MESSAGE
  327.     CALL    PRTMSG
  328.     JMP    HEXIT    
  329. ;
  330. PSET    MVI    A,0FFH    ;LOAD PRINT ONLY FLAG
  331.     STA    PFLAG
  332.     JMP    INCR1    ;GET NEXT CHAR.(DON'T PRINT  ")
  333. ;
  334. ;
  335. ;
  336. ;  AUTO-DIAL ROUTINE
  337. ;*********************************************************
  338. ;
  339. DIAL    ANI    0FH    ;CONVERT TO BINARY
  340.     LHLD    NBP    ;GET BUFF POINTER
  341.     MOV    M,A    ;SAVE DIGIT IN BUFF
  342.     INX    H    ;INCRE. BUFF POINTER
  343.     SHLD    NBP    ;SAVE BUFF. POINTER
  344. ;
  345. DIALR    CPI    0    ;IF 0 CONVERT TO 10
  346.     JNZ    DIALS
  347.     MVI    A,10
  348. ;
  349. DIALS    MOV    C,A    ;LOAD C WITH #
  350.     MVI    A,NUMPPS ;SET UP TIMER PULSE RATE
  351.     OUT    BAUDRP
  352. ;
  353. DIALC    IN    BAUDRP    ;WAIT IF TIMER PULSE NOT = 0
  354.     ANI    PULSE
  355.     JNZ    DIALC
  356. ;
  357. DIALB    IN    BAUDRP    ;WAIT UNTIL TRANSITION TO 1 FOR SYNC
  358.     ANI    PULSE
  359.     JZ    DIALB
  360. ;
  361. MKPLSE    MVI    A,MAKE    ;START WITH A MAKE
  362.     OUT    MCTLP
  363. ;
  364. TIMEM    IN    BAUDRP    ;WAIT FOR MAKE INTERVAL TO END
  365.     ANI    PULSE
  366.     JNZ    TIMEM
  367.     MVI    A,BRK    ;BREAK
  368.     OUT    MCTLP
  369. ;
  370. TIMEB    IN    BAUDRP    ;WAIT FOR BREAK PULSE INTERVAL
  371.     ANI    PULSE
  372.     JZ    TIMEB
  373.     DCR    C    ;MORE PULSES FOR THIS DIGIT?
  374.     JNZ    MKPLSE    ;YES
  375. ; LAST PULSE WAIT FOR INTERDIGIT TIME
  376.     MVI    A,MAKE
  377.     OUT    MCTLP
  378.     MVI    A,NUMPPS
  379.     MVI    B,INTER    ;INTERDIGIT INTERVAL = 7 GEN.
  380.     CALL    TIMER2
  381.     RET
  382. ;
  383. ;
  384. ; SUBROUTINE- TIMER     reg B = # time periods to count
  385. ;***********************************************************
  386. ;
  387. TIMER    MVI    A,TRATE    ;RESET TO .1 SEC
  388. ;
  389. TIMER2    OUT    BAUDRP
  390. ;
  391. TIMES    IN    BAUDRP    ;CK TO SEE IF TIMER BIT IS LOW
  392.     ANI    PULSE
  393.     JNZ    TIMES
  394. ;
  395. TIMEE    IN    BAUDRP    ;CK TO SEE IF BIT IS HIGH
  396.     ANI    PULSE
  397.     JZ    TIMEE
  398.     DCR    B    ;ONE PERIOD DONE
  399.     JNZ    TIMES
  400.     RET        ;TOTAL TIME EXPIRED
  401. ;
  402. ;
  403. ;   DIALING ENDED:  CARRIER DETECT ROUTINES
  404. ;********************************************************************
  405. ;
  406. BUSY:    LXI    D,BMESS    ;PHONE BUSY MESSAGE
  407.     CALL    PRTMSG
  408.     LXI    D,NAMES2
  409.     JMP    ABORT2
  410. ;
  411. DIALE:    MVI    A,'$'    ;PUT INTO CURRENT NUMBER BUFF.
  412.     LHLD    NBP    ;GET BUFF POINTER
  413.     MOV    M,A    ;SAVE EOF CHAR.
  414. ;
  415. DTRON:    CALL    CRLF    ;PRINT A CRLF
  416.     MVI    A,DTR3    ;TURN ON DTR AT APPROPRIATE BAUD RATE
  417.     OUT    MCTL2
  418.     MVI    B,1    ;WAIT FOR MODEM TO TURN ON DTR
  419.     CALL    TIMER
  420. ;SET UP UART
  421.     MVI    A,ORIGM    ;8bits, No parity, orig 
  422.     OUT    MCTLP
  423. ;
  424. ;WAIT FOR CLEAR TO SEND OR RINGTONE
  425.     MVI    C,NATOUT ;SET FOR X SEC
  426.     MVI    D,CTSBT    ;CARRRIER MASK BIT
  427. ;
  428. DZ1    MVI    B,1    ;SET TIMER FOR 0.1 SEC
  429.     CALL    TIMER
  430.     IN    BAUDRP    ;GET STATUS
  431.     STA    MSTAT    ;SAVE STATUS
  432.     ANA    D    ;CARRIER ?
  433.     JZ    CARRIER    ;YES
  434.     CALL    STAT    ;KEYBOARD INPUT?
  435.     JZ    DZZ    ;NO
  436.     CALL    KEYIN    ;YES,GET IT
  437.     CALL    SPECL    ;ABORT CHAR.?
  438. ;
  439. DZZ    DCR    C    ;GET NEXT INTERVAL
  440.     JNZ    DZ1    ;
  441.     JMP    ABORT    ;TIME EXPIRED, NO ANSWER
  442.             ; OR BUSY
  443. ;
  444. CARRIER:
  445.     CALL    WAT15    ;ALLOW 15 SECONDS FOR CTS
  446.     IN    MDATP    ;CLEAR OUT DATA GARBAGE
  447. ;PRINT CARRIER RECEIVED MESSAGE
  448.     LXI    D,CMESS
  449.     CALL    PRTMSG
  450. ;
  451. ;SET BAUD RATE (USUALLY 300)
  452.     MVI    A,BAUDRT
  453.     OUT    BAUDRP
  454. ;
  455. ;**********************************************************
  456. ; MAIN COMMUNICATION SECTION
  457. ;**********************************************************
  458. ;
  459. TERM    CALL    LOSS    ;CK FOR CARRIER LOSS
  460.     CALL    STAT    ;LOCAL CHAR KEYED?
  461.     JZ    TERML    ;..NO, CHECK LINE
  462.     CALL    KEYIN    ;GET CHAR
  463.     CPI    ESCTCP    ;TIME TO END?
  464.     JZ    NDIS    ;YES, NO DISCON
  465.     CPI    DISCCH    ;DISCONNECT REQUEST?
  466.     JZ    DISCON    ;YES, DO IT
  467.     CPI    LSTCHR    ;PRINT ON LIST DEVICE ?
  468.     JNZ    NCHG    ;NO CHANGE, CONTINUE
  469.     LDA    LFLAG    ;YES, FLIP FLAG
  470.     CMA
  471.     STA    LFLAG    ; & SAVE IT
  472.     XRA    A    ;CLEAR ACCUM.
  473. ;
  474. NCHG:
  475.     IF    TIMESH
  476.     ORI    80H    ;FORCE BIT 7 TO HIGH
  477.     ENDIF        ;TIMESH
  478. ;
  479.     OUT    MDATP    ;SEND THE CHAR
  480. ;
  481. ;SEE IF CHAR FROM LINE
  482. ;
  483. TERML    IN    MCTLP    ;READ STATUS
  484.     ANI    MRCVB    ;ISOLATE BIT
  485.     CPI    MRCVR    ;READY?
  486.     JNZ    TERM    ;..NO, LOOP
  487.     IN    MDATP    ;READ DATA
  488.     CALL    TYPE    ;TYPE IT
  489. ;
  490.     IF    LSTDEV
  491.     CALL    LIST    ;IF LIST DEVICE PRESENT (SPEED >300 BAUD)
  492.     ENDIF
  493. ;
  494.     JMP    TERM    ;LOOP
  495. ;
  496. ;---->    DISCON: DISCONNECT THE PHONE
  497. ;
  498. DISCON    XRA    A    ;GET DISCON VALUE
  499.     OUT    MCTLP    ;RESET ORIG/ANSW
  500.     OUT    MCTL2    ;TURN OFF DTR, DO BREAK
  501.     CALL    ILPRT    ;PRINT:
  502.     DB    CR,LF,'++ DISCONNECTED ++',CR,LF,0
  503.     JMP    EXIT
  504. ;
  505. ;NO DISCONNECT, TYPE MSG AS REMINDER THAT PHONE'S
  506. ;OFF HOOK
  507. ;
  508. NDIS    CALL    ILPRT
  509.     DB    CR,LF,'++ DON''T FORGET - THE MODEM IS '
  510.     DB    'NOT DISCONNECTED ++',CR,LF
  511.     DB    'Use "DIAL #" to Disconnect',CR,LF,0
  512.     JMP    EXIT
  513. ;
  514. ;*********************************************************
  515. ;
  516. LOSS    IN    BAUDRP
  517.     ANI    CTSBT    ;MASK FOR CARRIER LOSS
  518.     RZ        ;STILL PRESENT
  519.     LXI    D,CLMES    ;TYPE CARRIER LOST MESSAGE
  520.     CALL    PRTMSG
  521.     JMP    HEXIT    ;GO TO ABORT
  522. ;
  523. HANGP:    XRA    A    ;GET DISCONNECT VALUE
  524.     OUT    MCTL2    ;TURN OFF DTR, DO BREAK
  525.     OUT    MCTLP    ;GO ON HOOK
  526.     RET
  527. ;
  528. ABORT:    LXI    D,NAMES    ;NO ANSWER MESSAGE
  529.             ; DO YOU WISH TO REDIAL?
  530. ;
  531. ABORT2    CALL    HANGP
  532.     MVI    B,25    ;LOAD TIMER
  533.     CALL    TIMER    ; WITH LONG PAUSE
  534.     CALL    PRTMSG    ;PRINT THE MSG
  535.     CALL    KEYIN    ;GET REPLY
  536.     CALL    TYPE
  537.     CPI    'D'    ;WAS A 'D' HIT?
  538.     JZ    REDIAL    ;YES
  539.     JMP    EXIT    ;NO,GO TO CP/M
  540. ;
  541. SPECL    CPI    ESCTCP    ;CTL-E JMP TO CPM
  542.     JZ    EXIT
  543.     CPI    DISCCH    ;CTL-D DISCONNECT,TO CPM
  544.     JZ    HEXIT
  545.     CPI    RESTAR    ;CTL-C ABORT,RESTAR
  546.     JZ    RESTRT
  547.     CPI    RBKCHA    ;IF R
  548.     JZ    RINGBK    ;SET UP RINGBACK SEQUENCE
  549.     CPI    LSTCHR    ;CTL-P CONCURRENT LIST (DEVICE SPEED >300 BAUD)
  550.     RNZ        ;RETURN, NO SPECIAL CHARACTER IDENTIFIED
  551.     LDA    LFLAG
  552.     CMA        ;UPDATE LIST FLAG
  553.     STA    LFLAG
  554.     RET
  555. ;
  556. RINGBK:    MVI    A,'$'    ;PUT INTO CURRENT # BUFFER
  557.     LHLD    NBP    ;GET BUFF POINTER
  558.     MOV    M,A    ;SAVE EOF CHAR.
  559.     MVI    D,DTMSK    ;LOAD IN TONE DETECT MASK
  560.     MVI    C,RBLMT    ;SET TIMER FOR RBLIMIT # OF SEC.
  561.     CALL    RBTIME    ;  ABORTS IF IT TAKES LONGER
  562.     MVI    B,25    ;WAIT 2.5 SEC
  563.     CALL    TIMER    ;
  564.     IN    BAUDRP    ;IS TONE STILL PRESENT ?
  565.     ANA    D    ;
  566.     JNZ    RNGBK1    ;
  567.     JMP    BUSY    ;YES, MUST BE BUSY
  568. ;
  569. RNGBK1    CALL    HANGP    ;HANGUP PHONE
  570.     MVI    B,RBWAIT    ;WAIT X SEC.
  571.     CALL    TIMER    ;
  572.     JMP    REDIAL    ;REDIAL NUMBER
  573. ;
  574. RBTIME:    MVI    B,1    ; 0.1SEC TIME OUT
  575.     CALL    TIMER
  576.     IN    BAUDRP    ;GET STATUS
  577.     ANA    D    ;IS TONE PRESENT ?
  578.     RZ        ;YES
  579.     DCR    C    ;GET NEXT 0.1 SEC INTERVAL
  580.     JNZ    RBTIME
  581.     LXI    D,RBMES    ;NO TONE IDENTIFIED IN TIME LIMIT
  582.     CALL    PRTMSG    ;  BUT WILL CONTINUE
  583.     POP    D    ;GET RID OF SUBROUTINE RETURN
  584.     JMP    RNGBK1    ;HANGUP, REDIAL, & LISTEN FOR CARRIER
  585. ;
  586. REDIAL:    CALL    CRLF    ;PRINT A CRLF
  587.      CALL    ORIGMD    ;LOOK FOR DIAL TONE
  588.     LXI    H,NUMBR    ;GET START OF 'LAST' NUMBER BUFF.
  589. ;
  590. RDIAL    MOV    A,M    ;GET DIGIT
  591.     CPI    '$'    ;EOF CHAR. ?
  592.     JZ    DTRON    ;DONE DIALING
  593.     ADI    '0'    ;MAKE IT PRINTABLE
  594.     CALL    TYPE
  595.     MOV    A,M    ;GET DIGIT AGAIN
  596.     CALL    DIALR    ;DIAL DIGIT
  597.     INX    H    ;NEXT ONE
  598.     JMP    RDIAL
  599. ;
  600. ;
  601. ; TIME OUT ROUTINE (CK OF BITS vs MASK IN  D )
  602. ;
  603. WAT15:    MVI    C,150    ;TIMER SET FOR 15 SEC. INTERVALS
  604. ;
  605. T15    MVI    B,1    ; .1 SEC TIMEOUT
  606.     CALL    TIMER    ;TIMER WAITS .1 SEC
  607.     IN    BAUDRP    ;TEST STATUS
  608.     ANA    D    ;MASK WITH TEST BIT IN D
  609.     RZ        ;RETURN IF OFF
  610.     CALL    STAT
  611.     JZ    TS15    ;WAIT FOR INPUT
  612.     CALL    KEYIN
  613.     CALL    SPECL    ;CK FOR ABORT
  614. ;
  615. TS15    DCR    C    ;GET NEXT .1 SEC INTERVAL
  616.     JNZ    T15
  617.     JMP    ABORT
  618. ;
  619. ;---->    INITAD: INIT'S CP/M CBIOS ADDRESSES
  620. ;
  621. ;THIS ROUTINE FILLS IN THE ADDRESSES OF VARIOUS
  622. ;JMP AND CALL INSTRUCTIONS, SO THAT CP/M BDOS
  623. ;IS BYPASSED WHILE ACCESSING THE CONSOLE.  THIS
  624. ;IS DONE TO ALLOW CHARACTERS SUCH AS CONTROL-C
  625. ;AND CONTROL-S TO BE KEYED WHILE IN TERMINAL
  626. ;MODE, WITHOUT CP/M INTERPRETING THEM.
  627. ;
  628. INITAD    LHLD    1    ;GET WARM BOOT ADDR
  629.     LXI    D,3    ;LENGTH OF A 'JMP'
  630.     DAD    D    ;TO CONSOLE STAT
  631.     SHLD    VSTAT+1    ;MODIFY CALL
  632.     DAD    D    ;TO CONSOLE IN
  633.     SHLD    VKEYIN+1 ;MODIFY CALL
  634.     DAD    D    ;TO CONSOLE OUT
  635.     SHLD    VTYPE+1    ;MODIFY CALL
  636.     IF    LSTDEV
  637.     DAD    D    ;TO LIST DEVICE
  638.     SHLD    VLIST+1    ;MODIFY    CALL
  639.     ENDIF
  640.     RET
  641. ;
  642. CRLF    MVI    A,CR
  643.     CALL    TYPE
  644.     MVI    A,LF    ;FALL INTO TYPE
  645. ;
  646. ;---->    TYPE: TYPE VIA DIRECT CBIOS ACCESS
  647. ;WE ASSUME CBIOS MAY DESTROY SOME REGISTERS,
  648. ;SO SAVE THEM ALL.
  649. ;
  650. ;THIS ROUTINE BYPASSES CP/M'S CTL-S, CTL-C
  651. ;TESTS.
  652. ;
  653. TYPE    PUSH    PSW    ;SAVE CHAR
  654.     PUSH    B    ;AND OTHER REGISTERS
  655.     PUSH    D
  656.     PUSH    H
  657.     MOV    C,A    ;FOR BIOS
  658. VTYPE    CALL    $-$    ;ADDR SET AT INIT
  659.     POP    H    ;RESTORE REGISTERS
  660.     POP    D
  661.     POP    B
  662.     POP    PSW    ;..AND CHAR
  663.     RET        ;FROM "TYPE"
  664. ;
  665. ;PRINT ON LIST DEVICE ROUTINE
  666.     IF    LSTDEV    ;IF LIST DEVICE IS PRESENT >300 BAUD
  667. LIST    MOV    C,A    ;SAVE CHAR.
  668.     LDA    LFLAG    ;GET LIST FLAG
  669.     ORA    A
  670.     RZ        ;RETURN IF OFF
  671.     PUSH    PSW    ;SAVE CHAR.
  672.     PUSH    B    ;AND OTHER REGISTERS
  673.     PUSH    D
  674.     PUSH    H
  675. VLIST    CALL    $-$    ;ADDR SET AT INIT
  676.     POP    H    ;RESTORE REGISTERS
  677.     POP    D
  678.     POP    B
  679.     POP    PSW    ;..AND CHAR
  680.     RET        ;FROM    "LIST"
  681.     ENDIF
  682. ;
  683. ;---->  STAT: KEYBOARD STATUS
  684. ;
  685. ;SAVE ALL REGISTERS, EXCEPT A, IN CASE
  686. ;CBIOS CLOBBERS THEM.
  687. ;
  688. STAT    PUSH    B
  689.     PUSH    D
  690.     PUSH    H
  691. VSTAT    CALL    $-$    ;ADDR SET AT INIT
  692.     POP    H
  693.     POP    D
  694.     POP    B
  695.     ORA    A    ;0 => NOT READY
  696.     RET
  697. ;
  698. ;---->  KEYIN: KEYBOARD INPUT
  699. ;
  700. ;SAVE ALL REGISTERS, EXCEPT A, IN CASE
  701. ;CBIOS CLOBBERS THEM.
  702. ;
  703. KEYIN    PUSH    B
  704.     PUSH    D
  705.     PUSH    H
  706. VKEYIN    CALL    $-$    ;ADDR SET AT INIT
  707.     POP    H
  708.     POP    D
  709.     POP    B
  710.     ANI    7FH    ;STRIP PARITY IF THERE
  711.     RET        ;FROM KEYIN
  712. ;
  713. ;---->    ILPRT: INLINE PRINT OF MSG
  714. ;
  715. ;THE CALL TO ILPRT IS FOLLOWED BY A MESSAGE,
  716. ;BINARY 0 AS THE END.  BINARY 1 MAY BE USED TO
  717. ;PAUSE (MESSAGE 'PRESS RETURN TO CONTINUE')
  718. ;
  719. ILPRT    XTHL        ;SAVE HL, GET HL=MSG
  720. ;
  721. ILPLP    MOV    A,M    ;GET CHAR
  722.     ORA    A    ;END OF MSG?
  723.     JZ    ILPRET    ;..YES, RETURN
  724.     CPI    1    ;PAUSE?
  725.     JZ    ILPAUS    ;..YES
  726.     CALL    TYPE    ;TYPE THE MSG
  727. ;
  728. ILPNEX    INX    H    ;TO NEXT CHAR
  729.     JMP    ILPLP    ;LOOP
  730. ;
  731. ;PAUSE WHILE TYPING HELP SO INFO DOESN'T
  732. ;SCROLL OFF OF VIDEO SCREENS
  733. ILPAUS    CALL    ILPRT    ;PRINT:
  734.     DB    CR,LF,'PRESS RETURN TO CONTINUE'
  735.     DB    CR,LF,0
  736.     CALL    KEYIN    ;GET ANY CHAR
  737.     CPI    'C'-40H    ;REBOOT?
  738.     JZ    EXIT    ;YES.
  739.     JMP    ILPNEX    ;LOOP
  740. ;
  741. ILPRET    XTHL        ;RESTORE HL
  742.     RET        ;PAST MSG
  743. ;
  744. ;---->    PRTMSG: PRINTS MSG POINTED TO BY (DE)
  745. ;
  746. ;A '$' IS THE ENDING DELIMITER FOR THE PRINT.
  747. ;NO REGISTERS SAVED.
  748. ;
  749. PRTMSG    MVI    C,PRINT    ;GET BDOS FNC
  750.     JMP    BDOS    ;PRINT MESSAGE, RETURN
  751. ;
  752. HEXIT    CALL    HANGP    ;DISCONNECT
  753. ;
  754. EXIT    LHLD    STACK    ;GET ORIGINAL STACK
  755.     SPHL        ;RESTORE IT
  756.     RET        ;--EXIT-- TO CP/M (WARM BOOT)
  757. ;
  758. BDCHR    CALL    TYPE    ;PRINT CHAR.
  759.     CALL    HANGP    ;DISCONNECT
  760.     CALL    ILPRT    ;PRINT EXIT MESSAGE
  761.     DB    ' :INVALID CHARACTER',CR,LF
  762.     DB    'Press Return for Help, Ctrl-c if not.',cr,lf,1,0
  763. ;
  764. EXAM    MVI    B,1    ;WAIT
  765.     CALL    TIMER
  766.     CALL    ILPRT
  767.  DB  cr,lf
  768.  DB 'Commands:',cr,lf,cr,lf
  769.  DB '   DIAL ',cr,lf
  770.  DB '        if phone number is to be input from console',cr,lf
  771.  DB '   DIAL 1-313-555-1212',cr,lf
  772.  DB '        if the trailing number is to be dialed (spaces and',cr,lf
  773.  DB '        dashes are ignored)',cr,lf
  774.  DB '   DIAL C',cr,lf
  775.  DB '        if one of 25 preset numbers is to be dialed (preset',cr,lf
  776.  DB '        at time of assembly)',cr,lf
  777.  DB '   An  R  which follows any number indicates that it is',cr,lf
  778.  DB '    to be dialed as a ringback sequence.'
  779.  DB '    (One ring then dial back)',cr,lf
  780.  DB '    (For preset numbers this must be entered before assembly)'
  781.  DB cr,lf,cr,lf,0
  782.     JMP    EXIT
  783. ;
  784. MENU:
  785.  DB '                      NOTE',cr,lf
  786.  DB '                     ======',cr,lf
  787.  DB '   ctrl- D  causes a disconnect and return to CP/M',cr,lf
  788.  DB '   ctrl- E  causes a return to CP/M without a disconnect',cr,lf
  789.  DB '   ctrl- C  aborts current dialing and restarts program',cr,lf
  790.     IF    LSTDEV
  791.  DB '   ctrl- P  turns list device on and off',cr,lf
  792.     ENDIF
  793.  DB cr,lf,cr,lf,'$'
  794. ;
  795. ;
  796. NUMLST:
  797. ;  Phone Number list (capacity 25 numbers)
  798. ;Format    '############"aaaaaaaaaaaaaaaa$'
  799. ;CAUTION:   ^----from here to here-------^
  800. ;    **MUST NOT EXCEED 30 CHARACTERS**
  801. ;    (the actual # of #'s or a's doesn't matter if <30)
  802. ;
  803. ;    where  # = a digit, space or dash
  804. ;           " = separator between number and info
  805. ;           a = ascii info
  806. ;           $ = eof
  807. ;           * = no number character
  808. ;
  809. NA    DB    '4142415406" CCCC (TOM)       $' 
  810. NB    DB    '3724901" TELENET (CHI)       $' 
  811. NC    DB    '5458086" CBBS/CACHE          $' 
  812. ND    DB    '7670202" CMMS-CHICAGO        $' 
  813. NEE    DB    '3599450" PBBS-CHICAGO        $'  ;(NE IN SOME ASM =NOT EQU)
  814. NF    DB    '*                            $' 
  815. NG    DB    '*                            $' 
  816. NH    DB    '*                            $' 
  817. NI    DB    '*                            $' 
  818. NJ    DB    '*                            $' 
  819. NK    DB    '*                            $'
  820. NL    DB    '*                            $' 
  821. NM    DB    '*                            $' 
  822. NN    DB    '*                            $' 
  823. NO    DB    '*                            $' 
  824. NP    DB    '*                            $' 
  825. NQ    DB    '*                            $' 
  826. NR    DB    '*                            $' 
  827. NS    DB    '*                            $' 
  828. NT    DB    '*                            $' 
  829. NU    DB    '*                            $' 
  830. NV    DB    '*                            $' 
  831. NW    DB    '*                            $' 
  832. NX    DB    '*                            $' 
  833. NY    DB    '*                            $' 
  834. NZ    DB    '*                            $' 
  835. ;
  836. DMESS    DB    'DIAL TONE Detected   ',cr,lf,'$'
  837. CMESS    DB    'DATA CARRIER Received',cr,lf,bell,'$'
  838. BMESS    DB    bell,cr,lf,'BUSY Signal',bell,cr,lf,'$'
  839. RBMES    DB    bell,lf,'No Ringing Tone Detected',cr,lf,'$'
  840. NAMES    DB    'NO ANSWER',cr,lf
  841. NAMES2    DB    '   If you wish to redial PRESS  D',cr,lf
  842.     DB    '$'
  843. CLMES    DB    cr,lf,'DATA CARRIER LOST',cr,lf,bell,'$'
  844. NMESS    DB    'NO NUMBER STORED',cr,lf,'$'
  845. PMESS    DB    'ENTER PHONE # (terminate with  RETURN )  ',cr,lf,'$'
  846. ;
  847. ;
  848. NUMBR    DB    '$$$$$$$$$$$$$$$$'    ;16 DIGIT BUFFER
  849. ;
  850. PFLAG    DB    0    ;PRINT FLAG
  851. NFLAG    DB    0
  852. LFLAG    DB    0    ;LIST FLAG
  853. MSTAT    DB    0    ;MODEM STATUS
  854. OPTION    DB    0
  855. NBP    DS    2    ;NUM BUFF POINTER
  856.     DS    60    ;STACK AREA
  857. STACK    DS    2    ;STACK POINTER
  858. ;
  859. ;  BDOS EQUATES
  860. ;
  861. PRINT    EQU    9    ;PRINT ROUTINE
  862. BDOS    EQU    5
  863. FCB    EQU    5CH    ;SYSTEM FCB
  864. DBUF    EQU    80H    ;CP/M DEFAULT BUFFER
  865. ;
  866.     END
  867.