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

  1.  
  2. ;            NEC-APC.A86
  3. ;
  4. ;    For the NEC Advanced Personal Computer 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. ;8251A equates.
  17. MODRCVB    EQU    02H        ;bit to test for received data
  18. MODRCVR    EQU    MODRCVB        ;change to 0 if bit is 0 when
  19.                 ;data received
  20. MODSNDB    EQU    01H        ;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    030H        ;Serial Port 1 data
  25. MODCTLP    EQU    032H        ;Serial port 1 status
  26. MODBAUD    EQU    02BH        ;Counter/Timer 1 load
  27. MODCLK    EQU    02FH        ;Counter/Timer select 
  28. ;
  29. ESCAPE    EQU    1BH
  30. NULL    EQU    0
  31. ;
  32. CLR1    EQU    ESCAPE        ;ANSI clear from cursor to end of screen
  33. CLR2    EQU    '['
  34. CLR3    EQU    '0'
  35. CLR4    EQU    'J'
  36. ;
  37. SCLR1    EQU    ESCAPE        ;ANSI clear entire screen
  38. SCLR2    EQU    '['
  39. SCLR3    EQU    '2'
  40. SCLR4    EQU    'J'
  41. SCLR5    EQU    1EH        ;ADM3A home cursor
  42. SCLR6    EQU    0
  43. SCLR7    EQU    0
  44. ;
  45. CLREOS:        CALL    ILPRT
  46. ;
  47.         DB    CLR1,CLR2,CLR3,CLR4,0
  48.         RET
  49. ;
  50. CLRSCRN:    CALL    ILPRT
  51. ;
  52.         DB    SCLR1,SCLR2,SCLR3,SCLR4,SCLR5,SCLR6,SCLR7,0
  53.         RET
  54. ;
  55. INMODCTLP:    IN    AL,MODCTLP         ;in modem status port
  56.         RET
  57.         RB    OFFSET INMODCTLP-(offset $)+16  ;extra space
  58.  
  59. OUTMODDATP:    OUT    MODDATP,AL         ;out modem data port
  60.         RET
  61.         RB    OFFSET OUTMODDATP-(offset $)+16 ;extra space
  62.  
  63. INMODDATP:    IN    AL,MODDATP         ;in modem data port
  64.         RET
  65.         RB    OFFSET INMODDATP-(offset $)+16  ;extra space
  66.  
  67. ANIMODSNDB:    AND    AL,MODSNDB         ;bit to test for send ready
  68.         RET
  69.         RB    OFFSET ANIMODSNDB-(offset $)+16 ;extra space
  70.  
  71. CPIMODSNDR:    CMP    AL,MODSNDR         ;value of send bit when ready
  72.         RET
  73.         RB    OFFSET CPIMODSNDR-(offset $)+16 ;extra space
  74.  
  75. ANIMODRCVB:    AND    AL,MODRCVB         ;bit to test for receive ready
  76.         RET
  77.         RB    OFFSET ANIMODRCVB-(offset $)+16 ;extra space
  78.  
  79. CPIMODRCVR:    CMP    AL,MODRCVR         ;value of receive ready bit
  80.         RET
  81. ;
  82. ;This is where the message goes giving the system for
  83. ;which MODEM9 has been customized.
  84. ;
  85. SYSVER:
  86.     CALL    ILPRT
  87.     DB    'Set Up for: NEC Advanced Personal Computer',CR,LF
  88.     DB    '            on standard serial port',CR,LF,LF,0
  89.     RET
  90. ;
  91. ;The following are used in setting up the 8251A
  92. ;No need to change for another micro if INIT and SETUP are FALSE.
  93. ;
  94. ;control bytes
  95. RSTINS    EQU    40H    ;reset 8251A
  96. RSTERR    EQU    37H    ;reset parity and overrun flags
  97. MODEINS    EQU    4EH    ;16x, 8 bits, no parity, 1 stop
  98. CMDINS    EQU    27H    ;DTR, RTS, Tx enable, RX enable
  99. CLK16    EQU    02H    ;16X baud rate
  100. CLKSET    EQU    076H    ;Select baud rate counter/timer
  101. STSPEED    EQU    1    ;300bps
  102. ;End of 8251A specific equates for initialization.
  103. ;
  104. ;
  105. ;The following is used to initialize the 8251A on execution
  106. ;of MODEM9.
  107. ;
  108. INITMOD:
  109.     MOV    AL,CLKSET
  110.     OUT    MODCLK,AL    ;Select baud rate generator
  111.     MOV    AL,STSPEED
  112. INITSPD    EQU    Offset $ - 1
  113.     MOV    MSPEED,AL
  114.     MOV    BX,Offset BDTABL ;Set baud rate    
  115.     MOV    DX,0
  116.     ADD    AL,AL
  117.     MOV    DL,AL
  118.     ADD    BX,DX
  119.     MOV    AX,[BX]
  120.     OUT    MODBAUD,AL    ;Set low byte of clock
  121.     MOV    AL,AH
  122.     OUT    MODBAUD,AL    ;Set high byte of clock
  123.     MOV    AL,NULL        ;1st null
  124.     OUT    MODCTLP,AL
  125.     CALL    IDELAY
  126.     MOV    AL,NULL        ;2nd null
  127.     OUT    MODCTLP,AL
  128.     CALL    IDELAY
  129.     MOV    AL,NULL        ;3rd null
  130.     OUT    MODCTLP,AL
  131.     CALL    IDELAY
  132.     MOV    AL,RSTINS    ;Reset 8251A
  133.     OUT    MODCTLP,AL
  134.     CALL    IDELAY
  135.     MOV    AL,MODEINS    ;8251A mode byte
  136. PARM1    EQU    OFFSET $ -1
  137.     OUT    MODCTLP,AL
  138.     CALL    IDELAY
  139.     MOV    AL,CMDINS    ;8251A command byte
  140. PARM2    EQU    OFFSET $ -1
  141.     OUT    MODCTLP,AL
  142.     RET
  143. ;
  144. IDELAY:
  145.     NOP
  146.     NOP
  147.     NOP
  148.     NOP
  149.     RET
  150. ;
  151. ;The following routine changes the baud rate, stop bits and parity on
  152. ;the 8251A from the command level. Note the routine MUST modify the
  153. ;parameters used by the INITMOD routine.
  154. ;
  155. ;The following are parameters/masks used in setting word length
  156. ;stop bits and parity for the Z80 SIO.
  157. MSKWD    EQU    0CH    ;word length mask
  158. SEVEN    EQU    08H    ;receive seven bit word
  159. EIGHT    EQU    0CH    ;receive eight bit word
  160. MSKST    EQU    0C0H    ;stop bit mask
  161. ONE    EQU    040H    ;one stop bit
  162. TWO    EQU    0C0H    ;two stop bits
  163. MSKPA    EQU    030H    ;mask for parity bits
  164. NONE    EQU    00H    ;no parity
  165. ODD    EQU    010H    ;odd parity
  166. EVEN    EQU    030H    ;even parity
  167. ;
  168. ;
  169. SETUPR:
  170.     PUSH    BX
  171.     CALL    CLRTST
  172.     CALL    ILPRT
  173.     DB    '                 UART/Modem Control',CR,LF,LF,LF
  174.     DB    'Current settings -',CR,LF,0
  175.     CALL    SETTIM2
  176.     CALL    GIVEPRM
  177.     CALL    ILPRT
  178.     DB    CR,LF
  179.     DB    'Enter choices below - <CR> for no change',CR,LF,0
  180. AGAIN:
  181.     MOV    DX,OFFSET BAUDBUF    ;point to input buffer for ILCOMP
  182.     CALL    ILPRT
  183.     DB    'Baud Rate (110, 300, 600, 1200, 2400, 4800, 9600, 19200): ',0
  184.     CALL    INBUFF
  185.     MOV    DX,OFFSET BAUDBUF+2
  186.     CALL    ILCOMP        ;compare BAUDBUF+2 with characters below
  187.     DB    '110',0
  188.     MOV    AL,0
  189.     JNC    OK        ;go if got match
  190.     CALL    ILCOMP
  191.     DB    '300',0
  192.     MOV    AL,1
  193.     JNC    OK
  194.     CALL    ILCOMP
  195.     DB    '600',0
  196.     MOV    AL,2
  197.     JNC    OK
  198.     CALL    ILCOMP
  199.     DB    '1200',0
  200.     MOV    AL,3
  201.     JNC    OK
  202.     CALL    ILCOMP
  203.     DB    '2400',0
  204.     MOV    AL,4
  205.     JNC    OK
  206.     CALL    ILCOMP
  207.     DB    '4800',0
  208.     MOV    AL,5
  209.     JNC    OK
  210.     CALL    ILCOMP
  211.     DB    '9600',0
  212.     MOV    AL,6
  213.     JNC    OK
  214.     CALL    ILCOMP
  215.     DB    '19200',0
  216.     MOV    AL,7
  217.     JNC    OK
  218.     CALL    ILCOMP
  219.     DB    ' ',0
  220.     JNC    AGAIN2
  221.     CALL    WRONG
  222.     JMP    AGAIN        ;try again
  223. ;
  224. OK:
  225.     MOV    CS: BYTE PTR .INITSPD,AL
  226.     MOV    MSPEED,AL
  227. ;
  228. AGAIN2:
  229.     MOV    DX,OFFSET BAUDBUF    ;point to input buffer for ILCOMP
  230.     CALL    ILPRT
  231.     DB    CR,LF
  232.     DB    'Word Length (7, 8): ',0
  233.     CALL    INBUFF
  234.     MOV    DX,OFFSET BAUDBUF+2
  235.     CALL    ILCOMP    ;compare BAUDBUF+2 with characters below
  236.     DB    '7',0
  237.     MOV    AL,SEVEN
  238.     JNC    OK2
  239.     CALL    ILCOMP
  240.     DB    '8',0
  241.     MOV    AL,EIGHT
  242.     JNC    OK2
  243.     CALL    ILCOMP
  244.     DB    ' ',0
  245.     JNC    AGAIN3
  246.     CALL    WRONG
  247.     JMP    AGAIN2
  248. ;
  249. OK2:
  250.     MOV    WDLEN,AL
  251. ;
  252. AGAIN3:
  253.     MOV    DX,OFFSET BAUDBUF ;point to input buffer for ILCOMP
  254.     CALL    ILPRT
  255.     DB    CR,LF
  256.     DB    'Stop Bits (1, 2): ',0
  257.     CALL    INBUFF
  258.     MOV    DX,OFFSET BAUDBUF+2
  259.     CALL    ILCOMP        ;compare BAUDBUF+2 with characters below
  260.     DB    '1',0
  261.     MOV    AL,ONE
  262.     JNC    OK3
  263.     CALL    ILCOMP
  264.     DB    '2',0
  265.     MOV    AL,TWO
  266.     JNC    OK3
  267.     CALL    ILCOMP
  268.     DB    ' ',0
  269.     JNC    AGAIN4
  270.     CALL    WRONG
  271.     JMP    AGAIN3
  272. ;
  273. OK3:
  274.     MOV    STPLN,AL
  275. ;
  276. AGAIN4:
  277.     MOV    DX,OFFSET BAUDBUF ;point to input buffer for ILCOMP
  278.     CALL    ILPRT
  279.     DB    CR,LF
  280.     DB    'Parity (None, Even, Odd): ',0
  281.     CALL    INBUFF
  282.     MOV    DX,OFFSET BAUDBUF+2
  283.     CALL    ILCOMP        ;compare BAUDBUF+2 with characters below
  284.     DB    'NONE',0
  285.     MOV    AL,NONE
  286.     JNC    OK4        ;go if got match
  287.     CALL    ILCOMP
  288.     DB    'EVEN',0
  289.     MOV    AL,EVEN
  290.     JNC    OK4
  291.     CALL    ILCOMP
  292.     DB    'ODD',0
  293.     MOV    AL,ODD
  294.     JNC    OK4
  295.     CALL    ILCOMP
  296.     DB    ' ',0
  297.     JNC    GOSET
  298.     CALL    WRONG
  299.     JMP    AGAIN4        ;try again
  300. ;
  301. OK4:
  302.     MOV    PARIT,AL
  303. ;
  304. GOSET:
  305.     MOV    AL,0
  306.     OR    AL,WDLEN
  307.     OR    AL,PARIT
  308.     OR    AL,STPLN
  309.     OR    AL,CLK16
  310.     MOV    CS: BYTE PTR .PARM1,AL
  311.     CALL    ILPRT
  312.     DB    CR,LF
  313.     DB    'New settings -',CR,LF,0
  314.     CALL    SETTIM2
  315.     CALL    GIVEPRM
  316.     POP    BX
  317.     JMP    INITMOD        ;reset Z80 SIO
  318. ;
  319. GIVEPRM:
  320.     CALL    GETPRM
  321.     CALL    ILPRT
  322.     DB    'Word length is ',0
  323.     MOV    AL,WDLEN
  324.     CMP    AL,SEVEN
  325.     JNZ    NOTSEV
  326.     CALL    ILPRT
  327.     DB    'seven',0
  328.     JMP    GIVEST
  329. NOTSEV:
  330.     CALL    ILPRT
  331.     DB    'eight',0
  332. GIVEST:
  333.     CALL    ILPRT
  334.     DB    ', number of stop bits is ',0
  335.     MOV    AL,STPLN
  336.     CMP    AL,ONE
  337.     JNZ    NOTONE
  338.     CALL    ILPRT
  339.     DB    'one',0
  340.     JMP    GIVEPA
  341. NOTONE:
  342.     CALL    ILPRT
  343.     DB    'two',0
  344. GIVEPA:
  345.     CALL    ILPRT
  346.     DB    ', parity is ',0
  347.     MOV    AL,PARIT
  348.     CMP    AL,NONE
  349.     JNZ    NOTNON
  350.     CALL    ILPRT
  351.     DB    'none',CR,LF,0
  352.     RET
  353.  
  354. NOTNON:
  355.     MOV    AL,PARIT
  356.     CMP    AL,ODD
  357.     JNZ    NOTODD
  358.     CALL    ILPRT
  359.     DB    'odd',CR,LF,0
  360.     RET
  361. NOTODD:
  362.     CALL    ILPRT
  363.     DB    'even',CR,LF,0
  364.     RET
  365. ;
  366. GETPRM:
  367.     MOV    AL,CS: BYTE PTR .PARM1    ;get present word length
  368.     AND    AL,MSKWD    
  369.     MOV    WDLEN,AL
  370.     MOV    AL,CS: BYTE PTR .PARM1    ;get stop bits and parity
  371.     MOV    CH,AL
  372.     AND    AL,MSKST
  373.     MOV    STPLN,AL
  374.     MOV    AL,CH
  375.     AND    AL,MSKPA
  376.     MOV    PARIT,AL
  377.     RET
  378. ;
  379. WRONG:
  380.     CALL    ILPRT    ;all matches failed - tell operator
  381.     DB    '++ Incorrect entry ++',CR,LF,BELL,0
  382.     RET
  383. ;
  384. ;Table of baud rate parameters
  385. ;
  386. BDTABL    EQU    WORD PTR $
  387.     DW      0574H        ; 110 baud
  388.     DW    0200H        ; 300 baud
  389.     DW    0100H        ; 600 baud
  390.     DW    0080H        ; 1200 baud
  391.     DW    0040H        ; 2400 baud
  392.     DW    0020H        ; 4800 baud
  393.     DW    0010H        ; 9600 baud
  394.     DW    0008H        ; 19200 baud
  395. ;
  396. WDLEN    DB    EIGHT
  397. STPLN    DB    ONE
  398. PARIT    DB    NONE
  399. ;
  400. BAUDBUF:
  401.     DB    10,0
  402.     RB    10
  403. ;
  404. ;
  405. ;For MODEMs which disconnect from the telephone line when data terminal
  406. ;ready (DTR) drops, the following routine will disconnect.
  407. ;
  408. HANGUP    EQU    0        ;HANG UP THE TELEPHONE
  409. ;
  410. DISCR:
  411.     MOV    AL,25H
  412.     OUT    MODCTLP,AL
  413.     RET
  414. ;
  415. ;
  416. ;The following routine will give the carrier detect status
  417. ;
  418. XTRAP    EQU    34H        ;Extra status port
  419. CTS    EQU    04H        ;CLEAR TO SEND
  420. RLSD    EQU    01H        ;RECEIVED LINE SIGNAL (CARRIER) DETECT
  421. ;
  422. DETCAR:
  423.     MOV    AL,CARDETFLG
  424.     OR    AL,AL
  425.     JZ    DETCARRET    ;RETURN IF FALSE
  426.     CALL    ILPRT
  427.     DB    'Carrier ',0
  428.     IN    AL,XTRAP
  429.     AND    AL,RLSD
  430.     JNZ    DETCAR1
  431.     CALL    ILPRT
  432.     DB    'not ',0
  433. DETCAR1:
  434.     CALL    ILPRT
  435.     DB    'present',CR,LF,0
  436. DETCARRET:
  437.     RET
  438. ;
  439.  
  440.