Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » U881 Tip gesucht » Themenansicht

Autor Thread - Seiten: -1-
000
04.02.2007, 14:05 Uhr
spakko



Hallo,

kann mir jemand bezüglich U881 Assemblerprogrammierung helfen ? Ich will mein Programm "dynamisch" gestalten, d.h. es soll sich in jedem Bereich des Speichers befinden können, ohne neu übersetzt werden zu müssen. Dummerweise ist die Weite der relativen Sprünge auf 127 in jede Richtung begrenzt. Wie ermittle ich z.B. die Adresse eines Unterprogramms zur Laufzeit, ohne vorher zu wissen, wo es sich eigentlich befindet ?
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
04.02.2007, 15:22 Uhr
Gast: Kingstener




Zitat:
spakko schrieb
Wie ermittle ich z.B. die Adresse eines Unterprogramms zur Laufzeit, ohne vorher zu wissen, wo es sich eigentlich befindet ?

Kannste nur über Kennbyte machen und suchen lassen, entweder von der Hauptroutine oder von einer Interruptroutine, die einen Sprungverteiler aktualisiert. Was anderes fällt mir so spontan dazu nicht ein.

Gruß
Seitenanfang Seitenende
(Gast) Zitatantwort || Editieren || Löschen
002
05.02.2007, 05:50 Uhr
edbru



beim U880, der rel. Sprünge auch nur auf diese kurze Distanz zulässt hab ich in dem Bereich in eine Programmlücke (hinter einem Return oder unbedingten Sprung) einen weiteren rel. Sprung eingefügt.
Das mit dem Kennbyte raubt zu viel Rechenleistung.

Eddi
--
ich brauch es nicht, so sprach der Rabe.
Es ist nur schön wenn ich es habe.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
05.02.2007, 10:22 Uhr
spakko




Zitat:
edbru schrieb
...hinter einem Return oder unbedingten Sprung) einen weiteren rel. Sprung eingefügt

Das klappt leider auch nur bei relativ kleinen Unterprogrammen


Zitat:
Kingstener schrieb
Kannste nur über Kennbyte machen und suchen lassen, ...

Klingt interessant, muss ja auch nur einmal zu Initialisierung des Sprungverteilers aufgerufen werden.

Danke.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
05.02.2007, 12:42 Uhr
Gast: Kingstener




Zitat:
edbru schrieb

Das mit dem Kennbyte raubt zu viel Rechenleistung.

Eddi

Nutzt ja nix, wenn man nicht weiß wo es ist, hilft auch keine Sprungverlängerung, da muß man es halt suchen
Hatte auch mal so einen kleinen Rechner gebastelt, da konnte man 3 Module mit diversen Programmen stecken. Beim Stecken wurde externer IRQ ausgelöst, der das Modulbereich aktivierte, nach Anwendunden absuchte und ins Menü eingetrug und dann rödelte der Rechner weiter...

Dieser Beitrag wurde am 05.02.2007 um 13:39 Uhr von Kingstener editiert.
Seitenanfang Seitenende
(Gast) Zitatantwort || Editieren || Löschen
005
05.02.2007, 13:23 Uhr
Tom Nachdenk



Worum gehts denn eigentlich?
Soll das Programm aus mehreren Blöcken assembliert (im Sinne von zusammengesetzt ) werden? Oder tatsächlich zur Laufzeit programmgesteuert nachgeladen werden? Dann könnte man evtl. einen Lader implementieren der dann die entsprechenden Bytepositionen anpasst.

Ansonsten wenn die Hardware noch nicht steht könnte man über Banking nachdenken. Dann sind zwar die Adresse fest aber man hat trotzdem 'mehr' Speicher für Programme zur Verfügung.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
05.02.2007, 16:21 Uhr
spakko



Ich habe ein paar Maschinenprogrämmchen, die ich gerne anderen zur Verfügung stellen würde. Mit dem Übersetzen werden die absoluten Adressen fest in den Objektkode "genagelt". So ist das Programm auf einen Adressbereich festgelegt. Falls der Nutzer diesen Bereich anderweitig verwendet, dann ...
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
05.02.2007, 22:17 Uhr
tp



Hmm, das Hauptproblem in diesem Fall ist doch, dass man rausbekommen muss, wo das entsprechende Unterprogramm im Speicher liegt. Wenn das per CALL angesprungen wird, steht genau das auf dem Stack. Wenn der Sprungverteiler jetzt ungefähr so aussieht


Quellcode:
UP1: Adresse vom Stack holen
     Offset zum UP1 addieren (UP1_START)
     Sprung über berechnetes Doppelregister
UP2: Adresse vom Stack holen
     Offset zum UP2 addieren (UP2_START)
     Sprung über berechnetes Doppelregister
...
UP1_START:
...
UP2_START

müßte der Nutzer nur festlegen, an welche Adresse er die Unterprogramme legt und aufpassen, dass keine Register überbügelt werden. Könnte das so klappen, oder hab' ich was übersehen?

Ich kenne mich mit dem U881 Assembler nicht aus, deshalb versuche ich gar nicht erst das in Assembler hinzuschreiben .

Noch einfacher wäre natürlich dem entsprechenden Nutzer den Quellcode zu geben .
--
Die Zeit ist auch nicht mehr, was sie mal war! (Albert Einstein)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
06.02.2007, 15:10 Uhr
spakko



Folgende Lösung hat sich als brauchbar erwiesen:

* Endekennung für Programm (damit man nicht den gesamten Speicher durchsuchen muss)
* UP Kennung(en)


Zitat:
Noch einfacher wäre natürlich dem entsprechenden Nutzer den Quellcode zu geben

Die Erfahrung hat gezeigt, dass die Veröffentlichung des Quelltextes folgende Probleme mit sich bringt:
* Fragen, Fragen, Fragen zum Quelltext
* Fragen, ob man nicht Dies oder Das entwickeln könnte (unentgeldlich versteht sich und so schnell wie möglich, weil man ja schließlich einen Abgabetermin hat - Leute gibt's)
* "Gestalten", die gerne mit anderer Leute Arbeit die schnelle Mark machen wollen *)

*) Gegen eine schnelle Mark habe ich prinzipiell nichts einzuwenden, wenn man zumindest ein klein wenig an der eigenen Arbeit partizipieren kann oder allerwenigstens um Erlaubnis gefragt wird.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
06.02.2007, 19:58 Uhr
tp




Zitat:
spakko schrieb
Die Erfahrung hat gezeigt, dass die Veröffentlichung des Quelltextes folgende Probleme mit sich bringt:
...

Stimmt schon, man verpaßt aber eben auch die positiven Rückmeldungen. Ich bekomme jetzt noch manchmal Fragen zu meinem 1541 Emulator, obwohl ich den seit mind. 8 Jahren nicht angefasst habe. Und die meisten Mails waren dabei eher nett.
Egal, ist ja Dein Quellcode, da will ich nicht reinreden.

Könnte das mit dem oben angedeuteten Stack-Auswerten auf dem U881 funktionieren? Ich habe nur durch die Doku geblättert und wäre neugierig ob das so gehen würde.
--
Die Zeit ist auch nicht mehr, was sie mal war! (Albert Einstein)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
07.02.2007, 16:49 Uhr
spakko



Probiere gerade "Handysurfen" über simyo. 1MB für 24Cent. Bis 28.2. 1MB gratis. Deswegen hatte ich den Beitrag 2mal abgeschickt (hat mir zulange gedauert. GPRS ist eben nicht UMTS) ...
Dieser Beitrag wurde am 07.02.2007 um 16:57 Uhr von spakko editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
011
07.02.2007, 16:50 Uhr
spakko



1.Ich rede ja auch nicht von mal 'ner Frage in 100 Jahren, ich meine Leute, die jede Kodezeile nicht verstehen und kommentiert haben wollen. Naja, vielleicht hatte ich auch einfach Pech...

2.Wie soll das gehen ? Wenn ich ein UP aufrufe, steht doch das Ziel fest. Wenn ich das Ziel nicht kenne, kann ich es auch nicht hinhüpfen. Wo sollen dann die Daten im Kellerspeicher (neudeutsch Stack) herkommen ? Ich muß also das Programm vom aktuellen Programmzähler bis zur Endekennung durchlaufen und mir die Kennungen für die UP's "rausfischen", den aktuellen Programmzählerstand zwischenspeichen und kann die UP's jetzt indirekt aufrufen.

Zugegeben, für kleine Progrämmchen ist das aufwendig, ab einem halben "K" wird's interessant
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
012
07.02.2007, 18:04 Uhr
Benjamin



Wie oder besser wo werden den die Files übersetzt ? Wenn das Ganze am PC machst und dort auch Deine Programme eingebunden werden können (sollen), kannst Du auch ein Skript schreiben, daß für jeden individuell nach Eingabe der Wunschstartadresse die absoluten Adressen in Deinen Routinen (welche Du dann in Form eines Binärfiles zum direkten einbinden mitgibst) anpasst. Wenn dabei hinten noch ein IncludeFile für einen Assembler heraus springt, welches jeder dann wieder einbinden und zur Adressierung Deiner Prozeduren mit den individuell erzeugten Einsprungsadressen nutzen kann, wäre das natürlich noch schöner.

Ich glaube, daß dies teilweise bei einigen CP/M Versionen für den CCP Part gemacht wird.
Auf die Art hat der U881 dann auch am wenigsten Streß und muß nicht erst auf abenteuerliche Weiße deine Programme suchen und Du bleibst wenigstens während der Programmierungsphase "dynamisch".

Gruß B.

Dieser Beitrag wurde am 07.02.2007 um 18:43 Uhr von Benjamin editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
013
07.02.2007, 18:11 Uhr
tp




Zitat:
spakko schrieb
2.Wie soll das gehen ? Wenn ich ein UP aufrufe, steht doch das Ziel fest. Wenn ich das Ziel nicht kenne, kann ich es auch nicht hinhüpfen. Wo sollen dann die Daten im Kellerspeicher (neudeutsch Stack) herkommen ? Ich muß also das Programm vom aktuellen Programmzähler bis zur Endekennung durchlaufen und mir die Kennungen für die UP's "rausfischen", den aktuellen Programmzählerstand zwischenspeichen und kann die UP's jetzt indirekt aufrufen.

Hmm, geht wohl doch nicht so wie ich mir das dachte . Man kommt irgendwie nicht an den aktuellen Wert des PC ran.
--
Die Zeit ist auch nicht mehr, was sie mal war! (Albert Einstein)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
014
09.02.2007, 11:02 Uhr
spakko



Danke erstmal. Bin gerade daran ein einfaches Beispiel zu erstellen, werde es (sobald fertig) hier veröffentlichen.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
015
09.02.2007, 18:19 Uhr
spakko



Hier der versprochene Lösungsansatz (noch ungetestet). Ausgelegt für das Finden eines UP, Programmende bleibt hier unberücksichtigt, kann aber nach dem gleichen Schema ermittelt werden. Dummerweise läßt sich der Befehlszählerstand nicht direkt auslesen, deshalb der "kleine Umweg"

Quellcode:
;dynamische Speichernutzung
    .org %0

    srp    #%10
    ld    r0,#%08        ;Startadresse festlegen
    ld    r1,#%12        ;z.B.beim U883 ab %812
    ld    r2,#%08        ;Dummy
    ld    r3,#%12        ;Dummy
Losgehts:
    ldc    r4,@rr0        ;Lade Wert von Adresse in r0/1 nach r4
    cp    r4,#%24        ;Vergleiche ob "$"
    jr    Z,IstUP        ;Ja, dann weiterprüfen
NixGefunden:        ;Nein,...
    incw    rr0        ;...Adresse erhöhen
    ld    r2,r0        ;Dummy
    ld    r3,r1        ;Dummy
    jr    Losgehts
IstUP:                ;Prüfe, ob die gesammte Kennung stimmt
    incw    rr2        ;Dummy erhöhen
    ldc    r4,@rr2
    cp    r4,#%55        ;U
    jr    NZ,NixGefunden
    incw    rr2        ;Dummy erhöhen
    ldc    r4,@rr2
    cp    r4,#%50        ;P
    jr    NZ,NixGefunden
    incw    rr2        ;Dummy erhöhen
    ldc    r4,@rr2
    cp    r4,#%52        ;R
    jr    NZ,NixGefunden
    incw    rr2        ;Dummy erhöhen
    ldc    r4,@rr2
    cp    r4,#%4F        ;O
    jr    NZ,NixGefunden
    incw    rr2        ;Dummy erhöhen
    ldc    r4,@rr2
    cp    r4,#%24        ;$
    jr    NZ,NixGefunden
    ;Unterprogramm gefunden
    incw    rr2
    ld    r6,r2        ;gefundene Adresse H-Teil
    ld    r7,r3        ;gefundene Adresse L-Teil
NormalerStart:
    call    @rr6
    jr    NormalerStart

Unterprogramm:
    .ascii    "$UPRO$"
    nop
    ret
    
.end

Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek