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-UR13.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  50KB  |  1,168 lines

  1.           Title     'MEX overlay for the U.S. Robotics (S-100) 1.3'
  2. ;
  3. ;
  4. ;
  5. REV       EQU       13                  ;overlay revision level
  6. ;
  7. ; MEX OVERLAY VERSION 1.3: mods by Jesse Eaton on 10/14/84
  8. ;                                Cleaned up break to prevent garbage after brk.
  9. ;                                Fixed bug in parity logic.  The call to
  10. ;                                PARITV: restores parity mode in SIO to its
  11. ;                                value prior to a call to NOPARV:.
  12. ;                                Call to NOPARV: is transparent to SET cmd.
  13. ;         NOTE: If parity is incorrect it can cause no response to initial
  14. ;               NAK for R mode file transfers resulting in timeouts.
  15. ;               Incorrect parity can also cause incorrect header # error.
  16. ;               Normally parity = none should be specified.
  17. ;
  18. ; MEX OVERLAY VERSION 1.2: mods by Jesse Eaton on 10/11/84
  19. ;                                corrected error when dialing from library
  20. ;                                 with auto baud setting.
  21. ;                                corrected bugs in SET command and expanded it's
  22. ;                                 functionality to include auto answer tone and
  23. ;                                 answer on ring #. 
  24. ;                                SET now allows parity bit setting.
  25. ;                                SET now also allows setting full/half duplex.
  26. ;         NOTE: The manual answer logic via "ATA" command and parity setting
  27. ;               from outside the SET command may need additional work.
  28. ;               Also note that you can add the S10 register in INITMSG:
  29. ;               IF your ROM chip set supports it.  Older versions did not.
  30. ;               My USR S-100 modem is connected on a line with "call waiting"
  31. ;               and will drop carrier if an incoming call generates the
  32. ;               call waiting beep tone.  I got a newer ROM (U3 A7.9) and tried
  33. ;               to keep the carrier on by setting S10=255.  It did not help
  34. ;               me but it might help you on a different phone system. Older
  35. ;               ROM versions will not generate a response (0-5 or Verbose) if
  36. ;               any unrecognized "AT" commands sush as "ATH" or "S10" are
  37. ;               are issued to the modem.  You can test them in Terminal mode.
  38. ;               Unknown commands are merely ignored instead of hanging the
  39. ;               modem with newer proms.
  40. ;
  41. ;         REQUEST: If you can shed light on any of the above comments or
  42. ;                    this overlay in general I can be contacted via Arpanet
  43. ;                    mail.  My address is Eaton.HFED @ HI-MULTICS.
  44. ;
  45. ;
  46. ; MEX OVERLAY VERSION 1.1: mods to break routine 10/10/84 by Jesse Eaton
  47. ;                                added help ? msg to SET command
  48. ;
  49. ; MEX OVERLAY VERSION 1.0: written 04/27/84 by Ron Fowler
  50. ; U.S.Robotics Version 1.0: written 08/11/84 by Ray Broz & Mike Smith
  51. ;
  52. ; This overlay is a combination of Ron's PMMI and Smart Modem Overlays
  53. ; with the required changes to make it work with the U.S. Robotics S-100
  54. ; autodial modem.
  55. ;------------------------------------------------------------
  56. ;
  57. ; Misc equates
  58. ;
  59. NO        EQU       0
  60. YES       EQU       NOT NO
  61. TPA       EQU       100H
  62. NULL      EQU       0
  63. CR        EQU       0DH
  64. LF        EQU       0AH
  65. TAB       EQU       09H
  66. BELL      EQU       07H
  67.  
  68. MAXWAIT EQU         60                  ;maximum time to wait for connection
  69. CLRSCN    EQU       YES                 ;set yes to use clear screen commands
  70. ANSRNG    EQU       '3'                 ;SET RING default 1-9 (answer on ring #)
  71. S10       EQU       YES                 ;S10 can be used with newer model modems
  72.                                         ;see note above. (older ROM versions will
  73.                                         ;hang if this register is used)
  74. ;
  75. ; US Robotics port definitions
  76. ;
  77. PORT      EQU       30H                 ;US Robotics base port 
  78. MDMCOM    EQU       PORT+1              ;modem command port
  79. MDMMOD    EQU       PORT+1              ;modem mode port
  80. MDMSTS    EQU       PORT+1              ;modem status port
  81. MDMDAT    EQU       PORT                ;modem data port
  82. ;
  83. ; US Robotics bit definitions
  84. ;
  85. MDRCVB    EQU       00000010B ;modem receive bit 
  86. MDRCVR    EQU       00000010B ;modem receive ready bit 
  87. MDSNDB    EQU       00000001B ;modem send bit 
  88. MDSNDR    EQU       00000001B ;modem send ready bit 
  89. OPARIT    EQU       00010000B ;odd-parity bits
  90. EPARIT    EQU       00110000B ;even-parity bits
  91. NPARIT    EQU       00000000B ;no-parity bits
  92. ;
  93. ; US Robotics masks (v1.2 je)
  94. XMITRDY   EQU       00000001B ;mask for transmit ready
  95. BRKMSK    EQU       00001000B ;mask to set break
  96. PARMSK    EQU       11001111B ;mask to remove parity bits
  97. BDMSKL    EQU       01111100B ;mask for baudrate bits in mode (v1.2 je)
  98. BDMSKH    EQU       11011111B ;mask for baudrate bits in command
  99. CARMSK    EQU       10000000B ;carrier present mask         
  100. INMODE    EQU       01001110B ;initial mode word
  101. INCOMM    EQU       00110111B ;initial command word
  102. ;
  103. ;         
  104. ; Modem control command words
  105. ;
  106. CLEAR     EQU       'Z'                 ;idle mode
  107. ANMODE    EQU       'A'                 ;answer mode
  108. ORIGMD    EQU       'Z'                 ;originate mode
  109. RESET     EQU       40H                 ;usart reset
  110. ;
  111. ;
  112. ; MEX service processor stuff 
  113. ;
  114. MEX       EQU       0D00H               ;address of the service processor
  115. INMDM     EQU       255                 ;get char from port to A
  116. TIMER     EQU       254                 ;delay 100ms * reg B
  117. TMDINP    EQU       253                 ;B=# secs to wait for char
  118. CHEKCC    EQU       252                 ;check for ^C from KBD
  119. SNDRDY    EQU       251                 ;test for modem-send ready
  120. RCVRDY    EQU       250                 ;test for modem-receive ready
  121. SNDCHR    EQU       249                 ;send a character to the modem 
  122. RCVCHR    EQU       248                 ;recv a char from modem 
  123. LOOKUP    EQU       247                 ;table search
  124. PARSFN    EQU       246                 ;parse filename from input stream
  125. BDPARS    EQU       245                 ;parse baud-rate from input stream
  126. SBLANK    EQU       244                 ;scan input stream to next non-blank
  127. EVALA     EQU       243                 ;evaluate numeric from input stream
  128. LKAHED    EQU       242                 ;get nxt char w/o removing from input
  129. GNC       EQU       241                 ;get char from input
  130. ILP       EQU       240                 ;inline print
  131. DECOUT    EQU       239                 ;decimal output
  132. PRBAUD    EQU       238                 ;print baud rate
  133. ;
  134. ;
  135. CONOUT    EQU       2                   ;simulated BDOS function 2
  136. PRINT     EQU       9                   ;simulated BDOS function 9
  137. INBUF     EQU       10                  ;simulated BDOS function 10
  138. ;
  139.           ORG       TPA                 ;we begin
  140. ;
  141. ;
  142.           DS        3                   ;MEX has a JMP START here
  143. ;
  144. ; The following variables are located at the beginning of the program
  145. ; to facilitate modification without the need of re-assembly. They will
  146. ; be moved in MEX 2.0.
  147. ; The PMMI DB's are REQUIRED to maintain compatabilty with MEX.
  148. ;
  149. PMODEM:   DB        NO                  ;yes=PMMI modem \ / These 2 locations are 
  150. SMODEM:   DB        YES                 ;yes=Smartmodem / \ not referenced by MEX
  151. TPULSE:   DB        'T'                 ;T=touch, P=pulse (not referenced by MEX)
  152. CLOCK:    DB        40                  ;clock speed x .1, up to 25.5 mhz.
  153. MSPEED:   DB        5                   ;sets display time for sending a file
  154.                                         ;0=110    1=300  2=450  3=600  4=710
  155.                                         ;5=1200 6=2400 7=4800 8=9600 9=19200
  156. BYTDLY:   DB        5                   ;default time to send character in
  157.                                         ;terminal mode file transfer (0-9)
  158.                                         ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  159. CRDLY:    DB        5                   ;end-of-line delay after CRLF in terminal
  160.                                         ;mode file transfer for slow BBS systems
  161.                                         ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  162. COLUMS:   DB        5                   ;number of directory columns
  163. SETFL:    DB        YES                 ;yes=user-defined SET command
  164. SCRTST:   DB        NO                  ;yes=if home cursor and clear screen
  165.                                         ;routine at CLRSCRN
  166.           DB        0                   ;spare
  167. BAKFLG:   DB        YES                 ;yes=make .BAK file
  168. CRCDFL:   DB        NO                  ;yes=default to CRC checking
  169.                                         ;no=default to Checksum checking
  170. TOGCRC:   DB        YES                 ;yes=allow toggling of Checksum to CRC
  171. CVTBS:    DB        NO                  ;yes=convert backspace to rub
  172. TOGLBK:   DB        YES                 ;yes=allow toggling of bksp to rub
  173. ADDLF:    DB        NO                  ;no=no LF after CR to send file in
  174.                                         ;terminal mode (added by remote echo)
  175. TOGLF:    DB        YES                 ;yes=allow toggling of LF after CR
  176. TRNLOG:   DB        NO                  ;yes=allow transmission of logon
  177.                                         ;write logon sequence at location LOGON
  178. SAVCCP:   DB        YES                 ;yes=do not overwrite CCP
  179. LOCNXT:   DB        NO                  ;yes=local cmd if EXTCHR precedes
  180.                                         ;no=not local cmd if EXTCHR precedes
  181. TOGLOC:   DB        YES                 ;yes=allow toggling of LOCNXTCHR
  182. LSTTST:   DB        YES                 ;yes=allow toggling of printer on/off
  183.                                         ;in terminal mode. Set to no if using
  184.                                         ;the printer port for the modem
  185. XOFTST:   DB        NO                  ;yes=allow testing of XOFF from remote
  186.                                         ;while sending a file in terminal mode
  187. XONWT:    DB        NO                  ;yes=wait for XON after sending CR while
  188.                                         ;transmitting a file in terminal mode   
  189. TOGXOF:   DB        YES                 ;yes=allow toggling of XOFF testing
  190. IGNCTL:   DB        YES                 ;yes=do not send control characters
  191.                                         ;above CTL-M to CRT in terminal mode
  192.                                         ;no=send any incoming CTL-char to CRT
  193. EXTRA1:   DB        0                   ;for future expansion
  194. EXTRA2:   DB        0                   ;for future expansion
  195. BRKCHR:   DB        '@'-40H             ;^@ = Send a 300 ms. break tone
  196. NOCONN:   DB        'N'-40H             ;^N = Disconnect from phone line
  197. LOGCHR:   DB        'L'-40H             ;^L = Send logon
  198. LSTCHR:   DB        'P'-40H             ;^P = Toggle printer
  199. UNSVCH:   DB        'R'-40H             ;^R = Close input text buffer
  200. TRNCHR:   DB        'T'-40H             ;^T = Transmit file to remote
  201. SAVCHR:   DB        'Y'-40H             ;^Y = Open input text buffer
  202. EXTCHR:   DB        '^'-40H             ;^^ = Send next character
  203. ;
  204. ; Equates used only by PMMI routines grouped together here.
  205. ;
  206. PRATE:    DB        250
  207.           DB        0
  208. ;
  209. ; Low-level modem I/O routines: this will be replaced with
  210. ; a jump table in MEX 2.0 (you can insert jumps here to longer
  211. ; routines if you'd like ... I'd recommend NOT putting part of
  212. ; a routine in this area, then jumping to the rest of the routine
  213. ; in the non-fixed area; that will complicate the 2.0 conversion)
  214. ;
  215. INCTL1:   IN        MDMSTS              ;in modem control port
  216.           RET
  217.           DB        0,0,0,0,0,0,0       ;spares if needed 
  218. ;
  219. OTDATA:   OUT       MDMDAT              ;out modem data port
  220.           RET
  221.           DB        0,0,0,0,0,0,0       ;spares if needed 
  222. ;
  223. INPORT:   IN        MDMDAT              ;in modem data port
  224.           RET
  225.           DB        0,0,0,0,0,0,0       ;spares if needed 
  226. ;
  227. ; Bit-test routines.  These will be merged with the above
  228. ; routines in MEX 2.0 to provide a more reasonable format
  229. ;
  230. MASKR:    ANI MDRCVB ! RET    ;bit to test for receive ready
  231. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready
  232. MASKS:    ANI MDSNDB ! RET    ;bit to test for send ready
  233. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready
  234. ;
  235. ;
  236. ; Unused area: was once used for special PMMI functions,
  237. ; Now used only to retain compatibility with MDM overlays.
  238. ; You may use this area for any miscellaneous storage you'd
  239. ; like but the length of the area *must* be 12 bytes.
  240. ;
  241.           DS        12
  242. ;
  243. ; Special modem function jump table: 
  244. ;
  245. LOGON:    DS        2                   ;needed for MDM compatability
  246. DIALV:    JMP       PDIAL               ;dial digit in A 
  247. DISCV:    JMP       PDISC               ;disconnect the modem
  248. GOODBV:   JMP       DUMMY               ;called before exit to CP/M
  249. INMODV:   JMP       DUMMY               ;initialization
  250. NEWBDV:   JMP       PBAUD               ;set baud rate
  251. NOPARV:   JMP       NOPAR               ;set modem for no-parity
  252.                                         ;this call is transparent to SET cmd (je)
  253. PARITV:   JMP       PARITY              ;set modem parity
  254.                                         ;to value prior to nopar call (je)
  255. SETUPV:   JMP       SETCMD              ;SET cmd:
  256. SPMENV:   DS        3                   ;not used with MEX
  257. VERSNV:   JMP       SYSVER              ;sign-on message
  258. BREAKV:   JMP       PBREAK              ;send a break
  259. ;
  260. ; For MEX 2.0 compatibility, you should not try to use these
  261. ; routines, since this table will go away with MEX 2.0 (use the MEX
  262. ; service call processor instead).
  263. ;
  264. ILPRTV:   DS        3                   ;replace with MEX function 9 (WHAT IS THIS?)
  265. INBUFV:   DS        3                   ;replace with MEX function 10 (AND THIS?)
  266. ILCMPV:   DS        3                   ;replace with MEX function 247
  267. INMDMV:   DS        3                   ;replace with MEX function 255
  268. NXSCRV:   DS        3                   ;not supported by MEX 
  269. TIMERV:   DS        3                   ;replace with MEX function 254
  270. ;
  271. ;
  272. ; Clear/screen and clear/end-of-screen. Each routine must use the
  273. ; full 9 bytes alloted (may be padded with nulls).
  274. ;
  275. CLREOS:   LXI       D,EOSMSG            ;clear to end of screen
  276.           MVI       C,PRINT
  277.           CALL      MEX
  278.           RET
  279. ;
  280. ;
  281. CLS:      LXI       D,CLSMSG            ;clear screen
  282.           MVI       C,PRINT
  283.           CALL      MEX
  284.           RET
  285. ;
  286. ; strings to clear-to-end-of-screen, and clear-screen (VISUAL 55/VT52)
  287.  
  288. EOSMSG:   DB        1BH,'k','$'         ;clear to end-of-screen (je)
  289. CLSMSG:   DB        1BH,'v','$'         ;clear whole screen (je)
  290.  
  291. ;
  292. ;
  293. ; Modem initialization.  
  294. ;
  295. NOAT:     MVI       A,0FFH                        ;set for 8251 initialization only
  296.           STA       ONLYSIO                       ;"AT" commands are not sent
  297.           CALL      CURRNT
  298.           XRA       A                             ;reset onlysio
  299.           STA       ONLYSIO
  300.           RET
  301.           
  302. NITMOD:   LXI       H,COMMND            ;
  303.           MVI       M,INMODE            ;store modem setup                      
  304.           INX       H                             ;for future reference
  305.           MVI       M,INCOMM
  306.  
  307. CURRNT:   MVI       A,NULL                        ;entry point to resend
  308.           OUT       MDMMOD                        ;modem command and mode
  309.           OUT       MDMCOM                        ;words    
  310.           OUT       MDMMOD                        ;clear command register
  311.           MVI       A,RESET
  312.           OUT       MDMCOM                        ;reset usart
  313.           LDA       COMMND                        ;current modem mode word
  314.           OUT       MDMMOD
  315.           LDA       COMMND+1            ;current modem command word
  316.           OUT       MDMCOM
  317.           LDA       ONLYSIO                       ;get sio only flag
  318.                                                   ;this flag was created because a full
  319.                                                   ;modem init causes interferrence with
  320.                                                   ;automatic dialing from library with
  321.                                                   ;baud rate specified. ONLYSIO is set
  322.                                                   ;and reset in baud and par routine 
  323.           ORA       A                             ;complete modem init=0
  324.           RNZ                                     ;sio only=ff (baud or parity change)
  325.           LXI       H,INITMSG           ;send modem initialization string
  326.           CALL      SMSEND    
  327.           RET
  328. ;
  329. ; US Robotics send-break routine (v1.3 je)
  330. ;
  331. PBREAK:   LDA       COMMND+1  ;get 2nd modem control byte
  332.           ORI       1FH                 ;set break bit (don't change speed)     
  333.           OUT       MDMCOM              ;send it to modem
  334.           MVI       B,3
  335.           MVI       C,TIMER
  336.           CALL      MEX                 ;wait for 300 ms.
  337.           CALL      NOAT                ;reset sio to orig values
  338.           RET
  339. ;
  340. ; The following code disconnects a call in progress.
  341. ; The US Robotics hangs itself up, and returns to
  342. ; command state.
  343. ;
  344. PDISC:    MVI       B,12
  345.           MVI       C,TIMER             ;wait 1.2 seconds
  346.           CALL      MEX
  347.           LXI       H,USESC             ;send '+++'
  348.           CALL      SMSEND
  349.           MVI       B,12                ;wait 1.2 seconds
  350.           MVI       C,TIMER
  351.           CALL      MEX
  352.           RET
  353. ;
  354. USESC     DB        '+++',0             ;disconnect from line
  355. ;
  356. ;
  357. ; exit routine
  358. ;
  359. DUMMY:    RET                           ;we don't need one
  360. ;
  361. ;
  362. ; This is the DIAL routine called by MEX to dial a digit. 
  363. ;  The following status codes are returned in the A register
  364. ;
  365. ;         0 - Carrier detected, connection established
  366. ;         1 - Far end busy (only for modems that can detect this condition)
  367. ;         2 - No answer (or timed out waiting for modem response)
  368. ;         3 - Keyboard abort (^C only: all others should be ignored)
  369. ;         4 - Error reported by modem
  370. ;
  371. ; <No other codes should be returned after an end-dial sequence>
  372. ;
  373. ;
  374. PDIAL:    LHLD      DIALPT              ;FETCH POINTER
  375.           CPI       254                 ;START DIAL?
  376.           JZ        STDIAL              ;JUMP IF SO
  377.           CPI       255                 ;END DIAL?
  378.           JZ        ENDIAL              ;JUMP IF SO
  379. ;
  380. ; Not start or end sequence, must be a digit to be sent to the modem
  381. ;
  382.           MOV       M,A                 ;PUT CHAR IN BUFFER
  383.           INX       H                   ;ADVANCE POINTER
  384.           SHLD      DIALPT              ;STUFF PNTR
  385.           RET                           ;ALL DONE
  386. ;
  387. ; Here on a start-dial sequence
  388. ;
  389. STDIAL:   LXI       H,DIALBF  ;SET UP BUFFER POINTER
  390.           SHLD      DIALPT
  391.           RET
  392. ;
  393. ; Here on an end-dial sequence
  394. ;
  395. ENDIAL:   MVI       M,CR                ;STUFF END-OF-LINE INTO BUFFER
  396.           INX       H                   ;FOLLOWED BY TERMINATOR
  397.           MVI       M,0
  398.           LDA       TPULSE              ;GET OVERLAY'S TOUCH-TONE FLAG
  399.           STA       SMDIAL+3  ;PUT INTO STRING
  400.           LXI       H,SMDIAL  ;POINT TO DIALING STRING
  401.           CALL      SMSEND              ;SEND IT
  402.           MVI       C,INMDM
  403.           CALL      MEX                 ;CATCH ANY OUTPUT FROM THE MODEM
  404. ;
  405. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM FOR UP TO
  406. ; 60 SECONDS: YOU MAY CHANGE THE EQUATE VALUE FOR THE FOLLOWING LINE
  407. ; "MODE ANS" WILL (TEMP) SET IT TO 20 SECONDS DUE TO THE MODEM'S RESTRICTION
  408. ;
  409. RESULT:   MVI       C,MAXWAIT ;<<== MAXIMUM TIME TO WAIT FOR RESULT
  410. SMWLP:    PUSH      B
  411.           MVI       B,1                 ;CHECK FOR A CHAR, UP TO 1 SEC WAIT
  412.           MVI       C,TMDINP  ;DO TIMED INPUT
  413.           CALL      MEX
  414.           POP       B
  415.           JNC       SMTEST              ;JUMP IF MODEM HAD A CHAR
  416.           PUSH      B                   ;NO, TEST FOR CONTROL-C FROM CONSOLE
  417.           MVI       C,CHEKCC
  418.           CALL      MEX
  419.           POP       B
  420.           JNZ       SMNEXT              ;IF NOT, JUMP
  421.           MVI       B,CR                ;YES, SHUT DOWN THE MODEM
  422.           MVI       C,SNDCHR
  423.           CALL      MEX
  424.           MVI       A,3                 ;RETURN ABORT CODE
  425.           RET
  426. SMNEXT:   DCR       C                   ;NO
  427.           JNZ       SMWLP               ;CONTINUE
  428. ;
  429. ; ONE MINUTE WITH NO MODEM RESPONSE (OR NO CONNECTION)
  430. ;
  431. SMTIMO:   MVI       A,2                 ;RETURN TIMEOUT CODE
  432.           RET
  433. ;
  434. ; MODEM GAVE US A RESULT, CHECK IT
  435. ;
  436. SMTEST:   ANI       7FH                 ;IGNORE ANY PARITY
  437.           CALL      SMANAL              ;TEST THE RESULT
  438.           JC        RESULT              ;GO TRY AGAIN IF UNKNOWN RESPONSE
  439.           MOV       A,B                 ;A=RESULT 
  440.           PUSH      PSW                 ;SAVE IT
  441. SMTLP:    MVI       C,INMDM             ;EAT ANY ADDITIONAL CHARS FROM SMARTMODEM
  442.           CALL      MEX
  443.           JNC       SMTLP               ;UNTIL 100MS OF QUIET TIME
  444.           POP       PSW                 ;RETURN THE CODE
  445.           RET
  446. ;
  447. SMANAL:   STA       ANSBD               ;store baud rate for "MODE ANS" (v1.3 je) 
  448.           MVI       B,0                 ;prep connect code
  449.           CPI       '1'                 ;numeric version of "CONNECT"
  450.           RZ
  451.           CPI       '5'                 ;numeric version of "CONNECT 1200"
  452.           RZ
  453.           INR       B                   ;US Robotics can't do busy
  454.           INR       B                   ;prep no connect code B=2
  455.           CPI       '3'                 ;numeric version of "NO CONNECT"
  456.           RZ
  457.           INR       B                   ;we already checked for ^C
  458.           INR       B                   ;prep modem error B=4
  459.           CPI       '4'                 ;numeric version of "ERROR"
  460.           RZ
  461.  
  462. ANSBD:    DB        0                   ;1=300, 5=1200 baud for "MODE ANS" (v1.3 je)
  463.  
  464. ;
  465. ; UNKNOWN RESPONSE, RETURN CARRY TO CALLER. BUT FIRST,
  466. ; FLUSH THE UNKNOWN RESPONSE LINE FROM THE MODEM.
  467. ;
  468. WTLF:     CPI       LF                  ;LINEFEED?
  469.           STC
  470.           RZ                            ;END IF SO
  471.           MVI       C,INMDM             ;NO. GET NEXT CHAR
  472.           CALL      MEX
  473.           JNC       WTLF                ;UNLESS BUSY, LOOP
  474.           RET
  475. ;
  476. ; SMARTMODEM UTILITY ROUTINE: SEND STRING TO MODEM
  477. ;
  478. SMSEND:   MVI       C,SNDRDY  ;WAIT FOR MODEM READY
  479.           CALL      MEX
  480.           JNZ       SMSEND
  481.           MOV       A,M                 ;FETCH NEXT CHARACTER
  482.           INX       H
  483.           ORA       A                   ;END?
  484.           RZ                            ;DONE IF SO
  485.           MOV       B,A                 ;NO, POSITION FOR SENDING
  486.           MVI       C,SNDCHR  ;NOPE, SEND THE CHARACTER
  487.           CALL      MEX
  488.           JMP       SMSEND
  489. ;
  490. ; DATA AREA
  491. ;
  492.  
  493. INITMSG:DB          'AT'                ;modem attention (carrier must be off)
  494.           DB        'V'                 ;verbosity
  495.           DB        '0'                 ;verbose=1, terse=0
  496.           DB        'X'                 ;extended result to be sent?
  497.           DB        '1'                 ;yes=1 (0-5), no=0 (0-4)
  498. ;
  499. ; *** DO NOT CHANGE THE ABOVE SETTINGS
  500. ;
  501.           DB        'M'                 ;monitor speaker
  502. SPKFLG:   DB        '1'                 ;on=2, until carrier=1, off=0
  503.           DB        'F'                 ;duplex
  504. DUPFLG: DB          '1'                 ;full=1, half=0
  505.           DB        'S0='               ;answer on ring
  506. ONRING:   DB        '0'                 ;#=1-9 (usr max=255), no ans=0
  507.                                         ;modified by ANSRNG equate
  508.                                         ;SET ORIG resets this byte to '0'
  509.           DB        'S7='               ;carrier wait time
  510. TIMFLG:   DB        '15'                ;15, 20, 30 or 60 seconds
  511.  
  512.           IF        S10                 ;use only with newer modems ***********
  513.           DB        'S10=255' ;(see change notes)
  514.           ENDIF     ;S10                ;used to determine carrier dropout time
  515.  
  516.           DB        CR                  ;usr command mode terminator
  517.           DB        0                   ;initmsg stopper
  518.  
  519. ANSNOW:   DB        'ATA',CR,0          ;enter answer mode (send ans tone)
  520.                                         ;(wait for carrier from orig modem)
  521.  
  522. SMDIAL:   DB        'ATD'               ;dial attention
  523.           DB        'T'                 ;tone=T, pulse=P, ","=2 sec delay (in dialbf)
  524. DIALBF:   DS        52                  ;2* 24 CHAR MAX, + CR + NULL + SLOP
  525. DIALPT:   DS        2                   ;DIAL POSITION POINTER
  526. ;
  527. ; Set baud-rate code in A . US Robotics supports only four rates, 
  528. ; which are validated here. 
  529. ;
  530. PBAUD:    PUSH      H                   ;don't alter anybody
  531.           PUSH      D
  532.           PUSH      B
  533.           MOV       E,A                 ;code to DE
  534.           MVI       D,0
  535.           LXI       H,BAUDTB  ;offset into table
  536.           DAD       D
  537.           MOV       A,M                 ;fetch code
  538.           ORA       A                   ;0? (means unsupported code)
  539.           STC                           ;return error for STBAUD caller
  540.           JZ        PBEXIT              ;exit if so
  541.           MOV       B,A
  542.           LXI       H,MSPEED
  543.           MOV       M,E
  544.           LXI       H,BAUDCD
  545.           DAD       D
  546.           MOV       C,M
  547.           LXI       H,COMMND
  548.           MOV       A,M
  549.           ANI       BDMSKL              ;modified 110 baud for 2 stop bits (v1.2 je)
  550.           ORA       B
  551.           MOV       M,A
  552.           INX       H
  553.           MOV       A,M
  554.           ANI       BDMSKH
  555.           ORA       C
  556.           MOV       M,A
  557.           CALL      NOAT                ;init 8251 sio only
  558. PBEXIT:   POP       B                   ;all done
  559.           POP       D
  560.           POP       H
  561.           RET
  562. ;
  563. ; table of baud rate divisors for supported rates
  564. ; modified 110 for 2 stop bits.  (v1.2 je)
  565. ;
  566. BAUDTB:   DB        83H,3,0,2,0                   ;110,300,450,610,710 (v1.2 je)
  567.           DB        2,0,0,0,0           ;1200,2400,4800,9600,19200
  568. BAUDCD: DB          0,20H,0,0,0
  569.           DB        20H,0,0,0,0
  570. ;
  571. ; Sign-on message
  572. ;
  573.  
  574. SYSVER:   CALL      NITMOD              ;init modem with defaults
  575.           LXI       D,SOMESG
  576.           MVI       C,PRINT
  577.           CALL      MEX
  578. CARRSH:   CALL      CRLF
  579.           LXI       D,NOMESG
  580.           CALL      CARRCK
  581.           MVI       C,PRINT
  582.           CNZ       MEX
  583.           LXI       D,CARMSG
  584.           MVI       C,PRINT
  585.           CALL      MEX
  586.           RET
  587. ;
  588. SOMESG:   DB        'U.S. Robotics (S-100) overlay V. '
  589.           DB        REV/10+'0'
  590.           DB        '.'
  591.           DB        REV MOD 10+'0'
  592.           DB        ':',CR,LF,'$'
  593. ;
  594. NOMESG:   DB        'NO $'
  595. CARMSG:   DB        'CARRIER PRESENT',CR,LF,LF,'$'
  596. ;
  597. ;   Check US Robotics for carrier present  (Z=yes)
  598. ;
  599. CARRCK:   IN        MDMSTS
  600.           CMA
  601.           ANI       CARMSK
  602.           RET
  603. ;
  604. ; Newline on console
  605. ;
  606. CRLF:     MVI       A,CR
  607.           CALL      TYPE
  608.           MVI       A,LF                ;fall into TYPE
  609. ;
  610. ; type char in A on console
  611. ;
  612. TYPE:     PUSH      H                   ;save 'em
  613.           PUSH      D
  614.           PUSH      B
  615.           MOV       E,A                 ;align output character
  616.           MVI       C,CONOUT  ;print via MEX
  617.           CALL      MEX
  618.           POP       B
  619.           POP       D
  620.           POP       H
  621.           RET
  622. ;
  623. ; Data area
  624. ;
  625. ERRFLG:    DB       0                   ;connection error code
  626. COMMND:    DS       2                   ;current modem status storage
  627. ORGFLG:    DB       '0'                 ;initiate to "normal"(originate) 
  628.                                         ;'0'=orig,'1'-'9'=ring,ffh='ATA'
  629. ONLYSIO: DB         0                   ;ff=don't send "AT" commands to modem
  630. ;
  631. ;------------------------------------------------------------
  632. ;
  633. ; The remainder of this overlay implements a very versatile
  634. ; SET command (v1.2 je) 
  635. ;
  636. ; Control is passed here after MEX parses a SET command.
  637. ;
  638. SETCMD:   MVI       C,SBLANK  ;any arguments?
  639.           CALL      MEX
  640.           JC        SETSHO              ;if not, go print out values
  641.           LXI       D,CMDTBL  ;parse command
  642.           CALL      TSRCH               ;from table
  643.           PUSH      H                   ;any address on stack
  644.           RNC                           ;if we have one, execute it
  645.           POP       H                   ;nope, fix stack
  646. SETERR:   LXI       D,SETEMS  ;print error
  647.           MVI       C,PRINT
  648.           CALL      MEX
  649.           RET
  650. ;
  651. ; SET with parameters is not allowed if carrier is present (v1.2 je)
  652. ;
  653.  
  654. SETNOK:
  655.           IF        CLRSCN              ;clear screen cmds
  656.           CALL      CLS
  657.           ENDIF     ;CLRSCN
  658.  
  659.           LXI       D,SETNOM  ;set not allowed with carrier present
  660.           MVI       C,PRINT
  661.           CALL      MEX
  662.           MVI       A,0FFH              ;prevent clearing screen at setsho
  663.           STA       NOCLR
  664.           CALL      SETSHO              ;display current parameters
  665.           XRA       A                   ;reset flag
  666.           STA       NOCLR
  667.           RET
  668.  
  669. NOCLR:    DB        0                   ;prevents clearing screen in setsho if=ff
  670.  
  671. SETNOM:   DB        CR,LF,'The requested SET command is not allowed',CR,LF
  672.           DB        'when a carrier is present.  The connection',CR,LF
  673.           DB        'must be broken first.',CR,LF,LF,'$'
  674.  
  675. ;
  676. SETEMS:   DB        CR,LF,'SET command error',CR,LF,'$'
  677. ;
  678. ; SET command table ... note that tables are constructed of command-
  679. ; name (terminated by high bit=1) followed by word-data-value returned
  680. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  681. ; a binary zero.
  682. ;
  683. ; Note that LOOKUP attempts to find the next item in the input stream
  684. ; in the table passed to it in HL ... if found, the table data item is
  685. ; returned in HL; if not found, LOOKUP returns carry set.
  686. ;
  687. CMDTBL:   DB        '?'+80H                       ;"set ?"
  688.           DW        STHELP
  689.           DB        'BAU','D'+80H                 ;"set baud"
  690.           DW        STBAUD
  691.           DB        'MOD','E'+80H                 ;"set mode"
  692.           DW        STMODE
  693.           DB        'SPEA','K'+80H                ;"set speaker on/off"
  694.           DW        STSPKR
  695.           DB        'WAI','T'+80H                 ;"set time"
  696.           DW        STTIME
  697.           DB        'PA','R'+80H                  ;"set parity"
  698.           DW        STPAR
  699.           DB        'DUPL','X'+80H                ;"set full/half duplex"
  700.           DW        STDUP     
  701. ;
  702.           DB        0                   ;<<=== table terminator
  703. ;
  704. ; SET <no-args>: print current statistics
  705. ;
  706. SETSHO:
  707.           IF        CLRSCN              ;clear screen cmds
  708.           LDA       NOCLR               ;see if we already have an err msg on screen
  709.           ORA       A
  710.           JNZ       STSHO               ;yes, don't clear screen
  711.           CALL      CLS                 ;clear screen
  712.           ENDIF     ;CLRSCN
  713.  
  714. STSHO:    CALL      CARRSH              ;show carrier present/not present
  715.           LXI       H,SHOTBL  ;get table of SHOW subroutines
  716. SETSLP:   MOV       E,M                 ;get table address
  717.           INX       H
  718.           MOV       D,M
  719.           INX       H
  720.           MOV       A,D                 ;end of table?
  721.           ORA       E
  722.           RZ                            ;exit if so
  723.           PUSH      H                   ;save table pointer
  724.           XCHG                          ;adrs to HL
  725.           CALL      GOHL                ;do it
  726.           CALL      CRLF                ;print newline
  727.           MVI       C,CHEKCC  ;check for console abort
  728.           CALL      MEX
  729.           POP       H                   ;it's done
  730.           JNZ       SETSLP              ;continue if no abort
  731.           RET
  732. ;
  733. GOHL:     PCHL
  734. ;
  735. ; table of SHOW subroutines
  736. ;
  737. SHOTBL:   DW        BDSHOW              ;baud rate
  738.           DW        MDSHOW              ;mode
  739.           DW        SPSHOW              ;speaker
  740.           DW        TMSHOW              ;wait time
  741.           DW        PSHOW               ;parity
  742.           DW        DSHOW               ;duplex
  743.           DW        HLSHOW              ;v1.1 je
  744.           DW        0                   ;<<== table terminator
  745. ;
  746. ; SET ?  processor
  747. ;
  748. STHELP:
  749.           IF        CLRSCN              ;clear screen
  750.           CALL      CLS
  751.           ENDIF     ;CLRSCN
  752.  
  753.           LDA       RINGNO              ;get number of rings
  754.           STA       HLRING              ;set it in help message
  755.           LXI       D,HLPMSG
  756.           MVI       C,PRINT
  757.           CALL      MEX
  758.           RET
  759. ;
  760. ; Display SET ? message (v1.1 je)
  761. ;
  762. HLSHOW:   LXI       D,HLQMSG
  763.           MVI       C,PRINT
  764.           CALL      MEX
  765.           RET
  766.  
  767. HLQMSG:   DB        CR,LF,'Type SET ? for help.',CR,LF,'$'
  768.  
  769. ;
  770. ; The help message
  771. ;
  772. HLPMSG:
  773.           IF        NOT CLRSCN
  774.           DB        CR,LF
  775.           ENDIF     ;NOT CLRSCN
  776.  
  777.           DB        'SET COMMAND (recommended defaults first)  '
  778.           DB        '"U.S. ROBOTICS VERSION"',CR
  779.           DB        LF,LF,'SET BAUD  1200   (1200 baud + 1 stop bit)'
  780.           DB        CR,LF,'          600    (600 baud + 1 stop bit)'
  781.           DB        CR,LF,'          300    (300 baud + 1 stop bit)'
  782.           DB        CR,LF,'          110    (110 baud + 2 stop bits)'
  783.           DB        CR,LF,'SET MODE  ORIG   (orignate mode) *'
  784.           DB        CR,LF,'          ANS    (answer tone sent immediately) *'
  785.           DB        CR,LF,'          RING   (answer on ring #'
  786. HLRING:   DB        '3'
  787.           DB        ') *'
  788.           DB        CR,LF,'SET SPEAK TEMP   (speaker on until carrier) *'
  789.           DB        CR,LF,'          ON     (speaker always on) *'
  790.           DB        CR,LF,'          OFF    (speaker always off) *'
  791.           DB        CR,LF,'SET WAIT  15     (15 seconds) *'
  792.           DB        CR,LF,'          20     (20 seconds) *'
  793.           DB        CR,LF,'          30     (30 seconds) *'
  794.           DB        CR,LF,'          60     (60 seconds) *'
  795.           DB        CR,LF,'SET PAR   NO     (no parity + 8 data bits)'
  796.           DB        CR,LF,'          ODD    (odd parity + 7 data bits)'
  797.           DB        CR,LF,'          EVEN   (even parity + 7 data bits)'
  798.           DB        CR,LF,'SET DUPLX FULL   (full duplex) *'          
  799.           DB        CR,LF,'          HALF   (half duplex) *',CR,LF
  800.           DB        CR,LF,'* = CARRIER CANNOT BE PRESENT FOR THESE COMMANDS'
  801.           DB        CR,LF,'$'
  802. ;
  803. ; SET BAUD processor (v1.2 je)
  804. ; carrier may be on or off
  805. ;
  806. STBAUD:   MVI       C,BDPARS  ;function code
  807.           CALL      MEX                 ;let MEX look up code
  808.           JC        SETERR              ;invalid code?
  809.           CALL      PBAUD               ;no, try to set it
  810.           JC        SETERR              ;not-supported code
  811. BDSHOW:   CALL      ILPRT               ;display baud
  812.           DB        'BAUD RATE:   ',0
  813.           LDA       MSPEED
  814.           MVI       C,PRBAUD  ;use MEX routine
  815.           CALL      MEX
  816.           RET
  817. ;
  818. ; SET MODE processor (v1.2 je)
  819. ; carrier must be off
  820. ;
  821. STMODE:   CALL      CARRCK              ;is carrier present?
  822.           JZ        SETNOK              ;z=yes, SET MODE not allowed with carrier
  823.           LXI       D,MODTBL  ;lookup next input item in table
  824.           CALL      TSRCH
  825.           JC        SETERR              ;if not found, error
  826.           MOV       A,L                 ;L='0' orig, L=ff ans, L='1'-'9' ring #
  827.           STA       ORGFLG
  828.           CPI       '0'                 ;orgflg contains ascii 0-9 or ffh
  829.           JZ        MDORIG              ;originate
  830.           JM        MDANS               ;answer
  831. MDRING:   LDA       RINGNO              ;get ring # to answer on
  832.           STA       ONRING              ;store in modem init string
  833.           STA       RINGNB              ;store in display string
  834.           CALL      CURRNT              ;send modem init string
  835.           JMP       MDSHOW              ;display mode
  836. MDORIG:   MVI       A,'0'               ;set for no ans in init string
  837.           STA       ONRING
  838.           CALL      CURRNT              ;send modem init string
  839. MDSHOW:   CALL      ILPRT               ;show mode
  840.           DB        'MODE:        ',0
  841.           LDA       ORGFLG              ;orig='0', ans=ff, ring='1'-'9'
  842.           CPI       '0'                 ;orgflg contains ascii 0-9 or ffh
  843.           JZ        ORIGP               ;display orig
  844.           CALL      ILPRT
  845.           DB        'Answer on Ring #'
  846. RINGNB:   DB        '3'                 ;default is 3 rings
  847.           DB        0                   ;stopper
  848.           RET
  849. ORIGP:    CALL      ILPRT
  850.           DB        'Originate'
  851.           DB        0
  852.           RET
  853. ;
  854. ; This routine is used primarily for remote ends which have
  855. ; originate only modems without autodialing. You must issue
  856. ; the "ATA" command before the carrier is detected from remote.
  857. ; It is temporary in nature and will revert to RING or ORIGINATE
  858. ; the next time an "AT" command other than "ATA" is sent to the
  859. ; modem, depending on mode prior to last "ATA".
  860. ;         NOTE: THE BAUD RATE MAY CHANGE UPON CONNECTION (v1.3 je)
  861. ;
  862. MDANS:    CALL      ILPRT               ;answer mode
  863.           DB        'MODE:        '
  864.           DB        'Sending Answer Tone "Now"',CR,LF
  865.           DB        '             '
  866.           DB        'Remote Modem must send Originate',CR,LF
  867.           DB        '             '
  868.           DB        'tone within '
  869. MDTIME:   DB        '15'                          ;modifying S7 in modem had no effect
  870.                                                   ;on the "ATA" cmd so I removed the
  871.                                                   ;logic to change this value (je)
  872.           DB        ' seconds!',CR,LF
  873.           DB        '             '
  874.           DB        'Originator Determines Baud Rate.'
  875.           DB        CR,LF,0
  876.  
  877.           LXI       H,ANSNOW  ;send answer tone now
  878.           CALL      SMSEND              ;send "ATA" to modem
  879. ;
  880. ; This logic reset the orgflg back to orig or ring since the
  881. ; manual answer mode is a one shot operation.
  882. ; Then the result of the ANS command is reported and baud rate
  883. ; switching is done if required. (v1.3 je)
  884. ;
  885.           LDA       ONRING              ;get init string rings
  886.           STA       ORGFLG              ;set orgflg to orig or ring (not ans)
  887.           MVI       A,20                ;set max time for connection
  888.           STA       RESULT+1
  889.           CALL      RESULT              ;wait for modem response
  890.           PUSH      PSW                 ;save return code
  891.           MVI       A,MAXWAIT ;reset to max of 60 sec
  892.           STA       RESULT+1
  893.           POP       PSW                 ;retrieve return code
  894.           CPI       0                   ;connection?
  895.           JZ        ACNCT               ;yes
  896.           CPI       2                   ;timeout?
  897.           JZ        ANCNCT              ;yes
  898.           CPI       3                   ;ctl-c abort?
  899.           JZ        KABORT              ;yes
  900.           CALL      ILPRT               ;modem reported error
  901.           DB        CR,LF,BELL
  902.           DB        'USR Modem Returned "FAILED" Status',CR,LF,LF,0
  903.           RET
  904. ACNCT:    LDA       ANSBD               ;get connected baud rate
  905.           SBI       30H                 ;convert from dec to hex
  906.           STA       MSPEED              ;set speed byte
  907.           CPI       1                   ;300 baud?
  908.           JNZ       A1200               ;no, must be 1200
  909.           CALL      ILPRT
  910.           DB        CR,LF,BELL,'300',0
  911.           JMP       ACOM
  912. A1200:    CALL      ILPRT
  913.           DB        CR,LF,BELL,'1200',0
  914. ACOM:     CALL      ILPRT
  915.           DB        ' BAUD CONNECTION DETECTED',CR,LF
  916.           DB        'You may enter Terminal (T/L/E) Mode.',CR,LF,LF,0
  917.           CALL      PBAUD               ;change baud rate in sio
  918.           RET
  919. ANCNCT:   CALL      ILPRT               ;no connection
  920.           DB        CR,LF,BELL,'TIMEOUT -'
  921.           DB        ' No Orignate Tone Received.',CR,LF,LF,0
  922.           RET
  923. KABORT:   CALL      ILPRT               ;ctl-c abort by user
  924.           DB        CR,LF,'ABORTED',CR,LF,LF,0
  925.           RET
  926.  
  927. ;
  928. ; MODE argument table
  929. ;
  930. MODTBL:   DB        'ORI','G'+80H       ;"set mode orig"
  931.           DB        '0',0
  932.           DB        'AN','S'+80H        ;"set mode ans"
  933.           DB        0FFH,0
  934.           DB        'RIN','G'+80H       ;"answer on ring #"
  935. RINGNO:   DB        ANSRNG              ;default is set for you taste at equate
  936.           DB        0
  937. ;
  938.           DB        0                   ;<<=== table terminator
  939. ;
  940. ; The speaker on the US Robotics board can get annoying
  941. ; so we included this routine to turn it off. If you
  942. ; are truly masochistic you can turn it on all the time.
  943. ; Carrier must be off.
  944. ;
  945. STSPKR:   CALL      CARRCK              ;check for carrier
  946.           JZ        SETNOK              ;z=yes, command not allowed
  947.           LXI       D,SPKTBL  ;lookup next input item in table
  948.           CALL      TSRCH
  949.           JC        SETERR              ;if not found, error
  950.           MOV       A,L
  951.           STA       SPKFLG
  952.           CALL      CURRNT              ;send init buff
  953. SPSHOW:   CALL      ILPRT               ;show speaker setting
  954.           DB        'SPEAKER:     ',0
  955.           LDA       SPKFLG
  956.           CPI       '0'
  957.           JZ        SDOFF
  958.           CPI       '2'
  959.           JZ        SDON
  960.           CALL      ILPRT
  961.           DB        'On Until Carrier Detected',0
  962.           RET
  963. SDOFF:    CALL      ILPRT
  964.           DB        'Always Off',0
  965.           RET
  966. SDON:     CALL      ILPRT
  967.           DB        'Always On',0       
  968.           RET
  969. ;
  970. ; SPEAKER argument table
  971. ;
  972. SPKTBL:   DB        'OF','F'+80H                  ;"set sound off"
  973.           DB        '0',0
  974.           DB        'O','N'+80H                   ;"set sound on"
  975.           DB        '1',0
  976.           DB        'TEM','P'+80H                 ;"set sound on until carrier"
  977.           DB        '2',0     
  978. ;
  979.           DB        0                   ;<<=== table terminator
  980. ;
  981. ;
  982. ;  The US Robotics allows for soft setting of the time to
  983. ;  wait for answer from the other end. It can be anywhere
  984. ;  in the range of 0 to 255 seconds. We have arbitrarily
  985. ;  chosen 15, 20, 30 and 60 seconds... If you don't like 
  986. ;  these times... change them.
  987. ;  Carrier must be off.
  988. ;  
  989. STTIME:   CALL      CARRCK              ;is carrier on?
  990.           JZ        SETNOK              ;z=yes, SET WAIT not allowed if carrier
  991.           LXI       D,TIMETBL ;lookup next input item in table
  992.           CALL      TSRCH
  993.           JC        SETERR              ;if not found, error
  994.           SHLD      TIMFLG
  995.           CALL      CURRNT              ;send modem init string
  996. TMSHOW:   CALL      ILPRT               ;show time setting
  997.           DB        'WAIT TIME:   ',0
  998.           LDA       TIMFLG
  999.           CPI       '1'
  1000.           JZ        TM15
  1001.           CPI       '2'
  1002.           JZ        TM20
  1003.           CPI       '3'
  1004.           JZ        TM30
  1005.           CALL      ILPRT
  1006.           DB        '60 Seconds',0
  1007.           RET
  1008. TM30:     CALL      ILPRT
  1009.           DB        '30 Seconds',0
  1010.           RET
  1011. TM20:     CALL      ILPRT
  1012.           DB        '20 Seconds',0      
  1013.           RET
  1014. TM15:     CALL      ILPRT
  1015.           DB        '15 Seconds',0
  1016.           RET
  1017. ;
  1018. ; TIME argument table
  1019. ;
  1020. TIMETBL:  DB        '1','5'+80H         ;"set time 15"
  1021.           DB        '15'
  1022.           DB        '2','0'+80H                   ;"set time 20"
  1023.           DB        '20'
  1024.           DB        '3','0'+80H                   ;"set time 30"
  1025.           DB        '30'      
  1026.           DB        '6','0'+80H                   ;"set time 60"
  1027.           DB        '60'
  1028. ;
  1029.           DB        0                   ;<<=== table terminator
  1030.  
  1031. ;
  1032. ; Parity setting logic.  Even and Odd parity setting requires
  1033. ; 7 data bits.  No parity requires 8 data bits. The number
  1034. ; of stop bits is determined by baud rate.
  1035. ; As of version 1.2 I don't know if there is outside entry other
  1036. ; than through the SET command.  If there is a need to come in
  1037. ; externally entry can be made at PARITY: and NOPAR:.
  1038. ; An assumption is being made at the PARITY: entry. (see comments there)
  1039. ; Carrier may be on or off.
  1040. ;
  1041. ; CAUTION: NO PARITY MUST BE SPECIFIED IF OBJECT FILES ARE TO BE TRANSFERRED
  1042. ;
  1043. STPAR:    LXI       D,PARTBL  ;lookup next input item in table
  1044.           CALL      TSRCH
  1045.           JC        SETERR              ;if not found, error
  1046.           MOV       A,L
  1047.           STA       PARFLG
  1048.           CPI       '0'
  1049.           JZ        NONE8               ;no parity
  1050.           CPI       '1'
  1051.           JZ        ODD7                ;odd parity
  1052. EVEN7:    LDA       COMMND              ;get mode byte
  1053.           ORI       38H                 ;send even parity with 7 data bits
  1054.           ANI       0FBH
  1055.           JMP       PARCOM              ;go to common routine
  1056. NONE8:    LDA       COMMND              ;get mode byte      
  1057.           ORI       0CH                 ;send no parity with 8 data bits
  1058.           ANI       0CFH
  1059.           JMP       PARCOM              ;go to common routine
  1060. ODD7:     LDA       COMMND              ;get mode byte
  1061.           ORI       18H                 ;send odd parity with 7 data bits
  1062.           ANI       0DBH
  1063. PARCOM:   STA       COMMND              ;resave mode byte
  1064.           CALL      NOAT                ;init of 8251 only
  1065. PSHOW:    CALL      ILPRT               ;show parity setting
  1066.           DB        'PARITY:      ',0
  1067.           LDA       PARFLG
  1068.           CPI       '0'
  1069.           JZ        PARNO
  1070.           CPI       '1'
  1071.           JZ        PARODD
  1072. PAREVN:   CALL      ILPRT
  1073.           DB        'Even',0
  1074.           RET
  1075. PARNO:    CALL      ILPRT
  1076.           DB        'None',0
  1077.           RET
  1078. PARODD:   CALL      ILPRT
  1079.           DB        'Odd',0
  1080.           RET
  1081.  
  1082. ;
  1083. ; Set parity to its original value after call to nopar (v1.3 je)
  1084. ; Called by MEX (transparent to SET cmd)
  1085. ;
  1086. PARITY:   CALL      NOAT                ;init sio only (no AT cmd)
  1087.           RET
  1088. ;
  1089. ; MEX calls this routine to set modem for no parity.
  1090. ; This is transparent to the SET command (v1.3 je)
  1091. ;
  1092. NOPAR:    LDA       COMMND              ;get current parity setting
  1093.           PUSH      PSW                 ;save it
  1094.           ANI       PARMSK              ;clear parity enable bit
  1095.           ORI       NPARIT              ;set for no parity
  1096.           STA       COMMND              ;this is temporary in sio until set parity
  1097.                                         ;changes it to its previous value (je)
  1098.           CALL      NOAT                ;init sio only (no AT cmd)
  1099.           POP       PSW                 ;get original sio mode byte
  1100.           LXI       H,COMMND  ;hl = mode byte upon return
  1101.           MOV       M,A                 ;restore mode byte
  1102.           RET
  1103.  
  1104. PARFLG:   DB        '0'                 ;default to no parity
  1105.  
  1106. ;
  1107. ; PARITY argument table
  1108. ;
  1109. PARTBL:   DB        'NON','E'+80H                 ;"set no parity"
  1110.           DB        '0',0
  1111.           DB        'OD','D'+80H                  ;"set odd parity"
  1112.           DB        '1',0
  1113.           DB        'EVE','N'+80H                 ;"set even parity"
  1114.           DB        '2',0     
  1115. ;
  1116.           DB        0                   ;<<=== table terminator
  1117. ;
  1118. ; Full or Half Duplex setting (v1.2 je)
  1119. ; Normally Full duplex is all that is required but in
  1120. ; case there is a need to change it you can.
  1121. ; Carrier must not be present.
  1122. ;
  1123. STDUP:    CALL      CARRCK              ;check for carrier present
  1124.           JZ        SETNOK              ;z=yes, SET DUPLX is not allowe
  1125.           LXI       D,DUPTBL  ;lookup next input item in table
  1126.           CALL      TSRCH
  1127.           JC        SETERR              ;if not found, error
  1128.           MOV       A,L
  1129.           STA       DUPFLG
  1130.           CALL      CURRNT              ;send init buff including "AT" cmd
  1131. DSHOW:    CALL      ILPRT               ;show duplex setting
  1132.           DB        'DUPLEX:      ',0
  1133.           LDA       DUPFLG
  1134.           CPI       '0'
  1135.           JZ        HDPLX               ;half duplex
  1136.           CALL      ILPRT
  1137.           DB        'Full',0
  1138.           RET
  1139. HDPLX:    CALL      ILPRT
  1140.           DB        'Half',0
  1141.           RET
  1142. ;
  1143. ; DUPLEX argument table
  1144. ;
  1145. DUPTBL:   DB        'FUL','L'+80H                 ;"set full duplex"
  1146.           DB        '1',0
  1147.           DB        'HAL','F'+80H                 ;"set half duplex"
  1148.           DB        '0',0
  1149. ;
  1150.           DB        0                   ;<<=== table terminator
  1151. ;
  1152. ; Compare next input-stream item in table @DE; CY=1
  1153. ; if not found, else HL=matched data item
  1154. ;
  1155. TSRCH:    MVI       C,LOOKUP  ;get function code
  1156.           JMP       MEX                 ;pass to MEX processor
  1157. ;
  1158. ; Print in-line message ... blows away C register
  1159. ;
  1160. ILPRT:    MVI       C,ILP               ;get function code
  1161.           JMP       MEX                 ;go do it
  1162. ;
  1163. ;
  1164.           END
  1165.