Diskussion:SCRSV (TSB)

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Inhaltsverzeichnis[Quelltext bearbeiten]

Macht es nicht Sinn bei längeren Artikel wie diesen, ein Inhaltsverzeichnis zusätzlich einzublenden?
Eventuell müsste man ggf. diskutieren, ob es an der oberen Stelle sinnvoll ist. --Jodigi (Diskussion) 17:37, 2. Mai 2022 (CEST)

Sekundäradresse[Quelltext bearbeiten]

Bei einem Test von mir hat auch bei Sekundäradresse 1 eine Bitmap abgespeichert (Datei mit 33 Blöcken) angelegt ... --JohannKlasek (Diskussion) 12:35, 20. Aug. 2021 (CEST)

TSB testet auf gerade/ungerade, 5 müsste eigentlich auch funktionieren. grins --GoDot (Diskussion) 16:07, 20. Aug. 2021 (CEST)
Ok, wunderbar, hätte sowas schon vermutet. Kann man das so in den Artikel reinschreiben. Nur damit man nicht glaubt, dass Werte anders als 2 oder 3 immer das "alte" Verhalten hervorrufen ... --JohannKlasek (Diskussion) 16:52, 21. Aug. 2021 (CEST)
Ah, ganz so einfach ist es nicht. Der Wert der Sekundäradresse wird nicht auf Bit 0 getestet, sondern stattdessen zweimal rechts rotiert (ROR). Das führt dazu, dass bei einem ungeraden Wert bis 7 das Ergebnis im Akku negativ ist, bei geraden positiv. Darauf testen SCRSV/SCRLD. Es geht also nur bei Sekundäradressen von 0 bis 8. --GoDot (Diskussion) 09:35, 22. Aug. 2021 (CEST)
Aber dann wandert doch Bit 0 - egal für welchen Wert - via C immer nach Bit 7 und wenn auf das Negative-Flag geprüft wird, wie ich im Source sehe, dann müsste das doch für beliebige Sekundäradressen gelten. Ich kann nicht nachvollziehen, warum sich das auf 0 bis 8 beschränken soll ... --JohannKlasek (Diskussion) 17:05, 24. Aug. 2021 (CEST)
Uh! Blackout! Na, klar, es landet nach zweimal ROR ja immer Bit 0 in Bit 7! Also, Kommando zurück: die Sekundäradresse muss gerade sein für den Textscreen und ungerade für die Grafik! Danke! smile --GoDot (Diskussion) 22:24, 24. Aug. 2021 (CEST)
Fein, dann kann ich das so einarbeiten. Auch Danke für die Bestätigung! --JohannKlasek (Diskussion) 17:01, 25. Aug. 2021 (CEST)

Ab TSB'22 und der Möglichkeit, Grafik in nur eine Datei zu speichern, ist die Bedeutung der Sekundäradresse erweitert.
Nach wie vor wird bei geraden Werten (xxxx xx10) der Textschirm gespeichert/geladen. Bei ungeraden Werten gibt es nun zwei Varianten:

  • Mit der Sekundäradresse 3 (oder 7,11 / xxxx xx11) wird nur die Bitmap gespeichert/geladen.
  • Mit der Sekundäradresse 5 (oder 9,13 / xxxx xx01) wird eine Grafik mit Bitmap und Farbe gespeichert/geladen.

Dazu werden mit dreimal ROR die Bits 0 und 1 der Sekundäradresse in die Bits 6 und 7 eines Prüf-Bytes geschoben.

Die Sekundäradressen 0 und 1 (und auch 15) sollten besser nicht benutzt werden, da sie spezielle Bedeutungen besitzen. Mit sa=1 z.B. kann zwar eine Grafik (mit Farbe) gespeichert, nicht aber geladen werden. --Petrus (Diskussion) 16:34, 22. Feb. 2022 (CET)

Bildformat[Quelltext bearbeiten]

Wegen der kompakter programmierten Routinen für SCRSV (und SCRLD) ist die Reihenfolge der gespeicherten Bytes verschieden von der, die in Simons Basic benutzt wird. Dadurch sind gespeicherte niedrigauflösende Grafiken von TSB und Simons Basic nicht kompatibel, d.h. ein mit Simons Basic gespeicherter Bildschirm wird in TSB nicht korrekt angezeigt und umgekehrt. Dies sollte IMHO noch im Artikel erwähnt werden. --Petrus (Diskussion) 18:24, 22. Jan. 2022 (CET)

CRT-Version[Quelltext bearbeiten]

Die Hinweise darauf, dass man eine CRT-Version von TSB nicht patchen könne, sind unrichtig. Die CRT-Version bootet TSB von der Cartridge ins RAM und schaltet die Cartridge danach ab. Nach außen hin arbeitet TSB dann exakt genauso wie die Disk-Version. Wenn keine Einwände erfolgen, lösche ich die entsprechenden Hinweise im Artikel wieder. --GoDot (Diskussion) 08:49, 3. Mai 2022 (CEST)

Danke für den Hinweis. Ich habe das jetzt schon selbst in SCRSV (TSB) und SCRLD (TSB) gelöscht. Über die CRT-Versionen von TSB habe ich noch keine Informationen gefunden. Gibt es irgedwo welche? Wenn nicht, wäre es nicht sinnvoll, die im Wiki zu ergänzen? --Petrus (Diskussion) 12:03, 3. Mai 2022 (CEST)
Die gibt's an der gleichen Stelle, wo du auch TSB downloaden kannst (hier). Im Wiki ist das nicht erwähnt? (Ich dachte...) --GoDot (Diskussion) 21:12, 3. Mai 2022 (CEST)
(Ja, steht da) --GoDot (Diskussion) 21:35, 3. Mai 2022 (CEST)

Nicht mehr aktueller Inhalt[Quelltext bearbeiten]

Die folgenden Abschnitte wurden durch aktuellere Inhalte ersetzt. Sie sind bis auf weiteres aber auch noch gültig.

Tipps und Tricks[Quelltext bearbeiten]

Die folgenden Tipps funktionieren durch Patchen der SCRLD/SCRSV-Routine mit Hilfe von POKEs. Die folgenden Speicherstellen sind dabei von Bedeutung:

Poke Bedeutung Default
$B1B0 Subr. Ausgabe Low-Byte der Startadresse $20 = JSR, deaktiviert mit $2C = BIT
$B1B5 Subr. Ausgabe High-Byte der Startadresse $20 = JSR, deaktiviert mit $2C = BIT
$B1C1 Anzahl der 256-Byte-Blöcke für Bitmap 32 (32*256 = 8*1024 = 8K)
$B218 High-Byte des Farbbereichs 1 (Farb-RAM) $D8
$B21C High-Byte des Farbbereichs 2 (Video-RAM) $04
$B220 High-Byte des Bitmap-Bereichs $E0
$B1D5 Subroutine für Verarbeitung des Farbbereichs 1 $20 = JSR, deaktiviert mit $2C = BIT
$B1DC Subroutine für Verarbeitung des Farbbereichs 2 $20 = JSR, deaktiviert mit $2C = BIT
  • Mit POKEs in $B21C ist es wie bisher möglich, eine Grafik in zwei Dateien zu speichern, die erste für die Bitmap, die zweite (mit einer Dateilänge von 9 Blöcken) für die Farben. Siehe dazu das Beispiel Grafik in zwei Dateien speichern.
  • Tatsächlich kann man aber auch zwei SCRSV-Durchgänge in eine Datei speichern, indem der zweite mit dem Namensanhang ",P,A" für "Append" durchgeführt wird. Allerdings muss bei der anzuhängenden Datei die Ausgabe der Startadresse unterdrückt werden, was mit POKEs in $B1B0 und $B1B5 erledigt wird. So kann man z.B. das Format für Doodle (Video-RAM + Bitmap) erzeugen. Siehe dazu das Beispielprogramm Doodle Grafik mit TSB.
  • Der Bildschirmspeicher ab $CC00, wo er nach MEM liegt, kann mit Hilfe eines POKEs in $B21C gesichert werden. Siehe dazu das Beispiel Textbildschirm speichern nach MEM.
  • Mit POKE $B1D5,44 (44=$2C BIT) kann man die Verarbeitung des Farbbereichs 1 (Farb-RAM) unterdrücken. So wird es z.B. möglich, ein Bild im Format von Hi-Eddi+ zu speichern. Es belegt auf der Diskette 37 Blöcke. Der Wert in $B1D5 muss wieder auf 32=$20 (JSR) zurückgesetzt werden. Siehe dazu das Beispiel Hi-Eddi+ Grafik mit TSB.
  • Mit POKE $B1DC,44 (44=$2C BIT) kann man die Verarbeitung des Farbbereichs 2 (Video-RAM) unterdrücken. Der Wert in $B1DC muss nach dem SCRSV wieder auf 32=$20 (JSR) zurückgesetzt werden. Auf diese Weise lässt sich z.B. nur das Farb-RAM speichern. Hängt man die Datei mit dem Farb-RAM per ",P,A" an eine mit der vorigen Methode gesicherten Grafik (Bitmap + Video-RAM) an, so lassen sich Multicolor-Bilder in allen Formaten speichern, die eine Bitmap mit 8192 Bytes und 2 Farbspeicher von je 1024 Bytes besitzen. Das sind z.B. "Blazing Paddles" und "Artist64". Siehe dazu das Beispiel Blazing Paddles Grafik mit TSB.
  • Mit Hilfe von POKEs lassen sich ein oder zwei beliebige frei zugängliche 1-KByte-Bereiche, z. B. Zeichensätze, abspeichern. Angenommen, ein Zeichensatz liegt an Adresse $3000 im Speicher. Mit POKE $B21C,$30: POKE $B218,$34: SCRSV 1,DR,2,“NAME,P,W“: POKE $B21C,4: POKE $B218,$D8 kann er gesichert und jederzeit mithilfe dieser POKEs an beliebige andere Stellen zurück geladen werden (mit SCRLD).
Beliebige 8-KByte-Bereiche speichert/lädt man mit Sekundäradresse 3 und dem POKE $B220,High-Byte. Die Vorgabe dort ist $E0.

Beispiele[Quelltext bearbeiten]

Textbildschirm speichern[Quelltext bearbeiten]

Normal[Quelltext bearbeiten]

Das Beispiel basiert auf dem im Simons' Basic Handbuch unter SCRSV angegebenen Programm.

100 PRINT CHR$(147)
110 FILL 6,10,20,4,160,2
120 FILL 10,10,20,4,160,1
130 FILL 14,10,20,4,160,6
140 WAIT 198,1
150 SCRSV 2,8,2,"TRICOLOR-TSB.SRC,P,W"

Zeile 150 sichert den Bildschirmspeicher auf die Diskette im mit USE (default: 8) definierten Laufwerk.

Mit einer Unterroutine, die den Fehlerkanal ausliest:

160 FEHLER
170 IF FF>0 THEN PRINT FF;FB$
180 END
190 PROC FEHLER
200 OPEN 1,8,15
210 INPUT#1,FF,FB$,SP,SE
220 CLOSE 1
230 END PROC
Nach MEM[Quelltext bearbeiten]

Nach MEM liegt der Bildschirmspeicher bei $CC00. Nach dem POKE in Zeile 150 sichert SCRSV diesen Bereich. In Zeile 180 wird SCRSV auf den normalen Bildschirmspeicher zurückgesetzt.

100 MEM
110 FILL 6,10,20,4,160,2
120 FILL 10,10,20,4,160,1
130 FILL 14,10,20,4,160,6
140 WAIT 198,1
150 POKE $B21C,$CC
151 SCRSV 2,8,2,"TRI-CC.SRC,P,W"
160 FEHLER
170 IF FF>0 THEN PRINT FF;FB$
180 POKE $B21C,4:END
190 PROC FEHLER
200 OPEN 1,8,15
210 INPUT#1,FF,FB$,SP,SE
220 CLOSE 1
230 END PROC

Bitmap speichern[Quelltext bearbeiten]

100 HIRES 15,0
110 FOR R=10 TO 90 STEP 5
120 CIRCLE 160,100,R,100-R,1
130 NEXT
140 COLOUR 12,12: WAIT 198,1
150 NRM: COLOUR 11,12: PRINT"SAVING ...";
160 SCRSV 3,8,3,"BITMAP3,P,W"
170 FEHLER
180 IF FF>0 THEN PRINT FF;FB$
190 END
200 PROC FEHLER
210 OPEN 1,8,15
220 INPUT#1,FF,FB$,SP,SE
230 CLOSE 1
240 END PROC

bitmap3.png

Grafik mit Farben speichern[Quelltext bearbeiten]

Das folgende Beispiel basiert auf einem Programm aus dem Buch Grafik auf dem C64 von Walter Bachmann.

100 REM--- TURTLE-MC-SAVE ---
110 HIRES 1,0: COLOUR11,0: MULTI10,8,2
120 A=10: B=A/1.6: AD=2: BD=AD/1.6
130 TD = 241: T=90:T0=./180
140 REM TD:182/241/90.4
150 X0=90: Y0=100: C=1
160 REC 0,0,159,199,3
170 LOOP
180 :  X = X0 + A*COS(T*T0)
190 :  Y = Y0 + B*SIN(T*T0)
200 :  EXIT IF X<0 OR X>159 OR Y<0 OR Y> 199
210 :  LINE X0,Y0, X,Y, C
220 :  X0 = X: Y0 = Y
230 :  T = T + TD
240 :  A = A + AD
250 :  B = B + BD
260 :  C=C+1:IF C>3 THEN C=1
270 END LOOP
280 :
290 COLOUR 12,0: WAIT 198,1: COLOUR11,0
300 SCRSV 3,8,5,"TURTLE-MC,P,W"
310 NRM: COLOUR 11,12,0
320 END

turtle5.png

Grafik in zwei Dateien speichern[Quelltext bearbeiten]

Das Beispiel basiert auf dem im Simons' Basic Extension Manual unter HSAVE angegebenen Programm.

10 BG=0:HIRES 15,BG
20 FOR R=10 TO 90 STEP 5
30 CIRCLE 160,100,R,100-R,1
40 NEXT
50 COLOUR 12,12: WAIT 198,1: COLOUR 11,12
60 TSBSAVE
70 NRM: END
1500 PROC TSBSAVE
1510 SCRSV 1,I8,3,"IMAGE"+STR$(BG)+",P,W"
1520 POKE $B21C,$C0
1530 SCRSV 1,I8,2,"IMAGETOOLS,P,W"
1540 POKE $B21C,4
1545 END PROC

TSBSAVE speichert die Grafik samt Farben unter dem angegebenen Namen in zwei Dateien auf die Diskette von jenem Gerät, das mit USE festgelegt wurde. Der Wert der Variablen i8 wird hierfür nicht berücksichtigt. In Variable BG befindet sich die Nummer der Hintergrundfarbe.

Hi-Eddi+ Grafik mit TSB[Quelltext bearbeiten]

Grafik im Format von Hi-Eddi+ speichern:

100 HIRES 15,0
110 FOR R=10 TO 90 STEP 5
120 CIRCLE 160,100,R,100-R,1
130 NEXT
140 COLOUR 12,12: WAIT 198,1
150 NRM: COLOUR 11,12
160 :
170 PRINT"SAVING IMAGE ..."
180 POKE $B1D5,44:REM KEIN FARB-RAM
190 SCRSV 3,8,5,"HIRES5.HED,P,W"
200 POKE $B1D5,32:REM RESTORE JSR
210 FEHLER
220 END
230 :
240 PROC FEHLER
250 OPEN 1,8,15
260 INPUT#1,FF,FB$,SP,SE
270 IF FF>0 THEN PRINT FF;FB$
280 CLOSE 1
290 END PROC

Doodle Grafik mit TSB[Quelltext bearbeiten]

Grafik im Doodle-Format speichern:

100 HIRES 15,0:LOW COL 2,0,0
110 REC 0,0,319,199,1
120 FOR R=10 TO 90 STEP 5
130 LOW COL 15,0,0
140 CIRCLE 160,100,R,100-R,1
150 NEXT
160 COLOUR 12,12: WAIT 198,1:COLOUR 11,12
170 REM --- VIDEO-RAM ---
180 POKE $B1D5,44:REM KEIN FARB-RAM
190 POKE $B21C,$C0:REM HIRES VIDEO-RAM
200 SCRSV 2,8,2,"CIRCLES.DD,P,W"
210 POKE $B1D5,32:REM RESTORE JSR
220 POKE $B21C,$04:REM RESTORE VIDEO
230 FEHLER:IF FF>0 THEN END
240 REM --- APPEND BITMAP ---
250 REM STARTADDRESSE NICHT AUSGEBEN:
260 POKE $B1B0,$2C:POKE $B1B5,$2C
270 SCRSV 3,8,3,"CIRCLES.DD,P,A"
280 REM STARTADDRESSE:
290 POKE $B1B0,$20:POKE $B1B5,$20
300 FEHLER
310 NRM:PRINT"IMAGE SAVED"
320 END
330 :
340 PROC FEHLER
350 OPEN 1,8,15
360 INPUT#1,FF,FB$,SP,SE
370 IF FF>0 THEN DO
380 : NRM: COLOUR 11,12
390 : PRINT FF;FB$
400 DONE
410 CLOSE 1
420 END PROC

Blazing Paddles Grafik mit TSB[Quelltext bearbeiten]

Die Turtle-Grafik malen und speichern im Blazing-Paddles-Format.
Die Hintergrundfarbe wird ins Byte $FF80 geschrieben (310). Bitmap und Video-RAM werden gespeichert mit sa=5 (320-340). Das Farb-RAM wird angehängt mit sa=2, wobei die Ausgabe der Startadresse unterdrückt ist (380-420).

100 REM--- BLAZING PADDLES SAVE ---
110 BK=0: REM HINTERGRUNDFARBE
120 HIRES 1,BK: COLOUR11,BK: MULTI10,8,2
130 A=10: B=A/1.6: AD=2: BD=AD/1.6
140 TD = 241: T=90: T0=./180
150 REM TD:182/241/90.4
160 X0=90: Y0=100: C=1
170 REC 0,0,159,199,3
180 LOOP
190 :  X = X0 + A*COS(T*T0)
200 :  Y = Y0 + B*SIN(T*T0)
210 :  EXIT IF X<0 OR X>159 OR Y<0 OR Y>199
220 :  LINE X0,Y0, X,Y, C
230 :  X0 = X: Y0 = Y
240 :  T = T + TD
250 :  A = A + AD
260 :  B = B + BD
270 :  C=C+1:IF C>3 THEN C=1
280 END LOOP
290 :
300 COLOUR 12,0: PAUSE1: COLOUR11,0
310 POKE $FF80,BK: REM HINTERGRUNDFARBE
320 POKE $B1D5,$2C: REM KEIN FARB-RAM
330 SCRSV 3,8,5,"PI.TURTLE,P,W"
340 POKE $B1D5,$20: REM RESTORE JSR
350 FEHLER
360 :
370 COLOUR 12,0: WAIT 198,1: COLOUR11,0
380 POKE $B1DC,$2C: REM KEIN VIDEO-RAM
390 POKE $B1B0,$2C: POKE $B1B5,$2C: REM KEINE STARTADRESSE
400 SCRSV 2,8,2,"PI.TURTLE,P,A"
410 POKE $B1B0,$20: POKE $B1B5,$20: REM STARTADRESSE
420 POKE $B1DC,$20: REM VIDEO-RAM
430 FEHLER
440 NRM: COLOUR11,12,0
450 END
460 :
470 PROC FEHLER
480 OPEN 1,8,15
490 INPUT#1,FF,FB$,SP,SE
500 CLOSE 1
510 IF FF>0 THEN DO
520 : NRM: COLOUR 11,12,0
530 : PRINT FF;FB$
540 DONE
550 END PROC