Angepinnt Assemblercompo "Dreh das Wort"

  • Wenn es einen Satz dreht, dürfte das doch ausreichend sein. Mehr wird doch nicht verlangt.

    Mein generischer Ansatz in 46 Bytes. Geht sicher kürzer. Fertig.;)

    Mehr mache ich daran sowieso nicht :

    Quellcode

    1. !to"gedreht.prg",cbm
    2. *=$1000
    3. j1: cpx #40 ; 40 Zeichen
    4. bne j3 ; nein ?
    5. rts ; ende
    6. j3: stx $0c ; Wortanfang
    7. inx
    8. lda $03ff,x ; auf Space prüfen
    9. cmp #32
    10. bne j0 ; nein, dann Buchstaben zählen
    11. sta $0428,y ; sonst Space ausgeben
    12. iny
    13. bne j1
    14. j0: inx
    15. lda $0400,x
    16. cmp #32 ; sind wir schon am Ende des Wortes
    17. bne j0
    18. dex ; Zähler steht auf Space
    19. j2: lda $0400,x
    20. sta $0428,y ; Wort verdreht ausgeben
    21. dex ; runter
    22. iny
    23. cpx $0c ; bis auf Wortanfang
    24. bpl j2
    25. tya
    26. tax ; y-Register nach x für neuen Test
    27. bne j1 ; Sprung an den Anfang
    Alles anzeigen
    If we're evil or divine - we're the last in line. - Ronnie James Dio (1984) -
  • War Gottseidank nicht allzu schwierig, meine Fehler zu fixen. Jetzt bekomme ich sowas:




    Weiß nicht, ob ich da noch was geschnipselt bekomme:

    Quellcode

    1. !to "dreh2.prg",cbm
    2. TEMP_BYTE = $FB
    3. * = $1000
    4. ;$0400
    5. ldy #$00
    6. ldx #$00
    7. lda #32
    8. sta 1023 ;for first check
    9. .ContinueLook
    10. lda 1024,x
    11. cmp #27
    12. bcs .NonCharFound
    13. .NextPos
    14. inx
    15. cpx #40
    16. bne .ContinueLook
    17. rts
    18. .NonCharFound
    19. ;store current address for later continuation
    20. sta 1064,x
    21. stx TEMP_BYTE
    22. ;is this the first char?
    23. ;can do without this check, but screws up on starting space when char in 1279 is not #32
    24. ;txa
    25. ;beq .NextPos
    26. .CopyWord
    27. dex
    28. lda 1024,x
    29. cmp #27
    30. bcs .CopyWordDone
    31. sta 1064,y
    32. iny
    33. ;use bne instead of jmp, saves one byte
    34. bne .CopyWord
    35. .CopyWordDone
    36. ldx TEMP_BYTE
    37. iny
    38. ;use bne instead of jmp, saves one byte
    39. bne .NextPos
    Alles anzeigen
  • Ich habe dem Beispielprogramm entnommen, dass "Wörter" strikt nur aus den Zeichen 1-26 bestehen. Alles größer als 26, und auch die 0, sollen also m.E. nicht zu den Wörtern gezählt und somit auch nicht umgedreht werden. Rolands Beispiel mit der C64-Einschaltmeldung fand ich gut. Also, m.E. sollten auch mehrfache Leerzeichen korrekt unterstützt werden, und keine weiteren Voraussetzungen wie "an Adresse 1xyz soll aber ein Space / kein Space stehen". @Bastet: Wie siehst Du das?
  • Mein erster halbwegs vernünftiger Versuch jetzt gerade 28 Bytes. Allerdings auch noch nicht das @-Zeichen behandelt und noch ein paar weitere Schönheitsfehler...
    Wird wohl beim ausbessern erstmal wieder länger werden...

    BTW: Von Akku, X und Y darf ja wohl Inhalt "00" (sozusagen Plain-C64 Kaltstart Verhältnisse) angenommen werden!
  • Ich habe mal ein kleines Testprogramm (Binärprogramm siehe Dateianhang) geschrieben, dass ab $2000 liegt, den Code von $1000-$10ff sichert und für jeden Test wiederherstellt, und dann jeweils auf einem Testsatz ausführt. Alle Register werden vor dem Aufruf von $1000 mit 0 initialisiert.

    Die Tests sind "hallo, welt!", "blackjack@civitas.de", und " pez = array[index];".
    Dateien
    “Es ist schon über so viele Dinge Gras gewachsen, dass man bald keiner Wiese mehr trauen kann.”
  • OK, den Klammeraffen habe ich noch nicht drin. Trotzdem hier meine 32 Byte Version :

    Quellcode

    1. !to "dreh.prg", cbm
    2. !cpu 6510
    3. * = $1000
    4. ;wird nur bei mehrfachem start benötigt
    5. ;lax $0e
    6. ;tay
    7. loop:
    8. jsr parse
    9. lda $02
    10. jsr store
    11. cpy #40
    12. bcc loop
    13. quit: sta $02
    14. rts
    15. parse: lda ($0e),y
    16. iny
    17. cmp #27
    18. bcs quit
    19. pha
    20. jsr parse
    21. pla
    22. store: sta $0428,x
    23. inx
    24. rts
    Alles anzeigen


    Für was kürzeres muß ich den Ansatz wohl ändern.
  • Der Ansatz mit dem Stack kann aber doch noch verfeinert werden, damit er gleich die 0- und die "Wort am Ende"-Problematik abdeckt. Grundgedanke: Kiste darf am Ende der Routine crashen, deswegen ist das Verbiegen des Stackpointers erlaubt. Man schiebt so lange auf den Stack, bis ein nicht-Buchstabe dabei war, dann TSX, X auf das Lowbyte der Startadresse der 2. Zeile addieren und so lang aus dem Stack in die zweite Zeile kopieren, bis X null ist.

    Haken: Stackpointer zählt rückwärts. Grrmpf. Aber vielleicht fällt einem von Euch ja noch was ein mit dem Stackpointer-Ansatz?

    Jens
    icomp.de/shop-icomp - Online einkaufen und offline bei Rewe, Penny, DM und Weiteren im Laden bezahlen.