Robotrontechnik-Forum

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

Robotrontechnik-Forum » Technische Diskussionen » Z80 ASM Kauderwelsch » Themenansicht

Autor Thread - Seiten: -1-
000
20.01.2016, 08:59 Uhr
Olli

Avatar von Olli

In Analogie zu Holms "ich muss mal heulen..." muss ich auch mal...

So... ich komme jetzt auch mal mit was krudem um die Ecke....

Ich habe folgenden Code (Z80):


Quellcode:

0000 c32a00    jp      002ah
; 0003 - 001E
string text 'Copyright Zilog, Inc. 1981'

001f ff
0020 4b
0021 15
0022 6b
0023 15
0024 8a
0025 15
0026 93
0027 15
0028 23
0029 16


; entry
002a 212800    ld      hl,0028h
002d 113300    ld      de,0033h
0030 c30316    jp      1603h


1603 3eff      ld      a,0ffh
1605 d322      out     (22h),a
1607 3ec0      ld      a,0c0h
1609 d322      out     (22h),a
160b 7d        ld      a,l
160c d322      out     (22h),a
160e 3eb7      ld      a,0b7h
1610 d322      out     (22h),a
1612 3e7f      ld      a,7fh
1614 d322      out     (22h),a
1616 af        xor     a
1617 d320      out     (20h),a
1619 3eff      ld      a,0ffh
161b d323      out     (23h),a
161d 3efe      ld      a,0feh
161f d323      out     (23h),a
1621 eb        ex      de,hl
1622 e9        jp      (hl)
1623 f5        push    af
1624 3e01      ld      a,01h
1626 320f42    ld      (420fh),a
1629 f1        pop     af
162a fb        ei
162b ed4d      reti



Es sieht ja so aus, als ob er bei 0x002a startet, dann in HL 0x0028 lädt, dann nach 0x1603 springt und dort dann via 0x1622 nach 0x0028 zurück springt?!

Ab 0x28h gelesen ergäbe sich folgender ASM Kram...


Quellcode:

        inc hl                  ;0028   23
        ld d,021h               ;0029   16 21
        jr z,0                  ;002b   28 00
        ld de,l0033h            ;002d   11 33 00
        jp 1603h                ;0030   c3 03 16



Kranker Sch****?

Der springt nach 0x028 zurück, erhöht hl um 1, lädt nach d 0x21, überspringt den jump lädt in de 0x0033 und springt dann wieder 0x1603 an...

- was machen die out Befehle ab 0x1603 - 22h ist doch der Adressbereich des EPROM
- was soll das überhaupt mit diesem Gespringe
- warum lädt man nach d 0x21 um es dann direkt danach via de mittels 0x0033 zu überschreiben.
- was macht man überhaupt mit DE - da passiert doch in 0x1603 gar nix mit?
- was ist mit dem Code ab 0x1623 - durch den "jp (hl)" kommt er doch da nie hin? Im code gibt es keine weiteren Referenzen auf 0x1623

In Gänze liegt der ganze Mist hier:
http://www.pofo.de/S8000/misc/EPROM/WDC/
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 20.01.2016 um 09:00 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
20.01.2016, 09:07 Uhr
Hobi



wohl eher nach 0x33 (ex de,hl) - cooler weg sich die Rücksprungadresse zu merken.
--
-------------------------------------------
Corontäne
-------------------------------------------
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
20.01.2016, 09:17 Uhr
rm2
Default Group and Edit
Avatar von rm2

Hallo Olli,

gibt es in dem Programm noch andere Stellen mit jp 1603h?
da in:
160b 7d ld a,l
steht und das könnten andere verwenden.

- was passiert mit den Bits in OUT(22H) (Logik-Verknüpfung?) ?

- was steht ab 0033H?

- gibt es nach 162DH andere RETI-Funktionen?

- manchmal gibt es Schleifen die nur mit einer NMI verlassen werden können

mfg Ralph
PS
1623 ohne externe Marke muss nicht bedeuten das es nicht im Programm angesprungen wird.
--
.
http://www.ycdt.net/mc80.3x . http://www.ycdtot.com/p8000
http://www.k1520.com/robotron http://www.audatec.net/audatec
http://www.ycdt.de/kkw-stendal

Dieser Beitrag wurde am 20.01.2016 um 09:21 Uhr von rm2 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
20.01.2016, 09:25 Uhr
Heiko_P



@Olli:

Das sieht alles gar nicht so schlimm aus.

Mit einem OUT-Befehl wird nicht in den Speicher geschrieben sondern auf einen I/O-Port, es sollten also u.a. auf 22h und 23h I/O-Ports existieren. Im weiteren Quelltext sieht man auch Ausgaben z.B. auf I/O-Port 20h.

HL wird mit 0028h geladen, DE mit 0033h, dann erfolgt JP 1603h. Auf Adr. 160Bh wird der Wert von L (28h) nach A geladen und an I/O-Port 22h ausgegeben. Auf Adr. 1621h wird DE mit HL getauscht, in DE war also die Rücksprungadresse drin.

Der Code ab 1623h sieht wie eine Interruptroutine aus, zu erkennen an den letzten beiden Befehlen EI und RETI.

Das "Gespringe" macht man u.a. dann, wenn kein CALL verwendet werden soll. Für den CALL wird ein Stack und damit RAM benötigt, Sprünge gehen auch im Eprom ohne RAM.

Ich habe mich jetzt nicht durch den ganzen Code gewühlt, bei weiteren Fragen melde dich wieder.

Gruß
Heiko
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
20.01.2016, 10:23 Uhr
Olli

Avatar von Olli

Es gibt nur den einen direkten Einsprung nach 0x1603

Ab 0x33 ist:


Quellcode:

0033 3e04      ld      a,04h
0035 d320      out     (20h),a
0037 213d00    ld      hl,003dh
003a c39d06    jp      069dh
003d 31ff41    ld      sp,41ffh
0040 cdc900    call    00c9h
0043 31ff41    ld      sp,41ffh
0046 db21      in      a,(21h)
0048 2f        cpl



Den kompletten Kram gibt es hier:
http://www.pofo.de/S8000/misc/EPROM/WDC/firmware.asm

Ich frage mich dann, wozu 0x1f - 0x29 dienen Soll - es sind keine darstellbaren Zeichen - sehe aber auch keine Referenz im Code.

Bei 0x162b ist der EPROM "zu Ende".


Bzgl. IOREQ - da muss ich dann wohl mal gucken was sich auf diesem IOSpace befindet.... auf dem Board gibt es eine PIO, CTC und ein DMA - klingelt es bei irgendwem?


Quellcode:

160e 3eb7      ld      a,0b7h
1610 d322      out     (22h),a


das sollte ja irgendwas Bauteilspezifisches sein so das man auf das Bauteil schliessen kann
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 20.01.2016 um 10:25 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
20.01.2016, 10:26 Uhr
Wusel_1



Ab #1623 hat nichts mehr mit der "Schleife" vorher zu tun! Das ist schon eine neue Einsprungadresse von einem Interupt.
LD A,L wurde verwendet, da das Byte in L stimmt, was ausgegen werden soll und somit wird ein Byte gespart.
Dann schreibe mal rein, was ab #0033 steht.
--
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
006
20.01.2016, 10:30 Uhr
Olli

Avatar von Olli

ab 0x0033 steht im Posting #004 - auch der Link zum kompletten "Listing" (http://www.pofo.de/S8000/misc/EPROM/WDC/firmware.asm)
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 20.01.2016 um 10:30 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
20.01.2016, 10:33 Uhr
Enrico
Default Group and Edit


Na, am besten, Du machst nen Plan von dem Board.
Dann weißt Du, was auf welcher Adresse liegt.
DMA belegt nur einen Port. Zum initialisieren muss man ein par Bytes hinschicken.
--
MFG
Enrico
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
20.01.2016, 10:37 Uhr
Olli

Avatar von Olli

Nun... das mit dem Plan hatten wir ja schon.... da habe ich noch nicht so viel geschafft... ist halt auch eine heiden Arbeit bei dem Grab an Schaltkreisen...

http://www.pofo.de/S8000/misc/diagrams/Printing%20Drucke%20Schaltplan.pdf

Der aktuelle Stand - leider sind die Seiten etwas "durcheinander". Die letzte Seite ist mein "Schmierblatt" CPU ist auf Seite 5 (...01.sch)

Bild vom Board gibts:
http://pics.pofo.de/gallery3/index.php/S8000/S8000_boards/WDC/wdc_front
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
20.01.2016, 10:46 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

001f ..29 sind je 2 Byte Adressen. Das ist eine Sprungtabelle.
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
20.01.2016, 12:20 Uhr
holm

Avatar von holm

..und 1f gehört nicht dazu sondern ist das Ende Kennzeichen des Strings.


BTW: ist doch relativ logisch im Gegensatz zu dem was der Namensgeber des Welschs so erzählt..

Gruß,

Holm
--
float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v;
{s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+
(r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&&
(A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;}

Dieser Beitrag wurde am 20.01.2016 um 12:21 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
011
20.01.2016, 13:49 Uhr
Olli

Avatar von Olli


Quellcode:

00c9 3e01      ld      a,01h
00cb 323b73    ld      (733bh),a
00ce 212000    ld      hl,0020h
00d1 7c        ld      a,h
00d2 ed47      ld      i,a
00d4 cd3515    call    1535h
00d7 cd0a0d    call    0d0ah
00da cd4b13    call    134bh
00dd 3e91      ld      a,91h
00df d370      out     (70h),a
00e1 ed5e      im      2
00e3 fb        ei



Das scheint der einzige Bezug auf 0x0020 zu sein.

Ist in i dann nicht 0x00? Ich hätte gedacht in i könnte 0x20 stehen, dann könnte das eine Interrupt-Sprungtabelle sein. Wobei...
0x4b15
0x6b15
0x8a15
0x9315
0x2316

Das sind "komische" Adressen. Der SRAM Bereich geht von 0x4000 - 0x7FFF und dann kommt erstmal eine weile "nix" und dann geht es bei 0xC000 weiter...

Aufgerufenen Programme:


Quellcode:

1535 3eff      ld      a,0ffh
1537 320542    ld      (4205h),a
153a 320842    ld      (4208h),a
153d 7d        ld      a,l
153e d310      out     (10h),a
1540 3e03      ld      a,03h
1542 d310      out     (10h),a
1544 d311      out     (11h),a
1546 d312      out     (12h),a
1548 d313      out     (13h),a
154a c9        ret




Quellcode:

134b 215513    ld      hl,1355h
134e 0616      ld      b,16h
1350 0e00      ld      c,00h
1352 edb3      otir
1354 c9        ret



0d0a macht ziemlich viel I/O Zeugs.
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
012
20.01.2016, 14:09 Uhr
holm

Avatar von holm

...im Speicher steht beim Z80 erst der Low und dann der High Teil, also ist das 154b, 156b, 158a usw..
Gruß,

Holm
--
float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v;
{s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+
(r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&&
(A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
013
20.01.2016, 14:36 Uhr
Olli

Avatar von Olli

ld hl,0020h

heisst das, in h steht dann 0x20 und in l steht 0x00?


Ach - guck mal einer an... dann haben wir ja auch die Referenz auf 0x1623 vom 1. Posting

0020 4b
0021 15
0022 6b
0023 15
0024 8a
0025 15
0026 93
0027 15
0028 23 <<<<
0029 16 <<<<
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 20.01.2016 um 14:37 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
014
20.01.2016, 14:40 Uhr
Heiko_P



Nein. LD HL,0020h ergibt H = 00h, L = 20h. Im Speicher steht aber 21 20 00.

Gruß
Heiko
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
015
20.01.2016, 14:49 Uhr
Olli

Avatar von Olli

Aber dann ergibt das doch keinen Sinn?


Quellcode:

00ce 212000    ld      hl,0020h
00d1 7c        ld      a,h
00d2 ed47      ld      i,a
...
00e1 ed5e      im      2



Wenn ich "im" richtig verstanden habe, kümmert der sich um die Adresse die in "i" steht. Und da steht doch dann 0x00? Ich habe im Code keine andere Stelle gefunden welche i neu lädt.

Es müsste doch so sein, das alle Interruptauslösende Peripherie programmiert wird, die niederen 8 Bit des 16Bit Busses im Falle eines Interrupts auf einen bestimmten Wert zu setzen. Der "hohe Wert" kommt dann aus dem i-Register des Prozessors.

Die ab 0x20 stehenden Adressen sind alles Interruptroutinen (reti am Ende) - nur frage ich mich - wie funktioniert das nun, das die angesprochen werden....
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 20.01.2016 um 14:50 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
016
20.01.2016, 15:02 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

das ist alles korrekt -> Interrupt mode 2 bedeutet, dass der hi-Teil aus dem Register i kommt und der lo-Teil wird von der Peripherie geliefert (PIO/CTC). Bei der Initialisierung dieser Bausteine wird das in die entsprechenden Register geschrieben.

1535 ...
153d 7d ld a,l
153e d310 out (10h),a

Die DMA hat diese Basisadresse (0..20h) und nutzt diese und darauffolgende Adressen für die diversen Interrupts, die durch die DMA ausgelöst werden können.
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)

Dieser Beitrag wurde am 20.01.2016 um 15:19 Uhr von volkerp editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
017
20.01.2016, 15:19 Uhr
Olli

Avatar von Olli

Ah ok - in i steht dann also 0, und in die Pripheriebausteine wird die 20h geschrieben.

Aber - es gibt ja 5 Interruptroutinen die ab 0x20 "notiert" sind.

154b
156b
158a
1593
1623

Und - überschreibt der hier was immer auf Adresse 0x0010 für ein Baustein lauscht den wert 0x20 nicht danach mit 0x03?


Quellcode:

1535 3eff      ld      a,0ffh
1537 320542    ld      (4205h),a
153a 320842    ld      (4208h),a
153d 7d        ld      a,l
153e d310      out     (10h),a  <------ 0x20
1540 3e03      ld      a,03h
1542 d310      out     (10h),a  <------ 0x03
1544 d311      out     (11h),a
1546 d312      out     (12h),a
1548 d313      out     (13h),a
154a c9        ret    


--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
018
20.01.2016, 16:06 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

hängt an Port 10h die DMA oder die CTC?
Oder gibt es noch mehr Peripheriebausteine?
Ich kann das auf dem Plan nicht genau erkennen.
Die CTC bekommt eine Basis-Interrupt-Adresse und nutzt die nachfolgenden 3 gleich mit. Die Bits 2 und 1 werden entsprechend dem CTC-Kanal gesetzt. (http://hc-ddr.hucki.net/wiki/lib/exe/detail.php/cpm:ctc.jpg?id=cpm%3Aprogrammierung)

Die DMA kann mehrere Interrupt-Routinen bedienen, muss aber nicht. Das hängt von ihrer Initialisierung ab. DMA-Programmierung ist nicht ohne...

Obiger Code ab 153d sieht aber mehr nach CTC aus.
03h ist das Steuerwort für RESET.
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
019
20.01.2016, 17:11 Uhr
Olli

Avatar von Olli

Ja der Plan ist noch bei weitem nicht fertig und teilweise noch unstrukturiert. Bin aber momentan nicht so motiviert den weiter zu zeichnen......

PIO, CTC und DMA sitzen drauf:

http://pics.pofo.de/gallery3/var/albums/S8000/S8000_boards/WDC/wdc_front.jpg
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 20.01.2016 um 17:15 Uhr von Olli editiert.
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