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 / MXH-CC16.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  29KB  |  1,046 lines

  1. REV    EQU    16        ;overlay revision level
  2. ;
  3. ; MXH-CC16 MEX Overlay for Columbia Data Prod M64
  4. ;
  5. ; Use for MEX 1.14 or MEXplus
  6. ;
  7. ; Application: small CP/M computer known as any of the following....
  8. ;
  9. ;           - Columbia Data Products "Shoebox"
  10. ;             Model M64 or M64-1
  11. ;           - Kodak Ektalog Diskette Controller
  12. ;           - CONKEY-64 (local moniker)
  13. ;
  14. ; SET commands available: (*optional)
  15. ;
  16. ;     SET BAUD: controls MEX timing only, use switches on back on unit
  17. ;           for USART
  18. ;     SET PARITY: off, odd or even
  19. ;     SET WORD: 7 or 8
  20. ;     SET STOP: 1, 1.5 or 2
  21. ;     SET PULSE or TONE: type of dialing
  22. ;    *SET WAIT: "n" seconds to wait for Modem result.
  23. ;     SET UART: 7 or 8 bit console UART (see SET UART section)
  24. ;    *SET VT220: on/off if terminal is VT220
  25. ;
  26. ;------+--------+----------+----------------------------------------------
  27. ; REV  |  Date    |  Author  |          Description
  28. ;------+--------+----------+----------------------------------------------
  29. ; 1.6  |12/12/86|  Lill    | - tested DCD (uses CTS, need spec. cable) in
  30. ;      |    |       |   MEX+ REO
  31. ;      |    |       | - added SET WAIT for selection of time to wait
  32. ;      |    |       |   after dialing (see SETDLY etc. in MXO-SM14)
  33. ;------+--------+----------+----------------------------------------------
  34. ; 1.5  |10/28/86|  Lill    | - cleaned up new code added in 1.4
  35. ;      |    |       | - completed commenting
  36. ;      |    |       | - testing complete on all but DCD and RNG stuff
  37. ;------+--------+----------+----------------------------------------------
  38. ; 1.4  |10/21/86|  Lill    | - created original MEXplus from MXO-CC13
  39. ;      |    |       |   adding DCD and RNG routines.
  40. ;      |    |       | - added INITB equate
  41. ;      |    |       | - added VT220 option to 8-bit console routine
  42. ;      |    |       | - added SET control of 8-bit and VT220 stuff
  43. ;------+--------+----------+----------------------------------------------
  44. ; 1.3  |10/19/86|  Keane   | - added hardware DSC (via DTR)
  45. ;      |    |       | - added SET TONE/PULSE
  46. ;      |    |       | - added 8-bit console routines (experimental)
  47. ;      |    |       | - tested with SmarTEAM 1200 (MXO-SM14)
  48. ;      |    |       |   and SmarTEAM 2400 (MXM-2411)
  49. ;------+--------+----------+----------------------------------------------
  50. ; 1.2  |10/16/86|  Lill/   | - corrected Columbia model number
  51. ;      |    |  Keane   | - first fixes for SmartModem (MXO-SM14)
  52. ;------+--------+----------+----------------------------------------------
  53. ; 1.1  |10/12/86|Jim Lill  | - fixed SET BAUD messages and history etc.
  54. ;      |    |       | - doesn't send dial string to smartmodem
  55. ;------+--------+----------+----------------------------------------------
  56. ; 1.0  |10/12/86|Tony Keane| - created original, adapting MXO-SX10
  57. ;      |    |       |   by Bill Meahan.
  58. ;      |    |       | - Tested w/acoustic modem only.
  59. ;-------------------------------------------------------------------------
  60. ;
  61. ; Misc equates
  62. ;
  63. NO    EQU    0
  64. YES    EQU    0FFH
  65. TPA    EQU    100H
  66. CR    EQU    13
  67. LF    EQU    10
  68. ESC    EQU    1BH
  69. BEL    EQU    7
  70. TAB    EQU    9
  71. XON    EQU    011H
  72. XOFF    EQU    013H
  73. FALSE    EQU    0
  74. TRUE    EQU    NOT FALSE
  75. ;
  76. ;---------------------------------------------------------------------------
  77. ; Options ......
  78.  
  79. INITB    EQU    5    ;set for initial (startup) baud rate
  80.             ;0=110    5=1200
  81.             ;1=300    6=2400
  82.             ;    7=4800
  83.             ;    8=9600
  84.             ;    9=19200
  85. PLUS    EQU    FALSE    ;set true for MEXplus
  86. VT220    EQU    FALSE    ;TRUE if terminal is VT220
  87. WAIT    EQU    TRUE    ;TRUE if you use MXO-SM14 and want selectable wait
  88.             ;delay after dialing
  89. WAITSEC    EQU    45    ;default WAIT time in seconds
  90. ;---------------------------------------------------------------------------
  91. ; CONKEY port definitions  (serial port 1)
  92. ;
  93. PORT    EQU    058H        ;CONKEY base port (data or status)
  94. MODCT1    EQU    PORT+1        ;modem control port
  95. MODDAT    EQU    PORT        ;modem data port
  96. MODCT2    EQU    PORT+1        ;modem status port
  97. BAUDRP    EQU    044H        ;modem baud rate port, (unused port in CONKEY)
  98. BAUDMD    EQU    045H        ;modem baud rate mode control port
  99. AUXPORT    EQU    05EH        ;modem aux status port CTS RNG etc.
  100. ;
  101. ; CONKEY bit definitions
  102. ;
  103. MDRCVB    EQU    02H        ;modem receive bit (DAV)
  104. MDRCVR    EQU    02H        ;modem receive ready
  105. MDSNDB    EQU    01H        ;modem send bit
  106. MDSNDR    EQU    01H        ;modem send ready bit
  107. ;
  108. ;
  109. CTSMSK    EQU    01H        ;mask for CTS bit
  110. BRKMSK    EQU    8        ;mask to set break
  111. PARMSK    EQU    0CFH        ;mask to remove parity bits
  112. RNGMSK    EQU    08H        ;mask to get ring
  113. OPARIT    EQU    10H        ;odd-parity bits
  114. EPARIT    EQU    30H        ;even-parity bits
  115. NPARIT    EQU    00H        ;no-parity bits
  116. PARTST    EQU    10H        ;mask to test parity enabled bit
  117. EVNTST    EQU    20H        ;mask to test even parity bit
  118. MODEMK    EQU    06EH        ;mode mask
  119. MODEGO    EQU    027H        ;default control command
  120. DTRON    EQU    027H        ;default control with DTR on
  121. DTROFF    EQU    025H        ;default control with DTR off
  122. RSTCTL    EQU    040H        ;reset USART command
  123. WORD7    EQU    08H        ;mask for 7 bit characters
  124. WORD8    EQU    0CH        ;mask for 8 bit characters
  125. WORD8T    EQU    04H        ;mask to test for 8 bit characters
  126. STBIT1    EQU    040H        ;mask to set 1 stop bit
  127. STBI15    EQU    080H        ;mask to set 1.5 stop bits
  128. STBIT2    EQU    0C0H        ;mask to set 2 stop bits
  129. ;
  130. ; MEX service processor stuff ... MEX supports an overlay service
  131. ;
  132. MEX    EQU    0D00H        ;address of the service processor
  133. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  134. TIMER    EQU    254        ;delay 100ms * reg B
  135. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  136. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  137. SNDRDY    EQU    251        ;test for modem-send ready
  138. RCVRDY    EQU    250        ;test for modem-receive ready
  139. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  140. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  141. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  142. PARSFN    EQU    246        ;parse filename from input stream
  143. BDPARS    EQU    245        ;parse baud-rate from input stream
  144. SBLANK    EQU    244        ;scan input stream to next non-blank
  145. EVALA    EQU    243        ;evaluate numeric from input stream
  146. LKAHED    EQU    242        ;get nxt char w/o removing from input
  147. GNC    EQU    241        ;get char from input, cy=1 if none
  148. ILP    EQU    240        ;inline print
  149. DECOUT    EQU    239        ;decimal output
  150. PRBAUD    EQU    238        ;print baud rate
  151. ;
  152. ;
  153. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  154. PRINT    EQU    9        ;simulated BDOS function 9: print string
  155. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  156. ;
  157.     ORG    TPA        ;we begin
  158. ;
  159. ; next 2 lines are MEXplus changes
  160. ;
  161.     DB    0C3H    ;flags a LOADable file
  162.     DS    2    ;MEX has a jump start here
  163. ;
  164. ; The following variables are located at the beginning of the program
  165. ; to facilitate modification without the need of re-assembly. They will
  166. ; be moved in MEX 2.0.
  167. ;
  168. PMODEM:    DB    YES    ;yes=       modem \ / These 2 locations are not    103H
  169. SMODEM:    DB    YES    ;yes=Smartmodem  / \ referenced by MEX        104H
  170. TPULSE:    DB    'T'    ;smart modem touch tone/dial pulse flag     105H
  171. CLOCK:    DB    46    ;clock speed x .1, up to 25.5 mhz.        106H
  172.             ;46 checks as correct for CONKEY
  173. MSPEED:    DB    INITB    ;sets display time for sending a file        107H
  174.             ;0=110    1=300  2=450  3=600  4=710
  175.             ;5=1200 6=2400 7=4800 8=9600 9=19200
  176. BYTDLY:    DB    2    ;default time to send character in        108H
  177.             ;terminal mode file transfer (0-9)
  178.             ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  179. CRDLY:    DB    2    ;end-of-line delay after CRLF in terminal    109H
  180.             ;mode file transfer for slow BBS systems
  181.             ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  182. COLUMS:    DB    5    ;number of directory columns            10AH
  183. SETFL:    DB    YES    ;yes=user-defined SET command            10BH
  184. SCRTST:    DB    YES    ;yes=if home cursor and clear screen        10CH
  185.             ;routine at CLRSCRN
  186.     DB    0    ;was once ACKNAK, now spare            10DH
  187. BAKFLG:    DB    NO    ;yes=make .BAK file                10EH
  188. CRCDFL:    DB    YES    ;yes=default to CRC checking            10FH
  189.             ;no=default to Checksum checking
  190. TOGCRC:    DB    YES    ;yes=allow toggling of Checksum to CRC        110H
  191. CVTBS:    DB    NO    ;yes=convert backspace to rub            111H
  192. TOGLBK:    DB    YES    ;yes=allow toggling of bksp to rub        112H
  193. ADDLF:    DB    NO    ;no=no LF after CR to send file in        113H
  194.             ;terminal mode (added by remote echo)
  195. TOGLF:    DB    YES    ;yes=allow toggling of LF after CR        114H
  196. TRNLOG:    DB    NO    ;yes=allow transmission of logon        115H
  197.             ;write logon sequence at location LOGON
  198. SAVCCP:    DB    YES    ;yes=do not overwrite CCP            116H
  199. LOCNXT:    DB    NO    ;yes=local cmd if EXTCHR precedes        117H
  200.             ;no=not local cmd if EXTCHR precedes
  201. TOGLOC:    DB    YES    ;yes=allow toggling of LOCNXTCHR        118H
  202. LSTTST:    DB    YES    ;yes=allow toggling of printer on/off        119H
  203.             ;in terminal mode. Set to no if using
  204.             ;the printer port for the modem
  205. XOFTST:    DB    NO    ;yes=allow testing of XOFF from remote        11AH
  206.             ;while sending a file in terminal mode
  207. XONWT:    DB    NO    ;yes=wait for XON after sending CR while    11BH
  208.             ;transmitting a file in terminal mode
  209. TOGXOF:    DB    YES    ;yes=allow toggling of XOFF testing        11CH
  210. IGNCTL:    DB    NO    ;yes=do not send control characters        11DH
  211.             ;above CTL-M to CRT in terminal mode
  212.             ;no=send any incoming CTL-char to CRT
  213. EXTRA1:    DB    WAITSEC    ;passes wait time to Modem overlay        11EH
  214. EXTRA2:    DB    0    ;for future expansion                11FH
  215. BRKCHR:    DB    '@'-40H    ;^@ = Send a 300 ms. break tone         120H
  216. NOCONN:    DB    'N'-40H    ;^N = Disconnect from phone line        121H
  217. LOGCHR:    DB    'L'-40H    ;^L = Send logon                122H
  218. LSTCHR:    DB    'P'-40H    ;^P = Toggle printer                123H
  219. UNSVCH:    DB    'R'-40H    ;^R = Close input text buffer            124H
  220. TRNCHR:    DB    'T'-40H    ;^T = Transmit file to remote            125H
  221. SAVCHR:    DB    'Y'-40H    ;^Y = Open input text buffer            126H
  222. EXTCHR:    DB    '^'-40H    ;^^ = Send next character            127H
  223. ;
  224. ; unused equates grouped here
  225. ;
  226.     DB    0    ;not used                    128H
  227.     DB    0    ;not used                    129H
  228. ;
  229. ; Low-level modem I/O routines: this will be replaced with
  230. ; a jump table in MEX 2.0 (you can insert jumps here to longer
  231. ; routines if you'd like ... I'd recommend NOT putting part of
  232. ; a routine in this area, then jumping to the rest of the routine
  233. ; in the non-fixed area; that will complicate the 2.0 conversion)
  234. ;
  235. INCTL1:    IN    MODCT1        ;in modem control port            12AH
  236.     RET            ;                    12CH
  237.     DS    7        ;spares if needed for non-CONKEY    12DH
  238. ;
  239. OTDATA:    OUT    MODDAT        ;out modem data port            134H
  240.     RET            ;                    136H
  241.     DS    7        ;spares if needed for non-CONKEY    137H
  242. ;
  243. INPORT:    IN    MODDAT        ;in modem data port            13EH
  244.     RET            ;                    140H
  245.     DS    7        ;spares if needed for non-CONKEY    141H
  246. ;
  247. ; Bit-test routines.  These will be merged with the above
  248. ; routines in MEX 2.0 to provide a more reasonable format
  249. ;
  250. MASKR:    ANI MDRCVB ! RET    ;bit to test for receive ready        148H
  251. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready    14BH
  252. MASKS:    ANI MDSNDB ! RET    ;bit to test for send ready        14EH
  253. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready        151H
  254. ;
  255. ;----------------------------------------------------------------------------
  256. ; MEXplus changes.....
  257. ;   -was unused area (must total 12 bytes)
  258. ;
  259. DCDTST:    JMP    DCDVEC        ;jump to carrier detect routine     154H
  260. RNGTST:    JMP    RNGVEC        ;jump to ring detect routine        157H
  261.  
  262.     DS    6        ;remainder of space
  263. ;----------------------------------------------------------------------------
  264. ; Special modem function jump table:
  265. ;
  266. LOGON:    DS    2    ;needed for MDM compat, not ref'd by MEX    160H
  267. DIALV:    DS    3    ;dial digit in A (see info at PDIAL)
  268. DISCV:    JMP    DISCON    ;disconnect the modem
  269. GOODBV:    JMP    GOODBYE    ;called before exit to CP/M
  270. INMODV:    JMP    NITMOD    ;initialization. Called at cold-start
  271. NEWBDV:    JMP    PBAUD    ;set baud rate
  272. NOPARV:    JMP    DUMMY    ;set modem for no-parity
  273. PARITV:    JMP    DUMMY    ;set modem parity
  274. SETUPV:    JMP    SETCMD    ;SET cmd: jump to a RET if you don't write SET
  275. SPMENV:    DS    3    ;not used with MEX
  276. VERSNV:    JMP    SYSVER    ;Overlay's voice in the sign-on message
  277. BREAKV:    JMP    PBREAK    ;send a break
  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
  289. INBUFV:    DS    3        ;replace with MEX function 10
  290. ILCMPV:    DS    3        ;replace with table lookup funct. 247
  291. INMDMV:    DS    3        ;replace with MEX function 255
  292. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  293. TIMERV:    DS    3        ;replace with MEX function 254
  294. ;
  295. ;
  296. ; Clear/screen and clear/end-of-screen. Each routine must use the
  297. ; full 9 bytes alloted (may be padded with nulls).
  298. ;
  299. ; These routines (and other screen routines that MEX 2.0 will sup-
  300. ; port) will be accessed through a jump table in 2.0, and will be
  301. ; located in an area that won't tie the screen functions to the
  302. ; modem overlay (as the MDM format does).
  303. ;
  304. CLREOS:    LXI    D,EOSMSG
  305.     MVI    C,PRINT
  306.     CALL    MEX
  307.     RET
  308. ;
  309. ;
  310. CLS:    LXI    D,CLSMSG        ;null unless patched
  311.     MVI    C,PRINT
  312.     CALL    MEX
  313.     RET
  314. ;
  315. ;------------------------------------------------------------
  316. ;
  317. ;    *** END OF FIXED FORMAT AREA ***
  318. ;
  319. ;------------------------------------------------------------
  320.  
  321.     ORG    TPA + 100H    ;Leave space for MEX Plus.
  322.  
  323. ; strings to clear-to-end-of-screen, and clear-screen
  324. ;
  325. EOSMSG:    DB    09BH,'$'    ;clear to end-of-screen
  326. CLSMSG:    DB    LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF    ;clear whole screen
  327.     DB    LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,'$'    ;'generic' CLS
  328. ;
  329. ; Data area
  330. ;
  331. ERRFLG:    DB    0        ;connection error code
  332. MODMOD    DB    MODEMK        ;uart-control byte image
  333. BAUDSV:    DB    01        ;current baud rate (dflt 300)
  334. MODCTB:    DB    MODEGO        ;modem control byte
  335.  
  336. ;--------------------------------------------------------------------------
  337. ; Modem initialization.
  338.  
  339. NITMOD:
  340.     CALL    URTSET        ;Extra console patch init (if installed)
  341.     MVI    A,INITB        ;default IBAUD eqaute setting
  342.     CALL    PBAUD        ;Currently ignored by CONKEY, sets MEX timing
  343.     LDA    MODMOD        ;default mode command in A
  344. ALTINI:                ;alternate entry point for mode change routines
  345.     PUSH    PSW        ;save mode command on stack
  346.     XRA    A        ;force 8251 USART to look for reset command
  347.     OUT    MODCT2
  348.     OUT    MODCT2
  349.     OUT    MODCT2
  350.     MVI    A,RSTCTL    ;reset USART
  351.     OUT    MODCT2
  352.     POP    PSW        ;retreive mode command
  353.     STA    MODMOD        ;save copy for future use
  354.     OUT    MODCT2        ;set USART mode
  355.     MVI    A,MODEGO    ;enable transmitter and receiver
  356.     OUT    MODCT2
  357.     RET
  358. ;
  359. ;--------------------------------
  360. ; CONKEY cause disconnect routine
  361. ;
  362. DISCON:    MVI    A,DTROFF    ;turn off DTR
  363.     OUT    MODCT2        ;    "
  364.                 ;
  365.     MVI    B,10        ;wait 1 second
  366.     MVI    C,TIMER        ;    "
  367.     CALL    MEX        ;    "
  368.                 ;
  369.     MVI    A,DTRON        ;turn on DTR
  370.     OUT    MODCT2        ;    "
  371.                 ;
  372.     MVI    B,10        ;wait 1 more second
  373.     MVI    C,TIMER        ;    "
  374.     CALL    MEX        ;    "
  375.                 ;
  376.     RET            ;return to calling program
  377.  
  378. ;---------------------------
  379. ; CONKEY  send-break routine
  380. ;
  381. PBREAK:    LDA    MODCTB        ;get the last modem control byte
  382.     ORI    BRKMSK        ;set the transmit break bit low
  383.     OUT    MODCT2        ;send it to the modem
  384.     LXI    B,02FEH        ;B=2, C=254
  385.     CALL    MEX        ;send a space tone for 200 ms.
  386.     LDA    MODCTB        ;get the last modem control byte
  387.     OUT    MODCT2        ;restore to normal
  388. ;
  389. ; exit routine
  390. ;
  391. DUMMY:    RET            ;we don't need one
  392. ;
  393. ;-----------------------------------
  394. ; MEXplus DCD and RNG routines......
  395. ;
  396. DCDVEC:    IN    AUXPORT        ;Conkey ring/CTS port
  397.     ANI    CTSMSK        ;isolate status bit (Look for CTS instead)
  398.     JNZ    SETACC        ;0=carrier detected
  399.     JMP    CLRACC        ;
  400. ;.......            ;
  401.                 ;
  402. RNGVEC:    IN    AUXPORT        ;Conkey ring/CTS port
  403.     ANI    RNGMSK        ;mask for bit
  404.     JNZ    SETACC        ;0=ring detected
  405.     JMP    CLRACC        ;
  406. ;.........            ;
  407.                 ;
  408. CLRACC:    MVI    A,0        ;make A=0
  409.     RET            ;
  410. SETACC:    MVI    A,0FFH        ;make A=255
  411.     RET            ;
  412.                 ;
  413. ;------------------------
  414. ; Set baud-rate code in A
  415. ;
  416. PBAUD:    PUSH    H        ;don't alter anybody
  417.     PUSH    D
  418.     PUSH    B
  419.     STA    MSPEED
  420.     ADD    A        ;double value to get word address
  421.     MOV    E,A        ;code to DE
  422.     MVI    D,0
  423.     LXI    H,BAUDTB    ;offset into table
  424.     DAD    D
  425.     MOV    C,M        ;fetch code
  426.     INX    H
  427.     MOV    B,M
  428.     MVI    A,076H
  429.     OUT    BAUDMD        ;control counter
  430.     MOV    A,C
  431.     OUT    BAUDRP
  432.     MOV    A,B
  433.     OUT    BAUDRP        ;good rate, set it
  434. PBEXIT:    POP    B        ;all done
  435.     POP    D
  436.     POP    H
  437.     RET
  438. ;
  439. ; table of baud rate divisors for supported rates
  440. ;
  441. BAUDTB:    DW    1048,384,256,192,162    ;110,300,450,610,710
  442.     DW    96,48,24,12,6        ;1200,2400,4800,9600,19200
  443. ;
  444. ;-----------------------
  445. ; Sign-on message
  446. ;
  447. SYSVER:    LXI    D,SOMESG
  448.     MVI    C,PRINT
  449.     CALL    MEX
  450.     RET
  451. ;
  452. SOMESG:
  453.  
  454. IF PLUS
  455.     DB    'MEXplus for Conkey-64'
  456. ENDIF
  457.  
  458. IF NOT PLUS
  459.     DB    'MEX for Conkey-64'
  460. ENDIF
  461.  
  462. IF VT220
  463.     DB    ', VT220 Exit Option'
  464. ENDIF
  465.     DB    CR,LF,' Version: '
  466.     DB    REV/10+'0'
  467.     DB    '.'
  468.     DB    REV MOD    10+'0'
  469.     DB    '$'
  470. ;
  471. ; Newline on console
  472. ;
  473. CRLF:    MVI    A,CR
  474.     CALL    TYPE
  475.     MVI    A,LF        ;fall into TYPE
  476. ;
  477. ; type char in A on console
  478. ;
  479. TYPE:    PUSH    H        ;save 'em
  480.     PUSH    D
  481.     PUSH    B
  482.     MOV    E,A        ;align output character
  483.     MVI    C,CONOUT    ;print via MEX
  484.     CALL    MEX
  485.     POP    B
  486.     POP    D
  487.     POP    H
  488.     RET
  489. ;
  490. ;------------------------------------------------------------
  491. ;
  492. ; The remainder of this overlay implements a very versatile
  493. ; SET command --
  494. ;
  495. ;
  496. ; Control is passed here after MEX parses a SET command.
  497. ;
  498. SETCMD:    MVI    C,SBLANK    ;any arguments?
  499.     CALL    MEX
  500.     JC    SETSHO        ;if not, go print out values
  501.     LXI    D,CMDTBL    ;parse command
  502.     CALL    TSRCH        ;from table
  503.     PUSH    H        ;any address on stack
  504.     RNC            ;if we have one, execute it
  505.     POP    H        ;nope, fix stack
  506. SETERR:    LXI    D,SETEMS    ;print error
  507.     MVI    C,PRINT
  508.     CALL    MEX
  509.     RET
  510. ;
  511. SETEMS:    DB    CR,LF,'SET command error',CR,LF,'$'
  512. ;
  513. ; SET command table ... note that tables are constructed of command-
  514. ; name (terminated by high bit=1) followed by word-data-value returned
  515. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  516. ; a binary zero.
  517. ;
  518. ; Note that LOOKUP attempts to find the next item in the input stream
  519. ; in the table passed to it in HL ... if found, the table data item is
  520. ; returned in HL; if not found, LOOKUP returns carry set.
  521. ;
  522. CMDTBL:    DB    '?'+80H            ;"set ?"
  523.     DW    STHELP
  524.     DB    'BAU','D'+80H        ;"set baud"
  525.     DW    STBAUD
  526.     DB    'PARIT','Y'+80H        ;"set parity"
  527.     DW    SETPAR
  528.     DB    'WOR','D'+80H        ;"set bits" (word)
  529.     DW    SETBIT
  530.     DB    'STO','P'+80H        ;"set stop"
  531.     DW    SETSTO
  532.     DB    'PULS','E'+80H        ;"set pulse dialing"
  533.     DW    SETPUL
  534.     DB    'TON','E'+80H        ;"set tone dialing"
  535.     DW    SETTON
  536. IF WAIT
  537.     DB    'WAI','T'+80H        ;"set wait time"
  538.     DW    SETDLY
  539. ENDIF
  540.     DB    'UAR','T'+80H        ;"set UART mode"
  541.     DW    SETURT
  542. IF VT220
  543.     DB    'VT22','0'+80H        ;"set VT220 mode"
  544.     DW    SETVT2
  545. ENDIF
  546. ;
  547.     DB    0        ;<<=== table terminator
  548. ;
  549. ; SET <no-args>: print current statistics
  550. ;
  551. SETSHO:
  552.     LXI    H,SHOTBL    ;get table of SHOW subroutines
  553. SETSLP:    MOV    E,M        ;get table address
  554.     INX    H
  555.     MOV    D,M
  556.     INX    H
  557.     MOV    A,D        ;end of table?
  558.     ORA    E
  559.     RZ            ;exit if so
  560.     PUSH    H        ;save table pointer
  561.     XCHG            ;adrs to HL
  562.     CALL    GOHL        ;do it
  563.     CALL    CRLF        ;print newline
  564.     MVI    C,CHEKCC    ;check for console abort
  565.     CALL    MEX
  566.     POP    H        ;it's done
  567.     JNZ    SETSLP        ;continue if no abort
  568.     RET
  569. ;
  570. GOHL:    PCHL
  571. ;
  572. ; table of SHOW subroutines
  573. ;
  574. SHOTBL:    DW    BDSHOW
  575.     DW    PARSHO
  576.     DW    WORDHO
  577.     DW    STOSHO
  578.     DW    DIASHO
  579. IF WAIT
  580.     DW    DLYSHO
  581. ENDIF
  582.     DW    URTSHO
  583. IF VT220
  584.     DW    VT2SHO
  585. ENDIF
  586.     DW    0        ;<<== table terminator
  587. ;
  588. ; SET ?  processor
  589. ;
  590. STHELP:    LXI    D,HLPMSG
  591.     MVI    C,PRINT
  592.     CALL    MEX
  593.     RET
  594. ;
  595. ; The help message
  596. ;
  597. HLPMSG:    DB    CR,LF,'SET command, Conkey-64 version:'
  598.     DB    LF
  599.     DB    CR,LF,'  SET BAUD 1200 etc. for MEX timing'
  600.     DB    CR,LF,'      use MOD switches on rear of computer'
  601.     DB    CR,LF,'  SET PARITY ODD <or> EVEN <or> OFF'
  602.     DB    CR,LF,'  SET WORD 7 <or> 8'
  603.     DB    CR,LF,'  SET STOP 1 <or> 1.5 <or> 2'
  604.     DB    CR,LF,'  SET PULSE dialing'
  605.     DB    CR,LF,'  SET TONE  dialing'
  606. IF WAIT
  607.     DB    CR,LF,'  SET WAIT "n" seconds'
  608. ENDIF
  609.     DB    CR,LF,'  SET UART 7 <or> 8'
  610. IF VT220
  611.     DB    CR,LF,'  SET VT220 Exit Reset ON <or> OFF'
  612. ENDIF
  613.     DB    CR,LF,'$'
  614. ;
  615. ;-------------------
  616. ; SET BAUD processor
  617. ;
  618. STBAUD:    CALL    ILPRT        ;ring console bell
  619.     DB    BEL,0        ;a warning for the switches
  620.     MVI    C,BDPARS    ;function code
  621.     CALL    MEX        ;let MEX look up code
  622.     JC    SETERR        ;invalid code
  623.     CALL    PBAUD        ;no, try to set it
  624.     JC    SETERR        ;no-supported code
  625. BDSHOW:    CALL    ILPRT        ;display baud
  626.     DB    'BAUD:',TAB,' ',0
  627.     LDA    MSPEED
  628.     MVI    C,PRBAUD    ;use MEX routine
  629.     CALL    MEX
  630.     RET
  631. ;
  632. ;---------------------
  633. ; SET PARITY processor
  634. ;
  635. SETPAR:
  636.     LXI    D,PARTBL    ;point to argument table
  637.     CALL    TSRCH        ;look for match with allowed arguments
  638.     JC    SETERR        ;process error if found
  639.     LDA    MODMOD        ;get current mode byte
  640.     ANI    PARMSK        ;mask away current parity bits
  641.     ORA    L        ;add new parity bits
  642.     CALL    ALTINI
  643. PARSHO:
  644.     CALL    ILPRT        ;show current status
  645.     DB    'PARITY:',TAB,' ',0
  646.     LDA    MODMOD        ;get current mode word
  647.     ANI    PARTST        ;test for parity enabled
  648.     JNZ    PAR        ;skip if it is
  649.     CALL    ILPRT
  650.     DB    'Off',0
  651.     RET
  652. PAR:
  653.     LDA    MODMOD
  654.     ANI    EVNTST        ;test mode byte for even parity
  655.     JNZ    PAREVN        ;skip if it is
  656.     CALL    ILPRT
  657.     DB    'Odd',0
  658.     RET
  659. PAREVN:
  660.     CALL    ILPRT
  661.     DB    'Even',0
  662.     RET
  663. ;
  664. ;PARITY argument table
  665. ;
  666. PARTBL:    DB    'OD','D'+80H
  667.     DB    OPARIT,0
  668.     DB    'EVE','N'+80H
  669.     DB    EPARIT,0
  670.     DB    'OF','F'+80H
  671.     DB    NPARIT,0
  672.     DB    0
  673. ;
  674. ;------------------
  675. ;SET WORD processor
  676. ;
  677. SETBIT:
  678.     LXI    D,BITTBL    ;point to argument table
  679.     CALL    TSRCH        ;look for match with allowed arguments
  680.     JC    SETERR        ;process error if found
  681.     LDA    MODMOD        ;get current mode command
  682.     ANI    (NOT WORD8) AND    255    ;mask away current bits
  683.     ORA    L        ;set new bits
  684.     CALL    ALTINI        ;change mode
  685. WORDHO:
  686.     CALL    ILPRT        ;show current status
  687.     DB    'WORD:',TAB,' ',0
  688.     LDA    MODMOD        ;get current mode word
  689.     ANI    WORD8        ;test for number of bits
  690.     JZ    SETERR
  691.     ANI    WORD8T
  692.     JNZ    B8        ;skip if it is
  693.     CALL    ILPRT
  694.     DB    '7 Bits',0
  695.     RET
  696. B8:
  697.     CALL    ILPRT
  698.     DB    '8 Bits',0
  699.     RET
  700. ;
  701. ;WORD argument table
  702. ;
  703. BITTBL:    DB    '8'+80H
  704.     DB    WORD8,0
  705.     DB    '7'+80H
  706.     DB    WORD7,0
  707.     DB    0
  708. ;
  709. ;SET STOP processor
  710. ;
  711. SETSTO:
  712.     LXI    D,STPTBL    ;point to argument table
  713.     CALL    TSRCH        ;look for match with allowed arguments
  714.     JC    SETERR        ;process error if found
  715.     LDA    MODMOD        ;get current mode command
  716.     ANI    (NOT STBIT2) AND 255     ;mask away current bits
  717.     ORA    L        ;set new bits
  718.     CALL    ALTINI        ;change mode
  719. STOSHO:
  720.     CALL    ILPRT        ;show current status
  721.     DB    'STOP:',TAB,' ',0
  722.     LDA    MODMOD        ;get current mode word
  723.     ANI    STBIT2        ;test for number of bits
  724.     JZ    SETERR
  725.     RLC
  726.     RLC
  727.     ADD    A        ;form word table index
  728.     LXI    H,STJTBL    ;get address of jump table
  729.     ADD    L        ;point to address of proper routine
  730.     MOV    L,A
  731.     MVI    A,0
  732.     ADC    H
  733.     MOV    H,A
  734.     MOV    A,M        ;get address of proper routine
  735.     INX    H
  736.     MOV    H,M
  737.     MOV    L,A
  738.     PCHL            ;branch to proper routine
  739. PRT1:
  740.     CALL    ILPRT
  741.     DB    '1 Bit',0
  742.     RET
  743. PRT2:
  744.     CALL    ILPRT
  745.     DB    '2 Bits',0
  746.     RET
  747. PRT15:
  748.     CALL    ILPRT
  749.     DB    '1.5 Bits',0
  750.     RET
  751. ;
  752. STJTBL:                ;jump table for stop bit show routines
  753.     DW    SETERR
  754.     DW    PRT1
  755.     DW    PRT15
  756.     DW    PRT2
  757. ;
  758. ;STOP argument table
  759. ;
  760. STPTBL:    DB    '1'+80H
  761.     DB    STBIT1,0
  762.     DB    '1.','5'+80H
  763.     DB    STBI15,0
  764.     DB    '2'+80H
  765.     DB    STBIT2,0
  766.     DB    0
  767. ;
  768. ;-----------------------------
  769. ;SET PULSE and TONE processors
  770.  
  771. SETPUL:
  772.     MVI    A,'P'        ;Set modem to pulse dial mode
  773.     STA    TPULSE        ;    "       "
  774.     JMP    DIASHO        ;Print out new mode.
  775.  
  776.  
  777. SETTON:
  778.     MVI    A,'T'        ;Set modem to tone dial mode
  779.     STA    TPULSE        ;    "       "
  780.     JMP    DIASHO        ;Print out new mode.
  781.  
  782.  
  783. DIASHO:    LDA    TPULSE        ;Output dialing type message
  784.     CPI    'P'        ;    "       "
  785.     JZ    PULPRN        ;    "       "
  786.     CALL    ILPRT        ;show current status
  787.     DB    'TONE',TAB,' Dial',0
  788.     RET            ;Return to calling program
  789.                 ;
  790. PULPRN:    CALL    ILPRT        ;show current status
  791.     DB    'PULSE',TAB,' Dial',0
  792.     RET            ;Return to calling program
  793.  
  794. ;-------------------------------------------------
  795. ; SET WAIT processor
  796.  
  797. SETDLY:    MVI    C,EVALA
  798.     CALL    MEX
  799.     MOV    A,H
  800.     ORA    A
  801.     JNZ    SETERR
  802.     MOV    A,L
  803.     STA    EXTRA1
  804.  
  805. DLYSHO:    CALL    ILPRT
  806.     DB    'WAIT:',TAB,' ',0
  807.     LDA    EXTRA1
  808.     MOV    L,A
  809.     MVI    H,0
  810.     MVI    C,DECOUT
  811.     CALL    MEX
  812.     CALL    ILPRT
  813.     DB    ' Seconds for Modem Result',0
  814.     RET
  815.  
  816. ;-------------------------------------------------
  817. ; SET UART Processor
  818. ;   as received the Conkey-64 BIOS runs the console USART at 7-bit. This
  819. ;   is wholly adequate for normal hobbyist CP/M type communications, a
  820. ;   problem was encountered when running the unit on a network to a
  821. ;   large mainframe. Here, 8-bit was required for terminal ID and other
  822. ;   "invisible" stuff.    The solution was the UART control routines
  823. ;   at the end of this overlay.  This SET command allows changing
  824. ;   it from normal 7-bit to 8-bit.  This option was included for
  825. ;   other experiments A/R. Normally it's 8-Bit at power. This can run
  826. ;   like this for all work.
  827. ;
  828. SETURT:
  829.     LXI    D,URTTBL    ;point to argument table
  830.     CALL    TSRCH        ;look for match with allowed arguments
  831.     JC    SETERR        ;process error if found
  832.     MOV    A,L        ;
  833.     STA    URTFLG        ;set flag
  834.     CALL    URTSET        ;set UART itself
  835. URTSHO:
  836.     CALL    ILPRT        ;show current status
  837.     DB    'UART:',TAB,' ',0
  838.     LDA    URTFLG        ;get current mode word
  839.     ORA    A        ;
  840.     JNZ    URT        ;skip if it is
  841.     CALL    ILPRT        ;print it
  842.     DB    '7 Bit Console',0
  843.     RET            ;
  844.                 ;
  845. URT:    CALL    ILPRT        ;print it
  846.     DB    '8 Bit Console',0        ;
  847.     RET            ;
  848. ;
  849. ;UART argument table
  850. ;
  851. URTTBL:    DB    '7'+80H
  852.     DB    0,0
  853.     DB    '8'+80H
  854.     DB    0FFH,0
  855.     DB    0
  856. ;
  857. ;-------------------------------------------------
  858. ; SET VT220 Processor
  859. ;   again this was a mainframe problem where, software on it changed
  860. ;   the VT220 being used back and forth from VT100 mode to VT220 mode.
  861. ;   If you left MEX while still in VT220 mode you'd get strange VT220
  862. ;   only characters. This SET command will turn on/off an option to
  863. ;   send a VT100 reset string to the terminal upon exiting MEX.
  864. ;
  865.  
  866. SETVT2:
  867.     LXI    D,VT2TBL    ;point to argument table
  868.     CALL    TSRCH        ;look for match with allowed arguments
  869.     JC    SETERR        ;process error if found
  870.     MOV    A,L        ;
  871.     STA    VT2FLG        ;
  872.  
  873. VT2SHO:
  874.     CALL    ILPRT        ;show current status
  875.     DB    'VT220:',TAB,' ',0
  876.     LDA    VT2FLG        ;get current mode word
  877.     ORA    A        ;
  878.     JNZ    VT2        ;skip if it is
  879.     CALL    ILPRT        ;
  880.     DB    'OFF',0        ;
  881.     RET            ;
  882.                 ;
  883. VT2:    CALL    ILPRT        ;print it
  884.     DB    'ON',0        ;
  885.     RET            ;
  886. ;
  887. ;VT220 argument table
  888. ;
  889. VT2TBL:    DB    'OF','F'+80H
  890.     DB    0,0
  891.     DB    'O','N'+80H
  892.     DB    0FFH,0
  893.     DB    0
  894.  
  895. ;-------------------------------------------------
  896. ; Compare next input-stream item in table @DE; CY=1
  897. ; if not found, else HL=matched data item
  898. ;
  899. TSRCH:    MVI    C,LOOKUP    ;get function code
  900.     JMP    MEX        ;pass to MEX processor
  901. ;
  902. ; Print in-line message ... blows away C register
  903. ;
  904. ILPRT:    MVI    C,ILP        ;get function code
  905.     JMP    MEX        ;go do it
  906.  
  907.  
  908. ;+----------------------------------------------------------------------+
  909. ;|           SPECIAL 8 BIT CONSOLE TRANSIENT ROUTINES         |
  910. ;+----------------------------------------------------------------------+
  911. ; Conkey has UART set up for 7-bit even parity....  this causes problems
  912. ; with VT-100 on mainframes and who knows what else.  This will make
  913. ; console UART port eight bit. Your terminal must be same.  Port
  914. ; is restored to normal on MEX exit.
  915. x
  916. CINVEC:    DS    2        ;Storage for current console vectors.
  917. COUVEC:    DS    2        ;    "       "          "
  918. URTFLG:    DB    0FFH        ;beware... do not default to 0
  919.  
  920. IF NOT VT220
  921. VT2FLG:    DB    0        ;VT220 exit string not used
  922. ENDIF
  923.  
  924. IF VT220
  925. VT2FLG:    DB    0FFH        ;VT220 exit string (VT100 mode) used.
  926. ENDIF
  927.  
  928. URTSET:    PUSH    D        ;save regs
  929.     PUSH    H        ; "  "
  930.     LDA    URTFLG        ;get flag
  931.     ORA    A        ;test it
  932.     JZ    SEVEN        ;jump to Seven or fall to Eight
  933.     MVI    A,01000000B    ;Select mode register.
  934.     OUT    41H        ;    "
  935.     MVI    A,01101110B    ;Set UART to 8 bit no parity 1 stop.
  936.     OUT    41H        ;    "       "
  937.     MVI    A,00100111B    ;re-enable transmitter and receiver.
  938.     OUT    41H        ;    "       "           "
  939.                 ;
  940.     LHLD    0001H        ;Save current console BIOS vectors.
  941.     LXI    D,7        ;    "       "          "
  942.     DAD    D        ;    "       "          "
  943.     PUSH    H        ;    "       "          "
  944.     MOV    A,M        ;    "       "          "
  945.     STA    CINVEC+0    ;    "       "          "
  946.     INX    H        ;    "       "          "
  947.     MOV    A,M        ;    "       "          "
  948.     STA    CINVEC+1    ;    "       "          "
  949.     INX    H        ;    "       "          "
  950.     INX    H        ;    "       "          "
  951.     MOV    A,M        ;    "       "          "
  952.     STA    COUVEC+0    ;    "       "          "
  953.     INX    H        ;    "       "          "
  954.     MOV    A,M        ;    "       "          "
  955.     STA    COUVEC+1    ;    "       "          "
  956.                 ;
  957.     POP    H        ;Set up new vectors.
  958.     LXI    D,UARTIN    ;    "
  959.     MOV    M,E        ;    "
  960.     INX    H        ;    "
  961.     MOV    M,D        ;    "
  962.     INX    H        ;    "
  963.     INX    H        ;    "
  964.     LXI    D,UARTOU    ;    "
  965.     MOV    M,E        ;    "
  966.     INX    H        ;    "
  967.     MOV    M,D        ;    "
  968.                 ;
  969.     POP    H        ;Restore registers.
  970.     POP    D        ;    "
  971.                 ;
  972.     RET            ;Return to calling program.
  973.                 ;
  974. SEVEN:    MVI    A,01000000B    ;Select mode register.
  975.     OUT    41H        ;    "
  976.     MVI    A,01111010B    ;Set UART to 7 bit even parity 1 stop.
  977.     OUT    41H        ;    "       "
  978.     MVI    A,00100111B    ;re-enable transmitter and receiver.
  979.     OUT    41H        ;    "       "           "
  980.                 ;
  981.     LHLD    0001H        ;Save current console BIOS vectors.
  982.     LXI    D,7        ;    "       "          "
  983.     DAD    D        ;    "       "          "
  984.     LDA    CINVEC+0    ;    "       "          "
  985.     MOV    M,A        ;    "       "          "
  986.     INX    H        ;    "       "          "
  987.     LDA    CINVEC+1    ;    "       "          "
  988.     MOV    M,A        ;    "       "          "
  989.     INX    H        ;    "       "          "
  990.     INX    H        ;    "       "          "
  991.     LDA    COUVEC+0    ;    "       "          "
  992.     MOV    M,A        ;    "       "          "
  993.     INX    H        ;    "       "          "
  994.     LDA    COUVEC+1    ;    "       "          "
  995.     MOV    M,A        ;    "       "          "
  996.                 ;
  997.     POP    H        ;Restore registers.
  998.     POP    D        ;    "
  999.     RET            ;Return to calling program.
  1000.                 ;
  1001. GOODBYE:LDA    VT2FLG        ;check VT220 flag
  1002.     ORA    A        ;it set then send string
  1003.     LXI    D,VTMSG        ;load exit string
  1004.     MVI    C,PRINT        ;send it to terminal
  1005.     CNZ    MEX        ;let MEX do it
  1006.     MVI    A,0        ;set A to 0
  1007.     STA    URTFLG        ;change URT flag
  1008.     CALL    URTSET        ;make UART normal (7-bit)
  1009.     LXI    D,EXIMSG    ;load DE with Exit Msg.
  1010.     MVI    C,PRINT        ;load exit msg string (gets UART working right)
  1011.     CALL    MEX        ;let MEX do it
  1012.     RET            ;
  1013.                 ;
  1014. EXIMSG:    DB    CR,LF        ;send some chars. to screen after resetting    DB    '   ',CR,LF,'$'
  1015.     DB    ' ',CR,LF,'$'    ;the UART
  1016.  
  1017. VTMSG:    DB    '        ',ESC,'[61"p',CR,LF,'$'    ;VT100 mode string
  1018.  
  1019. UARTIN:    IN    41H        ;Wait for data.
  1020.     ANI    00000010B    ;    "
  1021.     JZ    UARTIN        ;    "
  1022.                 ;
  1023.     IN    41H        ;Check for errors.
  1024.     ANI    00110000B    ;    "
  1025.     JZ    NOERR        ;    "
  1026.     MVI    A,00110111B    ;Reset the error flags.
  1027.     OUT    41H        ;    "
  1028.                 ;
  1029. NOERR:    IN    40H        ;Load acc with data.
  1030.                 ;
  1031.     RET            ;Return to calling program.
  1032.  
  1033.  
  1034.  
  1035. UARTOU:    IN    41H        ;Wait for UART to become ready.
  1036.     ANI    00000001B    ;    "       "
  1037.     JZ    UARTOU        ;    "       "
  1038.                 ;
  1039.     MOV    A,C        ;Output data to console UART.
  1040.     OUT    40H        ;    "       "
  1041.     RET            ;Return to calling program.
  1042.     ENDIF            ;
  1043.                 ;
  1044.                 ;
  1045.     END            ;end of MXH-CCnn
  1046.