c't-BASIC-FAQ
Memory Map für c't-BASIC
F: Gibt es eine Übersicht über die verwendeten Hardware-Adressen (Memory Map)?
A: Die c't-BASIC Memory Map finden Sie unter "Dokumentation" im Trac-Browser als PDF. Die verwendeten Hardware-Adressen (meist natürlich "virtuelle" im FPGA) und alle verwendeten ZeroPage-Adressen sind in der Datei defines_cm.asm aufgeführt.
BASIC-Programme automatisch ausführen
F: Wie kann ich nach dem Einschalten ein BASIC-Programm automatisch ausführen? Mein Problem sind die Quotes, die in der Firmware 2.61 und den ct-Basic LOAD / SAVE Befehlen leider gleich sind, so dass TSR 67=LOAD "TEST.BAS" leider nicht funktioniert.
A: Ja, die Firmware "verschluckt" die Quotes (muss sie auch, aus anderen Gründen). Abhilfe ist durch einen Trick möglich, den ich schon bei der "Selbststartenden FPGA-Demo" (bitte mal ansehen, da sind noch mehr drin) angewendet habe. Zunächst BASIC.INI um die Zeilen nach "//BASIC-Autostart" erweitern:
CFG=main.bit // DAT-File mit ROM-Inhalt Byte-orientiert AIW=1 AIS=0 AIR=128 // Start ROMs bei $C000 = 49152 AIM=49152 CFG=ehbasic.dat // Reset manuell VAL 129=0 // Type C for Coldstart: TSR 67="C" //BASIC-Autostart WTS TTF 67="AUTOLOAD.MAC"
Dann eine Textdatei namens "AUTOLOAD.MAC" erstellen (Name ist eigentlich beliebig, muss aber mit dem in BASIC.INI übereinstimmen), die beispielsweise folgende Zeilen enthält:
REM Hallo! Ich lade ein automatisch startendes BASIC-Programm LOAD "GTEST.BAS"
und auf die Karte speichern. Der TTF-Befehl "tippt" dann den Dateiinhalt im BASIC ein, einschließlich Quotes. In GTEST.BAS muss natürlich als erste Zeile REM AUTOSTART stehen. (cm)
DACRAM statt CORERAM
F: Kann ich testweise auch die DACRAM-Karte für das c't-BASIC verwenden?
A: Ja, die zusätzlichen Bauteile stören nicht. Die selbststartende Demo läuft dank Script-Steuerung auch ohne PS/2-Tastatur, lediglich die DACRAM-Karte mit 512er SRAM sollte vorhanden sein. Auf Tastatur und serielle Schnittstellen müssen Sie hier verzichten. Das enthaltene BASIC ist älteren Datums.
Selbstgemachtes BASIC
F: Kann man das ct-BASIC selbst ändern und neu assemblieren?
A: Ja: Installieren Sie den 6502 Simulator/Assembler von Michal Kowalski auf Ihrem Windows-PC. Laden Sie die Hauptdatei main_cm.asm sowie die (ggf. zu ändernden) Includes basic_kbd.asm, basic_cm.asm, defines_cm.asm und monitor_cm.asm. Assemblieren Sie immer main_cm.asm!
Das assemblierte BASIC-Binary kann mit "Save Code" (Ctrl-K) und der Option "Save binary image(.b65)" abgespeichert werden. Als Startadresse ist unter "Options" die Adresse $<B000 einzutragen. Als Dateiname für das Binary kann gleich "ehbasic.dat" angegeben werden. Die Länge des Binaries muss dann 16384 Bytes ($5000) betragen.
BASIC-Programme am PC erstellen
F: Wie kann man BASIC-Programme am PC bearbeiten? Wenn ich beispielsweise GTEST.BAS mit einem Editor öffne, erhalte ich nur einen Zeichensalat.
A: BASIC-Programme werden platzsparend in "tokenisierter" Form im Speicher abgelegt, d.h. BASIC-Schlüsselwörter sind durch je ein "Token" ersetzt. Verwenden Sie zum Konvertieren das Kommandozeilen-Programm EHBC.EXE.
Binärdaten laden und speichern
F: Wie kann man Binärdaten im RAM aus BASIC heraus laden und abspeichern?
A: Mit Version 2.1f gibt es die Option einer Ladeadresse beim LOAD-Befehl (siehe PDF ct-BASIC-Referenz), z.B. LOAD "MYPROG.DAT",$BE00. Beim SAVE-Befehl fehlt diese Möglichkeit, man kann aber durch LABOUT/LABSET-Befehle das FPGA-Modul "manuell" zum Abspeichern eines beliebigen Speicherbereichs bewegen; siehe auch BASIC-Programm BINSAVE.BAS:
10000 REM SAVE BINARY CODE SUBROUTINE 10005 REM MAINCH 9 RECOGNIZED BY FPGA MODULE INDEPENDENT OF JUMPER SETTING 10010 LABBUS 0:LABOUT "9:AIS=0" 10020 LABOUT "9:AIR=128" 10030 LABOUT "9:AIW=1" 10040 LABOUT "9:AIM=32768":REM STARTADDR 10050 LABOUT "9:AIE=33024":REM ENDADDR 10060 LABOUT "9:BSV=BINCODE.DAT":REM FILENAME 10070 RETURN
Mit dem (reservierten) MainCh 9 fühlt sich das FPGA-Modul übrigens unabhängig von der per Jumper eingestellten Adresse immer angesprochen. Wenn Sie mit dieser Methode Daten aus anderen Bänken laden/speichern wollen, müssen Sie zu den Start-/Endadressen (AIM=, AIE=) den Wert "65536 mal Banknummer" hinzuaddieren.
PEEKs und POKEs in andere Bänke
F: Ich will eine andere BANK als reinen Datenspeicher verwenden. Wie kann ich in andere Programmspeicher-Bänke PEEKen und POKEn?
A: Diese Möglichkeit besteht ab Version 2.1g: Die (Zeropage-)Speicherstelle $46 (70 dezimal) enthält die BANK-Nummer, auf die sich PEEK, POKE, DEEK und DOKE beziehen (und nur diese!). $47 (71 dez.) enthält die aktuelle BANK, in der das BASIC-Programm gerade läuft. Ein POKE des Wertes X auf Adresse $1000 in BANK 1 geht also folgendermaßen:
1000 POKE 70,1: REM BANK 1 fuer PEEK/POKE einschalten 1010 POKE $1000,X: REM ggf. auch weitere PEEKs/POKEs in BANK 1 1020 POKE 70,PEEK(71): REM Zurueckschalten auf aktuelle BANK
Der Wert in Speicherstelle $46 (70 dez.) ist für Zugriffe außerhalb des mit BANK umgeschalteten BASIC-Programmspeichers ohne Belang. Bitte beachten Sie hierzu auch das PDF ct-BASIC MemoryMap. Übrigens bezieht sich ein CALL ebenso auf die Bank in Adresse $46, so dass ggf. auch Maschinenprogramme in anderen Bänken ausgeführt werden können.
Eigene Assembler-Programme
F: Wo lege ich eigene Assembler-Programme am besten ab?
A: Bis Version 2.2c: Zwischen $BD00 und $BFFF sind 768 Bytes freier Speicher, der aus allen Bänken gleichermaßen zugänglich ist (wird nicht mit BANK umgeschaltet). Beachten Sie auch die Hinweise im vorhergehenden Absatz.
Ab Verion 2.3: Diese Version verwendet einen externen Text-Bildschirmspeicher, hier ist der Bereich $B000 bis $B400 frei und für alle Bänken gleich.
Ebenso besteht die Möglichkeit, die obere Speichergrenze des BASIc-Programms nach unten zu verschieben; diese wird mit einem DOKE (Word-POKE) auf Adresse $85/$86 wie folgt festgelegt:
10 DOKE $85,$8000:REM MSB BASIC-Speicherende, hier fuer $8000 20 CALL $C006:REM ClearVars, Stringspeicher neu setzen 30 LOAD "SAMPLE.BIN",$8000:REM Maschinenprogramm laden ab $8000 (bis $AFFF max.) 40 CALL $8000:REM Maschinenprogramm aufrufen
Achtung: Dies funktioniert erst mit Version 2.1h, vorher gab es den ClearVars?-Jump noch nicht!
Animierte Grafiken
F: Wie kann man animierte Grafiken erzeugen, etwa für eine Balkenanzeige oder ein Zeigerinstrument für die Messwerte?
A: Der T65-Core kann auf den Grafik-Speicher nicht lesend zugreifen, Read-Modify-Write-Zyklen scheiden deshalb aus. Objekte können nur mit Überschreiben mit der Grafik-Farbe 0 gelöscht werden; dann sind "darunterliegende" Elemente allerdings ebenfalls verschwunden. Die Grafik-Hardware lässt es allerdings von der Geschwindigkeit her zu, den Grafik-Frame nach jedem Vertikal-Sync zu löschen und komplett neu zu zeichnen, wie es im Beispielprogramm sample.asm bzw. SAMPLEB.BAS (benötigt SAMPLE.BIN) gemacht wird: Dieses bedient sich des PLOTSYNC-Bits des HW-Registers syncFlags, das solange "1" ist, wie sich der Monitor-"Schreibstrahl" vertikal innerhalb des Grafik-Frames befindet. Sobald dieses Bit auf "0" geht, kann der Grafik-Frame gelöscht und neu gezeichnet werden, ohne dass Flackereffekte auftreten.
Mit Version 2.3 sin einige leistungsfähige Grafik-Befehle hinzugekommen, die unter anderem komplette Wellenformen, Messinstrumente und Balkenanzeigen plotten. Die von diesen eingenommene Fläche wird bei Aufruf komplett neu gezeichnet. Für eine flackerfreie Anzeige ist lediglich eine Synchronisation mit FRAME WAIT zu empfehlen (wartet auf PLOTSYNC-Bit).
ISE-Probleme
F: Ich erhalte beim Arbeiten mit Xilinx ISE WebPack immer eine Menge Fehler beim Synthetisieren von ct-BASIC. Warum?
A: ISE ist äußerst eigenwillig mit der Projektdatei. Manchmal reicht es schon, main.sch ein wenig zu verändern, und nichts geht mehr. Offensichtlich taucht das Problem aber nur auf, wenn das Top Level ein Schaltbild ist. Mit einem .VHD hatte ich noch nie (!) Probleme. Workaround wäre, main.sch einen VHD-Wrapper zu verpassen (nur 1:1-Routing) und das main.vhd dann als Top Level zu deklarieren. ISE 11 hat m.E. eine völlig andere Projektdatei-Struktur, hier sollte das Problem nicht auftauchen (dafür andere...)
Dieser ISE-Bug zieht sich jetzt schon über einige Versionen. Zum Übelwerden!
Beim Übersetzen mit anderen ISEs als der 10.1.03 rate ich zur Vorsicht: Die Midpoint-Geschichten (Grafik) sind eher nachlässig kodiert, was Typecasts angeht. Version 11 castet die Signale irgendwie anders.
Ich nehme immer noch die 10er, weil die noch den grafischen Simulations-Editor hat.
