Mafiosino: so wie es aussieht (habs nicht ausprobiert), wirds aber probleme geben, wenn in der 1. zeile auf pos. 40 ein buchstabe steht, und die 2. zeile auch mit einem buchstaben beginnt (z.b. der sys 4096).
dann wird die 2. zeile mit ins wort-drehen mit einbezogen (durch den lax auf $033c, bzw. ab $043b)
Hallo Besucher, der Thread wurde 43k mal aufgerufen und enthält 111 Antworten
letzter Beitrag von fireworker am
Assemblercompo "Dreh das Wort"
- BastetFurry
- Erledigt
-
-
Da scheinst du Recht zu haben Roland. Ich hab's grad im Vice ausprobiert.
Dann muss ich noch weiter frickeln, damit die Version gültig ist.
-
Das war unter anderem der Grund, warum ich bei rückwärts geblieben bin ...
An der Speicherstelle $03ff kriegt man nur mit "Gewalt", sprich mit einem Poke, einen Buchstaben hin.Vorwärts brauchte man immer eine Sonderabfrage.
-
ich hab noch ne 25 byte version, die die 1. zeile unbrührt lässt:
(nur direkt nach reset anwendbar)Code- .C:1000 48 PHA
- .C:1001 9D A8 03 STA $03A8,X
- .C:1004 BF 28 03 LAX $0328,Y
- .C:1007 88 DEY
- .C:1008 CA DEX
- .C:1009 E0 1A CPX #$1A
- .C:100b 90 F3 BCC $1000
- .C:100d BA TSX
- .C:100e F0 02 BEQ $1012
- .C:1010 68 PLA
- .C:1011 C8 INY
- .C:1012 C6 06 DEC $06
- .C:1014 A6 06 LDX $06
- .C:1016 30 E9 BMI $1001
- .C:1018 02 JAM
@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.
@edit3: hier die version, die man laden kann und dann starten kann (ohne reset)
Code- .C:1000 48 PHA
- .C:1001 BF 28 03 LAX $0328,Y
- .C:1004 88 DEY
- .C:1005 CA DEX
- .C:1006 E0 1A CPX #$1A
- .C:1008 90 F6 BCC $1000
- .C:100a BA TSX
- .C:100b F0 02 BEQ $100F
- .C:100d 68 PLA
- .C:100e C8 INY
- .C:100f A6 06 LDX $06
- .C:1011 9D A8 03 STA $03A8,X
- .C:1014 C6 06 DEC $06
- .C:1016 30 E9 BMI $1001
- .C:1018 02 JAM
peiselulli: Wird dann mit deiner 24 byte version ohne dem txs wohl das selbe problem sein, oder?
-
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.Hatte ich auch schon mal in einer meiner hier nicht veröffentlichten 37 Byte-Lösung. Sowas finde ich extrem cool !
Stell jetzt einfach Deine saubere 20 Byte Lösung ein und mach dem Spuk ein Ende, ich bin kurz vorm Durchdrehen von dem Kram ;->
Ich glaube, Roland wartet damit noch ein paar Tage. Immerhin fängt er jetzt langsam mit Sprüngen mitten ins ROM an!
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!
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.
Ü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.
-
Zitat
peiselulli: Wird dann mit deiner 24 byte version ohne dem txs wohl das selbe problem sein, oder?
Vermutlich ja. Ich habe sie aber immer nur geladen, da ich immer mit Vice probiert habe. Der Stackpointer war immer auf $f6, daher Adresse $035b ($0351 + $0a). -
Ü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.
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 txswäre mal interessant, ob das noch weitere befehle betrif (ausser LOAD)
-
finde ich auch extrem merkwürdig.
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 txswä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.
-
-
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 SYS4096Allerdings 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:
Code- 10 for i=0 to 38: read x: poke 1024+i,x: next i
- 20 data 9, 3, 8, 32, 23, 21, 5, 14, 19, 3, 8, 5, 32, 5, 9, 14
- 30 data 5, 32, 6, 18, 15, 5, 8, 12, 9, 3, 8, 5, 32, 23, 5, 9
- 40 data 8, 14, 1, 3, 8, 20, 33
- 50 poke 780,0:poke 781,0:poke 782,213:poke 1022,0:poke 1023,0
- 60 poke 89,40:poke 90,3:poke 91,80:poke 92,3
Hier der Assemblercode:
Code- *=$1000
- DREH_DAS_WORT
- iny
- beq HANGUP
- lda ($59), y ; Indirekte Y-nachindizierte Zeropage-Adressierung spart ein Byte ein.
- cmp #$1b ; Ist ein Wort zu Ende (Wert im Akku ist größer oder gleich 27)?
- bpl WORD_END
- pha ; Einzelnes Zeichen auf den Stack pushen.
- bvc DREH_DAS_WORT ; Spart ggü. eines JMP ein Byte ein.
- WORD_END
- sta ($5b), y ; Indirekte Y-nachindizierte Zeropage-Adressierung spart ein Byte ein:
- ; Erstes Zeichen nach Wortende schreiben.
- WRITE_CHAR
- pla ; Zu schreibendes Zeichen vom Stack poppen (schafft "reverse order").
- bne WRITE
- pha ; Nullterminierung wieder auf den Stack pushen.
- inx ; Inkrement durchführen, um erstes Zeichen nach Wortende zu überspringen.
- bvc DREH_DAS_WORT ; Spart ggü. eines JMP ein Byte ein.
- WRITE
- sta $428, x ; Zeichen des erkannten Wortes in umgekehrter Reihenfolge (vom Stack) schreiben.
- inx
- bvc WRITE_CHAR ; Spart ggü. eines JMP ein Byte ein.
- HANGUP ; Hier bitte Aufhängen - Gründe: 1. platzsparend; 2. Stack hier unbrauchbar für einen ordentlichen RTS.
- .byte 2 ; KIL (JAM, HLT)
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 -
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. -
Hallo nochmal,
hier die aktualisierte D64-Datei. Bei der von vorhin habe ich versehentlich das falsche PRG angehängt.