6502 emulator for Commodore 64 ROMs, serial terminal edition for MBED. Recommend terminal echo on, line edit on, caps lock, 115200bps, implicit carriage return on newline, currently non-buffered so don't paste lots of stuff

More details at:

[https://github.com/davervw] [https://techwithdave.davevw.com/2020/03/simple-emu-c64.html]

Revision:
8:519febdce8db
Parent:
7:f49fa56672d8
Child:
9:b4293b01083b
--- a/emuc64.cpp	Mon Apr 13 05:13:26 2020 +0000
+++ b/emuc64.cpp	Wed Apr 15 05:15:07 2020 +0000
@@ -742,7 +742,138 @@
 '\xF6','\x6C','\x28','\x03','\x6C','\x2A','\x03','\x6C','\x2C','\x03','\x4C','\x9B','\xF6','\x4C','\x05','\xE5','\x4C','\x0A','\xE5','\x4C','\x00','\xE5','\x52','\x52','\x42','\x59','\x43','\xFE','\xE2','\xFC','\x48','\xFF'
 };
 
-static byte ram[24 * 1024];
+const byte chargen_rom[4 * 1024] = {
+'\x3C','\x66','\x6E','\x6E','\x60','\x62','\x3C','\x00','\x18','\x3C','\x66','\x7E','\x66','\x66','\x66','\x00','\x7C','\x66','\x66','\x7C','\x66','\x66','\x7C','\x00','\x3C','\x66','\x60','\x60','\x60','\x66','\x3C','\x00',
+'\x78','\x6C','\x66','\x66','\x66','\x6C','\x78','\x00','\x7E','\x60','\x60','\x78','\x60','\x60','\x7E','\x00','\x7E','\x60','\x60','\x78','\x60','\x60','\x60','\x00','\x3C','\x66','\x60','\x6E','\x66','\x66','\x3C','\x00',
+'\x66','\x66','\x66','\x7E','\x66','\x66','\x66','\x00','\x3C','\x18','\x18','\x18','\x18','\x18','\x3C','\x00','\x1E','\x0C','\x0C','\x0C','\x0C','\x6C','\x38','\x00','\x66','\x6C','\x78','\x70','\x78','\x6C','\x66','\x00',
+'\x60','\x60','\x60','\x60','\x60','\x60','\x7E','\x00','\x63','\x77','\x7F','\x6B','\x63','\x63','\x63','\x00','\x66','\x76','\x7E','\x7E','\x6E','\x66','\x66','\x00','\x3C','\x66','\x66','\x66','\x66','\x66','\x3C','\x00',
+'\x7C','\x66','\x66','\x7C','\x60','\x60','\x60','\x00','\x3C','\x66','\x66','\x66','\x66','\x3C','\x0E','\x00','\x7C','\x66','\x66','\x7C','\x78','\x6C','\x66','\x00','\x3C','\x66','\x60','\x3C','\x06','\x66','\x3C','\x00',
+'\x7E','\x18','\x18','\x18','\x18','\x18','\x18','\x00','\x66','\x66','\x66','\x66','\x66','\x66','\x3C','\x00','\x66','\x66','\x66','\x66','\x66','\x3C','\x18','\x00','\x63','\x63','\x63','\x6B','\x7F','\x77','\x63','\x00',
+'\x66','\x66','\x3C','\x18','\x3C','\x66','\x66','\x00','\x66','\x66','\x66','\x3C','\x18','\x18','\x18','\x00','\x7E','\x06','\x0C','\x18','\x30','\x60','\x7E','\x00','\x3C','\x30','\x30','\x30','\x30','\x30','\x3C','\x00',
+'\x0C','\x12','\x30','\x7C','\x30','\x62','\xFC','\x00','\x3C','\x0C','\x0C','\x0C','\x0C','\x0C','\x3C','\x00','\x00','\x18','\x3C','\x7E','\x18','\x18','\x18','\x18','\x00','\x10','\x30','\x7F','\x7F','\x30','\x10','\x00',
+'\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\x18','\x18','\x18','\x00','\x00','\x18','\x00','\x66','\x66','\x66','\x00','\x00','\x00','\x00','\x00','\x66','\x66','\xFF','\x66','\xFF','\x66','\x66','\x00',
+'\x18','\x3E','\x60','\x3C','\x06','\x7C','\x18','\x00','\x62','\x66','\x0C','\x18','\x30','\x66','\x46','\x00','\x3C','\x66','\x3C','\x38','\x67','\x66','\x3F','\x00','\x06','\x0C','\x18','\x00','\x00','\x00','\x00','\x00',
+'\x0C','\x18','\x30','\x30','\x30','\x18','\x0C','\x00','\x30','\x18','\x0C','\x0C','\x0C','\x18','\x30','\x00','\x00','\x66','\x3C','\xFF','\x3C','\x66','\x00','\x00','\x00','\x18','\x18','\x7E','\x18','\x18','\x00','\x00',
+'\x00','\x00','\x00','\x00','\x00','\x18','\x18','\x30','\x00','\x00','\x00','\x7E','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\x18','\x00','\x00','\x03','\x06','\x0C','\x18','\x30','\x60','\x00',
+'\x3C','\x66','\x6E','\x76','\x66','\x66','\x3C','\x00','\x18','\x18','\x38','\x18','\x18','\x18','\x7E','\x00','\x3C','\x66','\x06','\x0C','\x30','\x60','\x7E','\x00','\x3C','\x66','\x06','\x1C','\x06','\x66','\x3C','\x00',
+'\x06','\x0E','\x1E','\x66','\x7F','\x06','\x06','\x00','\x7E','\x60','\x7C','\x06','\x06','\x66','\x3C','\x00','\x3C','\x66','\x60','\x7C','\x66','\x66','\x3C','\x00','\x7E','\x66','\x0C','\x18','\x18','\x18','\x18','\x00',
+'\x3C','\x66','\x66','\x3C','\x66','\x66','\x3C','\x00','\x3C','\x66','\x66','\x3E','\x06','\x66','\x3C','\x00','\x00','\x00','\x18','\x00','\x00','\x18','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x18','\x18','\x30',
+'\x0E','\x18','\x30','\x60','\x30','\x18','\x0E','\x00','\x00','\x00','\x7E','\x00','\x7E','\x00','\x00','\x00','\x70','\x18','\x0C','\x06','\x0C','\x18','\x70','\x00','\x3C','\x66','\x06','\x0C','\x18','\x00','\x18','\x00',
+'\x00','\x00','\x00','\xFF','\xFF','\x00','\x00','\x00','\x08','\x1C','\x3E','\x7F','\x7F','\x1C','\x3E','\x00','\x18','\x18','\x18','\x18','\x18','\x18','\x18','\x18','\x00','\x00','\x00','\xFF','\xFF','\x00','\x00','\x00',
+'\x00','\x00','\xFF','\xFF','\x00','\x00','\x00','\x00','\x00','\xFF','\xFF','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xFF','\xFF','\x00','\x00','\x30','\x30','\x30','\x30','\x30','\x30','\x30','\x30',
+'\x0C','\x0C','\x0C','\x0C','\x0C','\x0C','\x0C','\x0C','\x00','\x00','\x00','\xE0','\xF0','\x38','\x18','\x18','\x18','\x18','\x1C','\x0F','\x07','\x00','\x00','\x00','\x18','\x18','\x38','\xF0','\xE0','\x00','\x00','\x00',
+'\xC0','\xC0','\xC0','\xC0','\xC0','\xC0','\xFF','\xFF','\xC0','\xE0','\x70','\x38','\x1C','\x0E','\x07','\x03','\x03','\x07','\x0E','\x1C','\x38','\x70','\xE0','\xC0','\xFF','\xFF','\xC0','\xC0','\xC0','\xC0','\xC0','\xC0',
+'\xFF','\xFF','\x03','\x03','\x03','\x03','\x03','\x03','\x00','\x3C','\x7E','\x7E','\x7E','\x7E','\x3C','\x00','\x00','\x00','\x00','\x00','\x00','\xFF','\xFF','\x00','\x36','\x7F','\x7F','\x7F','\x3E','\x1C','\x08','\x00',
+'\x60','\x60','\x60','\x60','\x60','\x60','\x60','\x60','\x00','\x00','\x00','\x07','\x0F','\x1C','\x18','\x18','\xC3','\xE7','\x7E','\x3C','\x3C','\x7E','\xE7','\xC3','\x00','\x3C','\x7E','\x66','\x66','\x7E','\x3C','\x00',
+'\x18','\x18','\x66','\x66','\x18','\x18','\x3C','\x00','\x06','\x06','\x06','\x06','\x06','\x06','\x06','\x06','\x08','\x1C','\x3E','\x7F','\x3E','\x1C','\x08','\x00','\x18','\x18','\x18','\xFF','\xFF','\x18','\x18','\x18',
+'\xC0','\xC0','\x30','\x30','\xC0','\xC0','\x30','\x30','\x18','\x18','\x18','\x18','\x18','\x18','\x18','\x18','\x00','\x00','\x03','\x3E','\x76','\x36','\x36','\x00','\xFF','\x7F','\x3F','\x1F','\x0F','\x07','\x03','\x01',
+'\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xF0','\xF0','\xF0','\xF0','\xF0','\xF0','\xF0','\xF0','\x00','\x00','\x00','\x00','\xFF','\xFF','\xFF','\xFF','\xFF','\x00','\x00','\x00','\x00','\x00','\x00','\x00',
+'\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xFF','\xC0','\xC0','\xC0','\xC0','\xC0','\xC0','\xC0','\xC0','\xCC','\xCC','\x33','\x33','\xCC','\xCC','\x33','\x33','\x03','\x03','\x03','\x03','\x03','\x03','\x03','\x03',
+'\x00','\x00','\x00','\x00','\xCC','\xCC','\x33','\x33','\xFF','\xFE','\xFC','\xF8','\xF0','\xE0','\xC0','\x80','\x03','\x03','\x03','\x03','\x03','\x03','\x03','\x03','\x18','\x18','\x18','\x1F','\x1F','\x18','\x18','\x18',
+'\x00','\x00','\x00','\x00','\x0F','\x0F','\x0F','\x0F','\x18','\x18','\x18','\x1F','\x1F','\x00','\x00','\x00','\x00','\x00','\x00','\xF8','\xF8','\x18','\x18','\x18','\x00','\x00','\x00','\x00','\x00','\x00','\xFF','\xFF',
+'\x00','\x00','\x00','\x1F','\x1F','\x18','\x18','\x18','\x18','\x18','\x18','\xFF','\xFF','\x00','\x00','\x00','\x00','\x00','\x00','\xFF','\xFF','\x18','\x18','\x18','\x18','\x18','\x18','\xF8','\xF8','\x18','\x18','\x18',
+'\xC0','\xC0','\xC0','\xC0','\xC0','\xC0','\xC0','\xC0','\xE0','\xE0','\xE0','\xE0','\xE0','\xE0','\xE0','\xE0','\x07','\x07','\x07','\x07','\x07','\x07','\x07','\x07','\xFF','\xFF','\x00','\x00','\x00','\x00','\x00','\x00',
+'\xFF','\xFF','\xFF','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xFF','\xFF','\xFF','\x03','\x03','\x03','\x03','\x03','\x03','\xFF','\xFF','\x00','\x00','\x00','\x00','\xF0','\xF0','\xF0','\xF0',
+'\x0F','\x0F','\x0F','\x0F','\x00','\x00','\x00','\x00','\x18','\x18','\x18','\xF8','\xF8','\x00','\x00','\x00','\xF0','\xF0','\xF0','\xF0','\x00','\x00','\x00','\x00','\xF0','\xF0','\xF0','\xF0','\x0F','\x0F','\x0F','\x0F',
+'\xC3','\x99','\x91','\x91','\x9F','\x99','\xC3','\xFF','\xE7','\xC3','\x99','\x81','\x99','\x99','\x99','\xFF','\x83','\x99','\x99','\x83','\x99','\x99','\x83','\xFF','\xC3','\x99','\x9F','\x9F','\x9F','\x99','\xC3','\xFF',
+'\x87','\x93','\x99','\x99','\x99','\x93','\x87','\xFF','\x81','\x9F','\x9F','\x87','\x9F','\x9F','\x81','\xFF','\x81','\x9F','\x9F','\x87','\x9F','\x9F','\x9F','\xFF','\xC3','\x99','\x9F','\x91','\x99','\x99','\xC3','\xFF',
+'\x99','\x99','\x99','\x81','\x99','\x99','\x99','\xFF','\xC3','\xE7','\xE7','\xE7','\xE7','\xE7','\xC3','\xFF','\xE1','\xF3','\xF3','\xF3','\xF3','\x93','\xC7','\xFF','\x99','\x93','\x87','\x8F','\x87','\x93','\x99','\xFF',
+'\x9F','\x9F','\x9F','\x9F','\x9F','\x9F','\x81','\xFF','\x9C','\x88','\x80','\x94','\x9C','\x9C','\x9C','\xFF','\x99','\x89','\x81','\x81','\x91','\x99','\x99','\xFF','\xC3','\x99','\x99','\x99','\x99','\x99','\xC3','\xFF',
+'\x83','\x99','\x99','\x83','\x9F','\x9F','\x9F','\xFF','\xC3','\x99','\x99','\x99','\x99','\xC3','\xF1','\xFF','\x83','\x99','\x99','\x83','\x87','\x93','\x99','\xFF','\xC3','\x99','\x9F','\xC3','\xF9','\x99','\xC3','\xFF',
+'\x81','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\xFF','\x99','\x99','\x99','\x99','\x99','\x99','\xC3','\xFF','\x99','\x99','\x99','\x99','\x99','\xC3','\xE7','\xFF','\x9C','\x9C','\x9C','\x94','\x80','\x88','\x9C','\xFF',
+'\x99','\x99','\xC3','\xE7','\xC3','\x99','\x99','\xFF','\x99','\x99','\x99','\xC3','\xE7','\xE7','\xE7','\xFF','\x81','\xF9','\xF3','\xE7','\xCF','\x9F','\x81','\xFF','\xC3','\xCF','\xCF','\xCF','\xCF','\xCF','\xC3','\xFF',
+'\xF3','\xED','\xCF','\x83','\xCF','\x9D','\x03','\xFF','\xC3','\xF3','\xF3','\xF3','\xF3','\xF3','\xC3','\xFF','\xFF','\xE7','\xC3','\x81','\xE7','\xE7','\xE7','\xE7','\xFF','\xEF','\xCF','\x80','\x80','\xCF','\xEF','\xFF',
+'\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xE7','\xE7','\xE7','\xE7','\xFF','\xFF','\xE7','\xFF','\x99','\x99','\x99','\xFF','\xFF','\xFF','\xFF','\xFF','\x99','\x99','\x00','\x99','\x00','\x99','\x99','\xFF',
+'\xE7','\xC1','\x9F','\xC3','\xF9','\x83','\xE7','\xFF','\x9D','\x99','\xF3','\xE7','\xCF','\x99','\xB9','\xFF','\xC3','\x99','\xC3','\xC7','\x98','\x99','\xC0','\xFF','\xF9','\xF3','\xE7','\xFF','\xFF','\xFF','\xFF','\xFF',
+'\xF3','\xE7','\xCF','\xCF','\xCF','\xE7','\xF3','\xFF','\xCF','\xE7','\xF3','\xF3','\xF3','\xE7','\xCF','\xFF','\xFF','\x99','\xC3','\x00','\xC3','\x99','\xFF','\xFF','\xFF','\xE7','\xE7','\x81','\xE7','\xE7','\xFF','\xFF',
+'\xFF','\xFF','\xFF','\xFF','\xFF','\xE7','\xE7','\xCF','\xFF','\xFF','\xFF','\x81','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xE7','\xE7','\xFF','\xFF','\xFC','\xF9','\xF3','\xE7','\xCF','\x9F','\xFF',
+'\xC3','\x99','\x91','\x89','\x99','\x99','\xC3','\xFF','\xE7','\xE7','\xC7','\xE7','\xE7','\xE7','\x81','\xFF','\xC3','\x99','\xF9','\xF3','\xCF','\x9F','\x81','\xFF','\xC3','\x99','\xF9','\xE3','\xF9','\x99','\xC3','\xFF',
+'\xF9','\xF1','\xE1','\x99','\x80','\xF9','\xF9','\xFF','\x81','\x9F','\x83','\xF9','\xF9','\x99','\xC3','\xFF','\xC3','\x99','\x9F','\x83','\x99','\x99','\xC3','\xFF','\x81','\x99','\xF3','\xE7','\xE7','\xE7','\xE7','\xFF',
+'\xC3','\x99','\x99','\xC3','\x99','\x99','\xC3','\xFF','\xC3','\x99','\x99','\xC1','\xF9','\x99','\xC3','\xFF','\xFF','\xFF','\xE7','\xFF','\xFF','\xE7','\xFF','\xFF','\xFF','\xFF','\xE7','\xFF','\xFF','\xE7','\xE7','\xCF',
+'\xF1','\xE7','\xCF','\x9F','\xCF','\xE7','\xF1','\xFF','\xFF','\xFF','\x81','\xFF','\x81','\xFF','\xFF','\xFF','\x8F','\xE7','\xF3','\xF9','\xF3','\xE7','\x8F','\xFF','\xC3','\x99','\xF9','\xF3','\xE7','\xFF','\xE7','\xFF',
+'\xFF','\xFF','\xFF','\x00','\x00','\xFF','\xFF','\xFF','\xF7','\xE3','\xC1','\x80','\x80','\xE3','\xC1','\xFF','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\xFF','\xFF','\xFF','\x00','\x00','\xFF','\xFF','\xFF',
+'\xFF','\xFF','\x00','\x00','\xFF','\xFF','\xFF','\xFF','\xFF','\x00','\x00','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\x00','\x00','\xFF','\xFF','\xCF','\xCF','\xCF','\xCF','\xCF','\xCF','\xCF','\xCF',
+'\xF3','\xF3','\xF3','\xF3','\xF3','\xF3','\xF3','\xF3','\xFF','\xFF','\xFF','\x1F','\x0F','\xC7','\xE7','\xE7','\xE7','\xE7','\xE3','\xF0','\xF8','\xFF','\xFF','\xFF','\xE7','\xE7','\xC7','\x0F','\x1F','\xFF','\xFF','\xFF',
+'\x3F','\x3F','\x3F','\x3F','\x3F','\x3F','\x00','\x00','\x3F','\x1F','\x8F','\xC7','\xE3','\xF1','\xF8','\xFC','\xFC','\xF8','\xF1','\xE3','\xC7','\x8F','\x1F','\x3F','\x00','\x00','\x3F','\x3F','\x3F','\x3F','\x3F','\x3F',
+'\x00','\x00','\xFC','\xFC','\xFC','\xFC','\xFC','\xFC','\xFF','\xC3','\x81','\x81','\x81','\x81','\xC3','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\x00','\x00','\xFF','\xC9','\x80','\x80','\x80','\xC1','\xE3','\xF7','\xFF',
+'\x9F','\x9F','\x9F','\x9F','\x9F','\x9F','\x9F','\x9F','\xFF','\xFF','\xFF','\xF8','\xF0','\xE3','\xE7','\xE7','\x3C','\x18','\x81','\xC3','\xC3','\x81','\x18','\x3C','\xFF','\xC3','\x81','\x99','\x99','\x81','\xC3','\xFF',
+'\xE7','\xE7','\x99','\x99','\xE7','\xE7','\xC3','\xFF','\xF9','\xF9','\xF9','\xF9','\xF9','\xF9','\xF9','\xF9','\xF7','\xE3','\xC1','\x80','\xC1','\xE3','\xF7','\xFF','\xE7','\xE7','\xE7','\x00','\x00','\xE7','\xE7','\xE7',
+'\x3F','\x3F','\xCF','\xCF','\x3F','\x3F','\xCF','\xCF','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\xFF','\xFF','\xFC','\xC1','\x89','\xC9','\xC9','\xFF','\x00','\x80','\xC0','\xE0','\xF0','\xF8','\xFC','\xFE',
+'\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\x0F','\x0F','\x0F','\x0F','\x0F','\x0F','\x0F','\x0F','\xFF','\xFF','\xFF','\xFF','\x00','\x00','\x00','\x00','\x00','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF',
+'\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\x00','\x3F','\x3F','\x3F','\x3F','\x3F','\x3F','\x3F','\x3F','\x33','\x33','\xCC','\xCC','\x33','\x33','\xCC','\xCC','\xFC','\xFC','\xFC','\xFC','\xFC','\xFC','\xFC','\xFC',
+'\xFF','\xFF','\xFF','\xFF','\x33','\x33','\xCC','\xCC','\x00','\x01','\x03','\x07','\x0F','\x1F','\x3F','\x7F','\xFC','\xFC','\xFC','\xFC','\xFC','\xFC','\xFC','\xFC','\xE7','\xE7','\xE7','\xE0','\xE0','\xE7','\xE7','\xE7',
+'\xFF','\xFF','\xFF','\xFF','\xF0','\xF0','\xF0','\xF0','\xE7','\xE7','\xE7','\xE0','\xE0','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\x07','\x07','\xE7','\xE7','\xE7','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\x00','\x00',
+'\xFF','\xFF','\xFF','\xE0','\xE0','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\x00','\x00','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\x00','\x00','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\x07','\x07','\xE7','\xE7','\xE7',
+'\x3F','\x3F','\x3F','\x3F','\x3F','\x3F','\x3F','\x3F','\x1F','\x1F','\x1F','\x1F','\x1F','\x1F','\x1F','\x1F','\xF8','\xF8','\xF8','\xF8','\xF8','\xF8','\xF8','\xF8','\x00','\x00','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF',
+'\x00','\x00','\x00','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\x00','\x00','\x00','\xFC','\xFC','\xFC','\xFC','\xFC','\xFC','\x00','\x00','\xFF','\xFF','\xFF','\xFF','\x0F','\x0F','\x0F','\x0F',
+'\xF0','\xF0','\xF0','\xF0','\xFF','\xFF','\xFF','\xFF','\xE7','\xE7','\xE7','\x07','\x07','\xFF','\xFF','\xFF','\x0F','\x0F','\x0F','\x0F','\xFF','\xFF','\xFF','\xFF','\x0F','\x0F','\x0F','\x0F','\xF0','\xF0','\xF0','\xF0',
+'\x3C','\x66','\x6E','\x6E','\x60','\x62','\x3C','\x00','\x00','\x00','\x3C','\x06','\x3E','\x66','\x3E','\x00','\x00','\x60','\x60','\x7C','\x66','\x66','\x7C','\x00','\x00','\x00','\x3C','\x60','\x60','\x60','\x3C','\x00',
+'\x00','\x06','\x06','\x3E','\x66','\x66','\x3E','\x00','\x00','\x00','\x3C','\x66','\x7E','\x60','\x3C','\x00','\x00','\x0E','\x18','\x3E','\x18','\x18','\x18','\x00','\x00','\x00','\x3E','\x66','\x66','\x3E','\x06','\x7C',
+'\x00','\x60','\x60','\x7C','\x66','\x66','\x66','\x00','\x00','\x18','\x00','\x38','\x18','\x18','\x3C','\x00','\x00','\x06','\x00','\x06','\x06','\x06','\x06','\x3C','\x00','\x60','\x60','\x6C','\x78','\x6C','\x66','\x00',
+'\x00','\x38','\x18','\x18','\x18','\x18','\x3C','\x00','\x00','\x00','\x66','\x7F','\x7F','\x6B','\x63','\x00','\x00','\x00','\x7C','\x66','\x66','\x66','\x66','\x00','\x00','\x00','\x3C','\x66','\x66','\x66','\x3C','\x00',
+'\x00','\x00','\x7C','\x66','\x66','\x7C','\x60','\x60','\x00','\x00','\x3E','\x66','\x66','\x3E','\x06','\x06','\x00','\x00','\x7C','\x66','\x60','\x60','\x60','\x00','\x00','\x00','\x3E','\x60','\x3C','\x06','\x7C','\x00',
+'\x00','\x18','\x7E','\x18','\x18','\x18','\x0E','\x00','\x00','\x00','\x66','\x66','\x66','\x66','\x3E','\x00','\x00','\x00','\x66','\x66','\x66','\x3C','\x18','\x00','\x00','\x00','\x63','\x6B','\x7F','\x3E','\x36','\x00',
+'\x00','\x00','\x66','\x3C','\x18','\x3C','\x66','\x00','\x00','\x00','\x66','\x66','\x66','\x3E','\x0C','\x78','\x00','\x00','\x7E','\x0C','\x18','\x30','\x7E','\x00','\x3C','\x30','\x30','\x30','\x30','\x30','\x3C','\x00',
+'\x0C','\x12','\x30','\x7C','\x30','\x62','\xFC','\x00','\x3C','\x0C','\x0C','\x0C','\x0C','\x0C','\x3C','\x00','\x00','\x18','\x3C','\x7E','\x18','\x18','\x18','\x18','\x00','\x10','\x30','\x7F','\x7F','\x30','\x10','\x00',
+'\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\x18','\x18','\x18','\x00','\x00','\x18','\x00','\x66','\x66','\x66','\x00','\x00','\x00','\x00','\x00','\x66','\x66','\xFF','\x66','\xFF','\x66','\x66','\x00',
+'\x18','\x3E','\x60','\x3C','\x06','\x7C','\x18','\x00','\x62','\x66','\x0C','\x18','\x30','\x66','\x46','\x00','\x3C','\x66','\x3C','\x38','\x67','\x66','\x3F','\x00','\x06','\x0C','\x18','\x00','\x00','\x00','\x00','\x00',
+'\x0C','\x18','\x30','\x30','\x30','\x18','\x0C','\x00','\x30','\x18','\x0C','\x0C','\x0C','\x18','\x30','\x00','\x00','\x66','\x3C','\xFF','\x3C','\x66','\x00','\x00','\x00','\x18','\x18','\x7E','\x18','\x18','\x00','\x00',
+'\x00','\x00','\x00','\x00','\x00','\x18','\x18','\x30','\x00','\x00','\x00','\x7E','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\x18','\x00','\x00','\x03','\x06','\x0C','\x18','\x30','\x60','\x00',
+'\x3C','\x66','\x6E','\x76','\x66','\x66','\x3C','\x00','\x18','\x18','\x38','\x18','\x18','\x18','\x7E','\x00','\x3C','\x66','\x06','\x0C','\x30','\x60','\x7E','\x00','\x3C','\x66','\x06','\x1C','\x06','\x66','\x3C','\x00',
+'\x06','\x0E','\x1E','\x66','\x7F','\x06','\x06','\x00','\x7E','\x60','\x7C','\x06','\x06','\x66','\x3C','\x00','\x3C','\x66','\x60','\x7C','\x66','\x66','\x3C','\x00','\x7E','\x66','\x0C','\x18','\x18','\x18','\x18','\x00',
+'\x3C','\x66','\x66','\x3C','\x66','\x66','\x3C','\x00','\x3C','\x66','\x66','\x3E','\x06','\x66','\x3C','\x00','\x00','\x00','\x18','\x00','\x00','\x18','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x18','\x18','\x30',
+'\x0E','\x18','\x30','\x60','\x30','\x18','\x0E','\x00','\x00','\x00','\x7E','\x00','\x7E','\x00','\x00','\x00','\x70','\x18','\x0C','\x06','\x0C','\x18','\x70','\x00','\x3C','\x66','\x06','\x0C','\x18','\x00','\x18','\x00',
+'\x00','\x00','\x00','\xFF','\xFF','\x00','\x00','\x00','\x18','\x3C','\x66','\x7E','\x66','\x66','\x66','\x00','\x7C','\x66','\x66','\x7C','\x66','\x66','\x7C','\x00','\x3C','\x66','\x60','\x60','\x60','\x66','\x3C','\x00',
+'\x78','\x6C','\x66','\x66','\x66','\x6C','\x78','\x00','\x7E','\x60','\x60','\x78','\x60','\x60','\x7E','\x00','\x7E','\x60','\x60','\x78','\x60','\x60','\x60','\x00','\x3C','\x66','\x60','\x6E','\x66','\x66','\x3C','\x00',
+'\x66','\x66','\x66','\x7E','\x66','\x66','\x66','\x00','\x3C','\x18','\x18','\x18','\x18','\x18','\x3C','\x00','\x1E','\x0C','\x0C','\x0C','\x0C','\x6C','\x38','\x00','\x66','\x6C','\x78','\x70','\x78','\x6C','\x66','\x00',
+'\x60','\x60','\x60','\x60','\x60','\x60','\x7E','\x00','\x63','\x77','\x7F','\x6B','\x63','\x63','\x63','\x00','\x66','\x76','\x7E','\x7E','\x6E','\x66','\x66','\x00','\x3C','\x66','\x66','\x66','\x66','\x66','\x3C','\x00',
+'\x7C','\x66','\x66','\x7C','\x60','\x60','\x60','\x00','\x3C','\x66','\x66','\x66','\x66','\x3C','\x0E','\x00','\x7C','\x66','\x66','\x7C','\x78','\x6C','\x66','\x00','\x3C','\x66','\x60','\x3C','\x06','\x66','\x3C','\x00',
+'\x7E','\x18','\x18','\x18','\x18','\x18','\x18','\x00','\x66','\x66','\x66','\x66','\x66','\x66','\x3C','\x00','\x66','\x66','\x66','\x66','\x66','\x3C','\x18','\x00','\x63','\x63','\x63','\x6B','\x7F','\x77','\x63','\x00',
+'\x66','\x66','\x3C','\x18','\x3C','\x66','\x66','\x00','\x66','\x66','\x66','\x3C','\x18','\x18','\x18','\x00','\x7E','\x06','\x0C','\x18','\x30','\x60','\x7E','\x00','\x18','\x18','\x18','\xFF','\xFF','\x18','\x18','\x18',
+'\xC0','\xC0','\x30','\x30','\xC0','\xC0','\x30','\x30','\x18','\x18','\x18','\x18','\x18','\x18','\x18','\x18','\x33','\x33','\xCC','\xCC','\x33','\x33','\xCC','\xCC','\x33','\x99','\xCC','\x66','\x33','\x99','\xCC','\x66',
+'\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xF0','\xF0','\xF0','\xF0','\xF0','\xF0','\xF0','\xF0','\x00','\x00','\x00','\x00','\xFF','\xFF','\xFF','\xFF','\xFF','\x00','\x00','\x00','\x00','\x00','\x00','\x00',
+'\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xFF','\xC0','\xC0','\xC0','\xC0','\xC0','\xC0','\xC0','\xC0','\xCC','\xCC','\x33','\x33','\xCC','\xCC','\x33','\x33','\x03','\x03','\x03','\x03','\x03','\x03','\x03','\x03',
+'\x00','\x00','\x00','\x00','\xCC','\xCC','\x33','\x33','\xCC','\x99','\x33','\x66','\xCC','\x99','\x33','\x66','\x03','\x03','\x03','\x03','\x03','\x03','\x03','\x03','\x18','\x18','\x18','\x1F','\x1F','\x18','\x18','\x18',
+'\x00','\x00','\x00','\x00','\x0F','\x0F','\x0F','\x0F','\x18','\x18','\x18','\x1F','\x1F','\x00','\x00','\x00','\x00','\x00','\x00','\xF8','\xF8','\x18','\x18','\x18','\x00','\x00','\x00','\x00','\x00','\x00','\xFF','\xFF',
+'\x00','\x00','\x00','\x1F','\x1F','\x18','\x18','\x18','\x18','\x18','\x18','\xFF','\xFF','\x00','\x00','\x00','\x00','\x00','\x00','\xFF','\xFF','\x18','\x18','\x18','\x18','\x18','\x18','\xF8','\xF8','\x18','\x18','\x18',
+'\xC0','\xC0','\xC0','\xC0','\xC0','\xC0','\xC0','\xC0','\xE0','\xE0','\xE0','\xE0','\xE0','\xE0','\xE0','\xE0','\x07','\x07','\x07','\x07','\x07','\x07','\x07','\x07','\xFF','\xFF','\x00','\x00','\x00','\x00','\x00','\x00',
+'\xFF','\xFF','\xFF','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xFF','\xFF','\xFF','\x01','\x03','\x06','\x6C','\x78','\x70','\x60','\x00','\x00','\x00','\x00','\x00','\xF0','\xF0','\xF0','\xF0',
+'\x0F','\x0F','\x0F','\x0F','\x00','\x00','\x00','\x00','\x18','\x18','\x18','\xF8','\xF8','\x00','\x00','\x00','\xF0','\xF0','\xF0','\xF0','\x00','\x00','\x00','\x00','\xF0','\xF0','\xF0','\xF0','\x0F','\x0F','\x0F','\x0F',
+'\xC3','\x99','\x91','\x91','\x9F','\x99','\xC3','\xFF','\xFF','\xFF','\xC3','\xF9','\xC1','\x99','\xC1','\xFF','\xFF','\x9F','\x9F','\x83','\x99','\x99','\x83','\xFF','\xFF','\xFF','\xC3','\x9F','\x9F','\x9F','\xC3','\xFF',
+'\xFF','\xF9','\xF9','\xC1','\x99','\x99','\xC1','\xFF','\xFF','\xFF','\xC3','\x99','\x81','\x9F','\xC3','\xFF','\xFF','\xF1','\xE7','\xC1','\xE7','\xE7','\xE7','\xFF','\xFF','\xFF','\xC1','\x99','\x99','\xC1','\xF9','\x83',
+'\xFF','\x9F','\x9F','\x83','\x99','\x99','\x99','\xFF','\xFF','\xE7','\xFF','\xC7','\xE7','\xE7','\xC3','\xFF','\xFF','\xF9','\xFF','\xF9','\xF9','\xF9','\xF9','\xC3','\xFF','\x9F','\x9F','\x93','\x87','\x93','\x99','\xFF',
+'\xFF','\xC7','\xE7','\xE7','\xE7','\xE7','\xC3','\xFF','\xFF','\xFF','\x99','\x80','\x80','\x94','\x9C','\xFF','\xFF','\xFF','\x83','\x99','\x99','\x99','\x99','\xFF','\xFF','\xFF','\xC3','\x99','\x99','\x99','\xC3','\xFF',
+'\xFF','\xFF','\x83','\x99','\x99','\x83','\x9F','\x9F','\xFF','\xFF','\xC1','\x99','\x99','\xC1','\xF9','\xF9','\xFF','\xFF','\x83','\x99','\x9F','\x9F','\x9F','\xFF','\xFF','\xFF','\xC1','\x9F','\xC3','\xF9','\x83','\xFF',
+'\xFF','\xE7','\x81','\xE7','\xE7','\xE7','\xF1','\xFF','\xFF','\xFF','\x99','\x99','\x99','\x99','\xC1','\xFF','\xFF','\xFF','\x99','\x99','\x99','\xC3','\xE7','\xFF','\xFF','\xFF','\x9C','\x94','\x80','\xC1','\xC9','\xFF',
+'\xFF','\xFF','\x99','\xC3','\xE7','\xC3','\x99','\xFF','\xFF','\xFF','\x99','\x99','\x99','\xC1','\xF3','\x87','\xFF','\xFF','\x81','\xF3','\xE7','\xCF','\x81','\xFF','\xC3','\xCF','\xCF','\xCF','\xCF','\xCF','\xC3','\xFF',
+'\xF3','\xED','\xCF','\x83','\xCF','\x9D','\x03','\xFF','\xC3','\xF3','\xF3','\xF3','\xF3','\xF3','\xC3','\xFF','\xFF','\xE7','\xC3','\x81','\xE7','\xE7','\xE7','\xE7','\xFF','\xEF','\xCF','\x80','\x80','\xCF','\xEF','\xFF',
+'\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xE7','\xE7','\xE7','\xE7','\xFF','\xFF','\xE7','\xFF','\x99','\x99','\x99','\xFF','\xFF','\xFF','\xFF','\xFF','\x99','\x99','\x00','\x99','\x00','\x99','\x99','\xFF',
+'\xE7','\xC1','\x9F','\xC3','\xF9','\x83','\xE7','\xFF','\x9D','\x99','\xF3','\xE7','\xCF','\x99','\xB9','\xFF','\xC3','\x99','\xC3','\xC7','\x98','\x99','\xC0','\xFF','\xF9','\xF3','\xE7','\xFF','\xFF','\xFF','\xFF','\xFF',
+'\xF3','\xE7','\xCF','\xCF','\xCF','\xE7','\xF3','\xFF','\xCF','\xE7','\xF3','\xF3','\xF3','\xE7','\xCF','\xFF','\xFF','\x99','\xC3','\x00','\xC3','\x99','\xFF','\xFF','\xFF','\xE7','\xE7','\x81','\xE7','\xE7','\xFF','\xFF',
+'\xFF','\xFF','\xFF','\xFF','\xFF','\xE7','\xE7','\xCF','\xFF','\xFF','\xFF','\x81','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xE7','\xE7','\xFF','\xFF','\xFC','\xF9','\xF3','\xE7','\xCF','\x9F','\xFF',
+'\xC3','\x99','\x91','\x89','\x99','\x99','\xC3','\xFF','\xE7','\xE7','\xC7','\xE7','\xE7','\xE7','\x81','\xFF','\xC3','\x99','\xF9','\xF3','\xCF','\x9F','\x81','\xFF','\xC3','\x99','\xF9','\xE3','\xF9','\x99','\xC3','\xFF',
+'\xF9','\xF1','\xE1','\x99','\x80','\xF9','\xF9','\xFF','\x81','\x9F','\x83','\xF9','\xF9','\x99','\xC3','\xFF','\xC3','\x99','\x9F','\x83','\x99','\x99','\xC3','\xFF','\x81','\x99','\xF3','\xE7','\xE7','\xE7','\xE7','\xFF',
+'\xC3','\x99','\x99','\xC3','\x99','\x99','\xC3','\xFF','\xC3','\x99','\x99','\xC1','\xF9','\x99','\xC3','\xFF','\xFF','\xFF','\xE7','\xFF','\xFF','\xE7','\xFF','\xFF','\xFF','\xFF','\xE7','\xFF','\xFF','\xE7','\xE7','\xCF',
+'\xF1','\xE7','\xCF','\x9F','\xCF','\xE7','\xF1','\xFF','\xFF','\xFF','\x81','\xFF','\x81','\xFF','\xFF','\xFF','\x8F','\xE7','\xF3','\xF9','\xF3','\xE7','\x8F','\xFF','\xC3','\x99','\xF9','\xF3','\xE7','\xFF','\xE7','\xFF',
+'\xFF','\xFF','\xFF','\x00','\x00','\xFF','\xFF','\xFF','\xE7','\xC3','\x99','\x81','\x99','\x99','\x99','\xFF','\x83','\x99','\x99','\x83','\x99','\x99','\x83','\xFF','\xC3','\x99','\x9F','\x9F','\x9F','\x99','\xC3','\xFF',
+'\x87','\x93','\x99','\x99','\x99','\x93','\x87','\xFF','\x81','\x9F','\x9F','\x87','\x9F','\x9F','\x81','\xFF','\x81','\x9F','\x9F','\x87','\x9F','\x9F','\x9F','\xFF','\xC3','\x99','\x9F','\x91','\x99','\x99','\xC3','\xFF',
+'\x99','\x99','\x99','\x81','\x99','\x99','\x99','\xFF','\xC3','\xE7','\xE7','\xE7','\xE7','\xE7','\xC3','\xFF','\xE1','\xF3','\xF3','\xF3','\xF3','\x93','\xC7','\xFF','\x99','\x93','\x87','\x8F','\x87','\x93','\x99','\xFF',
+'\x9F','\x9F','\x9F','\x9F','\x9F','\x9F','\x81','\xFF','\x9C','\x88','\x80','\x94','\x9C','\x9C','\x9C','\xFF','\x99','\x89','\x81','\x81','\x91','\x99','\x99','\xFF','\xC3','\x99','\x99','\x99','\x99','\x99','\xC3','\xFF',
+'\x83','\x99','\x99','\x83','\x9F','\x9F','\x9F','\xFF','\xC3','\x99','\x99','\x99','\x99','\xC3','\xF1','\xFF','\x83','\x99','\x99','\x83','\x87','\x93','\x99','\xFF','\xC3','\x99','\x9F','\xC3','\xF9','\x99','\xC3','\xFF',
+'\x81','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\xFF','\x99','\x99','\x99','\x99','\x99','\x99','\xC3','\xFF','\x99','\x99','\x99','\x99','\x99','\xC3','\xE7','\xFF','\x9C','\x9C','\x9C','\x94','\x80','\x88','\x9C','\xFF',
+'\x99','\x99','\xC3','\xE7','\xC3','\x99','\x99','\xFF','\x99','\x99','\x99','\xC3','\xE7','\xE7','\xE7','\xFF','\x81','\xF9','\xF3','\xE7','\xCF','\x9F','\x81','\xFF','\xE7','\xE7','\xE7','\x00','\x00','\xE7','\xE7','\xE7',
+'\x3F','\x3F','\xCF','\xCF','\x3F','\x3F','\xCF','\xCF','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\xCC','\xCC','\x33','\x33','\xCC','\xCC','\x33','\x33','\xCC','\x66','\x33','\x99','\xCC','\x66','\x33','\x99',
+'\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\x0F','\x0F','\x0F','\x0F','\x0F','\x0F','\x0F','\x0F','\xFF','\xFF','\xFF','\xFF','\x00','\x00','\x00','\x00','\x00','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF',
+'\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\x00','\x3F','\x3F','\x3F','\x3F','\x3F','\x3F','\x3F','\x3F','\x33','\x33','\xCC','\xCC','\x33','\x33','\xCC','\xCC','\xFC','\xFC','\xFC','\xFC','\xFC','\xFC','\xFC','\xFC',
+'\xFF','\xFF','\xFF','\xFF','\x33','\x33','\xCC','\xCC','\x33','\x66','\xCC','\x99','\x33','\x66','\xCC','\x99','\xFC','\xFC','\xFC','\xFC','\xFC','\xFC','\xFC','\xFC','\xE7','\xE7','\xE7','\xE0','\xE0','\xE7','\xE7','\xE7',
+'\xFF','\xFF','\xFF','\xFF','\xF0','\xF0','\xF0','\xF0','\xE7','\xE7','\xE7','\xE0','\xE0','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\x07','\x07','\xE7','\xE7','\xE7','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\x00','\x00',
+'\xFF','\xFF','\xFF','\xE0','\xE0','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\x00','\x00','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\x00','\x00','\xE7','\xE7','\xE7','\xE7','\xE7','\xE7','\x07','\x07','\xE7','\xE7','\xE7',
+'\x3F','\x3F','\x3F','\x3F','\x3F','\x3F','\x3F','\x3F','\x1F','\x1F','\x1F','\x1F','\x1F','\x1F','\x1F','\x1F','\xF8','\xF8','\xF8','\xF8','\xF8','\xF8','\xF8','\xF8','\x00','\x00','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF',
+'\x00','\x00','\x00','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\xFF','\x00','\x00','\x00','\xFE','\xFC','\xF9','\x93','\x87','\x8F','\x9F','\xFF','\xFF','\xFF','\xFF','\xFF','\x0F','\x0F','\x0F','\x0F',
+'\xF0','\xF0','\xF0','\xF0','\xFF','\xFF','\xFF','\xFF','\xE7','\xE7','\xE7','\x07','\x07','\xFF','\xFF','\xFF','\x0F','\x0F','\x0F','\x0F','\xFF','\xFF','\xFF','\xFF','\x0F','\x0F','\x0F','\x0F','\xF0','\xF0','\xF0','\xF0'
+};
+
+static byte ram[24 * 1024]; // MAX: 64 * 1024 if you have the SRAM, allows RAM banking
 static byte color_nybles[1024];
 
 // note ram starts at 0x0000
@@ -754,7 +885,7 @@
 static const int open_addr = 0xC000;
 static const int open_size = 0x1000;
 
-void C64_Init(const char* basic_file, const char* kernal_file)
+void C64_Init(const char* basic_file, const char* chargen_file, const char* kernal_file)
 {
 	//File_ReadAllBytes(basic_rom, sizeof(basic_rom), basic_file);
 	//File_ReadAllBytes(kernal_rom, sizeof(kernal_rom), kernal_file);
@@ -767,27 +898,50 @@
 	//io = new byte[io_size];
 	//for (int i = 0; i < io.Length; ++i)
 	//	io[i] = 0;
+	
+	// initialize DDR and memory mapping to defaults
+	ram[0] = 0xEF;
+	ram[1] = 0x07;	
 }
 
-byte GetMemory(ushort addr)
+extern byte GetMemory(ushort addr)
 {
-	if (addr <= sizeof(ram)-1 && (addr < basic_addr || (addr >= open_addr && addr < open_addr + open_size)))
+	if (addr <= sizeof(ram) - 1 
+		  && (
+			  addr < basic_addr // always RAM
+			  || (addr >= open_addr && addr < open_addr + open_size) // always open RAM C000.CFFF
+			  || (((ram[1] & 3) != 3) && addr >= basic_addr && addr < basic_addr + sizeof(basic_rom)) // RAM banked instead of BASIC
+			  || (((ram[1] & 2) == 0) && addr >= kernal_addr && addr <= kernal_addr + sizeof(kernal_rom) - 1) // RAM banked instead of KERNAL
+			  || (((ram[1] & 3) == 0) && addr >= io_addr && addr < io_addr + io_size) // RAM banked instead of IO
+		  )
+		)
 		return ram[addr];
 	else if (addr >= basic_addr && addr < basic_addr + sizeof(basic_rom))
 		return basic_rom[addr - basic_addr];
-	else if (addr >= color_addr && addr < color_addr + sizeof(color_nybles))
-		return color_nybles[addr - color_addr];
 	else if (addr >= io_addr && addr < io_addr + io_size)
-		return 0; // io[addr - io_addr];
-	else if (addr >= kernal_addr && addr <= kernal_addr + sizeof(kernal_rom)-1)
+	{
+		if ((ram[1] & 4) == 0)
+			return chargen_rom[addr - io_addr];
+		else if (addr >= color_addr && addr < color_addr + sizeof(color_nybles))
+			return color_nybles[addr - color_addr] | 0xF0;
+		else
+			return 0; // io[addr - io_addr];
+	}
+	else if (addr >= kernal_addr && addr <= kernal_addr + sizeof(kernal_rom) - 1)
 		return kernal_rom[addr - kernal_addr];
 	else
 		return 0xFF;
 }
 
-void SetMemory(ushort addr, byte value)
+extern void SetMemory(ushort addr, byte value)
 {
-	if (addr < sizeof(ram) && (addr < io_addr || (addr >= kernal_addr && addr <= kernal_addr + sizeof(kernal_rom)-1)))
+	if (addr <= sizeof(ram)-1
+		&& (
+			addr < io_addr // RAM, including open RAM, and RAM under BASIC
+			|| (addr >= kernal_addr && addr <= kernal_addr + sizeof(kernal_rom) - 1) // RAM under KERNAL
+			|| (((ram[1] & 7) == 0) && addr >= io_addr && addr < io_addr + io_size) // RAM banked in instead of IO
+			)
+		)
 		ram[addr] = value;
 	else if (addr == 0xD021) // background
 		;
@@ -796,4 +950,3 @@
 	//else if (addr >= io_addr && addr < io_addr + io.Length)
 	//    io[addr - io_addr] = value;
 }
-