home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol093 / mcqxs798.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  16.5 KB  |  745 lines

  1. ;
  2. ;              MCQXS798.ASM
  3. ;
  4. ;    Patches for overlaying distribution version of MODEM798
  5. ;to work with EPSON QX-10 computer and DC Hayes Smartmodem 1200.
  6. ;
  7. ;You will want to look this file over carefully, there are a number
  8. ;of options that you can use to configure MODEM798 to suit your taste.
  9. ;
  10. ;After you have finished editing this file use DDT to overlay the HEX
  11. ;file onto MODEM798 and SAVE 64 MODEM798.COM.
  12. ;
  13. ;All users should set CLOCK to the right value for their system.
  14. ;
  15. ;PMMI users should set PUSERATE and CLDBOOT to their proper values.
  16. ;
  17. ;Non-PMMI, non-QX-10 users who want to get MODEM798 working quickly
  18. ;and who do not need to set their modem parameters using this program
  19. ;should change VERMSG, INIT, SETUP, CLEAR and PMMI to FALSE and
  20. ;change the equates for MODDATP, MODCTLP, MODSNDB, MODSNDR, MODRCVB
  21. ;and MODRCVR before assembly.
  22. ;
  23. ;
  24. ;    TO USE: First edit this file filling in answers for your own
  25. ;        equipment.  Then assemble with ASM.COM or equivalent
  26. ;        assembler.  Then use DDT to overlay the the results
  27. ;        of this program to the original MODEM798.COM file:
  28. ;
  29. ;        A>DDT MODEM798.COM
  30. ;        DDT VERS 2.2
  31. ;        NEXT  PC
  32. ;        4080 0100
  33. ;        -IMCQXS798.HEX        (note the "I" command)
  34. ;        -R            (loads in the .HEX file)
  35. ;        NEXT  PC
  36. ;        4080 0000
  37. ;        -G0            (return to CP/M)
  38. ;        A>SAVE 64 MODEM798.COM  (now have modified .COM file)
  39. ;
  40. ;12/31/82 - Fixed "illegal FCB" bug when batch mode and smart-
  41. ;        modem commands are used together.            ;BRR
  42. ;
  43. ;12/27/82 - Added additional command-line baud rates.        ;BRR
  44. ;
  45. ;12/26/82 - Modified to allow baud rate on SET command line    ;BRR
  46. ;        Also added smartmodem command logic.
  47. ;
  48. ;12/24/82 - Modified to work with version 7.97 of MODEM7    ;BRR
  49. ;
  50. ;12/20/82 - Modified to work with version 7.96 of MODEM7    ;B. RATOFF
  51. ;
  52. ;12/08/82 - Modified to work with version 7.95 of MODEM7    ;G. KANTOR
  53. ;
  54. ;11/26/82 - Modified to work with version 7.94 of MODEM7    ;PLK
  55. ;
  56. ;11/19/82 - Modified to work with version 7.92 of MODEM7    ;PLK
  57. ;
  58. ;11/02/82 - Modified to work with version 7.90 of MODEM7.
  59. ;        Included "how to use" instructions at start of file. ;IMH
  60. ;
  61. ;10/20/82 - Modified to work with version 7.89 of MODEM7.    ;IMH
  62. ;
  63. ;10/16/82 - Modified to work with version 7.71 of MODEM7.    ;PLK
  64. ;
  65. ;10/15/82 - Fixed lack of ENDIF after IF VERMSG AND (NOT PMMI)    ;PLK
  66. ;
  67. ;10/12/82 - Modified to give version message.            ;PLK
  68. ;
  69. ;10/09/82 - Modified to work with version 7.70 of MODEM7.    ;PLK
  70. ;
  71. ;10/04/82 - Fixed so can also be easily used for making optional
  72. ;        changes with PMMI modem.                ;PLK
  73. ;
  74. ;10/03/82 - First version of this file.                ;PLK
  75. ;
  76. TRUE    EQU    0FFH
  77. FALSE    EQU    0
  78. ;
  79. BELL    EQU    07H    ;bell
  80. CR    EQU    0DH    ;carriage return
  81. LF    EQU    0AH    ;linefeed
  82. ESC    EQU    1BH    ;escape
  83. ;
  84. VERMSG    EQU    true         ;change to TRUE if you have given at
  85.                 ;location SYSVERMSG the name of the
  86.                 ;system for which MODEM7 has been
  87.                 ;configured.
  88. ;
  89. INIT    EQU    TRUE         ;change to TRUE if you have written a
  90.                 ;routine at location INITMOD in this
  91.                 ;file to initialize your modem port
  92.                 ;on MODEM7 execution. PMMI users should
  93.                 ;use FALSE here.
  94. ;
  95. SETUP    EQU    TRUE         ;change to TRUE if you have written a
  96.                 ;routine at location SETUPR to change
  97.                 ;baud rate, etc and MSPEED. PMMI users
  98.                 ;should use FALSE here.
  99. ;
  100. EOSCLR    EQU    TRUE         ;change to TRUE if you have defined the
  101.                 ;clear to end of screen sequence for
  102.                 ;your terminal. Clear to end of screen is
  103.                 ;used on returning from terminal mode to
  104.                 ;keep the screen from becoming jumbled if
  105.                 ;the remote can position your cursor.
  106. ;
  107. SCRNCLR    EQU    true         ;change to TRUE if you have defined the
  108.                 ;home cursor and clear screen sequence
  109.                 ;for you terminal.
  110.  
  111. PMMI    EQU    FALSE        ;change to TRUE for PMMI.
  112. ;
  113.     IF    NOT PMMI
  114. ;THE FOLLOWING MUST BE CHANGED FOR YOUR MICRO IF YOU DON'T HAVE AN EPSON
  115. ;QX-10 OR A PMMI MODEM BOARD.
  116. MODDATP    EQU    011H        ;data port for QX-10
  117. MODCTLP    EQU    MODDATP+2    ;modem status port for QX-10
  118. MODSNDB    EQU    04H        ;bit to test for ready to send
  119. MODSNDR    EQU    MODSNDB        ;change to 0 if bit is 0 when
  120.                 ;ready to send
  121. MODRCVB    EQU    1        ;bit to test for received data
  122. MODRCVR    EQU    MODRCVB        ;change to 0 if bit is 0 when
  123.                 ;data received
  124.     ENDIF    ;NOT PMMI
  125. ;
  126. ;CHANGE CLR1, CLR2, CLR3, AND CLR4 TO THE APPROPRIATE VALUES FOR
  127. ;YOUR TERMINAL IF YOU DO NOT HAVE AN EPSON QX-10 AND EOSCLR IS TRUE.
  128.     IF    EOSCLR
  129. CLR1    EQU    1BH        ;QX-10 Zapple clear to end
  130. CLR2    EQU    'Y'        ;of screen sequence
  131. CLR3    EQU    0        ;the unused bytes MUST be 0
  132. CLR4    EQU    0
  133.     ENDIF    ;EOSCLR
  134. ;
  135. ;CHANGE SCLR1, SCLR2, SCLR3, AND SCLR4 TO THE APPROPRIATE VALUES FOR
  136. ;YOUR TERMINAL IF YOU DO NOT HAVE AN EPSON QX-10 AND SCRNCLR IS TRUE.
  137.     IF    SCRNCLR
  138. SCLR1    EQU    1ah        ;EPSON QX-10 home cursor
  139. SCLR2    EQU    0        ;and clear screen sequence
  140. SCLR3    EQU    0        ;the unused bytes MUST be 0
  141. SCLR4    EQU    0
  142.     ENDIF    ;SCRNCLR
  143. ;
  144. ;IF YOU HAVE A PMMI YOU MAY NEED TO CHANGE THE BASE ADDRESS.
  145. ;ALSO, CHANGE PORT NUMBER IN THE PMMI MESSAGE BELOW SYSVERMSG.
  146.      IF    PMMI
  147. PORT     EQU    0C0H    ;PMMI BASE ADDRESS
  148. MODCTLP     EQU    PORT    ;MODEM CONTROL PORT
  149. MODDATP     EQU    PORT+1    ;MODEM DATA PORT
  150. BAUDRP     EQU    PORT+2    ;BAUD RATE PORT
  151. MODCTL2     EQU    PORT+3    ;2ND MODEM CONTROL PORT
  152.      ENDIF    ;PMMI
  153. ;
  154. ;
  155. ;CLOCK SHOULD BE CHANGED TO SUIT YOUR SYSTEM.
  156. ;PMMI USERS SHOULD ALSO CHANGE PULSERATE AND CLDBOOT AS NECESSARY.
  157. ;
  158. ;You can change locations 107H to 120H, and 123H to 125H
  159. ;to suit your taste.
  160. ;
  161. ;*** WARNING - DO NOT INSERT OR DELETE LINES BEFORE SYSVERMSG: ***
  162. ;      THE DEFINED LOCATIONS ARE GIVEN ON THE RIGHT MARGIN.
  163. ;
  164. ;
  165.     ORG 100H
  166. ;
  167.         DS    3    ;(for  JMP  START)
  168. PMMIBYTE:    DB    PMMI    ;don't change this line            103H
  169. SETUPTST:    DB    SETUP    ;don't change this line            104H
  170. SCRNTEST:    DB    SCRNCLR    ;test for home cursor and clear screen    105H
  171.                 ;routine at CLRSCRN, don't change this
  172. CLOCK:        DB    4    ;clock rate in MHz, 8 MHz maximum    106H
  173. BAKUPBYTE:    DB    TRUE     ;true=make .BAK file            107H
  174. CKSUMDFLT:    DB    TRUE     ;true=default to Checksum checking    108H
  175.                 ;false=default to CRC checking
  176. TOGGLECRC:    DB    TRUE    ;true=allow toggling of Checksum to CRC    109H
  177. CONVBKSP:    DB    FALSE    ;true=convert backspace to rub        10AH
  178. TOGGLEBK:    DB    TRUE    ;true=allow toggling of bksp to rub    10BH
  179. ADDLF:        DB    FALSE    ;true=add LF after CR            10CH
  180. TOGGLELF:    DB    TRUE    ;true=allow toggling of LF after CR    10DH
  181. TRANLOGON:    DB    TRUE     ;true=allow transmission of logon    10EH
  182.                 ;write logon sequence at location LOGON
  183. SAVCCP:        DB    TRUE    ;true=do not overwrite CCP        10FH
  184. LOCONEXTCHR:    DB    FALSE    ;true=local command if EXTCHR precedes    110H
  185.                 ;false=not local command if EXTCHR precedes
  186. TOGGLELOC:    DB    TRUE    ;true=allow toggling of LOCONEXTCHR    111H
  187. LSTTST:        DB    TRUE    ;true=allow toggling of printer on/off    112H
  188.                 ;in terminal mode, set to false if your
  189.                 ;printer can't keep up with the modem
  190. XOFFTST:    DB    true     ;true=allow testing of XOFF from remote 113H
  191.                 ;while transmitting a file in terminal mode
  192. XONWAIT:    DB    FALSE    ;true=wait for XON after sending CR    114H
  193.                 ;while transmitting a file in terminal mode
  194. TOGXOFF:    DB    TRUE    ;true=allow toggling of XOFF testing    115H
  195. MSPEED:        DB    5    ;0=110 1=300 2=450 3=600 4=710 5=1200   116H
  196.                 ;6=2400 7=4800 8=9600
  197.                 ;default modem speed, PMMI routines
  198.                 ;reset this value and so should your own
  199.                 ;modem routines
  200. BYTDLY:        DB    0    ;0=0 delay, 1=0.02 sec, -- ,9=0.18 sec    117H
  201.                 ;default time to send character in    
  202.                 ;terminal mode file transfer
  203. CRDLY:        DB    0    ;0=0 delay, 1=0.08 sec, -- ,9=0.72 sec    118H
  204.                 ;default time for extra wait after CR
  205.                 ;in terminal mode file transfer
  206. BELRPT:        DB    30    ;bell repeat time = value*0.03 sec    119H
  207. EXITCHR:    DB    'E'-40H    ; ^E = Exit without disconnect        11AH
  208. LOGCHR:        DB    'O'-40H    ; ^O = Send logon            11BH
  209. LSTCHR:        DB    'P'-40H    ; ^P = Toggle printer            11CH
  210. UNSAVE:        DB    'W'-40H    ; ^W = Close input text buffer        11DH
  211. TRANCHR:    DB    'T'-40H ; ^T = Transmit file to remote        11EH
  212. SAVECHR:    DB    'Y'-40H    ; ^Y = Open input text buffer        11FH
  213. EXTCHR:        DB    '^'-40H    ; ^^ = Send next character        120H
  214. ;
  215. ;Equates used only by PMMI routines grouped together here.
  216. PULSERATE:    DB    125    ;125 for 20pps, 250 for 10pps on PMMI    121H
  217.                 ;not used if PMMI FALSE
  218. CLDBOOT:    DW    00000H    ;currently set to warm boot with    122H
  219.                 ;BYE routine for PMMI, put your cold
  220.                 ;boot entry here if you have one and
  221.                 ;desire to do on BYE
  222. BRKCHR:        DB    '@'-40H ; ^@ = Transmit "BREAK" with PMMI    124H
  223. CHGBAUD:    DB    'B'-40H    ; ^B = Used with PMMI in terminal    125H
  224.                 ;  mode to change baud rate on fly
  225. DISCCHR:    DB    'D'-40H    ; ^D = PMMI Disconnect            126H
  226. ;
  227. IN$MODCTLP:    IN    MODCTLP ! RET    ;in modem control port             127H
  228. OUT$MODDATP:    OUT    MODDATP ! RET    ;out modem data port        12AH
  229. IN$MODDATP:    IN    MODDATP ! RET    ;in modem data port        12DH
  230. ;
  231.     IF    NOT PMMI
  232. ANI$MODSNDB:    ANI    MODSNDB ! RET    ;bit to test for send ready    130H
  233. CPI$MODSNDR:    CPI    MODSNDR ! RET    ;value of send bit when ready    133H
  234. ANI$MODRCVB:    ANI    MODRCVB ! RET    ;bit to test for receive ready    136H
  235. CPI$MODRCVR:    CPI    MODRCVR ! RET    ;value of rcv. bit when ready    139H
  236.         DS    15        ;PMMI only calls        13CH
  237. LOGONPTR:    DW    LOGON        ;                14BH
  238. JMP$INITMOD:    JMP    INITMOD        ;go to user written routine    14DH
  239.     ENDIF    ;NOT PMMI
  240. ;
  241.     IF    PMMI
  242.         DS    12        ;not changed            130H
  243. IN$BAUDRP:    IN    BAUDRP    ! RET    ;in baudrate port        13CH
  244. OUT$BAUDRP:    OUT    BAUDRP    ! RET    ;out baudrate port        13FH
  245. OUT$MODCTL2:    OUT    MODCTL2    ! RET    ;out modem control port #2    142H
  246. OUT$MODCTLP:    OUT    MODCTLP        ;out modem control port        145H
  247.         DS    9        ;not changed            147H
  248.         ENDIF    ;PMMI
  249. ;
  250. JMP$SETUPR:            ;                    150H
  251. ;
  252.     IF     SETUP    
  253.         JMP    SETUPR
  254.     ENDIF    ;SETUP
  255. ;
  256.     IF    NOT SETUP
  257.         RET
  258.         NOP
  259.         NOP
  260.     ENDIF    ;NOT SETUP
  261. ;
  262. CLREOS:        CALL    JMP$ILPRT    ;                153H
  263. ;
  264.     IF    EOSCLR
  265.         DB    CLR1,CLR2,CLR3,CLR4,0
  266.     ENDIF    ;EOSCLR
  267. ;
  268.     IF    NOT EOSCLR
  269.         DB    0,0,0,0,0
  270.     ENDIF    ;NOT EOSCLR
  271. ;
  272.         RET
  273. ;
  274. CLRSCRN:    CALL    JMP$ILPRT    ;                15CH
  275. ;
  276.     IF    SCRNCLR
  277.         DB    SCLR1,SCLR2,SCLR3,SCLR4,0
  278.     ENDIF    ;SCRNCLR
  279. ;
  280.     IF    NOT    SCRNCLR
  281.         DB    0,0,0,0,0
  282.     ENDIF    ;NOT SCRNCLR
  283. ;
  284.         RET
  285. ;
  286. JMP$ILPRT:    DS    3    ;                    165H
  287. JMP$ILCOMP:    DS    3    ;                    168H
  288. JMP$INBUFF:    DS    3    ;                    16BH
  289. JMP$SYSVERMSG:
  290.         IF    PMMI
  291.         DS    3    ;                    16EH
  292.         ELSE
  293.         JMP    SYSVERMSG    ;                16EH
  294.         ENDIF
  295. JMP$DIALPL:    DS    3    ;                    171H
  296. JMP$DISCONNT:    DS    3    ;                    174H
  297. ;
  298. SYSVERMSG:            ;                    16EH
  299. ;
  300.     IF    (NOT VERMSG) AND (NOT PMMI)
  301.     CALL    JMP$ILPRT
  302.     DB    'Version for: UNSPECIFIED SYSTEM',CR,LF,0
  303.             ;NOTE: 0 MUST BE AT END OF ALL ILPRT MESSAGES
  304.     RET
  305.     ENDIF    ;NOT VERMSG AND NOT PMMI
  306. ;
  307. ;This is where the message goes giving the system for
  308. ;which MODEM7 has been customized.
  309.     IF    VERMSG AND (NOT PMMI)
  310.     LXI    D,0CCCCH    ;Take opportunity to force
  311.     MVI    C,12        ;TPM into CP/M 2.2 compatibility mode
  312.     CALL    5
  313.     CALL    SETMSPEED    ;Adjust MSPEED for QX-10 CMOS value
  314.     CALL    JMP$ILPRT
  315.     DB    'Version for: EPSON QX-10 and Hayes Smartmodem 1200',CR,LF,0
  316.     RET
  317.     ENDIF    ;VERMSG AND NOT PMMI
  318. ;
  319. ;
  320.     IF    NOT PMMI
  321.         ;INSERT YOUR LOGON HERE, MUST END IN 0.
  322.         ;FOR A LOGON, PMMI USERS MUST MODIFY MODEM798.ASM
  323. LOGON:
  324.     DB    '+++'    ; ATTENTION STRING FOR SMARTMODEM
  325.     DB    0
  326.     ENDIF    ;NOT PMMI
  327. ;
  328.     IF    (NOT INIT) AND (NOT PMMI)
  329. INITMOD:
  330.     RET
  331.     ENDIF    ;NOT INIT AND NOT PMMI
  332. ;
  333. ;*** WARNING - IF YOU MAKE INITMOD AND SETUPR TOO LONG YOU MAY      ***
  334. ;*** GO BEYOND THE LENGTH OF THE PMMI INITMOD ROUTINE.          ***
  335. ;*** YOU CAN MODIFY UP TO THE BYTE BEFORE NUMBLIB:          ***
  336. ;*** NUMBLIB CURRENTLY IS AT 617H.                  ***
  337. ;*** IF YOU NEED MORE SPACE USE AN APPROPRIATE DS BEFORE NUMBLIB: ***
  338. ;
  339. TPORTS    EQU    7        ; TIMER SETUP PORT
  340. TPORTC    EQU    6        ; TIMER COUNTER PORT
  341. ;
  342. CRAM    EQU    35        ; CMOS RAM BAUD RATE STORAGE
  343. MOSADR    EQU    3DH        ; CMOS RAM ADDRESS PORT
  344. MOSDAT    EQU    3CH        ; CMOS RAM DATA PORT
  345. ;
  346. DSBCD    MACRO
  347.     DB    0EDH,52H
  348.     ENDM
  349. ;
  350. ;
  351. ; MAKE MODEM'S SPEED FLAG MATCH QX-10'S
  352. SETMSPEED:
  353.     MVI    A,CRAM
  354.     OUT    MOSADR
  355.     IN    MOSDAT
  356.     ANI    0FH
  357.     LXI    H,MSPDTBL
  358.     ADD    L
  359.     MOV    L,A
  360.     JNC    SETMSPD2
  361.     INR    H
  362. SETMSPD2:
  363.     MOV    A,M
  364.     STA    MSPEED
  365.     RET
  366. ;
  367. ;
  368. ; THIS TABLE GIVES MSPEED VALUES FOR QX-10 CMOS BAUD RATE VALUES
  369. ; NOTE THAT LOWER RATES DO NOT MATCH AND APPROXIMATIONS ARE USED
  370. MSPDTBL:
  371.     DB    0,0,0,1,3,5,6,7,8
  372. ;
  373. ; THIS TABLE GIVES THE TIMER CHIP DIVISORS FOR EACH BAUD RATE
  374. CSPDTBL:
  375.     DW    110,1135 ; 0
  376.     DW    135,924     ; 1
  377.     DW    150,832     ; 2
  378.     DW    300,416     ; 3
  379.     DW    600,208     ; 4
  380.     DW    1200,104 ; 5
  381.     DW    2400,52     ; 6
  382.     DW    4800,26     ; 7
  383.     DW    9600,13     ; 8
  384. ;
  385. ;
  386. ;
  387. ;The following routine changes the baud rate for the QX-10 from
  388. ;the MENU. Write your own routine here to change your modem
  389. ;parameters from the menu.
  390. ;
  391. ;
  392.     IF    SETUP OR INIT
  393. ;
  394. SETUPR:
  395.     LDAX    D        ;Look at passed-in byte count
  396.     CPI    5        ;Enuf for possible baud rate?
  397.     JC    AGAIN        ;No, prompt for one
  398.     MOV    B,A        ;Save byte count
  399.     INX    D        ;Point to first byte
  400.     CALL    NXTARG        ;Skip to next argument
  401.     MOV    A,B
  402.     JNC    SETUP1
  403. AGAIN:    CALL    JMP$ILPRT
  404.     DB    'Input Baud Rate: ',0
  405.     LXI    D,KEYBUF
  406.     CALL    JMP$INBUFF    ;read baud rate from console
  407.     LXI    D,KEYBUF+1
  408.     LDAX    D
  409.     INX    D
  410. SETUP1:
  411.     MOV    L,A        ;Force null at end of buffer
  412.     MVI    H,0
  413.     DAD    D
  414.     MVI    M,0
  415.     LXI    H,0
  416. GDLUP:
  417.     LDAX    D
  418.     ORA    A
  419.     JZ    GDONE
  420.     SUI    '0'
  421.     JC    BADRATE
  422.     CPI    10
  423.     JNC    BADRATE
  424.     MOV    B,H
  425.     MOV    C,L
  426.     DAD    H
  427.     DAD    H
  428.     DAD    B
  429.     DAD    H
  430.     MVI    B,0
  431.     MOV    C,A
  432.     DAD    B
  433.     INX    D
  434.     JMP    GDLUP
  435. BADRATE:
  436.     CALL    JMP$ILPRT
  437.     DB    CR,LF,'++ Invalid baud rate -- try again ++',CR,LF,0
  438.     JMP    AGAIN
  439. GDONE:
  440.     MOV    A,H
  441.     ORA    L
  442.     JZ    QUIT
  443. ;
  444. ; ENTER HERE WITH BAUD RATE IN HL TO SET BAUD RATE FROM INITMOD
  445. ;
  446. FINDRATE:
  447.     PUSH    H
  448.     LXI    H,CSPDTBL
  449.     SHLD    TBLADR
  450.     POP    H
  451.     LXI    B,900H
  452. CLP:
  453.     PUSH    H
  454.     LHLD    TBLADR
  455.     MOV    E,M
  456.     INX    H
  457.     MOV    D,M
  458.     INX    H
  459.     XTHL
  460.     XCHG
  461.     ORA    A
  462.     DSBCD
  463.     XCHG
  464.     XTHL
  465.     JZ    DOIT
  466.     INX    H
  467.     INX    H
  468.     SHLD    TBLADR
  469.     POP    H
  470.     INR    C
  471.     DCR    B
  472.     JNZ    CLP
  473.     JMP    BADRATE
  474. ;
  475. DOIT:
  476.     POP    D
  477.     MVI    A,0B6H
  478.     OUT    TPORTS
  479.     MOV    A,M
  480.     INX    H
  481.     OUT    TPORTC
  482.     MOV    A,M
  483.     OUT    TPORTC
  484.     CALL    IN$MODDATP
  485.     CALL    IN$MODDATP
  486.     MVI    A,CRAM
  487.     OUT    MOSADR
  488.     MOV    A,C
  489.     OUT    MOSDAT
  490. QUIT:
  491.     JMP    SETMSPEED
  492. ;
  493. NXTARG:
  494.     CALL    SCNTOB
  495.     RC
  496. SCNNB:
  497.     LDAX    D
  498.     CPI    ' '
  499.     RNZ
  500.     INX    D
  501.     DCR    B
  502.     JNZ    SCNNB
  503.     STC
  504.     RET
  505. ;
  506. SCNTOB:
  507.     LDAX    D
  508.     CPI    ' '
  509.     RZ
  510.     RC
  511.     INX    D
  512.     DCR    B
  513.     JNZ    SCNTOB
  514.     STC
  515.     RET
  516. ;
  517. ;
  518. TBLADR:    DW    0
  519. ;
  520. KEYBUF    DB    5,0,0,0,0,0,0,0
  521. ;
  522.     ENDIF    ;SETUP OR INIT
  523. ;
  524. ;
  525.     IF    INIT
  526. INITMOD:
  527.     LDAX    D        ; GET COMMAND BYTE COUNT
  528.     MOV    B,A
  529.     INX    D
  530.     MOV    L,A
  531.     MVI    H,0        ; FORCE CR AT END OF BUFFER
  532.     DAD    D
  533.     MVI    M,0DH
  534. ;
  535.     PUSH    D
  536.     PUSH    B
  537.     LXI    D,5CH+9        ; LOOK AT FIRST FILETYPE
  538.     CALL    JMP$ILCOMP    ; CHECK FOR VALID BAUD RATE
  539.     DB    '110',0
  540.     LXI    H,110
  541.     JNC    GOTRATE
  542.     CALL    JMP$ILCOMP
  543.     DB    '300',0
  544.     LXI    H,300
  545.     JNC    GOTRATE
  546.     CALL    JMP$ILCOMP
  547.     DB    '600',0
  548.     LXI    H,600
  549.     JNC    GOTRATE
  550.     CALL    JMP$ILCOMP
  551.     DB    '120',0
  552.     LXI    H,1200
  553.     JNC    GOTRATE
  554.     CALL    JMP$ILCOMP
  555.     DB    '240',0
  556.     LXI    H,2400
  557.     JNC    GOTRATE
  558.     CALL    JMP$ILCOMP
  559.     DB    '480',0
  560.     LXI    H,4800
  561.     JNC    GOTRATE
  562.     CALL    JMP$ILCOMP
  563.     DB    '960',0
  564.     LXI    H,9600
  565.     JC    NORATE
  566. GOTRATE:
  567.     CALL    FINDRATE
  568. NORATE:
  569.     POP    B        ; RESTORE COMMAND LINE BYTE COUNT
  570.     POP    D        ; RESTORE COMMAND LINE TEXT POINTER
  571. SCNBSL:
  572.     LDAX    D        ; LOOK AT FIRST CHAR OF ARG
  573.     CPI    '\'        ; BACKSLASH?
  574.     JZ    GOTBSL
  575.     CALL    NXTARG
  576.     JNC    SCNBSL
  577.     RET
  578. GOTBSL:
  579.     MVI    A,0DH        ; MAKE STUFF AFTER \ DISAPPEAR
  580.     STAX    D        ; SO MFACCESS ISN'T CONFUSED
  581.     INX    D
  582.     LXI    H,6CH+1        ; POINT TO 2ND FCB
  583.     MOV    A,M
  584.     CPI    '\'        ; DID WE WIND IN 2ND FILENAME?
  585.     JNZ    BSLOK        ; NO, SKIP AHEAD
  586.     DCX    H
  587.     MVI    M,0        ; ZAP DRIVE OF 2ND FCB
  588.     MVI    B,11
  589. ZFL1:
  590.     INX    H
  591.     MVI    M,' '
  592.     DCR    B
  593.     JNZ    ZFL1
  594.     MVI    B,4
  595. ZFL2:
  596.     INX    H
  597.     MVI    M,0
  598.     DCR    B
  599.     JNZ    ZFL2
  600. BSLOK:
  601.     CALL    MIN        ; EMPTY GARBAGE CHARS FROM MODEM
  602.     JNC    BSLOK        ; LOOP TILL TIMEOUT
  603.     LXI    H,ATS        ; SEND INITIAL STRING TO MODEM
  604.     CALL    SEND
  605.     CALL    GET        ; LOOK FOR REPLY
  606. TIM:
  607.     JC    TIMOT        ; WE MIGHT HAVE TIMED OUT
  608.     JNZ    ERR
  609.     LXI    H,AT        ; GET ATTENTION STRING
  610.     CALL    SEND        ; SEND IT
  611.     XCHG            ; NOW SEND OUR COMMAND
  612.     CALL    SEND
  613.     MVI    C,CR        ; END IT WITH RETURN
  614.     CALL    PUT
  615.     CALL    MIN        ; READ THE ECHOED CR
  616.     CALL    GETX        ; GET RESULT (NO TIMEOUT)
  617.     JNZ    ERR
  618.     CPI    '1'        ; ON LINE?
  619.     JZ    ONLIN
  620.     CPI    '5'        ; ON LINE 1200?
  621.     JZ    ONLIN
  622.     CPI    '0'        ; OTHER NORMAL RESULT?
  623.     RZ            ; YUP, QUIT
  624.     PUSH    PSW        ; SAVE STATUS
  625.     LXI    H,ATV1
  626.     CALL    SEND        ; RESTORE VERBOSE MODE
  627.     POP    PSW
  628.     CPI    '3'
  629.     JZ    CAR        ; NO CARRIER ?
  630.     CPI    '4'
  631.     JZ    BAD        ; BAD COMMAND?
  632. ERR:
  633.     CALL    JMP$ILPRT
  634.     DB    CR,LF,'Bad response from DC Hayes.',0
  635.     RET
  636. GET:
  637.     CALL    MIN        ; READ WITH TIMEOUT
  638.     RC
  639.     MOV    C,A        ; SAVE CHAR
  640.     CALL    MIN
  641.     RC
  642.     CPI    CR        ; 2ND SHOULD BE CR
  643.     MOV    A,C
  644.     RET
  645. GETX:
  646.     CALL    MINX        ; READ W/O TIMEOUT FOR RESULT
  647.     MOV    C,A        ; COULD TAKE A WHILE FOR DIALING, ETC.
  648.     CALL    MINX        ; GET FOLLOWING CR
  649.     CPI    CR
  650.     MOV    A,C
  651.     RET
  652. MINX:
  653.     CALL    MRCVRDY        ; CHECK FOR A CHAR
  654.     JZ    MXGOT        ; JUMP IF WE GOT ONE
  655.     PUSH    B
  656.     PUSH    D
  657.     PUSH    H
  658.     MVI    C,11        ; DO ABORT CHECK
  659.     CALL    5
  660.     ORA    A
  661.     JZ    NO        ; SKIP IF NO KEY STRUCK
  662.     MVI    C,1
  663.     CALL    5        ; GOT KEY -- EAT IT
  664.     CALL    PUT        ; SEND IT TO MODEM (WILL CAUSE ABORT)
  665. NO:
  666.     POP    H
  667.     POP    D
  668.     POP    B
  669.     JMP    MINX
  670. GOT:
  671.     POP    D
  672. MXGOT:
  673.     CALL    IN$MODDATP
  674.     ANI    7FH
  675.     RET
  676. MIN:
  677.     PUSH    D
  678.     LXI    D,16000        ;SET A TIMEOUT
  679. WTST:
  680.     CALL    MRCVRDY        ;CHECK FOR READY
  681.     JZ    GOT        ;EXIT WITH CHARACTER
  682.     DCX    D
  683.     MOV    A,D        ;COUNT DOWN TIMEOUT
  684.     ORA    E
  685.     JNZ    WTST
  686.     STC
  687.     POP    D        ;QUIT WITH TIMEOUT
  688.     RET
  689. ;
  690. MRCVRDY:            ; TEST FOR MODEM RECEIVE READY
  691.     CALL    IN$MODCTLP
  692.     CALL    ANI$MODRCVB
  693.     CALL    CPI$MODRCVR
  694.     RET
  695. ;
  696. SEND:
  697.     MOV    A,M        ;GET A CHARACTER
  698.     INX    H
  699.     ORA    A        ;END OF THE STRING?
  700.     RZ
  701.     CPI    0DH
  702.     RZ
  703.     ANI    7FH
  704.     MOV    C,A        ;NO, SEND IT
  705.     CALL    PUT
  706.     CALL    MIN        ;EAT ECHO
  707.     JNC    SEND
  708.     POP    H        ;DITCH RETURN
  709.     JMP    TIMOT        ;GO COMPLAIN
  710. PUT:
  711.     CALL    IN$MODCTLP    ;GET MODEM STATUS
  712.     CALL    ANI$MODSNDB    ;TEST SEND BITS
  713.     CALL    CPI$MODSNDR
  714.     JNZ    PUT
  715.     MOV    A,C
  716.     JMP    OUT$MODDATP
  717. ;
  718. TIMOT:
  719.     CALL    JMP$ILPRT
  720.     DB    CR,LF,'No response from DC Hayes.',0
  721.     RET
  722. ONLIN:
  723.     CALL    JMP$ILPRT
  724.     DB    CR,LF,'On line.',0
  725.     RET
  726. CAR:
  727.     CALL    JMP$ILPRT
  728.     DB    CR,LF,'No carrier detected.',0
  729.     RET
  730. BAD:
  731.     CALL    JMP$ILPRT
  732.     DB    CR,LF,'Bad command.',0
  733.     RET
  734. ;
  735. AT:
  736.     DB    'AT ',0
  737. ATV1:
  738.     DB    'AT V1',CR+80H,0
  739. ATS:
  740.     DB    'AT S10=30 V0 X1 ',CR+80H,0
  741. ;
  742.     ENDIF    ;INIT
  743. ;
  744.     END
  745.