Aktuelles
AmigaPortal.de

Wir würden uns freuen, dich als neues Mitglied begrüßen zu können. Melde dich noch heute an und werde Teil einer freundlichen Community deren gemeinsames Hobby der "AMIGA" ist. Hier kannst du dich in einer gemütlichen Atmosphäre mit anderen Usern zu vielen interessanten Themen rege austauschen oder andere an deinen Erfahrungen teilhaben lassen. Wir wünschen dir viel Spaß hier auf AmigaPortal.de

BootLoader Code für Amiga 500

paule32

Neues Mitglied
Hallo,
ich habe folgenden Code, der in der Zeile: 12 einen Fehler (beim linken ergibt)
move.l $dff000, a0
dort findet der Linker keine Adresse oder Programmlabel.
Was kann ich tun, um mit den GNU m68k-amigaos- toolchain eine hunk-datei zu erstellen, die dann auf eine floppy kopiert
und nach dem einlegen in das Diskettenlaufwerk gebootet (gestartet) wird ?

beim erstellen gehe ich wie folgt vor:
  1. sed 's/;.*//' bootloader.asm > bootloader.s
  2. m68k-amigaos-as.exe -o bootloader.o bootloader.s
  3. m68k-amigaos-ld.exe -o bootloader.hunk -Ttext 0x0 -nostdlib bootloader.o
1. verwende ich, um die ; Kommentare zu entfernen
2. gnu toolchain, um das .o file zu erzeugen
3. Versuch, ein hunk image zu erstellen - schlägt aber fehl
Code:
start:
    move.l  #0, d0       ; Setze Bildschirmkoordinaten (x=0, y=0)
    move.w  #0x100, d1   ; Setze die Farbe (0x100 = Weiß)
    jsr     DrawText     ; Rufe die Funktion auf

    move.l  #1, d0       ; Setze Bildschirmkoordinaten (x=1, y=0)
    jsr     DrawText     ; Rufe die Funktion auf

    rts

DrawText:
    move.l  $dff000, a0  ; Zeiger auf die Custom-Chips-Register  dies ist Zeile:12 !!!
    move.l  #0x1800, d2  ; Setze die Zeichenbreite (0x1800 = 24 Pixel)
    move.b  #0x04, d3    ; Setze den Zeichensatz auf 8x8

DrawLoop:
    move.b  (a0), d4     ; Lade die Custom-Chips-Register
    bset    #8, d4       ; Setze Bit 8 (Vertikale Blanking-Periode)
    move.b  d4, (a0)     ; Speichere die Custom-Chips-Register

    move.w  (a0), d5     ; Lade die Custom-Chips-Register
    bclr    #8, d5       ; Lösche Bit 8 (Vertikale Blanking-Periode)
    move.w  d5, (a0)     ; Speichere die Custom-Chips-Register

    move.b  (a0), d4     ; Lade die Custom-Chips-Register
    btst    #6, d4       ; Überprüfe Bit 6 (Bildschirm wird aktualisiert)
    bne     DrawLoop     ; Wenn Bildschirm noch aktualisiert wird, weiter

    move.b  #0x20, (a0)  ; Setze den Cursor auf Leerzeichen
    move.w  (a0), d5     ; Lade die Custom-Chips-Register
    move.w  d5, (a0)     ; Speichere die Custom-Chips-Register

    add.l   d2, d0       ; Erhöhe die X-Koordinate
    move.b  d0, d4       ; Lade die X-Koordinate
    cmp.b   #40, d4      ; Vergleiche mit Bildschirmbreite (40 Zeichen)
    blt     DrawLoop     ; Wenn kleiner, weiter

    rts

buffer: ds.b 256        ; Puffer für den Text
 

Hornsk001

Administrator
Teammitglied
Hallo paule32 erstmal Herzlich Willkommen im schönen Amiga Portal.
Ich kann dir da leider nicht helfen. Ich benutze viel den ChatGPT für solche Sachen, der hilft mir viel beim Proggen wo ich keine Ahnung habe.

hier mal der code von ChatGPT
Code:
ORG $1000

start:
    move.l  #0, d0       ; Bildschirmkoordinaten (x=0, y=0)
    move.w  #0x100, d1   ; Farbe (0x100 = Weiß)
    jsr     DrawText     ; Funktion aufrufen

    move.l  #1, d0       ; Bildschirmkoordinaten (x=1, y=0)
    jsr     DrawText     ; Funktion aufrufen

    jmp     normal_boot  ; Zum normalen Bootprozess springen

DrawText:
    move.l  $dff000, a0  ; Zeiger auf Custom-Chips-Register
    move.l  #0x1800, d2  ; Zeichenbreite (0x1800 = 24 Pixel)
    move.b  #0x04, d3    ; Zeichensatz 8x8

DrawLoop:
    move.b  (a0), d4     ; Custom-Chips-Register laden
    bset    #8, d4       ; Bit 8 setzen (Vertikale Blanking-Periode)
    move.b  d4, (a0)     ; Custom-Chips-Register speichern

    move.w  (a0), d5     ; Custom-Chips-Register laden
    bclr    #8, d5       ; Bit 8 löschen (Vertikale Blanking-Periode)
    move.w  d5, (a0)     ; Custom-Chips-Register speichern

    move.b  (a0), d4     ; Custom-Chips-Register laden
    btst    #6, d4       ; Bit 6 überprüfen (Bildschirm wird aktualisiert)
    bne     DrawLoop     ; Wenn Bildschirm noch aktualisiert wird, weiter

    move.b  #0x20, (a0)  ; Cursor auf Leerzeichen setzen
    move.w  (a0), d5     ; Custom-Chips-Register laden
    move.w  d5, (a0)     ; Custom-Chips-Register speichern

    add.l   d2, d0       ; X-Koordinate erhöhen
    move.b  d0, d4       ; X-Koordinate laden
    cmp.b   #40, d4      ; Mit Bildschirmbreite (40 Zeichen) vergleichen
    blt     DrawLoop     ; Wenn kleiner, weiter

    rts

normal_boot:
    jmp     ($f80000)    ; Zum normalen Bootprozess springen


Aber bestimmt gibt es hier jemand, der dir vielleicht helfen kann.
Müssen wir mal abwarten.
 
Zuletzt bearbeitet:

paule32

Neues Mitglied
ja, anscheind liegt es daran, das der Code falsch ist.
er wird ohne Fehler übersetzt, wenn in Zeile: 12 folgendes steht: move.l 14680024, a0
dann klappts.
Allerdings hab ich damit keine bootfähige Datei, sondern ein Zwischenformat.
Da muss noch irgendwas zusätzliches ....
 

Kris

Super Mitglied
Teammitglied
Vielleicht erläuterst du deine Lösung, falls jemand hier vorbei schaut und nach einer Lösung für das Problem sucht, wird dann hier fündig. ;-)
 

paule32

Neues Mitglied
tjor, einfach ganz leicht:
- m68k-amigaos- gnu toolchain saugen
- den Assembler Quellcode mit m68k-amigaos-gcc in ein Objekt-File kompilieren
- das Objektfile in ein ADF Image Format schreiben (geht alles mit den GNU ToolChain.

GCC C/C++ ist in der Version 6 Verfügbar (wenn jemand noch den tollen Download haben, müsste ich mal sehen, wo ich das dicke Ding unterbringe...
GCC bringt auch alle LIBS mit, um auf vorgefertigtee Funktionen zurück zugreifen.
Das spart Arbeit - und meist braucht es auch kein Assemblerwissen (naja Amiga halt).

Das Image kann man dann in den WinUAE packen, und die auf der Workbench befindlichen DOS.Library auf Diskette speichern
(zusammen mit der Image-Datei.
Vorher muss man natürlich das ADF Image mittels WinUAE als "bootfähig" makieren.
Dann muss noch eine Startup-Datei als Textdatei auf die Root-Seite der Diskette gelegt werden
In dieser Datei steht einfach der Pfad zur Datei (dem Programm-Image) was gestartet werden soll.

Das wars eigentlich schon im gröbsten.
Beim formatieren der Diskette war da noch ein Befehl: INSTALL, muss ich erst nochmal nachschauen.

Hier die Schritte und Programme, die für die Erzeugung des ADF-Images ausgeführt werden können:

sed 's/;.*//' bootloader.asm > bootloader.s
m68k-amigaos-gcc -m68020 -Ofast -fomit-frame-pointer -noixemul -nostdlib -o output.hunk bootloader.s -Xlinker --allow-multiple-definition -L.
m68k-amigaos-gcc -m68000 -T linker.script -o output output.hunk -L.
m68k-amigaos-strip.exe output

der 1. Befehl löscht die ; Kommentare aus der Assember-Datei bootloader.asm, und speicher eine Kopie unter der Kennung .s
der 2. Befehl schreibt (assembliert) das Objekt-File.
der 3. Befehl schreibt dann die Ausgabe-Datei -L. steht hier für den "Library" Pfad für interne Sachen, ich habe bei mir die
libc.a die libamiga.a und libstubs.a einfach in das kompilier-Verzeichnis kopiert, um nicht extra mit Verzeichnisnamen zu
jonglieren zu müssen.
der 4. Befehl löscht den eventuellen Debug-Kram aus der Ausgabe-Datei.
Dadurch wird die finalle Datei wesentlich verkürzt.
ich habe hier eine ca. 9 KB Datei erhalten, die man wie oben beschrieben auf Diskette oder als Hardfile auf Festplatte oder
mittels WinUAE auf ein PC-Verzeichnis legen kann, was dann gemountet werden kann....

Im groben und Ganzen eine tolle Sache.
Wenn man nun noch Bildmaterial und GFX Effekte mit dazupackt, kann man sehr schnell und kostengünstig ein kleines
Spiel oder eine kleine Anwendung programmieren - zum Beispiel auch ein Datenbankprogramm oder oder oder....

Dafür gibt es ein sehr einfaches Interfache, was im Internet (glaube aminet) nachzulesne ist.

Wenn man wollte, könnte man auch Teile vom Image packen, so dass dann mehr Daten hin und her geschaufelt werden
können.
Aber das ist ein ganz anderes Theman, das erzähle ich Euch später ... :)

Mit freundlichen Grüßen

Euer paule32
 

Kris

Super Mitglied
Teammitglied
Top! vielen Dank!
 
Oben