[< back to index](../doc_index.md) # Frequently Asked Questions ### Who is the target audience? Millfork was designed to be a language for developers for old 8-bit platforms, mostly game developers, who have little use for advanced features of C, but don't have time to write assembly. ### What was the inspiration? The main inspirations was Atalan, but also Quetzalcoatl, Batari BASIC and NESHLA. Sadly, Atalan has been abandoned, and the compiler has been left in a non-working state. The goal of Millfork is to succeed where Atalan failed. ### What platforms are supported? Large programs in Millfork have been developed for Commodore 64. Millfork was also tested (via emulators) to run trivial programs on other 8-bit Commodore computers, Atari 8-bit computers, Apple II, BBC Micro, ZX Spectrum 48k, NEC PC-88, MSX, CP/M, NES, Game Boy, Atari Lynx, Atari 2600 and MS-DOS. Support for other devices using supported processors can be easily added, usually without modifying the compiler. ### What microprocessors are supported? * MOS 6502 and its descendants: 6510, 65C02, Ricoh 2A03, and to a lesser degree CSG 65CE02, Hudson Soft HuC6280 and WDC 65816. 6509 is not supported and will not be, however with some care you can treat it like a normal 6502. * Intel 8080, Intel 8085, Zilog Z80, Sharp LR35902 (also known as GBZ80) * There is also partial experimental support for Intel 8086, via automatic 8080-to-8086 translation. The generated code is very large and very slow. * Support for Motorola 6809 is coming in the future. You can test the work in progress by creating a custom platform using the 6809 CPU, but vast majority of Millfork programs will not even compile. ### Why Millfork when I can use assembly? * Assembly will not be portable. If you want to target both 6502 and Z80, you'd have to maintain two separate codebases. * Millfork is more productive. The programmer doesn't have to worry about register allocation or variable sizes. ### Why Millfork when I can use C? * Millfork is usually a bit faster. * No runtime, so it's easier to create small programs. * Many features usually found in advanced assemblers but rarely found in high-level languages are also available in Millfork, like hygienic macros, binary file inclusion, explicit memory layout, formulaic array initialization. * Millfork handles text encodings more carefully. * A wide variety of integer types of almost arbitrary sizes. * Semantics designed to suit 8-bit microprocessors, so usually less explicit casting is required. * Low-level things like the carry after arithmetic operations or single bytes of larger variables. * Built-in decimal arithmetic support. * Easy interfacing with assembly. ### This sounds like Millfork beats C in every department, right? Unfortunately not: * Millfork is very picky. It avoids compiling complex expressions, especially those involving larger variables. * Integer math support is not very complete. * Floating point math support is absent. * Pointer arithmetic is very limited. * Millfork preprocessor is less powerful than C preprocessor. * There is no support for linking with external libraries not written in Millfork. You either need to rewrite foreign assembly into Millfork assembly syntax, or generate a static binary and link it manually using the `file` directive. Since the compiler is a work-in-progress, some of the mentioned issues might be improved upon in the future. ### I have experience with C and/or assembly. What should I keep in mind? See the [differences from C](./cdiff.md) and the [differences from assembly](./asmdiff.md). ### Why is it called Millfork? It stands for **MI**ddle **L**evel **L**anguage **FOR** **K**ommodore computers. (There's also a mining town in Utah called Mill Fork, which, as fitting a compiler for obsolete machines, is currently abandoned.) ### ‟Commodore” isn't spelt with K! Shh.