{"id":13423299,"url":"https://github.com/thejpster/monotron","last_synced_at":"2025-03-15T17:31:40.094Z","repository":{"id":57640132,"uuid":"123673389","full_name":"thejpster/monotron","owner":"thejpster","description":"A simple 8-bit home computer style application for the TI Tiva-C Launchpad","archived":true,"fork":false,"pushed_at":"2021-08-17T14:30:39.000Z","size":12753,"stargazers_count":192,"open_issues_count":39,"forks_count":9,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-02-28T07:36:43.192Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thejpster.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-03-03T08:23:36.000Z","updated_at":"2024-11-26T20:05:38.000Z","dependencies_parsed_at":"2022-09-07T13:50:13.838Z","dependency_job_id":null,"html_url":"https://github.com/thejpster/monotron","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thejpster%2Fmonotron","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thejpster%2Fmonotron/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thejpster%2Fmonotron/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thejpster%2Fmonotron/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thejpster","download_url":"https://codeload.github.com/thejpster/monotron/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243766787,"owners_count":20344812,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T00:00:28.846Z","updated_at":"2025-03-15T17:31:38.431Z","avatar_url":"https://github.com/thejpster.png","language":"Rust","funding_links":[],"categories":["Board support crates","Rust"],"sub_categories":["Texas Instruments"],"readme":"# Monotron.\n\n\u003e A simple 1980's home computer style application for the Tiva-C Launchpad\n\n## The Monotron is no more\n\nMonotron was fun, but it was only ever a tech demo rather than something we could build on. Check out \u003chttps://github.com/neotron-compute/\u003e for our new family of ARM-based, Rust-powered home computers. \n\n## Introduction\n\nMonotron is powered by a Texas Instruments TM4C123 microcontroller, containing\nan ARM Cortex-M4 core and a number of peripherals. This processor was chosen\nbecause it is available on an inexpensive dev-kit - the Tiva-C Launchpad - and\nI happened to have some lying around. The challenge I set myself was, how much\ncan you squeeze out of this tiny CPU? And can you do it all in pure-Rust?\n\n![YouTube screenshot of a video of Monotron](screenshot.jpg \"Monotron on Youtube\")\n[See Monotron in Action!](https://www.youtube.com/watch?v=7x_92PXKSN4)\n\n## The Future\n\nMonotron has been replaced by the [Neotron 32](https://github.com/neotron-compute/Neotron-32-Hardware), part of the [Neotron family](https://neotron-compute.github.io). All future work will happen under the Neotron banner, and this repo is in archive mode.\n\n## Features\n\n* 800x600 8-colour VGA output\n* 32 KiB SRAM (24 KiB usable for applications)\n* 256 KiB Flash ROM\n* Choice of low-memory 48x36 text display mode or full 384x288 bitmap graphics mode\n* 8-bit mono audio output with 3 channel, 4 waveform synthesiser\n* USB Serial I/O\n* Atari 9-pin joystick interface\n* Simple command-line interface\n* I2C expansion interface\n* Loadable apps\n* Battery backed real-time clock*\n* 25-pin IBM PC style parallel printer port*\n* MIDI In, Out and Through*\n* PS/2 Keyboard and Mouse*\n* RS-232 Serial port*\n* Watch this space!\n\n\n _* Requires additional hardware, included on the [Monotron PCB](#monotron-pcb)_\n\n## Video\n\nMonotron generates an 800x600 VGA video signal at 60 Hz using three SPI\nperipherals and a timer to generate the horizontal sync signals. It can do\nthis because the VGA signal has a pixel clock of 40 MHz and the Tiva-C\nLaunchpad's TM4C123 CPU runs at 80 MHz. We save on the number of pixels we\nhave to push through the SPIs by running at half-resolution horizontally\n(giving 400x600), which also halves the pixel clock to 20 MHz. I did try 40\nMHz mode and it didn't work.\n\nMonotron has two 'modes' it can display on this VGA output.\n\n### Text Mode\n\nText Mode has a 48 character by 36 line display. Each character cell is 8\npixels wide and 16 pixels high and can take any character from the 8-bit [MS-\nDOS Code Page 850](https://en.wikipedia.org/wiki/Code_page_850) character set,\nand can have any foreground and background colour from the supported set:\n\n* White\n* Red\n* Yellow\n* Green\n* Cyan\n* Blue\n* Magenta\n* Black\n\nThe text buffer takes up `48 x 36 x 2 = 3,456` bytes of SRAM.\n\nThe built-in font is taken from\n[FreeBSD](http://web.mit.edu/freebsd/head/share/syscons/fonts/cp850-8x16.fnt).\nThere's also a second font which implements Teletext block graphics (or\n'sixels').\n\nAny line of text can be displayed in \"double height\" mode, showing either the\ntop-half or bottom-half.\n\nFinally, the display is framed with an 8 pixel border at the sides and a 12\npixel border at the top and bottom, to make everything fit neatly and to help\nwith any minor overscan issues if you use an actual CRT monitor.\n\n### Graphics Mode\n\nGraphics Mode can be enabled and disabled at run-time. It's not enabled by\ndefault because bitmap graphics take up a lot of RAM!\n\nYou can attach a 1-bit-per-pixel graphics buffer that is some multiple of 384\npixels (i.e. 384 bits or 48 bytes) long. This buffer is displayed using line-\ndoubling (i.e. every line is shown twice) so you can go up to 384x288\nresolution maximum, which will fill the screen. Each bit from the bitmap is\ncoloured according to the text cell (see above) it sits on top of, much like a\nZX Spectrum. A full-screen bitmap therefore uses the 3,456 bytes of SRAM from\ntext-mode plus an additional `384x288 / 8 = 13,824` bytes of SRAM.\n\n## Compiling\n\nYou will need to build using Rust Nightly, as we need various experimental\nfeatures for Embedded development that are not yet available in Stable.\n\n```\n$ rustup toolchain install nightly\n$ git clone https://github.com/thejpster/monotron.git\n$ cd monotron\n$ rustup override set nightly\n$ rustup target add thumbv7em-none-eabihf\n$ cargo build --release\n```\n\nTo program the board, you can use lm4flash:\n\n```\n$ cargo build --release\n$ arm-none-eabi-objcopy -O binary ./target/thumbv7em-none-eabihf/release/monotron ./target/thumbv7em-none-eabihf/release/monotron.bin\n$ lm4flash ./target/thumbv7em-none-eabihf/release/monotron.bin\n```\n\nOr you can debug in GDB (which will automatically load the program first):\n\n```\n$ openocd\n\u003cswitch to a different terminal\u003e\n$ cargo run --release\n```\n\nOpenOCD should read our `openocd.cfg` file, which directs it to use the\ncorrect configuration. You may need to run `sudo openocd` if your user doesn't\nhave permission to open the USB device.\n\nTo exit GDB, you may need to press Ctrl-C multiple\ntimes, as it seems it can get a bit stuck.\n\n## Connecting\n\nYou have two options when running a Monotron.\n\n1. You can take a bare Tiva-C Launchpad and wire up various connectors using\n   the pin-outs in the following sections.\n2. You can skip all that make yourself a [Monotron PCB](#monotron-pcb)!\n\n### VGA\n\nYour VGA connector requires five wires:\n\n* Pin 1: Red - connect to PF1 via a 330 Ohm resistor.\n* Pin 2: Green - connect to PB7 via a 330 Ohm resistor.\n* Pin 3: Blue - connect to PD3 via a 330 Ohm resistor.\n* Pin 5: Ground - connect to GND\n* Pin 6: Red Return - connect to GND\n* Pin 7: Green Return - connect to GND\n* Pin 8: Blue Return - connect to GND\n* Pin 13: H-Sync - connect to PB4\n* Pin 14: V-Sync - connect to PB5\n\nI'm using this arrangement using random resistors I found on my desk, and it\nworks for me (although the picture is a bit dim, as it actually produces about\n0.6V peak rather than 0.7V):\n\n```\n-----+\n     |     +------+ 330 Ohm        Co-ax in the VGA cable\nPB7 o+-----|      |------------(o)==================)+\n     |     +------+                                  |\n-----+                                               |\n                                                    +-+\n                                                    | |\n                                                    | | 75 Ohm\n                                                    | | (in Monitor)\n                                                    +-+\n                                                     |\n                                                     o\n                                                    GND\n```\n\nThe 330 Ohm resistor forms a resistive divider with the 75 Ohm resistor in the\nmonitor. This is needed to drop the 3.3V output down to 0.7V. Some monitors\nare more tolerant of over voltage than others. The higher the resistor you\nuse, the less current you pulling out of the GPIO pin (we're just over 8mA\ncurrently, which is a bit high) but the lower the voltage the monitor will see\nand the dimmer your picture will be. Conversely if you lower the resistor,\nmore current will flow but it'll be a brigher picture. I'd save your chip from\ndamage and just wind the brightness control up!\n\nObviously only one channel is shown above - wire up the blue and red channels\nin exactly the same fashion. Finally, don't forget to keep your wires short!\nYou will have noise if you try and send a 20 MHz signal down 10cm of\nunshielded wire.\n\nIn a perfect world, your board would offer a 75 ohm source impendance matching\nthe monitor's 75 ohm impedance, to reduce reflections, but at this resolution\nit doesn't seem to matter. If you want do do that, you'll need to make a\nresistive divider to drop the 3.3V to 1.4V, and then feed that through a\nhigh-bandwidth (\u003e20 MHz) unity-gain amplifier, with a 75 ohm resistor on the\noutput. The pair of 75 ohm resistors will then drop the 1.4V to 0.7V in the\nmonitor.\n\n### UART\n\nMonotron primarily uses UART0, which is converted to USB Serial by the\non-board companion chip on the Tiva-C Launchpad. Connect with your favourite\nSerial terminal at 115,200bps, then send UTF-8 characters and they'll get\nconverted to virtual keyboard input, allowing you to drive the Monotron.\n\nThere's also a second UART (UART1), which has RTS/CTS hardware handshaking\nlines connected (but not DSR, DTR or RI). On the Monotron PCB these are\nbrought out to pin header J8. By fitting six jumpers on this header, the\non-board MAX3232 level shifter is activated, driving RS-232 signals on the\nDE9M connector, J12. This connector is wired as [Data Terminal\nEquipment](https://en.wikipedia.org/wiki/Data_terminal_equipment) or _DTE_ (as\nopposed to [Data Communications\nEquipment](https://en.wikipedia.org/wiki/Data_circuit-terminating_equipment)\nor _DCE_). This means that Monotron transmits data on DE9 pin 3, and it's\ndesigned to connect to Serial AT modems or other peripherals. Other computers\n(like an old IBM PC) and even USB to RS-232 adaptors are most likely wired DTE\nand so to connect one to the Monotron you'll most likely need a [null-modem\ncable](https://en.wikipedia.org/wiki/Null_modem) (one that swaps pins 3 + 4\nand pins 7 + 8).\n\nBonus points to the first person to write a BBS program for Monotron that lets\nyou dial up on a 56k modem.\n\nExtra bonus points to the first person to write an xmodem file transfer\nprogram so you can transfer files from SD card over RS-232 to an xmodem\nutility on your old MS-DOS 3.3 IBM PC.\n\n_Note: The Joystick connector looks the same as the RS232 connector - don't\nmix them up!_\n\nOn the Monotron PCB, a third UART (UART3) is routed through various\nopto-isolators to the MIDI In and MIDI Out ports. The MIDI Through port just\nrepeats everything received on the MIDI In port.\n\nFinally, also on the Monotron PCB, a fourth UART (UART7) connects to a 5V\nAtMega48 which is used as an I/O expander. This microcontroller drives two\nPS/2 ports (one for keyboard, one for the mouse) as well as a full IBM\nPC-style 25-pin parallel printer port.\n\n| Launchpad Pin | Tiva-C Pin | External Pin | Function (from Monotron's point of view) |\n|---------------|------------|--------------|---------------|\n| N/A           | PA0        | N/A          | USB Serial Rx |\n| N/A           | PA1        | N/A          | USB Serial Tx |\n| J4.8          | PD6        | J12 pin 3    | RS-232 Tx     |\n| J4.9          | PD7        | J12 pin 2    | RS-232 Rx     |\n| J4.10         | PF4        | J12 pin 7    | RS-232 RTS    |\n| J3.2          | GND        | J12 pin 8    | RS-232 CTS    |\n| J4.6          | PC6        | J11 pin 4/5  | MIDI In       |\n| J4.7          | PC7        | J9 pin 4/5   | MIDI Out      |\n| N/A           | N/A        | J10 pin 4/5  | MIDI Through  |\n\n### Audio\n\nMonotron can generate 8-bit audio output using PWM on pin PE4. I use the\n[monotron- synth](https://github.com/thejpster/monotron-synth) which has a\nthree-channel wavetable synthesiser which can bleep and bloop with square\nwaves, sine waves, sawtooth waves and generate white noise.\n\nYou'll need to run the pin through a low-pass filter to remove the noise, and\nconnect it to an amplifier as the GPIO pin won't really supply much current.\n\n| Launchpad Pin | Tiva-C Pin | TRS          | Function  |\n|---------------|------------|--------------|-----------|\n| J1.5          | PE4        | Ring/Tip     |Audio Left |\n| J1.6          | PE5        | Tip          |Audio Right|\n| J3.2          | GND        | Sleeve       |Common     |\n\nCurrently audio only comes out as Mono on PE4 (Left). If this is a problem for\nyour amplifier, setting jumper J1 on the PCB to 1-2 allows you to route Audio\nLeft to Sleeve as well as Tip. Setting J1 to 2-3 enables stereo support,\nshould that ever get developed.\n\n### Joystick\n\nThere are five active-low inputs corresponding to Up, Down, Left, Right and\nFire. You can connect these inputs to a standard Atari or Commodore 9-pin\nJoystick as follows:\n\n| Launchpad Pin | Tiva-C Pin | Joystick Pin | Function |\n|---------------|------------|--------------|----------|\n| J3.8          | PE2        | 1            | Up       |\n| J3.9          | PE3        | 2            | Down     |\n| J4.8          | PD6        | 3            | Left     |\n| J4.9          | PD7        | 4            | Right    |\n| J4.10         | PF4        | 6            | Fire     |\n| J3.2          | GND        | 8            | Ground   |\n\nA Sega Master System (tm) controller should work, except you'll only be able\nto use Button 1 not Button 2. A Sega Mega Drive (tm) controller probably won't\nwork because it has more buttons than there are pins, and so uses a 5V powered\nmultiplexer to select between the two banks of buttons. 15-pin Analog PC\njoysticks won't work either.\n\n### SD Card\n\nYou can load programs and data from an SD card, from the first Primary MBR\n(standard old-style MS-DOS) partition, formatted as either FAT16 or FAT32. Use\na standard SD Card SPI breakout adaptor, connected up as follows:\n\n| Launchpad Pin | Tiva-C Pin | Function     |\n|---------------|------------|--------------|\n| J2.10         | PA2        | Clock        |\n| J2.9          | PA3        | Chip Select  |\n| J2.8          | PA4        | MISO/Data Out|\n| J1.8          | PA5        | MOSI/Data In |\n\nSD cards operate at 3.3v so no level shifters are required, but many cards\nwill require a 47k (well, between 10k and 100k) pull-up to 3.3v on all four\ndata pins. If you don't use these pull-ups, the pins float while the Monotron\nis booting, and these fluctuations may upset the SD card, giving you random\ntimeouts and other spurious effects. Some cards tolerate this better than\nothers, so YMMV. If in doubt, just add the pull-ups (they're missing on rev\n0.7.0 of the PCB, but will be on 0.8.0+).\n\nOn the console you use the `mount` command to scan the disk, then `dir` to\nshow the root directory contents. You can also `dload`, `ddump` and `dpage`\ncommands to load, hex-dump and print files to the screen. A program loaded\nwith `dload` can subsequently be executed with the `run` command.\n\n### I2C\n\nThe [Monotron PCB](#monotron-pcb) has an I2C expansion header connected to\n`I2C1`. The PCB can also optionally be fitted with an [Microchip\nMCP7940N](https://www.microchip.com/wwwproducts/en/MCP7940N) battery-backed\nreal time clock chip. Driver support for this chip is TBC.\n\nThe PCB pulls-up the I2C bus to 5V through 4.7k pull-ups. On these particular\npins the TM4C123 happens to be 5V tolerant and so it simply runs the I2C pins\nin open-drain mode without a level shifter.\n\n| Launchpad Pin | Tiva-C Pin | External Pin | Function     |\n|---------------|------------|--------------|--------------|\n| J2.1          | GND        | J6 pin 1     | Ground       |\n| J3.1          | 5V         | J6 pin 2     | 5V Power     |\n| J1.10         | PA7        | J6 pin 3     | SDA          |\n| J1.9          | PA6        | J6 pin 4     | SCL          |\n\n### PS/2 Keyboard\n\nThe initial PS/2 keyboard support sort of worked, but it wasn't reliable I so\ntook it out again. The fundamental problem was that it's really hard to sample\na 10 to 15 kHz incoming synchronous signal without using SPI slave peripheral\n(they're all in use) and while bit-bashing timing-critical video signals at 20\nMHz. Either you drop random key events (leading to missing characters or stuck\nkeys), or the video wobbles every time a key is pressed (like a ZX81). Neither\nwas ideal.\n\nOn the [Monotron PCB](#monotron-pcb) I work around this issue by adding an\nAtmel AtMega48 microcontroller as an I/O expander, connected to [UART](#uart)\n7. Look in the [`avr_kb`](./avr_kb) folder for more information.\n\n__Note:__ There's a bug in the 0.7.0 PCB where both PS/2 connector pinouts are\nmirror image, compared to how they should be. It happened because although the\nconnector drawings said \"Bottom View\" quite clearly, I didn't pay enough\nattention and assumed they were viewed from above! To use the PS/2 connectors,\nthey must be fitted to the underside of the PCB (i.e. opposite to all the\nother connectors). This will be fixed in the next PCB revision.\n\n### MIDI\n\nThe [Monotron PCB](#monotron-pcb) has three 5-pin DIN MIDI ports: In, Out and\nThrough. These are connected to UART 3.\n\n### Parallel Printer Port\n\nThe 25-pin Parallel Printer Port is connected to the Monotron PCB's AtMega48\nI/O controller. You send commands to the AtMega to get it to drive the printer\nport. Currently only SPP (classic mono-directional support as found on the\noriginal IBM PC) is planned for support. Support for the fancier EPP and ECP\nmodes is TBD.\n\n## Monotron PCB\n\nThere's now a PCB! It features:\n\n* 2x20 pin headers, to mate with the TM4C123 Launchpad (other Launchpads like\n  the TM4C129 and MSP430 have not been tested and almost certainly won't work)\n* 5V power jack (2.1mm barrel jack, centre +ve)\n* [VGA](#vga) port (DE15HD female)\n* Atari/Commodore [joystick](#joystick) port (DE9 male)\n* [Micro-SD Card](#sd-card) slot\n* [3.5mm stereo line out](#audio)\n* [RS-232](#uart) port (DE9 male)\n* 2.54mm (100 mil) jumpers to disconnect the RS232 driver and allow you to\n  connect a 3.3v FTDI type TTL serial cable instead.\n* [MIDI](#midi) In, Out and Through ports, with opto-isolation (5-pin DIN)\n* 4-pin 2.54mm pitch (100 mil) [I2C](#i2c) expansion header (GND, 5V, SDA, SCL)\n* Microchip MCP7940N I2C Real-Time Clock with battery back-up\n* AtMega48 microcontroller, controlling:\n  * IBM PC style parallel printer port (DB25 female)\n  * PS/2 Keyboard port (6-pin mini-DIN)\n  * PS/2 Mouse port (6-pin mini-DIN)\n\nSee the [pcb](./pcb) folder for Kicad files, Gerbers and PDF Schematics. If\nyou want to buy a PCB (with or without a kit of parts) send a message to\n@therealjpster on Twitter, or via my Github e-mail. Rev 0.7.0 has some rough\nedges, but I'm working on it.\n\n## Running\n\nWhen running, a simple command driven interface is presented. Commands can be\nentered over serial, or using a PS/2 keyboard. Commands are split on\nwhitespace and then interpreted based on the left-most word. Enter the command\n'help' to see a list of commands. Some commands place you in to a sub-menu -\nuse 'exit' to return to the previous menu.\n\n## Loading apps\n\nApplications can be compiled and loaded into RAM for exection. They must be\nlinked to run from address `0x2000_2000` and take less than 24 KiB for all\ncode and data combined. See the table below:\n\n| Address     | Length  | Description  |\n|-------------|---------|--------------|\n| 0x0000_0000 | 256 KiB | OS Code      |\n| 0x2000_0000 | 8 KiB   | OS Data      |\n| 0x2000_2000 | 24 KiB  | Application  |\n\nThe first four bytes of the image must be the address of the start function,\nwith prototype `fn start(const struct callbacks_t* callbacks) -\u003e int32`. Apart\nfrom that, applications are free to apportion the remaining 24,572 bytes as\nthey see fit.\n\n*Note:* The application does not need to provide a stack region - the Monotron\nROM will handle that using the system stack.\n\nThe callback structure supplied to the application's entry function is defined\nin `api.rs`, but in C looks like:\n\n```C\nstruct callbacks_t {\n    int32_t (*putchar)(void* p_context, char ch);\n    int32_t (*puts)(void* p_context, const char*);\n    int32_t (*readc)(void* p_context);\n    void (*wfvbi)(void* p_context);\n    int32_t (*kbhit)(void* p_context);\n    void (*move_cursor)(void* p_context, unsigned char row, unsigned char col);\n    int32_t (*play)(void* p_context, uint32_t frequency, uint8_t channel, uint8_t waveform, uint8_t volume);\n    void (*change_font)(void* p_context, uint32_t mode, const void* p_font);\n    uint8_t (*get_joystick)(void* p_context);\n    void (*set_cursor_visible)(void* p_context, uint8_t visible);\n};\n```\n\nThe C functions exported to the apps are:\n\n* `puts` - print an 8-bit string (certain escape sequences are understood).\n  Note that unlike the C routine of the same name, this function does not\n  append a newline automatically. It is more like `fputs(s, stdout)`.\n* `putchar` - print an 8-bit character\n* `readc` - blocking wait for keyboard/serial input\n* `wfvbi` - Wait For next Vertical Blanking Interval\n* `kbhit` - return 1 if a key has been pressed (and so `readc` won't block),\n  else return 0\n* `move_cursor` - move the cursor to change where the next print goes\n* `play` - play a note on one of the synthesizer channels\n* `change_font` - changes the font used on screen to the normal CodePage 850,\n  the Teletext font, or a custom font supplied by the application.\n* `get_joystick` - returns the current state of the joystick input. Bits 0-4\n  correspond to Fire, Right, Left, Down and Up respectively.\n* `set_cursor_visible` - Pass 0 to disable the `_` cursor, or non-zero to enable it.\n\nYou can use the `upload` Python script in this repo to upload binary images\ninto RAM, or you can use the `dload` to load them from SD card.\n\nSee [monotron-apps](https://github.com/thejpster/monotron-apps) for example\napps which will run from Monotron's RAM, along with a wrapper which makes\nusing the callbacks as simple as using a normal C library.\n\n## Unreleased changes (will be 0.10.0)\n\n* Fixed video interrupt jitter by entering WFI before drawing pixels.\n* Updated VGA framebuffer callback API\n\n## Changelog\n\n* Version 0.9.2 - Updated menu interface crate\n* Version 0.9.0 - Added I2C commands and support for the AtMega keyboard\n  controller (WIP) on the Monotron PCB.\n* Version 0.8.0 - Added cursor support to ABI. Added basic SD Card support\n  (read-only).\n* Version 0.7.0 - Move application RAM to 0x2000_2000. Added cursor support.\n  Moved callback pointer.\n* Version 0.6.3 - Fixed Joystick support.\n* Version 0.6.2 - Add Joystick support.\n* Version 0.6.1 - Add Teletext font and support for font-switching in apps.\n* Version 0.6.0 - Added sound and support for apps running from RAM. Removed\n  PS/2 keyboard support.\n* Version 0.5.0 - Added 1bpp graphics mode.\n* Version 0.4.0 - Added PS/2 keyboard support.\n* Version 0.3.0 - Backspace works.\n* Version 0.2.0 - Switch to a text buffer to save RAM. Basic animations work.\n* Version 0.1.0 - First release. VGA output works but menu is full of dummy\n  commands and there's no keyboard input.\n\n## License\n\nLicensed under either of\n\n- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or\n  http://www.apache.org/licenses/LICENSE-2.0)\n\n- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)\n\nat your option.\n\n## Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally\nsubmitted for inclusion in the work by you, as defined in the Apache-2.0\nlicense, shall be dual licensed as above, without any additional terms or\nconditions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthejpster%2Fmonotron","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthejpster%2Fmonotron","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthejpster%2Fmonotron/lists"}