home *** CD-ROM | disk | FTP | other *** search
/ ftp.update.uu.se / ftp.update.uu.se.2014.03.zip / ftp.update.uu.se / pub / rainbow / msdos / misc2 / z80mu.lzh / 820INIT.ASM next >
Assembly Source File  |  1986-03-12  |  6KB  |  314 lines

  1.  
  2.     .Z80        ;This source is for M80.COM!
  3.     ORG    00100H
  4.  
  5. ;
  6. ;    Equates for ASCII control chars
  7. ;
  8.  
  9. NUL    EQU    000H
  10. SOH    EQU    001H
  11. STX    EQU    002H
  12. ETX    EQU    003H
  13. EOT    EQU    004H
  14. ENQ    EQU    005H
  15. ACK    EQU    006H
  16. BEL    EQU    007H
  17. BS    EQU    008H
  18. TAB    EQU    009H
  19. LF    EQU    00AH
  20. VT    EQU    00BH
  21. FF    EQU    00CH
  22. CR    EQU    00DH
  23. SO    EQU    00EH
  24. SI    EQU    00FH
  25. DLE    EQU    010H
  26. XON    EQU    011H
  27. DC2    EQU    012H
  28. XOFF    EQU    013H
  29. DC4    EQU    014H
  30. NAK    EQU    015H
  31. SYN    EQU    016H
  32. ETB    EQU    017H
  33. CAN    EQU    018H
  34. EM    EQU    019H
  35. SUB    EQU    01AH
  36. ESC    EQU    01BH
  37. FS    EQU    01CH
  38. GS    EQU    01DH
  39. RS    EQU    01EH
  40. US    EQU    01FH
  41.  
  42. ;
  43. ;    External ref equates
  44. ;
  45.  
  46. IOPORT00H    EQU    00000H
  47. BDOS    EQU    00005H
  48. IOPORT06H    EQU    00006H
  49.  
  50. ;
  51. ;    End of external equates
  52. ;
  53.  
  54.  
  55. STARTUP:
  56.     LD    DE,INIT_MSG    ;Give intro screen
  57.     CALL    PRINT_STRING
  58.  
  59. GET_BAUD_RATE:
  60.     LD    DE,BAUD_PROMPT    ;Ask for baudrate value
  61.     CALL    PRINT_STRING
  62.     CALL    GET_BDOS_KEYPRESS
  63.     CP    CR        ;RETURN only?
  64.     JP    NZ,EDIT_BAUD_RATE ;No, look at keypress
  65.     LD    A,'6'        ;Yes, use default value
  66.  
  67. EDIT_BAUD_RATE:
  68.     SUB    '0'        ;Make into binary 0-9
  69.     CP    NUL        ;Legal choice?
  70.     JP    C,GET_BAUD_RATE    ;No, try again
  71.     CP    LF
  72.     JP    NC,GET_BAUD_RATE ;Likewise no, try again
  73.     LD    (BAUD_RATE),A    ;Yes, save it as binary value
  74.  
  75. GET_PARITY_CHOICE:
  76.     LD    DE,PARITY_PROMPT ;Give him parity choices
  77.     CALL    PRINT_STRING
  78.     CALL    GET_BDOS_KEYPRESS ;Get his response
  79.     CP    CR        ;RETURN only?
  80.     JP    NZ,EDIT_PARITY_VALUE ;No, edit it
  81.     LD    A,'N'        ;Yes, use default
  82.  
  83. EDIT_PARITY_VALUE:
  84.     CP    'E'        ;Even parity?
  85.     JP    Z,PARITY_IS_LEGAL ;Yes, legal
  86.     CP    'O'        ;Odd parity?
  87.     JP    Z,PARITY_IS_LEGAL ;Yes, legal
  88.     CP    'N'        ;No parity?
  89.     JP    Z,PARITY_IS_LEGAL ;Yes, legal
  90.     JP    GET_PARITY_CHOICE ;Not legal, so ask again
  91.  
  92. PARITY_IS_LEGAL:
  93.     LD    (PARITY_CHOICE),A ;Save parity selection as ASCII
  94.  
  95. GET_DATABITS_CHOICE:
  96.     LD    DE,DATABITS_PROMPT ;Give Databits prompt
  97.     CALL    PRINT_STRING
  98.     CALL    GET_BDOS_KEYPRESS ;Get response
  99.     CP    CR        ;RETURN only?
  100.     JP    NZ,EDIT_DATABITS_VALUE ;No, use it
  101.     LD    A,'8'        ;Yes, use default
  102.  
  103. EDIT_DATABITS_VALUE:
  104.     SUB    '0'        ;Make into binary 0 thru 8
  105.     CP    BEL        ;Legal choice?
  106.     JP    Z,DATABITS_ARE_LEGAL ;Yes, use it
  107.     CP    BS
  108.     JP    Z,DATABITS_ARE_LEGAL ;Yes, use it
  109.     JP    GET_DATABITS_CHOICE ;No, try again
  110.  
  111. DATABITS_ARE_LEGAL:
  112.     LD    (DATABITS),A    ;Save binary databits value
  113.  
  114. ; Now convert baudrate choice to binary timer value
  115.     LD    A,(BAUD_RATE)
  116.     CP    NUL        ;19.2 Kbaud?
  117.     JP    NZ,TRY_9600_BAUD ;No
  118.     LD    A,SI        ;Yes, use timer value for 19.2 Kbaud
  119.     JP    DONE_EDITING_BAUD
  120.  
  121. TRY_9600_BAUD:
  122.     CP    SOH        ;9600 baud?
  123.     JP    NZ,TRY_4800_BAUD ;No
  124.     LD    A,SO        ;Yes, use timer value for 9600 baud
  125.     JP    DONE_EDITING_BAUD
  126.  
  127. TRY_4800_BAUD:
  128.     CP    STX        ;4800 baud?
  129.     JP    NZ,TRY_2400_BAUD ;No
  130.     LD    A,FF        ;Yes, use timer value for 4800 baud
  131.     JP    DONE_EDITING_BAUD
  132.  
  133. TRY_2400_BAUD:
  134.     CP    ETX        ;2400 baud?
  135.     JP    NZ,TRY_1200_BAUD ;No
  136.     LD    A,LF        ;Yes, use timer value for 2400 baud
  137.     JP    DONE_EDITING_BAUD
  138.  
  139. TRY_1200_BAUD:
  140.     CP    EOT        ;1200 baud?
  141.     JP    NZ,TRY_600_BAUD    ;No
  142.     LD    A,BEL        ;Yes, use value for 1200 baud
  143.     JP    DONE_EDITING_BAUD
  144.  
  145. TRY_600_BAUD:
  146.     CP    ENQ        ;600 baud?
  147.     JP    NZ,TRY_300_BAUD    ;No
  148.     LD    A,ACK        ;Yes, use timer value for 600 baud
  149.     JP    DONE_EDITING_BAUD
  150.  
  151. TRY_300_BAUD:
  152.     CP    ACK        ;300 baud?
  153.     JP    NZ,ASSUME_110_BAUD
  154.     LD    A,ENQ        ;Yes, use timer value for 300 baud
  155.     JP    DONE_EDITING_BAUD
  156.  
  157. ASSUME_110_BAUD:
  158.     LD    A,STX        ;Use timer value for 110 baud
  159.  
  160. DONE_EDITING_BAUD:
  161.     LD    (BAUD_RATE),A    ;Save final timer value for baudrate
  162.  
  163. ; Now convert parity selection to proper control bits
  164.     LD    A,(PARITY_CHOICE)
  165.     CP    'E'        ;Even parity?
  166.     JP    NZ,TRY_ODD_PARITY ;No
  167.     LD    A,ETX        ;Yes, use bit pattern for Even parity
  168.     JP    HAVE_GOOD_PARITY_BITMAP
  169.  
  170. TRY_ODD_PARITY:
  171.     CP    'O'        ;Odd parity?
  172.     JP    NZ,ASSUME_NO_PARITY ;No
  173.     LD    A,SOH        ;Yes, use bit pattern for Odd parity
  174.     JP    HAVE_GOOD_PARITY_BITMAP
  175.  
  176. ASSUME_NO_PARITY:
  177.     LD    A,NUL        ;Use bit pattern for No parity
  178.  
  179. HAVE_GOOD_PARITY_BITMAP:
  180.     LD    (PARITY_CHOICE),A ;Save final SIO parity bitmap
  181.  
  182. ; Edit databits (binary 7 or 8) 
  183. ; to create proper SIO bit pattern
  184.     LD    A,(DATABITS)
  185.     CP    BEL        ;7 data bits?
  186.     JP    Z,SET_7_DATABIT_PATTERN ;Yes
  187.     LD    A,'`'        ;No, use SIO WR5 pattern for 8 TX databits
  188.     LD    (SIO_WR5_TX_BITS),A ;Save to be passed to SIO Write Reg 5
  189.     LD    A,'@'+80H    ;Format 8 Rx databits for SIO Write Reg 3
  190.     LD    (SIO_WR3_RX_BITS),A
  191.     JP    SEND_ALL_TO_SIO
  192.  
  193. SET_7_DATABIT_PATTERN:
  194.     LD    A,' '        ;Set bit pattern for 7 Tx bits
  195.     LD    (SIO_WR5_TX_BITS),A
  196.     LD    A,'@'        ;Ditto for 7 Rx data bits
  197.     LD    (SIO_WR3_RX_BITS),A
  198.  
  199. SEND_ALL_TO_SIO:
  200.  
  201. ; OK, so send everything to SIO
  202.     DI
  203.     LD    A,CAN        ;Reset SIO
  204.     OUT    (IOPORT06H),A
  205.     OUT    (IOPORT06H),A
  206.     LD    A,SOH        ;Select SIO Write Reg 1
  207.     OUT    (IOPORT06H),A
  208.     XOR    A        ;No SIO interrupts
  209.     OUT    (IOPORT06H),A
  210.     LD    A,EOT        ;Select SIO Write Reg 4
  211.     OUT    (IOPORT06H),A
  212.     LD    A,(PARITY_CHOICE) ;Get parity bit pattern
  213.     ADD    A,'D'        ;Add 'Clock x 16' and '1 stop bit' pattern
  214.     OUT    (IOPORT06H),A
  215.     LD    A,ETX        ;Select SIO Write Reg 3
  216.     OUT    (IOPORT06H),A
  217.     LD    A,(SIO_WR3_RX_BITS)
  218.     ADD    A,SOH        ;Enable Receiver
  219.     OUT    (IOPORT06H),A
  220.     LD    A,ENQ        ;Select SIO Write Reg 5
  221.     OUT    (IOPORT06H),A
  222.     LD    A,(SIO_WR5_TX_BITS)
  223.     ADD    A,LF+80H    ;Add 'DTR' and 'Tx Enable' and 'RTS'
  224.     OUT    (IOPORT06H),A
  225.     LD    A,'G'        ;Reset Baud Rate generator
  226.     OUT    (IOPORT00H),A
  227.     LD    A,(BAUD_RATE)    ;Set our Baud Rate timer value
  228.     OUT    (IOPORT00H),A
  229.     EI
  230.     LD    DE,WRAPUP_MSG    ;Tell him that we're done
  231.     CALL    PRINT_STRING
  232.     RET            ;Back to CP/M
  233.  
  234. GET_BDOS_KEYPRESS:
  235.  
  236. ; Return next keypress as Uppercase char in A-reg
  237.     LD    C,SOH
  238.     CALL    BDOS        ;Use BDOS to get next keypress
  239.     CP    '`'        ;Is it lowercase char?
  240.     RET    C        ;No, return it as-is
  241.     SUB    ' '        ;Yes, convert to uppercase
  242.     RET
  243.  
  244. PRINT_STRING:
  245.  
  246. ; Print $-terminated string at (DE)
  247.     LD    C,TAB
  248.     JP    BDOS
  249.  
  250. INIT_MSG:
  251.     DB    SUB,"INIT 1.0 for Xerox 820",CR,LF,LF,LF,CR,LF
  252.  
  253.     DB    "Baud Rates:",CR,LF,"19200 = 0",CR,LF,"9600  ="
  254.  
  255.     DB    " 1",CR,LF,"4800  = 2",CR,LF,"2400  = 3",CR,LF
  256.  
  257.     DB    "1200  = 4",CR,LF," 600  = 5",CR,LF," 300  = 6"
  258.  
  259.     DB    CR,LF," 110  = 7",CR,LF,"$"
  260.  
  261.  
  262. BAUD_PROMPT:
  263.     DB    CR,LF,"Select baud rate           (1-9): 6",BS
  264.  
  265.     DB    "$"
  266.  
  267.  
  268. PARITY_PROMPT:
  269.     DB    CR,LF,"Select parity  (Odd, Even, None): N",BS
  270.  
  271.     DB    "$"
  272.  
  273.  
  274. DATABITS_PROMPT:
  275.     DB    CR,LF,"Select word length      (7 or 8): 8",BS
  276.  
  277.     DB    "$"
  278.  
  279.  
  280. WRAPUP_MSG:
  281.     DB    CR,LF,"Communications port set.$"
  282.  
  283.  
  284. BAUD_RATE:
  285.     DB    NUL
  286.  
  287.  
  288. DATABITS:
  289.     DB    NUL
  290.  
  291.  
  292. PARITY_CHOICE:
  293.     DB    NUL
  294.  
  295.  
  296. SIO_WR5_TX_BITS:
  297.     DB    NUL
  298.  
  299.  
  300. SIO_WR3_RX_BITS:
  301.     DB    NUL,NUL,NUL,NUL,NUL