003
16.03.2007, 18:04 Uhr
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. |