home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / mex / mxh-am12.z80 < prev    next >
Text File  |  1994-07-13  |  22KB  |  771 lines

  1.     TITLE    MXH-AM12 -- MEX Overlay for AMPRO LB
  2.  
  3. ; MEX overlay for the Ampro Little Board Computer
  4. ;    
  5. ;    New version for the XLR8 board
  6. ;
  7. ; Version 1.2  30 Oct 86
  8. ;  Changed to MXHAM12, added break send capability and SET BREAK.
  9. ;    -- Brian K. Uechi
  10. ;
  11. ;  Also changed to allow last cloned baud to be the default.
  12. ;    -- Dave VanHorn
  13. ;
  14. ; Version 1.1  07 Feb 1986
  15. ;  Changed to MXH-AM11 from MXO=AM10, added DCD & DTR support and
  16. ;  made LOADable from within MEX+    --Bob Connolly
  17. ;
  18. ; Version 1.0: 28 Nov 1984  
  19.  
  20. REV    EQU    12        ;overlay revision level
  21.  
  22.  
  23. ; This is a MEX overlay file for the Ampro Computer.  It is designed
  24. ; to work with the modem connected to serial port 'B'.  It also       
  25. ; requires the CTC and SIO parameter tables at the front of the
  26. ; Ampro bios, as well as the I/O initialization routine in the
  27. ; Ampro bios.  This is a non-standard bios call and if not present
  28. ; in the bios it must be duplicated in this overlay.
  29.  
  30. ; Note that all overlays may freely use memory up to 0CFFH.  If the
  31. ; overlay must work with the MEX Smartmodem overlay (MXO-SMxx.ASM),
  32. ; the physical modem overlay should terminate by 0AFFH.
  33.  
  34. ;------------------------------------------------------------
  35.  
  36. ; Misc equates
  37.  
  38. NO    EQU    0
  39. YES    EQU    0FFh
  40. TPA    EQU    100h
  41. CR    EQU    13
  42. LF    EQU    10
  43. TAB    EQU    9
  44.  
  45. ; Ampro definitions
  46.  
  47. IOINT    EQU    57        ;BIOS call of initialization routine
  48. SIOB    EQU    52h        ;relative location in bios
  49. SIOB1    EQU    53h        ;Image in memory of SIO register 4
  50. SIOB3    EQU    55h        ;Image in memory of SIO register 5
  51. SIOB5    EQU    57h        ;Image in memory of SIO register 3
  52. CT1    EQU    42h        ;CTC CTL reg
  53.  
  54. ; port definitions
  55.  
  56. MODCTL    EQU    8Ch        ;modem control port B
  57. MODDAT    EQU    88h        ;modem data port B
  58.  
  59. ; bit definitions
  60.  
  61. MDRCVB    EQU    01h        ;modem receive bit (DAV)
  62. MDRCVR    EQU    01h        ;modem receive ready
  63. MDSNDB    EQU    04h        ;modem send bit
  64. MDSNDR    EQU    04h        ;modem send ready bit
  65.  
  66. ; MEX service processor stuff ... MEX supports an overlay service
  67. ; processor, located at 0D00H (and maintained at this address from
  68. ; version to version).  If your overlay needs to call BDOS for any
  69. ; reason, it should call MEX instead; function calls below about
  70. ; 240 are simply passed on to the BDOS (console and list I/O calls
  71. ; are specially handled to allow modem port queueing, which is why
  72. ; you should call MEX instead of BDOS).  MEX uses function calls
  73. ; above about 244 for special overlay services (described below).
  74.  
  75. ; Some sophisticated overlays may need to do file I/O; if so, use
  76. ; the PARSFN MEX call with a pointer to the FCB in DE to parse out
  77. ; the name.  This FCB should support a spare byte immediately pre-
  78. ; ceeding the actual FCB (to contain user # information).  If you've
  79. ; used MEX-10 for input instead of BDOS-10 (or you're parsing part
  80. ; of a SET command line that's already been input), then MEX will
  81. ; take care of DU specs, and set up the FCB accordingly.  There-
  82. ; after all file I/O calls done through the MEX service processor
  83. ; will handle drive and user with no further effort necessary on
  84. ; the part of the programmer.
  85.  
  86. MEX    EQU    0D00H        ;address of the service processor
  87. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  88. TIMER    EQU    254        ;delay 100ms * reg B
  89. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  90. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  91. SNDRDY    EQU    251        ;test for modem-send ready
  92. RCVRDY    EQU    250        ;test for modem-receive ready
  93. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  94. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  95. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  96. PARSFN    EQU    246        ;parse filename from input stream
  97. BDPARS    EQU    245        ;parse baud-rate from input stream
  98. SBLANK    EQU    244        ;scan input stream to next non-blank
  99. EVALA    EQU    243        ;evaluate numeric from input stream
  100. LKAHED    EQU    242        ;get nxt char w/o removing from input
  101. GNC    EQU    241        ;get char from input, cy=1 if none
  102. ILP    EQU    240        ;inline print
  103. DECOUT    EQU    239        ;decimal output
  104. PRBAUD    EQU    238        ;print baud rate
  105.  
  106. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  107. PRINT    EQU    9        ;simulated BDOS function 9: print string
  108. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  109.  
  110.     ORG    TPA        ;we begin
  111.  
  112.     db    0c3h
  113.     DS    2        ;MEX has a JMP START here
  114.  
  115. ; The following variables are located at the beginning of the program
  116. ; to facilitate modification without the need of re-assembly. They will
  117. ; be moved in MEX 2.0.
  118.  
  119. PMODEM:    DB    NO        ;yes=PMMI modem \ / These 2 locations are not
  120. SMODEM:    DB    YES        ;yes=Smartmodem / \ referenced by MEX
  121. TPULSE:    DB    'T'        ;T=touch, P=pulse (not referenced by MEX)
  122. CLOCK:    DB    40        ;clock speed x .1, up to 25.5 mhz.
  123. MSPEED:    DB    6        ;sets display time for sending a file
  124.                 ;0=110    1=300  2=450  3=600  4=710
  125.                 ;5=1200 6=2400 7=4800 8=9600 9=19200
  126. BYTDLY:    DB    5        ;default time to send character in
  127.                 ;terminal mode file transfer (0-9)
  128.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  129. CRDLY:    DB    5        ;end-of-line delay after CRLF in terminal
  130.                 ;mode file transfer for slow BBS systems
  131.                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  132. COLUMS:    DB    5        ;number of directory columns
  133. SETFL:    DB    YES        ;yes=user-defined SET command
  134. SCRTST:    DB    YES        ;yes=if home cursor and clear screen    10Ch
  135.                 ;routine at CLRSCRN
  136.     DB    0        ;was once ACKNAK, now spare
  137. BAKFLG:    DB    NO        ;yes=make .BAK file
  138. CRCDFL:    DB    YES        ;yes=default to CRC checking
  139.                 ;no=default to Checksum checking
  140. TOGCRC:    DB    YES        ;yes=allow toggling of Checksum to CRC    110h
  141. CVTBS:    DB    NO        ;yes=convert backspace to rub
  142. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub
  143. ADDLF:    DB    NO        ;no=no LF after CR to send file in
  144.                 ;terminal mode (added by remote echo)
  145. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR
  146. TRNLOG:    DB    YES        ;yes=allow transmission of logon
  147.                 ;write logon sequence at location LOGON
  148. SAVCCP:    DB    YES        ;yes=do not overwrite CCP
  149. LOCNXT:    DB    NO        ;yes=local cmd if EXTCHR precedes
  150.                 ;no=not local cmd if EXTCHR precedes
  151. TOGLOC:    DB    YES        ;yes=allow toggling of LOCNXTCHR
  152. LSTTST:    DB    YES        ;yes=allow toggling of printer on/off
  153.                 ;in terminal mode. Set to no if using
  154.                 ;the printer port for the modem
  155. XOFTST:    DB    NO        ;yes=allow testing of XOFF from remote
  156.                 ;while sending a file in terminal mode
  157. XONWT:    DB    NO        ;yes=wait for XON after sending CR while
  158.                 ;transmitting a file in terminal mode    
  159. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF testing
  160. IGNCTL:    DB    NO        ;yes=do not send control characters
  161.                 ;above CTL-M to CRT in terminal mode
  162.                 ;no=send any incoming CTL-char to CRT
  163. EXTRA1:    DB    0        ;for future expansion
  164. EXTRA2:    DB    0        ;for future expansion
  165. BRKCHR:    DB    '@'-40H        ;^@ = Send a 300 ms. break tone
  166. NOCONN:    DB    'N'-40H        ;^N = Disconnect from phone line
  167. LOGCHR:    DB    'L'-40H        ;^L = Send logon
  168. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer
  169. UNSVCH:    DB    'R'-40H        ;^R = Close input text buffer
  170. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote
  171. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer
  172. EXTCHR:    DB    '^'-40H        ;^^ = Send next character        127h
  173.  
  174.     ds    2        ;make addresses right
  175.  
  176. ; Low-level modem I/O routines: this will be replaced with
  177. ; a jump table in MEX 2.0 (you can insert jumps here to longer
  178. ; routines if you'd like ... I'd recommend NOT putting part of
  179. ; a routine in this area, then jumping to the rest of the routine
  180. ; in the non-fixed area; that will complicate the 2.0 conversion)
  181.  
  182. INCTL1:    IN    A,(MODCTL)    ;in modem control port            12Ah
  183.     RET
  184.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  185.  
  186. OTDATA:    OUT    (MODDAT),A    ;out modem data port            134h
  187.     RET
  188.     DB    0,0,0,0,0,0,0    ;spares if needed for non=PMMI
  189.  
  190. INPORT:    IN    A,(MODDAT)    ;in modem data port            13Eh
  191.     RET
  192.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  193.  
  194. ; Bit-test routines.  These will be merged with the above
  195. ; routines in MEX 2.0 to provide a more reasonable format
  196.  
  197. MASKR:    AND    MDRCVB        ;bit to test for receive ready        148h
  198.     RET
  199.  
  200. TESTR:    CP    MDRCVR        ;value of receive bit when ready    14Bh
  201.     RET
  202.  
  203. MASKS:    AND    MDSNDB        ;bit to test for send ready        14Eh
  204.     RET
  205.  
  206. TESTS:    CP    MDSNDR        ;value of send bit when ready        151h
  207.     RET
  208.  
  209.  
  210. dcdtst:    jp    dcdvec        ;data carrier detect            154h
  211. rngdet:    jp    rngvec        ;ring-detect                157h
  212.  
  213.     db    0,0,0,0,0
  214.  
  215. ; Special modem function jump table: if your overlay cannot handle
  216. ; some of these, change the jump to "DS 3", so the code present in
  217. ; MEX will be retained.  Thus, if your modem can't dial, change the
  218. ; JMP PDIAL at DIALV to DS 3, and MEX will print a "not-implemented"
  219. ; diagnostic for any commands that require dialing.
  220.  
  221. ; DIALV  dials the digit in A. See the comments at PDIAL for specs.
  222.  
  223. ; DISCV  disconnects the modem
  224.  
  225. ; GOODBV is called just before MEX exits to CP/M.  If your overlay
  226. ;        requires some exit cleanup, do it here.
  227.  
  228. ; INMODV is called when MEX starts up; use INMODV to initialize the modem.
  229.  
  230. ; NEWBDV is used for phone-number baud rates and is called with a baud-rate
  231. ;        code in the A register, value as follows:
  232.  
  233. ;     A=0:   110 baud       A=1:   300 baud      A=2:   450 baud
  234. ;     A=3:   600 baud       A=4:   710 baud      A=5:  1200 baud
  235. ;     A=6:  2400 baud       A=7:  4800 baud      A=8:  9600 baud
  236. ;
  237. ;        If your overlay supports the passed baud rate, it should store the
  238. ;     value passed in A at MSPEED (107H), and set the requested rate. If
  239. ;     the value passed is not supported, you should simply return (with-
  240. ;     out modifying MSPEED) -or- optionally request a baud-rate from the
  241. ;     user interactively.
  242. ;
  243. ; NOPARV is called at the end of each file transfer; your overlay may simply
  244. ;     return here, or you may want to restore parity if you set no-parity
  245. ;     in the following vector (this is the case with the PMMI overlay).
  246.  
  247. ; PARITV is called at the start of each file transfer; your overlay may simply
  248. ;     return here, or you may want to enable parity detection (this is the
  249. ;     case with the PMMI overlay).
  250.  
  251. ; SETUPV is the user-defined command ... to use this routine to build your own
  252. ;     MEX command, set the variable SETFL (117H) non-zero, and add your SET
  253. ;     code.  You can use the routine presented in the PMMI overlay as a 
  254. ;     guide for parsing, table lookup, etc.
  255.  
  256. ; SPMENU is provided only for MDM compatibility, and is not used by MEX 1.0 for
  257. ;     any purpose (it will be gone in MEX 2).
  258.  
  259. ; VERSNV is called immediately after MEX prints its sign-on message at cold
  260. ;     startup -- use this to identify your overlay in the sign-on message
  261. ;     (include overlay version number in the line).
  262. ; BREAKV is provided for sending a BREAK (<ESC>-B in terminal mode).  If your
  263. ;     modem doesn't support BREAK, or you don't care to code a BREAK rou-
  264. ;     tine, you may simply execute a RET instruction.
  265. ;
  266. smdisc:    ds    3        ;smartmodem disc (not here}        15Fh
  267. DIALV:    DS    3        ;dial digit in A (see info at PDIAL)    162h
  268. DISCV:    jp    drdtr        ;disconnect the modem            165h
  269. GOODBV:    DS    3        ;called before exit to CP/M        168h
  270. INMODV:    JP    NITMOD        ;initialization. Called at cold-start    16Bh
  271. NEWBDV:    JP    PBAUD        ;set baud rate                16Eh
  272. NOPARV:    JP    NOPAR        ;set modem for no-parity        171h
  273. PARITV:    JP    PARITY        ;set modem parity            174h
  274. SETUPV:    JP    SETCMD        ;SET cmd: jump to a RET if no SETCMD    177h
  275. SPMENV:    DS    3        ;not used with MEX            17Ah
  276. VERSNV:    JP    SYSVER        ;Overlay's voice in the sign-on message    17Dh
  277. BREAKV:    jp    SBREAK        ;1.2| send a break            180h
  278.  
  279. ; The following jump vector provides the overlay with access to special
  280. ; routines in the main program (retained and supported in the main pro-
  281. ; gram for MDM overlay compatibility). These should not be modified by
  282. ; the overlay.
  283.  
  284. ; Note that for MEX 2.0 compatibility, you should not try to use these
  285. ; routines, since this table will go away with MEX 2.0 (use the MEX
  286. ; service call processor instead).
  287.  
  288. ILPRTV:    DS    3        ;replace with MEX function 9        183h
  289. INBUFV:    DS    3        ;replace with MEX function 10        186h
  290. ILCMPV:    DS    3        ;replace with table lookup funct. 247    189h
  291. INMDMV:    DS    3        ;replace with MEX function 255        18Ch
  292. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  293. TIMERV:    DS    3        ;replace with MEX function 254        192h
  294.  
  295. ; Clear/screen and clear/end-of-screen. Each routine must use the
  296. ; full 9 bytes alloted (may be padded with nulls).
  297.  
  298. ; These routines (and other screen routines that MEX 2.0 will sup-
  299. ; port) will be accessed through a jump table in 2.0, and will be
  300. ; located in an area that won't tie the screen functions to the
  301. ; modem overlay (as the MDM format does).
  302.  
  303. CLREOS:    LD    DE,EOSMSG    ;                    195h
  304.     LD    C,PRINT
  305.     CALL    MEX
  306.     RET
  307.  
  308. CLS:    LD    DE,CLSMSG    ;null unless patched              19Eh
  309.     LD    C,PRINT
  310.     CALL    MEX
  311.     RET
  312.  
  313.     org    200h        ; area above is reserved
  314.  
  315. EOSMSG:    DB    27,89,0,0,0,'$'
  316.  
  317. CLSMSG:    DB    27,42,0,0,0,'$'
  318.  
  319. NOPAR:    RET
  320.  
  321. PARITY:    RET
  322.  
  323. DRDTR:    LD    A,5        ; Setup to write register 5
  324.     OUT    (MODCTL),A
  325.     LD    A,68H        ; Clear RTS causing shutdown
  326.     OUT    (MODCTL),A
  327.     RET
  328.  
  329. dcdvec:    ld    a,10h        ;reset status
  330.     out    (modctl),a    ;  0=NO CARRIER  255=CARRIER
  331.     in    a,(modctl)    ;  254=NOT SUPPORTED
  332.     and    20h        ;dcd from modem must
  333.     ret    z        ; be connected to
  334.     or    0ffh        ; cts (ampro) else
  335.     ret            ; return 0feh (unsupported)
  336.  
  337. rngvec:    ld    a,0feh
  338.     ret
  339.  
  340. NITMOD:    LD    A,(Mspeed)    ;set baud to last cloned rate
  341.  
  342. ;------------------------------------------------------------------
  343.  
  344. PBAUD:    PUSH    HL        ;don't alter anybody
  345.     PUSH    DE
  346.     PUSH    BC
  347.     LD    E,A        ;code to DE
  348.     LD    D,0
  349.     LD    HL,BAUDTB    ;offset into table
  350.     ADD    HL,DE
  351.     LD    A,(HL)        ;fetch code
  352.     OR    A        ;0? (means unsupported code)
  353.     SCF            ;return error for STBAUD caller
  354.     JP    Z,PBEXIT    ;exit if so
  355.     LD    (BSAVE1),A    ;save it
  356.     LD    A,E        ;get speed code back
  357.     LD    (MSPEED),A    ;make it current
  358.     LD    HL,BAUDTX    ;offset into second table
  359.     ADD    HL,DE
  360.     LD    A,(HL)        ;get second value
  361.     LD    (BSAVE2),A    ;save it also
  362.  
  363.     LD    HL,(1)        ;get location of bios
  364.     LD    L,CT1        ;add 42 to reach CT1 in i/o table
  365.     LD    A,47h
  366.     LD    (HL),A
  367.     INC    HL        ;move to next location
  368.     LD    A,(BSAVE1)    ;get first table value
  369.     LD    (HL),A        ;store it
  370.     LD    A,(BSAVE2)    ;get second table value
  371.     LD    B,A        ;and save it
  372.     LD    L,SIOB1        ;move ahead to siob+1 values
  373.     LD    A,(HL)        ;get current value
  374.     AND    3Fh
  375.     OR    B        ;or it with second value
  376.     LD    (HL),A        ;store it in work table
  377.     INC    HL
  378.     INC    HL
  379.     LD    A,(HL)        ;get last value and make
  380.     OR    80h        ;sure msb is set
  381.     LD    (HL),A        ;put it back in working table
  382.     CALL    IOINIT        ;do the initialization
  383.     SCF
  384.     CCF            ;return no error for STBAUD
  385.  
  386. PBEXIT:    POP    BC        ;all done
  387.     POP    DE
  388.     POP    HL
  389.     RET
  390.  
  391. IOINIT    LD    A,IOINT        ;offset into bios jump table
  392.     LD    HL,(1)        ;address of bios in HL
  393.     LD    L,A        ;add offset
  394.     JP    GOHL        ;and go there with auto return
  395.  
  396. ; table of baud rate divisors for supported rates
  397.  
  398. BAUDTB:    DB    0,208,139,208,0,104    ; 110, 300, 450, 600, 710,1200
  399.     DB    52,26,13,0        ;2400,4800,9600,19200
  400.  
  401. BAUDTX:    DB    0,80h,80h,40h,0,40h
  402.     DB    40h,40h,40h,0
  403.  
  404. BSAVE1    DB    0        ;current setting from
  405. BSAVE2    DB    0        ;tables - uninitialized
  406.  
  407. ; Sign-on message
  408.  
  409. SYSVER:    LD    DE,SOMESG
  410.     LD    C,PRINT
  411.     CALL    MEX
  412.     RET
  413.  
  414. SOMESG:    DB    'Ampro Overlay Version '
  415.     DB    REV/10+'0'
  416.     DB    '.'
  417.     DB    REV MOD 10+'0'
  418.     DB    CR,LF
  419.     DB    CR,LF
  420.     DB    'Set Break and ^J@ Break enabled.'
  421.     DB    CR,LF,'$'
  422.  
  423. ; Newline on console
  424.  
  425. CRLF:    LD    A,CR
  426.     CALL    TYPE
  427.     LD    A,LF        ;fall into TYPE
  428.  
  429. ; type char in A on console
  430.  
  431. TYPE:    PUSH    HL        ;save 'em
  432.     PUSH    DE
  433.     PUSH    BC
  434.     LD    E,A        ;align output character
  435.     LD    C,CONOUT    ;print via MEX
  436.     CALL    MEX
  437.     POP    BC
  438.     POP    DE
  439.     POP    HL
  440.     RET
  441.  
  442. ; Data area
  443.  
  444. ;------------------------------------------------------------
  445.  
  446. ; The remainder of this overlay implements a very versatile
  447. ; SET command -- if you prefer not to write a SET for your
  448. ; modem, you may delete the code from here to the END statement.
  449.  
  450. ; Control is passed here after MEX parses a SET command.
  451.  
  452. SETCMD:    LD    C,SBLANK    ;any arguments?
  453.     CALL    MEX
  454.     JP    C,SETSHO    ;if not, go print out values
  455.     LD    DE,CMDTBL    ;parse command
  456.     CALL    TSRCH        ;from table
  457.     PUSH    HL        ;any address on stack
  458.     RET    NC        ;if we have one, execute it
  459.     POP    HL        ;nope, fix stack
  460.  
  461. SETERR:    LD    DE,SETEMS    ;print error
  462.     LD    C,PRINT
  463.     CALL    MEX
  464.     RET
  465.  
  466. SETEMS:    DB    CR,LF,'SET command error',CR,LF,'$'
  467.  
  468. ; SET command table ... note that tables are constructed of command-
  469. ; name (terminated by high bit=1) followed by word-data-value returned
  470. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  471. ; a binary zero.
  472.  
  473. ; Note that LOOKUP attempts to find the next item in the input stream
  474. ; in the table passed to it in HL ... if found, the table data item is
  475. ; returned in HL; if not found, LOOKUP returns carry set.
  476.  
  477. CMDTBL:    DB    '?'+80H        ;"set ?"
  478.     DW    STHELP
  479.     DB    'BAU','D'+80H    ;"set baud"
  480.     DW    STBAUD
  481.     DB    'BIT','S'+80H    ;"set bits"
  482.     DW    STBITS
  483.     DB    'PARIT','Y'+80H    ;"set parity"
  484.     DW    STPAR
  485.     DB    'STO','P'+80H    ;"set stop"
  486.     DW    STSTOP
  487.     DB    'SHAK','E'+80H    ;"set shake"
  488.     DW    STSHAK
  489.     DB    'BREA','K'+80H    ;1.2| "set break"
  490.     DW    SBREAK        ;1.2|
  491.  
  492.     DB    0        ;<<=== table terminator
  493.  
  494. ; SET <no-args>: print current statistics
  495.  
  496. SETSHO:    LD    HL,SHOTBL    ;get table of SHOW subroutines
  497. SETSLP:    LD    E,(HL)        ;get table address
  498.     INC    HL
  499.     LD    D,(HL)
  500.     INC    HL
  501.     LD    A,D        ;end of table?
  502.     OR    E
  503.     RET    Z        ;exit if so
  504.     PUSH    HL        ;save table pointer
  505.     EX    DE,HL        ;adrs to HL
  506.     CALL    GOHL        ;do it
  507.     CALL    CRLF        ;print newline
  508.     LD    C,CHEKCC    ;check for console abort
  509.     CALL    MEX
  510.     POP    HL        ;it's done
  511.     JP    NZ,SETSLP    ;continue if no abort
  512.     RET
  513.  
  514. GOHL:    JP    (HL)
  515.  
  516. ; table of SHOW subroutines
  517.  
  518. SHOTBL:    DW    BDSHOW
  519.     DW    BITSH
  520.     DW    PARSH
  521.     DW    STPSH
  522.     DW    SHKSH
  523.     DW    0        ;<<== table terminator
  524.  
  525. ; SET ?  processor
  526.  
  527. STHELP:    LD    DE,HLPMSG
  528.     LD    C,PRINT
  529.     CALL    MEX
  530.     RET
  531.  
  532. ; The help message
  533.  
  534. HLPMSG:    DB    CR,LF,'SET command, Ampro version:',CR,LF
  535.     DB    CR,LF,'  >SET BAUD 300, 450, 600, 1200, 2400, 4800, or 9600.'
  536.     DB    CR,LF,'  >SET BITS 5, 6, 7, or 8.'
  537.     DB    CR,LF,'  >SET PARITY ODD, EVEN, or NONE.'
  538.     DB    CR,LF,'  >SET STOP 1, or 2.'
  539.     DB    CR,LF,'  >SET SHAKE ON, or OFF.'
  540.     DB    CR,LF,'  >SET BREAK  (Only used from mex readfiles to send'
  541.     DB    CR,LF,'               break in an auto-logon environment.)'
  542.     DB    CR,LF,CR,LF,'$'
  543.  
  544. ; SET BAUD processor
  545.  
  546. STBAUD:    LD    C,BDPARS    ;function code
  547.     CALL    MEX        ;let MEX look up code
  548.     JP    C,SETERR    ;invalid code
  549.     CALL    PBAUD        ;no, try to set it
  550.     JP    C,SETERR    ;not-supported code
  551.  
  552. BDSHOW:    CALL    ILPRT        ;display baud
  553.     DB    '  Baud rate: ',0
  554.     LD    A,(MSPEED)
  555.     LD    C,PRBAUD    ;use MEX routine
  556.     CALL    MEX
  557.     RET
  558.  
  559. ; SET BITS processor
  560.  
  561. STBITS:    LD    DE,BITTBL    ;load lookup table
  562.     CALL    TSRCH        ;look for 7 or 8
  563.     JP    C,SETERR    ;if not found
  564.     LD    C,L        ;save selection value
  565.     LD    HL,(1)        ;get bios address
  566.     LD    L,SIOB3        ;move to siob+3
  567.     LD    A,(HL)        ;wr5 info 
  568.     AND    9Fh        ;mask
  569.     OR    C        ;add selection
  570.     LD    (HL),A        ;store it
  571.     LD    A,C        ;get selection
  572.     RLA
  573.     LD    C,A        ;shift selection left
  574.     LD    L,SIOB5        ;move to siob+5
  575.     LD    A,(HL)        ;wr3 info
  576.     AND    3Fh        ;mask
  577.     OR    C
  578.     LD    (HL),A        ;store it
  579.     CALL    IOINIT        ;do it.
  580.  
  581. BITSH:    CALL    ILPRT
  582.     DB    '  Data bits: ',0
  583.     LD    HL,(1)        ;get bios location
  584.     LD    L,SIOB3        ;move to siob+3
  585.     LD    A,(HL)        ;get current value
  586.     AND    60h
  587.     CP    60h
  588.     JP    Z,BITSH8
  589.     CP    20h
  590.     JP    Z,BITSH7
  591.     CP    40h
  592.     JP    Z,BITSH6
  593.     CALL    ILPRT
  594.     DB    '5',0        ;show a 5
  595.     RET
  596.  
  597. BITSH6    CALL    ILPRT
  598.     DB    '6',0        ;show a 6
  599.     RET
  600.  
  601. BITSH7    CALL    ILPRT
  602.     DB    '7',0        ;show a 7
  603.     RET
  604.  
  605. BITSH8:    CALL    ILPRT
  606.     DB    '8',0
  607.     RET
  608.  
  609. BITTBL:    DB    '5'+80h
  610.     DW    00h
  611.     DB    '6'+80h
  612.     DW    40h
  613.     DB    '7'+80h
  614.     DW    20h
  615.     DB    '8'+80h
  616.     DW    60h
  617.     DB    0
  618.  
  619. STPAR:    LD    DE,PARTBL
  620.     CALL    TSRCH
  621.     JP    C,SETERR
  622.     LD    C,L
  623.     LD    HL,(1)        ;get bios address
  624.     LD    L,SIOB1        ;go to siob+1
  625.     LD    A,(HL)
  626.     AND    0FCh
  627.     OR    C
  628.     LD    (HL),A
  629.     CALL    IOINIT
  630.  
  631. PARSH:    CALL    ILPRT
  632.     DB    '     Parity: ',0
  633.     LD    HL,(1)        ;get bios address
  634.     LD    L,SIOB1
  635.     LD    A,(HL)
  636.     AND    03h        ;mask
  637.     CP    01h        ;check for none
  638.     JP    Z,PARSHO
  639.     CP    03h
  640.     JP    Z,PARSHE
  641.  
  642.     CALL    ILPRT
  643.     DB    'none',0
  644.     RET
  645.  
  646. PARSHO    CALL    ILPRT
  647.     DB    'odd',0
  648.     RET
  649.  
  650. PARSHE:    CALL    ILPRT
  651.     DB    'even',0
  652.     RET
  653.  
  654. PARTBL:    DB    'OD','D'+80h
  655.     DW    01h
  656.     DB    'EVE','N'+80h
  657.     DW    03h
  658.     DB    'NON','E'+80h
  659.     DW    00h
  660.     DB    0
  661.  
  662. STSTOP:    LD    DE,STPTBL
  663.     CALL    TSRCH
  664.     JP    C,SETERR
  665.     LD    C,L
  666.     LD    HL,(1)        ;get bios address
  667.     LD    L,53h        ;shift to bios+1
  668.     LD    A,(HL)
  669.     AND    0F3h
  670.     OR    C
  671.     LD    (HL),A
  672.     CALL    IOINIT
  673.  
  674. STPSH:    CALL    ILPRT
  675.     DB    '  Stop bits: ',0
  676.     LD    HL,(1)        ;get bios address
  677.     LD    L,53h        ;shift to bios+1
  678.     LD    A,(HL)
  679.     AND    0Ch
  680.     CP    0Ch
  681.     JP    Z,STPSH2
  682.     CALL    ILPRT
  683.     DB    '1',0
  684.     RET
  685.  
  686. STPSH2:    CALL    ILPRT
  687.     DB    '2',0
  688.     RET
  689.  
  690. STPTBL:    DB    '1'+80h
  691.     DW    04h
  692.     DB    '2'+80h
  693.     DW    0Ch
  694.     DB    0
  695.  
  696. STSHAK:    LD    DE,SHKTBL    ;get handshake table
  697.     CALL    TSRCH        ;search it for parameter
  698.     JP    C,SETERR    ;if not found
  699.     LD    C,L        ;temp store value in C
  700.     LD    HL,(1)        ;get location of BIOS
  701.     LD    L,6Dh        ;location of HSB in bios
  702.     LD    (HL),C        ;put new value in it
  703.  
  704. SHKSH:    CALL    ILPRT
  705.     DB    ' Hand Shake: ',0
  706.     LD    HL,(1)        ;get bios location
  707.     LD    L,6DH        ;location of HSB in bios
  708.     LD    A,(HL)        ;get current value
  709.     CP    1
  710.     JP    Z,SHKSHY    ;show a yes
  711.     CALL    ILPRT
  712.     DB    'off',0
  713.     RET
  714.  
  715. SHKSHY    CALL    ILPRT
  716.     DB    'on',0
  717.     RET
  718.  
  719. SHKTBL    DB    'OF','F'+80h
  720.     DW    0
  721.     DB    'O','N'+80h
  722.     DW    1
  723.     DB    0
  724.  
  725. ;----------------------------------------------------------
  726.  
  727. ; This routine sends a 300 ms break.    1.2| vv
  728. ;
  729. SBREAK:    LD    HL,(1)        ;HL = A(bios jump table)
  730.     LD    L,SIOB3        ;offset to memory image of SIO reg 5
  731.     LD    A,(HL)        ;get memory image
  732.     PUSH    HL
  733.     PUSH    AF        ;save address and original value for later
  734.     OR    10H        ;set SEND BREAK bit in SIO reg 5
  735.     LD    (HL),A        ;put it back in memory
  736.     CALL    IOINIT        ;update SIO so it sends break
  737.     LD    DE,BRKMSG    ;Tell user about break
  738.     LD    C,PRINT
  739.     CALL    MEX
  740.     LD    B,3        ;leave break on for 300 ms
  741.     LD    C,TIMER
  742.     CALL    MEX
  743.     POP    AF        ;restore original value of
  744.     POP    HL        ;...memory image of SIO reg 5
  745.     LD    (HL),A
  746.     CALL    IOINIT        ;update SIO
  747.     RET
  748.  
  749. BRKMSG:    DB    '[Sending Break]','$'
  750.  
  751. ;----------------------------------------------------------
  752.  
  753. ; Compare next input-stream item in table @DE; CY=1
  754. ; if not found, else HL=matched data item
  755.  
  756. TSRCH:    LD    C,LOOKUP    ;get function code
  757.     JP    MEX        ;pass to MEX processor
  758.  
  759. ; Print in-line message ... blows away C register
  760.  
  761. ILPRT:    LD    C,ILP        ;get function code
  762.     JP    MEX        ;go do it
  763.  
  764. ;------------------------------------------------------------
  765.  
  766. ; End of AMPRO MEX modem overlay
  767.  
  768. ;------------------------------------------------------------
  769.  
  770.     END
  771.