256kb von VGA-chain4 löschen ?

  • Hallo, guten Tag.


    Ich habe mal mit dem chain-4-modus angefangen.
    Ich möchte chain-4 nutzen für umschaltung/wechsel von 2 Screen.
    Ist noch viel Arbeit, mein Englisch ist in grenzen.


    Habe ihn jetzt geschaltet , das die 4 Seiten getrennt sind voneinander.
    Es wird schon umgeschaltet.


    Nun suche ich ein Methode um die 256kb erstmal zu löschen in Pascal.
    Also von A000:0 bis 256 kb.


    Da finde ich keine Lösung weil es nur immer bis 64kb geht .
    Vielleicht hat man hier auch schon irgendwo damit angefangen mit dem chain-4?


    Danke.
    Gruss

  • Ein wirklich gutes Video!


    @funkheld - Bei den port-Zugriffen könntest Du sicherheitshalber statt einen Fixwert zu schreiben vielleicht besser einlesen, maskieren und zurückschreiben. Da ich keine Pascalkenntnisse habe, kann ich Dir leidern keinen code "spenden". Stattdessen empfehle ich Dir Pascal ModeX.


    Es sind vom VGA Ram nur 64KiB eingeblendet und der Rest mittels hardware erreichbar - im obigen Video von root_42 ist das sehr gut erklärt.

  • Danke.


    Das Video ist wirklich super.


    Ich habe schon versucht einen winzigen Teil vom Video umzusetzen nach Pascal.
    Es ist nicht leicht das zum Pascal zu schieben, vielleicht muss ich doch mal C anschmeißen.


    ---


    Pascal ModeX ziehe ich mir nochmal rein vom Grundsystem.


    Fange nochmal bei "null....." an.
    Es lässt mir keine Ruhe.


    Ich möchte nicht all zuviel ASM darein bringen.


    ---


    Er hat die Umschaltroutinen der Seiten in ASM geschrieben. Muss einen Grund haben mit der Präcision zum DAC und CRT Controller.
    Beim Punkte setzen hat er auch einen Zeilenrücklauf beachtet.


    Darum hauen der Port[] Befehl von Pascal nicht hin wenn sie einfach so gesetzt werden.


    Ich habe es in C umgesetzt aus dem youtu.be/GVvr7SXM0XM
    Und da haut das Punkte setzen hin und das Linien ziehen zusammen mit der Seitenumschaltung.
    Das Borland C++ 3.1 C ist wohl dementsprechend schnell.



    Gruss

    2 Mal editiert, zuletzt von H.EXE () aus folgendem Grund: Zusammengefügt

  • Hallo @funkheld
    Du kannst auch Deine Beiträge editieren, statt neue Antworten zu erstellen.


    Schön, dass Programmierer hierher finden, werde mich auch demnächst™ mit dem Thema beschäftigen. Coding ist ja so oder so bei mir immer mal wieder aktuell. C64 ASM, Basic und Amiga Basic, Blitz Basic usw. Früher auf PC Turbo Pascal 7.
    Und willkommen auch hier von mir, auch wenn außerhalb des Threads.


    mehr OnTopic: http://qzx.com/pc-gpe/tut10.txt da war nichts zu finden?
    Der Link is aber aus nem anderen Thread hier.

  • Vielleicht gibt es für den Pascal 7 eine Lösung die nicht nur aus ASM besteht um chain-4 abzuschalten und die 4 Screens auch mit einfachen Pascal zu nutzen.


    Nur mal Pixel auf die 4 Screens setzen unter Kontrolle und dann weitersehen.


    Was du da oben rausgesucht hast habe ich auch schon versucht zu verstehen. Er geht von 2 Screens aus für ein Spiel.
    Ich komme da nicht hinter . Vielleicht schafft das mal ein Künstler von hier.


    Gruss

    Einmal editiert, zuletzt von funkheld ()

  • Du brauchst kein Assembler für die meisten Sachen in Turbo Pascal. Es gibt alles als Pascal Kosntrukt:


    Uses Crt, Dos;


    Und dann kannst du mit Intr die Interrupts auslösen, deren Parameter mit Registers setzen und ports mit der Port Variable lesen und schreiben.


    Beispiel für Mode Y Initialisierung:


    EDIT: Habe auch flott SetPixel implementiert, was demonstriert, wie man beliebige Speicherbereiche in Pascal anspricht.

    root42 auf YouTube


    80486DX@33 MHz, 16 MiB RAM, Tseng ET4000 1 MiB, GUSar Lite & TNDY & SnarkBarker, PC MIDI Card + SC55 + MT-32, XT CF Lite, OSSC 1.6

    Einmal editiert, zuletzt von root_42 ()

  • Hallo, danke für deine Hilfe.


    Dieses MX lässt mich nicht los.


    so : 1 shl (x and 3) oder so : (x and 3) shl 1


    Gruss

    Einmal editiert, zuletzt von funkheld ()

  • 1 shl (x and 3)


    sonst shiftest du ja immer nur um ein bit. Du musst aber um die richtige Anzahl bits shiften.

    root42 auf YouTube


    80486DX@33 MHz, 16 MiB RAM, Tseng ET4000 1 MiB, GUSar Lite & TNDY & SnarkBarker, PC MIDI Card + SC55 + MT-32, XT CF Lite, OSSC 1.6

  • root_42: Würde das hier eigentlich von TP optimiert werden? Auch wenn es für das Verständnis gut ist, dass du es so geschrieben hast …

    Code
    VGA[ (y*320) div 4 + x div 4 ] := c;

    Oder sollte man lieber dies schreiben, weil die Funktion oft benötigt wird und Division langsam ist und Halbierungen als Shift schnell gehen?

    Code
    VGA[ (y*320) shr 2 + x shr 2 ] := c;

    Mehr eine theoretische Frage als TP-Einsteigerin. ^^

  • Hallo, guten Tag.


    Was wird hier bitte gemacht:


    type
    VgaLinear = Array[0..65534] of byte;


    var
    VGA: VgaLinear absolute $A000:$0000;


    Danke.
    Gruss


    --------------------------
    VGA[ (y*320) shr 2 + x shr 2 ] := c;
    -------------------------


    Ist da s nicht so herum h.exe :


    ? "2 shr VGA[ (y*320) + 2 shr x"

  • Da wird eine Variable für das VGA RAM deklariert. 65534 weil Pascal nicht mehr kann (1 Byte fehlt). Siehe auch Onlinehilfe zu „absolute“.

    root42 auf YouTube


    80486DX@33 MHz, 16 MiB RAM, Tseng ET4000 1 MiB, GUSar Lite & TNDY & SnarkBarker, PC MIDI Card + SC55 + MT-32, XT CF Lite, OSSC 1.6

  • @funkheld: Division durch 4 ist ein zweimaliges "Halbieren", also den Wert zwei mal nach rechts schieben. Das wäre 'x shr 2'.


    Hier die Shift-Syntax in der Lazarus/FreePascal-Doku, die bekanntlich kompatibel mit TP sein soll:

    Code
    A shr 1 // corresponds to integer DIV 2 (only that it is faster)
            // (only for integer data fields, the result is rounded to an integer)
    B shl 2 // corresponds to integer * 4 (only that it is faster)
            // (only for integer data fields, the result is an integer)


    Disclaimer: Das sind aber alles nur Optimierungen. Wollte nur wissen, ob das wirklich etwas bringt, oder ob das div 4 gar vom Compiler so wegoptimiert wird.

  • x shr 2

    ich dachte es wird so geschrieben : 2 shr x

    Gruss


    Was wird denn hier bitte gemacht:
    var
    VGA: VgaLinear absolute $A000:$0000;


    Danke.


    Ich hab jetzt mal versucht aus dem Mx-Beispiel von youtube etwas für Pascal zu machen.


    Es soll eine Punkte-Reihe rot von oben links nach unten rechts gezogen werden in vga_page1 mit der Taste a.
    Dann wollte ich mit der Taste r page_flip machen.


    Ich sehe nichts , keine Punkte. Hmmm... wo ist denn der Fehler;


    Danke.


  • x shr 2


    ich dachte es wird so geschrieben : 2 shr x


    Gruss

    Laut Dokumentation nicht. Dein Ausdruck ist zwar legitim, darum meckert der Compiler nicht, aber mit gänzlich anderem Ergebnis ;) Allein deshalb kann dein Code nicht funktionieren … du willst eine Zahl x durch 4 teilen: x div 4 == x shr 2.




    Aber auch hier noch mal die Bitte, Ergänzungen über die Funktion Bearbeiten in den bestehenden Beitrag einzubauen, anstatt mehrere neue Beiträge hinterherzuschieben :) Danke dir! :thumbup:

  • Ich kann das MX verhalten nicht testen weil die beiden Ports keine Verbindung zu :
    VGA[ (y*320) div 4 + x div 4 ] := c;
    haben. Wenn ich die beiden Port rausnehme läuft das Programm richtig weiter.


    Gruss


    Code
    port[SC_INDEX] := MAP_MASK;
    port[SC_DATA] := 1 shl (x and 3);
    
    
    VGA[ (y*320) div 4 + x div 4 ] := c;
  • Was meinst du mit „keine Verbindung“? Und inwiefern läuft es ohne Selektion der Map Mask richtig weiter?


    Ich habe das Programm zwar nur kurz in DosBox getestet, aber da lief es problemlos.


    Ohne Map Mask Selektion sollte das Bild vertikale Streifen haben.

    root42 auf YouTube


    80486DX@33 MHz, 16 MiB RAM, Tseng ET4000 1 MiB, GUSar Lite & TNDY & SnarkBarker, PC MIDI Card + SC55 + MT-32, XT CF Lite, OSSC 1.6

  • Ja, danke es läuft auch wenn ich die beiden port lösche , mit vertikalen Streifen.
    Beide male die gleiche Abbildund.


    Darum meine Frage, was machen da drin die beiden Port?


    Kannst du bitte oben mal mein Mx-Beispiel lokalisieren.
    Ich hatte es von youtube (Borland C) umgesetzt in Pascal. Funktioniert aber nicht.


    Danke.
    Gruss

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!