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

  1.     title    'CompuPro overlay for Interfacer 3/4'
  2. ;
  3. ; MXO-GB11.ASM -- MEX Overlay file for the CompuPro I3/I4 & SS1.  06/16/84
  4. ;
  5. ; This overlay adapts the MEX modem program to the CompuPro Interfacer 3 or
  6. ; Interfacer 4 or System Support 1 serial cards using the 2651 USART chip.
  7. ;
  8. ;
  9. ; This overlay is capable of setting baud rate and setting port number
  10. ; (via the SET command), setting baud rate from the phone library, dis-
  11. ; connecting the  modem, and sending a break.
  12. ;
  13. REV    EQU    11    ;V 1.1
  14. ;
  15. ; NOTE TO INTERFACER 4 USERS:
  16. ; The 'MIDDLE' serial port and the Centronics port can have their addresses
  17. ; changed using a hardware option.  Godbout did this to maintain software
  18. ; compatibility with their bios.  In order to prevent problems, use the
  19. ; 'RIGHT' serial port (RELATIVE USER 5) instead of the center serial
  20. ; port (RELATIVE USER 6).  Also, read page 19 of the manual, the modem
  21. ; port will probably have to be set up in the 'MASTER MODE'.  While 
  22. ; you're reading the manual, read the section on 'WAIT STATE LOGIC'.
  23. ; I'm using a CPU-Z running at 6Mhz, with a 300 baud modem and two wait
  24. ; states (jumper at J7).  Without them, I get 'o's for 'n's and 'g's
  25. ; for 'f's, and the checksums are never right.    (AWW 12/20/83)
  26. ;
  27. ; Calling conventions for the various overlay entry points are detailed more
  28. ; fully in the PMMI overlay (MXO-PMxx.ASM, where xx=revision number)
  29. ;
  30. ; History as a MEX overlay
  31. ;
  32. ; 06/16/84 - Baud rate can now be automaticaly selected by MEX
  33. ;         when making a call with CAL command. Also Baud rate
  34. ;         is now correctly initialized.     - Alex Soya
  35. ;
  36. ; 05/12/84 - SET port (0-7, S -- S=SS1)           - Ron Fowler
  37. ; 05/11/84 - MEXified the overlay           - Ron Fowler
  38. ;
  39. ; History as an MDM7 overlay
  40. ;
  41. ; 11/20/83 - Interfacer 4 note added        - A.W. Warren
  42. ; 11/11/83 - Renamed to M7IN-1.ASM, no changes    - Irv Hoff
  43. ; 07/27/83 - Renamed to work with MDM712    - Irv Hoff
  44. ; 07/11/83 - Modifed somewhat for MDM711    - Irv Hoff
  45. ; 07/08/83 - Adapted from MDM711GP.ASM        - Paul Traina
  46. ;
  47. ;
  48. ; MEX service processor stuff
  49. ;
  50. MEX    EQU    0D00H        ;address of the service processor
  51. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  52. TIMER    EQU    254        ;delay 100ms * reg B
  53. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  54. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  55. SNDRDY    EQU    251        ;test for modem-send ready
  56. RCVRDY    EQU    250        ;test for modem-receive ready
  57. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  58. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  59. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  60. PARSFN    EQU    246        ;parse filename from input stream
  61. BDPARS    EQU    245        ;parse baud-rate from input stream
  62. SBLANK    EQU    244        ;scan input stream to next non-blank
  63. EVALA    EQU    243        ;evaluate numeric from input stream
  64. LKAHED    EQU    242        ;get nxt char w/o removing from input
  65. GNC    EQU    241        ;get char from input, cy=1 if none
  66. ILP    EQU    240        ;inline print
  67. DECOUT    EQU    239        ;decimal output
  68. PRBAUD    EQU    238        ;print baud rate
  69. ;
  70. PRINT    EQU    9        ;BDOS/MEX print-string function call
  71. ;
  72. BELL    EQU    7        ;bell
  73. TAB    EQU    9
  74. CR    EQU    13        ;carriage return
  75. LF    EQU    10        ;linefeed
  76. ESC    EQU    1BH        ;escape
  77. YES    EQU    0FFH
  78. NO    EQU    0
  79. ;
  80. ; Interfacer 3/4 and SS1 port equates
  81. INBASE    EQU    010H        ;base port of CompuPro I3 or I4 card(s)
  82. SSBASE    EQU    05CH        ;base of serial section of CompuPro SS1
  83. ;
  84. UPORT    EQU    INBASE+7    ;user (chip select) port
  85. ;
  86. ; Port offsets
  87. ;
  88. DPORT:    EQU    0        ;data port
  89. SPORT:    EQU    1        ;status port
  90. MPORT:    EQU    2        ;mode port
  91. CPORT:    EQU    3        ;control port
  92. ;
  93. TBMT:    EQU    01H        ;transmit buffer empty
  94. DAV:    EQU    02H        ;data available
  95. ;
  96. ; Baud rate parameters
  97. ;
  98. BD300:    EQU    35H        ;300 baud
  99. BD600:    EQU    36H        ;600 baud
  100. BD1200: EQU    37H        ;1200 baud
  101. BD4800: EQU    3CH        ;4800 baud
  102. BD9600: EQU    3EH        ;9600 baud
  103. BD19200 EQU    3FH        ;19200 baud
  104. ;
  105.     ORG    100H
  106. ;
  107. ; Change the clock speed to suit your system
  108. ;
  109.     DS    3        ;(for  "JMP   START" instruction)
  110.  
  111.     DB    NO        ;yes=PMMI S-100 Modem            103H
  112.     DB    YES        ;yes=HAYES Smartmodem, no=non-PMMI    104H
  113.     DB    'T'        ;T=touch, P=pulse (Smartmodem-only)    105H
  114. CLOCK:    DB    60        ;clock speed in MHz x10, 25.5 MHz max.    106H
  115.                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  116. MSPEED: DB    5        ;0=110 1=300 2=450 3=600 4=710 5=1200    107H
  117.                 ;6=2400 7=4800 8=9600 9=19200 default
  118. BYTDLY: DB    5        ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108H
  119.                 ;default time to send character in ter-
  120.                 ;minal mode file transfer for slow BBS.
  121. CRDLY:    DB    5        ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  122.                 ;default time for extra wait after CRLF
  123.                 ;in terminal mode file transfer
  124. COLUMS: DB    5        ;number of DIR columns shown        10AH
  125. SETFLG: DB    YES        ;yes=user-added Setup routine        10BH
  126. SCRTST: DB    YES        ;Cursor control routine            10CH
  127.     DB    YES        ;yes=resend a record after any non-ACK    10DH
  128.                 ;no=resend a record after a valid-NAK
  129. BAKFLG: DB    YES        ;yes=change any file same name to .BAK    10EH
  130. CRCDFL: DB    NO        ;yes=default to CRC checking        10FH
  131. TOGCRC: DB    YES        ;yes=allow toggling of CRC to Checksum    110H
  132. CVTBS:    DB    NO        ;yes=convert backspace to rub        111H
  133. TOGLBK: DB    YES        ;yes=allow toggling of bksp to rub    112H
  134. ADDLF:    DB    NO        ;no=no LF after CR to send file in    113H
  135.                 ;terminal mode (added by remote echo)
  136. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR    114H
  137.     DB    YES        ;yes=allow transmission of logon    115H
  138.                 ;write logon sequence at location LOGON
  139. SAVCCP: DB    YES        ;yes=do not overwrite CCP        116H
  140.     DB    NO        ;yes=local command if EXTCHR precedes    117H
  141.                 ;no=external command if EXTCHR precedes
  142.     DB    YES        ;yes=allow toggling of LOCONEXTCHR    118H
  143. LSTTST: DB    YES        ;yes=printer available on printer port    119H
  144. XOFTST: DB    NO        ;yes=checks for XOFF from remote while    11AH
  145.                 ;sending a file in terminal mode
  146. XONWT:    DB    NO        ;yes=wait for XON after CR while    11BH
  147.                 ;sending a file in terminal mode
  148. TOGXOF: DB    YES        ;yes=allow toggling of XOFF checking    11CH
  149. IGNCTL: DB    NO        ;yes=CTL-chars above ^M not displayed    11DH
  150. EXTRA1: DB    0        ;for future expansion            11EH
  151. EXITCHR DB    'E'-40H        ;^E = Exit to main menu            11FH
  152. BRKCHR: DB    '@'-40H        ;^@ = Send 300 ms. break tone        120H
  153. NOCONN: DB    'N'-40H        ;^N = Disconnect from the phone line    121H
  154. LOGCHR: DB    'L'-40H        ;^L = Send logon            122H
  155. LSTCHR: DB    'P'-40H        ;^P = Toggle printer            123H
  156. UNSAVE: DB    'R'-40H        ;^R = Close input text buffer        124H
  157. TRNCHR: DB    'T'-40H        ;^T = Transmit file to remote        125H
  158. SAVCHR: DB    'Y'-40H        ;^Y = Open input text buffer        126H
  159. EXTCHR: DB    '^'-40H        ;^^ = Send next character        127H
  160.     DS    2        ;unused by MEX                128H
  161. ;
  162. INCTL1: JMP    INSP        ;go input status port            12AH
  163.     DS    7
  164. ;
  165. OTDATA: JMP    OUTDP        ;go output data port            134H
  166.     DS    7
  167. ;
  168. INPORT: JMP    INDP        ;go input data port            13EH
  169.     DS    7
  170. ;
  171. MASKR:    ANI    DAV    ! RET    ;bit to test for receive ready        148H
  172. TESTR:    CPI    DAV    ! RET    ;value of rcv. bit when ready        14BH
  173. MASKS:    ANI    TBMT    ! RET    ;bit to test for send ready        14EH
  174. TESTS:    CPI    TBMT    ! RET    ;value of send bit when ready        151H
  175.     DS    14        ;                    156H
  176. ;
  177. ;
  178.     DS    3        ;DIALV: not done here (maybe MXO-SM)    162H
  179. DISCV:    JMP    DISCON        ;disconnect
  180. GOODBV: JMP    GOODBY        ;                    168H
  181. INMODV: JMP    NITMOD        ;go to user written routine        16BH
  182. NEWDBV: JMP    PBAUD        ;NEWBDV                    16EH
  183.     RET ! NOP ! NOP        ;NOPARV                    171H
  184.     RET ! NOP ! NOP        ;PARITV                    174H
  185. SETUPV: JMP    SETCMD        ;                    177H
  186.     DS    3        ;not used by MEX            17AH
  187. VERSNV: JMP    SYSVER        ;                    17DH
  188. BREAKV: JMP    SBREAK        ;                    180H
  189. ;
  190. ; Do not change the following six lines (they provide access to routines
  191. ; in MEX that are present to support MDM7 overlays -- they will likely
  192. ; be gone by MEX v2.0).
  193. ;
  194. ILPRTV: DS    3        ;                    183H
  195. INBUFV    DS    3        ;                    186H
  196. ILCMPV: DS    3        ;                    189H
  197. INMDMV: DS    3        ;                    18CH
  198.     DS    3        ;                    18FH
  199. TIMERV    DS    3        ;                    192H
  200. ;
  201. ; Routine to clear to end of screen.  If using CLREOS and CLRSCRN, set
  202. ; SCRTEST to YES at 010AH (above).
  203. ;
  204. CLREOS: LXI    D,EOSMSG    ;                    195H
  205.     MVI    C,PRINT
  206.     CALL    MEX
  207.     RET
  208. ;
  209. CLS:    LXI    D,CLSMSG    ;                    19EH
  210.     MVI    C,PRINT
  211.     CALL    MEX
  212.     RET
  213. ;                                    1A7H
  214. ;
  215. ; end of fixed area
  216. ;
  217. SYSVER: MVI    C,ILP        ;in-line print
  218.     CALL    MEX
  219.     DB    'Interfacer/SS1 V.'
  220.     DB    REV/10+'0'
  221.     DB    '.'
  222.     DB    REV MOD 10+'0'
  223.     DB    CR,LF,0
  224.     RET
  225. ;
  226. ; Routine to exit just prior to exit-to-cpm
  227. ;
  228. GOODBY: RET            ;not done here
  229. ;
  230. ; Send break to remote
  231. ;
  232. SBREAK: MVI    A,2FH        ;send break for 300ms
  233.     JMP    DISC1
  234. ;
  235. ; Disconnect the modem
  236. ;
  237. DISCON: XRA    A        ;turn off DTR
  238. DISC1:    PUSH    PSW
  239.     CALL    STPORT        ;select port
  240.     POP    PSW
  241.     CALL    OUTCP        ;send passed byte to CPORT
  242.     MVI    B,3        ;turn off DTR for 300 ms.
  243.     MVI    C,TIMER
  244.     CALL    MEX
  245.     MVI    A,27H        ;turn DTR back on
  246.     CALL    OUTCP
  247.     RET
  248. ;
  249. ; Initialize the port; either set an initial baud rate, or (if
  250. ; your system is capable of it) query the current rate and set
  251. ; MSPEED value.     We can do neither here, so we assume a value
  252. ; for MSPEED -- if it's not the current value, the user must
  253. ; execute a SET command to bring MSPEED into agreement with the
  254. ; current baud rate.
  255. ;
  256. NITMOD: MVI    A,5
  257.     STA    MSPEED
  258.     CALL    PBAUD
  259.     RET
  260. ;
  261. ; SET command: select baud rate, port number. Port number may be any of
  262. ; 0,1,2,3,4,5,6,7,S  (S=SS1), baud rate any of 300, 600, 1200, 4800
  263. ; 9600, 19200.    Special set-port syntax allows baud rate after port
  264. ; number.  Examples:
  265. ;
  266. ;    SET PORT 3
  267. ;    SET PORT 5 1200
  268. ;    SET PORT S 300
  269. ;    SET BAUD 9600
  270. ;
  271. SETCMD: MVI    C,SBLANK    ;any arguments?
  272.     CALL    MEX
  273.     JC    TELL        ;if not, go display port/baud
  274.     LXI    D,CMDTBL
  275.     MVI    C,LOOKUP
  276.     CALL    MEX        ;parse argument
  277.     PUSH    H        ;save any parsed argument adrs on stack
  278.     RNC            ;if we have one, return to it
  279.     POP    H        ;oops, input not found in table
  280. SETERR: MVI    C,ILP        ;inline print
  281.     CALL    MEX
  282.     DB    CR,LF,'SET command error',CR,LF,0
  283.     RET
  284. ;
  285. ; Argument table
  286. ;
  287. CMDTBL: DB    '?'+80H        ;help
  288.     DW    STHELP
  289.     DB    'BAU','D'+80H    ;"set baud"
  290.     DW    STBAUD
  291.     DB    'POR','T'+80H    ;"set port"
  292.     DW    SETPOR
  293.     DB    0        ;<<=== table terminator
  294. ;
  295. ; "SET ?" processor
  296. ;
  297. STHELP: MVI    C,ILP        ;inline print
  298.     CALL    MEX
  299.     DB    CR,LF,'SET BAUD <rate>'
  300.     DB    CR,LF,'SET PORT <port-number>'
  301.     DB    CR,LF
  302.     DB    CR,LF,'Baud rate is one of:'
  303.     DB    CR,LF,'   300 600 1200 4800 9600 19200'
  304.     DB    CR,LF,'Port number is one of:'
  305.     DB    CR,LF,'   0-7 : interfacer 3 or 4 port number'
  306.     DB    CR,LF,'   S   : System Support I serial port'
  307.     DB    CR,LF,0
  308.     RET
  309. ;
  310. ; "SET BAUD" processor
  311. ;
  312. STBAUD: MVI    C,BDPARS    ;function code: parse a baudrate
  313.     CALL    MEX        ;let MEX look up code
  314.     JC    SETERR        ;jump if invalid code
  315.     CALL    PBAUD        ;no, try to set it
  316.     JC    SETERR        ;if not one of ours, bomb out
  317. BDSHOW: MVI    C,ILP        ;inline print
  318.     CALL    MEX        ;display baud
  319.     DB    'Baud: ',0
  320.     LDA    MSPEED        ;get current baud rate
  321.     MVI    C,PRBAUD    ;let MEX print it
  322.     CALL    MEX
  323.     RET
  324. ;
  325. ; SET PORT processor
  326. ;
  327. SETPOR: MVI    C,SBLANK    ;scan to argument
  328.     CALL    MEX
  329.     JC    SETERR        ;if no arg, bomb out
  330.     MVI    C,GNC        ;else consume it
  331.     CALL    MEX
  332.     CPI    'S'        ;SS1?
  333.     JZ    SETSS1        ;jump if so
  334.     CPI    's'
  335.     JZ    SETSS1
  336.     SUI    '0'        ;convert
  337.     JC    SETERR
  338.     CPI    7+1
  339.     JNC    SETERR
  340.     JMP    SETX        ;go put away port #
  341. SETSS1: MVI    A,0FFH        ;SS1 token
  342. SETX:    STA    PORT
  343.     MVI    C,SBLANK    ;any thing more?
  344.     CALL    MEX
  345.     JNC    STBAUD        ;if so, go parse as baud rate
  346. ;
  347. TELL:    MVI    C,ILP
  348.     CALL    MEX
  349.     DB    CR,LF,'Port: ',0
  350.     LDA    PORT
  351.     CPI    0FFH        ;SS1?
  352.     JNZ    TELL1        ;jump if not
  353.     MVI    A,'S'-'0'    ;set SS1, and avoid a JMP
  354. TELL1:    ADI    '0'        ;get port # in ASCII
  355.     STA    PORTAS
  356.     MVI    C,ILP
  357.     CALL    MEX
  358. PORTAS: DB    '    ',0
  359.     JMP    BDSHOW
  360. ;
  361. ; This routine sets baud rate passed as MSPEED code in A.
  362. ; Returns CY=1 if baud rate not supported (if supported,
  363. ; this routine must set the new MSPEED code).
  364. ;
  365. PBAUD:    PUSH    H        ;don't alter anybody
  366.     PUSH    D
  367.     PUSH    B
  368.     MOV    E,A        ;MSPEED code to DE
  369.     MVI    D,0
  370.     LXI    H,BAUDTB    ;offset into table
  371.     DAD    D
  372.     MOV    A,M        ;fetch code
  373.     ORA    A        ;0? (means unsupported code)
  374.     STC            ;prep carry in case unsupported
  375.     JZ    PBEXIT        ;exit if bad
  376.     PUSH    PSW        ;no, set the rate
  377.     MVI    A,04EH        ;first, set 8 bits, no parity, 1 stop
  378.     CALL    OUTMP
  379.     POP    PSW        ;get baud code back
  380.     CALL    OUTMP
  381.     MVI    A,27H        ;turn on DTR, etc
  382.     CALL    OUTCP
  383.     MOV    A,E        ;get MSPEED code back
  384.     STA    MSPEED        ;set it
  385.     ORA    A        ;return no-errors
  386. PBEXIT: POP    B
  387.     POP    D
  388.     POP    H
  389.     RET
  390. ;
  391. BAUDTB: DB    0        ;110 (not supported)
  392.     DB    BD300        ;300
  393.     DB    0        ;450 (not supported)
  394.     DB    BD600        ;600
  395.     DB    0        ;710 (not supported)
  396.     DB    BD1200        ;1200
  397.     DB    0        ;2400 (not supported)
  398.     DB    BD4800        ;4800
  399.     DB    BD9600        ;9600
  400.     DB    BD19200        ;19200
  401. ;
  402. ;    Port access routines
  403. ;
  404. ; Input
  405. ;
  406. INSP:    MVI    A,SPORT        ;in status-port
  407.     JMP    INP1
  408. INDP:    MVI    A,DPORT        ;in data-port
  409. INP1:    PUSH    B        ;can't alter BC
  410.     MOV    C,A        ;2661-relative port number in C
  411.     CALL    STPORT        ;set port #
  412.     ADD    C        ;A=absolute port #
  413.     POP    B        ;restore BC
  414.     STA    INP2+1        ;put port # in the code
  415. INP2:    IN    0        ;do the input
  416.     RET
  417. ;
  418. ; Output
  419. ;
  420. OUTDP:    PUSH    B        ;out data-port
  421.     MVI    C,DPORT
  422.     JMP    OUT1
  423. OUTMP:    PUSH    B        ;out mport
  424.     MVI    C,MPORT
  425.     JMP    OUT1
  426. OUTCP:    PUSH    B        ;out control port
  427.     MVI    C,CPORT
  428. OUT1:    MOV    B,A        ;B=char to send
  429.     CALL    STPORT        ;set port #
  430.     ADD    C        ;A=absolute port #
  431.     STA    OUT2+1        ;put port # in the code
  432.     MOV    A,B        ;A=char to send
  433. OUT2:    OUT    0        ;send it
  434.     POP    B
  435.     RET
  436. ;
  437. ; Set port #, return base adrs
  438. ;
  439. STPORT: LDA    PORT        ;get current port #
  440.     CPI    0FFH        ;255 implies SS1
  441.     JNZ    STIN        ;jump if not SS1
  442.     MVI    A,SSBASE    ;it's SS1, return base adrs
  443.     RET
  444. STIN:    OUT    UPORT        ;set IN 3/4 user #
  445.     MVI    A,INBASE    ;return base port
  446.     RET
  447. ;
  448. ;
  449. PORT:    DB    6        ;initial port #=ss1
  450. ;
  451. ; Clear-to-end-of-screen and clear-screen sequences
  452. ;
  453. EOSMSG: DB    ESC,'T','$'
  454. CLSMSG: DB    26,'$'
  455. ;
  456. ;
  457.     END
  458.