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

  1.     Title    'MEX overlay for the Epson QX-10, version 1.0'
  2. ;
  3. ;
  4. ; (delete above title line if not assembling with MAC)
  5. ;
  6. ;
  7. REV    EQU    10        ;overlay revision level
  8. ;
  9. ; MEX Epson QX-10 (CP/M-80) overlay, version 1.0
  10. ;           04 July 84, Chatland Whitmore
  11. ; Adapted from:
  12. ;  MEX PMMI OVERLAY VERSION 1.0: written 04/27/84 by Ron Fowler
  13. ;  and M712QS.ASM by Bruce Ratoff, 10/13/83
  14. ;
  15. ;------------------------------------------------------------
  16. ;
  17. ; Misc equates
  18. ;
  19. NO    EQU    0
  20. YES    EQU    0FFH
  21. TPA    EQU    100H
  22. CR    EQU    13
  23. LF    EQU    10
  24. TAB    EQU    9
  25. ESC    EQU    1BH
  26. ;
  27. ; QX-10 port definitions
  28. ;
  29. PORT    EQU    011H        ;QX-10 base port 
  30. MODCT1    EQU    PORT+2        ;modem control port
  31. MODDAT    EQU    PORT        ;modem data port
  32. ;
  33. BRPRTS    EQU    007H        ;baud rate setup port
  34. BRPRTC    EQU    006H        ;baud rate counter port
  35. BRSET    EQU    0B6H        ;command to setup baud rate
  36. CRAM    EQU    23H        ;CMOS ram baud rate offset location
  37. MOSADR    EQU    3DH        ;CMOS ram address port
  38. MOSDAT    EQU    3CH        ;CMOS ram data port
  39. ;
  40. ;
  41. ; QX-10 bit definitions
  42. ;
  43. MDRCVB    EQU    01H        ;modem receive bit (DAV)
  44. MDRCVR    EQU    01H        ;modem receive ready
  45. MDSNDB    EQU    04H        ;modem send bit
  46. MDSNDR    EQU    04H        ;modem send ready bit
  47. MDDCDB    EQU    08H        ;modem dcd bit
  48. ;
  49. ; MEX service processor stuff ... MEX supports an overlay service
  50. ; processor, located at 0D00H (and maintained at this address from
  51. ; version to version).  If your overlay needs to call BDOS for any
  52. ; reason, it should call MEX instead; function calls below about
  53. ; 240 are simply passed on to the BDOS (console and list I/O calls
  54. ; are specially handled to allow modem port queueing, which is why
  55. ; you should call MEX instead of BDOS).  MEX uses function calls
  56. ; above about 244 for special overlay services (described below).
  57. ;
  58. ; Some sophisticated overlays may need to do file I/O; if so, use
  59. ; the PARSFN MEX call with a pointer to the FCB in DE to parse out
  60. ; the name.  This FCB should support a spare byte immediately pre-
  61. ; ceeding the actual FCB (to contain user # information).  If you've
  62. ; used MEX-10 for input instead of BDOS-10 (or you're parsing part
  63. ; of a SET command line that's already been input), then MEX will
  64. ; take care of DU specs, and set up the FCB accordingly.  There-
  65. ; after all file I/O calls done through the MEX service processor
  66. ; will handle drive and user with no further effort necessary on
  67. ; the part of the programmer.
  68. ;
  69. MEX    EQU    0D00H        ;address of the service processor
  70. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  71. TIMER    EQU    254        ;delay 100ms * reg B
  72. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  73. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  74. SNDRDY    EQU    251        ;test for modem-send ready
  75. RCVRDY    EQU    250        ;test for modem-receive ready
  76. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  77. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  78. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  79. PARSFN    EQU    246        ;parse filename from input stream
  80. BDPARS    EQU    245        ;parse baud-rate from input stream
  81. SBLANK    EQU    244        ;scan input stream to next non-blank
  82. EVALA    EQU    243        ;evaluate numeric from input stream
  83. LKAHED    EQU    242        ;get nxt char w/o removing from input
  84. GNC    EQU    241        ;get char from input, cy=1 if none
  85. ILP    EQU    240        ;inline print
  86. DECOUT    EQU    239        ;decimal output
  87. PRBAUD    EQU    238        ;print baud rate
  88. ;
  89. ;
  90. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  91. PRINT    EQU    9        ;simulated BDOS function 9: print string
  92. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  93. ;
  94.     ORG    TPA        ;we begin
  95. ;
  96. ;
  97.     DS    3        ;MEX has a JMP START here
  98. ;
  99. ; The following variables are located at the beginning of the program
  100. ; to facilitate modification without the need of re-assembly. They will
  101. ; be moved in MEX 2.0.
  102. ;
  103. PMODEM:    DB    no        ;yes=PMMI modem \ / These 2 locations are not
  104. SMODEM:    DB    yes        ;yes=Smartmodem / \ referenced by MEX
  105. TPULSE:    DB    'T'        ;T=touch, P=pulse (not referenced by MEX)
  106. CLOCK:    DB    40        ;clock speed x .1, up to 25.5 mhz.
  107. MSPEED:    DB    5        ;sets display time for sending a file
  108.                 ;0=110    1=300  2=450  3=600  4=710
  109.                 ;5=1200 6=2400 7=4800 8=9600 9=19200
  110. BYTDLY:    DB    5        ;default time to send character in
  111.                 ;terminal mode file transfer (0-9)
  112.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  113. CRDLY:    DB    5        ;end-of-line delay after CRLF in terminal
  114.                 ;mode file transfer for slow BBS systems
  115.                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  116. COLUMS:    DB    5        ;number of directory columns
  117. SETFL:    DB    YES        ;yes=user-defined SET command
  118. SCRTST:    DB    yes        ;yes=if home cursor and clear screen
  119.                 ;routine at CLRSCRN
  120.     DB    0        ;was once ACKNAK, now spare
  121. BAKFLG:    DB    yes        ;yes=make .BAK file
  122. CRCDFL:    DB    YES        ;yes=default to CRC checking
  123.                 ;no=default to Checksum checking
  124. TOGCRC:    DB    YES        ;yes=allow toggling of Checksum to CRC
  125. CVTBS:    DB    NO        ;yes=convert backspace to rub
  126. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub
  127. ADDLF:    DB    NO        ;no=no LF after CR to send file in
  128.                 ;terminal mode (added by remote echo)
  129. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR
  130. TRNLOG:    DB    NO        ;yes=allow transmission of logon
  131.                 ;write logon sequence at location LOGON
  132. SAVCCP:    DB    YES        ;yes=do not overwrite CCP
  133. LOCNXT:    DB    NO        ;yes=local cmd if EXTCHR precedes
  134.                 ;no=not local cmd if EXTCHR precedes
  135. TOGLOC:    DB    YES        ;yes=allow toggling of LOCNXTCHR
  136. LSTTST:    DB    YES        ;yes=allow toggling of printer on/off
  137.                 ;in terminal mode. Set to no if using
  138.                 ;the printer port for the modem
  139. XOFTST:    DB    NO        ;yes=allow testing of XOFF from remote
  140.                 ;while sending a file in terminal mode
  141. XONWT:    DB    NO        ;yes=wait for XON after sending CR while
  142.                 ;transmitting a file in terminal mode    
  143. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF testing
  144. IGNCTL:    DB    yes        ;yes=do not send control characters
  145.                 ;above CTL-M to CRT in terminal mode
  146.                 ;no=send any incoming CTL-char to CRT
  147. EXTRA1:    DB    0        ;for future expansion
  148. EXTRA2:    DB    0        ;for future expansion
  149. BRKCHR:    DB    '@'-40H        ;^@ = Send a 300 ms. break tone
  150. NOCONN:    DB    'N'-40H        ;^N = Disconnect from phone line
  151. LOGCHR:    DB    'L'-40H        ;^L = Send logon
  152. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer
  153. UNSVCH:    DB    'R'-40H        ;^R = Close input text buffer
  154. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote
  155. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer
  156. EXTCHR:    DB    '^'-40H        ;^^ = Send next character
  157. ;
  158.     DS    2        ;(some PMMI stuff was here)
  159. ;
  160. ; Low-level modem I/O routines: this will be replaced with
  161. ; a jump table in MEX 2.0 (you can insert jumps here to longer
  162. ; routines if you'd like ... I'd recommend NOT putting part of
  163. ; a routine in this area, then jumping to the rest of the routine
  164. ; in the non-fixed area; that will complicate the 2.0 conversion)
  165. ;
  166. INCTL1:    IN    MODCT1        ;in modem control port
  167.     RET
  168.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  169. ;
  170. OTDATA:    OUT    MODDAT        ;out modem data port
  171.     RET
  172.     DB    0,0,0,0,0,0,0    ;spares if needed for non=PMMI
  173. ;
  174. INPORT:    IN    MODDAT        ;in modem data port
  175.     RET
  176.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  177. ;
  178. ; Bit-test routines.  These will be merged with the above
  179. ; routines in MEX 2.0 to provide a more reasonable format
  180. ;
  181. MASKR:    ANI MDRCVB ! RET    ;bit to test for receive ready
  182. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready
  183. MASKS:    ANI MDSNDB ! RET    ;bit to test for send ready
  184. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready
  185. ;
  186. ;
  187. ; Unused area: was once used for special PMMI functions,
  188. ; Now used only to retain compatibility with MDM overlays.
  189. ; You may use this area for any miscellaneous storage you'd
  190. ; like but the length of the area *must* be 12 bytes.
  191. ;
  192.     DS    12
  193. ;
  194. ; Special modem function jump table: if your overlay cannot handle
  195. ; some of these, change the jump to "DS 3", so the code present in
  196. ; MEX will be retained.  Thus, if your modem can't dial, change the
  197. ; JMP PDIAL at DIALV to DS 3, and MEX will print a "not-implemented"
  198. ; diagnostic for any commands that require dialing.
  199. ;
  200. ; DIALV  dials the digit in A. See the comments at PDIAL for specs.
  201. ;
  202. ; DISCV  disconnects the modem
  203. ;
  204. ; GOODBV is called just before MEX exits to CP/M.  If your overlay
  205. ;        requires some exit cleanup, do it here.
  206. ;
  207. ; INMODV is called when MEX starts up; use INMODV to initialize the modem.
  208. ;
  209. ; NEWBDV is used for phone-number baud rates and is called with a baud-rate
  210. ;        code in the A register, value as follows:
  211. ;
  212. ;     A=0:   110 baud       A=1:   300 baud      A=2:   450 baud
  213. ;     A=3:   600 baud       A=4:   710 baud      A=5:  1200 baud
  214. ;     A=6:  2400 baud       A=7:  4800 baud      A=8:  9600 baud
  215. ;     A=9: 19200 baud
  216. ;
  217. ;        If your overlay supports the passed baud rate, it should store the
  218. ;     value passed in A at MSPEED (107H), and set the requested rate. If
  219. ;     the value passed is not supported, you should simply return (with-
  220. ;     out modifying MSPEED) -or- optionally request a baud-rate from the
  221. ;     user interactively.
  222. ;
  223. ; NOPARV is called at the end of each file transfer; your overlay may simply
  224. ;     return here, or you may want to restore parity if you set no-parity
  225. ;     in the following vector (this is the case with the PMMI overlay).
  226. ;     
  227. ; PARITV is called at the start of each file transfer; your overlay may simply
  228. ;     return here, or you may want to enable parity detection (this is the
  229. ;     case with the PMMI overlay).
  230. ;
  231. ; SETUPV is the user-defined command ... to use this routine to build your own
  232. ;     MEX command, set the variable SETFL (117H) non-zero, and add your SET
  233. ;     code.  You can use the routine presented in the PMMI overlay as a 
  234. ;     guide for parsing, table lookup, etc.
  235. ;
  236. ; SPMENU is provided only for MDM compatibility, and is not used by MEX 1.0 for
  237. ;     any purpose (it will be gone in MEX 2).
  238. ;
  239. ; VERSNV is called immediately after MEX prints its sign-on message at cold
  240. ;     startup -- use this to identify your overlay in the sign-on message
  241. ;     (include overlay version number in the line).
  242. ; BREAKV is provided for sending a BREAK (<ESC>-B in terminal mode).  If your
  243. ;     modem doesn't support BREAK, or you don't care to code a BREAK rou-
  244. ;     tine, you may simply execute a RET instruction.
  245. ;
  246. LOGON:    DS    2        ;needed for MDM compat, not ref'd by MEX
  247. DIALV:    JMP    PDIAL        ;dial digit in A (see info at PDIAL)
  248. DISCV:    JMP    PDISC        ;disconnect the modem
  249. GOODBV:    JMP    DUMMY        ;called before exit to CP/M
  250. INMODV:    JMP    NITMOD        ;initialization. Called at cold-start
  251. NEWBDV:    JMP    PBAUD        ;set baud rate
  252. NOPARV:    JMP    NOPAR        ;set modem for no-parity
  253. PARITV:    JMP    PARITY        ;set modem parity
  254. SETUPV:    JMP    SETCMD        ;SET cmd: jump to a RET if you don't write SET
  255. SPMENV:    DS    3        ;not used with MEX
  256. VERSNV:    JMP    SYSVER        ;Overlay's voice in the sign-on message
  257. BREAKV:    DS    3        ;send a break   *** DISABLED ***
  258. ;
  259. ; The following jump vector provides the overlay with access to special
  260. ; routines in the main program (retained and supported in the main pro-
  261. ; gram for MDM overlay compatibility). These should not be modified by
  262. ; the overlay.
  263. ;
  264. ; Note that for MEX 2.0 compatibility, you should not try to use these
  265. ; routines, since this table will go away with MEX 2.0 (use the MEX
  266. ; service call processor instead).
  267. ;
  268. ILPRTV:    DS    3        ;replace with MEX function 9
  269. INBUFV:    DS    3        ;replace with MEX function 10
  270. ILCMPV:    DS    3        ;replace with table lookup funct. 247
  271. INMDMV:    DS    3        ;replace with MEX function 255
  272. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  273. TIMERV:    DS    3        ;replace with MEX function 254
  274. ;
  275. ;
  276. ; Clear/screen and clear/end-of-screen. Each routine must use the
  277. ; full 9 bytes alloted (may be padded with nulls).
  278. ;
  279. ; These routines (and other screen routines that MEX 2.0 will sup-
  280. ; port) will be accessed through a jump table in 2.0, and will be
  281. ; located in an area that won't tie the screen functions to the
  282. ; modem overlay (as the MDM format does).
  283. ;
  284. CLREOS:    LXI    D,EOSMSG
  285.     MVI    C,PRINT
  286.     CALL    MEX
  287.     RET
  288. ;
  289. ;
  290. CLS:    LXI    D,CLSMSG    
  291.     MVI    C,PRINT
  292.     CALL    MEX
  293.     RET
  294. ;
  295. ;------------------------------------------------------------
  296. ;
  297. ;    *** END OF FIXED FORMAT AREA ***
  298. ;
  299. ;------------------------------------------------------------
  300. ;
  301. ; modem port initialization
  302. ;
  303. NITMOD:    CALL    GTBAUD        ;adjust mspeed to QX-10's stored value
  304.     CALL    SIONIT        ;send out default SIO initialization
  305.     RET
  306. ;
  307. ;-------------------------------------------------------------
  308. ;
  309. ; send-break routine
  310. ;
  311. PBREAK:    RET
  312. ;
  313. ;-------------------------------------------------------------
  314. ;
  315. ; setup for odd/even parity.
  316. ;
  317. PARITY:    RET
  318. ;
  319. ;-------------------------------------------------------------
  320. ; set no-parity
  321. ;
  322. NOPAR:    RET
  323. ;
  324. ;-------------------------------------------------------------
  325. ;
  326. ; disconnect the modem
  327. ;
  328. PDISC:    RET
  329. ;
  330. ;-------------------------------------------------------------
  331. ;
  332. ; exit routine
  333. ;
  334. DUMMY:    RET
  335. ;
  336. ;-------------------------------------------------------------
  337. ;
  338. ; dial routine
  339. ;
  340. PDIAL:    RET
  341. ;
  342. ;------------------------------------------------------------
  343. ;
  344. ; Set baud-rate code in A (if supported by your overlay).
  345. ; NOTE: this routine (i.e.; the one vectored through NEWBDV) 
  346. ; should update MSPEED with the passed code, but ONLY if 
  347. ; that rate is supported by the hardware.
  348. ;
  349. PBAUD:    PUSH    H        ;don't alter anybody
  350.     PUSH    D
  351.     PUSH    B
  352.     MOV    E,A        ;code to DE
  353.     MVI    D,0
  354.     LXI    H,BAUDTB    ;offset into table
  355.     DAD    D
  356.     MOV    A,M        ;fetch code
  357.     CPI    0FFH        ;0FFH? (means unsupported code)
  358.     STC            ;return error for STBAUD caller
  359.     JZ    PBEXIT        ;exit if so
  360.     ORA    A        ;clear the carry flag
  361.     CALL    FNDRAT        ;go set up baud rate
  362.     MOV    A,E        ;get speed code back
  363.     STA    MSPEED        ;make it current
  364. PBEXIT:    POP    B        ;all done
  365.     POP    D
  366.     POP    H
  367.     RET
  368. ;
  369. ; table of QX-10 modem port baud rate codes for each MSPEED value.
  370. ;
  371. BAUDTB:    DB    0    ;  110 baud --> QX-10 code = 0
  372.     DB    3    ;  300                       3
  373.     DB    9    ;  450                       9
  374.     DB    4    ;  600                 4
  375.     DB    0FFH    ;  710                 n/a
  376.     DB    5    ; 1200                 5
  377.     DB    6    ; 2400                 6
  378.     DB    7    ; 4800                 7
  379.     DB    8    ; 9600                 8
  380.     DB    0FFH    ;19200                 n/a
  381. ;
  382. ;----------------------------------------------------------------
  383. ;
  384. ; enter here with QX-10 baud rate code in A.
  385. ;
  386. FNDRAT:
  387.     MOV    C,A        ;save baud rate code in C
  388.     ADD    A        ;double the baud rate code
  389.     LXI    H,DIVTBL    ;add result to table address
  390.     ADD    L        ;     and leave result in HL
  391.     MOV    L,A
  392.     JNC    FNDRT2
  393.     INR    H
  394. FNDRT2:
  395.     MVI    A,BRSET        ;tell system we want to set up
  396.     OUT    BRPRTS        ;   baud rate divisor
  397.     MOV    A,M        ;get low order byte
  398.     OUT    BRPRTC        ;   and send to counter
  399.     INX    H
  400.     MOV    A,M        ;do same for high order byte
  401.     OUT    BRPRTC
  402.     CALL    INPORT        ;flush modem port
  403.     CALL    INPORT
  404.     MVI    A,CRAM        ;prepare to set QX-10 baud value
  405.     DI            ;MUST disable interrupts now
  406.     OUT    MOSADR        ;ask for access to CMOS ram
  407.     MOV    A,C        ;recall the baud rate code
  408.     OUT    MOSDAT        ;send it to CMOS ram
  409.     EI            ;don't forget to restore interrupts
  410.     RET
  411. ;
  412. ; table of timer chip divisors for each QX-10 baud rate code.
  413. ;
  414. DIVTBL:
  415.     DW    1135     ; 0 =   110 baud
  416.     DW    928    ; 1 =   135      \  not used
  417.     DW    832    ; 2 =   150      /  by MEX
  418.     DW    416    ; 3 =   300
  419.     DW    208    ; 4 =   600
  420.     DW    104    ; 5 =  1200
  421.     DW    52    ; 6 =  2400
  422.     DW    26    ; 7 =  4800
  423.     DW    13    ; 8 =  9600
  424.     DW    277    ; 9 =   450
  425. ;
  426. ;---------------------------------------------------------------
  427. ;
  428. ; get baud rate of QX-10 modem port and translate to MSPEED value.
  429. ;
  430. GTBAUD:
  431.     MVI    A,CRAM
  432.     OUT    MOSADR
  433.     IN    MOSDAT
  434.     ANI    0FH
  435.     LXI    H,MSPTBL
  436.     ADD    L
  437.     MOV    L,A
  438.     JNC    STMSP2
  439.     INR    H
  440. STMSP2:
  441.     MOV    A,M
  442.     STA    MSPEED
  443.     RET
  444. ;
  445. ; table of MSPEED values for each possible QX-10 baud rate.
  446. ;
  447. MSPTBL:
  448.     DB    0    ; 110 baud
  449.     DB    0    ; 135      \  QX-10 possible baud rates not
  450.     DB    0    ; 150      /  supported with MSPEED values
  451.     DB    1    ; 300
  452.     DB    3    ; 600
  453.     DB    5    ;1200
  454.     DB    6    ;2400
  455.     DB    7    ;4800
  456.     DB    8    ;9600
  457.     DB    2    ; 450
  458. ;
  459. ;-----------------------------------------------------------
  460. ;
  461. SIONIT:
  462.     PUSH    H
  463.     MVI    C,MODCT1    ;modem control port
  464.     MVI    B,MINLEN    ;length of modem init table
  465.     LXI    H,MINTBL    ;point to init table
  466.     DB    0EDH,0B3H    ;OUTIR the init table (Z80 code)
  467.     POP    H
  468.     RET
  469. ;
  470. MINTBL    DB    4        ;select write register 4
  471.     DB    44H        ;X1 clock mode, 1 stop, no parity
  472.     DB    3        ;select register 3
  473.     DB    0C1H        ;Rx: 8 bit word, Rx enabled
  474.     DB    5        ;select register 5
  475.     DB    0EAH        ;Tx: 8 bit word, DTR & RTS set
  476. MINLEN    EQU    $-MINTBL
  477. ;
  478. ;----------------------------------------------------------------
  479. ;
  480. ; Sign-on message
  481. ;
  482. SYSVER:    LXI    D,SOMESG
  483.     MVI    C,PRINT
  484.     CALL    MEX
  485.     RET
  486. ;
  487. ;------------------------------------------------------------
  488. ;
  489. ; Data area
  490. ;
  491. EOSMSG:    DB    ESC,'Y','$'    ;clear to end-of-screen
  492. CLSMSG:    DB    ESC,'+','$'    ;clear whole screen
  493. SOMESG:    DB    'Epson QX-10 (CP/M-80) overlay V. '
  494.     DB    REV/10+'0'
  495.     DB    '.'
  496.     DB    REV MOD 10+'0'
  497.     DB    CR,LF,'$'
  498. ;
  499. ;------------------------------------------------------------
  500. ;
  501. ; The remainder of this overlay implements a SET command -- if 
  502. ; you prefer not to write a SET for your modem, you may delete 
  503. ; the code from here to the END statement.
  504. ;
  505. ;
  506. ; Control is passed here after MEX parses a SET command.
  507. ;
  508. SETCMD:    MVI    C,SBLANK    ;any arguments?
  509.     CALL    MEX
  510.     JC    SETSHO        ;if not, go print out values
  511.     LXI    D,CMDTBL    ;parse command
  512.     CALL    TSRCH        ;from table
  513.     PUSH    H        ;any address on stack
  514.     RNC            ;if we have one, execute it
  515.     POP    H        ;nope, fix stack
  516. SETERR:    LXI    D,SETEMS    ;print error
  517.     MVI    C,PRINT
  518.     CALL    MEX
  519.     RET
  520. ;
  521. SETEMS:    DB    CR,LF,'SET command error',CR,LF,'$'
  522. ;
  523. ; SET command table ... note that tables are constructed of command-
  524. ; name (terminated by high bit=1) followed by word-data-value returned
  525. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  526. ; a binary zero.
  527. ;
  528. ; Note that LOOKUP attempts to find the next item in the input stream
  529. ; in the table passed to it in HL ... if found, the table data item is
  530. ; returned in HL; if not found, LOOKUP returns carry set.
  531. ;
  532. CMDTBL:    DB    '?'+80H            ;"set ?"
  533.     DW    STHELP
  534.     DB    'BAU','D'+80H        ;"set baud"
  535.     DW    STBAUD
  536. ;
  537.     DB    0        ;<<=== table terminator
  538. ;
  539. ; SET <no-args>: print current statistics
  540. ;
  541. SETSHO:    LXI    H,SHOTBL    ;get table of SHOW subroutines
  542. SETSLP:    MOV    E,M        ;get table address
  543.     INX    H
  544.     MOV    D,M
  545.     INX    H
  546.     MOV    A,D        ;end of table?
  547.     ORA    E
  548.     RZ            ;exit if so
  549.     PUSH    H        ;save table pointer
  550.     XCHG            ;adrs to HL
  551.     CALL    GOHL        ;do it
  552.     CALL    CRLF        ;print newline
  553.     MVI    C,CHEKCC    ;check for console abort
  554.     CALL    MEX
  555.     POP    H        ;it's done
  556.     JNZ    SETSLP        ;continue if no abort
  557.     RET
  558. ;
  559. GOHL:    PCHL
  560. ;
  561. ; table of SHOW subroutines
  562. ;
  563. SHOTBL:    DW    BDSHOW
  564.     DW    0        ;<<== table terminator
  565. ;
  566. ; SET ?  processor
  567. ;
  568. STHELP:    LXI    D,HLPMSG
  569.     MVI    C,PRINT
  570.     CALL    MEX
  571.     RET
  572. ;
  573. ; The help message
  574. ;
  575. HLPMSG:    DB    CR,LF
  576.     DB    'SET command, Epson QX-10 version:',CR,LF,LF
  577.     DB    'Baud rates:   110    300    450    600',CR,LF
  578.     DB    '             1200   2400   4800   9600',CR,LF,LF
  579.     DB    'Example:  SET BAUD 300',CR,LF,LF
  580.     DB    '$'
  581. ;
  582. ;---------------------------------------------------------------------
  583. ;
  584. ; SET BAUD processor
  585. ;
  586. STBAUD:    MVI    C,BDPARS    ;function code
  587.     CALL    MEX        ;let MEX look up code
  588.     JC    SETERR        ;invalid code
  589.     CALL    PBAUD        ;no, try to set it
  590.     JC    SETERR        ;not-supported code
  591. BDSHOW:    CALL    ILPRT        ;display baud
  592.     DB    'Baud rate:',TAB,' ',0
  593.     LDA    MSPEED
  594.     MVI    C,PRBAUD    ;use MEX routine
  595.     CALL    MEX
  596.     RET
  597. ;
  598. ;
  599. ; Compare next input-stream item in table @DE; CY=1
  600. ; if not found, else HL=matched data item
  601. ;
  602. TSRCH:    MVI    C,LOOKUP    ;get function code
  603.     JMP    MEX        ;pass to MEX processor
  604. ;
  605. ; Print in-line message ... blows away C register
  606. ;
  607. ILPRT:    MVI    C,ILP        ;get function code
  608.     JMP    MEX        ;go do it
  609. ;
  610. ;-------------------------------------------------------
  611. ;
  612. ; new line on console
  613. ;
  614. CRLF:    MVI    A,CR
  615.     CALL    TYPE
  616.     MVI    A,LF        ;and fall into TYPE
  617. ;
  618. ; type char in A on console
  619. ;
  620. TYPE:    PUSH    H        ;save 'em
  621.     PUSH    D
  622.     PUSH    B
  623.     MOV    E,A        ;align output character
  624.     MVI    C,CONOUT    ;print via MEX
  625.     CALL    MEX
  626.     POP    B
  627.     POP    D
  628.     POP    H
  629.     RET
  630. ;
  631. ;------------------------------------------------------------
  632. ;
  633. ; End of Epson QX-10 MEX modem overlay
  634. ;
  635. ;------------------------------------------------------------
  636. ;
  637.     END
  638.