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

  1.     TITLE    'MEXPLUS overlay for PMC Micromate 101, Version 1.1'
  2.  
  3. ; MXH-MI10.ASM - MEXPLUS OVERLAY FOR PMC MICROMATE 101
  4. ;   Version 1.1  January 04/87
  5. ;    (Delete above TITLE if not assembling with MAC)
  6.  
  7. VER:    EQU    11        ; Version number
  8.  
  9.  
  10. ; History:
  11.  
  12. ; 87/01/04 Fixed bug in NEWBD routine.  This routine destroyed HL, which
  13. ;          some modem overlays (like MXM-2416.ASM) required be preserved.
  14. ;          Also deleted some superfluous code.
  15. ;                               Ian Cottrell
  16.  
  17. ; 85/12/28 Created from MXO-MI13.ASM
  18. ;                Ian Cottrell,
  19. ;                Dept Energy, Mines and Resources,
  20. ;                Ottawa, Canada
  21.  
  22. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  23. ;    /////////////////////////////////////////
  24. ;    /                    /
  25. ;    /    - - W A R N I N G - -        /
  26. ;    /                    /
  27. ;    /    This code uses CP/M 3 dependent    /
  28. ;    /    stuff.                /
  29. ;    /                    /
  30. ;    /////////////////////////////////////////
  31.  
  32. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  33. ;
  34. ; Use the MEX "SET" command to change the baud rate when desired.  Use
  35. ; "SET" to see the current baud rate and "SET xxxx" to set to xxxx.  It
  36. ; starts out at the value specified for the MSPEED equate.  To change
  37. ; the default baud rate, use "SET" to set the desired rate, then "CLONE"
  38. ; MEX.
  39. ;
  40. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  41.  
  42.  
  43. BELL:    EQU    07H        ; Bell
  44. CR:    EQU    0DH        ; Carriage return
  45. ESC:    EQU    1BH        ; Escape
  46. LF:    EQU    0AH        ; Linefeed
  47.  
  48. BDOS:    EQU    05H        ; BDOS entry point
  49.  
  50. YES:    EQU    0FFH
  51. NO:    EQU    0
  52.  
  53. RVIDEO:    EQU    YES        ; Yes if terminal supports reverse video
  54.                 ; Be sure to set RON and ROFF to correct
  55.                 ; values
  56.  
  57. ; PMC Micromate Model 101 dependant stuff
  58.  
  59. PORT:    EQU    89H        ; PMC serial modem port
  60. DPORT:    EQU    PORT        ; Modem data port
  61. CPORT:    EQU    PORT+2        ; Modem control port
  62. SPORT:    EQU    PORT+2        ; Modem status port
  63. DAV:    EQU    01H        ; Data available
  64. TBMT:    EQU    04H        ; Tranmit buffer empty
  65. DCD:    EQU    08H        ; check for data carrier detect
  66. RI:    EQU    10H        ; check for ring indicator
  67.  
  68. ; Terminal definitions (currently set for Qume QVT-103)
  69. ; If your terminal uses less characters for these functions, set the
  70. ; extra ones to space (20H), starting from the 1st character.
  71.  
  72. ATT1:    EQU    20H        ; 1st character of reverse video sequence
  73. ATT2:    EQU    0EH        ; 2nd character of reverse video sequence
  74. RON:    EQU    'D'        ; 3rd character (rev vid on)
  75. ROFF:    EQU    'E'        ; 3rd character (rev vid off)
  76.  
  77. CLR1:    EQU    20H        ; 1st character of clear screen functions
  78. CLR:    EQU    18H        ; 2nd character (clear screen)
  79. CLEOS:    EQU    17H        ; 2nd character (clear end of screen)
  80.  
  81. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  82. ; MEX Service Processor
  83.  
  84. MEX    EQU    0D00H        ; Address of the service processor
  85. INMDM    EQU    255        ; Get char from port to A, CY=no more in 100 ms
  86. TIMER    EQU    254        ; Delay 100ms * reg B
  87. TMDINP    EQU    253        ; B=# secs to wait for char, cy=no char
  88. CHEKCC    EQU    252        ; Check for ^C from KBD, Z=present
  89. SNDRDY    EQU    251        ; Test for modem-send ready
  90. RCVRDY    EQU    250        ; Test for modem-receive ready
  91. SNDCHR    EQU    249        ; Send a character to the modem (after sndrdy)
  92. RCVCHR    EQU    248        ; Recv a char from modem (after rcvrdy)
  93. LOOKUP    EQU    247        ; Table search: see CMDTBL comments for info
  94. PARSFN    EQU    246        ; Parse filename from input stream
  95. BDPARS    EQU    245        ; Parse baud-rate from input stream
  96. SBLANK    EQU    244        ; Scan input stream to next non-blank
  97. EVALA    EQU    243        ; Evaluate numeric from input stream
  98. LKAHED    EQU    242        ; Get nxt char w/o removing from input
  99. GNC    EQU    241        ; Get char from input, cy=1 if none
  100. ILP    EQU    240        ; Inline print
  101. DECOUT    EQU    239        ; Decimal output
  102. PRBAUD    EQU    238        ; Print baud rate
  103.  
  104. CONOUT    EQU    2        ; Simulated BDOS function 2: console char out
  105. PRINT    EQU    9        ; Simulated BDOS function 9: print string
  106. INBUF    EQU    10        ; Input buffer, same structure as BDOS 10
  107.  
  108.     ORG    100H
  109.  
  110.     DB    0C3H        ; Show that we're an 8080/Z-80 overlay
  111.     DS    2        ; rest of the jump instruction
  112.  
  113.     DS    2        ; unused by MEX
  114.  
  115.     DB    'P'        ; T=touch, P=pulse (Smartmodem-only)     105H
  116. CLOCK:    DB    40        ; Clock speed in MHz x10, 25.5 MHz max.  106H
  117.                 ;    20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  118. MSPEED:    DB    5        ; 0=110 1=300 2=450 3=600 4=710 5=1200     107H
  119.                 ;    6=2400 7=4800 8=9600 9=19200 default
  120. BYTDLY:    DB    2        ; 0=0 delay  1=10ms  5=50 ms - 9=90 ms     108H
  121.                 ;    Default time to send char in terminal
  122.                 ;    mode file transfer for slow BBS.
  123. CRDLY:    DB    4        ; 0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  124.                 ;    Default time for extra wait after CRLF
  125.                 ;    in terminal mode file transfer
  126. COLUMS:    DB    5        ; Number of DIR columns shown         10AH
  127. SETFLG: DB    YES        ; Yes=user-added Setup routine         10BH
  128. SCRTST: DB    YES        ; Cursor control routine         10CH
  129.     DS    1        ; unused by MEX
  130. BAKFLG: DB    NO        ; Yes=change any file same name to .BAK  10EH
  131. CRCDFL:    DB    YES        ; Yes=default to CRC checking         10FH
  132. TOGCRC: DB    YES        ; Yes=allow toggling of CRC to Checksum  110H
  133. CVTBS:     DB    NO        ; Yes=convert backspace to rub         111H
  134. TOGLBK: DB    YES        ; Yes=allow toggling of bksp to rub     112H
  135. ADDLF:    DB    NO        ; No=no LF after CR to send file in     113H
  136.                 ;    terminal mode (added by remote echo)
  137. TOGLF:     DB    YES        ; Yes=allow toggling of LF after CR     114H
  138.     DB    YES        ; Yes=allow transmission of logon     115H
  139.                 ;    write logon sequence at location LOGON
  140. SAVCCP:    DB    YES        ; Yes=do not overwrite CCP         116H
  141.     DB    NO        ; Yes=local command if EXTCHR precedes     117H
  142.                 ; No=external command if EXTCHR precedes
  143.     DB    YES        ; Yes=allow toggling of LOCONEXTCHR     118H
  144. LSTST:    DB    NO        ; Yes=printer available on printer port  119H
  145. XOFTST:    DB    YES        ; Yes=checks for XOFF from remote while  11AH 
  146.                 ;    sending a file in terminal mode
  147. XONWT:    DB    NO        ; Yes=wait for XON after CR while     11BH
  148.                 ;    sending a file in terminal mode
  149. TOGF    DB    YES        ; Yes=allow toggling of XOFF checking     11CH
  150. IGNCTL:    DB    YES        ; Yes=CTL-chars above ^M not displayed     11DH 
  151. EXTRA1:    DB    0        ; For future expansion             11EH
  152. EXITCHR:DB    'E'        ; E = Exit to main menu              11FH
  153. BRKCHR:    DB    '@'        ; @ = Send 300 ms. break tone         120H
  154. NOCONN: DB    'D'        ; D = Disconnect from the phone line     121H
  155. LOGCHR:    DB    'L'        ; L = Send logon             122H
  156. LSTCHR:    DB    'P'        ; P = Toggle printer             123H
  157. UNSAVE:    DB    'U'        ; U = Close input text buffer         124H
  158. TRANCHR:DB    'T'        ; T = Transmit file to remote         125H
  159. SAVECHR:DB    'S'        ; S = Open input text buffer         126H
  160. EXTCHR:    DB    '^'        ; ^ = Send next character         127H
  161.  
  162.     DS    2        ;                      128H
  163.  
  164. INCTL1: XRA    A        ; Output 00H to command port         12AH 
  165.     OUT    CPORT        ;                      12BH 
  166.     MVI    A,10H        ; Output 10H to command port         12DH
  167.     OUT    CPORT        ;                      12FH 
  168.     IN    SPORT        ; Get status bits.             131H
  169.     RET            ;                      133H
  170. ;
  171. OTDATA: OUT     DPORT        ; Out modem data port             134H
  172.     RET
  173.  
  174.     DS    7        ;                      137H
  175.  
  176. INPORT: IN    DPORT        ; In modem data port             13EH
  177.     RET
  178.  
  179.     DS    7        ;                       141H
  180.  
  181. MASKR:     ANI DAV            ; Bit to test for receive ready      148H
  182.     RET
  183.  
  184. TESTR:     CPI DAV            ; Value of rcv. bit when ready         14BH
  185.     RET
  186.  
  187. MASKS:     ANI TBMT        ; Bit to test for send ready         14EH
  188.     RET
  189.  
  190. TESTS:     CPI TBMT        ; Value of send bit when ready         151H
  191.     RET
  192.  
  193. DCDTST:    JMP    DCDVEC        ; Data carrier detect             154H
  194. RNGDET:    JMP    RNGVEC        ; ring detect                 157H
  195.  
  196.     DB    0,0,0,0,0    ; reserved space, assumed 0
  197.  
  198. SMDISC:    DS    3        ; smartmodem disconnect (not here)
  199. DIALV:    DS    3        ; DIALV:  not done here (maybe MXO-SM)
  200.  
  201. DISCV:  JMP     DISCON        ; Disconnect modem             165H
  202. GOODBV: JMP     GOODBY        ; Reset port                 168H
  203. INMODV: JMP     NITMOD        ; Initialize port             16BH
  204. NEWBDV: JMP     NEWBD        ; Set new baud rate             16EH
  205.  
  206.     RET            ; NOPARV                 171H
  207.     NOP
  208.     NOP
  209.  
  210.     RET            ; PARITV                 174H
  211.     NOP
  212.     NOP
  213.  
  214. SETUPV: JMP    SETCMD        ;                      177H
  215.  
  216.     DS    3        ; Not used by MEX             17AH
  217.  
  218. VERSNV: JMP    SYSVER        ;                      17DH
  219. BREAKV: JMP    SBREAK        ;                      180H
  220.  
  221. ; Do not change the following line
  222.  
  223.     DS    18
  224.  
  225. ; Routine to clear to end of screen.  If using CLREOS and CLRSCRN, set
  226. ; SCRNTEST to YES at 010AH (above).
  227.  
  228. CLREOS:    LXI    D,EOSMSG    ;                     195H
  229.     MVI    C,PRINT
  230.     CALL    MEX
  231.     RET
  232.  
  233. CLS:    LXI    D,CLSMSG    ;                     19EH
  234.     MVI    C,PRINT
  235.     CALL    MEX
  236.     RET
  237.  
  238. ; End of fixed area ... from here to 1FFH is reserved
  239.  
  240.     ORG    200H        ; new boundary for MEXPLUS
  241.  
  242. SYSVER:    MVI    C,ILP
  243.     CALL    MEX
  244.     DB    'MEXPLUS version '
  245.     DB    VER/10+'0'
  246.     DB    '.'
  247.     DB    VER MOD    10+'0'
  248.     DB    ' for PMC Micromate Model 101 - '
  249.     DB    CR,LF
  250.     DB    'Default Baud Rate: '
  251.  
  252.      IF    RVIDEO
  253.     DB    ATT1,ATT2,RON
  254.      ENDIF
  255.     DB    0
  256.     LDA    MSPEED
  257.     MVI    C,PRBAUD
  258.     CALL    MEX
  259.  
  260.      IF    RVIDEO
  261.     MVI    C,ILP
  262.     CALL    MEX
  263.     DB    ATT1,ATT2,ROFF,0
  264.      ENDIF
  265.     RET
  266.  
  267. ; Routine called just prior to exit to CP/M
  268.  
  269. GOODBY:    RET
  270.  
  271. ; Return data carrier detect (DCD) status
  272. ;        0   = no carrier
  273. ;        255 = carrier present
  274. ;        254 = we don't know (DCD not supported)
  275.  
  276. DCDVEC:    MVI    A,254        ; Return 'we don't know'
  277. ;    CALL    INCTL1        ; Get status
  278. ;    ANI    DCD        ; Test for DCD
  279. ;    MVI    A,255        ; Assume it's there
  280. ;    RNZ            ; It was!
  281. ;    XRA    A        ; No it wasn't
  282.     RET
  283.  
  284. ; Return ring indicator status
  285. ;        0   = not ringing
  286. ;        255 = ring detected
  287. ;        254 = we don't know (RI not supported)
  288.  
  289. RNGVEC:    MVI    A,254        ; Return 'we don't know'
  290.     RET
  291.  
  292. ; Routine to send a 300 ms break tone to reset some time-sharing
  293. ; computers.
  294.  
  295. SBREAK:    MVI    A,5        ; Select register 5
  296.     OUT    CPORT
  297.     MVI    A,0F8H        ; Send break
  298. SBRK1:    OUT    CPORT
  299.     MVI    B,3        ; Delay 300 ms
  300.     MVI    C,TIMER
  301.     CALL    MEX
  302.     MVI    A,5        ; Register 5 again
  303.     OUT    CPORT
  304.     MVI    A,0E8H        ; Reset to normal (8 bits, DTR on, etc.)
  305.     OUT    CPORT
  306.     RET
  307.  
  308. ; Routine to set DTR low for 300 ms to hang-up modem
  309.  
  310. DISCON:    MVI    A,5        ; Select register 5
  311.     OUT    CPORT
  312.     MVI    A,068H        ; Drop DTR (and send break)
  313.     JMP    SBRK1        ; Save a litte code here
  314.  
  315.  
  316. ; You can use this area for any special initialization or setup you may
  317. ; wish to include.  Each must end with a RET. You can check the other
  318. ; available overlays for ideas how to write your own routines if that
  319. ; may be of some help.
  320.  
  321. NITMOD:    LDA    MSPEED        ; Get MSPEED value
  322.         PUSH    H               ; Save HL (needed by some modem overlays)
  323.     LXI    H,BRTBL        ; Calculate required value
  324.     MVI    D,0        ;   to send to baud
  325.     MOV    E,A        ;      rate register
  326.     DAD    D
  327.     MOV    A,M        ; Reg A now contains correct value
  328.     ORA    A        ; Was value zero?
  329.     JNZ    NITMOD1        ; If not zero, continue
  330.     LDA    BD1200        ; Else, default to 1200 baud
  331. NITMOD1:PUSH    PSW        ; Save baud rate value
  332.     MVI    C,32H        ; Function: direct bios call.
  333.     LXI    D,BIOSPB    ; BIOS parameter block
  334.     CALL    BDOS
  335.     LXI    D,8+7        ; Index to BAUD rate in 2nd
  336.     DAD    D        ; Entry. (i.e. MODEM)
  337.     POP    D        ; Get new code back (in D)
  338.     MOV    A,M        ; Best not to change high
  339.     ANI    0F0H        ;    nibble, whatever it is.
  340.     ORA    D        ; Put new code in table.
  341.     MOV    M,A
  342.     MVI    C,32H        ; Function: direct bios call.
  343.     LXI    D,BIOSPB1    ; Initialize device means to
  344.     CALL    BDOS        ; Set BAUD rate to PMC.
  345.     IN    DPORT        ; Clear any incoming chars
  346.     IN    DPORT        ; Try once more
  347.     XRA    A        ; Clear the 'A' reg
  348.         POP    H        ; Now restore HL
  349.     RET
  350.  
  351. ;Allow baud rate change w SET cmd
  352.  
  353. SETCMD:    MVI    C,SBLANK    ; Any arguments
  354.     CALL    MEX
  355.     JC    TELL        ; If not, go display baud
  356.     LXI    D,CMDTBL
  357.     MVI    C,LOOKUP
  358.     CALL    MEX        ; Parse argument
  359.     PUSH    H        ; Save any arg addrs on stack
  360.     RNC            ; If we have one, return to it
  361.     POP    H        ; Oops, input not found in table
  362.     MVI    C,ILP
  363.     CALL    MEX        ; Tell user input not valid
  364.     DB    '++ Incorrect Entry ++',CR,LF,BELL,0
  365.     RET
  366.  
  367. CMDTBL:    DB    '30','0'+80H
  368.     DW    OK300
  369.     DB    '60','0'+80H
  370.     DW    OK600
  371.     DB    '120','0'+80H
  372.     DW    OK1200
  373.     DB    '240','0'+80H
  374.     DW    OK2400
  375.     DB    '480','0'+80H
  376.     DW    OK4800
  377.     DB    '960','0'+80H
  378.     DW    OK9600
  379.     DB    '1920','0'+80H
  380.     DW    OK1920
  381.     DB    0        ; End of table
  382.  
  383. TELL:    MVI    C,ILP
  384.     CALL    MEX        ; Print current baud rate
  385.     DB    CR,LF,'Baud rate is now: '
  386.  
  387.      IF    RVIDEO
  388.     DB    ATT1,ATT2,RON
  389.      ENDIF
  390.  
  391.     DB    0
  392.     LDA    MSPEED
  393.     MVI    C,PRBAUD
  394.     CALL    MEX
  395.  
  396.      IF    RVIDEO
  397.     MVI    C,ILP
  398.     CALL    MEX
  399.     DB    ATT1,ATT2,ROFF,0
  400.      ENDIF
  401.  
  402.     RET
  403.  
  404. OK300:    MVI    A,1        ; MSPEED 300 baud value
  405.     JMP    BDSET        ; Go do it
  406.  
  407. OK600:    MVI    A,3
  408.     JMP    BDSET
  409.  
  410. OK1200:    MVI    A,5
  411.     JMP    BDSET
  412.  
  413. OK2400:    MVI    A,6
  414.     JMP    BDSET
  415.  
  416. OK4800:    MVI    A,7
  417.     JMP    BDSET
  418.  
  419. OK9600:    MVI    A,8
  420.     JMP    BDSET
  421.  
  422. OK1920:    MVI    A,9
  423.  
  424. BDSET:    STA    MSPEED        ; Update MSPEED
  425.     JMP    NITMOD
  426.  
  427. BAUDMCH:PUSH    PSW        ; Save MSPEED value
  428.     PUSH    H        ; Save baud code
  429.     MVI    C,32H        ; Function: direct bios call.
  430.     LXI    D,BIOSPB    ; BIOS parameter block
  431.     CALL    5
  432.     LXI    D,8+7        ; Index to BAUD rate in 2nd
  433.     DAD    D        ; Entry. (i.e. MODEM)
  434.     POP    D        ; Get new code back.
  435.     MOV    A,M        ; Best not to change high
  436.     ANI    0F0H        ; Nibble, whatever it is.
  437.     ORA    E        ; Put new code in table.
  438.     MOV    M,A
  439.  
  440.     MVI    C,32H        ; Function: direct bios call.
  441.     LXI    D,BIOSPB1    ; Initialize device means to
  442.     CALL    5        ; Set BAUD rate to PMC.
  443.     POP    PSW        ; Restore MSPEED value
  444.     STA    MSPEED        ; Set it
  445.     RET
  446.  
  447. NEWBD:    CPI    1
  448.     JZ    BDSET
  449.     CPI    3
  450.     JZ    BDSET
  451.     CPI    5
  452.     JZ    BDSET
  453.     CPI    6
  454.     JZ    BDSET
  455.     CPI    7
  456.     JZ    BDSET
  457.     CPI    8
  458.     JZ    BDSET
  459.     CPI    9
  460.     JZ    BDSET
  461.     RET
  462.  
  463. ; Table of Baud Rate Parameters
  464.  
  465. BRTBL:    EQU    $
  466.  
  467. BD110:    DB    00H        ; 110 baud not supported
  468. BD300:    DB    06H
  469. BD450:    DB    00H        ; 450 baud not supported
  470. BD600:    DB    07H
  471. BD710:    DB    00H        ; 710 baud not supported
  472. BD1200:    DB    08H
  473. BD2400:    DB    0AH
  474. BD4800:    DB    0CH
  475. BD9600:    DB    0EH
  476. BD1920:    DB    0FH
  477.  
  478. BIOSPB    DB    20        ; BIOS fcn: return devtbl address
  479.     DB    0        ; A-reg contents
  480.     DW    0        ; BC-reg contents
  481.     DW    0        ; DE-reg contents
  482.     DW    0        ; HL-reg contents
  483.  
  484. BIOSPB1    DB    21        ; BIOS fcn: initialize device in C-reg
  485.     DB    0        ; A-reg contents
  486.     DB    1        ; C-reg (= 1 for MODEM)
  487.     DB    0        ; B-reg
  488.     DW    0        ; DE-reg
  489.     DW    0        ; HL-reg
  490.  
  491.  
  492. BAUDBUF:DB    10,0
  493.     DS    10
  494.  
  495. EOSMSG:    DB    CLR1,CLEOS,0,0,0,'$'    ; Clear to end of screen
  496. CLSMSG:    DB    CLR1,CLR,0,0,0,'$'    ; Clear screen
  497.  
  498.     END
  499.