Hallo, ich bin neu hier und will mich mal kurz vorstellen. Meine Name ist Christoph und ich programmiere auf dem ZX81 einem Computer von 1981. Ich beherrsche BASIC und SmallBASIC, sowie AmigaBASIC und Assembler. C++ und Forth. Ich glaube auch noch etwas C. Ich wollte fragen, wie ich in Assembler einen eingegebenen String in einzelne Teile zerlegen und dann verarbeiten kann? Also: Eingabe: Hallo Welt Ausgabe: Hallo Welt // mache was mit Hallo // mache was mit Welt Wenn es möglich wäre, bitte in Z80-Assembler. Es geht auch FASM. Gruß, Christoph
Du musst dir erst mal überlegen, wie und wo du deinen String speichern möchtest. Die einzelnen Zeichen nacheinander abzulegen, sollte klar sein. Dran führt sowieso kein Weg vorbei. Die Frage lautet: woher weißt du, wie lang denn dieser String ist? Und da gibt es im Grunde 2 generelle Möglichkeiten. Entweder du merkst dir irgendwo die Länge explizit oder du vereinbarst ein spezielles Zeichen, welches dir anzeigt: hier ist der String zu Ende. Zur Zerlegung. Na, woran erkennst du denn die einzelnen Wörter eines Strings? Offenbar daran, dass ein Leerzeichen (Space) kommt. Das Leerzeichen trennt die Wörter. D.h. du gehts den Ursprungssstring Zeichen für Zeichen durch und bei einem Leerzeichen weißt du, dass hier ein Wort zu Ende ist. Mit den Zeichen bis zum Leerzeichen musst du etwas machen. Das kann jetzt sein, dass du sie auf eine 2.te Speicherfläche umkopierst. Das kann sein, dass du dir im Ursprungsstring die Positionen merkst, wo ein Wort beginnt und wo es endet. Das kann aber auch sein, dass du die einzelnen Zeichen jeweils sofort ausgibst.
Christoph P. schrieb: > Meine Name ist Christoph und ich programmiere auf dem ZX81 einem > Computer von 1981. Ich beherrsche BASIC und SmallBASIC, sowie AmigaBASIC > und Assembler. C++ und Forth. Ich glaube auch noch etwas C. Soso... Du beherrscht Assembler und "glaubst" C! :-D Ich habe gerade per Zufall dieses Forum entdeckt: http://www.sinclairzxworld.com Vielleicht helfen die bei sehr speziellen Fragen noch weiter. Gruß Dennis
Hier ist ein Listing von dem ROM. Da ist bestimmt eine Funktion drin, die man einfach verwenden kann: http://www.wearmouth.demon.co.uk/zx81.htm
Hi, lustig aber ich bin auf der Seite des Deutschen ZX-Teams angemeldet. Ich kann etwas auf dem Z80 Assembler programmieren. Gruß
> Ich kann etwas auf dem Z80 Assembler programmieren.
Sehr schön, dann zeig doch mal was du bist jetzt gemacht hast und dann
kann man dir auch weiter helfen.
Gruss,
Tobi
Christoph P. schrieb: > Ich beherrsche ... und Assembler. > Ich wollte fragen, wie ich in Assembler einen eingegebenen String in > einzelne Teile zerlegen und dann verarbeiten kann? Diese Aussagen beissen sich. Entweder kann man mit Strings umgehen, oder man kann kein Assembler. Was ist denn nun der Fall?
> und ich programmiere auf dem ZX81
Da hast du dir ausgerechnet einen Computer ausgesucht, der das wohl
ausgefuchsteste, cleverste und trickreichste I/O System im EPROM mit
hat, das ich je gesehen habe.
Mit ASCII gewinnst du da allerdings keinen Blumentopf :-)
Also ich habe auf dem ZX81 in Assembler ein Programm geschrieben, was 31 H's ausgeben kann.
1 | ld hl,(400C) |
2 | ld b,20 ; HEX für 30 |
3 | .loop: |
4 | inc hl |
5 | dec b |
6 | ld (hl),2D ; () bedeutet die Speicheradresse beschreiben |
7 | jp nz,.loop ; Heißt soviel wie solange B nicht 0 dann gehe zu loop |
8 | RET ; Zurück zum BASIC |
Als letztes noch 20 RAND USR 16514 Gruß
Christoph P. schrieb: > Also ich habe auf dem ZX81 in Assembler ein Programm geschrieben, was 31 > H's ausgeben kann. Sehr schön. Damit bist du allerdings von deinem ursprünglichen Ziel noch meilenweit entfernt. Ungefähr so weit, wie ein Taferlklassler, der gerade mal unfallfrei im Zahlenraum bis 100 rechnen kann vom Lösen von Textaufgaben die auf quadratischen Gleichungen führen entfernt ist. Sieh erst mal zu, wie du auf diesen System Speicher für dich zur alleinigen Benutzung reservieren kannst um dir da drinnen erst mal eine für dich passende Definition von "String" aufzubauen. Ich würde mich daran orientieren, wie es das ZX81-System selber macht. Das muss ja auch irgendwie Strings abspeichern. Ein abschliessendes 0-Zeichen kann es nicht sein, denn das ist im ZX81-Zeichensatz als Leerezeichen definiert. Also: wie macht es der ZX81 selber, um Strings abzuspeichern und auszugeben?
>ld b,20 ; HEX für 30
Bist Du sicher, dass Du da nicht ein bisschen abgerundet hast?
Jeder Programmierer, der Strings in Assembler verarbeiten will, muss Zahlendarstellungen und ASCII-Tabellen kennen.
Ups falsche Zahl: 30 ist HEX 1E mein Fehler. Ich habe nicht umgerechnet, sondern den Zeichensatz übernommen
Für den ZX81 weiß ich nur, dass der das in einer $-Variable abspeichert. Aber wie genau das dann von statten geht, das weiß ich nicht. Gruß
Christoph P. schrieb: > Für den ZX81 weiß ich nur, dass der das in einer $-Variable abspeichert. > Aber wie genau das dann von statten geht, das weiß ich nicht. Siehst du. Und an dieser Stelle beginnt dann das Studium des im EPROM liegenden Beriebssystems.
Kan asta schrieb: > Jeder Programmierer, der Strings in Assembler verarbeiten will, muss > Zahlendarstellungen und ASCII-Tabellen kennen. Damit kommst du beim ZX81 nicht weit. Da ist alles (ok, also jetzt nicht die Zahlendarstellung) ganz anders. ASCII ist für einen ZX81 ein Wort mit 5 Buchstaben, mehr aber auch nicht.
Da hat er Recht. Der ZX81 kannte noch nicht ASCII, ich glaub das kam erst mit Microsoft
ASCII war schon alt bevor Billy Boy erschien. Schon die alten, mechanischen Fernschreiber nutzten 7-ASCII.
Mit was soll ich denn anfangen, um zu wissen wie man einen String unterteilt.
amateur schrieb: > ASCII war schon alt bevor Billy Boy erschien. http://www.billy-boy.com/de/produkte/billy-boy-fun/kondome.html Du meinst die hier? Was hat das damit zu tun? SCNR
Christoph P. schrieb: > Mit was soll ich denn anfangen, um zu wissen wie man einen String > unterteilt. Damit, dass du erst mal einen String im Speicher halten und ausgeben kannst. Und erst DANN kannst du dir Gedanken darüber machen, wie du ihn in 2 Teile unterteilst! Aber erst mal musst du den String im Speicher haben! 20 zeichen 'G' ausgeben zählt noch lange nicht als String.
Christoph P. schrieb: > Da hat er Recht. Der ZX81 kannte noch nicht ASCII, ich glaub das kam > erst mit Microsoft Kleinstweich hat damit nicht das geringste zu tun. Der ZX81 musste tief in die Trickkiste greifen um mit 1k-RAM überhaupt benutzbar zu werden. Dazu gehört auch ein Zeichensatz, der gleichzeitig Ausgabezeichen als auch Basic-Tokens beinhaltet, so dass der Interpreter mit dem 'Zeichensatz' sowohl Text als auch ganze Programme beschreiben kann und bei dem das Videoram neben dem eigentlichen Programm auch noch in diesem 1k RAM untergebracht wird. Ich sagte doch: Du hast dir eine denkbar trickreiche Umgebung zum Lernen von Z80-Assembler ausgesucht. Da muss man schon ziemlich gut in Assembler sein, um damit zurecht zu kommen.
Christoph P. schrieb: > Ich benutze ja die 16Kb RAM Erweiterung Das mag schon sein. Spielt aber keine Rolle, wie das Grundprinzip des ZX81 funktioniert.
Kann es sein, daß Du nix verstanden hast? Über die komplizierte Hardware/Software des ZX? Was helfen 16kByte Ram, wenn Du nicht weißt wie Du was wo ablegen kannst? Grundlagen lernen.
Dachte ichs mir doch, dass das noch irgendwer online hat http://www.users.waitrose.com/~thunor/mmcoyzx81/index.html Im Speziellen http://www.users.waitrose.com/~thunor/mmcoyzx81/chapter07.html Wobei: mit der Stringrepräsentierung direkt im Code kannst du in deiner Aufgabe nicht viel anfangen. Da musst du dir etwas anderes überlegen. Zb. einen Speicher, dessen Adresse du dir ins Register HL lädst und dann eine Funktion aufrufst, die die Zeichen beginnend ab dieser Adresse in HL ausgibt, bis es auf ein FF stösst.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.