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

  1.  
  2. ; MXO-BBI0.ASM --
  3. ;    Big Board I (& incidentally XEROX 820, II) overlay file for
  4. ;    MEX10. 16 June 1985
  5. ;
  6. ; You will want to look this file over carefully.  There are a number of
  7. ; options that you can use to configure the program to suit your taste.
  8. ; This file adapts the Big Board I to MEX Version 1.0.  This overlay
  9. ; is not intended to support MDM7xx in any of it's incarnations.
  10. ;
  11. ; Edit this file for your preferences then follow the "TO USE:" example
  12. ; shown below.
  13. ;
  14. ; Use the "SET" command to change the baudrate when desired.  It starts
  15. ; out at 300 baud when the program is first called up.  Please note the
  16. ; extensions to the SET command below.  You may now set the parity,
  17. ; word size, & number of stop bits in addition to the baud rate.  The
  18. ; SET command also implements a local help file.
  19. ;
  20. ;    TO USE: First edit this file filling in answers for your own
  21. ;        equipment.  Then assemble with ASM.COM or equivalent
  22. ;        assembler.  Then use MLOAD to overlay the the results
  23. ;        of this program to the original .COM file.
  24. ;
  25. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  26. ; 06/18/85 - Removed auto-baud bug & added    - Richard Williams
  27. ;            help file.
  28. ; 06/16/85 - Expanded SET command & cleaned    - Richard Williams
  29. ;            up listing for 80 columns.
  30. ; 11/12/84 - Addapted to Big Board I        - Richard Williams
  31. ; 05/24/84 - MEXified overlay            - Biff Bueffel
  32. ; 11/11/83 - Renamed to M7XE-1.ASM, no changes    - Irv Hoff
  33. ; 07/27/83 - Renamed to work with MDM712    - Irv Hoff
  34. ; 07/01/83 - Revised to work with MDM711    - Irv Hoff
  35. ; 06/22/83 - Revised to work with MDM710    - Irv Hoff
  36. ; 05/27/83 - Updated to work with MDM709    - Irv Hoff
  37. ; 05/15/83 - Revised to work with MDM708    - Irv Hoff
  38. ; 04/11/83 - Updated to work with MDM707    - Irv Hoff
  39. ; 04/04/83 - Updated to work with MDM706    - Irv Hoff
  40. ; 03/03/83 - Modified MDM705KP for XEROX
  41. ;            820-II computers with external
  42. ;            modems                - David Wurz    
  43. ;
  44. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  45. ;
  46. ; The obligatory equates...
  47. ;
  48. YES:        EQU    0FFH
  49. NO:        EQU    0
  50. ;    
  51. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  52. ;
  53. ; Here are the equates for the conditional assembly switches...
  54. ;
  55. ; Two serial ports are available.  See initialization area for info.
  56. ; Port A is the commonly used port.
  57. PORT$A    EQU    YES        ;set to no for Port B
  58. PORT$B    EQU    NOT PORT$A
  59. ;
  60. ; This overlay can display the port status on every invocation of the
  61. ; set baud routine (ALWAYS = YES) or will display the status on a null
  62. ; argument SET command and/or a SET command with only the expanded
  63. ; arguments (ALWAYS =NO).  If ALWAYS = YES, then the port status will
  64. ; also be displayed on an auto baud rate change from the phone
  65. ; directory.
  66. ALWAYS    EQU    NO        ;do not display port status
  67. ;                ; on every change.
  68. ;
  69. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  70. ;
  71. ; Instruction equates...
  72. ;
  73. IN$RET    EQU    0C9H    ;unconditional return
  74. IN$MVI    EQU    03EH    ;move immediate to reg. A
  75. IN$ANI    EQU    0E6H    ;AND immediate with reg. A
  76. IN$ORI    EQU    0F6H    ;OR immediate with reg. A
  77. IN$LHLD    EQU    02AH    ;load reg. HL at address
  78. IN$EOC    EQU    076H    ;End Of Coffee
  79. ;
  80. ; Character equates...
  81. ;
  82. BELL:    EQU    007H    ;bell
  83. CR:    EQU    00DH    ;carriage return
  84. ESC:    EQU    01BH    ;escape
  85. LF:    EQU    00AH    ;linefeed
  86. ;
  87. ; MEX service processor stuff...
  88. ;
  89. MEX    EQU    0D00H    ;address of the service processor.
  90. INMDM    EQU    255    ;get char from port to A, CY=no more within 100 ms.
  91. TIMER    EQU    254    ;delay 100ms * reg B.
  92. TMDINP    EQU    253    ;B=# secs to wait for char, cy=no char.
  93. CHEKCC    EQU    252    ;check for ^C from KBD, Z=present.
  94. SNDRDY    EQU    251    ;test for modem-send ready.
  95. RCVRDY    EQU    250    ;test for modem-receive ready.
  96. SNDCHR    EQU    249    ;send a character to the modem (after sndrdy).
  97. RCVCHR    EQU    248    ;receive a char from the modem (after rcvrdy).
  98. LOOKUP    EQU    247    ;table search: see CMDTBL comments for info.
  99. PARSFN    EQU    246    ;parse filename from input stream.
  100. BDPARS    EQU    245    ;parse baud-rate from input stream.
  101. SBLANK    EQU    244    ;scan input stream to next non-blank.
  102. EVALA    EQU    243    ;evaluate numeric from input stream.
  103. LKAHED    EQU    242    ;get next char w/o removing from input.
  104. GNC    EQU    241    ;get char from input, cy=1 if none.
  105. ILP    EQU    240    ;inline print.
  106. DECOUT    EQU    239    ;decimal output.
  107. PRBAUD    EQU    238    ;print baud rate.
  108. ;
  109. PRINT    EQU    9    ;MEX/BDOS print-string function call.
  110. ;
  111. ; MEX baud rate command numbers...
  112. ;
  113. C110    EQU    000H    ; 110 baud
  114. C300    EQU    001H    ; 300 baud
  115. C450    EQU    002H    ; 450 baud  ** not supported on this machine **
  116. C600    EQU    003H    ; 600 baud
  117. C710    EQU    004H    ; 710 baud  ** not supported on this machine **
  118. C1200    EQU    005H    ; 1200 baud
  119. C2400    EQU    006H    ; 2400 baud
  120. C4800    EQU    007H    ; 4800 baud
  121. C9600    EQU    008H    ; 9600 baud
  122. C19200    EQU    009H    ; 19200 baud
  123. CERROR    EQU    0FFH    ; for `unrecognized' baud rates.
  124. ;
  125.     ORG    100H
  126.     DS    3    ;(for  "JMP   START" instruction)
  127. ;
  128. ; MEX variables, constants, flags, & what have you...
  129. ;
  130. PMMI:    DB    NO    ;yes=PMMI S-100 Modem            103H
  131. SMDM:    DB    YES    ;yes=HAYES Smartmodem, no=non-PMMI    104H
  132. TORP:    DB    'T'    ;T=touch, P=pulse (Smartmodem-only)    105H
  133.             ;
  134.             ;  Change the clock speed to suit
  135.             ;  your system...
  136. CLOCK:    DB    40    ;clock speed in MHz x10, 25.5 MHz max.    106H
  137.             ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  138. MSPEED:    DB    1    ;0=110 1=300 2=450 3=600 4=710 5=1200    107H
  139.             ;6=2400 7=4800 8=9600 9=19200 default
  140. BYTDLY:    DB    5    ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108H
  141.             ;default time to send character in ter-
  142.             ;minal mode file transfer for slow BBS.
  143. CRDLY:    DB    5    ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  144.             ;default time for extra wait after CRLF
  145.             ;in terminal mode file transfer
  146.             ;
  147. NUMCOL:    DB    5    ;number of DIR columns shown        10AH
  148. USET:    DB    YES    ;yes=user-added Setup routine        10BH
  149. SCRN:    DB    YES    ;Cursor control routine            10CH
  150.             ;
  151. ACKNAK:    DB    YES    ;yes=resend a record after any non-ACK    10DH
  152.             ;no=resend a record after a valid NAK
  153. BAKUP:    DB    NO    ;yes=change any file same name to .BAK    10EH
  154. CRCDEF:    DB    YES    ;yes=default to CRC checking        10FH
  155. CRCTOG:    DB    YES    ;yes=allow toggling of CRC to Checksum    110H
  156.             ;
  157. CNVRUB:    DB    NO    ;yes=convert backspace to rub        111H
  158. TOGRUB:    DB    YES    ;yes=allow toggling of bksp to rub    112H
  159. ADDLF:    DB    NO    ;no=no LF after CR to send file in    113H
  160.             ;terminal mode (added by remote echo)
  161. TOGLF:    DB    YES    ;yes=allow toggling of LF after CR    114H
  162. TRNLOG:    DB    YES    ;yes=allow transmission of logon    115H
  163.             ;write logon sequence at location LOGON
  164. SAVCCP:    DB    YES    ;yes=do not overwrite CCP        116H
  165. LCLNXT:    DB    NO    ;yes=local command if EXTCHR precedes    117H
  166.             ;no=external command if EXTCHR precedes
  167. LCLTGL:    DB    YES    ;yes=allow toggling of LCLNXT        118H
  168. LSTTST:    DB    YES    ;yes=printer available on printer port    119H
  169. XOFFT:    DB    YES    ;yes=check for XOFF from remote    while    11AH
  170.             ;sending a file in terminal mode
  171. XONWT:    DB    NO    ;yes=wait for XON after CR while    11BH
  172.             ;sending a file in terminal mode
  173. TGXOFF:    DB    YES    ;yes=allow toggling of XOFF checking    11CH
  174. IGNCTL:    DB    YES    ;yes=CTL-chars above ^M not displayed    11DH
  175.             ;
  176. EXTRA1:    DB    0    ;for future expansion            11EH
  177. EXTRA2:    DB    0    ;for future expansion            11FH
  178.             ;
  179. BRKCHR:    DB    '@'-40H    ;^@ = Send a 300 ms. break tone        120H
  180. HANGUP:    DB    'N'-40H    ;^N = Disconnect from the phone line    121H
  181. LOGCHR:    DB    'L'-40H    ;^L = Send logon            122H
  182. LSTCHR:    DB    'P'-40H    ;^P = Toggle printer            123H
  183. UNSAVE:    DB    'R'-40H    ;^R = Close input text buffer        124H
  184. TRANS:    DB    'T'-40H    ;^T = Transmit file to remote        125H
  185. SAVE:    DB    'Y'-40H    ;^Y = Open input text buffer        126H
  186. EXTCHR:    DB    '^'-40H    ;^^ = Send next character        127H
  187.     DS    2    ;                    128H
  188. ;
  189. ; MEX jump vectors (& such)...
  190. ;
  191. ICTL1:    MVI    A,00$010$000B    ;,reset latched status bits,.    12AH
  192.     OUT    CTL1
  193.     IN    CTL1        ;get the status bits
  194.     RET
  195.     DS    3
  196. ;
  197. ODATP:    OUT    DATP ! RET    ;out modem data port        134H
  198.     DS    7
  199. ;
  200. IDATP:    IN    DATP ! RET    ;in modem data port        13EH
  201.     DS    7
  202. ;
  203. ARCVB:    ANI    RCVB ! RET    ;bit to test for receive ready    148H
  204. CRCVR:    CPI    RCVR ! RET    ;value of receive bit when rdy    14BH
  205. ;
  206. ASNDB:    ANI    SNDB ! RET    ;bit to test for send ready    14EH
  207. CSNDR:    CPI    SNDR ! RET    ;value of send bit when ready    151H
  208.     DS    6        ;                154H
  209. ;
  210. OCTL1:    OUT    CTL1 ! RET    ;out modem control port        15AH
  211. OCTL2:    OUT    CTL2 ! RET    ;out modem status port        15DH
  212.     DS    2        ;Not used by MEX        160H
  213.     DS    6        ;                162H
  214. ;
  215. GBYEV:    JMP    GBYE        ;hang up.            168H
  216. ;
  217. INITV:    JMP    INIT        ;go to user written routine    16BH
  218. ;
  219. NEWBV    JMP    NEWB        ;Change baudrate        16EH
  220.     RET  !    NOP  !    NOP    ;(by-passes PMMI routine)    171H
  221.     RET  !    NOP  !    NOP    ;(by-passes PMMI routine)    174H
  222. ;
  223. SETBV:    JMP    SETB        ;user `SET' baud rate        177H
  224.     DS    3        ;                17AH
  225. ;
  226. SYSVV:    JMP    SYSV        ;display system version        17DH
  227. ;
  228. BRKV:    JMP    SNDBRK        ;send break            180H
  229. ;
  230. ; Do not change the following six lines.
  231. ;
  232. ILPRTV:    DS    3        ;in line print            183H
  233. INBUFV    DS    3        ;input buffer            186H
  234. ILCMPV:    DS    3        ;in line comparison        189H
  235. INMDMV    DS    3        ;input from modem        18CH
  236. NSCRNV:    DS    3        ;new screen            18FH
  237. TIMERV:    DS    3        ;timer                192H
  238. ;
  239. ; Clear sequences -- CLREOS is clear to end of screen, CLRSCN is clear
  240. ; entire screen.  
  241. ;
  242. CLREOS:    LXI    D,EOSMSG    ;                195H
  243.     MVI    C,PRINT
  244.     CALL    MEX
  245.     RET
  246. ;
  247. CLRSCN:    LXI    D,CLSMSG    ;                19EH
  248.     MVI    C,PRINT
  249.     CALL    MEX
  250.     RET
  251. ;....
  252. ;
  253. ; Display system version...
  254. ;
  255. SYSV:    MVI    C,ILP        ;                1A7H
  256.     CALL    MEX
  257.     DB    CR,LF
  258.     DB    'Version for Big Board I Serial Port A [004H]'
  259.     DB    CR,LF,0
  260.     RET
  261. ;....
  262. ;
  263. ; This routine allows a 300 ms. break tone to be sent to reset some
  264. ; time-shar computers.
  265. ;
  266. SNDBRK:    MVI    A,XMTREG
  267.     OUT    CTL1
  268.     MVI    A,BRK        ;send a break tone.
  269.     JMP    GBYE1
  270. ;.....
  271. ;
  272. ; This routine sends a 300 ms. break tone and sets DTR low for the same
  273. ; length of time to disconnect some modems such as the Bell 212A, etc.    
  274. ;
  275. GBYE:    MVI    A,XMTREG
  276.     OUT    CTL1        ;send to the status port
  277.     MVI    A,DISCON    ;turn off dtr
  278. ;
  279. GBYE1:    OUT    CTL1        ;set RS-232 bits
  280.     MVI    B,3        ;wait for 300 ms.
  281.     MVI    C,TIMER
  282.     CALL    MEX
  283.     CALL    SETXMT        ;restore the transmitter to normal
  284.     RET
  285. ;.....
  286. ;
  287. ; Big Board I initialization -- sets up Z80 SIO & the COM8116...
  288. ;
  289. ;    Serial Port A = 004H    <=- the prefered choice.
  290. ;    Serial Port B = 005H
  291. ;
  292. ;    Either port is acceptable & the usage will depend upon the
  293. ;    configuration of your system.  If you are using an external
  294. ;    terminal, you will need to use Serial Port A.  If you are
  295. ;    using the on board video & a serial printer, then you will
  296. ;    need to use Serial Port B.  If you are using an external
  297. ;    terminal and a serial printer, check into obtaining a port
  298. ;    expansion board.  The jumper boards for the serial channels
  299. ;    will need to be set.  The following table lists the jumpers:
  300. ;
  301. ;    Signal    <pt A>    <pt B>    Direction
  302. ;        JB4    JB5
  303. ;    ======    ======    ======    ======================
  304. ;    TxD     7- 8     7- 8    from computer to modem
  305. ;    RxD    11-12    11-12    from modem to computer
  306. ;    RTS    15-16    15-16    from computer to modem
  307. ;    CTS    19-20    19-20    from modem to computer
  308. ;    DTR    23-24    23-24    from computer to modem
  309. ;    DCD    27-28    27-28    from modem to computer
  310. ;    RxC    31-32    (Port A receive baud rate clock)
  311. ;    TxC    35-36    (Port A transmit baud rate clock)
  312. ;
  313.     IF    PORT$A
  314. PORT    EQU    004H    ;Big Board I Serial Output Port A.
  315. GENR    EQU    000H    ;Big Board I Baud Rate Generator for Port A.
  316.     ENDIF    ;Port A
  317. ;
  318.     IF    PORT$B
  319. PORT    EQU    005H    ;Big Board I Serial Output Port B.
  320. GENR    EQU    00CH    ;Big Board I Baud Rate Generator for Port B.
  321.     ENDIF    ;Port B
  322. ;
  323. CTL1:    EQU    PORT+2    ;Modem control port.
  324. DATP:    EQU    PORT    ;Modem data port.
  325. CTL2:    EQU    PORT+2    ;Modem status port.
  326. ;
  327. CMDREG    EQU    000H    ;SIO command register.
  328. FMTREG    EQU    004H    ;SIO serial format register.
  329. RCVREG    EQU    003H    ;SIO receiver control register.
  330. XMTREG    EQU    005H    ;SIO transmitter control register.
  331. ;
  332. RCVB:    EQU    01H    ;Your bits to test for receive.
  333. RCVR:    EQU    01H    ;Your value when receive ready.
  334. SNDB:    EQU    04H    ;Your bits to test for send.
  335. SNDR:    EQU    04H    ;Your value when send ready.
  336. DCDB    EQU    08H    ;Your bit to test for Data Carrier Detect.
  337. DCDR    EQU    08H    ;Your value when Data Carrier Detect(ed).
  338. ;
  339. ; The following values are sent to the Transmitter Control
  340. ; (Reg. 5) of the SIO.
  341. ;
  342. NORMAL:    EQU    1$11$0$1$0$1$0B    ;Your value for normal comm'n mode.
  343. BRK:    EQU    1$11$1$1$0$1$0B    ;Your value for send break.
  344. DISCON:    EQU    0$11$0$0$0$0$0B    ;Your value for disconnection.
  345. ;
  346. ; Baud rate constants for the COM8116 baud rate generator...
  347. ;
  348. G50    EQU    000H    ; 50 baud
  349. G75    EQU    001H    ; 75 baud
  350. G110    EQU    002H    ; 110 baud
  351. G135    EQU    003H    ; 135 baud
  352. G150    EQU    004H    ; 150 baud
  353. G300    EQU    005H    ; 300 baud
  354. G600    EQU    006H    ; 600 baud
  355. G1200    EQU    007H    ; 1200 baud
  356. G1800    EQU    008H    ; 1800 baud
  357. G2000    EQU    009H    ; 2000 baud
  358. G2400    EQU    00AH    ; 2400 baud
  359. G3600    EQU    00BH    ; 3600 baud
  360. G4800    EQU    00CH    ; 4800 baud
  361. G7200    EQU    00DH    ; 7200 baud
  362. G9600    EQU    00EH    ; 9600 baud
  363. G19200    EQU    00FH    ; 19200 baud
  364. GERROR    EQU    0FFH    ; baud rate error code
  365. ;
  366. ; Initialize the Z80 SIO...
  367. ;
  368. INIT:    MVI    A,CMDREG    ;select the command register
  369.     OUT    CTL1
  370.     MVI    A,00$011$000B    ;& ,reset the port,.
  371.     OUT    CTL1
  372.     CALL    SETFMT        ;set the serial format
  373.     CALL    SETRCV        ;set & enable the receiver
  374.     CALL    SETXMT        ;set & enable the transmitter
  375. ;
  376. ; and the COM8116 baud rate generator.
  377. ;
  378. CRATE:    MVI    A,C300        ;`default' transfer time to 300 baud.
  379.     STA    MSPEED
  380.     MVI    A,47H        ;generator set up
  381.     OUT    GENR        ;send to baud rate generator
  382. GRATE:    MVI    A,G300        ;initialized at 300 baud.
  383.     OUT    GENR        ;send to baud rate generator
  384.     RET
  385. ;
  386. ; SIO register set routines...
  387. ;
  388. SETFMT:    MVI    A,FMTREG    ;select the format register
  389.     OUT    CTL1
  390. SFRMT:    MVI    A,01$00$01$00B    ;& set clock rate,, 1 stop bit, no parity.
  391.     OUT    CTL1
  392.     RET
  393. ;
  394. SETRCV:    MVI    A,RCVREG    ;select receiver control register
  395.     OUT    CTL1
  396. SRCVR:    MVI    A,11$00000$1B    ;& set 8 bit character,, enable receive.
  397.     OUT    CTL1
  398.     RET
  399. ;
  400. SETXMT:    MVI    A,XMTREG    ;select transmit control register
  401.     OUT    CTL1
  402. SXMTR:    MVI    A,NORMAL    ;& enable send, 'dtr', 'rts'
  403.     OUT    CTL1
  404.     RET
  405. ;.....
  406. ;
  407. ; Setup routine to allow changing modem speed with the SET command.
  408. ;
  409. ; As documented, SET either displays the baud rate settings (with a null
  410. ; argument) or is used to set the baud rate.  The expanded SET now
  411. ; allows the parity, word size, & stop bits to be set.  These additional
  412. ; arguments may occur singly or in combination with other parameters. 
  413. ; If multiple arguments are used with the set command, then spaces must
  414. ; separate them.  Command arguments may occur in any order as long as
  415. ; the baud rate is the last argument.  All arguments after the baud rate
  416. ; are ignored.  The serial parameters are displayed at the end of each
  417. ; routine invocation if ALWAYS = YES and are always displayed if the
  418. ; arguments do not include a baud rate setting.
  419. ;
  420. ; The SET command also includes a local help screen that lists the
  421. ; arguments that affect the port status.  The help screen is invoked
  422. ; by a `?' or `HELP' argument.
  423. ;
  424. ; Included in the table of allowable arguments are some null arguments
  425. ; intended for documentation purposes.  These arguments have no effect
  426. ; on the port status.
  427. ;
  428. ; The following is a table of the available options:
  429. ;
  430. ; Type        Value    Setting
  431. ; =============    =======    =======
  432. ; Baud Rate-    50    50 baud
  433. ;        75    75 baud
  434. ;        110    110 baud
  435. ;        134.5    134.5 baud
  436. ;        150    150 baud
  437. ;        300    300 baud    <=- default value
  438. ;        600    600 baud
  439. ;        1200    1200 baud
  440. ;        1800    1800 baud
  441. ;        2000    2000 baud
  442. ;        2400    2400 baud
  443. ;        3600    3600 baud
  444. ;        4800    4800 baud
  445. ;        7200    7200 baud
  446. ;        9600    9600 baud
  447. ;        19200    19200 baud
  448. ;
  449. ; Parity-    NO    no parity    <=- default value
  450. ;        ODD    odd parity
  451. ;        EVEN    even parity
  452. ;
  453. ; Word Size-    8    8 bits per char    <=- default value
  454. ;        7    7 bits per char
  455. ;
  456. ; Stop Bits-    1    1 stop bit    <=- default value
  457. ;        1.5    1.5 stop bits
  458. ;        2    2 stop bits
  459. ; Null Args.-    BPS    null
  460. ;        BAUD     "
  461. ;        PARITY     "
  462. ;        WORD     "
  463. ;        SIZE     "
  464. ;        STOP     "
  465. ;        BIT     "
  466. ;        BITS     "
  467. ;
  468. ; For example,
  469. ;
  470. ;    SET NO 8 2 110        <=- note: baud rate last
  471. ;    or
  472. ;    SET  NO PARITY  8 BIT CHAR  2 STOP BITS  110 BAUD
  473. ;
  474. ; Sets 110 baud, no parity, 8 bit character size, & 2 stop bits.  If
  475. ; ALWAYS = YES, then the port status will be displayed.  If ALWAYS = NO,
  476. ; then the port status will not be displayed.  Note thet the second
  477. ; command line has the same result as the first.
  478. ;
  479. ;    SET   7 BIT WORD SIZE   ODD PARITY   1.5 STOP BITS
  480. ;
  481. ; Doesn't change the baud rate (from whatever it was before) and
  482. ; sets the parity to odd, 7 bit character size, & 1.5 stop bits.  The
  483. ; port status will be displayed because the baud rate was not specified.
  484. ;
  485. ;    SET 2 STOP BITS
  486. ;
  487. ; Changes the number of stop bits to 2.  Again, the port status will
  488. ; be displayed.
  489. ;
  490. ; This expansion is entirely compatable with read files.  Auto setting
  491. ; of the baud rate from the phone directory is still limited to the
  492. ; recognized baud rates of MEX (i.e. 110,300,600,1200,2400,4800,9600,
  493. ; & 19200). 450 baud and 710 baud cannot be supported on this machine.
  494. ; Serial format parameters cannot be set from the phone directory.
  495. ;
  496. ; SET command extension types...
  497. ;
  498. PARITY    EQU    0FEH        ; set parity command
  499. WORDSZ    EQU    0FDH        ; set word size
  500. STOPBT    EQU    0FCH        ; set stop bits
  501. HELP    EQU    0FBH        ; call for help
  502. TRASH    EQU    0FAH        ; null arguments
  503. ;
  504. RMASK    EQU    00$111111B    ;receiver char size clearing mask
  505. RBITS    EQU    11$000000B    ;I wish I was a real live assembler
  506. TMASK    EQU    1$00$11111B    ;transmitter char size clearing mask
  507. CHAR7B    EQU    01$000000B    ;7 bits per character value
  508. CHAR8B    EQU    11$000000B    ;8 bits per character value
  509. ;
  510. PMASK    EQU    111111$00B    ;parity enable clearing mask
  511. PBITS    EQU    000000$11B    ;I wish I was a real live assembler
  512. PAROFF    EQU    000000$00B    ;bits to set for parity off
  513. PARODD    EQU    000000$01B    ;bits to set for odd parity
  514. PAREVN    EQU    000000$11B    ;bits to set for even parity
  515. ;
  516. SMASK    EQU    1111$00$11B    ;stop bits clearing mask
  517. SBITS    EQU    0000$11$00B    ;I wish I was a real live assembler
  518. STOP10    EQU    0000$01$00B    ;bits to set for one stop bit
  519. STOP15    EQU    0000$10$00B    ;bits to set for one and a half stop bits
  520. STOP20    EQU    0000$11$00B    ;bits to set for two stop bits
  521. ;
  522. SETB:    MVI    C,SBLANK    ;Any arguments?
  523.     CALL    MEX
  524.     JC    TELL        ;If not, go display baud
  525.     LXI    D,CMDTBL
  526.     MVI    C,LOOKUP
  527.     CALL    MEX        ;Parse argument
  528.     JC    CMDERR        ;If not found then proclaim goof
  529.     MOV    A,H        ;Get the command number
  530.     ;
  531.     CPI    PARITY        ;Check for parity set
  532.     JZ    PARSET        ;If so, go set the parity
  533.     ;
  534.     CPI    WORDSZ        ;Check for word size
  535.     JZ    WRDSET        ;If so, go set the word size
  536.     ;
  537.     CPI    STOPBT        ;Check for stop bits
  538.     JZ    STPSET        ;If so, go set stop bits
  539.     ;
  540.     CPI    TRASH        ;Check for null argument
  541.     JZ    SETB        ;If so, continue parsing
  542.     ;
  543.     CPI    HELP        ;Check for help command
  544.     JZ    HELPUS        ;If so, print help file
  545.     ;
  546.     CPI    CERROR        ;Check for unsupported command rate
  547.     JNZ    LOADBD        ;Continue if supported
  548.     ;
  549.     PUSH    H        ;else, save the generator rate
  550.     MVI    C,ILP        ;& print warning message.
  551.     CALL    MEX
  552.     DB    CR,LF,'-=*=- WARNING -=*=-',CR,LF
  553.     DB    'MEX does not recognize this baud rate !!',CR,LF,LF,0
  554.     POP    H        ;restore the generator rate
  555.     JP    GENSET        ;& go set it
  556.     ;
  557. LOADBD:    STA    CRATE+1        ;change time-to-send to match baudrate
  558. GENSET:    MOV    A,L        ;get baudrate byte
  559.     STA    GRATE+1        ;send to COM8116 timer for new baudrate
  560.     CALL    CRATE        ;reinitialize to new baudrate
  561.     ;
  562.     IF    NOT ALWAYS
  563.     RET            ;then done!
  564.     ENDIF    ;show only on null set or format set.
  565.     ;
  566.     IF    ALWAYS
  567.     JMP    TELL        ;then done!
  568.     ENDIF    ;always show parameters on baud set.
  569. ;
  570. CMDERR:    MVI    C,ILP
  571.     CALL    MEX        ;Tell user input not valid
  572.     DB    CR,LF,'-=*=- Undefined SET argument -=*=-',CR,LF,LF,0
  573.     JMP    TELL        ;abort the balance of the SET command
  574.                 ;& display the current status
  575. ;
  576. PARSET:    LDA    SFRMT+1        ;get the format byte
  577.     ANI    PMASK        ;clear the parity bits
  578.     ORA    L        ;install the new bits
  579.     STA    SFRMT+1
  580.     CALL    SETFMT        ;set the SIO
  581.     JMP    DONSET
  582. ;
  583. STPSET:    LDA    SFRMT+1        ;get the format byte
  584.     ANI    SMASK        ;clear the stop bits
  585.     ORA    L        ;install the new bits
  586.     STA    SFRMT+1
  587.     CALL    SETFMT        ;set the SIO
  588.     JMP    DONSET
  589. ;
  590. WRDSET:    LDA    SRCVR+1        ;get the receiver byte
  591.     ANI    RMASK        ;clear the word size bits
  592.     ORA    L        ;install the new word size
  593.     STA    SRCVR+1
  594.     CALL    SETRCV        ;set the SIO
  595.     MOV    A,L        ;get the word size
  596.     RRC            ;move to proper position for
  597.     MOV    L,A        ; transmitter byte
  598.     LDA    SXMTR+1        ;get the transmitter byte
  599.     ANI    TMASK        ;clear the word size bits
  600.     ORA    L        ;install the new word size
  601.     STA    SXMTR+1
  602.     CALL    SETXMT        ;set the SIO
  603. ;
  604. DONSET:    JMP    SETB        ;go look for more parameters
  605. ;....
  606. ;
  607. ; Display the current baud rate.
  608. ;
  609. TELL:    MVI    C,ILP        ;get ready...
  610.     CALL    MEX
  611.     DB    CR,LF,'-=*=- Port Status -=*=-',CR,LF,' ',0
  612.     LDA    GRATE+1        ;get the current baud rate
  613.     ANI    00FH        ;set limit (safety factor)
  614.     ADD    A        ; times two...
  615.     LXI    H,CNVTBL    ;get the conversion table base
  616.     ADD    L        ;add generator code to table base
  617.     MOV    L,A
  618.     MVI    A,000H
  619.     ADC    H
  620.     MOV    H,A
  621.     SHLD    BPNTR        ;get the source address
  622.     DB    IN$LHLD        ;LHLD instruction
  623. BPNTR:    DS    2        ;(vector to where the pointer is)
  624.     LXI    D,BDMSG        ;get the destination buffer
  625.     DCX    H        ;pre-decrement addresses
  626.     DCX    D
  627.     ;
  628.     ; move the command from the table to the print buffer
  629.     ;
  630. MOVCMD:    INX    H        ;point to the next addresses
  631.     INX    D
  632.     MOV    A,M        ;get a byte
  633.     ORA    A        ;set/clear the negative flag
  634.     PUSH    PSW        ;& save it
  635.     ANI    07FH        ;strip high bit
  636.     STAX    D        ;store the byte
  637.     POP    PSW        ;restore flags
  638.     JP    MOVCMD        ;continue if high bit not set
  639.     ;
  640.     INX    D        ;point to the last byte
  641.     XRA    A        ;make a zero to end data field
  642.     STAX    D        ;& store it
  643.     INX    D        ;point to where an instruction should be
  644.     MVI    A,IN$RET    ;make a return instruction
  645.     STAX    D        ;& store it
  646.     CALL    PRNTBD        ;go print the baud rate command
  647.     ;
  648.     MVI    C,ILP        ;print english stuff...
  649.     CALL    MEX
  650.     DB    ' baud',CR,LF,0
  651. ;
  652. ; Display the parity
  653. ;
  654.     LDA    SFRMT+1        ;get the format byte
  655.     ANI    PBITS        ;select the bits for parity
  656.     CPI    PAROFF        ;check for parity off
  657.     JNZ    PCKODD        ;if not off, see if odd
  658.     MVI    C,ILP        ;else, proclaim no parity
  659.     CALL    MEX
  660.     DB    ' NO parity',CR,LF,0
  661.     JMP    PROWRD        ;go tell about the char size
  662. PCKODD:    CPI    PARODD        ;check for parity odd
  663.     JNZ    PCKEVN        ;if not odd, then call it even
  664.     MVI    C,ILP        ;else, proclaim odd parity
  665.     CALL    MEX
  666.     DB    ' ODD parity',CR,LF,0
  667.     JMP    PROWRD        ;go tell about the char size
  668. PCKEVN:    MVI    C,ILP        ;should be even parity
  669.     CALL    MEX
  670.     DB    ' EVEN parity',CR,LF,0
  671. ;
  672. ; Display the character size
  673. ;
  674. PROWRD:    LDA    SRCVR+1        ;get the receiver byte
  675.     ANI    RBITS        ;& mask out unneeded bits
  676.     CPI    CHAR7B        ;see if 7 bits per char
  677.     JNZ    PCK8BT        ;if not, then use 8 bits
  678.     MVI    C,ILP
  679.     CALL    MEX
  680.     DB    ' 7 bit char',CR,LF,0
  681.     JMP    PROSTP        ;go tell how many stop bits
  682. PCK8BT:    MVI    C,ILP
  683.     CALL    MEX
  684.     DB    ' 8 bit char',CR,LF,0
  685. ;
  686. ; Display the number of stop bits
  687. ;
  688. PROSTP:    LDA    SFRMT+1        ;get format byte
  689.     ANI    SBITS        ;mask off unneeded bits
  690.     CPI    STOP10        ;check for 1 stop bit
  691.     JNZ    PCKS15        ;if not, try 1.5 bits
  692.     MVI    C,ILP
  693.     CALL    MEX
  694.     DB    ' 1 stop bit',CR,LF,0
  695.     RET
  696. PCKS15:    CPI    STOP15        ;check for 1.5 stop bits
  697.     JNZ    PCKS20        ;if not, then 2 stop bits
  698.     MVI    C,ILP
  699.     CALL    MEX
  700.     DB    ' 1.5 stop bits',CR,LF,0
  701.     RET
  702. PCKS20:    MVI    C,ILP
  703.     CALL    MEX
  704.     DB    ' 2 stop bits',CR,LF,0
  705.     RET
  706. ;
  707. ; Help section...
  708. ;
  709. HELPUS:    MVI    C,ILP        ;print the help message
  710.     CALL    MEX
  711.     DB    CR,LF
  712.     DB    'The set command takes the following arguments:',CR,LF,LF
  713.     DB    '  Baud Rates:      50      75     110     134.5',CR,LF
  714.     DB    '                  150     300     600    1200',CR,LF
  715.     DB    '                 1800    2000    2400    3600',CR,LF
  716.     DB    '                 4800    7200    9600   19200',CR,LF,LF
  717.     DB    '      Parity:      NO     ODD    EVEN',CR,LF,LF
  718.     DB    '   Stop Bits:       1     1.5       2',CR,LF,LF
  719.     DB    '   Word Size:       7       8',CR,LF,LF
  720.     DB    'If baud rate is specified, then it must be the',CR,LF
  721.     DB    'last argument in the command string.  Example:',CR,LF,LF
  722.     DB    '        SET NO 8 2 110',CR,LF,LF
  723.     DB    'This sets no parity, 8 bits per word, 2 stop bits,',CR,LF
  724.     DB    'and 110 baud rate.  SET with no arguments displays',CR,LF
  725.     DB    'the current status.',CR,LF,0
  726.     RET            ;return
  727. ;
  728. ; Command table lists what's ok & what values to use...
  729. ;
  730. CMDTBL:
  731. ;
  732. ; Baud Rates...
  733. ;
  734. P300:    DB    '30','0'+80H    ; 300 baud command
  735.     DB    G300        ; L reg
  736.     DB    C300        ; H reg
  737. P1200:    DB    '120','0'+80H    ; 1200 baud command
  738.     DB    G1200
  739.     DB    C1200
  740. P2400:    DB    '240','0'+80H    ; 2400 baud command
  741.     DB    G2400
  742.     DB    C2400
  743. P110:    DB    '11','0'+80H    ; 110 baud command
  744.     DB    G110
  745.     DB    C110
  746. ;
  747. ; Baud rates not Smart Modem compatible
  748. ;
  749. P600:    DB    '60','0'+80H    ; 600 baud command
  750.     DB    G600
  751.     DB    C600
  752. P4800:    DB    '480','0'+80H    ; 4800 baud command
  753.     DB    G4800
  754.     DB    C4800
  755. P9600:    DB    '960','0'+80H    ; 9600 baud command
  756.     DB    G9600
  757.     DB    C9600
  758. P19200:    DB    '1920','0'+80H    ; 19200 baud command
  759.     DB    G19200
  760.     DB    C19200
  761. ;
  762. ; baud rates unrecognized by MEX
  763. ;
  764. P50:    DB    '5','0'+80H    ; 50 baud command
  765.     DB    G50
  766.     DB    CERROR
  767. P75:    DB    '7','5'+80H    ; 75 baud command
  768.     DB    G75
  769.     DB    CERROR
  770. P135:    DB    '134.','5'+80H    ; 134.5 baud command
  771.     DB    G135
  772.     DB    CERROR
  773. P150:    DB    '15','0'+80H    ; 150 baud command
  774.     DB    G150
  775.     DB    CERROR
  776. P1800:    DB    '180','0'+80H    ; 1800 baud command
  777.     DB    G1800
  778.     DB    CERROR
  779. P2000:    DB    '200','0'+80H    ; 2000 baud command
  780.     DB    G2000
  781.     DB    CERROR
  782. P3600:    DB    '360','0'+80H    ; 3600 baud command
  783.     DB    G3600
  784.     DB    CERROR
  785. P7200:    DB    '720','0'+80H    ; 7200 baud command
  786.     DB    G7200
  787.     DB    CERROR
  788. ;
  789. ; Parity commands
  790. ;
  791.     DB    'N','O'+80H    ; set no parity
  792.     DB    PAROFF
  793.     DB    PARITY
  794.     DB    'OD','D'+80H    ; set odd parity
  795.     DB    PARODD
  796.     DB    PARITY
  797.     DB    'EVE','N'+80H    ; set even parity
  798.     DB    PAREVN
  799.     DB    PARITY
  800. ;
  801. ; Word Size commands
  802. ;
  803.     DB    '7'+80H        ; set 7 bit character
  804.     DB    CHAR7B
  805.     DB    WORDSZ
  806.     DB    '8'+80H        ; set 8 bit character
  807.     DB    CHAR8B
  808.     DB    WORDSZ
  809. ;
  810. ; Stop Bits commands
  811. ;
  812.     DB    '1'+80H        ; set 1 stop bit
  813.     DB    STOP10
  814.     DB    STOPBT
  815.     DB    '1.','5'+80H    ; set 1.5 stop bits
  816.     DB    STOP15
  817.     DB    STOPBT
  818.     DB    '2'+80H        ; set 2 stop bits
  819.     DB    STOP20
  820.     DB    STOPBT
  821. ;
  822. ; Help commands
  823. ;
  824.     DB    'HEL','P'+80H    ; help
  825.     DB    0
  826.     DB    HELP
  827.     DB    '?'+80H        ; ?
  828.     DB    0
  829.     DB    HELP
  830. ;
  831. ; Null arguments
  832. ;
  833.     DB    'BP','S'+80H    ; 'bps'
  834.     DB    0
  835.     DB    TRASH
  836.     DB    'BAU','D'+80H    ; 'baud'
  837.     DB    0
  838.     DB    TRASH
  839.     DB    'PARIT','Y'+80H    ; 'parity'
  840.     DB    0
  841.     DB    TRASH
  842.     DB    'CHA','R'+80H    ; 'char'
  843.     DB    0
  844.     DB    TRASH
  845.     DB    'WOR','D'+80H    ; 'word'
  846.     DB    0
  847.     DB    TRASH
  848.     DB    'SIZ','E'+80H    ; 'size'
  849.     DB    0
  850.     DB    TRASH
  851.     DB    'STO','P'+80H    ; 'stop'
  852.     DB    0
  853.     DB    TRASH
  854.     DB    'BI','T'+80H    ; 'bit'
  855.     DB    0
  856.     DB    TRASH
  857.     DB    'BIT','S'+80H    ; 'bits'
  858.     DB    0
  859.     DB    TRASH
  860. ;
  861. ; Command Table end
  862. ;
  863.     DB    0        ; end of comparision list.
  864. ;
  865. ; Backwards Conversion Table - this table is used to report the
  866. ; current baud rate from the byte used to set the generator.  This
  867. ; bypasses the MEX print baud rate function.
  868. ;
  869. CNVTBL:    DW    P50
  870.     DW    P75
  871.     DW    P110
  872.     DW    P135
  873.     DW    P150
  874.     DW    P300
  875.     DW    P600
  876.     DW    P1200
  877.     DW    P1800
  878.     DW    P2000
  879.     DW    P2400
  880.     DW    P3600
  881.     DW    P4800
  882.     DW    P7200
  883.     DW    P9600
  884.     DW    P19200
  885. ;
  886. PRNTBD:    MVI    C,ILP
  887.     CALL    MEX
  888. BDMSG:    DS    10    ; to print baud rate command string
  889. ;....
  890. ;
  891. ; Set new modem port baud rate.  This routine is used to auto set the
  892. ; baud rate from the phone directory and as such is limited to only
  893. ; the baud rates that MEX recognizes.  No provisions are made here to
  894. ; set the parity, word size, or stop bits.
  895. ;
  896. NEWB:    PUSH    PSW        ; save the rate code
  897.     LXI    H,GTABLE    ; get vector to lookup table
  898.     ADD    L        ; add rate code to table base
  899.     MOV    L,A
  900.     MVI    A,000H
  901.     ADC    H
  902.     MOV    H,A
  903.     MOV    L,M        ; get generator rate from table
  904.     MOV    A,L        ; test for valid rate
  905.     CPI    GERROR
  906.     JNZ    OKBAUD        ; continue if valid
  907.     ;
  908.     MVI    C,ILP        ; else print error message
  909.     CALL    MEX
  910.     DB    CR,LF,'-=*=- ',0
  911.     POP    PSW
  912.     MVI    C,PRBAUD
  913.     CALL    MEX
  914.     MVI    C,ILP
  915.     CALL    MEX
  916.     DB    ' -=*=- is not supported - no change.',CR,LF,0
  917.     RET
  918.     ;
  919. OKBAUD:    POP    PSW    ; restore rate code
  920.     JMP    LOADBD    ; & go set the baud rate.
  921. ;
  922. GTABLE:    DB    G110    ;`0' - 110 baud
  923.     DB    G300    ;`1' - 300 baud
  924.     DB    GERROR    ;`2' - 450 baud  *** not supported ***
  925.     DB    G600    ;`3' - 600 baud
  926.     DB    GERROR    ;`4' - 710 baud  *** not supported ***
  927.     DB    G1200    ;`5' - 1200 baud
  928.     DB    G2400    ;`6' - 2400 baud
  929.     DB    G4800    ;`7' - 4800 baud
  930.     DB    G9600    ;`8' - 9600 baud
  931.     DB    G19200    ;`9' - 19200 baud
  932. ;
  933. ;
  934. EOSMSG:    DB    017H,0,0,0,'$'
  935. CLSMSG:    DB    01AH,0,0,0,'$'
  936. ;
  937. ; NOTE:  MUST TERMINATE PRIOR TO 0B00H (with Smartmodem)
  938. ;                 0D00H (without Smartmodem)
  939. ;
  940.     END
  941. code
  942.     LXI    H,GTABLE    ; get vector to lookup table
  943.     ADD    L        ; add rate code to table base
  944.     MOV    L,A
  945.     MVI    A,00