68020 will nicht laufen

Gast #7075366
Lesenswert?

Moin Leute

Folgendes...ich habe hier ein Stück Hardware (eine alte Steuerungskarte) 
mit einem 68020 drauf und möchte ein paar Testprogramme darauf zum 
Laufen bringen. Die Karte an sich funktioniert, nur mein Programm tut 
nix.

Gebaut wird per Batchdatei und einer alten Cadul-Toolchain (Assembler 
AS68, Compiler CC68 und Linker LD68).

Zunächst will ich bloß eine LED schalten um zu verifizieren daß das 
funktioniert, aber daran hängt es schon: Ich bekomme zwar ein S3-File, 
aber wenn ich das Programm in ein EEPROM lade tut sich nix.

Batchdatei:
1
as68 m68c0.asm -e _INT32_=1 -e _PIC_=0 -e _ROM_=1 -y -ue -VCPU=68020 -i C:\cadul\src\csu
2
cc68 -VDB -I. -VFULLANSI main.c
3
cc68 -VASM -VFULLANSI main.c
4

5
ld68 @Linker.cl
6
BTOS -3 rom.bd rom.s3

Linker.cl:
1
listing listfile default
2

3
verbose
4
debug
5
final
6
layout
7

8
segment 0 
9
  base 0x0
10
  load sec 0,  sec 1, sec 2, sec 3, sec 6
11

12
segment 1
13
  base 0x20005000
14
  attribute write
15
  load sec 5
16
  block section 10, section 11
17

18
  label global stacktop_
19
  space {0x150-stacktop_}
20
  label global stackbot_
21
  label global stack_
22

23
input
24
  #m68LFIc0.o
25
  m68c0.o
26
  C:\cadul\LIB\m68LFIlc.a
27
  C:\cadul\LIB\m68LFIce.o
28
  main.o
29
  
30
out  rom.bd

Ab Adresse 0x20000000 fängt das RAM an, mehr als genug RAM. Der Linker 
spukt eine Warnung aus die ich nicht so recht verstehe. Er schreibt was 
von memory wrap oder so ähnlich, meint jedenfalls daß es einen 
Speicherüberlauf geben könnte. Diese Meldung sollte nach der Doku aber 
erst kommen wenn er nach 0xFFFFFFFF einen Überlauf feststellt, und den 
hat er bei dem kleinen Programm ganz sicher nicht.


Main.c:
1
#pragma noprofile
2

3
#define EL_LATCH  0xe0000000L
4

5
int main (void) {
6
  /* Switch all leds off */
7
  (*(unsigned short *)EL_LATCH) = 0x00;
8
  (*(unsigned short *)EL_LATCH) = 0x01;
9
  (*(unsigned short *)EL_LATCH) = 0x02;
10
  (*(unsigned short *)EL_LATCH) = 0x03;
11

12
  while(1){}
13
   return 0;
14
}

Dieser Codeschnipsel funktioniert so, wenn ich das Programm mit einer 
anderen Toolchain baue. Mit dieser Toolchain kann ich allerdings nicht 
arbeiten, da diese das Programm komplett mit einem RTOS lädt, und das 
RTOS steht mir für mein Vorhaben im Weg. Und für diese Toolchain habe 
ich leider keine Dokumentation, um der das abzugewöhnen.

Hier noch die Assemblerdatei, die der Compiler liefert:
1
*  CC68 - Organon M68xxx ANSI-C Cross Optimizing Compiler Version: 621D
2
*  (c) CAD-UL GmbH 1988-1995
3
* ------------------------------------------------------------------------------
4
*  COMMAND LINE:
5
*  -VASM -VFULLANSI main.c 
6
*  SOURCE FILE            : main.c (ANSI-C)
7
*  DATE OF TRANSLATION    : Fri Jan 01 05:48:13 1999
8
* ------------------------------------------------------------------------------
9
*  TARGET CPU             : Motorola 68000/10
10
*  FLOATING POINT VARIANT : IEEE FORMAT SOFTWARE EMULATION
11
*  SELECTED INTEGER SIZE  : 16 Bit
12
*  MEMBER ALIGNMENT       : DEFAULT
13
*  MESSAGES               : DEFAULT
14
*  PROLOG                 : SHORT
15
*  STACKCHECK             : NONE
16
*  PROFILING (pragma use) : NONE
17
*  PREFETCH NOP's         : NONE
18
*  DEBUG INFORMATION      : NONE
19
*  OPTIMIZER              : CSEQ,-,DCOD,-,LOOP,-,PEEP,-,-,XJMP
20
*  SECTION USAGE          : CODE= 0 [C],DATA= 5 [D],BSS=10 [D],STRING= 6 [D]
21
*                         : CONST= 2 [C],INIT= 3 [C],PROFILE=11 [D],POOL= 1 [C]
22
*  RESERVED REGISTER      : NONE
23
*  ROMABLE CODE           : OFF
24
*  CODE GROUP RELOCATION  : ABSOLUTE
25
*  DATA GROUP RELOCATION  : ABSOLUTE
26
*  BUILTIN FUNCTIONS      : OFF
27
* ------------------------------------------------------------------------------
28
*  line number 1
29

30

31
* #pragma noprofile
32

33
        SECTION  0  
34

35
*  line number 13
36

37
main_:
38
* ------------------------------------------------------------------------------
39
* FUNCTION: main
40
* List of locals:
41
* symbol                  : allocation
42
* ------------------------------------------------------------------------------
43
*  prolog (main) 
44
        LINK        A6,#0
45
*  line number 15
46
        MOVEA.L     #$e0000000,A1
47
        CLR         (A1)
48
*  line number 16
49
        MOVEA.L     #$e0000000,A1
50
        MOVE        #1,(A1)
51
*  line number 17
52
        MOVEA.L     #$e0000000,A1
53
        MOVE        #2,(A1)
54
*  line number 18
55
        MOVEA.L     #$e0000000,A1
56
        MOVE        #3,(A1)
57
L3:
58
*  line number 20
59
        BRA.S       L3
60
*  line number 22
61
*  epilog
62
        UNLK        A6
63
        RTS         
64
        XDEF main_
65

66
        END
67
* of program

Wie gesagt, bis auf die Warnung vom Linker kommt keine Fehlermeldung. 
Die Hardware selber enthält nix, was noch irgendwie initialisiert werden 
müßte, jedenfalls nicht um die LEDs zu schalten. Vom EEPROM wird auch 
gelesen.

Sieht von euch jemand, was da noch schief laufen könnte?
#7075382
Lesenswert?

Ich sehe in dem ganzen Durcheinander etwas von floating point emulation.

Ist dein Programm dann vielleicht doch größer als du denkst?

Und steht in deinem EPROM auch das drin, was du erwartest?

Die Linker.cl verstehe ich nicht, insbesondere die Rechnerei für den 
Stack.
Vielleicht versteht der Linke er es auch nicht. Möglicherweise kommt 
daher die Warnung.
Gibt auch die Ausgabe des Linkers? Die wäre aufschlussreich.
Gast #7075406
Lesenswert?

Hm...mit FP-Rechnerei sollte da nix sein.

Und die Speichergröße ist plausibel, außer daß er etwas merkwürdig viel 
Stack verlangt. Im ASM-Code wird der Stack ja nicht benötigt, aber ein 
paar Byte will er trotzdem. Ich habe das für eine Standardeinstellung 
gehalten.

Da fällt mir ein, ich habe hier noch das Listfile:
1
Organon LD68 V700  Motorola MC68xxx Cross-Linker                      Page   1
2

3

4

5
LINK TIME: Fri Jan 01 05:48:13 1999
6

7

8

9
COMMAND LINE:
10

11
C:\CADUL\BIN\LD68.EXE @Linker.cl 
12
==============================================================================
13

14
PASS 0 : scan input ... 
15
PASS 1 : layout ... 
16
LD68-W-WARN : (lnk)  840 :  : segment 1: address wrap around
17
LD68-W-WARN : (lnk)  840 :  : segment 1: address wrap around
18
LD68-W-WARN : (lnk)  840 :  : segment 1: address wrap around
19
PASS 2 : load and relocate ...
20
PASS 3 : write output ...
21
      3 warnings
22

23
SEGMENT SUMMARY:
24

25
SEGMENT ATTRIBUTES  BASEADDR   LOAD-SIZE  BLOCK-SIZE TOTAL      ENDADDR
26
   0    -------     0x00000000 0x000001c2 0x00000000 0x000001c2 0x000001c2
27
   1    -W-----     0x20005000 0x00000008 0xdfffb148 0xdfffb150 0x00000150
28
==============================================================================
29

30

31

32
SEGMENT-SECTION SUMMARY:
33

34
SEGMENT:  0
35
TYPE   SECTION  GAPSPEC  GAPSIZE    BASE  -  ADDR  -  END SIZE
36
LOAD         0                      0x00000000 0x000001a0 0x000001a0
37
             3                      0x000001a0 0x000001bc 0x0000001c
38
             6                      0x000001bc 0x000001c2 0x00000006
39
------------------------------------------------------------------------------
40
SEGMENT:  1
41
TYPE   SECTION  GAPSPEC  GAPSIZE    BASE  -  ADDR  -  END SIZE
42
LOAD         5                      0x20005000 0x20005008 0x00000008
43
BLOCK       10                      0x20005008 0x200050b4 0x000000ac
44
           ABS  stacktop_           0x200050b4  
45
                SPACE    0xdfffb09c 0x200050b4 0x00000150           
46
           ABS  stackbot_           0x00000150  
47
           ABS  stack_              0x00000150  
48
------------------------------------------------------------------------------
49
==============================================================================
50

51

52

53
MODULE SUMMARY:
54

55
MODULE           LIBRARY
56
M68C0.O          
57
     SECTION  TYPE BASE        SIZE         SEGMENT    ROUND
58
         0      L  0x00000000  0x000000ac     0        -
59
        10      B  0x20005008  0x0000002c     1        -
60
------------------------------------------------------------------------------
61

62
STARTUP          C:\cadul\LIB\m68LFIlc.a
63
Organon LD68 V700  Motorola MC68xxx Cross-Linker                      Page   2
64

65

66

67
     SECTION  TYPE BASE        SIZE         SEGMENT    ROUND
68
         0      L  0x000000ac  0x0000005e     0        -
69
         6      L  0x000001bc  0x00000006     0        -
70
------------------------------------------------------------------------------
71

72
EXIT             C:\cadul\LIB\m68LFIlc.a
73
     SECTION  TYPE BASE        SIZE         SEGMENT    ROUND
74
         0      L  0x0000010a  0x00000066     0        -
75
         3      L  0x000001a0  0x00000006     0        -
76
         5      L  0x20005000  0x00000004     1        -
77
        10      B  0x20005034  0x00000080     1        -
78
------------------------------------------------------------------------------
79

80
M68LFICE.O       
81
     SECTION  TYPE BASE        SIZE         SEGMENT    ROUND
82
         3      L  0x000001a6  0x00000016     0        -
83
         5      L  0x20005004  0x00000004     1        -
84
------------------------------------------------------------------------------
85

86
MAIN.O           
87
     SECTION  TYPE BASE        SIZE         SEGMENT    ROUND
88
         0      L  0x00000170  0x00000030     0        -
89
------------------------------------------------------------------------------
90

91
==============================================================================
92

93

94

95
MEMORY USAGE:
96

97
START       END         SECTION    SEGMENT  OVERLAY ATTRIBUTES
98
0x00000000  0x0000019f  0             0             -------
99
0x000001a0  0x000001bb  3             0             -------
100
0x000001bc  0x000001c1  6             0             -------
101
0x20005000  0x20005007  5             1             -W-----
102
==============================================================================
103

104

105

106
LISTING OF MODULE SYMBOLS:
107

108
SYMBOL                         SECTION    ADDRESS     TYPE SEGMENT
109
m68c0.o:
110

111
__db68ex___                    0         0x000000a8  def    0         
112
_exit_                         0         0x000000a4  def    0         
113
_startup_                      0         0x000000ac  ref    0         
114
dataend_                       5         0x20005008  ref    1         
115
datastart_                     5         0x20005000  def    1         
116
environ_                       10        0x2000502c  def    1         
117
envp_                          10        0x20005030  def    1         
118
errno_                         10        0x20005028  def    1         
119
init_end_code_                 3         0x000001ba  ref    0         
120
nullend_                       10        0x200050b4  ref    1         
121
nullstart_                     10        0x20005008  def    1         
122
profdataend_                   11        0x200050b4  ref    1         
123
profdatastart_                 11        0x200050b4  def    1         
124

125
Organon LD68 V700  Motorola MC68xxx Cross-Linker                      Page   3
126

127

128

129
C:\cadul\LIB\m68LFIlc.a(STARTUP):
130

131
_startup_                      0         0x000000ac  def    0         
132
environ_                       10        0x2000502c  ref    1         
133
envp_                          10        0x20005030  ref    1         
134
errno_                         10        0x20005028  ref    1         
135
exit_                          0         0x0000013e  ref    0         
136
main_                          0         0x00000170  ref    0         
137
sexit_                         0         0x00000102  def    0         
138

139
C:\cadul\LIB\m68LFIlc.a(EXIT):
140

141
_exit_                         0         0x000000a4  ref    0         
142
atexit_                        0         0x0000010a  def    0         
143
exit_                          0         0x0000013e  def    0         
144

145
C:\cadul\LIB\m68LFIce.o:
146

147
dataend_                       5         0x20005008  def    1         
148
init_end_code_                 3         0x000001ba  def    0         
149
nullend_                       10        0x200050b4  def    1         
150
profdataend_                   11        0x200050b4  def    1         
151
splimit_                       5         0x20005004  def    1         
152
stacktop_                      ABS       0x200050b4  ref    1         
153

154
main.o:
155

156
main_                          0         0x00000170  def    0         
157

158
==============================================================================
159

160

161
LISTING OF SEGMENT SYMBOLS:
162

163
SYMBOL                         ADDRESS      SCOPE    REGION
164
SEGMENT 1:
165

166
stacktop_                      0x200050b4   GLOBAL   LOAD
167
stackbot_                      0x00000150   GLOBAL   LOAD
168
stack_                         0x00000150   GLOBAL   LOAD
169
==============================================================================
170

171

172

173
MAP OF SYMBOLS:
174

175
SYMBOL                         SECTION   ADDRESS    FLAG SEGMENT RELF SIZE
176

177
ENTRY POINT:
178

179
 No entry point, 0x0 defaulted
180

181
_exit_                         0         0x000000a4  def    0         
182
__db68ex___                    0         0x000000a8  def    0         
183
_startup_                      0         0x000000ac  def    0         
184
sexit_                         0         0x00000102  def    0         
185
atexit_                        0         0x0000010a  def    0         
186
exit_                          0         0x0000013e  def    0         
187
Organon LD68 V700  Motorola MC68xxx Cross-Linker                      Page   4
188

189

190

191
stack_                         ABS       0x00000150  def    1         
192
stackbot_                      ABS       0x00000150  def    1         
193
main_                          0         0x00000170  def    0         
194
init_end_code_                 3         0x000001ba  def    0         
195
datastart_                     5         0x20005000  def    1         
196
splimit_                       5         0x20005004  def    1         
197
dataend_                       5         0x20005008  def    1         
198
nullstart_                     10        0x20005008  def    1         
199
errno_                         10        0x20005028  def    1         
200
environ_                       10        0x2000502c  def    1         
201
envp_                          10        0x20005030  def    1         
202
nullend_                       10        0x200050b4  def    1         
203
profdataend_                   11        0x200050b4  def    1         
204
profdatastart_                 11        0x200050b4  def    1         
205
stacktop_                      ABS       0x200050b4  def    1         
206
==============================================================================
207

208

209

210
DIRECTIVE:
211

212
! INPUT: LINKER.CL
213
listing listfile default
214

215
verbose
216
debug
217
final
218
layout
219

220
segment 0 
221
  base 0x0
222
  load sec 0,  sec 1, sec 2, sec 3, sec 6
223

224
segment 1
225
  base 0x20005000
226
  attribute write
227
  load sec 5
228
  block section 10, section 11
229

230
  label global stacktop_
231
  space {0x150-stacktop_}
232
  label global stackbot_
233
  label global stack_
234

235
input
236
  #m68LFIc0.o
237
  m68c0.o
238
  C:\cadul\LIB\m68LFIlc.a
239
  C:\cadul\LIB\m68LFIce.o
240
  main.o
241
  
242
out  rom.bd
243
==============================================================================
Gast #7075488
Lesenswert?

Mir fallen  da zwei Sachen auf:
1. Hoffentlich sorgt m68c0.o für eine korrekte Vektortabelle.
2. Die Stackplatzberechnung ist vergurkt. Es gibt ein stacktop-Label, 
dann wird eine negative Menge Platz reserviert, die so berechnet ist, 
dass man bei Adresse 0x00000150 herauskommt, die dann als stackbot und 
stack gelabelt wirtd. Das mit dem negativen Speicherplatz bemängelt der 
Linker dann ja auch.

Warum macht man das mit dem Stack nicht andersherum? Bottom definieren, 
Platz reserviern, Top definieren, fertig.

Stack braucht das einfache Programm ja nicht, also wird wohl noch 
irgendetwas mit den Vektoren nicht stimmen.
Gast #7075541
Lesenswert?

Hallo, eben,

vielleicht kannst Du, wie Georg schrieb, das EPROM-File diassemblieren, 
was da herausgekommen ist?
So sieht das Assembler-Listening, nun mal wie eine C-Funktion aus, die 
(von wem?) aufgerufen wird, und nicht wie ein Startcode eines m68k (s. 
Klaus.W).

Wird die CPU usw. mit ihren Vektoren von der Toolchain initialisiert?

Initial würde ich einen m68k mit:

        reset
        move.w   #$2700,sr    ; IRQ sperren, supervisor bit setzen
; starten
 und nicht mit link a6,#0 - was sollte das schon bringen?:

      link  a6,#0   ; legt a6 auf den Stack ohne offset, meist verwendet 
im
                    ; Aufruf einer C-Funktion,
                    ; um dann mit z.B. mit move.l 4(a6),d0  einen 
Parameter
                    ; der Funktion zu laden. Die C Funktion wird dann
                    ; mit unlk a6 und rts
                    ; beendet. s. in Deinem Ass-Listening unten.


Der 68k  nimmt sich ja Speicherstelle $00000004 als Start PC.

Im EPROM steht also ....(?):

   org   $00000000

   dc.l  StartSSP   ; ist was? wirklich(?) $150 (also vermutlich ROM?)

   dc.l  Start_PC   ; ist was? => main_ (?) = $170


 .. und dann weiter

Gruß Olav.
#7075546
Lesenswert?

Klaus W. schrieb:
> Nosnibor schrieb:
>> Stack braucht das einfache Programm ja nicht,
>
> Was wir sehen, ist ja nur main().
> Die wird vom Startupcode vielleicht mit BSR oder JSR aufgerufen? Dafür
> braucht man dann ein paar Byte Stack für SP und Rücksprungadresse.

Nicht nur vielleicht. main hat ein rts, auch wenn das nicht drankommt. 
Wenn die Vektortabelle im mc68c.o richtig gesetzt wird (möglich, aber 
mit falschem Linker evtl. doch nicht), könnte auch eine falsche 
Stackadresse im Startup auf einen doppelten Busfehler (=KO) oder so 
rauslaufen, wenn da schon am Stack rumgefummelt wird.
#7075562
Lesenswert?

Cfzhfddfhijj schrieb:
> Der Compiler liefert 68k/10 Code mit 16bit Integer? 68020 ist
> durchgängig 32bit.

Das ist für das Demoprogramm egal, weil wenn überhaupt das nur die 
Interpretation von int/long in C trifft. Von der Funktion der Opcodes 
gibts bis auf ein paar Sachen im Supervisormode keine Unterschiede 
zwischen 68000 und 68020++, .L ist .L und .W ist .W...
Gast #7075710
Lesenswert?

Wühlhase schrieb:
> Die Karte an sich funktioniert, nur mein Programm tut
> nix.

Woran kannst Du erkennen, daß die Karte funktioniert?
Alte EPROMs sind sehr vergesslich.
Was passiert an den Daten- bzw. Adressleitungen, wenn Dein Programm 
startet?

Wenn dort nichts passiert, zähle die Zyklen, die die CPU nach einem 
Reset macht. Dann kannst Du sehen, wo sie hängen bleibt: Lesezugriff auf 
ROM, Schreibzugriff auf RAM, ...
Gast #7076443
Lesenswert?

Erstmal danke für die vielen Hinweise und Denkanstöße, ich habe da auf 
Arbeit heute einiges ausprobiert. Leider kann ich auf Arbeit seit 
einiger Zeit hier nicht mehr schreiben, sonst hätte ich gleich 
geantwortet.

Die Stackanordnung im Linkerfile hatte ich ursprünglich aus der Doku von 
Cadul geklaut. Ich habe das mal korrigiert, und der Linker warnt jetzt 
nicht mehr.


m.n. schrieb:
> Wühlhase schrieb:
>> Die Karte an sich funktioniert, nur mein Programm tut
>> nix.
>
> Woran kannst Du erkennen, daß die Karte funktioniert?

Es ist halt die Referenzkarte. Ich habe noch ein paar hier, die 
definitiv kaputt sind. Ich habe hier u.a. ein EEPROM mit einem 
Testprogramm für die Karte, das läuft prima. Außerdem habe ich in der VM 
noch eine zweite Toolchain, mit der ich testweise ein LED-Blinklicht 
gebastelt habe, das hat auch funktioniert. Der Code aus der obigen main 
stammt daraus.
Ich habe zu dieser Toolchain leider keinerlei Doku und der Kram ist so 
konfiguriert, daß das Programm in einem RTOS läuft. Und wie gesagt - ich 
brauche das ohne RTOS. Ich brauche ein paar Minimaltests (für defekte 
Baugruppen).


Ich habe leider keinen anständigen Disassembler, aber da gibt es 
mittlerweile nette Onlinewerkzeuge. Im Anhnag habe ich mal das S3-File 
angehangen. Wenn ich das aber in diesem Disassembler hier ansehe
https://onlinedisassembler.com
werde ich aus der Ausgabe nicht schlau. Nach sinnvollem Programmcode 
sieht mir das nicht aus.

Ob ich das funktionierende Testprogramm hier reinstellen kann ohne das 
es Ärger gibt, weiß ich aber nicht...muß ich mal abklären, aber das wird 
erst nächste Woche was.

Ach ja, aktuell benutze ich ein Am29F010 als Speicher, das Ding hat 8 
Bit. Die Karte ist eigentlich für EPROMs vorgesehen, ich habe aus zwei 
DIL-Sockeln einen Adapter gebastelt, jedes Mal eine Viertelstunde 
EPROM-Löschen dauert doch etwas zu lange. Und mit einem funktionierenden 
Programm habe ich das auch getestet...das sollte soweit funktionieren.
Angehängte Dateien:
#7076530
Lesenswert?

Also wenn "objcopy -I ihex ROM.S3 -O binary rom.bin" keinen Unsinn 
produziert, fehlt dir eindeutig die Vektortabelle. Wenn man das 
disassembliert (ist jetzt mein eigener, sollte aber egal sein), sieht 
schon der Anfang nach sinnvollem Code aus, was nicht sein dürfte:
1
00000000        46fc 2700               MOVE #$2700,SR
2
00000004        23fc 7f08 0080 00ff fa04        MOVE.L #$7f080080,$fffa04.L
3
0000000e        23fc 0003 6b70 00ff fa48        MOVE.L #$36b70,$fffa48.L
4
00000018        23fc 0103 6b70 00ff fa6c        MOVE.L #$1036b70,$fffa6c.L
5
00000022        23fc 0103 3270 00ff fa70        MOVE.L #$1033270,$fffa70.L
6
0000002c        23fc 0103 5270 00ff fa74        MOVE.L #$1035270,$fffa74.L
7
00000036        23fc 0000 0000 00ff fa20        MOVE.L #$0,$fffa20.L
8
00000040        203c 0000 01ba          MOVE.L #$1ba,D0
9
00000046        0480 0000 01a0          SUBI.L #$1a0,D0
10
0000004c        671a                    BEQ $68
11
0000004e        45f9 2000 0008          LEA $20000008.L,A2
12
00000054        47f9 2000 0000          LEA $20000000.L,A3
13
0000005a        b5cb                    CMPA.L A3,A2
14
0000005c        6f04                    BLE $62
15
0000005e        425b                    CLR.W (A3)+
16
00000060        60f8                    BRA $5a
17
-----------------------------------------------------------------------------
18

19
00000062        4eb9 0000 01a0          JSR $1a0.L
20
00000068        45f9 2000 00b4          LEA $200000b4.L,A2
21
0000006e        47f9 2000 0008          LEA $20000008.L,A3
22
00000074        b5cb                    CMPA.L A3,A2
23
00000076        6f04                    BLE $7c
24
00000078        425b                    CLR.W (A3)+
25
0000007a        60f8                    BRA $74
26
...

Ganz offensichtlich linkst du was falsch...
Gast #7076571
Lesenswert?

Der Code aus ROM.S3 sieht so aus, _main habe ich benannt.
Da fehlt relativ sicher die Vektortabelle, ich gehe
davon aus dass es da nicht noch einen zweiten EPROM gibt
der dann nur den Code aus diesem EPROM ausführt.

Ob der ganze Code "drum herum" passt weisst nur Du, ohne
Vergleich mit einem lauffähigen Program kann man wenig dazu sagen.
1
; Processor       : 68020
2

3
; ===========================================================================
4

5
; Segment type: Pure code
6
; segment "seg000"
7

8
; =============== S U B R O U T I N E =======================================
9

10
; Attributes: noreturn
11

12
sub_0:
13
                move    #$2700,sr
14
                move.l  #$7F080080,($FFFA04).l
15
                move.l  #$36B70,($FFFA48).l
16
                move.l  #$1036B70,($FFFA6C).l
17
                move.l  #$1033270,($FFFA70).l
18
                move.l  #$1035270,($FFFA74).l
19
                move.l  #0,($FFFA20).l
20
                move.l  #$1BA,d0
21
                subi.l  #$1A0,d0
22
                beq.s   loc_68
23
                lea     ($20000008).l,a2
24
                lea     ($20000000).l,a3
25

26
loc_5A:                                 ; CODE XREF: sub_0+60j
27
                cmpa.l  a3,a2
28
                ble.s   loc_62
29
                clr.w   (a3)+
30
                bra.s   loc_5A
31
; ---------------------------------------------------------------------------
32

33
loc_62:                                 ; CODE XREF: sub_0+5Cj
34
                jsr     (sub_1A0).l
35

36
loc_68:                                 ; CODE XREF: sub_0+4Cj
37
                lea     ($200000B4).l,a2
38
                lea     ($20000008).l,a3
39

40
loc_74:                                 ; CODE XREF: sub_0+7Aj
41
                cmpa.l  a3,a2
42
                ble.s   loc_7C
43
                clr.w   (a3)+
44
                bra.s   loc_74
45
; ---------------------------------------------------------------------------
46

47
loc_7C:                                 ; CODE XREF: sub_0+76j
48
                lea     ($200000B4).l,a2
49
                lea     ($200000B4).l,a3
50

51
loc_88:                                 ; CODE XREF: sub_0+8Ej
52
                cmpa.l  a3,a2
53
                ble.s   loc_90
54
                clr.w   (a3)+
55
                bra.s   loc_88
56
; ---------------------------------------------------------------------------
57

58
loc_90:                                 ; CODE XREF: sub_0+8Aj
59
                suba.l  a6,a6
60
                clr.l   -(sp)
61
                jsr     (c_start).l
62
; End of function sub_0
63

64
; ---------------------------------------------------------------------------
65
                adda.l  #4,sp
66
                move.l  d0,-(sp)
67
                move.l  d0,-(sp)
68

69
; =============== S U B R O U T I N E =======================================
70

71
; Attributes: noreturn
72

73
forever:                                ; CODE XREF: sub_13E+26p
74

75
arg_0           =  4
76

77
                move.l  arg_0(sp),-(sp)
78

79
forever_A8:                             ; CODE XREF: forever+6j
80
                nop
81
                bra.s   forever_A8
82
; End of function forever
83

84

85
; =============== S U B R O U T I N E =======================================
86

87
; Attributes: noreturn bp-based frame
88

89
c_start:                                ; CODE XREF: sub_0+94p
90

91
var_4           = -4
92

93
                link    a6,#-$C
94
                movem.l d6-d7,(sp)
95
                moveq   #1,d6
96
                move.l  #$1BC,var_4(a6)
97
                clr.l   (a6)
98
                clr.l   ($20000028).l
99
                clr.l   ($2000002C).l
100
                clr.l   ($20000030).l
101
                move.l  ($20000030).l,-(sp)
102
                pea     var_4(a6)
103
                move.l  d6,-(sp)
104
                jsr     (_main).l
105
; End of function c_start
106

107
; ---------------------------------------------------------------------------
108
                lea     $C(sp),sp
109
                move.l  d0,d7
110
                jsr     (sub_102).l
111
                move.l  d7,-(sp)
112
                jsr     (sub_13E).l
113
; ---------------------------------------------------------------------------
114
                addq.l  #4,sp
115
                movem.l (sp),d6-d7
116
                unlk    a6
117
                rts
118

119
; =============== S U B R O U T I N E =======================================
120

121
; Attributes: bp-based frame
122

123
sub_102:                                ; CODE XREF: seg000:000000EAp
124
                link    a6,#0
125
                unlk    a6
126
                rts
127
; End of function sub_102
128

129
; ---------------------------------------------------------------------------
130
                link    a6,#0
131
                cmpi.l  #$20,($20000000).l
132
                blt.s   loc_11E
133
                moveq   #$FFFFFFFF,d0
134
                bra.s   loc_13A
135
; ---------------------------------------------------------------------------
136

137
loc_11E:                                ; CODE XREF: seg000:00000118j
138
                move.l  ($20000000).l,d0
139
                addq.l  #1,($20000000).l
140
                lsl.l   #2,d0
141
                movea.l #$20000034,a1
142
                move.l  8(a6),(a1,d0.l)
143
                clr.l   d0
144

145
loc_13A:                                ; CODE XREF: seg000:0000011Cj
146
                unlk    a6
147
                rts
148

149
; =============== S U B R O U T I N E =======================================
150

151
; Attributes: noreturn bp-based frame
152

153
sub_13E:                                ; CODE XREF: seg000:000000F2p
154

155
arg_0           =  8
156

157
                link    a6,#0
158

159
loc_142:                                ; CODE XREF: sub_13E+20j
160
                subq.l  #1,($20000000).l
161
                blt.s   loc_160
162
                move.l  ($20000000).l,d0
163
                lsl.l   #2,d0
164
                movea.l #$20000034,a1
165
                movea.l (a1,d0.l),a1
166
                jsr     (a1)
167
                bra.s   loc_142
168
; ---------------------------------------------------------------------------
169

170
loc_160:                                ; CODE XREF: sub_13E+Aj
171
                move.l  arg_0(a6),-(sp)
172
                jsr     (forever).l
173
; End of function sub_13E
174

175
; ---------------------------------------------------------------------------
176
                addq.l  #4,sp
177
                unlk    a6
178
                rts
179

180
; =============== S U B R O U T I N E =======================================
181

182
; Attributes: noreturn bp-based frame
183

184
_main:                                  ; CODE XREF: c_start+32p
185
                link    a6,#0
186
                movea.l #$E0000000,a1   ; EL_LATCH
187
                clr.w   (a1)
188
                movea.l #$E0000000,a1
189
                move.w  #1,(a1)
190
                movea.l #$E0000000,a1
191
                move.w  #2,(a1)
192
                movea.l #$E0000000,a1
193
                move.w  #3,(a1)
194

195
loc_19A:                                ; CODE XREF: _main:loc_19Aj
196
                bra.s   loc_19A
197
; End of function _main
198

199
; ---------------------------------------------------------------------------
200
                unlk    a6
201
                rts
202

203
; =============== S U B R O U T I N E =======================================
204

205

206
sub_1A0:                                ; CODE XREF: sub_0:loc_62p
207
                clr.l   ($20000000).l
208
                lea     ($20000004).l,a0
209
                lea     ($200000B4).l,a1
210
                move.l  a1,(a0)
211
                adda.l  #$20,sp
212
                rts
213
; End of function sub_1A0
214

215
; ---------------------------------------------------------------------------
216
                bsr.s   $22E
217
                moveq   #$6C,d0
218
; end of 'seg000'
219

220

221
                END
Gast #7077107
Lesenswert?

Hallo Wühlhase,

dann weißt Du ja schonmal, warum der 68020 Dir nicht anwortet:
Nach dem Listening vom Georg holt er sich nach dem Reset:


 $46fc2700 als Stackpointer und startet an:

 $23fc7f08 als Startadresse (was er da wohl findet?)

 $008000ff wäre die BERR-Error Adresse, autsch.
 usw.

Wie die beiden schon schrieben, brauchst Du am Anfang erst die 
Vektorentabelle, bis $100 sind die ja von Motorola definiert/ belegt 
worde, danach beginnen fakultativ die User Vektoren bis $400.

Du kannst das auf die Schnelle in Assembler ausprobieren, oder Du machst 
die grande tour mit linker script und C gemischt mit inline Assembler.
Hier mal auf die Schnelle, quick and dirty:
1
             ORG $0
2
             SECTION vec,data
3
          dc.l  RAM_END-4            ; SSP z.B., aber aufpassen in sub_1A0!
4
          dc.l  sub_0                ; da startet der 68020 sein Programm
5
          blk.l  $100-8,trapped      ; alle anderen Vektoren "trapped"
6

7

8

9
              SECTION start,text
10

11
trapped   rte                        ; da passiert nix, hoffentlich brauchst 
12
                                     ; Du da auch nix (Interrupts und so) 
13

14
sub_o      move    #$2700,sr
15
           move.l  #$7F080080,($FFFA04).l
16
           move.l  #$36B70,($FFFA48).l
17
           ......
18
.. usw., kommt jetzt weiter das, was der Dieter Dir diassembliert hat.


Aber .... wenn ich mir den Assembler Code so anschauen, fehlt mir die 
Phantasie, daß man mit der _main-Routine LED ein- und ausschalten kann:
Die Routine macht ja folgendes:
           schreibe "0" in $E0000000, dann
           schreibe (ca. 0,000002s später) eine "1" hinein.
           dann - wieder so  nach 0,000002s eine "2"
           und dann eine "3"?? Wozu?

Beim Schalten einer LED würde man ja erwarten, daß die CPU die LED 
einschaltet, dann wartet, wieder auschaltet, wieder wartet und wieder 
einschaltet.

Dann: Bauchschmerzen macht mir die subroutine:
1
sub_1A0:                                ; CODE XREF: sub_0:loc_62p
2
                clr.l   ($20000000).l
3
                lea     ($20000004).l,a0
4
                lea     ($200000B4).l,a1
5
                move.l  a1,(a0)
6
                adda.l  #$20,sp   ; ????
7

8
---> dürfte mit "rts" dann crashen und irgendwohin, aber nicht zurückspringen
9
---> und wenn der SSP am RAM Ende steht (was er ja eigentlich tun sollte) wird 
10
---> er $1c Bytes nun drüber zeigen 
11

12
                rts

Also irgendwie wird das ganze - denke ich - nicht klappen: Du brauchst 
das RTOS! Der Code ist so - denke ich - nicht brauchbar

Und das RTOS wird seinen Timerinterrupt nutzen und die LED schalten.


auch mal davon abgesehen, daß der generierte Assembler Code ja insgesamt 
eher greulich ist:
a1 wird immer wieder mit dem Langwort $E0000000 (movea.l #$E0000000,a1) 
geladen, obwohl der Wert doch schon drin steht!
adda.l #20,a7 wird stellenweise verwendet (nur selten addq.l oder lea 
$c(a7),a7) oder auch:
1
                move.l  #$1BA,d0
2
                subi.l  #$1A0,d0
3
                beq.s   loc_68
läßt einen ins Grübeln kommen ..... normal wäre das wohl "wegoptimiert" 
worden

Also, da gibt es viel zu tun am "Vatertag"

Gruß
Olav
Gast #7081056
Lesenswert?

Eine Frage hätte ich noch:
Interrupts benutze ich ja nicht. Wie kann denn eine fehlende 
Sprungtabelle – soweit ich das sehe, funktiniert das beim 68020 genauso 
wie bei den AVRs: Interrupt kommt -> Programm springt an eine 
festgelegte Adresse irgendwo am Anfang -> dort steht ein Sprungbefehl zu 
einem Programmteil, der den Interrupt abarbeitet.

Was kann eine fehlende Sprungtabelle denn da anrichten?

(Auf die anderen Fragen gehe später ein, die sind nicht vergessen.)
#7081082
Lesenswert?

Wühlhase schrieb:
> Was kann eine fehlende Sprungtabelle denn da anrichten?

Vermutlich recht schnell CPU-Stillstand. Wenn das "irgendwas" dort als 
Sprungvektor interpretiert wird, kann das im Nirvana landen. Und dann 
gibt es entweder (weil hinter der Adresse kein Speicher steht) gleich 
einen Busfehler oder der Unsinnscode da produziert einen. Wenn der 
Busfehler-Vektor auch Müll ist (anzunehmen ohne Vektortabelle ;) ) gibt 
es einen zweiten (=doppelten) Busfehler und die CPU macht Feierabend. 
AFAIR kann man das auch an irgendeiner Statusleitungskombi erkennen.

Allerdings sind die IRQ-Vektoren egal, solange der IRQL 7 ist. Wichtiger 
sind da die anderen Vektoren (Busfehler, Addressfehler, illegal 
instruction, DIV/0, TRAP, ...), die können auch so "passieren". Das ist 
aber alles derselbe Bereich (ab normalerweise 0), siehe

https://wiki.neogeodev.org/index.php?title=68k_vector_table
Gast #7082030
Lesenswert?

Hallo Wühlhase,

Nur so sicherheitshalber (da schwant mir was), bevor das morgen bei Dir 
startet (bitte mit dem SSP Start in 0 und der Startadresse in 4, den 
Rest der Vektoren brauchst nicht (zwingend), die beiden aber schon):


>Ich habe leider keinen anständigen Disassembler, aber da gibt es
mittlerweile nette Onlinewerkzeuge. Im Anhnag habe ich mal das S3-File
angehangen. Wenn ich das aber in diesem Disassembler hier ansehe
https://onlinedisassembler.com
werde ich aus der Ausgabe nicht schlau. Nach sinnvollem Programmcode
sieht mir das nicht aus.


Daß das von Dir gesendete S3-File 
(https://de.wikipedia.org/wiki/S-Record) ein ASCII-Text ist und nicht 
ein diassemblierbares binary bzw. nicht den Machinencode für den 68020 
darstellt, ist Dir oder zumindest Deinem Programmer bewußt?!

Ansonsten: Double-Bus-Fault erkennst Du an /HALT aktiv und, daß sich an 
/AS auch nix mehr tut.

Gruß Olav.
Gast #7082641
Lesenswert?

Olav schrieb:
> Daß das von Dir gesendete S3-File
> (https://de.wikipedia.org/wiki/S-Record) ein ASCII-Text ist und nicht
> ein diassemblierbares binary bzw. nicht den Machinencode für den 68020
> darstellt, ist Dir oder zumindest Deinem Programmer bewußt?!

Der Online-Disassembler erkennt das Dateiformat:

> We have detected the object file format as :
>
>    Motorola S-Record; binary data in text format

Und in der Tat, der Disassembler hat nicht die Textdatei 
"disassembliert", sondern die in der Datei enthaltenen Binärdaten 
interpretiert.

(Die ersten vier Bytes sind 0x46 0xfc 0x27 0x00, die Datei fängt mit den 
Zeilen

> S0030000FC
> S3150000000046FC270023FC7F08008000FFFA0423FC3F

an. Die zweite Zeile mit dem S3-Record ist so zu lesen:

> S3 15 00000000 46FC270023FC7F08008000FFFA0423FC3F

Das hat so alles seine Richtigkeit.
#7083415
Lesenswert?

Wühlhase schrieb:
> Ich habe zu dieser Toolchain leider keinerlei Doku und der Kram ist so
> konfiguriert, daß das Programm in einem RTOS läuft. Und wie gesagt - ich
> brauche das ohne RTOS. Ich brauche ein paar Minimaltests (für defekte
> Baugruppen).

mir unverständlich, warum man sich heutzutage mit einer undokumentierten 
Legacy-Toolchain rumschlägt, wenn man sich in einer halben Stunde einen 
(bestens dokumentierten und tausendfach genutzten) gcc für genau diesen 
Zweck bauen kann.

Wenn man nicht weiß, wie das geht: steht sogar hier: 
https://www.mikrocontroller.net/articles/GCC_M68k
Gast #7083707
Lesenswert?

Naja, ich denke, deswegen hat er wohl hier im Forum um Rat gefragt.

Und wir versuchen ihm klar zu machen, daß das so nicht funktionieren 
wird/ kann.

Auf die gcc-toolchain umzusteigen, ist eine prima Idee (ich meine aber, 
daß höhergradige gcc-Zicken sich standhaft weigern, die angegebenen 
Versionsnummern aus dem Jahr 2010 zu compilieren).
Besser wäre wohl eine vorgefertigte.

.... allein, das würde ihm auch nichts nützen, denn auch diese toolchain 
setzt ein laufendes System voraus, die wird sich mit den gleichen 
Warnungen verabschieden wie sein legacy Produkt.

Unten auf der Seite https://www.mikrocontroller.net/articles/GCC_M68k 
verlinkt ist ein schönes Beispiel, wie man das macht:

Das m68k-example Paket zeigt das, was der Wühlhase alles braucht, um auf 
seinem System mit einer c-toolchain arbeiten zu können:

1. Vector.S             enthält die Vektorentabelle
2. crt0.S               enthält den Start der CPU und die 
Systeminitialisierung
3. ram.ld oder rom.ld   ist das Linkerskript
4. Makefile

Damit fängt das an: Das braucht er "nur" umzuschreiben für sein System.

Ist eben die grande tour.
Assembler fände ich in dem Fall schneller zielführend. Zumal die 
"C-Files" 1-2 auch nur Assembler Files für den m68k-gcc-as sind.

appinit.c, uart.c machen wohl Hardware-Initialisierungen und glue.c 
wirkt wie ein kleines Betriebssystem mit sys-calls.
... und erst am Schluß kommt main.c

Letztlich aber wird man/er in dem einen oder anderen Fall nicht 
weiterkommen, wenn man nicht weiß:

a) Speicherbelegung:

   RAM: von bis

   ROM: von bis

   Adresse der magischen LED

   Adresse z.B. eines Timerbausteines

   Adresse z.B. einer UART


b) Was ist das für ein Timer -> wie wird der programmiert

   was ist das für eine UART -> wie wird die programmiert

   Wie werden die LED geschaltet.


Bestenfalls kann man, wenn man zumindest weiß, wie die LED geschaltet 
werden, eine Zeitschleife, "LED an", Zeitschleife, "LED aus" 
programmieren (mit Cache aus).
Und wenn das blinkt ...... dann weitersehen.

Gruß
Olav
#7083812
Lesenswert?

Olav schrieb:
> Das m68k-example Paket zeigt das, was der Wühlhase alles braucht, um auf
> seinem System mit einer c-toolchain arbeiten zu können:

wenn's "schnell und schlampig" sein darf, braucht's das alles gar nicht:
1
void main(void);
2
long stack[32];
3

4
struct zero { 
5
    long *stack;
6
    void (*initialpc)(void);
7
};
8

9
struct zero _start 
10
__attribute__((section(".text"))) = {
11
    .stack = &stack[31],
12
    .initialpc = main
13
};
14

15

16
void main(void)
17
{
18
    while (1);
19
}

Vektortabelle braucht man nur, wenn man Traps verwendet oder Fehler im 
Code einbaut ;).

Das (GC)C-Programm kompiliert mit
1
m68k-elf-gcc -fomit-frame-pointer -nostdlib -Wl,-Ttext=0x0 main.c

macht das m68k-Minimalprogramm hier:
1
.out:     file format elf32-m68k
2

3

4
Disassembly of section .text:
5

6
00000000 <_start>:
7
   0:  0000 3008        orib #8,%d0
8
   4:  0000 0008        orib #8,%d0
9

10
00000008 <main>:
11
   8:  60fe             bras 8 <main>
12

13
Disassembly of section .bss:
14

15
0000200c <stack>:
"Luxus" wie ein gelöschtes .bss-Segment darf man natürlich nicht 
voraussetzen
Gast #7084190
Lesenswert?

So, da bin ich wieder.

@Dieter:
Nein, es gibt keine weiteren (E)EPROMs. Den, den ich da programmiere, 
ist der einzige.


@Bernd:
Naja, das mag man früher so gemacht haben, aber so viele EPROMs haben 
wir leider nicht. Die Dinger sind heute nicht mehr so einfach zu 
bekommen und wenn, dann sind sie sauteuer.


@Olav:
Danke für die Codefetzen, da werde ich gleich mal etwas rumbasteln. Die 
"Grande Tour" mit Linker mache ich auch nur, weil ich davon wenigstens 
etwas Dokumentation habe und dachte, daß das einfacher wird. Ich hätte 
aber auch kein Problem mit reinem ASM (auch wenn ich das schon länger 
nicht mehr gemacht habe), das werden nur sehr kleine Programme die ich 
schreiben will.

Die Platinen haben, neben dem 68020, noch etwas Logik drauf. Neben einer 
seriellen Schnittstelle u.ä. gibt es auch ein paar Hardwareregister, an 
einigen dieser Registerbits hängt eine LED. Wird ein bestimmter Wert an 
eine bestimmte Adresse geschrieben, wird das Bit gesetzt oder 
zurückgesetzt.

Aber wie gesagt, das RTOS kann ich leider nicht verwenden. Das Geraffel 
ist so konstruiert, daß es das auszuführende Programm in den RAM lädt, 
und genau das soll nicht sein. Ich will z.B. nachher prüfen, ob alle 
RAM-IC ok sind und wenn nicht, das defekte aufspüren. Das geht mit RTOS 
nicht.

Der ASM-Code ist in der Tat abscheulich, aber die Werkzeuge stammen auch 
aus Mitte der 90er. Ich kann langsam gut verstehen, warum viele noch 
lange ASM anstatt C vorgezogen haben.


@Bernd:
Nein, tatsächlich keine PWM, sondern einfaches Schalten. Die LEDs hängen 
nicht direkt am 68020 dran, sondern da ist noch etwas Logik dazwischen, 
die braucht das so. Das hat - mit RTOS, das ja weg soll - auch so 
funktioniert.


@Olav:
Ja, daß die S3-Datei nicht direkt Maschinencode ist, ist mir klar. ;)
Und mein Programmiergerät weiß das auch.

Der verlinkte Onlineassembler hat das auch korrekt als S3 erkannt, und 
wollte nur noch die Architektur wissen. Und dann spukte er sowas aus:
1
.sec1:00000000  46    db 46h ; F
2
.sec1:00000001  fc    db fch ;
3
.sec1:00000002  27    db 27h ; '
4
...


@DerEinzigeBernd:
Genau. Als Architektur noch m68k:68020 auswählen, und dann kommt das 
raus, was ich eben geschrieben habe. Oder lese ich das falsch?


@Olav und Markus:
Tja, ich habe anfangs tatsächlich kurz überlegt, ob ich mir einen 
GNU-Compiler suche.
Ich hatte irgendwann, schon länger her, mit Cygwin/MinGW irgendwas zu 
kompilieren versucht. Ich habe mir danach vorgenommen, mit dem Zeug nie 
wieder etwas zu tun haben zu wollen.
Und etwas Funktionierendes umzubauen habe ich mir etwas einfacher 
vorgestellt als wieder mit MinGW loszutoben.

Aber ja, ich überdenke dies diese Tage nochmal...für den Rest der Woche 
habe ich vorm 68020 jedenfalls erstmal wieder meine Ruhe. ;)

Insbesondere schaue ich mir mal das verlinkte Beispiel an...



Es stimmt tatsächlich: In dem Beispiel vom Compiler-Hersteller, das ich 
umgebaut habe, habe ich etwas zuviel rausgeworfen, die 
Interruptvektortabelle war da doch drin...leider nur sehr rudimentär, da 
scheint immer noch einiges zu fehlen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren