home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / rcpm / newbd22.asm < prev    next >
Assembly Source File  |  1994-07-13  |  7KB  |  339 lines

  1. ;        NEWBAUD.ASM ver 2.2
  2. ;        (revised 08/14/82)
  3. ;    by Keith Petersen and Dave Hardy
  4. ;
  5. ;REMOTE BAUD RATE CHANGE UTILITY FOR PMMI MODEMS and external
  6. ; modems that use a WD8250 chip.
  7. ;
  8. ;Allows a remote user to change baud rate without
  9. ;having to call back.
  10. ;
  11. ;This program is compatible with CP/M 1.4, 2.x., and MP/M
  12. ;
  13. ;11/15/82 Added equates for WD8250. rlb
  14. ;
  15. ;08/14/82 Added LSPEED and MSPEED equates so versions of
  16. ;      XMODEM (5.0 and up) that examine address 03dh to
  17. ;      get the baud rate for calculating send time and
  18. ;      marking the LOG.SYS file will work properly if this
  19. ;      program is run. Set LSPEED true only if your BYE
  20. ;      program sets the baud rate at address 03dh. XMODEM
  21. ;      will now have the correct baud rate available.
  22. ;      (0=110,1=300,2=450,3=600,4=710)  Tim Cannon. 
  23. ;
  24. ;12/27/80 Added code to set new stack because some systems
  25. ;      require more stack space than available in CP/M's
  26. ;      default stack.  (KBP)
  27. ;
  28. TRUE    EQU    0FFFFH
  29. FALSE    EQU    0
  30. ;
  31. PMMI    EQU    FALSE    ;TRUE PMMI MODEM
  32. WD8250    EQU    TRUE    ;TRUE EXTERNAL MODEM USING A 8250 CHIP
  33. ;
  34.     IF    PMMI
  35. ;
  36. ;PMMI modem port equates
  37. ;
  38. ;Set TPORT to the base address of your PMMI modem
  39. ;(all other modem equates are based on this value).
  40. ;
  41. TPORT    EQU    0C0H    ;UART CONTROL/STATUS PORT
  42. DPORT    EQU    TPORT+1 ;MODEM DATA PORT
  43. RPORT    EQU    TPORT+2 ;RATE GEN/MODEM STATUS
  44. CPORT    EQU    TPORT+3 ;MODEM CONTROL
  45. ;
  46. ;The following equates are used to set up the PMMI modem
  47. ;
  48. P08BIT    EQU    0CH    ;8 DATA BITS
  49. P0NOPY    EQU    10H    ;NO PARITY
  50. P0TSB    EQU    40H    ;2 STOP BITS
  51. P0NORM    EQU    P08BIT+P0NOPY        ;USE 8 BITS, NO PARITY
  52. P0110    EQU    P08BIT+P0NOPY+P0TSB ;SAME W/2 STOP BITS
  53. ;
  54. ;Baud rate divisors
  55. ;
  56. B110    EQU    142    ;110 BAUD
  57. B300    EQU    52    ;300 BAUD
  58. B450    EQU    35    ;450 BAUD
  59. B600    EQU    26    ;600 BAUD
  60. B710    EQU    22    ;710 BAUD
  61.     ENDIF
  62. ;
  63.     IF WD8250
  64. ;
  65. DPORT    EQU    0D8H    ;DATA PROT
  66. LPORT    EQU    DPORT+3    ;LINE COONTROL
  67. CPORT    EQU    DPORT+4    ;MODEM CONTROL
  68.  
  69. ;
  70. ;****************LINE STATUS MASKS*****************************
  71. ;
  72. P0TBMT    EQU    20H    ;XMIT BUFFER EMPTY
  73. P0DAV    EQU    01H    ;DATA AVAILABLE
  74. ;
  75. *****************BAUD RATE DIVISORS****************************
  76. ;
  77. BR110LS    EQU    017H    ;110 BAUD
  78. BR110MS    EQU    004H
  79. BR300LS    EQU    080H    ;300 BAUD
  80. BR300MS    EQU    001H
  81. BR450LS    EQU    000H    ;450 BAUD
  82. BR450MS    EQU    001H
  83. BR600LS    EQU    0C0H    ;600 BAUD
  84. BR600MS    EQU    000H
  85. BR120LS    EQU    060H    ;1200 BAUD
  86. BR120MS    EQU    000H
  87.     ENDIF
  88. ;
  89. ;Equates for XMODEM version 5.0 and up.
  90. ;
  91. LSPEED    EQU    TRUE    ;True if your BYE pgm. sets baud rate.
  92. MSPEED    EQU    03DH    ;location of current baud rate.
  93. ;
  94. BDOS    EQU    5    ;BDOS ENTRY ADDRESS
  95. CR    EQU    0DH    ;CARRIAGE RETURN
  96. LF    EQU    0AH    ;LINEFEED
  97. PRINT    EQU    9    ;PRINT STRING FUNCTION
  98. ;
  99.     ORG    100H
  100. ;
  101. ;Save old stack pointer and set new one
  102. ;
  103. START:    LXI    H,0
  104.     DAD    SP     ;GET OLD STACK
  105.     SHLD    STACK     ;SAVE IT
  106.     LXI    SP,STACK ;SET NEW STACK
  107. ;
  108. ;Print sign-on message
  109.     LXI    D,MSG     ;SEND MESSAGE TO CONSOLE
  110.     MVI    C,PRINT     ;VIA BDOS "PRINT STRING" FUNCTION
  111.     CALL    BDOS
  112. ;
  113. ;Now wait until last character of message
  114. ;is finished before changing baud rate
  115.     LXI    H,0
  116.     LXI    D,1    ;DELAY VALUE
  117. ;
  118. SLO:    DAD    D    ;ADD ONE
  119.     JNC    SLO    ;NO CARRY YET, COUNT MORE
  120. ;
  121. ;Get new baud rate, then return to CP/M
  122.     CALL    CHANGE    ;CHANGE TO NEW BAUD RATE
  123.     LHLD    STACK    ;GET OLD STACK POINTER
  124.     SPHL        ;RESTORE IT
  125.     RET        ;RETURN TO CP/M
  126. ;
  127. ;Read the modem at different baud rates until a CR is found
  128. ;
  129. CHANGE:    IN    DPORT     ;CLEAR ANY GARBAGE FROM MODEM PORT
  130.     IN    DPORT     ;CLEAR IT TWICE JUST TO BE SURE
  131. ;
  132. ;
  133.     IF    PMMI
  134.     MVI    A,B110     ;SELECT 110 BAUD INITIALLY
  135.     OUT    RPORT     ;SET BAUD RATE IN MODEM
  136.     MVI    A,P0110  ;SELECT 8 DATA, NO PARITY, 2 STOP BITS FOR 110 BAUD
  137.     OUT    TPORT
  138.     MVI    A,7FH     ;SET MODEM FILTER FOR <300
  139.     OUT    CPORT
  140.     CALL    TSBAUD     ;SEE IF BAUD = 110
  141. ;
  142.     IF    LSPEED
  143.     MVI    A,0     ;store a 0 for 110 baud
  144.     STA    MSPEED
  145.     ENDIF
  146. ;
  147.     RZ         ;YES, EXIT
  148. ;
  149.     MVI    A,P0NORM ;SET FOR 1 STOP BIT, ETC., FOR >110 BAUD
  150.     OUT    TPORT
  151.     MVI    A,B300     ;SET MODEM TO 300 BAUD
  152.     OUT    RPORT
  153.     CALL    TSBAUD     ;SEE IF BAUD = 300
  154. ;
  155.     IF    LSPEED
  156.     MVI    A,1     ;store a 1 for 300 baud
  157.     STA    MSPEED
  158.     ENDIF
  159. ;
  160.     RZ         ;YES, EXIT
  161. ;
  162.     MVI    A,B450     ;SET MODEM TO 450 BAUD
  163.     OUT    RPORT
  164.     MVI    A,5FH     ;SET MODEM FILTER FOR >300
  165.     OUT    CPORT
  166.     CALL    TSBAUD     ;SEE IF BAUD = 450
  167. ;
  168.     IF    LSPEED
  169.     MVI    A,2     ;store a 2 for 450 baud
  170.     STA    MSPEED
  171.     ENDIF
  172. ;
  173.     RZ         ;YES, EXIT
  174. ;
  175.     MVI    A,B600     ;SET MODEM TO 600 BAUD
  176.     OUT    RPORT
  177.     CALL    TSBAUD     ;SEE IF BAUD = 600
  178. ;
  179.     IF    LSPEED
  180.     MVI    A,3     ;store a 3 for 600 baud
  181.     STA    MSPEED
  182.     ENDIF
  183. ;
  184.     RZ         ;YES, EXIT
  185. ;
  186.     MVI    A,B710     ;SET MODEM TO 710 BAUD
  187.     OUT    RPORT
  188.     CALL    TSBAUD     ;SEE IF BAUD = 710
  189. ;
  190.     IF    LSPEED
  191.     MVI    A,4     ;store a 4 for 710 baud
  192.     STA    MSPEED
  193.     ENDIF
  194. ;
  195.     RZ         ;YES, EXIT
  196. ;
  197.     ENDIF
  198. ;
  199.     IF WD8250
  200. TST110    PUSH    D
  201.     MVI    D,BR110MS
  202.     MVI    E,BR110LS
  203.     IF    LSPEED
  204.     MVI    A,0
  205.     STA    MSPEED
  206.     ENDIF
  207.     CALL    SETBAUD
  208.     POP    D
  209.     CALL    TSTBAUD
  210.     JNZ    TST300
  211.     CALL    TSTBAUD
  212.     RZ
  213.  
  214. TST300    PUSH    D
  215.     MVI    D,BR300MS
  216.     MVI    E,BR300LS
  217.     IF    LSPEED
  218.     MVI    A,1
  219.     STA    MSPEED
  220.     ENDIF
  221.     CALL    SETBAUD
  222.     POP    D
  223.     CALL    TSTBAUD
  224.     JNZ    TST450
  225.     CALL    TSTBAUD
  226.     RZ
  227.  
  228. TST450    PUSH    D
  229.     MVI    D,BR450MS
  230.     MVI    E,BR300LS
  231.     IF    LSPEED
  232.     MVI    A,2
  233.     STA    MSPEED
  234.     ENDIF
  235.     CALL    SETBAUD
  236.     POP    D
  237.     CALL    TSTBAUD
  238.     JNZ    TST600
  239.     CALL    TSTBAUD
  240.     RZ
  241.  
  242. TST600    PUSH    D
  243.     MVI    D,BR600MS
  244.     MVI    E,BR600LS
  245.     IF    LSPEED
  246.     MVI    A,3
  247.     STA    MSPEED
  248.     ENDIF
  249.     CALL    SETBAUD
  250.     POP    D
  251.     CALL    TSTBAUD
  252.     JNZ    TST1200
  253.     CALL    TSTBAUD
  254.     RZ
  255.  
  256. TST1200    PUSH    D
  257.     MVI    D,BR120MS
  258.     MVI    E,BR120MS
  259.     IF    LSPEED
  260.     MVI    A,5
  261.     STA    MSPEED
  262.     ENDIF
  263.     CALL    SETBAUD
  264.     POP    D
  265.     CALL    TSTBAUD
  266.     JNZ    CHANGE
  267.     CALL    TSTBAUD
  268.     RZ
  269.     JMP    CHANGE     ;KEEP TRYING UNTIL CR IS FOUND
  270. ;
  271. SETBAUD    MVI    A,0
  272.     OUT    DPORT+1
  273.     MVI    A,10H
  274.     OUT    CPORT
  275.     MVI    A,80H
  276.     OUT    LPORT
  277.     MOV    A,E    ;GET LSB
  278.     OUT    DPORT
  279.     MOV    A,D    ;GET MSB
  280.     OUT    DPORT+1
  281.     CPI    4
  282.     JNZ    ONSTOP
  283.     MVI    A,07H
  284.     OUT    LPORT
  285.     JMP    DLOOP
  286. ONSTOP:    MVI    A,03
  287.     OUT    LPORT
  288. DLOOP    XCHG        ;PUT DIVISOR IN HL
  289.     DAD    H !DAD H !DAD H !DAD H ;MULTIPLY BY 16
  290. ;                    SO WE DELAY APPROX 2 CHARS TIMES
  291. DLOOP1    DCX    H
  292.     MOV    A,L
  293.     ORA    H
  294.     JNZ    DLOOP1
  295.     XCHG
  296.     MVI    A,1
  297.     OUT    CPORT
  298.     IN    DPORT
  299.     IN    DPORT
  300.     RET
  301. ;
  302. TSTBAUD    CALL    CONIN    ;GET CHARACTER FROM MODEM
  303.     CPI    CR    ;IF A CARRAIAGE RETURN...
  304.     RZ        ;..    RETURN
  305.     CPI    LF    ;IF A LINEFEED...
  306.     RZ
  307.     CPI    'C'-40H ;IF A CONTROL C
  308.     RET        ;RET ZERO FLAG, ELSE NOT ZERO
  309. ;
  310.     ENDIF
  311. ;
  312.     IF PMMI
  313. ;TSBAUD reads one character from console input and returns
  314. ;with the zero flag set if the character is a CR.
  315. ;
  316. TSBAUD:    CALL    CONIN    ;GET CHARACTER DIRECT FROM CONSOLE
  317.     CPI    CR    ;SET ZERO FLAG IF CHARACTER IS CR
  318.     RET        ;THEN RETURN
  319.     ENDIF
  320. ;
  321. ;This routine does a direct console input without echo
  322. ;
  323. CONIN:    LHLD    1    ;GET CBIOS VECTOR
  324.     LXI    D,6    ;ADD OFFSET TO CONIN VECTOR
  325.     DAD    D    ;HL NOW = CONIN VECTOR
  326.     PCHL        ;GO THERE
  327. ;
  328. MSG:    DB    CR,LF,'NEWBAUD ver 2.2 - '
  329.     DB    'Change to new Baud rate,',CR,LF
  330.     DB    'THEN type RETURNs until the system responds.'
  331.     DB    CR,LF,LF,'$'
  332. ;
  333. ;Temporary storage
  334. ;
  335.     DS    60    ;ROOM FOR STACK
  336. STACK:    DS    2    ;OLD STACK SAVED HERE
  337. ;
  338.     END    START
  339.