MouseP.Lola.txt 1.3 KB

1234567891011121314151617181920212223242526272829303132
  1. MODULE MouseP (
  2. IN clk, rst: BIT;
  3. INOUT io: [2] BIT;
  4. OUT out: [28] BIT);
  5. (* init mouse cmd F4 (start reporting) with start, parity and stop bits added *)
  6. CONST InitBuf := $FFFFFDE8; (* 1...1 1 0 1111 0100 0 *)
  7. TYPE IOBUF = MODULE (IN I: BIT; OUT O: BIT; INOUT IO: BIT; IN T: BIT) ^;
  8. REG (clk) x, y: [10] BIT; (*counters*)
  9. btns: [3] BIT;
  10. Q0, Q1, run: BIT;
  11. shreg: [32] BIT;
  12. VAR buf0, buf1: IOBUF;
  13. msclk, msdat: BIT;
  14. shift, endbit, reply: BIT;
  15. dx, dy: [10] BIT;
  16. BEGIN
  17. buf0 (0, msclk, io.0, rst);
  18. buf1 (0, msdat, io.1, run | shreg.0);
  19. shift := Q1 & ~Q0; (*falling edge detector*)
  20. reply := ~run & ~shreg.11; (*start bit of echoed initBuf, if response*)
  21. endbit := run & ~shreg.0; (*normal packet received*)
  22. dx := {shreg.5 !2, shreg.7 -> 0'8 : shreg[19:12]}; (*sign + ovfl*)
  23. dy := {shreg.6 !2, shreg.8 -> 0'8 : shreg[30:23]}; (*sign + ovfl*)
  24. out := {run, btns, 0'2, y, 0'2, x};
  25. run := rst & (reply | run);
  26. Q0 := msclk; Q1 := Q0;
  27. shreg := ~rst -> InitBuf : (endbit | reply) -> $FFFFFFFF'32 : shift -> {msdat, shreg[31:1]} : shreg;
  28. x := ~rst -> 0'10 : endbit -> x + dx : x;
  29. y := ~rst -> 0'10 : endbit -> y + dy : y;
  30. btns := ~rst -> 0'3 : endbit -> {shreg.1, shreg.3, shreg.2} : btns
  31. END MouseP.