# SAS/C ## Setup * Hunt down SAS/C 6.50, and the patches necessary to bring it up to 6.58. * Install/extract it to your hard drive. * Edit `S:User-Startup`: ``` ; BEGIN SAS/C ASSIGN SC: PATH:To/sasc ; END SAS/C ``` ### With Vamos [[amiga:development:vamos|Vamos]] `smake` won't work out of the box as `smake` needs `LIBS:icon.library`. * Grab this one from Aminet: https://aminet.net/package/util/libs/IconLib_46.4 * Extract the 68000 version of `icon.library` in a `libs` folder somewhere * Create a new `libs` volume in the `[volumes]` section of your `.vamosrc` and point at that `libs` folder ## Gotchas * Names of things can be up to 32 characters long. This makes naming things for test suites tough. ## Data types * Use `far` on an struct if you get link errors about data > 32768 * The `Custom` struct seems to trigger that * Data types * `uint8_t` is `unsigned char` * `BOOL` is `int` ## Getting the offset of a field in a struct Handy if you don't want to hard code all the custom chip register values. https://stackoverflow.com/a/39805594 ```c #define offsetof(s,m) &((struct s *)0)->m ``` ## DIsable Ctrl-C handling From http://amigadev.elowar.com/read/ADCD_2.1/Devices_Manual_guide/node0196.html: ```c #ifdef LATTICE int CXBRK(void) { return(0); } /* Disable SAS CTRL/C handling */ int chkabort(void) { return(0); } /* really */ #endif ``` ## Link assembler built in DevPac * Use `XDEF` to expose a label. Function labels start with `_` in SAS/C. Standard calling convention is placing items on the stack after the return value: ```asm ; wow.s XDEF _wow ; SAS/C function link symbol convention _wow: ; wow is int wow(char what) MOVE.L A5,-(SP) ; preserve A5 MOVE.L A7,A5 ; put current stack onto A5 to use as reference to args MOVEQ #0,D0 MOVE.B 11(A7),D0 ; move the char into D0 MOVE.L (SP)+,A5 RTS ; D0 is return value ``` In SAS/C: ```c // main,c extern int wow(char what); int main(void) { printf("%d\n", wow(30)) ; => 30 return 0; } ``` At the command line: ``` genam -l wow.s sc link to main main.c wow.o ``` The more things you preserve on the stack during the parameter extraction, the farther up you'll have to look: ```asm _InitializeCopperlist: MOVEM.L A0/A5,-(SP) MOVE.L A7,A5 MOVE.L 12(A5),A0 MOVE.L #$FFFFFFFE,(A0) MOVEM.L (SP)+,A0/A5 RTS ``` For more details on calling convention, search https://retro-commodore.eu/files/downloads/amigamanuals-xiik.net/Applications/SAS_C_Compiler_v6.5x___Manual_ENG/SASC6V2.txt for Communicating between Assembl.