home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / mex / mxh-am11.asm < prev    next >
Assembly Source File  |  1994-07-13  |  20KB  |  713 lines

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