Robotrontechnik-Forum

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

Robotrontechnik-Forum » Technische Diskussionen » Muß mal heulen... » Themenansicht

Autor Thread - Seiten: -1-
000
15.01.2016, 21:08 Uhr
holm

Avatar von holm

...das nervt.

Ich bin dabei das TDL 8K Basic zu disassemblieren was noch relativ gut geht weil es sehr stark verwandt mit dem 12K Basic ist das schon mal Jemand anders disassembliert und umfangreich kommentiert hat.

...aber ständig ist da solches Zeuch drin:

Quellcode:


        CALL    FPAAU8  ;1AAAH  ; adjust exponent
L1828:          ;1828
        LD      BC,8031H        ;8031H
        LD      DE,7218H        ;7218H
;       LD      HL,0D1C1H       ;8031h,7218h, ; constant LOG(2)
L1828 :
        DEFB    21H   <----- Hier!!!
L182F:  POP     BC
        POP     DE
MUFPFA:         ;1831
        CALL    FPASGN  ;1946H
        RET     Z

                                      vv
1820  00CD0217 F1CDAA1A  01318011 187221C1  *........ .1...r!.*
1830  D1CD4619 C82E00CD  EF1879D5 D94FD1D9  *..F..... ..y..O..*
1840  01000050 58215317  E5215118 E5E521BC  *...PX!S. .!Q...!.*
1850  017E23B7 2820E5EB  1E081F57 793008E5  *.~#.( .. ...Wy0..*




Man muß da aufpassen wie ein Heftelmacher, so ein verdammtes Sauerkraut!

Das Ding wird einmal auf 1828 angesprungen, dann passiert LD HL,0D1C1H ..was völlig uninteressant ist. HL wird weggeschmissen. Wenn man aber auf 182F springt werden BC und DE vorher vom Stack geholt...
Das ist ein Scheiß-Ein Byte "Sprungbefehl"!

Ich bin gespannt ob ich die Scheiße zum Laufen bekomme...

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 15.01.2016 um 22:11 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
15.01.2016, 21:20 Uhr
KK

Avatar von KK


Zitat:
holm schrieb
Ich bin gespannt ob ich die Scheiße zum Laufen bekomme...



Ich habe schon Probleme, meine eigenen vor 30 Jahren geschriebenen Programme nachzuvollziehen. Vielleicht wollte der Programmierer nur Reverse Engineering erschweren. Anders als bei Staatskrisen läßt sich dieses Problem aber mit purer Logik lösen, ist also wirklich zu schaffen. Weidmanns Heil!
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
15.01.2016, 21:33 Uhr
Olli

Avatar von Olli

Gibts vielleicht Z80-Disassembler die Zero-Page Sprünge erkennen? Aber springt er bei 0x21 nicht 8 Byte weiter ( 1 * 8 )? Also auf 0x1836?
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
15.01.2016, 22:06 Uhr
holm

Avatar von holm

Wasis? Zeropage beim Z80? Olli ich bin enttäuscht :-)

Der springt gar nicht, nur je nach dem wo man den Code anspringt interpretiert die CPU den einmal als POP BC,POP DE, CALL oder aber wenns über das DEFB 21H rein läuft als LD HL,0D1C1H .. was nicht stört weil HL nicht verwendet wird. Diesen Kram gibts mehrfach in verschiedenen Inkarnationen in dem Interpreter:


Quellcode:


        RET     NZ      ; if not break, return
        CALL    EMCTCH  ;053DH  emit ^C
        JR      L0738   ;0738H and skip to exec_end
EXESTP: RET     NZ      ;exec_stop  Holm!!: 0737
                        ;* more instructions follow?, exit
        DEFB    0F6H    ;* OR xxxx to skip next instruction
                        ; ensures that A is non zero
EXEEND:                 ; ignore unless at end of line
        RET     NZ      ; note: when entered through END, A=0
                        ; when entered through STOP, A = 0xC0
...        
RESSTR:         ;0F9B
        OR      A               ; set flags of requested length
        DEFB    0Eh             ; LD C, xx to skip next instruction
                                ; is uncritical because C is loaded later again
        
        POP     AF              ;DEFB 0F1h ; Holm !!??
                                ; ** skipped
        



Es gibt also quasi "halbe Befehle" im Code.
Gruselig das...

Gruß,

Holm
oder
--
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 15.01.2016 um 22:12 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
15.01.2016, 22:17 Uhr
Olli

Avatar von Olli

6800

Nun verstehe ich aber was du meinst mit dem 0x21... dadurch wird es dann quasi zu ner anderen Instruktion für die CPU... schon krank - auf so ne Idee zu kommen Man hätte ja auch einfach ein paar Byte mehr opfern können und die POPs überspringen anstatt "weiterzulaufen" wieviel bytes nimmt ein relativer jump mehr weg als das 0x21 beim Z80? 1 Byte?.....

PS: habe die Firmware der S8000-CPU jetzt komplett disassembliert und "in shape" gebracht - du erinnerst dich an mein Postingin in Mikrocontroller......

https://github.com/OlliL/S8000/tree/master/firmware/CPU

Warum da Teile in deutsch kommentiert sind....? Na rate mal wo ich die her habe
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 15.01.2016 um 22:18 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
15.01.2016, 22:22 Uhr
Wusel_1



Das ist doch eigentlich ganz einfach. Das hat was mit Platz sparen zu tun. Du schreibst, dass das HL wieder geknickt wird. Der Programierer verwendet einmal den Einsprung bei L1828, weil BC und DE einen anderen Wert bekommt, wie im Stack und dann ins Unterprogramm und einmal will er den Stake im Unterprogramm verwenden. Da HL sowieso wieder geknickt wird, hat er halt HL mit dem #D1C1 geladen, damit die Werte in BC und DE erhalten bleiben. Sowas mache ich auch ab und zu im Programm. Das wird dann jeweils mit einem JR-Befehl angesprungen.
--
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
15.01.2016, 22:28 Uhr
holm

Avatar von holm

Saachma Wusel erklärst Du mir gerade das was ich hier die ganze Zeit erkläre?
Ichfassesjawohlnich.. wozu das denn?

Wenn ich bei Dir Programmierarbeiten beauftragen würde und sowas im Code finden würde ich Dir den Kram um die Ohren hauen. Der Mist oben ergibt genau ein eingespartes Byte gegenüber einen relativen Sprung.
was soll das also?


@Olli: Nice, werde ich mir mal absaugen :-)

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 15.01.2016 um 22:28 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
15.01.2016, 22:30 Uhr
Olli

Avatar von Olli

Er spart doch gerade mal 1 Byte, oder?

Anstatt 0x21 zu kodieren könnte er ja auch einfach ein JR machen und die 2 POP Instruktionen überspringen.... der JR nimmt doch sicherlich beim Z80 nur 2 Bytes weg....
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
15.01.2016, 22:35 Uhr
Wusel_1




Zitat:
holm schrieb
was soll das also?


Ganz einfach. Wenn ich nach dem Programmieren feststelle, dass das Programm um, sagen wir mal 3 Byte, für den EPROM zu lang ist, dann versucht man jedes Byte zu sparen.
--
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 15.01.2016 um 22:42 Uhr von Wusel_1 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
15.01.2016, 22:49 Uhr
Olli

Avatar von Olli

Kann ich auch mal meine Assemblerfragen stellen hier? Nachdem Holm ja nun geholfen wurde *fett-grins*

Habe sowas hier (Z8001 Code)


Quellcode:

T_UNKNOWN:
    WORD    := %0018
    WORD    := %14cc
    WORD    := %03c1
    WORD    := %05ea
    WORD    := %1100

!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCEDURE BOOT_UNKNOWN_01
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!
  INTERNAL
    BOOT_UNKNOWN_01 procedure
      entry
    ld    r2, #SIO0C_B
    ldar    r1, T_UNKNOWN+1
    ldk    r0, #9
    otirb    @r2, @r1, r0
    ret    
    end BOOT_UNKNOWN_01




SIO0C_B ist die Adresse auf der die SIO anzusprechen ist.
ldar sollte Daten relativ ab der angegebenen Adresse in r1 laden... also... das was in aktueller Adresse (2c9a) + 1814 steht?!
und dann mit otirb schreibt er auf r2 den inhalt der in dem Zeug wodrauf r2 nun zeigt, und zwar 9 Bytes lang.... aber wozu dann der andere Code hinter 0x1814?

Oder könnte es nicht sein, das er eigentlich genau die 9 Bytes an die SIO ausgibt? 0x18,0x14,0xcc usw? Das wären dann:

%18 -> Channel Reset (0x18)

%14 -> SIO-Register 4 (0x04) + Reset Ext/Stat Int (0x10)
%cc -> x64 clock mode (0xc0) + 2 stop bits/char (0x02)

%03 -> SIO Register 3 (0x03)
%c1 -> Receiver enable (0x01) + Recieve 8 bits/char (0xc0)

%05 -> SIO Register 5 (0x05)
%ea -> DTR (0x80) + Transmit 8 bits/char (0x60) + Request to send (0x2) + Tramitter enable (0x08)
%11 -> Send Break (0x10) + Transmit CRC enable (0x01)

Also lädt ldar die Adresse von T_UNKNOWN als Pointer in r1 und oitbr liest dann von der Adresse die in r1 steht.....
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
16.01.2016, 01:14 Uhr
holm

Avatar von holm

Ich kenne Z8000 assembler zu wenig, aber Das was Du da als SIO Intialisierung rausgezogen hast erscheint mir plausibel, ohne jetzt auf die einzelnen Bits zu gucken. "Oder" ist also richtig.

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
011
16.01.2016, 01:15 Uhr
Olli

Avatar von Olli

Jo... habs jetzt auch schön gemacht


Quellcode:

!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCEDURE SIO0_DISABLE_INT
Disables interrupts on SIO0
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!
  INTERNAL
    SIO0_DISABLE_INT procedure
      entry
    ld    r2, #SIO0C_B
    ldar    r1, ITAB_SIO0_B
    ldk    r0, #9
    otirb    @r2, @r1, r0
    ret    
    end SIO0_DISABLE_INT

INTERNAL
ITAB_SIO0_B ARRAY [* BYTE] := [COMM3
                               SIO_R4 + COMM2
                               C64 + S2
                               SIO_R3
                               RENABLE + B8
                               SIO_R5
                               XENABLE + T8 + DTR + RTS
                               SIO_R1 + COMM2]


--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
012
18.01.2016, 09:22 Uhr
rm2
Default Group and Edit
Avatar von rm2

Hallo Holm,

so was wie in 000 habe ich auch, wenn ich audatec-EPROMs durch den Re-Assembler schicke.
Nach meinen Analysen entsteht das wenn zw. Programmcode
Initialisierungssachen stecken. den Bereich mit DB markiert und dann durch den Assembler gejagt bis Bitgleichheit garantiert wird.
Das ist aber zeitaufwendig.


mfg Ralph
PS
Ich suche immer erst nach JP, JR und RET(I)
--
.
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 18.01.2016 um 09:24 Uhr von rm2 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
013
18.01.2016, 13:14 Uhr
holm

Avatar von holm

Hallo Ralph, ..nein das ist es in diesem Falle nicht, das geht aus dem umgebenden Programm Code hervor,
die springen das Programmstück echt auf 2 Adressen an und überspringen dabei nicht benötigte Teile bzw. lassen den Code in das entsprechende Unterprogramm hinein laufen und überspringen dabei ein paar Befehle ( POP BC und POP DE in diesem Falle).

Die Programmiererei mit "skip" war z.B. auf Data General üblich und dient wirklich nur der Einsparung von ein paar Bytes. der 8K ROM ist voll bis auf 3 Bytes am Ende.
Heute ist das aber nicht mehr cool, es ist nur noch schlechter Stil, damals (tm) lagen aber die Prioritäten anders...

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 18.01.2016 um 13:16 Uhr von holm 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