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]

Committer:
davervw
Date:
Thu Apr 09 14:45:56 2020 +0000
Revision:
0:90de1cbc8a5f
Child:
4:0461c100cbbb
github.com/davervw/c-simple-emu6502-cbm ported to LPC1768

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davervw 0:90de1cbc8a5f 1 // cbmconsole.c - Commodore Console Emulation
davervw 0:90de1cbc8a5f 2 //
davervw 0:90de1cbc8a5f 3 ////////////////////////////////////////////////////////////////////////////////
davervw 0:90de1cbc8a5f 4 //
davervw 0:90de1cbc8a5f 5 // c-simple-emu-cbm (C Portable Version)
davervw 0:90de1cbc8a5f 6 // C64/6502 Emulator for Microsoft Windows Console
davervw 0:90de1cbc8a5f 7 //
davervw 0:90de1cbc8a5f 8 // MIT License
davervw 0:90de1cbc8a5f 9 //
davervw 0:90de1cbc8a5f 10 // Copyright(c) 2020 by David R.Van Wagner
davervw 0:90de1cbc8a5f 11 // davevw.com
davervw 0:90de1cbc8a5f 12 //
davervw 0:90de1cbc8a5f 13 // Permission is hereby granted, free of charge, to any person obtaining a copy
davervw 0:90de1cbc8a5f 14 //
davervw 0:90de1cbc8a5f 15 // of this software and associated documentation files (the "Software"), to deal
davervw 0:90de1cbc8a5f 16 // in the Software without restriction, including without limitation the rights
davervw 0:90de1cbc8a5f 17 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
davervw 0:90de1cbc8a5f 18 // copies of the Software, and to permit persons to whom the Software is
davervw 0:90de1cbc8a5f 19 // furnished to do so, subject to the following conditions:
davervw 0:90de1cbc8a5f 20 //
davervw 0:90de1cbc8a5f 21 // The above copyright notice and this permission notice shall be included in all
davervw 0:90de1cbc8a5f 22 // copies or substantial portions of the Software.
davervw 0:90de1cbc8a5f 23 //
davervw 0:90de1cbc8a5f 24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
davervw 0:90de1cbc8a5f 25 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
davervw 0:90de1cbc8a5f 26 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
davervw 0:90de1cbc8a5f 27 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
davervw 0:90de1cbc8a5f 28 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
davervw 0:90de1cbc8a5f 29 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
davervw 0:90de1cbc8a5f 30 // SOFTWARE.
davervw 0:90de1cbc8a5f 31 //
davervw 0:90de1cbc8a5f 32 ////////////////////////////////////////////////////////////////////////////////
davervw 0:90de1cbc8a5f 33
davervw 0:90de1cbc8a5f 34 #include <mbed.h>
davervw 0:90de1cbc8a5f 35 #include "cbmconsole.h"
davervw 0:90de1cbc8a5f 36
davervw 0:90de1cbc8a5f 37 // locals
davervw 0:90de1cbc8a5f 38 static int supress_first_clear = 1;
davervw 0:90de1cbc8a5f 39 static int supress_next_cr = 0;
davervw 0:90de1cbc8a5f 40 static char buffer[256];
davervw 0:90de1cbc8a5f 41 static int buffer_head = 0;
davervw 0:90de1cbc8a5f 42 static int buffer_tail = 0;
davervw 0:90de1cbc8a5f 43 static int buffer_count = 0;
davervw 0:90de1cbc8a5f 44
davervw 0:90de1cbc8a5f 45 // global references
davervw 0:90de1cbc8a5f 46 extern Serial pc;
davervw 0:90de1cbc8a5f 47
davervw 0:90de1cbc8a5f 48 static void Console_Clear()
davervw 0:90de1cbc8a5f 49 {
davervw 0:90de1cbc8a5f 50 if (supress_first_clear)
davervw 0:90de1cbc8a5f 51 {
davervw 0:90de1cbc8a5f 52 supress_first_clear = 0;
davervw 0:90de1cbc8a5f 53 return;
davervw 0:90de1cbc8a5f 54 }
davervw 0:90de1cbc8a5f 55 pc.printf("\x1B[2J\x1B[H");
davervw 0:90de1cbc8a5f 56 }
davervw 0:90de1cbc8a5f 57
davervw 0:90de1cbc8a5f 58 static void Console_Cursor_Up()
davervw 0:90de1cbc8a5f 59 {
davervw 0:90de1cbc8a5f 60 pc.printf("\x1B[A");
davervw 0:90de1cbc8a5f 61 }
davervw 0:90de1cbc8a5f 62
davervw 0:90de1cbc8a5f 63 static void Console_Cursor_Down()
davervw 0:90de1cbc8a5f 64 {
davervw 0:90de1cbc8a5f 65 pc.printf("\x1B[B");
davervw 0:90de1cbc8a5f 66 }
davervw 0:90de1cbc8a5f 67
davervw 0:90de1cbc8a5f 68 static void Console_Cursor_Left()
davervw 0:90de1cbc8a5f 69 {
davervw 0:90de1cbc8a5f 70 pc.printf("\x1B[D");
davervw 0:90de1cbc8a5f 71 }
davervw 0:90de1cbc8a5f 72
davervw 0:90de1cbc8a5f 73 static void Console_Cursor_Right()
davervw 0:90de1cbc8a5f 74 {
davervw 0:90de1cbc8a5f 75 pc.printf("\x1B[C");
davervw 0:90de1cbc8a5f 76 }
davervw 0:90de1cbc8a5f 77
davervw 0:90de1cbc8a5f 78 static void Console_Cursor_Home()
davervw 0:90de1cbc8a5f 79 {
davervw 0:90de1cbc8a5f 80 pc.printf("\x1B[H");
davervw 0:90de1cbc8a5f 81 }
davervw 0:90de1cbc8a5f 82
davervw 0:90de1cbc8a5f 83 void CBM_Console_WriteChar(unsigned char c)
davervw 0:90de1cbc8a5f 84 {
davervw 0:90de1cbc8a5f 85 // we're emulating, so draw character on local console window
davervw 0:90de1cbc8a5f 86 if (c == 0x0D)
davervw 0:90de1cbc8a5f 87 {
davervw 0:90de1cbc8a5f 88 if (supress_next_cr)
davervw 0:90de1cbc8a5f 89 supress_next_cr = 0;
davervw 0:90de1cbc8a5f 90 else
davervw 0:90de1cbc8a5f 91 pc.putc('\n');
davervw 0:90de1cbc8a5f 92 }
davervw 0:90de1cbc8a5f 93 else if (c >= ' ' && c <= '~')
davervw 0:90de1cbc8a5f 94 {
davervw 0:90de1cbc8a5f 95 //ApplyColor ? .Invoke();
davervw 0:90de1cbc8a5f 96 pc.putc(c);
davervw 0:90de1cbc8a5f 97 }
davervw 0:90de1cbc8a5f 98 else if (c == 157) // left
davervw 0:90de1cbc8a5f 99 Console_Cursor_Left();
davervw 0:90de1cbc8a5f 100 else if (c == 29) // right
davervw 0:90de1cbc8a5f 101 Console_Cursor_Right();
davervw 0:90de1cbc8a5f 102 else if (c == 145) // up
davervw 0:90de1cbc8a5f 103 Console_Cursor_Up();
davervw 0:90de1cbc8a5f 104 else if (c == 17) // down
davervw 0:90de1cbc8a5f 105 Console_Cursor_Down();
davervw 0:90de1cbc8a5f 106 else if (c == 19) // home
davervw 0:90de1cbc8a5f 107 Console_Cursor_Home();
davervw 0:90de1cbc8a5f 108 else if (c == 147)
davervw 0:90de1cbc8a5f 109 {
davervw 0:90de1cbc8a5f 110 Console_Clear();
davervw 0:90de1cbc8a5f 111 }
davervw 0:90de1cbc8a5f 112 }
davervw 0:90de1cbc8a5f 113
davervw 0:90de1cbc8a5f 114 // blocking read to get next typed character
davervw 0:90de1cbc8a5f 115 unsigned char CBM_Console_ReadChar(void)
davervw 0:90de1cbc8a5f 116 {
davervw 0:90de1cbc8a5f 117 unsigned char c;
davervw 0:90de1cbc8a5f 118 if (buffer_count == 0)
davervw 0:90de1cbc8a5f 119 {
davervw 0:90de1cbc8a5f 120 c = pc.getc();
davervw 0:90de1cbc8a5f 121 // if (c >= ' ' && c <= '~')
davervw 0:90de1cbc8a5f 122 // pc.putc(c); // echo
davervw 0:90de1cbc8a5f 123 if (c == '\r')
davervw 0:90de1cbc8a5f 124 supress_next_cr = true;
davervw 0:90de1cbc8a5f 125 return c;
davervw 0:90de1cbc8a5f 126 }
davervw 0:90de1cbc8a5f 127 c = buffer[buffer_head++];
davervw 0:90de1cbc8a5f 128 if (buffer_head >= sizeof(buffer))
davervw 0:90de1cbc8a5f 129 buffer_head = 0;
davervw 0:90de1cbc8a5f 130 --buffer_count;
davervw 0:90de1cbc8a5f 131 return c;
davervw 0:90de1cbc8a5f 132 }
davervw 0:90de1cbc8a5f 133
davervw 0:90de1cbc8a5f 134 void CBM_Console_Push(const char* s)
davervw 0:90de1cbc8a5f 135 {
davervw 0:90de1cbc8a5f 136 while (s != 0 && *s != 0 && buffer_count < sizeof(buffer))
davervw 0:90de1cbc8a5f 137 {
davervw 0:90de1cbc8a5f 138 buffer[buffer_tail++] = *(s++);
davervw 0:90de1cbc8a5f 139 if (buffer_tail >= sizeof(buffer))
davervw 0:90de1cbc8a5f 140 buffer_tail = 0;
davervw 0:90de1cbc8a5f 141 ++buffer_count;
davervw 0:90de1cbc8a5f 142 }
davervw 0:90de1cbc8a5f 143 }