Z80-Programme im C128-Modus (nicht CP/M) möglich?

Es gibt 176 Antworten in diesem Thema, welches 32.834 mal aufgerufen wurde. Der letzte Beitrag (9. Januar 2023 um 23:24) ist von Mike.

  • Das ganze zeigt auch, wie man in Assembler ineffektiven 6502 Code schreiben kann. Es ist wie Claus schon geschrieben hat, in der Hauptschleife auf das Y-Register zu verzichten, kostet halt richtig viel Zeit. Im direkten Vergleich benötigt die Routine von Snoopy auf dem C64 26,83 Sekunden und damit genau 12 Sekunden mehr als meine. Ohne den selbst modifizierenden Code wird 1 Takt mehr in der Schleife benötigt, ist aber immer noch 10.7 Sekunden schneller.

    Ich vermute der Z80 hat hier auch eher ein bestcase und kann deshalb mit seinen vielen Register besonders gut Punkten. So das der doppelte Takt des Z80 ungefähr ausreicht, um mit dem 6502 gleichzuziehen. Eine vergleichbare ausgerollte Routine wie von gogoMAK auf dem Z80 wäre jetzt mal interessant. Ich glaube, der Abstand zum 6502 wird eher großer als kleiner.

    Es ist praktisch unmöglich, ein schnelles Programm zu schreiben, wenn man es in Basic programmiert.

  • Also, diese kurze Fassung:

    ... braucht auf meinem C64 rund 11 Sekunden (bei 5-maliger Ausführung). Z80 kann ich leider nicht. :|

    Wenn du nichts dagegen hast, dann nehme ich das mal als schnelle "8502-Referenz" und schau mal wegen einer optimierten Z80-Fassung fürs Bildschirm füllen. Bin leider zur Zeit etwas eingespannt, aber vielleicht komme ich morgen dazu. Dann kann ich auch auf dem echten C128 vergleichen. :)

    Soll natürlich alles nicht bierernst gesehen werden, ist halt "Spass an der Freud" und bisschen rumspielen mit Z80 und C128. ;)

  • wenn dann aber eine Schleife bis 250 und sta 1024,y sta 1024+250,y sta 1024+500,y sta 1024+750,y ;)

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

  • Soll natürlich alles nicht bierernst gesehen werden, ist halt "Spass an der Freud" und bisschen rumspielen mit Z80 und C128. ;)

    Ne ne ne ne ne!

    Beim Z80 hört der Spaß auf! :sonicht:

    Über so sinnvolle, wichtige Dinge wie einen Türstopper macht man keine Witze! :oob::prof:

    :bgdev

  • Wenn du nichts dagegen hast, dann nehme ich das mal als schnelle "8502-Referenz"

    Nur zu! :thumbup:

    und schau mal wegen einer optimierten Z80-Fassung fürs Bildschirm füllen.

    Das wäre für mich auch interessant.

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

  • Also, bei den Themen "Z80" und "Speicher füllen" käme mir als erstes der LDIR-Befehl in den Sinn.

    Im konkreten Fall also das erste Byte im Speicherbereich von Hand mit 53h gefüllt und dann (Griff in den Schrank, "Knaur, Zaubern mit dem ZX81" herausgeholt und ...)

    Code
    LD A,53h
    LD HL,0400h
    LD (HL),A
    LD DE,0401h
    LD BC,03E7h
    LDIR

    Der LDIR-Befehl kopiert hier den Speicherbereich von $0400..$07E6 nach $0401..$07E7. Aufgrund der "schlecht gewählten" Adreßabfolge (HL und DE werden nach jedem Kopierschritt inkrementiert) wird der Wert in $0400 bei jedem Kopierschritt um eine Adresse "weitergetragen", wodurch das Kopieren hier zum Füllen wird.

    Beim C128 ist an der Stelle allerdings das Z80-BIOS im Weg, so daß der Bildschirmspeicher (und damit auch HL und DE) an andere Stelle hinzeigen müßten.


    Edit: Ich sehe gerade, daybyter hatte in #Bitte melde dich an, um diesen Link zu sehen. die gleiche Idee. :D

  • Der Vollständigkeit halber: Es gibt noch LDDR (kopiert abwärts) und LDD bzw. LDI - Ohne auto-Repeat.

  • Ich habe mich heute Vormittag mal an die neuen Ansätze gemacht und für den 8502 den Code von goloMAK eingetippt

    Bitte melde dich an, um diesen Anhang zu sehen.

    und da Mike hier darauf hingewiesen hat,

    Beim C128 ist an der Stelle allerdings das Z80-BIOS im Weg, so daß der Bildschirmspeicher (und damit auch HL und DE) an andere Stelle hinzeigen müßten.

    habe ich für den Z80 mal diesen Code gebastelt (ab Zeile 190 steht der Z80-Code):

    Bitte melde dich an, um diesen Anhang zu sehen.

    Dann wieder den Code jeweils wieder in das kleine Testprogramm eingebunden (oben für 8502, unten für den Z80):

    Bitte melde dich an, um diesen Anhang zu sehen.

    Beide Programme laufen auch einwandfrei auf x128 (VICE 3.4, Ubuntu-Variante Linux Lite 5.4 LTS):

    Bitte melde dich an, um diesen Anhang zu sehen.


    Okay, dann ab damit zum C128, um die Zeiten auf echter Hardware zu stoppen. :loet

    Das 8502-Programm läuft einwandfrei und malt mir den 40 Zeichen-Bildschirm mit Herzen voll und das Z80-Programm schreibt nach einiger Zeit nur das "FERTIG!" von Zeile 70 auf den Bildschirm. Es kommen keine <3! 8\|

    Also nochmal gründlich den C128 ausgeschaltet und wieder gestartet. Gleiches Ergebnis: Es werden vom Z80 keine Herzen gemalt. :schreck!:

    Nochmal zurück zum Emulator: Da klappt alles prima mit 1000 <3 vom Z80 auf dem Bildschirm! :S

    Es kann nur einen Grund geben: Mein C128 hat keinen Z80 drin! :cry::D


    Sorry, aber ich komme hier nicht weiter. Der Z80 malt mir keine Herzen, während es mit exakt demselben Programm mit dem x128-Emulator anstandlos klappt. :nixwiss:

    Anbei ein D64-Image mit Double-Ass und den Sourcen und Programmen zum Testen, falls es mal jemand an seinem C128 ausprobieren möchte und könnte.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Zum schnellen Testen die Programme FSP-8502-F und FSP-Z80-F jeweils mit DLOAD laden und starten.

    Für die Sourcen muss zuerst Double-Ass geladen und gestartet werden. Dann mit LOAD"SOURCE<..>",8 den Code laden.

  • Es kann nur einen Grund geben: Mein C128 hat keinen Z80 drin!

    Oder du hast eine Ungenauigkeit in VICE gefunden. Das Verhalten passt auch zu dem von dir zitierten Hinweis von Mike, den du scheinbar gar nicht umgesetzt hast? Zumindest schreibst du laut Screenshot immer noch nach $0400, aber laut Bitte melde dich an, um diesen Link zu sehen. leitet die MMU Z80-Zugriffe in RAM-Bank 0 auf Adressen $0000-$0ffff auf das Z80-ROM um:

    Zitat von C128 Service Manual

    In Z-80 mode, any address to RAM bank in the range from $0000 to $0FFF will be translated to the corresponding address in the range from $D000 to $DFFF, where the Z-80 CP/M BIOS physically exists in System ROM.

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

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

    Einmal editiert, zuletzt von Unseen (8. Januar 2023 um 13:01)

  • [...]

    Zitat von C128 Service Manual

    [...] will be translated to the corresponding address in the range from $0000 to $DFFF, where the Z-80 CP/M BIOS physically exists in System ROM.

    wohl eher "... $D000 to $DFFF" :)

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

  • wohl eher "... $D000 to $DFFF"

    Stimmt, da hat die OCR versagt.

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

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

  • Beim C128 ist an der Stelle allerdings das Z80-BIOS im Weg, so daß der Bildschirmspeicher (und damit auch HL und DE) an andere Stelle hinzeigen müßten.

    Gefunden in "Bitte melde dich an, um diesen Link zu sehen." auf Seite 157:

    Bitte melde dich an, um diesen Anhang zu sehen.

    :thumbsup:

  • ...das Z80-BIOS...

    8|

    ...das Z80-ROM...

    8|


    Ok, wer von euch beiden will mich aufklären? :D

    Bitte melde dich an, um diesen Anhang zu sehen. :verehr: .: Mit Bitte melde dich an, um dieses Bild zu sehen.wäre das nicht passiert! :. :prof:  Bitte melde dich an, um diesen Anhang zu sehen.

    :syshack: .: Meine 3D-Drucker Teile auf :. Bitte melde dich an, um diesen Link zu sehen. :strom:

  • Im Gegenteil, ich werfe noch "Z80-BIOS-ROM" ins Rennen. :bgdev

    Egal, solange BIF nicht mit einem Z80 RAM/ROM Trick um die Ecke kommt. :bgdev

    Bitte melde dich an, um diesen Anhang zu sehen. :verehr: .: Mit Bitte melde dich an, um dieses Bild zu sehen.wäre das nicht passiert! :. :prof:  Bitte melde dich an, um diesen Anhang zu sehen.

    :syshack: .: Meine 3D-Drucker Teile auf :. Bitte melde dich an, um diesen Link zu sehen. :strom:

  • Ok, wer von euch beiden will mich aufklären?

    Na ja, wenn der C128 eingeschaltet (oder resettet) wird läuft erstmal der Z80 und damit der etwas sinnvolles macht muss der auszuführende Code fest im Rechner vorhanden sein, also hat Commodore die 4 KByte im Kernal-ROM, die der Adresse nach bei $d000-$dfff im 8502-Adressraum liegen würden mit Z80-Code gefüllt und die MMU blendet diesen Block bei aktivem Z80 an Adresse $0000 von RAM-Bank 0 ein. Beim Einschalten läuft der C128 also wie viele andere Z80-Computer mit bei $0000 sichtbarem ROM los, der Prozessor initialisiert dann ein paar Dinge, prüft ob ein C64-Modul am Expansionsport angeschlossen oder die Commodore-Taste gedrückt ist um ggfs. in den C64-Modus zu wechseln und wenn nicht schaltet dieses ROM auf den 8502 um, der dann den regulären Systemstart im C128-Modus weiterführt.

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

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

  • Ach deswegen dauert der Start eines 128ers so lange - der Z80 kommt nicht ausm Knick :D