Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » Programmierung von Grafikeffekten auf DDR-Computern » Themenansicht

Autor Thread - Seiten: [ 1 ] -2-
600
09.02.2026, 07:07 Uhr
ralle



Richtig. Laut Artikel allerdings nicht fest an Adresse gebunden. Es sind nur die CALL-Befehle anzupassen oder zurück zu übersetzen, als Toolpaket.
--
Gruß Ralle

Wenn Sie dazu neigen, Bedienungsanleitungen zusammen mit dem Verpackungsmaterial wegzuwerfen, sehen Sie bitte von einem derart drastischen Schritt ab!...
... Nachdem Sie das Gerät eine Weile ausprobiert haben, machen Sie es sich am besten mit dieser Anleitung und ihrem Lieblingsgetränk ein oder zwei Stunden lang in Ihrem Sessel bequem. Dieser Zeitaufwand wird Sie dann später belohnen...

aus KENWOOD-Bedienungsanleitung TM-D700
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
601
09.02.2026, 19:00 Uhr
maleuma




Zitat:
ralle schrieb
Richtig. Laut Artikel allerdings nicht fest an Adresse gebunden. Es sind nur die CALL-Befehle anzupassen oder zurück zu übersetzen, als Toolpaket.


In dem abgebildeten Teil der FA-Seite kann ich das nicht herauslesen. Deshalb habe ich mir den MC-Teil einmal im Reassembler angesehen. Es sind tatsächlich keine absoluten Sprünge bzw. UP-Aufrufe enthalten, sodass man das tatsächlich auf einen anderen Adressbereich verschieben könnte.
Dafür sind aber UP-Aufrufe enthalten, welche in den CAOS-COM laufen. Der Autor hat in dem Beitrag nicht darauf hingewiesen, dass das Programm nur unter CAOS 4.2 lauffähig ist.

Enthalten sind:
CALL E044H (PADR1 vom CRT-Treiber)
CALL E329H (CRT-Routine)
CALL E06AH (DABR-Routine)
CALL E05EH (TCIF-Routine)
--
Mario.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
602
10.02.2026, 07:14 Uhr
Bert




Zitat:
maleuma schrieb
Der Autor hat in dem Beitrag nicht darauf hingewiesen, dass das Programm nur unter CAOS 4.2 lauffähig ist.


Er kannte wahrscheinlich nix anders


Zitat:

Enthalten sind:
CALL E044H (PADR1 vom CRT-Treiber)
CALL E329H (CRT-Routine)
CALL E06AH (DABR-Routine)
CALL E05EH (TCIF-Routine)



Das ist sehr schlechter Stil. Wozu gibt es denn die Sprungverteiler...
Außerdem könnte man noch eine kleine Sprungtabelle am Anfang des Codes realisieren. Dann muß man bei Anpassungen nicht die CALLs im BASIC-Programm nachziehen.
--
Viele Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
603
10.02.2026, 08:51 Uhr
ralle



Man hätte es ebensogut im BASIC auf die Speicherzellen poken können. Im Zweifel mit BLOAD einlesen. Vermutlich ist der Bereich deshalb, weil beim Kaltstart des Interpreters der Speicher gelöscht währe.
--
Gruß Ralle

Wenn Sie dazu neigen, Bedienungsanleitungen zusammen mit dem Verpackungsmaterial wegzuwerfen, sehen Sie bitte von einem derart drastischen Schritt ab!...
... Nachdem Sie das Gerät eine Weile ausprobiert haben, machen Sie es sich am besten mit dieser Anleitung und ihrem Lieblingsgetränk ein oder zwei Stunden lang in Ihrem Sessel bequem. Dieser Zeitaufwand wird Sie dann später belohnen...

aus KENWOOD-Bedienungsanleitung TM-D700
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
604
10.02.2026, 09:15 Uhr
susowa




Zitat:
Bert schrieb
Das ist sehr schlechter Stil. Wozu gibt es denn die Sprungverteiler...



Die funktionieren nur für CAOS-UP's, welche in der SUTAB stehen. "PADR1 vom CRT-Treiber" steht vermutlich nicht als CAOS-UP zur Verfügung.

Ist natürlich trotzdem schlechter Stil !

MfG susowa
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
605
10.02.2026, 12:14 Uhr
Bert



Ist 'PADR1 vom CRT-Treiber' was anderes als UP34h?

--
Viele Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
606
10.02.2026, 16:32 Uhr
maleuma



Ja, PADR1 berechnet HL anhand des aktuellen Fensterbeginns und läuft dann in PADR rein. Das müsste sonst noch vorher separat programmiert werden und würde den Code größer werden lassen.

Quellcode:

E040          ;CRT-Treiber
E040
E040 ED5BA0B7 PADR0:  LD      DE,(CURSO)
E044 2A9CB7   PADR1:  LD      HL,(WINON)
E047 19               ADD     HL,DE
E048 CB24             SLA     H
E04A CB24             SLA     H
E04C CB24             SLA     H
E04E                  ;
E04E F5       PADR:   PUSH    AF              ;**34**
E04F 7D               LD      A,L     ;Spalte
E050 6C               LD      L,H     ;Pixelzeile
E051 FE28             CP      28H
E053 3006             JR      NC,IAD2 ;zu gross
E055 F680             OR      80H
E057 67               LD      H,A     ;HL=Pixeladr.
E058 F1               POP     AF
E059 A7               AND     A       ;CY=0
E05A C9               RET
E05B                  ;
E05B F1       IAD2:   POP     AF
E05C 37               SCF             ;CY=1
E05D C9               RET


--
Mario.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
607
11.02.2026, 15:15 Uhr
Dresdenboy



Mal ein anderes Thema:

T-State-genaue Synchronisation auf eine Flanke

Das macht natürlich nur Sinn, wenn man es braucht und die Bedingungen stimmen, d.h. z.B. gleicher oder ein voneinander abgeleiteter Takt für die beteiligten Bausteine.

Bei HeikoS könnte das z.B. für die Sprites auf dem JU+TE relevant sein.

Ich brauche es für den BIC, natürlich nicht für eine Tabellenkalkulation, aber für Grafikeffekte mit zeilenweisen Änderungen. Ich schrieb ja in <405> schon darüber bzgl. Hblank. Falls man mit >20 T-States Jitter (IN + JR/JP) leben kann, ist das natürlich kein Problem, aber falls diese Checks oft erfolgen müssen, kostet das schon deutlich.

Neben solchen Effekten gibt es einen anderen Nutzen: Falls man genau seine Position bzgl. der Bilddarstellung kennt, braucht man z.B. auch nicht irgendwelche Statusbits checken. Z.B. beim GDC ist dann nicht nötig, auf FIFO FULL oder READ DATA zu prüfen, weil klar ist, dass es in den entspr. Zyklen so klappen wird.

Die oben beschriebene Variante braucht natürlich viele Zeilen, um sich zu synchronisieren. Das kann sich schon für folgende Frames reduzieren, indem man einen framegenauen CTC-Interrupt zu einer genauen Startzeit (nach obigem Sync) aufsetzt (siehe <450> im BIC-Austausch), sollte bei Nutzung von HALT bis zum nächsten Frame der Jitter nur noch 0-4 T-States betragen. (BIC hat 1 M1-Waitstate).

Das braucht dann nur noch wenige Zeilen, um die HBlank-Flanke zu erwischen. Aber auch die kosten schonmal >1% der Zeit, wenn man dazwischen nicht viel tun kann. Es ginge auch nebenbei innerhalb von zyklusgezähltem Code (per Hand, VSCode-Plugin oder zmac-Assembler) mit insgesamt ca. 150 T-States Overhead, aber braucht immer noch mehrere Zeilen. Und falls man aus dem Takt kommt, müsste man es wiederholen.

Daher habe ich mir, in Anlehnung an C64-Methoden (der ja richtige Rasterinterrupts hat sowie 2 Zyklen-NOPs und sogar CPU-Takt-schnelle CIA-Zähler, was einige Tricks ermöglicht), etwas für den BIC oder andere Z80-Systeme (die ja meist einen CTC haben) überlegt:
Sofern sich z.B. der CTC-Timer für eine Zeile genau programmieren lässt (beim BIC: 240 T-States, also Timerwert 15 mit Vorteiler 16), kann bei entspr. Startpunkt schnell eine Synchronisation zumindest zu den CTC-Timer-Flanken erfolgen bzw. der vorliegende Jitter indirekt ermittelt werden. Falls man über Interrupt (z.B. über denselben CTC-Timer, der ja auch mit einem Vielfachen von 15 - oder mit was auch immer man benötigt - laufen kann) nach HALT an die Stelle kam, beträgt der Jitter wie oben 0-4 T-States. Dann reicht zumindest auf dem BIC als Grundgerüst eine Sequenz wie:

Quellcode:

  IN A,(80h) ; 12
  LD D,A     ; 5  -> 17 T-States auf dem BIC, also immer 1 mehr als der CTC-Timer-Zyklus mit Vorteiler 16
  IN A,(80h) ; 12
  LD E,A     ; 5
  IN A,(80h) ; 12
  LD H,A     ; 5
  IN A,(80h) ; 12
  ADD A,D    ; 5
  ADD A,E    ; 5 einfach mal addieren, hier gibt es mehrere Möglichkeiten, z.B. ADD HL,DE usw.
  RLA        ; 5
  LD L,A     ; 5 Summe*2 in L
  JP (HL)    ; 5 H kann hier auch schon 2 versch. Werte haben (z.B. 14h oder 13h)
             ; 88 T-States



(die T-States für BIC kann man hier unter Timing Z80+M1 sehen: https://map.grauw.nl/resources/z80instr.php ) Für Systeme ohne M1-Waitstate oder z.B. einen Z8 braucht man einen anderen Sampling-Code oder erhält einfach nur andere Zahlen als Ergebnis, da IN A,(n)+LD r,A nur 11+4 also 15 T-States braucht. Dann ist das 1 Takt kürzer als der CTC-Timerzyklus, wo man durch leichtes Verschieben die Flanke von der anderen Seite "einfängt".

Daraufhin wird in eine der 2 Speicherseiten entspr. HL gesprungen, wo sich weiterer Code zum Ausgleich des Jitters befindet. Da je nach System andere Speicherbereiche nutzbar sind oder auch der Platz knapp sein kann (auch, wenn pro Seite nur einige weitere Bytes genutzt werden), kann das entspr. angepasst werden.

Da der CTC-Timer hier gelesen wird, kann sowohl mit dessen gelesenen Werten (z.B. späteres Lesen liefert kleinere CTC-Werte) aber auch ein paar Berechnungen ein brauchbarer Adressraum geschaffen werden. Unterscheiden sich die Werte in L z.B. teils nur um 1, würden angesprungene Befehle teils überlappen. Das kann auch trickreich genutzt werden. Z.B. 18h, 18h, 20h wäre ein JR 18h überlagert mit einem JR 20h. So ähnliche Techniken werden im Sizecoding genutzt oder auch auf dem C64 in einer "NOP-Rutsche". Der JR-Sprung kann dann entspr. Zeitausgleichscode anspringen und schließlich ein finales Sprungziel.

Das ganze sollte auch nicht von System-ISRs durcheinander gebracht werden, was für eine Demo nicht so schwer zu handhaben ist.

VG,
Matthias
--
___________________________________
Produktionen im Rahmen der "The Computer Art Community" (Demoszene): https://demozoo.org/sceners/64936/, YT-Kanal: https://www.youtube.com/@4lpha0ne/videos
Aktuelle Projekte: GDC-Analysen für Grafikeffekte u. Demo/Game-Framework, universelles BIC-Modul auf Pico-Basis, Packer mit sehr kleinem 6502-Dekompressor
HW: BIC, MSX2+, KC87, KC85/2-4, KCC, LC-80, PC1715, C64, C16, Plus/4, A500, A1200, Mega 65, µCs ...

Dieser Beitrag wurde am 12.02.2026 um 14:54 Uhr von Dresdenboy editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
608
13.02.2026, 19:47 Uhr
HeikoS



Hallo Matthias,

wenn ich das richtig verstanden habe, müsste das so gehen, wie du es beschrieben hast, vorausgesetzt, man bekommt die CTC-Timer wirklich synchron zum Bildaufbau programmiert. Die ISR muss dann noch zum richtigen Zeitpunkt, z.B. bei einer bestimmten Zeile, zuschlagen und mit deinem Code, über den CTC-Zählerstand, dann richtig „einrasten“. Bin gespannt, ob das funktioniert.

Bei den Sprites-Demos auf dem Ju+Te 6K war das sehr viel einfacher, als zeilenweise bestimmte Modifikationen durchzuführen, wie Du es planst. Damit flüssige Sprite-Bewegungen möglich sind, müssen für einen Bewegungs-Schritt die Operationen:

- „Löschen“ an alter Position (t-1) und
- „Schreiben“ an neuer Position (t)

atomar und immer komplett pro Frame in der Blanking-Phase ausgeführt werden. Sonst sieht man ein „Flackern“ oder „Ausblenden“ der Sprites während der Bewegung. Das kann man sehr gut durch Einrasten per Polling am V-Sync-Impuls erreichen. Da geht auch nicht viel Zeit verloren, weil alles gerade so in die Blanking-Phase passt (und die Erstellung der Adress-Tabellen sogar noch außerhalb gemacht werden muss).

Bei Spielen würde man diese Abläufe dann eher durch eine ISR triggern und atomar durchlaufen lassen. Dazu bin ich aber noch nicht gekommen. Wäre sicher interessant, die Möglichkeiten des Z8 dazu zu nutzen. Der hat ja Timer „on-chip“.

Viele Grüße, Heiko
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
609
15.02.2026, 13:57 Uhr
Dresdenboy



@Heiko:
Beim BIC arbeitet der GDC ja mit CPU-Takt oder 1/2 davon (Teiler 4 u. 8 für die 15 MHz). Und da alle GDC-Operationen inkl. Bildaufbauzeiten darauf basieren, geht es da glücklicherweise.

Klar, eine Sprite-Engine mit bildweisem Update funktioniert ja so, wie du schreibst. Ich glaube eher, dass der Nutzenfall für zeilenweise Operationen eher im stärkeren Ausnutzen der dunkelgetasteten Phasen ist. Natürlich nur, wenn man dafür schnell genug ist. Beim BIC kümmert sich ja auch noch der non-flash-Modus mit u. der FIFO-Buffer kann genutzt werden, um diesen mit mehreren OUTI o.ä. schonmal voll zu stopfen, damit der GDC den Buffer bei Dunkeltastung schon einmal verarbeiten kann. Da hilft natürlich auch, zu wissen, wo man auf dem Bildschirm u. innerhalb der Zeile gerade ist, um nicht die angesprochenen Tests auf HBlank, FIFO full usw. machen zu müssen.

Palette, Grafikmodus etc. ändern u.ä. wäre da auch eher schon interessant. Oder man erzielt noch mehr Sprites oder andere Bildänderungen pro Frame, wenn man diese so eintaktet, wie das Bild mit der Zeit aufgebaut wird.

VG,
Matthias
--
___________________________________
Produktionen im Rahmen der "The Computer Art Community" (Demoszene): https://demozoo.org/sceners/64936/, YT-Kanal: https://www.youtube.com/@4lpha0ne/videos
Aktuelle Projekte: GDC-Analysen für Grafikeffekte u. Demo/Game-Framework, universelles BIC-Modul auf Pico-Basis, Packer mit sehr kleinem 6502-Dekompressor
HW: BIC, MSX2+, KC87, KC85/2-4, KCC, LC-80, PC1715, C64, C16, Plus/4, A500, A1200, Mega 65, µCs ...
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: [ 1 ] -2-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek