Robotrontechnik-Forum

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

Robotrontechnik-Forum » Technische Diskussionen » Probleme mit ASM Code » Themenansicht

Autor Thread - Seiten: -1-
000
15.03.2007, 08:09 Uhr
Olli

Avatar von Olli

Hallo,

folgende ASM Code-Schnipsel:


Quellcode:
RES1        :=    %4F    ! 80 characters/row !
RES2        :=    %97    ! !
RES3        :=    %CC    ! 13. Linie Unterstrich, 13 Linien !
RES7        :=    %6C    !changed for 4!
[...]
LDE    @RR8,R10    ! Ausgabe Command !
lde    @rr8,r10    ! Wiederholung !

RET


END RESET_DISPLAY


RES_DISPL_PAR ARRAY [4 BYTE] := [RES1 RES2 RES3 RES7]

END INIT

und (hintereinander gelinkt)


Quellcode:
HAUPT MODULE

CONSTANT
! 'Z8T.VEREINBARUNGEN' !
$LISTOFF

! Werte !
P01EXT    :=    %96    ! P0:=A8...A14, P1:=AD0...AD7, Stack intern !
P01TRI    :=    %9E    ! tri state: P0,P1,AS,DS,R/W !
SBUFL    :=    45    ! SIO-Puffer-Laenge !

! Bit Definitionen !
B0    :=  %1        ! bit 0 !
B1    :=  %2        ! bit 1 !
B2    :=  %4        ! bit 2 !
B3    :=  %8        ! bit 3 !
B4    := %10        ! bit 4 !
B5    := %20        ! bit 5 !
B6    := %40        ! bit 6 !
B7    := %80        ! bit 7 !
NB0    := %FE        ! negiertes bit 0 !
NB1    := %FD        ! negiertes bit 1 !
NB2    := %FB        ! negiertes bit 2 !
NB3    := %F7        ! negiertes bit 3 !
NB4    := %EF        ! negiertes bit 4 !
NB5    := %DF        ! negiertes bit 5 !
NB6    := %BF        ! negiertes bit 6 !
NB7    := %7F        ! negiertes bit 7 !

! Bildparameter !
ZEILENZAHL    :=    24
ZEICHENZAHL    :=    80

! Adressen !
BRAM        :=    %1000    ! Bildwiederholspeicher !
ZADR_TAB    :=    %1780    ! Tabelle der Zeilenanfangsadr. !
CRT_PAR        :=    %1C00    !Parameter lesen / schreiben !
CRT_COM        :=    %1C01    ! Commands schreiben !
CRTL_STAT    :=    %1C01    ! Status lesen !
ZG0        :=    %4000    ! ASCII-Zeichensatz !
ZG1        :=    %2000    ! Alternativ-Zeichensatz !
BELL_ADR    :=    %8000    ! Akustischer Signalgeber !

! Display Commands !
RES_DISPL    :=    %00
START_DISPL    :=    %20
STOP_DISPL    :=    %40
READ_LPEN    :=    %60
LD_CURSOR    :=    %80
ENABLE_INT    :=    %A0
DISABLE_INT    :=    %C0
PRES_COUNT    :=    %E0

! Parameter fuer Display-Reset-Command !
RES1        :=    %4F    ! 80 characters/row !
RES2        :=    %97    ! !
RES3        :=    %0B    ! !
RES4        :=    %6C    ! !

! Field Attribute Code !
FAC    :=    %80    ! Field Attribute: Normal Mode !
FACH    :=    %01    ! Highlight !
FACB    :=    %02    ! Blink !
FACR    :=    %10    ! Reverse video !
FACU    :=    %20    ! Underline !

! ASCII Control Characters entsprechend ADM 31 !
NUL    :=    %00    ! Null            ^@ !
SOH    :=    %01    ! Start of Heading    ^A !
STX    :=    %02    ! Start of Text        ^B !
ETX    :=    %03    ! End of Text        ^C !
EOT    :=    %04    ! End of Transmission    ^D !
ENQ    :=    %05    ! Inquiry (who are you)    ^E !
ACK    :=    %06    ! Acknewledge        ^F !
BEL    :=    %07    ! Bell            ^G !
BS    :=    %08    ! Backspace        ^H !
HT    :=    %09    ! Horizontal Tabulator    ^I !
LF    :=    %0A    ! Line Feed        ^J !
VT    :=    %0B    ! Vertical Tabulator    ^K !
FF    :=    %0C    ! Forspace        ^L !
CR    :=    %0D    ! Carriage Return    ^M !
SO    :=    %0E    ! Shift out        ^N !
SI    :=    %0F    ! Shift in        ^O !

DLE    :=    %10    ! Data Link Escape    ^P !
DC1    :=    %11    ! Device Control    ^Q !
DC2    :=    %12    !             ^R !
DC3    :=    %13    !             ^S !
DC4    :=    %14    !             ^T !
NAK    :=    %15    ! Not Acknewl.        ^U !
SYN    :=    %16    ! Synchronous Idle    ^V !
ETB    :=    %17    ! End of Trans.-Block    ^W !
CAN    :=    %18    ! Cancel        ^X !
EM    :=    %19    ! End of Medium        ^Y !
SBS    :=    %1A    ! Substitute        ^Z !
ESC    :=    %1B    ! Escape Sequenz    ^[ !
FS    :=    %1C    ! File Separator    !        
GS    :=    %1D    ! Group Separator    ^] !
RS    :=    %1E    ! Cursor HOME        ^^ !
US    :=    %1F    ! New Line        ^~ !        
$LISTON
    ZESCF    :=26        !Zaehler ESC-Folge!
    PARA    :=254        !Parameter fuer n;row;column!
$PAGE
EXTERNAL
    CHAR_ADRESSE                PROCEDURE
    ADR_DEC                    PROCEDURE
    READ_ADR                PROCEDURE
    WR_ADR                    PROCEDURE
    WRITE_CHAR                PROCEDURE
    CURSOR_POS                PROCEDURE
    LOAD_CURSOR                PROCEDURE
    ROLL                    PROCEDURE
    CLEAR_LINE                PROCEDURE
    CLEAR_SCREEN                PROCEDURE
    ESC_SEQUENZ                PROCEDURE
    ESC_OUT_SEQ                PROCEDURE
    BREAK                    PROCEDURE
    ESC_VT100                PROCEDURE
    C_left                    LABEL
    C_rigth                    LABEL
    C_ft                    LABEL
    P0, P1, P2, P3, STAT0, STAT1, STAT2    BYTE
    CHAR_ADR, LPOS_ADR            WORD
    SPALTZ, ZEILZ, CHAR, BDR, STAT3        BYTE
    VBYTE, ZBYTE                BYTE
    SINPTR, SOUTPTR, SCOUNT            BYTE
    SWERT                    ARRAY [SBUFL BYTE]


GLOBAL
    LINE_FEED CARRIAGE_RETURN        LABEL
    TAB        LABEL
    BACK_TAB    LABEL



$SECTION SEC1 PROGRAM

MAIN PROCEDURE
!*******************************************************
*
* Terminal - Steuerschleife
* Input:    Tastatur (TGETCHAR), bzw. SIO
* Output:    Bildschirm (PUTA), bzw. SIO
*
*******************************************************!
ENTRY
CALL    CLEAR_SCREEN    ! loeschen + FAC am Zeilenende setzen !
CALL    LOAD_CURSOR    ! Cursor auf Anfangsposition setzen !
LD    IMR,#%01    ! IRP32 -> VTRC freigeben !
CALL    START_DISPLAY    ! CRTC starten !
EI
LD    SIO,#%00    ! Scheinausgabe SIO !

uebersetzen sich zu (wider deassembliert):


Quellcode:
018a  92 a8     lde    @rr8,r10  
018c  92 a8     lde    @rr8,r10
018e  af        ret
018f  4f        invalid???
0190  97        invalid???
0191  cc 6c     ld     r12,#108
0193  00 d6     dec    r:214
0195  06 79 d6  add    r:121,#214
0198  05 c9 e6  add    @r6,r:201
019b  fb 01     jr     nc,$019e
019d  d6 04 da  call   $04da
01a0  9f        ei
01a1  e6 f0 00  ld     r:240,#0

Das de rArray Teil vom Code-Disassembler nicht erkannt wird ist ok. Ich verstehe nur nicht wo die "00" an Position 0193 herkommt.

Was ich versuche: Ich passe die Version-5 Firmware des P8000 Terminals so an, das ich beim Generieren dieser eine Version-4 Firmware bekomme welche nur als EPROM Image vorliegt. Das EPROM Image der Version-4 disassembliert:


Quellcode:
018a  92 a8     lde    @rr8,r10
018c  92 a8     lde    @rr8,r10
018e  af        ret
018f  4f        invalid???
0190  97        invalid???
0191  cc 6c     ld     r12,#108
0193  d6 06 77  call   $0677  
0196  d6 05 c7  call   $05c7
0199  e6 fb 01  ld     r:251,#1
019c  d6 04 d9  call   $04d9  
019f  9f        ei
01a0  e6 f0 00  ld     r:240,#0

Da befindet sich an 0193 kein 00, wie ich es auch nicht erwarten wuerde.... also, wo kommt im oberen schnipsel die 00 her? Wenn ich in dem allerersten Codeschnippsel vor dem "END INIT" ein "HUGO ARRAY [1 BYTE] := [%FF]" schreibe, wird die 00 durch FF aufgefuellt. Also stellt sich mir die Frage was im ersten Codeschnippsel die 00 verursacht... :-/
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
15.03.2007, 19:33 Uhr
Olli

Avatar von Olli

Schade das noch keiner was geantwortet hat
Die Firmware besteht aus 5 einzelnen Object-Files welche zusammengelinkt wurden.
bei dem verbinden der OBjectfiles scheint der Linker nun tatsaechlich vor jedes der Objectfiles (bis auf das 1.) ein 00-Byte vorranzustellen. Die Frage ist nur wiso macht der das, bzw. wie kann man ihm das abgewoehnen.... bloede Sache... ich glaube, ansonsten habe ich naemlich alles. Nur durch diese 4 zusaetzlichen 00-Bytes verschieben sich alle Sprungadressen
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
15.03.2007, 20:15 Uhr
Olli

Avatar von Olli

Ok, noch eine Anmerkung - das sieht echt so aus, als ob der Linker versucht da immer eine "gerade" Zahl an Bytes hinzubekommen. Wenn man sich anguckt wo er da die 00en einfuegt:

0000190 97cc 6c00 d606 79d6 05c9 e6fb 01d6 04da

0000540 ef76 fa10 6bfb e407 f446 f103 50fd af00

00006a0 22bf af00 6605 206d 0759 6605 806d 0784

das 5. Modul ist ohne 00 angehaengt worden, dort endet das 4. Modul auf 0971, also auch auf einen durch 2 Teilbaren Byte-Wert - daher dort wohl kein "Fuellbyte"
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
16.03.2007, 18:04 Uhr
Olli

Avatar von Olli

Ich versuche mich jetzt unter UDOS mit der Thematik.
Entweder schaffe ich es jetzt dort, den Code so zu linken, das alle Sprungadressen stimmen, dann stimmen aber die Speicherplaetze aber nicht. Andernfalls schaffe ich es, das die Registerangaben stimmen, dann stimmen aber die Sprungadressen nicht, weil eine ganze Blockreihe FF's an den Dateianfang gestellt werden. Evtl. kann mir hier einer helfen

Erstmal der Codeanfang dem ich hier die Schuld gebe.


Quellcode:
GLOBAL
$SECTION REGISTER

$REL    0
! Ports, Status- und Hilfsregister: Reg.-Grp. 0 !
P0, P1, P2, P3, STAT0, STAT1, STAT2, BDR    BYTE
CHAR_ADR                    WORD
SPALTZ, ZEILZ, CHAR, STAT3            BYTE

$REL    %20
! Tastatureingabe !
VBYTE, ZBYTE                    BYTE

$REL    %2C
! Hilfregister fuer Escape_Sequenzen !
LPOS_ADR            WORD
ESCH0                BYTE

$REL    %30
! SIO-Input-Puffer: Reg.-Grp. 3, 4, 5 !
SINPTR, SOUTPTR, SCOUNT    BYTE
SWERT                ARRAY [SBUFL BYTE]



$SECTION PROGRAM
$REL    0

INTERRUPT ARRAY [6 WORD] := [IRP32 IRP33 IRP31 IRP30 IRT0 IRT1] ! 0000 - 000a !
$PAGE
JP_MESSAGE PROCEDURE
ENTRY

jr    INITIAL

END JP_MESSAGE

! Message: Copyright  Name  Version  Datum !
MESSAGE array [* byte] := '(C) ZFT/KEAW 4.2 Jan88'


INITIAL PROCEDURE
!*******************************************************
*
* Initialisierung :
* Ports, Register, SIO, Tastatur, CRTC
*
*******************************************************!
ENTRY


! Ports !
LD    P01M,#P01EXT
LD    P2M,#%FF    ! P20...P27 Input !
LD    P3,#%2F        ! Anfangszustand, P35=1 !
LD    P3M,#%51    ! DM aktiv !

Es faellt erstmal auf, das es hier 2 Sektionen gibt. Eine Sektion vom Typ REGISTER, eine vom Typ PROGRAM. Auch faellt auf, das diese 2 Sektionen keine Bezeichnung/n Namen haben. In den anderen Sourcefiles die dann spaeter noch mit zusammengelinkt werden haben die jeweiligen PROGRAM Sektionen alle einen Namen (SEK1, SEK2 usw). Die spaeteren/anderen Sourcefiles enthalten alle auch nur eine PROGRAM Sektion, keine weitere REGISTER Sektion.

Wenn ich nun alles zusammen in der richtigen Reihenfolge verlinke, und dann mittels IMAGER "umwandele" stimmt der fuer P3 (von der Codezeile "LD P3,#%2F" am Ende des Listings) eingetragene Wert mit dem aus dem Orginalbinary ueberein - naemlich '03'.


Quellcode:
ZLINK N=p8t_1_4 p8t.4.init.obj p8t.4.main.obj p8t.5.up.obj p8t.4.esc.obj p8t.5.vt100.obj KEEP=NONE
IMAGER p8t_1_4 {0 FFF} O=p8t
DUMP p8t
     1.Record
0000 * FF FF FF FF  FF FF FF FF  FF FF FF FF  FF FF FF FF    *................*
0010 * FF FF FF FF  FF FF FF FF  FF FF FF FF  FF FF FF FF    *................*
0020 * FF FF FF FF  FF FF FF FF  FF FF FF FF  FF FF FF FF    *................*
0030 * FF FF FF FF  FF FF FF FF  FF FF FF FF  FF FF FF FF    *................*
0040 * FF FF FF FF  FF FF FF FF  FF FF FF FF  FF FF FF FF    *................*
0050 * FF FF FF FF  FF FF FF FF  FF FF FF FF  FF FF FF FF    *................*
0060 * 01 52 01 60  01 06 01 8B  01 5F 01 3C  8B 16 28 43    *.R.`....._.<..(C*
0070 * 29 20 5A 46  54 2F 4B 45  41 57 20 34  2E 32 20 4A    *) ZFT/KEAW 4.2 J*
0080 * 61 6E 38 38  E6 F8 96 E6  F6 FF E6 03  2F E6 F7 51    *an88......../..Q*

Nun habe ich am Anfang im Code aber ganz viele FF's

1. Frage - wie kommmen die Da hin, also was koennte den Linker/Imager dazu veranlassen bis 005Fh FF's aufzuefuellen? Liegt das an der REGISTER Sektion? Unter WEGA ist das nicht so, dort geht es gleich mit dem Programm bei 0000h los.

Die Sprungmarken stimmen durch diese "Verschiebung" natuerlich alle nicht mit den Sprungmarken im Orginal-Binary ueberein. Nun mal bitte einen Blick auf das Byte 008Bh werfen (Inhalt '03') Dies ist naemlich P3 aus der genannten LD Anweisung.
Nun habe ich versucht den Code so verlinkt zu bekommen, das die FF's am Anfang weg sind. Dazu habe ich der REGISTER und PROGRAM Sektion jeweils einen anderen Namen gegeben. Ziel war es, die Programm Sektionen miteinander zu einer neuen Sektion zusammen zu fuegen beim Link-Lauf, um diese dann zu zwingen auf Adresse 0000h zu beginnen. Dazu habe ich beim Linken DATEN=... verwendet, und beim IMAGER Aufruf DATEN mit ($=0 DATEN) versucht zu zwingen bei 0000h zu beginnen. SEC0 ist der neue Name der PROGRAM-Sektion aus dem 1. Listing, SEC1,2,3,5 sind die Namen der PROGRAM-Sektionen der anderen Objekte.


Quellcode:
ZLINK N=p8t_1_4 p8t.4.init.obj p8t.4.main.obj p8t.5.up.obj p8t.4.esc.obj p8t.5.vt100.obj DATEN=(SEC0 SEC1 SEC2 SEC3 SEC5)
%IMAGER p8t_1_4 ($=0 DATEN) {0 FFF} O=p8t
IMAGER 2.3
E68 BYTES LOADED    
%DUMP p8t
     1.Record
0000 * 00 F2 01 00  00 A6 01 2B  00 FF 00 DC  8B 16 28 43    *.......+......(C*
0010 * 29 20 5A 46  54 2F 4B 45  41 57 20 34  2E 32 20 4A    *) ZFT/KEAW 4.2 J*
0020 * 61 6E 38 38  E6 F8 96 E6  F6 FF E6 6B  2F E6 F7 51    *an88.......k/..Q*

Wenn man sich nun 002Ah anguckt (was ja 8A aus dem oberen Beispiel entspricht), sieht man, das dort fuer P3 aus der LD-Anweisung auf einmal 6B eingesetzt wird.

Die 2. Frage, woher wird ermittelt was fuer P3 usw. eingesetzt wird?

Nun noch abschliessend... hat einer eine Idee wie ich es hinbekomme, dass das Binary bei 00 anfaengt, und aber auch die Register passen? Ich habe schon versucht, bestimmte Sektionen auf bestimmte Adressen zu zwingen (mit $=0193 SEC2 zwingt man z.B. SEC2 dazu auf 0193h zu starten).

Irgendwelche Ideen? Bitte lasst mich nicht dumm sterben
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 16.03.2007 um 18:17 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
16.03.2007, 21:20 Uhr
Olli

Avatar von Olli

Hallo,

unabhaengig von meiner Antwort hoffe ich auch auf andere Antworten

Ich habe es nun geschafft, die 4.2 Firmware binaerkompatibel zu erzeugen:


Quellcode:
olivleh1@kartoffel bin> cmp lala  ~/tmp/Z8DIS/P8T_1_4.1
olivleh1@kartoffel bin> cksum lala ~/tmp/Z8DIS/P8T_1_4.1
3815578219 4096 lala
3815578219 4096 /home/olivleh1/tmp/Z8DIS/P8T_1_4.1
olivleh1@kartoffel bin>

Die Datei mit dem schoenen Namen "lala" ist die selbst erzeugte Firmware.
Erzeugt habe ich es, in dem ich der REGISTER Sektion in dem 1. Sourceteil den Namen "SECR" gab, und der PROGRAM Sektion im 1. Sourceteil den Namen "SEC0". Dann habe ich alle Verbunden mittels ZLINK, und bei Imager dafuer gesorgt, das sich mindestens SECR und SEC0 ueberlagern (wiso er die anderen auch als sich ueberlagernd meldet ist mir nicht klar).


Quellcode:
%ZLINK N=p8t_1_4 p8t.4.init.obj p8t.4.main.obj p8t.5.up.obj p8t.4.esc.obj p8t.5.vt100.obj KEEP=NONE
ZLINK 2.2
LINK COMPLETE
%IMAGER p8t_1_4 ($=0000 SEC0 $=0193 SEC1 $=054E SEC2 $=06A1 SEC3 $=098D SEC5 $=0000 SECR) {0 FFF} O=p8t
IMAGER 2.3
POSSIBLE CODE OVERLAY IN SEGMENT 0000 AT LOCATION 0193
POSSIBLE CODE OVERLAY IN SEGMENT 0000 AT LOCATION 054E
POSSIBLE CODE OVERLAY IN SEGMENT 0000 AT LOCATION 06A1
POSSIBLE CODE OVERLAY IN SEGMENT 0000 AT LOCATION 098D
POSSIBLE CODE OVERLAY IN SEGMENT 0000 AT LOCATION 0000
E68 BYTES LOADED    

Nun frage ich mich natuerlich.... wiso musste ich fuer jede Sektion eine Startadresse angeben. Die koennen das doch damals nicht auch so umstaendlich gemacht haben? Irgendwie muss es auch unter WEGA mit dem u881-Assembler dort gehen - die Linker-Datei die den Version-5 Sourcen beilag laesst naemlich nur den Schluss zu, das die Sourcen unter WEGA uebersetzt wurden. Oder ob sie von 4 auf 5 nach WEGA gewechselt sind? Kann ich mir aber auch nicht vorstellen.... wer weiss...

EDIT:
SDLC Poly Checksumme Stimmt auch

#P p8t U2732
READY TO PROGRAM?y
PROM CRC: 66D7
#
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 16.03.2007 um 22:26 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