Diskussion:SCRSV (TSB)
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. --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)
- 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)
- 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! --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)
- 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! --GoDot (Diskussion) 22:24, 24. 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
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
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