Zeilensprung Routine für Super_Castle

  • Hi,


    da Du in dem anderen Thread danach gefragt hattest, hier ist eine Zeilensprung-Routine:


    Eingabe: HL=Bildschirm-Adresse
    Ausgabe: HL=Bildschirm-Adresse der nächsten Zeile


    Code
    LD BC,#800
    ADD HL,BC
    RET NC
    LD BC,#C050
    ADD HL,BC
    RET


    CU,
    Prodatron

  • Alternativ kann er natuerlich auch die Routine SCR_NEXT_LINE in der Firmware verwenden.


    Code
    SCR_NEXT_LINE: &BC26
    
    
    Eingabe: HL = Adresse auf dem Bildschirm
    Ausgabe: HL = Adresse des Punktes, der genau eine Zeile unter dem der Eingabe liegt
    
    
    AF wird dabei zerstoert, alle anderen Register werden nicht beeintraechtigt.
  • Jo, die hatte ja der AST schon gepostet, aber ich denk mal, der Super_Castle will die der Geschwindigkeit wegen nicht nehmen.


    Die schnellst mögliche Sprite Routine funktioniert übrigens nach diesem Prinzip ("direkt adressiert" a la Zap't'Balls):


    <!-- m --><a class="postlink" href="http://www.cpcwiki.com/index.php/Talk:Programming:Fast_Sprites">http://www.cpcwiki.com/index.php/Talk:P ... st_Sprites</a><!-- m -->


    Hatte bisher noch keinen Bock gehabt, daraus einen vernünftigen Artikel zu machen, aber kann ja noch was werden. Den in Basic geschriebenen Generator für direkt adressierte Sprites (sowas wie da oben will man ja nicht per Hand eintippen) hab ich auch noch irgendwo rumfliegen.


    CU,
    Prodatron

  • hallo ihr beiden, habt mir sehr weitergeholfen.


    wo bekomme ich die zyklen her für den z80 des cpc .


    welcher sprung ist der kürzere von der zeit her zu der prodatron-routine :
    jp, jr oder call ?



    ich habe jetzt auch den cpce, muss sagen der ist flinker und hat nicht soviel sachen eingebaut wie die anderen, es fehlt der assembler.


    welcher crossassembelr ist jetzt angebracht, der gut maxam-compatibel ist. wer hat gute erfahrung mit welchem.



    mfg

  • Dauer der Befehle:


    <!-- m --><a class="postlink" href="http://www.little-bat.de/cpc/z180.htm#A">http://www.little-bat.de/cpc/z180.htm#A</a><!-- m -->


    Zum Thema Crosscompiler: Hier benutze ich Grundsätzlich immer WinApe wegen der Maxam-Kompatibilität. Du kannst den ja quasi auch als Assembler-only benutzen. Mit WinApe assembliere ich eben auch meine MSX-Sourcen.


    CU,
    Prodatron

  • Zitat von &quot;super_castle&quot;


    wo bekomme ich die zyklen her für den z80 des cpc .


    Also ich mag folgendes PDF Dokument, da es ganz uebersichtlich aufgebaut ist: http://www.teipir.gr/WWW/ECS/PeLAB/sbs/PERI-i/8085/Z80.pdf


    Zitat von &quot;super_castle&quot;


    welcher sprung ist der kürzere von der zeit her zu der prodatron-routine :
    jp, jr oder call ?


    Ein JP benoetigt 3 Bytes Code und 10 Timestates.
    Ein JR benoetigt 2 Bytes Code und 12 Timestates.
    Ein CALL benoetigt 3 Bytes und 16 Timestates.
    Sollten zusaetzlichen Bedingungen hinzukommen, dann variiert das nochmal. Bspw. JR z, nn (wenn z, dann 12 Timestates, wenn nicht z, dann nur 7 Timestates).
    Beim JR sollte man auch bedachten, dass der relative Sprung nur jeweils 128 Bytes nach vorne und hinten springen kann.
    Am besten schaust du aber einfach mal in das Dokument von oben rein, da steht das alles ausfuehrlich in der "Jump Group", bzw. in der "Call and Return Group".


    Zitat von &quot;super_castle&quot;


    welcher crossassembelr ist jetzt angebracht, der gut maxam-compatibel ist. wer hat gute erfahrung mit welchem.


    Also die Assembler in WinAPE und WinCPC finde ich auf jeden Fall nicht schlecht. Im Moment verwende ich aber Pasmo, da ich eine Build Datei habe, die ich nur anklicken brauche (ohne halt einen Emulator zu starten) und damit dann noch einiges nebenbei erledigen kann.

  • Zitat von &quot;Octoate&quot;


    Ein JP benoetigt 3 Bytes Code und 10 Timestates.
    Ein JR benoetigt 2 Bytes Code und 12 Timestates.
    Ein CALL benoetigt 3 Bytes und 16 Timestates.


    Beim CPC ist das ja wegen dem GateArray-Dazwischengefunke etwas anders, da sind die Befehlszeiten teilweise aufgebläht. Daher würde ich lieber die von mir angegebene Quelle nehmen.


    CU,
    Prodatron

  • ..Du kannst den ja quasi auch als Assembler-only benutzen....


    heisst das, das ich ihn irgendwie bei winape allein starten kann ohne das winape läuft?


    noch eine frage ich möchte eine schleife in asm proggen die mehr als 255x durchlaufen wird, also 500 zb, die kriege ich nicht gebacken. geht jetzt darum, die bytes in den screen zu setzen.


    kannst mal kurz ein beipiel zeigen?


    mfg

  • Zitat


    Daher würde ich lieber die von mir angegebene Quelle nehmen.


    habe ich mir gedacht, das die routine noch andere sachen macht.


    mfg

  • Zitat


    wenn du auch ne CPC bezogene Quelle haben solltest


    ich habe mal das buch "z80 proggen mit zaks" als pdf gezogen in deutsch.


    mfg

  • ich schreibe jetzt 210x das byte(255) untereinander, ab 200 springt es nicht in die nächste spalte sondern 32 spalten weiter? wie kann es umgestellt werden, das wenn es unten angekommen ist in die nächstgelegene spalte springt.



  • hallo prodatron kannst du die routine so umbauen, das ich zb von der x-achse das 12 byte angebe und von der y-achse das 23.zigste und dann den wert für hl bekomme und anschließend deine routine zum setzen nehme?


    irgendwie machen mich die bytes im screen raschlig wenn es darum geht ein bestimmte kästchen(rechteck/quadrat) mit bytes zu besetzen.


    mfg

  • Zitat von &quot;Octoate&quot;

    Jo, aber zum abschaetzen ist das eigentlich eine ganz gute Uebersicht. Btw, wenn du auch ne CPC bezogene Quelle haben solltest, dann bin ich da natuerlich auch dran interessiert :).


    Wie gesagt, ich würde halt die hier nehmen aus dem Schneider Systembuch:


    Zitat von &quot;Prodatron&quot;

    Dauer der Befehle:


    <!-- m --><a class="postlink" href="http://www.little-bat.de/cpc/z180.htm#A">http://www.little-bat.de/cpc/z180.htm#A</a><!-- m -->


    Dort sind die Zeiten auch schon direkt in Mikrosekunden angegeben, nicht in Zyklen, was das ganze noch einfacher macht.


    CU,
    Prodatron

  • Zitat von &quot;super_castle&quot;

    hallo prodatron kannst du die routine so umbauen, das ich zb von der x-achse das 12 byte angebe und von der y-achse das 23.zigste und dann den wert für hl bekomme und anschließend deine routine zum setzen nehme?


    irgendwie machen mich die bytes im screen raschlig wenn es darum geht ein bestimmte kästchen(rechteck/quadrat) mit bytes zu besetzen.


    mfg


    Hi,


    ich glaub, ich muß nochmal n paar Sources ins Wiki tun. Hier erstmal mal die Routine aus dem SymbOS-Screendriver, die die Bildschirmadresse eines Pixels berechnet:


  • Und hier ne Routine, die ein Kästchen malt:


  • hallo, vielen dank. allmählich blickt man da durch dank deiner hilfe.



    mfg

  • hallo, nochmal. ich möchte eine entscheidung treffen:


    inc a
    cp 50


    der akku wird hochgezählt, die entscheidung bei cp soll jetzt keine festvariable wie hier die 50 sein, sondern die vergleichszahl soll aus einer speicherzelle genommen werden die vor dem aufruf mit dem wert festgelegt ist. wie geht so etwas. die maxambeschreibung gibt nicht viel her.


    danke.


    mfg

  • Z.B. so:


    INC A
    LD HL,speicherzelle
    CP (HL)
    ...


    speicherzelle DB 50


    Wenn Du eine Schleife programmieren willst, würde ich übrigens immer runterzählen:


    LD A,(speicherzelle)
    loop: ...
    DEC A
    JR NZ,loop


    dann sparst Du Dir nämlich das CP

  • hallo, jetzt geht es. ich wußte nicht, das ich die vorgabe in defb bei dir noch mit einem neuen wert laden kann. es sollte kein fester wert sein.



    mfg

  • ich wußte nicht, das man eine speicherstelle mit einer vorgegebenen konstante ändern kann wie man möchte während eines programmablaufes.


    mfg

  • in mode 1 muß ich ja 2 bytes nebeneinander erzeugen mit verschiedenen farbwerten , wie funktioniert das denn wenn ich an der stelle &c000 ein byte setzen will welches mode 1 entspricht ?


    mfg

  • Wenn du die Mode 1-Codierung meinst:


    Bit 7,6,5,4 = Bit 0 der 4 Pixel im Byte
    Bit 3,2,1,0 = Bit 1 der 4 Pixel im Byte


    = 2 Bit/Pixel = 4 Farben.


    Beispiel:


    10000000 = 1. Pixel in Pen 1 gesetzt
    00001000 = 1. Pixel in Pen 2 gesetzt
    10001000 = 1. Pixel in Pen 3 gesetzt
    11001100 = 1+2 Pixel in Pen 3


    usw.

  • hallo, möchte mit deinen startadressen arbeiten und folgende 2 byte an die adresse schreiben, geht aber nicht....?

  • Du willst die Bildschirm-Adresse nach HL laden oder die Tabelle ändern?
    So wie es da steht, lädst Du HL mit der Adresse des Labels getatr0.
    Richtig wäre hier Ld Hl,(getatr0)

  • hallo das geht jetzt :


    kann man für die 2 und 4 irgendetwas anderes zum hochzählen nehmen, irgendein register oder so etwas?

  • Was genau willst du denn erreichen?


    Eine - wenn auch nicht elegante - Lösung wäre z. B. auch:
    (nur, um mal eine Schleife zu demonstrieren)


    ld b,$08
    ld de,2048
    ld hl,(getatr0)
    loop:
    ld (hl),255
    add hl,de
    djnz loop

  • ich will von hier :


    getadr0 ;Zeilenstart-Adressen
    dw #C000,#C800,#D000,#D800,#E000,#E800,#F000,#F800,#C050....


    die werte auslesen nach bedarf, wenn ich den 3. brauche soll der gelesen werden, wenn ich den 6. brauche, soll der gelesen werden bis zur linie 200.



    da w-werte sind müssen immer 2 addiert werden.


    getadr0+2 ist der wert #c800, getadr0+4 ist der wert #d000 usw...

  • Eigentlich brauchst Du keine Tabelle - oder hab ich was mißverstanden?


    Um z. B. in Mode 2 (da is es am einfachsten zu erklären) ein Zeichen mit &FF zu überschreiben, rechnest du:


    Adresse= (Zeile-1)*80
    Adresse=Adresse+&C000


    Damit hast du das 1. Byte des Zeichens.


    Dann addierst du 2048 dazu und bist in der nächsten Zeile des Zeichens (also eine Pixelzeile darunter).
    usw...