Mit der Bildschirmausgabe nimmt das Projekt langsam Form an. Um mit dem Emulator zu interagieren fehlt allerdings noch eine Tastatur.
Diese wird in diesem Teil größtenteils implementiert. Das Mapping der Tasten ist noch statisch, was Raum zur Verbesserung für später offenlässt.
Also los geht's ...
Implementierung der virtuellen Tastatur
Um die Eingaben entgegen zu nehmen, wird ein Keyboard Listener registriert.
this.view.registerKeyListener('keydown', (e) => this.keyboard.onKeyDown(e));
this.view.registerKeyListener('keyup', (e) => this.keyboard.onKeyUp(e));
Dieser fängt die keydown und keyup Events ab und ruft die jeweilige Funktion der Keyboard Klasse auf.
Dort wird geprüft ob die jeweilige Taste in einer Mapping-Tabelle steht. Ist dies der Fall, wird der Tastendruck in einem Array gepeichert. Sobald man die Taste loslässt, wird die Taste aus dem Array entfernt.
Damit hat man die Anbindung der realen Tastatur.
Um die richtige Taste an den Emulator weiterzugeben müssen die beiden Speicherstellen $dc00 und $dc01 betrachtet werden. Dies Adressen von einem der beiden CIA Chips (6526 Complex Interface Adaptor).
In $dc00 wird beim Scannen der Tastatur ein Scancode geschrieben und aus $dc01 das Ergebnis gelesen. Daher muss die Memory Klasse angepasst werden, und ein Ergebnis zurückliefern, wenn die CPU die Speicherstelle 0xdc01 liest.
Dafür wird die Methode getColumnByte aufgerufen, die anhand für alle gedrückten Tasten vergleicht, ob der Scancode abgefragt wird.
Das folgende Schema zeigt die Keyboard Matrix auf, anhand derer sich die Scancodes zu den Tasten ermitteln lassen.
Quelle: https://ist.uwaterloo.ca/~schepers/MJK/keyboard_int.html
Bis ich ganz verstanden habe, wie der Scancode ermittelt wird, verweise ich auf diese http://emufromscratch.blogspot.de/2016/06/part-12-simulating-key-press.html.
Ergebnis
Der Emulator startet, und man kann kleine BASIC Programme eingeben.
Der aktuelle Stand des Emulators befindet sich in meinem Gitlab-Projekt TSC64Emu.
Die ausführbare Applikationen startet die Emulation automatisch und ist hier zu finden.
Ausblick
Jezt, wo die Tastatur zum größten Teil implementiert ist, kann man kleine BASIC Programme schreiben. Damit ist das Ziel, die grundlegende Funktion bereitzustellen, erreicht.
Von einer vollständigen Emulation sind wir aber noch weit weg. Es fehlen noch die vollständige Implementierung der IO-Bausteine (CIA), des Grafikchips (VIC-II), des Soundchips (SID) und der restlichen Peripherie (Tape, Floppy).
Jetzt ist aber erst einmal Zeit das ganze etwas sacken zu lassen, aufzuräumen und sich über das bisherige Ergebnis zu freuen.