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

  1. ; MXO-HZ20.ASM-- Heath/Zenith H89 and H100 overlay file for MEX. 10/06/85
  2. ;
  3. ; --> BIG NOTE:  This is a single universal overlay for all of the Heath/Zenith
  4. ;     computers (except the H150).  It even takes into account "non-standard"
  5. ;     versions of the H89 (ie with the Z89-11 I/O board).  It replaces all
  6. ;     previous versions of MXO-H8xx and MXO-HZxx.
  7. ;
  8. ;     In addition, it has a full featured SET command which allows dynamic
  9. ;     changing of the data bits, parity, stop bits, answer delay and more.
  10. ;
  11. ; You will want to look this file over carefully. There are a number of
  12. ; options that you can use to configure the program to suit your taste.
  13. ;
  14. ;************************************************************************
  15. ;************************  SMARTMODEM USERS  ****************************
  16. ;*                                                                      *
  17. ;* Set SMMODEM label to YES for changing delay until "hangup" with no   *
  18. ;* answer and for ORIGINATE/ANSWER OPTION. Also MUST add to             *     
  19. ;* MXO-SM13.ASM (or earlier) at "SYSTEM EQUATES":                       *
  20. ;*                               NDELAY  EQU  011EH                     *
  21. ;*                                                                      *
  22. ;* and change:                   RESULT:  MVI C,60 to                   *
  23. ;*                               RESULT:  LDA  NDELAY                   *
  24. ;*                               MOV  C,A                               *
  25. ;*                                    *    
  26. ;* and change SMTIMO to read:       SMTIMO:  MVI  B,CR    \        *
  27. ;*                       MVI  C,SNDCHR \  new code    *
  28. ;*                      CALL MEX      /        *
  29. ;*                      MVI  A,2            *
  30. ;*                      RET                *
  31. ;* If you have MXO-SM17.ASM (or later) this patch is NOT necessary      *
  32. ;*                                                                      *
  33. ;************************************************************************
  34. ;*               TYPE "SET ?" AT MEX PROMPT FOR SET OPTIONS             *
  35. ;************************************************************************
  36. ;       TO USE: First edit this file filling in answers for your own
  37. ;               equipment.  Then assemble with ASM.COM or equivalent
  38. ;               assembler. Then use MLOAD to overlay the the results
  39. ;               of this program to the original .COM file.
  40. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  41. ; 10/06/85 - Added equate for the H100          - Jim McAfee
  42. ; 09/01/85 - Added 2661-3 code, and made the
  43. ;            overall code more "universal"      - Jim McAfee                    
  44. ; 08/29/85 - Add SET for parity, stop-bits,word
  45. ;            length,answer/originate and delay  - Biff Bueffel  
  46. ; 05/19/84 - Converted for MEX10                - Biff Bueffel
  47. ; 01/10/83 - Updated to work with MDM701        - Irv Hoff
  48. ; 10/03/82 - First version of this file
  49. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  50. ;
  51. YES:            EQU     0FFH
  52. NO:             EQU     0
  53. ;
  54. SMMODEM         EQU     YES             ;YES for smartmodem
  55. ;
  56. ;
  57. H89     EQU     YES     ; Set this to YES if you have an H89, NO if H100
  58. Z8911   EQU     NO      ; Set this to YES if your H89 has the Z89-11
  59.                         ; serial/parallel card (with the 2661-3 UART at 330Q).
  60.                         ; Set this to NO if you have the standard H88-3 card
  61.                         ; or you have the H100
  62. ;
  63.          IF H89 AND (NOT Z8911)
  64. ;
  65. ;The following equates are for the H88-3 card.  You need only set the 
  66. ;DPORT and DEFLCR equates to match your configuration
  67. ;
  68. DPORT:          EQU     0D8H            ;data port for H89
  69. SPORT:          EQU     DPORT+5         ;status port for H89
  70. LCPORT          EQU     DPORT+3         ;line control port
  71. INTPORT         EQU     DPORT+1         ;interrupt port
  72. MCPORT          EQU     DPORT+4         ;modem control port
  73. SPDPORT0        EQU     DPORT           ;first baud rate control port
  74. SPDPORT1        EQU     DPORT+1         ;second baud rate port
  75. BRPORT          EQU     DPORT+3         ;port to set the BREAK
  76. ;
  77. MDRCVB:         EQU     1               ;bit to test for received data
  78. MDRCVR:         EQU     1               ;modem receive ready
  79. MDSNDB:         EQU     20H             ;bit to test for ready to send
  80. MDSNDR:         EQU     20H             ;modem send ready bit
  81. ;
  82. SDB8            EQU     00000011B       ;set data bits to 8
  83. SDB7            EQU     00000010B       ;... and 7
  84. SDB6            EQU     00000001B       ;... and 6
  85. SDB5            EQU     0               ;... and 5
  86. RDB             EQU     11111100B       ;reset data bits
  87. DATBITM         EQU     00000011B       ;data bit mask
  88. ;
  89. SPOFF           EQU     0               ;set parity to off
  90. SPODD           EQU     00001000B       ;set parity to odd
  91. SPEVEN          EQU     00011000B       ;set parity to even
  92. RPOFF           EQU     11100111B       ;reset parity bits (to off)
  93. PARITYM         EQU     00011000B       ;parity mask
  94. ;
  95. SSB1            EQU     0               ;set stop bits to 1
  96. SSB15           EQU     00000100B       ;... and 1.5
  97. SSB2            EQU     00000100B       ;... and 2
  98. RSB             EQU     11111011B       ;reset stop bits
  99. STPBITM         EQU     00000100B       ;stop bit mask
  100. ;
  101. DEFLCR          EQU     SDB8+SPOFF+SSB1 ;default values for the line cont. reg
  102. ;
  103. SDLAB           EQU     10000000B       ;set divisor latch access bit
  104. ;
  105. SBR             EQU     01000000B       ;set break
  106. RBR             EQU     10111111B       ;reset break
  107. ;
  108. SRTSDTR         EQU     00000011B       ;set DTR & RTS true (on)
  109. RRTSDTR         EQU     11111100B       ;reset DTR & RTS
  110. ;
  111.          ENDIF          ;H89 AND (NOT Z8911)
  112. ;
  113. ; The following equates are for the H89 using the Z89-11 card or the H100.
  114. ; You need only set the DPORT and DEFLCR equates to match your setup.
  115.  
  116.          IF H89 AND Z8911
  117. DPORT:          EQU     330Q            ;data port for H89
  118.          ENDIF
  119.  
  120.          IF NOT H89
  121. DPORT:          EQU     0ECH
  122.          ENDIF
  123.  
  124.          IF (H89 AND Z8911) OR NOT H89
  125. SPORT:          EQU     DPORT+1         ;status port for
  126. LCPORT          EQU     DPORT+2         ;line control port
  127. MCPORT          EQU     DPORT+3         ;modem control port
  128. SPDPORT0        EQU     LCPORT          ;used to make the code ...
  129. SPDPORT1        EQU     LCPORT          ;... truly universal 
  130. BRPORT          EQU     DPORT+3         ;port to set the BREAK
  131. ;
  132. MDRCVB:         EQU     2               ;bit to test for received data
  133. MDRCVR:         EQU     2               ;modem receive ready
  134. MDSNDB:         EQU     1               ;bit to test for ready to send
  135. MDSNDR:         EQU     1               ;modem send ready bit
  136. ;
  137. SDB8            EQU     00001100B       ;set data bits to 8
  138. SDB7            EQU     00001000B       ;... and 7
  139. SDB6            EQU     00000100B       ;... and 6
  140. SDB5            EQU     0               ;... and 5
  141. RDB             EQU     11110011B       ;reset data bits
  142. DATBITM         EQU     00001100B       ;data bit mask
  143. ;
  144. SPOFF           EQU     0               ;set parity to off
  145. SPODD           EQU     00010000B       ;set parity to odd
  146. SPEVEN          EQU     00110000B       ;set parity to even
  147. RPOFF           EQU     11001111B       ;reset parity bits (to off)
  148. PARITYM         EQU     00110000B       ;parity mask
  149. ;
  150. SSB1            EQU     01000000B       ;set stop bits to 1
  151. SSB15           EQU     10000000B       ;... and 1.5
  152. SSB2            EQU     11000000B       ;... and 2
  153. RSB             EQU     00111111B       ;reset stop bits
  154. STPBITM         EQU     11000000B       ;stop bit mask
  155. ;
  156. SMODE           EQU     1               ;set to asynchronous mode
  157. ;
  158. DEFLCR          EQU     SDB8+SSB1+SPOFF+SMODE   ;default values for the
  159. ;                                                ... line control reg
  160. ;
  161. SBR             EQU     00001000B       ;set break
  162. RBR             EQU     11110111B       ;reset break
  163. ;
  164. SRTSDTR         EQU     00100111B       ;set DTR & RTS true (on), also sets
  165.                                         ;RxEN and TxEN true
  166. RRTSDTR         EQU     11011000B       ;reset DTR & RTS
  167. ;
  168.          ENDIF          ;(H89 AND Z8911) OR (NOT H89)
  169. ;
  170. ;
  171. ;MEX service processor stuff
  172. ;
  173. MEX             EQU     0D00H           ;address of the service processor
  174. INMDM           EQU     255             ;get char from port to A, CY=no more in 
  175. TIMER           EQU     254             ;delay 100ms * reg B
  176. TMDINP          EQU     253             ;B=# secs to wait for char, cy=no char
  177. CHEKCC          EQU     252             ;check for ^C from KBD, Z=present
  178. SNDRDY          EQU     251             ;test for modem-send ready
  179. RCVRDY          EQU     250             ;test for modem-receive ready
  180. SNDCHR          EQU     249             ;send a character to the modem (after sn
  181. RCVCHR          EQU     248             ;recv a char from modem (after rcvrdy)
  182. LOOKUP          EQU     247             ;table search: see CMDTBL comments for i
  183. PARSFN          EQU     246             ;parse filename from input stream
  184. BDPARS          EQU     245             ;parse baud-rate from input stream
  185. SBLANK          EQU     244             ;scan input stream to next non-blank
  186. EVALA           EQU     243             ;evaluate numeric from input stream
  187. LKAHED          EQU     242             ;get nxt char w/o removing from input
  188. GNC             EQU     241             ;get char from input, cy=1 if none
  189. ILP             EQU     240             ;inline print
  190. DECOUT          EQU     239             ;decimal output
  191. PRBAUD          EQU     238             ;print baud rate
  192. ;
  193. BELL:           EQU     07H             ;bell
  194. CR:             EQU     0DH             ;carriage return
  195. ESC:            EQU     1BH             ;escape
  196. LF:             EQU     0AH             ;linefeed
  197. TAB:            EQU     09H             ;TAB
  198. PRINT           EQU     09H             ;BDOS print-string function
  199. ;
  200.                 ORG     100H
  201. ;
  202. ;Change the clock speed if needed, to match your system
  203. ;
  204.                 DS      3       ;(for  "JMP   START" instruction)
  205. ;
  206.                 DS      1       ;                                       103H
  207.                 DS      1       ;                                       104H
  208. TPULSE:         DB      'T'     ;T=touch, P=pulse (Smartmodem-only)     105H
  209. CLOCK:          DB      20      ;clock speed in MHz x10, 25.5 MHz max.  106H
  210.                                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  211. MSPEED:         DB      5       ;0=110 1=300 2=450 3=600 4=710 5=1200   107H
  212.                                 ;6=2400 7=4800 8=9600 9=19200 default
  213. BYTDLY:         DB      5       ;0=0 delay  1=10ms  5=50 ms - 9=90 ms   108H
  214.                                 ;default time to send character in ter-
  215.                                 ;minal mode file transfer for slow BBS.
  216. CRDLY:          DB      5       ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  217.                                 ;default time for extra wait after CRLF
  218.                                 ;in terminal mode file transfer
  219. COLUMS:         DB      5       ;number of DIR columns shown            10AH
  220. SETFLG:         DB      YES     ;yes=user-added Setup routine           10BH
  221. SCRTST:         DB      YES     ;Cursor control routine                 10CH
  222.                 DS      1       ;                                       10DH
  223. BAKFLG:         DB      NO      ;yes=change any file same name to .BAK  10EH
  224. CRCFLG:         DB      YES     ;yes=default to CRC checking            10FH
  225. TOGCRC:         DB      YES     ;yes=allow toggling of CRC to Checksum  110H
  226. CVTBS:          DB      NO      ;yes=convert backspace to rub           111H
  227. TOGLBK:         DB      NO      ;yes=allow toggling of bksp to rub      112H
  228. ADDLF:          DB      NO      ;no=no LF after CR to send file in      113H
  229.                                 ;terminal mode (added by remote echo)
  230. TOGLF:          DB      YES     ;yes=allow toggling of LF after CR      114H
  231.                 DS      1       ;                                       115H
  232.                                 ;write logon sequence at location LOGON
  233. SAVCCP:         DB      YES     ;yes=do not overwrite CCP               116H
  234.                 DS      1       ;                                       117H
  235.                 DS      1       ;                                       118H
  236. LSTTST:         DB      YES     ;yes=printer available on printer port  119H
  237. XOFTST:         DB      NO      ;yes=checks for XOFF from remote while  11AH
  238.                                 ;sending a file in terminal mode
  239. XONWT:          DB      NO      ;yes=wait for XON after CR while        11BH
  240.                                 ;sending a file in terminal mode
  241. TOGXOF:         DB      YES     ;yes=allow toggling of XOFF checking    11CH
  242. IGNCTL:         DB      YES     ;yes=CTL-chars above ^M not displayed   11DH
  243. NDELAY:         DB      30      ;Modem no answer delay                  11EH
  244. EXTRA:          DS      1       ;                                       11FH
  245. BRKCHR:         DB      '@'-40H ;^@ = Send a 300 ms. break tone         120H
  246. NOCONN:         DB      'N'-40H ;^N = Disconnect from the phone line    121H
  247. LOGCHR:         DB      'L'-40H ;^L = Send logon                        122H
  248. LSTCHR:         DB      'P'-40H ;^P = Toggle printer                    123H
  249. UNSAVE:         DB      'R'-40H ;^R = Close input text buffer           124H
  250. TRNCHR:         DB      'T'-40H ;^T = Transmit file to remote           125H
  251. SAVCHR:         DB      'Y'-40H ;^Y = Open input text buffer            126H
  252. EXTCHR:         DB      '^'-40H ;^^ = Send next character               127H
  253. ;
  254.                 DS      2               ;                               128H
  255. ;
  256. INCTL1:         IN      SPORT ! RET     ;in modem control port          12AH
  257.                 DS      7
  258. OTDATA:         OUT     DPORT ! RET     ;out modem data port            134H
  259.                 DS      7
  260. INPORT:         IN      DPORT ! RET     ;in modem data port             13EH
  261.                 DS      7
  262. MASKR:          ANI     MDRCVB ! RET    ;bit to test for receive ready  148H
  263. TESTR:          CPI     MDRCVR ! RET    ;value of rcv. bit when ready   14BH
  264. MASKS:          ANI     MDSNDB ! RET    ;bit to test for send ready     14EH
  265. TESTS:          CPI     MDSNDR ! RET    ;value of send bit when ready   151H
  266.         DS    17        ;                154H
  267. DISCV:        JMP    DISCON        ;disconnect            
  268. GOODBV:        JMP    GOODBY        ;                168H
  269. INMODV:        JMP    DEFINI         ;go to user written routine    16BH
  270.                     ;Note this change from earlier vers.
  271. NEWBDV:        JMP    NEWBAUD        ;Change baudrate        16EH
  272.         RET  !    NOP  !    NOP    ;                171H
  273.         RET  !    NOP  !    NOP    ;                174H
  274. SETUPV:        JMP    SETCMD        ;                177H
  275.         DS    3        ;Not used by MEX        17AH
  276. VERSNV:        JMP    SYSVER        ;                17DH
  277. BREAKV:        JMP    SBREAK        ;                180H
  278. ;
  279. ;Do not change the following six lines.
  280. ;
  281. ILPRTV:        DS    3        ;                183H
  282. INBUFV:        DS    3        ;                186H
  283. INCMPV:        DS    3        ;                189H
  284. INMDMV:        DS    3        ;                18CH
  285.         DS    3        ;                18FH
  286. TIMERV:        DS    3        ;                192H
  287. ;
  288. ;The following clear the screen for the H19 or H89 terminal
  289. ;
  290. CLREOS:        LXI    D,EOSMSG
  291.         MVI    C,PRINT
  292.         CALL    MEX
  293.         RET            
  294. ;
  295. CLS:        LXI    D,CLSMSG
  296.         MVI    C,PRINT
  297.         CALL    MEX
  298.         RET            
  299. ;
  300. ;
  301. SYSVER:        CALL    MILP
  302.         DB    'Version for Heath/Zenith '
  303.  
  304.          IF H89
  305.         DB    'H89'
  306.          ENDIF
  307.     
  308.          IF NOT H89
  309.         DB    'H100'
  310.          ENDIF
  311.  
  312.         DB    ' with '
  313.  
  314.          IF H89 AND (NOT Z8911)
  315.         DB    '8250'
  316.          ENDIF
  317.  
  318.          IF H89 AND Z8911
  319.         DB    '2661-3'
  320.          ENDIF
  321.  
  322.          IF NOT H89
  323.         DB    '2661-2'
  324.          ENDIF
  325.  
  326.         DB    ' UART',CR,LF,0
  327.         RET    
  328. ;------
  329. ;
  330. ;This routine sends a 300 ms. break tone to reset some time-share
  331. ;computers.
  332.  
  333. SBREAK:   IN    BRPORT
  334.       ORI    SBR    
  335.       OUT    BRPORT
  336.       JMP    DISC1
  337.  
  338. ;------
  339. GOODBY:      RET            ;Not done here
  340.  
  341. ;------
  342. ;
  343. ;Disconnect the modem    
  344.  
  345. DISCON:      XRA    A
  346.       OUT    MCPORT        ;SET DTR AND RTS LOW
  347. ;
  348. DISC1:      MVI    B,3        ;WAIT 300 MS.
  349.       MVI    C,TIMER
  350.       CALL    MEX    
  351.       LDA    LCR        ;stored version of line control register
  352.       OUT    LCPORT 
  353.       MVI    A,SRTSDTR
  354.       OUT    MCPORT         ;set DTR & RTS high
  355.       RET
  356. ;.....
  357. ;
  358. ;The following is used to initialize the H89/H100 UART.
  359. ;Note that on initialization the program jumps to DEFINI, which uses
  360. ;MSPEED to set the default modem speed, and the values at LCR: to set
  361. ;parity, data bits, etc.
  362.  
  363. DEFINI:      LDA    MSPEED
  364.       JMP    NEWBAUD
  365. ;
  366. NITMOD:   MVI    A,0    ;this is set by LOADBD
  367.       STA    MSPEED    ;store new modem speed
  368.       DI        ;disable interrupts
  369. ;    
  370.      IF H89 AND (NOT Z8911)
  371.       XRA    A
  372.       OUT    INTPORT     ;clear interrupts
  373.       MVI    A,SDLAB
  374.       OUT    LCPORT    ;set devisor latch access bit
  375.      ENDIF        ;H89 AND (NOT Z8911)
  376. ;
  377. LSPSPD:      MVI    A,0        ;Value set by LOADBD.
  378.       OUT    SPDPORT0    ;With the 2661 this is mode register 1 = LCR
  379.                 ;With the 8250 this is the LSB of baud rate
  380. MSPSPD:      MVI    A,0        ;Value set by LOADBD
  381.       OUT    SPDPORT1    ;With 2661 this is mode register 2 = baud rate
  382.                 ;With 8250 this is MSB of baud rate
  383. ;
  384.      IF H89 AND (NOT Z8911)
  385.       LDA    LCR        ;Already done above if 2661
  386.       OUT    LCPORT
  387.      ENDIF            ;H89 AND (NOT Z8911)
  388. ;
  389.       MVI    A,SRTSDTR    ;Set RTS & DTR
  390.       OUT    MCPORT
  391.       EI            ;restore interrupts to normal
  392.       RET
  393. ;.....
  394. ;
  395. ;Set command processor
  396. ;
  397. SETCMD:      MVI    C,SBLANK    ;ANY ARGUMENTS?
  398.       CALL  MEX
  399.       JC    SETSHO        ;IF NOT, DISPLAY DEFAULT(S)
  400.       LXI    D,CMDTBL
  401.           MVI    C,LOOKUP
  402.       CALL  MEX        ;PARSE THE ARGUMENT
  403.       PUSH    H        ;SAVE ANY PARSED ARGUMENTS ON STACK
  404.       RNC            ;IF WE HAVE ONE, RETURN TO IT
  405.       POP    H        ;OOPS, INPUT NOT FOUND IN TABLE
  406. SETERR:    CALL     MILP
  407.       DB    CR,LF,'SET command error',CR,LF,0
  408.       RET
  409. ;
  410. ;Argument table
  411. ;
  412. CMDTBL:   DB    '?'+80H            ;HELP
  413.       DW    SETHELP
  414. ;
  415.        IF    SMMODEM
  416.       DB    'ORI','G'+80H        ;ORIGINATE MODE
  417.       DW    ORIG
  418.       DB    'ANSWE','R'+80H        ;ANSWER MODE
  419.       DW    ANS
  420.       DB    'TON','E'+80H        ;TONE DIALING
  421.       DW    STTONE
  422.       DB    'PULS','E'+80H        ;PULSE DIALING
  423.       DW    STPULSE
  424.       DB    'DELA','Y'+80H        ;SET DELAY
  425.       DW    DELAY
  426.            ENDIF        ;SMMODEM
  427. ;
  428.       DB    'BAU','D'+80H        ;SET BAUD
  429.       DW    STBAUD
  430.       DB    'PARIT','Y'+80H        ;SET PARITY
  431.       DW    STPRTY
  432.       DB    'STOPBIT','S'+80H    ;SET STOPBITS
  433.       DW    STSTOP
  434.       DB    'LENGT','H'+80H        ;SET LENGTH
  435.       DW    STBITS
  436.       DB    0            ;TABLE TERMINATOR
  437. ;
  438. ;
  439. ; "SET (no args): PRINT CURRENT STATISTICS
  440. ;
  441. SETSHO:      CALL  MILP    
  442.       DB    CR,LF
  443.       DB    'SET values:',CR,LF,CR,LF,0
  444.  
  445.            IF SMMODEM
  446.       CALL    MDSHOW
  447.       CALL    CRLF
  448.       CALL    TPSHOW
  449.       CALL    CRLF
  450.       CALL    DLSHOW
  451.       CALL    CRLF        
  452.        ENDIF        ;SMMODEM
  453. ;
  454.       CALL    BDSHOW
  455.       CALL    CRLF
  456.       CALL  SHPRTY
  457.       CALL    CRLF
  458.       CALL    SHSTOP
  459.       CALL    CRLF
  460.       CALL  SHBITS
  461.       CALL    CRLF
  462.       RET
  463. ;
  464. ;"SET ?" processor
  465. ;
  466. SETHELP:  CALL    MILP
  467.  
  468.          IF SMMODEM
  469.       DB    CR,LF,'SET ORIG'
  470.       DB    CR,LF,'SET ANSWER'
  471.       DB    CR,LF,'SET TONE'
  472.       DB    CR,LF,'SET PULSE'
  473.       DB    CR,LF,'SET DELAY     - <N> seconds'
  474.        ENDIF        ;SMMODEM
  475. ;
  476.       DB    CR,LF,'SET PARITY    - OFF, EVEN or ODD'
  477.       DB    CR,LF,'SET STOPBITS  - 1, or 2'
  478.       DB    CR,LF,'SET LENGTH    - 5, 6, 7 or 8'
  479.       DB    CR,LF,'SET BAUD      - 300, 600, 1200, 2400, '
  480.       DB    '4800, 9600'
  481.       DB    CR,LF,CR,LF,0
  482.       RET
  483. ;
  484. ;"SET BAUD" processor
  485. ;
  486. STBAUD:      MVI    C,SBLANK    ;
  487.       CALL    MEX
  488.       JC    SETERR        ;
  489.       LXI    D,BDTBL
  490.       MVI    C,LOOKUP
  491.       CALL    MEX        ;Parse argument
  492.       PUSH    H        ;Save any parsed argument addrs on stack
  493.       RNC            ;If we have one, return to it
  494.       POP    H        ;Oops, input not found in table
  495.       CALL    MILP        ;Tell user input not valid
  496.       DB    CR,LF,'That baudrate not supported by SET command',CR,LF,0
  497.       RET
  498. ;
  499. BDTBL:      DB    '30','0'+80H
  500.       DW    OK300
  501.       DB    '60','0'+80H
  502.       DW    OK600
  503.       DB    '120','0'+80H
  504.       DW    OK1200
  505.       DB    '240','0'+80H
  506.       DW    OK2400
  507.       DB    '480','0'+80H
  508.       DW    OK4800
  509.       DB    '960','0'+80H
  510.       DW    OK9600
  511.       DB    0
  512. ;
  513. OK300:      MVI    A,1        ;MSPEED 300 baud value
  514.       LHLD    BD300        ;get 300 baud parameters in HL
  515.       JMP    LOADBD        ;go load them
  516. ;
  517. OK600:      MVI    A,3
  518.       LHLD    BD600
  519.       JMP    LOADBD
  520. ;
  521. OK1200:      MVI    A,5
  522.       LHLD    BD1200
  523.       JMP    LOADBD
  524. ;
  525. OK2400:   MVI    A,6
  526.       LHLD    BD2400
  527.       JMP    LOADBD
  528. ;
  529. OK4800:      MVI    A,7
  530.       LHLD    BD4800
  531.       JMP    LOADBD
  532. ;
  533. OK9600:      MVI    A,8
  534.       LHLD    BD9600
  535.       JMP    LOADBD
  536. ;
  537. LOADBD:      STA    NITMOD+1    ;store speed to show transfer time
  538.  
  539.        IF H89 AND (NOT Z8911)
  540.       MOV    A,L        ;get least significant baud rate byte
  541.       STA    LSPSPD+1    ;store in NITMOD
  542.       MOV    A,H        ;get most signifcant baud rate byte
  543.        ENDIF    ;H89 AND (NOT Z8911)
  544.  
  545.        IF (H89 AND Z8911) OR (NOT H89)
  546.        LDA    LCR        ;sets the line control register
  547.       STA    LSPSPD+1
  548.       MOV    A,L
  549.        ENDIF    ;(H89 AND Z8911) OR (NOT H89)
  550.  
  551.       STA    MSPSPD+1    ;store in NITMOD
  552.       JMP    NITMOD        ;reset H89 8250
  553. ;
  554. NEWBAUD:  CPI    1
  555.       JZ    OK300
  556.       CPI    3
  557.       JZ    OK600
  558.       CPI    5
  559.       JZ    OK1200
  560.       CPI    6
  561.       JZ    OK2400
  562.       CPI    7
  563.       JZ    OK4800
  564.       CPI    8
  565.       JZ    OK9600
  566.       RET
  567. ;
  568. ;Table of baud rate parameters
  569. ;
  570.      IF H89 AND (NOT Z8911)
  571. BD300:      DW    0180H
  572. BD600:      DW    00C0H
  573. BD1200:      DW    0060H
  574. BD2400:      DW    0030H
  575. BD4800:      DW    0018H
  576. BD9600:   DW    000CH
  577.      ENDIF        ;H89
  578.  
  579.      IF H89 AND Z8911
  580. BD300:      DB    0F5H
  581. BD600:      DB    0F6H
  582. BD1200:      DB    0F7H
  583. BD2400:      DB    0FAH
  584. BD4800:      DB    0FCH
  585. BD9600:   DB    0FEH
  586.      ENDIF        ;H89 AND Z8911
  587.  
  588.      IF NOT H89
  589. BD300:      DB    0F6H
  590. BD600:      DB    0F7H
  591. BD1200:      DB    0F8H
  592. BD2400:      DB    0FBH
  593. BD4800:      DB    0FCH
  594. BD9600:   DB    0FDH
  595.      ENDIF        ;NOT H89
  596. ;
  597. BDSHOW:      LDA    MSPEED        ;GET CURRENT BAUD RATE
  598.       MVI    C,PRBAUD    ;LET MEX PRINT IT
  599.       CALL    MEX
  600.       RET 
  601. ;
  602.       IF    SMMODEM
  603. ;
  604. ;SET MODE PROCESSOR 
  605. ;
  606. ORIG:      XRA    A
  607.       STA    ANSFLG        ;SET ORIG FLAG
  608.       LXI    H,SMO        ;SEND OUT ATS0=0
  609.       CALL    SMSEND
  610.       RET
  611. ;
  612. ANS:      MVI    A,0FFH
  613.       STA    ANSFLG        ;SET ANS FLAG
  614.       LXI    H,SMA        ;SEND OUT ATS0=1
  615.       CALL    SMSEND
  616.       RET            ;EXIT 
  617. ;
  618. ;Send string to the SmartModem
  619. ;
  620. SMSEND:      MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  621.       CALL    MEX
  622.       JNZ    SMSEND
  623.       MOV    A,M        ;FETCH NEXT CHARACTER
  624.       INX    H
  625.       ORA    A        ;END?
  626.       RZ            ;DONE IF SO
  627.       MOV    B,A        ;NO, POSITION FOR SENDING
  628.       MVI    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  629.       CALL    MEX
  630.       JMP    SMSEND
  631. ;
  632. MDSHOW:      LDA    ANSFLG
  633.       ORA    A
  634.       JZ    MDORIG        
  635.       CALL    MILP
  636.       DB    'Auto-answer mode',0
  637.       RET
  638. MDORIG:      CALL    MILP
  639.       DB    'Originate mode',0
  640.       RET
  641. ;
  642. SMO:      DB    'ATS0=0',CR,0
  643. SMA:      DB    'ATS0=1',CR,0
  644. ;
  645. ;Set dial processor
  646. ;
  647. STTONE:      MVI    A,'T'
  648.       JMP    SDIAL1
  649. STPULSE:  MVI    A,'P'
  650. SDIAL1:   STA    TPULSE
  651.       RET
  652. TPSHOW:      LDA    TPULSE
  653.       CPI    'T'
  654.       JZ    TPTONE
  655.       CALL    MILP
  656.       DB    'Pulse Dial',0
  657.       RET
  658. TPTONE:      CALL    MILP
  659.       DB    'Tone Dial',0      
  660.       RET
  661. ;
  662. ;Set delay processor
  663. ;
  664. DELAY:      MVI    C,EVALA
  665.       CALL    MEX
  666.       MOV    A,H
  667.       ORA    A
  668.       JNZ    SETERR
  669.       MOV    A,L
  670.       STA    NDELAY
  671.       RET
  672. DLSHOW:      CALL    MILP
  673.       DB    'Answer Delay is ',0
  674.       LHLD    NDELAY
  675.       MVI    H,0
  676.       MVI    C,DECOUT
  677.       CALL    MEX
  678.       CALL    MILP
  679.       DB    ' seconds',0
  680.       RET
  681. ;
  682.       ENDIF        ;SMMODEM
  683. ;
  684. ;------
  685. ;    SET PARITY command: reset transmit/receive parity
  686. ;
  687. STPRTY:      MVI    C,SBLANK    ;check for parity code
  688.       CALL    MEX        ;
  689.       JC    SETERR        ;if none, print error
  690.       LXI    D,PARTBL    ;check for proper syntax
  691.       MVI    C,LOOKUP
  692.       CALL    MEX
  693.       JC    SETERR
  694.        LDA    LCR
  695.       ANI    RPOFF        ;Reset parity bits (also sets parity off)
  696.       PCHL            ;go to the proper section
  697. ;
  698. PREVEN:      ORI    SPEVEN
  699.       JMP    PARTB1
  700. PRODD:      ORI    SPODD
  701. PARTB1:      STA    LCR        ;Also comes to this point if set parity to off
  702.       JMP    NITMOD
  703. ;
  704. SHPRTY:      CALL    MILP
  705.       DB    'Parity:  ',TAB,' ',0
  706.       LDA    LCR
  707.       ANI    PARITYM
  708.       CPI    SPOFF    ;parity off?
  709.       JNZ    SHPRT1
  710.       CALL    MILP
  711.       DB    'Off',0
  712.       RET
  713. SHPRT1:      CPI    SPODD    ;parity odd?
  714.       JNZ    SHPRT2
  715.       CALL    MILP
  716.        DB    'Odd',0
  717.       RET
  718. SHPRT2:      CALL    MILP        ;
  719.       DB    'Even',0    ;
  720.       RET
  721. ;
  722. ;    SET PARITY command table
  723. ;
  724. PARTBL:      DB    'OF','F'+80H    ;"set parity off"
  725.       DW    PARTB1
  726.       DB    'EVE','N'+80H    ;"set parity even"
  727.       DW    PREVEN
  728.       DB    'OD','D'+80H    ;"set parity odd"
  729.       DW    PRODD
  730.       DB    0        ;<<== end of parity table
  731. ;
  732. ;-------
  733. ;    SET STOPBITS command: reset number of stop bits
  734. ;
  735.  
  736. STSTOP:      MVI    C,SBLANK    ;check for stop bits
  737.       CALL    MEX        ;
  738.       JC    SETERR        ;if none, print error
  739.       LXI    D,STPTBL    ;check for proper syntax
  740.       MVI   C,LOOKUP
  741.       CALL    MEX        ;
  742.       JC    SETERR        ;print error
  743.       LDA    LCR
  744.       ANI    RSB        ;reset stop bits
  745.       PCHL            ;go do it
  746.  
  747. STOP01:      ORI    SSB1
  748.       JMP    STSTP1
  749. STOP15:      ORI    SSB15
  750.       JMP    STSTP1
  751. STOP02:      ORI    SSB2
  752. STSTP1:      STA    LCR
  753.       JMP    NITMOD
  754. ;
  755. ;
  756. SHSTOP:      CALL    MILP        ;display stop-bits
  757.       DB    'Stop bits:',TAB,' ',0
  758.       LDA    LCR        ;
  759.       ANI    STPBITM
  760.       CPI    SSB1
  761.       JNZ    SHSTP2
  762.       CALL    MILP
  763.       DB    '1',0
  764.       RET
  765. SHSTP2:      CPI    SSB2
  766.           JNZ    SHSTP15
  767.       CALL    MILP
  768.       DB    '2'
  769. ;
  770.      IF H89 AND (NOT Z8911)
  771.       DB    ' or 1.5 if 5 bit data words'
  772.      ENDIF
  773. ;
  774.       DB     0
  775.       RET
  776. SHSTP15:    
  777.       CALL    MILP
  778.       DB    '1.5',0
  779.       RET
  780.  
  781. ;
  782. ;    SET STOPBITS command table
  783. ;
  784. STPTBL:      DB    '1'+80H        ;"set stop 1"
  785.       DW    STOP01
  786.       DB    '2'+80H        ;"set stop 2"
  787.       DW    STOP02
  788.       DB    '1.','5'+80H    ;1.5 stop bits
  789.       DW    STOP15
  790.       DB    0        ;<<== End of stop-bits table
  791. ;
  792. ;-------
  793. ;    SET LENGTH command: set bits per character
  794.  
  795.  
  796. STBITS:      MVI    C,SBLANK    ;check for bits/char
  797.       CALL    MEX        ;
  798.       JC    SETERR        ;if none, print error
  799.       LXI    D,BITTBL    ;check for proper syntax
  800.       MVI    C,LOOKUP
  801.       CALL    MEX
  802.       JC    SETERR
  803.       LDA    LCR
  804.       ANI    RDB        ;reset data bits (also = 5 bit)
  805.           PCHL            ;go do function
  806.  
  807. BIT6:      ORI    SDB6    ;6 bits
  808.       JMP    STBTS1      
  809. BIT7:      ORI    SDB7    ;7 bits
  810.       JMP    STBTS1
  811. BIT8:      ORI    SDB8    ;8 bits
  812. STBTS1:      STA    LCR    ;also comes here if set bits to 5
  813.       JMP    NITMOD
  814.  
  815. SHBITS:      CALL    MILP        ;display bits/char
  816.       DB    'Bits/char:',TAB,' ',0
  817.       LDA    LCR        ;
  818.       ANI    DATBITM
  819.       JZ    SHDB5
  820.       CPI    SDB6
  821.       JZ    SHDB6
  822.       CPI    SDB7
  823.       JZ    SHDB7
  824.       CALL    MILP
  825.       DB    '8',0
  826.       RET
  827. SHDB7:      CALL     MILP
  828.       DB    '7',0
  829.       RET
  830. SHDB6:      CALL    MILP
  831.       DB    '6',0
  832.       RET
  833. SHDB5:      CALL    MILP
  834.       DB    '5',0
  835.       RET
  836.  
  837. ;
  838. ;    SET LENGTH command table
  839.  
  840. BITTBL:      DB    '5'+80H        ;"set bits 5"
  841.       DW    STBTS1
  842.       DB    '6'+80H        ;"set bits 6"
  843.       DW    BIT6
  844.           DB    '7'+80H        ;7 BITS
  845.       DW    BIT7
  846.              DB    '8'+80h        ;8 bits
  847.       DW    BIT8
  848.       DB    0        ;<<== end of bpc table
  849. ;
  850. ;General utility routines
  851. ;
  852. MILP:      MVI    C,ILP        ;IN-LINE PRINT
  853.       JMP    MEX
  854.       RET
  855. ;
  856. CRLF:     CALL  MILP            ;PRINT CARRIAGE RETURN, LINE FEED
  857.           DB    CR,LF,0
  858.           RET
  859. ;
  860. ;
  861. ;
  862. ;==========================================================================
  863. ;                           Data Area
  864. ;==========================================================================
  865. ;
  866. LCR:      DB    DEFLCR
  867. ANSFLG:   DB    0
  868. ;
  869. ;
  870. BAUDBUF:  DB    10,0
  871.           DS    10
  872. ;
  873. EOSMSG:   DB    ESC,'J',0,0,0,'$'                       
  874. CLSMSG:   DB    ESC,'E',0,0,0,'$'
  875. ;------------------------------------------------------------------
  876. ;
  877. ;NOTE:  MUST TERMINATE PRIOR TO 0B00H (with Smartmodem)
  878. ;
  879.          IF (0B00H-1-$) SHR 12
  880. ERROR:  EQU     NOVALUE         ; PROGRAM IS TOO LARGE
  881.          ENDIF
  882.  
  883.           END
  884.