Angepinnt Assemblercompo "Dreh das Wort"


  • BastetFurry
  • 24220 Aufrufe 111 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • ich hab noch ne 25 byte version, die die 1. zeile unbrührt lässt:
    (nur direkt nach reset anwendbar)

    Quellcode

    1. .C:1000 48 PHA
    2. .C:1001 9D A8 03 STA $03A8,X
    3. .C:1004 BF 28 03 LAX $0328,Y
    4. .C:1007 88 DEY
    5. .C:1008 CA DEX
    6. .C:1009 E0 1A CPX #$1A
    7. .C:100b 90 F3 BCC $1000
    8. .C:100d BA TSX
    9. .C:100e F0 02 BEQ $1012
    10. .C:1010 68 PLA
    11. .C:1011 C8 INY
    12. .C:1012 C6 06 DEC $06
    13. .C:1014 A6 06 LDX $06
    14. .C:1016 30 E9 BMI $1001
    15. .C:1018 02 JAM
    Alles anzeigen


    @edit: hmmm... da schein ich wieder probleme mit unterschiedlichen start-stack-pointern zu haben (lag wohl am modul).
    hab aber auch version wo es ohne modul geht... kommt gleich.

    @edit2: hmmm..scheint nicht am modul zu liegen, sondern wenn ich was lade?! Nach RESET und dann start (also ein sys) ist stackpoint auf $f7, wenn ich was lade und dann den sys machen ist er auf $f6. 8|

    @edit3: hier die version, die man laden kann und dann starten kann (ohne reset)

    Quellcode

    1. .C:1000 48 PHA
    2. .C:1001 BF 28 03 LAX $0328,Y
    3. .C:1004 88 DEY
    4. .C:1005 CA DEX
    5. .C:1006 E0 1A CPX #$1A
    6. .C:1008 90 F6 BCC $1000
    7. .C:100a BA TSX
    8. .C:100b F0 02 BEQ $100F
    9. .C:100d 68 PLA
    10. .C:100e C8 INY
    11. .C:100f A6 06 LDX $06
    12. .C:1011 9D A8 03 STA $03A8,X
    13. .C:1014 C6 06 DEC $06
    14. .C:1016 30 E9 BMI $1001
    15. .C:1018 02 JAM
    Alles anzeigen


    @peiselulli: Wird dann mit deiner 24 byte version ohne dem txs wohl das selbe problem sein, oder?
  • peiselulli schrieb:

    Die Doppelverwendung habe ich ja auch nur gepostet um das ganze ein bischen zu variieren.
    Eventuell gibt das ja Anstöße für neue Ideen.
    :dafuer: Hatte ich auch schon mal in einer meiner hier nicht veröffentlichten 37 Byte-Lösung. Sowas finde ich extrem cool !

    peiselulli schrieb:

    Stell jetzt einfach Deine saubere 20 Byte Lösung ein und mach dem Spuk ein Ende, ich bin kurz vorm Durchdrehen von dem Kram ;->
    :thumbsup: Ich glaube, Roland wartet damit noch ein paar Tage. Immerhin fängt er jetzt langsam mit Sprüngen mitten ins ROM an!

    Mafiosino schrieb:

    Hallo ich wollte eigentlich auch bei der Compo mitmachen, aber zu mehr als zu peiselullis 27byte "sauberer" Version hat's bei mir von alleine nicht gereicht. Deshalb schnorre ich jetzt bei euch ein bisschen. Hier ist eine "dreckige" 24-Byte-Version aus den anderen zusammengestrickt:
    Schöner Einstand!

    Roland schrieb:

    Nach RESET und dann start (also ein sys) ist stackpoint auf $f7, wenn ich was lade und dann den sys mache ist er auf $f6. 8|
    Überprüft, stimmt. Aber warum?! Verschwendet das ROM irgendwo ein Byte? Und wenn ja, wo? Und warum passiert das nur einmal? Wenn man 2x was lädt und dann ein SYS macht, ist der SP immer noch auf $f6.
  • ssdsa schrieb:

    Überprüft, stimmt. Aber warum?! Verschwendet das ROM irgendwo ein Byte? Und wenn ja, wo? Und warum passiert das nur einmal? Wenn man 2x was lädt und dann ein SYS macht, ist der SP immer noch auf $f6.


    finde ich auch extrem merkwürdig. :gruebel

    hätte vermutet, dass ein basicaufruf (also der LOAD) auch immer sauber terminiert, also mit dem stackpointer zurückkommt, wie man es aufgerufen hat.
    wenn ich aus assembler die loadroutine aufrufe, muss das ja auch gehen (sowas wären hinterher alle RTS zum scheitern verurteilt).
    und eben dass es bei 2x auch auf $f6 bleibt... vielleicht macht da irgendwas ein ldx #$f6 txs :D

    wäre mal interessant, ob das noch weitere befehle betrif (ausser LOAD)
  • Roland schrieb:

    ssdsa schrieb:

    Überprüft, stimmt. Aber warum?! Verschwendet das ROM irgendwo ein Byte? Und wenn ja, wo? Und warum passiert das nur einmal? Wenn man 2x was lädt und dann ein SYS macht, ist der SP immer noch auf $f6.


    finde ich auch extrem merkwürdig. :gruebel

    hätte vermutet, dass ein basicaufruf (also der LOAD) auch immer sauber terminiert, also mit dem stackpointer zurückkommt, wie man es aufgerufen hat.
    wenn ich aus assembler die loadroutine aufrufe, muss das ja auch gehen (sowas wären hinterher alle RTS zum scheitern verurteilt).
    und eben dass es bei 2x auch auf $f6 bleibt... vielleicht macht da irgendwas ein ldx #$f6 txs :D

    wäre mal interessant, ob das noch weitere befehle betrif (ausser LOAD)

    Die RESET-Routine macht erst mal LDX #$FF, TXS. Daher kommt letztendlich wahrscheinlich bei uns SP #$F7 zustande.

    Der CLR-Befehl (Routine ab $A663) hat eine Subroutine ab $A67A, die den SP auf #$FA setzt, und dabei aber vorher die Rücksprungadresse sichert, so dass sie zum Aufrufer mit RTS zurückkehren kann. Dies führt dann wohl bei uns zum SP #$F6.

    Ich nehme an, dass LOAD intern CLR aufruft. Auch die Warmstart-Routine ab $E37B ruft diese o.g. Subroutine auf. Daher ist auch nach Runstop+Restore der SP bei uns nicht mehr auf #$F7, sondern auf #$F6.
  • Lieber spät dran als nie

    Hallo!

    Wünsche Euch allen hier auf diesem Wege noch ein entspanntes Weihnachtsfest.
    Und ich weiß - bin mit dieser Nachricht wohl ein paar Jahr zu spät dran (Deadline ...).
    Aber ich fand diese Compo so toll, dass ich das Programm auch mal schreiben wollte.
    Wenn jemand Lust drauf hat, kann er ja mal seine Meinung, Kritik, Verbesserungsvorschläge
    zu meiner Version abgeben.

    Die Routine (PRG-Datei) ist 30 Bytes groß und hat die folgenden Einschränkungen:

    - Benötigt ein BASIC-Programm zur Vorbereitung seiner Umgebung.
    - Hat Probleme mit Bildschirmzeilen, die nicht mit einem Buchstaben [A-Z] enden.
    - Hängt sich nach erledigter Arbeit auf (läuft also nur einmal durch).

    Dafür denke ich (hoffe ich), dass es den Anforderungen durchaus genügt:

    - residiert ab Speicherstelle 4096
    - ist startbar per SYS4096

    Allerdings habe ich es bislang nicht auf einem echten Brotkasten getestet. Da es sich bei
    dem Routinchen aber nicht um Zauberei handelt, sollte das kein Problem darstellen.

    Geschrieben habe ich die Routine mit dem Dreamass. Getestet unter WinVICE 2.2 UNSTABLE win64.
    Man muss zuerst das BASIC-Programm "DREHENV.PRG" ausführen. Es schreibt den umzukehrenden
    Satz in die erste Bildschirmzeile und macht noch ein paar wichtige zusätzliche Pokes.
    Danach dann "DREH.PRG" (30 Bytes) laden und per SYS4096 ausführen (dabei dann aufpassen, dass die erste
    Zeile nicht wieder oben aus dem Bildschirm raus geschoben wird).

    Nachdem man "DREH.PRG" per SYS4096 ausgeführt hat, meldet WinVICE, dass er einen JAM erkannt hat.
    In diesem Dialog dann bitte auf Abbrechen klicken, damit man das Ergebnis noch auf dem Monitor
    sehen kann.


    Hier der BASIC-Code:

    Quellcode

    1. 10 for i=0 to 38: read x: poke 1024+i,x: next i
    2. 20 data 9, 3, 8, 32, 23, 21, 5, 14, 19, 3, 8, 5, 32, 5, 9, 14
    3. 30 data 5, 32, 6, 18, 15, 5, 8, 12, 9, 3, 8, 5, 32, 23, 5, 9
    4. 40 data 8, 14, 1, 3, 8, 20, 33
    5. 50 poke 780,0:poke 781,0:poke 782,213:poke 1022,0:poke 1023,0
    6. 60 poke 89,40:poke 90,3:poke 91,80:poke 92,3



    Hier der Assemblercode:

    Quellcode

    1. *=$1000
    2. DREH_DAS_WORT
    3. iny
    4. beq HANGUP
    5. lda ($59), y ; Indirekte Y-nachindizierte Zeropage-Adressierung spart ein Byte ein.
    6. cmp #$1b ; Ist ein Wort zu Ende (Wert im Akku ist größer oder gleich 27)?
    7. bpl WORD_END
    8. pha ; Einzelnes Zeichen auf den Stack pushen.
    9. bvc DREH_DAS_WORT ; Spart ggü. eines JMP ein Byte ein.
    10. WORD_END
    11. sta ($5b), y ; Indirekte Y-nachindizierte Zeropage-Adressierung spart ein Byte ein:
    12. ; Erstes Zeichen nach Wortende schreiben.
    13. WRITE_CHAR
    14. pla ; Zu schreibendes Zeichen vom Stack poppen (schafft "reverse order").
    15. bne WRITE
    16. pha ; Nullterminierung wieder auf den Stack pushen.
    17. inx ; Inkrement durchführen, um erstes Zeichen nach Wortende zu überspringen.
    18. bvc DREH_DAS_WORT ; Spart ggü. eines JMP ein Byte ein.
    19. WRITE
    20. sta $428, x ; Zeichen des erkannten Wortes in umgekehrter Reihenfolge (vom Stack) schreiben.
    21. inx
    22. bvc WRITE_CHAR ; Spart ggü. eines JMP ein Byte ein.
    23. HANGUP ; Hier bitte Aufhängen - Gründe: 1. platzsparend; 2. Stack hier unbrauchbar für einen ordentlichen RTS.
    24. .byte 2 ; KIL (JAM, HLT)
    Alles anzeigen



    Alles in allem:

    Der Thread kommt mir irgendwie abgehakt vor: Es gibt leider keine Ergebnisse anderer Leute zu
    sehen. Würde mich freuen, wenn ich mal ein Routinchen sehen könnte, was es in noch weniger
    Bytes halbwegs stabil hinbekommt.

    Bin auf Feedback gespannt!

    Wünsche Euch jetzt erstmal einen guten Rutsch.


    Viele Grüße
    fireworker
    Dateien
    Der Weltraum ist unendlich groß, Miss Lander, und es ist alles in diesem Universum möglich.
  • Noch ein Nachzügler...

    Sorry, hatte aber übersehen, dass sich der Thread ja bereits über mehrere Seiten erstreckt und es auch schon so manchen Code zu sehen gibt.
    Über Feedback würde ich mich aber trotzdem freuen.
    Der Weltraum ist unendlich groß, Miss Lander, und es ist alles in diesem Universum möglich.
  • Benutzer online 1

    1 Besucher