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

  1. ; MXO-AP12.ASM     Apple overlay file for MEX10.COM     06/03/84
  2. ;
  3. REV    EQU    12
  4. ;
  5. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  6. ; 06/03/84   Completely MEXized, with all new lables, exclusive use of
  7. ;         MEX processor, and a MEX SET routine which allows setting
  8. ;         baud rate, smodem speaker on/off, and smodem auto answer
  9. ;         on/off.  Type SET ? for command syntax, SET for current 
  10. ;         settings.                    -Norman Beeler    
  11. ; 05/27/84   Modified initialization routine (CPS) to check for carrier
  12. ;         before initializing, to allow exiting MEX to CPM, (intentional
  13. ;         or otherwise) and re-entering MEX without dropping line.
  14. ;         Changed smodem wait-for-answer to 20 sec (Ma Bell charges for 
  15. ;         30 sec, busy signal or not)        -Norman Beeler
  16. ;
  17. ; 05/17/84   Revised MDM7AP-4.ASM and renamed as MEX overlay.  Added
  18. ;         PBAUD subroutine to allow auto baud set by MEX.   
  19. ;                                - Norman Beeler
  20. ;         
  21. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  22. ; This overlay file enables Apple II computers with various serial 
  23. ; cards and external modems to use the MEX10  phone modem program.
  24. ; It supports the following Apple configurations:
  25. ;
  26. ;    1.Microsoft Z80 card or equivalent
  27. ;             or
  28. ;    2.         PCPI Applicard
  29. ;            with    
  30. ;    a) CCS 7710 serial interface and external modem
  31. ;    b) SSM serial interface and external modem
  32. ;    c) Apple communications interface and external modem
  33. ;    d) Mountain Hardware CPS Multifunction card and external modem
  34. ;    e) Prometheus Versacard with software baud select and ext. modem
  35. ;
  36. ; You will want to look this file over carefully. There are a number of
  37. ; options that you can use to configure the program to suit your taste.
  38. ; Much of the information contained here is not in the MEX10.ASM file.
  39. ;
  40. ; Edit this file for your preferences then follow the "TO USE:" example.
  41. ;
  42. ; Use the "SET" command to change the baudrate during program execution.  
  43. ;
  44. ; To use SET with the Prometheus Versacard a small hardware mod must be
  45. ; made, since the Versacard only supports baud rate selection via DIP 
  46. ; switches. This Mod will allow the Versacard to be switched between
  47. ; 300 and 1200 baud via software.
  48. ; A wire should be attached from Pin #12 on U16 (IC marked 8126)
  49. ; on the Versacard into Annunciator #3 (Pin #12) on the Apple game port.
  50. ; This will allow switch #4 on s2 of the Versacard to be toggled by setting
  51. ; or clearing annunciator #3. The default baud rate is set at MSPEED Below
  52. ; either (300 or 1200). Note: This method could be extended to all other
  53. ; Versacard baud rates and by using Annunciators 0,1,2 but 300 and
  54. ; 1200 are really needed for a modem program. The DIP switches on the
  55. ; Versacard should be set as follows:        -Tony Antonucci
  56. ;
  57. ; On switch bank #2: 
  58. ;            s2 - ON
  59. ;            s3 - OFF
  60. ;            s4 - OFF
  61. ;            s5 - OFF
  62. ;
  63. ;
  64. ;    TO USE: First edit this file filling in answers for your own
  65. ;        equipment.  Then assemble with ASM.COM or equivalent
  66. ;        assembler.  Then follow instructions in MEX doc to 
  67. ;        overlay program.
  68. ;
  69.  
  70. ;
  71. BELL:        EQU    07H    ;bell
  72. CR:        EQU    0DH    ;carriage return
  73. ESC:        EQU    1BH    ;escape
  74. LF:        EQU    0AH    ;linefeed
  75. TAB:        EQU    09H    ;tab
  76. ;
  77. YES:        EQU    0FFH
  78. NO:        EQU    0
  79. ;
  80. SLOT:        EQU    2    ;slot of serial interface
  81. SLOTOFF:    EQU    16*SLOT    ;serial card slot offset
  82. ;
  83. APPLICARD    EQU    NO     ;YES for Applicard
  84. CCS:        EQU    NO    ;YES for CCS 7710
  85. VERSA:        EQU    NO     ;YES for Prometheus Versacard
  86. COMCARD:    EQU    NO    ;YES for Apple comcard
  87. SSC:        EQU    NO    ;YES for Super Serial Card
  88. SSM:        EQU    NO    ;YES for SSM serial card
  89. CPS:        EQU    YES     ;YES for CPS card
  90. ;
  91.          IF     APPLICARD
  92. OFFSET        EQU    0C000H    ;Applicard/Apple addressing offset
  93. ;
  94. RDBYTE:        EQU    0FFE0H    ;Read a byte from apple (A=byte)
  95. WRBYTE:        EQU    0FFE3H    ;Write a byte to apple (c=byte)
  96. RDWORD        EQU    0FFE6H    ;Read 2 bytes from apple (de=bytes)
  97. WRWORD:        EQU    0FFE9H    ;Write 2 bytes to apple (de=bytes)
  98. RDNBYTS:    EQU    0FFECH  ;Read N bytes (de=count, hl=buffer)
  99. WRNBYTS:    EQU    0FFEFH  ;Write N bytes (de=count, hl=buffer)
  100. PEEK1BYTE:    EQU    6    ;Command to peek 1 byte in apple
  101. POKE1BYTE:    EQU    7    ;Command to poke 1 byte in apple
  102.          ENDIF        ;APPLICARD 
  103. ;
  104.          IF    NOT APPLICARD
  105. OFFSET        EQU    0E000H    ;Microsoft z80 (and everybody else)
  106.          ENDIF        ;NOT APPLICARD
  107. ;
  108.          IF    VERSA
  109. AN3SET:        EQU    0E05FH    ;set annunciator #3
  110. AN3CLR:        EQU    0E05EH    ;clr      "
  111.          ENDIF        ;Versacard hardware mod support
  112. ;
  113.          IF    CCS
  114. MODDAT:        EQU      081H+OFFSET+SLOTOFF    ;data port of CCS 7710
  115. MODCT2:        EQU      080H+OFFSET+SLOTOFF    ;status port of CCS 7710
  116.          ENDIF        ;endif CCS
  117. ;
  118.          IF    COMCARD OR VERSA
  119. MODDAT:        EQU      08FH+OFFSET+SLOTOFF    ;data port of Comcard
  120. MODCT2:        EQU      08EH+OFFSET+SLOTOFF    ;status port of Comcard
  121.          ENDIF        ;endif Comcard or Versacard
  122. ;
  123.          IF    SSM
  124. MODDAT:        EQU      085H+OFFSET+SLOTOFF    ;data port of SSM
  125. MODCT2:        EQU      084H+OFFSET+SLOTOFF    ;status port of SSM
  126.          ENDIF        ;endif SSM
  127. ;
  128.          IF    SSC
  129. MODDAT:        EQU      088H+OFFSET+SLOTOFF    ;data port of Apple Super Serial Card
  130. MODCT2:        EQU      089H+OFFSET+SLOTOFF    ;modem status port of Super Serial Card
  131. MDRCVB:        EQU    08H    ;bit to test for received data
  132. MDRCVR:        EQU    08H    ;modem receive ready
  133. MDSNDB:        EQU    10H    ;bit to test for ready to send
  134. MDSNDR:        EQU    10H    ;modem send ready bit
  135.          ENDIF        ;endif SSC
  136. ;
  137. ;
  138. ; (Any slot with any CPS function assigned to it may be used.)
  139. ;
  140.          IF    CPS
  141. MODCT1:        EQU      0FEH+OFFSET+SLOT*100H  ;control port of CPS card
  142. MODDAT:        EQU      0FAH+OFFSET+SLOT*100H  ;data port of CPS card
  143. MODCT2:        EQU      0FBH+OFFSET+SLOT*100H  ;status port of CPS card
  144. MDRCVB:        EQU    02H            ;bit to test for receive
  145. MDRCVR:        EQU    02H            ;value when ready
  146. MDSNDB:        EQU    01H            ;bit to test for send
  147. MDSNDR:        EQU    01H            ;value when ready
  148. MDDCDB:        EQU    01000000B        ;DCD carrier bit mask
  149. MDDCDR:        EQU    01000000B        ;value if carrier received
  150. MDDSRB:        EQU    10000000B        ;DSR bit mask (used instead
  151. MDDSRR:        EQU    10000000B        ;...of dcd for BYE compat
  152. ;
  153. ; Command port equates
  154. ;
  155. CBASE:        EQU    00000101B    ;Command base
  156. RESET:        EQU    00010000B    ;Reset errors
  157. DTR:        EQU    00000010B    ;Turn on DTR
  158. RTS:        EQU    00100000B    ;Turn on RTS
  159.          ENDIF        ;endif CPS
  160. ;
  161. ;
  162. ; Apple status bit equates for CCS, Comcard, Versacard and SSM
  163. ;
  164.          IF    NOT SSC AND NOT CPS
  165. MDSNDB:        EQU    02H    ;bit to test for send
  166. MDSNDR:        EQU    02H    ;value when ready
  167. MDRCVB:        EQU    01H    ;bit to test for receive
  168. MDRCVR:        EQU    01H    ;value when ready
  169.          ENDIF        ;not SSC and not CPS
  170. ;
  171. ;
  172. ; We have software control over the Super Serial, CPS cards and
  173. ; Versacard; if hardware mod is made, so SETCMDTST is YES for
  174. ; those cards, below.
  175. ;.......
  176. ;  MEX processor stuff
  177. ;.......
  178. MEX    EQU    0D00H        ;address of the service processor
  179. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  180. TIMER    EQU    254        ;delay 100ms * reg B
  181. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  182. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  183. SNDRDY    EQU    251        ;test for modem-send ready
  184. RCVRDY    EQU    250        ;test for modem-receive ready
  185. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  186. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  187. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  188. PARSFN    EQU    246        ;parse filename from input stream
  189. BDPARS    EQU    245        ;parse baud-rate from input stream
  190. SBLANK    EQU    244        ;scan input stream to next non-blank
  191. EVALA    EQU    243        ;evaluate numeric from input stream
  192. LKAHED    EQU    242        ;get nxt char w/o removing from input
  193. GNC    EQU    241        ;get char from input, cy=1 if none
  194. ILP    EQU    240        ;inline print
  195. DECOUT    EQU    239        ;decimal output
  196. PRBAUD    EQU    238        ;print baud rate
  197. ;
  198. CONOUT    EQU    2        ;simulated BDOS function 2
  199. PRINT    EQU    9        ;simulated BDOS function 9
  200. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  201. ;
  202. ; ************************************************************************
  203.         ORG    100H
  204. ;
  205. ;
  206. ; Change the clock speed to match your equipment.  The Microsoft Softcard
  207. ; operates at 2 MHz.
  208. ;
  209.         DS    3    ;(for  "JMP   START" instruction)
  210. ;
  211. PMODEM:        DB    NO    ;yes=PMMI S-100 Modem            103H
  212. SMODEM:        DB    YES    ;yes=HAYES Smartmodem, no=non-pmmi    104H
  213. TPULSE:        DB    'T'    ;T=touch, P=pulse (Smartmodem-only)    105H
  214. CLOCK:        DB    20    ;clock speed in MHz x10, 25.5 MHz max.    106H
  215.                 ;20=2 MHz, 37=3.68 MHz, 40=4 MHz, etc.
  216.                 ;Applicard values should not be multiplied
  217.                 ;by 10 because of 6502 overhead
  218. MSPEED:        DB    5    ;0=110 1=300 2=450 3=600 4=710 5=1200    107H
  219.                 ;6=2400 7=4800 8=9600 9=19200 default
  220.                 ;program when used. 
  221. BYTDLY:        DB    5    ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108H
  222.                 ;default time to send character in ter-
  223.                 ;minal mode file transfer for slow BBS.
  224. CRDLY:        DB    5    ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  225.                 ;default time for extra wait after CRLF
  226.                 ;in terminal mode file transfer
  227. COLUMS:        DB    5    ;number of DIR columns shown        10AH
  228. SETFL:        DB    YES    ;yes=user-added Setup routine        10BH
  229. SCRTST:        DB    YES     ;Cursor control routine         10CH
  230.         DB    0     ;was ACKNAK, now a spare    10DH
  231. BAKFLG:        DB    YES    ;yes=change any file same name to .BAK    10EH
  232. CRCDFLT:    DB    YES    ;yes=default to CRC checking        10FH
  233. TOGCRC:        DB    YES    ;yes=allow toggling of CRC to Checksum    110H
  234. CVTBS:        DB    NO    ;yes=convert backspace to rub        111H
  235. TOGLBK:        DB    YES    ;yes=allow toggling of bksp to rub    112H
  236. ADDLF:        DB    NO    ;no=no LF after CR to send file in    113H
  237.                 ;terminal mode (added by remote echo)
  238. TOGLF:        DB    YES    ;yes=allow toggling of LF after CR    114H
  239. TRNLOG:        DB    YES    ;yes=allow transmission of logon    115H
  240.                 ;write logon sequence at location LOGON
  241. SAVCCP:        DB    YES    ;yes=do not overwrite CCP        116H
  242. LOCNXT:        DB    NO    ;yes=local command if EXTCHR precedes    117H
  243.                 ;no=external command if EXTCHR precedes
  244. TOGLOC:        DB    YES    ;yes=allow toggling of LOCNXT    118H
  245. LSTTST:        DB    YES    ;yes=printer available on printer port    119H
  246. XOFTST:        DB    NO    ;yes=checks for XOFF from remote while    11AH
  247.                 ;sending a file in terminal mode
  248. XONWT:        DB    NO    ;yes=wait for XON after CR while    11BH
  249.                 ;sending a file in terminal mode
  250. TOGXOF:        DB    YES    ;yes=allow toggling of XOFF checking    11CH
  251. IGNCTL:        DB    YES    ;yes=CTL-chars above ^M not displayed    11DH
  252. EXTRA1:        DB    0    ;for future expansion            11EH
  253. EXTRA2:        DB    0    ;for future expansion            11FH
  254. BRKCHR:        DB    'B'-40H    ;^B = Send 300 ms. break tone        120H
  255. NOCONN:        DB    'N'-40H    ;^N = Disconnect from the phone line    121H
  256. LOGCHR:        DB    'L'-40H    ;^L = Send logon            122H
  257. LSTCHR:        DB    'P'-40H    ;^P = Toggle printer            123H
  258. UNSVCH:        DB    'R'-40H    ;^R = Close input text buffer        124H
  259. TRNCHR:        DB    'T'-40H ;^T = Transmit file to remote        125H
  260. SAVCHR:        DB    'Y'-40H    ;^Y = Open input text buffer        126H
  261. EXTCHR:        DB    'W'-40H    ;^W = Send next character        127H
  262.         DS    2        ;                128H
  263. ;
  264.     IF    NOT APPLICARD
  265. ;
  266. INCTL2:        LDA    MODCT2 ! RET    ;in modem control port        12AH
  267.         DS    6        ;spares
  268. OUTDATA:    STA    MODDAT ! RET    ;out modem data port        134H
  269.         DS    6
  270. INPORT:        LDA    MODDAT ! RET    ;in modem data port        13EH
  271.         DS    6        ;spares if needed
  272. ;
  273.     ENDIF                ;NOT APPLICARD
  274. ;
  275.     IF    APPLICARD
  276. ;
  277. INCTL2:        JMP    RD$MODCT2                     12AH
  278.         DS    7
  279. OUTDATA:    JMP    WR$MODDAT
  280.         DS    7
  281. INPORT:        JMP    RD$MODDAT
  282.         DS    7
  283. ;
  284.     ENDIF                ;APPLICARD
  285. ;
  286. MASKR:        ANI    MDRCVB ! RET    ;bit to test for receive ready    148H
  287. TESTR:        CPI    MDRCVR ! RET    ;value of rcv. bit when ready    14BH
  288. MASKS:        ANI    MDSNDB ! RET    ;bit to test for send ready    14EH
  289. TESTS:        CPI    MDSNDR ! RET    ;value of send bit when ready    151H
  290.         DS    12        ;PMMI only calls        154H
  291. ;
  292. LOGON:        DS    2        ;not used by MEX          160H
  293. DIALV:        DS    3        ;not used in this overlay    162H
  294. DISCV:        JMP    MDINIT        ;drops DTR to hang-up fast!
  295. GOODBV:        JMP    GOODBYE        ;called before exit to CPM    168H
  296. INMODV:        JMP    INITMOD        ;go to user written routine    16BH
  297. NEWBDV:        JMP    PBAUD        ;changes baud with phone #
  298. NOPARV:        RET  !    NOP  !    NOP    ;set modem for no-parity     171H
  299. PARITV:        RET  !    NOP  !    NOP    ;set modem parity             174H
  300. SETUPV:        JMP    SETCMD        ;                177H
  301. SPMENV:        DS     3        ;not used by MEX        17AH
  302. VERSNV:        JMP    SYSVER        ;                17DH
  303. BREAKV:        JMP    SENDBRK        ;                180H
  304. ;
  305. ;
  306. ; Do not change the following six lines.
  307. ;
  308. ILPRTV:        DS    3        ;replace with MEX function 9     183H
  309. INBUFV:        DS    3        ;replace with MEX functin 10    186H
  310. ILCMPV:        DS    3        ;replace with table lookup funct 247
  311. INMDMV:        DS    3        ;replace with MEX function 255    18CH
  312. NXSCRV:        DS    3        ;not supported by MEX        18FH
  313. TIMERV:        DS    3        ;replace with MEX function 254    192H
  314. ;
  315. ;
  316. CLREOS:        LXI    D,EOSMSG    ;                195H
  317.         MVI    C,PRINT
  318.         CALL    MEX
  319.         RET            ;                19DH
  320. ;
  321. CLS:        LXI    D,CLSMSG    ;                19EH
  322.         MVI    C,PRINT
  323.         CALL    MEX
  324.         RET            ;                1A6H
  325. ;----------------------------
  326. ;
  327. ;        *** END OF FIXED FORMAT AREA ***
  328. ;
  329. ;----------------------------
  330. ;
  331.     IF    APPLICARD
  332. RD$MODCT2:            ;Read the modem control port
  333.     PUSH     D
  334.     LXI    D,MODCT2
  335.     CALL    PEEK
  336.     POP    D
  337.     RET
  338. ;
  339. WR$MODCT2:            ;Write the modem control port
  340.     PUSH    D
  341.     LXI    D,MODCT2
  342.     CALL    POKE
  343.     POP    D
  344.     RET
  345. ;
  346. RD$MODDAT:            ;Read the modem data port
  347.     PUSH    D
  348.     LXI    D,MODDAT
  349.     CALL    PEEK
  350.     POP     D
  351.     RET
  352. ;
  353. WR$MODDAT:            ;Write the modem data port
  354.     PUSH    D
  355.     LXI    D,MODDAT
  356.     CALL    POKE
  357.     POP    D
  358.     RET
  359. ;
  360. RD$MODCTL2:            ;read the baud rate port
  361.     PUSH    D
  362.     LXI    D,MODCTL2
  363.     CALL    PEEK
  364.     POP    D
  365.     RET
  366. ;
  367. WR$MODCTL2:            ;Write the modem baud rate port
  368.     PUSH    D
  369.     LXI    D,MODCTL2
  370.     CALL    POKE
  371.     POP    D
  372.     RET
  373. ;
  374. WR$MODCMDP:            ;write the control port 2
  375.     PUSH D
  376.     LXI D,MODCMDP
  377.     CALL    POKE
  378.     POP    D
  379.     RET
  380. ;
  381. PEEK:                ;Peek at 1 byte in the apple
  382.                 ;Entry  DE=address
  383.                 ;Exit   A=data
  384.     PUSH    B
  385.     MVI    C,PEEK1BYTE
  386.     CALL    WRBYTE
  387.     CALL    WRWORD
  388.     CALL    RDBYTE
  389.     POP    B
  390.     RET
  391. ;
  392. POKE:                ;Poke 1 byte into the apple
  393.                 ;Entry DE=address
  394.                 ;Exit  A=data
  395.     PUSH    B
  396.     MOV    B,A
  397.     MVI    C,POKE1BYTE
  398.     CALL    WRBYTE
  399.     CALL    WRWORD
  400.     MOV    C,B
  401.     CALL    WRBYTE
  402.     POP    B
  403.     RET
  404. ;
  405.     ENDIF        ;APPLICARD
  406. ;
  407. ;..........
  408. ; You can add your own routine here to send a break tone to reset time-
  409. ; share computers, if desired.
  410. ;
  411.      IF NOT CPS
  412. SENDBRK:    RET
  413.      ENDIF        ;endif not CPS
  414. ;
  415.      IF CPS
  416. SENDBRK:    MVI    A,80H    ;open the command register
  417.         STA    MODCT1    ;by storing 80H in MODCT1
  418.         MVI    A,3FH    ;send a break by storing
  419.         STA    MODCT2    ;$3F in MODCT2
  420.         XRA    A    ;close the command register
  421.         STA    MODCT1    ;by storing 00H in MODCT1
  422.         RET
  423.      ENDIF        ;endif CPS
  424. ;
  425. ; You can add your own routine here to set DTR low and/or send a break
  426. ; tone to disconnect.
  427. ;
  428. GOODBYE:            ;just return for MEX to allow return
  429.                 ;to system w/o dropping line
  430.     RET
  431. ;
  432. ;.....
  433. ;
  434. ;
  435. ; The following address is used to set data bits, parity, stop bits
  436. ; and baud rate on the Super Serial Card.
  437. ;
  438.      IF SSC
  439. ;MODDLL:    EQU     0E0ABH        ;SSC ACIA control register
  440. ;
  441. ;
  442. ; Control over number of data bits, parity and number of stop
  443. ; bits (thru MSB300:) has not been implemented.  These must be
  444. ; set using the slide switches on the Super Serial Card.
  445. ;
  446. ; The following is used to initialize the Apple SSC on execution of the
  447. ; program.  Change it to initialize the modem port on your micro if you
  448. ; wish.  It initializes to 300 baud.
  449. ;
  450. INITMOD:
  451.     MVI    A,1        ;default transfer time to 300
  452.     STA    MSPEED
  453.     LDA    MODDLL        ;current baudrate from MODDLL
  454.     ANI   0F0H        ;zero the last 4 bits
  455. ;
  456. INITMOD1:
  457.     ORI   BDSET             ;get default baudrate (300)
  458.     STA    MODDLL        ;store default baudrate
  459.     RET
  460.      ENDIF            ;SSC
  461. ;.....
  462. ;
  463. ;
  464. ; The following may be used to initialize the Mountain Hardware CPS
  465. ; Multifunction Card for eight bits, no parity, one stop bit, and
  466. ; 1200 baud.  This does not alter the CPS defaults outside of MEX
  467. ;
  468.      IF CPS
  469. INITMOD: 
  470.     CALL    CARRCK        ;check for carrier already present
  471.     RZ            ;if it is, don't do the rest!
  472.     MVI    A,5
  473.     CALL     PBAUD
  474.     MVI    A,1
  475.     CALL    PBAUD
  476.     CALL    MDINIT        ;Initialize modem 
  477.     MVI    A,5
  478.     CALL     PBAUD
  479.     RET            ;INITMOD return
  480. ;
  481. INITMOD1:
  482.     CALL    OPENCMD        ;Open CPS command register
  483.     MVI    A,37H        ;initialize the serial chip
  484.     STA    MODCT2        ;by storing 37H in MODCT2
  485.     MVI    A,4EH        ;set 1 stop bit, no parity
  486.     STA    MODDAT        ;by storing $4E in MODDAT
  487.     LDA     BDSET           ;set baud rate at BDSET  by storing
  488.     STA    MODDAT        ;in MODDAT (same address - the two 
  489.                 ;registers cycle with each write)
  490.     CALL    CLOSECMD    ;Close CPS command register
  491.     RET
  492. ;
  493. ;
  494. OPENCMD:            ;Open the CPS command register
  495.     MVI    A,80H
  496.     STA    MODCT1
  497.     RET    
  498. ;
  499. ;
  500. CLOSECMD:            ;Close the CPS command register
  501.      MVI    A,0
  502.      STA    MODCT1
  503.      RET
  504. ;
  505. ;
  506. MDINIT:                ;Turns off DTR and re-initializes
  507.     CALL    OPENCMD        ;Open the cmd register
  508.     MVI    A,CBASE        ;Turn off DTR
  509.     STA    MODCT2
  510.     MVI    B,10        ;Wait 1 second
  511.     MVI     C,TIMER
  512.     CALL    MEX
  513.     MVI    A,CBASE+DTR+RTS ;Turn everything back on
  514.     STA    MODCT2
  515.     CALL    CLOSECMD    ;Close the cmd register
  516.     MVI    B,10        ;Wait 1 second
  517.     MVI    C,TIMER
  518.     CALL    MEX
  519.     LXI    H,SMATZ        ;Send 'ATZ' to initialize modem
  520.     CALL    SMSEND
  521.     MVI    B,10        ;Wait 1 more sec (sigh)
  522.     MVI    C,TIMER
  523.     CALL    MEX
  524.     RET
  525. ;
  526. SMATZ:    DB    'ATS7=20',CR,0
  527. ;....
  528. ;
  529. ; SMODEM UTILITY ROUTINE: SEND STRING TO MODEM
  530. ;
  531. SMSEND:    MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  532.     CALL    MEX
  533.     JNZ    SMSEND
  534.     MOV    A,M        ;FETCH NEXT CHARACTER
  535.     INX    H
  536.     ORA    A        ;END?
  537.     RZ            ;DONE IF SO
  538.     MOV    B,A        ;NO, POSITION FOR SENDING
  539.     MVI    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  540.     CALL    MEX
  541.     JMP    SMSEND
  542. ;
  543. ; carrier detect routine
  544. ;
  545. CARRCK:
  546.     LDA    MODCT2        ;look at modem status port
  547.     ANI    MDDSRB         ;mask for DSR-change if using DCD
  548.     CPI    MDDSRR        ;see if carrier is present (0=yes)
  549.     RET
  550. ;
  551.     ENDIF                ;CPS
  552. ;
  553. ;.....
  554. ;
  555. ; The following routine initializes the Versacard to the default 
  556. ; baud rate which is set at MSPEED above. If MSPEED is set to something
  557. ; other then 300 or 1200 this routine does'nt alter The annunciator
  558. ; settings.
  559. ;
  560.             IF VERSA 
  561. INITMOD:LDA    MSPEED        ;set annunciators to known state
  562.     CPI    1        ;is it 300 ?
  563.     JZ    OK300
  564.     CPI    5        ;is it 1200 ?
  565.     JZ    OK1200
  566.     RET
  567.      ENDIF            ;Versacard
  568. ;.....
  569. ;
  570.      IF NOT SSC AND NOT CPS AND NOT VERSA
  571. INITMOD:RET            ;intialization goes here, if needed
  572. SETCMD:    RET            ;routine to change baud rates, if needed
  573.      ENDIF            ;NOT SSC AND NOT CPS
  574. ;.....
  575. ;
  576. ; Changes the modem baud rate with phone list entry
  577. ;.....
  578. ;
  579. ;
  580. ; Set baud-rate code in A (if supported by your modem overlay).  PMMI
  581. ; supports only five rates, which are validated here. NOTE: this routine
  582. ; (ie, the one vectored through NEWBDV) should update MSPEED with the
  583. ; passed code, but ONLY if that rate is supported by the hardware.
  584. ;
  585. PBAUD:    PUSH    H        ;don't alter anybody
  586.     PUSH    D
  587.     PUSH    B
  588.     MOV    E,A        ;code to DE
  589.     MVI    D,0
  590.     LXI    H,BAUDTB    ;offset into table
  591.     DAD    D
  592.     MOV    A,M        ;fetch code
  593.     ORA    A        ;0? (means unsupported code)
  594.     
  595.     JZ    PBEXIT        ;exit if so
  596.     STA    BDSET         ;good rate, set it
  597.     CALL    INITMOD1    ;Baud set subroutine
  598.     STA    BAUDSV        ;save it
  599.     MOV    A,E        ;get speed code back
  600.     STA    MSPEED        ;make it current
  601.     JMP    PBEXIT + 1    ;jump error flag set
  602. PBEXIT:    STC            ;set return error for STBAUD caller
  603.     POP    B        ;all done
  604.     POP    D
  605.     POP    H
  606.     RET
  607. ;
  608. ; table of baud rate parameters for supported rates
  609. ;
  610.       IF    CPS    
  611. BAUDTB:    DB    0,035h,0,0,0        ;110,300,450,610,710
  612.     DB    037h,0,0,0,0        ;1200,2400,4800,9600,19200
  613. BAUDSV: DB    037H            ;1200 bps default
  614. BDSET:    DB    037H
  615.       ENDIF ;CPS
  616. ;
  617.        IF     SSC
  618. BAUDTB:    DB    0,0006,0,0,0        ;110,300,450,610,710
  619.     DB    0007,0,0,0,0        ;1200,2400,4800,9600,19200
  620. BAUDSV: DB    0006            ;300 bps default
  621. BDSET:    DB    0006
  622.       ENDIF ;SSC
  623. ;
  624.        IF VERSA
  625. BAUDTB:    DB    0,0E05EH,0,0,0        ;110,300,450,610,710 (CLR AN#3)
  626.     DB    0E05FH,0,0,0,0        ;1200,2400,4800,9600,19200 (Set AN#3)
  627. BAUDSV:    DB    0E05EH            ;300 bps default
  628. BDSET:    DB    0E05EH
  629.       ENDIF ;CPS
  630. ;
  631. ;
  632. ; Sign-on message
  633. ;
  634. SYSVER:    LXI    D,VERMSG
  635.     MVI    C,PRINT
  636.     CALL    MEX
  637. CARSHOW: LXI    D,NOMESG        ;tell about carrier
  638.     CALL    CARRCK            ;check for it
  639.     MVI    C,PRINT
  640.     CNZ    MEX            ;print the "NO" if no carrier
  641.     LXI    D,CARMSG        ;print "carrier present"
  642.     MVI    C,PRINT
  643.     CALL    MEX
  644.     CALL    CRLF
  645.     RET
  646. ;
  647. ;
  648. NOMESG:    DB    'no $'
  649. CARMSG:    DB    'carrier present','$'
  650. ;
  651. ; Newline on console
  652. ;
  653. CRLF:    MVI    A,CR
  654.     CALL    TYPE
  655.     MVI    A,LF        ;fall into TYPE
  656. ;
  657. ; type char in A on console
  658. ;
  659. TYPE:    PUSH    H        ;save 'em
  660.     PUSH    D
  661.     PUSH    B
  662.     MOV    E,A        ;align output character
  663.     MVI    C,CONOUT    ;print via MEX
  664.     CALL    MEX
  665.     POP    B
  666.     POP    D
  667.     POP    H
  668.     RET
  669. ;
  670. ; Data area
  671. ;
  672. ERRFLG:    DB    0        ;connection error code
  673. SPKST:    DB    YES        ;default to speaker on
  674. ANST:    DB    NO        ;default to not answer
  675. ;
  676. ;------------------------------------------------------------
  677. ;
  678. ; The remainder of this overlay implements a very versatile
  679. ; SET command -- if you prefer not to write a SET for your
  680. ; modem, you may delete the code from here to the END statement.
  681. ;
  682. ;
  683. ; Control is passed here after MEX parses a SET command.
  684. ;
  685. SETCMD:    CALL     CARRCK        ;first check for carrier
  686.     JZ    CARRON        ;if carrier, jmp to on msg and print
  687.     MVI    C,SBLANK    ;any arguments?
  688.     CALL    MEX
  689.     JC    SETSHO        ;if not, go print out values
  690.     LXI    D,CMDTBL    ;parse command
  691.     CALL    TSRCH        ;from table
  692.     PUSH    H        ;any address on stack
  693.     RNC            ;if we have one, execute it
  694.     POP    H        ;nope, fix stack
  695. SETERR:    LXI    D,SETEMS    ;print error
  696.     MVI    C,PRINT
  697.     CALL    MEX
  698.     RET
  699. ;
  700. CARRON:    LXI    D,CONMSG    ;print carrier on msg
  701.     MVI    C,PRINT
  702.     CALL    MEX
  703.     RET
  704. ;
  705. CONMSG:    DB    CR,LF,'Carrier on...can not set',CR,LF,'$'
  706. SETEMS:    DB    CR,LF,'SET command error',CR,LF,'$'
  707. ;
  708. ; SET command table ... note that tables are constructed of command-
  709. ; name (terminated by high bit=1) followed by word-data-value returned
  710. ; in HL by MEX service processor LOOKUP.  Table must be terminated by
  711. ; a binary zero.
  712. ;
  713. ; Note that LOOKUP attempts to find the next item in the input stream
  714. ; in the table passed to it in HL ... if found, the table data item is
  715. ; returned in HL; if not found, LOOKUP returns carry set.
  716. ;
  717. CMDTBL:    DB    '?'+80H            ;"set ?"
  718.     DW    STHELP
  719.     DB    'BAU','D'+80H        ;"set baud"
  720.     DW    STBAUD
  721.     DB    'SPK','R'+80H        ;"set spkr"
  722.     DW    STSPKR
  723.     DB    'ANS','R'+80H        ;"set ans(wer)"
  724.     DW    STANSR
  725. ;
  726.     DB    0        ;<<=== table terminator
  727. ;
  728. ; SET <no-args>: print current statistics
  729. ;
  730. SETSHO:    LXI    H,SHOTBL    ;get table of SHOW subroutines
  731. SETSLP:    MOV    E,M        ;get table address
  732.     INX    H
  733.     MOV    D,M
  734.     INX    H
  735.     MOV    A,D        ;end of table?
  736.     ORA    E
  737.     RZ            ;exit if so
  738.     PUSH    H        ;save table pointer
  739.     XCHG            ;adrs to HL
  740.     CALL    GOHL        ;do it
  741.     CALL    CRLF        ;print newline
  742.     MVI    C,CHEKCC    ;check for console abort
  743.     CALL    MEX
  744.     POP    H        ;it's done
  745.     JNZ    SETSLP        ;continue if no abort
  746.     RET
  747. ;
  748. GOHL:    PCHL
  749. ;
  750. ; table of SHOW subroutines
  751. ;
  752. SHOTBL:    DW    CARSHOW
  753.     DW    BDSHOW
  754.     DW    SPKSHOW
  755.     DW    ANSHOW
  756.     DW    0        ;<<== table terminator
  757. ;
  758. ; SET ?  processor
  759. ;
  760. STHELP:    CALL     CLS            ;clear screen
  761.     LXI    D,HLPMSG
  762.     MVI    C,PRINT
  763.     CALL    MEX
  764.     RET
  765. ;
  766. ; The help message
  767. ;
  768. HLPMSG:    DB    CR,LF,'SET Commands, Smartmodem version:',CR,LF
  769.     DB    CR,LF,'SET BAUD 300 <or> 1200'
  770.     DB    CR,LF,'SET SPKR ON <or> OFF'
  771.     DB    CR,LF,'SET ANSR ON <or> OFF'
  772.     DB    CR,LF,LF,'$'
  773. ;
  774. ; SET BAUD processor
  775. ;
  776. STBAUD:    MVI    C,BDPARS    ;function code
  777.     CALL    MEX    
  778.     JC    SETERR        ;invalid code
  779.     CALL    PBAUD        ;try to set it
  780.     JC    SETERR        ;unsupported code
  781. BDSHOW:    CALL    ILPRT        ;display baud
  782.     DB    'Baud rate:',TAB,' ',0
  783.     LDA    MSPEED
  784.     MVI    C,PRBAUD    ;use MEX routine
  785.     CALL    MEX
  786.     RET
  787. ;
  788. ;............
  789. ;
  790. ;    SET SPEAKER  processor
  791. ;............
  792. STSPKR:    LXI    D,SPKTBL        ;look for valid input
  793.     CALL     TSRCH            
  794.     JC    SETERR            ;error if not valid
  795.     MOV    A,L            ;looks good, move it
  796.     STA     SPKST
  797.     CPI    YES            ;speaker on or off?
  798.     JZ    SPKON            ;wants it on-skip to speaker on
  799.     LXI     H,SPOFMSG        ;wants it off-load msg and send
  800.     CALL    SMSEND            ;...to modem
  801.     JMP    SPKSHOW            ;show the reset on screen
  802. SPKON:    LXI    H,SPONMSG        ;wants it on-load msg and send
  803.     CALL    SMSEND            ;...to modem
  804. SPKSHOW: CALL    ILPRT            ;display status msg- on or off
  805.     DB    'Speaker is:',TAB,' ',0
  806.     LDA     SPKST
  807.     CPI     YES
  808.     JZ    SPSHON
  809.     CALL    ILPRT
  810.     DB    'Off',0
  811.     RET
  812. SPSHON: CALL     ILPRT
  813.     DB    'On',0
  814.     RET
  815. ;
  816. SPKTBL:    DB    'O','N'+80H        ;command table for speaker on or off,
  817.     DB    YES,0            ;also used for Answer on or off
  818.     DB    'OF','F'+80H
  819.     DB    NO,0
  820.     DB    0
  821. ;
  822. SPONMSG: DB    'ATM1',CR,0        ;smodem msg for speaker on
  823. SPOFMSG: DB    'ATM0',CR,0        ;smodem msg for speaker off
  824. ;
  825. ;..........
  826. ;
  827. ;   SET AUTO ANSWER processor
  828. ;.........
  829. STANSR:    LXI    D,SPKTBL        ;same table used for STSPKR & STANSR
  830.     CALL     TSRCH            ;tests for on or off
  831.     JC    SETERR
  832.     MOV    A,L
  833.     STA     ANST
  834.     CPI    YES
  835.     JZ    ANSON
  836.     LXI     H,ANOFMSG
  837.     CALL    SMSEND
  838.     JMP    ANSHOW
  839. ANSON:    LXI    H,ANONMSG
  840.     CALL    SMSEND
  841. ANSHOW: CALL    ILPRT
  842.     DB    'Auto-answer is:',TAB,' ',0
  843.     LDA     ANST
  844.     CPI     YES
  845.     JZ    ANSHON
  846.     CALL    ILPRT
  847.     DB    'Off',CR,LF,0
  848.     RET
  849. ANSHON: CALL     ILPRT
  850.     DB    'On',CR,LF,0
  851.     RET
  852. ;
  853. ANONMSG: DB    'ATS0=1',CR,0
  854. ANOFMSG: DB    'ATS0=0',CR,0
  855. ;
  856. ;.........
  857. ; Compare next input-stream item in table @DE; CY=1
  858. ; if not found, else HL=matched data item
  859. ;
  860. TSRCH:    MVI    C,LOOKUP    ;get function code
  861.     JMP    MEX        ;pass to MEX processor
  862. ;
  863. ; Print in-line message ... blows away C register
  864. ;
  865. ILPRT:    MVI    C,ILP        ;get function code
  866.     JMP    MEX        ;go do it
  867. ;
  868. ;------------------------------------------------------------
  869. ;
  870. EOSMSG:        DB    1BH,59H,0,0,'$'    ;clear to end of screen message
  871. ;
  872. CLSMSG:        DB    1BH,2AH,0,0,'$'    ;clear screen message
  873. ;
  874. VERMSG:        DB    CR,LF,LF,LF,TAB,TAB,TAB,'Version for Apple ][',CR,LF
  875.         DB    TAB,TAB,TAB,'    with '
  876. ;
  877.             IF VERSA
  878.         DB    'Versacard'
  879.             ENDIF
  880. ;
  881.             IF SSC
  882.         DB    'Super Serial Card'
  883.             ENDIF
  884. ;
  885.             IF COMCARD
  886.         DB    'Comcard'
  887.             ENDIF
  888. ;
  889.             IF CPS
  890.         DB    'CPS card',CR,LF
  891.             ENDIF
  892. ;
  893.             IF CCS OR SSM
  894.         DB    'Serial card'
  895.             ENDIF
  896. ;
  897.         DB    TAB,TAB,TAB,'HAYES Smart modem',CR,LF
  898.         DB    TAB,TAB,'Overlay V. ',REV/10+'0','.'
  899.         DB    REV MOD 10+'0',':',' By Norman Beeler'
  900.         DB    CR,LF,LF,'$'
  901. ;----------------------
  902. ; NOTE: MUST TERMINATE PRIOR TO 0B00H (with Smartmodem)
  903. ;
  904.     END
  905.