Temat: Jak skompilować *.s i *.c do binarki *.tos

Witam,

Jak skompilować plik .s razem z plikiem .c do binarki *.tos ?

Chcę połączyć plik .s z plikiem .c w jedną binarkę, ale nie wiem jak...

Korzystam z vasm oraz vbcc.

Męczę się już z tym od paru godzin...

[PLIK MAIN.C]

extern void wait1(void);
extern void exit1(void);

int main()
{
    wait1();
    exit1();

    return 0;
}

[PLIK GEMDOS.S]

GEMDOS equ 1

GEMDOS__getchar equ 1
GEMDOS__writestr equ 9
GEMDOS__supervisor equ 32

    section text

_wait1
    move.w    #GEMDOS__getchar,-(A7)
    trap        #GEMDOS
    addq.l    #2,A7
    rts

_exit1
    clr.l -(a7)
    trap #1

    public _wait1
    public _exit1

Mam tak, ale to nie działa...

vbcc -quiet test.c -o="test.s"
vasm -nocase -devpac -m68000 -Faout -phxass -no-opt -o GEMDOS.o GEMDOS.s
vasm -nocase -devpac -m68000 -Faout -phxass -no-opt -o test.o test.s
vlink -b ataritos -o ppp.tos GEMDOS.o test.o

Jeszcze mam pytanie jak z poziomu asemblera pobrać parametr podany przy wywołaniu funkcji w C ?

Ostatnio edytowany przez lizard1982 (2020-11-14 19:03:30)

Odp: Jak skompilować *.s i *.c do binarki *.tos

Nie prościej użyć jakiejś gotowej biblioteki? Zakładam że zależy Ci na rozmiarze, więc polecam libcmini (https://github.com/freemint/libcmini)

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

3

Odp: Jak skompilować *.s i *.c do binarki *.tos

Adam Klobukowski napisał/a:

Nie prościej użyć jakiejś gotowej biblioteki? Zakładam że zależy Ci na rozmiarze, więc polecam libcmini (https://github.com/freemint/libcmini)

Wolałbym najpierw pobawić się moim sposobem i opanować podstawy asemblera i programowania pod Atari ST.
Jak już się pobawię, to wtedy ewentualnie skorzystam z jakiejś gotowej biblioteki libc.

Chcę tylko połączyć plik .s z plikiem .c w jedną binarkę... Nie wiem jak...

Adam Klobukowski napisał/a:

Zakładam że zależy Ci na rozmiarze, więc polecam libcmini

No nie wiem... Moje hello world w asemblerze ma ok. 80 bajtów...

creates a binary with 11794 byts. About a tenth of the size.

Ostatnio edytowany przez lizard1982 (2020-11-14 18:51:26)

Odp: Jak skompilować *.s i *.c do binarki *.tos

lizard1982 napisał/a:
Adam Klobukowski napisał/a:

Nie prościej użyć jakiejś gotowej biblioteki? Zakładam że zależy Ci na rozmiarze, więc polecam libcmini (https://github.com/freemint/libcmini)

Wolałbym najpierw pobawić się moim sposobem i opanować podstawy asemblera i programowania pod Atari ST.
Jak już się pobawię, to wtedy ewentualnie skorzystam już z jakiejś gotowej biblioteki libc.

Chcę tylko połączyć plik .s z plikiem .c w jedną binarkę... Nie wiem jak...

To wszystko powinno być opisane w dokumentacji vasm/vbcc

Adam Klobukowski napisał/a:

Zakładam że zależy Ci na rozmiarze, więc polecam libcmini

lizard1982 napisał/a:

No nie wiem... Moje hello world w asemblerze ma ok. 80 bajtów...

creates a binary with 11794 byts. About a tenth of the size.

Hello world w asemblerze to nie hello world w C ;)

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

5

Odp: Jak skompilować *.s i *.c do binarki *.tos

Adam Klobukowski napisał/a:

To wszystko powinno być opisane w dokumentacji vasm/vbcc

Poświęciłem dzisiaj kilka godzin na przeglądanie dokumentacji vasm/vbcc, ale nadal nie wiem jak połączyć plik .s z plikiem .c
Ok, zostaję w czystym asemblerze...

Mam tak, ale to nie działa...

vbcc -quiet test.c -o="test.s"
vasm -nocase -devpac -m68000 -Faout -phxass -no-opt -o GEMDOS.o GEMDOS.s
vasm -nocase -devpac -m68000 -Faout -phxass -no-opt -o test.o test.s
vlink -b ataritos -o ppp.tos GEMDOS.o test.o

Ostatnio edytowany przez lizard1982 (2020-11-14 19:00:43)

6

Odp: Jak skompilować *.s i *.c do binarki *.tos

A czy koniecznie vbcc/vasm? Mogę pokazać w wolnej chwili jak to miałem u mnie z GCC/GAS. Z tym, ze fakt GAS jest toporny;)

Maciek
--------
Atari 65XE + Ultimate 1MB + Stereo + SIO2SD | Atari 520STE + 4MB + UltraSatan | Atari Falcon 030 + CT60e + 14MB ST + 256MB TT + 68882  + CF + Netusbee | Amiga 500 + 1MB + Gotek | Amiga 600 + 2MB Chip + 8MB Fast + CF

7

Odp: Jak skompilować *.s i *.c do binarki *.tos

lizard1982 napisał/a:

Witam,

Jak skompilować plik .s razem z plikiem .c do binarki *.tos ?

Chcę połączyć plik .s z plikiem .c w jedną binarkę, ale nie wiem jak...

Korzystam z vasm oraz vbcc.

...

vbcc -quiet test.c -o="test.s"
vasm -nocase -devpac -m68000 -Faout -phxass -no-opt -o GEMDOS.o GEMDOS.s
vasm -nocase -devpac -m68000 -Faout -phxass -no-opt -o test.o test.s
vlink -b ataritos -o ppp.tos GEMDOS.o test.o

Nigdy nie kompilowałem w vbcc to się wypowiem :)

Jedyny znany gotowiec jaki kojarzę, to kawałek własnego silnika graficzno-muzycznego Francuza o ksywie Orion_

http://onorisoft.free.fr/retro.htm  (Falcon Demo System v5)

i tam w skrypcie budującym binarkę (również z c i assemblera) robi to tak:

set path="E:\Programmation\Falcon\VBCC\bin"

vc +%path%\..\config\normal.pc -cpu=68030 -O4 -o falcdemo.prg main.c falcsys.c falcsysa.s

pause

Ostatnio edytowany przez jury (2020-11-14 19:27:44)

8

Odp: Jak skompilować *.s i *.c do binarki *.tos

Program zlinkuje się  w takiej kolejności jak podane są pliki obiektowe w komendzie linkera. Więc pierwsze co się uruchomi to _wait1 który zrobi rts donikąd. Jeśli jesteś na takim etapie, to polecam zrobić to co zasugerował Adam ;)

Ostatnio edytowany przez sqward (2020-11-14 23:32:47)

What can be asserted without proof can be dismissed without proof.

9

Odp: Jak skompilować *.s i *.c do binarki *.tos

@lizard1982
rzuć okiem jak to wygląda w AGT, jest tam miks C (GCC) i asma:

https://bitbucket.org/d_m_l/agtools/src/master/
https://www.atari-forum.com/viewtopic.php?t=31558

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

10

Odp: Jak skompilować *.s i *.c do binarki *.tos

@jury
O to chodziło... Dzięki! Działa... :)

@Cyprian
Zaznajomię się.
Ciekawy silnik gry.

@Adam Klobukowski
Dzięki za rady. Z tego libc może kiedyś skorzystam. Na razie chcę dobrze opanować asembler i poczuć na niskim poziomie hardware Atari. Na razie, korzystanie z gotowego libc w C nie sprawiłoby mi przyjemności programując Atari, bo to jak lizanie lodów przez szybę.

@sqward
Wszystko już działa. Instrukcja rts już nie wyświetla bomb. Zmieniałem też kolejność wywołania procedur z poziomu języka C, dodałem nawet pętle w C, i zdaje się, że wszystko działa poprawnie i w poprawnej kolejności.

Nie wiem tylko jak z poziomu asemblera pobierać przekazane parametry z C.

11

Odp: Jak skompilować *.s i *.c do binarki *.tos

To zależy od kompilatora. GCC robi to przez stos, vbcc - nie wiem. Jak ktoś już sugerował: na pewno będzie to opisane w dokumentacji.

Właśnie zauważyłem, że plik *.c kompilujesz to assemblera. Więc porostu zobacz jak kompilator przekazuje paramenty w skompilowanym kodzie..

What can be asserted without proof can be dismissed without proof.

12

Odp: Jak skompilować *.s i *.c do binarki *.tos

sqward napisał/a:

Właśnie zauważyłem, że plik *.c kompilujesz to assemblera. Więc porostu zobacz jak kompilator przekazuje paramenty w skompilowanym kodzie..

Właśnie zrobiłem jak piszesz, no i już wiem jak przekazywane są parametry, czego efektem jest ten działający kod :)

#include "gemdos.h"
#include "types.h"

int main()
{
    write_str("Hello world\0");
    getchar();
    pterm();

    return 0;
}
#ifndef    _GEMDOS_H_
#define    _GEMDOS_H_

extern void write_str(const u8 *s);
extern s32 getchar(void);
extern void pterm(void);

#endif
_write_str
    move.l (4,a7), a0
    pea (a0)
    move.w    #GEMDOS__writestr,-(A7)
    trap        #GEMDOS
    addq.l    #6,A7
    rts

_getchar
    move.w    #GEMDOS__getchar,-(A7)
    trap        #GEMDOS
    addq.l    #2,A7
    rts

_pterm
    clr.l -(a7)
    trap #1

Ostatnio edytowany przez lizard1982 (2020-11-15 14:53:17)

13

Odp: Jak skompilować *.s i *.c do binarki *.tos

Na stronie konkurancji opisałem, jak to zrobiłem w Kupcu (na ST).
Tam było mi potrzebne ładowanie kodu ASM z dysku (dynamiczny wybór kodu w trakcie pracy programu), więc opcja z linkerem odpadała.

14

Odp: Jak skompilować *.s i *.c do binarki *.tos

w pliku *.s na początku brakuje jeszcze eksportu symboli:
xdef _write_str
xdef _getchar
xdef _pterm

saulot / [nokturnal]
==================================
wiki Atari 16/32 bit: https://bus-error.nokturnal.pl