home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / mex / mxo-rs.asm < prev    next >
Assembly Source File  |  1994-07-13  |  22KB  |  702 lines

  1. ;   Title    'MEX overlay for the TRS-80 MOD IV version 1.7'    
  2. ;                      Montezuma Micro CP/M 2.2
  3. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  4. ; MEX TRS-80 MOD IV OVERLAY VERSION 1.0: Written 09/10/84 by Ed Richter 
  5. ;
  6. ; VERSION 1.8 02/22/86 - Auto answer modified to work with the 
  7. ;                        Model 4p internal modem command structure.
  8. ;                        Ignore all references to Hayes compatability.
  9. ;                                               Bob Kitchen
  10. ;                                               73756,1015
  11. ; VERSION 1.7 01/25/85 - ^C in "auto-answer" now aborts to CPM, not
  12. ;             MEX (sorry bout that one).  Added code to
  13. ;             determine baud rate in "auto-answer".
  14. ;             Changed "NITMOD" to default  to the baud 
  15. ;             rate selected by "MSPEED"     
  16. ;                        Ed Richter
  17. ;                        71455,1133    
  18. ; VERSION 1.6 01/21/85 - A system reset seems a little drastic
  19. ;                        so added code for a ^C abort to auto
  20. ;              answer. Also added "number of rings" 
  21. ;             equate.
  22. ;                         Ed Richter
  23. ; VERSION 1.5 11/17/84 - Added SET ANSWER ON command
  24. ;             (For Hayes-compatible modems
  25. ;              only...see NOTE below.)
  26. ;                        Thom Foulks
  27. ; VERSION 1.3 10/10/84 - Fixed bug in the Printer ready test
  28. ;                                                 Ed Richter
  29. ; VERSION 1.2 09/18/84 - Added the comments to 1.1 and changed the
  30. ;             configuration of the SET message that is
  31. ;             output to the console
  32. ;                           Ed Richter 
  33. ; VERSION 1.1 09/16/84 - Added code to fully control the SIO USART
  34. ;                 via the SET command. This overlay now 
  35. ;             supports-- SET BAUD -- SET PARITY --
  36. ;             SET STOP BITS -- SET WORD LENGTH --
  37. ;                                                   Ed Richter
  38. ; This file was derived from the MDM7xx overlay M7R4-5.ASM, and the 
  39. ; file MXOPM10.ASM. It is a MEX overlay for use with the TRS-80 MOD
  40. ; IV, and an external modem. It has a SET command that supports 300
  41. ; though 9600 baud.
  42. ;
  43. ; The SMARTMODEM, and compatibles will answer the phone at the
  44. ; incoming caller's baud rate. This makes it necessary to insure
  45. ; that the SIO-USART is configured to the same speed. This progam
  46. ; will answer the phone at the MSPEED baud rate. If it cannot
  47. ; read characters at that speed it will start at 110 baud (BAUD vector 
  48. ; set to 0), check for a CR, LF, or ^C. If it is unable to read a
  49. ; character at that speed it will increment the baud rate to 1200
  50. ; (the - CPI '6' - in the SKPBAUD routine), and retry at each step.
  51. ; To change the upper limit (1200) change the  CPI '6' to the MSPEED
  52. ; value +1. ie., CPI '10' for 19200.
  53. ;
  54. ; NOTE: This overlay must be used in congunction with MXO-4P.ASM
  55. ; for full modem control.  The SET ANSWER command will place MEX
  56. ; into an auto-answer mode which may be exited prior to execution
  57. ; with a ^C - CONTROL C -  it's intended for use with a READ file
  58. ; similar to Bruce Morgen's WELCOME3 or WELCOME4.
  59. ;                                      - Thom Foulks
  60. ;
  61. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  62. REV:         EQU    16
  63. ;
  64. CR:        EQU    0DH    ;carriage return
  65. LF:        EQU    0AH    ;linefeed
  66. TPA:        EQU    0100H
  67. TAB:        EQU    09H    
  68. YES:        EQU    0FFH
  69. NO:        EQU    0
  70. RING:        EQU    '2'    ;number of rings for auto-answer
  71. WMBOOT:        EQU    05B39H    ;MEX114.COM cpm stack pointer storage address
  72. ;
  73. ;
  74. ; Change the following information to match your equipment.
  75. ; PORT should be set to the base port address for the RS-232 port.
  76. ;
  77. PORT:        EQU    0E8H    ;master reset port   
  78. MODCT1:        EQU    PORT+2    ;modem control port
  79. MODDAT:        EQU    PORT+3    ;modem data in port
  80. MODCT2:        EQU    PORT+2    ;not used mod iv
  81. BAUDRP:        EQU    PORT+1    ;baud rate port
  82. MDRCVB:        EQU    080H    ;bit to test for receive
  83. MDRCVR:        EQU    080H    ;value when ready
  84. MDSNDB:        EQU    040H    ;bit to test for send
  85. MDSNDR:        EQU    040H    ;value when ready
  86. ;
  87. MODCTB:        EQU    0ECH    ;dtr,rts,8,no,1 for port initialize
  88. CTSMSK:        EQU    020H    ;carrier detect mask
  89. ISOCD:        EQU    0DFH    ;port ready mask
  90. PRPORT:        EQU    0F8H    ;printer port
  91. PRSTAT:        EQU    0C0H    ;printer ready mask
  92. BRKMSK:        EQU    0E3H    ;send break
  93. DTRMSK:        EQU    0EBH    ;drop dtr
  94. ;
  95. ;MEX SERVICE PROCESSOR STUFF
  96. ;
  97. MEX:        EQU    0D00H    ;address of the service processor
  98. INMDM:        EQU    255    ;get char from port,CY=no more in 100ms
  99. TIMER:        EQU    254    ;delay 100 ms * reg b
  100. TMDINP:        EQU    253    ;b=# secs to wait for char,CY=no char
  101. CHEKCC:        EQU    252    ;check for ^C from kbd, Z=present
  102. SNDRDY:        EQU    251    ;test for modem-send ready
  103. RCVRDY:        EQU    250    ;test for modem-receive ready
  104. SNDCHR:        EQU    249    ;send to modem (after SNDRDY)
  105. RCVCHR:        EQU    248    ;recv a char from modem after (RCVRDY)
  106. LOOKUP:        EQU    247    ;table search: see CMDTBL for info 
  107. PARSFN:        EQU    246    ;parse filename from input stream 
  108. BDPARS:        EQU    245    ;parse baud-rate from input stream
  109. SBLANK:        EQU    244    ;scan input stream to next non-blank
  110. EVALA:        EQU    243    ;evaluate numeric from input stream
  111. LKAHED:        EQU    242    ;get nxt char w/o removing from input
  112. GNC:        EQU    241    ;get char from input, CY=1 if none
  113. ILP:        EQU    240    ;inline print
  114. DECOUT:        EQU    239    ;decimal output
  115. PRBAUD:        EQU    238    ;print baud rate
  116. CONOUT:        EQU    2    ;simulated BDOS funct 2:CONSOLE OUT
  117. PRINT:        EQU    9    ;simulated BDOS funct 9: PRINT STRING
  118. INBUF:        EQU    10    ;input buffer, same as BDOS FUNCT 10
  119. ;
  120.         ORG    0D11H    ;install printer ready test
  121.         DW    PRTSTS
  122.         ORG    TPA
  123. ;
  124. ;
  125.         DS    3    ;(for  "JMP   START" instruction)
  126. PMODEM:        DB    NO    ;Not used by MEX            103H
  127. SMODEM:        DB    NO    ;Not used by MEX
  128. TPULSE:        DB    '*'    ;Not used by MEX            105H
  129. CLOCK:        DB    48    ;clock speed in MHz x10, 25.5 MHz max.    106H
  130.                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  131. MSPEED:        DB    1    ;0=110 1=300 2=450 3=600 4=710 5=1200    107H
  132.                 ;6=2400 7=4800 8=9600 9=19200 default
  133. BYTDLY:        DB    1    ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108H
  134.                 ;default time to send character in ter-
  135.                 ;minal mode file transfer for slow BBS.
  136. CRDLY:        DB    1    ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  137.                 ;default time for extra wait after CRLF
  138.                 ;in terminal mode file transfer
  139. COLUMS:        DB    5    ;number of DIR columns shown        10AH
  140. SETFL:        DB    YES    ;yes=user-added Setup routine        10BH
  141. SCRTST:        DB    YES    ;Cursor control routine         10CH
  142.         DS    1    ;reserved (old ACKNAK flag)        10DH
  143. BAKFLG:        DB    YES     ;yes=change any file same name to .BAK    10EH
  144. CRCDFL:        DB    YES    ;yes=default to CRC checking        10FH
  145. TOGCRC:        DB    YES    ;yes=allow toggling of CRC to Checksum    110H
  146. CVTBS:        DB    NO    ;yes=convert backspace to rub        111H
  147. TOGLBK:        DB    YES    ;yes=allow toggling of bksp to rub    112H
  148. ADDLF:        DB    NO    ;no=no LF after CR to send file in    113H
  149.                 ;terminal mode (added by remote echo)
  150. TOGLF:        DB    YES    ;yes=allow toggling of LF after CR    114H
  151. TRNLOG:        DB    YES    ;yes=allow transmission of logon    115H
  152.                 ;write logon sequence at location LOGON
  153. SAVCCP:        DB    YES    ;yes=do not overwrite CCP        116H
  154. LOCNXT:        DB    NO    ;yes=local command if EXTCHR precedes    117H
  155.                 ;no=external command if EXTCHR precedes
  156. TOGLOC:        DB    YES    ;yes=allow toggling of LOCONEXTCHR    118H
  157. LSTTST:        DB    YES    ;yes=allow toggling of printer on/off    119H
  158. XOFTST:        DB    YES    ;yes=checks for XOFF from remote while    11AH
  159.                 ;sending a file in terminal mode
  160. XONWT:        DB    NO    ;yes=wait for XON after CR while    11BH
  161.                 ;sending a file in terminal mode
  162. TOGXOF:        DB    YES    ;yes=allow toggling of XOFF checking    11CH
  163. IGNCTL:        DB    YES    ;yes=CTL-chars above ^M not displayed    11DH
  164. EXTRA1:        DB    0    ;for future expansion            11EH
  165. EXTRA2:        DB    0    ;for future expansion            11FH
  166. BRKCHR:        DB    'K'-40H    ;^K = Send 300 ms. break tone        120H
  167. NOCONN:        DB    'N'-40H    ;^N = Disconnect from the phone line    121H
  168. LOGCHR:        DB    'L'-40H    ;^L = Send logon            122H
  169. LSTCHR:        DB    'P'-40H    ;^P = Toggle printer            123H
  170. UNSVCH:        DB    'R'-40H    ;^R = Close input text buffer        124H
  171. TRANCHR:    DB    'T'-40H ;^T = Transmit file to remote        125H
  172. SAVECHR:    DB    'Y'-40H    ;^Y = Open input text buffer        126H
  173. EXTCHR:        DB    '^'-40h    ;^^ = Send next character        127H
  174.         DS    2
  175. INCTL1:        JMP     STATSND    ;go to "get status"             12AH
  176.         DS    7
  177. OTDATA:        OUT    MODDAT  ! RET    ;out modem data port        134H
  178.         DS    7
  179. INPORT:        IN    MODDAT  ! RET    ;in modem data port
  180.         DS    7
  181. MASKR:        ANI    MDRCVB    ! RET    ;bit to test for receive ready    148H
  182. TESTR:        CPI    MDRCVR    ! RET    ;value of rcv. bit when ready    14BH
  183. MASKS:        ANI    MDSNDB    ! RET    ;bit to test for send ready    14EH
  184. TESTS:        CPI    MDSNDR    ! RET    ;value of send bit when ready    151H
  185.         DS    12        ;unused by MEX
  186. LOGON:        DS    2        ;for user message        160H
  187. DIALV:        DS    3        ;autodial rtn jump        162H
  188. DISCV:        JMP    DISCON        ;disconnect rtn
  189. GOODBV:        DS    3        ;not needed            168H
  190. INMODV:        JMP    NITMOD        ;go to user written routine    16BH
  191. NEWBDV:        JMP    PBAUD        ;set new baud-rate           16EH
  192. NOPARV:        DS    3        ;(by-pass PMMI routine)        171H
  193. PARITV:        DS    3        ;(by-pass PMMI routine)        174H
  194. SETUPV:        JMP    SETCMD        ;initialize USART and modem    177H
  195. SPMENV:        DS    3        ;not used with MEX        17AH
  196. VERSNV:        JMP    SYSVER        ;print header msg        17DH
  197. BREAKV:        JMP    PBREAK        ;send header            180H
  198. ; Do not change the following six lines.
  199. ILPRTV:        DS    3        ;                183H
  200. INBUFV:        DS    3        ;                186H
  201. ILCMPV:        DS    3        ;                189H
  202. INMDMV:        DS    3        ;                18CH
  203. NXSCRV:        DS    3        ;                18FH
  204. TIMERV:        DS    3        ;                192H
  205. ;
  206. ; Routine to clear to end of screen.  If using CLREOS and CLRSCRN, set
  207. ; SCRNTEST to YES at 010AH (above).
  208. ;
  209. CLREOS:        LXI    D,EOSMSG    ;clear to end of screen         195H
  210.         MVI    C,PRINT        ;from cursor
  211.         CALL    MEX        ;                198H
  212.         RET            ;                19DH
  213. ;
  214. CLS:        LXI    D,CLSMSG    ;clear sreen            19EH
  215.         MVI    C,PRINT
  216.         CALL    MEX        ;                1A1H
  217.         RET            ;                1A6H
  218.     
  219. ;
  220. SYSVER:        LXI    D,SOMESG    ;print the sys version msg    1A7H
  221.         MVI    C,PRINT
  222.         CALL    MEX        
  223.         CALL    CRLF        
  224. ;
  225. CARRSH        LXI    D,NOMESG    ;no carrier present msg
  226.         CALL    CARRCK
  227.         MVI    C,PRINT
  228.         CNZ    MEX        ;print if no carrier
  229.         LXI    D,CARMSG    ;carrier present
  230.         MVI    C,PRINT
  231.         CALL    MEX        ;say so and continue
  232.         RET
  233. ;
  234. ; Send a break tone to reset some time-share computers.
  235. ;
  236. PBREAK:        MVI    A,BRKMSK    ;send break
  237.         OUT    MODCT1
  238.          RET
  239. ;
  240. ; Routine to return status of the modem port
  241. ;
  242. STATSND:    IN    MODCT1        ;in modem contol port
  243.         PUSH     B        ;just in case
  244.         ANI    ISOCD        ;isolate status and clear CD bit
  245.         MOV    B,A        ;save status
  246.         IN     PORT        ;get CD bit
  247.         ANI    CTSMSK        ;isolate CD bit
  248.         ORA    B        ;merge CD with status
  249.         POP    B        ;restore B
  250.         RET
  251. ;
  252. ; This routine will hang up the phone by dropping DTR.
  253. ;
  254. DISCON:          MVI     A,DTRMSK    ;DTR off, send BRK
  255.               OUT    MODCT1        ;send cmd
  256.           MVI    B,5        
  257.           MVI    C,TIMER
  258.           CALL    MEX        ;delay 500 msec
  259.         MVI    A,MODCTB    ;normal setup DTR on
  260.           OUT    MODCT1
  261.           RET
  262. ;
  263. ; This area sets the SIO-UART to an initial value of 8 bits, no parity,
  264. ; DTR on, and RTS on. 
  265. ;
  266. NITMOD:          MVI    A,1
  267.           OUT    PORT        ;reset the USART to
  268.           MVI    A,MODCTB    ;8,no,1,DTR, and RTS
  269.           OUT    MODCT1
  270.         LXI    H,MSPEED
  271.         MOV    A,M        ;initalize to MSPEED baud rate
  272.         CALL    PBAUD        ;get baud rate
  273.           RET            ;also change the value of MSPEED
  274. ;
  275. ;  Sets the modem speed via the SET COMMAND.
  276. ;
  277. SETCMD:        MVI    C,SBLANK    ;any arguments
  278.         CALL    MEX
  279.         JC    SETSHO        ;if not print out values
  280.         LXI    D,CMDTBL    ;parse commands
  281.         CALL    TSRCH        ;from table
  282.         PUSH    H        ;address on stack
  283.         RNC            ;if yes then execute it
  284.         POP    H        ;no fix stack
  285. SETERR:          LXI    D,SETEMS    ;no then print error
  286.           MVI     C,PRINT
  287.           CALL    MEX
  288.           RET
  289. CMDTBL:        DB    '?'+80H        ;"set ?"
  290.         DW    STHELP
  291.         DB    'BAU','D'+80H    ;"set baud ?'
  292.         DW    STBAUD
  293.         DB    'WOR','D'+80H    ;set word length
  294.         DW    STWORD
  295.         DB    'PARIT','Y'+80H ;set parity
  296.         DW    STPAR
  297.         DB    'STO','P'+80H    ;set stop bits
  298.         DW    STSTOP
  299.                 DB       'ANSWE','R'+80H ;set auto-answer on
  300.         DW    STANS
  301.         DB    0    
  302. SETSHO:        CALL    CLS        ;clear screen
  303.         CALL    CARRSH        ;carrier present
  304.         LXI    H,SHOTBL    ;show subroutines table
  305. SETSLP:     MOV    E,M        ;get table address
  306.         INX    H
  307.         MOV    D,M
  308.         INX    H
  309.         MOV    A,D        ;end of table
  310.         ORA    E
  311.         RZ            ;exit if yes
  312.         PUSH    H        ;save table pointer
  313.         XCHG            ;addrs to HL
  314.         CALL    GOHL        ;do it
  315.         CALL    CRLF        ;print newline
  316.         MVI    C,CHEKCC    ;check for console abort
  317.         CALL    MEX        
  318.         POP    H        ;its done
  319.         JNZ    SETSLP        ;continue if no abort
  320.         RET
  321. GOHL:        PCHL
  322. SHOTBL:        DW    BDSHOW        ;table
  323.         DW    PARSHOW
  324.         DW    WLSHOW
  325.         DW    STSHOW
  326.         DW    0
  327. STHELP:        LXI    D,HLPMSG    ;print help message
  328.         MVI    C,PRINT
  329.         CALL    MEX
  330.         RET
  331. STBAUD:        MVI    C,BDPARS    ;MEX find baud rate        
  332.         CALL    MEX
  333.         JC     SETERR        ;none then exit
  334.         CALL    PBAUD        ;valid baud rate then set it
  335.         JC     SETERR        ;exit if not supported by overlay
  336. BDSHOW:        CALL    ILPRT
  337.         DB    'Baud Rate:',TAB,' ',0
  338.         LDA    MSPEED        ;get MSPEED to determine present
  339.         MVI    C,PRBAUD    ;baud rate
  340.         CALL    MEX
  341.         RET    
  342. STPAR:        LXI    D,PARTBL    ;find parity function requested
  343.         CALL    TSRCH
  344.         PUSH    H
  345.         RNC            ;execute it
  346.         POP    H
  347.         JMP    SETERR        ;not valid then say so         
  348. STWORD:        LXI    D,WLTBL        ;find word length function requested
  349.         CALL    TSRCH
  350.         PUSH    H
  351.         RNC            ;execute it
  352.         POP    H
  353.         JMP    SETERR        ;not valid then say so
  354. STSTOP:        LXI    D,STTBL        ;find how many stop bits 
  355.         CALL    TSRCH
  356.         PUSH    H
  357.         RNC            ;execute it
  358.         POP    H
  359.         JMP    SETERR        ;not valid then say so 
  360. STANS:          CALL    CLS        ;clear the screen
  361.         PUSH    H        ;save H
  362.         LXI    H,ANSON        ;get the set command
  363.         CALL    SMSEND        ;send it
  364.         POP    H
  365.         CALL    CRLF        ;get ready for msg
  366.         CALL    CRLF
  367.         LXI    D,ANSMSG    ;and tell us about it
  368.         MVI    C,PRINT
  369.         CALL    MEX
  370. WAITCD:        CALL    INPORT        ;to  clear garbage
  371.         CALL    CARRCK        ;check for carrier
  372.         JZ    TSTBAUD        ;yes - go check baud rate...
  373.         MVI    C,CHEKCC    ;no check for ^C
  374.         CALL    MEX
  375.         JNZ    WAITCD        ;no carrier, no ^C so try again
  376.         PUSH    H        ;save H
  377.         LXI    H,ANSOFF    ;turn off auto answer at modem
  378.         CALL    SMSEND        ;send it
  379.         POP    H
  380.         LHLD    WMBOOT        ;^C -load CPM return address from
  381.                     ;stack pointer storage 
  382.         SPHL            ;put it in the stack pointer
  383.         RET            ;and go to CPM
  384. TSTBAUD:    CALL    INPORT        ;get byte from modem
  385.         CPI    CR        ;if CR            
  386.         RZ            ;baud rate is good go to MEX
  387.         CPI    LF        ;if LF
  388.         RZ            ;baud rate is good go to MEX
  389.         CPI    'C'-40H     ;if ^C
  390.         RZ            ;baud rate is good go to MEX
  391.         PUSH    H
  392.         PUSH    B
  393.         PUSH    D
  394.         LXI    H,BAUD        ;get baud rate start byte
  395.         MOV    A,M        ;get it out of memory    
  396.         MOV    C,A        ;set it up to operate on it
  397.         INR    C        ;add 1 to it
  398.         MOV    M,C        ;and put it back in start byte
  399.         CALL    PBAUD        ;go set baud rate and MSPEED
  400.         CPI    6        ;have we tried 1200 baud
  401.         JNZ    TSTBAUD        ;no then we're not done
  402.         XRA    A        ;yes then get ready for retry
  403.         STA    BAUD        ;by setting baud back to 110
  404.         POP    D
  405.         POP    B
  406.         POP    H
  407.         JMP    WAITCD        ;we didn't find a good baud rate
  408.                     ;so keep trying until - 1. get a
  409.                     ;good baud rate  2. get a ^C, or
  410.                     ;3. hangup causes carrier loss.
  411. ;
  412. HLPMSG:    DB    CR,LF,1AH,'SET command, TRS MOD 4 version 1.8',CR,LF
  413.     DB    CR,LF,'SET BAUD 300 <or> 1200 <or> 2400 <or> 4800 <or> 9600'
  414.     DB    CR,LF,'SET PARITY ON <or> OFF <or> ODD <or> EVEN'
  415.     DB    CR,LF,'SET WORD 5 <or> 6 <or> 7 <or> 8'
  416.     DB    CR,LF,'SET STOP 1 <or> 2'
  417.         DB    CR,LF,'SET ANSWER <on> '
  418.     DB    CR,LF,LF,'Auto Answer configured for the Model 4p internal'
  419.     DB    ' modem only.',CR,LF
  420.     DB    CR,LF,'$'        
  421. SETEMS:          DB    CR,LF,'SET command error',CR,LF,LF,'$'
  422. TSRCH:        MVI    C,LOOKUP
  423.           JMP    MEX
  424. ;
  425. ILPRT:        MVI    C,ILP        ;MEX print function
  426.         JMP    MEX
  427. ;
  428. CRLF:        MVI    A,CR        ;newline on console
  429.         CALL    TYPE
  430.         MVI    A,LF
  431. TYPE:        PUSH    H        ;save em
  432.         PUSH    D
  433.         PUSH    B
  434.         MOV    E,A
  435.         MVI    C,CONOUT    ;align output char
  436.         CALL    MEX        ;print via mex
  437.         POP    B        ;restore em
  438.         POP    D
  439.         POP    H
  440.         RET        
  441. ;
  442. ; Test for printer ready
  443. ;
  444. PRTSTS:          IN    PRPORT        ;get printer status
  445.           ANI    PRSTAT        ;isolate it
  446.           JNZ    PRTSTS1        ;return if not ready A=00
  447.           MVI    A,0FFH        ;ready A=FF 
  448.         RET
  449. PRTSTS1:    XRA    A
  450.         RET
  451. ; Carrier detect  0=CARRIER
  452. ;
  453. CARRCK:        IN    PORT        ;get carrier bit
  454.         ANI    CTSMSK
  455.         RET
  456. ;    
  457. ; Baud rate set routine 
  458. ;
  459. PBAUD:          PUSH    H        ;save everybody
  460.           PUSH    B
  461.           PUSH    D
  462.         MOV    E,A        ;get speed
  463.         MVI    D,0        ;zero the other half of reg pair
  464.         LXI    H,BAUDTB    ;get baud rate table address
  465.         DAD    D        ;add speed offset
  466.         MOV    A,M        ;get baud rate  
  467.         ORA    A        ;0=not valid baud rate
  468.         JZ    PBEXIT        ;not valid baud rate then exit
  469.         OUT    BAUDRP        ;good baud rate then set it
  470.         MOV    A,E        ;get speed 
  471.         STA    MSPEED        ;set speed
  472.         JMP    PBEXIT1        ;return 
  473. PBEXIT:        STC
  474. PBEXIT1:    POP    B        ;no carrier or incorrect baud rate
  475.           POP    D
  476.           POP       H
  477.           RET
  478. ;
  479. BAUDTB:        DB    0,055H,0,0,0        ;110,300,450,610,710
  480.         DB    077H,0AAH,0CCH,0EEH,0    ;1200,2400,4800,9600,19200
  481. ;
  482. STTBL:        DB    '1'+80H        ;stop bit tabe
  483.         DW    STONE        ;set one bit
  484.         DB    '2'+80H
  485.         DW    STTWO        ;set two bits
  486.         DB    0
  487. ;
  488. PARTBL:        DB    'O','N'+80H    ;parity table
  489.         DW    STON        ;enable parity
  490.         DB    'OF','F'+80H
  491.         DW    STOFF        ;disable parity
  492.         DB    'EVE','N'+80H
  493.         DW    STEVE        ;even parity
  494.         DB    'OD','D'+80H
  495.         DW    STODD        ;odd parity    
  496.         DB    0
  497. ;
  498. WLTBL:        DB    '5'+80H        ;word length table
  499.         DW    STFIVE        ;5 bit length
  500.         DB    '6'+80H
  501.         DW    STSIX        ;6 bit length
  502.         DB    '7'+80H
  503.         DW    STSEV        ;7 bit length
  504.         DB    '8'+80H
  505.         DW    STATE        ;8 bit length
  506.         DB    0
  507. ;
  508. STFIVE:        MVI     A,MODCTB    ;get current port info
  509.         ANI    09FH        ;change to 5 bits
  510.         STA    MODCTB        ;put back new port info
  511.         MVI    A,'5'        ;set 5 bit flag
  512. STFIVE1:    STA    WLTEL        
  513.         CALL    CARRCK        ;carrier present
  514.         RZ            ;yep then continue
  515.         CALL    TYPE        ;position cursor
  516.         CALL    WLSHOW        ;nope show word length
  517.         RET
  518. STSIX:        MVI    A,MODCTB    ;get current port info 
  519.         ORI    040H        ;set six bits    
  520.         ANI    0DFH
  521.         STA    MODCTB        ;put new 
  522.         MVI    A,'6'        ;set six bit flag
  523.         JMP    STFIVE1
  524. STSEV:        MVI    A,MODCTB    ;get current port info
  525.         ORI    020H        ;set seven bits
  526.         ANI    0BFH
  527.         STA    MODCTB        ;put back new port info
  528.         MVI    A,'7'        ;set 7 bit flag            
  529.         JMP    STFIVE1
  530. STATE:        MVI    A,MODCTB    ;get current port info
  531.         ORI    060H        ;set eight bit
  532.         STA    MODCTB        ;put back new port info
  533.         MVI    A,'8'        ;set 8 bit flag
  534.         JMP    STFIVE1
  535. ;
  536. STON:        MVI    A,MODCTB    ;get current port info
  537.         ANI    0F7H        ;set parity on
  538.               STA    MODCTB        ;put back new port info
  539.         MVI    A,YES
  540. STON1:        STA    PARTEL        ;set parity on flag
  541.         CALL    CARRCK        ;carrier present
  542.         RZ            ;yep then continue
  543.         CALL    TYPE        ;position cursor
  544.         CALL    PARSHOW        ;nope then show parity info 
  545.         RET
  546. STOFF:        MVI    A,MODCTB    ;get curent port info
  547.         ORI    008H        ;set parity off
  548.         STA    MODCTB        ;put back new port info
  549.         MVI    A,NO        ;set no parity flag
  550.         JMP    STON1    
  551. STODD:        MVI    A,MODCTB    ;get current port info
  552.         ANI    07FH        ;set parity odd
  553.         STA    MODCTB        ;put back new port info
  554.         MVI    A,YES        ;set parity odd flag
  555. STODD1:        STA    PARTEL1
  556.         CALL    CARRCK        ;carrier present
  557.         RZ            ;yep then return
  558.         CALL    TYPE        ;position cursor
  559.         CALL    PARSHOW        ;nope show parity info
  560.         RET
  561. STEVE:        MVI    A,MODCTB    ;get current port info
  562.         ORI    080H        ;set even parity
  563.         STA    MODCTB        ;put back new port info
  564.         MVI    A,NO        ;set even parity flag
  565.         JMP    STODD1
  566. STONE:        MVI    A,MODCTB    ;get current port info
  567.         ANI    0EFH        ;set one stop bit 
  568.         STA    MODCTB        ;put back new port info
  569.         MVI    A,YES        ;set one stop bit flag
  570. STONE1:        STA    STTEL        
  571.         CALL    CARRCK        ;carrier present
  572.         RZ            ;yep then continue
  573.         CALL    STSHOW        ;nope show stop bit info 
  574.         RET
  575. STTWO:        MVI    A,MODCTB    ;get current port info
  576.         ORI    010H        ;set two stop bits
  577.         STA    MODCTB        ;put back new port info
  578.         MVI    A,NO        ;set two stop bit flag
  579.         JMP    STONE1            
  580. ;
  581. PARSHOW:    LXI    D,PARMSG    ;get parity message
  582.         MVI    C,PRINT        ;print it
  583.         CALL    MEX
  584.         LXI    D,PONMSG    ;get set for parity on
  585.         MVI    C,PRINT
  586.         LDA    PARTEL        ;get flag
  587.         CPI    YES         ;is it on
  588.         JZ    PARSHOW1    ;yes then say so
  589.         LXI    D,POFMSG    ;no then get parity off message
  590.         MVI    C,PRINT        ;print it
  591.         CALL    MEX
  592.         RET
  593. PARSHOW1:    CALL    MEX
  594.         LXI    D,ODDMSG    ;get parity odd message
  595.         MVI    C,PRINT
  596.         LDA    PARTEL1        ;get odd parity flag
  597.         CPI    YES        ;is it odd
  598.         JNZ      PARSHOW2    ;nope get even message
  599.         CALL    MEX        ;yes then say so 
  600.         RET
  601. PARSHOW2:    LXI    D,EVEMSG    ;get even parity message
  602.         MVI    C,PRINT        
  603.         CALL    MEX        ;print it
  604.         RET
  605. ;
  606. WLSHOW:        LXI    D,WLMSG        ;get word length message
  607.         MVI    C,PRINT
  608.         CALL    MEX        ;print it
  609.         LXI    D,FIVEMSG    ;load five bit message
  610.         MVI    C,PRINT    
  611.         LDA    WLTEL        ;get word length flag 
  612.         CPI    '5'        ;is it five
  613.         JNZ     SIX        ;nope try six
  614.         CALL    MEX        ;yes then show it
  615.         RET
  616. SIX:        LXI    D,SIXMSG    ;load six bit message
  617.         MVI    C,PRINT
  618.         CPI    '6'        ;is it six
  619.         JNZ    SEV        ;nope try seven
  620.         CALL    MEX        ;yep then show it
  621.         RET
  622. SEV:        LXI    D,SEVMSG    ;load seven bit message
  623.         MVI    C,PRINT
  624.         CPI    '7'        ;is it seven
  625.         JNZ    ATE        ;nope try eight
  626.         CALL    MEX        ;yep then show it
  627.         RET
  628. ATE:        LXI    D,ATEMSG    ;load eight bit message
  629.         MVI    C,PRINT
  630.         CALL    MEX        ;print it
  631.         RET
  632. ;
  633. STSHOW:        LXI    D,STOPMSG    ;get stop bit message
  634.         MVI    C,PRINT        ;print it
  635.         CALL    MEX
  636.         LXI    D,STOPMSG1    ;get stop bit 1 message
  637.         MVI    C,PRINT
  638.         LDA    STTEL        ;is it 1 bit
  639.         CPI    YES
  640.         JNZ    STSHOW1        ;nope try two
  641.         CALL    MEX        ;yep then show it 
  642.         RET
  643. STSHOW1:    LXI    D,STOPMSG2    ;get stop bit 2 message
  644.         MVI    C,PRINT
  645.         CALL    MEX        ;print it
  646.         RET
  647. ;
  648. ; Message area
  649. ;
  650. BAUD:        DB    0        ;300 baud
  651. PARTEL:        DB    NO        ;yes=parity, no=no parity
  652. PARTEL1:    DB    YES        ;yes=odd parity, no=even
  653. WLTEL:        DB    '8'        ;5=5 bits,6=6 bits, etc.
  654. STTEL:        DB    YES        ;yes=1 stop, no=2 stop 
  655. STOPMSG:    DB    'Number of stop bits is $'
  656. STOPMSG1:    DB    '1$'
  657. STOPMSG2:    DB    '2$'        
  658. WLMSG:        DB    'Word length is $'
  659. FIVEMSG:    DB    '5 bits$'
  660. SIXMSG:        DB    '6 bits$'
  661. SEVMSG:        DB    '7 bits$'
  662. ATEMSG:        DB    '8 bits$'      
  663. PARMSG:        DB    'Parity is: $'
  664. PONMSG:        DB    'on and $'
  665. POFMSG:        DB    'off$'
  666. ODDMSG:        DB    'odd$'
  667. EVEMSG:        DB    'even$'
  668. CLSMSG:          DB    CR,LF,1AH,'$'
  669. EOSMSG:          DB    CR,LF,19H,'$'
  670. SOMESG:          DB    'TRS Mod 4 CP/M 2.2 overlay V'
  671.           DB    REV/10+'0'
  672.           DB    '.'
  673.           DB    REV MOD 10+'2','$'
  674. NOMESG:        DB    'no $'
  675. CARMSG:        DB    'carrier present',CR,LF,'$'
  676. ANSON:        DB    '*C*MAG@',125,'X',CR,0    ;turn on auto answer
  677. ANSOFF:        DB    '*C',CR,0        ;turn off auto answer
  678. ANSMSG:        DB    'Modem answer mode now turned on. '
  679.         DB    '[Use ^C to abort to CP/M]'
  680.         DB    CR,LF,'$'
  681. ;
  682. SMSEND:        MVI    C,SNDRDY
  683.         CALL    MEX
  684.         JNZ    SMSEND
  685.         MOV    A,M
  686.         INX    H
  687.         ORA    A
  688.         RZ
  689.         MOV    B,A
  690.         MVI    C,SNDCHR
  691.         CALL    MEX
  692.         JMP    SMSEND
  693. ;
  694. ;----------------------------------------------------------------------
  695. ; NOTE:  MUST TERMINATE PRIOR TO 0B00H (with Smartmodem or Anchor)
  696. ;----------------------------------------------------------------------
  697. ; End of TRS-80 MOD IV  MEX modem overlay
  698.         END
  699. r)
  700. ;-