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

  1. ; MXO-TD30.ASM -- TurboDOS overlay for MEX -- Version 3.0 -- 10/04/84
  2. ;
  3. ;    This overlay is a rather full-featured one.  All of the
  4. ;    SET command changes made should remain valid through
  5. ;    CLONE operations.  If you are working with a version of
  6. ;    TurboDOS greater than 1.22, I make no guarantees about
  7. ;    the correctness of the TURBO calls, I have included them
  8. ;    simply because I have heard that the later versions are
  9. ;    available (I have no way of verifying them).  Just confirm
  10. ;    the Turbo Function Call Codes, and set the TURBO2 equate
  11. ;    appropriately, and have fun!
  12. ;
  13. ;    Just for fun (and for space restrictions, and time restrictions),
  14. ;    I am using Z80 instructions via MACROs, so use MAC, or
  15. ;    decode them your self, its not hard.
  16. ;
  17. ; You will want to look this file over carefully. There are a number of
  18. ; options that you can use to configure the program to suit your taste.
  19. ; This file adapts MEX to run under TurboDOS using the Comm Channel
  20. ; (the example here is using channel 1).
  21. ;
  22. ;
  23. ; Edit this file for your preferences then follow the "TO USE:" example
  24. ; shown below.
  25. ;
  26. ; Use the SET command to change baud rate if needed.  Also SET-able
  27. ; is the parity.  This implements MEX changing the Baud rate.
  28. ; All of the values changed by the SET command, should remain
  29. ; valid through any CLONE operations.
  30. ;
  31. ;    TO USE: First edit this file filling in answers for your own
  32. ;        equipment.  Then assemble with ASM.COM or equivalent
  33. ;        assembler.  Then use MLOAD21.COM (or later) to combine
  34. ;        this overlay with the original MEX10.COM file.  You may
  35. ;               optionally combine files for Hayes Smartmodem (MXO-SM13.
  36. ;        HEX), Version 1.0C MEX update (MEXFIX.HEX), and buffer size
  37. ;        customization (MEXPAT10.HEX) on the same MLOAD command line
  38. ;        if you desire.  See MEX10.DOC or MEX-EASY.DOC for details.
  39. ;        For example, to prepare a working COM file for use with a
  40. ;        Hayes Smartmodem and to incorporate the version 1.0C from
  41. ;        MEXNEWS.003, enter the following:
  42. ;
  43. ;        A>MLOAD21 MEX-TURB.COM=MEX112.COM,MXO-TD30,MXO-SM13,MEXFIX
  44. ;
  45. ;
  46. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  47. ; 10/04/84 - (Ver 3.0) Fixed SENDOUT "hang"    - Matt Ward (Wacko)
  48. ;         problem, and try to get better
  49. ;         performance re: timing problems
  50. ;
  51. ; 09/28/84 - (Ver 2.0) Changed labels to     - Matt Ward (Wacko)
  52. ;         conform to MEX conventions
  53. ;
  54. ; 09/20/84 - (Ver 1.0) TurboDOS initial        - Matt Ward (Wacko)
  55. ;
  56. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  57. ;
  58. ;
  59. YES    EQU    0FFH
  60. NO    EQU    0
  61.  
  62. TURBO2    EQU    YES    ; Set to YES if TurboDOS 1.2, 1.22, et al
  63.             ; Set to NO if TurboDOS 1.3, 1.4, et al
  64. ;
  65. ;
  66. BDOS    EQU    005H
  67.  
  68.     IF    TURBO2
  69. TDOS    EQU    005H
  70. CCS    EQU    87        ; Return Comm Channel Status
  71. CCI    EQU    88        ; Comm Channel Input
  72. CCO    EQU    89        ; Comm Channel Output
  73. CCBR    EQU    90        ; Set Comm Channel Baud Rate
  74.     ELSE
  75. TDOS    EQU    050H
  76. CCS    EQU    34        ; Return Comm Channel Status
  77. CCI    EQU    35        ; Comm Channel Input
  78. CCO    EQU    36        ; Comm Channel Output
  79. CCBR    EQU    37        ; Set Comm Channel Baud Rate
  80.     ENDIF
  81.  
  82. BELL    EQU    07H        ;bell
  83. CR    EQU    0DH        ;carriage return
  84. ESC    EQU    1BH        ;escape
  85. LF    EQU    0AH        ;linefeed
  86.     PAGE
  87. ;
  88. ; MEX service processor stuff
  89. ;
  90.  
  91. MEX    EQU    0D00H        ; CALL MEX
  92.  
  93. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  94. TIMER    EQU    254        ;delay 100ms * reg B
  95. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  96. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  97. SNDRDY    EQU    251        ;test for modem-send ready
  98. RCVRDY    EQU    250        ;test for modem-receive ready
  99. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  100. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  101. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  102. PARSFN    EQU    246        ;parse filename from input stream
  103. BDPARS    EQU    245        ;parse baud-rate from input stream
  104. SBLANK    EQU    244        ;scan input stream to next non-blank
  105. EVALA    EQU    243        ;evaluate numeric from input stream
  106. LKAHED    EQU    242        ;get nxt char w/o removing from input
  107. GNC    EQU    241        ;get char from input, cy=1 if none
  108. ILP    EQU    240        ;inline print
  109. DECOUT    EQU    239        ;decimal output
  110. PRBAUD    EQU    238        ;print baud rate
  111. PRINT    EQU    9
  112. ;
  113. ;
  114. ;  some Turbo stuff:
  115. ;
  116. PORT    EQU    002H        ;Net/82 SIO channel B base port
  117. MODCT1    EQU    PORT+1        ;SIO channel B Command/Status
  118. MODDAT    EQU    PORT        ;SIO channel B Data
  119. MODCT2    EQU    PORT+1        ;Modem status port
  120. ;
  121. CRTN    EQU    00H        ; your Console comm channel number
  122. CCN    EQU    01H        ; your Modem comm channel number
  123. ;                 if using a comm slave, it might look    
  124. ;                 like this:
  125. ;CNN    EQU    81H
  126. ;
  127. EXX    MACRO        
  128.     DB    0D9H
  129.     ENDM
  130. EXAF    MACRO
  131.     DB    008H
  132.     ENDM
  133. LDIR    MACRO        
  134.     DB    0EDH,0B0H
  135.     ENDM
  136. OUTIR    MACRO        
  137.     DB    0EDH,0B3H
  138.     ENDM
  139.  
  140.     PAGE
  141. ;
  142. $-MACRO
  143.  
  144.     ORG    100H
  145. ;
  146. ;
  147. ; Change the clock speed to suit your system
  148. ;
  149.     DS    3    ;(for  "JMP   START" instruction)
  150. ;
  151.     DS    2
  152. TCHPLS:    DB    'T'    ;T=touch, P=pulse (Smartmodem-only)    105H
  153. CLOCK:    DB    40    ;clock speed in MHz x10, 25.5 MHz max.    106H
  154.             ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  155. MSPEED:    DB    5    ;0=110 1=300 2=450 3=600 4=710 5=1200    107H
  156.             ;6=2400 7=4800 8=9600 9=19200 default
  157. BYTDLY:    DB    5    ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108H
  158.             ;default time to send character in ter-
  159.             ;minal mode file transfer for slow BBS.
  160. CRDLY:    DB    5    ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  161.             ;default time for extra wait after CRLF
  162.             ;in terminal mode file transfer
  163. COLUMS:    DB    5    ;number of DIR columns shown        10AH
  164. SETFL:    DB    YES    ;yes=user-defined SET command        10BH
  165. SCRTST:    DB    YES    ;Cursor control routine         10CH
  166. ACKNAK:    DB    YES    ;yes=resend a record after any non-ACK    10DH
  167.             ;no=resend a record after a valid NAK
  168. BAKFLG:    DB    YES    ;yes=change any file same name to .BAK    10EH
  169. CRCDFL:    DB    YES    ;yes=default to CRC checking        10FH
  170. TOGCRC:    DB    YES    ;yes=allow toggling of CRC to Checksum    110H
  171. CVTBS:    DB    NO    ;yes=convert backspace to rub        111H
  172. TOGLBK:    DB    YES    ;yes=allow toggling of bksp to rub    112H
  173. ADDLF:    DB    NO    ;no=no LF after CR to send file in    113H
  174.             ;terminal mode (added by remote echo)
  175. TOGLF:    DB    YES    ;yes=allow toggling of LF after CR    114H
  176. TRNLOG:    DB    YES    ;yes=allow transmission of LOGON    115H
  177.             ;write logon sequence at location LOGON
  178. SAVCCP:    DB    NO    ;yes=do not overwrite CCP        116H
  179. LOCNXT:    DB    NO    ;yes=local command if EXTCHR precedes    117H
  180.             ;no=external command if EXTCHR precedes
  181. TOGLOC:    DB    YES    ;yes=allow toggling of LOCONEXTCHR    118H
  182. LSTTST:    DB    YES    ;yes=allow toggling of printer on/off    119H
  183. XOFTST:    DB    NO      ;yes=check for XOFF from remote    while    11AH
  184.             ;sending a file in terminal mode
  185. XONWT:    DB    NO    ;yes=wait for XON after CR while    11BH
  186.             ;sending a file in terminal mode
  187. TOGXOF:    DB    YES    ;yes=allow toggling of XOFF checking    11CH
  188. IGNCTL:    DB    NO    ;yes=CTL-chars above ^M not displayed    11DH
  189. EXTRA1:    DB    0    ;for future expansion            11EH
  190. EXTRA2:    DB    0    ;for future expansion            11FH
  191. BRKCHR:    DB    '@'-40H    ;^@ = Send a 300 ms. break tone        120H
  192. NOCONN:    DB    'N'-40H    ;^N = Disconnect from the phone line    121H
  193. LOGCHR:    DB    'L'-40H    ;^L = Send logon        (LF)    122H
  194. LSTCHR:    DB    'P'-40H    ;^P = Toggle printer            123H
  195. UNSVCH:    DB    'R'-40H    ;^R = Close input text buffer    (DC4)    124H
  196. TRNCHR:    DB    'T'-40H ;^T = Transmit file to remote        125H
  197. SAVCHR:    DB    'Y'-40H    ;^Y = Open input text buffer    (DC2)    126H
  198. EXTCHR:    DB    '^'-40H    ;^^ = Send next character        127H
  199. ;
  200. ;
  201.     DS    2        ;                128H
  202.  
  203. INCTL1:        ; Get modem status byte                12AH
  204.     EXX        ; (for Turbo, first swap to alt. regs)    12AH
  205.     MVI    C,CCS    ; (use "Return Comm Channel Status")    12BH
  206.     MVI    D,CCN    ; (comm channel for Modem)        12DH
  207.     CALL    TDOS    ;                    12FH
  208.     EXX        ; (swap back to default regs)        132H
  209.     RET        ; (and return, whew it fits)        133H
  210. ;
  211. OTDATA:    JMP    TRBOMO    ;out modem data port            134H
  212.     DS    7
  213. ;
  214. INPORT:    JMP    TRBOMI    ; Get data from modem data port        13EH
  215.     DS    7
  216. ;
  217. MASKR:    ORA    A ! RET ! RET    ;bit to test for receive ready    148H
  218. TESTR:    CPI    0FFH    ! RET    ;value of receive bit when rdy    14BH
  219. MASKS:    XRA    A ! RET ! RET    ;bit to test for send ready    14EH
  220. TESTS:    CPI    0    ! RET    ;value of send bit when ready    151H
  221. ;
  222. ; Unused area:  was once used for special PMMI functions,
  223. ; Now used only to retain compatibility with MDM overlays.
  224. ; You may use this area for any miscellaneous storage you'd
  225. ; like but the length of the area *MUST* be 12 bytes (decimal)
  226. ;
  227.     DS    12        ;                154H
  228. ;
  229. LOGON:    DS    2        ;not used            160H
  230. DIALV:    DS    3        ; (I'm using the mxo-sm13)    162H
  231. DISCV:    DS    3        ;                165H
  232. GOODBV:    JMP    GOODBYE        ;                168H
  233. INMODV:    JMP    INITMOD        ;go to user written routine    16BH
  234. NEWBDV:    JMP    PBAUD        ;set baud rate            16EH
  235. NOPARV:    RET  !    NOP  !    NOP    ;by-passes PMMI routine        171H
  236. PARITV:    RET  !    NOP  !    NOP    ;by-passes PMMI routine        174H
  237. SETUPV:    JMP    SETCMD        ;process SET comand        177H
  238. SPMENV:    DS    3        ;not used            17AH
  239. VERSNV:    JMP    SYSVER        ;                17DH
  240. BREAKV:    JMP    SENDBRK        ;                180H
  241. ;
  242. ;
  243. ; The following jump vector provides the overlay with access to special
  244. ; routines in the main program (retained and supported in the main pro-
  245. ; gram for MDM overlay compatability).  These should not be modified by
  246. ; the overlay.
  247. ;
  248. ; Note that for MEX 2.0 compatability, you should try to not use these
  249. ; routines, since this table will go away with MEX 2.0 (use the MEX
  250. ; service call processor instead).
  251. ;                suggest replace with:
  252. ILPRTV:    DS    3        ; MEX function 9        183H
  253. INBUFV:    DS    3        ; MEX function 10        186H
  254. ILCMPV:    DS    3        ; MEX function 247        189H
  255. INMDMV:    DS    3        ; MEX function 255        18CH
  256. NXSCRV:    DS    3        ; not supported            18FH
  257. TIMERV:    DS    3        ; MEX function 254        192H
  258. ;
  259. ;
  260. ; Clear sequences -- CLREOS is clear to end of screen, CLS is clear
  261. ; entire screen.
  262. ;
  263. CLREOS:    LXI    D,EOSMSG    ; N.B.  MY clear clreos fit    195H
  264.     JMP    MEXPRT        ; in 3 bytes, YOURS may not    198H
  265.                 ; so watch the addresses.
  266. EOSMSG:    DB    ESC,'y$'    ;                19BH
  267. ;
  268. CLS:    LXI    D,CLSMSG    ;                19EH
  269. MEXPRT:    MVI    C,PRINT        ; this entry saves a few bytes    1A1H
  270.     CALL    MEX        ;                1A3H
  271.     RET
  272. ;
  273. ;-----------------------------------------------------------------------
  274. ;
  275. ;         *******    End of fixed format area    ********
  276. ;
  277. ;.....
  278. ;
  279. ;-----------------------------------------------------------------------
  280. ;
  281. ; NOTE:  The end of your last routine should terminate by 0B00H if
  282. ;     using the Hayes Smartmodem or by address 0D00H otherwise.
  283. ;
  284. ;-----------------------------------------------------------------------
  285. ;
  286. ;
  287. CLSMSG:    DB    01AH,'$'
  288. ;
  289. SYSVER:    LXI    D,SYSVERMSG    ; at sign-on, print the whole thing
  290. SHOW0:    CALL    MEXPRT
  291.     LXI    D,COMMAMSG
  292.     CALL    MEXPRT        ; for "SET ?", just the configuration
  293.     LDA    MSPEED        ; let MEX print the current Baud Rate
  294.     MVI    C,PRBAUD
  295.     CALL    MEX
  296.     LXI    D,CRLF
  297.     CALL    MEXPRT
  298.     LXI    D,CRLF
  299.     CALL    MEXPRT
  300.     RET
  301. ;
  302. SYSVERMSG:
  303.     DB    LF,'For TurboDOS 1.2,  Comm Channel '
  304.     DB    CCN+'0',CR,LF
  305. SHOWMSG:DB    '('
  306. SYSVR1:    DB    '8 data bits, 1 stop bit, '
  307. SYSVR2:    DB    'no',0,0,' parity)$'
  308.  
  309. COMMAMSG:
  310.     DB    ', $'
  311. ;
  312. nonmsg:    db    'no',0,0
  313. evnmsg:    db    'even'
  314. oddmsg:    db    'odd',0
  315. ;
  316. ;.....
  317. ;
  318. ; Here is the TurboDOS version for OTDATA, it doesn't fit
  319. ; in the ten (10 decimal) bytes allowed for I/O primitives above:
  320. ;
  321. TRBOMO:    EXX        ; (swap to alt. regs)
  322.     MOV    E,A    ; (move data byte to [E] for funct CCO)
  323.     EXAF        ; (swap to alt. AF reg)
  324.     MVI    C,CCO    ; (use "Output Character to Comm Channel")
  325.     MVI    D,CCN    ; (comm channel for Modem)
  326.     CALL    TDOS
  327.     EXAF        ; (swap back to default AF)
  328.     EXX        ; (swap back to default regs)
  329.     RET
  330.  
  331. ;
  332. ;.....
  333. ;
  334. ;    (Version 3.0)
  335. ;
  336. ; Here is the TurboDOS version for INPORT, it normally would fit
  337. ; in the ten (10 decimal) bytes allowed for I/O primitives above,
  338. ; but I am trying to make sure that a char REALLY is waiting for
  339. ; us to read (it may affect SENDOUT and others):
  340. ;
  341. TRBOMI:        ; Get data from modem data port
  342.     EXX        ; (for Turbo, first swap to alt. regs)
  343.     MVI    C,CCS    ; (use "Return Comm Channel Status")
  344.     MVI    D,CCN    ; (comm channel for Modem)
  345.     CALL    TDOS    ;  to see if a char is REALLY there
  346.     ORA    A    ;  well, was there?
  347.     JZ    MIOUT    ;  nope, return a NUL
  348.     MVI    C,CCI    ; ("Input Character from Comm Channel")
  349.     MVI    D,CCN    ; (comm channel for Modem)
  350.     CALL    TDOS
  351. MIOUT:    EXX        ; (swap back to default regs)
  352.     RET        ; (and return, whew it fits)
  353.  
  354.  
  355. ;
  356. ;-----------------------------------------------------------------------
  357. ;.....
  358. ;
  359. ;
  360. ; This routine interprets the SET command parameters.  Everything
  361. ; set here should be valid through CLONING.
  362. ;
  363. SETCMD:    MVI    C,SBLANK    ; check for any arguments
  364.     CALL    MEX
  365.     JC    HELPER        ; if none, tell how to use SET
  366.     LXI    D,CMDTBL    ; look for an argument
  367. LOOK:    MVI    C,LOOKUP    ; (common lookup entry and go code)
  368.     CALL    MEX
  369.     PUSH    H        ; push-down address to jmp to
  370.     RNC            ; 'RET' there if valid
  371.     POP    H        ; oops, pop to keep stack valid
  372. HELPER:    LXI    D,HLPMSG    ; and tell how to use
  373.     CALL    MEXPRT
  374.     RET
  375.  
  376. BAUDCMD:
  377.     MVI    C,BDPARS    ; let MEX decode which rate he wants
  378.     CALL    MEX
  379.     JC    SHOWBD        ; if couldn't find it, show current Baud
  380.     CALL    PBAUD        ; if not oops, try to set
  381.     JC    HELPER        ; if wouldn't set, show how to use
  382.     LXI    D,HEREBD    ; say "Modem speed set to: "
  383.     CALL    MEXPRT
  384.     LDA    MSPEED
  385.     MVI    C,PRBAUD    ; and show how we set it
  386.     CALL    MEX
  387.     RET
  388.  
  389. SHOWBD:    LXI    D,CURRBD    ; For no args on SET BAUD line,
  390.     CALL    MEXPRT        ; show current Baud Setting
  391.     LDA    MSPEED
  392.     MVI    C,PRBAUD
  393.     CALL    MEX
  394.     RET
  395.  
  396. PARITCMD:
  397.     MVI    C,SBLANK    ; Look for any args
  398.     CALL    MEX
  399.     JC    SHOWPR        ; if none, show current settings
  400.     LXI    D,PARITBL    ; look for parity arguments
  401.     JMP    LOOK
  402.  
  403. SHOWPR:    LXI    D,CURRPR    ; For no args on SET PARITY line,
  404.     CALL    MEXPRT        ; show current parity setting
  405.     LXI    D,SHOWMSG
  406.     CALL    MEXPRT
  407.     RET
  408.  
  409. NONE:    LXI    H,NONMSG    ; set up to put "no",NUL,NUL in sign-on
  410.     LXI    D,CONTROLN    ; set up to tell SIO: 8 bits, no parity
  411.     MVI    A,'8'        ; set up to put "8" bits in sign-on
  412.     JMP    PARITGO
  413. ODD:    LXI    H,ODDMSG    ; set up to put "odd",NUL in sign-on
  414.     LXI    D,CONTROLO    ; set up to tell SIO:  7 bits, odd
  415.     JMP    EORO
  416. EVEN:    LXI    H,EVNMSG    ; set up to put "even" in sign-on
  417.     LXI    D,CONTROLE    ; set up to tell SIO:  7 bits, even
  418. EORO:    MVI    A,'7'        ; set up to put "7" bits in sign-on
  419. PARITGO:STA    SYSVR1    ; stash data bits message in sign-on message
  420.     PUSH    D        ; save SIO control stuff
  421.     LXI    D,SYSVR2    ; stash parity configuration in sign-on
  422.     LXI    B,4
  423.     LDIR
  424.     POP    H        ; get back SIO stuff
  425.     LXI    D,SETMODCTL    ; stash it where INITMOD can get to it
  426.     LXI    B,8        ; (i.e. after cloning)
  427.     LDIR
  428.     LXI    D,HEREPR    ; say "Parity set to:"
  429.     CALL    MEXPRT
  430.     LXI    D,SHOWMSG    ; and show them
  431.     CALL    MEXPRT
  432.  
  433. INITALSO:            ; INITMOD comes here, too
  434.     LXI    H,SETMODCTL    ; really tell the SIO how to do it
  435.     LXI    B,0800H+MODCT1
  436.     DI
  437.     OUTIR
  438.     EI
  439.     RET
  440.  
  441. PBAUD:    PUSH    H
  442.     PUSH    D
  443.     PUSH    B
  444.     MOV    E,A        ; get MEX value
  445.     MVI    D,0        ; index into Turbo values
  446.     LXI    H,TBAUDTBL
  447.     DAD    D
  448.     MOV    A,M        ; take a peek
  449.     ORA    A        ; was it valid?
  450.     STC            ; set up to say "not valid"
  451.     JZ    PBEXIT        ; and return if it was not valid
  452.     MOV    A,E        ; get back MEX value
  453.     STA    MSPEED        ; record for MEX what we are doing
  454.     MOV    E,M        ; get back Turbo value
  455.     MVI    D,CCN        ; and set the Baud Rate
  456.     MVI    C,CCBR        ; (use "Set Comm Channel Baud Rate")
  457.     CALL    TDOS
  458.     XRA    A        ; tell, "no errors"
  459. PBEXIT:    POP    B
  460.     POP    D
  461.     POP    H
  462.     RET
  463.  
  464. INITMOD:
  465.     LDA    MSPEED        ; get value from last clone
  466.     CALL    PBAUD        ; set the rate
  467.     JMP    INITALSO    ; and initialize SIO from last clone
  468.  
  469. SHOW:    LXI    D,CURRST    ; say "Current settings:"
  470.     CALL    MEXPRT
  471.     LXI    D,SHOWMSG    ; display current parameters    
  472.     JMP    SHOW0
  473.  
  474. CMDTBL:    DB    '?'+80H
  475.     DW    SHOW
  476.     DB    'BAU','D'+80H
  477.     DW    BAUDCMD
  478.     DB    'PARIT','Y'+80H
  479.     DW    PARITCMD
  480.     DB    0
  481.  
  482. PARITBL:DB    'EVE','N'+80H
  483.     DW    EVEN
  484.     DB    'E'+80H
  485.     DW    EVEN
  486.     DB    'OD','D'+80H
  487.     DW    ODD
  488.     DB    'O'+80H
  489.     DW    ODD
  490.     DB    'NON','E'+80H
  491.     DW    NONE
  492.     DB    'N'+80H
  493.     DW    NONE
  494.     DB    0
  495.  
  496. TBAUDTBL: ;  Turbo code   MSPEED code          Baud rate
  497.     db    0    ;     0    (not supported)    110
  498.     db    5    ;     1            300
  499.     db    0    ;     2    (not supported)    450
  500.     db    6    ;     3            600
  501.     db    0    ;     4    (not supported)    710
  502.     db    7    ;     5            1200
  503.     db    10    ;     6            2400
  504.     db    12    ;     7            4800
  505.     db    14    ;     8            9600
  506.     db    15    ;     9            19200
  507. ;
  508. setmodctl:        ; this is how I/O is set as default:
  509.     db    0,0,4
  510. sioWR4:    db    046h    ; x16 Clock Rate, 1 stop bit, even parity, disabled
  511.     db    3
  512. sioWR3:    db    0c1h    ; Rxd 8 data bits, Rx enabled
  513.     db    5
  514. sioWR5:    db    0eah    ; DTR, Txd 8 data bits, Tx enabled, RTS
  515.  
  516. CONTROLN:    ;    This is to init the SIO for 8 data bits, no parity
  517.     DB    0,0,4,046H,3,0C1H,5,0EAH
  518. CONTROLE:    ;    This is to init the SIO for 7 data bits, even parity
  519.     DB    0,0,4,047H,3,041H,5,0AAH
  520. CONTROLO:    ;    This is to init the SIO for 7 data bits, odd parity
  521.     DB    0,0,4,045H,3,041H,5,0AAH
  522. ;
  523. ;-----------------------------------------------------------------------
  524. ;.....
  525. ;
  526. ; This routine allows a 300 ms. break tone to be sent to reset some
  527. ; time-share computers.
  528. ;
  529. SENDBRK:  DI
  530.       MVI    A,5        ; select Write Register 5
  531.       OUT    MODCT1
  532.       lda    sioWR5        ; get Current value for WR5
  533.       ori    010h        ; 'or'-in the Break bit
  534.       JMP    GOODBYE1
  535. ;.....
  536. ;
  537. ; This routine sends a 300 ms. break tone and sets DTR low for the same
  538. ; length of time to disconnect some modems such as the Bell 212A, etc.    
  539. ;
  540. GOODBYE:  DI
  541.       MVI    A,5
  542.       OUT    MODCT1        ;SEND TO THE STATUS PORT
  543.       MVI    A,78H        ;TURN OFF DTR, SEND BREAK
  544. ;
  545. GOODBYE1: OUT    MODCT1
  546.       EI
  547.       MVI    B,3        ;WAIT FOR 300 MS.
  548.       MVI    C,TIMER
  549.       CALL    MEX
  550.       DI
  551.       MVI    A,5
  552.       OUT    MODCT1
  553.       lda    sioWR5        ;RESTORE TO NORMAL, current value of WR5
  554.       OUT    MODCT1
  555.       EI
  556.       RET
  557. ;.....
  558. HLPMSG:    DB    LF
  559.     DB    '     SET                            (show this message)',CR,LF
  560.     DB    '     SET ?                    (show current parameters)',CR,LF
  561.     DB    '     SET PARITY <  E(ven)  |  O(dd)  |  N(one)  >',CR,LF
  562.     DB    '     SET BAUD <rate>',CR,LF
  563.     DB    '      rate choices:  300 600 1200 2400 4800 9600 19200'
  564.     DB    CR,LF
  565. CRLF:    DB    CR,LF,'$'
  566.  
  567. HEREBD:    DB    'Modem Speed set to:  $'
  568. HEREPR:    DB    'Parity set to:  $'
  569. CURRBD:    DB    'Current BAUD Rate:  $'
  570. CURRPR:    DB    'Current PARITY setting:  $'
  571. CURRST:    DB    'Current settings:',CR,LF,'$'
  572. ;
  573. ;-----------------------------------------------------------------------
  574. ;
  575. ;
  576. ; NOTE:  This code patch below needs the ORG and DW's just below it.
  577. ;
  578. ;  Here below is a slight Turbo "speed-up" patch which is included
  579. ;  for the following reasons:
  580. ;
  581. ;  1)  Since the BIOS vector supplied by TurboDOS for compatability
  582. ;    with CP/M is not a real vector, but each JMP simply goes to
  583. ;    some code that simulates the BIOS call via BDOS, we might as
  584. ;    well do the register loads here, rather than Turbo doing it.
  585. ;    (I know, all we save is a JMP instruction)
  586. ;
  587. ;  2)  Since we have available to us the INI.MEX startup file, it
  588. ;    seems ridiculous to allow .DO file processing through MEX,
  589. ;    so by using the comm channel routines for CONSOLE stuff,
  590. ;    Turbo will not look at any active .DO files.
  591. ;
  592. ;  3)  It has been observed (mainly while running WordStar) in a
  593. ;    Turbo environment that whenever the console status is
  594. ;    examined, there appears to be some handshaking being done
  595. ;    with the Master Processor EVERY TIME you do a CONSTAT.  So
  596. ;    I have included the following TUCONST that I have running in
  597. ;    my WordStar to attempt to alleviate some of the Timing
  598. ;    problems with MEX under Turbo.  It simply returns a "no
  599. ;    character waiting" status every even try, and the real status
  600. ;    every odd try.
  601.  
  602. TUCONST:
  603.     EXX        ; (save HL, DE, BC)
  604.     LXI    H,TUTEST
  605.     INR    M        ; INCREMENT COUNTER
  606.     DB    0CBH,46H    ;  z80 instruction:  BIT 0,(HL)
  607.     MVI    A,0        ; RETURN ZERO AS STATUS
  608.     JZ    TUBYE
  609.     MOV    M,A        ; STUFF A ZERO
  610.     MVI    C,CCS        ; return console status
  611.     MVI    D,CRTN
  612.     CALL    TDOS
  613. TUBYE:    EXX        ; (restore HL, DE, BC)
  614.     RET
  615.  
  616. TUTEST: DB    0
  617.  
  618. TUCI:    EXX        ; (save HL, DE, BC)
  619.     MVI    C,CCI        ; input char from comm channel (bypass .DO)
  620.     MVI    D,CRTN        ; (console comm channel number)
  621.     CALL    TDOS
  622.     EXX        ; (restore HL, DE, BC)
  623.     RET
  624.  
  625. ;
  626. ;-----------------------------------------------------------------------
  627. ;
  628. ;
  629. ; NOTE:  This patch is what implements the above TUCONST and TUCI.
  630.  
  631.     ORG    0D09H
  632.  
  633. STSVEC:    DW    TUCONST        ;console status vector
  634. INVEC:    DW    TUCI        ;console input vector
  635.  
  636. ;
  637. ;-----------------------------------------------------------------------
  638. ;
  639. ;    (Version 3.0)
  640. ;
  641. ; NOTE:  This patch tries to get a little more speed out of timed loops.
  642.  
  643.     ORG    0D52H
  644.  
  645. timbas:    dw    16        ;timing constant (originally = 208)
  646.  
  647.       END
  648.