home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / mex / mxo-ap31.aqm / MXO-AP31.ASM
Assembly Source File  |  1985-08-05  |  46KB  |  1,473 lines

  1. ;    TITLE  'MEX Overlay for Apple ][ / Applicard / Smartmodem'
  2. ;
  3. ;  MXO-AP30.ASM created 01/28/85   by   Henry Middlebrook
  4. ;
  5. REV    EQU    31        ; 03 Feb 1985
  6. ;
  7. ; This overlay file enables Apple ][ computers to use the following
  8. ; Apple hardware configuration with MEX112:
  9. ;
  10. ;    > Mountain CPS Multi-Function and 6 MHz PCPI AppliCard <
  11. ;            - Henry Middlebrook [70766,766]
  12. ;                January 28, 1985
  13. ;
  14. ; This overlay is written in three distinct parts as a "MIXED" type of
  15. ; overlay for MEX.  The parts follow the guidelines available in the
  16. ; MEX OVERLAY LIST #2 (01/06/85 -- Ron Fowler, NightOwl Sofware) with
  17. ; reference to the PORT, MODEM, and PATCH overlay types.  Thus, you
  18. ; should be able to remove or add any one of the three parts without
  19. ; severely affecting the overlay operation.  Naturally, removing the
  20. ; first section (PORT) will completely disable MEX; however, removing
  21. ; or changing the the MODEM (derived from MXO-SM13.ASM) section or
  22. ; the PATCH (MEXPAT11.ASM) will minimally affect operation (see LSTST
  23. ; and SSET).
  24. ;
  25. ; The three part in order are:
  26. ;
  27. ;    1. PORT -- Supports Apple ][+/e with PCPI Applicard and
  28. ;           Mountain Computer cards.  Contains all vectors
  29. ;           and equates from MDM7xx series as updated for MEX.
  30. ;
  31. ;    2. MODEM - This is basically the "officially sanctioned" version
  32. ;           of the Hayes Smartmodem 1200 overlay, MXO-SM13.ASM.
  33. ;           Several redundant EQUs and Conditionals have been
  34. ;           removed or commented out of the source code.
  35. ;
  36. ;    3. PATCH - The MEXPAT11.ASM file was pulled into this overlay
  37. ;           and modified to suit the author's needs and whims.
  38. ;           Using the patch file as listed adds vector for a
  39. ;           precise LSTST vector.
  40. ;
  41. ; >>>>  NOTE:      Previous versions of MXO-APxx do NOT properly support
  42. ;        the PCPI Applicard.  You may not like this overlay;
  43. ;        however, you can use it as a reliable guide.
  44. ;
  45. ; This overlay includes many comments and instructional lines from
  46. ; the `full' overlays.  These may be commented out or passed along
  47. ; as you see fit.
  48. ;                HM    02/04/85
  49. ;
  50. ;----------------------------------------------------------------------
  51. ;            Overlay Update History
  52. ;
  53. ; 02/03/85 - Added TIME and SET functions -AP31    - Henry Middlebrook
  54. ; 01/28/85 - Created MXO original overlay -AP30    - Henry Middlebrook
  55. ;
  56. ;======================================================================
  57.  
  58. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  59. ;
  60. ;            PORT OVERLAY SECTION
  61. ;
  62. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  63. ;
  64. ;
  65. BELL        EQU    07H    ;bell
  66. CR        EQU    0DH    ;carriage return
  67. ESC        EQU    1BH    ;escape
  68. LF        EQU    0AH    ;linefeed
  69. TAB        EQU    09H    ;tab
  70. YES        EQU    0FFH
  71. NO        EQU    0
  72. ;
  73. ;
  74. ;----------------------------------------------------------------------
  75. ;
  76. ;        Equates for BIOS LISTST correction
  77. ;        ----------------------------------
  78. ;
  79. ; MEX support LST and LSTST vectors to custom routines in this
  80. ; overlay.  The EQUs must be properly set in MEXPAT section at
  81. ; end of this code and the routines equates below are for printer
  82. ; I/O specific routines at the end of the modem overlay (WR$PRT).
  83. ;
  84. ; Equates for optional printer routine (for SUPER-MX parallel Epson)
  85. ;
  86. USERPRINTER    EQU    YES
  87. ;
  88. PSLOT        EQU    1    ;Printer slot
  89. PTRSTATP    EQU    0C081H + (PSLOT * 10H)    ;Printer stat address
  90. PTRDATP        EQU    0C081H + (PSLOT * 10H)    ;Printer data out addr
  91. PTRSTBP1    EQU    0C082H + (PSLOT * 10H)    ;Strobe address #1
  92. PTRSTBP2    EQU    0C080H + (PSLOT * 10H)    ;Strobe address #2
  93. PTR$RDY        EQU    01H            ;Printer ready mask
  94. ;
  95. ;----------------------------------------------------------------------
  96. ;
  97. ;    Mountain CPS Serial I/O and Clock equates and routines
  98. ;    ------------------------------------------------------
  99. ;
  100. CPSLOT        EQU    2
  101. ;
  102. MODDATP        EQU    0C0FAH + (CPSLOT*100H)    ;serial port of CPS card
  103. MODCTLP        EQU    0C0FBH + (CPSLOT*100H)    ;status port of CPS card
  104. MODCTLP2    EQU    0C0FEH + (CPSLOT*100H)    ;control port of CPS card
  105. ;
  106. CLKPORT        EQU    0C0FEH + (CPSLOT*100H)    ;control port for Clock
  107. CLKDATA        EQU    0C0F9H + (CPSLOT*100H)    ;data port for Clock
  108. CLKHOLD        EQU    040H            ;stop clock for read
  109. CLKREAD        EQU    050H            ;set clock read mode
  110. ;
  111. RDBYTE        EQU    0FFE0H    ;Read a Byte from Apple (A = BYTE)
  112. WRBYTE        EQU    0FFE3H    ;Write a Byte to Apple (C = BYTE)
  113. RDWORD        EQU    0FFE6H    ;Read 2 Bytes from Apple (DE = BYTES)
  114. WRWORD        EQU    0FFE9H    ;Write 2 Bytes to Apple (DE = BYTES)
  115. RDNBYTS        EQU    0FFECH    ;Read N Bytes (DE = COUNT, HL = BUFFER)
  116. WRNBYTS        EQU    0FFEFH    ;Write N Bytes (DE = COUNT, HL = BUFFER)
  117. ;
  118. PEEK1BYTE    EQU    6    ;Command to Peek 1 Byte in the Apple
  119. POKE1BYTE    EQU    7    ;Command to Poke 1 Byte to the Apple
  120. ;
  121. ; Status bit equates for CPS serial port
  122. ;
  123. MDSNDB        EQU    01H
  124. MDSNDR        EQU    01H
  125. MDRCVB        EQU    02H
  126. MDRCVR        EQU    02H
  127. ;
  128. ; Equates for PSW (Parity, Stop Bit, Word Length) used by CPS UART
  129. ;
  130. P8N1        EQU    04EH    ;8 NONE 1
  131. P7E1        EQU    0EAH    ;7 EVEN 1
  132. P7O1        EQU    055H    ;7 ODD 1
  133. P7N1        EQU    045H    ;7 NONE 1
  134. ;
  135. ;----------------------------------------------------------------------
  136. ;
  137. ;            MEX OVERLAY INFORMATION
  138. ;
  139. ; This is a general purpose MEX modem overlay file. You can use it as
  140. ; a model for designing your own modem overlay (or you can use any
  141. ; existing MDM7 overlay, if available).
  142. ;
  143. ; If you use this as a template for writing your own overlay, and
  144. ; distribute it to others, please pare down these comments as much
  145. ; as possible (to keep the overlays small). I'll maintain this file
  146. ; with as many notes and references as possible, but this will hope-
  147. ; fully be the only "big" overlay.
  148. ;
  149. ; There are advantages to recoding your overlay to conform to the
  150. ; techniques presented here: MEX 2.0 will likely have a much simpler
  151. ; overlay structure; if you stick to the label names and coding
  152. ; suggestions used here, you'll easily be able to follow the overlay
  153. ; upgrade instructions when MEX 2.0 hits the streets. Also, you can
  154. ; make use of the MEX service processor to write a very versatile
  155. ; SET command (as done here).
  156. ;
  157. ; Note that all overlays may freely use memory up to 0CFFH.  If your
  158. ; overlay must work with the MEX Smartmodem overlay (MXO-SMxx.ASM),
  159. ; the physical modem overlay should terminate by 0AFFH.
  160. ;
  161. ; For purposes of example, this is a "full-featured" MEX overlay.  In
  162. ; practice, your overlay may be much simpler (all that is really re-
  163. ; quired is the modem I/O code; fancy stuff like the SET command, and
  164. ; even the disconnect routine, may be left open.  You will need DIAL
  165. ; code, though, unless your modem doesn't support autodialing).
  166. ;
  167. ;
  168. ;    MEX Service Processor Calls  (User's Guide - Appendix #4)
  169. ;    ---------------------------------------------------------
  170. ;
  171. ; MEX service processor stuff ... MEX supports an overlay service
  172. ; processor, located at 0D00H (and maintained at this address from
  173. ; version to version).  If your overlay needs to call BDOS for any
  174. ; reason, it should call MEX instead; function calls below about
  175. ; 240 are simply passed on to the BDOS (console and list I/O calls
  176. ; are specially handled to allow modem port queueing, which is why
  177. ; you should call MEX instead of BDOS).  MEX uses function calls
  178. ; above about 244 for special overlay services (described below).
  179. ;
  180. ; Some sophisticated overlays may need to do file I/O; if so, use
  181. ; the PARSFN MEX call with a pointer to the FCB in DE to parse out
  182. ; the name.  This FCB should support a spare byte immediately pre-
  183. ; ceeding the actual FCB (to contain user # information).  If you've
  184. ; used MEX-10 for input instead of BDOS-10 (or you're parsing part
  185. ; of a SET command line that's already been input), then MEX will
  186. ; take care of DU specs, and set up the FCB accordingly.  There-
  187. ; after all file I/O calls done through the MEX service processor
  188. ; will handle drive and user with no further effort necessary on
  189. ; the part of the programmer.
  190. ;
  191. MEX    EQU    0D00H    ;address of the service processor
  192. INMDM    EQU    255    ;get char from port to A, CY=no more in 100 ms
  193. TIMER    EQU    254    ;delay 100ms * reg B
  194. TMDINP    EQU    253    ;B=# secs to wait for char, cy=no char
  195. CHEKCC    EQU    252    ;check for ^C from KBD, Z=present
  196. SNDRDY    EQU    251    ;test for modem-send ready
  197. RCVRDY    EQU    250    ;test for modem-receive ready
  198. SNDCHR    EQU    249    ;send a character to the modem (after sndrdy)
  199. RCVCHR    EQU    248    ;recv a char from modem (after rcvrdy)
  200. LOOKUP    EQU    247    ;table search: see CMDTBL comments for info
  201. PARSFN    EQU    246    ;parse filename from input stream
  202. BDPARS    EQU    245    ;parse baud-rate from input stream
  203. SBLANK    EQU    244    ;scan input stream to next non-blank
  204. EVALA    EQU    243    ;evaluate numeric from input stream
  205. LKAHED    EQU    242    ;get nxt char w/o removing from input
  206. GNC    EQU    241    ;get char from input, cy=1 if none
  207. ILP    EQU    240    ;inline print
  208. DECOUT    EQU    239    ;decimal output
  209. PRBAUD    EQU    238    ;print baud rate
  210. PRNTBL    EQU    237    ;print command table in columns (HL=addr)
  211. PRID    EQU    236    ;print MEX ID string on console
  212. ;
  213. CONOUT    EQU    2    ;simulated BDOS function 2: console char out
  214. PRINT    EQU    9    ;simulated BDOS function 9: print string
  215. INBUF    EQU    10    ;input buffer, same structure as BDOS 10
  216. ;
  217. ;
  218. ;======================================================================
  219. ;
  220.     ORG    100H    ;we begin
  221. ;
  222.     DS    3    ;MEX has a JMP START here            100H
  223. ;
  224. ; The following variables are located at the beginning of the program
  225. ; to facilitate modification without the need of re-assembly. They will
  226. ; be moved in MEX 2.0.
  227. ;
  228. PMODEM:    DB    YES    ;\ / These two locations are            103H
  229. SMODEM:    DB    NO    ;/ \ not referenced by MEX.            104H
  230. TPULSE:    DB    'T'    ;Tone/Pulse (used only in Smodem overlay)    105H
  231. CLOCK:    DB    60    ;clock speed x .1, up to 25.5 mhz.        106H
  232. MSPEED:    DB    5    ;sets display time for sending a file        107H
  233.             ;0=110    1=300  2=450  3=600  4=710
  234.             ;5=1200 6=2400 7=4800 8=9600 9=19200
  235. BYTDLY:    DB    1    ;default time to send character in        108H
  236.             ;terminal mode file transfer (0-9)
  237.             ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  238. CRDLY:    DB    1    ;end-of-line delay in terminal            109H
  239.             ;mode file transfer for slow BBS systems
  240.             ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  241. COLUMS:    DB    5    ;number of directory columns            10AH
  242. SETFL:    DB    YES    ;yes=user-defined SET command            10BH
  243. SCRTST:    DB    YES    ;yes=if home cursor and clear screen        10CH
  244.             ;routine at CLRSCRN
  245.     DB    0    ;was once ACKNAK, now spare            10DH
  246. BAKFLG:    DB    NO    ;yes=make .BAK file                10EH
  247. CRCDFL:    DB    YES    ;yes=default to CRC checking            10FH
  248.             ;no=default to Checksum checking
  249. TOGCRC:    DB    YES    ;yes=allow toggling of Checksum to CRC        110H
  250. CVTBS:    DB    NO    ;yes=convert backspace to rub            111H
  251. TOGLBK:    DB    YES    ;yes=allow toggling of bksp to rub        112H
  252. ADDLF:    DB    NO    ;no=no LF after CR to send file in        113H
  253.             ;terminal mode (added by remote echo)
  254. TOGLF:    DB    YES    ;yes=allow toggling of LF after CR        114H
  255. TRNLOG:    DB    NO    ;yes=allow transmission of logon        115H
  256.             ;write logon sequence at location LOGON
  257. SAVCCP:    DB    YES    ;yes=do not overwrite CCP            116H
  258. LOCNXT:    DB    NO    ;yes=local cmd if EXTCHR precedes        117H
  259.             ;no=not local cmd if EXTCHR precedes
  260. TOGLOC:    DB    YES    ;yes=allow toggling of LOCNXTCHR        118H
  261. LSTTST:    DB    YES    ;yes=allow toggling of printer on/off        119H
  262.             ;in terminal mode. Set to no if using
  263.             ;the printer port for the modem
  264. XOFTST:    DB    YES    ;yes=allow testing of XOFF from remote        11AH
  265.             ;while sending a file in terminal mode
  266. XONWT:    DB    NO    ;yes=wait for XON after sending CR while    11BH
  267.             ;transmitting a file in terminal mode    
  268. TOGXOF:    DB    YES    ;yes=allow toggling of XOFF testing        11CH
  269. IGNCTL:    DB    NO    ;yes=do not send control characters        11DH
  270.             ;above CTL-M to CRT in terminal mode
  271.             ;no=send any incoming CTL-char to CRT
  272. EXTRA1:    DB    0    ;for future expansion                11EH
  273. EXTRA2:    DB    0    ;for future expansion                11FH
  274. BRKCHR:    DB    '@'-40H    ;^@ = Send a 300 ms. break tone            120H
  275. NOCONN:    DB    'N'-40H    ;^N = Disconnect from phone line        121H
  276. LOGCHR:    DB    'L'-40H    ;^L = Send logon                122H
  277. LSTCHR:    DB    'P'-40H    ;^P = Toggle printer                123H
  278. UNSVCH:    DB    'R'-40H    ;^R = Close input text buffer            124H
  279. TRNCHR:    DB    'T'-40H    ;^T = Transmit file to remote            125H
  280. SAVCHR:    DB    'Y'-40H    ;^Y = Open input text buffer            126H
  281. EXTCHR:    DB    '^'-40H    ;^^ = Send next character            127H
  282. ;
  283. ; Equates used only by PMMI routines grouped together here.
  284. ;
  285. PRATE:    DB    125    ;125=20pps dialing, 250=10pps            128H
  286.     DB    0    ;not used                    129H
  287. ;
  288. ; Low-level modem I/O routines: this will be replaced with
  289. ; a jump table in MEX 2.0 (you can insert jumps here to longer
  290. ; routines if you'd like ... I'd recommend NOT putting part of
  291. ; a routine in this area, then jumping to the rest of the routine
  292. ; in the non-fixed area; that will complicate the 2.0 conversion)
  293. ;
  294. IN$MODCTLP:    JMP    RD$MODCTLP     ;                12AH
  295.         DS    7
  296. OUT$MODDATP:    JMP    WR$MODDATP    ;                134H
  297.         DS    7
  298. IN$MODDATP:    JMP    RD$MODDATP    ;                13EH
  299.         DS    7
  300. ;
  301. ; Bit-test routines.  These will be merged with the above
  302. ; routines in MEX 2.0 to provide a more reasonable format
  303. ;
  304. MASKR:        ANI    MDRCVB ! RET    ;bit to test for receive ready    148H
  305. TESTR:        CPI    MDRCVR ! RET    ;value of rcv. bit when ready    14BH
  306. MASKS:        ANI    MDSNDB ! RET    ;bit to test for send ready    14EH
  307. TESTS:        CPI    MDSNDR ! RET    ;value of send bit when ready    151H
  308. ;
  309. ; Unused area: was once used for special PMMI functions, now used only
  310. ; to retain compatibility with MDM overlays. You may use this area for
  311. ; any miscellaneous storage you'd like but the length of the area
  312. ; >> MUST << be 12 bytes.
  313. ;
  314.         DS    12        ;PMMI only calls        154H
  315. ;
  316. ; Special modem function jump table: if your overlay cannot handle
  317. ; some of these, change the jump to "DS 3", so the code present in
  318. ; MEX will be retained.  Thus, if your modem can't dial, change the
  319. ; JMP PDIAL at DIALV to DS 3, and MEX will print a "not-implemented"
  320. ; diagnostic for any commands that require dialing.
  321. ;
  322. ; DIALV  dials the digit in A. See the comments at PDIAL for specs.
  323. ;
  324. ; DISCV  disconnects the modem
  325. ;
  326. ; GOODBV is called just before MEX exits to CP/M.  If your overlay
  327. ;        requires some exit cleanup, do it here.
  328. ;
  329. ; INMODV is called when MEX starts up; use INMODV to initialize the modem.
  330. ;
  331. ; NEWBDV is used for phone-number baud rates and is called with a baud-rate
  332. ;        code in the A register, value as follows:
  333. ;
  334. ;     A=0:   110 baud       A=1:   300 baud      A=2:   450 baud
  335. ;     A=3:   600 baud       A=4:   710 baud      A=5:  1200 baud
  336. ;     A=6:  2400 baud       A=7:  4800 baud      A=8: 19200 baud
  337. ;
  338. ;        If your overlay supports the passed baud rate, it should store the
  339. ;     value passed in A at MSPEED (107H), and set the requested rate. If
  340. ;     the value passed is not supported, you should simply return (with-
  341. ;     out modifying MSPEED) -or- optionally request a baud-rate from the
  342. ;     user interactively.
  343. ;
  344. ; NOPARV is called at the end of each file transfer; your overlay may simply
  345. ;     return here, or you may want to restore parity if you set no-parity
  346. ;     in the following vector (this is the case with the PMMI overlay).
  347. ;     
  348. ; PARITV is called at the start of each file transfer; your overlay may 
  349. ;     simply return here, or you may want to enable parity detection
  350. ;     (this is the case with the PMMI overlay).
  351. ;
  352. ; SETUPV is the user-defined command ... to use this routine to build your
  353. ;     own MEX command, set the variable SETFL (117H) non-zero, and add
  354. ;     your SET code.  You can use the routine presented in the PMMI
  355. ;     overlay as a guide for parsing, table lookup, etc.
  356. ;
  357. ; SPMENU is provided only for MDM compatibility, and is not used by
  358. ;      MEX 1.0 for any purpose (it will be gone in MEX 2).
  359. ;
  360. ; VERSNV is called immediately after MEX prints its sign-on message at cold
  361. ;     startup -- use this to identify your overlay in the sign-on message
  362. ;     (include overlay version number in the line).
  363. ;
  364. ; BREAKV is provided for sending a BREAK (<ESC>-B in terminal mode).  If
  365. ;     your modem doesn't support BREAK, or you don't care to code a
  366. ;     BREAK routine, you may simply execute a RET instruction.
  367. ;
  368. ;
  369. LOGON:        DS    2        ;not used by MEX          160H
  370. DIALV:        JMP    DIAL        ;dial a digit in A (ref SMOVL)    162H
  371. DISCV:        JMP    DISCON        ;drops DTR to hang-up fast!    165H
  372. GOODBV:        JMP    GOODBYE        ;called before exit to CPM    168H
  373. INMODV:        JMP    INITMOD        ;go to user written routine    16BH
  374. NEWBDV:        JMP    PBAUD        ;changes baud with phone #    16EH
  375. NOPARV:        RET  !    NOP  !    NOP    ;set modem for no-parity     171H
  376. PARITV:        RET  !    NOP  !    NOP    ;set modem parity             174H
  377. SETUPV:        JMP    SETCMD        ;                177H
  378. SPMENV:        DS     3        ;not used by MEX        17AH
  379. VERSNV:        JMP    SYSVER        ;                17DH
  380. BREAKV:        JMP    SENDBRK        ;                180H
  381. ;
  382. ; The following jump vector provides the overlay with access to special
  383. ; routines in the main program (retained and supported in the main pro-
  384. ; gram for MDM overlay compatibility). These should not be modified by
  385. ; the overlay.
  386. ;
  387. ; Note that for MEX 2.0 compatibility, you should not try to use these
  388. ; routines, since this table will go away with MEX 2.0 (use the MEX
  389. ; service call processor instead).
  390. ;
  391. ILPRTV:        DS    3    ;replace with MEX function 9         183H
  392. INBUFV:        DS    3    ;replace with MEX functin 10        186H
  393. ILCMPV:        DS    3    ;replace with table lookup funct 247    189H
  394. INMDMV:        DS    3    ;replace with MEX function 255        18CH
  395. NXSCRV:        DS    3    ;not supported by MEX            18FH
  396. TIMERV:        DS    3    ;replace with MEX function 254        192H
  397. ;
  398. ; Clear/screen and clear/end-of-screen. Each routine must use the
  399. ; full 9 bytes alloted (may be padded with nulls).
  400. ;
  401. ; These routines (and other screen routines that MEX 2.0 will sup-
  402. ; port) will be accessed through a jump table in 2.0, and will be
  403. ; located in an area that won't tie the screen functions to the
  404. ; modem overlay (as the MDM format does).
  405. ;
  406. CLREOS:        LXI    D,EOSMSG    ;                195H
  407.         MVI    C,PRINT
  408.         CALL    MEX
  409.         RET            ;                19DH
  410. ;
  411. CLS:        LXI    D,CLSMSG    ;                19EH
  412.         MVI    C,PRINT
  413.         CALL    MEX
  414.         RET            ;                1A6H
  415. ;
  416. ;
  417. ;
  418. ;        *** END OF FIXED FORMAT AREA ***
  419. ;
  420. ;**********************************************************************
  421. ;
  422. ; These routines a specific to the Apple ][+ with Applicard.  The
  423. ; routines read modem hardware (CPS Serial I/O and Clock) directly from
  424. ; the Applicard.
  425. ;
  426. ; Read the Serial Status Port of UART
  427. ;
  428. RD$MODCTLP:    PUSH    D
  429.         LXI    D,MODCTLP
  430.         CALL    PEEK
  431.         POP    D
  432.         RET
  433. ;
  434. ;
  435. ; Write to the Serial Status Port of UART
  436. ;
  437. WR$MODCTLP:    PUSH    D
  438.         LXI    D,MODCTLP
  439.         CALL    POKE
  440.         POP    D
  441.         RET
  442. ;
  443. ;
  444. ; Write to the CPS Card SCR to activate secondary UART functions
  445. ;
  446. WR$MODCTLP2:    PUSH    D
  447.         LXI    D,MODCTLP2
  448.         CALL    POKE
  449.         POP    D
  450.         RET
  451. ;
  452. ;
  453. ; Read the Serial Data from the UART
  454. ;
  455. RD$MODDATP:    PUSH    D
  456.         LXI    D,MODDATP
  457.         CALL    PEEK
  458.         POP    D
  459.         RET
  460. ;
  461. ;
  462. ; Write to the Serial Data Port of the UART
  463. ;
  464. WR$MODDATP:    PUSH    D
  465.         LXI    D,MODDATP
  466.         CALL    POKE
  467.         POP    D
  468.         RET
  469. ;
  470. ;
  471. ; Write to CPS hardware to activate card for CLOCK functions
  472. ; (duplicates WR$MODCTLP2 routine above).
  473. ;
  474. WR$CLKSTAT:    PUSH    D
  475.         LXI    D,CLKPORT
  476.         CALL    POKE
  477.         POP    D
  478.         RET
  479. ;
  480. ;
  481. ; Read a single byte from the CPS Card OKI 5832 clock chip
  482. ;
  483. RD$CLKDATA:    PUSH    D
  484.         LXI    D,CLKDATA
  485.         CALL    PEEK
  486.         POP    D
  487.         RET
  488. ;
  489. ;
  490. ; Peek at 1 byte from Apple 6502 address space
  491. ; ENTRY: DE = Address in Apple
  492. ; EXIT:    A = Data
  493. ;
  494. PEEK:    PUSH    B
  495.     MVI    C,PEEK1BYTE
  496.     CALL    WRBYTE
  497.     CALL    WRWORD
  498.     CALL    RDBYTE
  499.     POP    B
  500.     RET
  501. ;
  502. ;
  503. ; Poke 1 byte to Apple 6502 address space
  504. ; ENTRY: DE = Address in Apple
  505. ; EXIT:    A = Data
  506. ;
  507. POKE:    PUSH    B
  508.     MOV    B,A
  509.     MVI    C,POKE1BYTE
  510.     CALL    WRBYTE
  511.     CALL    WRWORD
  512.     MOV    C,B
  513.     CALL    WRBYTE
  514.     POP    B
  515.     RET
  516. ;
  517. ;----------------------------------------------------------------------
  518. ;
  519. ; This routine sends a timed (1 second) Break to modem from CPS card.
  520. ;
  521. SENDBRK:    CALL    OPENCMD        ;open the command register
  522.         MVI    A,3FH        ;BREAK byte for CPS CR register    
  523.         CALL    WR$MODCTLP    ;send to CPS cmd reg
  524.         MVI    B,10
  525.         MVI    C,TIMER
  526.         CALL    MEX        ;send BREAK for 1 second
  527.         MVI    A,37H
  528.         CALL    WR$MODCTLP    ;back to normal operation
  529.         CALL    CLOSECMD    ;close the command register
  530.         RET
  531. ;
  532. ;.....
  533. ;
  534. ; You can add your own routine here to set DTR low and/or send a break
  535. ; tone to disconnect.
  536. ;
  537. GOODBYE:    RET        ;just return for MEX to allow return
  538.                 ;to system w/o dropping line
  539. ;
  540. ;.....
  541. ;
  542. ; The following may be used to initialize the Mountain Hardware CPS
  543. ; Multifunction Card for eight bits, no parity, one stop bit, and
  544. ; 1200 baud.  This does not alter the CPS defaults outside of MEX
  545. ;
  546. INITMOD: 
  547.     MVI    A,5        ;set default baud rate to 1200
  548.     CALL     PBAUD
  549.     MVI    A,P8N1        ;set PSW default to 8N1
  550.     STA    PSWSET        ;save for future reference
  551. ;
  552. INITMOD1:
  553.     CALL    OPENCMD        ;Open CPS command register
  554.     MVI    A,37H        ;initialize the serial chip
  555.     CALL    WR$MODCTLP    ;by storing 37H in CPS Cmd Reg
  556.     LDA    PSWSET        ;get current PSW value (def = 04EH) 
  557.     CALL    WR$MODDATP    ;store in CPS Mode Reg 1
  558.     LDA     BDSET           ;set baud rate at BDSET by storing
  559.     CALL    WR$MODDATP    ;in CPS Mode Reg 2 -- (the two
  560.                 ;registers cycle with each write)
  561.     CALL    CLOSECMD    ;Close CPS command register
  562.     LDA    BDSET        ;also return with current Baud setting
  563.     RET
  564. ;
  565. ;.....
  566. ;
  567. ; Routines used to open and close CPS command register.  If OPEN, then
  568. ; UART CR register (DTR, RTS, Break) and Mode 1 and 2 Registers (FSW
  569. ; and Baud) are selected for write. (Note that Mode 1/2 are accessed
  570. ; sequentially by writing to MODDATP -- modem data address in Apple).
  571. ; The CR register is accessed with WR$MODCTLP and the Mode 1/2 registers
  572. ; are accessed (for WRITE only) with WR$MODDATP.
  573. ;
  574. ; If CLOSED, then UART status register may be read (RxRDY, TxRDY, PE,
  575. ; FE, DCD, DSR) with RD$MODCTLP.  Also Serial Data can be sent to
  576. ; and from the CPS card with WR$MODDATP and RD$MODDATP.
  577. ;
  578. OPENCMD:            ;Open the CPS command register
  579.     MVI    A,80H
  580.     JMP    WR$MODCTLP2
  581. ;
  582. ;
  583. CLOSECMD:            ;Close the CPS command register
  584.     MVI    A,0
  585.     JMP    WR$MODCTLP2
  586. ;
  587. ;.....
  588. ;
  589. ; This routine drops DTR to force modem to disconnect.  Does NOT do
  590. ; any initialization.
  591. ;
  592. DISCON:    CALL    OPENCMD        ;Open the command register
  593.     MVI    A,05H        ;Turn off DTR
  594.     CALL    WR$MODCTLP
  595.     MVI    B,10        ;Wait 1 second
  596.     MVI     C,TIMER
  597.     CALL    MEX
  598.     MVI    A,37H        ;Turn everything back on
  599.     CALL    WR$MODCTLP
  600.     CALL    CLOSECMD    ;Close the cmd register
  601.     MVI    B,10        ;Wait 1 second air to clear
  602.     MVI    C,TIMER
  603.     CALL    MEX
  604.     RET
  605. ;
  606. ;.....
  607. ;
  608. ; This routine changes the modem baud rate with phone list entry
  609. ;
  610. ; Set baud-rate code in A (if supported by your modem overlay).  PMMI
  611. ; supports only five rates, which are validated here. NOTE: this routine
  612. ; (ie, the one vectored through NEWBDV) should update MSPEED with the
  613. ; passed code, but ONLY if that rate is supported by the hardware.
  614. ;
  615. PBAUD:    PUSH    H        ;don't alter anybody
  616.     PUSH    D
  617.     PUSH    B
  618.     MOV    E,A        ;code to DE
  619.     MVI    D,0
  620.     LXI    H,BAUDTB    ;offset into table
  621.     DAD    D
  622.     MOV    A,M        ;fetch code
  623.     ORA    A        ;0? (means unsupported code)
  624.     JZ    PBEXIT        ;exit if so
  625.     STA    BDSET         ;good rate, set it
  626.     MVI    A,P8N1        ;need to get default PSW
  627.     STA    PSWSET        ;and save it
  628.     CALL    INITMOD1    ;Baud set, returns w/ A = Baud byte
  629.     STA    BAUDSV        ;save it
  630.     MOV    A,E        ;get speed code back
  631.     STA    MSPEED        ;make it current
  632.     JMP    PBEXIT + 1    ;jump error flag set
  633. PBEXIT:    STC            ;set return error for STBAUD caller
  634.     POP    B        ;all done
  635.     POP    D
  636.     POP    H
  637.     RET
  638. ;
  639. ; Table of baud rate parameters for supported rates
  640. ;
  641. BAUDTB:    DB    032H,035H,0,036H,0        ;110,300,450,610,710
  642.     DB    037H,03AH,03CH,03EH,03FH    ;1200,2400,4800,9600,19200
  643. BAUDSV: DB    037H            ;current baud byte
  644. BDSET:    DB    037H            ;current and default baud byte
  645. ;
  646. ;.....
  647. ;
  648. ; Sign-on message
  649. ;
  650. SYSVER:    LXI    D,VERMSG
  651.     MVI    C,PRINT
  652.     CALL    MEX
  653.     CALL    TIMMSG        ;prints 'current time is .... '
  654.     CALL    CRLF
  655.     RET
  656. ;
  657. ;.....
  658. ;
  659. ; Newline on console
  660. ;
  661. CRLF:    MVI    A,CR
  662.     CALL    TYPE
  663.     MVI    A,LF        ;fall into TYPE
  664. ;
  665. ; type char in A on console
  666. ;
  667. TYPE:    PUSH    H        ;save 'em
  668.     PUSH    D
  669.     PUSH    B
  670.     MOV    E,A        ;align output character
  671.     MVI    C,CONOUT    ;print via MEX
  672.     CALL    MEX
  673.     POP    B
  674.     POP    D
  675.     POP    H
  676.     RET
  677. ;
  678. ;----------------------------------------------------------------------
  679. ;
  680. ; The remainder of this overlay implements a very versatile SET command
  681. ; -- if you prefer not to write a SET for your modem, you may delete the
  682. ; code from here to the END statement. Control is passed here after
  683. ; MEX parses a SET command.
  684. ;
  685. ;
  686. SETCMD:    MVI    C,SBLANK    ;any arguments?
  687.     CALL    MEX
  688.     JC    SETSHO        ;if not, go print out values
  689.     LXI    D,CMDTBL    ;parse command
  690.     CALL    TSRCH        ;from table
  691.     PUSH    H        ;any address on stack
  692.     RNC            ;if we have one, execute it
  693.     POP    H        ;nope, fix stack
  694. SETERR:    LXI    D,SETEMS    ;print error
  695.     MVI    C,PRINT
  696.     CALL    MEX
  697.     RET
  698. ;
  699. SETEMS:    DB    CR,LF,'SET command error',CR,LF,'$'
  700. ;
  701. ; SET command table ... note that tables are constructed of command-
  702. ; name (terminated by high bit=1) followed by word-data-value returned
  703. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  704. ; a binary zero.
  705. ;
  706. ; Note that LOOKUP attempts to find the next item in the input stream
  707. ; in the table passed to it in HL ... if found, the table data item is
  708. ; returned in HL; if not found, LOOKUP returns carry set.
  709. ;
  710. CMDTBL:    DB    '?'+80H            ;"set ?"
  711.     DW    STHELP
  712.     DB    'BAU','D'+80H        ;"set baud"
  713.     DW    STBAUD
  714.     DB    'PS','W'+80H        ;"set PSW"
  715.     DW    STPSW
  716.     DB    'TIM','E'+80H        ;"set TIME" -- just displays time
  717.     DW    TIMMSG
  718.     DB    'TON','E'+80H        ;'set TONE/PULSE byte to 'T'
  719.     DW    STTONE
  720.     DB    'PULS','E'+80H        ;'set TONE/PULSE byte to 'P'
  721.     DW    STPULSE
  722.     DB    0            ;<<=== table terminator
  723. ;
  724. ; SET <no-args>: print current statistics
  725. ;
  726. SETSHO:    LXI    H,SHOTBL    ;get table of SHOW subroutines
  727. SETSLP:    MOV    E,M        ;get table address
  728.     INX    H
  729.     MOV    D,M
  730.     INX    H
  731.     MOV    A,D        ;end of table?
  732.     ORA    E
  733.     RZ            ;exit if so
  734.     PUSH    H        ;save table pointer
  735.     XCHG            ;adrs to HL
  736.     CALL    GOHL        ;do it
  737.     CALL    CRLF        ;print newline
  738.     MVI    C,CHEKCC    ;check for console abort
  739.     CALL    MEX
  740.     POP    H        ;it's done
  741.     JNZ    SETSLP        ;continue if no abort
  742.     RET
  743. ;
  744. GOHL:    PCHL
  745. ;
  746. ; Table of SHOW subroutines
  747. ;
  748. SHOTBL:    DW    TIMMSG        ;displays time
  749.     DW    BDSHOW        ;displays current baud
  750.     DW    PSWSHOW        ;displays current PSW
  751.     DW    TPSHOW        ;displays current TPULSE byte (0105H)
  752.     DW    CRLF
  753.     DW    0        ;<<== table terminator
  754. ;
  755. ; SET ?  processor
  756. ;
  757. STHELP:    CALL     CLS            ;clear screen
  758.     CALL    TIMMSG
  759.     LXI    D,HLPMSG
  760.     MVI    C,PRINT
  761.     CALL    MEX
  762.     RET
  763. ;
  764. ; The help message
  765. ;
  766. HLPMSG:    DB    CR,LF,'SET Commands available are:',CR,LF,LF
  767.     DB    'SET BAUD  <110, 300, 600, 1200, 2400, 4800,'
  768.     DB    ' 9600, or 19200>',CR,LF
  769.     DB    'SET PSW   <8N1, 7E1, 7O1, or 7N1> -- Word Length,'
  770.     DB    ' Parity, Stop Bits',CR,LF
  771.     DB    'SET TIME  (Displays current time of day)',CR,LF
  772.     DB    'SET TONE  (Sets flag for TONE  dialing)',CR,LF
  773.     DB    'SET PULSE (Sets flag for PULSE dialing)'
  774.     DB    CR,LF,LF,'$'
  775. ;
  776. ; SET BAUD processor
  777. ;
  778. STBAUD:    MVI    C,BDPARS    ;function code
  779.     CALL    MEX    
  780.     JC    SETERR        ;invalid code
  781.     CALL    PBAUD        ;try to set it
  782.     JC    SETERR        ;unsupported code
  783. BDSHOW:    CALL    ILPRT        ;display baud
  784.     DB    'Baud rate:',TAB,' ',0
  785.     LDA    MSPEED
  786.     MVI    C,PRBAUD    ;use MEX routine
  787.     CALL    MEX
  788.     RET
  789. ;
  790. ; SET PSW processor
  791. ;
  792. STPSW:    MVI    C,SBLANK
  793.     CALL    MEX
  794.     JC    SETERR        ;SET PSW should have had argument
  795.     LXI    D,PSWTBL    ;look for PSW match in table
  796.     CALL    TSRCH
  797.     JC    SETERR        ;not there, so report error
  798.     MOV    A,L        ;get UART PSW byte from table in HL
  799.     STA    PSWSET        ;save it
  800.     CALL    INITMOD1    ;set CPS card w/ PSW and BAUD
  801. ;
  802. PSWSHOW:
  803.     CALL    ILPRT
  804.     DB    'PSW setting:',TAB,' ',0
  805.     LDA    PSWSET
  806.     CPI    P8N1
  807.     JNZ    PSW1
  808.     CALL    ILPRT
  809.     DB    '8N1',0
  810.     RET
  811. PSW1:    CPI    P7E1
  812.     JNZ    PSW2
  813.     CALL    ILPRT
  814.     DB    '7E1',0
  815.     RET
  816. PSW2:    CPI    P7O1
  817.     JNZ    PSW3
  818.     CALL    ILPRT
  819.     DB    '7O1',0
  820.     RET
  821. PSW3:    CPI    P7N1
  822.     JNZ    PSW4
  823.     CALL    ILPRT
  824.     DB    '7N1',0
  825.     RET
  826. PSW4:    CALL    ILPRT
  827.     DB    '<< ERROR >>',0
  828.     RET
  829. ;
  830. ;
  831. PSWSET:    DB    04EH            ;storage and default (8N1)
  832. ;
  833. ;
  834. PSWTBL:    DB    '8N','1'+80H
  835.     DW    P8N1
  836.     DB    '7E','1'+80H
  837.     DW    P7E1
  838.     DB    '7O','1'+80H
  839.     DW    P7O1
  840.     DB    '7N','1'+80H
  841.     DW    P7N1
  842.     DB    0
  843. ;
  844. ;.....
  845. ;
  846. ; These routines set TPULSE flag at 0105H to either 'T' or 'P' so that
  847. ; MODEM (specifically MXO-SM13.ASM) overlay will dial in TONE or PULSE
  848. ; mode.  The settings are mutually exclusive.
  849. ;
  850. STTONE:    MVI    A,'T'        ;get T flag
  851.     STA    TPULSE        ;put into proper place
  852.     JMP    TPSHOW        ;display dial mode
  853. ;
  854. STPULSE:
  855.     MVI    A,'P'        ;get P flag
  856.     STA    TPULSE
  857. ;
  858. TPSHOW:    CALL    ILPRT
  859.     DB    'Dial Mode:',TAB,' ',0
  860.     LDA    TPULSE
  861.     CPI    'T'
  862.     JNZ    TP1
  863.     CALL    ILPRT
  864.     DB    'TONE',0
  865.     RET
  866. TP1:    CPI    'P'
  867.     JNZ    TP2
  868.     CALL    ILPRT
  869.     DB    'PULSE',0
  870.     RET
  871. TP2:    CALL    ILPRT
  872.     DB    '<< ERROR >>',0
  873.     RET
  874. ;
  875. ;......
  876. ;
  877. ; Compare next input-stream item in table @DE; CY=1
  878. ; if not found, else HL=matched data item
  879. ;
  880. TSRCH:    MVI    C,LOOKUP    ;get function code
  881.     JMP    MEX        ;pass to MEX processor
  882. ;
  883. ; Print in-line message ... blows away C register
  884. ;
  885. ILPRT:    MVI    C,ILP        ;get function code
  886.     JMP    MEX        ;go do it
  887. ;
  888. ;------------------------------------------------------------
  889. ;
  890. ;        MEX  Fixed  Messages  Area
  891. ;
  892. ;
  893. EOSMSG:    DB    ESC,0D9H,0,0,'$'    ;clear to end of screen message
  894.                     ;for Videx Videoterm / SOROC
  895. ;
  896. CLSMSG:    DB    ESC,0AAH,0,0,'$'    ;clear screen message
  897.                     ;for Videx Videoterm / SOROC
  898. ;
  899. VERMSG:    DB    CR,LF,TAB,TAB,'Version for Apple ][ / Applicard'
  900.     DB    CR,LF
  901.     DB    TAB,TAB,' CPS card   '
  902.     DB    'Overlay Version ',REV/10+'0','.'
  903.     DB    REV MOD 10+'0'
  904.     DB    CR,LF,TAB,TAB,'    ','$'
  905. ;
  906. ;
  907. ;----------------------------------------------------------------------
  908. ;
  909. ;    Clock reading routines taken from TIME13.ASM
  910. ;
  911. ;                7/10/84   (H. Middlebrook)
  912. ;
  913. ; The program is specific to the following hardware:
  914. ;
  915. ;        Apple ][+
  916. ;        PCPI Applicard
  917. ;        Mountain Computer CPS Multifunction Card
  918. ;
  919. ; Program created as Version 1.0    7/10/84    - Henry Middlebrook
  920. ;
  921. ;.....
  922. ;
  923. TIMMSG:    CALL    ILPRT        ;Use MEX Inline Print
  924.     DB    'Current time is ',0
  925.     CALL    GET$TIME    ;routine to read CPS clock
  926.     CALL    PRT$TIME    ;print time of day
  927.     CALL    CRLF        ;final CR/LF
  928.     RET            ;...all done
  929. ;
  930. ;.....
  931. ;
  932. ; PCHAR -->    Prints as ASCII character BCD number in low nibble.
  933. ;        Routine falls through to CTYPE.
  934. ; CTYPE -->    Prints single character to CONSOLE through BDOS.
  935. ;
  936. PCHAR:    ANI    0FH    ;mask garbage in upper for bits
  937.     ADI    '0'    ;convert to ASCII
  938. CTYPE:    JMP    TYPE    ;use MEX routine
  939. ;
  940. ;.....
  941. ;
  942. ; GET$TIME -->    Reads CPS clock byte at a time and stores time in
  943. ;        CLKTBL.
  944. ;
  945. GET$TIME:
  946.     MVI    A,CLKHOLD    ;get byte to stop clock
  947.     CALL    WR$CLKSTAT    ;send to CPS card
  948.     MVI    A,100        ;short little delay
  949. DLOOP:    DCR    A        ;allows clock to settle
  950.     JNZ    DLOOP
  951.     LXI    D,CLKTBL    ;put CLKTBL address in DE
  952.     MVI    B,0        ;set clock index to 0
  953. ;
  954. TIME$LOOP:
  955.     MVI    A,CLKREAD    ;get byte to read clock
  956.     ORA    B        ;add clock index to read (50H - 5CH)
  957.     CALL    WR$CLKSTAT    ;send to CPS card
  958.     CALL    RD$CLKDATA    ;read clock (SEC1 --> YEAR10)
  959.     ANI    0FH        ;mask garbage in high nibble
  960.     STAX    D        ;save value read in CLKTBL
  961.     INX    D        ;bump CLKTBL address value in DE
  962.     INR    B        ;bump clock index in BC
  963.     MVI    A,0DH        ;fetch table length + 1
  964.     CMP    B        ;are we beyond end of table...
  965.     JNZ    TIME$LOOP    ;no, then go back again
  966.     XRA    A        ;yes, then zero A reg to turn on clock
  967.     CALL    WR$CLKSTAT
  968.     RET
  969. ;
  970. ;......
  971. ;
  972. ; PRT$TIME -->  Reads CLKTBL byte by byte to print time.  This code
  973. ;        converts 24hr time to 12hr format.  This code is extract
  974. ;        from TIME13 and prints on HH:MM aM using MEX print
  975. ;        routines.
  976. ;
  977. PRT$TIME:
  978.     XRA    A        ;set AMPM flag to AM
  979.     STA    AMPM
  980.     LDA    CLKTBL + 5    ;get H10 -- start BCD to Binary convert
  981.     ANI    03H        ;mask AM/PM garbage
  982.                 ;and mask off low nibble
  983.     RLC            ;A = A * 2
  984.     MOV    C,A        ;save A
  985.     RLC            ;A = A * 4
  986.     RLC            ;A = A * 8
  987.     ADD    C        ;A = (A * 2) + (A * 8) = A * 10
  988.                 ;A = H10 * 10
  989.     LXI    H,CLKTBL+4    ;get address of H1
  990.     ADD    M        ;Now we have binary hour in A
  991.     JZ    TIME5        ;if 00:00 -- 00:59 AM jmp to fix
  992.     CPI    0CH        ;is it afternoon (PM)
  993.     JC    TIME0        ;no, then enter at std entry point
  994.     STA    AMPM        ;yes, then make AMPM non-zero (=PM)
  995.     CPI    0DH        ;is it 13:00:00 (1:00 PM) yet?
  996.     JC    TIME0        ;no, then normal print entry
  997.     SUI    0CH        ;yes, then subtract 12hrs
  998.     MVI    B,0FFH
  999. TIME3:    INR    B        ;divide hr by 10
  1000.     SUI    0AH
  1001.     JNC    TIME3
  1002.     ADI    0AH
  1003.     MOV    M,A        ;and put H1 back
  1004.     INX    H
  1005.     MOV    M,B        ;put H10 back
  1006.     JMP    TIME0
  1007. TIME5:    MVI    M,2        ;kludge to print 12:xx AM
  1008.     INX    H
  1009.     MVI    M,1
  1010. TIME0:    LDA    CLKTBL + 5    ;get H10
  1011.     ANI    03H        ;mask garbage
  1012.     ORA    A
  1013.     JZ    TIME1        ;skip print if H10 = 0
  1014.     CALL    PCHAR
  1015. TIME1:    LDA    CLKTBL + 4    ;get H1
  1016.     CALL    PCHAR
  1017.     MVI    A,':'        ;delimiter
  1018.     CALL    CTYPE
  1019.     LDA    CLKTBL + 3    ;get M10
  1020.     CALL    PCHAR
  1021.     LDA    CLKTBL + 2    ;get M1
  1022.     CALL    PCHAR
  1023.     LDA    AMPM        ;AM=00H,  PM=anything else
  1024.     ORA    A        ;set flags
  1025.     JNZ    TIME2        ;print AM
  1026.     CALL    ILPRT
  1027.     DB    ' AM',0
  1028.     RET
  1029. TIME2:    CALL    ILPRT
  1030.     DB    ' PM',0        ;print PM message
  1031.     RET
  1032. ;
  1033. ;.........
  1034. ;
  1035. ;    FIXED DATA AREA FOR CLOCK FUNCTION
  1036. ;
  1037. ; The CLKTBL is fixed, initialized area used to store time as
  1038. ; read from CPS clock hardware.
  1039. ;
  1040. CLKTBL:    DB    0        ;S1
  1041.     DB    0        ;S10
  1042.     DB    0        ;MIN1
  1043.     DB    0        ;MIN10
  1044.     DB    0        ;H1
  1045.     DB    0        ;H10
  1046.     DB    0        ;Day of Week
  1047.     DB    0        ;D1
  1048.     DB    0        ;D10
  1049.     DB    0        ;MON1
  1050.     DB    0        ;MON10
  1051.     DB    0        ;Y1
  1052.     DB    0        ;Y10
  1053. ;
  1054. AMPM:    DB    0        ;flag --> 00H = AM,  else = PM
  1055. ;
  1056. ;----------------------------------------------------------------------
  1057. ;
  1058. ; >>>>     Note that the following routines can only be used if the
  1059. ; >>>>    appropriate patches are made in MEX using the MEXPATxx file.
  1060. ;
  1061.     IF    USERPRINTER
  1062. ;
  1063. ; The BIOS implementation in the AppliCard and the BDOS print
  1064. ; routines interfere with data reception if the printer function is
  1065. ; enabled. The following routine for a Super-MX parallel printer card
  1066. ; can  be used as a guide for the writing of an appropriate printer
  1067. ; driver called as a vector from the program.
  1068. ;
  1069. ;
  1070. ; This routine replaces the MEX PRTSTS routine in the main program.
  1071. ; It returns with A = 0 if NOT ready.  If printer is ready return
  1072. ; with A = 0FFH.  These vectors are EQU'd in MEXPAT section of code.
  1073. ;
  1074. PRTSTS:    PUSH    D
  1075.     LXI    D,PTRSTATP
  1076.     CALL    PEEK        ;get byte from printer status address
  1077.     POP    D
  1078.     ANI    PTR$RDY        ;mask for printer status byte
  1079.     SUI    PTR$RDY        ;return A = 0 if NOT ready
  1080.     RET            ;else return A = 0FFH IF ready
  1081. ;
  1082. ; The following routine is called via the MEX LVEC in MEXPAT.
  1083. ;
  1084. ; This routine is entered with byte to print in 'A' register. All
  1085. ; characters (printable or not) will be sent to printer data port.
  1086. ; Parallel printer strobe line is then toggled by writing to the
  1087. ; the two strobe addresses.
  1088. ;
  1089. WR$PRT:    ANI    07FH        ;clear Hi-bit
  1090.     PUSH    D
  1091.     LXI    D,PTRDATP
  1092.     CALL    POKE        ;put data on printer o/p lines
  1093.     LXI    D,PTRSTBP1
  1094.     CALL    POKE        ;strobe hi...
  1095.     LXI    D,PTRSTBP2
  1096.     CALL    POKE        ;...then low
  1097.     POP    D
  1098.     RET
  1099. ;
  1100.     ENDIF            ;USERPRINTER
  1101. ;
  1102. ;
  1103. ;    >>>>   End of PORT specific overlay section   <<<<
  1104.  
  1105. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1106. ;
  1107. ;        MODEM SPECIFIC OVERLAY SECTION
  1108. ;
  1109. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1110. ;
  1111. ;        MEX SMARTMODEM OVERLAY V1.3
  1112. ;
  1113. ; Smartmodem overlay for MEX: revision 1.3
  1114. ;
  1115. ; Adapted for MXO-AP31 Overlay by Henry Middlebrook (1/85)
  1116. ;
  1117. ; NOTE: Some redundant parts of the V1.3 overlay were removed when this
  1118. ;    section was pulled into MXO-AP31.  See the original overlay for
  1119. ;    additional information on the history and use of this MODEM
  1120. ;    specific overlay.        -HM-    2/4/85
  1121. ;
  1122. ; Written 04/16/84 by Ronald G. Fowler (V1.0)
  1123. ;
  1124. ; 06/06/84: Fixed problem for Anchor users, where, when the modem
  1125. ;        returned "DIAL TONE", the "N" in "TONE" was being regarded
  1126. ;        as a NO-CONNECT code.  Now we flush the entire result line
  1127. ;        before reading another. Also added code for numeric version
  1128. ;        of "CONNECT 1200".  --RGF
  1129. ;
  1130. ; This modules adapts MEX for the DC Hayes Smartmodem (as well as many
  1131. ; others -- including US Robotics -- that use a similar command language).
  1132. ; The main function of this module is to provide dialing capability;
  1133. ; the disconnect vector is ancillary. You may use this module as a model
  1134. ; to develop dialing routines for non-standard modems. The only pertinent
  1135. ; entry point is the DIAL routine; you'll find entry specs for that below.
  1136. ;
  1137. ;
  1138. ; This overlay will work separately with any modem overlay that terminates
  1139. ; prior to 0B00H or which combines this module with I/O routine overlay
  1140. ; and together they terminate prior to 0D00H.
  1141. ;
  1142. ;
  1143. ; This is the DIAL routine called by MEX to dial a digit. The digit
  1144. ; to be dialed is passed in the A register.  Note that two special
  1145. ; codes must be intercepted as non-digits: 254 (start dial sequence)
  1146. ; and 255 (end-dial sequence).  Mex will always call DIAL with 254
  1147. ; in the accumulator prior to dialing a number.  Mex will also call
  1148. ; dial with 255 in A as an indication that dialing is complete. Thus,
  1149. ; the overlay may use these values to "block" the number, holding it
  1150. ; in a buffer until it is completely assembled (we don't do this with
  1151. ; the PMMI, however; we just dial the digits as they come in).
  1152. ;
  1153. ; After the 254-start-dial sequence, MEX will call the overlay with
  1154. ; digits, one-at-a-time.  MEX will make no assumptions about the dig-
  1155. ; its, and will send each to the DIAL routine un-inspected (some modems,
  1156. ; like the Smartmodem, allow special non-numeric characters in the
  1157. ; phone number, and MEX may make no assumptions about these). This
  1158. ; dialing routine validates digits, and ignores any except 0-9 and
  1159. ; comma (uses comma to simulate Smartmodem delay).
  1160. ;
  1161. ; After receiving the end-dial sequence (255) the overlay must take
  1162. ; whatever end-of-dial actions are necessary *including* waiting for
  1163. ; carrier at the distant end.  The overlay should monitor the keyboard
  1164. ; during this wait (using the MEX keystat service call), and return
  1165. ; an exit code to MEX in the A register, as follows:
  1166. ;
  1167. ;    0 - Carrier detected, connection established
  1168. ;    1 - Far end busy (only for modems that can detect this condition)
  1169. ;    2 - No answer (or timed out waiting for modem response)
  1170. ;    3 - Keyboard abort (^C only: all others should be ignored)
  1171. ;    4 - Error reported by modem
  1172. ;    5 - No ring
  1173. ;    6 - No dialtone
  1174. ;
  1175. ; <No other codes should be returned after an end-dial sequence>
  1176. ;
  1177. ; The overlay should not loop forever in the carrier-wait routine, but
  1178. ; instead use either the overlay timer vector, or the INMDMV (timed 100
  1179. ; ms character wait) service call routine.
  1180. ;
  1181. ; The DIAL routine is free to use any of the registers, but must return
  1182. ; the above code after an end-dial sequence
  1183. ;
  1184. ;
  1185.     ORG    0B00H        ;maintain official MEX origin
  1186. ;
  1187. DIAL:    LHLD    DIALPT        ;FETCH POINTER
  1188.     CPI    254        ;START DIAL?
  1189.     JZ    STDIAL        ;JUMP IF SO
  1190.     CPI    255        ;END DIAL?
  1191.     JZ    ENDIAL        ;JUMP IF SO
  1192. ;
  1193. ; Not start or end sequence, must be a digit to be sent to the modem
  1194. ;
  1195.     MOV    M,A        ;PUT CHAR IN BUFFER
  1196.     INX    H        ;ADVANCE POINTER
  1197.     SHLD    DIALPT        ;STUFF PNTR
  1198.     RET            ;ALL DONE
  1199. ;
  1200. ; Here on a start-dial sequence
  1201. ;
  1202. STDIAL:    LXI    H,DIALBF    ;SET UP BUFFER POINTER
  1203.     SHLD    DIALPT
  1204.     RET
  1205. ;
  1206. ; Here on an end-dial sequence
  1207. ;
  1208. ENDIAL:    MVI    M,CR        ;STUFF END-OF-LINE INTO BUFFER
  1209.     INX    H        ;FOLLOWED BY TERMINATOR
  1210.     MVI    M,0
  1211.     LDA    TPULSE        ;GET OVERLAY'S TOUCH-TONE FLAG
  1212.     STA    SMDIAL+3    ;PUT INTO STRING
  1213.     LXI    H,SMDIAL    ;POINT TO DIALING STRING
  1214.     CALL    SMSEND        ;SEND IT
  1215. WAITSM:    MVI    C,INMDM
  1216.     CALL    MEX        ;CATCH ANY OUTPUT FROM THE MODEM
  1217.     JNC    WAITSM        ;LOOP UNTIL NO MORE CHARACTERS
  1218. ;
  1219. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM (UP TO
  1220. ; 60 SECONDS: YOU MAY CHANGE THIS VALUE IN THE FOLLOWING LINE).
  1221. ; NOTE THAT THE SMARTMODEM HAS AN INTERNAL 30 SECOND TIMEOUT WHILE
  1222. ; FOR A CARRIER ON THE OTHER END.  YOU CAN CHANGE BY PLAYING WITH THE
  1223. ; S7 VARIABLE (I.E. SEND THE SMARTMODEM "AT S7=20" TO LOWER THE 30 SECOND
  1224. ; WAIT TO 20 SECONDS).
  1225. ;
  1226. RESULT:    MVI    C,60        ;<<== MAXIMUM TIME TO WAIT FOR RESULT
  1227. SMWLP:    PUSH    B
  1228.     MVI    B,1        ;CHECK FOR A CHAR, UP TO 1 SEC WAIT
  1229.     MVI    C,TMDINP    ;DO TIMED INPUT
  1230.     CALL    MEX
  1231.     POP    B
  1232.     JNC    SMTEST        ;JUMP IF MODEM HAD A CHAR
  1233.     PUSH    B        ;NO, TEST FOR CONTROL-C FROM CONSOLE
  1234.     MVI    C,CHEKCC
  1235.     CALL    MEX
  1236.     POP    B
  1237.     JNZ    SMNEXT        ;IF NOT, JUMP
  1238.     MVI    B,CR        ;YES, SHUT DOWN THE MODEM
  1239.     MVI    C,SNDCHR
  1240.     CALL    MEX
  1241.     MVI    A,3        ;RETURN ABORT CODE
  1242.     RET
  1243. SMNEXT:    DCR    C        ;NO
  1244.     JNZ    SMWLP        ;CONTINUE
  1245. ;
  1246. ; ONE MINUTE WITH NO MODEM RESPONSE (OR NO CONNECTION)
  1247. ;
  1248. SMTIMO:    MVI    A,2        ;RETURN TIMEOUT CODE
  1249.     RET
  1250. ;
  1251. ; MODEM GAVE US A RESULT, CHECK IT
  1252. ;
  1253. SMTEST:    ANI    7FH        ;IGNORE ANY PARITY
  1254.     CALL    SMANAL        ;TEST THE RESULT
  1255.     MOV    A,B        ;A=RESULT (CY SIGNIFICANT HERE TOO)
  1256.     PUSH    PSW        ;SAVE IT
  1257. SMTLP:    MVI    C,INMDM        ;FLUSH ANY REMAINING COMMAND LINE
  1258.     CALL    MEX
  1259.     JC    SMCHEK        ;JUMP IF NO INPUT
  1260.     CPI    LF        ;GOT SOME ... WAITING FOR EOL
  1261.     JNZ    SMTLP        ;EAT ANY IN-BETWEEN
  1262. SMCHEK:    POP    PSW        ;A HAS MEX RETURN-CODE, CY=1 IF UNKNOWN
  1263.     JC    RESULT        ;IF RESULT UNKNOWN, IGNORE IT
  1264.     RET
  1265. ;
  1266. SMANAL:    MVI    B,0        ;PREP CONNECT CODE
  1267.     CPI    'C'        ;"CONNECT"?
  1268.     RZ
  1269.     CPI    '1'        ;NUMERIC VERSION OF "CONNECT"
  1270.     RZ
  1271.     CPI    '5'        ;NUMERIC VERSION OF "CONNECT 1200"
  1272.     RZ
  1273.     INR    B        ;PREP BUSY CODE B=1
  1274.     CPI    'B'
  1275.     RZ
  1276.     INR    B        ;PREP NO CONNECT MSG B=2
  1277.     CPI    'N'        ;N=NO CONNECT
  1278.     RZ
  1279.     CPI    '3'        ;NUMERIC VERSION OF "NO CONNECT"
  1280.     RZ
  1281.     MVI    B,4        ;PREP MODEM ERROR
  1282.     CPI    'E'        ;E=ERROR
  1283.     RZ
  1284.     CPI    '4'        ;NUMERIC VERSION OF "ERROR"
  1285.     RZ
  1286.     STC            ;UNKNOWN...
  1287.     RET
  1288. ;
  1289. ;.....
  1290. ;
  1291. ; SMARTMODEM UTILITY ROUTINE: SEND STRING TO MODEM
  1292. ;
  1293. SMSEND:    MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  1294.     CALL    MEX
  1295.     JNZ    SMSEND
  1296.     MOV    A,M        ;FETCH NEXT CHARACTER
  1297.     INX    H
  1298.     ORA    A        ;END?
  1299.     RZ            ;DONE IF SO
  1300.     MOV    B,A        ;NO, POSITION FOR SENDING
  1301.     MVI    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  1302.     CALL    MEX
  1303.     JMP    SMSEND
  1304. ;
  1305. ; DATA AREA
  1306. ;
  1307. SMDIAL:    DB    'ATDT '
  1308. DIALBF:    DS    52        ;2* 24 CHAR MAX, + CR + NULL + SLOP
  1309. DIALPT:    DS    2        ;DIAL POSITION POINTER
  1310. ;
  1311. ;
  1312. ;    >>>>    End of MODEM Specific Overlay
  1313.  
  1314. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1315. ;
  1316. ;        MEXPAT11.ASM    --    Patch file
  1317. ;
  1318. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1319. ;
  1320. ; 02/04/85  --    Patches in this file were for the convenience of the
  1321. ;        author as well as to support a new LSTVEC and LVEC
  1322. ;        which is in PORT section of this overlay, MXO-AP3x.
  1323. ;                    -- H. Middlebrook
  1324. ;
  1325. ; This is the patch file for MEX 1.1 -- you may edit this file to change
  1326. ; various initial variables. Assemble with ASM or MAC, then use MLOAD
  1327. ; to patch the changes into MEX:
  1328. ;
  1329. ;    ASM MEXPAT11.AAZ            ;assemble the edited file
  1330. ;    MLOAD NEWMEX.COM=MEX.OBJ,MEXPAT10    ;patch MEX
  1331. ;
  1332. ; You may also pull this file into your modem overlay (be sure you in-
  1333. ; clude the ORG statement below).
  1334. ;
  1335. ; The order of the patch variables supported here will not change from
  1336. ; version to version (i.e., new items will be added on to the end).
  1337. ;
  1338. ;
  1339.     ORG    0D00H        ;location of patch variables
  1340. ;
  1341. ;
  1342. ;
  1343. ; The following line defines the MEX service call entry point, and
  1344. ; is not meant to be changed by the user
  1345. ;
  1346. MEXSTART:    DS    3        ;MEX service call processor
  1347.         DS    3        ;reserved
  1348.         DS    1        ;reserved
  1349. ;
  1350. ; The following line contains the initial free-memory pointer for
  1351. ; MEX.  Sophisticated modem overlays requiring additional space may change
  1352. ; this pointer (ie, move it higher), and thus "protect" an area of RAM.
  1353. ;
  1354. MEMRY:    DS    2        ;first free memory pointer
  1355. ;
  1356. ; Following are the lowest-level vectors for console and list I/O used
  1357. ; by MEX.  These normally point to routines that save the registers and
  1358. ; vector to the appropriate BIOS routines.  Complex applications may
  1359. ; need to intercept (or even replace) these routines.  If you do this,
  1360. ; be sure to preserve DE, HL and BC.
  1361. ;
  1362. STSVEC:    DS    2        ;console status vector
  1363. INVEC:    DS    2        ;console input vector
  1364. OUTVEC:    DS    2        ;console output vector
  1365. ;
  1366. ; NOTE: The USERPRINTER Equate must be set TRUE or FALSE and the routines
  1367. ;    must be provided.  The original MEXPAT11 overlay just uses DS 2.
  1368. ;
  1369.     IF    USERPRINTER
  1370. LVEC:    DW    WR$PRT        ;list output vector
  1371. LSTVEC:    DW    PRTSTS        ;list status vector
  1372.     ENDIF            ;USERPRINTER
  1373. ;
  1374.     IF    NOT USERPRINTER
  1375. LVEC:    DS    2        ;list output vector
  1376. LSTVEC:    DS    2        ;list status vector
  1377.     ENDIF            ;NOT USERPRINTER
  1378.  
  1379. ;
  1380. ; The following line defines the location of the default MEX prompt.
  1381. ; If you'd like to provide your own initial prompt, add a DW statement
  1382. ; pointing to a prompt buffer structured as follows:
  1383. ;
  1384. ;        DB <max size of buffer>
  1385. ;        DB <length of actual prompt>
  1386. ;        DB <prompt string>
  1387. ;
  1388. ; <maxsize> and <length> may be equal (especially if you disable the
  1389. ; ID command by setting CHGPMT, below to 0); the ID command will, if
  1390. ; left enabled, be limited to the <max size> value.
  1391. ;
  1392. PROMPT:    DS    2        ;prompt location
  1393.     DS    1        ;reserved
  1394. TYPLIN:    DB    22        ;for TYPE command: # lines/screen
  1395. PAUSFL:    DB    1        ;for TYPE cmd: 1=pause 0=no pause
  1396. SEPCHR:    DB    ';'        ;multiple command-line separator
  1397. ;
  1398. ; following five for SENDOUT command
  1399. ;
  1400. SOWAIT:    DB    4        ;# seconds waiting for a sendout echo
  1401. SOREPL:    DB    8        ;# seconds waiting for initial reply
  1402. SOTRIG:    DB    '>'        ;sendout trigger char from remote
  1403. CANCHR:    DB    'U'-64        ;sendout char to cancel line to remote
  1404. SORTRY:    DB    6        ;sendout # retries
  1405. ;
  1406. ;
  1407. HEXFLG:    DB    0        ;hex/decimal mode
  1408. ESCCHR:    DB    1BH        ;terminal mode escape char (1BH = ESC)
  1409. NOBELL:    DB    0        ;set to 1 to disable bell
  1410. ;
  1411. ; Buffer variables.  See BUFFERS.DOC for setup information
  1412. ;
  1413. PSIZE:    DB    2        ;default=2k
  1414. ASIZE:    DB    255        ;"big" capture buffer
  1415. XSIZE:    DB    16        ;16K transfer buffer
  1416. NSIZE:    DB    1        ;1k for 85 batch files
  1417. PRELEN:    DB    40        ;maximum length of PREFIX string
  1418. SUFLEN:    DB    40        ;maximum length of SUFFIX string
  1419. ;
  1420. ; Misc. stuff
  1421. ;
  1422. CDOSFL:    DB    0        ;non-zero for CDOS
  1423. WTECHO:    DB    0        ;non-zero sets "wait-for-echo"
  1424. KYSIZE:    DW    400        ;size of keystring area, in bytes
  1425. CISFLG:    DB    1        ;non-zero allows CIS file transfers
  1426. CISOK:    DB    1        ;non zero allows STAT CIS ON or OFF
  1427. CHGPMT:    DB    1        ;non-zero allows ID (prompt chg) command
  1428. ERRID:    DB    1        ;non-zero prints ID msg in err msgs
  1429. ;
  1430. ; by setting the following DB to 0, you can disable the HELP
  1431. ; command, freeing up space used by the help file index.
  1432. ;
  1433. HELPOK:    DB    1        ;non-zero allows HELP command
  1434. MEXDU:    DB    0        ;user \/  alt. area for READ,LOAD,INI.MEX
  1435.     DB    0        ;drive/\  & HELP.MEX (if SEARCH <>0)
  1436. DEBUG:    DB    0        ;debugging in term-mode if non-zero
  1437. EXCLSY:    DB    1        ;non-0 excludes $SYS from batchsend, dir
  1438. INIMEX:    DB    0        ;non-zero runs INI.MEX at startup
  1439. RTIMER:    DB    1        ;receiver wait: # seconds [Plouff patch]
  1440. PQSIZE:    DW    150        ;size of the modem-port queue
  1441. PHSIZE:    DB    30        ;phone library size (# entries)
  1442. SILENT:    DB    0FFH        ;0=silence multi-line & READ cmd echo
  1443. ALERT:    DB    255        ;alert-bell count on CALL complete
  1444. EXTEND:    DB    0        ;non-zero: unk cmds goto READ processor
  1445. SPLIT:    DB    1        ;non-zero: phonelib printout, shows baud
  1446. SEARCH:    DB    0        ;search mode 0,1,2,3
  1447. ;
  1448. ; Following is the GLOBAL secondary options table.  To
  1449. ; set an option to global, change its ASCII character to a 0.
  1450. ;
  1451. RESTT:    DB    'ABDELQRSTVX'
  1452.     DS    8        ;room for option expansion
  1453. ;
  1454. ;
  1455. ; added on release 1.10:
  1456. ;
  1457. queue:    db    1        ;1=allow queueing, 0=no
  1458. timbas:    dw    208        ;timing constant
  1459. mode:    db    0        ;mode of modem I/O
  1460. sminit:    ds    2        ;Smartmodem INIT routine adrs
  1461. ssetv:    ds    2        ;SSET command: defaulted off
  1462. smexit:    ds    2        ;Smartmodem EXIT routine adrs
  1463.     ds    4        ;internal to MEX
  1464. sodflg:    db    0        ;1=tie SENDOUT to time delay if no WTECHO
  1465. autosv:    db    1        ;0=initial term mode, save off
  1466. tabflg:    db    0ffh        ;non-zero=expand tabs within MEX
  1467. ;
  1468. ;
  1469. ;        >>>> End of PATCH Overlay Section <<<<
  1470. ;
  1471.     END
  1472.