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

  1. ; MXH-CPM3.ASM  --  MEXP hardware overlay for CP/M Plus.
  2. ;
  3. ; This MEXP overlay includes SET and ABAUD routines (for
  4. ; setting and ; automatically changing baud rates) which
  5. ; use  generic  CP/M+  BDOS  calls. The SET command also
  6. ; allows one to switch between any two CP/M+ i/o devices
  7. ; (called modem and xmodem here).  As  such, the overlay
  8. ; can be configured for any CP/M+ system  in  which  the
  9. ; character i/o device table has been implemented simply
  10. ; by  including  the hardware dependent modem and xmodem
  11. ; port specifications  in  the tables MODTBL and XMODTBL
  12. ; at the end of the overlay.
  13. ;
  14. ; MXH-CPM3.ASM  was  derived  from  the  general purpose
  15. ; overlay  file  M7GP-1.ASM  with  baudrate  code   from
  16. ; M7C3-1.ASM by R. Saeks - 5/7/85.
  17. ;
  18. VERSION:    EQU    00H        ;Version number
  19. ;
  20. BELL:        EQU    07H        ;bell
  21. CR:        EQU    0DH        ;carriage return
  22. ESC:        EQU    1BH        ;escape
  23. LF:        EQU    0AH        ;linefeed
  24. YES:        EQU    0FFH
  25. NO:        EQU    0
  26. BDOS:        EQU    5
  27. DUMMY:        EQU    0        ;dummy byte to be filled in
  28.                     ;by SETPORT with correct data
  29. ;
  30. MODFIRST:    EQU    YES        ;yes if modem port at logon
  31. XMODFIRST:    EQU    NO        ;yes if xmodem port at logon
  32. ;
  33. ; The following JUMP instruction is necessary for MEXPLUS
  34. ; loadable overlays.
  35. ;
  36.         ORG    100H
  37.         DB    0C3H        ; JMP instruction for MEX 1.2
  38.         DS    2    ;(for  "JMP   START" instruction)
  39. ;
  40. ; The following DB statements define the initial MEX parameters.
  41. ;
  42. PMMIMODEM:    DB    NO    ;yes=PMMI S-100 Modem            103H
  43. SMARTMODEM:    DB    YES    ;yes=HAYES Smartmodem, no=non-PMMI    104H
  44. TOUCHPULSE:    DB    'T'    ;T=touch, P=pulse (Smartmodem-only)    105H
  45. CLOCK:        DB    40    ;clock speed in MHz x10, 25.5 MHz max.    106H
  46.                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  47. MSPEED:        DB    5    ;0=110 1=300 2=450 3=600 4=710 5=1200    107H
  48.                 ;6=2400 7=4800 8=9600 9=19200 default
  49. BYTDLY:        DB    5    ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108H
  50.                 ;default time to send character in ter-
  51.                 ;minal mode file transfer for slow BBS.
  52. CRDLY:        DB    5    ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  53.                 ;default time for extra wait after CRLF
  54.                 ;in terminal mode file transfer
  55. NOOFCOL:    DB    5    ;number of DIR columns shown        10AH
  56. SETUPTST:    DB    YES    ;yes=user-added Setup routine        10BH
  57. SCRNTEST:    DB    YES    ;Cursor control routine         10CH
  58. ACKNAK:        DB    YES    ;yes=resend a record after any non-ACK    10DH
  59.                 ;no=resend a record after a valid-NAK
  60. BAKUPBYTE:    DB    YES    ;yes=change any file same name to .BAK    10EH
  61. CRCDFLT:    DB    YES    ;yes=default to CRC checking        10FH
  62. TOGGLECRC:    DB    YES    ;yes=allow toggling of CRC to Checksum    110H
  63. CONVBKSP:    DB    NO    ;yes=convert backspace to rub        111H
  64. TOGGLEBK:    DB    YES    ;yes=allow toggling of bksp to rub    112H
  65. ADDLF:        DB    NO    ;no=no LF after CR to send file in    113H
  66.                 ;terminal mode (added by remote echo)
  67. TOGGLELF:    DB    YES    ;yes=allow toggling of LF after CR    114H
  68. TRANLOGON:    DB    NO    ;yes=allow transmission of logon    115H
  69.                 ;write logon sequence at location LOGON
  70. SAVCCP:        DB    NO    ;yes=do not overwrite CCP        116H
  71. LOCONEXTCHR:    DB    NO    ;yes=local command if EXTCHR precedes    117H
  72.                 ;no=external command if EXTCHR precedes
  73. TOGGLELOC:    DB    YES    ;yes=allow toggling of LOCONEXTCHR    118H
  74. LSTTST:        DB    YES    ;yes=printer available on printer port    119H
  75. XOFFTST:    DB    NO    ;yes=checks for XOFF from remote while    11AH
  76.                 ;sending a file in terminal mode
  77. XONWAIT:    DB    NO    ;yes=wait for XON after CR while    11BH
  78.                 ;sending a file in terminal mode
  79. TOGXOFF:    DB    YES    ;yes=allow toggling of XOFF checking    11CH
  80. IGNORCTL:    DB    YES    ;yes=CTL-chars above ^M not displayed    11DH
  81. EXTRA1:        DB    0    ;for future expansion            11EH
  82. EXTRA2:        DB    0    ;for future expansion            11FH
  83. BRKCHR:        DB    '@'-40H    ;^@ = Send 300 ms. break tone        120H
  84. NOCONNCT:    DB    'N'-40H    ;^N = Disconnect from the phone line    121H
  85. LOGCHR:        DB    'L'-40H    ;^L = Send logon            122H
  86. LSTCHR:        DB    'P'-40H    ;^P = Toggle printer            123H
  87. UNSAVE:        DB    'R'-40H    ;^R = Close input text buffer        124H
  88. TRANCHR:    DB    'T'-40H ;^T = Transmit file to remote        125H
  89. SAVECHR:    DB    'Y'-40H    ;^Y = Open input text buffer        126H
  90. EXTCHR:        DB    '^'-40H    ;^^ = Send next character        127H
  91. ;
  92. ;
  93.         DS    2        ;                128H
  94. ;
  95. IN$MODCTL1:    IN    08DH    ! RET    ;in modem control port        12AH
  96.         DS    7
  97. OUT$MODDATP:    OUT    08CH    ! RET    ;out modem data port        134H
  98.         DS    7
  99. IN$MODDATP:    IN    08CH    ! RET    ;in modem data port        13EH
  100.         DS    7
  101. ANI$MODRCVB:    ANI    02H    ! RET    ;bit to test for receive ready    148H
  102.  
  103. CPI$MODRCVR:    CPI    02H    ! RET    ;value of rcv. bit when ready    14BH
  104. ANI$MODSNDB:    ANI    04H    ! RET    ;bit to test for send ready    14EH
  105. CPI$MODSNDR:    CPI    04H    ! RET    ;value of send bit when ready    151H
  106. ;
  107. ;  Following are two new entry points for MEXPLUS
  108. ;  DCDTST returns data-carrier detect in A: 0 if no carrier
  109. ;  present, 0FFH if carrier is present, and 0FEH if overlay
  110. ;  doesn't know (i.e., doesn't support carrier detect)
  111. ;  RNGDET works similarly for ring-detect.
  112. ;
  113. DCDTST:    JMP    DCDVEC        ;data carrier detect            154H
  114. RNGDET:    JMP    RNGVEC        ;ring-detect                157H
  115. ;
  116. ; End of MEXPLUS added vectors
  117. ;
  118. OUT$MODCTL1:    OUT    08DH    ! RET    ;out modem control port #2    15AH
  119. OUT$MODCTL2:    OUT    08DH    ! RET    ;out modem control port #1    15DH
  120. ;
  121. LOGONPTR:    DW    LOGON        ;for user message.        160H
  122.         DS    6        ;                162H
  123. JMP$GOODBYE:    JMP    GOODBYE        ;                168H
  124. JMP$INIT:    JMP    INIT        ;go to user written routine    16BH
  125. JMP$ABAUD:    JMP    ABAUD        ;auto baud rate change        16EH
  126.         RET  !    NOP  !    NOP    ;(by-passes PMMI routine)    171H
  127.         RET  !    NOP  !    NOP    ;(by-passes PMMI routine)    174H
  128. JMP$SETUPR:    JMP    SETUPR        ;                177H
  129. JMP$SPCLMENU:    JMP    SPCLMENU    ;                17AH
  130. JMP$SYSVER:    JMP    SYSVER        ;                17DH
  131. JMP$BREAK:    JMP    SENDBRK        ;                180H
  132. ;
  133. ;
  134. ; Do not change the following six lines.
  135. ;
  136. JMP$ILPRT:    DS    3        ;                183H
  137. JMP$INBUF    DS    3        ;                186H
  138. JMP$INLNCOMP:    DS    3        ;                189H
  139. JMP$INMODEM    DS    3        ;                18CH
  140. JMP$NXTSCRN:    DS    3        ;                18FH
  141. JMP$TIMER    DS    3        ;                192H
  142. ;
  143. ;
  144. ; Routine to clear to end of screen.  If using CLREOS and CLRSCRN, set
  145. ; SCRNTEST to YES at 010AH (above).
  146. ;
  147. CLREOS:        CALL    JMP$ILPRT    ;VT-52 change for         195H
  148.         DB    ESC,'k',0,0,0    ;your terminal            198H
  149.         RET            ;                19DH
  150. ;
  151. CLRSCRN:    CALL    JMP$ILPRT    ;VT-52 change for        19EH
  152.         DB    ESC,'v',0,0,0    ;your terminal            1A1H
  153.         RET            ;                1A6H
  154.     
  155. ;
  156. SYSVER:        CALL    JMP$ILPRT    ;                1A7H
  157.         DB    'Version for CP/M Plus'
  158.         DB    CR,LF,'Hardware Overlay MXH-CPM3'
  159.                 DB      VERSION / 10 + ' ',VERSION mod 10 + ' '
  160.         DB    CR,LF,0
  161.         RET
  162. ;.....
  163. ;
  164. ;
  165. ;-----------------------------------------------------------------------
  166. ;
  167. ; NOTE:  You can change the SYSVER message to be longer or shorter
  168. ; so long as the maximum length for the overlay is not exceeded.
  169. ;
  170. ;-----------------------------------------------------------------------
  171. ;
  172. ; You can put in a message at this location which can be called up with
  173. ; CTL-O if TRANLOGON has been set TRUE.  You can use several lines if
  174. ; desired.  End with a 0.
  175. ;
  176. LOGON:        DB    'How are you today?',CR,LF,0
  177. ;.....
  178. ;
  179. ;
  180. ; Add your own routine here to send a break tone to reset some time-share
  181. ; computers, if desired.
  182. ;
  183. SENDBRK:    RET
  184. ;.....
  185. ;
  186. ;
  187. ; Add your own routine here to put DTR low and/or send a break tone.
  188. ;
  189. GOODBYE:    RET
  190. ;.....
  191. ;
  192. ;  return data carrier detect status
  193. ;      0    = no carrier
  194. ;      255  = carrier present
  195. ;      254  = we don't know (DCD not supported)
  196. ;
  197. DCDVEC:        MVI    A,0FEH        ;return 255 if carrier detect
  198.         RET
  199. ;......
  200. ;
  201. ;  return ring-detect status:
  202. ;
  203. ;     0   =  not ringing
  204. ;     255 =  ring detected
  205. ;     254 =  we don't know
  206. ;
  207. RNGVEC:        MVI    A,0FEH        ;return "we don't know"
  208.         RET
  209. ;
  210. ;
  211. ;
  212. ; You can use this area for any special initialization or setup you may
  213. ; wish to include.  Each must stop with a RET.    You can check the other
  214. ; available overlays for ideas how to write your own routines if that
  215. ; may be of some help.
  216. ;
  217. INIT:          MVI    C,12        ;routine to check if CP/M+
  218.         CALL    BDOS        ;Get version #
  219.         CPI    30H
  220.         JNC    INITPORT    ;jump if CP/M+
  221.         CALL    JMP$ILPRT    ;return error message if not CP/M+
  222.         DB    'Requires CP/M Version 3',CR,LF,0
  223.         RST    0
  224.  
  225. INITPORT:    MVI    A,3EH
  226.         OUT    9DH
  227.         MVI    A,27H
  228.         OUT    8DH
  229.         RET
  230. ;
  231. ; Routine to automatically set baud rate from data stored
  232. ; in phone directory
  233. ;
  234. ABAUD:        PUSH    H        ;don't alter anybody
  235.         PUSH    D
  236.         PUSH    B
  237.         CPI    1        ;check if 300 baud
  238.         JZ    OK300
  239.         CPI    5        ;check if 1200 baud
  240.         JZ    OK1200
  241.         CPI    6        ;check if 2400 baud
  242.         JZ    OK2400
  243.         CPI    7        ;check if 4800 baud
  244.         JZ    OK4800
  245.         CPI    8        ;check if 9600 baud
  246.         JZ    OK9600
  247.         STC            ;return error for STBAUD caller
  248.         JMP    SETEXIT        ;restore BC, DE and HL regs
  249. ;
  250. ; Routine to set baud rate from command line input
  251. ;
  252. SETUPR:        PUSH    H        ;don't alter anybody
  253.         PUSH    D
  254.         PUSH    B
  255. SETUPR1:      CALL    JMP$ILPRT    ;display SET message
  256.         DB    CR,LF,'             Input Baud Rate or Port'
  257.         DB    CR,LF,'<300, 1200, 2400, 4800, 9600,'
  258.         DB    ' (M)odem, or (X)modem>: ',0
  259.         LXI    D,SETBUF
  260.         CALL    JMP$INBUF    ;input command
  261.         LXI    D,SETBUF+2
  262.         CALL    JMP$INLNCOMP
  263.         DB    '300',0        ;check if 300 baud
  264.         JNC    OK300
  265.         CALL    JMP$INLNCOMP
  266.         DB    '1200',0    ;check if 1200 baud
  267.         JNC    OK1200
  268.         CALL    JMP$INLNCOMP
  269.         DB    '2400',0    ;check if 2400 baud
  270.         JNC    OK2400
  271.         CALL    JMP$INLNCOMP
  272.         DB    '4800',0    ;check if 4800 baud
  273.         JNC    OK4800
  274.         CALL    JMP$INLNCOMP
  275.         DB    '9600',0    ;check if 9600 baud
  276.         JNC    OK9600
  277.         CALL    JMP$INLNCOMP
  278.         DB    'M',0        ;check if Modem port
  279.         JNC    SETMOD
  280.         CALL    JMP$INLNCOMP
  281.         DB    'm',0
  282.         JNC    SETMOD
  283.         CALL    JMP$INLNCOMP
  284.         DB    'X',0        ;check if Xmodem port
  285.         JNC    SETXMOD
  286.         CALL    JMP$INLNCOMP
  287.         DB    'x',0
  288.         JNC    SETXMOD
  289.         CALL    JMP$ILPRT
  290.         DB    '              ++ Incorrect entry ++',CR,LF,BELL,0
  291.         JMP    SETUPR1        ;repeate if incorrect entry
  292.  
  293.  
  294. SETMOD:        LXI    H,MODTBL    ;load modem port equate table
  295.         CALL    SETPORT        ;set MODTBL equates in DUMMY bytes
  296.         JMP    SETEXIT        ;restore BC, DE, and HL regs
  297.  
  298. SETXMOD:    LXI    H,XMODTBL    ;load xmodem port equate table
  299.         CALL    SETPORT        ;set XMODTBL equates in DUMMY bytes
  300.         JMP    SETEXIT        ;restore BC, DE, and HL regs
  301. ;
  302. ;subroutine to insert port addresses and masks into DUMMY
  303. ;bytes in mex I/O subroutines.  Routine enters with the
  304. ;address of the port data table in reg hl.
  305. ;
  306.  
  307. SETPORT:
  308.         MOV    A,M        ;get modem control port
  309.         STA    IN$MODCTL1+1
  310.         STA    OUT$MODCTL1+1
  311.         STA    OUT$MODCTL2+1
  312.         INX    H        ;get modem data port
  313.         MOV    A,M
  314.         STA    OUT$MODDATP+1
  315.         STA    IN$MODDATP+1
  316.         INX    H        ;get carrier detact bit
  317.         MOV    A,M
  318.         STA    DCDVEC+5
  319.         INX    H        ;get receive ready bit
  320.         MOV    A,M
  321.         STA    ANI$MODRCVB+1
  322.         INX    H        ;get receive ready mask
  323.         MOV    A,M
  324.         STA    CPI$MODRCVR+1
  325.         INX    H        ;get trans ready bit
  326.         MOV    A,M
  327.         STA    ANI$MODSNDB+1
  328.         INX    H        ;get trans ready mask
  329.         MOV    A,M
  330.         STA    CPI$MODSNDR+1
  331.         INX    H        ;get CPM3 device number
  332.         MOV    A,M
  333.         STA    DEVICE
  334. ;
  335. ;routine to compute the address of baudrate parameter
  336. ;in the CPM3 char i/o device table for the specified device.
  337. ;
  338.  
  339. ADCHRTBL:    MVI    A,20        ;BIOS call to return character I/O
  340.         STA    FUNC        ;device table address
  341.         MVI    C,50        ;cp/m+ direct BIOS call
  342.         LXI    D,FUNC        ;direct BIOS call data structure
  343.         CALL    BDOS
  344.         PUSH    H        ;Save the table address
  345.         LXI    H,7        ;Offset to baudrate
  346.         LDA    DEVICE
  347.         ORA    A
  348.         JZ    ISZERO        ;jump if cp/m+ i/o device # 0
  349.         LXI    D,8
  350.  
  351. DEVLP:        DAD    D        ;add (8xDEV #) to baudrate offset
  352.         DCR    A
  353.         JNZ    DEVLP
  354.  
  355. ISZERO:        POP    D        ;Get Table address
  356.         DAD    D        ;Form baudrate address
  357.         SHLD    BAUDAD        ;save baudrate address for DEV #
  358.         RET
  359. ;
  360. ;subroutines to load mspeed and cp/m+ baudrate codes 
  361. ;
  362.                         ;baudrate  mspeed  cpm3
  363. OK300:        MVI    A,1    ;300 baud    ;           code   code
  364.         MVI    B,6            ;-----------------------
  365.         JMP    LOADBD            ;300          1     6
  366.                         ;600          3     7
  367. OK1200:        MVI    A,5    ;1200 baud    ;1200         5     8
  368.         MVI    B,8            ;2400         6    10
  369.         JMP    LOADBD            ;4800         7    12
  370.                         ;9600         8    14
  371. OK2400        MVI    A,6    ;2400 baud    ;19200        9    15
  372.         MVI    B,10
  373.         JMP    LOADBD
  374.  
  375. OK4800        MVI    A,7    ;4800 baud
  376.         MVI    B,12
  377.         JMP    LOADBD
  378.  
  379. OK9600        MVI    A,8    ;9600 baud
  380.         MVI    B,14    ;fall through to LOADBD
  381. ;
  382. ;routine to store mspeed baudrate code (reg a) in MSPEED and
  383. ;cp/m+ baudrate code (reg b) at (BAUDAD) in i/o device table
  384. ;and to reset the i/o port to the new baudrate.
  385. ;
  386.  
  387. LOADBD:        STA    MSPEED        ;store mspeed
  388.         LHLD    BAUDAD        ;set CPM3 char table
  389.         MOV    M,B
  390.         LDA    DEVICE        ;reset device
  391.         MOV    L,A        ;store cp/m+ device number
  392.         MVI    H,0        ;in "reg c" of direct BIOS
  393.         SHLD    BCREG        ;data structure
  394.         MVI    A,21        ;device init BIOS call
  395.         STA    FUNC
  396.         MVI    C,50        ;cp/m+ direct BIOS call
  397.         LXI    D,FUNC        ;direct BIOS call data structure
  398.         CALL    BDOS
  399. SETEXIT:    POP    B        ;restore BC, DE, and HL regs
  400.         POP    D
  401.         POP    H
  402.         RET
  403. ;
  404. DEVICE:        DB    DUMMY        ;storage for cp/m+ device number
  405. SETBUF:        DB    10,0
  406.         DS    2
  407.  
  408. FUNC:        DS    1        ;cp/m+ direct BIOS call
  409. AREG:        DS    1        ;data structure
  410. BCREG:        DS    2
  411. DEREG:        DS    2
  412. HLREG:        DS    2
  413. BAUDAD:        DS    2        ;storage for baudrate address
  414.                     ;in char i/o device table
  415. ;
  416. ;Equates for Modem port (set for CompuPro Interfacer 4)
  417. ;
  418. MODBASE:    EQU    08CH
  419. ;
  420. MODTBL:
  421.     DB    MODBASE+1        ;modem control/status port
  422.     DB    MODBASE            ;modem data port
  423.     DB    040H            ;mask for carrier detect bit
  424.     DB    02H            ;mask to test for receive
  425.     DB    02H            ;value when receive ready
  426.     DB    04H            ;mask to test for send
  427.     DB    04H            ;value when ready to send
  428.     DB    8            ;cp/m+ device number
  429. ;
  430. ;Equates for Xmodem port (set for Zilog DART)
  431. ;
  432. XMODBASE:        EQU    08CH
  433. ;
  434.     XMODTBL:
  435.     DB    XMODBASE+1        ;modem control/status port
  436.     DB    XMODBASE        ;modem data port
  437.     DB    040H            ;mask carrier detect bit
  438.     DB    02H            ;mask to test for receive
  439.     DB    02H            ;value when receive ready
  440.     DB    04H            ;mask to test for send
  441.     DB    04H            ;value when ready to send
  442.     DB    9            ;cp/m+ device number
  443. ;
  444. ; If using the Hayes Smartmodem this is unavailable without a special
  445. ; change.
  446. ;
  447. SPCLMENU:  RET
  448. ;
  449. ;
  450. ;.....
  451. ;
  452.       END
  453. ;
  454. tructure
  455. BCREG:        DS    2
  456. DEREG:        DS    2
  457. HLREG:        DS    2
  458. BAUDAD:        DS    2        ;storage for baudrate addr