home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol175 / siosys.a86 < prev    next >
Encoding:
Text File  |  1984-07-15  |  8.3 KB  |  413 lines

  1. ;
  2. ;            RAINBOW.A86
  3. ;
  4. ;    For the DEC Rainbow communications port.
  5. ;
  6. ;
  7. ;Change the clock speed to suit your system.
  8. CLKRATE    EQU    5        ;clock speed in MHz, 8 MHz maximum
  9. ;
  10. ;Do not change the next three equates.
  11. SETUP    EQU    TRUE
  12. DISCON    EQU    TRUE
  13. CARDET    EQU    TRUE
  14. SCRNCLR    EQU    TRUE
  15. ;
  16. ;Z80 SIO equates.
  17. MODRCVB    EQU    01H        ;bit to test for received data
  18. MODRCVR    EQU    MODRCVB        ;change to 0 if bit is 0 when
  19.                 ;data received
  20. MODSNDB    EQU    04H        ;bit to test for ready to send
  21. MODSNDR    EQU    MODSNDB        ;change to 0 if bit is 0 when
  22.                 ;ready to send
  23. ;
  24. MODDATP    EQU    040H
  25. MODCTLP    EQU    042H
  26. MODBAUP    EQU    06H
  27. MODDTRP    EQU    02H
  28. ;
  29. CLR1    EQU    27
  30. CLR2    EQU    '['
  31. CLR3    EQU    '0'
  32. CLR4    EQU    'J'
  33. ;
  34. SCLR1    EQU    27
  35. SCLR2    EQU    '['
  36. SCLR3    EQU    '2'
  37. SCLR4    EQU    'J'
  38. SCLR5    EQU    27
  39. SCLR6    EQU    '['
  40. SCLR7    EQU    'H'
  41. ;
  42. CLREOS:        CALL    ILPRT
  43. ;
  44.         DB    CLR1,CLR2,CLR3,CLR4,0
  45.         RET
  46. ;
  47. CLRSCRN:    CALL    ILPRT
  48. ;
  49.         DB    SCLR1,SCLR2,SCLR3,SCLR4,SCLR5,SCLR6,SCLR7,0
  50.         RET
  51. ;
  52. INMODCTLP:    IN    AL,MODCTLP ! RET     ;in modem control port
  53.         RB    OFFSET INMODCTLP-(offset $)+16  ;extra space
  54. OUTMODDATP:    OUT    MODDATP,AL ! RET     ;out modem data port
  55.         RB    OFFSET OUTMODDATP-(offset $)+16 ;extra space
  56. INMODDATP:    IN    AL,MODDATP ! RET     ;in modem data port
  57.         RB    OFFSET INMODDATP-(offset $)+16  ;extra space
  58. ANIMODSNDB:    AND    AL,MODSNDB ! RET     ;bit to test for send ready
  59.         RB    OFFSET ANIMODSNDB-(offset $)+16 ;extra space
  60. CPIMODSNDR:    CMP    AL,MODSNDR ! RET     ;value of send bit when ready
  61.         RB    OFFSET CPIMODSNDR-(offset $)+16 ;extra space
  62. ANIMODRCVB:    AND    AL,MODRCVB ! RET     ;bit to test for receive ready
  63.         RB    OFFSET ANIMODRCVB-(offset $)+16 ;extra space
  64. CPIMODRCVR:    CMP    AL,MODRCVR ! RET     ;value of receive bit when ready
  65. ;
  66. ;This is where the message goes giving the system for
  67. ;which MODEM9 has been customized.
  68. ;
  69. SYSVER:
  70.     CALL    ILPRT
  71.     DB    'Set Up for: DEC Rainbow (CP/M-86/80)',CR,LF,LF,0
  72.     RET
  73. ;
  74. ;The following are used in setting up the Z80 SIO (and what a pain
  75. ;in the neck it is too!)
  76. ;No need to change for another micro if INIT and SETUP are FALSE.
  77. ;
  78. ;control bytes
  79. RSTINS    EQU    18H    ;reset SIO - register 0
  80. RSTERR    EQU    30H    ;reset parity and overrun flags - register 0
  81. REG1INS    EQU    0    ;no interrupts - register 1
  82. REG3INS    EQU    0C1H    ;8 Rx bits, Rx enable -register 3
  83. RENABL    EQU    1    ;Rx enable
  84. REG4INS    EQU    44H    ;16X baud rate, 1 stop bit, no parity - register 4
  85. CLK16    EQU    40H    ;16X baud rate
  86. REG5INS    EQU    0EAH    ;8 Tx bits, Tx enable, RTS, DTR - register 5
  87. ONINS    EQU    8AH    ;Tx enable, RTS, DTR - register 5
  88. OFFINS    EQU    68H    ;8 Tx bits, Tx enable, no RTS, no DTR -register 5
  89. ;End of Z80 SIO specific equates for initialization.
  90. BAUD12    EQU    88H    ;1200 baud
  91. DECDTR    EQU    0CH    ;DTR for special DEC DTR port
  92. STSPEED    EQU    3    ;1200bps
  93. ;
  94. ;
  95. ;The following is used to initialize the Z80 SIO on execution
  96. ;of MODEM9.
  97. ;
  98. INITMOD:
  99.     MOV    AL,3        ;MSPEED 1200 baud value
  100. INITSPD    EQU    OFFSET $ -1
  101.     MOV    MSPEED,AL
  102.     MOV    BX,Offset BDTABL
  103.     MOV    AH,0
  104.     ADD    BX,AX
  105.     MOV    AL,Byte Ptr [BX]
  106.     MOV    CS: Byte Ptr .SETBD,AL
  107. ;
  108.     MOV    AL,DECDTR
  109.     NOT    AL
  110.     OUT    MODDTRP,AL
  111. ;
  112.     MOV    AL,0        ;select register 0
  113.     OUT    MODCTLP,AL
  114.     MOV    AL,RSTINS
  115.     OUT    MODCTLP,AL
  116.     MOV    AL,1        ;select register 1
  117.     OUT    MODCTLP,AL
  118.     MOV    AL,REG1INS
  119.     OUT    MODCTLP,AL
  120.     MOV    AL,3        ;select register 3
  121.     OUT    MODCTLP,AL
  122.     MOV    AL,REG3INS
  123. PARM1    EQU    OFFSET $ -1
  124.     OUT    MODCTLP,AL
  125.     MOV    AL,4        ;select register 4
  126.     OUT    MODCTLP,AL
  127.     MOV    AL,REG4INS
  128. PARM2    EQU    OFFSET $ -1
  129.     OUT    MODCTLP,AL
  130.     MOV    AL,5        ;select register 5
  131.     OUT    MODCTLP,AL
  132.     MOV    AL,REG5INS
  133. PARM3    EQU    OFFSET $ -1
  134.     OUT    MODCTLP,AL
  135.     MOV    AL,BAUD12
  136. SETBD    EQU    OFFSET $ -1
  137.     OUT    MODBAUP,AL
  138.     RET
  139. ;
  140. ;
  141. ;The following routine changes the baud rate, stop bits and parity on
  142. ;the Z80 SIO from the command level. Note the routine MUST modify the
  143. ;parameters used by the INITMOD routine.
  144. ;
  145. ;The following are parameters/masks used in setting word length
  146. ;stop bits and parity for the Z80 SIO.
  147. MSKWD    EQU    0C0H    ;word length mask
  148. RSEVEN    EQU    40H    ;receive seven bit word
  149. REIGHT    EQU    0C0H    ;receive eight bit word
  150. TSEVEN    EQU    20H    ;transmit seven bit word
  151. TEIGHT    EQU    60H    ;transmit eight bit word
  152. MSKST    EQU    0CH    ;stop bit mask
  153. ONE    EQU    04H    ;one stop bit
  154. TWO    EQU    0CH    ;two stop bits
  155. MSKPA    EQU    03H    ;mask for parity bits
  156. NONE    EQU    00H    ;no parity
  157. ODD    EQU    01H    ;odd parity
  158. EVEN    EQU    03H    ;even parity
  159. ;
  160. ;
  161. SETUPR:    PUSH    BX
  162.     CALL    CLRTST
  163.     CALL    ILPRT
  164.     DB    '                 UART/Modem Control',CR,LF,LF,LF
  165.     DB    'Current settings -',CR,LF,0
  166.     CALL    SETTIM2
  167.     CALL    GIVEPRM
  168.     CALL    ILPRT
  169.     DB    CR,LF
  170.     DB    'Enter choices below - <CR> for no change',CR,LF,0
  171. AGAIN:    MOV    DX,OFFSET BAUDBUF    ;point to input buffer for ILCOMP
  172.     CALL    ILPRT
  173.     DB    'Baud Rate (300, 600, 1200, 2400, 4800, 9600): ',0
  174.     CALL    INBUFF
  175.     MOV    DX,OFFSET BAUDBUF+2
  176.     CALL    ILCOMP    ;compare BAUDBUF+2 with characters below
  177.     DB    '300',0
  178.     MOV    AL,1
  179.     JNC    OK        ;go if got match
  180.     CALL    ILCOMP
  181.     DB    '600',0
  182.     MOV    AL,2
  183.     JNC    OK
  184.     CALL    ILCOMP
  185.     DB    '1200',0
  186.     MOV    AL,3
  187.     JNC    OK
  188.     CALL    ILCOMP
  189.     DB    '2400',0
  190.     MOV    AL,4
  191.     JNC    OK
  192.     CALL    ILCOMP
  193.     DB    '4800',0
  194.     MOV    AL,5
  195.     JNC    OK
  196.     CALL    ILCOMP
  197.     DB    '9600',0
  198.     MOV    AL,6
  199.     JNC    OK
  200.     CALL    ILCOMP
  201.     DB    ' ',0
  202.     JNC    AGAIN2
  203.     CALL    WRONG
  204.     JMP    AGAIN        ;try again
  205. ;
  206. OK:    MOV    CS: BYTE PTR .INITSPD,AL
  207.     MOV    MSPEED,AL
  208. ;
  209. AGAIN2:    MOV    DX,OFFSET BAUDBUF    ;point to input buffer for ILCOMP
  210.     CALL    ILPRT
  211.     DB    CR,LF
  212.     DB    'Word Length (7, 8): ',0
  213.     CALL    INBUFF
  214.     MOV    DX,OFFSET BAUDBUF+2
  215.     CALL    ILCOMP    ;compare BAUDBUF+2 with characters below
  216.     DB    '7',0
  217.     MOV    AL,RSEVEN
  218.     MOV    CH,TSEVEN
  219.     JNC    OK2
  220.     CALL    ILCOMP
  221.     DB    '8',0
  222.     MOV    AL,REIGHT
  223.     MOV    CH,TEIGHT
  224.     JNC    OK2
  225.     CALL    ILCOMP
  226.     DB    ' ',0
  227.     JNC    AGAIN3
  228.     CALL    WRONG
  229.     JMP    AGAIN2
  230. ;
  231. OK2:    MOV    RWDLEN,AL
  232.     MOV    TWDLEN,CH
  233. ;
  234. AGAIN3:    MOV    DX,OFFSET BAUDBUF    ;point to input buffer for ILCOMP
  235.     CALL    ILPRT
  236.     DB    CR,LF
  237.     DB    'Stop Bits (1, 2): ',0
  238.     CALL    INBUFF
  239.     MOV    DX,OFFSET BAUDBUF+2
  240.     CALL    ILCOMP    ;compare BAUDBUF+2 with characters below
  241.     DB    '1',0
  242.     MOV    AL,ONE
  243.     JNC    OK3
  244.     CALL    ILCOMP
  245.     DB    '2',0
  246.     MOV    AL,TWO
  247.     JNC    OK3
  248.     CALL    ILCOMP
  249.     DB    ' ',0
  250.     JNC    AGAIN4
  251.     CALL    WRONG
  252.     JMP    AGAIN3
  253. ;
  254. OK3:    MOV    STPLN,AL
  255. ;
  256. AGAIN4:    MOV    DX,OFFSET BAUDBUF    ;point to input buffer for ILCOMP
  257.     CALL    ILPRT
  258.     DB    CR,LF
  259.     DB    'Parity (None, Even, Odd): ',0
  260.     CALL    INBUFF
  261.     MOV    DX,OFFSET BAUDBUF+2
  262.     CALL    ILCOMP    ;compare BAUDBUF+2 with characters below
  263.     DB    'NONE',0
  264.     MOV    AL,NONE
  265.     JNC    OK4        ;go if got match
  266.     CALL    ILCOMP
  267.     DB    'EVEN',0
  268.     MOV    AL,EVEN
  269.     JNC    OK4
  270.     CALL    ILCOMP
  271.     DB    'ODD',0
  272.     MOV    AL,ODD
  273.     JNC    OK4
  274.     CALL    ILCOMP
  275.     DB    ' ',0
  276.     JNC    GOSET
  277.     CALL    WRONG
  278.     JMP    AGAIN4        ;try again
  279. ;
  280. OK4:    MOV    PARIT,AL
  281. ;
  282. GOSET:    MOV    AL,RENABL
  283.     OR    AL,RWDLEN
  284.     MOV    CS: BYTE PTR .PARM1,AL
  285.     MOV    AL,ONINS
  286.     OR    AL,TWDLEN
  287.     MOV    CS: BYTE PTR .PARM3,AL
  288.     MOV    AL,PARIT
  289.     OR    AL,STPLN
  290.     OR    AL,CLK16
  291.     MOV    CS: BYTE PTR .PARM2,AL
  292.     CALL    ILPRT
  293.     DB    CR,LF
  294.     DB    'New settings -',CR,LF,0
  295.     CALL    SETTIM2
  296.     CALL    GIVEPRM
  297.     POP    BX
  298.     JMP    INITMOD        ;reset Z80 SIO
  299. ;
  300. GIVEPRM:
  301.     CALL    GETPRM
  302.     CALL    ILPRT
  303.     DB    'Word length is ',0
  304.     MOV    AL,RWDLEN
  305.     CMP    AL,RSEVEN
  306.     JNZ    NOTSEV
  307.     CALL    ILPRT
  308.     DB    'seven',0
  309.     JMP    GIVEST
  310. NOTSEV:    CALL    ILPRT
  311.     DB    'eight',0
  312. GIVEST:    CALL    ILPRT
  313.     DB    ', number of stop bits is ',0
  314.     MOV    AL,STPLN
  315.     CMP    AL,ONE
  316.     JNZ    NOTONE
  317.     CALL    ILPRT
  318.     DB    'one',0
  319.     JMP    GIVEPA
  320. NOTONE:    CALL    ILPRT
  321.     DB    'two',0
  322. GIVEPA:    CALL    ILPRT
  323.     DB    ', parity is ',0
  324.     MOV    AL,PARIT
  325.     CMP    AL,NONE
  326.     JNZ    NOTNON
  327.     CALL    ILPRT
  328.     DB    'none',CR,LF,0
  329.     RET
  330. NOTNON:    MOV    AL,PARIT
  331.     CMP    AL,ODD
  332.     JNZ    NOTODD
  333.     CALL    ILPRT
  334.     DB    'odd',CR,LF,0
  335.     RET
  336. NOTODD:    CALL    ILPRT
  337.     DB    'even',CR,LF,0
  338.     RET
  339. ;
  340. GETPRM:    MOV    AL,CS: BYTE PTR .PARM1    ;get present word length
  341.     AND    AL,MSKWD    
  342.     MOV    RWDLEN,AL
  343.     MOV    AL,CS: BYTE PTR .PARM2    ;get stop bits and parity
  344.     MOV    CH,AL
  345.     AND    AL,MSKST
  346.     MOV    STPLN,AL
  347.     MOV    AL,CH
  348.     AND    AL,MSKPA
  349.     MOV    PARIT,AL
  350.     RET
  351. ;
  352. WRONG:    CALL    ILPRT    ;all matches failed - tell operator
  353.     DB    '++ Incorrect entry ++',CR,LF,BELL,0
  354.     RET
  355. ;
  356. ;Table of baud rate parameters
  357. BDTABL    EQU    Offset $
  358.     DB    000H        ;110 Not used
  359.     DB    066H        ;300
  360.     DB    077H        ;600
  361.     DB    088H        ;1200
  362.     DB    0BBH        ;2400
  363.     DB    0DDH        ;4800
  364.     DB    0EEH        ;9600
  365.     DB    000H        ;19200 Not used
  366. ;
  367. RWDLEN    DB    REIGHT
  368. TWDLEN    DB    TEIGHT
  369. STPLN    DB    ONE
  370. PARIT    DB    NONE
  371. ;
  372. BAUDBUF:
  373.     DB    10,0
  374.     RB    10
  375. ;
  376. ;
  377. ;For MODEMs which disconnect from the telephone line when data terminal
  378. ;ready (DTR) drops, the following routine will disconnect.
  379. ;
  380. HANGUP    EQU    0        ;HANG UP THE TELEPHONE
  381. ;
  382. DISCR:    MOV    AL,DECDTR
  383.     OUT    MODDTRP,AL
  384.     RET
  385. ;
  386. ;
  387. ;The following routine will give the carrier detect status when the
  388. ;Present version is used with a modem whose clear-to-send line follows
  389. ;carrier detect. Change CTS to RLSD if your modem connection presents
  390. ;the CXR line to the SIO.
  391. ;
  392. RSTEXS    EQU    10H        ;select register 0, reset external status
  393. CTS    EQU    20H        ;CLEAR TO SEND
  394. RLSD    EQU    10H        ;RECEIVED LINE SIGNAL (CARRIER) DETECT
  395. ;
  396. DETCAR:    MOV    AL,CARDETFLG
  397.     OR    AL,AL
  398.     JZ    DETCARRET    ;RETURN IF FALSE
  399.     CALL    ILPRT
  400.     DB    'Carrier ',0
  401.     IN    AL,MODDTRP
  402.     AND    AL,RLSD
  403.     JZ    DETCAR1
  404.     CALL    ILPRT
  405.     DB    'not ',0
  406. DETCAR1:
  407.     CALL    ILPRT
  408.     DB    'present',CR,LF,0
  409. DETCARRET:
  410.     RET
  411. ;
  412.  
  413.