Assembler ist DOCH Hexenwerk

Es gibt 39 Antworten in diesem Thema, welches 5.270 mal aufgerufen wurde. Der letzte Beitrag (11. Mai 2022 um 07:19) ist von Mike.

  • Moin :)

    Ich wollte mit dem Turbo Makro Pro eine kleine ASM Routine testen, die soll nichts anderes machen als ein Ergebnis an Cursorposition 10,10 darzustellen.

    Dazu habe ich Bitte melde dich an, um diesen Link zu sehen. folgendes gefunden :

    Zitat
    58634 ($E50A)Cursor setzen; Werte in X,Y (Zeile, Spalte) vorgeben

    Also folgenden Code getestet :

    Code
    ldx #$0a
    ldy #$0a
    jsr $e50a

    .... tadaaaa, geht nicht. In einem anderen Google Ergebnis habe ich dann $e50c gefunden, und das funktioniert auch. Warum und was hat es dann mit dem Wiki Eintrag auf sich ??? Ich entschuldige mich schonmal falls das eine doofe Frage ist, aber ich bin halt kein Programmierer ;)

    "Werter Pöbel, wertes Gesocks ... aus dem Arsche zieht euch den Stock ..."

  • Bitte melde dich an, um diesen Link zu sehen.

    Wenn Du $E50A benutzt, wird über das Carry-Flag festgelegt, ob Du eine neue Position setzen (CLC) oder die aktuelle abfragen (SEC) willst.

    Bei Aufruf von $E50C wird diese Bedingung übersprungen und immer die neue Position gesetzt.

    Das Wiki ist da an der Stelle also unvollständig.

    Edit: Oh, und der Sauberkeit und Kompatibilität wegen sollte die Sprungtabelle benutzt werden, also $FFF0 in diesem Fall. :)

  • Also hier ist der Disassemblierte Code aus dem Bitte melde dich an, um diesen Link zu sehen.:

    Code
    Loc_e50a                 BCS Loc_e513
    $E50C                    STX $D6
    $E50E                    STY $D3
    $E510                    JSR Loc_e56c
    Loc_e513                 LDX $D6
    $E515                    LDY $D3
    $E517                    RTS

    $E50A hat also erstmal eine Branch-Anweisung (Branch on carry set - take branch when C flag is set). Ich bin ja gar kein 6502 Experte, aber vermutlich geht da was bei dir schief. Vermutlich ist bei dir das C gesetzt, sollte aber gelöscht sein. Denn dann fällt man ja nach $E50C durch und das funktioniert ja für dich. Von dem was ich da sehe schaltet man mit dem C Flag also das setzen (STY) oder lesen (LDY) der Cursorposition um. Kann das sein?

    EDIT: Krill war schneller und hat auch mehr Ahnung als ich. :)

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

  • Oh ok, d.h. so würde es auch funktionieren :

    Code
    ldx #$0a
    ldy #$0a
    clc
    jsr $e50a

    "Werter Pöbel, wertes Gesocks ... aus dem Arsche zieht euch den Stock ..."

  • Oh ok, d.h. so würde es auch funktionieren :

    Code
    ldx #$0a
    ldy #$0a
    clc
    jsr $e50a

    Ja, jetzt aber nur noch $FFF0 benutzen, damit es ganz korrekt ist. :)

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

  • root42

    Ok, dann nochmal für ASM Dummies (wie mich) : Warum $FFF0 ?

    Auf der Wiki Seite steht :

    Code
    springt nach 58634 ($E50A)

    Also wozu der Umweg über $FFF0 ?

    "Werter Pöbel, wertes Gesocks ... aus dem Arsche zieht euch den Stock ..."

  • root42

    Ok, dann nochmal für ASM Dummies (wie mich) : Warum $FFF0 ?

    Auf der Wiki Seite steht :

    Code
    springt nach 58634 ($E50A)

    Also wozu der Umweg über $FFF0 ?

    Das überlasse ich Krill... :biggrin: Mein Verständnis ist, dass die Sprungtabelle die "Offizielle" API des Kernal ist, und garantiert immer so aussieht. Wo die genauen Adressen der Routinen sind, könnte von ROM zu ROM THEORETISCH unterschiedlich sein -- aber ist es vermutlich nicht. Ob das aber z.B. auf einem SX64 genauso wie auf einem C64 ist, weiss ich nicht. Oder auf einem C128 im C64 Modus...

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

  • Genau, ist sowas wie eine offizielle API.

    Bei modifizierten KERNALs können die Sprung-Befehle eventuell woanders hinzeigen, tun es aber in der Praxis eher selten bis nie.

    Relevanter wird es, wenn man (primär auf Quelltext-Ebene) Multi-Plattform-Support für mehrere Commodore-Rechner (also nicht nur C-64) haben oder Dinge portieren will.

    Der Umweg hat jedenfalls potenziell mehr Vor- als Nachteile. :)

  • Schau mal hier --> Bitte melde dich an, um diesen Link zu sehen.

    Eine sehr gute Dokumentation der Kernal Sprungtabelle.

    In der Zeitschrift für Assyriologie übersetzte H. Zimmern 1896 einen fast 3000 Jahre alten Text, der in den Ruinen der Bibliothek des Assurbanipal in Ninive gefunden wurde, aus der Keilschrift ins Deutsche. Auf dem Tontäfelchen hatte der Umanu (Weisheitsvermittler) Shaggil-kinam-ubib notiert:

    ,Schaust du hin, so sind die Menschen insgesamt blöde.‘

    Das fasst im Prinzip alles ganz gut zusammen.“

    vintage_computer.juergenkrieg.com

  • Bei modifizierten KERNALs können die Sprung-Befehle eventuell woanders hinzeigen, tun es aber in der Praxis eher selten bis nie.

    Selten ja, nie nein. Z.B. bei Bitte melde dich an, um diesen Link zu sehen. ist der Kernal normalerweise ausgeblendet, aber Aufrufe über die Kernal-Sprungtabelle (auch FFF0) funktionieren trotzdem (weil dort entsprechende Stubs/Trampolines liegen).

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Danke schonmal für die Ausführungen, Programm läuft erstmal soweit :thumbup:

    Nächste Frage die direkt aufkam :

    Gibt es beim C64 auch einen eigenen Grafik Cursor und wenn ja, kann ich diesen benutzen um ein Zeichen zu "print"en ? Also nicht über Zeile,Spalte sondern direkt über die Pixel-Position ?

    "Werter Pöbel, wertes Gesocks ... aus dem Arsche zieht euch den Stock ..."

  • Danke schonmal für die Ausführungen, Programm läuft erstmal soweit :thumbup:

    Nächste Frage die direkt aufkam :

    Gibt es beim C64 auch einen eigenen Grafik Cursor und wenn ja, kann ich diesen benutzen um ein Zeichen zu "print"en ? Also nicht über Zeile,Spalte sondern direkt über die Pixel-Position ?

    Geht das überhaupt? Man kann doch wenn ich mich recht entsinne entweder Text ODER Grafik machen (abseits von raster interrupt-tricks)? Wenn du einen der Pixel-Modi verwendest, musst du vermutlich die Zeichen selber plotten... Ich glaube so wie bei GWBASIC auf dem PC geht das auf dem C64 nicht...

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

  • Ich hab keine Ahnung ob das geht, DESHALB frag ich ja :D

    Das heisst ich müsste einen Grafikmodus öffnen (LORES/HIRES) und um dann ein Zeichen auszugeben müsste ich den Speicherinhalt aus dem char table an die entsprechende Position kopieren oder wie kann ich mir das vorstellen ?

    "Werter Pöbel, wertes Gesocks ... aus dem Arsche zieht euch den Stock ..."

  • Also da verlasse ich endgültig mir bekannte Gewässer, auf dem PC kann ich dir das alles erklären, aber ja, das war mein Verständnis, dass der C64 entweder im Textmodus ist, und da am fixen 8x8 Raster Zeichen ausgeben kann, oder aber im Grafikmodus, wobei einzelne Pixel setzen da aber auch nicht super trivial ist... Man möge mich bitte korrigieren, wenn hier jemand mit mehr Ahnung ist!

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

  • Hi

    hier programmiert N3rdroom eine Locate Routine in Assembler. Schaue es dir mal an. Er erklärt es recht gut, zumal er auch kein perfekter Assemblerprogrammierer ist.

    Aber für Anfänger in dieser Sparte sehr hilfreich.

    Bitte melde dich an, um dieses Medienelement zu sehen.

    Man kann noch über den Bildschrimspeicher Sachen ploten lassen.

    siehe Eintrag in c64-Wiki

    Bitte melde dich an, um diesen Link zu sehen.

    Gruß

  • Naja der Bildschirmspeicher ist ja auch wieder unterteilt in Zeile,Spalte. Das wäre ja nur eine andere Herangehensweise als die Cursor Position, oder ?

    Das Video guck ich mir nachher mal an :)

    "Werter Pöbel, wertes Gesocks ... aus dem Arsche zieht euch den Stock ..."

  • Als Cursor im Grafikmodus benutzt man gewöhnlich ein Sprite.

    Ich möchte keinen sichtbaren Cursor, sondern etwas an der grafischen Cursorposition ausgeben (z.B. bei Pixel 100,150) und das soll kein Sprite werden ;)

    "Werter Pöbel, wertes Gesocks ... aus dem Arsche zieht euch den Stock ..."

  • Naja der Bildschirmspeicher ist ja auch wieder unterteilt in Zeile,Spalte. Das wäre ja nur eine andere Herangehensweise als die Cursor Position, oder ?

    Das Video guck ich mir nachher mal an :)

    Naja es kommt darauf an was du programmierst. Wenn du nur Text hast, dann bist du mit der Printanweisung sehr gut bedient.

    Hast du hingegen Grafikelement, dann bist du mit dem Bildschirmspeicher besser dran, obwohl man auch mit der Printanweisung Grafikelemente platzieren kann.

  • Naja der Bildschirmspeicher ist ja auch wieder unterteilt in Zeile,Spalte. Das wäre ja nur eine andere Herangehensweise als die Cursor Position, oder ?

    Das Video guck ich mir nachher mal an :)

    Naja es kommt darauf an was du programmierst. Wenn du nur Text hast, dann bist du mit der Printanweisung sehr gut bedient.

    Hast du hingegen Grafikelement, dann bist du mit dem Bildschirmspeicher besser dran, obwohl man auch mit der Printanweisung Grafikelemente platzieren kann.

    Ich glaube er will an Position X,Y einen Buchstaben plotten. Und X,Y soll beliebig auf dem 320x200 Raster sein. Das geht IIRC nicht, oder? Da muss man händisch jedes Pixel plotten? Bzw. je nachdem was das Endresultat sein soll würde man ganz andere Herangehensweisen nehmen...

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.