Robotrontechnik-Forum

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

Robotrontechnik-Forum » Technische Diskussionen » Assembler » Themenansicht

Autor Thread - Seiten: -1-
000
13.02.2008, 19:50 Uhr
Olli

Avatar von Olli

Hallo,

heute hat mich mal wieder der Ehrgeiz gepackt, und ich wollte meine ersten Assembler-Schritte machen - mit meinem P8000 unter UDOS. Damit ich weiss, das die Utilities ueberhaupt funktionieren, wollte ich ersteinmal irgendwas in irgendein Register laden. mein Code sah also so aus:


Quellcode:
LD A,0

Das ganze habe ich dann assembliert mit:


Quellcode:
ASM 1/LES1_LD
PLINK $=4000 1/LES1_LD (N=1/LES1_LD RL=400);

und dann ausgefuehrt mit folgendem Ergebniss:


Quellcode:
%1/LES1_LD
BREAK 4002
>R
A  B  C  D  E  F  H  L  I  A' B' C' D' E' F' H' L'  IX   IY   PC   SP  
00 18 CC 13 E7 00 40 00 0F 00 08 01 11 B9 80 20 B6 0000 11FA 4002 447B
%

Wie man sieht steckt in A nun tatsaechlich 00 - nur wiso kommt er nach dem schreiben der 0 ins A nicht "einfach" zum Betriebssystem wieder zurueck? Das Programm ist doch "zu Ende"? Stattdessen scheine ich im Monitor zu haengen und kann mein UDOS nur komplett neu laden...
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 13.02.2008 um 19:51 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
13.02.2008, 20:09 Uhr
Tom Nachdenk



Weil Du dem U880 auch noch sagen musst das der gefälligst wieder zurück zum Betriebssystem soll. So ganz ohne Ahnung: ret oder so. Genaueres verrät Dir das UDOS-Handbuch. Ansonsten betrachtet der U880 die auf LD A,0 folgen Bytes als Befehlscode und führt die gnadenlos aus, selten mit sinnvollem Ergebnis. Wenn der U880 ganz und gar kompatibel ist gibt es wohl auch Bytekombinationen die den Prozessor zerstören ...
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
13.02.2008, 20:48 Uhr
Olli

Avatar von Olli

Suppi, mit RET gehts - nun seh ich zwar nicht mehr den Registerinhalt, und kann nur "erraten" ob er das alles so gemacht hat wie ich es mir vorgestellt habe, aber nun weiss ich schonmal wie ich wieder zurueck komme wenn ich will

Gerade bei Labels und relative/absolute Spruenge


Quellcode:
;
                LD A,8
                LD B,0
TEST:
                INC B
                DEC A
                JR NZ,TEST

Und er fuehrt den code zw. label und Sprunganweisung echt 8 mal aus (springt also 7 mal) wie Register B danach zeigt

Ich bin begeistert hehe
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 13.02.2008 um 20:49 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
15.02.2008, 21:13 Uhr
Olli

Avatar von Olli

Hm... kann mir einer sagen, wiso mein Code nur "Ol&" ausgibt? Ich habe auch schon einen "timer" eingebaut - ich dachte ich waere dem SIO zu schnell...


Quellcode:
;
SIO0    EQU     024H
S0AD    EQU     SIO0
S0AC    EQU     SIO0+1
S0BD    EQU     SIO0+2
S0BC    EQU     SIO0+3
STR     DEFW    'Olli'
STRC    EQU     4
        LD      C,S0BD
        LD      HL,STR
        LD      B,STRC
PRINT   OUTI
        INC     B
SIOREA  IN      A,(S0BC)
        BIT     2,A
        JR      Z,SIOREA
        LD      D,0FFH
TIMER   DEC     D
        JR      NZ,TIMER
        DJNZ    PRINT
        RET


--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 15.02.2008 um 21:23 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
15.02.2008, 21:55 Uhr
Tom Nachdenk



Ja, Du wirst immer noch zu schnell sein, versuch es mal mit 2 ineinander verschachtelten Schleifen (oder falls möglich 16 Bit Zählern). Der Grund für den Effekt den Du beobachtest liegt darin das der Sender 2 Register hat, einmal das Register in das der Prozessor schreibt und dann das eigentliche Ausgabeschieberegister. So kannst Du das zweite Byte schon schreiben während das Erste noch gesendet wird.

Die clerere Alternative wäre mittels Statusbit aus dem SIO zu testen ob der Sender wieder frei ist und dann das nächste Zeichen zu senden.

Dieser Beitrag wurde am 15.02.2008 um 22:02 Uhr von Tom Nachdenk editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
15.02.2008, 22:00 Uhr
Enrico
Default Group and Edit


Hat die SIO nicht eine 3 Byte FIFO?
Ausserdem lässt sich doch der Satus der SIO irgendwie abfragen.
--
MFG
Enrico
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
15.02.2008, 22:01 Uhr
Olli

Avatar von Olli


Zitat:
Tom Nachdenk schrieb
Die clerere Alternative wäre mittels Statusbit aus dem SIO zu testen ob der Sender wieder frei ist und dann das nächste Zeichen zu senden.

Das sollte doch eigentlich die Ueberpruefung des 2. Bit (SIOREA...) machen - naemlich gucken ob der SIO fertig ist... Auch mit laengerem "timer" - Die Ausgabe ist nun sehr langsam, trozdem kommt nur "Ol&":


Quellcode:
;
SIO0    EQU     024H
S0AD    EQU     SIO0
S0AC    EQU     SIO0+1
S0BD    EQU     SIO0+2
S0BC    EQU     SIO0+3
STR     DEFW    'Olli'
STRC    EQU     4
        LD      C,S0BD
        LD      HL,STR
        LD      B,STRC
PRINT   OUTI
        INC     B
SIOREA  IN      A,(S0BC)
        BIT     2,A
        JR      Z,SIOREA
        LD      C,0FFH
OTIME   LD      D,0FFH
TIMER   DEC     D
        JR      NZ,TIMER
        DEC     C
        JR      NZ,OTIME
        LD      C,S0BD
        DJNZ    PRINT
        RET


--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 15.02.2008 um 22:05 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
15.02.2008, 22:03 Uhr
Tom Nachdenk



Ja, das hab ich auch grad gemerkt, das DU das mit dem Statusregister liest.

Aber, warum testest Du Bit 2? Soll das OVERRUN sein? Das bezieht sich auf das Empfängerregister wenn das nicht schnell genug gelesen wurde und ein weiteres Zeichen an RxD ankommt. Dein Bit ist All SEND. Entweder Bit 0 oder Bit 7. der Wissensspeicher hat leider keine Angabe ob die Bits nun auf- oder absteigend sortiert sind.

Dieser Beitrag wurde am 15.02.2008 um 22:11 Uhr von Tom Nachdenk editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
15.02.2008, 22:09 Uhr
Olli

Avatar von Olli

jo, und auch mit laengerem timer (siehe #006) keine Besserung...
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
15.02.2008, 22:12 Uhr
Olli

Avatar von Olli

Ach mensch... wiso schreibe ich denn DEFW wenn ich DEFM meine?

STR DEFM 'Olli'
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
15.02.2008, 22:12 Uhr
Tom Nachdenk



Also Bit 0 ist zu testen, Barthold/Bäurich sei dank
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
011
15.02.2008, 22:18 Uhr
Olli

Avatar von Olli

Bist du sicher mit Bit-0? Verschiedene Listings die ich inzw. mal "konsultiert" habe, checken alle Bit-2.

Mit

Quellcode:
...
STR     DEFM    'Olli'
STRC    EQU     4
...

klappst jetzt uebrigens (und Bit-2)


Quellcode:
%1/LES2
Olli

Stellt sich jetzt nur wieder die Frage, wiso es mit folgendem nicht geht:


Quellcode:
STR     DEFM    'Ollis P8000'
STRC    EQU     11

Alles was dann kommt ist:


Quellcode:
%1/LES2
BREAK 4057
>R
A  B  C  D  E  F  H  L  I  A' B' C' D' E' F' H' L'  IX   IY   PC   SP  
40 18 40 13 E4 00 40 40 0F 00 08 01 11 B9 80 20 B6 0000 11FA 4057 447B
>


--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 15.02.2008 um 22:19 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
012
15.02.2008, 22:29 Uhr
Tom Nachdenk



Jupp, Bit 2 stimmt. Transmit buffer empty ... wenn das ist kann man bedenkenlos schreiben

3 Byte tief ist übrigens der Empfangsbuffer, beim Senden nur 1 Byte.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
013
15.02.2008, 22:51 Uhr
Enrico
Default Group and Edit


stimmt.
--
MFG
Enrico
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
014
16.02.2008, 08:49 Uhr
Olli

Avatar von Olli

Und wiso klappt die Ausgabe von "Ollis P8000" nicht? Das TIMER Gedoens hab ich uebrigens entsorgt...
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
015
16.02.2008, 09:49 Uhr
Wusel_1



Olli,

wo schreibt dein Assembler eigentlich das Programm hin?
Vom AC1 her kenne ich nur, dass man erst mal sagen muss, wo das Programm
abgelegt werden soll. z.B. ORG #2000
Damit wird festgelegt, dass das Programm ab #2000 laufen soll.

MfG
--
Beste Grüße Andreas
______________________________________
DL9UNF ex Y22MF es Y35ZF
JO42VP - DOK: Y43 - LDK: CE

*** wer glaubt, hört auf zu denken ***
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
016
16.02.2008, 13:22 Uhr
Olli

Avatar von Olli

Hallo,
ich sage dem Linker mit $=4000, das es ab 4000 laufen soll. Physisch liegen tut es auf der Floppy im 2. LW
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
017
16.02.2008, 14:16 Uhr
Enrico
Default Group and Edit


STRC gibt die Länge des Strings an? UNd wenn das generell als Hex, oder was auch immer, aber nicht als Dezimal interpretiert wird?
--
MFG
Enrico
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
018
16.02.2008, 16:38 Uhr
Olli

Avatar von Olli

Ne, HEX muesste mit H dahinter sein. sollte schon als dezimal interpretiert werden. Wenn ich z.B. String-Ausgaben aus der U880-Firmware kopiere gehts auch nicht.... schon komisch :/
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
019
16.02.2008, 16:59 Uhr
Enrico
Default Group and Edit


Ich habe schon lange nix mehr Z80 Assembler gemacht, und hier blicke ich irgendwie auch nicht so richtig durch.
Eigentlich ist ja immer oben der Anfang, aber dann wird ja auch DEFW '...' als OP-Code ausgeführt?
In HL wird die Adresse vom String geladen. B soll ja den Offset machen. Wieso dann aber B mit 4 (11) laden, und dann erhöhen? Müsste doch bei 0 anfangen, immer um 1 erhöhen, bis die Anzahl erreicht ist? Oder nicht?
--
MFG
Enrico

Dieser Beitrag wurde am 16.02.2008 um 17:00 Uhr von Enrico editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
020
16.02.2008, 17:52 Uhr
Tom Nachdenk



Über das INC B bin ich auch gestolpert, das hat Olli aber drin um das implizite dekrementieren von B mit dem Befehl OUTI zu kompensieren. HL wird als Basis genommen und jeweils erhöht und B macht den (Abwärts)Zähler. DJNZ dekrementiert dann B 'produktiv' und wenn B nicht null ist wird weiter ausgegeben (laut Plan) bzw. das programm beendet.

Die Idee mit der inkorrekten Startadresse ist schon mal nicht schlecht ...
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
021
16.02.2008, 19:49 Uhr
Wusel_1



Olli,
warum machst du deine Zeitschleife so kompliziert? (Wie bei Kramer)
-------LD DE, #FFFF
Time-DEC DE
-------LD A, D
-------OR E
-------JR NZ, Time

und fertig. (musste Leerzeichen mit "-" ersetzen, sonst stand alles gedrängt)
Spart Platz - bei den paar Kilo sollte man schon darauf achten, auch wenn du das
jetzt nur testest, aber beim nächsten Programm baust du es ein und am Ende fehlen paar Bytes.
MfG
--
Beste Grüße Andreas
______________________________________
DL9UNF ex Y22MF es Y35ZF
JO42VP - DOK: Y43 - LDK: CE

*** wer glaubt, hört auf zu denken ***

Dieser Beitrag wurde am 16.02.2008 um 19:58 Uhr von Wusel_1 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
022
16.02.2008, 21:57 Uhr
Olli

Avatar von Olli

Inzw. hab ich die Zeitschleife ja komplett draussen...
Wenn ich die einzelnen Buchstaben alle einzelnd in die Adresse lade (was eine Ziemliche Wurst an Code erzeugt) kommt die Ausgabe - also der SIO kann nicht "voll" sein - nur mit OUTI und nem DEFM klappts halt nich....

Der aktuelle (nicht funktionierende Code):

Quellcode:
SIO0    EQU     024H
S0AD    EQU     SIO0
S0AC    EQU     SIO0+1
S0BD    EQU     SIO0+2
S0BC    EQU     SIO0+3
STR     DEFM    'Ollis P8000'
STRC    EQU     11
        LD      C,S0BD
        LD      HL,STR
        LD      B,STRC
PRINT   OUTI
        INC     B
SIOREA  IN      A,(S0BC)
        BIT     2,A
        JR      Z,SIOREA
        DJNZ    PRINT
        RET

Wenn ich mir einen Teil der U880-Firmware anschaue....


Quellcode:
;
    LD    C,S0BD
    LD    B,ANZHWT
    LD    HL,AUSHWT
ATEST    OUTI            ;Ausgabe der Anfangsaussschrift fuer den Hardwareeigentest
    INC    B
P1WAIT    IN    A,(S0BC)
    BIT    2,A        ;Ist der SIO fertig?
    JR    Z,P1WAIT    ;Nein, warten.
    LD    C,2
ZAUS11    LD    D,0
ZAUS1    DEC    D
     JR    NZ,ZAUS1    ;Realisierung einer Wartezeit
    DEC    C
    JR    NZ,ZAUS11
    LD    C,S0BD
    DJNZ    ATEST        ;alle Zeichen, bis Anzahl gleich 0
[.......]
; Ausschrift fuer die Meldung des Eigentest

AUSHWT
    DEFW    0D0AH
    DEFW    0A0AH
    DEFW    0A0AH
    DEFW    0A0AH
    DEFW    0A0AH
    DEFW    0A0AH
    DEFW    0A0AH
    DEFW    0A0AH
    DEFW    0A0AH
    DEFW    0A0AH
    DEFW    0A0AH
    DEFW    0A0AH
    DEFB    07H
AHWT1    DEFB    0DH
    DEFB    0AH
    DEFM    'P8000 Hardwaretest U880 - Version 3.1'
    DEFB    0AH
    DEFB    0DH
    DEFB    20H
    DEFB    20H        ;2* Space wegen Testschrittnummer
ANZHWT    EQU    68

Wenn man die definierten Zeichen durchzaehlt kommt man auf genau 68.... Im Grunde mache ich es eigentlich vom Code her auch nicht anders, oder?

Wiso ist die Startadresse eigentlich so wichtig? Das habe ich noch nicht so recht verstanden. Gebe ich gar keine mit an, bekomme ich beim Start sofort eine Speicherzugriffsfehler vom Betriebssystem(?)...
Kann mir das einer erklaeren?
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 16.02.2008 um 21:59 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
023
16.02.2008, 22:25 Uhr
Tom Nachdenk



Das Problem mit der Startadresse ist das Gleiche wie das mit dem fehlenden RET am Ende. Wenn Du das Programm aufrufst muss das Betriebssystem wissen ab welcher Adresse Dein Programm denn nun ausgeführt werden soll. Füge doch einfach mal ein Label Start nach der letzten Datendefinition ein und ganz am Anfang ein JMP START. Das sollte dann schon mal probehalber funktionieren (habs nicht getestet). Evtl. hat das Dateiformat auch ein Datenfeld wo man dann die Adresse START als Programmbeginn angeben kann (vom Linker dann natürlich auf die entsprechende Adresse aufgelöst).
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
024
16.02.2008, 22:27 Uhr
Wusel_1



.
----------LD C,2
-ZAUS11--LD D,0
-ZAUS1---DEC D
----------JR NZ,ZAUS1 ;Realisierung einer Wartezeit
----------DEC C
----------JR NZ,ZAUS11
----------LD C,S0BD
----------DJNZ ATEST ;alle Zeichen, bis Anzahl gleich 0


Das kannst du ändern.
---------LD DE, #2FF
-ZAUS1--DEC DE
---------LD A, D
---------OR E
---------JR NZ, ZAUS1
---------DJNZ ATEST


C brauchst du nicht neu laden - Wert wird nicht geändert bei der Schleife.
--
Beste Grüße Andreas
______________________________________
DL9UNF ex Y22MF es Y35ZF
JO42VP - DOK: Y43 - LDK: CE

*** wer glaubt, hört auf zu denken ***

Dieser Beitrag wurde am 16.02.2008 um 22:30 Uhr von Wusel_1 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
025
16.02.2008, 22:37 Uhr
Olli

Avatar von Olli


Zitat:
Wusel_1 schrieb
Das kannst du ändern.
....
C brauchst du nicht neu laden - Wert wird nicht geändert bei der Schleife.

Das ist nur der Orginalquelltext der 8-Bit Firmware des P8000... den aender ich nicht - wollte ihn nur zum Vergleich posten
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
026
17.02.2008, 20:49 Uhr
Olli

Avatar von Olli

Hallo,

wenn ich die Definitionen nach hinten stelle klappts:


Quellcode:
;
        LD      C,S0BD
        LD      HL,STR
        LD      B,STRC
PRINT   OUTI
        INC     B
SIOREA  IN      A,(S0BC)
        BIT     2,A
        JR      Z,SIOREA
        DJNZ    PRINT
        RET
SIO0    EQU     024H
S0AD    EQU     SIO0
S0AC    EQU     SIO0+1
S0BD    EQU     SIO0+2
S0BC    EQU     SIO0+3
STR     DEFM    'Ollis P8000'
STRC    EQU     11


Quellcode:
%1/LES2
Ollis P8000

Juchu!
Weiss ich nur immer noch nicht, wiso die Definitionen nach hinten kommen und wiso es dann geht und vorher nich...
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
027
17.02.2008, 21:07 Uhr
Enrico
Default Group and Edit


Nicht ide EQU, das ist wurscht, brauch nur der Assembler. Aber das STR liegt doch im RAM vorm rog.
--
MFG
Enrico
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