home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / mex / mxo-z321.asm < prev    next >
Assembly Source File  |  1994-07-13  |  25KB  |  726 lines

  1. ; MEX ZEUS 3 OVERLAY VERSION 2.1
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;
  4. ;  MXO-Z321.ASM   This is an OSM Zeus 3 overlay for Modem Executive.
  5. ;            (author: Philp LaViscount of RAM (404/768-6136))
  6. ;    
  7. ;    Updated to add Break key simulation in terminal mode.
  8. ;        It should be noted that the same program should
  9. ;        function perfectly well for OSM Zeus 4 and 3X hardware,
  10. ;        with the exception that the clocks are all set by
  11. ;        hardware (no CTC's) hence Baud rates cannot be altered
  12. ;        dynamically.  [8/2/84 by PLV]
  13. ;
  14. ;    This second version includes some cleanups and a working interface
  15. ;        to MXO-SM11.ASM by R.G. Fowler (including Mark Pulver's
  16. ;        fix for extended numeric return codes). [8/1/84 by PLV]
  17. ;        Note: for some unknown reason, module only worked when
  18. ;        created in 2 steps-
  19. ;        MLOAD21 Z3MEX2.COM=MEX10.COM,MXO-Z320.HEX
  20. ;        MLOAD21 Z3MEX20.COM=Z3MEX2.COM,MXO-SM12.HEX
  21. ;        Also note that the values assembled in will need to be
  22. ;        changed for specific situations (e.g. user who wants
  23. ;        to allow control chars for terminal emulation), in 
  24. ;        order to prevent confusion arising from lost ini.mex
  25. ;        files or lost clones.....
  26. ;
  27. ;    This is the first version of an overlay for the recently introduced
  28. ;        MEX program (version 1.0) designed for the Zeus-3.  Since
  29. ;        it is derived entirely from the 2.0 version of the Kaypro 2
  30. ;        overlay by B. Grier, the entire comments of the KP20
  31. ;        version are preserved here. The modifications at this point 
  32. ;        consist solely of changes to port addresses and command 
  33. ;        strings which are device specific. [6/4/84 by PLV]
  34. ;
  35. ;         This is an almost complete rewrite of the Kaypro overlay. Modem 
  36. ;    Executive provides more overlay space, so I have taken the opportunity
  37. ;    to make the code more modular and more structured.  This should
  38. ;       make future maintaince easier.  I despised digging through the old
  39. ;    "spaghetti" code to make changes or enhancements.
  40. ;
  41. ;    Several structural changes have been made.  First, I implemented
  42. ;    PDISC, which permits disconneting from a modem by dropping DTR.
  43. ;    Of course, you have to have a modem that responds to DTR for this
  44. ;    to be of much use, but if you do, it is very much faster than 
  45. ;       waiting for the "+++", etc., needed to close out a Hayes
  46. ;    Smartmodem. See the PDISC module below, and the Smartmodem overlay
  47. ;    for instructions on how to implement.
  48. ;
  49. ;    Second, MSPEED is now the total control point for modem    speed. 
  50. ;    In the old version, contrary to some expectations, the value of
  51. ;    MSPEED set in the EQU's would not come up on intitalization.
  52. ;    Now it should. In general, to change baudrate now, just change
  53. ;    MSPEED and call NITMOD. Or use PBAUD.
  54. ;
  55. ;    Third, I have put all baudrate/sio initialization constants
  56. ;    into a separate data table. This makes them eaiser to find
  57. ;    and modify, as well as lets initialization go smoother (a
  58. ;    loop is used). Having the separate i/o data table will also
  59. ;    make it easier to add fetaures such as the capability to change
  60. ;    bits/character or parity conditions.  Your module need only
  61. ;    change the values in the table and call NITMOD.
  62. ;
  63. ;    Fourth, I have brought the baudrate/sio initialization into
  64. ;    agreement with Kaypro standards which specify the sio to be 
  65. ;    disabled via 'channel reset' while baudrate is changed.  I have
  66. ;    never had any problem with the old code, but since it is being
  67. ;    redone, why not do it right?
  68. ;
  69. ;                        Brown Grier
  70. ;                        312/690-0359
  71. ;                        5/30/84
  72. ;
  73. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  74. ;
  75. ; Misc equates
  76. ;
  77. NO    EQU    0
  78. YES    EQU    0FFH
  79. TPA    EQU    100H
  80. CR    EQU    13
  81. LF    EQU    10
  82. TAB    EQU    9
  83. ;
  84. ; Port Definitions
  85. ;
  86. ;PORT    EQU    004H        ;Kaypro base port (data or status)[plv:v1.0]
  87. ;
  88. ;    Zeus-3 uses the user serial printer port for modem connect[plv:v1.0]
  89. ;
  90. ;    All following values taken from MUSE System Manager Reference Manual
  91. ;        (OSM Doc: 10002, copyright 1983) pp. 2-19,2-20; values
  92. ;        presumed valid for MUSE v4.01 and v4.50           [plv:v1.0]
  93. MODCT1    EQU    03H        ;modem control port               [plv:v1.0]
  94. MODDAT    EQU    02H        ;modem data port                  [plv:v1.0]
  95. MODCT2    EQU    MODCT1        ;modem status port                [plv:v1.0]
  96. BAUDRP    EQU    61H           ;modem baud rate port             [plv:v1.0]
  97. ;
  98. ; Bit definitions
  99. ;
  100. MDRCVB    EQU    01H        ;modem receive bit      
  101. MDRCVR    EQU    01H        ;modem receive ready
  102. MDSNDB    EQU    04H        ;modem send bit
  103. MDSNDR    EQU    04H        ;modem send ready bit
  104. ;
  105. ; KAYPRO bits per second (baudrate) factors
  106. ;
  107. BAUD50    EQU    00H        ;50 bps
  108. BAUD75    EQU    01H        ;75 bps
  109. BAUD11    EQU    02H        ;110 bps
  110. BAUD13    EQU    03H        ;134.5 bps  (used with some IBM printers)
  111. BAUD15    EQU    04H        ;150 bps
  112. BAUD30    EQU    05H        ;300 bps
  113. BAUD60    EQU    06H        ;600 bps
  114. BAUD12    EQU    07H        ;1200 bps
  115. BAUD18    EQU    08H        ;1800 bps
  116. BAUD20    EQU    09H        ;2000 bps
  117. BAUD24    EQU    0AH        ;2400 bps
  118. BAUD36    EQU    0BH        ;3600 bps
  119. BAUD48    EQU    0CH        ;4800 bps
  120. BAUD72    EQU    0DH        ;7200 bps
  121. BAUD96    EQU    0EH        ;9600 bps
  122. BAUD19    EQU    0FH        ;19,200 bps
  123. ;
  124. ;
  125. ;SIO register equates
  126. ;
  127. SIOW0     EQU    00H        ;sio write register 0
  128. SIOW1     EQU    01H        ;sio write register 1
  129. SIOW2     EQU    02H        ;sio write register 2
  130. SIOW3     EQU    03H        ;sio write register 3
  131. SIOW4     EQU    04H        ;sio write register 4
  132. SIOW5     EQU    05H        ;sio write register 5
  133. SIOR0     EQU    00H        ;sio read register 0
  134. SIOR1     EQU    01H        ;sio read register 1
  135. SIOR2     EQU    02H        ;sio read register 2
  136. ;
  137. ;
  138. MEX      EQU     0D00H        ;addres≤ oµ thσ servicσ processor
  139. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  140. TIMER    EQU    254        ;delay 100ms * reg B
  141. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  142. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  143. SNDRDY    EQU    251        ;test for modem-send ready
  144. RCVRDY    EQU    250        ;test for modem-receive ready
  145. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  146. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  147. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  148. PARSFN    EQU    246        ;parse filename from input stream
  149. BDPARS    EQU    245        ;parse baud-rate from input stream
  150. SBLANK    EQU    244        ;scan input stream to next non-blank
  151. EVALA    EQU    243        ;evaluate numeric from input stream
  152. LKAHED    EQU    242        ;get nxt char w/o removing from input
  153. GNC    EQU    241        ;get char from input, cy=1 if none
  154. ILP    EQU    240        ;inline print
  155. DECOUT    EQU    239        ;decimal output
  156. PRBAUD    EQU    238        ;print baud rate
  157. ;
  158. ;
  159. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  160. PRINT    EQU    9        ;simulated BDOS function 9: print string
  161. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  162. ;
  163. ;
  164.     ORG    TPA        ;we begin
  165. ;
  166. ;
  167.     DS    3        ;MEX has a JMP START here
  168. ;
  169. ; The following variables are located at the beginning of the program
  170. ; to facilitate modification without the need of re-assembly. They will
  171. ; be moved in MEX 2.0.
  172. ;
  173. PMODEM:    DB    NO         ;yes=PMMI modem \ / These 2 locations are not
  174. SMODEM:    DB    YES        ;yes=Smartmodem / \ referenced by MEX
  175. TPULSE:    DB    'T'        ;T=touch, P=pulse (not referenced by MEX)
  176. CLOCK:    DB    40        ;clock speed x .1, up to 25.5 mhz. [plv:v1.0]
  177. MSPEED:    DB    5        ;sets speed for sending a file
  178.                 ;1=300, 5=1200, 8=9600 
  179. BYTDLY:    DB    5        ;default time to send character in
  180.                 ;terminal mode file transfer (0-9)
  181.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  182. CRDLY:    DB    5        ;end-of-line delay after CRLF in terminal
  183.                 ;mode file transfer for slow BBS systems
  184.                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  185. COLUMS:    DB    5        ;number of directory columns
  186. SETFL:    DB    NO;YES        ;yes=user-defined SET command    [plv:v1.0]
  187. SCRTST:    DB    YES        ;yes=if home cursor and clear screen
  188.                 ;routine at CLRSCRN
  189.     DB    0        ;was once ACKNAK, now spare
  190. BAKFLG:    DB    YES         ;yes=make .BAK file        [plv:v1.0]
  191. CRCDFL:    DB    YES        ;yes=default to CRC checking
  192.                 ;no=default to Checksum checking
  193. TOGCRC:    DB    YES        ;yes=allow toggling of Checksum to CRC
  194. CVTBS:    DB    NO        ;yes=convert backspace to rub
  195. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub
  196. ADDLF:    DB    NO        ;no=no LF after CR to send file in
  197.                 ;terminal mode (added by remote echo)
  198. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR
  199. TRNLOG:    DB    NO        ;yes=allow transmission of logon
  200.                 ;write logon sequence at location LOGON
  201. SAVCCP:    DB    YES        ;yes=do not overwrite CCP
  202. LOCNXT:    DB    NO        ;yes=local cmd if EXTCHR precedes
  203.                 ;no=not local cmd if EXTCHR precedes
  204. TOGLOC:    DB    YES        ;yes=allow toggling of LOCNXTCHR
  205. LSTTST:    DB    YES        ;yes=allow toggling of printer on/off
  206.                 ;in terminal mode. Set to no if using
  207.                 ;the printer port for the modem
  208. XOFTST:    DB    YES;NO        ;yes=allow testing of XOFF from remote [plv:v1.0]
  209.                 ;while sending a file in terminal mode
  210. XONWT:    DB    NO        ;yes=wait for XON after sending CR while
  211.                 ;transmitting a file in terminal mode    
  212. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF testing
  213. IGNCTL:    DB    YES;NO        ;yes=do not send control characters [plv:v1.0]
  214.                 ;above CTL-M to CRT in terminal mode
  215.                 ;no=send any incoming CTL-char to CRT
  216. EXTRA1:    DB    0        ;for future expansion
  217. EXTRA2:    DB    0        ;for future expansion
  218. BRKCHR:    DB    '@'-40H        ;^@ = Send a 500 ms. break tone [plv:v2.1]
  219. NOCONN:    DB    'N'-40H        ;^N = Disconnect from phone line
  220. LOGCHR:    DB    'L'-40H        ;^L = Send logon
  221. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer
  222. UNSVCH:    DB    'R'-40H        ;^R = Close input text buffer
  223. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote
  224. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer
  225. EXTCHR:    DB    '^'-40H        ;^^ = Send next character
  226. ;
  227. ; Equates used only by PMMI routines grouped together here.
  228. ;
  229. PRATE:    DB    0        ;not used for Kaypro
  230.     DB    0        ;not used
  231. ;
  232. ; Low-level modem I/O routines: this will be replaced with
  233. ; a jump table in MEX 2.0 (you can insert jumps here to longer
  234. ; routines if you'd like ... I'd recommend NOT putting part of
  235. ; a routine in this area, then jumping to the rest of the routine
  236. ; in the non-fixed area; that will complicate the 2.0 conversion)
  237. ;
  238. INCTL1:    MVI    A,10H        ;reset interrupts
  239.     OUT    MODCT1
  240.     IN    MODCT1        ;in modem control port
  241.     RET
  242.     DB    0,0,0            ;spares if needed 
  243. ;
  244. OTDATA:    OUT    MODDAT        ;out modem data port
  245.     RET
  246.     DB    0,0,0,0,0,0,0    ;spares if needed 
  247. ;
  248. INPORT:    IN    MODDAT        ;in modem data port
  249.     RET
  250.     DB    0,0,0,0,0,0,0    ;spares if needed 
  251. ;
  252. ; Bit-test routines.  These will be merged with the above
  253. ; routines in MEX 2.0 to provide a more reasonable format
  254. ;
  255. MASKR:    ANI MDRCVB ! RET    ;bit to test for receive ready
  256. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready
  257. MASKS:    ANI MDSNDB ! RET    ;bit to test for send ready
  258. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready
  259. ;
  260. ;
  261. ; Unused area: was once used for special PMMI functions,
  262. ; Now used only to retain compatibility with MDM overlays.
  263. ; You may use this area for any miscellaneous storage you'd
  264. ; like but the length of the area *must* be 12 bytes.
  265. ;
  266.     DS    12
  267. ;
  268. ; Special modem function jump table: if your overlay cannot handle
  269. ; some of these, change the jump to "DS 3", so the code present in
  270. ; MEX will be retained.  Thus, if your modem can't dial, change the
  271. ; JMP PDIAL at DIALV to DS 3, and MEX will print a "not-implemented"
  272. ; diagnostic for any commands that require dialing.
  273. ;
  274. ; DIALV  dials the digit in A. See the comments at PDIAL for specs.
  275. ;
  276. ; DISCV  disconnects the modem
  277. ;
  278. ; GOODBV is called just before MEX exits to CP/M.  If your overlay
  279. ;        requires some exit cleanup, do it here.
  280. ;
  281. ; INMODV is called when MEX starts up; use INMODV to initialize the modem.
  282. ;
  283. ; NEWBDV is used for phone-number baud rates and is called with a baud-rate
  284. ;        code in the A register, value as follows:
  285. ;
  286. ;     A=0:   110 baud       A=1:   300 baud      A=2:   450 baud
  287. ;     A=3:   600 baud       A=4:   710 baud      A=5:  1200 baud
  288. ;     A=6:  2400 baud       A=7:  4800 baud      A=8: 19200 baud
  289. ;
  290. ;        If your overlay supports the passed baud rate, it should store the
  291. ;     value passed in A at MSPEED (107H), and set the requested rate. If
  292. ;     the value passed is not supported, you should simply return (with-
  293. ;     out modifying MSPEED) -or- optionally request a baud-rate from the
  294. ;     user interactively.
  295. ;
  296. ; NOPARV is called at the end of each file transfer; your overlay may simply
  297. ;     return here, or you may want to restore parity if you set no-parity
  298. ;     in the following vector (this is the case with the PMMI overlay).
  299. ;     
  300. ; PARITV is called at the start of each file transfer; your overlay may simply
  301. ;     return here, or you may want to enable parity detection (this is the
  302. ;     case with the PMMI overlay).
  303. ;
  304. ; SETUPV is the user-defined command ... to use this routine to build your own
  305. ;     MEX command, set the variable SETFL (117H) non-zero, and add your SET
  306. ;     code.  You can use the routine presented in the PMMI overlay as a 
  307. ;     guide for parsing, table lookup, etc.
  308. ;
  309. ; SPMENU is provided only for MDM compatibility, and is not used by MEX 1.0 for
  310. ;     any purpose (it will be gone in MEX 2).
  311. ;
  312. ; VERSNV is called immediately after MEX prints its sign-on message at cold
  313. ;     startup -- use this to identify your overlay in the sign-on message
  314. ;     (include overlay version number in the line).
  315. ; BREAKV is provided for sending a BREAK (<ESC>-B in terminal mode).  If your
  316. ;     modem doesn't support BREAK, or you don't care to code a BREAK rou-
  317. ;     tine, you may simply execute a RET instruction.
  318. ;
  319. LOGON:    DS    2        ;needed for MDM compat, not ref'd by MEX
  320. DIALV:    DS      3        ;dial digit in A (see info at PDIAL)
  321. DISCV:    DS    3    ;JMP    PDISC    ;disconnect the modem     [plv:v1.0]
  322. ;            Handled by Smartmodem overlay...[plv:v2.0]
  323. GOODBV:    RET  ! NOP ! NOP    ;called before exit to CP/M
  324. INMODV:    JMP     NITMOD    ;initialization. Called at cold-start [plv:v1.0]
  325. NEWBDV:    DS    3    ;JMP    PBAUD        ;set baud rate  [plv:v1.0]
  326. NOPARV:    DS      3        ;set modem for no-parity
  327. PARITV:    DS      3         ;set modem parity
  328. SETUPV:    RET  ! NOP ! NOP    ;JMP SETCMD ;SET cmd: jump to a RET if you don't write SET  [plv:v1.0]
  329. SPMENV:    DS    3        ;not used with MEX
  330. VERSNV:    JMP    SYSVER        ;Overlay's voice in the sign-on message
  331. ;BREAKV:    DS    3    ;JMP    PBREAK    ;send a break  [plv:v1.0]
  332. BREAKV:    JMP    PBREAK        ;send a break returned [plv:v2.1]
  333. ;
  334. ; The following jump vector provides the overlay with access to special
  335. ; routines in the main program (retained and supported in the main pro-
  336. ; gram for MDM overlay compatibility). These should not be modified by
  337. ; the overlay.
  338. ;
  339. ; Note that for MEX 2.0 compatibility, you should not try to use these
  340. ; routines, since this table will go away with MEX 2.0 (use the MEX
  341. ; service call processor instead).
  342. ;
  343. ILPRTV:    DS    3        ;replace with MEX function 9
  344. INBUFV:    DS    3        ;replace with MEX function 10
  345. ILCMPV:    DS    3        ;replace with table lookup funct. 247
  346. INMDMV:    DS    3        ;replace with MEX function 255
  347. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  348. TIMERV:    DS    3        ;replace with MEX function 254
  349. ;
  350. ;
  351. ; Clear/screen and clear/end-of-screen. Each routine must use the
  352. ; full 9 bytes alloted (may be padded with nulls).
  353. ;
  354. ; These routines (and other screen routines that MEX 2.0 will sup-
  355. ; port) will be accessed through a jump table in 2.0, and will be
  356. ; located in an area that won't tie the screen functions to the
  357. ; modem overlay (as the MDM format does).
  358. ;
  359. CLREOS:    LXI    D,EOSMSG
  360.     MVI    C,PRINT
  361.     CALL    MEX
  362.     RET
  363. ;
  364. ;
  365. CLS:    LXI    D,CLSMSG        ;null unless patched
  366.     MVI    C,PRINT
  367.     CALL    MEX
  368.     RET
  369. ;
  370. ;------------------------------------------------------------
  371. ;
  372. ;    *** END OF FIXED FORMAT AREA ***
  373. ;
  374. ;------------------------------------------------------------
  375. ;
  376. ;    *** START OF PROGRAM MODULES ***
  377. ;
  378. ;------------------------------------------------------------
  379. ;
  380. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  381. ;
  382. ; PBREAK   This module sends a 500 ms break signal. [plv:v2.1]
  383. ;
  384. ; MODULES CALLED:  MEX SERVICE PROCESSOR
  385. ;
  386. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  387. ;
  388. PBREAK:    MVI     A,SIOW5            ;address sio register 5
  389.     OUT    MODCT1
  390.     LDA    REG5            ;get current status
  391.     ORI    00010000B        ;set break bit "on"
  392.     OUT    MODCT1            ;start break
  393. ;
  394.     MVI    B,5            ;500 ms delay [plv:v2.1]
  395.     MVI    C,TIMER    
  396.     CALL    MEX
  397. ;
  398.     MVI    A,SIOW5            ;address sio register 5
  399.     OUT    MODCT1
  400.     LDA    REG5            ;get current status
  401.     OUT    MODCT1            ;end break
  402. ;
  403.     RET    
  404. ;
  405. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  406. ;
  407. ;  PDISC  This module disconnects a modem by dropping DTR. 
  408. ;
  409. ;  MODULES CALLED:  MEX SERVICE PROCESSOR
  410. ;
  411. ;     NOTICE   For this routine to be useful you must:
  412. ;        1.  Have a modem capable of sensing DTR and have this
  413. ;                   feature enabled. For example, a Hayes Smartmodem
  414. ;            with Switch 1 up.
  415. ;        2.  Set the parameter DISC in the Smartmodem overlay
  416. ;            to FALSE.
  417. ;
  418. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  419. ;
  420. PDISC:    MVI    A,SIOW5            ;address sio register 5
  421.     OUT     MODCT1
  422.     LDA    REG5            ;get current status
  423.     ANI    01111111B        ;set DTR bit "off"
  424.     OUT    MODCT1            ;turn DTR off
  425. ;
  426.     MVI    B,2            ;200 ms delay
  427.     MVI    C,TIMER
  428.     CALL    MEX
  429. ;
  430.     MVI    A,SIOW5         ;address sio register 5
  431.     OUT    MODCT1
  432.     LDA    REG5            ;get current status
  433.     OUT    MODCT1            ;turn DTR on
  434. ;
  435.     RET
  436. ;
  437. ;
  438. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  439. ;
  440. ;  NITMOD  This module reads MSPEED to determine baudrate, puts the
  441. ;          corresponding Kaypro bps factor in the initialization table,
  442. ;          and calls SETSIO to set baudrate and initialize the sio.
  443. ;
  444. ;  MODULES CALLED:  SETSIO
  445. ;
  446. ;  NOTE:   No error checking is done for illegal values of MSPEED.
  447. ;       Validation is done in PBAUD and SETCMD.  If you put an
  448. ;       unrecognized value in the MSPEED EQU, the default is
  449. ;       1200 bps. Currently regognized values are 1, 5, and 8
  450. ;       (300, 1200, and 9600 bps, respectively).
  451. ;
  452. ;
  453. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  454. ;
  455. NITMOD:    LDA    MSPEED        ;get current speed code
  456. ;
  457. ;--> following code (MSPEED value STA) commented out for V1.0) [plv:v1.0]
  458. ;    CPI    01H        ;current speed code 300 bps?
  459. ;    JNZ    N001        ;no, check next code
  460. ;    MVI    A,BAUD30    ;yes, get corresponding Kaypro bps factor
  461. ;    STA    BRATE        ;save factor in current status table
  462. ;    JMP    END01
  463. ;
  464. ;N001:    CPI    05H        ;1200 bps?
  465. ;    JNZ    N002        ;no, check next code
  466. ;    MVI    A,BAUD12    ;yes, get Kaypro bps factor
  467. ;    STA    BRATE        ;make it current
  468. ;    JMP    END01
  469. ;
  470. ;N002:    CPI    08H        ;9600 bps?
  471. ;    JNZ    N003        ;no, check next code
  472. ;    MVI    A,BAUD96    ;yes, get Kaypro bps factor
  473. ;    STA    BRATE        ;make it current
  474. ;    JMP    END01
  475. ;
  476. ;N003:    DS    0        ;dummy place holder
  477. ;
  478. END01:    CALL    SETSIO        ;initialize bps and sio
  479. ;
  480.     RET
  481. ;
  482. ;
  483. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  484. ;
  485. ;  SETSIO  This module initializes the baudrate and sio.
  486. ;
  487. ;  TABLES USED:  INITAB
  488. ;          
  489. ;
  490. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  491. ;
  492. SETSIO:    LXI    H,INITAB        ;get addr of init table
  493.     MOV    B,M            ;get # pairs to send
  494. ;
  495. IOLP:    INX    H            ;address next byte in table
  496.     MOV    C,M            ;port to sent to
  497.     INX    H            ;address next byte in table
  498.     MOV    A,M            ;value to sent to that port
  499.     DB    0EDH,079H        ;hex for  OUT    (C),A
  500.     DCR    B            ;decrement # pairs
  501.     JNZ    IOLP
  502. ;
  503.     RET
  504. ;
  505. ;
  506. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  507. ;
  508. ;  PBAUD  This module accepts an MSPEED type bps code, and if legitimate,
  509. ;         implements the new baudrate. If the code is not a recognized
  510. ;         value, no action is taken.
  511. ;
  512. ;  ENTRY CONDITIONS:  An MSPEED type value in Register A.
  513. ;
  514. ;  MODULES CALLED:  NITMOD
  515. ;
  516. ;  NOTE: 1.  Only codes of 1 (300 bps) and 5 (1200 bps) are currently
  517. ;            recognized. These correspond to the two most popular modem
  518. ;            speeds. 
  519. ;
  520. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  521. ;
  522. PBAUD:    CPI    1        ;code for 300 bps?
  523.     JNZ    N101        ;no, check next possibility
  524.     STA    MSPEED        ;yes, save new value
  525.     CALL    NITMOD        ;implement new speed
  526.     JMP    ENDPB
  527. ;
  528. N101:    CPI    5        ;1200 bps?
  529.     JNZ    N102        ;no, check next possibility
  530.     STA    MSPEED        ;yes, save new value
  531.     CALL    NITMOD        ;implement new speed
  532.     JMP    ENDPB
  533. ;
  534. N102:    DS    0        ;dummy place holder for more values
  535. ;
  536. ENDPB:    RET
  537. ;
  538. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  539. ;
  540. ; SYSVER  This module displays the Kaypro version message at sign-on.
  541. ;
  542. ;  MODULES CALLED:  MEX SERVICE PROCESSOR
  543. ;
  544. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  545. ;
  546. SYSVER:    LXI    D,SYMESG
  547.     MVI    C,PRINT
  548.     CALL    MEX
  549.     RET
  550. ;
  551. ;
  552. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  553. ;
  554. ;     This module contains strings to:
  555. ;
  556. ;    1. clear-to-end-of-screen
  557. ;    2. clear-screen
  558. ;    3. identify version as for Kaypro
  559. ;
  560. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  561. ;
  562. EOSMSG:    DB    18H,59H,0,0,'$'    ;clear to end-of-screen        ;[plv:v2.0]
  563. CLSMSG:    DB    1AH,0,0,0,'$'    ;clear whole screen
  564. SYMESG: DB    'Version 2.1 for OSM Zeus-3/4/3x {plv}',CR,LF,'$' ;[plv:v2.1]
  565. ;
  566. ;
  567. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  568. ;
  569. ;  SETCMD  This module processes, via the SET command, user requests 
  570. ;       relative to baudrate.
  571. ;
  572. ;       Syntax is as follows:
  573. ;
  574. ;        SET        <display current baudrate>
  575. ;        SET 300        <sets 300 bps>
  576. ;        SET 1200    <sets 1200 bps>
  577. ;        SET 9600    <sets 9600 bps>
  578. ;        SET XXXX    <any other command yields a list of
  579. ;                 above 3 valid baudrates>
  580. ;
  581. ;  MODULES CALLED:  NITMOD, MEX SERVICE PROCESSOR
  582. ;
  583. ;  TABLES USED:  CMDTBL
  584. ;
  585. ;  PSEUDOCODE:
  586. ;
  587. ; 1.    Invoke MEX command line parser
  588. ; 2.    CASE   'no argument in command line'
  589. ;         display current bps value
  590. ; 3.    CASE    'valid argument'
  591. ;         save new code in MSPEED
  592. ;         invoke new baudrate
  593. ; 4.    CASE     'invalid argument'
  594. ;         display menu of valid arguemnts
  595. ; 5.    RETURN
  596. ;         
  597. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  598. ;
  599. ;<1>
  600. SETCMD:    MVI    C,SBLANK    ;invoke MEX parser for "no argument"
  601.     CALL    MEX
  602.     JNC    N210        ;if not, go check for valid argument
  603. ;
  604. ;<2>
  605.     MVI    C,ILP        ;yes, no argument: print current bps
  606.     CALL    MEX
  607.     DB    CR,LF,'Baud rate is now: ',0
  608.     LDA    MSPEED        ;set up for call to MEX function that
  609.     MVI    C,PRBAUD    ;prints baudrate
  610.     CALL    MEX
  611.     JMP    END200    
  612. ;
  613. N210:    LXI    D,CMDTBL    ;table of possible commands
  614.     MVI     C,LOOKUP    ;see if command in table
  615.     CALL    MEX
  616.     JC    N220        ;not in table, go print speeds supported
  617. ;
  618. ;<3>
  619.     MOV    A,L        ;match, get mspeed code returned in L
  620.     STA    MSPEED        ;save new speed code
  621.     CALL    NITMOD        ;implement new speed
  622.     JMP    END200
  623. ;
  624. ;<4>
  625. N220:    MVI    C,ILP        ; print speeds supported
  626.     CALL    MEX
  627.     DB    CR,LF,'Only 300, 1200, 9600 supported',CR,LF,0
  628. ;
  629. ;<5>
  630. END200:    RET
  631. ;
  632. ;
  633. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  634. ;
  635. ;  CMDTBL  This is the command table searched by SETCMD.
  636. ;
  637. ;    The table is constructed by the command name (terminated by high
  638. ;    bit = 1), followed by a word data value returned in HL by the
  639. ;    MEX service processor LOOKUP.  Table must be terminated by a
  640. ;    binary zero.
  641. ;
  642. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  643. ;
  644. CMDTBL:    DB    '30','0'+80H
  645.     DW    01H                ;mspeed code for 300 bps
  646.     DB    '120','0'+80H
  647.     DW    05H                ;mspeed code for 1200 bps
  648.     DB    '960','0'+80H
  649.     DW    08H                ;mspeed code for 9600 bps
  650.     DB    0
  651. ;
  652. ;
  653. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  654. ;
  655. ;  INITAB   This is the table of io initialization values used by SETSIO.
  656. ;
  657. ;    The table is in pairs of values. The first byte of each pair
  658. ;    is the port #, and the second byte is the value to send to 
  659. ;    that port. The first entry in the table is the table length
  660. ;    in pairs.
  661. ;
  662. ;  NOTES: 1. SIO registers should be initialized in the order:
  663. ;        0, 2, 4, 3, 5, 1.
  664. ;      2. Baudrate generator initialized with sio disabled via
  665. ;            'channel reset' command.
  666. ;      3. (I have violated note 2 without apparent problems, but
  667. ;             why not do it by the book?)
  668. ;
  669. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  670. ;
  671. INITAB:    DB    (INIEND-INITAB)/2        ;table length in data pairs
  672. ;--> the following table commented out and replaced with OSM's [plv:v1.0]
  673. ;    recommended values:                                    [plv:v1.0]
  674. ;    DB    MODCT1
  675. ;    DB    00011000B            ;channel reset
  676. ;    DB    BAUDRP
  677. ;BRATE:    DB    BAUD12                ;default to 1200
  678. ;    DB    MODCT1
  679. ;    DB    SIOW4
  680. ;    DB    MODCT1
  681. ;REG4:    DB    044H                ;x16, 1 stop, no parity
  682. ;    DB    MODCT1
  683. ;    DB    SIOW3
  684. ;    DB    MODCT1
  685. ;REG3:    DB    0C1H                ;8 bit, rx enable
  686. ;    DB    MODCT1
  687. ;    DB    SIOW5
  688. ;    DB    MODCT1
  689. ;REG5:    DB    0EAH                ;dtr, 8 bit, tx enable, rts
  690. ;
  691.     DB    MODCT1                ;user printer port ctl [plv:v1.0]
  692.     DB    18H    ;CMD3: Channel Reset
  693.     DB    MODCT1
  694.     DB    14H    ;CMD2+PTR4 (Reset External/Status Interrupts+Point WR4
  695.     DB    MODCT1
  696.     DB    4CH    ;WR4: No Parity, 2 stop bits, Data Rate*16=Clock Rate
  697.     DB    MODCT1
  698.     DB    03H    ;PTR3
  699.     DB    MODCT1
  700.     DB    0E1H    ;WR3: Rx 8 bits, Auto Enables, Rx enable
  701.     DB    MODCT1
  702.     DB    05H    ;PTR5
  703.     DB    MODCT1
  704. REG5:    DB    0EAH    ;WR5: DTR, Tx 8 bits, Tx enable, RTS <label prevents syntax errs>
  705.     DB    MODCT1
  706.     DB    11H    ;CMD2+PTR1
  707.     DB    MODCT1
  708.     DB    00H    ;WR1: Disable Interrupts
  709. ;--> The following added to set default baud rate to 1200     [plv:v1.0]
  710.     DB    BAUDRP    ;Printer CTC control port
  711.     DB    45H
  712.     DB    BAUDRP
  713.     DB    68H
  714. ;--> End of v1.0 mods (per OSM reqs)              [plv:v1.0]
  715. INIEND:    DS    0                ;define end of table
  716. ;
  717. ;
  718. ;--------------------------------------------------------------------
  719. ;
  720. ;    End of Zeus-3 MEX overlay            [plv:v1.0]
  721. ;
  722. ;--------------------------------------------------------------------
  723. ;
  724.     END
  725.