Hallo habe wieder mal eine Frage. Das Menü für meinen Sternprojekt ist fertig und funktioniert eigentlich ganz gut. menu_main_table: .db "Time ","Anzeigen ","§§§§§§§§§§","§§§§§§§§§§" .db "Teleposi ","Anzeigen ","§§§§§§§§§§","§§§§§§§§§§" .db "Datenbank ","Blättern ","akt. Posi ","§§§§§§§§§§" .db "§§§§§§§§§§","suchen ","akt. Posi ","§§§§§§§§§§" .db "Setup ",laber laber laber Jeder Menüpunkt ist 10 Zeichen lang, so das die Berechnung des Z-Pinters relativ leicht ist; adiw ZH:ZL,10 (in einer Schleife). Menüpunkte mit "§" werden nicht angezeigt und im 16x2 Display steht oben der Haupt-Menüpunkt = linke Spalte und darunter der jeweilige Untermenüpunkt. Jetzt habe ich aber auch noch mehrere Standardtexte von unterschiedlicher Länge. Diese sollten ebenfalls in eine Tabelle untergebracht werden, und über eine Routine auf Dipsplay gezaubert werden. Ich stelle mir das so vor. text_table: .db "Sternzeit",0 ;(0) .db "Rektaszension",0 ;(10) .db "Sternzeit",0 ;(24) .db laber,laber,laber Die Zahl in der Klammer ist das Offset vom Anfang der "text_table". Dieses wollte ich im SRAM speichern High/Low Register und dann in der Routine verwenden. Das Offset wird aber in den Bereich von über 255 kommen. Wie addiere ich jetzt richtig denn add / adc kümmert sich ja nur um ZL. Muß ich da eine 16-Bit-Additionsroutine verwenden oder gibt es einen Trick? Es kann ja auch sein das ZL schon den Wert 250 hat, so das ich mit dem 2. Eintrag in's Schleudern komme. Ich möchte nämlich nicht mit dem Zeiger ins ungewisse stürzen, deshalb die Frage. Und noch eine hinterher: Ist es besser die Texte in eine Tabelle zu nageln oder in der Routine separat anzugeben. zB. ldi R16,'S' rcall lcd_print ldi R16, 'e' rcall lcd_print usw. Welches verbraucht weniger Programmspeicher? Gruß Stevko
Hi, adiw ZL,1 sollte gehen. Läuft ZL über, wird ZH um eins erhöht. Sebastian
könntest auch jedem Text ein eigenes label spendieren und damit dem Assembler das berechnen der Adressen überlassen. Ansonsten kannst du natürlich ganz normal mit dem Z-Register rechnen: add ZL, rx adc ZH, ry damit wird der evtl. Übertrag berücksichtigt. Am wenigsten Programmspeicher brauchst du, wenn du eine Ausgaberoutine hast, der du den Anfang des auszugebenden Textes übergibst, dort dann Zeichen lesen, prüfen ob 0, wenn nicht ausgeben, Zeiger erhöhen usw.
Du könntest auch Zeiger auf einen Zeiger verwenden. Die einzelnen Zeiger sind dann immer 16 Bit, d.h. 2 Byte voneinander entfernt und können aber auf Texte von beliebiger Länge zeigen: zeigers: .db text0 * 2, text1 * 2, text2 * 2, text3 * 2 ;usw. text0: .db "laber laber 0", 0 text1: .db "laber laber 1", 0 text2: .db "laber laber 2", 0 text3: .db "laber laber 3", 0 ;usw. Willst Du also text 3 ausgeben, holst Du dir zuerst dessen adresse: Z = 2 * zeigers + 2 * 3 Dann holst Du dir die nächsten beiden Bytes von dieser Adresse und lädst sie in ZH,ZL. Und schon zeigt Z auf den Text und den gibst Du dann solange aus, bis das Byte = 0 ist. Peter
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.