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-APCC.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  28KB  |  1,003 lines

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