Commodore Plus/4: Dokumentation zum Emulator 'Forever?'

INHALT

Übersicht

Betriebssystem

Weshalb ein DOS-Assembler?

Verwendete Hardware-Ressourcen des IBM PC

Tastatur

Joysticks

Diskettenlaufwerke

Sound

Video-Subsystem

Maus

ROMs

Hauptmerkmale des Emulators

CPU JAM Befehle

Emulation der I/O Ports

Emulation des TED

Merkmale des Commodore +4

C+4 gegenüber C64

Debugger

Timing von Prozessor und TED

Emulation der Datasette

Menüs

CTF-Format

C2F-Format

CFG-Format

Parameter für die Kommandozeile

Kompilierung

(C) Copyright

Bug-Reports

Entwicklung und letzte Aktualisierungen

Übersicht

Ich glaube, daß ich mit dem Emulator "Forever" ein besonderes Einzelstück geschrieben habe, denn seit März 1991 habe ich weder einen Commodore Plus/4, noch einen C16 oder einer C116 gesehen....Auch habe ich niemals ein Commodore-Floppylaufwerk besessen.*-+ Diese Version des Emulators enststand ausschließlich aufgrund der alten Dokumentation aus meinem Besitz und Fundstücken aus dem Internet (z.B. "c64doc" von John West und Marko Makela, "Extra Instructions Of The 65XX Series CPU" von Adam Vardy), sowie aufgrund einer Reihe von Hinweisen von Attila Grosz. Der Emulator ist zu 100 % programmiert in 16-bit 80486 Assembler-Maschinensprache.

Betriebssystem

Die Neuprogrammierung der Timer-Hardware ließ es nicht zu, den Emulator unter der grafischen Benutzeroberfläche "Microsoft Windows" zu betreiben - starten Sie ihn unter nativem DOS oder im DOS-Modus unter Windows 95/98/Me. Benutzer von Windows NT/2000/XP, Linux oder FreeBSD können ihr System mit einer DOS-Startdiskette oder DOS-Boot-CD (wenn das System von CD gebootet werden kann) booten und dann den Emulator starten.

Weshalb ein DOS-Assembler?!

Warum ist ein fast vergessenes Betriebssystem die Basis für ein Programm des Jahres 2007? Nun, dafür gibt es einige Gründe:

  1. Das Grundgerüst des Emulators entstand 1996/97 in einer zu der Zeit noch lebendigen DOS-Umgebung. Die Arbeit wurde Anfang 1998 unterbrochen und erst Ende 2002 wieder aufgenommen. Das Grundgerüst enthält daher vielfältige Denkansätze und Modelle der früheren Jahre.
  2. Als Autor mußte ich feststellen, daß die Umsetzung/Übersetzung zu einem anderen Betriebssystem und die Umstellung von Assembler zu einer höheren Programmiersprache heutzutage zu kompliziert ist. Somit hatte ich nur die Wahl, entweder die begonnene Entwicklung fortzusetzen oder unter einem anderen System komplett neu zu beginnen.
  3. Die modernen Emulatoren sind ausschließlich verfügbar für Betriebssysteme mit grafischer Benutzeroberfläche wie unixoide BS und Microsoft Windows (Plus4emu, Yape usw.) Der hier vorliegende Emulator ist dafür der beste für die DOS-Umgebung!
  4. Mitte der 90er Jahre stand mir nur ein 486DX-120 zur Verfügung. Nur unter Assembler ließ sich damit eine 100 %-ige Leistung erreichen.
  5. Programmierung in Assembler unter DOS ohne Debugger ist außerordentlich schwierig und zeitraubend. Das verlängert jedoch das Vergnügen am Erstellen eines Emulators....

Verwendete Hardware-Ressourcen des IBM PC

Der Emulator übernimmt den Interrupt 9 (Tastatur) komplett und fängt Interrupt 8 ab. Es wird ausschließlich DOS-Speicher genutzt. Die Bildschirmgröße ist wählbar. Es ist direkter Zugriff zu diesen Ports vorhanden: 20-21 (programmierbarer Interruptcontroller); 40, 43 (Timer-Hardware , um die IRQ0-Frequenz auf 37288 Hz zu setzen); 60, 64 (Tastatur); 61 (Lautsprecher); 201 (Joysticks); 388, 389 (AdLib); 3C0, 3C1, 3C2, 3C4, 3C5, 3CE, 3CF (VGA); 3D4, 3D5, 3DA (Farb-VGA); 3B4, 3B5, 3BA (Mono-VGA); 2x6, 2xA, 2xC, 2xE (Sound Blaster, wobei x 2,4,6, oder 8 sein kann). Einige VGA-Register werden nur für unerschiedliche Videodarstellungen genutzt.

Tastatur

Besetzung einiger Tasten:
Alt-Commodore-Taste
Tab-Run/Stop
F5-Auswahl der Sound-Hardware (Beeper, AdLib, SB16, Ton aus)
F9-Debugger
F10-Rücksprung ins DOS; Emulator wird beendet
F11-Reset-Taster (Warmstart)
Shift-F11-Kaltstart (Ein/Aus-Schalter)
F12-Dateiverwaltung des Emulators mit Optionsauswahl
Scroll Lock-"Play"-Taste der Datasette
Num Lock-"Record"-Taste der Datasette (nur bei der Aufforderung "PRESS PLAY & RECORD ON TAPE" betätigen)
SysRq (Alt+PrintScreen)-Sofortiger Rücksprung zu DOS (Achtung! Sämtliche Operationen, z.B. Dateizugriffe usw., werden abgebrochen!)

Joysticks

Es kann jede beliebige Kombination vorhandener analoger Joysticks und Tasten zur Joystick-Emulation benutzt werden. Für die Emulation stehen zwei vordefinierte Tastenkombinationen zur Verfügung:

Diskettenlaufwerke

Sie können Laufwerk 8 und 9 nutzen. Es stehen zwei Emulationen für das Commodore-DOS zur Verfügung:

  1. für D64-Diskettenimages;
  2. für IBM PC-Verzeichnisse (FAT oder CD-ROM).

Mit beiden Emulationen können folgende Kommandos und Variablen des BASIC DOS benutzt werden: DIRECTORY, DLOAD, LOAD, DSAVE, SAVE, VERIFY, INPUT#, GET#, PRINT#, OPEN, CLOSE, SCRATCH, RENAME, HEADER, COLLECT, DS, DS$, ST, CMD, COPY. Die DOS-Kommandos U9/UI und U:/UJ werden z.T. unterstützt - sie zeigen die DOS-Version in der DS$ und beenden sämtliche I/O-Vorgänge. Das DOS-Kommando I (INITIALIZE) beendet sämtliche I/O-Vorgänge. Das DOS-Kommando M-R (MEMORY READ) kann zum Auslesen des C1551 ROM und 5 256 Bytes Datenpuffer an den Adressen $300 bis $7ff verwendet werden. Das DOS-Kommando P (POSITION) wird voll unterstützt.

Somit können Sie Programme laden und speichern, PRG/SEQ/USR/DEL-Dateien lesen, schreiben, kopieren, umbenennen und löschen, sowie den Floppystatus und das Directory jederzeit abfragen.

Die Emulation für D64-Abbilder unterstützt den Direktzugriff U1/UA, U2/UB, B-A, B-F, # und B-P DOS-Kommandos, um Programme wie z.B. Zork, Hitchhiker's Guide, Blazin Forth usw. aufzurufen. U1/UA können die Sektorenübersicht von D64-Abbildern nutzen, wodurch kopiergeschützte Programme wie z.B. Typing Professor aufgerufen werden können. Das Kommando COPY wird nicht für relationale Dateien unterstützt. Das Read-Only D64-Abbild erkennt der Emulator als schreibgeschützte Diskette.

Auf einem IBM-PC-Dateisystem unterstützt der Emulator sämtliche Standard-Dateitypen sowie einige DOS-Kommandos (C, R, S, P, N, V). Nicht unterstützt werden Direktzugriffs-Kommandos wie U1, B-A, M-W usw. Relationale Dateien und das Kommando COPY werden voll unterstützt. Das Kommando HEADER bereinigt lediglich das aktuelle Directory von allen nicht gesperrten (d.h. nur Lesezugriff) Dateien der Typen PRG und X00. Das Kommando COLLECT ist wirkungslos. Read-Only-Dateien erkennt der Emulator als gesperrt.

Sie können bei jedem Kommando, welches Platzhalter zuläßt (SCRATCH, DIRECTORY, ...), auch Platzhalter verwenden, z.B. A??B*=P. SAVE/OPEN unterstützt auch den Platzhalter @.

Beide Laufwerke werden bei Programmaufruf dem PC-Verzeichnis, in welchem der Emulator aufgerufen wird, zugewiesen. Mit F7 kann die Auswahl neu arrangiert werden.

Die Verwendung der Emulation im IBM-PC-Dateisystem bietet mehr Speicherplatz und Flexibilität, insbesondere bei Programmen wie z.B. Austrospeed Basic Compiler oder SVS B.A.L. System. Extrahieren Sie Dateien aus einem D64-Abbild und nutzen Sie die Vorteile!

Tabelle der Emulation der DOS-Komandos
DOS BASICD64 PC-Verzeichnis
N HEADER + %[1]
C COPY %[3] %[4]
S SCRATCH + +
R RENAME + +
V COLLECT + +[2]
I + +
P (RECORD) + +
U1, UA + -
U2, UB + -
B-R - -
B-W - -
B-P + -
B-A + -
B-F + -
B-E - -
M-R +[5] +[5]
M-W - -
M-E - -
U3..U8, UC..UH - -
U9, UI + +
U:, UJ + +
%R +[7] +[7]
%S -[6] +[7]
%number - -
& - -

[1] - Schreibgeschützte Dateien werden nicht entfernt
[2] - Dateinamen mit Platzhalter/n nicht möglich
[3] - Kopieren von relationalen Dateien nicht möglich
[4] - Korrekte Kombination von relationalen Dateien mit unterschiedlichen Datensatzlängen nicht möglich
[5] - Kann zum Zugriff auf die Speicherbereiche $300-$7ff (RAM) und $C000-SFFFF (RAM) benutzt werden. Der IEC-Emulations-Alogarithmus ist keine exakte Kopie der C1551-Subroutinen, daher kann die automatische Bereitstellung von 256 Bytes Puffer für I/O-Vorgß孓ge von der C1551 abweichen.
[6] - Die Sektorverschachtelung ist stets auf 1 gesetzt (ausgenommen Directory). Die Einstellung bei der C1551 ist 17.
[7] - keine Aktion

Tabelle der unterstützn OPEN Modi:
ModusD64 PC-Verzeichnis
Channel 0 (LOAD) + +
Channel 0 ($) + +
Channel 1 (SAVE) + +
Channel 1 (SAVE@) + +
Channels 2..14 R+ +
Channels 2..14 W @+ +
Channels 2..14 A+ +
Channels 2..14 M- -
Channels 2..14 L+ +
Channels 2..14 $+ +
Channel 15 (COMMAND) + +
SEQ, PRG, USR-Dateien+ +
DEL-Dateien+ +
REL-Dateien+ +
# (SET BUFFER)+ -

Sound

Zur Tonerzeugung kann der Emulator drei Arten an Hardware nutzen:

  1. Standard PC-Lautsprecher, digital, 37287 Hz;
  2. Adlib FM sound;
  3. Sound Blaster Digitalsound bei 18643 Hz. Da der Direktmodus verwendet wird, kann die Wiedergabe langsam sein; daher ist ein Prozessor von mindestens 300 MHz erforderlich. Zum Aufruf der Soundblaster-Hardware muß die Umgebungsvariable BLASTER gesetzt sein.

Video-Subsystem

Die folgenden Videomodi werden unterstützt:
#Hardware-AuflösungC= FenstergrößeVideokartentyp
0,7320x200320x200VGA, VBE
1320x240320x240VGA
2320x350320x288VGA
3320x400320x288VGA
4360x240352x240VGA
5360x400352x288VGA
6,8400x300368x288Super VGA, VBE
9640x400368x288VBE
10640x480368x288VBE

Sämtliche Modi sind kompatibel mit aktuellen TFT-LCD-Monitoren. Die Grundeinstellung ist Modus 0; die zweite Einstellung ist der VBE-Modus.

Maus

Linke Taste-Dateisystem des Emulators und Optionen
Rechte Taste-Rücksprung ins DOS

ROMs

Der Emulator kann zwischen jedem ROM-Speicher wechseln und jeden ROM-Speicher hinzufügen. Beim Programmstart werden die ROM-Abbilder im Verzeichnis abgefragt:
0-BASIC.ROM-BASIC ROM;
1-KERNAL.ROM-KERNAL ROM;
2-3P1_LO.ROM-3-PLUS-1 LOW ROM;
3-3P1_HI.ROM-3-PLUS-1 HIGH ROM;
4-C1_LO.ROM-Steckmodul #1 LOW ROM;
5-C1_HI.ROM-Steckmodul #1 HIGH ROM;
6-C2_LO.ROM-Steckmodul #2 LOW ROM;
7-C2_HI.ROM-Steckmodul #2 HIGH ROM;
8-C1551.ROM-C1551 ROM.

Jedes dieser ROMS muß exakt 16 kB groß sein. Fehlen eine oder mehrere ROM-Dateien, verwendet der Emulator automatisch die ins Programm integrierten ROM-Dateien.

Manche ROM-Abbilder, die im Internet zu finden sind, haben eine Länge von 16386 Bytes (aus mir nicht bekannten Gründen sind 2 zusätzliche Bytes an den Dateianfang gesetzt) - entfernen Sie einfach die ersten 2 Bytes der Datei.

Legen Sie für jedes Steckmodul ein separates Verzeichnis an und rufen Sie den Emulator von diesem Verzeichnis aus auf.

De Benutzung des Emulators mit ROMs ist sehr bequem - geben Sie einfach den Dateinamen des ROM bei Programmaufruf in der Kommandozeile an. Die erste Spalte in o.a. Tabelle nennt die Nummer der ROM-Bank.

Hauptmerkmale des Emulators

Der Emulator unterstützt:
-CPU:
alle Standard Opcodes +
exaktes Timing der Opcodes +
Dezimalmoduns +
Unterstützung der separaten Opcodes+
Alogarithmus für RMW-Befehlssatz +
Integrierter Port %[1]
Interrupte +
-TED:
Video +[2]
Sound +[2][3]
Timer +
Speicherverwaltung +
Interrupte +
Tastatur +
doppelte/einfache Uhr +
exaktes CPU Timing +
-Paralleler I/O-Baustein (6529B) %[4]
-Serieller I/O-Baustein (6551A) -
-Tastatur +
-Joysticks +
-serieller Bus -
-serielle Bus-Geräte -
-C-1551 Floppylaufwerke %[5]
-Datasette +
-ROM-Steckmodule (bis 64 kB) +

[1] - Volle Unterstützung nur für Datasetten-Leitung (Lesen/Schreiben/Antriebsmotor); Bit 5 ist immer auf 0 gesetzt.
[2] - 99% kompatibel.
[3] - nur für den PC-Lautsprecher sowie AdLib und sound Blaster-kompatible Soundkarten. Übrigens ist es fast unmöglich, digitale Soundeffekte mit der AdLib-Kartenfamilie zu erzeugen - verwenden Sie statt dessen den PC-Lautsprecher oder den Sound Blaster.
[4] - nur Kassettenabfrage.
[5] - Turbolader und einige weitere Operationen werden noch nicht unterstützt.

Internal Merkmale des Emulators:

Der Emulator läuft bereits auf einem PC mit einem 80486-kompatiblen Prozessor mit einer VGS- oder VESA-kompatiblen Grafikkarte (für eine Geschwindigkeits-Emulation von 100 % ist aber mindestens ein P200 erforderlich. DPMI kann die Leistung des Emulators um mehr als das doppelte senken; rufen Sie den Emulator daher nur unter nativem DOS auf).

CPU JAM/HLT-Befehle

JAM-Befehle wirken wie ein Hardware-Reset. Wenn der Resetvektor auf einer beliebigen HLT-Befehl weist, setzt sich der Emulator nach dem Reset zurück.

Emulation der I/O-Ports

FC00-FCFFKERNAL ROM FIX +
FD00-FD0FACIA -
FD10-FD1FPIO %[1]
FD30-FD3FKEYBOARD MATRIX +
FDD0-FDDFROM CHIPS SELECTION PORT+
FEC0-FEDFIEC9/C1551 +
FEE0-FEFFIEC8/C1551 +

[1] - nur Kassettenabfrage.

TED-Emulation

IndexBit(s)Funktion Emulation
00 0-7 Timer 1 low byte +
01 0-7 Timer 1 high byte+
02 0-7 Timer 2 low byte +
03 0-7 Timer 2 high byte+
04 0-7 Timer 3 low byte +
05 0-7 Timer 3 high byte+
06 0-2 Bildschirm Vertikaloffset+
3 0/1 - 24/25 Zeilen +
4 0/1 - Bildschirm ein/aus +
5 0/1 - Bitmap ein/aus+
6 0/1 - Erweiterter Farbmoduns ein/aus+
7 TEST -[2]
07 0-2 Bildschirm Horizontaloffset+
3 0/1 - 38/40 Spalten +
4 0/1 - Mehrfarbmodus ein/aus+
5 0/1 - Freeze ein/aus -[2]
6 0/1 - PAL/NTSC -[2][1]
7 0/1 - Hardware-Reverse ein/aus+
08 0-7 Tastatur/Joystick-Register+
09 0 nicht benutzt +
1 0/1 - Rasterinterruptanforderung ja/nein+
2 0/1 - Lichtgriffel-Interruptanforderung ja/nein?[4]
3 0/1 - Interruptanforderung Timer 1 ja/nein+
4 0/1 - Interruptanforderung Time2 2 ja/nein+
5 nicht benutzt +
6 0/1 - Interruptanforderung Time 3 ja/nein+
7 0/1 - Abfrage vorliegende TED-Interruptanforderungen ja/nein+
0A 0 Rasterinterrupt Bit 8 gesetzt+
1 0/1 - Maskenrasterinterrupt ja/nein+
2 0/1 - Lichtgriffelinterrupt ja/nein?[2]
3 0/1 - Timer 1 Maskeninterrupt ja/nein+
4 0/1 - Timer 2 Maskeninterrupt ja/nein+
5 nicht benutzt +
6 0/1 - Timer 3 Maskeninterrupt ja/nein+
7 nicht benutzt +
0B 0-7 Rasterinterrupt gesetzt, Bits 0-7+
0C 0-1 Bits 8-9 derzeitige Cursorposition+
2-7 nicht benutzt +
0D 0-7 Bits 0-7 derzeitige Cursorposition+
0E 0-7 Bits 0-7 Ton 2 Frequenznr.+
0F 0-7 Bits 0-7 Ton 1 Frequenznr.+
10 0-1 Bits 8-9 Ton 2 Frequenznr.+
2-7 nicht benutzt ?[2]
11 0-3 Lautstßärkeregelng (0 bis 8)+
4 Auswahl Ton 1 +
5 Auswahl Ton 2 +[5]
6 Auswahl Gerß工sch auf Ton 2 +
7 Sound neu laden +[6]
12 0-1 bits 8-9 of voice 1 frequency number+
2 0/1 - Character generator or Bit map in RAM/ROM+
3-5 bits 13-15 (other bits are equal to 0) of Bit map address+
6-7 unused +
13 0 RAM/ROM status +
1 0/1 - Set CPU single clock for overscan off/on+
2 bit 10 of Character generator address, it is usable only when bit 7 of register 7 (Hardware reverse) is set to 1+
3-7 bits 11-15 (other bits are equal to 0) of character generator address+
14 0-2 unused +
3-7 bits 11-15 (other bits are equal to 0) of color memory base+
15 0-3 Color 1 +
4-6 Luminance 1 +
7 unused +
16 0-3 Color 2 +
4-6 Luminance 2 +
7 unused +
17 0-3 Color 3 +
4-6 Luminance 3 +
7 unused +
18 0-3 Color 4 +
4-6 Luminance 4 +
7 unused +
19 0-3 Overscan Color +
4-6 Overscan Luminance +
7 unused +
1A 0-1 bits 8-9 of current character position +
2-7 unused +
1B 0-7 bits 0-7 of current character position+
1C 0 Vertical line bit 8 +
1-7 unused +
1D 0-7 Vertical line bits 0-7 +
1E 0 bit 0 of horizontal dot position %[4]
1-7 bits 1-7 of horizontal dot position +
1F 0-2 Vertical subaddress +
3-6 Blink counter +
7 unused +
3E Selects ROM +
3F Selects RAM +

[1] - nur PAL.
[2] - Dieses Bit kann als ordinaler RAM-Speicher benutzt werden.
[4] - stets 0.
[5] - Bit 5 hat Priorität über Bit 6.
[6] - Wert 1 schaltet beide Kanäle bei einer AdLib stumm. Beim PC-Lautsprecher und bei einer Sound Blaster-Karte werden die korrekten Werte gesetzt.

Merkmale des Commodore Plus/4

[1] - Rasterinterrupts können diese Beschränkung abmildern.

C+4 im Vergleich mit C64

Der Plus/4 und der C64 sind einander sehr ähnlich. Warum ist aber der C64 erfolgreicher?

Ich glaube, dafür gibt es nur eine Antwort: der C64 ist zwei Jahre älter! Nachstehend finden Sie eine Vergleichstabelle mit den hauptsächlichen Qualitäts- und Technikmerkmalen beider Geräte. Wer hat da den Vergleich gewonnen...?

                            C64     C+4     Anmerkungen

  BASIC
   Version                  2.0     3.5
   Freier Speicher, Bytes  38911   60671
   Tokens                   77      128
   Diskettenbefehle          -       +
   Grafikbefehle             -       +
   Strukturierte Befehle     -       +
   Soundbefehle              -       +
   Joystickbefehle           -       +

  Integrierter Monitor
    mit (Dis)Assembler       -       +

  Integrierte Software
    Textverarb., Tabel-
    lenk. u. Datenbank       -       +

  Geschwindigkeit            =       =      Im Vollbildmodus ist der C64
                                            geringfügig schneller als der +/4,
                                            im Screenblank-Modus ist der +/4
                                            schneller.
  RAM
   Total                    64K     64K
   Leerstellen, Bytes       4098    548     C+4: CPU=2,IO=512(ACIA=16,PIO=16,
                                                 KBD=16,MAGIC VOICE SOUND=16,
                                                 ROMSEL=16),TED=34.
                                            C64: CPU=2,VIC=1024,SID=1024,
                                                 VRAM=1024,CIA1=256,CIA2=256,
                                                 EXP1/Z80=256,EXP2/DISK=256
                                            * Die Leerstellen schränken die
                                            RAM/ROM-Kapazitß川 ein.

  ROM
   Total                    2*8K+4K 4*16K   Der C+/4 kann mit nur 16 kB Kernal-ROM
                            =20K    =64K    und mit 3 weiteren ROM-Modulen von je
                                            16 kB arbeiten!
                                           
   Max                      3*8K+4K 8*16K-3*802-546
                            =28K    =128K-2952=125.1171875K
  Tastatur
   Anzahl Tasten            66      67+Reset
   Resettaster              -       +
   Design                   schlecht	besser

  Grafik
   Farben                   16      121
   Max. Auflösung          320x200 320x200
   Erweiterter Modus        +       +
   Mehrfarbmodus            +       +
   Bitmap-Modus             +       +
   Hardware-Cursor          -       +
   256 Screen-Zeichen       +       +
   Hardwareumkehr           -       +       Mit der Hardwareumkehr können
                                            automatisch inverse Zeichen erzeugt
                                            werden - spart 2 kB ROM.
   38/40 Spalten-Modus      +       +
   24/25 Zeilen-Modus       +       +
   X/Y-Scrolling            +       +
   Festes Farb-RAM          +       -       Erhöht die Flxibilitß川 des C+4.
   Farb-RAM                 0.5K    -	 	Durch das Farb-RAM ist der C64
											in den Textmodi etwas schneller
											als der C+4 und erhöht den freien
											RAM-Speicher für einige Modi.
											(Der C+4 benötigt ca. 1 kB des
											Hauptspeichers für die Farbverw.)
   Hardware-Sprites         +       -       Der C64 kann bis zu 8 Sprites 24x21
                                            verwalten, Kollisionen automatisch
                                            erkennen usw.
   
  Sound
   Kanäle                   3       2       Der 2. Kanal des C+4 kann entweder
                                            Musik oder Geräusche erzeugen
   Frequenzbereich          0-      109Hz-
                            3.9KHz  110KHz
   Amplituden               großer  nur     Der C64 kann eine große Anzahl unter-
                            Bereich Rechteck  schiedlicher Soundeffekte und
                                            hochwertige synthetische Musikeffekte
                                            erzeugen.

  Timer
   2-Byte Timer             4       3       Die Timer des C64 haben mehr
                                            Modi als die des C+4
   4-Byte RTC               2       -

  Interrupts
   NMI                      +       -
   IRQ                      +       +
   Reset                    -       +       Der C64 ist ohne einen einfachen
                                            Resetschalter; der C+4 ist mit 
                                            einem ausgestattet
   Interrupte
    Kassette Read/
     Serial Bus SRQ         1       -       Der C64 hat 13 Interruptebenen:
    Timers                  4       3       4 vom VIC, 5 vom CIA1
    RTC                     1       -       und 4 vom CIA2 - VIC (IRQ),
    Raster                  1       1       CIA1 (IRQ) und CIA2 (NMI) können 
    Sprites                 2       -        nur 1 Interruptsignal erzeugen;
    Synchro Serieller Port  2       -       Der C+4 hat 6 Typen interne
    Lichtgriffel            1       1       Interruptquellen: 5 vom TED und 
    RS-232C                 1       1       1 vom ACIA

  Serieller Bus             +       +       Der C+4 unterstüzt die SRQ-Leitung
											nicht.

  Digitale Joysticks        2       2

  Paddles                   4       -       Hierdurch können an den C64 bis zu
                                            2 4-Buttons analoge Joysticks an-
                                            geschlossen werden (anstatt 
                                            2 digitaler Joysticks).

  User Port
   Centronics               1       1       Beide können nur RS-232C
   TTL RS-232C              1       1       oder Centronics wahlweise nutzen,
   Max. Baudrate            300     19200   jedoch nicht beides gleichzeitig.
   Synchro serielle Ports   2       -

  Datasette                 1       1

  Schnelle C1551            -       +       Das Laufwerk wird direkt an den
                                            CPU-Bus angeschlossen. Der C64 könnte
                                            theoretisch vergleichbare Laufwerke
                                            nutzen...
                                            
                                            
                                            

Debugger

Es handelt sich um eine voll funktionsfähige Kopie des MS-DOS-Debuggers und verfügt über fast den gleichen Befehlssatz (siehe untenstehende Tabelle).
FunktionMS-DOS
Debugger-
Befehle
Emulator-
Befehle
Emulation
AssembleA A +
Compare C C +
Dump D D +
Enter E E +[1]
Fill F F +[1]
Go G G +[6]
Go Line <miss>GL![6][10]
Hex H H +
Load L L +
Move M M +
Name N N +
watchpOint<miss>O ![7]
Proceed P P +[3][6]
Quit Q Q +[4]
RegisterR R +[12]
Search S S +[1]
Trace T T +[5]
UnassembleUU+
View <miss>V ![2]
Write W W +
cYcle of TED<miss>Y![11]
eXtra <miss> X ![14]
Zoom <miss> Z ![8]
? ? ? +
! !![9]

[1] - Unterstützt nur hexadezimale Ausdrücke, jedoch keine Strings .
[2] - Ruft den Plus/4-Bildschirm auf.
[3] - Dieser Befehl entspricht dem Befehl "G" (Go), wobei ein Breakpoint zum nächsten Assemblerbefehl gesetzt wird. Er ist sehr hilfreich bei der Verfolgung von Subroutinen (JSR) und Schleifen (BNE, BEQ, ...). Hingegen ist "P" bei der Betrachtung von Befehlen für JSR oder bedingten Verzweigungen wenig hilfreich.
[4] - Kehrt zum Emulator zurück und schaltet den Debugger ab.
[5] - "T" zeigt die Ausführungszeit eines Befehls. Die Interrupte werden zwar während der Ausführung verborgen, die Ausführungsdauer wird jedoch angezeigt. Manche Interrupthandles können den Interrupt-Returnpoint verändern, wodurch der "T"-Befehl in einer Endlosschleife enden kann. Drücken Sie in diesem Falle F9.
[6] - Mit diesen Befehlen springt der Emulator in den Debugger-Modus. Durch Drücken von F9 gelangt man zurück zum letzten Debugger-Bildschirm.
[7] - Die Syntax ist identisch zum Kommando "G", jedoch werden anstelle von Breakpoints Watchpoints gesetzt (sobald ein Byte an einer vordefinierten Adresse erneut geschrieben wird, erfolgt Programmunterbrechung).
[8] - Umschalten zwischen 25 oder 50 Zeilen.
[9] - Sofortiges Verlassen des Emulators.
[10] - Unterbricht die Ausführung an vorgegebener Zeile.
[11] - Dieser Befehl ist TED-spezifisch - ein spezieller Debugger-Modus wird aufgerufen. Jeder andere Befehl setzt den Debugger in den Normalmodus zurück.
[12] - Zeigt auch LINE (den Paarwert der TED-Register 1C und 1D), POS (TEF-Register 1E) und 2CPU (die Prozessortakte für den aktuellen Befehl).
[14] - Dieser Befehl zeigt an die Videodisplay-Werte, die Hardware-Verktoren sowie die TED-Register für den internen TED und den Emulator.

Breakpoint(s) und Watchpoint(s), die durch G (Go), GL (Go Line), P (Proceed), oder O (Watchpoint) gesetzt werden, bremsen den Emulator geringfügig ab, jedoch lediglich um einige wenige Prozent.

Es werden die gleichen mnemonischen Ausdrücke wie für das Assemblieren/Disassemblieren von CPU-Befehlen verwendet:

    BRK               ;00           NOP2    #$nn      ;80
    ORA     ($nn,X)   ;01           STA     ($nn,X)   ;81
    JAM               ;02           NOP2    #$nn      ;82
    ASLORA  ($nn,X)   ;03           STXSTA  ($nn,X)   ;83
    NOP2    $nn       ;04           STY     $nn       ;84
    ORA     $nn       ;05           STA     $nn       ;85
    ASL     $nn       ;06           STX     $nn       ;86
    ASLORA  $nn       ;07           STXSTA  $nn       ;87
    PHP               ;08           DEY               ;88
    ORA     #$nn      ;09           NOP2    #$nn      ;89
    ASL               ;0A           TXA               ;8A
    ANC     #$nn      ;0B           TXAAND  #$nn      ;8B
    NOP3    $nnnn     ;0C           STY     $nnnn     ;8C
    ORA     $nnnn     ;0D           STA     $nnnn     ;8D
    ASL     $nnnn     ;0E           STX     $nnnn     ;8E
    ASLORA  $nnnn     ;0F           STXSTA  $nnnn     ;8F
    BPL     $nnnn     ;10           BCC     $nnnn     ;90
    ORA     ($nn),Y   ;11           STA     ($nn),Y   ;91
    JAM               ;12           JAM               ;92
    ASLORA  ($nn),Y   ;13           SHA     ($nn),Y   ;93
    NOP2    $nn,X     ;14           STY     $nn,X     ;94
    ORA     $nn,X     ;15           STA     $nn,X     ;95
    ASL     $nn,X     ;16           STX     $nn,Y     ;96
    ASLORA  $nn,X     ;17           STXSTA  $nn,Y     ;97
    CLC               ;18           TYA               ;98
    ORA     $nnnn,Y   ;19           STA     $nnnn,Y   ;99
    NOP1              ;1A           TXS               ;9A
    ASLORA  $nnnn,Y   ;1B           SHS     $nnnn,Y   ;9B
    NOP2    $nnnn,X   ;1C           SHY     $nnnn,X   ;9C
    ORA     $nnnn,X   ;1D           STA     $nnnn,X   ;9D
    ASL     $nnnn,X   ;1E           SHX     $nnnn,Y   ;9E
    ASLORA  $nnnn,X   ;1F           SHA     $nnnn,Y   ;9F
    JSR     $nnnn     ;20           LDY     #$nn      ;A0
    AND     ($nn,X)   ;21           LDA     ($nn,X)   ;A1
    JAM               ;22           LDX     #$nn      ;A2
    ROLAND  ($nn,X)   ;23           LDXLDA  ($nn,X)   ;A3
    BIT     $nn       ;24           LDY     $nn       ;A4
    AND     $nn       ;25           LDA     $nn       ;A5
    ROL     $nn       ;26           LDX     $nn       ;A6
    ROLAND  $nn       ;27           LDXLDA  $nn       ;A7
    PLP               ;28           TAY               ;A8
    AND     #$nn      ;29           LDA     #$nn      ;A9
    ROL               ;2A           TAX               ;AA
    ANC     #$nn      ;2B           LXA     #$nn      ;AB
    BIT     $nnnn     ;2C           LDY     $nnnn     ;AC
    AND     $nnnn     ;2D           LDA     $nnnn     ;AD
    ROL     $nnnn     ;2E           LDX     $nnnn     ;AE
    ROLAND  $nnnn     ;2F           LDXLDA  $nnnn     ;AF
    BMI     $nnnn     ;30           BCS     $nnnn     ;B0
    AND     ($nn),Y   ;31           LDA     ($nn),Y   ;B1
    JAM               ;32           JAM               ;B2
    ROLAND  ($nn),Y   ;33           LDXLDA  ($nn),Y   ;B3
    NOP2    $nn,X     ;34           LDY     $nn,X     ;B4
    AND     $nn,X     ;35           LDA     $nn,X     ;B5
    ROL     $nn,X     ;36           LDX     $nn,Y     ;B6
    ROLAND  $nn,X     ;37           LDXLDA  $nn,Y     ;B7
    SEC               ;38           CLV               ;B8
    AND     $nnnn,Y   ;39           LDA     $nnnn,Y   ;B9
    NOP1              ;3A           TSX               ;BA
    ROLAND  $nnnn,Y   ;3B           LAS     $nnnn,Y   ;BB
    NOP3    $nnnn,X   ;3C           LDY     $nnnn,X   ;BC
    AND     $nnnn,X   ;3D           LDA     $nnnn,X   ;BD
    ROL     $nnnn,X   ;3E           LDX     $nnnn,Y   ;BE
    ROLAND  $nnnn,X   ;3F           LDXLDA  $nnnn,Y   ;BF
    RTI               ;40           CPY     #$nn      ;C0
    EOR     ($nn,X)   ;41           CMP     ($nn,X)   ;C1
    JAM               ;42           NOP2    #$nn      ;C2
    LSREOR  ($nn,X)   ;43           DECCMP  ($nn,X)   ;C3
    NOP2    $nn       ;44           CPY     $nn       ;C4
    EOR     $nn       ;45           CMP     $nn       ;C5
    LSR     $nn       ;46           DEC     $nn       ;C6
    LSREOR  $nn       ;47           DECCMP  $nn       ;C7
    PHA               ;48           INY               ;C8
    EOR     #$nn      ;49           CMP     #$nn      ;C9
    LSR               ;4A           DEX               ;CA
    ANDLSR  #$nn      ;4B           SBX     #$nn      ;CB
    JMP     $nnnn     ;4C           CPY     $nnnn     ;CC
    EOR     $nnnn     ;4D           CMP     $nnnn     ;CD
    LSR     $nnnn     ;4E           DEC     $nnnn     ;CE
    LSREOR  $nnnn     ;4F           DECCMP  $nnnn     ;CF
    BVC     $nnnn     ;50           BNE     $nnnn     ;D0
    EOR     ($nn),Y   ;51           CMP     ($nn),Y   ;D1
    JAM               ;52           JAM               ;D2
    LSREOR  ($nn),Y   ;53           DECCMP  ($nn),Y   ;D3
    NOP2    $nn,X     ;54           NOP2    $nn,X     ;D4
    EOR     $nn,X     ;55           CMP     $nn,X     ;D5
    LSR     $nn,X     ;56           DEC     $nn,X     ;D6
    LSREOR  $nn,X     ;57           DECCMP  $nn,X     ;D7
    CLI               ;58           CLD               ;D8
    EOR     $nnnn,Y   ;59           CMP     $nnnn,Y   ;D9
    NOP1              ;5A           NOP1              ;DA
    LSREOR  $nnnn,Y   ;5B           DECCMP  $nnnn,Y   ;DB
    NOP2    $nnnn,X   ;5C           NOP3    $nnnn,X   ;DC
    EOR     $nnnn,X   ;5D           CMP     $nnnn,X   ;DD
    LSR     $nnnn,X   ;5E           DEC     $nnnn,X   ;DE
    LSREOR  $nnnn,X   ;5F           DECCMP  $nnnn,X   ;DF
    RTS               ;60           CPX     #$nn      ;E0
    ADC     ($nn,X)   ;61           SBC     ($nn,X)   ;E1
    JAM               ;62           NOP2    #$nn      ;E2
    RORADC  ($nn,X)   ;63           INCSBC  ($nn,X)   ;E3
    NOP2    $nn       ;64           CPX     $nn       ;E4
    ADC     $nn       ;65           SBC     $nn       ;E5
    ROR     $nn       ;66           INC     $nn       ;E6
    RORADC  $nn       ;67           INCSBC  $nn       ;E7
    PLA               ;68           INX               ;E8
    ADC     #$nn      ;69           SBC     #$nn      ;E9
    ROR               ;6A           NOP               ;EA
    ANDROR  #$nn      ;6B           SBC     #$nn      ;EB
    JMP     ($nnnn)   ;6C           CPX     $nnnn     ;EC
    ADC     $nnnn     ;6D           SBC     $nnnn     ;ED
    ROR     $nnnn     ;6E           INC     $nnnn     ;EE
    RORADC  $nnnn     ;6F           INCSBC  $nnnn     ;EF
    BVS     $nnnn     ;70           BEQ     $nnnn     ;F0
    ADC     ($nn),Y   ;71           SBC     ($nn),Y   ;F1
    JAM               ;72           JAM               ;F2
    RORADC  ($nn),Y   ;73           INCSBC  ($nn),Y   ;F3
    NOP2    $nn,X     ;74           NOP2    $nn,X     ;F4
    ADC     $nn,X     ;75           SBC     $nn,X     ;F5
    ROR     $nn,X     ;76           INC     $nn,X     ;F6
    RORADC  $nn,X     ;77           INCSBC  $nn,X     ;F7
    SEI               ;78           SED               ;F8
    ADC     $nnnn,Y   ;79           SBC     $nnnn,Y   ;F9
    NOP1              ;7A           NOP1              ;FA
    RORADC  $nnnn,Y   ;7B           INCSBC  $nnnn,Y   ;FB
    NOP3    $nnnn,X   ;7C           NOP3    $nnnn,X   ;FC
    ADC     $nnnn,X   ;7D           SBC     $nnnn,X   ;FD
    ROR     $nnnn,X   ;7E           INC     $nnnn,X   ;FE
    RORADC  $nnnn,X   ;7F           INCSBC  $nnnn,X   ;FF

Die Operanden müssen jeweils komplett mit 2 oder 4-stelligen Werten eingegeben werden: vergessen Sie auch nicht, die führende(n) Null(en) mit einzugeben! Diese Beschränkung bezieht sich nur auf die Eingabe der mnemonischen Assemblerausdrücke für die 8501, jedoch nicht auf die Befehle für den Debugger. Sämtliche Leerstellen werden innerhalb der Ausdrucksbegrenzer (Komma, Klammern, $, #) ignoriert. Sie können also z.B. eingeben: BNE$0672, LDA # $ 01 usw. Manche Befehle (NOP1, NOP2, JAM usw.) weisen die gleiche Mnemomik und Operandenstruktur auf: beim Assemblieren wird der kleinste zutreffende Opcode genommen.

Der Debugger verwendet den Kommandozeilen-Editor, der in jedem DOS vorhanden ist: Sie können die Tasten F1, F2, F3, F4, F5, Einfg, Entf, Esc und Rücktaste in jedem DOS verwenden. Fernen können Sie ^C (Strg-C) und ^S (Strg-S) bei der Textausgabe benutzen. Einige DOS-Dialekte verfügen über Erweiterungen wie z.B. HISTORY.COM, wodurch der Funktionsumfang des Editors erweitert wird.

Zum Speichern in einer Datei können Sie die DOS-eigenen Standardumleitungen nutzen. Zum Beispiel wird
  PLUS4 <CMDS >LISTING
den Emulator normal aufrufen und starten, jedoch nach Drücken von F9 alle Eingaben aus der Datei CMDS holen und diese an die Datei LISTING übergeben. Die Datei CMDS besteht aus den Debugger-Befehlen (1 Befehl je Zeile), und in der letzten Zeile muß der Befehl "Q" tehen.

Der Debugger arbeitet korrekt mit PRG-Dateien und unterstützt reine Binärformate (einige andere Formate werden wie Binärformate abgearbeitet).

HINWEIS! Die I/O-Menüs sind über den Debugger nicht verfügbar, d.h. die Befehle G, O, P.

Timing von Prozessor und TED

Seit Version 1.32 des Emulators ist das Timing zu 99,9% exakt. Auch FLI-Demos müssen laufen.

Die maximale Framerate des Emulators ist wegen der Synchronisation mit dem echten Plus/4 auf ca. 50,3 Hz begrenzt (die Emulatorgeschwindigkeit kann jedoch verändert werden).

Emulation der Datasette

Zumindest bis jetzt ist das CTF-Format das beste für die Emulation der Datasette. Das Format hat einige Merkmale, die eine CTF-Datei besser aussehen lassen als eine Datei von echter Kassette.

Vor Abspielen einer Kassetten-Datei können Sie den Lese/Schreibkopf der Datasette exakt zum gewünschten Block positionieren (per Menü). Nach dem Einlesen des letzten Blocks vom Band geht der Lese/Schreibkopf automatisch zum 1. Block zurück (= AUTO REWIND).

Beim Bespielen der Kassette wird der Lese/Schreibkopf wird automatisch zum Anfang des freien Bereichs auf dem Band positioniert. Nach dem Schreibvorgang wird der Lese/Schreibkopf an den Anfang des 1. Blocks auf der Kassette positioniert.

ACHTUNG - WARNUNG! Das Einschalten des Datasette-Antriebsmotors ohne einen I/O-Vorgang und der gleichzeitige Zugriff auf die serielle Commodore-Schnittstelle kann einen Block Datenmüll auf dem Band erzeugen, oder einen Block, der mit unlesbarem Datenmüll anfängt (dies ist vergleichbar mit der realen Datasette: wenn Sie an der echten Datasette die Tasten PLAY und RECORD gleichzeitig drücken und dann versuchen, auf die serielle Schnittstelle des Plus/4 zuzugreifen , entsteht Datenmüll auf dem Band). Der unleserliche Block wird in Menüs u.U. nicht erkannt. - Um diesen Fehler zu vermeiden, betätigen Sie PRESS PLAY (& RECORD) ON TAPE - auf der PC-Tastatur die ScrollLock-Taste- erst nach entsprechender Aufforderung.

Das TAP-Format wird für Nur-Lesezugriffe ebenfalls unterstützt.

Menüs

Die Menüs können nur bei abgeschaltetem Debugger aufgerufen werden. Sie bieten eine Reihe nützlicher Merkmale: FREEZE / RESTORE des aktuellen Programms zur Laufzeit (um z.B. jederzeit ein Spiel zu speichern, Zugriff auf externe Geräte, schnelles Laden/Speichern, Import/Export von Programmen, Daten usw.

Die Spalte "Size" gibt die Dateigröße an: CTF-Dateien in Bytes, D64-Abbilder in Blocks.

Falls die Spalte "Type" ein "?" einthält und die Dateigröße mit "0" angezeigt wird, handelt es sich entweder um einen Turbo-Block oder aber um einen unleserlichen Block.

Die Menüs verfügen über Mausunterstützung.

CTF-Format

CTF = Commodore Tape File. Das Format wurde vor dem TAP-Format entwickelt. Das CTF-Format ist zu 100% kompatibel zur echten Kassette (wie auch das TAP-Format) und bietet einige Informationen über die Datenstruktur auf dem Band, wodurch der Lese/Schreibkopf an den Anfang eines beliebigen Blocks positioniert werden kann (wie beim T64-Format). Das CTF-Format bietet unbegrenzte Kapazität. Das T64-Format hingegen kann die Anordnung der Blocks nach CBM-Schreibmethode nicht wiedergeben und kann z.B. nicht mit Datendateien (mittels OPEN, PRINT#, CLOSE, ...) sowie Turboladern und -Speichern arbeiten.

Es ist nicht sonderlich schwierig, T64 nach CTF oder CTF nach TAP zu konvertieren. Die reverse Konversion hingegen ist uneinheitlich und erfordert einiges an AI. Die Umsetzung von CTF oder TAP in T64 ist fast unmöglich, wohingegen die Konvertierung von TAP zu CTF recht einfach ist. Die Dateigrößen im CTF-Format sind wesentlich kleiner als die gleiche Datei im TAP-Format.

TAP ist lediglich ein Zwischenträger zum Auslesen der Daten von echten Kassetten. Für das echte Datasetten-Feeling (Datendateien, Turbisaver ....) sollten Sie CTF benutzen! Das Hilfswerkzeug CTF2TAP kann alle CTF-Dateien ins TAP-Format umsetzen.

Dateistruktur eines CTF.

OFFSET  NAME            LENGTH  COMMENTS
0       FORMAT VERSION   2      0 FOR VERSION 1.xx OF THE EMULATOR
2       HEAD POSITION    2      HEAD POINTS ON THE TAPE'S BLOCK WITH THIS
                                NUMBER
4       CAPACITY         2      QUANTITY OF BLOCKS+1 ON THE TAPE
6       BLOCK #1 POINTER
        (TO THE END OF
        THIS BLOCK +1)   4      THE POINTER CONTAINS ABSOLUTE FILE
                                POSITION (NNNN)
0AH     TIME CONSTANT    1      DURATION (IN TED TICKS) OF HALF-PERIOD OF
                                MAXIMUM FREQUENCY WAVES
0BH     DATA             ?
NNNN    BLOCK #2 POINTER 4      LAST BLOCK POINTER POINTS TO END OF FILE
NNNN+4  BLOCK #2 TIME
        CONSTANT         1
        ...

Die Daten am Startpunkt 0BH bestehen aus Bits entsprechend dem Datasettenport der CPU durch feste Zeitintervalle (die Zeitkonstante 0AH ist diesem Wert gleich).

Ein Standard-Commodore 264 Band-Block beginnt und endet mit einer Pause der max. Frequenz. Jedes Byte hat folgende Struktur:

[SM][B1][B2][B3][B4][B5][B6][B7][B8][B9];
[SM]=[T2][T1];
[Bn]=[T0][T1], if [Bn]=0;
[Bn]=[T1][T0], if [Bn]=1.

[SM] - Bytemarker Start, [Bn] - Bit der Informationsnr.n, [T0] - Max. Frequenz (=F0) Periode, [T1] - Periode mit einer Frequenz 2*F0, [T2] - Periode mit einer Frequenz 4*F0. [B9] - Ein Parity bit, es wird ungerade Parity benutzt.Das letzte Byte der Blockdaten enthält das XOR aller vorhergehenden Bytes. Jeder Block wird zweimal auf das Band geschrieben (mit Zwischenraum). Die folgenden 9 Bytes leiten einen Block zum ersten Mal ein: 89h, 88h, .. 81h; die darauffolgenden 9 Bytes zum zweiten Mal: 9, 8, ...1.

Somit belegt jedes Datenbyte auf dem Band im Standard-Commodore 264-Format (9*6+12)*2=132 Bits=16,5 Byte. Die Blocklänge in einer Datei im CTF-Format (im Standardformat) entspricht in etwa [Länge des Zwischenraums am Start =4096]+[Zwischenraumlänge zwischen den Blocks =110]+[Länge des Zwischenraums am Ende =49]+16,5*([Blocklänge]+10. Viele Turbosaver (wie NOVALOAD) erreichen eine Einsparung von weniger als 3 Byte in einer CTF-Datei.

Jeder Block im Standard-Commodore 264-Tapeformat, ausgenommen der eigentliche Programmblock, enthält nach 9 Markierungsbytes ein Byte, das über die Spezifikation Auschschluß gibt:

1 - Standard (BASIC) Programmheader (nächster Block lädt bei $1001)
2 - Datenblock (erzeugt durch PRINT# oder CLOSE)
3 - Maschinensprachen-Programmheader (nächster Block lädt bei vorgegebener Adresse)
4 - Header der Datendatei (erzeugt durch OPEN)
5 - Bandende (EOT) Markierungsblock.

C2F-Format

C2F - Commodore 264 Freeze Format. Hier die Struktur:

OFFSET  AREA NAME       LENGTH  COMMENTS

------- FORMAT SPECIFICATION -----------
0       VERSION         2       1 SINCE VERSION 1.10 OF THE EMULATOR

------- ADDITIONAL INFORMATION ---------
2       CPU TIME        1       TICKS TO CPU (UNUSED SINCE VER. 1.32)

------- CPU REGISTERS ------------------
3       PC              2
5       SP              2       HIGH BYTE = 1
7       XR              2       HIGH BYTE = 0
9       YR              2       HIGH BYTE = 0
0BH     SR              1
0CH     AC              1

------- CPU PORTS ----------------------
0DH     $0              1
0EH     $1              1

------- MEMORY CONFIGURATION -----------
0FH     ROMMAP          1
10H                     1       BITS 0-1 - SOUND HARDWARE (0-PC,
                                  1-Adlib, 2-None, 3-Sound Blaster)
                                BITS 2-4 - JOYSTICK2 HARDWARE
                                  (0-K1, 1-K2, 2-J1, 3-J2, 4-None)
                                BITS 5-7 - JOYSTICK1 HARDWARE

------- TED ----------------------------
11H     TIMER #1 RELOAD
        VALUE           2

------- ADDITIONAL INFORMATION ---------
13H     LED             1       KBD LED INDICATOR DATA - CapsLock, Play,
                                   and Record buttons state

------- TED ----------------------------
14H     TED REGISTERS   20H(32)

------- RAM ----------------------------
34H     $2-$FFFF        0FFFEH(65534)

CFG-Dateiformat

Das erste Byte ist die Nummer eines Videomodus, multipliziert mit 2, das zweite Byte ist eine Frame-Skippingdeterminante (1 — kein Skipping, 3 — 2/3 Skipping, 5 — 4/5 Skipping usw.), das dritte Byte bestimmt die Tonausgabe.(0 = PC-Lautsprecher usw.)

Die CFG-Datei ist die PLUS4.CFG.

Es kann eine CFG-Datei mit beliebigem Namen von der Kommandozeile aus geladen werden. Die Dateierweiterung CFG muß enthalten sein.

Kommandozeilen-Parameter

Bis zu 12 Parameter können auf der Kommandozeile übergeben werden — PRG/P0N/D64/CTF/TAP/C2F/ROM/CFG-Dateien. Diese Dateien werden beim Aufruf des Emulator automatisch geladen.

Ein Beispiel:
plus4 a.prg x\b.prg c.p01 e.d64 f.tap
lädt `a', `b' (aus dem Unterverzeichnis `x'), und die Programme `c' in den Hauptspeicher, weist das D64-Abbild `e' dem Laufwerk '8' zu sowie das TAP-Abbild `f'.

Durch das Setzen von "/8" (Voreinstellung) oder "/9" kann den D64-Abbildern die eindeutige Laufwerksbezeichnung zugewiesen werden.

Somit weist plus4 e.d64 /9g.d64,
Diskimage `e' Laufwerk 8 und Diskimage `g' Laufwerk 9 zu.

Bei den Parametern kann das Arbeitsverzeichnis angegeben werden, wodurch für alle nachfolgenden relationalen Dateien das Verzeichnis festgelegt wird. Innerhalb einer Parameterliste können diverse Arbeitsverzeichnisse festgelegt werden.

Ein Beispiel:
plus4 c:\cplus4\d64\ disk.d64 /9..\d2.d64 d:\ cbm\a.prg
setzt das Arbeitsverzeichnis, weist ihm `disk.d64' zu, weist `d2.d64' `c:\cplus4\' zu, setzt ein neues Arbeitsverzeichnis und lädt `a.prg' aus `d:\cbm\'.

HINWEIS! Geben Sie bei jeder Datei die Dateinamenerweiterung mit an. Das Arbeitsverzeichnis ist mit "\" abzuschließen. Die Reihenfolge der Parameter ist einzuhalten - bei unrichtiger Reihenfolge könnte eine Parameter den vorigen überschreiben

Eine ROM-Bank wir durch ein vorangestelltes /N gekennzeichet, wobei N die Nummer der ROM-Bank ist. (siehe hier). Die vordefinierte Banknummer ist 4.

Ein Beispiel:
plus4 c:\crt\c16tutor\ c16tutor_1.rom /5c16tutor2.rom,
lädt zwei ROMs in die Bänke 4 und 5.

Der gewünschte Videomodus kann ebenfalls über die Kommandozeile vorgewählt werden. Geben Sie ein "#vid" Videomodi, um den gewünschten Modus auszuwählen. plus4 1vid
setzt das Bild auf 320x240 —, die Einstellung lt. CFG-Datei wird hierbei überschrieben. Die Nummer des Videomodus ist in Hexadezimal-Schreibweise, d.h. anstelle "10" ist "A" einzugeben.

Die Tonausgabe wird entsprechend vorgewählt; Syntax "#snd". Die entsprechenden Variablen finden Sie in CFG-Datei oder Erläuterung des C2F-Formates

Ein Beispiel:
plus4 1snd
wählt die Adlib-Soundkarte.

Die Eingabe "?" ruft die möglichen Kommandozeilen-Parameter auf-

Kompilierung

Zur Kompilierung der Quellen benötigen Sie FASM V1.67 oder eine neuere Version.

Der Befehl
`fasm plus4.asm'
erzeugt die ausführbare Datei. Verwenden Sie FASM unter nativem DOS ohne Memeory-Manager wie EMM386 oder mit DPMI-Erweiterungen oder unter einem Linux. Zur Kompilierung benötigen Sie in dem Verzeichnis, welches das Unterverzeichnis CV enthält, die folgenden Dateien: BASIC.ROM (16 kB), KERNAL.ROM (16 kB), 3P1.ROM (32 kB), sowie 1551.ROM (16 kB). Die dritte und vierte Datei sind nicht zwingend und können beliebige Programme enthalten.

(C) Copyright

Almost all data and program files of this package are written by V.Lidovski in the X/1996-IV/1997;VI-VIII,XII/1998;IV/2000;XI/2002; VII-VIII/2003;II,V-VIII,X,XII/2004;VI-VIII,XI,XII/2005;I,V,VII-VIII/2006; I-III,VIII,XII/2007;I,VIII/2008.

All source code is Copyright (C) 1997-2008 Vladimir Lidovski. This program is distributed under the GNU General Public License, Version 2, or, at your discretion, any later version. The GNU General Public License is available via the Web here. The GPL is designed to allow you to alter and redistribute the package, as long as you do not remove that freedom from others.

Translation into German - deutsche Übersetzung: H.Voges, VII/2012

BUGS REPORTS

Please send messages about any discovered bugs to author's email — litwr@yandex.ru.

Bitte teilen Sie festgestellte Bugs/Mängel dem Autor an seine o.a. E-Mail-Adresse mit.

Entwicklungsgeschichte und letzte Aktualisierungen

The first version of this emulator was finally compiled at the 9th of April of 1997. It was uploaded to ftp.funet.fi at the 30th of June of 1997.

Die erste Version dieses Emulators wurde am 09.04.1997 kompiliert und am 30.06.1997 zu ftp.funet.fi hochgeladen und veröffentlicht.

Die Entwicklungsgeschichte ist hier zu finden (englischsprachig).

v1.42 (VIII-2008)