1
0
mirror of https://github.com/KarolS/millfork.git synced 2024-05-29 04:41:30 +00:00
millfork/docs/api/custom-platform.md

274 lines
13 KiB
Markdown
Raw Permalink Normal View History

2019-07-15 12:21:50 +00:00
[< back to index](../doc_index.md)
2018-07-01 22:45:53 +00:00
## Adding a custom platform
Every platform is defined in an `.ini` file with an appropriate name.
The file is looked up in the directories on the include path, first directly, then in the `platform` subdirectory.
2018-07-01 22:45:53 +00:00
As an extension, multiline entries are supported:
if a line ends with a backslash character, the value continues to the next line.
2018-07-01 22:45:53 +00:00
#### `[compilation]` section
* `arch` CPU architecture. It defines which instructions are available. Available values:
* `nmos` (original 6502)
* `strict` (NMOS without illegal instructions)
* `ricoh` (Ricoh 2A03/2A07, NMOS without decimal mode)
* `strictricoh` (Ricoh 2A03/2A07 without illegal instructions)
* `cmos` (65SC02, or any 65C02 without bit instructions)
* `65sc02` (65SC02)
2019-11-24 00:30:30 +00:00
* `65c02` (Rockwell 65C02)
* `w65c02` (WDC 65C02)
2018-07-01 22:45:53 +00:00
* `65ce02` (CSG 65CE02; experimental)
2019-11-24 00:30:30 +00:00
* `huc6280` (Hudson HuC6280)
2018-07-01 22:45:53 +00:00
* `65816` (WDC 65816/65802; experimental; currently only programs that use only 16-bit addressing are supported)
2019-05-31 15:27:38 +00:00
* `z80` (Zilog Z80)
2018-07-27 17:12:54 +00:00
* `strictz80` (Z80 without illegal instructions)
2021-09-17 22:36:16 +00:00
* `r800` (R800)
* `z80next` (Z80 core from ZX Spectrum Next)
Note: Millfork version 0.3.18 and earlier uses the name `zx80next` for this architecture.
2019-09-30 22:46:15 +00:00
2019-05-31 15:27:38 +00:00
* `i8080` (Intel 8080)
2018-07-27 17:12:54 +00:00
2019-05-31 15:27:38 +00:00
* `i8085` (Intel 8085)
* `strict8085` (Intel 8085 without illegal instructions)
2019-05-31 15:27:38 +00:00
* `gameboy` (Sharp LR35902; experimental)
2019-05-31 15:03:35 +00:00
* `i8086` (Intel 8086; very experimental, very buggy and very, very incomplete
see the [8086 support disclaimer](../lang/x86disclaimer.md))
2018-07-01 22:45:53 +00:00
* `6809` (Motorola 6809; very experimental, very buggy and very, very incomplete
many language features simply do not work at all for this target)
* `encoding` default encoding for console I/O. Default: `ascii`.
See [the list of available encodings](../lang/text.md).
2018-07-06 22:58:44 +00:00
* `screen_encoding` default encoding for screencodes (literals with encoding specified as `scr`).
Default: the same as `encoding`.
2020-06-03 21:13:17 +00:00
* `modules` comma-separated list of modules that will be automatically imported.
This list cannot contain module template instantiations.
2018-07-01 22:45:53 +00:00
* other compilation options (they can be overridden using commandline options):
* `emit_illegals` whether the compiler should emit illegal instructions, default `false`
* `emit_cmos` whether the compiler should emit 65C02 instructions, default is `true` on compatible processors and `false` elsewhere
2018-07-01 22:45:53 +00:00
* `emit_65816` which 65816 instructions should the compiler emit, either `no`, `emulation` or `native`
* `decimal_mode` whether the compiler should emit decimal instructions, default is `false` on `ricoh` and `strictricoh` and `true` elsewhere;
if disabled, a software decimal mode will be used
* `emit_8085` whether the compiler should emit Intel 8085 instructions, default is `true` on compatible processors and `false` elsewhere
* `emit_x80` whether the compiler should emit instructions present on Sharp LR35902 and Z80, but absent on Intel 8080, default is `true` on compatible processors and `false` elsewhere
* `emit_z80` whether the compiler should emit Zilog Z80 instructions not covered by `emit_x80`, default is `true` on compatible processors and `false` elsewhere
2021-09-17 22:36:16 +00:00
* `emit_r800` whether the compiler should emit R800 instructions, default is `true` on compatible processors and `false` elsewhere
2018-07-01 22:45:53 +00:00
* `prevent_jmp_indirect_bug` whether the compiler should try to avoid the indirect JMP bug,
2018-07-03 21:28:05 +00:00
default is `false` on 65C02-compatible or non-6502 processors and `true` elsewhere
2018-07-01 22:45:53 +00:00
* `compact_dispatch_params` whether parameter values in return dispatch statements may overlap other objects, default is `true`.
2018-07-01 22:45:53 +00:00
This may cause problems if the parameter table is stored next to a hardware register that has side effects when reading.
* `lunix` generate relocatable code for LUnix/LNG, default is `false`
2018-07-03 21:28:05 +00:00
* `zeropage_register` reserve a certain amount of bytes of zero page as a pseudoregister to increase language features.
Default: `4` if targeting a 6502-based architecture, `0` otherwise.
`true` is a synonym of the current compiler default (currently: 4) and `false` is a synonym for 0.
2018-07-03 21:28:05 +00:00
* `inline` - inline functions automatically by default, default is `false`.
* `ipo` - enable interprocedural optimization, default is `false`.
2018-07-06 22:58:44 +00:00
* `function_fallthrough` whether should replace a tail call by simply putting one function after another, default is `true`.
* `function_deduplication` whether identical functions should be merged into one function, default is `true`.
* `subroutine_extraction` whether identical fragments of functions should be extracted into subroutines, default is `false`.
2018-07-06 22:58:44 +00:00
* `lenient_encoding` - allow for automatic substitution of invalid characters in string literals using the default encodings, default is `false`.
* `use_shadow_registers_for_irq` use Z80 shadow registers in interrupt routines, default is `true` for Z80 and `false` otherwise
2019-06-05 16:34:32 +00:00
* `ix_stack` use the IX register to access stack variables, default is `true` for Z80 and 8086, `false` otherwise
* `iy_stack` use the IY register to access stack variables, default is `false`
* `ix_scratch` allow using the IY register for other purposes, default is `false`
* `iy_scratch` allow using the IY register for other purposes, default is `false`
2018-08-01 19:16:20 +00:00
* `u_stack` use the U register to access stack variables, default is `false`. Applicable only to 6809-based targets.
* `y_stack` use the Y register to access stack variables, default is `false`. Applicable only to 6809-based targets.
**Warning: Currently, picking either `u_stack` or `y_stack` is required,
unless you want to always specify this option in the compiler's command line!**
The compiler doesn't support accessing the stack variables via the S stack pointer register yet.
2019-06-05 16:34:32 +00:00
* `software_stack` use software stack for stack variables, default is `false`. Applicable only to 6502-based targets.
2019-05-31 15:27:38 +00:00
* `output_intel_syntax` use Intel syntax instead of Zilog syntax, default is `true` for Intel 8080/8085 and `false` otherwise
2018-07-01 22:45:53 +00:00
#### `[define]` section
This section defines values of features of the target.
See the [preprocessor documentation](../lang/preprocessor.md) for more info.
2018-07-01 22:45:53 +00:00
#### `[allocation]` section
* `zp_pointers`
either a list of comma separated zeropage addresses that can be used by the program as zeropage pointers, or `all` for all.
Each value should be the address of the first of two free bytes in the zeropage.
Only used for 6502-based targets. Cannot be used together with `zp_bytes`.
* `zp_bytes`
either a list of comma separated zeropage byte addresses or address ranges that can be used by the program in zeropage, or `all` for all.
Only used for 6502-based targets. Cannot be used together with `zp_pointers`.
2018-07-01 22:45:53 +00:00
* `segments` a comma-separated list of segment names.
A segment named `default` is always required.
Default: `default`. In all options below, `NAME` refers to a segment name.
2019-10-24 13:09:11 +00:00
* `default_code_segment` the default segment for code and const arrays.
Note that the default segment for writable arrays and variables is always `default`.
2018-07-01 22:45:53 +00:00
Default: `default`
* `ram_init_segment` the segment storing a copy of initial values for preinitialized writable arrays and variables.
The segment cannot be `default`. See [the ROM vs RAM guide](./rom-vs-ram.md) for more information.
Default: none.
2018-07-01 22:45:53 +00:00
* `segment_NAME_start` the first address used for automatic allocation in the segment.
2019-06-05 16:34:32 +00:00
Note that on 6502-like targets, the `default` segment shouldn't start before $200, as the $0-$1FF range is reserved for the zeropage and the stack.
2019-10-24 13:09:11 +00:00
The first object defined in `segment_NAME_layout` (usually the `main` function)
will be placed as close to the beginning of its segment as possible,
but not necessarily at `segment_NAME_start`
2018-07-01 22:45:53 +00:00
* `segment_NAME_end` the last address in the segment
2019-10-24 13:09:11 +00:00
* `segment_NAME_codeend` the last address in the segment for code and const arrays.
2018-07-01 22:45:53 +00:00
Only uninitialized variables are allowed between `segment_NAME_codeend` and `segment_NAME_end`.
Default: the same as `segment_NAME_end`.
* `segment_NAME_datastart` the first address used for non-zeropage variables, or `after_code` if the variables should be allocated after the code.
Default: `after_code`.
2019-06-14 09:39:11 +00:00
* `segment_NAME_bank` the bank number the segment belongs to. Default: `0`.
For better debugging on NES, RAM segments should use bank number `$ff`.
* `segment_NAME_fill` the byte value used to fill gaps and other unused space in the segment. Default: `0`.
2019-08-16 16:00:04 +00:00
2019-09-24 23:17:52 +00:00
* `segment_NAME_layout` a comma-separated list of object names that defines in what order the objects are laid out in the segment.
One item has to be `*`, it means "all the other objects".
For example, `a,b,*,c,d` means that the output will contain `a` first, then `b`, then everything else except for `c` and `d`,
then `c` and finally `d`.
If an object from that list does not exist, it is ignored.
Default: `main,*`
2018-07-01 22:45:53 +00:00
#### `[output]` section
* `style` how multi-segment programs should be output:
* `single` output a single file, based mostly, but not necessarily only on data in the `default` segment (the default)
* `lunix` like `single`, but add data necessary for relocation between code and data (requires `lunix` option in the `compilation` section)
* `per_segment` generate a separate file with each segment
* `format` output file format; a comma-separated list of tokens:
* literal byte values
* `startaddr` little-endian 16-bit address of the first used byte of the compiled output (not necessarily the segment start)
2019-07-28 00:00:59 +00:00
* `startaddr_be` the same, but big-endian
2018-07-01 22:45:53 +00:00
* `endaddr` little-endian 16-bit address of the last used byte of the compiled output (usually not the segment end)
2019-07-28 00:00:59 +00:00
* `endaddr_be` the same, but big-endian
* `addr:XXXX` little-endian 16-bit address of the symbol XXXX
* `addr_be:XXXX` the same, but big-endian
* `startaddr+123`, `startaddr_be+123`, `endaddr+123`, `endaddr_be+123`, `addr:XXXX+123`, `addr_be:XXXX+123` the same, but incremented by the given number
* the number can be decimal, hexadecimal, octal, quaternary or binary
* `startaddr-123`, `startaddr_be-123`, `endaddr-123`, `endaddr_be-123`, `addr:XXXX-123`, `addr_be:XXXX-123` the same, but decremented by the given number
* `startpage` the high byte of `startaddr`
2019-07-28 00:00:59 +00:00
* `length` little-endian 16-bit length of the compiled output; `endaddr - startaddr + 1`
* `length_be` the same, but big-endian
* `length+123`, `length_be+123` the same, but incremented by the given number
* `length-123`, `length_be-123` the same, but decremented by the given number
* `programname-123` the name of the program of the given length, uppercase ASCII, padded with spaces
2019-07-28 00:00:59 +00:00
2018-07-01 22:45:53 +00:00
* `allocated` all used bytes
* `pagecount` the number of pages used by all used bytes (including partially filled pages)
* `"<string>"` literal ASCII string; commas, non-ASCII characters and escape sequences are not supported
2018-07-01 22:45:53 +00:00
* `<addr>:<addr>` - inclusive range of bytes
* `<segment>:<addr>:<addr>` - inclusive range of bytes in a given segment
* `d88` - a D88 floppy disk image for PC-88
* `tap:XXXX` - a tape image for ZX Spectrum; XXXX is the name of the entry point to the program
2020-09-26 21:52:49 +00:00
* `tap` equivalent to `tap:main`
* `trscmd:XXXX` - a chunked loadable executable for TRS-80 Model 1 or 3 running TRS-DOS, also known as the /CMD format; XXXX is the name of the entry point to the program
* `trscmd` - equivalent to `trscmd:main`
2020-03-31 17:07:35 +00:00
* `format_segment_NAME` if using the `per_segment` style, overrides the format for the given segment
2018-07-03 21:28:05 +00:00
2018-07-01 22:45:53 +00:00
* `extension` target file extension, with or without the dot
* `bbc_inf` should the `.inf` file with file metadata for BBC Micro be created
2019-01-11 14:17:48 +00:00
* `gb_checksum` should the main output file be patched with Game Boy-compatible checksums
2019-06-14 09:39:11 +00:00
* `labels` format of the label file:
* `vice` (the default) format compatible with the Vice emulator. The extension is `.lbl`.
* `nesasm` format used by the NESASM assembler. The extension is `.fns`.
* `sym` format used by the WLA/DX assembler. The extension is `.sym`.
* `fceux` multi-file format used by the FCEUX emulator. The extension is `.nl`.
* `mesen` format used by the Mesen emulator. The extension is `.mlb`.
* `ld65` format used by the `ld65` linker. The extension is `.dbg`.