Forum: Mikrocontroller und Digitale Elektronik 68020 will nicht laufen


von Wühlhase (Gast)


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?

von Klaus W. (mfgkw)


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.

von Wühlhase (Gast)


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
==============================================================================

von Wühlhase (Gast)


Lesenswert?

Noch was: Wo siehst du denn da Rechnerrei im Linkerfile? Ich habe doch 
nur die Basisadressen angegeben...oder nicht?

von Georg A. (georga)


Lesenswert?

Evtl. passt was mit der Vektortabelle am Anfang nicht, 0 ist initialer 
Stack, 4 die Einsprungaddresse für den Startup-Code. Disassemblier doch 
mal das finale File fürs ROM. Bei den paar Bytes sollte das ja noch 
übersichtlich sein...

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

'ROMABLE CODE' solltest du auf jeden Fall mal ON schalten, wenn die 
Nummer in einem EPROM landet.
Und stackbottom liegt auf $00000150? Kann das stimmen?

von Nosnibor (Gast)


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.

von Klaus W. (mfgkw)


Lesenswert?

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.

von karadur (Gast)


Lesenswert?

Wie breit ist dein EEPROM? 8/16/32 Bit?

Davon hängt ab wie du den Bincode im EEPROM anordnen musst.

von Olav (Gast)


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.

von Georg A. (georga)


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.

: Bearbeitet durch User
von Cfzhfddfhijj (Gast)


Lesenswert?

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

von Georg A. (georga)


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...

: Bearbeitet durch User
von m.n. (Gast)


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, ...

von uwe (Gast)


Lesenswert?

> stacktop_           0x200050b4
und
> space {0x150-stacktop_}
ist wohl nicht richtig...

von Dieter (Gast)


Lesenswert?

Wenn Du hier den original EPROM Inhalt der Karte (bei der sie
funktioniert) und den EPROM Inhalt des Testprogramm (das nicht
läuft) hier reinstellen würdest könnte man einfach mal schnell
schauen woran es liegt. Alles andere ist Spekulation.

von Wühlhase (Gast)


Angehängte Dateien:

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.

von Georg A. (georga)


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...

: Bearbeitet durch User
von Dieter (Gast)


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

von Bernd (Gast)


Lesenswert?

Wühlhase schrieb:
> jedes Mal eine Viertelstunde
> EPROM-Löschen dauert doch etwas zu lange.
Als Entwickler hat man da ein paar mehr EPROMs. Gelöscht wird erst, wenn 
die Schublade vom UV-Löscher voll ist.
Oder man arbeitet ganz modern mit einem EPROM-Emulator.

von Olav (Gast)


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

von Cfzhfddfhijj (Gast)


Lesenswert?

..
>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?..

PWM ;)

von Bernd (Gast)


Lesenswert?

Olav schrieb:
> eine "1" hinein.
>            dann - wieder so  nach 0,000002s eine "2"
>            und dann eine "3"?? Wozu?
Wenn da mehre LEDs am Port hängen, blinken die jeweils mit halber 
Taktfrequenz. Kann man hier zwar vmtl. nur mit dem Oszi sehen, aber 
immerhin...

von Wühlhase (Gast)


Lesenswert?

Erstmal danke für die vielen Hinweise. Das Teil liegt bei mir am 
Dienstang wieder auf dem Schreibtisch, ich schaue mir das dann mal näher 
an.

von Wühlhase (Gast)


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.)

von Georg A. (georga)


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

von Dieter (Gast)


Lesenswert?

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

Das hat weiter oben schon jemand erklärt: Du brauchst mindestens
den Anfangswert für den Stack im ersten 32-Bit Wort (Addresse 
0x00000000)
und den Startwert des PC im zweiten 32-Bit Wort (Addresse 0x00000004).

von Olav (Gast)


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.

von DerEinzigeBernd (Gast)


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.

von Markus F. (mfro)


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

von Olav (Gast)


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

von Markus F. (mfro)


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

von Wühlhase (Gast)


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.

von DerEinzigeBernd (Gast)


Lesenswert?

Wühlhase schrieb:
> Oder lese ich das falsch?

Nö, genauso ist's gemeint gewesen. Du hast an dieser Stelle nichts 
falsch gemacht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.