Programm PRINTet mit Leerzeilen dazwischen

Es gibt 11 Antworten in diesem Thema, welches 1.335 mal aufgerufen wurde. Der letzte Beitrag (8. Dezember 2023 um 04:18) ist von BIF.

  • Folgendes passiert:

    1. Die Unterteilungslinien werden gePRINTet

    2. Die Beschreibung oben rechts wird gePRINTet, dabei wird der Cursor per SYS-Befehl an den Anfang der nächsten Zeile gesetzt:

    Code
    POKE781,CY:POKE782,CX:POKE783,0:SYS65520

    3. Der Cursor wird per Steuerzeichen nach oben links versetzt und die PETSCII-Grafik wird per einfacher aufeinanderfolgender PRINT-Befehle ausgegeben.

    Aus irgendeinem Grund überspringt er dabei jede zweite Zeile. Wenn ich dann mit dem Cursor runtergehe und scrolle verschwinden auch immer jeweils zwei Zeilen auf einmal oben aus dem Bild. Meine Vermutung ist, dass das mit der Erkennung zusammenhängender Zeilen zusammenhängt, aber ich bin da absoluter Laie und weiß nicht weiter. Kann mir da jemand helfen?

  • Deine Bildschirmmaske (Unterteilungslinien und Beschreibung) erzeugt verbundene logische Zeilen. Das passiert immer dann, wenn ein Zeichen in der rechtesten Spalte ausgegeben wird und das Längenlimit noch nicht erreicht ist (80 beim C64, 88 beim VC-20, darum können bis zu 4 physikalische Zeilen auf dem VC dieses Schicksal erleiden).

    Dummerweise bezieht sich die PLOT-Routine bei $FFF0 auf logische Zeilen ...

    Ein mögliche Lösung wäre, den Bildschirm als gesamtes auszudrucken, bzw. noch alternativ mit POKEs auf Bildschirm und Farb-RAM die Bildschirmmaske aufzubauen. Letzteres ist aber recht langsam.

  • Hm, so etwas habe ich jetzt nach ausgiebigem Testen auch befürchtet. Dann schreibe ich am besten eine Subroutine, die den zu PRINTenden String hinten abschneidet und das letzte Zeichen POKEt. Alles zu POKEn habe ich schon ausprobiert, aber das ist dann doch ZU langsam.

    Mir ist das aber auch neu. Bisher dachte ich, logisch verbundene Zeilen kommen nur bei direkter Eingabe zustande. Aber bisher habe ich aus Ästhetikgründen auch immer ein Zeichen ringsum Platz gelassen, darauf habe ich diesmal verzichtet.

  • Dieser Thread hier müsste für dich auch interessant sein:

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

  • z.B. POKE214,y hilft da weiter, auch wenn es speed rausnimmt.

    Bitte melde dich an, um diesen Link zu sehen.

    Code
    51 fory=4to12
    52 poke211,15:poke214,y-1:sys58732:print"testzeile"y
    53 next
  • Sehr zuvorkommend, danke, ich bin im Bilde wie ich Zeichen auf den Bildschirm POKE :)

    Jetzt will er aber noch, dass ich den Farbspeicher des Zeichens manuell setze. Ich gucke mal, wie praktikabel das ist, sonst lasse ich wieder ein Zeichen Schönheitsrand in der letzten Spalte :D

  • Sehr zuvorkommend, danke, ich bin im Bilde wie ich Zeichen auf den Bildschirm POKE :)

    ?(

    Wovon sprichst du? In dem Thread geht es (auch) darum, wie man das Problem ohne POKE löst.

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

  • Ach du meinst die Steuerzeichenvariante, bei der man das letzte Zeichen vorab schreibt und in Position schiebt? Ja, das ginge auch. Dann muss ich aber beim Schreiben der Beschreibungen und anderer Strings immer im Kopf behalten, dass ich das mache, wenn der Text hinten anstößt. Da bin ich auf Dauer zu faul, ich schreibe lieber vorab eine Routine und bin dann sorgenfrei :D

    Code
    10 REM ### SET CURSOR ###
    11 POKE781,CY:POKE782,CX:POKE783,0:SYS65520
    12 IFW$=""THENGOTO20
    14 PRINTLEFT$(W$,LEN(W$)-1):POKE1024+CX+CY*40+LEN(W$)-1,FNSC(ASC(RIGHT$(W$,1)))
    15 POKE55296+CX+CY*40+LEN(W$)-1,12
    19 W$=""
    20 RETURN

    Das ist jetzt die komplette Routine. Ich setze W$ auf den String, den ich PRINTen will, CY und CX auf die Koordinaten, und mache GOSUB 10. Mal schauen, ob ich überhaupt andere Schriftfarben verwende, denn wenn nicht färbe ich die letzte Spalte einmal durchgehend und nehme das dort raus, auch wenn es nur ein paar Millisekunden kostet, das immer wieder zu tun.

    Achso, da steckt hinten noch eine Funktion drin, die PETSCII in Bildschirmcode übersetzt. Das würde jetzt den Rahmen sprengen und beim N3rdroom ist das alles wunderbar erklärt ;)

  • Serviervorschlag:

    Code
    400 rem text rechts
    410 poke53281,0:printchr$(147);
    420 forcy=1to15:poke646,cy:printspc(13)"! text1text2text3text4text5";:next
    430 rem grafik links
    440 printchr$(19);
    450 forcy=0to10:poke214,cy:sys58732
    460 forx=0to11:printchr$(205.5+rnd(.));:next
    470 print:next
    480 poke214,cy:sys58732:print"im labyrinth"

    Bitte melde dich an, um diesen Anhang zu sehen.

  • Also irgendwie blicke ich nicht durch, was da jetzt den Trick macht. Das ; am Ende ist es nicht.

    EDIT: Ah, du springst bei der Grafik die einzelnen Zeilen nochmal an, statt den normalen CRLF vom Print zu verwenden. Ja, das wäre eine Möglichkeit ... Hm, je nachdem wie sich die Ablage der Grafiken im Speicher (oder deren Auslagerung auf Disk) so entwickelt wäre das wirklich besser.

  • Ah, du springst bei der Grafik die einzelnen Zeilen nochmal an, statt den normalen CRLF vom Print zu verwenden. Ja, das wäre eine Möglichkeit ... Hm, je nachdem wie sich die Ablage der Grafiken im Speicher (oder deren Auslagerung auf Disk) so entwickelt wäre das wirklich besser.

    Genau, wenn man mit POKE214,ZEILE:SYS58732 die Zeile festlegt, dann wird der folgende PRINT dort ausgegeben. Bequemer- und beschleunigenderweise kann man 211, 214 und 58732 vorab als Variablen definieren (oder gleich als ASM-Helper unterbringen, siehe z.B. diesen Thread Bitte melde dich an, um diesen Link zu sehen.).

    Jup, je nach Konzept, findet sich dann auch die passende Variante.

  • Gegebenenfalls kann man ROM/RAM verwenden:
    Ich habe mal ins ROM-Listing geschaut:
    :poke59069,96: schaltet die Zeilenverlängerung und Rollen ab.

    Schönen Gruß.