Tilengine by Megamarc is a free, cross-platform software rendering engine for retro-style 2D games using tilemaps, sprites and palettes. Many oldschool tricks are supported such as palette-based animation and per-scanline raster effects. The implementation is efficient and can run well even on a Raspberry Pi.
Last month I put together nim-tilengine, allowing you to use Tilengine with the Nim programming language.
These bindings strip away all the cruft from the C API, leading to code that's shorter and more readable than even the official Python bindings, while keeping native performance!
Quick Example

import tilengine
let engine = init(320, 180, numLayers = 4, numSprites = 128, numAnimations = 128)
let map = loadTilemap("assets/map.tmx")
Layer(0).setTilemap(map)
createWindow()
while processWindow():
drawFrame()
map.delete()
deleteWindow()
deinit()