title: C and assembly project suggestion needed for class on low-level software
body: <p>I have a class on low-level programming which requires a final project (syllabus at the end). It is basically a piece of software that puts to use all you learned.</p>
  <p>I had a few ideas, like designing my own <a href="https://en.wikipedia.org/wiki/Roguelike" rel="nofollow noreferrer">Roguelike</a> (should be kind of like <a href="https://en.wikipedia.org/wiki/NetHack" rel="nofollow noreferrer">NetHack</a>, only single-player), but I'd like some suggestions on alternatives. It needn't be a game; it can be anything. The time frame is a month and a half, and I have other projects, etc. so it shouldn't be <em>too</em> time-consuming to implement.</p>
  <p>Requirements:</p>
  <ul>
  <li>Use, at least, four I/O devices, one of which should be the mouse or serial port</li>
  <li>Some of those devices should use interrupts, others should use polling</li>
  <li>Languages: C and Assembly (mandatorily, else there is a penalization)</li>
  <li>Implement state machines</li>
  </ul>
  <p>The peripherals we were lectured on were:</p>
  <ul>
  <li>Graphics card - Graphical mode</li>
  <li>Graphics card - Text mode</li>
  <li>Mouse</li>
  <li>Keyboard</li>
  <li>Real Time Counter</li>
  <li>On-board Speaker (via timers 0 and 2)</li>
  <li>Serial port</li>
  </ul>
  <p>This is the abridged syllabus:</p>
  <blockquote>
  <p>Input/Output peripherals and their
  operation Direct mapping in a process
  address space Access to peripherals in
  polled mode and by interrupt Processor
  interrupts in the IA-32 architecture
  and the interrupt controller. Writing
  interrupt service routines in Assembly
  and in C Study of some typical
  personal computer peripherals, such as
  keyboard, mouse, graphics card, real
  time clock, timer, loudspeaker and
  serial port.</p>
  <p>Programming in the C programming
  language: main differences with
  respect to  C++ language; structured
  programming in C.  Memory layout of a
  process. Function calls: mechanisms,
  parameter passing, storage of local
  variables and return values. Combined
  programming in C and the IA-32
  processor family assembly. Creation
  and use of libraries. Static linking
  of object code.</p>
  <p>Use of software development tools:
  gcc, make, gdb, ar, prof, diff, patch
  and SVN</p>
  </blockquote>