Z80 Assembler Beispiel treibt mich zum Wahnsinn

  • Hallo Leute,


    Ich versuchte heute mein ersten Z80 codeseqment zu Programmieren. Da ich von der 6502 seite komme habe ich irgendwie Verständisschwierigkeit das umzusetzen:


    Ich möchte ein Programm in den Speicher schreiben welches


    dec RamWertAusSpeicherzelle FE80

    springe wenn ungleich 0 nach Weiter

    setze Speicherzelle auf 16

    Springe zu $0038


    Weiter:

    Springe $0010


    Habe das so ausformuliert:


    ld a,(fe80)

    dec a

    ld (fe80),a ; zurückschreiben

    jr nz, weiter

    ld fe80,$10

    jp $0038


    Weiter:

    jp $0010


    Irgendwie kann ich das nicht fehlerfrei assemblieren....


    Weiß jemand wie so ein einfaches Beispiel laufen kann ?


    grüße

    Mos

    • Offizieller Beitrag

    Zilog Mnemonics kennt kein $

    Hex-Werte bekommen ein h am Ende.

    Erstes Zeichen bei Hexwerten muss 0-9 sein. (Wird sonst als Label interpretiert.)

    also 0FE80h


    ld fe80,$10

    geht nicht. Musst du ueber den Akku machen.

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Ist das Progrämmchen - als File vorhanden - oder ich denke sowas haust du die Instruktionen in einen ART DEBUGER wie z.B. ZSID... oder.. anders in den Speicher?


    Egal wie auch immer : Diese Speicherzelle ist offenbar eine HEXA- Adresse, oder?

    Je welche Tools du benutzt sind für HEXA Konstanten in diversen schreibweisen zu beachten.

    BEi manchen 0FE80h oder manche etwa so $FE80 oder auch 0xFE80 .. und mehr Varianten beim Tool beachten.


    Wenn dieses SYMBOL FE80 nicht definiert war - offenbar einfach da ein "HEX Wert FE80" als Speicher-Adresse "ansagen".

    Deine Toolumgebung ist unbekannt - also selber forschen bitte.


    Ich meine da ich extrem von der 8080/8085/8086 Assembler-Seite komme - aber schon kleine Z80 mal damit vor 30 Jahren gespielt;


    In deiner Anweisung ld fe80,$10 - soll deine Bedeutung auf der Speicheradresse hexa fe80 der WERT mit hexa 10 belegt werden. ( vermutlich) .


    Eine Konstante auf eine direkte Speicheradress zu übertragen geht in der Z80 / oder 8080/8085 bei der Befehlsmatrix nicht.


    1) Methode

    Es geht über den Accu zuerst LD A,16 da hast du kein Prefix bei der dezimal 16, dann mit

    LD (word),A - "word" muss in deinem Tool die Speicheradress richtig benennen.


    2) Methode

    HL Registerpaar mit der Adresse von wert laden ( LD HL,wert ), und dann unter der Adress von momentan ( HL) also ( LD (HL),byte ) die Konstante byte speichern.

  • Vielen Dank für die nützlichen Infos.

    Danke für den Tip über den Akku eine Speicherzelle zu decrementieren.


    Ich habe mein Beispiel in verschiedenen Online Assembler(in ermangelung eines passenden Windows Z80 ASM) websites eingegeben und keine hat es fehlerfrei assembliert.

    Meine alten DOS Z80 Assembler habe ich verloren da mein alter 1995 Laptop das zeitliche inzwischen gesegnet hat (Dalls Uhrbatterie im Eimer)

    BIOS kommt nicht klar weil ich die Festplattenparameter (heads,cylinder,bla bla) inzwischen vergessen habe und damals zu dumm war

    das auf die Platte zu schreiben (analog meine ich)


    also ich habe jetzt meinen code entsprechend modifiziert, per Hand assembliert und denke das er nicht richtig funktioniert.

    Mein Ziel ist es den Code in ein Arcade Spiel am Mame hinein zu integrieren.


    Warum das ganze:

    Ich portiere ein Arcade Spiel auf eine andere Spielplatine des gleichen Herstellers.

    Der Spielcode braucht IRQ0 (RST 38) und IRQ10 (RST 10) um die Spielfiguren zu animieren und musik zu spielen (welche auf einem 2. Z80 Läuft)

    verbunden mit der ersten über ein Soundlatch (=communikationsspeicherzelle) und einen IRQ.

    In meiner aktuellen Spielplatine wird aber nur RST 38 verwendet und den RST 10 nie, da die Hardware dazu fehlt.

    alle 16 Vertical Blanks (RST10) führe ich einen RST 38 aus um den Rest des Spiels updaten zu lassen.


    Einmal editiert, zuletzt von mos6581 () aus folgendem Grund: typo

  • Am CPC (z.B. in Locomotive BASIC und MAXAM) wird hexadezimal oft ein & vorangestellt.


    Die Adresse &0010 liegt in unteren Sprungleiste, da kommst Du der Firmware in die Quere, so Du auf diese Wert legst.


    Der Emulator WinAPE hat einen Assembler eingebaut.

  • ja und sauber ist es dann so.......
    Danke Daybyter, dein Approach war in die richtige Richtung ;)



    4 Mal editiert, zuletzt von mos6581 ()

  • Ja klar :)

    das ist für mich nicht so ein Problem da ich schon verschiedenste Computer unter den Pfoten hatte..

    Jetzt ist bei Mir Zilog Zeit :)
    Habe mich durch Wüsten von z80 Assembler code gewühlt die letzten Tage...
    Der Debugger ist ein Freund :)
    Der allerschlimmste CPU war ein Signetics 2650 ... Das war ein Aas.

    (Bally Las Vegas Automat)