Vielleicht steht hier was dazu?
Die Antwort auf die Frage selber habe ich da nicht gefunden, aber die Seite enthält viele interessante Hinweise zu dem Thema. Vielen Dank dafür - ich werde einiges davon ins Wiki übernehmen können!
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.
Vielleicht steht hier was dazu?
Die Antwort auf die Frage selber habe ich da nicht gefunden, aber die Seite enthält viele interessante Hinweise zu dem Thema. Vielen Dank dafür - ich werde einiges davon ins Wiki übernehmen können!
Ich brauche mal wieder eure Hilfe: Ich bin gerade am Wiki-Artikel zu Sprite-Stretching. Das erste Mal wurde das von Bob/Triad genutzt, allerdings verändern die das Sprite während des Stretchings nicht, wodurch jeweils mehrere Zeilen identisch aussehen (die Auflösung der Sprites ändert sich nicht). Man kann aber auch durch Ändern der Spritedatenzeiger jede Zeile einzeln festlegen und damit maximale Auflösung in Y-Richtung erreichen.
Ich weiß, dass diese Technik im Grafik-Format NUFLI verwendet wird, aber ich vermute mal stark, dass das auch schon vorher in irgendwelchen Demos genutzt wurde, da es, wenn man erst mal Sprite-Stretching hat, nicht mehr sonderlich schwierig ist, das auch noch einzubauen. Wer war da der erste?
Any ideas?
Ich bin gerade bei Krestage 3 auf das da gestossen:
Kennt das jemand? (Und weiß jemand das Passwort?)
PS: Ich bin ja blöd: Auf der oben verlinkten Seite steht das Passwort in den Kommentaren...
Letzter Versuch (zu mehr habe ich keine Zeit):
Danke dir, dass du trotz anderer Verpflichtungen dir die Zeit genommen hast, mir zu antworten.
Ich denke, ich hab' jetzt eine einfache Erklärung: Ich muss mich vertan haben.
Dein "High" Segment ist ein Gate. Es nimmt den Wert des "Low" Segments an, wenn PHI1 High ist und behält diesen Wert wenn PHI1
wieder auf low wechselt.
Dein "Low" Segment" ist der Ausgang eines Inverters. Das Gate dieses Inverters ist das lila segment direkt rechts von dem grünen
"grounded diffusion".
Ja, das ist alles klar. (Nur, dass ich immer noch der Meinung bin, dass im Bezug auf den Transistor oben rechts "High" nicht das Gate ist. Das ist dort "PHI 1". "High" ist das Gate vom Transistor unten rechts. Aber egal.)
Was ich dachte, bemerkt zu haben, ist, dass "High" seinen Wert eben nicht behält, wenn "PHI1" auf low wechselt, sondern plötzlich seinen Zustand auch ändert. Ich konnte das aber jetzt nicht mehr reproduzieren. Vielleicht war ich da letztens zu überarbeitet und hatte was gesehen, was gar nicht da war? Falls es doch nochmal auftauchen sollte, melde ich mich nochmal und liefere Details.
Wenn man in 0 und 1 denkt, ist das Teilstück zwischen dem oben rechts und unten rechts undefiniert.
Es reicht aber nicht, nur in 0 und 1 zu denken - der Netzlistensimulator von visual6502 kennt IIRC 5 oder mehr Zustände. Ohne Ladungstransfer würde der simulierte 6502 gar nicht funktionieren.
Ja, das ist mir klar, dass man nicht in 0 und 1 denken darf. Die Frage für mich ist nur, wie denkt man dann? Das ist genau das, wo ich mich nicht mehr auskenne und Hilfe bräuchte. (Und beim Simulator von visual6502 ist dummerweise die Ausgabe mit dem Highlighting auf 0-1 beschränkt. Die anderen Zustände kann man dort (außer, wenn man tief im Javascript wühlt) nicht herausfinden, oder?)
Ich habe gerade einen Eintrag auf nesdev.org gefunden, der, glaube ich, schon recht nahe an dem ist, was ich wissen will. Nur passt es noch nicht ganz. Dort steht, dass das "closed off" Teilstück nach dem Abtrennen noch die vorige Ladung für einen kurzen Zeitraum behält. Das klingt logisch.
Bei mir oben ist ja auch so ein abgetrenntes Teilstück. Aber da ist es plötzlich geladen, obwohl es vor dem Abtrennen nicht geladen war. Das ist das, was ich nicht verstehe. Wo kommt da diese Ladung plötzlich her?
Sorry... aber ich glaube eher du hast ein Verständnisproblem?!
Schon möglich, deswegen frage ich ja.
Vielleicht ist Analyse auf Transistorebene der falsche Weg um die Funktion zu verstehen?
Das glaube ich jetzt eher nicht. Ich hab in den letzten Tagen größere Teile des Schaltplans durchgearbeitet und das ergab alles seinen Sinn. Nur an der Stelle hier trat jetzt diese Ungereimtheit auf, die ich nicht verstehe. Ich vermute, dass mir hier irgend ein Wissen fehlt. Ich weiß aber noch nicht einmal, wie ich danach suchen soll...
ansonsten einfach mal nach z.B. 8501 dissected hier schauen... da ist alles drin.
Ich habe unter dem Stichwort "8501 dissected" das da gefunden, verstehe aber den Zusammenhang mit meiner Frage nicht.
das was du mit High markiert hast ist ein Gate. das mit low bezeichnete Segment ist der Ausgang eines inverters.
Ich habe den Eindruck, dass da ein Verständnisproblem ist. Du und thierer, ihr habt meine Frage auf die gleiche Art anders verstanden, als ich sie gemeint habe; da habe ich mich wohl blöd ausgedrückt. Der kleine rote Knubbel oberhalb von "high" ist fest mit "high" verbunden. Für mich war das einfach ein einzelnes Element, aber wenn ich das Bild jetzt genauer anschaue, sehe ich, dass das durch das Highlighting unklar wird.
Ich versuche es nochmal anders, diesmal ohne Highlighting, dafür mit Schaltplan (*):
Ihr beide sprecht von dem Transistor unten rechts. Ich hab' mich auf den oben rechts bezogen. Die beiden Transistoren unten sind Inverter, das ist klar (beim zweiten gibt es einen im Ausschnitt nicht sichtbaren Pull-Up-Transistor, wie das beim ersten oben links auch der Fall ist).
Der Transistor oben rechts unterbricht das zweimalige Invertieren und lässt das Signal nur in der ersten Takthälfte durch. Meine Frage bezieht sich auf die zweite Takthälfte, wenn der Transistor oben rechts sperrt: Wenn man in 0 und 1 denkt, ist das Teilstück zwischen dem oben rechts und unten rechts undefiniert. In der Praxis ist es allerdings auf "high", denn der Transistor unten rechts muss leiten, damit die Logik funktioniert und der Simulator bei visual6502 bestätigt das auch. Warum?
(*) Bei der russischen Gruppe "breaknes" abgemalt. Deren Webseite ist leider seit dem Ukraine-Krieg nicht erreichbar. Eine Kopie findet sich aber in der Wikipedia.
Ich kenne mich da auch nicht besonders gut aus, aber wenn sonst keiner antwortet
Danke Ich denke, es antwortet keiner, weil es einfach eine schwierige Frage ist. Allerdings:
Das rote ist m.E. nicht Drain, sondern das Gate (Drain ist das gelbe rechts davon). Wenn das Gate high ist, dann war der Eingang (das, was du mit "low" gekennzeichnet hast) wohl high, als es vom Takt gelatcht wurde.
Ne, das ist schon der nächste Transistor; bei dem stimmt wieder alles. Ich beziehe mich auf den darüber, mit den Anschlüssen "low", "phi1" und "high".
Ich vermute ja inzwischen (hab' gestern noch länger drüber nachgedacht), dass solche Teile, die weder mit high noch mit low verbunden sind, ihre Ladung noch eine kurze Zeit behalten und es damit irgendwie zusammenhängt. Zudem sind die ja nie perfekt abgetrennt, sondern es gibt immer noch kleine Ströme. Könnte sein, dass auch das ausreicht, da ja phi1 jeden zweiten Halbtakt an ist. Aber das ist nur so Halbwissen. Ich würde es gerne von jemandem bestätigt (oder korrigiert) wissen, der sich damit auskennt.
(Bin mir nicht ganz sicher, ob das hier die richtige Stelle zum Fragen ist; ich hab' aber keine bessere gefunden.)
Ich habe gerade versucht, den Ablauf beim Schreiben auf den Datenbus beim 6502 mit visual6502 zu verstehen. Dabei bin ich auf eine Ungereimtheit gestossen, bei der ich vermute, dass mein elektrotechnisches Wissen nicht ausreicht. Hier der entsprechende Ausschnitt (erhält man auch, wenn man auf obigen Link klickt):
(grün=grounded diffusion, rot=powered diffusion, gelb=diffusion, lila=polysilicon; "low" und "high" sind highlighted und in Wirklichkeit auch beide gelb.)
Der mit "low" bezeichnete Bereich wird durch (nicht auf dem Ausschnitt sichtbare) Metallschinen auf low gezogen. Soweit ist mir das klar.
Dieser Bereich ist die Source für den anschließenden Transistor mit Gate phi1 (Systemtakt, der ist gerade ebenfalls auf low). Meine Frage bezieht sich jetzt auf das mit "high" markierte Stück darunter; aus Sicht des Transistors das "drain". Laut visual6502-Simulator ist das auf "high" (und wenn es das nicht wäre, würde auch die ganze Schaltung danach nicht funktionieren). Ich kann aber keinen Grund dafür erkennen. Meiner Meinung nach ist das ein Stück "diffusion", welches weder auf high, noch auf low gezogen wird. Wenn da ein Pull-Up-Widerstand dran wäre (wie das links oberhalb von "low" bei "low" der Fall ist), wäre das klar. Aber der ist da nicht. (Das obere Ende von "high" sieht ein wenig wie so ein Pull-Up-Widerstand aus, aber das kommt vom highlighting. In Wirklichkeit ist das gelb und eben nicht rot.)
Hat das jemand von euch verstanden und kann mir weiterhelfen?
Evtl. hilft PEEK(213) weiter. Dort steht beim normalen Basic 39 oder 79 drin. Wie das bei BASIC 4.5 ist, weiß ich nicht.
"Nippon" ist eine gigantische Spielewelt, die man erkunden kann. Ich empfehle allerdings, gleich am Anfang mit dem Cheat das Geld hoch zu setzen. Das tut dem Spielen keinen Abbruch; im Gegenteil, dann kann man sich mehr auf das Erkunden der Welt konzentrieren.
Es gibt ja viele Möglichkeiten, wie man Dinge erreichen kann. Ich hab' mal ein paar gesammelt, mit denen man den Rahmen schwärzen kann:
OK, die letzte Version übertreibtst vielleicht ein bisschen...
Wenn 'label' noch nicht definiert wurde, könnte es ja auf der Zero-Page liegen oder nicht.
Also ein lda $01,y ($B6 mit 2 Bytes) oder ein lda $1000,y ($B9 mit 3 Bytes) werden.
Alternativ könnte es auch noch lda $0001,y sein.
Das ist ja egal. Es geht nur darum, ob man im ersten Pass ein oder zwei Byte für die Adresse reservieren muss. Im zweiten Pass muss der Wert ja dann definiert sein.
Worauf ich hinaus wollte war, dass es nicht trivial ist, zu entscheiden, ob ein Befehl die Zeropage addressiert oder nicht. Bei lda $0001,y könnte man versucht sein, den 2-Byte-Befehl zu verwenden. Der User könnte aber den 3-Byte-Befehl gemeint haben, weil das bei timing-kritischen Programmen einen Unterschied macht.
Wenn die Zahl jetzt stattdessen ein Label ist (am besten mit einer komplizierten Berechnung), wie soll der Assembler dann noch rausfinden, welche Version der User sich wünscht...
Wenn 'label' noch nicht definiert wurde, könnte es ja auf der Zero-Page liegen oder nicht.
Also ein lda $01,y ($B6 mit 2 Bytes) oder ein lda $1000,y ($B9 mit 3 Bytes) werden.
Alternativ könnte es auch noch lda $0001,y sein.
Jetzt ist noch die Frage, ob es auch mal ein Spiel (oder eine Anwendung) gab, bei dem der horizontale Rahmen entfernt wurde (und wenn ja, welches wohl das erste war). Mir ist keines bekannt.
Ich habe hier eine etwas hübschere Testgrafik aus einem meiner Projekte gezogen, füllen bei 160,100:
Mit meiner neusten Version 1,3 Sekunden.
Ich würde sagen, doch, die wurden entfernt:
Haha, da muss man noch eine Taste drücken, damit die Bilder kommen... Auf die Idee bin ich vorhin nicht gekommen.
Ich versuche gerade für den Eintrag Hyperscreen im Wiki herauszufinden, wann zum ersten Mal der horizontale Rahmen (also links und rechts) in einem Programm geöffnet wurde. Das älteste, was ich bislang finden konnte, stammt von 2010 (The Bitch and the Beast und Metalhead). Das scheint mir aber etwas zu spät zu sein. Im Wiki findet sich in der Zeittafel der C64-Demos der Eintrag "ESCOS I", der angeblich den ganzen Bildschirm bedecken soll. Allerdings stimmt das nicht. Die seitlichen Rahmen werden in dem Demo nicht entfernt.
Für hilfreiche Hinweise wäre ich sehr dankbar.
PS: Ich erinnere mich dunkel, dass ich in den 80ern mal so ein Demo gesehen habe, bei dem irgendwelche Käfer links und rechts über den Rahmen gerannt sind. Lange Zeit dachte ich, dass mir da mein Gedächtnis einen Streich gespielt haben muss, da das ja gar nicht gehen kann. Inzwischen denke ich, dass das so ein psychologischer Effekt war: Was nicht sein kann, das ist auch nicht, oder so ähnlich. Gibt da bestimmt einen Fachbegriff für.
Welche C64-Ausgabe war das? Oder in welchem Jahr zumindest?
Ich hab' ehrlich gesagt, keine Ahnung mehr. Ich schätze, dass es so um '88 rum war.
Noch ein bisschen drüber nachgedacht, und ich habe das Gefühl, dass sich das auch am C64 lohnen könnte. Zumindest beim Multiplizieren mit KB-Großen Binärzahlen.
Aus den Faktoren lassen sich andere zahlen zusammenstellen, die 8/16 Bit besser ausnutzen oder weniger 1Bits enthalten.
3, 7 und 11 haben zusammen 8 gesetzte 1Bits, was entsprechend viele Shifts und Additionen mit der großen Zahl bedeutet.Multipliziert ergeben sie 231, die Zahl hat nur 6 gesetze Bits, was 2 Additionen spart.
Ist jetzt die Frage, wie man die Original-Faktoren am besten zerlegt und wie man die hübscheren, neuen Faktoren findet.
Ist sicherlich eine Möglichkeit. Bei meinem Programm dürfte das kaum einen Vorteil bringen, da es nur addiert, wenn ich mich recht erinnere - ich hab' mir den Sourcecode bislang nicht angeschaut. (An was ich mich zu erinnern glaube: Für jede zu multiplizierende Zahl wird eine Multiplikationstabelle durch sukzessive Addition erstellt, und dann einfach für jede Ziffer der entsprechende Wert nachgeschlagen und zum bisherigen Ergebnis addiert (mit entsprechendem Versatz natürlich).)