home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / mex / mxo-if10.aqm / MXO-IF10.ASM
Assembly Source File  |  1985-08-05  |  11KB  |  376 lines

  1.     Title    'MEX overlay for 6850 + SMDM VERSION 1.0'
  2.  
  3. REV    EQU    10        ;overlay revision level
  4.  
  5. ;  MEX  SMDM + 6850 OVERLAY VERSION 1.0:  written 5/20/84 by JOHN ROHNER
  6.  
  7. ; This is a MEX overlay file for the SMART modem AND 6850 UART.
  8. ; THIS OVERLAY WWRITTEN FOR INFORMER COMPUTERS OR ANY 6850 UART.
  9. ; You can use it as a model for designing your own modem overlay (or 
  10. ; you can use any existing MDM7 overlay, if available).
  11.  
  12. ; Misc equates
  13.  
  14. NO    EQU    0
  15. YES    EQU    NOT NO
  16. TPA    EQU    100H
  17. CR    EQU    13
  18. LF    EQU    10
  19. TAB    EQU    9
  20.  
  21. ; UART port definitions
  22. ;    Set base port for 6850 UART
  23.  
  24. PORT    EQU    02H        ;UART base port (data or status)
  25.  
  26. ;  modem control/status    register
  27.  
  28. MOCTLP    EQU    PORT        ; modem    control    port
  29. MODCT1    EQU    PORT        ;modem control port
  30.  
  31. SPORT    EQU    PORT        ; modem    status port
  32. MODCT2    EQU    PORT        ;modem status port
  33. BAUDRP    EQU    PORT        ;modem baud rate port
  34.  
  35. ;  modem data register
  36.  
  37. DPORT    EQU    PORT+1        ;  modem data port
  38. MODDAT    EQU    PORT+1        ;modem data port
  39.  
  40. ; UART bit definitions
  41.  
  42. MDRCVB    EQU    01H        ;modem receive bit (DAV)
  43. MDRCVR    EQU    01H        ;modem receive ready
  44. MDSNDB    EQU    02H        ;modem send bit
  45. MDSNDR    EQU    02H        ;modem send ready bit
  46.  
  47. ;  modem control bits
  48.  
  49. MOCTLI    EQU    16H        ; UART initial setting
  50. MOBDM    EQU    03H        ; baud rate bits (/16,/64)
  51. MOBD30    EQU    02H        ; 300 baud rate    (/64)
  52. MOBD12    EQU    01H        ; 1200 baud rate (/16)
  53. MOBRKM    EQU    60H        ; send break bits
  54. MONBRK    EQU    00H        ; no break
  55. MOSBRK    EQU    60H        ; send break
  56.  
  57. ;  modem status    bits
  58.  
  59. MODSRB    EQU    00H        ; data set ready bit (nonexistent)
  60. MORCVB    EQU    01H        ; modem    recieve    bit
  61. MOSNDB    EQU    02H        ; modem    send bit
  62. MODCDB    EQU    04H        ; data-carrier-detect bit
  63. MOCTSB    EQU    08H        ; clear-to-send    bit
  64. MOFERB    EQU    10H        ; framing error    bit
  65. MOOVRB    EQU    20H        ; data overrun error bit
  66. MOPERB    EQU    40H        ; parity error bit
  67. MOSTSB    EQU    07FH        ; main status 
  68. MOSTSI    EQU    MORCVB OR MOSNDB ; inversion
  69.  
  70. ;MEX SUBROUTINE CALL VECTORS
  71.  
  72. MEX    EQU    0D00H        ;address of the service processor
  73. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  74. TIMER    EQU    254        ;delay 100ms * reg B
  75. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  76. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  77. SNDRDY    EQU    251        ;test for modem-send ready
  78. RCVRDY    EQU    250        ;test for modem-receive ready
  79. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  80. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  81. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  82. PARSFN    EQU    246        ;parse filename from input stream
  83. BDPARS    EQU    245        ;parse baud-rate from input stream
  84. SBLANK    EQU    244        ;scan input stream to next non-blank
  85. EVALA    EQU    243        ;evaluate numeric from input stream
  86. LKAHED    EQU    242        ;get nxt char w/o removing from input
  87. GNC    EQU    241        ;get char from input, cy=1 if none
  88. ILP    EQU    240        ;inline print
  89. DECOUT    EQU    239        ;decimal output
  90. PRBAUD    EQU    238        ;print baud rate
  91.  
  92. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  93. PRINT    EQU    9        ;simulated BDOS function 9: print string
  94. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  95.  
  96.     ORG    TPA        ;we begin
  97.  
  98.     DS    3        ;MEX has a JMP START here
  99.  
  100. ; The following variables are located at the beginning of the program
  101. ; to facilitate modification without the need of re-assembly. They will
  102. ; be moved in MEX 2.0.
  103.  
  104. PMODEM:    DB    NO        ;yes=PMMI modem \ / These 2 locations are not
  105. SMODEM:    DB    YES        ;yes=Smartmodem / \ referenced by MEX
  106. TPULSE:    DB    'T'        ;T=touch, P=pulse (not referenced by MEX)
  107. CLOCK:    DB    25        ;clock speed x .1, up to 25.5 mhz.
  108. MSPEED:    DB    1        ;sets display time for sending a file
  109.                 ;0=110    1=300  2=450  3=600  4=710
  110.                 ;5=1200 6=2400 7=4800 8=9600 9=19200
  111. BYTDLY:    DB    5        ;default time to send character in
  112.                 ;terminal mode file transfer (0-9)
  113.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  114. CRDLY:    DB    5        ;end-of-line delay after CRLF in terminal
  115.                 ;mode file transfer for slow BBS systems
  116.                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  117. COLUMS:    DB    5        ;number of directory columns
  118. SETFL:    DB    YES        ;yes=user-defined SET command
  119. SCRTST:    DB    YES        ;yes=if home cursor and clear screen
  120.                 ;routine at CLRSCRN
  121.     DB    0        ;was once ACKNAK, now spare
  122. BAKFLG:    DB    YES        ;yes=make .BAK file
  123. CRCDFL:    DB    YES        ;yes=default to CRC checking
  124.                 ;no=default to Checksum checking
  125. TOGCRC:    DB    YES        ;yes=allow toggling of Checksum to CRC
  126. CVTBS:    DB    NO        ;yes=convert backspace to rub
  127. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub
  128. ADDLF:    DB    NO        ;no=no LF after CR to send file in
  129.                 ;terminal mode (added by remote echo)
  130. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR
  131. TRNLOG:    DB    NO        ;yes=allow transmission of logon
  132.                 ;write logon sequence at location LOGON
  133. SAVCCP:    DB    YES        ;yes=do not overwrite CCP
  134. LOCNXT:    DB    NO        ;yes=local cmd if EXTCHR precedes
  135.                 ;no=not local cmd if EXTCHR precedes
  136. TOGLOC:    DB    YES        ;yes=allow toggling of LOCNXTCHR
  137. LSTTST:    DB    YES        ;yes=allow toggling of printer on/off
  138.                 ;in terminal mode. Set to no if using
  139.                 ;the printer port for the modem
  140. XOFTST:    DB    NO        ;yes=allow testing of XOFF from remote
  141.                 ;while sending a file in terminal mode
  142. XONWT:    DB    NO        ;yes=wait for XON after sending CR while
  143.                 ;transmitting a file in terminal mode    
  144. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF testing
  145. IGNCTL:    DB    YES        ;yes=do not send control characters
  146.                 ;above CTL-M to CRT in terminal mode
  147.                 ;no=send any incoming CTL-char to CRT
  148. EXTRA1:    DB    0        ;for future expansion
  149. EXTRA2:    DB    0        ;for future expansion
  150. BRKCHR:    DB    '@'-40H        ;^@ = Send a 300 ms. break tone
  151. NOCONN:    DB    'N'-40H        ;^N = Disconnect from phone line
  152. LOGCHR:    DB    'L'-40H        ;^L = Send logon
  153. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer
  154. UNSVCH:    DB    'R'-40H        ;^R = Close input text buffer
  155. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote
  156. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer
  157. EXTCHR:    DB    '^'-40H        ;^^ = Send next character
  158.  
  159. ; Equates used only by 6850 routines grouped together here.
  160.  
  161. CTLSTS:    DB    MOCTLI        ;CURRENT UART STATUS WORD
  162.     DB    0        ;not used
  163.  
  164. ; Low-level modem I/O routines: (you can insert jumps here to longer
  165. ; routines if you'd like ... 
  166.  
  167. INCTL1:    IN    SPORT        ;in modem control port
  168.     RET
  169.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  170.  
  171. OTDATA:    OUT    DPORT         ;out modem data port
  172.     RET
  173.     DB    0,0,0,0,0,0,0    ;spares if needed for non=PMMI
  174.  
  175. INPORT:    IN    DPORT         ;in modem data port
  176.     RET
  177.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  178.  
  179. ; Bit-test routines.  
  180.  
  181. MASKR:    ANI MORCVB ! RET    ;bit to test for receive ready
  182. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready
  183. MASKS:    ANI MOSNDB ! RET    ;bit to test for send ready
  184. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready
  185.  
  186. ; Unused area: used only to retain compatibility with MDM overlays.
  187. ; You may use this area for any miscellaneous storage you'd
  188. ; like but the length of the area *must* be 12 bytes.
  189.  
  190.     DS    12
  191.  
  192. ; Special modem function jump table: if your overlay cannot handle
  193. ; some of these, change the jump to "DS 3", so the code present in
  194. ; MEX will be retained.  
  195.  
  196. LOGON:    DS    2        ;needed for MDM compat, not ref'd by MEX
  197.  
  198. DIALV:    DS    3        ;dial digit in A (see info at PDIAL)
  199. DISCV:    DS     3        ;disconnect the modem
  200. GOODBV:    DS    3        ;called before exit to CP/M
  201. INMODV:    JMP    MDINIT        ;initialization. Called at cold-start
  202. NEWBDV:    JMP    NEWBAUD        ;set baud rate
  203. NOPARV:    DS     3        ;set modem for no-parity
  204. PARITV:    DS    3        ;set modem parity
  205. SETUPV:    JMP    SETCMD        ;SET cmd: jump to a RET if you don't write SET
  206. SPMENV:    DS    3        ;not used with MEX
  207. VERSNV:    JMP    SYSVER        ;Overlay's voice in the sign-on message
  208. BREAKV:    DS    3        ;send a break
  209.  
  210. ; The following jump vector provides the overlay with access to special
  211. ; routines in the main program (retained and supported in the main pro-
  212. ; gram for MDM overlay compatibility). These should not be modified by
  213. ; the overlay.
  214.  
  215. ; Note that for MEX 2.0 compatibility, you should not try to use these
  216. ; routines, since this table will go away with MEX 2.0 (use the MEX
  217. ; service call processor instead).
  218.  
  219. ILPRTV:    DS    3        ;replace with MEX function 9
  220. INBUFV:    DS    3        ;replace with MEX function 10
  221. ILCMPV:    DS    3        ;replace with table lookup funct. 247
  222. INMDMV:    DS    3        ;replace with MEX function 255
  223. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  224. TIMERV:    DS    3        ;replace with MEX function 254
  225.  
  226. ; Clear/screen and clear/end-of-screen. Each routine must use the
  227. ; full 9 bytes alloted (may be padded with nulls).
  228.  
  229. CLREOS:
  230.     MVI    C,ILP
  231.     CALL    MEX
  232.     DB    'L'-40H,0
  233.     RET
  234.     NOP
  235.  
  236. CLS:
  237.     MVI    C,ILP
  238.     CALL    MEX
  239.     DB    'L'-40H,0
  240.     RET
  241.  
  242. SYSVER:    MVI    C,ILP
  243.     CALL    MEX
  244.     DB    'INFORMER IV VERSION W/SM'
  245.     DB    CR,LF,0
  246.  
  247. ;    *** END OF FIXED FORMAT AREA ***
  248.  
  249.  
  250. MDINIT: RET
  251.  
  252. NEWBAUD:
  253.     CPI    1
  254.     JZ    SET300
  255.     CPI    5
  256.     JZ    SET1200
  257.     RET
  258.  
  259. ;SET BAUD RATE 300 OR 1200 NO OTHERS SUPPORTED
  260.  
  261. ;   set    1200 baud
  262.  
  263. SET1200    LDA    CTLSTS        ; get present control register value
  264.     ANI    NOT MOBDM    ; clear    away baud bits
  265.     ORI    MOBD12        ; add 1200 baud    setting
  266.     STA    CTLSTS        ; save last control register
  267.     OUT    SPORT        ;SEND IT
  268.     MVI    A,5        ;RESET MSPEED 
  269.     JMP    SETBEND
  270.  
  271. ;  set 300 baud
  272.  
  273. SET300    LDA    CTLSTS        ; get present control register value
  274.     ANI    NOT MOBDM    ; clear    away baud bits
  275.     ORI    MOBD30        ; add 300 baud setting
  276.     STA    CTLSTS        ; save last control register
  277.     OUT    SPORT        ;SEND IT
  278.     MVI    A,1
  279. SETBEND:
  280.     STA    MSPEED        ;RESET MSPEED INDICATOR
  281.  
  282.     IF SMODEM
  283.     LXI    H,ATMSG        ;LET SMARTMODEM KNOW
  284.     CALL    SMSEND
  285.     MVI     B,20           ;TWO second delay needed by Smartmodem
  286.     MVI    C,TIMER        ;SET TIMER
  287.     CALL    MEX        ;WAIT
  288.     ENDIF        ;SMARTMODEM
  289.  
  290.     RET
  291.  
  292.     IF SMODEM
  293. ATMSG    DB    'AT',CR,0
  294.     ENDIF        ;SMODEM
  295.  
  296. ;THIS IS AN EXAMPLE OF THE POWER AVAILABLE USING SET
  297. ; THIS EXAMPLE: SET (GIVES  CURRENT BAUD RATE) SET 300 OR 
  298. ;    SET 1200 SETS BAUD RATE TO 300 OR 1200
  299. ;    SET INIT INITIALIZES THE SMARTMODEM (TO RESET THE BYE SET)
  300.  
  301. SETCMD:
  302.     MVI    C,SBLANK    ;ANY ARGUMENTS?
  303.     CALL    MEX
  304.     JC    TELL        ;NO DISPLAY BAUD RATE
  305.     LXI    D,CMDTBL
  306.     MVI    C,LOOKUP
  307.     CALL    MEX        ;FIND COMMAND
  308.     PUSH    H
  309.     RNC            ;GOTO COMMAND
  310.     POP    H        ;NO SUCH COMMAND
  311.     MVI    C,ILP        ;AVAILABLE
  312.     CALL    MEX        ;INFORM USER OF SAME
  313.     DB    CR,LF,'NO COMMAND AVAILABLE',CR,LF,0
  314.     RET
  315.  
  316. CMDTBL:
  317.     DB    '30','0'+80H
  318.     DW    SET300
  319.     DB    '120','0'+80H
  320.     DW    SET1200
  321.  
  322.     IF   SMODEM
  323.     DB    'INI','T'+80H
  324.     DW    SMINIT
  325.     ENDIF
  326.  
  327.     DB    0
  328.  
  329. TELL:
  330.     MVI    C,ILP
  331.     CALL     MEX        ;DISPLAY BAUD RATE
  332.     DB    CR,LF,'BAUD RATE CURRENTLY IS:  ',0
  333.     LDA    MSPEED
  334.     MVI    C,PRBAUD
  335.     CALL    MEX
  336.     RET    
  337.  
  338.     IF SMODEM
  339. SMINIT:
  340.     MVI    A,MOBDM        ;Reset 6850 
  341.     OUT    SPORT
  342.     MVI    A,MOCTLI    ;RESET TO 300 BAUD DTR ON
  343.     OUT    SPORT
  344.     STA    CTLSTS        ; save last control register
  345.     MVI    A,5        ;TELL MSPEED ABOUT IT
  346.     STA    MSPEED
  347.     LXI    H,RSTMSG    ; RESET MESSAGE 
  348.     CALL    SMSEND        ;No Delay - RESET
  349.     MVI     B,20           ;TWO second delay needed by Smartmodem
  350.     MVI    C,TIMER        ;SET TIMER
  351.     CALL    MEX        ;WAIT
  352.     LXI    H,MINIT        ;INITIALIZATION MESSAGE
  353.     CALL    SMSEND        ;Set Smartmodem for next call
  354.     JMP    TELL        ;Return
  355.  
  356. ; SMARTMODEM UTILITY ROUTINE: SEND STRING TO MODEM
  357.  
  358. SMSEND:    MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  359.     CALL    MEX
  360.     JNZ    SMSEND
  361.     MOV    A,M        ;FETCH NEXT CHARACTER
  362.     INX    H
  363.     ORA    A        ;END?
  364.     RZ            ;DONE IF SO
  365.     MOV    B,A        ;NO, POSITION FOR SENDING
  366.     MVI    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  367.     CALL    MEX
  368.     JMP    SMSEND
  369.  
  370. ; DATA AREA
  371. RSTMSG:    DB    'AT Z',CR,0    ;Do smartmodem default reset
  372. MINIT:    DB    'AT Q0 E1 M1 X1 S7=30',CR,0
  373.     ENDIF
  374.  
  375.     END
  376.