home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / mex / mxm-us13.aqm / MXM-US13.ASM
Assembly Source File  |  1985-08-05  |  26KB  |  818 lines

  1.     PAGE    0        ; Let print utility paginate
  2.     Title    'MEX overlay for the U.S. Robotics S-100 version 1.3'
  3. ;     08/27/84 by Don Wilke
  4. ;    08/29/84 added fancy video conditionals
  5. ;    08/30/84 added parity routines
  6. ;
  7. REV    EQU    13        ; Overlay revision level
  8. ;
  9. ; Misc equates
  10. ;
  11. NO    EQU    0
  12. YES    EQU    0FFH
  13. BELL    EQU    07H        ; Bell
  14. TAB    EQU    09H        ; Tab
  15. LF    EQU    0AH        ; Line feed
  16. CR    EQU    0DH        ; Carriage return
  17. ESC    EQU    1BH        ; Escape
  18. TPA    EQU    100H        ; Transient prog area
  19. MEX    EQU    0D00H        ; Address of the service processor
  20. ATTRIB    EQU    YES        ; Yes if fancy video supported
  21. ;
  22. ; USR port equates
  23. ;
  24. PORT    EQU    0C0H        ; Base I/O address for USR S-100 card
  25. MODCT1  EQU    PORT+1        ; 8251 control port
  26. MODDAT  EQU    PORT        ; 8251 data port
  27. MDDCDB    EQU    10000000B    ; Carrier detect bit
  28. MDDCDA    EQU    10000000B    ; Value when active
  29. MDRCVB    EQU    00000010B    ; Bit to test for receive
  30. MDRCVR    EQU    00000010B    ; Value when ready
  31. MDSNDB    EQU    00000001B    ; Bit to test for send
  32. MDSNDR    EQU    00000001B    ; Value when ready
  33. MMODEA    EQU    11001111B    ; 8 bits, clock/64, 2 stop bits 
  34. MMODEB    EQU    01001110B    ; 8 bits, clock/16, 1 stop bit
  35. MMCMDA    EQU    00110111B    ; RTS hi, error reset, DTR hi, enable TX/RX
  36. MMCMDB    EQU    00010111B    ; Error reset, DTR hi, enable TX/RX
  37. MRESET    EQU    01000000B    ; 8251 reset
  38. ;
  39. ; Following are function codes for the MEX service call processor
  40. ;
  41. INMDM    EQU    255        ; Get char from port to A, CY=no more in 100 ms
  42. TIMER    EQU    254        ; Delay 100ms * reg B
  43. TMDINP    EQU    253        ; B=# secs to wait for char, cy=no char
  44. CHEKCC    EQU    252        ; Check for ^C from KBD, Z=present
  45. SNDRDY    EQU    251        ; Test for modem-send ready
  46. RCVRDY    EQU    250        ; Test for modem-receive ready
  47. SNDCHR    EQU    249        ; Send a character to the modem (after sndrdy)
  48. RCVCHR    EQU    248        ; Recv a char from modem (after rcvrdy)
  49. LOOKUP    EQU    247        ; Table search: see CMDTBL comments for info
  50. PARSFN    EQU    246        ; Parse filename from input stream
  51. BDPARS    EQU    245        ; Parse baud-rate from input stream
  52. SBLANK    EQU    244        ; Scan input stream to next non-blank
  53. EVALA    EQU    243        ; Evaluate numeric from input stream
  54. LKAHED    EQU    242        ; Get nxt char w/o removing from input
  55. GNC    EQU    241        ; Get char from input, cy=1 if none
  56. ILP    EQU    240        ; Inline print
  57. DECOUT    EQU    239        ; Decimal output
  58. PRBAUD    EQU    238        ; Print baud rate
  59. CONOUT    EQU    2        ; Simulated BDOS function 2: console char out
  60. PRINT    EQU    9        ; Simulated BDOS function 9: print string
  61. INBUF    EQU    10        ; Input buffer,same structure as BDOS 10
  62.  
  63.     ORG    TPA        ; We begin
  64.     DS    3        ; MEX has a JMP START here
  65. ; The following variables are located at the beginning of the program
  66. ; to facilitate modification without the need of re-assembly. They will
  67. ; be moved in MEX 2.0.
  68. PMODEM:    DB    NO        ; Yes=PMMI modem \ / These 2 locations are not
  69. SMODEM:    DB    YES        ; Yes=Smartmodem / \ referenced by MEX
  70. TPULSE:    DB    'P'        ; T=touch,P=pulse (not referenced by MEX)
  71. CLOCK:    DB    40        ; Clock speed x .1, up to 25.5 mhz.
  72. MSPEED:    DB    5        ; Sets display time for sending a file
  73.                 ; 0=110    1=300  2=450  3=600  4=710
  74.                 ; 5=1200 6=2400 7=4800 8=9600 9=19200
  75. BYTDLY:    DB    5        ; Default time to send character in
  76.                 ; terminal mode file transfer (0-9)
  77.                 ; 0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  78. CRDLY:    DB    5        ; End-of-line delay after CRLF in terminal
  79.                 ; mode file transfer for slow BBS systems
  80.                 ; 0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  81. COLUMS:    DB    5        ; Number of directory columns
  82. SETFL:    DB    YES        ; Yes=user-defined SET command
  83. SCRTST:    DB    YES        ; Yes=if home cursor and clear screen
  84.                 ; routine at CLRSCRN
  85.     DB    0        ; Was once ACKNAK,now spare
  86. BAKFLG:    DB    NO        ; Yes=make .BAK file
  87. CRCDFL:    DB    YES        ; Yes=default to CRC checking
  88.                 ; No=default to Checksum checking
  89. TOGCRC:    DB    YES        ; Yes=allow toggling of Checksum to CRC
  90. CVTBS:    DB    NO        ; Yes=convert backspace to rub
  91. TOGLBK:    DB    YES        ; Yes=allow toggling of bksp to rub
  92. ADDLF:    DB    NO        ; No=no LF after CR to send file in
  93.                 ; terminal mode (added by remote echo)
  94. TOGLF:    DB    YES        ; Yes=allow toggling of LF after CR
  95. TRNLOG:    DB    NO        ; Yes=allow transmission of logon
  96.                 ; write logon sequence at location LOGON
  97. SAVCCP:    DB    YES        ; Yes=do not overwrite CCP
  98. LOCNXT:    DB    NO        ; Yes=local cmd if EXTCHR precedes
  99.                 ; No=not local cmd if EXTCHR precedes
  100. TOGLOC:    DB    YES        ; Yes=allow toggling of LOCNXTCHR
  101. LSTTST:    DB    YES        ; Yes=allow toggling of printer on/off
  102.                 ; in terminal mode. Set to no if using
  103.                 ; the printer port for the modem
  104. XOFTST:    DB    NO        ; Yes=allow testing of XOFF from remote
  105.                 ; while sending a file in terminal mode
  106. XONWT:    DB    NO        ; Yes=wait for XON after sending CR while
  107.                 ; transmitting a file in terminal mode    
  108. TOGXOF:    DB    YES        ; Yes=allow toggling of XOFF testing
  109. IGNCTL:    DB    YES        ; Yes=do not send control characters
  110.                 ; above CTL-M to CRT in terminal mode
  111.                 ; no=send any incoming CTL-char to CRT
  112. EXTRA1:    DB    0        ; For future expansion
  113. EXTRA2:    DB    0        ; For future expansion
  114. BRKCHR:    DB    '@'-40H        ; ^@ = Send a 300 ms. break tone
  115. NOCONN:    DB    'N'-40H        ; ^N = Disconnect from phone line
  116. LOGCHR:    DB    'L'-40H        ; ^L = Send logon
  117. LSTCHR:    DB    'P'-40H        ; ^P = Toggle printer
  118. UNSVCH:    DB    'R'-40H        ; ^R = Close input text buffer
  119. TRNCHR:    DB    'T'-40H        ; ^T = Transmit file to remote
  120. SAVCHR:    DB    'Y'-40H        ; ^Y = Open input text buffer
  121. EXTCHR:    DB    '^'-40H        ; ^^ = Send next character
  122. ; Equates used only by PMMI routines grouped together here.
  123. PRATE:    DB    250        ; 125=20pps dialing, 250=10pps
  124.     DB    0        ; Not used
  125. ; Low-level modem I/O routines: this will be replaced with
  126. ; a jump table in MEX 2.0 (you can insert jumps here to longer
  127. ; routines if you'd like ... I'd recommend NOT putting part of
  128. ; a routine in this area,then jumping to the rest of the routine
  129. ; in the non-fixed area; that will complicate the 2.0 conversion)
  130. INCTL1:    IN    MODCT1        ; In modem control port
  131.     RET
  132.     DB    0,0,0,0,0,0,0    ; Spares if needed for non-PMMI
  133. OTDATA:    OUT    MODDAT        ; Out modem data port
  134.     RET
  135.     DB    0,0,0,0,0,0,0    ; Spares if needed for non=PMMI
  136. INPORT:    IN    MODDAT        ; In modem data port
  137.     RET
  138.     DB    0,0,0,0,0,0,0    ; Spares if needed for non-PMMI
  139. ; Bit-test routines.  These will be merged with the above
  140. ; routines in MEX 2.0 to provide a more reasonable format
  141. MASKR:    ANI MDRCVB ! RET    ; Bit to test for receive ready
  142. TESTR:    CPI MDRCVR ! RET    ; Value of receive bit when ready
  143. MASKS:    ANI MDSNDB ! RET    ; Bit to test for send ready
  144. TESTS:    CPI MDSNDR ! RET    ; Value of send bit when ready
  145. ; Unused area: was once used for special PMMI functions,
  146. ; Now used only to retain compatibility with MDM overlays.
  147. ; You may use this area for any miscellaneous storage you'd
  148. ; like but the length of the area *must* be 12 bytes.
  149.     DS    12
  150. ; Special modem function jump table: if your overlay cannot handle
  151. ; some of these, change the jump to "DS 3", so the code present in
  152. ; MEX will be retained.  Thus, if your modem can't dial, change the
  153. ; JMP PDIAL at DIALV to DS 3, and MEX will print a "not-implemented"
  154. ; diagnostic for any commands that require dialing.
  155. ; DIALV  dials the digit in A. See the comments at PDIAL for specs.
  156. ; DISCV  disconnects the modem
  157. ; GOODBV is called just before MEX exits to CP/M.  If your overlay
  158. ;        requires some exit cleanup, do it here.
  159. ; INMODV is called when MEX starts up; use INMODV to initialize the modem.
  160. ; NEWBDV is used for phone-number baud rates and is called with a baud-rate
  161. ;        code in the A register, value as follows:
  162. ;      A=0:   110 baud       A=1:   300 baud      A=2:   450 baud
  163. ;      A=3:   600 baud       A=4:   710 baud      A=5:  1200 baud
  164. ;      A=6:  2400 baud       A=7:  4800 baud      A=8: 19200 baud
  165. ;        If your overlay supports the passed baud rate,it should store the
  166. ;      value passed in A at MSPEED (107H), and set the requested rate. If
  167. ;      the value passed is not supported, you should simply return (with-
  168. ;      out modifying MSPEED) -or- optionally request a baud-rate from the
  169. ;      user interactively.
  170. ; NOPARV is called at the end of each file transfer; your overlay may simply
  171. ;      return here, or you may want to restore parity if you set no-parity
  172. ;      in the following vector (this is the case with the PMMI overlay).
  173. ;      
  174. ; PARITV is called at the start of each file transfer; your overlay may simply
  175. ;      return here, or you may want to enable parity detection (this is the
  176. ;      case with the PMMI overlay).
  177. ; SETUPV is the user-defined command ... to use this routine to build your own
  178. ;      MEX command, set the variable SETFL (117H) non-zero,and add your SET
  179. ;      code.  You can use the routine presented in the PMMI overlay as a 
  180. ;      guide for parsing, table lookup, etc.
  181. ; SPMENU is provided only for MDM compatibility, and is not used by MEX 1.0 
  182. ;      for any purpose (it will be gone in MEX 2).
  183. ; VERSNV is called immediately after MEX prints its sign-on message at cold
  184. ;      startup -- use this to identify your overlay in the sign-on message
  185. ;      (include overlay version number in the line).
  186. ; BREAKV is provided for sending a BREAK (<ESC>-B in terminal mode).  If your
  187. ;      modem doesn't support BREAK, or you don't care to code a BREAK rou-
  188. ;      tine, you may simply execute a RET instruction.
  189. LOGON:    DS    2        ; Needed for MDM compat, not ref'd by MEX
  190. DIALV:    DS    3        ; Dial digit in A 
  191. DISCV:    DS    3        ; Disconnect the modem
  192. GOODBV:    JMP    GOODBYE        ; Called before exit to CP/M
  193. INMODV:    JMP    NITMOD        ; Initialization. Called at cold-start
  194. NEWBDV:    JMP    PBAUD        ; Set baud rate
  195. NOPARV:    RET ! NOP ! NOP        ; Set modem for no-parity
  196. PARITV:    RET ! NOP ! NOP        ; Set modem parity
  197. SETUPV:    JMP    SETCMD        ; SET cmd
  198. SPMENV:    RET ! NOP ! NOP        ; Not used with MEX
  199. VERSNV:    JMP    SYSVER        ; Overlay's voice in the sign-on message
  200. BREAKV:    JMP    PBREAK        ; Send a break
  201. ; The following jump vector provides the overlay with access to special
  202. ; routines in the main program (retained and supported in the main pro-
  203. ; gram for MDM overlay compatibility). These should not be modified by
  204. ; the overlay.
  205. ; Note that for MEX 2.0 compatibility, you should not try to use these
  206. ; routines, since this table will go away with MEX 2.0 (use the MEX
  207. ; service call processor instead).
  208. ILPRTV:    DS    3        ; Replace with MEX function 9
  209. INBUFV:    DS    3        ; Replace with MEX function 10
  210. ILCMPV:    DS    3        ; Replace with table lookup funct. 247
  211. INMDMV:    DS    3        ; Replace with MEX function 255
  212. NXSCRV:    DS    3        ; Not supported by MEX (returns w/no action)
  213. TIMERV:    DS    3        ; Replace with MEX function 254
  214. ; Routine to clear to end of screen.  If using CLREOS and CLRSCRN, set
  215. ; SCRNTEST to YES at 010AH (above).  Each routine must use the
  216. ; full 9 bytes alloted (may be padded with nulls).
  217. ; These routines (and other screen routines that MEX 2.0 will sup-
  218. ; port) will be accessed through a jump table in 2.0, and will be
  219. ; located in an area that won't tie the screen functions to the
  220. ; modem overlay (as the MDM format does).
  221. CLREOS:    LXI    D,EOSMSG    ; Point to clear to EOS msg
  222.     MVI    C,PRINT        ; MEX print string funct #
  223.     CALL    MEX        ; Let MEX do it
  224.     RET
  225. CLS:    LXI    D,CLSMSG    ; Point to clear screen msg
  226.     MVI    C,PRINT        ; MEX print string funct #
  227.     CALL    MEX        ; Let MEX do it
  228.     RET
  229. ; The following routine sends a break "character" to the remote computer 
  230. ; for 300 ms.  The "MSPEED" value is needed to decide whether the modem 
  231. ; is at 300, 600, or 1200 baud.  The routine must know this because U.S.R. 
  232. ; sets up the RTS bit of the command register as a baud rate selection bit, 
  233. ; and this routine must be careful not to change it, or the user will end up 
  234. ; at a different baud rate after the break "character" is sent.  Note that 
  235. ; the "MVI A,01FH" does not change any flags.
  236. PBREAK:    LDA    MSPEED        ; Get speed byte
  237.     CPI    3        ; Are we at 600 baud?
  238.     MVI    A,01FH        ; Set up for 600 (no flag changes)
  239.     JZ    PBRK2        ; And if we are, go do that
  240.     MVI    A,03FH        ; Otherwise,set up for 300/1200
  241. PBRK2:    OUT    MODCT1        ; Send break
  242.     PUSH    PSW        ; Save value
  243.     MVI    B,3        ; 300 ms delay value
  244.     MVI    C,TIMER        ; MEX service function #254
  245.     CALL    MEX        ; Wait that long
  246.     POP    PSW        ; Restore command byte
  247.     ANI    0F7H        ; Turn off break bit
  248.     OUT    MODCT1        ; Send command byte to UART
  249.     RET
  250. ; The U.S.R. S-100 does not have a "quick-disconnect" feature like
  251. ; the Hayes does (by lowering DTR).  Therefore, "GOODBYE" is not
  252. ; implemented.  Yet control-N still works to hang up (see note
  253. ; above in introduction)
  254. GOODBYE:    RET
  255. ; *    *    *    *    *    *    *    *    *
  256. ;
  257. ; You can use this area for any special initialization or setup you may
  258. ; wish to include.  Each must stop with a RET.    This initialization
  259. ; sets up 1200 baud, 8 data bits, 1 stop bit, no parity.  Due to a
  260. ; quirk in the U.S.R. S-100 (it seems to have plenty of 'em), after
  261. ; you change baud rates, you should send an "AT" followed by a
  262. ; carriage return.  Therefore, this is done after every initialization
  263. ; when there is no carrier present.
  264. ; NOTE: The U.S.R. S-100 does not operate too well at clock speeds of
  265. ;     over 4 MHz.  If you are running at that speed or higher,you
  266. ;     should uncomment (by removing the preceding semicolon) the
  267. ;     lines with XCHG.  These serve as time wasting routines to
  268. ;     let the U.S.R. S-100 catch up.  This is not a problem when
  269. ;     doing character I/O, as the program checks to see if the
  270. ;     modem is ready to accept a character.
  271. NITMOD: MVI    A,0        ; Zero accumulator
  272.     OUT    MODCT1        ; Once
  273.     XCHG            ; For fast systems
  274.     XCHG            ; 
  275.     OUT    MODCT1        ; Twice
  276.     XCHG            ; For fast systems
  277.     XCHG            ; 
  278.     OUT    MODCT1        ; Three times,even
  279.     XCHG            ; For fast systems
  280.     XCHG            ; 
  281.     MVI    A,MRESET    ; Reset UART command
  282.     OUT    MODCT1        ; Send to control port
  283.     XCHG            ; For fast systems
  284.     XCHG            ; 
  285.     DB    3EH        ; "MVI,A" code
  286. MODEBT:    DB    MMODEB        ; Mode byte
  287.     OUT    MODCT1        ; Send to control port
  288.     XCHG            ; For fast systems
  289.     XCHG            ; 
  290.     DB    3EH        ; "MVI,A" code
  291. CMDBT:    DB    MMCMDA        ; Command byte
  292.     OUT    MODCT1        ; Send to control port
  293.     XCHG            ; For fast systems
  294.     XCHG            ; 
  295.     DB    3EH        ; "MVI,A" code
  296. BDCODE:    DB    5        ; Default baud rate code
  297.     STA    MSPEED        ; Stuff it
  298.     CALL    CARRCK        ; See if there is a carrier
  299.     RNZ            ; If so, don't do AT stuff
  300.     LXI    H,INISTR    ; Point to initialization string
  301. SNDL:    MOV    A,M        ; Get char to look at it
  302.     CPI    '$'        ; EOS char?
  303.     JZ    INITEX        ; Yes, exit
  304.     MOV    B,A        ; No, save char in B
  305.     CALL    OUTMOD        ; Output char to modem
  306.     INX    H        ; Point to next
  307.     JMP    SNDL        ; Loop 'til EOS
  308. ;
  309. INITEX:    MVI    B,15        ; Wait 1.5 sec
  310.     MVI    C,TIMER        ; MEX service function #254
  311.     CALL    MEX        ; Wait for USR to say "OK"
  312.     RET
  313. ;
  314. ; Command string sent to modem after I/O initialization
  315. ;
  316. INISTR:    DB    'AT'        ; Get modem's attention
  317.     DB    'X1'        ; Send extended result codes
  318. SPBYTE:    DB    'M1'        ; Speaker on 'til connect
  319.     DB    'S0=0'        ; Disable auto-answer
  320. WABYTE:    DB    'S7=30'        ; Wait 30 seconds for carrier
  321.     DB    'V1'        ; Set verbose result codes
  322.     DB    CR,'$'        ; End of command string
  323. ; Output a character to the U.S.R. S-100
  324. ; (NOTE: This routine is not normally present in most overlays,
  325. ;      and is used by the NITMOD routine above.)
  326. OUTMOD:    IN    MODCT1        ; Get status
  327.     ANI    MDSNDB        ; Mask for ready status
  328.     JZ    OUTMOD        ; Loop if not ready
  329.     MOV    A,B        ; Otherwise get the character
  330.     OUT    MODDAT        ; Output to the data port
  331.     RET            ; And return
  332. PBAUD:    CPI    5        ; 5=1200 baud
  333.     JZ    OK1200        ; Set to 1200
  334.     CPI    3        ; 3=600 baud
  335.     JZ    OK600        ; Set to 600
  336.                 ; Else set to 300
  337. OK300:    CALL    WAIT60        ; Set longer wait for carrier
  338.     LXI    B,BD300        ; Point to initializers for 300 baud
  339.     MVI    A,1        ; 300 baud value
  340.     JMP    LOADBD        ; Go load it
  341. OK600:    CALL    WAIT60        ; Set longer wait for carrier
  342.     LXI    B,BD600        ; Point to initializers for 600 baud
  343.     MVI    A,3        ; 600 baud value
  344.     JMP    LOADBD        ; Go load it
  345. OK1200:    CALL    WAIT30        ; Set short wait for carrier
  346.     LXI    B,BD1200    ; Point to initializers for 1200 baud
  347.     MVI    A,5        ; 1200 baud value
  348. LOADBD:    STA    BDCODE        ; Change baud rate code value
  349.     LDAX    B        ; Get mode byte value
  350.     STA    MODEBT        ; Change mode byte
  351.     INX    B        ; Point to cmd byte
  352.     LDAX    B        ; Get cmd byte
  353.     STA    CMDBT        ; Change cmd byte
  354.     CALL    NITMOD        ; (Re)initialize modem
  355.     LDA    SETFLG        ; Get setflg
  356.     CPI    0FFH        ; Is it a 'SET'
  357.     JNZ    PBPSA        ; No, print bps in dial prompt
  358.     RET            ; Yes, just return
  359. PBPSA:    
  360.      IF    ATTRIB
  361.     LXI    D,INDVID    ; Set video attribute
  362.     CALL    PMSG        ; Issue attribute to term
  363.      ENDIF    ;ATTRIB
  364.     JMP    PBPS        ; Print bps rate
  365. ;
  366. ; Wait for carrier 30/60 seconds
  367. ;
  368. WAIT30:    MVI    A,'3'        ; Set up for short wait
  369.     JMP    SWAIT        ; Jump around
  370. WAIT60:    MVI    A,'6'        ; Set up for long wait
  371. SWAIT:    STA    WABYTE+3    ; store the wait msb value
  372.     MVI    A,'0'        ; fake lsbyte
  373.     STA    WABYTE+4    ; store the wait lsb value
  374.     RET
  375. ; Baudrate parameters (mode byte, command byte)
  376. BD300:    DB    MMODEA,MMCMDA    ; 300  baud, 8 bits, 2 stop, no parity.
  377. BD600:    DB    MMODEB,MMCMDB    ; 600  baud, 8 bits, 1 stop, no parity.
  378. BD1200:    DB    MMODEB,MMCMDA    ; 1200 baud, 8 bits, 1 stop, no parity.
  379. ; Sign-on message
  380. SYSVER:    
  381.      IF    ATTRIB
  382.     LXI    D,INVID        ; Set video attribute
  383.     CALL    PMSG        ; Issue attribute to term
  384.      ENDIF    ;ATTRIB
  385.     LXI    D,SOMESG    ; Point to signon message
  386.     CALL    PMSG        ; Print message on term
  387. CARRSH:    
  388.      IF    ATTRIB
  389.     LXI    D,NORVID    ; Reset video attribute
  390.     CALL    PMSG        ; Issue attribute to term
  391.      ENDIF    ;ATTRIB
  392.     LXI    D,NOMESG    ; Tell about carrier
  393.     CALL    CARRCK        ; Check for it
  394.     CZ    PMSG        ; Print the "No" if no carrier
  395.     LXI    D,CARMSG    ; Print "carrier present"
  396.     CALL    PMSG        ; Print message on term
  397.      IF    ATTRIB
  398.     LXI    D,NORVID    ; Reset video attribute
  399.      ENDIF    ;ATTRIB
  400.      IF    NOT ATTRIB
  401.     RET
  402.       ENDIF    ;NOT ATTRIB
  403. PMSG:    MVI    C,PRINT        ; Get print funct #
  404.     CALL    MEX        ; Let MEX do it
  405.     RET
  406. ;
  407. SOMESG:    DB    ' U. S. Robotics S-100 ',CR,LF
  408.     DB    ' Autodial Version '
  409.     DB    REV/10+'0','.'
  410.     DB    REV MOD 10+'0',' '
  411.     DB    CR,LF,'$'
  412. NOMESG:    DB    'No$'
  413. CARMSG:    DB    ' carrier present '
  414.     DB    CR,LF,'$'
  415. ; Strings to clear-to-end-of-screen, and clear-screen
  416. EOSMSG:    DB    ESC,'[J$'    ; ANSI clear EOS
  417. CLSMSG:    DB    ESC,'[2J$'    ; ANSI clear screen
  418. ;
  419. ; Strings for setting video attributes
  420. ;
  421. UNVID:    DB    ESC,'[4m$'    ; ANSI underscore
  422. INDVID:    DB    ESC,'[7m$'    ; ANSI inverse
  423. INVID:    DB    ESC,'[1;7m$'    ; ANSI bold, inverse
  424. BLVID:    DB    ESC,'[1;5;7m$'    ; ANSI bold, inverse, blinking
  425. NORVID:    DB    ESC,'[0m$'    ; ANSI return to normal video
  426. ; Check the USR for carrier-present (Z=no)
  427. CARRCK:    IN    MODCT1        ; Get status byte
  428.     ANI    MDDCDB
  429.     RET
  430. ; Newline on console
  431. CRLF:    MVI    A,CR
  432.     CALL    TYPE
  433.     MVI    A,LF        ; Fall into TYPE
  434. ; Type char in A on console
  435. TYPE:    PUSH    H        ; Save 'em
  436.     PUSH    D
  437.     PUSH    B
  438.     MOV    E,A        ; Align output character
  439.     MVI    C,CONOUT    ; Print via MEX
  440.     CALL    MEX
  441.     POP    B
  442.     POP    D
  443.     POP    H
  444.     RET
  445. ; The remainder of this overlay implements a very versatile
  446. ; SET command -- if you prefer not to write a SET for your
  447. ; modem, you may delete the code from here to the END statement.
  448. ; Control is passed here after MEX parses a SET command.
  449. SETCMD:    PUSH    PSW        ; Save modem speed code
  450.     MVI    A,0FFH        ; Get all ones
  451.     STA    SETFLG        ; Set setflg
  452.     POP    PSW        ; Get modem spd back
  453.     MVI    C,SBLANK    ; Any arguments?
  454.     CALL    MEX
  455.     JC    SETSHO        ; If not, go print out values
  456.     LXI    D,CMDTBL    ; Parse command
  457.     CALL    TSRCH        ; From table
  458.     PUSH    H        ; Any address on stack
  459.     RNC            ; If we have one, execute it
  460.     POP    H        ; Nope, fix stack
  461. SETERR:    
  462.      IF    ATTRIB
  463.     LXI    D,BLVID        ; Set video attribute
  464.     CALL    PMSG        ; Issue attribute to term
  465.      ENDIF    ;ATTRIB
  466.     LXI    D,SETEMS    ; Point to error msg
  467.     CALL    PMSG        ; Print message on term
  468.      IF    ATTRIB
  469.     LXI    D,NORVID    ; Reset video attribute
  470.     CALL    PMSG        ; Issue attribute to term
  471.      ENDIF    ;ATTRIB
  472.     CALL    STHELP        ; Print help on error
  473.     MVI    A,0        ; Clear acc
  474.     STA    SETFLG        ; Reset setflg
  475.     RET
  476. SETEMS:    DB    CR,LF,' SET COMMAND ERROR ',CR,LF,BELL,'$'
  477. ; SET command table ... note that tables are constructed of command-
  478. ; name (terminated by high bit=1) followed by word-data-value returned
  479. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  480. ; a binary zero.
  481. ; Note that LOOKUP attempts to find the next item in the input stream
  482. ; in the table passed to it in HL ... if found, the table data item is
  483. ; returned in HL; if not found, LOOKUP returns carry set.
  484. CMDTBL:    DB    '?'+80H        ; "set ?"
  485.     DW    STHELP
  486.     DB    'BAU','D'+80H    ; "set baud"
  487.     DW    STBAUD
  488.     DB    'PARIT','Y'+80H    ; "set parity"
  489.     DW    STPAR
  490.     DB    'SPK','R'+80H    ; "set spkr"
  491.     DW    STSPKR
  492.     DB    'WAI','T'+80H    ; "set wait"
  493.     DW    STWAIT
  494.     DB    'DIA','L'+80H    ; "set dial"
  495.     DW    STDIAL
  496.     DB    0        ; <<=== table terminator
  497. ; SET <no-args>: print current statistics
  498. SETSHO:    CALL    CARRSH        ; Show carrier present/not present
  499.     LXI    H,SHOTBL    ; Get table of SHOW subroutines
  500. SETSLP:    MOV    E,M        ; Get table address
  501.     INX    H
  502.     MOV    D,M
  503.     INX    H
  504.     MOV    A,D        ; End of table?
  505.     ORA    E
  506.     RZ            ; Exit if so
  507.     PUSH    H        ; Save table pointer
  508.     XCHG            ; Adrs to HL
  509.     CALL    GOHL        ; Do it
  510.     CALL    CRLF        ; Print newline
  511.     MVI    C,CHEKCC    ; Check for console abort
  512.     CALL    MEX
  513.     POP    H        ; It's done
  514.     JNZ    SETSLP        ; Continue if no abort
  515.     RET
  516. GOHL:    PCHL
  517. ; table of SHOW subroutines
  518. SHOTBL:    DW    BDSHOW
  519.     DW    PASHOW
  520.     DW    SPSHOW
  521.     DW    WASHOW
  522.     DW    DISHOW
  523.     DW    0        ; <<== table terminator
  524. ; SET ?  processor
  525. STHELP:    
  526.      IF    ATTRIB
  527.     LXI    D,UNVID        ; Set video attribute
  528.     CALL    PMSG        ; Issue attribute to term
  529.      ENDIF    ;ATTRIB
  530.     LXI    D,HLPHDR    ; Point to HELP header
  531.     CALL    PMSG        ; Print message on term
  532.      IF    ATTRIB
  533.     LXI    D,NORVID    ; Reset video attribute
  534.     CALL    PMSG        ; Issue attribute to term
  535.      ENDIF    ;ATTRIB
  536.     LXI    D,HLPMSG    ; Point to HELP msg
  537.     CALL    PMSG        ; Print message on term
  538.      IF    ATTRIB
  539.     LXI    D,INDVID    ; Set video attribute
  540.     CALL    PMSG        ; Issue attribute to term
  541.      ENDIF    ;ATTRIB
  542.     LXI    D,HLPNOT    ; Point to HELP note
  543.     CALL    PMSG        ; Print message on term
  544.      IF    NOT ATTRIB
  545.     RET
  546.      ENDIF    ;NOT ATTRIB
  547.      IF    ATTRIB
  548.     LXI    D,NORVID    ; Reset video attribute
  549.     JMP    PMSG        ; Issue attribute to term
  550.      ENDIF    ;ATTRIB
  551. ; The help message
  552. HLPHDR:    DB    CR,LF,'THE FOLLOWING ARE VALID SET COMMANDS:$'
  553. HLPMSG:    DB    CR,LF,'SET BAUD <300> or <600> or <1200>'
  554.     DB    CR,LF,'SET PARITY <NONE> or <ODD> or <EVEN>'
  555.     DB    CR,LF,'SET SPKR <OFF> or <ON> or <DEBUG>'
  556.     DB    CR,LF,'SET WAIT <30> or <60> or <90>'
  557.     DB    CR,LF,'SET DIAL <TOUCH> or <PULSE>$'
  558. HLPNOT:    DB    CR,LF,LF,'NOTE: SET BAUD defaults to NO parity.'
  559.     DB    CR,LF,LF,'$'
  560. ;
  561. SETFLG:    DB    0        ; SET command flag
  562. ; SET BAUD processor
  563. STBAUD:    MVI    C,BDPARS    ; Function code
  564.     CALL    MEX        ; Let MEX look up code
  565.     JC    SETERR        ; Invalid code
  566.     CALL    PBAUD        ; No, try to set it
  567.     JC    SETERR        ; Not-supported code
  568.     JMP    SETSHO        ; review parameters
  569. ;
  570. BDSHOW:    LDA    SETFLG        ; Get setflg
  571.     CPI    0FFH        ; Is it a 'SET' operation?
  572.     JNZ    PBPS        ; No, must be dial - just display bps
  573.     CALL    ILPRT        ; Yes, display the 'Baud' prompt
  574.     DB    'Baud rate: ',0
  575. PBPS:    LDA    MSPEED        ; Load modem speed code
  576.     MVI    C,PRBAUD    ; Use MEX function #
  577.     CALL    MEX        ; To print bps
  578.     LXI    D,NORVID    ; Reset video attribute
  579.     CALL    PMSG        ; Issue attribute to term
  580.     MVI    E,' '        ; Followed by space
  581.     MVI    C,CONOUT    ; Use MEX function #
  582.     CALL    MEX        ; Let MEX do it
  583.     MVI    A,0        ; Clear acc
  584.     STA    SETFLG        ; Reset setflg
  585.     RET
  586. ;
  587. ; SET PARITY processor
  588. ;
  589. STPAR:    LXI    D,PARTBL    ; point to parity table
  590.     CALL    TSRCH        ; lookup next input item in table
  591.     JC    SETERR        ; if not found, error
  592.     PUSH    PSW        ; a=byte from table
  593.     LDA    MODEBT        ; get old mode byte
  594.     ANI    0C3H        ; strip off parity bits, word length
  595.     MOV    B,A        ; old modebt into b
  596.     POP    PSW        ; get table entry back
  597.     ANI    3CH        ; mask parity bits, word length
  598.     ADD    B        ; adjust new parity values
  599.     STA    MODEBT        ; store the new mode byte
  600.     CALL    NITMOD        ; (re)initialize modem
  601.     JMP    SETSHO        ; review parameters
  602. ;
  603. PASHOW:    CALL    ILPRT        ; show parity mode
  604.     DB    'Parity: ',0
  605.     LDA    MODEBT        ; get mode byte
  606.     ANI    30H        ; mask off parity bits
  607.     CPI    10H        ; bit 4 hi?
  608.     JZ    ODDPAR        ; yes, odd parity
  609.     CPI    30H        ; bits 5,4 hi?
  610.     JZ    EVPAR        ; yes, even parity
  611.                 ; else no parity
  612. NOPAR:    CALL    ILPRT        ; in-line print
  613.     DB    'NONE',0
  614.     RET
  615. EVPAR:    CALL    ILPRT        ; in-line print
  616.     DB    'EVEN',0
  617.     RET
  618. ODDPAR:    CALL    ILPRT        ; in-line print
  619.     DB    'ODD',0
  620.     RET
  621. ;
  622. PARTBL:    DB    'NON','E'+80H    ; set parity off
  623.     DB    0CH,0        ; 8 bit word length
  624.     DB    'EVE','N'+80H    ; set parity even
  625.     DB    38H,0        ; bits 5,4,3 hi (7 bit word length)
  626.     DB    'OD','D'+80H    ; set parity odd
  627.     DB    18H,0        ; bits 4,3 hi (7 bit word length)
  628.     DB    0        ; <<=== table terminator
  629. ;
  630. ; SET SPKR processor
  631. ;
  632. STSPKR:    LXI    D,SPKTBL    ; lookup next input item in table
  633.     CALL    TSRCH
  634.     JC    SETERR        ; if not found, error
  635.     STA    SPBYTE+1    ; store the spkr command
  636.     CALL    NITMOD        ; (re)initialize modem
  637.     JMP    SETSHO        ; review parameters
  638. ;
  639. SPSHOW:    CALL    ILPRT        ; show spkr mode
  640.     DB    'Speaker: ',0
  641.     LDA    SPBYTE+1    ; get spkr byte
  642.     CPI    '1'
  643.     JZ    SPONPT        ; spkr on part-time
  644.     CPI    '2'
  645.     JZ    SPON        ; spkr on continuously
  646. ;
  647. SPOFF:    CALL    ILPRT
  648.     DB    'OFF',0
  649.     RET
  650. ;
  651. SPONPT:    CALL    ILPRT
  652.     DB    'ON until connect',0
  653.     RET
  654. ;
  655. SPON:    CALL    ILPRT
  656.     DB    'ON always',0
  657.     RET
  658. ;
  659. SPKTBL:    DB    'OF','F'+80H    ; set spkr off
  660.     DB    '0',0
  661.     DB    'O','N'+80H    ; set spkr on 'til connect    
  662.     DB    '1',0
  663.     DB    'DEBU','G'+80H    ; set spkr on continuously
  664.     DB    '2',0
  665.     DB    0        ; <<=== table terminator
  666. ;
  667. ; SET WAIT processor
  668. ;
  669. STWAIT:    LXI    D,WAITBL    ; lookup next input item in table
  670.     CALL    TSRCH
  671.     JC    SETERR        ; if not found, error
  672.     STA    WABYTE+3    ; store the wait msb value
  673.     MVI    A,'0'        ; fake lsbyte
  674.     STA    WABYTE+4    ; store the wait lsb value
  675.     CALL    NITMOD        ; (re)initialize modem
  676.     JMP    SETSHO        ; review parameters
  677. ;
  678. WASHOW:    CALL    ILPRT
  679.     DB    'Wait: ',0
  680.     LDA    WABYTE+3
  681.     CALL    TYPE        ; show msb
  682.     LDA    WABYTE+4
  683.     CALL    TYPE        ; show lsb
  684.     CALL    ILPRT
  685.     DB    ' seconds for carrier',0
  686.     RET
  687. ;
  688. WAITBL:    DB    '3','0'+80H    ; "set wait 30"
  689.     DB    '3',0
  690.     DB    '6','0'+80H    ; "set wait 60"
  691.     DB    '6',0
  692.     DB    '9','0'+80H    ; "set wait 90"
  693.     DB    '9',0
  694.     DB    0        ; <<=== table terminator
  695. ;
  696. ; SET DIAL processor
  697. ;
  698. STDIAL:    LXI    D,DIATBL    ; lookup next input item in table
  699.     CALL    TSRCH
  700.     JC    SETERR        ; if not found, error
  701.     STA    TPULSE        ; store the dial command
  702.     CALL    NITMOD        ; (re)initialize modem
  703.     JMP    SETSHO        ; review parameters
  704. ;
  705. DISHOW:    CALL    ILPRT        ; show dial mode
  706.     DB    'Dial: ',0
  707.     LDA    TPULSE        ; get dial byte
  708.     CPI    'T'
  709.     JZ    TTONE        ; touch tone 
  710. ;
  711. PDIAL:    CALL    ILPRT
  712.     DB    'Pulse',0
  713.     RET
  714. ;
  715. TTONE:    CALL    ILPRT
  716.     DB    'Touch Tone',0
  717.     RET
  718. ;
  719. ; DIAL argument table
  720. ;
  721. DIATBL:    DB    'TOUC','H'+80H    ; touch tone
  722.     DB    'T',0
  723.     DB    'PULS','E'+80H    ; pulse dial
  724.     DB    'P',0
  725.     DB    0        ; <<=== table terminator
  726. ; Compare next input-stream item in table @DE; CY=1
  727. ; if not found, else HL=matched data item
  728. TSRCH:    MVI    C,LOOKUP    ; Get function code
  729.     JMP    MEX        ; Pass to MEX processor
  730. ; Print in-line message ... blows away C register
  731. ILPRT:    MVI    C,ILP        ; Get function code
  732.     JMP    MEX        ; Go do it
  733. ; NOTE:  Must terminate prior to 0B00H 
  734.       END
  735.