... könntest dein Programm meiner Meinung nach noch um weitere 3 Bytes verkürzen mit :cont: statt :wait 1,0: .
Kann mir jemand erklärten, was der Befehl CONT da so macht?
Du bist in Begriff, Forum64 zu verlassen, um auf die folgende Adresse weitergeleitet zu werden:
Bitte beachte, dass wir für den Inhalt der Zielseite nicht verantwortlich sind und unsere Datenschutzbestimmungen dort keine Anwendung finden.
letzter Beitrag von atomcode am
... könntest dein Programm meiner Meinung nach noch um weitere 3 Bytes verkürzen mit :cont: statt :wait 1,0: .
Kann mir jemand erklärten, was der Befehl CONT da so macht?
Werten wir das als Beitrag für die gewöhnliche Compo?
Für die PRINT - only Compo müsste das POKE 242 weg.
Bezüglich der Leerzeichen hilft vielleicht das Formatieren als Code.
Ich würde es bei meiner schwammigen Formulierung zulassen, da ich ja auch mal geschrieben habe das du 3 Pokes brauchen wirst 2x Farbe 1x Bildschirm festhalten.
Jetzt ist der 3. Poke halt anderweitig genutzt worden.
Edit: bzw. ist Poke 242,0 eine weitere Möglichkeit das Scrolling zu verhindern oder ? dann ist es 100% ok!
217-242 Screen Line Link table, steht im Wiki...
War die Deadline für "Print-Only" nicht erst kommendes Wochenende... naja er wirds nicht gelesen haben!
... könntest dein Programm meiner Meinung nach noch um weitere 3 Bytes verkürzen mit :cont: statt :wait 1,0: .
Kann mir jemand erklärten, was der Befehl CONT da so macht?
Um den Programm-Ablauf nach END/STOP oder drücken der RUN/STOP Taste wieder zu starten, CONTinue
Wahrscheinlich pausiert CONT ein Programm welches vorher gar nicht unterbrochen wurde! Kanns momentan nicht ausprobieren... so reime ich mir BIF's Meinung zusammen!
ciao Dirk
CONT liest die Position des letzten Breaks aus und macht da weiter. Wenn es keinen Break gab, macht er bei Zeile 0, Adresse 0 weiter. Scheinbar dreht sich der Interpreter dann im Kreis, weil er dort kein vernünftiges BASIC-Programm vorfindet. Definiertes Verhalten ist das sicher nicht, CONT ergibt eigentlich nur im Direktmodus Sinn. Aber es hält halt verlässlich das Programm an...quasi...
CONT liest die Position des letzten Breaks aus und macht da weiter. Wenn es keinen Break gab, macht er bei Zeile 0, Adresse 0 weiter.
Die Interpreterschleife merkt sich ihre augenblickliche Position (die steht in $7a/$7b) in $3d/$3e für CONT. Wird CONT jetzt aber im Programmmodus aufgerufen, setzt CONT diese beiden Werte zurück nach $7a/$7b. Darum führt CONT (der eine Befehl!) sich immer wieder selber aus. Kann man aber mit STOP abbrechen.
Arndt
Ach so, dann nicht Adresse 0. Aber als Zeile hat er 0, oder? Denn ein Abbruch führt immer zu Break in 0, egal wo das CONT steht.
Denn ein Abbruch führt immer zu Break in 0, egal wo das CONT steht.
Das liegt daran, dass die Abbruch-Zeilennummer noch nicht festgehalten wurde, das machen nur die Befehle END und STOP (steht dann in $3b/$3c). Ohne Abbruch (CONT wird ja aus dem Programm heraus aufgerufen) keine Abbruchszeilennummer...
Arndt
(bau mal irgendwo ein STOP ein, starte das Programm, lösch die Zeile mit dem STOP wieder und starte neu, dann gibt er die gelöschte Zeile als Abbruchzeile an.)
Was ist denn nun mit dem (Sieger)Programm(en)? Ich bin nicht auf Twitter, von daher würde es mich hier interessieren...
Oh, die Deadline für print-only ist also erst nächste Woche!
Dann hätte ich wohl noch eine Woche Zeit gehabt.
Also vor jedem Befehl wird meines Wissens die Basic-Programm-Adresse gespeichert.
Daher bewirkt cont im Programmmodus wie GODot gesagt hat eine Endlosschleife, und ist damit hervorragend geeignet ein Programm zu stoppen und sogar 3 Byte kürzer als wait1,0 .
Bei meinem Algorithmus habe ich das Problem rein binär gelöst also entweder 2 Zeichen oder 1 Zeichen, 1 oder 0, printa$(0) oder printa$(1).
Schönen Gruß.
Interessant, wie viele Möglichkeiten es gibt, das Programm oder dessen Ausgabe ganz oder scheinbar anzuhalten.
Lösung | Bytes | Anmerkung |
:POKE 648,9 | 7 | Bildschirmspeicher verschieben, um Ausgaben unsichtbar zu machen. |
:GOTO x / :RUN x |
6 | Zusätzliche Zeile erforderlich oder Addition statt Schleife. |
:WAIT x,x |
5 | Häufig verwendet. Abbruch durch Stop+Restore. |
?"{clr}{dwn}{dwn}{blk}" | 3 | Schwarze Schrift auf schwarzem Grund; kann nur Superman sehen. |
:SYS 7 |
3 | Im Real-Cevi ok, aber ruft Debugger im VICE-Emulator auf. |
:CONT | 2 | Lässt sich mit Stop unterbrechen; keine Nebeneffekte, kurz und kompatibel. |
wegen quatsch geloescht!
Mit dem Tipp von Wizball, die Farb-Pokes in die Schleife mit rein zu ziehen, kommt man mit diesem Ansatz sogar auf 122 Bytes.
Damit ist aber dann möglicherweise die Grenze erreicht, wenn mir nicht noch was kluges einfällt.
0 print"[clr,runter,blau,rev-an]";:poke242,.:a$(.)="[links] [links]":a$(1)="[links,links] [links,links]
1 fori=.to24:poke53280+i,.:printa$(noti+i/5and1)"[runter]";:next:print"[home]";:a$(.)=" ":a$(1)=" ":goto1
Also bei a$(1) müssen jeweils 2 Leerzeichen stehen, da scheint eins vom Editor gelöscht zu werden.
Schönen Gruß.
Mit diesem Listing hab ich´s wohl geschafft, 104 Bytes.
0 print"[clr,blau]":poke242,.:a$(1)="[links] [links]":a$(.)="[revers,links,links] [links,links]":a$="[runter]
1 fori=.to29step1.2:poke53280+i,.:printa$(iand1)a$;:next:a$="[hoch]":goto1
Also bei a$(0) müssen 2 Leerzeichen stehen, da scheint eins vom Editor gelöscht zu werden.
Schönen Gruß.
Nachdem ich heute wieder mal einen PC zur Verfügung habe, kann ich mal ein paar Sachen angehen...´
Was ist denn nun mit dem (Sieger)Programm(en)? Ich bin nicht auf Twitter, von daher würde es mich hier interessieren...
atomcode hat sein Siegerprogramm sehr ausführlich vorgestellt. Du findest es hier. Zudem ist es auch auf der Homepage.
Oh, die Deadline für print-only ist also erst nächste Woche!
Dann hätte ich wohl noch eine Woche Zeit gehabt.
Ja, bis Samstag (heute) um 23:59 Uhr. Den Code veröffentlichen hättest du idealerweise auch danach veröffentlichen können. Aber nachdem es nur um Spaß geht, tut es jetzt nicht wirklich weh..
Bin nun gespannt, ob und wenn ja was, ab Sonntag eintrudeln wird.
Vielen Dank logiker
Ich finde das höchst interessant, wie unterschiedlich und doch ähnlich die Herangehensweisen sind.
Und was ich immer noch faszinierend finde: mit wie wenig Bytes man am Cevi was coden kann. Vor allen Dingen wenn man die aufgeblähten Compiler am PC sieht, wo so ein Programm wahrscheinlich schon den Speicher des Brotkastens sprengen würde...
Und was ich immer noch faszinierend finde: mit wie wenig Bytes man am Cevi was coden kann.
Ich erlaube mir bei dieser Gelegenheit, auf einen kürzlichen Tweet von mir zu verlinken (in englisch): https://twitter.com/romwer/status/1164795994912915457
Alle Beiträge für die PRINT-only Version können gerne abgegeben werden.
Regeln siehe hier: https://www.logiker.com/BASIC-Contest#print-only.
Also bei a$(0) müssen 2 Leerzeichen stehen, da scheint eins vom Editor gelöscht zu werden.
Wenn du Code zum Formatieren verwendest, dann geht es vielleicht ...
... Passt das so?
Die entsprechende PRINT-Variante mit Adresse 214 zur Zeilenansteuerung und PRINT SPC(x) für die Spaltenangabe benötigt 91 Bytes.
Hab mal das POKE 214,y ersetzt durch Zeilenvorschübe von PRINT und auf die ursprüngliche Parallel-Plot-Technik zurückgesetzt. Ecken werden zum Schluss eingefügt.
0 ?"{CLR}":fOX=1TO38stE1.6:pO54239+X,.:?tAX)"{RVSON} {DOWN} {UP}":?tA38.9-X)"{RVSON} {UP} ":nE:?"{RVSON} "tA38)"{INS} {HOME} "tA39)" ":cO
Die Variante von logiker benötigt für den Aufbau ab RUN nur etwa 9 Frames. Das zumindest spricht eindeutig für PRINT gegenüber POKE.
Apropos .. bei mir steht auch ein neues Zeitmess-Tool auf dem Plan, für die Optimierung eigener Routinen.