Neues vom SMON
Diese Erweiterung stellt elf weitere Befehle zur Verfügung. So läßt sich der Monitor zum Beispiel frei im Speicher verschieben und Sprites oder Zeichensätze können sehr einfach erstellt und geändert werden.
Um die Befehlserweiterung zu initialisieren, geht man folgendermaßen vor:
- SMON absolut laden.
- Den Basic-Lader (siehe Listing) eintippen und abspeichern.
- Nach dem Start des Laders die Startadresse (dezimal) Ihrer SMON-Version eingeben:
zum Beispiel 49152 (= $C000).
- Den erweiterten SMON zum Beispiel mit "SMONEX” Startadresse Endadresse abspeichern.
Die neuen Routinen werden, genau wie die meisten bereits vorhandenen, durch einen Buchstaben, zum Teil gefolgt von Adressenangaben, aufgerufen. Bei den ersten drei Ausgabebefehlen kann der Speicherinhalt durch Überschreiben der Zeile geändert werden.
Z 4000 (4100) (Zeichendaten)
gibt den Speicherinhalt von $4000 (bis $40FF) folgendermaßen aus: Jeweils ein Byte pro Zeile wird in 8-Bit-Form dargestellt. Dabei ist ein »*« ein gesetztes, ein ».« dagegen ein nicht gesetztes Bit. Die beiden Zeichen sind willkürlich gewählt und können durch Überschreiben der Speicherzellen $xE65, $xE2D (Bit = 1) und $xE69, $xE30 (Bit = 0) in den Bildschirm-Code (!) der gewünschten Zeichen geändert werden.
Die Anwendung dieses Befehls liegt beispielsweise in der gezielten und anschaulichen Beeinflussung bestimmter Steuerbits in VIC, CIA, etc. Andererseits lassen sich — besonders in Verbindung mit dem Kommando »Q« — Zeichendaten leicht modifizieren.
H 4000 (4100)
entspricht dem Befehl »Z« mit dem Unterschied, daß jeweils drei Byte pro Zeile ausgegeben werden. Das entspricht dem Format für Spritedaten. Auf diese Weise steht mit dem erweiterten SMON ein kleiner »Sprite-Editor« zur Verfügung.
N 4000 (4100) (Normaldarstellung)
interpretiert den Speicherinhalt von $4000 (bis $40FF) als Bildschirm-Code und gibt 32 Zeichen pro Zeile aus.
U 4000 (4100) (Übersicht)
Wie »N«, jedoch werden in einer Zeile 40 Zeichen dargestellt. Änderungen sind nur mit »N« möglich. Dieser Befehl dient hauptsächlich dazu, im Speicher abgelegte Bildschirminformationen so auszugeben, wie sie tatsächlich im 40-Zeichen/Zeile-Format aussehen würden. Dieser Befehl ist recht nützlich, um professionelle Videospiele zu analysieren, da hier Spielszenen oft im Bildschirm-Code gespeichert sind.
E 4000 (4100) (Erase)
ist der bereits in 64’er Ausgabe 2/85 vorgeschlagene Erase-Befehl zum Füllen des Speicherbereiches von $4000 bis $40FF mit $00.
Y 40
kopiert die vorhandene SMON-Version in nur drei Sekunden nach $4000 bis $4FFF und nimmt dabei alle notwendigen Anpassungen vor. Die ursprüngliche Speicherversion des Monitors bleibt unverändert. Mit »G 4000« kann man in den neuen SMON springen. Von dem Byte-Wert, der übergeben werden muß, wird nur das obere Nibble ($4) gewertet, so daß sich theoretisch 16 SMON-Versionen im Speicher unterbringen lassen, wobei natürlich nicht alle Möglichkeiten sinnvoll sind.
Auf diese Weise läßt sich stets die erforderliche Speicherversion herstellen, ohne daß langwierige Änderungen notwendig sind.
Q 2000
kopiert den Zeichensatz aus dem ROM von $D000 bis $DFFF in das RAM nach $2000. Dort kann er mit dem Befehl »Z« nach Belieben geändert werden. Möchte man zum Beispiel das Zeichen »A« in ein »Ä« umdefinieren, so ist der Zeichensatz mit »Q 2000« ins RAM zu kopieren. Anschließend kann mit »Z 2000 2015« der Bereich in binärer Form auf dem Bildschirm ausgegeben werden, in dem auch das Zeichen »A« steht. Dieses kann nun (siehe Bild) in ein »Ä« geändert werden, indem man mit dem Cursor an die zu ändernde Stelle fährt und für einen Punkt, der gesetzt werden soll, ein »*« und für einen Punkt der nicht gesetzt werden soll ein ».« setzt. So, jetzt ist der Zeichensatz umdefiniert, aber noch nicht aktiviert. Als nächstes muß dem Videocontroller die Startadrese des neuen Zeichensatzes mitgeteilt werden. Dazu ist die Adresse $D018, in der eine hexadezimale 15 steht, durch eine hexadezimale 18 zu ersetzen.
J
bringt den letzten Ausgabebefehl ( K, D, M, Z, H, N, U) auf den Bildschirm zurück. Mit RETURN wird der letzte Befehl noch einmal ausgeführt.
Zum Schluß noch ein Tip:
DATA-Zeilen in Hex-Byte-Darstellung sind wegen ihrer konstanten Länge (immer zwei Ziffern pro Wert!) übersichtlicher als solche mit dezimalen Zahlen. Da für die Ausgabe von Hex-Werten bereits alle Routinen im SMON integriert sind, kann der »B«-Befehl (Basic-DATA-Zeilen erzeugen) durch Verändern eines einzigen Sprungbefehles dahingehend manipuliert werden, daß der Speicherinhalt künftig in Form von Hex-Byte ausgegeben wird:
Disassemblieren Sie dazu den Byte-Ausgabebefehl mit »D x99F« und ersetzen »JSR BDD1« durch »JSR x32A«. Für das »x« muß der 4-KByte-Block, in dem die zu ändernde SMON-Version steht, eingesetzt werden. Liegt Ihre SMON-Version bei $C000, so ersetzen Sie das »x« durch ein »C«.
Die Gesamtlänge der DATA-Zeile kann außerdem durch Verändern der Speicherzelle $x9AE variiert werden. Bei dem Wert $1C werden zum Beispiel genau acht Hex-Byte pro Zeile ausgegeben.
(Mark Richters/ah)
100 rem ******************************* 110 rem * * 120 rem * smon - erweiterung * 130 rem * * 140 rem * von mark richters * 150 rem * allerstr.4 * 160 rem * 2806 oyten * 170 rem * tel.: 04207/1870 * 180 rem * * 190 rem ******************************* 200 : 210 print"bitte die startadresse" 220 print"ihrer smon-version eingeben!" 230 input h : h=h/4096 240 if h<>int(h) then 210 250 : 260 : 270 dim w(75) 280 for i=0 to 9 290 : w(48+i)=i 300 : w(65+i)=i+10 310 next i 320 : 330 for i=1 to 4 340 : read k,z : k=k+h*4096 350 : for j=k to k+z-1 360 : read a$ 370 : a=w(asc(a$)) 380 : b=w(asc(right$(a$,1))) 390 : s=s+a+b 400 : if asc(a$)=42 then a=h 410 : p=a*16+b : poke j,p 420 : next j 430 next i 440 : 450 if s=7031 then print"ok!":goto470 460 print"fehler in datas !" 470 stop 480 : 490 data97,7 500 data27,3a,3b,2c,28,29,21 510 : 520 data739,28 530 dataa2,06,dd,61,*0,f0,08,ca 540 data10,f8,a9,2e,20,d2,ff,20 550 dataca,*2,c9,2e,f0,f9,4c,85 560 data*f,4c,b2,*f 570 : 580 data781,2 590 dataf0,ed 600 : 610 data3593,503 620 dataa9,80,2c,a9,00,85,ab,20 630 data64,*2,24,ab,10,03,a2,29 640 data2c,a2,28,20,40,*3,20,23 650 data*3,a0,06,a2,00,a1,fb,0a 660 data48,b0,03,a9,2e,2c,a9,2a 670 data91,d1,ad,86,02,91,f3,68 680 datac8,e8,e0,08,d0,e9,20,67 690 data*3,24,ab,30,04,c0,1e,90 700 datada,20,5d,*4,90,c4,60,a0 710 data08,2c,a0,18,20,7e,*2,20 720 datab8,*2,a2,08,a9,00,85,aa 730 data20,ca,*2,c9,2e,f0,07,c9 740 data2a,f0,04,4c,d1,*2,18,26 750 dataaa,88,ca,d0,eb,a5,aa,81 760 datafb,c1,fb,d0,ee,20,67,*3 770 datac0,00,d0,d6,60,a9,80,2c 780 dataa9,00,85,ab,20,64,*2,20 790 data51,*3,24,ab,10,0b,a9,21 800 data20,d2,ff,20,23,*3,a0,08 810 data2c,a0,00,a2,00,a1,fb,20 820 data4f,*4,d0,f9,20,5d,*4,90 830 datade,60,20,7e,*2,a2,00,a0 840 data08,b1,d1,81,fb,c1,fb,d0 850 dataaa,20,56,*4,90,f3,60,20 860 data8d,*2,29,f0,85,ff,20,3c 870 data*f,20,d6,*9,20,3c,*f,a9 880 data14,85,fb,a9,02,05,ff,85 890 datafc,a9,d1,85,fd,a9,0f,05 900 dataff,85,fe,20,68,*a,a0,00 910 dataa2,0d,bd,f2,*f,05,ff,85 920 datafc,ca,bd,f2,*f,85,fb,b1 930 datafb,29,0f,05,ff,91,fb,ca 940 data10,e8,a9,2b,85,fb,a9,00 950 data05,ff,85,fc,a0,35,b1,fb 960 data29,0f,05,ff,91,fb,88,88 970 data10,f4,a9,de,85,fb,a9,0f 980 data05,ff,85,fc,a0,13,b1,fb 990 data29,0f,05,ff,91,fb,88,88 1000 data10,f4,60,a5,ff,85,a9,20 1010 data43,*f,68,68,29,f0,85,a5 1020 data18,69,10,85,a7,a9,00,85 1030 dataa4,85,a6,85,a8,60,20,7a 1040 data*2,a9,00,4c,c7,*9,20,7e 1050 data*2,a0,00,a9,d0,84,fd,85 1060 datafe,78,a9,03,85,01,a2,10 1070 datab1,fd,91,fb,c8,d0,f9,e6 1080 datafc,e6,fe,ca,d0,f2,a9,27 1090 data85,01,58,60,48,c9,4a,d0 1100 data10,a0,27,b9,00,02,91,d1 1110 data88,10,f8,68,c6,d6,4c,d6 1120 data*2,a0,06,d9,d7,*f,d0,0a 1130 dataa0,27,b1,d1,99,00,02,88 1140 data10,f8,88,10,ee,68,4c,ff 1150 data*2,a2,0a,dd,d0,*f,f0,06 1160 dataca,d0,f8,4c,d1,*2,20,c5 1170 data*f,4c,d6,*2,8a,0a,aa,bd 1180 datadd,*f,48,bd,dc,*f,48,60 1190 data28,29,21,45,59,51,48,5a 1200 data4e,55,44,4b,4d,52,*e,4f 1210 data*e,b2,*e,56,*f,c7,*e,5e 1220 data*f,0b,*e,08,*e,85,*e,88 1230 data*e,06,00,87,03,2d,0c,5c 1240 data0c,f5,0c,a2,0d,04,0e