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 / MODEMS / MODEM / DIAL3.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  23KB  |  917 lines

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