home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / MEX / MXM-UD10.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  16KB  |  669 lines

  1. ; MXM-UD10.ASM - MEX1.10 Smart modem overlay for UDS 212 A/D modem
  2. ;
  3. ;    TO USE: Edit the UDSNEW parameter for your particular modem.
  4. ;        Assemble with ASM.COM or equivalent assembler.  Then
  5. ;        use MLOAD21.COM (or later) to combine this overlay
  6. ;        with the original MEXxx.COM file, and your computer
  7. ;        specific overlay file.( MXO-xxxx in the example below).
  8. ;
  9. ;        A>MLOAD21 MEX.COM=MEXxx.COM,MXM-UD10,MXO-xxxx
  10. ;
  11. ;    >>>>  Report bugs to fortfone rcp/m 414-563-9932 <<<<<<<<<<<< 
  12. ;
  13. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  14. ;
  15. YES    EQU    0FFH
  16. NO    EQU    000H
  17. ;
  18. ;    UDSNEW - If yes, this is a revised UDS 212 A/D.  The new
  19. ;    models can be disconnected by sending the string 'XXXT' followed
  20. ;    by carriage return.  Older models can only be disconnected by
  21. ;    dropping DTR low for at least 60 msec.  Define UDSNEW to be yes
  22. ;    if you want to use the 'XXXT' disconnect string,  Define UDSNEW
  23. ;    to be NO to use the DTR disconnect method. (The computer overlay
  24. ;    must intercept the DISCV vector, drop DTR, then JMP to the original
  25. ;    DISCV vector address.)
  26. ;
  27. UDSNEW    EQU    YES
  28. ;
  29. ;
  30. ;  *NOTE* As an owner of a UDS 212-A/D modem you are probably aware
  31. ;    of the consequences regarding training the modem at one baud rate
  32. ;    and then changing baud rates without untraining the modem first.
  33. ;    The poor thing will go crazy.  Using this overlay *requires* the
  34. ;    user to always disconnect a call before changing baud rates.
  35. ;    The Ctl-J + N command will disconnect the modem and then untrain 
  36. ;    the ACU.  Do *NOT* make a completed call, exit terminal mode
  37. ;    with Ctl-J + E, and then try to change baud rates. (Incomplete or
  38. ;    aborted calls don't count, the modem is automatically untrained
  39. ;    if the call isn't completed.)  If you're in doubt, enter terminal
  40. ;    mode and give the disconnect command, Ctl-J + N, this will insure
  41. ;    the modem is disconnected and 'untrained'.
  42. ;
  43. ;---------------
  44. ;
  45. ; Misc equates
  46. ;
  47. BDOS        EQU    005H
  48. CR:        EQU    0DH        ;carriage return
  49. LF:        EQU    0AH        ;linefeed
  50. ;
  51. ;---------------
  52. ;
  53. ; MEX service processor equates
  54. ;
  55. MEX    EQU    0D00H        ; MEX SERVICE PROCESSOR ENTRY POINT
  56. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  57. TIMER    EQU    254        ;delay 100ms * reg B
  58. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  59. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  60. SNDRDY    EQU    251        ;test for modem-send ready
  61. RCVRDY    EQU    250        ;test for modem-receive ready
  62. SNDCHR    EQU    249        ;send a chara (B) to the modem (after sndrdy)
  63. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  64. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  65. PARSFN    EQU    246        ;parse filename from input stream
  66. BDPARS    EQU    245        ;parse baud-rate from input stream
  67. SBLANK    EQU    244        ;scan input stream to next non-blank
  68. EVALA    EQU    243        ;evaluate numeric from input stream
  69. LKAHED    EQU    242        ;get nxt char w/o removing from input
  70. GNC    EQU    241        ;get char from input, cy=1 if none
  71. ILP    EQU    240        ;inline print
  72. DECOUT    EQU    239        ;decimal output
  73. PRBAUD    EQU    238        ;print baud rate
  74. PRNTBL    EQU    237        ;print command table in columnar format
  75. PRID    EQU    236        ;print MEX ID on console
  76. ;
  77. CONOUT    EQU    2        ; simulated BDOS functions, for MEX
  78. PRINT    EQU    9
  79. INBUF    EQU    10
  80. ;
  81. ;---------------
  82. ;
  83. ;    PDIAL completion codes to be returned to MEX
  84. ;
  85. PCARR    EQU    0    ; CARRIER DETECT, CONNECTION MADE
  86. PBSY    EQU    1    ; PHONE IS BUSY
  87. PNOANS    EQU    2    ; NO ANSWER
  88. PABRT    EQU    3    ; KEYBD ABORT
  89. PERR    EQU    4    ; MODEM ERROR
  90. PNRING    EQU    5    ; NO RING
  91. PNDIAL    EQU    6    ; NO DIAL TONE
  92. ;
  93. ;----------------
  94. ;
  95. ;    MEX Baud rate codes
  96. ;
  97. BD110    EQU    0
  98. BD300    EQU    1
  99. BD450    EQU    2
  100. BD600    EQU    3
  101. BD710    EQU    4
  102. BD1200    EQU    5
  103. BD2400    EQU    6
  104. BD4800    EQU    7
  105. BD9600    EQU    8
  106. BD1920    EQU    9
  107. ;
  108. ;-----------------
  109. ;
  110. ;    Entry points in the computer overlay area
  111. ;
  112.     ORG 0162H        ; MEX main overlay
  113.     JMP    PDIAL        ;jump to modem dialing routine  162H
  114.     JMP    MDMDSC        ;jump to modem disconnect routine    165H
  115. MSPEED:    EQU    0107H        ;MEX speed code byte
  116. SET8BT:    EQU    0171H        ;Set serial port for 8-bit data, no parity
  117. SETNRM:    EQU    0174H        ;Set serial port for normal operation.
  118. ;
  119. ;----------------
  120. ;
  121. ;    New MEX 1.10 Smartmodem overlay patch points.
  122. ;
  123.     ORG 0D55H    ; Fixed at address 0D55H
  124.     DW    DUMMY    ; SMINIT - not used.
  125.     DW    SSET    ; SSET command processor
  126.     DW    DUMMY    ; SMEXIT - not used.
  127. ;
  128. ;---------------
  129. ;
  130. ;    Smartmodem code begins at 0900H
  131. ;
  132.     ORG 0900H
  133. ;
  134. ;---------------
  135. ;
  136. ;    PDIAL - Actual dial service routine.
  137. ;
  138. ;    Entry point to dialing routine. This routine saves all the digits in
  139. ;    a buffer, dialing the number only after all digits/commands have been
  140. ;    received.  It then monitors the ACU call progress responses and returns
  141. ;    the proper success/failure codes to MEX.
  142. ;
  143. ;    This routine is called by MEX with a dialing digit (ASCII) in the
  144. ;    A register.  The routine can use all registers.  The routine is called
  145. ;    with the special value  254 (decimal) to indicate the beginning of a
  146. ;    dialing sequence.  The special value 255 indicates the end of the
  147. ;    dialing sequence, and requires the PDIAL routine to return one of the
  148. ;    MEX dialing completion codes in the A register.
  149. ;
  150. PDIAL:    CPI    254
  151.     JZ    STDIAL    ; start of dialing sequence, reset pointers
  152. ;
  153.     CPI    255
  154.     JNZ    DDIGIT    ; store digit, will dial the whole number later
  155. ;
  156. ;    all digits recieved, time to dial the number.
  157. ;
  158.     XRA    A    ; Null terminate the phone number
  159.     CALL    DDIGIT
  160. ;
  161. ;    check for 300/1200 baud rate. Modem ACU will not work at other rates.
  162. ;
  163.     LDA    MSPEED
  164.     CPI    BD300
  165.     JZ    PDIAL0
  166.     CPI    BD1200
  167.     JZ    PDIAL0
  168. ;
  169.     CALL    ILPRT
  170.     DB    CR,LF,'Baud rate must be 300/1200 for Auto Dial - ',0
  171.     JMP    DLERR    ; return the modem error code
  172. ;
  173. ;    Return error code if an invalid dialing character was received.
  174. ;
  175. PDIAL0:    LDA     ERRFLG
  176.     ORA    A
  177.     JZ    PDIAL1
  178. ;
  179.     CALL    ILPRT
  180.     DB    CR,LF,'Invalid Digit/Chara in dial string - ',0
  181.     JMP    DLERR    ; return the modem error code
  182. ;
  183. PDIAL1:    CALL    FLUSH    ; Flush the modem input
  184.     CALL    SET8BT    ; Set the serial port for 8-bit operation.
  185.     CALL    FLUSH    ; Flush input again.
  186. ;
  187. ;    First step is to train the modem to the current baud rate.
  188. ;
  189.     CALL    MDMTRN    ; Send the modem training command 'EN'
  190.     JC    DLERR    ; Exit upon training error.
  191. ;
  192.     LXI    H,DOPTS    ; Send the options commands
  193.     CALL    SNDSTR
  194.     CALL    FLUSH    ; Ignore modem responses
  195. ;
  196. ;    Now dial the number
  197. ;
  198.     MVI    A,'D'    ; Dialing command = 'D'
  199.     CALL    SEND1
  200.     LXI    H,DPREFX ; Send the dialing prefix
  201.     CALL    SNDSTR
  202.     LXI    H,DNUMBR ; Send the phone number
  203.     CALL    SNDSTR
  204.     MVI    A,CR    ; Send a Return to start the dialing procedure
  205.     CALL    SEND1
  206. ;
  207. ;    Begin call progress monitoring
  208. ;
  209.     CALL    FLUSH    ; Flush the "DIALING - " message
  210. ; *** Note: cannot abort with Control-C while waiting on first dial tone ***
  211.     MVI    B,30    ; get a chara, time out after 30 seconds
  212.     MVI    C,TMDINP
  213.     CALL    MEX
  214.     JC    DLERR    ; Timeout = Modem error
  215.     CPI    'D'
  216.     JNZ    PDLER    ; No Dial tone error - exit
  217.     CALL     FLUSH    ; Flush the "D.T. - " message
  218. ;
  219. ;    Got past first Dial Tone, now look for the following completion msgs.
  220. ;    If there is no response in 25.5 seconds, report a modem error to MEX.
  221. ;
  222. ;    COMPLETE
  223. ;    NO ABT - ABORT
  224. ;    BUSY - ABORT
  225. ;    NO D.T. - ABORT
  226. ;    NO ANSWER - ABORT
  227. ;
  228. PDLP0:    MVI    B,0    ; no response timeout counter 0=25.5 sec
  229. PDLP1:    DCR    B
  230.     JZ    DLERR    ; Exit upon timeout error
  231.     PUSH    B
  232.     MVI    C,CHEKCC ; Check for Ctl-C from Keyboard
  233.     CALL    MEX
  234.     JZ    PDABRT
  235.     MVI    C,INMDM
  236.     CALL    MEX
  237.     POP    B
  238.     JC    PDLP1    ; try again, if no chara
  239. ;
  240. PDLP2:    CPI    'C'    ; Check for the letter 'C' as in 'COMPLETE'
  241.     JNZ    PDLP3
  242. ;
  243. PDL20:    MVI    C,INMDM    ; Flush charas until LF or a timeout is rcv'd.
  244.     CALL    MEX
  245.     JC    PDL21
  246.     CPI    LF
  247.     JNZ    PDL20
  248. PDL21:    MVI    A,PCARR    ; Return carrier detect (success) code to MEX
  249.     CALL    SETNRM    ; reset serial port for normal operation.
  250.     RET
  251. ;
  252. PDLP3:    CPI    'B'    ; Check for the letter 'B' as in 'BUSY'
  253.     JNZ    PDLP4
  254.     MVI    A,PBSY ; Return the busy error code
  255.     JMP    MDMRST
  256. ;
  257. PDLP4:    CPI    '.'    ; Check for '.' as in 'NO D.T.'
  258.     JNZ    PDPLP5
  259. PDLER:    MVI    A,PNDIAL ; Return the No dial tone error code
  260.     JMP    MDMRST
  261. ;
  262. PDPLP5:    CPI    'A'    ; Check for 'A' as in 'NO ANSWER/NO ABT'
  263.     JNZ    PDLP0    ; Get/check another chara from modem
  264.     MVI    A,PNOANS ; Return the no answer error code
  265.     JMP    MDMRST
  266. ;
  267. DLERR:    MVI    A,PERR    ; Return the modem error code
  268.     JMP    MDMRST
  269. ;
  270. PDABRT:    POP    B
  271.     MVI    A,PABRT    ; Keyboard abort code
  272.     JMP    MDMRST
  273. ;
  274. ;---------------
  275. ;
  276. ;    Start the dialing process, reset the dial pointer, error flag
  277. ;
  278. STDIAL:    LXI    H,DNUMBR    ; Reset the dial string pointer
  279.     SHLD    DPTR
  280.     XRA    A        ; Clear the error flag
  281.     STA    ERRFLG
  282.     RET
  283. ;
  284. ;---------------
  285. ;
  286. ;    Add another digit to the phone number string
  287. ;
  288. DDIGIT:    CPI    ','    ; map ',' into 'D' (delay)
  289.     JNZ    DDGT1    
  290.     MVI    A,'D'
  291. ;
  292. ; Check digit/chara for validity
  293. ;
  294. DDGT1:    CALL    CHKDGT
  295.     JC    DGTERR
  296. ;
  297. ; Load valid digit into phone num string
  298. ; Dashes and spaces are ignored...
  299. ;
  300.     CPI    '-'
  301.     RZ
  302.     CPI    ' '
  303.     RZ
  304.     LHLD    DPTR
  305.     MOV    M,A
  306.     INX    H
  307.     SHLD    DPTR
  308.     RET
  309. ;
  310. ; Invalid digit, set flag and exit.
  311. ;
  312. DGTERR:    MVI    A,PERR    ; Must use the modem error code
  313.     STA    ERRFLG
  314.     RET
  315. ;
  316. ;---------------
  317. ;
  318. ;    CHKDGT - Check for valid dialing digit/char
  319. ;    Returns CY=1 if invalid chara
  320. ;
  321. CHKDGT:    MOV    B,A    ; Save orig char in B
  322.     LXI    H,CHRSTR
  323.     MOV    A,M
  324. ;
  325. DGTLP:    CMP    B
  326.     RZ        ; Character is ok, return CY=0
  327.     INX    H    ; Chk for end of table
  328.     MOV    A,M
  329.     ORA    A
  330.     JNZ    DGTLP
  331. ;
  332.     STC        ; CY=1 indicates error
  333.     RET
  334. ;
  335. CHRSTR:    DB    0    ; 0 is a valid digit, must be first digit of table.
  336.     DB    '0123456789' ; Valid dialing digits
  337.     DB    'PDWT'    ; Special ACU commands, Pulse,Delay,Wait,Tone
  338.     DB    'pdwt'    ; Lower case versions okay.
  339.     DB    '- '    ; Allow dash and space for clarity
  340.     DB    0    ; end of table
  341. ;
  342. TRNSTR:    DB    'EN',0
  343. ;
  344. CLRSTR:    DB    'OG0   ',0
  345. ;
  346. CCODE:    DB    0    ; Completion code byte
  347. ;
  348. DNUMBR:    DS    50    ; storage for phone number
  349. ;
  350. DPTR:    DW    DNUMBR    ; Pointer into DNUMBR for next digit
  351. ;
  352. ERRFLG:    DB    0    ; Digit error flag
  353. ;
  354. ;---------------
  355. ;
  356. ; Support routines
  357. ;
  358. ;    Send null terminated string to modem
  359. SNDSTR:    MOV    A,M
  360.     ORA    A
  361.     RZ        ; Null terminated string
  362.     INX    H
  363.     PUSH    H
  364.     CALL    SEND1
  365.     POP    H
  366.     JMP    SNDSTR
  367. ;
  368. ;    Send One chara to modem
  369. ;
  370. SEND1:    PUSH    PSW
  371. SND1LP:    MVI    C,SNDRDY
  372.     CALL    MEX
  373.     JNZ    SND1LP
  374.     POP    PSW
  375.     MOV    B,A
  376.     MVI    C,SNDCHR
  377.     JMP    MEX
  378. ;
  379. ;    Table Search, - for SSET command parsing
  380. ;
  381. TSRCH:      MVI    C,LOOKUP
  382.       JMP    MEX
  383. ;
  384. ;    In-Line Print, null-terminated string
  385. ;
  386. ILPRT:    MVI    C,ILP
  387.     JMP    MEX
  388. ;
  389. ;    CRLF - Send CR,LF to console
  390. ;
  391. CRLF:    CALL    ILPRT
  392.     DB    CR,LF,0
  393.     RET
  394. ;
  395. ;---------------
  396. ;
  397. ;    'Train' the modem ACU
  398. ;
  399. MDMTRN:    LXI    H,TRNSTR    ; Send the training string
  400.     CALL    SNDSTR
  401.     CALL    GCOLON    ; Check for a ':' from the modem
  402.     RC        ; CY=1 indicates training error
  403.     XRA    A    ; CY=0
  404.     RET
  405. ;
  406. ;---------------
  407. ;
  408. ;    MDMRST - Reset the ACU to an untrained state.  Aborts any
  409. ;    dialing operation in progress. Preserves register A
  410. ;
  411. ;    Send 'Q' to abort dial operation
  412. ;    Send 'OG0' to untrain the ACU. (if ACU is active)
  413. ;
  414. MDMRST:    EI
  415.     PUSH    PSW    ; Save 'A', trashes all other reg's
  416.     CALL    SET8BT    ; Set port for 8 bit data
  417.     CALL    FLUSH
  418.     MVI    A,'Q'    ; Abort dialing in progress
  419.     CALL    SEND1    ;
  420.     CALL    GCOLON    ; Check if ACU is alive
  421.     JC    MDMRS1    ;
  422.     LXI    H,CLRSTR ; Send the 'OG0' command string
  423.     CALL    SNDSTR    ;
  424. MDMRS1:    CALL    FLUSH
  425.     CALL    SETNRM    ;reset the serial port for normal oper.
  426.     CALL    FLUSH
  427.     POP    PSW    ; restore 'A'
  428.     RET
  429. ;
  430. ;---------------
  431. ;
  432. ;    Get a colon response from the modem, if there is a character
  433. ;    timeout before receiving colon, return CY=1 to indicate error
  434. ;    All other characters are accepted, up to a maximum of 30
  435. ;
  436. GCOLON:    MVI    C,INMDM
  437.     MVI    B,30
  438. GCOLP:    PUSH    B
  439.     CALL    MEX
  440.     POP    B
  441.     RC        ; return CY=1 upon modem timeout..
  442.     CPI ':'
  443.     RZ        ; return CY=0 upon receving ':'
  444.     DCR    B
  445.     STC
  446.     RZ        ; return CY=1 upon too many characters
  447.     JMP    GCOLP
  448. ;
  449. ;---------------
  450. ;
  451. ;    Flush charas from modem, returns upon timeout.
  452. ;
  453. FLUSH:    MVI    C,INMDM    ; Read until there are no more charas in 100msec
  454.     CALL    MEX
  455.     JNC    FLUSH
  456.     RET
  457. ;
  458. ;---------------
  459. ;
  460. ;    Disconnect modem from phone line and untrain the ACU.
  461. ;
  462. ;    Uses the Disconnect string if the modem has the new EPROM.
  463. ;    Otherwise the computer overlay must drop DTR for at least
  464. ;    60 msec to disconnect the modem.
  465. ;
  466. MDMDSC:    PUSH    PSW
  467. ;
  468.     IF UDSNEW
  469.       CALL    SET8BT
  470.       CALL    FLUSH
  471.       LXI    H,DSCSTR
  472.       CALL    SNDSTR
  473.     ENDIF    ; UDSNEW
  474. ;
  475.     CALL    MDMRST    ; untrain the modem ACU
  476.     CALL    FLUSH    ; extra delay for modem to reset itself.
  477.     POP    PSW
  478.     RET
  479. ;
  480.     IF UDSNEW
  481. DSCSTR:      DB    'XXXT',CR,0
  482.     ENDIF    ; UDSNEW
  483. ;
  484. ;--------------------------------
  485. ;
  486. ; SSET command processing routine 
  487. ;
  488. SSET:    MVI    C,SBLANK
  489.     CALL    MEX
  490.     JC    SETSHO
  491.     LXI    D,CMDTBL
  492.     CALL    TSRCH
  493.     PUSH    H
  494.     RNC
  495.     POP    H
  496. SETERR:    CALL    ILPRT
  497.     DB    CR,LF,'SSet command error',CR,LF,0
  498.     RET
  499. ;
  500. ;
  501. CMDTBL:    DB    '?'+80H
  502.     DW    SETHLP
  503.     DB    'PREFI','X'+80H ; dialing prefix string
  504.     DW    SETPRE
  505.     DB    'OPTION','S'+80H ; Options command string
  506.     DW    SETOPT
  507.     ; INSERT ADDITIONAL SSET COMMANDS HERE
  508.     DB    0        ;End of table
  509. ;
  510. ;---------------
  511. ;
  512. ; SSET <no-args> display status of all 'sset' items
  513. ;
  514. SETSHO:    CALL    CRLF
  515.     LXI    H,SHOTBL
  516. SETSLP:    MOV    E,M
  517.     INX    H
  518.     MOV    D,M
  519.     INX    H
  520.     MOV    A,D
  521.     ORA    E
  522.     JZ    CRLF    ;Exit thru CRLF
  523.     PUSH    H
  524.     XCHG
  525.     CALL    GOHL
  526.     CALL    CRLF
  527.     POP    H
  528.     JMP    SETSLP
  529. ;
  530. GOHL:    PCHL
  531. ;
  532. ; table of Show routine addresses
  533. ;
  534. SHOTBL:      DW    OPTSHO    ; Option commands
  535.       DW    PRESHO    ; show the dialing prefix string
  536.     ; Add other status routines here
  537.       DW    0    ; End of table
  538. ;
  539. ;-----------------------
  540. ;
  541. ; SSET ? print available SSET commands
  542. ;
  543. SETHLP:      CALL    ILPRT
  544.       DB    CR,LF,'Available SSET Commands: (UDS-212 A/D)',0
  545. ;
  546.       LXI    H,CMDTBL
  547.       MVI    C,PRNTBL
  548.       CALL    MEX
  549.       CALL    CRLF
  550.       JMP    CRLF    ; Exit thru CRLF
  551. ;
  552. ;--------------
  553. ;
  554. ; SSET PREFIX {string} Change the dialing prefix string, default is 'P'
  555. ;    other useful prefixes are T, P9W, etc.
  556. ;
  557. ; SSET PREFIX            Print current string.
  558. ; SSET PREFIX ""        Set prefix to null string
  559. ; SSET PREFIX string        Set prefix to 'string'
  560. ; SSET PREFIX "string"        (Quotes are optional, same as above)
  561. ;
  562. SETPRE:      MVI    C,SBLANK    ; Isolate the space terminated string
  563.       CALL    MEX
  564.       JC    PRESHO        ; Show current string
  565. ;
  566.       MVI    B,(ENDPRE-DPREFX)-2    ; B=Max length of string
  567.       LXI    H,DPREFX
  568.       MVI    C,GNC        ; MEX service code for get next chara
  569. SETPLP:      PUSH    H
  570.       PUSH    B
  571.       CALL    MEX        ; Fetch chara, CY=1 means end of string
  572.       JC    SETPEX
  573. ; Verify chara as a valid dialing digit. 
  574.       CPI    '"'
  575.       CNZ    CHKDGT
  576.       JNC    SETP1
  577. ; Invalid digit, report error, terminate PREFIX string.
  578.       CALL    ILPRT
  579.       DB    CR,LF,'Invalid character in PREFIX string'
  580.       DB    CR,LF,0
  581.       JMP    SETPEX
  582. ; Store good digit, except quote marks
  583. SETP1:      POP    B
  584.       POP    H
  585.       CPI    '"'
  586.       JZ    SETPLP
  587.       MOV    M,A        ; Store new chara
  588.       INX    H
  589.       DCR    B        ; Check for string too long
  590.       JNZ    SETPLP        ; get next chara
  591.       JMP    SETPX1        ; Exit, if no more room
  592.  
  593. SETPEX:      POP    B
  594.       POP    H
  595. SETPX1:      MVI    M,0        ; Finished. Insert 0, insert 'RET'
  596.       INX    H
  597.       MVI    M,0C9H        ; Insert RET instruction
  598.     ; Fall thru to PRESHO
  599. ;
  600. ;---------------
  601. ;
  602. ; PRESHO  Show current dial prefix string.
  603. ;
  604. PRESHO:      CALL    ILPRT
  605.       DB    'Dialing prefix: ',0
  606.       CALL    ILPRT
  607. DPREFX:      DB    'P'    ; dialing prefix string, default = 'P'
  608.       DB    0,0,0,0,0,0,0,0,0,0,0 ; Max of 12 charas
  609.       DB    0    ; String must be null-terminated, *plus* a RET inst.
  610.       RET
  611. ENDPRE:
  612. ;
  613. ;--------------
  614. ;
  615. ; SSET OPTIONS {string} Change the dialing options string, default is 'OF1'
  616. ;    other useful options are OBx
  617. ;
  618. ; SSET OPTIONS Print current string.
  619. ; SSET OPTIONS ""        Set options to null string
  620. ; SSET OPTIONS string        Set options to 'string'
  621. ; SSET OPTIONS "string"        (Quotes are optional, same as above)
  622. ;
  623. SETOPT:      MVI    C,SBLANK    ; Isolate the space terminated string
  624.       CALL    MEX
  625.       JC    OPTSHO        ; Show current string
  626. ;
  627.       MVI    B,(ENDOPT-DOPTS)-2    ; B=Max length of string
  628.       LXI    H,DOPTS
  629.       MVI    C,GNC        ; MEX service code for get next chara
  630. SETOLP:      PUSH    H
  631.       PUSH    B
  632.       CALL    MEX        ; Fetch chara, CY=1 means end of string
  633.       POP    B
  634.       POP    H
  635.       JC    SETOP1
  636.       CPI    '"'        ; ignore quote charas
  637.       JZ    SETOLP
  638.       MOV    M,A        ; Store new chara
  639.       INX    H
  640.       DCR    B        ; Check for string too long
  641.       JNZ    SETOLP        ; get next chara
  642. ;
  643. SETOP1:      MVI    M,0        ; Finished. Insert 0, insert 'RET'
  644.       INX    H
  645.       MVI    M,0C9H        ; Insert RET instruction
  646.     ; Fall thru to PRESHO
  647. ;
  648. ;--------------
  649. ;
  650. ; OPTSHO
  651. ;
  652. OPTSHO:    CALL ILPRT
  653.     DB    'Modem Options : ',0
  654.     CALL ILPRT
  655. DOPTS:    DB 'OB1',0,0,0,0,0,0    ; 18 charas max, default=OB1
  656.     DB 0,0,0,0,0,0,0,0,0
  657.     DB 0
  658.     RET
  659. ENDOPT:
  660. ;
  661. ;----------------
  662. ;
  663. DUMMY:    RET    ; Do nothing routine.
  664. ;
  665. ;
  666. ;
  667.     END
  668.