1

Chciałem sobie popisać w C++ (Crossasembler). Znalazłem taki fajny extension do VS Code - Atari ST Dev. Wszystko fajnie z C - działa biblioteka libcmini, niestety wygląda na to, że do kompilatora C++ takowej nie ma, trzeba używać mintlib, mającej duży narzut i taki głupi "hello world" zajmuje 68 KB. Czy da się coś zaradzić? Ktoś, coś?

Mayonez/COBRA
Atari 1040 STE (4MB RAM, TOS 2.06/1.06, Ultrasatan, Netusbee)
Atari 65XE, 512KB ext. RAM, SIO2SD, FujiNet, IDE2+

2 Ostatnio edytowany przez Javalonde (Dzisiaj 21:53:52)

Cześć, da się skompilować mały program C++ z libcmini, bez linkowania z mintlib.

Nie potrzeba osobnej biblioteki libcmini "dla kompilatora C++". Kod kompiluje

m68k-atari-mintelf-g++

, a libcmini dostarcza kod startowy i funkcje C. W linkowaniu trzeba wyłączyć domyślne biblioteki przez

-nostdlib

, podać

crt0.o

, a na końcu

-lcmini -lgcc

.

U mnie, przy GCC 15.2.0 i libcmini dla mintelf, poniższy program daje HELLO.PRG o rozmiarze 4565 bajtów. Sprawdziłem kompilację i format Atari PRG dla MC68000; nie sprawdzałem jeszcze działania na prawdziwym ST.

Układ katalogów

katalog-glowny/
  toolchain/
    mingw64/
      bin/
      lib/
      m68k-atari-mintelf/
  libcmini/
    usr/
      include/
      lib/
        crt0.o
        libcmini.a
  projects/
    hello-cpp/
      main.cpp
      build.ps1

Archiwa GCC i binutils dla Windows po rozpakowaniu tworzą katalog

mingw64

. Pakiet libcmini dla mintelf tworzy katalog

usr

. Kompilator na Windows potrzebuje też swoich DLL w katalogu

bin

lub w

PATH

.

projects/hello-cpp/main.cpp

#include <stdio.h>

class Greeting {
public:
    explicit Greeting(const char* message) : message_(message) {}

    void print() const {
        puts(message_);
    }

private:
    const char* message_;
};

int main() {
    const Greeting hello("Hello World from C++ on Atari ST!");
    hello.print();
    return 0;
}

projects/hello-cpp/build.ps1

$ErrorActionPreference = 'Stop'

$project = $PSScriptRoot
$root = [System.IO.Path]::GetFullPath((Join-Path $project '..\..'))
$bin = Join-Path $root 'toolchain\mingw64\bin'
$mini = Join-Path $root 'libcmini\usr'
$compiler = Join-Path $bin 'm68k-atari-mintelf-g++.exe'
$objdump = Join-Path $bin 'm68k-atari-mintelf-objdump.exe'
$output = Join-Path $project 'HELLO.PRG'

foreach ($file in @($compiler, $objdump, (Join-Path $mini 'lib\crt0.o'), (Join-Path $mini 'lib\libcmini.a'))) {
    if (-not (Test-Path -LiteralPath $file -PathType Leaf)) {
        throw "Brak wymaganego pliku: $file"
    }
}

$oldPath = $env:PATH
try {
    $env:PATH = "$bin;$oldPath"
    $arguments = @(
        '-m68000', '-std=c++17', '-Os',
        '-fno-exceptions', '-fno-rtti', '-fno-threadsafe-statics',
        '-fno-unwind-tables', '-fno-asynchronous-unwind-tables',
        '-ffunction-sections', '-fdata-sections',
        '-I', (Join-Path $mini 'include'),
        '-nostdlib', (Join-Path $mini 'lib\crt0.o'),
        (Join-Path $project 'main.cpp'),
        '-o', $output,
        '-Wl,--gc-sections', '-s',
        '-L', (Join-Path $mini 'lib'), '-lcmini', '-lgcc'
    )
    & $compiler @arguments
    if ($LASTEXITCODE -ne 0) { throw "Kompilacja nie powiodla sie (kod $LASTEXITCODE)." }

    $header = [System.IO.File]::ReadAllBytes($output)
    if ($header.Length -lt 28 -or $header[0] -ne 0x60 -or $header[1] -ne 0x1a) {
        throw 'Plik wynikowy nie ma naglowka Atari PRG.'
    }
    $format = (& $objdump -f $output | Out-String)
    if ($LASTEXITCODE -ne 0 -or $format -notmatch 'elf32-atariprg') {
        throw 'Plik wynikowy nie zostal rozpoznany jako Atari PRG.'
    }
    $size = (Get-Item -LiteralPath $output).Length
    Write-Host "Gotowe: $output ($size bajtow, Atari PRG, MC68000)"
}
finally {
    $env:PATH = $oldPath
}

Uruchomienie: w PowerShell przejść do

projects\hello-cpp

i wykonać

.\build.ps1

.

Ograniczenie: to mały program napisany w C++17, ale tekst wypisuje przez

puts

z libcmini. Skrypt nie linkuje pełnego libstdc++; wyłącza też wyjątki i RTTI. Użycie

std::cout

lub innych cięższych części biblioteki standardowej może ponownie zwiększyć rozmiar PRG.

Gdybyś potrzebował:

GCC i binutils dla m68k-atari-mintelf
Repozytorium libcmini
Gotowy pakiet libcmini dla mintelf